diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 13983c84..c35a7ad6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -35,8 +35,14 @@ jobs: run: npm run lint - name: License check run: npm run license-check - - name: Build - run: npm run build-release + - name: Build components + run: npm run build-components + - name: Build arlas-map + run: npm run build-map + - name: Build arlas-maplibre + run: npm run build-maplibre + - name: Build arlas-mapbox + run: npm run build-mapbox - name: Test run: npm run test - name: Documentation diff --git a/README.md b/README.md index ca2245ca..6eb86af2 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,65 @@ -# ARLAS web components : - [![Build Status](https://travis-ci.org/gisaia/ARLAS-web-components.svg?branch=develop)](https://travis-ci.org/gisaia/ARLAS-web-components) [![npm version](https://badge.fury.io/js/arlas-web-components.svg)](https://badge.fury.io/js/arlas-web-components) -## About +# About this repo: + +This repository contains 4 Angular libraries and one demo Angular application. + +The 4 libraries are: +- **arlas-web-components**: contains a set of graphical component to explore data such as : donuts, histograms, powerbars, resultlits, metrics, metrics table,.. +- **arlas-map**: contains one map component dedicated to display ARLAS data. This component is cartographical-framework-free. The libarary also comes with a number of services. Those services provide cartographical interfaces that should be implemented according to your chosen map framework. +- **arlas-maplibre**: this library provides a maplibregl implementation of the arlas-map library. +- **arlas-mapbox**: this library provides a maboxgl implementation of the arlas-map library. + +> Note 1: **arlas-maplibre** and **arlas-mapbox** both have **arlas-map** as a dependency. + +> Note 2: As a consequence, you can install **arlas-maplibre** or **arlas-mapbox** directly without the need of installing **arlas-map** precedently. + + +The demo application is composed of several tabs. Each tab provides an example of one component of **arlas-web-components** library or an implementation of **arlas-map** library. -ARLAS-web-components is an Angular library that provides a set of data analytics components. +## Artchitecture of **arlas-map**, **arlas-maplibre** and **arlas-mapbox** -## Install + -To install this library in your npm Angular web app project add the dependency in your package.json : +- **arlas-map** provides the Angular components to be used in your apps. +- **arlas-map** components logic is declared in different services. Some are implemented when they don't depend directly on a cartographical framework. The rest are declared as abstract. +- The mapboxgl-js (v1.13) and maplibregl-js implementations are respectively coded in **arlas-mapbox** and **arlas-maplibre** libraries. + + +# Install + +To install these libraries in your npm Angular web app project add the dependency in your package.json : + +For arlas-web-components: ```shell $ npm install --save arlas-web-components ``` -## Documentation +For arlas-map: +```shell +$ npm install --save arlas-maplibre +``` +Or +```shell +$ npm install --save arlas-mapbox +``` -Please find the documentation of all the components [here](https://docs.arlas.io/classes/DonutComponent/). +# Build -## Build +## Prequesites: -To build the project you need to have installed -- [Node](https://nodejs.org/en/) version ^16.0.0 -- [npm](https://github.com/npm/npm) version ^8.0.0 -- [Angular CLI](https://github.com/angular/angular-cli) version ^14.2.13 +To build the projects you need to have installed +- [Node](https://nodejs.org/en/) version ^18.19.1 +- [npm](https://github.com/npm/npm) version ^10.0.0 +- [Angular CLI](https://github.com/angular/angular-cli) version ^18.2.12 ``` - $ npm install -g @angular/cli@^14.2.13 + $ npm install -g @angular/cli@^18.2.12 ``` +## Proceed to build -Then, clone the project +Clone the project ```shell $ git clone https://github.com/gisaia/ARLAS-web-components @@ -41,7 +71,7 @@ Move to the folder $ cd ARLAS-web-components ``` -Install all the project's dependencies +Install all the projects dependencies ```shell $ npm install @@ -49,8 +79,25 @@ $ npm install Build the project with `ng` : +For arlas-web-components +```shell +$ npm run build-components +``` + +For arlas-map +```shell +$ npm run build-map +``` + +For arlas-maplibre +```shell +$ npm run build-maplibre +``` + + +For arlas-mapbox ```shell -$ npm run build-release +$ npm run build-mapbox ``` The build artifacts will be generated in the `dist/` directory. @@ -94,8 +141,8 @@ See also the list of [contributors](https://github.com/gisaia/ARLAS-web-componen ## License -This project is licensed under the Apache License, Version 2.0 - see the [LICENSE.txt](https://github.com/gisaia/ARLAS-web-components/blob/develop/LICENSE.txt) file for details. +These projects are licensed under the Apache License, Version 2.0 - see the [LICENSE.txt](https://github.com/gisaia/ARLAS-web-components/blob/develop/LICENSE.txt) file for details. ## Acknowledgments -This project has been initiated and is maintained by Gisaïa. +This repository has been initiated and is maintained by Gisaïa. diff --git a/angular.json b/angular.json index 832e7f80..cad0b026 100644 --- a/angular.json +++ b/angular.json @@ -32,6 +32,7 @@ "styles": [ "src/styles.css", "node_modules/mapbox-gl/dist/mapbox-gl.css", + "node_modules/maplibre-gl/dist/maplibre-gl.css", "node_modules/@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css", "node_modules/iv-viewer/dist/iv-viewer.css" ], @@ -94,6 +95,7 @@ "styles": [ "src/styles.css", "node_modules/mapbox-gl/dist/mapbox-gl.css", + "node_modules/maplibre-gl/dist/maplibre-gl.css", "node_modules/@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css", "node_modules/iv-viewer/dist/iv-viewer.css" ], @@ -153,11 +155,9 @@ "options": { "main": "projects/arlas-components/src/test.ts", "tsConfig": "projects/arlas-components/tsconfig.spec.json", - "karmaConfig": "projects/arlas-components/karma.conf.js", + "karmaConfig": "./karma.conf.js", "styles": [ "src/styles.css", - "node_modules/mapbox-gl/dist/mapbox-gl.css", - "node_modules/@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css", "node_modules/iv-viewer/dist/iv-viewer.css" ] } @@ -167,9 +167,135 @@ "options": { "eslintConfig": ".eslintrc.json", "lintFilePatterns": [ - "projects/**/*.spec.ts", - "projects/**/*.d.ts", - "projects/**/*.ts" + "projects/arlas-components/**/*.spec.ts", + "projects/arlas-components/**/*.d.ts", + "projects/arlas-components/**/*.ts" + ] + } + } + } + }, + "arlas-mapbox": { + "projectType": "library", + "root": "projects/arlas-mapbox", + "sourceRoot": "projects/arlas-mapbox/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "projects/arlas-mapbox/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/arlas-mapbox/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "projects/arlas-mapbox/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/arlas-mapbox/src/test.ts", + "tsConfig": "projects/arlas-mapbox/tsconfig.spec.json", + "karmaConfig": "./karma.conf.js" + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "eslintConfig": ".eslintrc.json", + "lintFilePatterns": [ + "projects/arlas-mapbox/**/*.spec.ts", + "projects/arlas-mapbox/**/*.d.ts", + "projects/arlas-mapbox/**/*.ts" + ] + } + } + } + }, + "arlas-maplibre": { + "projectType": "library", + "root": "projects/arlas-maplibre", + "sourceRoot": "projects/arlas-maplibre/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "projects/arlas-maplibre/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/arlas-maplibre/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "projects/arlas-maplibre/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/arlas-maplibre/src/test.ts", + "tsConfig": "projects/arlas-maplibre/tsconfig.spec.json", + "karmaConfig": "./karma.conf.js" + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "eslintConfig": ".eslintrc.json", + "lintFilePatterns": [ + "projects/arlas-maplibre/**/*.spec.ts", + "projects/arlas-maplibre/**/*.d.ts", + "projects/arlas-maplibre/**/*.ts" + ] + } + } + } + }, + "arlas-map": { + "projectType": "library", + "root": "projects/arlas-map", + "sourceRoot": "projects/arlas-map/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "projects/arlas-map/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/arlas-map/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "projects/arlas-map/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/arlas-map/src/test.ts", + "tsConfig": "projects/arlas-map/tsconfig.spec.json", + "karmaConfig": "./karma.conf.js" + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "eslintConfig": ".eslintrc.json", + "lintFilePatterns": [ + "projects/arlas-map/**/*.spec.ts", + "projects/arlas-map/**/*.d.ts", + "projects/arlas-map/**/*.ts" ] } } diff --git a/images/arlas-map-library.png b/images/arlas-map-library.png new file mode 100644 index 00000000..0cc355e6 Binary files /dev/null and b/images/arlas-map-library.png differ diff --git a/karma.conf.js b/karma.conf.js index 0cf66e67..29d3c31e 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -5,13 +5,7 @@ module.exports = function (config) { config.set({ basePath: '', frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma') - ], + plugins, client:{ clearContext: false // leave Jasmine Spec Runner output visible in browser }, @@ -19,6 +13,7 @@ module.exports = function (config) { dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], fixWebpackSourcePaths: true }, + webpack: { node: { fs: 'empty', } }, reporters: ['progress', 'kjhtml'], port: 9876, @@ -27,6 +22,17 @@ module.exports = function (config) { autoWatch: true, browsers: ['ChromeHeadless'], singleRun: true, - webpack: { node: { fs: 'empty', } } }); }; + +const plugins = [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') +] + + + + diff --git a/package-lock.json b/package-lock.json index 6012f942..d14775f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,20 @@ { "name": "arlas-web-components-demo", - "version": "27.1.0-dev0", - "lockfileVersion": 2, + "version": "27.0.0-z-rc.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "arlas-web-components-demo", - "version": "27.1.0-dev0", + "version": "27.0.0-z-rc.0", "hasInstallScript": true, "license": "Apache-2.0", + "workspaces": [ + "projects/arlas-components", + "projects/arlas-map", + "projects/arlas-mapbox", + "projects/arlas-maplibre" + ], "dependencies": { "@angular/animations": "^18.2.13", "@angular/cdk": "^18.2.14", @@ -48,9 +54,9 @@ "jsts": "2.1.0", "jszip": "^3.2.1", "mapbox-gl": "^1.6.1", + "maplibre-gl": "^4.7.1", "moment": "^2.29.4", "ng-lazyload-image": "^9.1.3", - "ngeohash": "^0.6.0", "ngx-loading-reloaded": "^18.0.0", "numeral": "^2.0.6", "pmtiles": "^2.11.0", @@ -95,15 +101,6 @@ "webpack-bundle-analyzer": "^4.6.1" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -132,15 +129,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/architect/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/@angular-devkit/build-angular": { "version": "18.2.12", "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.12.tgz", @@ -269,35 +257,11 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@discoveryjs/json-ext": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", - "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", - "dev": true, - "engines": { - "node": ">=14.17.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1802.12", @@ -318,15 +282,6 @@ "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/@angular-devkit/core": { "version": "18.2.12", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.12.tgz", @@ -354,44 +309,6 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/core/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/@angular-devkit/schematics": { "version": "18.2.12", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.12.tgz", @@ -410,15 +327,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/@angular-eslint/builder": { "version": "18.4.3", "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.4.3.tgz", @@ -472,34 +380,6 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" - }, - "peerDependencies": { - "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*" - } - }, "node_modules/@angular-eslint/schematics": { "version": "18.4.3", "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.4.3.tgz", @@ -515,15 +395,6 @@ "strip-json-comments": "3.1.1" } }, - "node_modules/@angular-eslint/schematics/node_modules/ignore": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", - "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@angular-eslint/template-parser": { "version": "18.4.3", "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.4.3.tgz", @@ -538,20 +409,18 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "node_modules/@angular-eslint/utils": { + "version": "18.4.3", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", + "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@angular-eslint/bundled-angular-compiler": "18.4.3" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, "node_modules/@angular/animations": { @@ -636,330 +505,69 @@ } } }, - "node_modules/@angular/build/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] + "node_modules/@angular/cdk": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.14.tgz", + "integrity": "sha512-vDyOh1lwjfVk9OqoroZAP8pf3xxKUvyl+TVR8nJxL4c5fOfUFkD7l94HaanqKSRwJcI2xiztuu92IVoHn8T33Q==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^18.0.0 || ^19.0.0", + "@angular/core": "^18.0.0 || ^19.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } }, - "node_modules/@angular/build/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", - "cpu": [ - "arm64" - ], + "node_modules/@angular/cli": { + "version": "18.2.12", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.12.tgz", + "integrity": "sha512-xhuZ/b7IhqNw1MgXf+arWf4x+GfUSt/IwbdWU4+CO8A7h0Y46zQywouP/KUK3cMQZfVdHdciTBvlpF3vFacA6Q==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@angular-devkit/architect": "0.1802.12", + "@angular-devkit/core": "18.2.12", + "@angular-devkit/schematics": "18.2.12", + "@inquirer/prompts": "5.3.8", + "@listr2/prompt-adapter-inquirer": "2.0.15", + "@schematics/angular": "18.2.12", + "@yarnpkg/lockfile": "1.1.0", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.4", + "npm-package-arg": "11.0.3", + "npm-pick-manifest": "9.1.0", + "pacote": "18.0.6", + "resolve": "1.22.8", + "semver": "7.6.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } }, - "node_modules/@angular/build/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@angular/build/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@angular/build/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@angular/build/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@angular/build/node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/@angular/cdk": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.14.tgz", - "integrity": "sha512-vDyOh1lwjfVk9OqoroZAP8pf3xxKUvyl+TVR8nJxL4c5fOfUFkD7l94HaanqKSRwJcI2xiztuu92IVoHn8T33Q==", - "dependencies": { - "tslib": "^2.3.0" - }, - "optionalDependencies": { - "parse5": "^7.1.2" - }, - "peerDependencies": { - "@angular/common": "^18.0.0 || ^19.0.0", - "@angular/core": "^18.0.0 || ^19.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/cli": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.12.tgz", - "integrity": "sha512-xhuZ/b7IhqNw1MgXf+arWf4x+GfUSt/IwbdWU4+CO8A7h0Y46zQywouP/KUK3cMQZfVdHdciTBvlpF3vFacA6Q==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1802.12", - "@angular-devkit/core": "18.2.12", - "@angular-devkit/schematics": "18.2.12", - "@inquirer/prompts": "5.3.8", - "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.12", - "@yarnpkg/lockfile": "1.1.0", - "ini": "4.1.3", - "jsonc-parser": "3.3.1", - "listr2": "8.2.4", - "npm-package-arg": "11.0.3", - "npm-pick-manifest": "9.1.0", - "pacote": "18.0.6", - "resolve": "1.22.8", - "semver": "7.6.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/common": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.13.tgz", - "integrity": "sha512-4ZqrNp1PoZo7VNvW+sbSc2CB2axP1sCH2wXl8B0wdjsj8JY1hF1OhuugwhpAHtGxqewed2kCXayE+ZJqSTV4jw==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "18.2.13", - "rxjs": "^6.5.3 || ^7.4.0" - } + "node_modules/@angular/common": { + "version": "18.2.13", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.13.tgz", + "integrity": "sha512-4ZqrNp1PoZo7VNvW+sbSc2CB2axP1sCH2wXl8B0wdjsj8JY1hF1OhuugwhpAHtGxqewed2kCXayE+ZJqSTV4jw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.2.13", + "rxjs": "^6.5.3 || ^7.4.0" + } }, "node_modules/@angular/compiler": { "version": "18.2.13", @@ -1009,9 +617,9 @@ } }, "node_modules/@angular/compiler-cli/node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "dependencies": { "readdirp": "^4.0.1" @@ -1193,40 +801,12 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/@babel/core/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2920,9 +2500,9 @@ } }, "node_modules/@babel/traverse/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -2988,12 +2568,12 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", + "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=14.17.0" } }, "node_modules/@esbuild/aix-ppc64": { @@ -3381,24 +2961,27 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -3443,12 +3026,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3474,16 +3051,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 4" } }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { @@ -3517,21 +3091,22 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -3578,6 +3153,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@inquirer/checkbox": { @@ -3645,99 +3221,20 @@ } }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", "dev": true, "dependencies": { "undici-types": "~6.20.0" } }, - "node_modules/@inquirer/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@inquirer/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@inquirer/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@inquirer/core/node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@inquirer/editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", @@ -3767,9 +3264,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", - "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", "dev": true, "engines": { "node": ">=18" @@ -3922,6 +3419,18 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -3937,6 +3446,23 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3947,9 +3473,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -3989,9 +3515,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -4103,11 +3629,6 @@ "win32" ] }, - "node_modules/@mapbox/extent": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@mapbox/extent/-/extent-0.4.0.tgz", - "integrity": "sha512-MSoKw3qPceGuupn04sdaJrFeLKvcSETVLZCGS8JA9x6zXQL3FWiKaIXYIZEDXd5jpXpWlRxinCZIN49yRy0C9A==" - }, "node_modules/@mapbox/geojson-area": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz", @@ -4116,29 +3637,6 @@ "wgs84": "0.0.0" } }, - "node_modules/@mapbox/geojson-coords": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-coords/-/geojson-coords-0.0.2.tgz", - "integrity": "sha512-YuVzpseee/P1T5BWyeVVPppyfmuXYHFwZHmybkqaMfu4BWlOf2cmMGKj2Rr92MwfSTOCSUA0PAsVGRG8akY0rg==", - "dependencies": { - "@mapbox/geojson-normalize": "0.0.1", - "geojson-flatten": "^1.0.4" - } - }, - "node_modules/@mapbox/geojson-extent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-extent/-/geojson-extent-1.0.1.tgz", - "integrity": "sha512-hh8LEO3djT4fqfr8sSC6wKt+p0TMiu+KOLMBUiFOyj+zGq7+IXwQGl0ppCVDkyzCewyd9LoGe9zAvDxXrLfhLw==", - "dependencies": { - "@mapbox/extent": "0.4.0", - "@mapbox/geojson-coords": "0.0.2", - "rw": "~0.1.4", - "traverse": "~0.6.6" - }, - "bin": { - "geojson-extent": "bin/geojson-extent" - } - }, "node_modules/@mapbox/geojson-normalize": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@mapbox/geojson-normalize/-/geojson-normalize-0.0.1.tgz", @@ -4173,17 +3671,18 @@ } }, "node_modules/@mapbox/mapbox-gl-draw": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.4.3.tgz", - "integrity": "sha512-03qIJgyGmm0IoTZbV/cfODru9jRGogi4LcQ3maxIJDKccq1gY3ofgt2UYPkeU143ElxitZahEythNQv1NpsLhg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.5.0.tgz", + "integrity": "sha512-uchQbTa8wiv6GWWTbxW1g5b8H6VySz4t91SmduNH6jjWinPze7cjcmsPUEzhySXsYpYr2/50gRJLZz3bx7O88A==", "dependencies": { "@mapbox/geojson-area": "^0.2.2", - "@mapbox/geojson-extent": "^1.0.1", "@mapbox/geojson-normalize": "^0.0.1", - "@mapbox/point-geometry": "^0.1.0", - "hat": "0.0.3", - "lodash.isequal": "^4.5.0", - "xtend": "^4.0.2" + "@mapbox/point-geometry": "^1.1.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^5.0.9" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" } }, "node_modules/@mapbox/mapbox-gl-draw-static-mode": { @@ -4200,9 +3699,9 @@ } }, "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==" }, "node_modules/@mapbox/tiny-sdf": { "version": "1.2.5", @@ -4222,6 +3721,11 @@ "@mapbox/point-geometry": "~0.1.0" } }, + "node_modules/@mapbox/vector-tile/node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, "node_modules/@mapbox/whoots-js": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", @@ -4230,6 +3734,35 @@ "node": ">=6.0.0" } }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", + "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "tinyqueue": "^3.0.0" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", @@ -4513,15 +4046,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@npmcli/promise-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", @@ -4632,9 +4156,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", "dev": true }, "node_modules/@rollup/plugin-json": { @@ -4658,9 +4182,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -4682,9 +4206,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -4703,22 +4227,10 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -4729,9 +4241,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -4742,9 +4254,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -4755,9 +4267,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -4767,36 +4279,10 @@ "darwin" ] }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -4807,9 +4293,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -4820,9 +4306,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -4833,9 +4319,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -4845,23 +4331,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -4872,9 +4345,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -4885,9 +4358,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -4898,9 +4371,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -4911,9 +4384,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -4924,9 +4397,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -4937,9 +4410,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -4950,9 +4423,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -4963,9 +4436,9 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.28.1.tgz", - "integrity": "sha512-t4ckEC09V3wbe0r6T4fGjq85lEbvGcGxn7QYYgjHyKNzZaQU5kFqr4FsavXYHRiVNYq8m+dRhdGjpfcC9UzzPg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.30.1.tgz", + "integrity": "sha512-xiaHQoTkjKS60ouuSzJGPgjMp5R6TGGShLFQIhsmD8w06z7pfmJDiZPF0G953P2ruU5LSSsVI+UWmvtlzSFInA==", "dev": true, "dependencies": { "@types/estree": "1.0.6" @@ -5084,9 +4557,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.1.tgz", - "integrity": "sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, "node_modules/@tmcw/togeojson": { @@ -5179,6 +4652,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/bearing/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/center": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/center/-/center-6.5.0.tgz", @@ -5216,37 +4700,26 @@ } }, "node_modules/@turf/clean-coords": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-7.0.0.tgz", - "integrity": "sha512-kaKR4/NnhZpgC+hWY3MfPqV2KwzG4Vr66WH59GbT5B2tvAOJqAYUmq+rgyMsG6xA3fTBL3neDW0bY1DHFVcvHQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-7.2.0.tgz", + "integrity": "sha512-+5+J1+D7wW7O/RDXn46IfCHuX1gIV1pIAQNSA7lcDbr3HQITZj334C4mOGZLEcGbsiXtlHWZiBtm785Vg8i+QQ==", "dependencies": { - "@turf/helpers": "^7.0.0", - "@turf/invariant": "^7.0.0", - "tslib": "^2.6.2" + "@turf/helpers": "^7.2.0", + "@turf/invariant": "^7.2.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/clean-coords/node_modules/@turf/helpers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz", - "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", - "dependencies": { - "deep-equal": "^2.2.3", - "tslib": "^2.6.2" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clean-coords/node_modules/@turf/invariant": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.0.0.tgz", - "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", "dependencies": { - "@turf/helpers": "^7.0.0", - "tslib": "^2.6.2" + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" }, "funding": { "url": "https://opencollective.com/turf" @@ -5275,6 +4748,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/destination/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/distance": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", @@ -5287,6 +4771,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/distance/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/helpers": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", @@ -5296,11 +4791,25 @@ } }, "node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.2.0.tgz", + "integrity": "sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^7.2.0", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant/node_modules/@turf/helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", + "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" }, "funding": { "url": "https://opencollective.com/turf" @@ -5356,6 +4865,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/rhumb-bearing/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/rhumb-destination": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-6.5.0.tgz", @@ -5368,6 +4888,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/rhumb-destination/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/rhumb-distance": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.5.0.tgz", @@ -5380,6 +4911,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/rhumb-distance/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/transform-rotate": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-6.5.0.tgz", @@ -5398,6 +4940,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/transform-rotate/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/transform-translate": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-6.5.0.tgz", @@ -5413,6 +4966,17 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@turf/transform-translate/node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -5455,15 +5019,13 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -5529,22 +5091,22 @@ } }, "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==" }, "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" }, "node_modules/@types/d3-time-format": { "version": "4.0.3", @@ -5552,9 +5114,9 @@ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" }, "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "dependencies": { "@types/d3-selection": "*" } @@ -5587,9 +5149,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.4.tgz", + "integrity": "sha512-5kz9ScmzBdzTgB/3susoCgfqNDzBjvLL4taparufgSvlwjdLy6UyUy9T/tCpYd2GIdIilCatC4iSQS0QSYHt0w==", "dev": true, "dependencies": { "@types/node": "*", @@ -5611,9 +5173,17 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + "version": "7946.0.15", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==" + }, + "node_modules/@types/geojson-vt": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "dependencies": { + "@types/geojson": "*" + } }, "node_modules/@types/glob": { "version": "7.2.0", @@ -5652,6 +5222,21 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/mapbox__point-geometry": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==" + }, + "node_modules/@types/mapbox__vector-tile": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "dependencies": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, "node_modules/@types/mapbox-gl": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-1.13.10.tgz", @@ -5682,9 +5267,9 @@ } }, "node_modules/@types/node": { - "version": "18.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", - "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "version": "18.19.70", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.70.tgz", + "integrity": "sha512-RE+K0+KZoEpDUbGGctnGdkrLFwi1eYKTlIHNl2Um98mUkGsm1u2Ff6Ltd0e8DktTtC98uy7rSj+hO8t/QuLoVQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5699,6 +5284,11 @@ "@types/node": "*" } }, + "node_modules/@types/pbf": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" + }, "node_modules/@types/qs": { "version": "6.9.17", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", @@ -5780,6 +5370,14 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "node_modules/@types/supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", @@ -5969,23 +5567,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", @@ -5999,34 +5580,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", @@ -6049,21 +5602,13 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { @@ -6094,7 +5639,20 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", @@ -6111,7 +5669,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", @@ -6124,19 +5682,15 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/type-utils": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -6146,57 +5700,38 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.56.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", - "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, - "peer": true, - "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -6207,44 +5742,23 @@ }, "peerDependencies": { "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "node_modules/@typescript-eslint/types": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz", + "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", "dev": true, + "peer": true, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", @@ -6272,51 +5786,53 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, "engines": { "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "node_modules/@typescript-eslint/utils": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.1.tgz", + "integrity": "sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==", "dev": true, + "peer": true, "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/typescript-estree": "8.19.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", - "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", + "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", "dev": true, "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6325,21 +5841,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", - "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", + "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6352,17 +5868,15 @@ "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", - "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", + "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", "dev": true, "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0" + "@typescript-eslint/types": "8.19.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6370,53 +5884,74 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18.12" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", - "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, - "peer": true, "dependencies": { - "@typescript-eslint/types": "8.18.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, - "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", "dev": true }, "node_modules/@vendure/ngx-translate-extract": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@vendure/ngx-translate-extract/-/ngx-translate-extract-9.3.1.tgz", - "integrity": "sha512-V81lW469gVng1OeLuFk9n06NmuKcWFsfImE4eGQIijBU4lJTDbZkcv6DpZ7SyGZOqCWwM6tWbA2V+w0zeBh4Lg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@vendure/ngx-translate-extract/-/ngx-translate-extract-9.4.0.tgz", + "integrity": "sha512-2+Blsm33Ub3cQ0K6dLQWlCg3QfHJIvkUS7vovq39At+lU+VSqMNvVpRkqNrsV9sTpYeyZzVtGOqHW5Xa1YwkAw==", "dev": true, "dependencies": { "@phenomnomnominal/tsquery": "^6.1.3", @@ -6441,18 +5976,6 @@ "typescript": ">=5.2.0" } }, - "node_modules/@vendure/ngx-translate-extract/node_modules/flat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", - "integrity": "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==", - "dev": true, - "bin": { - "flat": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", @@ -6650,10 +6173,19 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -6681,10 +6213,13 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -6755,9 +6290,9 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "dependencies": { "ajv": "^8.0.0" @@ -6807,18 +6342,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -6841,15 +6364,17 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -6865,6 +6390,18 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -6872,14 +6409,10 @@ "dev": true }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/aria-query": { "version": "5.3.2", @@ -6894,7 +6427,6 @@ "version": "12.0.0-rc.2", "resolved": "https://registry.npmjs.org/arlas-d3/-/arlas-d3-12.0.0-rc.2.tgz", "integrity": "sha512-Muk59uH9Xu2ULPKDEs90TMHcNso4hBlx6qPAUoOeGHwloBKnRCwQQ+eDMQq4o1PvTNRT/cprISpL7N73MVm8lA==", - "license": "Apache-2.0", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-axis": "^3.0.1", @@ -6924,20 +6456,21 @@ "tinycolor2": "~1.6.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/arlas-map": { + "resolved": "projects/arlas-map", + "link": true + }, + "node_modules/arlas-mapbox": { + "resolved": "projects/arlas-mapbox", + "link": true + }, + "node_modules/arlas-maplibre": { + "resolved": "projects/arlas-maplibre", + "link": true + }, + "node_modules/arlas-web-components": { + "resolved": "projects/arlas-components", + "link": true }, "node_modules/array-flatten": { "version": "1.1.1", @@ -6954,27 +6487,6 @@ "node": ">=8" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -7020,20 +6532,6 @@ "postcss": "^8.1.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -7138,7 +6636,6 @@ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, - "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } @@ -7214,18 +6711,6 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7269,9 +6754,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -7288,9 +6773,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -7330,6 +6815,16 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -7383,16 +6878,27 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -7420,9 +6926,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "dev": true, "funding": [ { @@ -7440,18 +6946,18 @@ ] }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chardet": { @@ -7484,6 +6990,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -7494,9 +7012,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" @@ -7517,15 +7035,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -7616,55 +7137,34 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -7732,19 +7232,20 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colorette": { "version": "2.0.20", @@ -7818,15 +7319,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -7845,11 +7337,6 @@ "typedarray": "~0.0.5" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", @@ -7939,7 +7426,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7986,18 +7472,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/copy-webpack-plugin/node_modules/globby": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", @@ -8018,6 +7492,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/copy-webpack-plugin/node_modules/path-type": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", @@ -8053,12 +7536,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -8075,7 +7558,6 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, - "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -8110,24 +7592,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -8150,76 +7614,6 @@ "postcss-media-query-parser": "^0.2.3" } }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/critters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -8506,59 +7900,11 @@ "d3-selection": "2 - 3" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, "engines": { "node": ">=4.0" } @@ -8570,12 +7916,12 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -8595,37 +7941,6 @@ "node": ">=0.10.0" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -8693,22 +8008,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -8721,22 +8020,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -8885,9 +8168,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", @@ -8898,6 +8181,20 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -8922,9 +8219,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", + "version": "1.5.79", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz", + "integrity": "sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==", "dev": true }, "node_modules/emitter-component": { @@ -8968,12 +8265,23 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/engine.io": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, - "license": "MIT", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -8995,15 +8303,31 @@ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -9014,10 +8338,19 @@ } }, "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/entities": { "version": "4.5.0", @@ -9080,72 +8413,11 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -9154,39 +8426,22 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "engines": { "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -9194,35 +8449,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/esbuild": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", @@ -9290,26 +8516,29 @@ "dev": true }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "peer": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -9355,16 +8584,16 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -9398,27 +8627,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -9429,195 +8637,68 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" @@ -9658,9 +8739,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -9752,6 +8833,27 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -9884,35 +8986,10 @@ "node": ">=4" } }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", @@ -9930,6 +9007,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -9943,15 +9032,25 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", + "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -10059,16 +9158,19 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-yarn-workspace-root": { @@ -10080,12 +9182,15 @@ } }, "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", + "integrity": "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==", "dev": true, "bin": { "flat": "cli.js" + }, + "engines": { + "node": ">=18" } }, "node_modules/flat-cache": { @@ -10103,15 +9208,15 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, "funding": [ { @@ -10128,14 +9233,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -10152,18 +9249,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -10196,17 +9281,17 @@ } }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=6 <7 || >=8" } }, "node_modules/fs-minipass": { @@ -10250,31 +9335,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10288,11 +9349,6 @@ "node": ">=6.9.0" } }, - "node_modules/geojson-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/geojson-flatten/-/geojson-flatten-1.1.1.tgz", - "integrity": "sha512-k/6BCd0qAt7vdqdM1LkLfAy72EsLDy0laNwX0x2h49vfYCiQkRc4PSra8DNEdJ10EKRpwEvDXMb0dBknTJuWpQ==" - }, "node_modules/geojson-polygon-self-intersections": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/geojson-polygon-self-intersections/-/geojson-polygon-self-intersections-1.2.1.tgz", @@ -10336,15 +9392,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dev": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -10353,6 +9415,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10364,22 +9439,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gettext-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-4.2.0.tgz", @@ -10427,15 +9486,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { @@ -10444,6 +9503,41 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-prefix": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "dependencies": { + "ini": "^4.1.3", + "kind-of": "^6.0.3", + "which": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/global-prefix/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -10453,20 +9547,6 @@ "node": ">=4" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -10487,12 +9567,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10535,50 +9625,19 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10590,6 +9649,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -10604,6 +9664,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -10611,14 +9672,6 @@ "node": ">= 0.4" } }, - "node_modules/hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==", - "engines": { - "node": "*" - } - }, "node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", @@ -10649,12 +9702,6 @@ "wbuf": "^1.1.0" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, "node_modules/hpack.js/node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10819,29 +9866,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/http-proxy-middleware/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -10865,12 +9889,11 @@ } }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" @@ -10908,9 +9931,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true, "engines": { "node": ">= 4" @@ -10968,15 +9991,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -10999,6 +10013,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -11013,7 +10028,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -11027,19 +10041,6 @@ "tslib": "^2.0.0" } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -11061,12 +10062,6 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -11076,53 +10071,12 @@ "node": ">= 10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -11135,32 +10089,6 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -11173,54 +10101,30 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11236,12 +10140,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -11274,21 +10181,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -11304,34 +10196,12 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-network-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", @@ -11352,20 +10222,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -11397,37 +10253,15 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -11448,48 +10282,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -11502,43 +10294,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -11546,20 +10301,24 @@ "dev": true }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isbinaryfile": { "version": "4.0.10", @@ -11626,42 +10385,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -11738,15 +10461,6 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -11763,9 +10477,9 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -11778,14 +10492,12 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -11816,10 +10528,13 @@ "dev": true }, "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -11833,6 +10548,11 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -11852,12 +10572,10 @@ "dev": true }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -11890,11 +10608,6 @@ "setimmediate": "^1.0.5" } }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, "node_modules/jszip/node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -12033,6 +10746,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -12103,6 +10817,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -12220,16 +10935,28 @@ "concat-map": "0.0.1" } }, - "node_modules/karma/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/karma/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -12246,6 +10973,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/karma/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -12258,18 +10994,6 @@ "node": "*" } }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/karma/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12293,6 +11017,32 @@ "node": ">=8" } }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/karma/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -12321,9 +11071,9 @@ } }, "node_modules/kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" }, "node_modules/keyv": { "version": "4.5.4", @@ -12338,7 +11088,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12498,6 +11247,18 @@ "node": ">=6" } }, + "node_modules/license-check-and-add/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/license-check-and-add/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -12519,6 +11280,21 @@ "wrap-ansi": "^5.1.0" } }, + "node_modules/license-check-and-add/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/license-check-and-add/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "node_modules/license-check-and-add/node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -12537,20 +11313,6 @@ "node": ">=6" } }, - "node_modules/license-check-and-add/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/license-check-and-add/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -12591,6 +11353,15 @@ "node": ">=8" } }, + "node_modules/license-check-and-add/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/license-check-and-add/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -12600,15 +11371,6 @@ "node": ">=4" } }, - "node_modules/license-check-and-add/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/license-check-and-add/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -12634,6 +11396,21 @@ "node": "*" } }, + "node_modules/license-check-and-add/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/license-check-and-add/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -12681,15 +11458,6 @@ "node": ">=6" } }, - "node_modules/license-check-and-add/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/license-check-and-add/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -12915,15 +11683,18 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -12938,11 +11709,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -12965,76 +11731,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -13093,21 +11789,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", @@ -13129,74 +11810,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "dependencies": { - "mimic-function": "^5.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" @@ -13271,36 +11909,21 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -13362,10 +11985,107 @@ "node": ">=6.4.0" } }, - "node_modules/mapbox-gl/node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "node_modules/mapbox-gl/node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/maplibre-gl": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", + "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^20.3.1", + "@types/geojson": "^7946.0.14", + "@types/geojson-vt": "3.2.5", + "@types/mapbox__point-geometry": "^0.1.4", + "@types/mapbox__vector-tile": "^1.3.4", + "@types/pbf": "^3.0.5", + "@types/supercluster": "^7.1.3", + "earcut": "^3.0.0", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.3", + "global-prefix": "^4.0.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.3.0", + "potpack": "^2.0.0", + "quickselect": "^3.0.0", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0", + "vt-pbf": "^3.1.3" + }, + "engines": { + "node": ">=16.14.0", + "npm": ">=8.1.0" + }, + "funding": { + "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" + } + }, + "node_modules/maplibre-gl/node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/maplibre-gl/node_modules/@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + }, + "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, + "node_modules/maplibre-gl/node_modules/earcut": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz", + "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==" + }, + "node_modules/maplibre-gl/node_modules/geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + }, + "node_modules/maplibre-gl/node_modules/potpack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + }, + "node_modules/maplibre-gl/node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" + }, + "node_modules/maplibre-gl/node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "dependencies": { + "kdbush": "^4.0.2" + } + }, + "node_modules/maplibre-gl/node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } }, "node_modules/media-typer": { "version": "0.3.0", @@ -13438,6 +12158,17 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -13701,15 +12432,15 @@ "dev": true }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/moment": { @@ -13730,9 +12461,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/msgpackr": { @@ -13794,10 +12525,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", "funding": [ { "type": "github", @@ -13805,10 +12535,10 @@ } ], "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" } }, "node_modules/natural-compare": { @@ -13834,10 +12564,23 @@ "node": ">= 4.4.x" } }, - "node_modules/negotiator": { + "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, "engines": { "node": ">= 0.6" @@ -13935,6 +12678,73 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/ng-packagr/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ng-packagr/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ng-packagr/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ng-packagr/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -13947,21 +12757,13 @@ "node": ">=8" } }, - "node_modules/ng-packagr/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/ng-packagr/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/ngeohash": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", - "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==", - "engines": { - "node": ">=v0.2.0" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/ngx-loading-reloaded": { @@ -13999,9 +12801,9 @@ "optional": true }, "node_modules/node": { - "version": "18.20.4", - "resolved": "https://registry.npmjs.org/node/-/node-18.20.4.tgz", - "integrity": "sha512-7kNnwQLq7hjLAKkku5Ig77yGmvFzriLwF83zg8BV13QEG3KGh5UGAT0O+TPK9N+AQbdf02LmFBXKbuGcHNfMLA==", + "version": "18.20.5", + "resolved": "https://registry.npmjs.org/node/-/node-18.20.5.tgz", + "integrity": "sha512-v4kVqf+wQAEGAODwH6GZLH8ur8gCcGESjO1lpfgIEMT4DzU4XgYhnq4yJ5sNwO7MTsxTG9m66vMjVzRf/4Okqg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -14110,9 +12912,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/nopt": { @@ -14293,27 +13095,15 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -14321,36 +13111,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true }, "node_modules/on-finished": { "version": "2.4.1", @@ -14382,15 +13147,15 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14414,21 +13179,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -14439,17 +13189,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -14478,75 +13228,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "restore-cursor": "^3.1.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/ordered-binary": { "version": "1.5.3", @@ -14563,30 +13289,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -14711,6 +13440,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", @@ -14721,12 +13456,12 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "devOptional": true, "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -14767,17 +13502,6 @@ "text-encoding-polyfill": "^0.6.7" } }, - "node_modules/parsedbf/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -14815,20 +13539,6 @@ "npm": ">5" } }, - "node_modules/patch-package/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/patch-package/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -14838,41 +13548,25 @@ "concat-map": "0.0.1" } }, - "node_modules/patch-package/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/patch-package/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" } }, - "node_modules/patch-package/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/patch-package/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14888,14 +13582,42 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/patch-package/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/patch-package/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { "node": ">=8" } }, + "node_modules/patch-package/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/patch-package/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -14926,6 +13648,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, @@ -14949,26 +13672,12 @@ "node": ">=6" } }, - "node_modules/patch-package/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/patch-package/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, + "node_modules/patch-package/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">=0.6.0" + "node": ">= 10.0.0" } }, "node_modules/path-exists": { @@ -15040,9 +13749,9 @@ } }, "node_modules/pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" @@ -15058,11 +13767,12 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -15191,14 +13901,6 @@ "fflate": "^0.8.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", @@ -15277,9 +13979,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -15342,13 +14044,31 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, @@ -15371,12 +14091,12 @@ "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" }, "node_modules/proj4": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.11.0.tgz", - "integrity": "sha512-SasuTkAx8HnWQHfIyhkdUNJorSJqINHAN3EyMWYiQRVorftz9DHz650YraFgczwgtHOxqnfuDxSNv3C8MUnHeg==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.15.0.tgz", + "integrity": "sha512-LqCNEcPdI03BrCHxPLj29vsd5afsm+0sV1H/O3nTDKrv8/LA01ea1z4QADDMjUqxSXWnrmmQDjqFm1J/uZ5RLw==", "dependencies": { "mgrs": "1.0.0", - "wkt-parser": "^1.3.3" + "wkt-parser": "^1.4.0" } }, "node_modules/promise-inflight": { @@ -15433,13 +14153,10 @@ "optional": true }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/qjobs": { "version": "1.2.0", @@ -15523,18 +14240,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/rbush": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", @@ -15574,6 +14279,18 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/reflect-metadata": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", @@ -15619,23 +14336,6 @@ "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", "dev": true }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpu-core": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", @@ -15730,6 +14430,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/resolve-protobuf-schema": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", @@ -15778,16 +14487,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { @@ -15819,6 +14531,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -15844,6 +14557,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -15873,12 +14587,12 @@ } }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.5" }, "bin": { "rollup": "dist/bin/rollup" @@ -15888,28 +14602,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -15946,38 +14663,16 @@ } }, "node_modules/rw": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz", - "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "dependencies": { - "tslib": "~2.1.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { @@ -16001,13 +14696,14 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -16086,9 +14782,9 @@ "optional": true }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -16097,13 +14793,30 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -16186,12 +14899,6 @@ "node": ">=4" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -16309,36 +15016,6 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -16411,14 +15088,69 @@ "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==" }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -16428,10 +15160,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sigstore": { "version": "2.3.1", @@ -16501,18 +15239,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -16528,7 +15254,6 @@ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -16552,6 +15277,23 @@ "ws": "~8.17.1" } }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -16565,6 +15307,40 @@ "node": ">=10.0.0" } }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -16642,6 +15418,18 @@ "webpack": "^5.72.1" } }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -16724,11 +15512,10 @@ } }, "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true }, "node_modules/ssri": { "version": "10.0.6", @@ -16751,17 +15538,6 @@ "node": ">= 0.6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", @@ -16784,38 +15560,6 @@ "node": ">=8.0" } }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/streamroller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/streamroller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -16863,10 +15607,19 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -16890,52 +15643,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -16999,17 +15706,20 @@ "kdbush": "^3.0.0" } }, + "node_modules/supercluster/node_modules/kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -17092,6 +15802,18 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -17117,16 +15839,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -17150,79 +15872,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -17257,12 +15906,14 @@ "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, "engines": { - "node": ">=14.14" + "node": ">=0.6.0" } }, "node_modules/to-regex-range": { @@ -17294,22 +15945,6 @@ "node": ">=6" } }, - "node_modules/traverse": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", - "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==", - "dependencies": { - "gopd": "^1.0.1", - "typedarray.prototype.slice": "^1.0.3", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -17394,9 +16029,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tslint": { "version": "6.1.3", @@ -17430,27 +16065,72 @@ "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" } }, - "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/tslint/node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "peer": true, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, + "node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, "node_modules/tslint/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -17458,10 +16138,21 @@ "dev": true, "peer": true }, + "node_modules/tslint/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/tslint/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "peer": true, "dependencies": { @@ -17479,6 +16170,30 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/tslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -17492,19 +16207,6 @@ "node": "*" } }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/tslint/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -17515,6 +16217,26 @@ "semver": "bin/semver" } }, + "node_modules/tslint/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "peer": true + }, + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/tslint/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -17522,7 +16244,7 @@ "dev": true, "peer": true }, - "node_modules/tslint/node_modules/tsutils": { + "node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", @@ -17535,6 +16257,13 @@ "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "peer": true + }, "node_modules/tuf-js": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", @@ -17575,6 +16304,18 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -17588,75 +16329,6 @@ "node": ">= 0.6" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typed-assert": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", @@ -17671,25 +16343,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", - "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-errors": "^1.3.0", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-offset": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typescript": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", @@ -17704,9 +16357,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", - "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", "dev": true, "funding": [ { @@ -17722,24 +16375,13 @@ "url": "https://github.com/sponsors/faisalman" } ], + "bin": { + "ua-parser-js": "script/cli.js" + }, "engines": { "node": "*" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -17823,11 +16465,12 @@ } }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/unpipe": { @@ -17840,9 +16483,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -17860,7 +16503,7 @@ ], "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -17878,6 +16521,15 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -18394,6 +17046,24 @@ "@esbuild/win32-x64": "0.21.5" } }, + "node_modules/vite/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/vite/node_modules/postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", @@ -18441,6 +17111,11 @@ "pbf": "^3.2.1" } }, + "node_modules/vt-pbf/node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -18550,6 +17225,15 @@ "node": ">= 10.13.0" } }, + "node_modules/webpack-bundle-analyzer/node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -18559,18 +17243,6 @@ "node": ">= 10" } }, - "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -18727,6 +17399,15 @@ "node": ">=18.0.0" } }, + "node_modules/webpack-merge/node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -18804,6 +17485,12 @@ "node": ">=4.0" } }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -18882,62 +17569,12 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -18945,25 +17582,31 @@ "dev": true }, "node_modules/wkt-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.3.tgz", - "integrity": "sha512-ZnV3yH8/k58ZPACOXeiHaMuXIiaTk1t0hSUVisbO0t4RjA5wPpUytcxeyiN2h+LZRrmuHIh/1UlrR9e7DHDvTw==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.4.0.tgz", + "integrity": "sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ==" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { @@ -18984,45 +17627,21 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -19037,43 +17656,33 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrappy": { @@ -19102,14 +17711,6 @@ } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -19160,59 +17761,21 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/yargs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -19227,23 +17790,6 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -19281,13598 +17827,131 @@ "version": "0.14.10", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==" - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } }, - "@angular-devkit/architect": { - "version": "0.1802.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.12.tgz", - "integrity": "sha512-bepVb2/GtJppYKaeW8yTGE6egmoWZ7zagFDsmBdbF+BYp+HmeoPsclARcdryBPVq68zedyTRdvhWSUTbw1AYuw==", - "dev": true, - "requires": { - "@angular-devkit/core": "18.2.12", - "rxjs": "7.8.1" - }, + "projects/arlas-components": { + "name": "arlas-web-components", + "version": "27.0.0-z-rc.0", "dependencies": { - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - } + "arlas-d3": "12.0.0-rc.2", + "iv-viewer": "^2.2.1", + "ng-lazyload-image": "^9.1.3", + "ngx-loading-reloaded": "^18.0.0", + "numeral": "^2.0.6", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^18.2.13", + "@angular/cdk": "^18.2.14", + "@angular/common": "^18.2.13", + "@angular/compiler": "^18.2.13", + "@angular/core": "^18.2.13", + "@angular/forms": "^18.2.13", + "@angular/material": "^18.2.14", + "@angular/platform-browser": "^18.2.13", + "@angular/platform-browser-dynamic": "^18.2.13", + "@angular/router": "^18.2.13", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", + "@types/tinycolor2": "^1.4.0", + "core-js": "~3.26.1", + "moment": "^2.24.0", + "rxjs": "^7.4.0", + "stream": "0.0.2", + "zone.js": "^0.14.0" } }, - "@angular-devkit/build-angular": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.12.tgz", - "integrity": "sha512-quVUi7eqTq9OHumQFNl9Y8t2opm8miu4rlYnuF6rbujmmBDvdUvR6trFChueRczl2p5HWqTOr6NPoDGQm8AyNw==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.12", - "@angular-devkit/build-webpack": "0.1802.12", - "@angular-devkit/core": "18.2.12", - "@angular/build": "18.2.12", - "@babel/core": "7.25.2", - "@babel/generator": "7.25.0", - "@babel/helper-annotate-as-pure": "7.24.7", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-transform-async-generator-functions": "7.25.0", - "@babel/plugin-transform-async-to-generator": "7.24.7", - "@babel/plugin-transform-runtime": "7.24.7", - "@babel/preset-env": "7.25.3", - "@babel/runtime": "7.25.0", - "@discoveryjs/json-ext": "0.6.1", - "@ngtools/webpack": "18.2.12", - "@vitejs/plugin-basic-ssl": "1.1.0", - "ansi-colors": "4.1.3", - "autoprefixer": "10.4.20", - "babel-loader": "9.1.3", - "browserslist": "^4.21.5", - "copy-webpack-plugin": "12.0.2", - "critters": "0.0.24", - "css-loader": "7.1.2", - "esbuild": "0.23.0", - "esbuild-wasm": "0.23.0", - "fast-glob": "3.3.2", - "http-proxy-middleware": "3.0.3", - "https-proxy-agent": "7.0.5", - "istanbul-lib-instrument": "6.0.3", - "jsonc-parser": "3.3.1", - "karma-source-map-support": "1.4.0", - "less": "4.2.0", - "less-loader": "12.2.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.3.1", - "magic-string": "0.30.11", - "mini-css-extract-plugin": "2.9.0", - "mrmime": "2.0.0", - "open": "10.1.0", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.6.1", - "postcss": "8.4.41", - "postcss-loader": "8.1.1", - "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.77.6", - "sass-loader": "16.0.0", - "semver": "7.6.3", - "source-map-loader": "5.0.0", - "source-map-support": "0.5.21", - "terser": "5.31.6", - "tree-kill": "1.2.2", - "tslib": "2.6.3", - "vite": "5.4.6", - "watchpack": "2.4.1", - "webpack": "5.94.0", - "webpack-dev-middleware": "~5.3.4", - "webpack-dev-server": "5.0.4", - "webpack-merge": "6.0.1", - "webpack-subresource-integrity": "5.1.0" - }, - "dependencies": { - "@discoveryjs/json-ext": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", - "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", - "dev": true - }, - "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.1802.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.12.tgz", - "integrity": "sha512-0Z3fdbZVRnjYWE2/VYyfy+uieY+6YZyEp4ylzklVkc+fmLNsnz4Zw6cK1LzzcBqAwKIyh1IdW20Cg7o8b0sONA==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1802.12", - "rxjs": "7.8.1" - }, - "dependencies": { - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "@angular-devkit/core": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.12.tgz", - "integrity": "sha512-NtB6ypsaDyPE6/fqWOdfTmACs+yK5RqfH5tStEzWFeeDsIEDYKsJ06ypuRep7qTjYus5Rmttk0Ds+cFgz8JdUQ==", - "dev": true, - "requires": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "dependencies": { - "ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "@angular-devkit/schematics": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.12.tgz", - "integrity": "sha512-mMea9txHbnCX5lXLHlo0RAgfhFHDio45/jMsREM2PA8UtVf2S8ltXz7ZwUrUyMQRv8vaSfn4ijDstF4hDMnRgQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "18.2.12", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.11", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, + "projects/arlas-map": { + "version": "27.0.0-z-rc.0", "dependencies": { - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "@angular-eslint/builder": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.4.3.tgz", - "integrity": "sha512-NzmrXlr7GFE+cjwipY/CxBscZXNqnuK0us1mO6Z2T6MeH6m+rRcdlY/rZyKoRniyNNvuzl6vpEsfMIMmnfebrA==", - "dev": true, - "requires": { - "@angular-devkit/architect": ">= 0.1800.0 < 0.1900.0", - "@angular-devkit/core": ">= 18.0.0 < 19.0.0" - } - }, - "@angular-eslint/bundled-angular-compiler": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.4.3.tgz", - "integrity": "sha512-zdrA8mR98X+U4YgHzUKmivRU+PxzwOL/j8G7eTOvBuq8GPzsP+hvak+tyxlgeGm9HsvpFj9ERHLtJ0xDUPs8fg==", - "dev": true - }, - "@angular-eslint/eslint-plugin": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.4.3.tgz", - "integrity": "sha512-AyJbupiwTBR81P6T59v+aULEnPpZBCBxL2S5QFWfAhNCwWhcof4GihvdK2Z87yhvzDGeAzUFSWl/beJfeFa+PA==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3" + "@mapbox/mapbox-gl-draw": "^1.4.3", + "@mapbox/mapbox-gl-draw-static-mode": "^1.0.1", + "@tmcw/togeojson": "~5.5.0", + "@turf/area": "^6.5.0", + "@turf/bbox": "^6.5.0", + "@turf/center": "^6.5.0", + "@turf/centroid": "^6.5.0", + "@turf/circle": "^6.5.0", + "@turf/clean-coords": "^7.0.0", + "@turf/helpers": "^6.5.0", + "@turf/length": "^6.5.0", + "@turf/midpoint": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0", + "@turf/rhumb-destination": "^6.5.0", + "@turf/transform-rotate": "^6.5.0", + "@turf/transform-translate": "^6.5.0", + "arlas-web-components": "~27.0.0-z-rc.0", + "geojson-polygon-self-intersections": "1.2.1", + "geojson-validation": "0.2.1", + "jsts": "2.1.0", + "jszip": "^3.2.1", + "pmtiles": "^2.11.0", + "rxjs": "^7.4.0", + "shpjs": "^4.0.4", + "tslib": "^2.3.0", + "turf-extent": "1.0.4", + "wellknown": "0.5.0" }, - "dependencies": { - "@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" - } - } + "peerDependencies": { + "@angular/animations": "^18.2.13", + "@angular/cdk": "^18.2.14", + "@angular/common": "^18.2.13", + "@angular/compiler": "^18.2.13", + "@angular/core": "^18.2.13", + "@angular/forms": "^18.2.13", + "@angular/material": "^18.2.14", + "@angular/platform-browser": "^18.2.13", + "@angular/platform-browser-dynamic": "^18.2.13", + "@angular/router": "^18.2.13", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", + "zone.js": "^0.14.0" } }, - "@angular-eslint/eslint-plugin-template": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.4.3.tgz", - "integrity": "sha512-ijGlX2N01ayMXTpeQivOA31AszO8OEbu9ZQUCxnu9AyMMhxyi2q50bujRChAvN9YXQfdQtbxuajxV6+aiWb5BQ==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3", - "aria-query": "5.3.2", - "axobject-query": "4.1.0" - }, + "projects/arlas-mapbox": { + "version": "27.0.0-z-rc.0", "dependencies": { - "@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" - } - } - } - }, - "@angular-eslint/schematics": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.4.3.tgz", - "integrity": "sha512-D5maKn5e6n58+8n7jLFLD4g+RGPOPeDSsvPc1sqial5tEKLxAJQJS9WZ28oef3bhkob6C60D+1H0mMmEEVvyVA==", - "dev": true, - "requires": { - "@angular-devkit/core": ">= 18.0.0 < 19.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "ignore": "6.0.2", - "semver": "7.6.3", - "strip-json-comments": "3.1.1" + "arlas-map": "~27.0.0-z-rc.0", + "mapbox-gl": "^1.6.1", + "rxjs": "^7.4.0", + "tslib": "^2.3.0" }, - "dependencies": { - "ignore": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", - "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", - "dev": true - } + "peerDependencies": { + "@angular/animations": "^18.2.13", + "@angular/cdk": "^18.2.14", + "@angular/common": "^18.2.13", + "@angular/compiler": "^18.2.13", + "@angular/core": "^18.2.13", + "@angular/forms": "^18.2.13", + "@angular/material": "^18.2.14", + "@angular/platform-browser": "^18.2.13", + "@angular/platform-browser-dynamic": "^18.2.13", + "@angular/router": "^18.2.13", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0" } }, - "@angular-eslint/template-parser": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.4.3.tgz", - "integrity": "sha512-JZMPtEB8yNip3kg4WDEWQyObSo2Hwf+opq2ElYuwe85GQkGhfJSJ2CQYo4FSwd+c5MUQAqESNRg9QqGYauDsiw==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "eslint-scope": "^8.0.2" - }, + "projects/arlas-maplibre": { + "version": "27.0.0-z-rc.0", "dependencies": { - "eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - } - } - }, - "@angular/animations": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.13.tgz", - "integrity": "sha512-rG5J5Ek5Hg+Tz2NjkNOaG6PupiNK/lPfophXpsR1t/nWujqnMWX2krahD/i6kgD+jNWNKCJCYSOVvCx/BHOtKA==", - "requires": { + "arlas-map": "~27.0.0-z-rc.0", + "maplibre-gl": "^4.7.1", + "rxjs": "^7.4.0", "tslib": "^2.3.0" - } - }, - "@angular/build": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.12.tgz", - "integrity": "sha512-4Ohz+OSILoL+cCAQ4UTiCT5v6pctu3fXNoNpTEUK46OmxELk9jDITO5rNyNS7TxBn9wY69kjX5VcDf7MenquFQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.12", - "@babel/core": "7.25.2", - "@babel/helper-annotate-as-pure": "7.24.7", - "@babel/helper-split-export-declaration": "7.24.7", - "@babel/plugin-syntax-import-attributes": "7.24.7", - "@inquirer/confirm": "3.1.22", - "@vitejs/plugin-basic-ssl": "1.1.0", - "browserslist": "^4.23.0", - "critters": "0.0.24", - "esbuild": "0.23.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", - "listr2": "8.2.4", - "lmdb": "3.0.13", - "magic-string": "0.30.11", - "mrmime": "2.0.0", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.6.1", - "rollup": "4.22.4", - "sass": "1.77.6", - "semver": "7.6.3", - "vite": "5.4.6", - "watchpack": "2.4.1" }, - "dependencies": { - "@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", - "dev": true, - "optional": true - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true - }, - "rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } - } - } - }, - "@angular/cdk": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.14.tgz", - "integrity": "sha512-vDyOh1lwjfVk9OqoroZAP8pf3xxKUvyl+TVR8nJxL4c5fOfUFkD7l94HaanqKSRwJcI2xiztuu92IVoHn8T33Q==", - "requires": { - "parse5": "^7.1.2", - "tslib": "^2.3.0" - } - }, - "@angular/cli": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.12.tgz", - "integrity": "sha512-xhuZ/b7IhqNw1MgXf+arWf4x+GfUSt/IwbdWU4+CO8A7h0Y46zQywouP/KUK3cMQZfVdHdciTBvlpF3vFacA6Q==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1802.12", - "@angular-devkit/core": "18.2.12", - "@angular-devkit/schematics": "18.2.12", - "@inquirer/prompts": "5.3.8", - "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.12", - "@yarnpkg/lockfile": "1.1.0", - "ini": "4.1.3", - "jsonc-parser": "3.3.1", - "listr2": "8.2.4", - "npm-package-arg": "11.0.3", - "npm-pick-manifest": "9.1.0", - "pacote": "18.0.6", - "resolve": "1.22.8", - "semver": "7.6.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - } - }, - "@angular/common": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.13.tgz", - "integrity": "sha512-4ZqrNp1PoZo7VNvW+sbSc2CB2axP1sCH2wXl8B0wdjsj8JY1hF1OhuugwhpAHtGxqewed2kCXayE+ZJqSTV4jw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.13.tgz", - "integrity": "sha512-TzWcrkopyjFF+WeDr2cRe8CcHjU72KfYV3Sm2TkBkcXrkYX5sDjGWrBGrG3hRB4e4okqchrOCvm1MiTdy2vKMA==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler-cli": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.13.tgz", - "integrity": "sha512-DBSh4AQwkiJDSiVvJATRmjxf6wyUs9pwQLgaFdSlfuTRO+sdb0J2z1r3BYm8t0IqdoyXzdZq2YCH43EmyvD71g==", - "dev": true, - "requires": { - "@babel/core": "7.25.2", - "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^4.0.0", - "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.2.0", - "semver": "^7.0.0", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - }, - "dependencies": { - "chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "dev": true, - "requires": { - "readdirp": "^4.0.1" - } - }, - "readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "dev": true - } - } - }, - "@angular/core": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.13.tgz", - "integrity": "sha512-8mbWHMgO95OuFV1Ejy4oKmbe9NOJ3WazQf/f7wks8Bck7pcihd0IKhlPBNjFllbF5o+04EYSwFhEtvEgjMDClA==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/forms": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.13.tgz", - "integrity": "sha512-A67D867fu3DSBhdLWWZl/F5pr7v2+dRM2u3U7ZJ0ewh4a+sv+0yqWdJW+a8xIoiHxS+btGEJL2qAKJiH+MCFfg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/material": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.14.tgz", - "integrity": "sha512-28pxzJP49Mymt664WnCtPkKeg7kXUsQKTKGf/Kl95rNTEdTJLbnlcc8wV0rT0yQNR7kXgpfBnG7h0ETLv/iu5Q==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/platform-browser": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.13.tgz", - "integrity": "sha512-tu7ZzY6qD3ATdWFzcTcsAKe7M6cJeWbT/4/bF9unyGO3XBPcNYDKoiz10+7ap2PUd0fmPwvuvTvSNJiFEBnB8Q==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/platform-browser-dynamic": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.13.tgz", - "integrity": "sha512-kbQCf9+8EpuJC7buBxhSiwBtXvjAwAKh6MznD6zd2pyCYqfY6gfRCZQRtK59IfgVtKmEONWI9grEyNIRoTmqJg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/router": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.13.tgz", - "integrity": "sha512-VKmfgi/r/CkyBq9nChQ/ptmfu0JT/8ONnLVJ5H+SkFLRYJcIRyHLKjRihMCyVm6xM5yktOdCaW73NTQrFz7+bg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", - "dev": true - }, - "@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - } - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "requires": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "semver": "^6.3.1" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "requires": { - "@babel/types": "^7.25.9" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", - "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "requires": { - "@babel/types": "^7.25.9" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", - "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dev": true, - "requires": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dev": true, - "requires": { - "@babel/types": "^7.25.9" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "requires": { - "@babel/types": "^7.25.9" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", - "dev": true, - "requires": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "dev": true, - "requires": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - } - }, - "@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "dev": true, - "requires": { - "@babel/types": "^7.26.3" - } - }, - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - } - }, - "@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.7" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "requires": { - "@babel/types": "^7.25.9" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "requires": { - "@babel/types": "^7.25.9" - } - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", - "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - } - }, - "@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - } - }, - "@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - } - }, - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, - "@colsen1991/ngx-translate-extract-marker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@colsen1991/ngx-translate-extract-marker/-/ngx-translate-extract-marker-3.0.1.tgz", - "integrity": "sha512-faQeH8zTKB8U+7kdsL54Mj48uJuMKhZ0/t2qONrxyBE5GwWGWxTf778cBi4UR23nOmBzo8A2fyEXCY0gtdkOVQ==", - "dev": true, - "requires": { - "tslib": "^2.3.0" - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.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" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "@inquirer/checkbox": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", - "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - } - }, - "@inquirer/confirm": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", - "dev": true, - "requires": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" - } - }, - "@inquirer/core": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", - "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", - "dev": true, - "requires": { - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.5", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "dependencies": { - "@inquirer/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", - "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", - "dev": true, - "requires": { - "mute-stream": "^1.0.0" - } - }, - "@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", - "dev": true, - "requires": { - "undici-types": "~6.20.0" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "@inquirer/editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", - "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "external-editor": "^3.1.0" - } - }, - "@inquirer/expand": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", - "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" - } - }, - "@inquirer/figures": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", - "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", - "dev": true - }, - "@inquirer/input": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", - "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" - } - }, - "@inquirer/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", - "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" - } - }, - "@inquirer/password": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", - "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2" - } - }, - "@inquirer/prompts": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.3.8.tgz", - "integrity": "sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==", - "dev": true, - "requires": { - "@inquirer/checkbox": "^2.4.7", - "@inquirer/confirm": "^3.1.22", - "@inquirer/editor": "^2.1.22", - "@inquirer/expand": "^2.1.22", - "@inquirer/input": "^2.2.9", - "@inquirer/number": "^1.0.10", - "@inquirer/password": "^2.1.22", - "@inquirer/rawlist": "^2.2.4", - "@inquirer/search": "^1.0.7", - "@inquirer/select": "^2.4.7" - } - }, - "@inquirer/rawlist": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", - "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" - } - }, - "@inquirer/search": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", - "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "yoctocolors-cjs": "^2.1.2" - } - }, - "@inquirer/select": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", - "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", - "dev": true, - "requires": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - } - }, - "@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", - "dev": true, - "requires": { - "mute-stream": "^1.0.0" - } - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "@listr2/prompt-adapter-inquirer": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.15.tgz", - "integrity": "sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg==", - "dev": true, - "requires": { - "@inquirer/type": "^1.5.1" - } - }, - "@lmdb/lmdb-darwin-arm64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz", - "integrity": "sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-darwin-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.13.tgz", - "integrity": "sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.13.tgz", - "integrity": "sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.13.tgz", - "integrity": "sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.13.tgz", - "integrity": "sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-win32-x64": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz", - "integrity": "sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==", - "dev": true, - "optional": true - }, - "@mapbox/extent": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@mapbox/extent/-/extent-0.4.0.tgz", - "integrity": "sha512-MSoKw3qPceGuupn04sdaJrFeLKvcSETVLZCGS8JA9x6zXQL3FWiKaIXYIZEDXd5jpXpWlRxinCZIN49yRy0C9A==" - }, - "@mapbox/geojson-area": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz", - "integrity": "sha512-bBqqFn1kIbLBfn7Yq1PzzwVkPYQr9lVUeT8Dhd0NL5n76PBuXzOcuLV7GOSbEB1ia8qWxH4COCvFpziEu/yReA==", - "requires": { - "wgs84": "0.0.0" - } - }, - "@mapbox/geojson-coords": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-coords/-/geojson-coords-0.0.2.tgz", - "integrity": "sha512-YuVzpseee/P1T5BWyeVVPppyfmuXYHFwZHmybkqaMfu4BWlOf2cmMGKj2Rr92MwfSTOCSUA0PAsVGRG8akY0rg==", - "requires": { - "@mapbox/geojson-normalize": "0.0.1", - "geojson-flatten": "^1.0.4" - } - }, - "@mapbox/geojson-extent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-extent/-/geojson-extent-1.0.1.tgz", - "integrity": "sha512-hh8LEO3djT4fqfr8sSC6wKt+p0TMiu+KOLMBUiFOyj+zGq7+IXwQGl0ppCVDkyzCewyd9LoGe9zAvDxXrLfhLw==", - "requires": { - "@mapbox/extent": "0.4.0", - "@mapbox/geojson-coords": "0.0.2", - "rw": "~0.1.4", - "traverse": "~0.6.6" - } - }, - "@mapbox/geojson-normalize": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-normalize/-/geojson-normalize-0.0.1.tgz", - "integrity": "sha512-82V7YHcle8lhgIGqEWwtXYN5cy0QM/OHq3ypGhQTbvHR57DF0vMHMjjVSQKFfVXBe/yWCBZTyOuzvK7DFFnx5Q==" - }, - "@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "requires": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - } - }, - "@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" - }, - "@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" - }, - "@mapbox/mapbox-gl-draw": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.4.3.tgz", - "integrity": "sha512-03qIJgyGmm0IoTZbV/cfODru9jRGogi4LcQ3maxIJDKccq1gY3ofgt2UYPkeU143ElxitZahEythNQv1NpsLhg==", - "requires": { - "@mapbox/geojson-area": "^0.2.2", - "@mapbox/geojson-extent": "^1.0.1", - "@mapbox/geojson-normalize": "^0.0.1", - "@mapbox/point-geometry": "^0.1.0", - "hat": "0.0.3", - "lodash.isequal": "^4.5.0", - "xtend": "^4.0.2" - } - }, - "@mapbox/mapbox-gl-draw-static-mode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-draw-static-mode/-/mapbox-gl-draw-static-mode-1.0.1.tgz", - "integrity": "sha512-r/y50dlRJ8ctK5YdhAzimiKIu/R2b0GkGoExw7zWn17CDTn2ftGqsljJOlfLXf5rH15Wv75t1EN9KsM6OkdhWQ==" - }, - "@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", - "requires": {} - }, - "@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" - }, - "@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" - }, - "@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "requires": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" - }, - "@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "dev": true, - "optional": true - }, - "@ngtools/webpack": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.12.tgz", - "integrity": "sha512-FFJAwtWbtpncMOVNuULPBwFJB7GSjiUwO93eGTzRp8O4EPQ8lCQeFbezQm/NP34+T0+GBLGzPSuQT+muob8YKw==", - "dev": true, - "requires": {} - }, - "@ngx-translate/core": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz", - "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", - "requires": {} - }, - "@ngx-translate/http-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz", - "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==", - "requires": {} - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - } - } - }, - "@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "dependencies": { - "isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true - }, - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "requires": { - "isexe": "^3.1.1" - } - } - } - }, - "@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "dev": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true - }, - "@npmcli/package-json": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", - "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", - "dev": true, - "requires": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" - }, - "dependencies": { - "json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true - } - } - }, - "@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "dev": true, - "requires": { - "which": "^4.0.0" - }, - "dependencies": { - "isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true - }, - "which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "requires": { - "isexe": "^3.1.1" - } - } - } - }, - "@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", - "dev": true - }, - "@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", - "dev": true, - "requires": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" - }, - "dependencies": { - "isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true - }, - "which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "requires": { - "isexe": "^3.1.1" - } - } - } - }, - "@phenomnomnominal/tsquery": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-6.1.3.tgz", - "integrity": "sha512-CEqpJ872StsxRmwv9ePCZ4BCisrJSlREUC5XxIRYxhvODt4aQoJFFmjTgaP6meyKiiXxxN/VWPZ58j4yHXRkmw==", - "dev": true, - "requires": { - "@types/esquery": "^1.5.0", - "esquery": "^1.5.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", - "dev": true - }, - "@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^5.1.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - } - }, - "@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "dependencies": { - "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true - } - } - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", - "dev": true, - "optional": true - }, - "@rollup/wasm-node": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.28.1.tgz", - "integrity": "sha512-t4ckEC09V3wbe0r6T4fGjq85lEbvGcGxn7QYYgjHyKNzZaQU5kFqr4FsavXYHRiVNYq8m+dRhdGjpfcC9UzzPg==", - "dev": true, - "requires": { - "@types/estree": "1.0.6", - "fsevents": "~2.3.2" - } - }, - "@schematics/angular": { - "version": "18.2.12", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.12.tgz", - "integrity": "sha512-sIoeipsisK5eTLW3XuNZYcal83AfslBbgI7LnV+3VrXwpasKPGHwo2ZdwhCd2IXAkuJ02Iyu7MyV0aQRM9i/3g==", - "dev": true, - "requires": { - "@angular-devkit/core": "18.2.12", - "@angular-devkit/schematics": "18.2.12", - "jsonc-parser": "3.3.1" - } - }, - "@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", - "dev": true, - "requires": { - "@sigstore/protobuf-specs": "^0.3.2" - } - }, - "@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", - "dev": true - }, - "@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", - "dev": true - }, - "@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", - "dev": true, - "requires": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - } - }, - "@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", - "dev": true, - "requires": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" - } - }, - "@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", - "dev": true, - "requires": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" - } - }, - "@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true - }, - "@socket.io/component-emitter": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.1.tgz", - "integrity": "sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==", - "dev": true - }, - "@tmcw/togeojson": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@tmcw/togeojson/-/togeojson-5.5.0.tgz", - "integrity": "sha512-K/neYsnwGkC1sjI0UInSyuxybPsBPXZF+g18l7XtzW37Jfzzcw4YjMd/rnqP5QRONtjuvGN6nGeCemKfeWkPGg==", - "requires": {} - }, - "@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true - }, - "@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", - "dev": true, - "requires": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - } - }, - "@turf/area": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", - "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/bbox": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", - "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", - "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/center": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center/-/center-6.5.0.tgz", - "integrity": "sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/centroid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", - "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/circle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-6.5.0.tgz", - "integrity": "sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==", - "requires": { - "@turf/destination": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/clean-coords": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-7.0.0.tgz", - "integrity": "sha512-kaKR4/NnhZpgC+hWY3MfPqV2KwzG4Vr66WH59GbT5B2tvAOJqAYUmq+rgyMsG6xA3fTBL3neDW0bY1DHFVcvHQ==", - "requires": { - "@turf/helpers": "^7.0.0", - "@turf/invariant": "^7.0.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "@turf/helpers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz", - "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", - "requires": { - "deep-equal": "^2.2.3", - "tslib": "^2.6.2" - } - }, - "@turf/invariant": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.0.0.tgz", - "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", - "requires": { - "@turf/helpers": "^7.0.0", - "tslib": "^2.6.2" - } - } - } - }, - "@turf/clone": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-6.5.0.tgz", - "integrity": "sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", - "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==" - }, - "@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/length": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz", - "integrity": "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==", - "requires": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/meta": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", - "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/midpoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-6.5.0.tgz", - "integrity": "sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw==", - "requires": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/rhumb-bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-6.5.0.tgz", - "integrity": "sha512-jMyqiMRK4hzREjQmnLXmkJ+VTNTx1ii8vuqRwJPcTlKbNWfjDz/5JqJlb5NaFDcdMpftWovkW5GevfnuzHnOYA==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/rhumb-destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-6.5.0.tgz", - "integrity": "sha512-RHNP1Oy+7xTTdRrTt375jOZeHceFbjwohPHlr9Hf68VdHHPMAWgAKqiX2YgSWDcvECVmiGaBKWus1Df+N7eE4Q==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/rhumb-distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.5.0.tgz", - "integrity": "sha512-oKp8KFE8E4huC2Z1a1KNcFwjVOqa99isxNOwfo4g3SUABQ6NezjKDDrnvC4yI5YZ3/huDjULLBvhed45xdCrzg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/transform-rotate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-6.5.0.tgz", - "integrity": "sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag==", - "requires": { - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - } - }, - "@turf/transform-translate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-6.5.0.tgz", - "integrity": "sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0" - } - }, - "@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" - }, - "@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" - }, - "@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "requires": { - "@types/d3-color": "*" - } - }, - "@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" - }, - "@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "requires": { - "@types/d3-time": "*" - } - }, - "@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" - }, - "@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "requires": { - "@types/d3-path": "*" - } - }, - "@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" - }, - "@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" - }, - "@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/esquery": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/esquery/-/esquery-1.5.4.tgz", - "integrity": "sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - }, - "dependencies": { - "@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - } - } - }, - "@types/express-serve-static-core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", - "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/jasmine": { - "version": "3.10.18", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.10.18.tgz", - "integrity": "sha512-jOk52a1Kz+1oU5fNWwAcNe64/GsE7r/Q6ronwDox0D3ETo/cr4ICMQyeXrj7G6FPW1n8YjRoAZA2F0XBr6GicQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/mapbox-gl": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-1.13.10.tgz", - "integrity": "sha512-0oUy5d5nT3L480MRviAnaBUEXuWCG/7M4ZQo0n8eJ/LLMgJ0nMbjv7M+qoPl4TAj6yVVWKTvkukXvW9QHH1GVw==", - "requires": { - "@types/geojson": "*" - } - }, - "@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "18.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", - "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "requires": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true - }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "@types/tinycolor2": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", - "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==" - }, - "@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true - }, - "@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - } - }, - "@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - } - } - } - }, - "@typescript-eslint/eslint-plugin-tslint": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-7.0.2.tgz", - "integrity": "sha512-Os20XlgmnXPlfqcvO5I6asARarEXZ/BQ2WEHaphfN+d8CUq8H3lGM2ep3SGcwaF1PXpAxfNBDN8U4EYhliFfSQ==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "7.0.2" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", - "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" - } - }, - "@typescript-eslint/types": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", - "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", - "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", - "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", - "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - } - }, - "@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - } - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", - "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - } - }, - "@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - } - } - } - }, - "@typescript-eslint/types": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", - "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", - "dev": true, - "peer": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", - "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", - "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", - "dev": true, - "peer": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", - "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", - "dev": true, - "peer": true, - "requires": { - "@typescript-eslint/types": "8.18.0", - "eslint-visitor-keys": "^4.2.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "peer": true - } - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "@vendure/ngx-translate-extract": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@vendure/ngx-translate-extract/-/ngx-translate-extract-9.3.1.tgz", - "integrity": "sha512-V81lW469gVng1OeLuFk9n06NmuKcWFsfImE4eGQIijBU4lJTDbZkcv6DpZ7SyGZOqCWwM6tWbA2V+w0zeBh4Lg==", - "dev": true, - "requires": { - "@phenomnomnominal/tsquery": "^6.1.3", - "braces": "^3.0.2", - "colorette": "^2.0.20", - "flat": "^6.0.1", - "gettext-parser": "^4.2.0", - "glob": "^10.3.0", - "json5": "^2.2.3", - "tsconfig": "^7.0.0", - "yargs": "^17.7.2" - }, - "dependencies": { - "flat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", - "integrity": "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==", - "dev": true - } - } - }, - "@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, - "requires": {} - }, - "@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - }, - "abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true - }, - "acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true - }, - "arlas-d3": { - "version": "12.0.0-rc.2", - "resolved": "https://registry.npmjs.org/arlas-d3/-/arlas-d3-12.0.0-rc.2.tgz", - "integrity": "sha512-Muk59uH9Xu2ULPKDEs90TMHcNso4hBlx6qPAUoOeGHwloBKnRCwQQ+eDMQq4o1PvTNRT/cprISpL7N73MVm8lA==", - "requires": { - "@types/d3-array": "^3.0.3", - "@types/d3-axis": "^3.0.1", - "@types/d3-brush": "^3.0.1", - "@types/d3-drag": "^3.0.2", - "@types/d3-hierarchy": "^3.1.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-selection": "^3.0.3", - "@types/d3-shape": "^3.1.0", - "@types/d3-time-format": "^4.0.0", - "@types/d3-transition": "^3.0.3", - "@types/tinycolor2": "^1.4.0", - "d3-array": "^3.2.0", - "d3-axis": "^3.0.0", - "d3-brush": "^3.0.0", - "d3-drag": "^3.0.0", - "d3-hierarchy": "^3.1.2", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time-format": "^4.1.0", - "d3-transition": "^3.0.1", - "moment": "^2.29.4", - "patch-package": "^6.4.7", - "rxjs": "^7.4.0", - "tinycolor2": "~1.6.0" - } - }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - } - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, - "requires": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true - }, - "babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", - "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", - "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.3" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "requires": { - "run-applescript": "^7.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true - }, - "cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "concat-stream": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", - "integrity": "sha512-H6xsIBfQ94aESBG8jGHXQ7i5AEpy5ZeVaLDOisDICiTCKpqEfr34/KmTrspKQNoLKNu9gTkovlpQcUi630AKiQ==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~2.0.0", - "typedarray": "~0.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - } - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "requires": { - "is-what": "^3.14.1" - } - }, - "copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", - "dev": true, - "requires": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - } - }, - "path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true - }, - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true - } - } - }, - "core-js": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz", - "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==" - }, - "core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", - "dev": true, - "requires": { - "browserslist": "^4.24.2" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "requires": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "critters": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", - "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "postcss-media-query-parser": "^0.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - } - }, - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" - }, - "d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - } - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" - }, - "d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - } - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" - }, - "d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" - }, - "d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" - }, - "d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "requires": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - } - }, - "d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" - }, - "d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "requires": { - "d3-path": "^3.1.0" - } - }, - "d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "requires": { - "d3-array": "2 - 3" - } - }, - "d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "requires": { - "d3-time": "1 - 3" - } - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" - }, - "d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "requires": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true - }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "requires": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - } - }, - "default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", - "dev": true - }, - "emitter-component": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.2.tgz", - "integrity": "sha512-QdXO3nXOzZB4pAjM0n6ZE+R9/+kPpECA/XSELIcc54NeYVnBqIk+4DFiBgK+8QbV3mdvTG6nedl7dTYgO+5wDw==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "engine.io": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", - "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - } - }, - "engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "devOptional": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "requires": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - } - }, - "es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "requires": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" - } - }, - "esbuild-wasm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.23.0.tgz", - "integrity": "sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==", - "dev": true - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true - }, - "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "~7.0.5", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "~7.0.5", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true - }, - "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@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-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true - }, - "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "requires": { - "micromatch": "^4.0.2" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "requires": { - "cross-spawn": "~7.0.5", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - } - }, - "fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "geojson-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/geojson-flatten/-/geojson-flatten-1.1.1.tgz", - "integrity": "sha512-k/6BCd0qAt7vdqdM1LkLfAy72EsLDy0laNwX0x2h49vfYCiQkRc4PSra8DNEdJ10EKRpwEvDXMb0dBknTJuWpQ==" - }, - "geojson-polygon-self-intersections": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/geojson-polygon-self-intersections/-/geojson-polygon-self-intersections-1.2.1.tgz", - "integrity": "sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==", - "requires": { - "rbush": "^2.0.1" - } - }, - "geojson-validation": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/geojson-validation/-/geojson-validation-0.2.1.tgz", - "integrity": "sha512-vcWNJ0HKF4XN5GjyCnDImeuVFwI20iBrbMYaTeS7KJqjN+UjULpi8wbRBp+8UCiy9ofetKhxKC9rH/9RdFiaJQ==" - }, - "geojson-vt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "requires": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - } - }, - "gettext-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-4.2.0.tgz", - "integrity": "sha512-aMgPyjC9W5Mz9tbFU8DcQ7GYMXoFWq633kaWGt4imlcpBWzDIWk7HY7nCSZTCJxyjRaLq9L/NEjMKkZ9gR630Q==", - "dev": true, - "requires": { - "content-type": "^1.0.4", - "encoding": "^0.1.13", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.1" - } - }, - "gitignore-to-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz", - "integrity": "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA==", - "dev": true - }, - "gl-matrix": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "grid-index": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "requires": { - "duplexer": "^0.1.2" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==" - }, - "hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "requires": { - "lru-cache": "^10.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - } - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "http-proxy-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", - "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.15", - "debug": "^4.3.6", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.3", - "is-plain-object": "^5.0.0", - "micromatch": "^4.0.8" - }, - "dependencies": { - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true - }, - "ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "dev": true, - "requires": { - "minimatch": "^9.0.0" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true - }, - "injection-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" - }, - "ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "requires": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - } - } - }, - "ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "requires": { - "is-typed-array": "^1.1.13" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - }, - "dependencies": { - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - } - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" - }, - "is-network-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", - "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" - }, - "is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "requires": { - "call-bind": "^1.0.7" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "requires": { - "which-typed-array": "^1.1.14" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - } - }, - "is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iv-viewer": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/iv-viewer/-/iv-viewer-2.2.1.tgz", - "integrity": "sha512-pxKrG5fmlGDTcl12uU0RT7huik153TQERXf/NosnUZggKHJEwDu7mUOVNFy4sk6Oi3r9/eqFCk3NMglaKor01Q==" - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jasmine-core": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.10.1.tgz", - "integrity": "sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "jsts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jsts/-/jsts-2.1.0.tgz", - "integrity": "sha512-gxv7hw5FmXwoieHBNKyrl+DZVp1aaJbUPDgPRGf54y7owWoq75CWwL6VCmdKxt5jaMHh9CKOaG1u/WZJRUM5NA==" - }, - "jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "karma": { - "version": "6.3.20", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", - "integrity": "sha512-HRNQhMuKOwKpjYlWiJP0DUrJOh+QjaI/DTaD8b9rEm4Il3tJ8MijutVZH4ts10LuUFst/CedwTS6vieCN8yTSw==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", - "dev": true, - "requires": { - "which": "^1.2.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "karma-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", - "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.1", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - } - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "karma-jasmine": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", - "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", - "dev": true, - "requires": { - "jasmine-core": "^3.6.0" - } - }, - "karma-jasmine-html-reporter": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", - "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", - "dev": true, - "requires": {} - }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - } - }, - "kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", - "dev": true, - "requires": { - "copy-anything": "^2.0.1", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^2.3.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "less-loader": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", - "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", - "dev": true, - "requires": {} - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "license-check-and-add": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/license-check-and-add/-/license-check-and-add-4.0.5.tgz", - "integrity": "sha512-FySnMi3Kf/vO5jka8tcbVF1FhDFb8PWsQ8pg5Y7U/zkQgta+fIrJGcGHO58WFjfKlgvhneG1uQ00Fpxzhau3QA==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "gitignore-to-glob": "^0.3.0", - "globby": "^10.0.1", - "ignore": "^5.1.2", - "yargs": "^13.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "requires": { - "webpack-sources": "^3.0.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "requires": { - "immediate": "~3.0.5" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "listr2": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", - "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", - "dev": true, - "requires": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, - "lmdb": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.13.tgz", - "integrity": "sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==", - "dev": true, - "requires": { - "@lmdb/lmdb-darwin-arm64": "3.0.13", - "@lmdb/lmdb-darwin-x64": "3.0.13", - "@lmdb/lmdb-linux-arm": "3.0.13", - "@lmdb/lmdb-linux-arm64": "3.0.13", - "@lmdb/lmdb-linux-x64": "3.0.13", - "@lmdb/lmdb-win32-x64": "3.0.13", - "msgpackr": "^1.10.2", - "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.2.2", - "ordered-binary": "^1.4.1", - "weak-lru-cache": "^1.2.2" - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "requires": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "requires": { - "environment": "^1.0.0" - } - }, - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "requires": { - "restore-cursor": "^5.0.0" - } - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "requires": { - "get-east-asian-width": "^1.0.0" - } - }, - "onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "requires": { - "mimic-function": "^5.0.0" - } - }, - "restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "requires": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - } - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - }, - "slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - } - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, - "log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - } - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "requires": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - } - }, - "mapbox-gl": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", - "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", - "requires": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "dependencies": { - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.4" - } - }, - "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "mgrs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", - "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==" - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - }, - "minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - } - }, - "minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" - }, - "mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "msgpackr": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", - "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", - "dev": true, - "requires": { - "msgpackr-extract": "^3.0.2" - } - }, - "msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, - "optional": true, - "requires": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3", - "node-gyp-build-optional-packages": "5.2.2" - } - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" - }, - "mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - } - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "ng-lazyload-image": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/ng-lazyload-image/-/ng-lazyload-image-9.1.3.tgz", - "integrity": "sha512-GlajmzbKhQCvg9pcrASq4fe/MNv9KoifGe6N+xRbseaBrNj2uwU4Vwic041NlmAQFEkpDM1H2EJCAjjmJeF7Hg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "ng-packagr": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-18.2.1.tgz", - "integrity": "sha512-dy9ZDpZb3QpAz+Y/m8VAu7ctr2VrnRU3gmQwJagnNybVJtCsKn3lZA3IW7Z7GTLoG5IALSPouiCgiB/C8ozv7w==", - "dev": true, - "requires": { - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/wasm-node": "^4.18.0", - "ajv": "^8.12.0", - "ansi-colors": "^4.1.3", - "browserslist": "^4.22.1", - "cacache": "^18.0.0", - "chokidar": "^3.5.3", - "commander": "^12.0.0", - "convert-source-map": "^2.0.0", - "dependency-graph": "^1.0.0", - "esbuild": "^0.23.0", - "fast-glob": "^3.3.1", - "find-cache-dir": "^3.3.2", - "injection-js": "^2.4.0", - "jsonc-parser": "^3.2.0", - "less": "^4.2.0", - "ora": "^5.1.0", - "piscina": "^4.4.0", - "postcss": "^8.4.31", - "rollup": "^4.18.0", - "rxjs": "^7.8.1", - "sass": "^1.69.5" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "ngeohash": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", - "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==" - }, - "ngx-loading-reloaded": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/ngx-loading-reloaded/-/ngx-loading-reloaded-18.0.0.tgz", - "integrity": "sha512-Mp5gpYqLV4+mYIcNJQpLLVsNr//PdBx8ntiuo2nKeNhCe6T8oY3BSVFpsxF2eJhddHHU9SQzAuT5kg4di2Khqg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "optional": true, - "requires": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - }, - "dependencies": { - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - } - } - }, - "node": { - "version": "18.20.4", - "resolved": "https://registry.npmjs.org/node/-/node-18.20.4.tgz", - "integrity": "sha512-7kNnwQLq7hjLAKkku5Ig77yGmvFzriLwF83zg8BV13QEG3KGh5UGAT0O+TPK9N+AQbdf02LmFBXKbuGcHNfMLA==", - "dev": true, - "requires": { - "node-bin-setup": "^1.0.0" - } - }, - "node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true - }, - "node-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", - "dev": true - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-gyp": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", - "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "dependencies": { - "isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true - }, - "which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "requires": { - "isexe": "^3.1.1" - } - } - } - }, - "node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "dev": true, - "optional": true - }, - "node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, - "requires": { - "detect-libc": "^2.0.1" - } - }, - "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true - }, - "nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "requires": { - "abbrev": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "requires": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true - }, - "npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "dev": true, - "requires": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - } - }, - "npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", - "dev": true, - "requires": { - "ignore-walk": "^6.0.4" - } - }, - "npm-pick-manifest": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", - "dev": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - } - }, - "npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", - "dev": true, - "requires": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" - }, - "object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "requires": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "requires": { - "is-inside-container": "^1.0.0" - } - } - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ordered-binary": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", - "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "dependencies": { - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", - "dev": true, - "requires": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@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-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "devOptional": true, - "requires": { - "entities": "^4.4.0" - } - }, - "parse5-html-rewriting-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", - "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", - "dev": true, - "requires": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - } - }, - "parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", - "dev": true, - "requires": { - "parse5": "^7.0.0" - } - }, - "parsedbf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parsedbf/-/parsedbf-1.1.1.tgz", - "integrity": "sha512-jndFmhcrzSAGCMccM4za+3bIRxqV6L2doQjYN8Xgz0kZUpyBT5I8Gs6Y6hL5GcO2rih9OBkPcLlx2uBoLi8R8Q==", - "requires": { - "iconv-lite": "^0.4.15", - "text-encoding-polyfill": "^0.6.7" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "~7.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - } - } - }, - "path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", - "requires": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - } - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "piscina": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", - "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", - "dev": true, - "requires": { - "nice-napi": "^1.0.2" - } - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "requires": { - "find-up": "^6.3.0" - }, - "dependencies": { - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true - } - } - }, - "pmtiles": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/pmtiles/-/pmtiles-2.11.0.tgz", - "integrity": "sha512-dU9SzzaqmCGpdEuTnIba6bDHT6j09ZJFIXxwGpvkiEnce3ZnBB1VKt6+EOmJGueriweaZLAMTUmKVElU2CBe0g==", - "requires": { - "fflate": "^0.8.0" - } - }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" - }, - "postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - } - }, - "postcss-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", - "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", - "dev": true, - "requires": { - "cosmiconfig": "^9.0.0", - "jiti": "^1.20.0", - "semver": "^7.5.4" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true - }, - "postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^7.0.0" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==" - }, - "proj4": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.11.0.tgz", - "integrity": "sha512-SasuTkAx8HnWQHfIyhkdUNJorSJqINHAN3EyMWYiQRVorftz9DHz650YraFgczwgtHOxqnfuDxSNv3C8MUnHeg==", - "requires": { - "mgrs": "1.0.0", - "wkt-parser": "^1.3.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "requires": { - "side-channel": "^1.0.6" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "rbush": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", - "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", - "requires": { - "quickselect": "^1.0.1" - }, - "dependencies": { - "quickselect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" - } - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "dev": true - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "requires": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - } - }, - "regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "requires": { - "jsesc": "~3.0.2" - }, - "dependencies": { - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "requires": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", - "@types/estree": "1.0.6", - "fsevents": "~2.3.2" - } - }, - "run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rw": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz", - "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" - }, - "rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "requires": { - "tslib": "~2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - } - } - }, - "safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.0.tgz", - "integrity": "sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==", - "dev": true, - "requires": { - "neo-async": "^2.6.2" - } - }, - "sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true, - "optional": true - }, - "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "requires": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "dependencies": { - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true - }, - "shpjs": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/shpjs/-/shpjs-4.0.4.tgz", - "integrity": "sha512-+IcS2DoiTGqAONUEN46ZociKGJ2ecs1EVwJuSqnAOkMafxWC8noO3X/zI959RCbqHGvBr1RM1bdk4jc7fYONVg==", - "requires": { - "jszip": "^3.5.0", - "lie": "^3.0.1", - "lru-cache": "^2.7.0", - "parsedbf": "^1.1.0", - "proj4": "^2.1.4" - }, - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==" - } - } - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", - "dev": true, - "requires": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" - } - }, - "sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - } - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - } - }, - "socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "requires": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "requires": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "requires": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true - }, - "source-map-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", - "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true - }, - "ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "requires": { - "internal-slot": "^1.0.4" - } - }, - "stream": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", - "integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==", - "requires": { - "emitter-component": "^1.1.1" - } - }, - "streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", - "requires": { - "kdbush": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - } - } - }, - "text-encoding-polyfill": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/text-encoding-polyfill/-/text-encoding-polyfill-0.6.7.tgz", - "integrity": "sha512-/DZ1XJqhbqRkCop6s9ZFu8JrFRwmVuHg4quIRm+ziFkR3N3ec6ck6yBvJ1GYeEQZhLVwRW0rZE+C3SSJpy0RTg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, - "tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, - "tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true - }, - "traverse": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", - "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==", - "requires": { - "gopd": "^1.0.1", - "typedarray.prototype.slice": "^1.0.3", - "which-typed-array": "^1.1.15" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - } - }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "requires": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "peer": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "peer": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "peer": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "peer": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "dev": true, - "requires": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - } - }, - "turf-extent": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/turf-extent/-/turf-extent-1.0.4.tgz", - "integrity": "sha512-JPQtCq6Q5YwwkzQzSU8LYe1KbFnzEVbh21s/o8kYtgs6AeON47t0Gd2q+qLuQOr6usMiJoXylMvgk5qagOzYTQ==", - "requires": { - "turf-meta": "^1.0.2" - } - }, - "turf-meta": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/turf-meta/-/turf-meta-1.0.2.tgz", - "integrity": "sha512-oR+OxR++Wlie4fr2cMLbmdVAA9rfHxnuX/H5bphCaDTc14JDmd/ixWer08vhoawnvjE98Eq6o4UOGY8AMRbexw==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - } - }, - "typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "typedarray": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.7.tgz", - "integrity": "sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==" - }, - "typedarray.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", - "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-errors": "^1.3.0", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-offset": "^1.0.2" - } - }, - "typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", - "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true - }, - "unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "dev": true, - "requires": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "vite": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", - "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", - "dev": true, - "requires": { - "esbuild": "^0.21.3", - "fsevents": "~2.3.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "dependencies": { - "@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - } - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true - }, - "vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "requires": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" - } - }, - "watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dev": true, - "requires": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "requires": {} - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - } - }, - "webpack-dev-server": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", - "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "~5.3.4", - "ws": "^8.16.0" - }, - "dependencies": { - "http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "requires": { - "glob": "^10.3.7" - } - } - } - }, - "webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", - "dev": true, - "requires": { - "typed-assert": "^1.0.8" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "wellknown": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wellknown/-/wellknown-0.5.0.tgz", - "integrity": "sha512-za5vTLuPF9nmrVOovYQwNEWE/PwJCM+yHMAj4xN1WWUvtq9OElsvKiPL0CR9rO8xhrYqL7NpI7IknqR8r6eYOg==", - "requires": { - "concat-stream": "~1.5.0", - "minimist": "~1.2.0" - } - }, - "wgs84": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz", - "integrity": "sha512-ANHlY4Rb5kHw40D0NJ6moaVfOCMrp9Gpd1R/AIQYg2ko4/jzcJ+TVXYYF6kXJqQwITvEZP4yEthjM7U6rYlljQ==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "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-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "requires": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - } - }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - } - }, - "wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "wkt-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.3.tgz", - "integrity": "sha512-ZnV3yH8/k58ZPACOXeiHaMuXIiaTk1t0hSUVisbO0t4RjA5wPpUytcxeyiN2h+LZRrmuHIh/1UlrR9e7DHDvTw==" - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "requires": {} - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "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.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "peerDependencies": { + "@angular/animations": "^18.2.13", + "@angular/cdk": "^18.2.14", + "@angular/common": "^18.2.13", + "@angular/compiler": "^18.2.13", + "@angular/core": "^18.2.13", + "@angular/forms": "^18.2.13", + "@angular/material": "^18.2.14", + "@angular/platform-browser": "^18.2.13", + "@angular/platform-browser-dynamic": "^18.2.13", + "@angular/router": "^18.2.13", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0" } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true - }, - "zone.js": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", - "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==" } } } diff --git a/package.json b/package.json index 95b9dfd3..05eb2494 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,39 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "arlas-web-components-demo", - "version": "27.1.0-dev0", + "version": "27.0.0-z-rc.0", "license": "Apache-2.0", + "workspaces": [ + "projects/arlas-components", + "projects/arlas-map", + "projects/arlas-mapbox", + "projects/arlas-maplibre" + ], "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build", - "build:stats": "ng build --stats-json", - "test": "ng test arlas-web-components", - "lint": "ng lint arlas-web-components", - "build-release": "ng build arlas-web-components --configuration production && cp -r patches dist/arlas-web-components", + "test-components": "ng test arlas-web-components", + "test-map": "ng test arlas-map", + "test-mapbox": "ng test arlas-mapbox", + "test-maplibre": "ng test arlas-maplibre", + "test": "npm run test-components && npm run test-map && npm run test-maplibre && npm run test-mapbox", + "lint-components": "ng lint arlas-web-components", + "lint-map": "ng lint arlas-map", + "lint-mapbox": "ng lint arlas-mapbox", + "lint-maplibre": "ng lint arlas-mapbox", + "lint": "npm run lint-components && npm run lint-map && npm run lint-mapbox && npm run lint-maplibre", + "build-components": "ng build arlas-web-components --configuration production && cp -r patches dist/arlas-web-components", + "build-map": "ng build arlas-map --configuration production && cp -r patches dist/arlas-map", + "build-mapbox": "ng build arlas-mapbox --configuration production && cp -r patches dist/arlas-mapbox", + "build-maplibre": "ng build arlas-maplibre --configuration production && cp -r patches dist/arlas-maplibre", "e2e": "ng e2e", "analyze": "webpack-bundle-analyzer dist/stats-es2015.json", - "i18n:init": "ngx-translate-extract --input ./projects/arlas-components/src/lib --output ./projects/arlas-components/assets/i18n/template.json --key-as-default-value --replace --format json", - "i18n:extract": "ngx-translate-extract --input ./projects/arlas-components/src/lib --output ./projects/arlas-components/assets/i18n/{en,fr,es}.json --format json", + "i18n:init-components": "ngx-translate-extract --input ./projects/arlas-components/src/lib --output ./projects/arlas-components/assets/i18n/template.json --key-as-default-value --replace --format json", + "i18n:init-map": "ngx-translate-extract --input ./projects/arlas-map/src/lib --output ./projects/arlas-map/assets/i18n/template.json --key-as-default-value --replace --format json", + "i18n:init": "npm run i18n:init-map && npm run i18n:init-components", + "i18n:extract-components": "ngx-translate-extract --input ./projects/arlas-components/src/lib --output ./projects/arlas-components/assets/i18n/{en,fr,es}.json --format json", + "i18n:extract-map": "ngx-translate-extract --input ./projects/arlas-map/src/lib --output ./projects/arlas-map/assets/i18n/{en,fr,es}.json --format json", + "i18n:extract": "npm run i18n:extract-map && i18n:extract-components", "postinstall": "patch-package", "license-check": "license-check-and-add check -f license-check-and-add.json" }, @@ -58,9 +77,9 @@ "jsts": "2.1.0", "jszip": "^3.2.1", "mapbox-gl": "^1.6.1", + "maplibre-gl": "^4.7.1", "moment": "^2.29.4", "ng-lazyload-image": "^9.1.3", - "ngeohash": "^0.6.0", "ngx-loading-reloaded": "^18.0.0", "numeral": "^2.0.6", "pmtiles": "^2.11.0", diff --git a/projects/arlas-components/assets/i18n/en.json b/projects/arlas-components/assets/i18n/en.json index 7653c513..634a5bf4 100644 --- a/projects/arlas-components/assets/i18n/en.json +++ b/projects/arlas-components/assets/i18n/en.json @@ -1,36 +1,5 @@ { - "BBox generator": "Generate a bbox", - "First corner": "First corner", - "Latitude": "Latitude", - "Longitude": "Longitude", - "Second corner": "Second corner", - "Close": "Close", - "Generate AOI": "Generate the bbox", "Remove this selection": "Remove this selection", - "Import file": "Import file", - "Paste your WKT": "Paste your WKT", - "Zoom to result": "Zoom to result", - "Max:": "Max:", - "Cancel": "Cancel", - "Import": "Import", - "Collection:": "Collection: {{collection}}", - "Download the layer's data": "Download the layer's data", - "CSV": "CSV", - "GeoJson": "GeoJson", - "Fill:": "Fill: ", - "Stroke:": "Stroke: ", - "Width:": "Width: ", - "Radius:": "Radius: ", - "Geo-queries": "Geo-queries", - "of_collection": "of the {{collection}} collection", - "Apply geo-queries": "Apply", - "Set geo-queries": "Set", - "Lat:": "Lat:", - "Lng:": "Lng:", - "Enter coordinates and centre the map": "Enter coordinates and centre the map", - "Move to": "Centre", - "Manage layers": "Manage map layers", - "show_layers": "Show/hide these layers", "include": "include", "exclude": "exclude", "METRIC_COLUMN_TITLE": "{{metric}} {{field}}", @@ -50,40 +19,6 @@ "Unable to preview this style for this layer": "Unable to preview this style for this layer", "Preview": "Preview", "View": "View", - "You must enter a coordinate": "Enter a coordinate", - "Both corners have the same latitudes, modify one of them.": "Both corners have the same latitudes, modify one of them.", - "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")", - "Enter coordinates in decimal or sexagesimal degrees": "Enter coordinates in decimal or sexagesimal degrees.", - "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Decimal: 1.1 or Sexagesimal: 1°6'3\" coordinate", - "shp": "Shape", - "kml": "KML / KMZ", - "wkt": "WKT", - "geojson": "GeoJson", - "Geometry is not valid due to self-intersection": "Geometry is not valid due to self-intersection", - "Problem parsing input file": "Problem parsing input file", - "File is too large": "File is too large", - "Geometry is not valid": "Geometry is not valid", - "Too many vertices in a polygon": "Too many vertices in a polygon", - "Too many features": "Too many features", - "Timeout": "Timeout", - "Only `kml` or `zip` file is allowed": "Only `kml` or `zip` file is allowed", - "Only `json` or `geojson` file is allowed": "Only `json` or `geojson` file is allowed", - "File is empty": "File is empty", - "Only `zip` file is allowed": "Only `zip` file is allowed", - "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` OR a `*.json`", - "No polygon to display in this file": "No polygon to display in this file", - "other_color": "Other", - "Draw a bbox or a polygon that": "Draw a bbox or a polygon that", - "1.1 or 1°6'3\"": "1.1 or 1°6'3\"", - "Start draging to draw a bbox.": "Start draging to draw a bbox.", - "Draw at least 2 points.": "Draw at least 2 points.", - "Toggle Pitch": "Toggle pitch", - "Invalid geometry": "Invalid geometry", - "Ok": "Ok", - "Zoom in": "Zoom in", - "Zoom out": "Zoom out", - "Reset bearing to north": "Reset bearing to north", - "Double click to finish drawing": "Double click to finish drawing", "Show details": "Show details", "View in full screen": "View in full screen", "Show image": "Show image", @@ -100,41 +35,16 @@ "Fit the thumbnail's width to the tile": "Fit the thumbnail's width to the tile", "Fit the thumbnail's height to the tile": "Fit the thumbnail's height to the tile", "Geo-sort": "Geo-sort", - "avg": "Average", - "sum": "Sum", - "min": "Minimum", - "max": "Maximum", - "cardinality": "Cardinality", - "count": "Count", - "legend without metric": "{{field}} ({{normalized}})", - "legend": "{{metric}} of {{field}} ({{normalized}})", - "legend without normalized": "{{metric}} of {{field}}", - "legend without field": "{{metric}} ({{normalized}})", - "normalized by key": "normalized by {{normalizedKey}}", - "normalized": "normalized", "Column": "Column", "Direction": "Direction", "ASC_short": "↑", "DESC_short": "↓", - "Geo-queries & basemaps": "Geo-queries & basemaps", - "operation": "operation", - "a_operation": "operation", - "b_geometryPath": "geometry", - "Basemaps": "Basemaps", - "Choose one of the following basemaps": "Choose one of the following basemaps", - "click for descending sort": "click for descending sort", - "click for ascending sort": "click for ascending sort", - "Check in between": "Check in between", - "Check all visible items": "Check all visible items", "Show": "Show", "Download": "Download", - "Cloud": "Cloud", - "country": "country", "METRIC_COLUMN_avg": "average", "METRIC_COLUMN_sum": "total", "METRIC_COLUMN_min": "minimal", "METRIC_COLUMN_max": "maximal", "METRIC_COLUMN_cardinality": "cardinality of", - "None": "None", - "Heatmap-density": "Density" + "None": "None" } \ No newline at end of file diff --git a/projects/arlas-components/assets/i18n/es.json b/projects/arlas-components/assets/i18n/es.json index 0196519a..fe1765ff 100644 --- a/projects/arlas-components/assets/i18n/es.json +++ b/projects/arlas-components/assets/i18n/es.json @@ -1,36 +1,5 @@ { - "BBox generator": "Generar un cuadro delimitador", - "First corner": "Primera esquina", - "Latitude": "Latitud", - "Longitude": "Longitud", - "Second corner": "Segunda esquina", - "Close": "Cerrar", - "Generate AOI": "Generar el cuadro delimitador", "Remove this selection": "Eliminar esta selección", - "Import file": "Importar un archivo", - "Paste your WKT": "Pegar aquí su WKT", - "Zoom to result": "Zoom a la geometría", - "Max:": "Max:", - "Cancel": "Cerrar", - "Import": "Importar", - "Collection:": "Colección: {{collection}}", - "Download the layer's data": "Descargar los datos de la capa", - "CSV": "CSV", - "GeoJson": "GeoJson", - "Fill:": "Relleno: ", - "Stroke:": "Trazo: ", - "Width:": "Anchura: ", - "Radius:": "Radio: ", - "Geo-queries": "Peticiones geográficas", - "of_collection": "de la colección {{collection}}", - "Apply geo-queries": "Ejecutar", - "Set geo-queries": "Ok", - "Lat:": "Lat:", - "Lng:": "Lng:", - "Enter coordinates and centre the map": "Introduzca las coordenadas y centre el mapa.", - "Move to": "Mover a", - "Manage layers": "Gestionar las capas", - "show_layers": "Mostrar/ocultar estas capas", "include": "incluir", "exclude": "excluir", "METRIC_COLUMN_TITLE": "{{field}} {{metric}}", @@ -50,40 +19,6 @@ "Unable to preview this style for this layer": "No se puede previsualizar este estilo para esta capa.", "Preview": "Previsualizar", "View": "Ver", - "You must enter a coordinate": "Introduzca una coordenada", - "Both corners have the same latitudes, modify one of them.": "Las dos esquinas tienen la misma latitud, así que cambia una de ellas.", - "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Introduzca una coordenada en decimal (1,1) o sexagesimal (1° 6' 3\").", - "Enter coordinates in decimal or sexagesimal degrees": "Introduzca las coordenadas en grados decimales o sexagesimales.", - "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Coordenada en decimal: 1,1 o sexagesimal: 1°6'3\".", - "shp": "Shape", - "kml": "KML / KMZ", - "wkt": "WKT", - "geojson": "GeoJson", - "Geometry is not valid due to self-intersection": "La geometría no es válida porque se cruza a sí misma", - "Problem parsing input file": "Error al analizar el archivo de entrada", - "File is too large": "El archivo es demasiado grande.", - "Geometry is not valid": "La geometría no es válida", - "Too many vertices in a polygon": "Un polígono contiene demasiados vértices.", - "Too many features": "El archivo contiene demasiados elementos.", - "Timeout": "Tiempo de espera superado", - "Only `kml` or `zip` file is allowed": "Sólo se admiten archivos `kml` o `zip`", - "Only `json` or `geojson` file is allowed": "Sólo se admiten archivos `json` o `geojson`", - "File is empty": "El archivo está vacío", - "Only `zip` file is allowed": "Sólo se aceptan archivos `zip`", - "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "El archivo zip debe contener al menos un archivo `*.shp`, `*.shx` y `*.dbf` O un archivo `*.json`.", - "No polygon to display in this file": "No hay polígonos para mostrar", - "other_color": "Otro", - "Draw a bbox or a polygon that": "Dibuje un cuadro delimitador o polígono que", - "1.1 or 1°6'3\"": "1.1 o 1°6'3\"", - "Start draging to draw a bbox.": "Empezar a arrastrar para dibujar un cuadro delimitador.", - "Draw at least 2 points.": "Empatar al menos a 2 puntos", - "Toggle Pitch": "Activar/Quitar inclinación del mapa", - "Invalid geometry": "Geometría inválida", - "Ok": "Ok", - "Zoom in": "Acercarse", - "Zoom out": "Alejarse", - "Reset bearing to north": "Restablecer el rumbo al norte", - "Double click to finish drawing": "Haga doble clic para finalizar", "Show details": "Mostarar detalles", "View in full screen": "Ver en pantalla completa", "Show image": "Mostrar la imagen", @@ -100,41 +35,16 @@ "Fit the thumbnail's width to the tile": "Ajusta la anchura de la miniatura al azulejo", "Fit the thumbnail's height to the tile": "Ajusta la altura de la miniatura al azulejo", "Geo-sort": "Geo-ordenación", - "avg": "Media", - "sum": "Suma", - "min": "Mínimo", - "max": "Máximo", - "cardinality": "Cardinalidad", - "count": "Recuento", - "legend without metric": "{{field}} ({{normalized}})", - "legend": "{{metric}} de los {{field}} ({{normalized}})", - "legend without normalized": "{{metric}} de los {{field}}", - "legend without field": "{{metric}} ({{normalized}})", - "normalized by key": "normalizado por {{normalizedKey}}", - "normalized": "normalizado", "Column": "Columna", "Direction": "Dirección", "ASC_short": "↑", "DESC_short": "↓", - "Geo-queries & basemaps": "Peticiones geográficas y mapas base", - "operation": "operación", - "a_operation": "operación", - "b_geometryPath": "geometría", - "Basemaps": "Mapas base", - "Choose one of the following basemaps": "Elegir un mapa base", - "click for descending sort": "Haga clic para ordenar en orden descendente", - "click for ascending sort": "Haga clic para ordenar en orden ascendente", - "Check in between": "Seleccionar entre las dos casillas marcadas", - "Check all visible items": "Seleccionar todos los elementos visibles", "Show": "Mostrar", "Download": "Descargar", - "Cloud": "Nube", - "country": "Pais", "METRIC_COLUMN_avg": "medio(a)", "METRIC_COLUMN_sum": "total", "METRIC_COLUMN_min": "mínimo(a)", "METRIC_COLUMN_max": "máxim(a)", "METRIC_COLUMN_cardinality": "cardinalidad", - "None": "Ninguna", - "Heatmap-density": "Densidad" + "None": "Ninguna" } \ No newline at end of file diff --git a/projects/arlas-components/assets/i18n/fr.json b/projects/arlas-components/assets/i18n/fr.json index 60763b25..f971756c 100644 --- a/projects/arlas-components/assets/i18n/fr.json +++ b/projects/arlas-components/assets/i18n/fr.json @@ -1,36 +1,5 @@ { - "BBox generator": "Générer une bbox", - "First corner": "Premier coin", - "Latitude": "Latitude", - "Longitude": "Longitude", - "Second corner": "Deuxième coin", - "Close": "Fermer", - "Generate AOI": "Générer la bbox", "Remove this selection": "Supprimer cette sélection", - "Import file": "Importer un fichier", - "Paste your WKT": "Coller ici votre WKT", - "Zoom to result": "Zoomer sur le résultat", - "Max:": "Max :", - "Cancel": "Fermer", - "Import": "Importer", - "Collection:": "Collection: {{collection}}", - "Download the layer's data": "Télécharger les données de la couche", - "CSV": "CSV", - "GeoJson": "GeoJson", - "Fill:": "Remplissage : ", - "Stroke:": "Trait : ", - "Width:": "Epaisseur : ", - "Radius:": "Rayon : ", - "Geo-queries": "Requêtes géographiques", - "of_collection": "de la collection {{collection}}", - "Apply geo-queries": "Appliquer", - "Set geo-queries": "Ok", - "Lat:": "Lat :", - "Lng:": "Lng :", - "Enter coordinates and centre the map": "Saisir des coordonnées et centrer la carte", - "Move to": "Centrer", - "Manage layers": "Gérer les couches cartographiques", - "show_layers": "Afficher/masquer ces couches", "include": "inclure", "exclude": "exclure", "METRIC_COLUMN_TITLE": "{{field}} {{metric}}", @@ -50,40 +19,6 @@ "Unable to preview this style for this layer": "Impossible de prévisualiser ce style pour cette couche.", "Preview": "Prévisualiser", "View": "Visualiser", - "You must enter a coordinate": "Saisir une coordonnée", - "Both corners have the same latitudes, modify one of them.": "Les deux coins ont la même latitude, modifiez l'une d'entre elles.", - "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Saisir une coordonnée en décimal (1.1) ou en sexagésimal (1° 6' 3\")", - "Enter coordinates in decimal or sexagesimal degrees": "Saisir les coordonnées en degrés décimaux ou sexagésimaux.", - "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Coordonnée en décimal: 1.1 ou en sexagésimal: 1°6'3\"", - "shp": "Shape", - "kml": "KML / KMZ", - "wkt": "WKT", - "geojson": "GeoJson", - "Geometry is not valid due to self-intersection": "La géométrie n'est pas valide à cause d'une auto-intersection", - "Problem parsing input file": "Erreur dans le parcours du fichier d'entrée", - "File is too large": "Le fichier est trop volumineux", - "Geometry is not valid": "La géométrie n'est pas valide", - "Too many vertices in a polygon": "Un polygone contient trop de sommets", - "Too many features": "Le fichier contient trop d'éléments", - "Timeout": "Temps d'attente dépassé", - "Only `kml` or `zip` file is allowed": "Seulement les fichiers `kml` ou `zip` sont autorisés.", - "Only `json` or `geojson` file is allowed": "Seulement les fichiers `json` ou `geojson` sont autorisés.", - "File is empty": "Le fichier est vide.", - "Only `zip` file is allowed": "Seulement les fichiers `zip` sont acceptés", - "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "Le fichier zip doit contenir au minimum un fichier `*.shp`, `*.shx` et `*.dbf` OU un fichier `*.json`", - "No polygon to display in this file": "Aucun polygone à afficher", - "other_color": "Autre", - "Draw a bbox or a polygon that": "Dessiner une bbox ou un polygone qui", - "1.1 or 1°6'3\"": "1.1 ou 1°6'3\"", - "Start draging to draw a bbox.": "Commencez à tirer pour dessiner une bbox.", - "Draw at least 2 points.": "Dessinez au moins 2 points.", - "Toggle Pitch": "Activer/Enlever l'inclinaison", - "Invalid geometry": "Géométrie invalide", - "Ok": "Ok", - "Zoom in": "Zoomer", - "Zoom out": "Dézoomer", - "Reset bearing to north": "Réinitialiser l'orientation vers le nord", - "Double click to finish drawing": "Double-cliquez pour finir le dessin", "Show details": "Afficher le détail", "View in full screen": "Voir en plein écran", "Show image": "Afficher l'image", @@ -100,41 +35,16 @@ "Fit the thumbnail's width to the tile": "Ajuster la largeur de la vignette à la tuile", "Fit the thumbnail's height to the tile": "Ajuster la hauteur de la vignette à la tuile", "Geo-sort": "Geo-tri", - "avg": "Moyenne", - "sum": "Somme", - "min": "Minimum", - "max": "Maximum", - "cardinality": "Cardinalité", - "count": "Compte", - "legend without metric": "{{field}} ({{normalized}})", - "legend": "{{metric}} des {{field}} ({{normalized}})", - "legend without normalized": "{{metric}} des {{field}}", - "legend without field": "{{metric}} ({{normalized}})", - "normalized by key": "normalisé par {{normalizedKey}}", - "normalized": "normalisé", "Column": "Colonne", "Direction": "Sens", "ASC_short": "↑", "DESC_short": "↓", - "Geo-queries & basemaps": "Requêtes géographiques et fonds de carte", - "operation": "opération", - "a_operation": "opération", - "b_geometryPath": "géométrie", - "Basemaps": "Fonds de carte", - "Choose one of the following basemaps": "Choisir un fond de carte", - "click for descending sort": "Cliquer pour tri décroissant", - "click for ascending sort": "Cliquer pour tri croissant", - "Check in between": "Cocher l'intervalle", - "Check all visible items": "Cocher tous les éléments visibles", "Show": "Afficher", "Download": "Télécharger", - "Cloud": "Nuage", - "country": "Pays", "METRIC_COLUMN_avg": "moyen(ne)", "METRIC_COLUMN_sum": "total(e)", "METRIC_COLUMN_min": "minimal(e)", "METRIC_COLUMN_max": "maximal(e)", "METRIC_COLUMN_cardinality": "cardinalité", - "None": "Aucune", - "Heatmap-density": "Densité" + "None": "Aucune" } \ No newline at end of file diff --git a/projects/arlas-components/assets/i18n/template.json b/projects/arlas-components/assets/i18n/template.json index d4cc1074..f8328576 100644 --- a/projects/arlas-components/assets/i18n/template.json +++ b/projects/arlas-components/assets/i18n/template.json @@ -1,46 +1,4 @@ { - "BBox generator": "BBox generator", - "First corner": "First corner", - "Latitude": "Latitude", - "Longitude": "Longitude", - "Second corner": "Second corner", - "Close": "Close", - "Generate AOI": "Generate AOI", - "Remove this selection": "Remove this selection", - "Import file": "Import file", - "Paste your WKT": "Paste your WKT", - "Zoom to result": "Zoom to result", - "Max:": "Max:", - "Cancel": "Cancel", - "Import": "Import", - "Collection:": "Collection:", - "Download the layer's data": "Download the layer's data", - "CSV": "CSV", - "GeoJson": "GeoJson", - "Fill:": "Fill:", - "Stroke:": "Stroke:", - "Width:": "Width:", - "Radius:": "Radius:", - "Geo-queries": "Geo-queries", - "of_collection": "of_collection", - "Apply geo-queries": "Apply geo-queries", - "Set geo-queries": "Set geo-queries", - "Lat:": "Lat:", - "Lng:": "Lng:", - "Enter coordinates and centre the map": "Enter coordinates and centre the map", - "Move to": "Move to", - "Manage layers": "Manage layers", - "show_layers": "show_layers", - "include": "include", - "exclude": "exclude", - "METRIC_COLUMN_TITLE": "METRIC_COLUMN_TITLE", - "COUNT_COLUMN_TITLE": "COUNT_COLUMN_TITLE", - "Previous image": "Previous image", - "Next image": "Next image", - "Attachments": "Attachments", - "ASC": "ASC", - "DESC": "DESC", - "Sort on": "Sort on", "Layers and style": "Layers and style", "Informations": "Informations", "Choose layer": "Choose layer", @@ -50,56 +8,19 @@ "Unable to preview this style for this layer": "Unable to preview this style for this layer", "Preview": "Preview", "View": "View", - "You must enter a coordinate": "You must enter a coordinate", - "Both corners have the same latitudes, modify one of them.": "Both corners have the same latitudes, modify one of them.", - "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")", - "Enter coordinates in decimal or sexagesimal degrees": "Enter coordinates in decimal or sexagesimal degrees", - "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate", - "shp": "shp", - "kml": "kml", - "wkt": "wkt", - "geojson": "geojson", - "Geometry is not valid due to self-intersection": "Geometry is not valid due to self-intersection", - "Problem parsing input file": "Problem parsing input file", - "File is too large": "File is too large", - "Geometry is not valid": "Geometry is not valid", - "Too many vertices in a polygon": "Too many vertices in a polygon", - "Too many features": "Too many features", - "Timeout": "Timeout", - "Only `kml` or `zip` file is allowed": "Only `kml` or `zip` file is allowed", - "Only `json` or `geojson` file is allowed": "Only `json` or `geojson` file is allowed", - "File is empty": "File is empty", - "Only `zip` file is allowed": "Only `zip` file is allowed", - "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`", - "No polygon to display in this file": "No polygon to display in this file", - "other_color": "other_color", - "Draw a bbox or a polygon that": "Draw a bbox or a polygon that", - "1.1 or 1°6'3\"": "1.1 or 1°6'3\"", - "Start draging to draw a bbox.": "Start draging to draw a bbox.", - "Draw at least 2 points.": "Draw at least 2 points.", - "Toggle Pitch": "Toggle Pitch", - "Invalid geometry": "Invalid geometry", - "Ok": "Ok", - "Zoom in": "Zoom in", - "Zoom out": "Zoom out", - "Reset bearing to north": "Reset bearing to north", - "Double click to finish drawing": "Double click to finish drawing", - "Show details": "Show details", - "View in full screen": "View in full screen", - "Show image": "Show image", - "Close details": "Close details", - "Link": "Link", - "Click to show details": "Click to show details", - "Hide details": "Hide details", - "Filter on": "Filter on", - "Global actions": "Global actions", - "Geo sort action": "Geo sort action", - "Grid mode": "Grid mode", - "List mode": "List mode", - "Fit the whole thumbnail to the tile": "Fit the whole thumbnail to the tile", - "Fit the thumbnail's width to the tile": "Fit the thumbnail's width to the tile", - "Fit the thumbnail's height to the tile": "Fit the thumbnail's height to the tile", - "Geo-sort": "Geo-sort", + "Sort on": "Sort on", + "Column": "Column", + "Direction": "Direction", + "ASC": "ASC", + "DESC": "DESC", + "Attachments": "Attachments", + "Previous image": "Previous image", + "Next image": "Next image", + "include": "include", + "exclude": "exclude", + "METRIC_COLUMN_TITLE": "METRIC_COLUMN_TITLE", + "COUNT_COLUMN_TITLE": "COUNT_COLUMN_TITLE", + "Remove this selection": "Remove this selection", "avg": "avg", "sum": "sum", "min": "min", @@ -111,5 +32,21 @@ "legend without normalized": "legend without normalized", "legend without field": "legend without field", "normalized by key": "normalized by key", - "normalized": "normalized" + "normalized": "normalized", + "Filter on": "Filter on", + "Global actions": "Global actions", + "Geo sort action": "Geo sort action", + "Grid mode": "Grid mode", + "List mode": "List mode", + "Fit the whole thumbnail to the tile": "Fit the whole thumbnail to the tile", + "Fit the thumbnail's width to the tile": "Fit the thumbnail's width to the tile", + "Fit the thumbnail's height to the tile": "Fit the thumbnail's height to the tile", + "Geo-sort": "Geo-sort", + "Hide details": "Hide details", + "Show details": "Show details", + "Click to show details": "Click to show details", + "Link": "Link", + "View in full screen": "View in full screen", + "Show image": "Show image", + "Close details": "Close details" } \ No newline at end of file diff --git a/projects/arlas-components/assets/styles.css b/projects/arlas-components/assets/styles.css index 3f089f59..76d86e5e 100644 --- a/projects/arlas-components/assets/styles.css +++ b/projects/arlas-components/assets/styles.css @@ -19,7 +19,6 @@ /* You can add global styles to this file, and also import other style files */ -@import '../node_modules/mapbox-gl/dist/mapbox-gl.css'; body { font-family: Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; diff --git a/projects/arlas-components/karma.conf.js b/projects/arlas-components/karma.conf.js deleted file mode 100644 index ec984aef..00000000 --- a/projects/arlas-components/karma.conf.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client: { - jasmine: { - // you can add configuration options for Jasmine here - // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html - // for example, you can disable the random execution with `random: false` - // or set a specific seed with `seed: 4321` - }, - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - jasmineHtmlReporter: { - suppressAll: true // removes the duplicated traces - }, - coverageReporter: { - dir: require('path').join(__dirname, '../../coverage/arlas-components'), - subdir: '.', - reporters: [ - { type: 'html' }, - { type: 'text-summary' } - ] - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['ChromeHeadless'], - singleRun: true, - restartOnFileChange: true - }); -}; diff --git a/projects/arlas-components/package.json b/projects/arlas-components/package.json index 3370b927..e9e87cd3 100644 --- a/projects/arlas-components/package.json +++ b/projects/arlas-components/package.json @@ -1,6 +1,6 @@ { "name": "arlas-web-components", - "version": "27.0.0-rc.2", + "version": "27.0.0-z-rc.0", "peerDependencies": { "@angular/animations": "^18.2.13", "@angular/cdk": "^18.2.14", @@ -22,39 +22,12 @@ "zone.js": "^0.14.0" }, "dependencies": { - "@tmcw/togeojson": "~5.5.0", - "@mapbox/mapbox-gl-draw": "^1.4.3", - "@mapbox/mapbox-gl-draw-static-mode": "^1.0.1", - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/circle": "^6.5.0", - "@turf/clean-coords": "^7.0.0", - "@turf/helpers": "^6.5.0", - "@turf/length": "^6.5.0", - "@turf/midpoint": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/transform-rotate": "^6.5.0", - "@turf/transform-translate": "^6.5.0", - "@types/mapbox-gl": "^1.6.3", - "arlas-d3": "12.0.0-beta.5", - "geojson-polygon-self-intersections": "1.2.1", - "geojson-validation": "0.2.1", + "arlas-d3": "12.0.0-rc.2", "iv-viewer": "^2.2.1", - "jsts": "2.1.0", - "jszip": "^3.2.1", - "mapbox-gl": "^1.6.1", "ng-lazyload-image": "^9.1.3", - "ngeohash": "^0.6.0", "ngx-loading-reloaded": "^18.0.0", "numeral": "^2.0.6", - "shpjs": "^4.0.4", - "turf-extent": "1.0.4", - "wellknown": "0.5.0", - "tslib": "^2.3.0", - "pmtiles": "^2.11.0" + "tslib": "^2.3.0" }, "exports": { "./assets/i18n/en.json": { diff --git a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.spec.ts b/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.spec.ts deleted file mode 100644 index 8a3b7905..00000000 --- a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MapglBasemapComponent } from './mapgl-basemap.component'; -import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { MapboxBasemapService } from '../mapgl/basemaps/basemap.service'; - -describe('MapglBasemapComponent', () => { - let component: MapglBasemapComponent; - let fixture: ComponentFixture; - const mockMapboxBasemapService = jasmine.createSpyObj('MapboxBasemapService', ['isOnline']); - mockMapboxBasemapService.isOnline.and.returnValue(false); - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [MapglBasemapComponent], - imports: [], - providers: [ - HttpClient, - { - provide: MapboxBasemapService, - useValue: mockMapboxBasemapService - }, - provideHttpClient(withInterceptorsFromDi()) - ] -}) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(MapglBasemapComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.ts b/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.ts deleted file mode 100644 index b34a09a7..00000000 --- a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.ts +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; -import { Subject } from 'rxjs/internal/Subject'; -import mapboxgl, { AnyLayer } from 'mapbox-gl'; -import { MapSource } from '../mapgl/model/mapSource'; -import { MapglService } from '../../services/mapgl.service'; -import { MapboxBasemapService } from '../mapgl/basemaps/basemap.service'; -import { BasemapStyle } from '../mapgl/basemaps/basemap.config'; -import { ArlasBasemaps } from '../mapgl/basemaps/basemaps'; - -@Component({ - selector: 'arlas-mapgl-basemap', - templateUrl: './mapgl-basemap.component.html', - styleUrls: ['./mapgl-basemap.component.scss'] -}) -export class MapglBasemapComponent implements OnInit { - private LOCAL_STORAGE_BASEMAPS = 'arlas_last_base_map'; - - @Input() public map: mapboxgl.Map; - @Input() public mapSources: Array; - - @Output() public basemapChanged = new EventEmitter(); - @Output() public blur = new Subject(); - - public showList = false; - public basemaps: ArlasBasemaps; - - - public constructor(private mapglService: MapglService, private basemapService: MapboxBasemapService) { } - - public ngOnInit(): void { - this.initBasemaps(); - } - - private initBasemaps() { - this.basemaps = this.basemapService.basemaps; - if (!!this.basemaps) { - const styles = this.basemaps.styles(); - if (!!styles) { - this.showList = styles.length > 0; - styles.filter(bm => !bm.image).forEach(bm => { - if (bm.type !== 'protomap' && !!bm.url) { - const splitUrl = bm.url.split('/style.json?key='); - if (splitUrl.length === 2) { - bm.image = `${splitUrl[0]}/0/0/0.png?key=${splitUrl[1]}`; - } - } - }); - } - } - } - - /** Removes the old basemap and set the new one that is given as a parameter - * @param newBasemap: Basemap selected by the user - */ - public onChangeBasemap(newBasemap: BasemapStyle) { - const selectedBasemap = this.basemaps.getSelected(); - if (selectedBasemap.type === 'protomap') { - this.basemapService.removeProtomapBasemap(this.map); - } - this.setBaseMapStyle(newBasemap); - } - - public setBaseMapStyle(newBasemap: BasemapStyle) { - if (this.map) { - this.setStyle(this.basemaps.getSelected().styleFile as mapboxgl.Style, newBasemap); - } - } - - /** Set mapbox new style. - * !!NOTE: mapbox setStyle removes all added layers from the map; thus the following description : - * This method saves all the currently added layers to the map, applies the 'map.setStyle' and adds all the saved layers afterwards. - */ - public setStyle(s: mapboxgl.Style, newBasemap: BasemapStyle) { - const selectedBasemapLayersSet = new Set(); - const layers: Array = (this.map).getStyle().layers; - const sources = (this.map).getStyle().sources; - if (s.layers) { - s.layers.forEach(l => selectedBasemapLayersSet.add(l.id)); - } - const layersToSave = new Array(); - const sourcesToSave = new Array(); - layers.filter((l: mapboxgl.Layer) => !selectedBasemapLayersSet.has(l.id) && !!l.source).forEach(l => { - layersToSave.push(l); - if (sourcesToSave.filter(ms => ms.id === l.source.toString()).length === 0) { - sourcesToSave.push({ id: l.source.toString(), source: sources[l.source.toString()] }); - } - }); - const sourcesToSaveSet = new Set(); - sourcesToSave.forEach(mapSource => sourcesToSaveSet.add(mapSource.id)); - if (this.mapSources) { - this.mapSources.forEach(mapSource => { - if (!sourcesToSaveSet.has(mapSource.id)) { - sourcesToSave.push(mapSource); - } - }); - } - const initStyle = this.basemapService.getInitStyle(newBasemap); - this.map.setStyle(initStyle).once('styledata', () => { - setTimeout(() => { - /** the timeout fixes a mapboxgl bug related to layer placement*/ - this.mapglService.addSourcesToMap(sourcesToSave, this.map); - layersToSave.forEach(l => { - if (!this.map.getLayer(l.id)) { - this.map.addLayer(l as AnyLayer); - } - }); - localStorage.setItem(this.LOCAL_STORAGE_BASEMAPS, JSON.stringify(newBasemap)); - this.basemaps.setSelected(newBasemap); - if (newBasemap.type === 'protomap') { - this.basemapService.addProtomapBasemap(this.map); - this.basemapService.notifyProtomapAddition(); - } - this.basemapChanged.emit(); - }, 0); - }); - } -} diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.spec.ts b/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.spec.ts deleted file mode 100644 index 33c64ac4..00000000 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MapglLegendItemComponent } from './mapgl-legend-item.component'; - -describe('MapglLegendItemComponent', () => { - let component: MapglLegendItemComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ MapglLegendItemComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(MapglLegendItemComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.html b/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.html deleted file mode 100644 index 5cbebeda..00000000 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.html +++ /dev/null @@ -1,45 +0,0 @@ -
-
-
-
-
- -
-
- {{layer?.id | layerIdToName | translate}} -
-
-
-
- file_download - - - - -
-
- {{ detail ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} -
-
-
- -
- - - - - - - -
-
diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.spec.ts b/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.spec.ts deleted file mode 100644 index 37760f29..00000000 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { TranslateFakeLoader, TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { FormatLegendPipe } from '../../pipes/format-legend/format-legend.pipe'; -import { FormatNumberPipe } from '../../pipes/format-number/format-number.pipe'; -import { GetCollectionDisplayNamePipe } from '../../pipes/get-collection-display-name/get-collection-display-name.pipe'; -import { GetColorPipe } from '../../pipes/get-color/get-color.pipe'; -import { CollectionModule } from '../../services/collection.module'; -import { AwcCollectionService, BaseCollectionService, CollectionService } from '../../services/collection.service'; -import { ColorGeneratorModule } from '../../services/color.generator.module'; -import { ArlasColorService } from '../../services/color.generator.service'; -import { AwcColorGeneratorLoader, ColorGeneratorLoader } from '../componentsUtils'; -import { MapglLayerIconModule } from '../mapgl-layer-icon/mapgl-layer-icon.module'; -import { LayerIdToName } from './layer-name.pipe'; -import { MapglLegendComponent } from './mapgl-legend.component'; - -describe('MapglLegendComponent', () => { - let component: MapglLegendComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ - MapglLegendComponent, - FormatNumberPipe, - LayerIdToName, - FormatLegendPipe, - GetColorPipe, - GetCollectionDisplayNamePipe - ], - imports: [ - MatButtonModule, - MatIconModule, - MatMenuModule, - MatTooltipModule, - MapglLayerIconModule, - TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: TranslateFakeLoader } }), - ColorGeneratorModule.forRoot({ - loader: { - provide: ColorGeneratorLoader, - useClass: AwcColorGeneratorLoader - } - }), - CollectionModule.forRoot({ - loader: { - provide: BaseCollectionService, - useClass: AwcCollectionService - } - }) - - ], - providers: [ - ArlasColorService, - CollectionService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(MapglLegendComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.ts b/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.ts deleted file mode 100644 index aa6cd164..00000000 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.ts +++ /dev/null @@ -1,625 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { AfterViewInit, Component, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { HistogramData } from 'arlas-d3/histograms/utils/HistogramUtils'; -import { scaleLinear, ScaleLinear } from 'd3-scale'; -import { select } from 'd3-selection'; -import { area, curveLinear, line } from 'd3-shape'; -import * as mapboxgl from 'mapbox-gl'; -import { Subject, takeUntil } from 'rxjs'; -import * as tinycolor from 'tinycolor2'; -import { ArlasColorService } from '../../services/color.generator.service'; -import { Legend, LegendData, PROPERTY_SELECTOR_SOURCE } from '../mapgl/mapgl.component.util'; -import { ARLAS_ID, FILLSTROKE_LAYER_PREFIX, HOVER_LAYER_PREFIX, SELECT_LAYER_PREFIX } from '../mapgl/model/mapLayers'; -import { MapglLegendItemComponent } from './mapgl-legend-item/mapgl-legend-item.component'; -import { marker } from '@colsen1991/ngx-translate-extract-marker'; - -export const GET = 'get'; -export const MATCH = 'match'; -export const INTERPOLATE = 'interpolate'; -export const OTHER = marker('other_color'); - -export const IN = 'in'; -export const NOT_IN = '!'; - -export const HEATMAP_DENSITY = 'Heatmap-density'; - -@Component({ - selector: 'arlas-mapgl-legend', - templateUrl: './mapgl-legend.component.html', - styleUrls: ['./mapgl-legend.component.scss'] -}) -export class MapglLegendComponent implements OnInit, AfterViewInit, OnChanges { - /** - * @Input : Angular - * @description Layer object - */ - @Input() public layer: mapboxgl.Layer; - /** - * @Input : Angular - * @description Collection of the layer - */ - @Input() public collection: string; - /** - * @Input : Angular - * @description Current zoom level of the map - */ - @Input() public zoom: number; - /** - * @Input : Angular - * @description Whether the layer is enabled or disabled. - */ - @Input() public enabled: boolean; - /** - * @Input : Angular - * @description Subject of [collection, [field, legendData]] map. The map subscribes to it to keep - * the legend updated with the data displayed on the map. - */ - @Input() public legendUpdater: Subject>> = new Subject(); - /** - * @Input : Angular - * @description Subject of [field, boolean] map. The map subscribes to it to keep - * the legend updated with the visibility of the layer. - */ - @Input() public visibilityUpdater: Subject> = new Subject(); - - /** - * @Output : Angular - * @description Notifies the parent component that this layer is visible or not - */ - @Output() public visibilityStatus: Subject = new Subject(); - - /** - * @Output : Angular - * @description Notifies the parent component that the user wants to download the layer - */ - @Output() public downloadSourceEmitter: Subject<{ layer: mapboxgl.Layer; downloadType: string; }> = new Subject(); - - @ViewChild('width_legend', { static: false }) public lineWidthLegend: MapglLegendItemComponent; - @ViewChild('radius_legend', { static: false }) public circleRadiusLegend: MapglLegendItemComponent; - - public colorLegend: Legend = {}; - public lineDasharray: Array; - public strokeColorLegend: Legend = {}; - public widthLegend: Legend = {}; - public radiusLegend: Legend = {}; - public detail = false; - public visibleMode = false; - public PROPERTY_SELECTOR_SOURCE = PROPERTY_SELECTOR_SOURCE; - - private legendData: Map = new Map(); - private MAX_LINE_WIDTH = 10; - private MAX_CIRLE_RADIUS = 7; - private LEGEND_WIDTH = 210; - public colorPalette = ''; - public strokeColorPalette = ''; - - private _onDestroy$ = new Subject(); - - public constructor( - public translate: TranslateService, - public colorService: ArlasColorService) { } - - public ngOnInit() { - this.legendUpdater - .pipe(takeUntil(this._onDestroy$)) - .subscribe(legendDataPerCollection => { - this.legendData = legendDataPerCollection.get(this.collection); - if (!!this.layer) { - this.drawLegends(this.visibleMode); - } - }); - this.visibilityUpdater - .pipe(takeUntil(this._onDestroy$)) - .subscribe(visibilityUpdater => { - /** check legend visibility according to Data source status (mapcontirbutor) */ - if (!!this.layer) { - /** if the visibility updater contains the layer we pick the visibility status otherwise we keep it unchaged */ - this.visibleMode = visibilityUpdater.get(this.layer.id) !== undefined ? visibilityUpdater.get(this.layer.id) : this.visibleMode; - } else { - this.visibleMode = false; - } - /** check legend visibility according to VisibilityRules */ - if (this.visibleMode && this.layer && !!this.layer.minzoom && !!this.layer.maxzoom) { - this.visibleMode = (this.zoom <= this.layer.maxzoom && this.zoom >= this.layer.minzoom); - } - /** check legend visibility according to legend enabled or not */ - if (!this.enabled) { - this.visibleMode = false; - } - if (!this.visibleMode) { - this.detail = this.visibleMode; - } - /** check legend visibility for external layers that are not set by config nor map contributors */ - if (this.layer && !this.layer.id.startsWith(ARLAS_ID) && - !this.layer.id.startsWith(FILLSTROKE_LAYER_PREFIX) && !this.layer.id.startsWith(HOVER_LAYER_PREFIX) - && !this.layer.id.startsWith(SELECT_LAYER_PREFIX)) { - this.visibleMode = this.enabled; - if (!!this.layer.metadata && this.layer.metadata.showLegend === false) { - this.visibleMode = false; - } - } - if (!!this.layer) { - this.drawLegends(this.visibleMode); - } - this.visibilityStatus.next(this.visibleMode); - }); - } - - public ngAfterViewInit() { - if (!!this.layer) { - this.drawLegends(this.visibleMode); - } - } - - public ngOnChanges(changes: SimpleChanges) { - if (changes['layer'] !== undefined) { - if (!!this.layer) { - this.drawLegends(this.visibleMode); - } - } - } - - public ngOnDestroy() { - this._onDestroy$.next(true); - this._onDestroy$.complete(); - } - - public downloadLayerSource(layer: mapboxgl.Layer, downloadType: string): void { - const download = { - layer, - downloadType - }; - this.downloadSourceEmitter.next(download); - } - - public showDetail(event: Event) { - this.detail = !this.detail; - event.stopPropagation(); - } - - /** Parses the `paint` attribute of a layer and draws the legend elements such as - * - color palette - * - line width evolution - * - circle radius evolution - */ - private drawLegends(visibileMode: boolean): void { - const type = this.layer.type; - const paint = this.layer.paint; - const metadata = this.layer.metadata; - switch (type) { - case 'circle': { - const p: mapboxgl.CirclePaint = (paint as mapboxgl.CirclePaint); - const colors = MapglLegendComponent.buildColorLegend(p['circle-color'], visibileMode, this.legendData, this.layer.filter, this.translate); - const strokeColors = MapglLegendComponent.buildColorLegend(p['circle-stroke-color'], visibileMode, this.legendData, - this.layer.filter, this.translate); - this.buildCircleRadiusLegend(p['circle-radius']); - this.colorLegend = colors[0]; - this.strokeColorLegend = strokeColors[0]; - this.colorPalette = colors[1]; - this.strokeColorPalette = strokeColors[1]; - break; - } - case 'line': { - const p: mapboxgl.LinePaint = (paint as mapboxgl.LinePaint); - const colors = MapglLegendComponent.buildColorLegend(p['line-color'], visibileMode, this.legendData, this.layer.filter, this.translate); - this.buildWidthLegend(p['line-width']); - this.lineDasharray = p['line-dasharray']; - this.colorLegend = colors[0]; - this.colorPalette = colors[1]; - break; - } - case 'fill': { - const p: mapboxgl.FillPaint = (paint as mapboxgl.FillPaint); - const colors = MapglLegendComponent.buildColorLegend(p['fill-color'], visibileMode, this.legendData, this.layer.filter, this.translate); - this.colorLegend = colors[0]; - this.colorPalette = colors[1]; - if (!!metadata && !!metadata.stroke) { - const strokeColors = MapglLegendComponent.buildColorLegend(metadata.stroke.color, visibileMode, this.legendData, - this.layer.filter, this.translate); - this.strokeColorLegend = strokeColors[0]; - this.strokeColorPalette = strokeColors[1]; - } - break; - } - case 'heatmap': { - const p: mapboxgl.HeatmapPaint = (paint as mapboxgl.HeatmapPaint); - const colors = MapglLegendComponent.buildColorLegend( - p['heatmap-color'], visibileMode, this.legendData, this.layer.filter, this.translate - ); - this.buildCircleRadiusLegend(p['heatmap-radius']); - this.colorLegend = colors[0]; - this.colorPalette = colors[1]; - if (this.layer.source.toString().startsWith('feature-metric')) { - this.colorLegend.visible = false; - } - break; - } - case 'symbol': { - const p: mapboxgl.SymbolPaint = (paint as mapboxgl.SymbolPaint); - const colors = MapglLegendComponent.buildColorLegend(p['text-color'], visibileMode, this.legendData, this.layer.filter, this.translate); - this.colorLegend = colors[0]; - this.colorPalette = colors[1]; - const l: mapboxgl.SymbolLayout = (paint as mapboxgl.SymbolLayout); - this.buildWidthLegend(l['text-size']); - break; - } - } - if (!this.colorLegend.fixValue) { - this.colorLegend.fixValue = visibileMode ? '#444' : '#d3d3d3'; - } - const layer = Object.assign({}, this.layer); - this.layer = null; - this.layer = Object.assign({}, layer); - } - - public static filterLegend(colorLegendValues: Map, filter: any[], field: string) { - filter.forEach((f, idx) => { - if (idx !== 0 && idx !== filter.length - 1) { - switch (f[0]) { - case IN: { - if (f[1][1] === field) { - const valuesToKeep: Array = f[2][1]; - colorLegendValues.forEach((val, key) => { - if (!(valuesToKeep.includes(key))) { - colorLegendValues.delete(key); - } - }); - } - break; - } - case NOT_IN: { - if (f[1][0] === IN && f[1][1][1] === field) { - const valuesToExclude: Array = f[1][2][1]; - valuesToExclude.forEach(value => { - colorLegendValues.delete(value); - }); - } - break; - } - } - } - }); - } - - public static buildColorLegend(colorExpression: string | mapboxgl.StyleFunction | mapboxgl.Expression, visibleMode: boolean, - legendData: Map, filter?: any[], translate?: TranslateService): [Legend, string] { - const colorLegend: Legend = { visible: true }; - let colorPalette = ''; - if (typeof colorExpression === 'string') { - colorLegend.type = PROPERTY_SELECTOR_SOURCE.fix; - colorLegend.fixValue = colorExpression; - } else if (Array.isArray(colorExpression)) { - if (colorExpression.length === 2) { - /** color = ["get", "field"] ==> Generated or Provided */ - const field = colorExpression[1]; - colorLegend.title = field; - if (!Array.isArray(field)) { - if ((field as string).endsWith('_arlas__color')) { - colorLegend.type = PROPERTY_SELECTOR_SOURCE.generated; - } else { - colorLegend.type = PROPERTY_SELECTOR_SOURCE.provided; - } - colorLegend.manualValues = new Map(); - if (legendData && legendData.get(field)) { - const keysToColors = legendData.get(field).keysColorsMap; - const colorList = Array.from(keysToColors.keys()).map(k => [k, keysToColors.get(k)]).flat(); - for (let i = 0; i < colorList.length; i += 2) { - colorLegend.manualValues.set(translate ? translate.instant(colorList[i]) : colorList[i], colorList[i + 1]); - } - if (colorList.length === 0) { - colorLegend.manualValues.set('', '#eee'); - } - } else { - colorLegend.manualValues.set('', '#eee'); - } - - if (!!filter) { - MapglLegendComponent.filterLegend(colorLegend.manualValues, filter, - (field as string).endsWith('_arlas__color') ? (field as string).slice(0, -13) : field); - } - } - } else if (colorExpression.length >= 3) { - if (colorExpression[0] === MATCH) { - /** color = ["match", ["get", "field"], .... ]**/ - colorLegend.type = PROPERTY_SELECTOR_SOURCE.manual; - const colorsLength = colorExpression.length; - let hasDefaultColor = false; - if (colorsLength % 2 !== 0) { - hasDefaultColor = true; - } - const field = colorExpression[1].length === 2 ? colorExpression[1][1] : ''; - colorLegend.title = field; - colorLegend.manualValues = new Map(); - let keysToColors: Map; - if (legendData && legendData.get(field + '_color')) { - // If there is a legendData, use only the colors in the keysToColors - keysToColors = legendData.get(field + '_color').keysColorsMap; - } else { - // If no legendData for this field, use all the colors of colorExpression - keysToColors = new Map(); - for (let i = 2; i < colorExpression.length; i += 2) { - if (hasDefaultColor && i === colorsLength - 3) { - keysToColors.set(colorExpression[i] + '', colorExpression[i + 1]); - keysToColors.set(OTHER, colorExpression[i + 2]); - break; - } else { - keysToColors.set(colorExpression[i] + '', colorExpression[i + 1]); - } - } - } - for (let i = 2; i < colorExpression.length; i += 2) { - if (hasDefaultColor && i === colorsLength - 3) { - if (keysToColors.has(colorExpression[i] + '')) { - colorLegend.manualValues.set(translate ? translate.instant(colorExpression[i] + '') : colorExpression[i], - colorExpression[i + 1]); - } - colorLegend.manualValues.set(translate ? translate.instant(OTHER) : OTHER, colorExpression[i + 2]); - break; - } else { - if (keysToColors.has(colorExpression[i] + '')) { - colorLegend.manualValues.set(translate ? translate.instant(colorExpression[i] + '') : colorExpression[i], - colorExpression[i + 1]); - } - } - } - - if (!!filter) { - MapglLegendComponent.filterLegend(colorLegend.manualValues, filter, field); - } - } else if (colorExpression[0] === INTERPOLATE) { - colorLegend.type = PROPERTY_SELECTOR_SOURCE.interpolated; - /** color = ["interplate", ['linear'], ["get", "field"], 0, 1... ]**/ - // todo throw exception if interpolation is not linear - const field = colorExpression[2].length === 2 ? colorExpression[2][1] : HEATMAP_DENSITY; - colorLegend.title = field; - colorLegend.interpolatedValues = []; - const palette = []; - const colors = colorExpression.slice(3); - colors.forEach((c, i) => { - if (i % 2 === 0) { - palette.push({ - proportion: c, - value: colors[i + 1] - }); - } - }); - const minimum = palette[0].proportion; - const maximum = palette.slice(-1)[0].proportion; - palette.forEach(c => colorLegend.interpolatedValues.push(c.value)); - const colorValues = colorExpression.filter((c, i) => i > 2 && i % 2 !== 0); - if (legendData && legendData.get(field) && field !== 'count') { - colorLegend.minValue = legendData.get(field).minValue; - colorLegend.maxValue = legendData.get(field).maxValue; - // For heatmaps, the count is used to fetch data, so we use it for the legend - } else if (field === HEATMAP_DENSITY && legendData && legendData.get('count')) { - colorLegend.minValue = legendData.get('count').minValue; - colorLegend.maxValue = legendData.get('count').maxValue; - } else { - colorLegend.minValue = colorValues[0] + ''; - colorLegend.maxValue = colorValues[colorValues.length - 1] + ''; - } - if (!visibleMode) { - /** apply greyscale because the layer is not visible */ - colorLegend.interpolatedValues = colorLegend.interpolatedValues - .map((c) => tinycolor.default(c.toString()).greyscale().lighten(20).toHexString()); - palette.forEach(p => { - p.value = tinycolor.default(p.value.toString()).greyscale().lighten(20).toHexString(); - }); - } - colorPalette = palette.map(c => c.value + ' ' + (100 * (c.proportion - minimum) / (maximum - minimum)) + '%').join(','); - } - } - } - - colorLegend.visible = visibleMode; - return [colorLegend, colorPalette]; - } - - private buildWidthLegend(lineWidth: number | mapboxgl.StyleFunction | mapboxgl.Expression): void { - /** if the line width is fix then it is not added to the legend*/ - if (Array.isArray(lineWidth)) { - if (lineWidth.length >= 3) { - if (lineWidth[0] === INTERPOLATE) { - const field = lineWidth[2][1]; - this.widthLegend.title = field; - if (this.legendData && this.legendData.get(field)) { - this.widthLegend.minValue = this.legendData.get(field).minValue; - this.widthLegend.maxValue = this.legendData.get(field).maxValue; - } - this.widthLegend.type = PROPERTY_SELECTOR_SOURCE.interpolated; - const lineWidthEvolution: Array = new Array(); - lineWidth.filter((w, i) => i >= 3).forEach((w, i) => { - if (i % 2 === 0) { - lineWidthEvolution.push({ key: w, value: lineWidth[i + 1 + 3] }); - } - }); - const maxLineWidth = getMax(lineWidthEvolution); - if (maxLineWidth > this.MAX_LINE_WIDTH) { - lineWidthEvolution.map(lw => { - lw.value = lw.value * this.MAX_LINE_WIDTH / maxLineWidth; - return lw; - }); - } - if (!!this.lineWidthLegend.interpolatedElement) { - drawLineWidth(this.lineWidthLegend.interpolatedElement.nativeElement, lineWidthEvolution, this.colorLegend, - this.LEGEND_WIDTH, this.MAX_LINE_WIDTH); - } - } - } - } - } - - private buildCircleRadiusLegend(circleRadius: number | mapboxgl.StyleFunction | mapboxgl.Expression): void { - if (Array.isArray(circleRadius)) { - if (circleRadius.length >= 3) { - if (circleRadius[0] === INTERPOLATE) { - const field = circleRadius[2][1]; - const circleRadiusEvolution: Array = new Array(); - circleRadius.filter((w, i) => i >= 3).forEach((w, i) => { - if (i % 2 === 0) { - circleRadiusEvolution.push({ key: w, value: circleRadius[i + 1 + 3] }); - } - }); - this.radiusLegend.title = field; - if (this.legendData && this.legendData.get(field)) { - this.radiusLegend.minValue = this.legendData.get(field).minValue; - this.radiusLegend.maxValue = this.legendData.get(field).maxValue; - } else { - this.radiusLegend.minValue = circleRadiusEvolution[0].key + ''; - this.radiusLegend.maxValue = circleRadiusEvolution[circleRadiusEvolution.length - 1].key + ''; - } - this.radiusLegend.type = PROPERTY_SELECTOR_SOURCE.interpolated; - const maxCircleRadius = getMax(circleRadiusEvolution); - if (maxCircleRadius > this.MAX_CIRLE_RADIUS) { - circleRadiusEvolution.map(lw => { - lw.value = lw.value * this.MAX_CIRLE_RADIUS / maxCircleRadius; - return lw; - }); - } - if (!!this.circleRadiusLegend.interpolatedElement) { - drawCircleSupportLine(this.circleRadiusLegend.interpolatedElement.nativeElement, circleRadiusEvolution, this.colorLegend, - this.LEGEND_WIDTH, Math.min(this.MAX_CIRLE_RADIUS, maxCircleRadius) * 2); - } - } - } - } - } -} - -/** - * draws the line width legend - * @param svgNode SVG element on which we append the line using d3. - * @param lineWidths List of {key, linewidth} - * @param cLegend Color legend, to give the drawn legend lines the same color on the map - * @param legendWidth The width that the svg will take to draw the legend - * @param legendHeight The height that the svg will take to draw the legend - */ -export function drawLineWidth(svgNode: SVGElement, lineWidths: Array, - cLegend: Legend, legendWidth: number, legendHeight: number) { - const maxHeight = getMax(lineWidths); - const xDomain: any = (scaleLinear()).range([0, legendWidth]); - const xDomainExtent = [lineWidths[0].key, lineWidths[lineWidths.length - 1].key]; - xDomain.domain(xDomainExtent); - const yDomain: ScaleLinear = scaleLinear().range([maxHeight, 0]); - yDomain.domain([0, maxHeight]); - const svg = select(svgNode).attr('width', legendWidth).attr('height', legendHeight); - svg.selectAll('g').remove(); - const context = svg.append('g').attr('class', 'context'); - const ar = area() - .curve(curveLinear) - .x((d: any) => xDomain(d.key)) - .y0(maxHeight) - .y1((d: any) => yDomain(d.value)); - - const widthLineColor = getMiddleColor(cLegend); - context.append('path') - .datum(lineWidths) - .style('fill', widthLineColor) - .style('fill-opacity', 0.6) - .style('stroke', widthLineColor) - .style('stroke-opacity', 0.6) - .style('stroke-width', 0.5) - .attr('d', ar); -} - -export function getMiddleColor(colorLegend: Legend): string { - let color = ''; - if (colorLegend.type === PROPERTY_SELECTOR_SOURCE.fix) { - color = colorLegend.fixValue as string; - } else if (colorLegend.type === PROPERTY_SELECTOR_SOURCE.interpolated) { - const iv = colorLegend.interpolatedValues as Array; - if (iv.length === 1 || iv.length === 2) { - color = iv[0]; - } else if (iv.length >= 3) { - color = iv[Math.trunc(iv.length / 2)]; - } - } else if (colorLegend.type === PROPERTY_SELECTOR_SOURCE.manual || colorLegend.type === PROPERTY_SELECTOR_SOURCE.generated - || colorLegend.type === PROPERTY_SELECTOR_SOURCE.provided) { - const iv = colorLegend.manualValues as Map; - if (iv) { - if (iv.size === 1) { - color = iv.keys().next().value; - } else if (iv.size >= 2) { - color = Array.from(iv.values())[Math.trunc(Array.from(iv.keys()).length / 2)]; - } - } - } - return color; -} -/** - * draws the circle radius legend - * @param svgNode SVG element on which we append the circles using d3. - * @param circlesRadiuses List of {key, circleradius} - * @param cLegend Color legend, to give the drawn legend circles the same color on the map - * @param legendWidth The width that the svg will take to draw the legend - * @param legendHeight The height that the svg will take to draw the legend - */ -export function drawCircleSupportLine(svgNode: SVGElement, circlesRadiuses: Array, - cLegend: Legend, legendWidth: number, legendHeight: number) { - const circleDiameters = []; - circlesRadiuses.forEach(cr => circleDiameters.push({ key: cr.key, value: cr.value * 2 })); - const maxHeight = getMax(circleDiameters); - const firstRadius = circlesRadiuses[0].value; - const lastRadius = circlesRadiuses[circlesRadiuses.length - 1].value; - const xDomain: any = (scaleLinear()).range([0, legendWidth - firstRadius - lastRadius]); - const xDomainExtent = [circleDiameters[0].key, circleDiameters[circleDiameters.length - 1].key]; - xDomain.domain(xDomainExtent); - const yDomain: ScaleLinear = scaleLinear().range([maxHeight, 0]); - yDomain.domain([0, maxHeight]); - const svg = select(svgNode).attr('width', legendWidth).attr('height', legendHeight); - svg.selectAll('g').remove(); - const context = svg.append('g').attr('class', 'context'); - const l = line() - .x((d: any) => xDomain(d.key)) - .y((d: any) => yDomain(d.value)); - context.append('path') - .datum(circleDiameters) - .attr('fill', 'none') - .attr('stroke', '#eaeaea') - .attr('stroke-width', 0.8) - .attr('transform', 'translate(' + firstRadius + ', 0)') - .attr('d', l); - context.append('g').append('line') - .attr('x1', 0).attr('y1', maxHeight) - .attr('x2', legendWidth - firstRadius - lastRadius).attr('y2', maxHeight) - .attr('cx', 2).attr('cy', 2).attr('fill', 'none') - .attr('stroke', '#eaeaea') - .attr('stroke-width', 0.8) - .attr('transform', 'translate(' + firstRadius + ', 0)'); - const circles = [circlesRadiuses[0], circlesRadiuses[circlesRadiuses.length - 1]]; - const circleColor = getMiddleColor(cLegend); - context.append('g') - .selectAll('dot').data(circles).enter().append('circle') - .attr('r', (d) => d.value) - .attr('cx', (d) => xDomain(d.key)) - .attr('cy', (d) => maxHeight - d.value) - .attr('transform', 'translate(' + firstRadius + ', 0)') - .style('fill', circleColor) - .style('fill-opacity', 0.6) - .style('stroke', circleColor) - .style('stroke-width', 0.5); - -} - -export function getMax(data: Array): number { - return Math.max(...data.map(hd => +hd.value)); -} diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.module.ts b/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.module.ts deleted file mode 100644 index 475c0ec8..00000000 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.module.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { TranslateModule } from '@ngx-translate/core'; -import { MapglLegendComponent } from './mapgl-legend.component'; -import { MapglLayerIconModule } from '../mapgl-layer-icon/mapgl-layer-icon.module'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { FormatNumberModule } from '../../pipes/format-number/format-number.module'; -import { LayerIdToName } from './layer-name.pipe'; -import { MatMenuModule } from '@angular/material/menu'; -import { GetCollectionDisplayModule } from '../../pipes/get-collection-display-name/get-collection-display.module'; -import { FormatLegendModule } from '../../pipes/format-legend/format-legend.module'; -import { GetColorModule } from '../../pipes/get-color/get-color.module'; -import { MapglLegendItemComponent } from './mapgl-legend-item/mapgl-legend-item.component'; -import { GetFieldDisplayModule } from '../../pipes/get-field-display-name/get-field-display.module'; - - -@NgModule({ - imports: [ - CommonModule, - TranslateModule, - MapglLayerIconModule, - MatButtonModule, - MatIconModule, - MatMenuModule, - MatTooltipModule, - FormatNumberModule, - GetColorModule, - GetCollectionDisplayModule, - GetFieldDisplayModule, - FormatLegendModule - ], - declarations: [MapglLegendComponent, LayerIdToName, MapglLegendItemComponent], - exports: [MapglLegendComponent, LayerIdToName, MapglLegendItemComponent] -}) -export class MapglLegendModule { - -} diff --git a/projects/arlas-components/src/lib/components/mapgl/basemaps/basemap.service.ts b/projects/arlas-components/src/lib/components/mapgl/basemaps/basemap.service.ts deleted file mode 100644 index 415429e6..00000000 --- a/projects/arlas-components/src/lib/components/mapgl/basemaps/basemap.service.ts +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Injectable } from '@angular/core'; -import { ArlasBasemaps } from './basemaps'; -import * as pmtiles from 'pmtiles'; -import { CustomProtocol } from '../custom-protocol/mapbox-gl-custom-protocol'; -import { BasemapStyle } from './basemap.config'; -import mapboxgl from 'mapbox-gl'; -import { Observable, Subject, catchError, forkJoin, of, tap } from 'rxjs'; -import { HttpClient } from '@angular/common/http'; - -@Injectable({ - providedIn: 'root' -}) -export class MapboxBasemapService { - private POWERED_BY_ARLAS = ' Powered by ARLAS.'; - public basemaps: ArlasBasemaps; - - private protomapBasemapAddedSource = new Subject(); - public protomapBasemapAdded$ = this.protomapBasemapAddedSource.asObservable(); - - public constructor(private http: HttpClient) { } - - public setBasemaps(basemaps: ArlasBasemaps) { - this.basemaps = basemaps; - } - - public addProtomapBasemap(map: mapboxgl.Map) { - const selectedBasemap = this.basemaps.getSelected(); - if (selectedBasemap.type === 'protomap') { - const styleFile = selectedBasemap.styleFile as mapboxgl.Style; - const pmtilesSource = styleFile.sources['arlas_protomaps_source']; - if (pmtilesSource) { - // eslint-disable-next-line max-len - pmtilesSource['attribution'] = 'Protomaps © OpenStreetMap'; - pmtilesSource['attribution'] = pmtilesSource['attribution'] + this.POWERED_BY_ARLAS; - map.addSource('arlas_protomaps_source', pmtilesSource as any); - styleFile.layers.forEach(l => { - if (!!map.getLayer(l.id)) { - map.removeLayer(l.id); - } - map.addLayer(l as any); - }); - } - } else { - /** no action needed. The base map has been added already thanks to getInitStyle */ - } - } - - public notifyProtomapAddition() { - this.protomapBasemapAddedSource.next(true); - } - - public removeProtomapBasemap(map: mapboxgl.Map) { - const selectedBasemap = this.basemaps.getSelected(); - if (selectedBasemap.type === 'protomap') { - (selectedBasemap.styleFile as mapboxgl.Style).layers.forEach(l => { - if (!!map.getLayer(l.id)) { - map.removeLayer(l.id); - } - }); - map.removeSource('arlas_protomaps_source'); - } - } - - public declareProtomapProtocol(map: mapboxgl.Map) { - const protocol = new pmtiles.Protocol(); - if (!(mapboxgl as any).Style.getSourceType('pmtiles-type')) { - /** addSourceType is private */ - (map as any).addSourceType('pmtiles-type', CustomProtocol(mapboxgl).vector, (e) => e && console.error('There was an error', e)); - (mapboxgl as any).addProtocol('pmtiles', protocol.tile); - } - } - - public getInitStyle(selected: BasemapStyle) { - if (selected.type === 'protomap') { - /** This is necessaty to make it work for mapbox. */ - const clonedStyleFile: mapboxgl.Style = Object.assign({}, selected.styleFile as mapboxgl.Style); - clonedStyleFile.sources = { - protomaps_attribution: { - 'type': 'vector', - // eslint-disable-next-line max-len - 'attribution': 'Protomaps © OpenStreetMap' + this.POWERED_BY_ARLAS - } - }; - clonedStyleFile.layers = [{ - id: 'backgrounds', - type: 'background', - source: 'protomaps_attribution', - paint: { - 'background-color': 'rgba(0,0,0,0)' - } - }]; - return clonedStyleFile; - } - return selected.styleFile; - } - - - public fetchSources$() { - const sources$: Observable[] = []; - this.basemaps.styles().forEach(s => { - sources$.push(this.getStyleFile(s).pipe( - tap(sf => { - Object.keys(sf.sources).forEach(k => { - const attribution = sf.sources[k]['attribution']; - if (!!attribution) { - sf.sources[k]['attribution'] = attribution + this.POWERED_BY_ARLAS; - } else { - sf.sources[k]['attribution'] = this.POWERED_BY_ARLAS; - } - }); - s.styleFile = sf as mapboxgl.Style; - }), - catchError(() => { - s.errored = true; - return of(); - }) - )); - }); - return forkJoin(sources$); - } - - private getStyleFile(b: BasemapStyle): Observable { - if (typeof b.styleFile === 'string') { - return this.http.get(b.styleFile) as Observable; - } else { - return of(b.styleFile); - } - } -} diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.spec.ts b/projects/arlas-components/src/lib/components/mapgl/mapgl.component.spec.ts deleted file mode 100644 index 4f6bfd87..00000000 --- a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatIconModule } from '@angular/material/icon'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { TranslateFakeLoader, TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { MapboxAoiDrawService } from './draw/draw.service'; -import { MapglComponent } from './mapgl.component'; - -describe('MapglComponent', () => { - let component: MapglComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [MapglComponent], - imports: [TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: TranslateFakeLoader } }), - MatIconModule, - MatButtonModule, - MatSelectModule, - MatRadioModule, - MatSnackBarModule, - MatSlideToggleModule, - MatTooltipModule, - MatChipsModule, - DragDropModule], - providers: [ - HttpClient, - MapboxAoiDrawService, - provideHttpClient(withInterceptorsFromDi()) - ] -}) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(MapglComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.ts b/projects/arlas-components/src/lib/components/mapgl/mapgl.component.ts deleted file mode 100644 index c31e44ea..00000000 --- a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.ts +++ /dev/null @@ -1,1846 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { - AfterViewInit, Component, EventEmitter, - HostListener, Input, ViewEncapsulation, - OnChanges, OnDestroy, OnInit, Output, SimpleChanges, -} from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Subject, Subscription, fromEvent } from 'rxjs'; -import { debounceTime, finalize } from 'rxjs/operators'; -import { ElementIdentifier } from '../results/utils/results.utils'; -import { ControlButton, PitchToggle, DrawControl } from './mapgl.component.control'; -import { paddedBounds, MapExtend, LegendData, ArlasAnyLayer } from './mapgl.component.util'; -import * as mapglJsonSchema from './mapgl.schema.json'; -import { - MapLayers, ExternalEvent, - ARLAS_ID, FILLSTROKE_LAYER_PREFIX, SCROLLABLE_ARLAS_ID, ARLAS_VSET -} from './model/mapLayers'; -import { MapSource } from './model/mapSource'; -import MapboxDraw from '@mapbox/mapbox-gl-draw'; -import { Feature, Polygon, polygon, FeatureCollection, Geometry } from '@turf/helpers'; -import centroid from '@turf/centroid'; -import limitVertexDirectSelectMode from './model/LimitVertexDirectSelectMode'; -import validGeomDrawPolygonMode from './model/ValidGeomDrawPolygonMode'; -import * as mapboxgl from 'mapbox-gl'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { TranslateService } from '@ngx-translate/core'; -import { TransformRequestFunction, AnyLayer } from 'mapbox-gl'; -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; -import StaticMode from '@mapbox/mapbox-gl-draw-static-mode'; -import * as styles from './model/theme'; -import { getLayerName } from '../componentsUtils'; -import { MapboxAoiDrawService } from './draw/draw.service'; -import { AoiDimensions, BboxDrawCommand } from './draw/draw.models'; -import { BasemapStyle } from './basemaps/basemap.config'; -import { MapboxBasemapService } from './basemaps/basemap.service'; -import { ArlasBasemaps } from './basemaps/basemaps'; -import { marker } from '@colsen1991/ngx-translate-extract-marker'; -import circleMode from './draw/modes/circles/circle.mode'; -import radiusCircleMode from './draw/modes/circles/radius.circle.mode'; -import simpleSelectModeOverride from './draw/modes/simpleSelectOverride'; -import directModeOverride from './draw/modes/directSelectOverride'; -import stripMode from './draw/modes/strip/strip.mode'; -import { stripDirectSelectMode } from './draw/modes/strip/strip.direct.mode'; -import cleanCoords from '@turf/clean-coords'; - -export const CROSS_LAYER_PREFIX = 'arlas_cross'; - -export interface OnMoveResult { - zoom: number; - zoomStart: number; - center: Array; - centerWithOffset: Array; - extend: Array; - extendWithOffset: Array; - rawExtendWithOffset: Array; - extendForLoad: Array; - extendForTest: Array; - rawExtendForLoad: Array; - rawExtendForTest: Array; - xMoveRatio: number; - yMoveRatio: number; - visibleLayers: Set; -} - -export interface VisualisationSetConfig { - name: string; - layers: Array; - enabled?: boolean; -} - -export interface IconConfig { - path: string; - recolorable?: boolean; -} - -export const ZOOM_IN = marker('Zoom in'); -export const ZOOM_OUT = marker('Zoom out'); -export const RESET_BEARING = marker('Reset bearing to north'); -export const LAYER_SWITCHER_TOOLTIP = marker('Manage layers'); -export const GEOJSON_SOURCE_TYPE = 'geojson'; - -/** - * Mapgl Component allows to display and select geometrical data on a map. - */ - -@Component({ - selector: 'arlas-mapgl', - templateUrl: './mapgl.component.html', - styleUrls: ['./mapgl.component.scss'], - encapsulation: ViewEncapsulation.None -}) -export class MapglComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy { - - public map: mapboxgl.Map; - public draw: MapboxDraw; - public zoom: number; - public legendOpen = true; - // GeometryCollection ? - private emptyData: FeatureCollection = { - 'type': 'FeatureCollection', - 'features': [] - }; - private index: any; - private north: number; - private east: number; - private west: number; - private south: number; - private isDrawingBbox = false; - private canvas: HTMLElement; - private box: HTMLElement; - // points which xy coordinates are in screen referential - private start: mapboxgl.Point; - private current: mapboxgl.Point; - // Lat/lng on mousedown (start); mouseup (end) and mousemove (between start and end) - private startlngLat: mapboxgl.LngLat; - private endlngLat: mapboxgl.LngLat; - private movelngLat: mapboxgl.LngLat; - - private savedEditFeature = null; - - /** - * @constant - */ - public FINISH_DRAWING = marker('Double click to finish drawing'); - private POLYGON_LABEL_SOURCE = 'polygon_label'; - private ICONS_BASE_PATH = 'assets/icons/'; - private offlineBasemapChangeSubscription!: Subscription; - /** - * @Input : Angular - * @description element identifier given to map container - */ - @Input() public id = 'mapgl'; - - /** - * @Input : Angular - * @description List of mapgl layers - */ - @Input() public mapLayers: MapLayers; - - /** - * @Input : Angular - * @description Whether the scale is displayed. - */ - @Input() public displayScale = true; - /** - * @Input : Angular - * @description Whether the coordinates are displayed. - */ - @Input() public displayCurrentCoordinates = false; - /** - * @Input : Angular - * @description Whether the coordinates should be wraped between -180 and 180. - */ - @Input() public wrapLatLng = true; - /** - * @Input : Angular - * @description Max width of the scale. - */ - @Input() public maxWidthScale = 100; - /** - * @Input : Angular - * @description Unit of the scale. - */ - @Input() public unitScale = 'metric'; - /** - * @Input : Angular - * @description Default style of the base map - */ - @Input() public defaultBasemapStyle: BasemapStyle = { - name: 'Positron Style', - styleFile: 'http://demo.arlas.io:82/styles/positron/style.json', - }; - /** - * @Input : Angular - * @description List of styles to apply to the base map - */ - @Input() public basemapStyles = new Array(); - - /** - * @Input : Angular - * @description Zoom of the map when it's initialized - */ - @Input() public initZoom = 2; - /** - * @Input : Angular - * @description Max zoom of the map - */ - @Input() public maxZoom = 22; - /** - * @Input : Angular - * @description Min zoom of the map - */ - @Input() public minZoom = 0; - /** - * @Input : Angular - * @description Coordinates of the map's centre when it's initialized. - */ - @Input() public initCenter: [number, number] = [2.1972656250000004, 45.706179285330855]; - /** - * @Input : Angular - * @description Margin applied to the map extent. Data is loaded in all this extent. - */ - @Input() public margePanForLoad: number; - /** - * @Input : Angular - * @description Margin applied to the map extent. - * Before loading data, the components checks first if there are features already loaded in this extent. - */ - @Input() public margePanForTest: number; - /** - * @Input : Angular - * @description the field name of ids. - */ - @Input() public idFeatureField: string; - /** - * @Input : Angular - * @description Bounds that the view map fits. It's an array of two corners. Each corner is an lat-long position : - * For example : boundsToFit = [[30.51, -54.3],[30.57, -54.2]] - */ - @Input() public boundsToFit: Array>; - /** - * @Input : Angular - * @description The padding added in the top-left and bottom-right corners of a map container that shouldn't be accounted - * for when setting the view to fit bounds. - */ - @Input() public fitBoundsOffSet: [number, number] = [0, 0]; - /** - * @Input : Angular - * @description The maximum zoom level so that the bounds fit the map view. - */ - @Input() public fitBoundsMaxZoom = 22; - /** - * @Input : Angular - * @description Feature to highlight. - */ - @Input() public featureToHightLight: { - isleaving: boolean; - elementidentifier: ElementIdentifier; - }; - /** - * @Input : Angular - * @description List of feature to select. - */ - @Input() public featuresToSelect: Array; - /** - * @Input : Angular - * @description List of mapboxgl sources to add to the map. - */ - @Input() public mapSources: Array; - - /** - * @Input : Angular - * @description Options object for draw tools : https://github.com/mapbox/mapbox-gl-draw/blob/master/docs/API.md#options - */ - @Input() public drawOption: any = {}; - - /** - * @Input : Angular - * @description Features drawn at component start - */ - @Input() public drawData: FeatureCollection = Object.assign({}, this.emptyData); - - /** - * @Input : Angular - * @description Whether the draw tools are activated - */ - @Input() public drawButtonEnabled = false; - - /** - * @Input : Angular - * @description Maximum number of vertices allowed for a polygon - */ - @Input() public drawPolygonVerticesLimit: number; - /** - * @Input : Angular - * @description A callback run before the Map makes a request for an external URL, mapbox map option - */ - @Input() public transformRequest: TransformRequestFunction; - - /** - * @Input : Angular - * @description Whether the drawing buffer is activated - * If true , the map's canvas can be exported to a PNG using map.getCanvas().toDataURL() - * default: false - */ - @Input() public preserveDrawingBuffer = false; - - /** - * @Input : Angular - * @description An object with noth,east,south,west properies which represent an offset in pixel - * Origin is top-left and x axe is west to east and y axe north to south. - */ - @Input() public offset: { north: number; east: number; south: number; west: number; } = - { north: 0, east: 0, south: 0, west: 0 }; - - /** - * @Input : Angular - * @description Padding value applied around a fitBounds to fully show the area targeted - * */ - @Input() public fitBoundsPadding = 10; - - /** - * @Input : Angular - * @description Subject to which the component subscribes to redraw on the map the `data` of the given `source`. - */ - @Input() public redrawSource = new Subject<{ source: string; data: Feature[]; }>(); - - /** - * @Input : Angular - * @description Subject of [collection, [field, legendData]] map. The map subscribes to it to keep - * the legend updated with the data displayed on the map. - */ - @Input() public legendUpdater: Subject>> = new Subject(); - - /** - * @Input : Angular - * @description Subject of [layerId, boolean] map. The map subscribes to it to keep - * the legend updated with the visibility of the layer. - */ - @Input() public visibilityUpdater: Subject> = new Subject(); - - /** - * @Input : Angular - * @description List of data sources names that should be added to the map. Sources should be of type `geojson` - */ - @Input() public dataSources: Set; - - /** - * @Input : Angular - * @description List of visualisation sets. A Visualisation set is an entity where to group layers together. - * If a visualisation set is enabled, all the layers in it can be displayed on the map, otherwise the layers are removed from the map. - */ - @Input() public visualisationSetsConfig: Array; - - /** - * @Input : Angular - * @description Position of the map attribution - */ - @Input() public mapAttributionPosition: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' = 'bottom-right'; - - public visualisationsSets: { - visualisations: Map>; - status: Map; - }; - - /** - * @Input : Angular - * @description List of icons to add to the map and that can be used in layers. - */ - @Input() public icons: Array; - - /** - * @Output : Angular - * @description Emits true after the map is loaded and all sources & layers are added. - */ - @Output() public onMapLoaded: Subject = new Subject(); - - - /** - * @Output : Angular - * @description Emits the event of moving the map. - * @deprecated - */ - @Output() public onMove: EventEmitter = new EventEmitter(); - - @Output() public visualisations: EventEmitter> = new EventEmitter(); - /** - * @Output : Angular - * @description Emits the event of clicking on a feature. - */ - @Output() public onFeatureClic = new EventEmitter<{ features: Array; point: [number, number]; }>(); - /** - * @Output : Angular - * @description Emits the event of hovering feature. - */ - @Output() public onFeatureOver = new EventEmitter<{ features: Array; point: [number, number]; } | {}>(); - - /** - * @Output : Angular - * @description Emits the map extend on Tab close/refresh - */ - @Output() public onMapClosed: EventEmitter = new EventEmitter(); - /** - * @Output : Angular - * @description Emits the geojson of an aoi added to the map - */ - @Output() public onAoiChanged: EventEmitter> = new EventEmitter(); - @Output() public onAoiEdit: EventEmitter = new EventEmitter(); - /** - * @Output : Angular - * @description Emits the geojson of an aoi added to the map - */ - @Output() public onBasemapChanged: Subject = new Subject(); - /** - * @Output : Angular - * @description Emits which layers are displayed in the Legend - */ - @Output() public legendVisibiltyStatus: Subject> = new Subject(); - @Output() public downloadSourceEmitter: Subject<{ - layerId: string; - layerName: string; - collection: string; - sourceName: string; - downloadType: string; - }> = new Subject(); - - public showBasemapsList = false; - public layersMap: Map; - - public currentLat: string; - public currentLng: string; - - // Circle - private isDrawingCircle = false; - // Strip - private isDrawingStrip = false; - - // Polygon - public nbPolygonVertice = 0; - public polygonlabeldata: FeatureCollection = Object.assign({}, this.emptyData); - private isDrawingPolygon = false; - private isInSimpleDrawMode = false; - public firstDrawLayer = ''; - - // Drag start position - public dragStartY: number; - public dragStartX: number; - - // Drag end position - public dragEndX: number; - public dragEndY: number; - - // Moving ratio (using pixel) - public xMoveRatio = 0; - public yMoveRatio = 0; - public zoomStart: number; - public visibilityStatus = new Map(); - public isDrawSelected = false; - public drawClickCounter = 0; - private drawSelectionChanged = false; - private finishDrawTooltip: HTMLElement; - private aoiEditSubscription: Subscription; - private drawBboxSubscription: Subscription; - - public constructor(private drawService: MapboxAoiDrawService, - private basemapService: MapboxBasemapService, - private _snackBar: MatSnackBar, private translate: TranslateService) { - this.aoiEditSubscription = this.drawService.editAoi$.subscribe(ae => this.onAoiEdit.emit(ae)); - this.drawBboxSubscription = this.drawService.drawBbox$.subscribe({ - next: (bboxDC: BboxDrawCommand) => { - this.drawBbox(bboxDC.east, bboxDC.south, bboxDC.west, bboxDC.north); - } - }); - } - - - /** - * Update the visibility status of the layer and emit that update - * @param visualisation visualisation set name - * @param l layer id - * @param visible whether the layer is enabled and visible in the visualisation set - */ - public emitLegendVisibility(visualisation: string, l: string, visible: boolean): void { - // Copy the map so the pipe updates the values - this.visibilityStatus = new Map(this.visibilityStatus); - this.visibilityStatus.set(visualisation + ARLAS_VSET + l, visible); - this.legendVisibiltyStatus.next(this.visibilityStatus); - } - - /** Hides/shows all the layers inside the given visualisation name*/ - public emitVisualisations(visualisationName: string) { - const visuStatus = !this.visualisationsSets.status.get(visualisationName); - this.visualisationSetsConfig.find(v => v.name === visualisationName).enabled = visuStatus; - if (!visuStatus) { - const layersSet = new Set(this.visualisationsSets.visualisations.get(visualisationName)); - this.visualisationsSets.visualisations.forEach((ls, v) => { - if (v !== visualisationName) { - ls.forEach(ll => { - if (layersSet && layersSet.has(ll)) { - layersSet.delete(ll); - } - }); - } - }); - layersSet.forEach(ll => { - this.map.setLayoutProperty(ll, 'visibility', 'none'); - this.setStrokeLayoutVisibility(ll, 'none'); - this.setScrollableLayoutVisibility(ll, 'none'); - }); - } - this.visualisationsSets.status.set(visualisationName, visuStatus); - const layers = new Set(); - this.visualisationsSets.visualisations.forEach((ls, v) => { - if (this.visualisationsSets.status.get(v)) { - ls.forEach(l => { - layers.add(l); - this.map.setLayoutProperty(l, 'visibility', 'visible'); - this.setStrokeLayoutVisibility(l, 'visible'); - this.setScrollableLayoutVisibility(l, 'visible'); - }); - } - }); - this.visualisations.emit(layers); - this.reorderLayers(); - } - - public downloadLayerSource(downaload: { layer: mapboxgl.Layer; downloadType: string; }): void { - const downlodedSource = { - layerId: downaload.layer.id, - layerName: getLayerName(downaload.layer.id), - collection: downaload.layer.metadata.collection, - sourceName: downaload.layer.source as string, - downloadType: downaload.downloadType - }; - this.downloadSourceEmitter.next(downlodedSource); - } - - /** - * @description Add an external visulisation set to the map - * @param visualisation A visulisation set object to add to the map - * @param layers List of actual layers that are declared in `visualisation` object - * @param sources List of sources that these external `layers` use. - */ - public addVisualisation(visualisation: VisualisationSetConfig, layers: Array, sources: Array): void { - sources.forEach((s) => { - if (typeof (s.source) !== 'string') { - this.map.addSource(s.id, s.source); - } - }); - this.visualisationSetsConfig.unshift(visualisation); - this.visualisationsSets.visualisations.set(visualisation.name, new Set(visualisation.layers)); - this.visualisationsSets.status.set(visualisation.name, visualisation.enabled); - layers.forEach(layer => { - this.map.addLayer(layer); - }); - const layersMap = new Map(); - this.mapLayers.layers.concat(layers).forEach(layer => layersMap.set(layer.id, layer)); - this.layersMap = layersMap; - - this.reorderLayers(); - } - - /** - * @description Updates the visibility status of the given layers in Legend component - * @param visibility Map of layerId, and its visibility status as boolean (true = visible) - */ - public updateLayerVisibility(visibility: Map) { - this.visibilityUpdater.next(visibility); - } - - public openInvalidGeometrySnackBar() { - this._snackBar.open(this.translate.instant('Invalid geometry'), this.translate.instant('Ok'), { - duration: 3 * 1000, - verticalPosition: 'top', - panelClass: 'invalid-geo-toast' - }); - } - - public static getMapglJsonSchema(): Object { - return mapglJsonSchema; - } - - public ngOnInit() { - this.offlineBasemapChangeSubscription = this.basemapService.protomapBasemapAdded$.subscribe(() => this.reorderLayers()); - } - - /** puts the visualisation set list in the new order after dropping */ - public drop(event: CdkDragDrop) { - moveItemInArray(this.visualisationSetsConfig, event.previousIndex, event.currentIndex); - this.reorderLayers(); - } - - /** puts the layers list in the new order after dropping */ - public dropLayer(event: CdkDragDrop, visuName: string) { - const layers = Array.from(this.visualisationSetsConfig.find(v => v.name === visuName).layers); - moveItemInArray(layers, event.previousIndex, event.currentIndex); - this.visualisationSetsConfig.find(v => v.name === visuName).layers = layers; - this.reorderLayers(); - } - - /** Sets the layers order according to the order of `visualisationSetsConfig` list*/ - public reorderLayers() { - // parses the visulisation list from bottom in order to put the fist ones first - for (let i = this.visualisationSetsConfig.length - 1; i >= 0; i--) { - const visualisation: VisualisationSetConfig = this.visualisationSetsConfig[i]; - if (!!visualisation.layers && visualisation.enabled) { - for (let j = visualisation.layers.length - 1; j >= 0; j--) { - const l = visualisation.layers[j]; - const layer = this.layersMap.get(l); - const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); - const scrollableLayer = this.layersMap.get(scrollableId); - if (!!scrollableLayer && !!this.map.getLayer(scrollableId)) { - this.map.moveLayer(scrollableId); - } - if (!!this.map.getLayer(l)) { - this.map.moveLayer(l); - if (layer.type === 'fill') { - const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); - const strokeLayer = this.layersMap.get(strokeId); - if (!!strokeLayer && !!this.map.getLayer(strokeId)) { - this.map.moveLayer(strokeId); - } - if (!!strokeLayer && !!strokeLayer.id) { - const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + strokeLayer.id; - const selectLayer = this.layersMap.get(selectId); - if (!!selectLayer && !!this.map.getLayer(selectId)) { - this.map.moveLayer(selectId); - } - const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + strokeLayer.id; - const hoverLayer = this.layersMap.get(hoverId); - if (!!hoverLayer && !!this.map.getLayer(hoverId)) { - this.map.moveLayer(hoverId); - } - } - } - } - const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + layer.id; - const selectLayer = this.layersMap.get(selectId); - if (!!selectLayer && !!this.map.getLayer(selectId)) { - this.map.moveLayer(selectId); - } - const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + layer.id; - const hoverLayer = this.layersMap.get(hoverId); - if (!!hoverLayer && !!this.map.getLayer(hoverId)) { - this.map.moveLayer(hoverId); - } - } - } - } - this.map.getStyle().layers - .map(layer => layer.id) - .filter(id => id.indexOf('.cold') >= 0 || id.indexOf('.hot') >= 0).forEach(id => this.map.moveLayer(id)); - - } - - public ngOnChanges(changes: SimpleChanges): void { - if (this.map !== undefined) { - if (changes['drawData'] !== undefined) { - this.drawData = changes['drawData'].currentValue; - const centroides = new Array(); - this.drawData.features.forEach(feature => { - const poly = polygon((feature.geometry as Polygon).coordinates); - const cent = centroid(poly); - cent.properties.arlas_id = feature.properties.arlas_id; - centroides.push(cent); - }); - this.polygonlabeldata = { - type: 'FeatureCollection', - features: centroides - }; - if (!this.drawSelectionChanged) { - this.drawService.addFeatures(this.drawData, /** deleteOld */ true); - } - this.drawSelectionChanged = false; - if (this.map.getSource(this.POLYGON_LABEL_SOURCE) !== undefined) { - (this.map.getSource(this.POLYGON_LABEL_SOURCE) as mapboxgl.GeoJSONSource).setData(this.polygonlabeldata); - } - } - if (changes['boundsToFit'] !== undefined) { - const newBoundsToFit = changes['boundsToFit'].currentValue; - const canvas = this.map.getCanvasContainer(); - const positionInfo = canvas.getBoundingClientRect(); - const width = positionInfo.width; - this.map.fitBounds(newBoundsToFit, { - maxZoom: this.fitBoundsMaxZoom, - offset: this.fitBoundsOffSet - }); - } - if (changes['featureToHightLight'] !== undefined - && changes['featureToHightLight'].currentValue !== changes['featureToHightLight'].previousValue) { - const featureToHightLight = changes['featureToHightLight'].currentValue; - this.highlightFeature(featureToHightLight); - } - if (changes['featuresToSelect'] !== undefined - && changes['featuresToSelect'].currentValue !== changes['featuresToSelect'].previousValue) { - const featuresToSelect = changes['featuresToSelect'].currentValue; - this.selectFeatures(featuresToSelect); - } - } - } - - public ngAfterViewInit() { - /** init values */ - if (!this.initCenter) { - this.initCenter = [0, 0]; - } - if (this.initZoom === undefined || this.initZoom === null) { - this.initZoom = 3; - } - if (this.maxZoom === undefined || this.maxZoom === null) { - this.maxZoom = 22; - } - if (this.minZoom === undefined || this.minZoom === null) { - this.maxZoom = 0; - } - if (typeof this.defaultBasemapStyle.styleFile === 'string') { - this.defaultBasemapStyle.url = this.defaultBasemapStyle.styleFile; - } - this.basemapStyles.forEach(bm => { - if (typeof bm.styleFile === 'string') { - bm.url = (bm.styleFile as string); - } - }); - this.basemapService.setBasemaps(new ArlasBasemaps(this.defaultBasemapStyle, this.basemapStyles)); - this.basemapService.fetchSources$() - .pipe(finalize(() => this.declareMap())) - .subscribe(); - } - - /** If transformRequest' @Input was not set, set a default value : a function that maintains the same url */ - public initTransformRequest() { - if (!this.transformRequest) { - this.transformRequest = (url: string, resourceType: mapboxgl.ResourceType) => ({ - url, - }); - } - } - - public declareMap() { - this.initTransformRequest(); - this.map = new mapboxgl.Map({ - container: this.id, - style: this.basemapService.getInitStyle(this.basemapService.basemaps.getSelected()), - center: this.initCenter, - zoom: this.initZoom, - maxZoom: this.maxZoom, - minZoom: this.minZoom, - renderWorldCopies: true, - preserveDrawingBuffer: this.preserveDrawingBuffer, - locale: { - 'NavigationControl.ZoomIn': this.translate.instant(ZOOM_IN), - 'NavigationControl.ZoomOut': this.translate.instant(ZOOM_OUT), - 'NavigationControl.ResetBearing': this.translate.instant(RESET_BEARING) - }, - pitchWithRotate: false, - transformRequest: this.transformRequest, - attributionControl: false - }); - // Disable map pitch and rotation with keyboard - this.map.keyboard.disableRotation(); - - this.map.addControl(new mapboxgl.AttributionControl(), this.mapAttributionPosition); - this.drawService.setMap(this.map); - fromEvent(window, 'beforeunload').subscribe(() => { - const bounds = this.map.getBounds(); - const mapExtend: MapExtend = { bounds: bounds.toArray(), center: bounds.getCenter().toArray(), zoom: this.map.getZoom() }; - this.onMapClosed.next(mapExtend); - }); - - this.finishDrawTooltip = document.getElementById('polygon-finish-draw-tooltip'); - - - /** Whether to display scale */ - if (this.displayScale) { - const scale = new mapboxgl.ScaleControl({ - maxWidth: this.maxWidthScale, - unit: this.unitScale, - }); - this.map.addControl(scale, 'bottom-right'); - } - - const navigationControllButtons = new mapboxgl.NavigationControl(); - const addGeoBoxButton = new ControlButton('addgeobox'); - const removeAoisButton = new ControlButton('removeaois'); - - - this.map.addControl(navigationControllButtons, 'top-right'); - this.map.addControl(new PitchToggle(-20, 70, 11), 'top-right'); - this.map.addControl(addGeoBoxButton, 'top-right'); - this.map.addControl(removeAoisButton, 'top-right'); - this.map.loadImage('assets/rotate/01.png', (error, image) => { - this.map.addImage('rotate', image); - }); - this.map.loadImage('assets/resize/01.png', (error, image) => { - this.map.addImage('resize', image); - }); - - const modes = MapboxDraw.modes; - const drawStyles = styles.default; - const drawOptions = { - ...this.drawOption, ...{ - styles: drawStyles, - modes: Object.assign( - modes, - { - static: StaticMode, - limit_vertex: limitVertexDirectSelectMode, - draw_polygon: validGeomDrawPolygonMode, - draw_circle: circleMode, - draw_radius_circle: radiusCircleMode, - draw_strip: stripMode, - direct_strip: stripDirectSelectMode, - direct_select: directModeOverride, - simple_select: simpleSelectModeOverride - }) - } - }; - - const drawControl = new DrawControl(drawOptions, this.drawButtonEnabled); - this.map.addControl(drawControl, 'top-right'); - this.draw = drawControl.mapboxDraw; - this.draw.modes.DRAW_CIRCLE = 'draw_circle'; - this.draw.modes.DRAW_RADIUS_CIRCLE = 'draw_radius_circle'; - this.draw.modes.DRAW_STRIP = 'draw_strip'; - this.draw.modes.DIRECT_STRIP = 'direct_strip'; - - this.drawService.setMapboxDraw(this.draw); - addGeoBoxButton.btn.onclick = () => { - this.addGeoBox(); - }; - removeAoisButton.btn.onclick = () => { - this.removeAois(); - }; - this.map.boxZoom.disable(); - this.map.on('load', () => { - this.basemapService.declareProtomapProtocol(this.map); - this.basemapService.addProtomapBasemap(this.map); - this.draw.changeMode('static'); - if (this.icons) { - this.icons.forEach(icon => { - this.map.loadImage( - this.ICONS_BASE_PATH + icon.path, - (error, image) => { - if (error) { - console.warn('The icon "' + this.ICONS_BASE_PATH + icon.path + '" is not found'); - } else { - this.map.addImage(icon.path.split('.')[0], image, { 'sdf': icon.recolorable }); - } - }); - }); - } - this.firstDrawLayer = this.map.getStyle().layers - .map(layer => layer.id) - .filter(id => id.indexOf('.cold') >= 0 || id.indexOf('.hot') >= 0)[0]; - this.west = this.map.getBounds().getWest(); - this.south = this.map.getBounds().getSouth(); - this.east = this.map.getBounds().getEast(); - this.north = this.map.getBounds().getNorth(); - this.zoom = this.map.getZoom(); - - // Add Data_source - if (this.dataSources) { - this.dataSources.forEach(source => { - this.map.addSource(source, { - type: GEOJSON_SOURCE_TYPE, - data: Object.assign({}, this.emptyData) - }); - }); - } - this.map.addSource(this.POLYGON_LABEL_SOURCE, { - 'type': GEOJSON_SOURCE_TYPE, - 'data': this.polygonlabeldata - }); - this.addSourcesToMap(this.mapSources, this.map); - if (this.mapLayers !== null) { - const layersMap = new Map(); - this.mapLayers.layers.forEach(layer => layersMap.set(layer.id, layer)); - this.layersMap = layersMap; - this.addVisuLayers(); - this.addExternalEventLayers(); - - this.mapLayers.events.zoomOnClick.forEach(layerId => { - this.map.on('click', layerId, (e) => { - if (e.features[0].properties.cluster_id !== undefined) { - const expansionZoom = this.index.getClusterExpansionZoom(e.features[0].properties.cluster_id); - this.map.flyTo({ center: [e.lngLat.lng, e.lngLat.lat], zoom: expansionZoom }); - } else { - const zoom = this.map.getZoom(); - let newZoom: number; - if (zoom >= 0 && zoom < 3) { - newZoom = 4; - } else if (zoom >= 3 && zoom < 5) { - newZoom = 5; - } else if (zoom >= 5 && zoom < 7) { - newZoom = 7; - } else if (zoom >= 7 && zoom < 10) { - newZoom = 10; - } else if (zoom >= 10 && zoom < 11) { - newZoom = 11; - } else { - newZoom = 12; - } - this.map.flyTo({ center: [e.lngLat.lng, e.lngLat.lat], zoom: newZoom }); - - } - }); - }); - - this.mapLayers.events.emitOnClick.forEach(layerId => { - this.map.on('click', layerId, (e) => { - const features = this.map.queryRenderedFeatures(e.point); - const hasCrossOrDrawLayer = (!!features && !!features.find(f => f.layer.id.startsWith(CROSS_LAYER_PREFIX))); - if (!this.isDrawingBbox && !this.isDrawingPolygon && !this.isDrawingCircle && !this.isInSimpleDrawMode && !hasCrossOrDrawLayer) { - this.onFeatureClic.next({ features: e.features, point: [e.lngLat.lng, e.lngLat.lat] }); - } - }); - }); - - [ - 'gl-draw-polygon-stroke-inactive', - 'gl-draw-polygon-stroke-active', - 'gl-draw-polygon-stroke-static' - ].forEach(layer => - ['.cold', '.hot'].forEach(layerId => - this.map.on('mousemove', layer.concat(layerId), (e) => { - this.map.getCanvas().style.cursor = 'pointer'; - }) - ) - ); - [ - 'gl-draw-polygon-stroke-inactive', - 'gl-draw-polygon-stroke-active', - 'gl-draw-polygon-stroke-static' - ].forEach(layer => - ['.cold', '.hot'].forEach(layerId => - this.map.on('mouseleave', layer.concat(layerId), (e) => { - this.map.getCanvas().style.cursor = ''; - }))); - - this.mapLayers.events.onHover.forEach(layerId => { - this.map.on('mousemove', layerId, (e) => { - this.onFeatureOver.next({ features: e.features, point: [e.lngLat.lng, e.lngLat.lat] }); - }); - - this.map.on('mouseleave', layerId, (e) => { - this.onFeatureOver.next({}); - }); - }); - - this.visibilityUpdater.subscribe(visibilityStatus => { - visibilityStatus.forEach((visibilityStatus, l) => { - let layerInVisualisations = false; - if (!visibilityStatus) { - this.visualisationSetsConfig.forEach(v => { - const ls = new Set(v.layers); - if (!layerInVisualisations) { - layerInVisualisations = ls.has(l); - } - }); - if (layerInVisualisations) { - this.map.setLayoutProperty(l, 'visibility', 'none'); - this.setStrokeLayoutVisibility(l, 'none'); - this.setScrollableLayoutVisibility(l, 'none'); - } - } else { - let oneVisualisationEnabled = false; - this.visualisationSetsConfig.forEach(v => { - const ls = new Set(v.layers); - if (!layerInVisualisations) { - layerInVisualisations = ls.has(l); - } - if (ls.has(l) && v.enabled) { - oneVisualisationEnabled = true; - (this.map).setLayoutProperty(l, 'visibility', 'visible'); - this.setStrokeLayoutVisibility(l, 'visible'); - this.setScrollableLayoutVisibility(l, 'visible'); - } - }); - if (!oneVisualisationEnabled && layerInVisualisations) { - (this.map).setLayoutProperty(l, 'visibility', 'none'); - this.setStrokeLayoutVisibility(l, 'none'); - this.setScrollableLayoutVisibility(l, 'none'); - } - } - }); - }); - } - this.map.showTileBoundaries = false; - this.canvas = this.map.getCanvasContainer(); - this.canvas.addEventListener('mousedown', this.mousedown, true); - this.map.on('draw.create', (e) => { - this.onAoiChanged.next( - { - 'type': 'FeatureCollection', - 'features': this.draw.getAll().features.filter(fc => - this.drawService.isValidPolygon(fc) || - this.drawService.isValidCircle(fc) - ).map(f => cleanCoords(f)) - }); - }); - - this.map.on('draw.update', (e) => { - if (e) { - const features = e.features; - if (features && features.length > 0) { - this.savedEditFeature = Object.assign({}, features[0]); - this.savedEditFeature.coordinates = [[]]; - features[0].geometry.coordinates[0].forEach(f => this.savedEditFeature.coordinates[0].push(f)); - } - } - }); - this.map.on('draw.delete', (e) => { - this.onAoiChanged.next( - { - 'type': 'FeatureCollection', - 'features': this.draw.getAll().features.filter(fc => - this.drawService.isPolygon(fc) || - this.drawService.isCircle(fc) - ).map(f => cleanCoords(f)) - }); - }); - - const mouseMoveForDraw = (e: MouseEvent) => { - const x = e.clientX; - const y = e.clientY; - this.finishDrawTooltip.style.top = (y + 20) + 'px'; - this.finishDrawTooltip.style.left = (x + 20) + 'px'; - }; - - this.map.on('draw.onClick', (e) => { - if (this.drawClickCounter === 0) { - window.addEventListener('mousemove', mouseMoveForDraw); - } - this.drawClickCounter++; - }); - this.map.on('draw.onStart', (e) => { - window.removeEventListener('mousemove', mouseMoveForDraw); - this.drawClickCounter = 0; - this.map.getCanvas().style.cursor = ''; - }); - this.map.on('draw.onStop', (e) => { - window.removeEventListener('mousemove', mouseMoveForDraw); - this.drawClickCounter = 0; - this.map.getCanvas().style.cursor = ''; - }); - - this.map.on('draw.invalidGeometry', (e) => { - if (this.savedEditFeature) { - const featureCoords = this.savedEditFeature.coordinates[0].slice(); - if (featureCoords[0][0] !== featureCoords[featureCoords.length - 1][0] || - featureCoords[0][1] !== featureCoords[featureCoords.length - 1][1]) { - featureCoords.push(featureCoords[0]); - } - const currentFeature = { - id: '', - type: 'Feature', - geometry: { - 'type': 'Polygon', - 'coordinates': [featureCoords] - }, - properties: {} - }; - currentFeature.id = this.savedEditFeature.id; - currentFeature.properties = this.savedEditFeature.properties; - this.draw.add(currentFeature); - } - this.openInvalidGeometrySnackBar(); - this.map.getCanvas().style.cursor = ''; - }); - - this.map.on('draw.edit.saveInitialFeature', (edition) => { - this.savedEditFeature = Object.assign({}, edition.feature); - this.savedEditFeature.coordinates = [[]]; - edition.feature.coordinates[0].forEach(c => this.savedEditFeature.coordinates[0].push(c)); - }); - - this.map.on('draw.selectionchange', (e) => { - this.drawSelectionChanged = true; - if (e.features.length > 0) { - this.isDrawSelected = true; - } else { - this.savedEditFeature = null; - this.isDrawSelected = false; - this.onAoiChanged.next( - { - 'type': 'FeatureCollection', - 'features': this.draw.getAll().features.filter(fc => - this.drawService.isValidPolygon(fc) || - this.drawService.isValidCircle(fc) - ).map(f => cleanCoords(f)) - }); - this.isDrawingBbox = false; - this.isDrawingPolygon = false; - this.isDrawingCircle = false; - this.isDrawingStrip = false; - this.isInSimpleDrawMode = false; - this.draw.changeMode('static'); - this.map.getCanvas().style.cursor = ''; - } - }); - this.map.on('draw.modechange', (e) => { - this.isDrawingPolygon = e.mode === this.draw.modes.DRAW_POLYGON; - this.isDrawingStrip = e.mode === this.draw.modes.DIRECT_STRIP; - this.isDrawingCircle = e.mode === this.draw.modes.DRAW_CIRCLE || e.mode === this.draw.modes.DRAW_RADIUS_CIRCLE; - if (this.isDrawingPolygon || this.isDrawingCircle || this.isDrawingStrip || e.mode === 'static') { - this.isInSimpleDrawMode = false; - } - if (e.mode === 'simple_select') { - this.isInSimpleDrawMode = true; - } else if (e.mode === 'static') { - this.map.getCanvas().style.cursor = ''; - } else if (e.mode === 'direct_select') { - const selectedFeatures = this.draw.getSelected().features; - const selectedIds = this.draw.getSelectedIds(); - if (selectedFeatures && selectedIds && selectedIds.length > 0) { - if (selectedFeatures[0].properties.source === 'bbox') { - this.draw.changeMode('simple_select', { - featureIds: [selectedIds[0]] - }); - this.isInSimpleDrawMode = true; - } else if (this.drawPolygonVerticesLimit && selectedFeatures[0].properties.meta !== 'strip') { - this.draw.changeMode('limit_vertex', { - featureId: selectedIds[0], - maxVertexByPolygon: this.drawPolygonVerticesLimit, - selectedCoordPaths: selectedFeatures[0].geometry.coordinates - }); - this.isInSimpleDrawMode = false; - } else if (this.drawPolygonVerticesLimit && selectedFeatures[0].properties.meta === 'strip') { - this.draw.changeMode('direct_strip', { - featureId: selectedIds[0], - maxLength: selectedFeatures[0].properties.maxLength, - halfSwath: selectedFeatures[0].properties.halfSwath, - }); - this.isInSimpleDrawMode = false; - } - } else { - this.isInSimpleDrawMode = false; - this.map.getCanvas().style.cursor = ''; - } - } - }); - - this.map.on('click', (e) => { - if (this.isDrawingCircle) { - return; - } - - if (this.isDrawingPolygon) { - this.nbPolygonVertice++; - if (this.nbPolygonVertice === this.drawPolygonVerticesLimit) { - this.draw.changeMode('static'); - this.isDrawingPolygon = false; - this.nbPolygonVertice = 0; - } - } else { - this.nbPolygonVertice = 0; - const features = this.map.queryRenderedFeatures(e.point); - // edit polygon condition : no arlas feature && mapbox-gl-draw source present - const editCondition = features.filter(f => f.layer.id?.indexOf('arlas') >= 0).length === 0 && - features.filter(f => f.source.startsWith('mapbox-gl-draw')).length > 0; - if (editCondition) { - const candidates = features.filter(f => f.source.startsWith('mapbox-gl-draw')); - // edit only on click on the border of the polygon - const candidatesProperties = candidates.filter(f => f.layer.id?.indexOf('stroke') >= 0)[0]?.properties; - if (candidatesProperties && !!candidatesProperties.id) { - if (candidatesProperties.user_meta === 'strip') { - this.draw.changeMode('direct_strip', { - featureId: candidatesProperties.id, - maxLength: candidatesProperties.user_maxLength, - halfSwath: candidatesProperties.user_halfSwath - }); - this.isInSimpleDrawMode = false; - } else { - this.draw.changeMode('simple_select', { - featureIds: [candidatesProperties.id] - }); - this.isInSimpleDrawMode = true; - } - - } - } - } - }); - this.onMapLoaded.next(true); - }); - - const zoomstart = fromEvent(this.map, 'zoomstart') - .pipe(debounceTime(750)); - - zoomstart.subscribe(e => { - this.zoomStart = this.map.getZoom(); - }); - - const dragstart = fromEvent(this.map, 'dragstart') - .pipe(debounceTime(750)); - dragstart.subscribe(e => { - this.dragStartX = e.originalEvent.clientX; - this.dragStartY = e.originalEvent.clientY; - }); - const dragend = fromEvent(this.map, 'dragend') - .pipe(debounceTime(750)); - dragend.subscribe(e => { - this.dragEndX = e.originalEvent.clientX; - this.dragEndY = e.originalEvent.clientY; - this.xMoveRatio = Math.abs(this.dragEndX - this.dragStartX) / e.target._canvas.clientWidth; - this.yMoveRatio = Math.abs(this.dragEndY - this.dragStartY) / e.target._canvas.clientHeight; - }); - - this.visualisationsSets = { - visualisations: new Map(), - status: new Map() - }; - if (this.visualisationSetsConfig) { - this.visualisationSetsConfig.forEach(visu => { - this.visualisationsSets.visualisations.set(visu.name, new Set(visu.layers)); - this.visualisationsSets.status.set(visu.name, visu.enabled); - }); - } - const moveend = fromEvent(this.map, 'moveend') - .pipe(debounceTime(750)); - moveend.subscribe(e => { - this.west = this.map.getBounds().getWest(); - this.south = this.map.getBounds().getSouth(); - this.east = this.map.getBounds().getEast(); - this.north = this.map.getBounds().getNorth(); - this.zoom = this.map.getZoom(); - const offsetPoint = new mapboxgl.Point((this.offset.east + this.offset.west) / 2, (this.offset.north + this.offset.south) / 2); - const centerOffsetPoint = this.map.project(this.map.getCenter()).add(offsetPoint); - const centerOffSetLatLng = this.map.unproject(centerOffsetPoint); - - const southWest = this.map.getBounds().getSouthWest(); - const northEast = this.map.getBounds().getNorthEast(); - const bottomLeft = this.map.project(southWest); - const topRght = this.map.project(northEast); - const height = bottomLeft.y; - const width = topRght.x; - - const bottomLeftOffset = bottomLeft.add(new mapboxgl.Point(this.offset.west, this.offset.south)); - const topRghtOffset = topRght.add(new mapboxgl.Point(this.offset.east, this.offset.north)); - - const bottomLeftOffsetLatLng = this.map.unproject(bottomLeftOffset); - const topRghtOffsetLatLng = this.map.unproject(topRghtOffset); - - const wrapWestOffset = bottomLeftOffsetLatLng.wrap().lng; - const wrapSouthOffset = bottomLeftOffsetLatLng.wrap().lat; - const wrapEastOffset = topRghtOffsetLatLng.wrap().lng; - const wrapNorthOffset = topRghtOffsetLatLng.wrap().lat; - - const rawWestOffset = bottomLeftOffsetLatLng.lng; - const rawSouthOffset = bottomLeftOffsetLatLng.lat; - const rawEastOffset = topRghtOffsetLatLng.lng; - const rawNorthOffset = topRghtOffsetLatLng.lat; - const visibleLayers = new Set(); - this.visualisationsSets.status.forEach((b, vs) => { - if (b) { - this.visualisationsSets.visualisations.get(vs).forEach(l => visibleLayers.add(l)); - } - }); - const onMoveData: OnMoveResult = { - zoom: this.zoom, - zoomStart: this.zoomStart, - center: this.map.getCenter().toArray(), - centerWithOffset: [centerOffSetLatLng.lng, centerOffSetLatLng.lat], - extendWithOffset: [wrapNorthOffset, wrapWestOffset, wrapSouthOffset, wrapEastOffset], - rawExtendWithOffset: [rawNorthOffset, rawWestOffset, rawSouthOffset, rawEastOffset], - extend: [this.north, this.west, this.south, this.east], - extendForLoad: [], - extendForTest: [], - rawExtendForLoad: [], - rawExtendForTest: [], - xMoveRatio: this.xMoveRatio, - yMoveRatio: this.yMoveRatio, - visibleLayers: visibleLayers - }; - - const panLoad = this.margePanForLoad * Math.max(height, width) / 100; - const panTest = this.margePanForTest * Math.max(height, width) / 100; - const extendForLoadLatLng = paddedBounds(panLoad, panLoad, panLoad, panLoad, this.map, southWest, northEast); - const extendForTestdLatLng = paddedBounds(panTest, panTest, panTest, panTest, this.map, southWest, northEast); - onMoveData.extendForLoad = [ - extendForLoadLatLng[1].wrap().lat, - extendForLoadLatLng[0].wrap().lng, - extendForLoadLatLng[0].wrap().lat, - extendForLoadLatLng[1].wrap().lng - ]; - onMoveData.extendForTest = [ - extendForTestdLatLng[1].wrap().lat, - extendForTestdLatLng[0].wrap().lng, - extendForTestdLatLng[0].wrap().lat, - extendForTestdLatLng[1].wrap().lng - ]; - onMoveData.rawExtendForLoad = [ - extendForLoadLatLng[1].lat, - extendForLoadLatLng[0].lng, - extendForLoadLatLng[0].lat, - extendForLoadLatLng[1].lng, - ]; - onMoveData.rawExtendForTest = [ - extendForTestdLatLng[1].lat, - extendForTestdLatLng[0].lng, - extendForTestdLatLng[0].lat, - extendForTestdLatLng[1].lng, - ]; - this.onMove.next(onMoveData); - }); - // Fit bounds on current bounds to emit init position in moveend bus - this.map.fitBounds(this.map.getBounds()); - - // Mouse events - this.map.on('mousedown', (e: mapboxgl.MapMouseEvent) => { - this.startlngLat = e.lngLat; - this.drawService.startBboxDrawing(); - }); - this.map.on('mouseup', (e: mapboxgl.MapMouseEvent) => { - this.endlngLat = e.lngLat; - this.drawService.stopBboxDrawing(); - }); - this.map.on('mousemove', (e: mapboxgl.MapMouseEvent) => { - const lngLat = e.lngLat; - if (this.displayCurrentCoordinates) { - const displayedLngLat = this.wrapLatLng ? lngLat.wrap() : lngLat; - this.currentLng = String(Math.round(displayedLngLat.lng * 100000) / 100000); - this.currentLat = String(Math.round(displayedLngLat.lat * 100000) / 100000); - } - if (this.isDrawingBbox || this.isDrawingPolygon) { - this.map.getCanvas().style.cursor = 'crosshair'; - this.movelngLat = lngLat; - } - if (this.drawService.bboxEditionState.isDrawing) { - const startlng: number = this.startlngLat.lng; - const endlng: number = this.movelngLat.lng; - const startlat: number = this.startlngLat.lat; - const endlat: number = this.movelngLat.lat; - const west = Math.min(startlng, endlng); - const north = Math.max(startlat, endlat); - const east = Math.max(startlng, endlng); - const south = Math.min(startlat, endlat); - const coordinates = [[ - [east, south], - [east, north], - [west, north], - [west, south], - [east, south], - ]]; - const polygonGeojson = { - type: 'Feature', - properties: { - source: 'bbox' - }, - geometry: { - type: 'Polygon', - coordinates: coordinates - } - }; - this.drawService.emitDimensions(polygonGeojson as Feature); - } - }); - - if (!!this.redrawSource) { - this.redrawSource.subscribe(sd => { - if (this.map.getSource(sd.source) !== undefined) { - (this.map.getSource(sd.source) as mapboxgl.GeoJSONSource).setData({ - 'type': 'FeatureCollection', - 'features': sd.data - }); - } - }); - } - } - - /** - * @description Display the basemapswitcher - */ - public showBasemapSwitcher() { - this.showBasemapsList = true; - } - - /** - * @description Displays the geobox - */ - public addGeoBox() { - this.map.getCanvas().style.cursor = 'crosshair'; - this.drawService.enableBboxEdition(); - this.isDrawingBbox = true; - } - - /** - * @description Removes all the aois if none of them is selected. Otherwise it removes the selected one only - */ - public removeAois() { - this.map.getCanvas().style.cursor = ''; - this.isDrawingBbox = false; - this.deleteSelectedItem(); - } - - public onChangeBasemapStyle() { - this.onBasemapChanged.next(true); - } - - /** - * Return the polygons geometry in WKT or GeoJson given the mode - * @param mode : string - */ - public getAllPolygon(mode: 'wkt' | 'geojson') { - let polygon; - if (mode === 'wkt') { - polygon = this.latLngToWKT(this.draw.getAll().features.filter(f => this.drawService.isPolygon(f) || - this.drawService.isCircle(f)).map(f => cleanCoords(f))); - } else { - polygon = { - 'type': 'FeatureCollection', - 'features': this.draw.getAll().features.filter(f => this.drawService.isPolygon(f) || - this.drawService.isCircle(f)).map(f => cleanCoords(f)) - }; - } - return polygon; - } - - /** - * Return the selected polygon geometry in WKT or GeoJson given the mode - * @param mode : string - */ - public getSelectedPolygon(mode: 'wkt' | 'geojson') { - let polygon; - if (mode === 'wkt') { - polygon = this.latLngToWKT(this.draw.getSelected().features.filter(f => this.drawService.isPolygon(f) || - this.drawService.isCircle(f))); - } else { - polygon = { - 'type': 'FeatureCollection', - 'features': this.draw.getSelected().features.filter(f => this.drawService.isPolygon(f) || - this.drawService.isCircle(f)) - }; - } - return polygon; - } - - public switchToDrawMode(mode?: string, option?: any) { - const selectedMode = mode ?? this.draw.modes.DRAW_POLYGON; - this.isDrawingCircle = selectedMode === this.draw.modes.DRAW_CIRCLE || selectedMode === this.draw.modes.DRAW_RADIUS_CIRCLE; - this.isDrawingPolygon = selectedMode === this.draw.modes.DRAW_POLYGON; - this.isInSimpleDrawMode = false; - this.draw.changeMode(selectedMode, option ?? {}); - } - - public switchToDirectSelectMode(option?: { featureIds: Array; allowCircleResize: boolean; } - | { featureId: string; allowCircleResize: boolean; }) { - this.draw.changeMode('direct_select', option); - this.isInSimpleDrawMode = false; - this.isDrawingCircle = false; - this.isDrawingStrip = false; - this.isDrawingPolygon = false; - } - - public switchToEditMode() { - this.draw.changeMode('simple_select', { - featureIds: this.draw.getAll().features.map(f => f.id) - }); - this.isInSimpleDrawMode = true; - this.isDrawingCircle = false; - this.isDrawingStrip = false; - this.isDrawingPolygon = false; - } - - public deleteSelectedItem() { - if (this.isDrawSelected) { - this.draw.trash(); - } else { - this.drawService.deleteAll(); - } - this.isDrawSelected = false; - this.onAoiChanged.next(this.draw.getAll()); - } - - @HostListener('document:keydown', ['$event']) - public handleKeyboardEvent(event: KeyboardEvent) { - if (event.key === 'Escape' && this.isDrawingBbox) { - this.map.getCanvas().style.cursor = ''; - this.isDrawingBbox = false; - document.removeEventListener('mousemove', this.mousemove); - document.removeEventListener('mouseup', this.mouseup); - this.map.getCanvas().style.cursor = ''; - if (this.box) { - this.box.parentNode.removeChild(this.box); - this.box = undefined; - } - this.map.dragPan.enable(); - this.drawService.endDimensionsEmission(); - } - } - - public ngOnDestroy(): void { - if (!!this.aoiEditSubscription) { - this.aoiEditSubscription.unsubscribe(); - } - if (!!this.offlineBasemapChangeSubscription) { - this.offlineBasemapChangeSubscription.unsubscribe(); - } - if (!!this.drawBboxSubscription) { - this.drawBboxSubscription.unsubscribe(); - } - } - - public selectFeaturesByCollection(features: Array, collection: string) { - const ids: Array = features.map(f => f.idValue); - const numericalIds = ids.filter(id => !isNaN(+id)).map(id => +id); - const visibilityFilter = ids.length > 0 ? ['in', ['get', features[0].idFieldName], ['literal', ids.concat(numericalIds)]] : []; - this.updateLayersVisibility((features.length > 0), visibilityFilter, ExternalEvent.select, collection); - } - - public hideBasemapSwitcher() { - this.showBasemapsList = false; - } - - /** - * Wrapper method to fit the map to the given bounds with enough padding to properly visualize the area - */ - public paddedFitBounds(bounds: mapboxgl.LngLatBoundsLike, options?: mapboxgl.FitBoundsOptions) { - const paddedOptions = Object.assign({}, options); - paddedOptions.padding = { - top: this.offset.north + this.fitBoundsPadding, - bottom: this.offset.south + this.fitBoundsPadding, - left: this.offset.west + this.fitBoundsPadding, - right: this.offset.east + this.fitBoundsPadding - }; - this.map.fitBounds(bounds, paddedOptions); - } - - public moveToCoordinates(lngLat: [number, number]) { - this.map.setCenter(lngLat); - } - - private latLngToWKT(features) { - let wktType = 'POLYGON[###]'; - if (features.length > 1) { - wktType = 'MULTIPOLYGON([###])'; - } - - let polygons = ''; - features.forEach((feat, indexFeature) => { - if (feat) { - const currentFeat: Array = feat.geometry.coordinates; - polygons += (indexFeature === 0 ? '' : ',') + '(('; - currentFeat[0].forEach((coord, index) => { - polygons += (index === 0 ? '' : ',') + coord[0] + ' ' + coord[1]; - }); - polygons += '))'; - } - }); - - let wkt = ''; - if (polygons !== '') { - wkt = wktType.replace('[###]', polygons); - } - return wkt; - } - - /** - * @description Add map sources - */ - private addSourcesToMap(sources: Array, map: mapboxgl.Map) { - // Add sources defined as input in mapSources; - const mapSourcesMap = new Map(); - if (sources) { - sources.forEach(mapSource => { - mapSourcesMap.set(mapSource.id, mapSource); - }); - mapSourcesMap.forEach((mapSource, id) => { - if (map.getSource(id) === undefined && typeof (mapSource.source) !== 'string') { - map.addSource(id, mapSource.source); - } - }); - } - } - - private addVisuLayers() { - if (!!this.visualisationSetsConfig) { - for (let i = this.visualisationSetsConfig.length - 1; i >= 0; i--) { - const visualisation: VisualisationSetConfig = this.visualisationSetsConfig[i]; - if (!!visualisation.layers) { - for (let j = visualisation.layers.length - 1; j >= 0; j--) { - const l = visualisation.layers[j]; - const layer = this.layersMap.get(l); - const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); - const scrollableLayer = this.layersMap.get(scrollableId); - if (!!scrollableLayer) { - this.addLayer(scrollableId); - } - this.addLayer(l); - /** add stroke layer if the layer is a fill */ - if (layer.type === 'fill') { - const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); - const strokeLayer = this.layersMap.get(strokeId); - if (!!strokeLayer) { - this.addLayer(strokeId); - } - } - } - } - } - this.visualisationsSets.status.forEach((b, vs) => { - if (!b) { - this.visualisationsSets.visualisations.get(vs).forEach(l => { - this.map.setLayoutProperty(l, 'visibility', 'none'); - this.setStrokeLayoutVisibility(l, 'none'); - this.setScrollableLayoutVisibility(l, 'none'); - }); - } - }); - this.visualisationsSets.status.forEach((b, vs) => { - if (b) { - this.visualisationsSets.visualisations.get(vs).forEach(l => { - this.map.setLayoutProperty(l, 'visibility', 'visible'); - this.setStrokeLayoutVisibility(l, 'visible'); - this.setScrollableLayoutVisibility(l, 'visible'); - }); - - } - }); - this.reorderLayers(); - } - } - - private addExternalEventLayers() { - if (!!this.mapLayers.externalEventLayers) { - this.mapLayers.layers - .filter(layer => this.mapLayers.externalEventLayers.map(e => e.id).indexOf(layer.id) >= 0) - .forEach(l => this.addLayer(l.id)); - } - } - - private addLayer(layerId: string): void { - const layer = this.layersMap.get(layerId); - if (layer !== undefined && layer.id === layerId) { - /** Add the layer if it is not already added */ - if (this.map.getLayer(layerId) === undefined) { - if (this.firstDrawLayer.length > 0) { - /** draw layers must be on the top of the layers */ - this.map.addLayer(layer, this.firstDrawLayer); - } else { - this.map.addLayer(layer); - } - } - } else { - throw new Error('The layer `' + layerId + '` is not declared in `mapLayers.layers`'); - } - } - - private highlightFeature(featureToHightLight: { isleaving: boolean; elementidentifier: ElementIdentifier; }) { - if (featureToHightLight && featureToHightLight.elementidentifier) { - const ids: Array = [featureToHightLight.elementidentifier.idValue]; - if (!isNaN(+featureToHightLight.elementidentifier.idValue)) { - ids.push(+featureToHightLight.elementidentifier.idValue); - } - const visibilityFilter = ['in', ['get', featureToHightLight.elementidentifier.idFieldName], - ['literal', ids]]; - this.updateLayersVisibility(!featureToHightLight.isleaving, visibilityFilter, ExternalEvent.hover); - } - } - - private selectFeatures(elementToSelect: Array) { - if (elementToSelect) { - const ids = elementToSelect.length > 0 ? - elementToSelect.reduce((memo, element) => { - memo.push(element.idValue); return memo; - }, []) : []; - const numericalIds = ids.filter(id => !isNaN(+id)).map(id => +id); - const visibilityFilter = ids.length > 0 ? ['in', ['get', elementToSelect[0].idFieldName], ['literal', ids.concat(numericalIds)]] : []; - this.updateLayersVisibility((elementToSelect.length > 0), visibilityFilter, ExternalEvent.select); - } - } - - private updateLayersVisibility(visibilityCondition: boolean, visibilityFilter: Array, - visibilityEvent: ExternalEvent, collection?: string): void { - if (this.mapLayers && this.mapLayers.externalEventLayers) { - this.mapLayers.externalEventLayers.filter(layer => layer.on === visibilityEvent).forEach(layer => { - if (this.map.getLayer(layer.id) !== undefined) { - let originalLayerIsVisible = false; - const fullLayer = this.layersMap.get(layer.id); - const isCollectionCompatible = (!collection || (!!collection && (fullLayer.source as string).includes(collection))); - if (isCollectionCompatible) { - const originalLayerId = layer.id.replace('arlas-' + visibilityEvent.toString() + '-', ''); - const originalLayer = this.map.getStyle().layers.find(l => l.id === originalLayerId); - if (!!originalLayer) { - originalLayerIsVisible = (originalLayer as ArlasAnyLayer).layout.visibility === 'visible'; - } - const layerFilter: Array = []; - const externalEventLayer = this.layersMap.get(layer.id); - if (!!externalEventLayer && !!externalEventLayer.filter) { - externalEventLayer.filter.forEach(f => { - layerFilter.push(f); - }); - } - if (layerFilter.length === 0) { - layerFilter.push('all'); - } - if (visibilityCondition && originalLayerIsVisible) { - const condition = visibilityFilter; - layerFilter.push(condition); - this.map.setFilter(layer.id, layerFilter); - this.map.setLayoutProperty(layer.id, 'visibility', 'visible'); - } else { - this.map.setFilter(layer.id, (layer as any).filter); - this.map.setLayoutProperty(layer.id, 'visibility', 'none'); - } - } - } - }); - } - } - - private mousedown = (e) => { - // Continue the rest of the function if we add a geobox. - if (!this.isDrawingBbox) { - return; - } - // Disable default drag zooming when we add a geobox. - this.map.dragPan.disable(); - // Call functions for the following events - document.addEventListener('mousemove', this.mousemove); - document.addEventListener('mouseup', this.mouseup); - // Capture the first xy coordinates - const rect = this.canvas.getBoundingClientRect(); - this.start = new mapboxgl.Point( - e.clientX - rect.left - this.canvas.clientLeft, - e.clientY - rect.top - this.canvas.clientTop - ); - }; - - private mousemove = (e) => { - // Capture the ongoing xy coordinates - const rect = this.canvas.getBoundingClientRect(); - this.current = new mapboxgl.Point( - e.clientX - rect.left - this.canvas.clientLeft, - e.clientY - rect.top - this.canvas.clientTop - ); - // Append the box element if it doesnt exist - if (this.box === undefined) { - this.box = document.createElement('div'); - this.box.classList.add('boxdraw'); - this.canvas.appendChild(this.box); - } - - const minX = Math.min(this.start.x, this.current.x); - const maxX = Math.max(this.start.x, this.current.x); - const minY = Math.min(this.start.y, this.current.y); - const maxY = Math.max(this.start.y, this.current.y); - // Adjust width and xy position of the box element ongoing - const pos = 'translate(' + minX + 'px,' + minY + 'px)'; - this.box.style.transform = pos; - this.box.style.webkitTransform = pos; - this.box.style.width = maxX - minX + 'px'; - this.box.style.height = maxY - minY + 'px'; - }; - - private mouseup = (e) => { - const rect = this.canvas.getBoundingClientRect(); - const f = new mapboxgl.Point( - e.clientX - rect.left - this.canvas.clientLeft, - e.clientY - rect.top - this.canvas.clientTop - ); - document.removeEventListener('mousemove', this.mousemove); - document.removeEventListener('mouseup', this.mouseup); - this.map.getCanvas().style.cursor = ''; - this.map.dragPan.enable(); - // Capture xy coordinates - if (this.start.x !== f.x && this.start.y !== f.y) { - this.finish([[this.start, f], [e.lngLat]]); - } else { - if (this.box) { - this.box.parentNode.removeChild(this.box); - this.box = undefined; - } - } - this.drawService.endDimensionsEmission(); - }; - - private finish(bbox?) { - if (bbox) { - const startlng: number = this.startlngLat.lng; - const endlng: number = this.endlngLat.lng; - const startlat: number = this.startlngLat.lat; - const endlat: number = this.endlngLat.lat; - const west = Math.min(startlng, endlng); - const north = Math.max(startlat, endlat); - const east = Math.max(startlng, endlng); - const south = Math.min(startlat, endlat); - this.drawBbox(east, south, west, north); - if (this.box) { - this.box.parentNode.removeChild(this.box); - this.box = undefined; - } - } - } - - - private drawBbox(east, south, west, north) { - const coordinates = [[ - [east, south], - [east, north], - [west, north], - [west, south], - [east, south], - ]]; - const polygonGeojson: Feature = { - type: 'Feature', - properties: { - source: 'bbox' - }, - geometry: { - type: 'Polygon', - coordinates: coordinates - } - }; - const geoboxdata = Object.assign({}, this.emptyData); - geoboxdata.features = []; - if (this.drawData && this.drawData.features && this.drawData.features.length > 0) { - this.drawData.features.forEach(df => geoboxdata.features.push(df)); - } - geoboxdata.features.push(polygonGeojson); - /** This allows to keep the drawn box on the map. It will be overriden in ngOnChanges `changes['drawData']` */ - this.drawService.addFeatures(geoboxdata, /** deleteOld */ true); - this.onAoiChanged.next(geoboxdata); - this.isDrawingBbox = false; - this.drawService.disableBboxEdition(); - this.drawService.endDimensionsEmission(); - } - - private setStrokeLayoutVisibility(layerId: string, visibility: string): void { - const layer = this.layersMap.get(layerId); - if (layer.type === 'fill') { - const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); - const strokeLayer = this.layersMap.get(strokeId); - if (!!strokeLayer) { - this.map.setLayoutProperty(strokeId, 'visibility', visibility); - } - } - } - - private setScrollableLayoutVisibility(layerId: string, visibility: string): void { - const layer = this.layersMap.get(layerId); - const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); - const scrollbaleLayer = this.layersMap.get(scrollableId); - if (!!scrollbaleLayer) { - this.map.setLayoutProperty(scrollableId, 'visibility', visibility); - } - } -} diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.util.ts b/projects/arlas-components/src/lib/components/mapgl/mapgl.component.util.ts deleted file mode 100644 index 73fce69c..00000000 --- a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.util.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Pipe, PipeTransform } from '@angular/core'; -import { Point } from 'mapbox-gl'; - -export function paddedBounds(npad: number, spad: number, epad: number, - wpad: number, map: any, SW, NE) { - const topRight = map.project(NE); - const bottomLeft = map.project(SW); - const scale = 1; - const southWestToPoint = map.project(SW); - const southWestPoint = new Point(((southWestToPoint.x - bottomLeft.x) * scale) - wpad, ((southWestToPoint.y - topRight.y) * scale) + spad); - const southWestWorld = new Point(southWestPoint.x / scale + bottomLeft.x, southWestPoint.y / scale + topRight.y); - const swWorld = map.unproject(southWestWorld); - const northEastToPoint = map.project(NE); - const northEastPoint = new Point(((northEastToPoint.x - bottomLeft.x) * scale) + epad, ((northEastToPoint.y - topRight.y) * scale) - npad); - const northEastWorld = new Point(northEastPoint.x / scale + bottomLeft.x, northEastPoint.y / scale + topRight.y); - const neWorld = map.unproject(northEastWorld); - return [swWorld, neWorld]; -} - -export function project(lat: number, lng: number, zoom: number): { x: number; y: number; } { - - const R = 6378137; - const sphericalScale = 0.5 / (Math.PI * R); - const d = Math.PI / 180; - const max = 1 - 1E-15; - const sin = Math.max(Math.min(Math.sin(lat * d), max), -max); - const scale = 256 * Math.pow(2, zoom); - - const point = { - x: R * lng * d, - y: R * Math.log((1 + sin) / (1 - sin)) / 2 - }; - - point.x = tiled(scale * (sphericalScale * point.x + 0.5)); - point.y = tiled(scale * (-sphericalScale * point.y + 0.5)); - - return point; -} - -function tiled(num: number): number { - return Math.floor(num / 256); -} - -export interface MapExtend { - bounds: number[][]; - center: number[]; - zoom: number; -} - -/** - * @deprecated Use GetValuePipe instead which performs the same operation, but generically - */ -@Pipe({ name: 'getLayer' }) -export class GetLayerPipe implements PipeTransform { - public transform(value: string, layersMap?: Map): mapboxgl.Layer { - return !!layersMap ? layersMap.get(value) : undefined; - } -} - -@Pipe({ name: 'getCollection' }) -export class GetCollectionPipe implements PipeTransform { - public transform(value: string, layersMap?: Map): string { - let collection: string; - if (!!layersMap && !!layersMap.get(value).metadata) { - if (!!layersMap.get(value).metadata.collection) { - collection = layersMap.get(value).metadata.collection; - } - } - return collection; - } -} - -export interface LegendData { - minValue?: string; - maxValue?: string; - keysColorsMap?: Map; -} - -export interface Legend { - type?: PROPERTY_SELECTOR_SOURCE; - title?: string; - minValue?: string; - maxValue?: string; - fixValue?: string | number; - interpolatedValues?: Array; - manualValues?: Map; - visible?: boolean; -} - - -export enum PROPERTY_SELECTOR_SOURCE { - fix = 'Fix', - provided = 'Provided', - generated = 'Generated', - manual = 'Manual', - interpolated = 'Interpolated', - metric_on_field = 'Metric on field', - heatmap_density = 'Density' -} - -export type ArlasAnyLayer = mapboxgl.CircleLayer | mapboxgl.FillLayer | mapboxgl.HeatmapLayer | mapboxgl.LineLayer | mapboxgl.SymbolLayer; diff --git a/projects/arlas-components/src/lib/components/metrics-table/metrics-table.component.ts b/projects/arlas-components/src/lib/components/metrics-table/metrics-table.component.ts index 4b85d19d..6ffb439f 100644 --- a/projects/arlas-components/src/lib/components/metrics-table/metrics-table.component.ts +++ b/projects/arlas-components/src/lib/components/metrics-table/metrics-table.component.ts @@ -133,7 +133,7 @@ export class MetricsTableComponent implements OnInit, OnChanges { protected uniqueTitles: MetricsTableHeader[]; - public constructor(private colorService: ArlasColorService, private cdr: ChangeDetectorRef) { + public constructor(private readonly colorService: ArlasColorService, private readonly cdr: ChangeDetectorRef) { this.colorService.changekeysToColors$.subscribe(() => { this.powerBarsMap.forEach(powerbarsRow => { powerbarsRow.forEach(p => { @@ -159,7 +159,7 @@ export class MetricsTableComponent implements OnInit, OnChanges { this.ngOnInit(); } } - if (!!changes.selectedTerms) { + if (changes.selectedTerms) { this.updateSelection(this.selectedTerms); } } @@ -181,8 +181,7 @@ export class MetricsTableComponent implements OnInit, OnChanges { } }); this.titleAreDifferent = this.uniqueTitles.length === this.metricsTable?.data[0]?.data.length; - if (!this.titleAreDifferent) { - } + } private updateSelectedTermWithDefaultValue() { @@ -260,14 +259,12 @@ export class MetricsTableComponent implements OnInit, OnChanges { if (this.selectedRows.has(key)) { row.selected = false; this.selectedRows.delete(key); - } else { - if (row) { + } else if (row) { row.selected = true; this.selectedRows.set(key, row); } else { /** If we select a row that does not exists, it means we data is not */ } - } } public togglePendingMode() { diff --git a/projects/arlas-components/src/lib/components/metrics-table/multi-bars-row/metrics-table-row.component.ts b/projects/arlas-components/src/lib/components/metrics-table/multi-bars-row/metrics-table-row.component.ts index 10756f30..2a189d2c 100644 --- a/projects/arlas-components/src/lib/components/metrics-table/multi-bars-row/metrics-table-row.component.ts +++ b/projects/arlas-components/src/lib/components/metrics-table/multi-bars-row/metrics-table-row.component.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { PowerBar } from '../../powerbars/model/powerbar'; import { MetricsTableRow } from '../model/metrics-table'; @@ -27,7 +27,7 @@ import { MetricsTableRow } from '../model/metrics-table'; templateUrl: './metrics-table-row.component.html', styleUrls: ['./metrics-table-row.component.scss'] }) -export class MetricsTableRowComponent implements OnInit { +export class MetricsTableRowComponent { @Input() public displayCheckBox: boolean; @Input() public hideSelection: boolean; @Input() public metricsTableRow: MetricsTableRow; @@ -42,10 +42,6 @@ export class MetricsTableRowComponent implements OnInit { public constructor() { } - public ngOnInit(): void { - - } - public selectRow() { this.updateRowState(); } diff --git a/projects/arlas-components/src/lib/pipes/get-value/get-value.module.ts b/projects/arlas-components/src/lib/pipes/get-value/get-value.module.ts index ada1cc63..a851e179 100644 --- a/projects/arlas-components/src/lib/pipes/get-value/get-value.module.ts +++ b/projects/arlas-components/src/lib/pipes/get-value/get-value.module.ts @@ -16,11 +16,13 @@ * specific language governing permissions and limitations * under the License. */ +import { CommonModule } from '@angular/common'; import { GetValuePipe } from './get-value.pipe'; import { NgModule } from '@angular/core'; @NgModule({ imports: [ + CommonModule ], declarations: [ GetValuePipe diff --git a/projects/arlas-components/src/lib/services/mapgl.service.ts b/projects/arlas-components/src/lib/services/mapgl.service.ts deleted file mode 100644 index 4a0e9328..00000000 --- a/projects/arlas-components/src/lib/services/mapgl.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to Gisaïa under one or more contributor - * license agreements. See the NOTICE.txt file distributed with - * this work for additional information regarding copyright - * ownership. Gisaïa licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Injectable } from '@angular/core'; -import { MapSource } from '../components/mapgl/model/mapSource'; - -@Injectable({ - providedIn: 'root' -}) -export class MapglService { - - /** - * @description Add map sources - */ - public addSourcesToMap(sources: Array, map: any) { - // Add sources defined as input in mapSources; - const mapSourcesMap = new Map(); - if (sources) { - sources.forEach(mapSource => { - mapSourcesMap.set(mapSource.id, mapSource); - }); - mapSourcesMap.forEach((mapSource, id) => { - if (map.getSource(id) === undefined) { - map.addSource(id, mapSource.source); - } - }); - } - } - -} - - diff --git a/projects/arlas-components/src/public-api.ts b/projects/arlas-components/src/public-api.ts index 64737afe..90c5e061 100644 --- a/projects/arlas-components/src/public-api.ts +++ b/projects/arlas-components/src/public-api.ts @@ -26,24 +26,7 @@ export { DonutComponent } from './lib/components/donut/donut.component'; export { DonutModule } from './lib/components/donut/donut.module'; export { HistogramComponent } from './lib/components/histogram/histogram.component'; export { HistogramModule } from './lib/components/histogram/histogram.module'; -export { MapglImportComponent, MapglImportDialogComponent } from './lib/components/mapgl-import/mapgl-import.component'; -export { CoordinatesComponent } from './lib/components/mapgl/coordinates/coordinates.component'; -export { Coordinate, PointFormGroup } from './lib/tools/coordinates.tools'; export { FilterOperator } from './lib/tools/models/term-filters'; -export { MapglImportModule } from './lib/components/mapgl-import/mapgl-import.module'; -export { MapglLayerIconComponent } from './lib/components/mapgl-layer-icon/mapgl-layer-icon.component'; -export { MapglLayerIconModule } from './lib/components/mapgl-layer-icon/mapgl-layer-icon.module'; -export { - MapLayers, ARLAS_VSET, LayerEvents, FILLSTROKE_LAYER_PREFIX, ARLAS_ID, PaintValue, - ExternalEventLayer, ExternalEvent, SCROLLABLE_ARLAS_ID, FillStroke, LayerMetadata, PaintColor, HOVER_LAYER_PREFIX, SELECT_LAYER_PREFIX -} from './lib/components/mapgl/model/mapLayers'; -export { BasemapStyle } from './lib/components/mapgl/basemaps/basemap.config'; -export { MapboxBasemapService } from './lib/components/mapgl/basemaps/basemap.service'; -export { ArlasBasemaps } from './lib/components/mapgl/basemaps/basemaps'; -export { MapSource } from './lib/components/mapgl/model/mapSource'; -export { MapExtend, LegendData, Legend, PROPERTY_SELECTOR_SOURCE, ArlasAnyLayer } from './lib/components/mapgl/mapgl.component.util'; -export { AoiDimensions as AoiEdition } from './lib/components/mapgl/draw/draw.models'; -export { MapboxAoiDrawService } from './lib/components/mapgl/draw/draw.service'; export { PowerBar } from './lib/components/powerbars/model/powerbar'; export { PageEnum } from './lib/components/results/utils/enumerations/pageEnum'; export { ThumbnailFitEnum } from './lib/components/results/utils/enumerations/thumbnailFitEnum'; @@ -55,8 +38,6 @@ export { } from './lib/components/results/utils/results.utils'; export { Item, ItemDetailGroup } from './lib/components/results/model/item'; export { Column } from './lib/components/results/model/column'; -export { MapglComponent, VisualisationSetConfig, IconConfig, OnMoveResult, CROSS_LAYER_PREFIX } from './lib/components/mapgl/mapgl.component'; -export { MapglModule } from './lib/components/mapgl/mapgl.module'; export { ResultListComponent } from './lib/components/results/result-list/result-list.component'; export { ResultItemComponent } from './lib/components/results/result-item/result-item.component'; export { ResultActionsComponent } from './lib/components/results/result-actions/result-actions.component'; @@ -67,25 +48,15 @@ export { ColorGeneratorModule, ColorGeneratorModuleConfig } from './lib/services export { ArlasColorService } from './lib/services/color.generator.service'; export { CollectionService, BaseCollectionService, AwcCollectionService } from './lib/services/collection.service'; export { CollectionModule, CollectionModuleConfig } from './lib/services/collection.module'; -export { LayerIdToName } from './lib/components/mapgl-legend/layer-name.pipe'; -export { MapglLegendComponent } from './lib/components/mapgl-legend/mapgl-legend.component'; -export { MapglLegendItemComponent } from './lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component'; -export { MapglLegendModule } from './lib/components/mapgl-legend/mapgl-legend.module'; -export { MapglSettingsModule } from './lib/components/mapgl-settings/mapgl-settings.module'; export { MetricComponent } from './lib/components/metric/metric.component'; export { MetricModule } from './lib/components/metric/metric.module'; -export { BboxGeneratorComponent } from './lib/components/bbox-generator/bbox-generator.component'; -export { BboxFormErrorPipe } from './lib/components/bbox-generator/bbox-form-error.pipe'; -export { BboxGeneratorModule } from './lib/components/bbox-generator/bbox-generator.module'; export { PowerbarsComponent } from './lib/components/powerbars/powerbars.component'; export { PowerbarsModule } from './lib/components/powerbars/powerbars.module'; -export { MetricsTableModule} from './lib/components/metrics-table/metrics-table.module'; +export { MetricsTableModule } from './lib/components/metrics-table/metrics-table.module'; export { MetricsTableComponent } from './lib/components/metrics-table/metrics-table.component'; export { PowerbarComponent } from './lib/components/powerbars/powerbar/powerbar.component'; export { PowerbarModule } from './lib/components/powerbars/powerbar/powerbar.module'; -export { - MapglSettingsComponent, MapSettingsService, GeoQuery, GeometrySelectModel, OperationSelectModel, MapglSettingsDialogComponent, GeoQueryOperator -} from './lib/components/mapgl-settings/mapgl-settings.component'; + export { WmtsLayerManagerModule } from './lib/components/wmts-layer-manager/wmts-layer-manager.module'; export { WmtsLayerManagerComponent, GetTilesInfo, LayerParam, Dimension } from './lib/components/wmts-layer-manager/wmts-layer-manager.component'; export { WmtsLayerManagertDialogComponent } from './lib/components/wmts-layer-manager/wmts-layer-manager.component'; diff --git a/projects/arlas-map/README.md b/projects/arlas-map/README.md new file mode 100644 index 00000000..99c0790d --- /dev/null +++ b/projects/arlas-map/README.md @@ -0,0 +1,26 @@ +# arlas-map + +**arlas-map** is an Angular library composed of cartographical components (map, legend, basemap, draw) dedicated to display ARLAS data. + +The components are cartographical-framework-free; except for the draw where MapboxDraw is used. + +The libarary also comes with a number of services. Those services provide cartographical interfaces that should be implemented according to your chosen map framework. + + + +## Build + +On the root of this repository, run + +```shell +$ npm run build-map +``` + +## Publishing + +After building your library with `ng build arlas-map`, go to the dist folder `cd dist/arlas-map` and run `npm publish`. + +## Running unit tests + +Run `ng test arlas-map` to execute the unit tests via [Karma](https://karma-runner.github.io). + diff --git a/projects/arlas-map/assets/i18n/en.json b/projects/arlas-map/assets/i18n/en.json new file mode 100644 index 00000000..878d8fde --- /dev/null +++ b/projects/arlas-map/assets/i18n/en.json @@ -0,0 +1,87 @@ +{ + "Manage layers": "Manage map layers", + "show_layers": "Show/hide these layers", + "Geo-queries": "Geo-queries", + "of_collection": "of the {{collection}} collection", + "Apply geo-queries": "Apply", + "Set geo-queries": "Set", + "Cancel": "Cancel", + "Import file": "Import file", + "Paste your WKT": "Paste your WKT", + "Zoom to result": "Zoom to result", + "Max:": "Max:", + "Import": "Import", + "Collection:": "Collection: {{collection}}", + "Download the layer's data": "Download the layer's data", + "CSV": "CSV", + "GeoJson": "GeoJson", + "Fill:": "Fill: ", + "Stroke:": "Stroke: ", + "Width:": "Width: ", + "Radius:": "Radius: ", + "Enter coordinates and centre the map": "Enter coordinates and centre the map", + "Lat:": "Lat:", + "Lng:": "Lng:", + "Latitude": "Latitude", + "Longitude": "Longitude", + "Move to": "Centre", + "BBox generator": "Generate a bbox", + "First corner": "First corner", + "Second corner": "Second corner", + "Close": "Close", + "Generate AOI": "Generate the bbox", + "Draw a bbox or a polygon that": "Draw a bbox or a polygon that", + "shp": "Shape", + "kml": "KML / KMZ", + "wkt": "WKT", + "geojson": "GeoJson", + "Geometry is not valid due to self-intersection": "Geometry is not valid due to self-intersection", + "Problem parsing input file": "Problem parsing input file", + "File is too large": "File is too large", + "Geometry is not valid": "Geometry is not valid", + "Too many vertices in a polygon": "Too many vertices in a polygon", + "Too many features": "Too many features", + "Timeout": "Timeout", + "Only `kml` or `zip` file is allowed": "Only `kml` or `zip` file is allowed", + "Only `json` or `geojson` file is allowed": "Only `json` or `geojson` file is allowed", + "File is empty": "File is empty", + "Only `zip` file is allowed": "Only `zip` file is allowed", + "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` OR a `*.json`", + "No polygon to display in this file": "No polygon to display in this file", + "Zoom in": "Zoom in", + "Zoom out": "Zoom out", + "Reset bearing to north": "Reset bearing to north", + "Toggle Pitch": "Toggle pitch", + "other_color": "Other", + "Start draging to draw a bbox.": "Start draging to draw a bbox.", + "Draw at least 2 points.": "Draw at least 2 points.", + "Invalid geometry": "Invalid geometry", + "Ok": "Ok", + "Double click to finish drawing": "Double click to finish drawing", + "1.1 or 1°6'3\"": "1.1 or 1°6'3\"", + "You must enter a coordinate": "Enter a coordinate", + "Enter coordinates in decimal or sexagesimal degrees": "Enter coordinates in decimal or sexagesimal degrees.", + "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Decimal: 1.1 or Sexagesimal: 1°6'3\" coordinate", + "Both corners have the same latitudes, modify one of them.": "Both corners have the same latitudes, modify one of them.", + "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")", + "avg": "Average", + "sum": "Sum", + "min": "Minimum", + "max": "Maximum", + "cardinality": "Cardinality", + "count": "Count", + "legend without metric": "{{field}} ({{normalized}})", + "legend": "{{metric}} of {{field}} ({{normalized}})", + "legend without normalized": "{{metric}} of {{field}}", + "legend without field": "{{metric}} ({{normalized}})", + "normalized by key": "normalized by {{normalizedKey}}", + "normalized": "normalized", + "Column": "Column", + "Direction": "Direction", + "ASC_short": "↑", + "DESC_short": "↓", + "Show": "Show", + "Download": "Download", + "None": "None", + "Heatmap-density": "Density" +} \ No newline at end of file diff --git a/projects/arlas-map/assets/i18n/es.json b/projects/arlas-map/assets/i18n/es.json new file mode 100644 index 00000000..4ea86d97 --- /dev/null +++ b/projects/arlas-map/assets/i18n/es.json @@ -0,0 +1,87 @@ +{ + "Manage layers": "Gestionar las capas", + "show_layers": "Mostrar/ocultar estas capas", + "Geo-queries": "Peticiones geográficas", + "of_collection": "de la colección {{collection}}", + "Apply geo-queries": "Ejecutar", + "Set geo-queries": "Ok", + "Cancel": "Cerrar", + "Import file": "Importar un archivo", + "Paste your WKT": "Pegar aquí su WKT", + "Zoom to result": "Zoom a la geometría", + "Max:": "Max:", + "Import": "Importar", + "Collection:": "Colección: {{collection}}", + "Download the layer's data": "Descargar los datos de la capa", + "CSV": "CSV", + "GeoJson": "GeoJson", + "Fill:": "Relleno: ", + "Stroke:": "Trazo: ", + "Width:": "Anchura: ", + "Radius:": "Radio: ", + "Enter coordinates and centre the map": "Introduzca las coordenadas y centre el mapa.", + "Lat:": "Lat:", + "Lng:": "Lng:", + "Latitude": "Latitud", + "Longitude": "Longitud", + "Move to": "Mover a", + "BBox generator": "Generar un cuadro delimitador", + "First corner": "Primera esquina", + "Second corner": "Segunda esquina", + "Close": "Cerrar", + "Generate AOI": "Generar el cuadro delimitador", + "Draw a bbox or a polygon that": "Dibuje un cuadro delimitador o polígono que", + "shp": "Shape", + "kml": "KML / KMZ", + "wkt": "WKT", + "geojson": "GeoJson", + "Geometry is not valid due to self-intersection": "La geometría no es válida porque se cruza a sí misma", + "Problem parsing input file": "Error al analizar el archivo de entrada", + "File is too large": "El archivo es demasiado grande.", + "Geometry is not valid": "La geometría no es válida", + "Too many vertices in a polygon": "Un polígono contiene demasiados vértices.", + "Too many features": "El archivo contiene demasiados elementos.", + "Timeout": "Tiempo de espera superado", + "Only `kml` or `zip` file is allowed": "Sólo se admiten archivos `kml` o `zip`", + "Only `json` or `geojson` file is allowed": "Sólo se admiten archivos `json` o `geojson`", + "File is empty": "El archivo está vacío", + "Only `zip` file is allowed": "Sólo se aceptan archivos `zip`", + "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "El archivo zip debe contener al menos un archivo `*.shp`, `*.shx` y `*.dbf` O un archivo `*.json`.", + "No polygon to display in this file": "No hay polígonos para mostrar", + "Zoom in": "Acercarse", + "Zoom out": "Alejarse", + "Reset bearing to north": "Restablecer el rumbo al norte", + "Toggle Pitch": "Activar/Quitar inclinación del mapa", + "other_color": "Otro", + "Start draging to draw a bbox.": "Empezar a arrastrar para dibujar un cuadro delimitador.", + "Draw at least 2 points.": "Empatar al menos a 2 puntos", + "Invalid geometry": "Geometría inválida", + "Ok": "Ok", + "Double click to finish drawing": "Haga doble clic para finalizar", + "1.1 or 1°6'3\"": "1.1 o 1°6'3\"", + "You must enter a coordinate": "Introduzca una coordenada", + "Enter coordinates in decimal or sexagesimal degrees": "Introduzca las coordenadas en grados decimales o sexagesimales.", + "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Coordenada en decimal: 1,1 o sexagesimal: 1°6'3\".", + "Both corners have the same latitudes, modify one of them.": "Las dos esquinas tienen la misma latitud, así que cambia una de ellas.", + "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Introduzca una coordenada en decimal (1,1) o sexagesimal (1° 6' 3\").", + "avg": "Media", + "sum": "Suma", + "min": "Mínimo", + "max": "Máximo", + "cardinality": "Cardinalidad", + "count": "Recuento", + "legend without metric": "{{field}} ({{normalized}})", + "legend": "{{metric}} de los {{field}} ({{normalized}})", + "legend without normalized": "{{metric}} de los {{field}}", + "legend without field": "{{metric}} ({{normalized}})", + "normalized by key": "normalizado por {{normalizedKey}}", + "normalized": "normalizado", + "Column": "Columna", + "Direction": "Dirección", + "ASC_short": "↑", + "DESC_short": "↓", + "Show": "Mostrar", + "Download": "Descargar", + "None": "Ninguna", + "Heatmap-density": "Densidad" +} \ No newline at end of file diff --git a/projects/arlas-map/assets/i18n/fr.json b/projects/arlas-map/assets/i18n/fr.json new file mode 100644 index 00000000..79bf1a22 --- /dev/null +++ b/projects/arlas-map/assets/i18n/fr.json @@ -0,0 +1,87 @@ +{ + "Manage layers": "Gérer les couches cartographiques", + "show_layers": "Afficher/masquer ces couches", + "Geo-queries": "Requêtes géographiques", + "of_collection": "de la collection {{collection}}", + "Apply geo-queries": "Appliquer", + "Set geo-queries": "Ok", + "Cancel": "Fermer", + "Import file": "Importer un fichier", + "Paste your WKT": "Coller ici votre WKT", + "Zoom to result": "Zoomer sur le résultat", + "Max:": "Max :", + "Import": "Importer", + "Collection:": "Collection: {{collection}}", + "Download the layer's data": "Télécharger les données de la couche", + "CSV": "CSV", + "GeoJson": "GeoJson", + "Fill:": "Remplissage : ", + "Stroke:": "Trait : ", + "Width:": "Epaisseur : ", + "Radius:": "Rayon : ", + "Enter coordinates and centre the map": "Saisir des coordonnées et centrer la carte", + "Lat:": "Lat :", + "Lng:": "Lng :", + "Latitude": "Latitude", + "Longitude": "Longitude", + "Move to": "Centrer", + "BBox generator": "Générer une bbox", + "First corner": "Premier coin", + "Second corner": "Deuxième coin", + "Close": "Fermer", + "Generate AOI": "Générer la bbox", + "Draw a bbox or a polygon that": "Dessiner une bbox ou un polygone qui", + "shp": "Shape", + "kml": "KML / KMZ", + "wkt": "WKT", + "geojson": "GeoJson", + "Geometry is not valid due to self-intersection": "La géométrie n'est pas valide à cause d'une auto-intersection", + "Problem parsing input file": "Erreur dans le parcours du fichier d'entrée", + "File is too large": "Le fichier est trop volumineux", + "Geometry is not valid": "La géométrie n'est pas valide", + "Too many vertices in a polygon": "Un polygone contient trop de sommets", + "Too many features": "Le fichier contient trop d'éléments", + "Timeout": "Temps d'attente dépassé", + "Only `kml` or `zip` file is allowed": "Seulement les fichiers `kml` ou `zip` sont autorisés.", + "Only `json` or `geojson` file is allowed": "Seulement les fichiers `json` ou `geojson` sont autorisés.", + "File is empty": "Le fichier est vide.", + "Only `zip` file is allowed": "Seulement les fichiers `zip` sont acceptés", + "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "Le fichier zip doit contenir au minimum un fichier `*.shp`, `*.shx` et `*.dbf` OU un fichier `*.json`", + "No polygon to display in this file": "Aucun polygone à afficher", + "Zoom in": "Zoomer", + "Zoom out": "Dézoomer", + "Reset bearing to north": "Réinitialiser l'orientation vers le nord", + "Toggle Pitch": "Activer/Enlever l'inclinaison", + "other_color": "Autre", + "Start draging to draw a bbox.": "Commencez à tirer pour dessiner une bbox.", + "Draw at least 2 points.": "Dessinez au moins 2 points.", + "Invalid geometry": "Géométrie invalide", + "Ok": "Ok", + "Double click to finish drawing": "Double-cliquez pour finir le dessin", + "1.1 or 1°6'3\"": "1.1 ou 1°6'3\"", + "You must enter a coordinate": "Saisir une coordonnée", + "Enter coordinates in decimal or sexagesimal degrees": "Saisir les coordonnées en degrés décimaux ou sexagésimaux.", + "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Coordonnée en décimal: 1.1 ou en sexagésimal: 1°6'3\"", + "Both corners have the same latitudes, modify one of them.": "Les deux coins ont la même latitude, modifiez l'une d'entre elles.", + "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Saisir une coordonnée en décimal (1.1) ou en sexagésimal (1° 6' 3\")", + "avg": "Moyenne", + "sum": "Somme", + "min": "Minimum", + "max": "Maximum", + "cardinality": "Cardinalité", + "count": "Compte", + "legend without metric": "{{field}} ({{normalized}})", + "legend": "{{metric}} des {{field}} ({{normalized}})", + "legend without normalized": "{{metric}} des {{field}}", + "legend without field": "{{metric}} ({{normalized}})", + "normalized by key": "normalisé par {{normalizedKey}}", + "normalized": "normalisé", + "Column": "Colonne", + "Direction": "Sens", + "ASC_short": "↑", + "DESC_short": "↓", + "Show": "Afficher", + "Download": "Télécharger", + "None": "Aucune", + "Heatmap-density": "Densité" +} \ No newline at end of file diff --git a/projects/arlas-map/assets/i18n/template.json b/projects/arlas-map/assets/i18n/template.json new file mode 100644 index 00000000..022f6284 --- /dev/null +++ b/projects/arlas-map/assets/i18n/template.json @@ -0,0 +1,67 @@ +{ + "Manage layers": "Manage layers", + "show_layers": "show_layers", + "Geo-queries": "Geo-queries", + "of_collection": "of_collection", + "Apply geo-queries": "Apply geo-queries", + "Set geo-queries": "Set geo-queries", + "Cancel": "Cancel", + "Import file": "Import file", + "Paste your WKT": "Paste your WKT", + "Zoom to result": "Zoom to result", + "Max:": "Max:", + "Import": "Import", + "Collection:": "Collection:", + "Download the layer's data": "Download the layer's data", + "CSV": "CSV", + "GeoJson": "GeoJson", + "Fill:": "Fill:", + "Stroke:": "Stroke:", + "Width:": "Width:", + "Radius:": "Radius:", + "Enter coordinates and centre the map": "Enter coordinates and centre the map", + "Lat:": "Lat:", + "Lng:": "Lng:", + "Latitude": "Latitude", + "Longitude": "Longitude", + "Move to": "Move to", + "BBox generator": "BBox generator", + "First corner": "First corner", + "Second corner": "Second corner", + "Close": "Close", + "Generate AOI": "Generate AOI", + "Draw a bbox or a polygon that": "Draw a bbox or a polygon that", + "shp": "shp", + "kml": "kml", + "wkt": "wkt", + "geojson": "geojson", + "Geometry is not valid due to self-intersection": "Geometry is not valid due to self-intersection", + "Problem parsing input file": "Problem parsing input file", + "File is too large": "File is too large", + "Geometry is not valid": "Geometry is not valid", + "Too many vertices in a polygon": "Too many vertices in a polygon", + "Too many features": "Too many features", + "Timeout": "Timeout", + "Only `kml` or `zip` file is allowed": "Only `kml` or `zip` file is allowed", + "Only `json` or `geojson` file is allowed": "Only `json` or `geojson` file is allowed", + "File is empty": "File is empty", + "Only `zip` file is allowed": "Only `zip` file is allowed", + "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`": "Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`", + "No polygon to display in this file": "No polygon to display in this file", + "Zoom in": "Zoom in", + "Zoom out": "Zoom out", + "Reset bearing to north": "Reset bearing to north", + "Toggle Pitch": "Toggle Pitch", + "other_color": "other_color", + "Start draging to draw a bbox.": "Start draging to draw a bbox.", + "Draw at least 2 points.": "Draw at least 2 points.", + "Invalid geometry": "Invalid geometry", + "Ok": "Ok", + "Double click to finish drawing": "Double click to finish drawing", + "1.1 or 1°6'3\"": "1.1 or 1°6'3\"", + "You must enter a coordinate": "You must enter a coordinate", + "Enter coordinates in decimal or sexagesimal degrees": "Enter coordinates in decimal or sexagesimal degrees", + "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate": "Decimal: 1.1 or Sexagesimal 1°6'3\" coordinate", + "Both corners have the same latitudes, modify one of them.": "Both corners have the same latitudes, modify one of them.", + "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")": "Enter a coordinate in decimal (1.1) or sexagesimal (1° 6' 3\")" +} \ No newline at end of file diff --git a/projects/arlas-map/assets/styles/sizes.scss b/projects/arlas-map/assets/styles/sizes.scss new file mode 100644 index 00000000..8f444ced --- /dev/null +++ b/projects/arlas-map/assets/styles/sizes.scss @@ -0,0 +1,25 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** Font sizes **/ +$xxs-font-size: 9px; +$xs-font-size: 10px; +$sm-font-size: 12px; +$default-font-size: 14px; +$title-font-size: 18px; \ No newline at end of file diff --git a/projects/arlas-map/ng-package.json b/projects/arlas-map/ng-package.json new file mode 100644 index 00000000..a658bd33 --- /dev/null +++ b/projects/arlas-map/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/arlas-map", + "allowedNonPeerDependencies": ["."], + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/arlas-map/package.json b/projects/arlas-map/package.json new file mode 100644 index 00000000..8c6aaeb0 --- /dev/null +++ b/projects/arlas-map/package.json @@ -0,0 +1,48 @@ +{ + "name": "arlas-map", + "version": "27.0.0-z-rc.0", + "peerDependencies": { + "@angular/animations": "^18.2.13", + "@angular/cdk": "^18.2.14", + "@angular/common": "^18.2.13", + "@angular/compiler": "^18.2.13", + "@angular/core": "^18.2.13", + "@angular/forms": "^18.2.13", + "@angular/material": "^18.2.14", + "@angular/platform-browser": "^18.2.13", + "@angular/platform-browser-dynamic": "^18.2.13", + "@angular/router": "^18.2.13", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0", + "zone.js": "^0.14.0" + }, + "dependencies": { + "@mapbox/mapbox-gl-draw": "^1.4.3", + "@mapbox/mapbox-gl-draw-static-mode": "^1.0.1", + "@tmcw/togeojson": "~5.5.0", + "@turf/area": "^6.5.0", + "@turf/bbox": "^6.5.0", + "@turf/center": "^6.5.0", + "@turf/centroid": "^6.5.0", + "@turf/circle": "^6.5.0", + "@turf/clean-coords": "^7.0.0", + "@turf/helpers": "^6.5.0", + "@turf/length": "^6.5.0", + "@turf/midpoint": "^6.5.0", + "@turf/rhumb-bearing": "^6.5.0", + "@turf/rhumb-destination": "^6.5.0", + "@turf/transform-rotate": "^6.5.0", + "@turf/transform-translate": "^6.5.0", + "arlas-web-components": "~27.0.0-z-rc.0", + "geojson-polygon-self-intersections": "1.2.1", + "geojson-validation": "0.2.1", + "jsts": "2.1.0", + "jszip": "^3.2.1", + "pmtiles": "^2.11.0", + "rxjs": "^7.4.0", + "shpjs": "^4.0.4", + "tslib": "^2.3.0", + "turf-extent": "1.0.4", + "wellknown": "0.5.0" + } +} diff --git a/projects/arlas-map/src/lib/arlas-map-framework.service.ts b/projects/arlas-map/src/lib/arlas-map-framework.service.ts new file mode 100644 index 00000000..f6c21b56 --- /dev/null +++ b/projects/arlas-map/src/lib/arlas-map-framework.service.ts @@ -0,0 +1,146 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { AbstractArlasMapGL, MapConfig } from './map/AbstractArlasMapGL'; +import { AbstractDraw } from './draw/AbstractDraw'; +import { ArlasLngLat, ArlasLngLatBounds } from './map/model/map'; +import { FeatureCollection } from '@turf/helpers'; +import { VectorStyle } from './map/model/vector-style'; +import { ArlasPoint } from './map/model/geometry'; +import { MapLayerMouseEvent } from './map/model/events'; + +/** + * This service exposes a list of map interaction methods that are abstract. + * Theses methods will be implemented by the chosen cartographical framework to use. + */ +@Injectable({ + providedIn: 'root' +}) +/** L: a layer class/interface. + * S: a source class/interface. + * M: a Map configuration class/interface. + */ +export abstract class ArlasMapFrameworkService { + + public constructor() { } + + public abstract getInitTransformRequest(): Function; + + public abstract createMap(config: MapConfig): AbstractArlasMapGL; + + public abstract createDraw(drawOptions, enabled: boolean, map: AbstractArlasMapGL): AbstractDraw; + + /** + * @description Gets the bounds from the two given coordinates. + * @param c1 Coordinates of the first corner. + * @param c2 Coordinates of the second corner. + * @returns Bounds formed from the two given coordinates. + */ + public getLngLatBound(c1: ArlasLngLat, c2: ArlasLngLat): ArlasLngLatBounds { + return new ArlasLngLatBounds(c1, c2); + } + + /** + * Fits the map to its current bounds. To be used when a map container is resized. + * @param map Map instance. + */ + public abstract fitMapBounds(map: AbstractArlasMapGL); + + public abstract getBoundsAsString(map: AbstractArlasMapGL): string; + + /** + * @description Gets the Point (geometry) from mouse click on the screen. + * @param mouseEvent Click mouse event. + * @param container Map container. + * @returns a Point instance. + */ + public abstract getPointFromScreen(mouseEvent: MouseEvent, container: HTMLElement): ArlasPoint; + + /** + * @description Sets `data` to a Geojson `source` of the map + * @param source A Geojson source + * @param data A feature collection object. + */ + public abstract setDataToGeojsonSource(source: S | string, data: FeatureCollection); + + + /** + * Returns the canvas element of the map + * @param map Map instance. + */ + public abstract getCanvas(map: AbstractArlasMapGL): HTMLCanvasElement; + + public abstract addImage(name: string, url: string, map: AbstractArlasMapGL, errorMessage: string, opt?: any); + + /** + * @description Adds a layer to the map instance. + * @param map Map instance. + * @param layer A layer. It could be a layer identifier OR a layer object (it will depend on the framwork implementation). + * @param beforeId Identifier of an already added layer. The 'layer' is added under this 'beforeId' layer. + */ + public abstract addLayer(map: AbstractArlasMapGL, layer: L, beforeId?: L | string); + + public abstract getLayersFromPattern(map: AbstractArlasMapGL, layersIdPattern: string): L[]; + public abstract getAllLayers(map: AbstractArlasMapGL): L[]; + + public abstract hasLayer(map: AbstractArlasMapGL, layer: L | string); + public abstract hasLayersFromPattern(map: AbstractArlasMapGL, layersIdPattern: string); + public abstract moveLayer(map: AbstractArlasMapGL, layer: L | string, beforeId?: string); + public abstract onLayerEvent(eventName: string, map: AbstractArlasMapGL, layer: any, fn: (e) => void); + public abstract removeLayer(map: AbstractArlasMapGL, layer: L | string); + public abstract removeLayers(map: AbstractArlasMapGL, layers: L[] | string[]); + public abstract removeLayersFromPattern(map: AbstractArlasMapGL, layersIdPattern: string); + public abstract setLayerVisibility(layer: L | string, isVisible: boolean, map: AbstractArlasMapGL); + public abstract isLayerVisible(layer: L | string): boolean; + public abstract getLayer(map: AbstractArlasMapGL, layerId: string): L; + + + public abstract queryFeatures(mouseEvent: MapLayerMouseEvent, map: AbstractArlasMapGL, layersIdPattern: string, options?: any); + public abstract hasSource(map: AbstractArlasMapGL, source: L | AbstractArlasMapGL | string); + public abstract getSource(sourceId: string, options: L | AbstractArlasMapGL | string): S; + public abstract getAllSources(options: L | AbstractArlasMapGL | string): S[]; + public abstract setSource(sourceId: string, source: S, options: L | AbstractArlasMapGL | string); + public abstract removeSource(map: AbstractArlasMapGL, source: S | string); + + public abstract addPopup(map: AbstractArlasMapGL, popup: any); + public abstract createPopup(lng: number, lat: number, message: string); + public abstract removePopup(map: AbstractArlasMapGL, popup: any); + + public abstract onMapEvent(eventName: any, map: AbstractArlasMapGL, fn: (e) => void); + public abstract setMapCursor(map: AbstractArlasMapGL, cursor: string): void; + public abstract flyTo(lat: number, lng: number, zoom: number, map: AbstractArlasMapGL); + + public abstract addIconLayer(map: AbstractArlasMapGL, layerId: string, iconName: string, + iconSize: number, data: GeoJSON.Feature | GeoJSON.FeatureCollection); + public abstract addRasterLayer(map: AbstractArlasMapGL, layerId: string, url: string, bounds: number[], + maxZoom: number, minZoom: number, tileSize: number, beforeId?: string): void; + + public abstract addGeojsonLayer(map: AbstractArlasMapGL, layerId: string, style: VectorStyle, + data: GeoJSON.Feature | GeoJSON.FeatureCollection + ): void; + + + public abstract filterGeojsonData(map: AbstractArlasMapGL, layer: L | string, filter: any); + + public abstract createGeojsonSource(data: GeoJSON.GeoJSON): S; + public abstract createRasterSource(url: string, bounds: number[], + maxZoom: number, minZoom: number, tileSize: number): S; + +} diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.html b/projects/arlas-map/src/lib/arlas-map.component.html similarity index 58% rename from projects/arlas-components/src/lib/components/mapgl/mapgl.component.html rename to projects/arlas-map/src/lib/arlas-map.component.html index 05a9b25f..f27ea7fb 100644 --- a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.html +++ b/projects/arlas-map/src/lib/arlas-map.component.html @@ -1,7 +1,7 @@
- layers + layers
@@ -14,15 +14,15 @@
+ [class.cdk-visually-hidden]="((visu.name + ':arlas_vset:' + l) | getValue:visibilityStatus) !== true">
drag_indicator
- + (downloadSourceEmitter)="downloadLayerSource($event)">
@@ -30,10 +30,15 @@
- + - -
{{FINISH_DRAWING | translate}}
+ + + + \ No newline at end of file diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.scss b/projects/arlas-map/src/lib/arlas-map.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl/mapgl.component.scss rename to projects/arlas-map/src/lib/arlas-map.component.scss diff --git a/projects/arlas-map/src/lib/arlas-map.component.spec.ts b/projects/arlas-map/src/lib/arlas-map.component.spec.ts new file mode 100644 index 00000000..80c7ef5f --- /dev/null +++ b/projects/arlas-map/src/lib/arlas-map.component.spec.ts @@ -0,0 +1,46 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { ArlasMapComponent } from './arlas-map.component'; +import { MapboxAoiDrawService } from './draw/draw.service'; +import { BasemapService } from './basemaps/basemap.service'; +import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { TranslateFakeLoader, TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { from } from 'rxjs'; + +describe('ArlasMapComponent', () => { + let component: ArlasMapComponent; + let fixture: ComponentFixture>; + + beforeEach(waitForAsync(() => { + + const mockBasemapService = jasmine.createSpyObj('BasemapService', ['fetchSources$', 'setBasemaps'], { + protomapBasemapAdded$: from('') + }); + mockBasemapService.fetchSources$.and.returnValue(from('')); + + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: TranslateFakeLoader } }), + ], + declarations: [ ArlasMapComponent ], + providers: [ + MapboxAoiDrawService, + { + provide: BasemapService, + useValue: mockBasemapService + }, + HttpClient, + provideHttpClient(withInterceptorsFromDi()) + ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ArlasMapComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/arlas-map/src/lib/arlas-map.component.ts b/projects/arlas-map/src/lib/arlas-map.component.ts new file mode 100644 index 00000000..bea4b888 --- /dev/null +++ b/projects/arlas-map/src/lib/arlas-map.component.ts @@ -0,0 +1,658 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { Component, EventEmitter, Input, Output, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { TranslateService } from '@ngx-translate/core'; +import { Feature, FeatureCollection } from '@turf/helpers'; +import { ElementIdentifier } from 'arlas-web-components'; +import { finalize, fromEvent, Subject, takeUntil } from 'rxjs'; +import { ArlasMapFrameworkService } from './arlas-map-framework.service'; +import * as mapJsonSchema from './arlas-map.schema.json'; +import { AbstractArlasMapService } from './arlas-map.service'; +import { BasemapStyle } from './basemaps/basemap.config'; +import { BasemapService } from './basemaps/basemap.service'; +import { ArlasBasemaps } from './basemaps/basemaps.model'; +import { ArlasDrawComponent } from './draw/arlas-draw.component'; +import { AoiDimensions } from './draw/draw.models'; +import { MapboxAoiDrawService } from './draw/draw.service'; +import { LegendData } from './legend/legend.config'; +import { + AbstractArlasMapGL, + ArlasMapOffset, + CROSS_LAYER_PREFIX, + MapConfig, + RESET_BEARING, + ZOOM_IN, ZOOM_OUT +} from './map/AbstractArlasMapGL'; +import { ControlPosition, IconConfig } from './map/model/controls'; +import { MapLayerMouseEvent, MapMouseEvent } from './map/model/events'; +import { MapExtent } from './map/model/extent'; +import { ARLAS_VSET, ArlasDataLayer, getLayerName, MapLayers } from './map/model/layers'; +import { ArlasLngLatBounds, OnMoveResult } from './map/model/map'; +import { ArlasMapSource } from './map/model/sources'; +import { VisualisationSetConfig } from './map/model/visualisationsets'; + +@Component({ + selector: 'arlas-map', + templateUrl: './arlas-map.component.html', + styleUrls: ['./arlas-map.component.scss'], + encapsulation: ViewEncapsulation.None +}) +/** L: a layer class/interface. + * S: a source class/interface. + * M: a Map configuration class/interface. + */ +export class ArlasMapComponent { + + /** Map instance. */ + public map: AbstractArlasMapGL; + /** Whether the legend is visible (open) or not.*/ + public legendOpen = true; + /** Used to clear geojson sources. */ + public emptyData: FeatureCollection = { + 'type': 'FeatureCollection', + 'features': [] + }; + + /** Whether the list of basemaps is shown. */ + public showBasemapList = false; + + /** Visibility status of each visualisation set*. */ + public visibilityStatus = new Map(); + private readonly _onDestroy$ = new Subject(); + + + @ViewChild('drawComponent', { static: false }) public drawComponent: ArlasDrawComponent; + + + /** ANGULAR INPUTS */ + + /** @description Html identifier given to the map container (it's a div ;))*/ + @Input() public id = 'mapgl'; + /** @description An object with north,east,south,west properies which represent an offset in pixels */ + /** Origin is top-left and x-axis is west to east and y-axis north to south.*/ + @Input() public offset: ArlasMapOffset = { north: 0, east: 0, south: 0, west: 0 }; + + /** --- LAYERS */ + + /** @description List of configured (by the builder) layers. */ + @Input() public mapLayers: MapLayers; + + /** --- SCALE & COORDINATES */ + + /** @description Whether the map scale is displayed. */ + @Input() public displayScale = true; + /** @description Maximim width in pixels that the map scale could take. */ + @Input() public maxWidthScale = 100; + /** @description Unit display for the map scale. */ + @Input() public unitScale = 'metric'; + /** @description Whether to display the coordinates of the mouse while moving. */ + @Input() public displayCurrentCoordinates = false; + /** @description If true, the coordinates values are wrapped between -180 and 180. */ + @Input() public wrapLatLng = true; + + /** --- BASEMAPS */ + + /** @description Default basemap to display. */ + @Input() public defaultBasemapStyle: BasemapStyle; + /** @description List of available basemaps. */ + @Input() public basemapStyles = new Array(); + + /** --- INITIAL MAP VIEW : ZOOMs, CENTER, BOUNDS */ + + /** @description Zoom of the map when it's initialized. */ + @Input() public initZoom = 2; + /** @description Max zoom of the map. */ + @Input() public maxZoom = 22; + /** @description Min zoom of the map. */ + @Input() public minZoom = 0; + /** @description Coordinates of the map's center when it's first loaded. */ + @Input() public initCenter: [number, number] = [2.1972656250000004, 45.706179285330855]; + + /** --- BOUNDS TO FIT STRATEGY */ + + /** @description Bounds that the view map fits. It's an array of two corners. */ + /** Each corner is an lat-long position. For example: boundsToFit = [[30.51, -54.3],[30.57, -54.2]] */ + @Input() public boundsToFit: Array>; + /** @description The padding added in the top-left and bottom-right corners of a map container that shouldn't be accounted */ + /** for when setting the view to fit bounds.*/ + @Input() public fitBoundsOffSet: [number, number] = [0, 0]; + /** @description Padding value applied around a fitBounds to fully show the area targeted. */ + @Input() public fitBoundsPadding = 10; + /** @description The maximum zoom level so that the bounds fit the map view. */ + @Input() public fitBoundsMaxZoom = 22; + + /** --- DATA LOADING STRATEGIES */ + + /** @description Margin applied to the map extent. Data will be fetched in all this extent. */ + @Input() public margePanForLoad: number; + /** @description Margin applied to the map extent. Before loading data, + * the components checks first if there are features already loaded in this extent. */ + @Input() public margePanForTest: number; + /** @description A callback run before the Map makes a request for an external URL/ */ + @Input() public transformRequest: unknown /** TransformRequestFunction or RequestTransformRequest */; + + /** --- MAP INTERACTION */ + + /** @description Feature to highlight. */ + @Input() public featureToHightLight: { isleaving: boolean; elementidentifier: ElementIdentifier; }; + /** @description List of features to select. */ + @Input() public featuresToSelect: Array; + + /** --- SOURCES */ + + /** @description List of sources to add to the map. */ + @Input() public mapSources: Array>; + /** @description Subject to which the component subscribes to redraw on the map the `data` of the given `source`. */ + @Input() public redrawSource = new Subject<{ source: string; data: Feature[]; }>(); + /** @description List of data sources names that should be added to the map. Sources should be of type `geojson`. */ + @Input() public dataSources: Set; + + /** --- DRAW */ + + /** @description Options object for draw tools : https://github.com/mapbox/mapbox-gl-draw/blob/master/docs/API.md#options */ + @Input() public drawOption: any = {}; + /** @description Features drawn at component start */ + @Input() public drawData: FeatureCollection = ({ ...this.emptyData}); + /** @description Whether the draw tools are activated. */ + @Input() public drawButtonEnabled = false; + /** @description Maximum number of vertices allowed for a polygon. */ + @Input() public drawPolygonVerticesLimit: number; + /** @description Whether the drawing buffer is activated */ + /** If true, the map's canvas can be exported to a PNG using map.getCanvas().toDataURL(). Default: false */ + @Input() public preserveDrawingBuffer = false; + + /** --- ATTRIBUTION */ + + /** @description Position of the map attribution. */ + @Input() public mapAttributionPosition: ControlPosition = 'bottom-right'; + + /** --- MAP ICONS */ + + /** @description List of icons to add to the map and that can be used in layers. */ + @Input() public icons: Array; + + /** --- LEGEND AND VISUALISATIONS */ + + /** @description Subject of [collection, [field, legendData]] map. The map subscribes to it to keep */ + /** the legend updated with the data displayed on the map. */ + @Input() public legendUpdater: Subject>> = new Subject(); + /** @description Subject of [layerId, boolean] map. The map subscribes to it to keep */ + /** the legend updated with the visibility of the layer.*/ + @Input() public visibilityUpdater: Subject> = new Subject(); + /** @description List of visualisation sets. A Visualisation set is an entity where layers are grouped together. */ + /** If a visualisation set is enabled, all the layers in it can be displayed on the map, otherwise the layers are removed from the map. */ + @Input() public visualisationSetsConfig: Array; + + + /** ANGULAR OUTPUTS */ + + /** @description Emits true after the map is loaded and all sources & layers are added. */ + @Output() public onMapLoaded: Subject = new Subject(); + + /** @description Emits the map extent when the browser tab is closed/refreshed. */ + @Output() public onMapClosed: EventEmitter = new EventEmitter(); + + /** + * @deprecated + * @description Emits the event of moving the map. */ + @Output() public onMove: EventEmitter = new EventEmitter(); + + /** @description Emits the visible visualisation sets' names */ + @Output() public visualisations: EventEmitter> = new EventEmitter(); + + /** @description Emits the features that were clicked on. */ + @Output() public onFeatureClick = new EventEmitter<{ features: Array>; point: [number, number]; }>(); + + /** @description Emits the features that were hovered. */ + @Output() public onFeatureHover = new EventEmitter<{ features: Array>; point: [number, number]; } | {}>(); + + /** @description Emits the geojson of all aois added to the map. */ + @Output() public onAoiChanged: EventEmitter> = new EventEmitter(); + + /** @description Emits the the dimensions of the polygon/bbox that is being drawn. */ + @Output() public onAoiEdit: EventEmitter = new EventEmitter(); + + /** @description Emits an event when the basemap has been changed by the user. */ + @Output() public onBasemapChanged: Subject = new Subject(); + + /** @description Emits which layers are displayed on the map. */ + @Output() public legendVisibiltyStatus: Subject> = new Subject(); + + /** @description Notifies that the user wants to download the selected layer */ + @Output() public downloadSourceEmitter: Subject<{ + layerId: string; + layerName: string; + collection: string; + sourceName: string; + downloadType: string; + }> = new Subject(); + + protected ICONS_BASE_PATH = 'assets/icons/'; + + public constructor(private readonly drawService: MapboxAoiDrawService, + private readonly basemapService: BasemapService, private readonly translate: TranslateService, + protected mapFrameworkService: ArlasMapFrameworkService, + protected mapService: AbstractArlasMapService) { + this.basemapService.protomapBasemapAdded$.pipe(takeUntilDestroyed()) + .subscribe(() => this.reorderLayers()); + } + + public ngAfterViewInit() { + /** init values */ + if (!this.initCenter) { + this.initCenter = [0, 0]; + } + if (this.initZoom === undefined || this.initZoom === null) { + this.initZoom = 3; + } + if (this.maxZoom === undefined || this.maxZoom === null) { + this.maxZoom = 23; + } + if (this.minZoom === undefined || this.minZoom === null) { + this.maxZoom = 0; + } + /** BASEMAPS */ + if (this.defaultBasemapStyle && typeof this.defaultBasemapStyle.styleFile === 'string') { + this.defaultBasemapStyle.url = this.defaultBasemapStyle.styleFile; + } + this.basemapStyles.forEach(bm => { + if (typeof bm.styleFile === 'string') { + bm.url = (bm.styleFile); + } + }); + this.basemapService.setBasemaps(new ArlasBasemaps(this.defaultBasemapStyle, this.basemapStyles)); + this.basemapService.fetchSources$() + .pipe(finalize(() => this.declareMap())) + .subscribe(); + } + + public ngOnChanges(changes: SimpleChanges): void { + if (this.map && this.map.getMapProvider() !== undefined) { + if (changes['boundsToFit'] !== undefined) { + const newBoundsToFit = changes['boundsToFit'].currentValue; + this.map.fitBounds(newBoundsToFit, { + maxZoom: this.fitBoundsMaxZoom, + offset: this.fitBoundsOffSet + }); + } + if (changes['featureToHightLight'] !== undefined + && changes['featureToHightLight'].currentValue !== changes['featureToHightLight'].previousValue) { + const featureToHightLight = changes['featureToHightLight'].currentValue; + this.highlightFeature(featureToHightLight); + } + if (changes['featuresToSelect'] !== undefined + && changes['featuresToSelect'].currentValue !== changes['featuresToSelect'].previousValue) { + const featuresToSelect = changes['featuresToSelect'].currentValue; + this.selectFeatures(featuresToSelect); + } + } + } + + /** If transformRequest' @Input was not set, set a default value : a function that maintains the same url */ + public initTransformRequest() { + if (!this.transformRequest) { + this.transformRequest = this.mapFrameworkService.getInitTransformRequest(); + } + } + + /** Zooms on clicked feature from map mouse event e. + * @param mouseEvent Map mouse event provided by the map instance. + */ + public zoomOnClick(mouseEvent: MapMouseEvent) { + const zoom = this.map.getZoom(); + let newZoom: number; + if (zoom >= 0 && zoom < 3) { + newZoom = 4; + } else if (zoom >= 3 && zoom < 5) { + newZoom = 5; + } else if (zoom >= 5 && zoom < 7) { + newZoom = 7; + } else if (zoom >= 7 && zoom < 10) { + newZoom = 10; + } else if (zoom >= 10 && zoom < 11) { + newZoom = 11; + } else { + newZoom = 12; + } + this.mapFrameworkService.flyTo(mouseEvent.lngLat.lat, mouseEvent.lngLat.lng, newZoom, this.map); + } + + /** + * Queries all rendered features on the position that was clicked on, on a layer; and emits those features. + * @param mapLayerMouseEvent Map mouse event provided by a layer instance. + */ + protected queryRender(mapLayerMouseEvent: MapLayerMouseEvent) { + const hasCrossOrDrawLayer = this.mapFrameworkService.queryFeatures(mapLayerMouseEvent, this.map, CROSS_LAYER_PREFIX); + if (!this.drawService.isDrawingBbox && !this.drawService.isDrawingPolygon + && !this.drawService.isDrawingCircle && !this.drawService.isInSimpleDrawMode && !hasCrossOrDrawLayer) { + this.onFeatureClick.next({ features: mapLayerMouseEvent.features, point: [mapLayerMouseEvent.lngLat.lng, mapLayerMouseEvent.lngLat.lat] }); + } + } + + /** @description Adds the custom icons given in the component's input */ + public addIcons() { + if (this.icons) { + this.icons.forEach(icon => { + const iconName = icon.path.split('.')[0]; + const iconPath = this.ICONS_BASE_PATH + icon.path; + const iconErrorMessage = 'The icon "' + this.ICONS_BASE_PATH + icon.path + '" is not found'; + this.mapFrameworkService.addImage(iconName, iconPath, this.map, iconErrorMessage, { 'sdf': icon.recolorable }); + }); + + } + } + + /** + * @description Creates the map instance and adds the basemap, arlas data + * and starts listening to arlas data changes and layers visibility updates. + * It also starts emiting map moveend event. + */ + public declareMap() { + this.initTransformRequest(); + const config: MapConfig = { + displayCurrentCoordinates: this.displayCurrentCoordinates, + fitBoundsPadding: this.fitBoundsPadding, + margePanForLoad: this.margePanForLoad, + margePanForTest: this.margePanForTest, + offset: this.offset, + wrapLatLng: this.wrapLatLng, + maxWidthScale: this.maxWidthScale, + unitScale: this.unitScale, + mapProviderOptions: { + container: this.id, + style: this.basemapService.getInitStyle(this.basemapService.basemaps.getSelected()), + center: this.initCenter, + zoom: this.initZoom, + maxZoom: this.maxZoom, + minZoom: this.minZoom, + renderWorldCopies: true, + preserveDrawingBuffer: this.preserveDrawingBuffer, + locale: { + 'NavigationControl.ZoomIn': this.translate.instant(ZOOM_IN), + 'NavigationControl.ZoomOut': this.translate.instant(ZOOM_OUT), + 'NavigationControl.ResetBearing': this.translate.instant(RESET_BEARING) + }, + pitchWithRotate: false, + transformRequest: this.transformRequest, + attributionControl: false, + } as M, + controls: { + mapAttribution: { + enable: true, + position: this.mapAttributionPosition + }, + scale: { + enable: this.displayScale + }, + navigationControl: { + enable: true + }, + pitchToggle: { + enable: true, + config: { bearing: -20, pitch: 70, minpitchzoom: 11 } + } + } + }; + this.map = this.mapFrameworkService.createMap(config); + fromEvent(window, 'beforeunload').subscribe(() => { + this.onMapClosed.next(this.map.getMapExtend()); + }); + + this.map.onCustomEvent('beforeOnLoadInit', () => { + this.basemapService.declareProtomapProtocol(this.map); + this.basemapService.addProtomapBasemap(this.map); + this.addIcons(); + this.mapService.declareArlasDataSources(this.dataSources, this.emptyData, this.map); + this.mapService.declareBasemapSources(this.mapSources, this.map); + this.mapService.addArlasDataLayers(this.visualisationSetsConfig, this.mapLayers, this.map); + this.listenToLayersEvents(); + }); + + this.mapFrameworkService.onMapEvent('load', this.map, () => { + if (this.mapLayers !== null) { + this.visibilityUpdater.subscribe(visibilityStatus => { + this.mapService.updateVisibility(visibilityStatus, this.visualisationSetsConfig, this.map); + }); + } + this.onMapLoaded.next(true); + }); + + this.map.onMoveEnd(this.mapService.visualisationsSets).subscribe((moveResult => { + this.onMove.next(moveResult); + })); + + if (this.redrawSource) { + this.redrawSource.pipe(takeUntil(this._onDestroy$)).subscribe(sd => { + this.mapFrameworkService.setDataToGeojsonSource(this.mapFrameworkService.getSource(sd.source, this.map), { + 'type': 'FeatureCollection', + 'features': sd.data + }); + }); + } + } + + /** + * @description Listens to events on mapLayers input (configured layers). + */ + public listenToLayersEvents() { + /** Zooms on the clicked feature of the given layers. */ + this.mapLayers.events.zoomOnClick.forEach(layerId => { + this.mapFrameworkService.onLayerEvent('click', this.map, layerId, (e) => this.zoomOnClick(e)); + }); + this.mapLayers.events.onHover.forEach(layerId => { + /** Emits the hovered feature on mousemove. */ + this.mapFrameworkService.onLayerEvent('mousemove', this.map, layerId, (e) => + this.onFeatureHover.next({ features: e.features, point: [e.lngLat.lng, e.lngLat.lat] })); + /** Emits an empty object on mouse leaving a feature. */ + this.mapFrameworkService.onLayerEvent('mouseleave', this.map, layerId, (e) => + this.onFeatureHover.next({})); + }); + /** Emits the clicked on feature. */ + this.mapLayers.events.emitOnClick.forEach(layerId => { + this.mapFrameworkService.onLayerEvent('click', this.map, layerId, (e) => + this.queryRender(e)); + }); + const drawPolygonLayers = [ + 'gl-draw-polygon-stroke-inactive', + 'gl-draw-polygon-stroke-active', + 'gl-draw-polygon-stroke-static' + ].map(layer => ['.cold', '.hot'] + .map(id => layer.concat(id))) + .reduce((p, ac) => ac.concat(p), []); + /** Sets mouse cursor on drawn features */ + drawPolygonLayers.forEach(layerId => { + this.mapFrameworkService.onLayerEvent('mousemove', this.map, layerId, (e) => + this.mapFrameworkService.setMapCursor(this.map, 'pointer')); + this.mapFrameworkService.onLayerEvent('mouseleave', this.map, layerId, (e) => + this.mapFrameworkService.setMapCursor(this.map, '')); + }); + } + + /** Sets the layers order according to the current order of `visualisationSetsConfig` list*/ + public reorderLayers() { + this.mapService.reorderLayers(this.visualisationSetsConfig, this.map); + } + + /** @description Display the basemapswitcher */ + public showBasemapSwitcher() { + this.showBasemapList = true; + } + + /** @description Emits event notifiying that the basemap has been changed */ + public onChangeBasemapStyle() { + this.onBasemapChanged.next(true); + } + + /** + * Updates the visibility status of the layer and emits that update. + * @param visualisation visualisation set name + * @param l layer id + * @param visible whether the layer is enabled and visible in the visualisation set + */ + public emitLegendVisibility(visualisation: string, l: string, visible: boolean): void { + // Copy the map so the pipe updates the values + this.visibilityStatus = new Map(this.visibilityStatus); + this.visibilityStatus.set(visualisation + ARLAS_VSET + l, visible); + this.legendVisibiltyStatus.next(this.visibilityStatus); + } + + /** + * @description Emits the visible visualisation set + * @param visualisationName Name of the visualisation. + */ + public emitVisualisations(visualisationName: string) { + const layers = this.mapService.updateLayoutVisibility(visualisationName, this.visualisationSetsConfig, this.map); + this.visualisations.emit(layers); + this.reorderLayers(); + } + + public downloadLayerSource(downaload: { layer: any; downloadType: string; }): void { + const downlodedSource = { + layerId: downaload.layer.id, + layerName: getLayerName(downaload.layer.id), + collection: downaload.layer.metadata.collection, + sourceName: downaload.layer.source as string, + downloadType: downaload.downloadType + }; + this.downloadSourceEmitter.next(downlodedSource); + } + + /** puts the visualisation set list in the new order after dropping */ + public drop(event: CdkDragDrop) { + moveItemInArray(this.visualisationSetsConfig, event.previousIndex, event.currentIndex); + this.reorderLayers(); + } + + /** puts the layers list in the new order after dropping */ + public dropLayer(event: CdkDragDrop, visuName: string) { + const layers = Array.from(this.mapService.findVisualisationSetLayer(visuName, this.visualisationSetsConfig)); + moveItemInArray(layers, event.previousIndex, event.currentIndex); + this.mapService.setVisualisationSetLayers(visuName, layers, this.visualisationSetsConfig); + this.reorderLayers(); + } + public hideBasemapSwitcher() { + this.showBasemapList = false; + } + /** + * Fit to given bounds. Options are for padding. + * @param bounds Bounds of the map to fit to. + */ + public fitToPaddedBounds(bounds: ArlasLngLatBounds) { + this.map.fitToPaddedBounds(bounds); + } + /** + * Centers the map to the given latitude/longitude coordinates. + * @param lngLat Latitude/longitude coordinates. + */ + public moveToCoordinates(lngLat: [number, number]) { + this.map.setCenter(lngLat); + } + /** Highlights, in all data sources,the feature(s) having the given elementIdentifier */ + private highlightFeature(featureToHightLight: { isleaving: boolean; elementidentifier: ElementIdentifier; }) { + this.mapService.highlightFeature(this.mapLayers, this.map, featureToHightLight); + } + /** Selects, in all data sources,the feature(s) having the given elementIdentifier */ + private selectFeatures(elementToSelect: Array) { + this.mapService.selectFeatures(this.mapLayers, this.map, elementToSelect); + } + /** Selects, in all data sources, all the features having the given elementIdentifiers and under the given collection. + * @param features list of features identifiers. + * @param collection data collection (metadata of the data source). + */ + public selectFeaturesByCollection(features: Array, collection: string) { + this.mapService.selectFeaturesByCollection(this.mapLayers, this.map, features, collection); + } + + public static getMapJsonSchema(): Object { + return mapJsonSchema; + } + /** Destroys all the components subscriptions. */ + public ngOnDestroy(): void { + if (this.map) { + this.map.unsubscribeEvents(); + } + this._onDestroy$.next(true); + this._onDestroy$.complete(); + } + + /** @description Enables bbox drawing mode.*/ + public addGeoBox() { + this.drawComponent.addGeoBox(); + } + + /** + * @description Removes all the aois if none of them is selected. Otherwise it removes the selected one only + */ + public removeAois() { + this.drawComponent.removeAois(); + } + + /** @description Deletes the selected drawn geometry. If no drawn geometry is selected, all geometries are deteleted */ + public deleteSelectedItem() { + this.drawComponent.deleteSelectedItem(); + } + + + /** + * @description Switches to a drawing mode of a DRAW_POLYGON, DRAW_CIRCLE or DRAW_RADIUS_CIRCLE. + * @param mode Draw mode (DRAW_POLYGON, DRAW_CIRCLE or DRAW_RADIUS_CIRCLE). Default to DRAW_POLYGON + * @param option Mapboxdraw option. + */ + public switchToDrawMode(mode?: string, option?: any) { + this.drawComponent.switchToDrawMode(mode, option); + } + + /** + * @description Switches to direct_select mode. + * @param option Mapboxdraw option. + */ + public switchToDirectSelectMode(option?: { featureIds: Array; allowCircleResize: boolean; } + | { featureId: string; allowCircleResize: boolean; }) { + this.drawComponent.switchToDirectSelectMode(option); + } + + /** + * @description Switches to simple_select mode. + * @param option Mapboxdraw option. + */ + public switchToEditMode() { + this.drawComponent.switchToEditMode(); + } + + /** + * @description Returns all the drawn polygons as wkt or geojson. + * @param mode 'wkt' | 'geojson' + * @returns Wkt string or Geojson object. + */ + public getAllPolygon(mode: 'wkt' | 'geojson') { + return this.drawComponent.getAllPolygon(mode); + } + + /** + * @description returns the selected polygon geometry in WKT or GeoJson given the mode + * @param mode : 'wkt' | 'geojson' + * @returns Wkt string or Geojson object. + */ + public getSelectedPolygon(mode: 'wkt' | 'geojson') { + return this.drawComponent.getSelectedPolygon(mode); + } +} diff --git a/projects/arlas-map/src/lib/arlas-map.module.ts b/projects/arlas-map/src/lib/arlas-map.module.ts new file mode 100644 index 00000000..8de26c1d --- /dev/null +++ b/projects/arlas-map/src/lib/arlas-map.module.ts @@ -0,0 +1,97 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MarkerModule } from '@colsen1991/ngx-translate-extract-marker/extras'; +import { TranslateModule } from '@ngx-translate/core'; +import { + ArlasColorService, FormatLegendModule, FormatNumberModule, + GetCollectionDisplayModule, GetColorModule, GetValueModule +} from 'arlas-web-components'; +import { ArlasMapComponent } from './arlas-map.component'; +import { GetCollectionPipe } from './arlas-map.pipe'; +import { BasemapModule } from './basemaps/basemap.module'; +import { CoordinatesModule } from './coordinates/coordinates.module'; +import { ArlasDrawComponent } from './draw/arlas-draw.component'; +import { MapboxAoiDrawService } from './draw/draw.service'; +import { LayerIdToName } from './legend/layer-name.pipe'; +import { LayerIconComponent } from './legend/legend-icon/layer-icon.component'; +import { LegendItemComponent } from './legend/legend-item/legend-item.component'; +import { LegendComponent } from './legend/legend.component'; +import { MapImportComponent } from './map-import/map-import.component'; +import { MapImportModule } from './map-import/map-import.module'; +import { MapSettingsComponent } from './map-settings/map-settings.component'; +import { MapSettingsModule } from './map-settings/map-settings.module'; + + +@NgModule({ + declarations: [ + ArlasMapComponent, + LayerIconComponent, + LegendComponent, + LegendItemComponent, + ArlasDrawComponent, + LayerIdToName, + GetCollectionPipe + ], + imports: [ + MatSnackBarModule, + TranslateModule, + MatIconModule, + MatMenuModule, + MatSlideToggleModule, + MatTooltipModule, + MatFormFieldModule, + GetCollectionDisplayModule, + GetColorModule, + DragDropModule, + GetValueModule, + FormatNumberModule, + FormatLegendModule, + CommonModule, + CoordinatesModule, + MapSettingsModule, + MapImportModule, + BasemapModule, + MarkerModule + ], + providers: [ + MapboxAoiDrawService, + ArlasColorService + ], + exports: [ + LayerIconComponent, + LegendComponent, + LegendItemComponent, + LayerIdToName, + ArlasMapComponent, + MapImportComponent, + MapSettingsComponent, + GetCollectionPipe + ] +}) +export class ArlasMapModule { } diff --git a/projects/arlas-map/src/lib/arlas-map.pipe.ts b/projects/arlas-map/src/lib/arlas-map.pipe.ts new file mode 100644 index 00000000..4fa5ac8e --- /dev/null +++ b/projects/arlas-map/src/lib/arlas-map.pipe.ts @@ -0,0 +1,31 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'getCollection' }) +export class GetCollectionPipe implements PipeTransform { + public transform(value: string, layersMap?: Map): string { + let collection: string; + if (layersMap?.get(value)?.metadata?.collection) { + collection = layersMap.get(value).metadata.collection; + } + return collection; + } +} diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.schema.json b/projects/arlas-map/src/lib/arlas-map.schema.json similarity index 92% rename from projects/arlas-components/src/lib/components/mapgl/mapgl.schema.json rename to projects/arlas-map/src/lib/arlas-map.schema.json index db5640a3..a398aa98 100644 --- a/projects/arlas-components/src/lib/components/mapgl/mapgl.schema.json +++ b/projects/arlas-map/src/lib/arlas-map.schema.json @@ -3,7 +3,7 @@ "title": "Map's inputs configuration", "description": "The Configuration of the map's inputs", "type": "object", - "$id": "mapgl.schema.json", + "$id": "arlas-map.schema.json", "properties": { "displayScale": { "description": "Whether the scale is displayed", @@ -26,7 +26,7 @@ "type": "object", "properties": { "layers": { - "description": "List of mapbox-gl layers", + "description": "List of layers", "type": "array" }, "events": { @@ -59,7 +59,7 @@ "type": "string" }, "mapSources": { - "description": "List of mapboxgl sources to add to the map", + "description": "List of sources to add to the map as basemaps", "type": "array", "items": { "type": "object", @@ -69,7 +69,7 @@ "type": "string" }, "source": { - "description": "Mapboxgl source.", + "description": "source.", "type": "object", "properties": { "type": { @@ -128,7 +128,7 @@ "type": "string" }, "styleFile": { - "description": "url to basemap style or a `mapboxgl.Style`", + "description": "url to basemap style or a `maplibre.Style`", "type": ["string", "object"] } }, @@ -148,7 +148,7 @@ "type": "string" }, "styleFile": { - "description": "url to basemap style or a `mapboxgl.Style`", + "description": "url to basemap style or a `maplibre.Style`", "type": ["string","object"] } }, @@ -158,7 +158,7 @@ } }, "initCenter": { - "description": "Coordinates of the map's centre when it's initialized.", + "description": "Coordinates of the map's center when it's initialized.", "type": "array", "minItems": 2, "maxItems": 2, @@ -204,15 +204,15 @@ "description": "List of visualisation sets", "type": "array", "items": { - "description": "A Visualisation set is an entity where to group layers together", + "description": "A Visualisation set is an entity where layers are grouped together.", "type": "object", "properties": { "name": { - "description": "Name of the visualisation set", + "description": "Name of the visualisation set.", "type": "string" }, "layers": { - "description": "List of layers ids grouped in this visualisation set", + "description": "List of layers ids grouped in this visualisation set.", "type": "array", "items": { "description": "layer id", diff --git a/projects/arlas-map/src/lib/arlas-map.service.spec.ts b/projects/arlas-map/src/lib/arlas-map.service.spec.ts new file mode 100644 index 00000000..5ec337e5 --- /dev/null +++ b/projects/arlas-map/src/lib/arlas-map.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ArlasMapFrameworkService } from './arlas-map-framework.service'; + +describe('ArlasMapService', () => { + let service: ArlasMapFrameworkService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ArlasMapFrameworkService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/arlas-map/src/lib/arlas-map.service.ts b/projects/arlas-map/src/lib/arlas-map.service.ts new file mode 100644 index 00000000..acea4697 --- /dev/null +++ b/projects/arlas-map/src/lib/arlas-map.service.ts @@ -0,0 +1,280 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { ArlasMapFrameworkService } from './arlas-map-framework.service'; +import { FeatureCollection } from '@turf/helpers'; +import { AbstractArlasMapGL } from './map/AbstractArlasMapGL'; +import { ArlasMapSource } from './map/model/sources'; +import { VisualisationSetConfig } from './map/model/visualisationsets'; +import { ArlasDataLayer, ExternalEvent, MapLayers } from './map/model/layers'; +import { ElementIdentifier } from 'arlas-web-components'; + +/** + * This service propose a set of method to execute the ArlasMapComponent logic. + * Do not confuse with ArlasMapFrameworkService that is more dedicated to a framework logic. + */ +@Injectable({ + providedIn: 'root' +}) +/** L: a layer class/interface. + * S: a source class/interface. + * M: a Map configuration class/interface. + */ +export abstract class AbstractArlasMapService { + /** @description List of arlas data sources declared in configuration */ + public dataSources: S[] = []; + /** @description Map of ARLAS data layers and their ids (the ids being the key of the map). */ + public layersMap: Map; + /** + * @description Object to describe visualisation sets + * - visulisations: a map of ; + * - status: a map of + */ + public visualisationsSets: { + visualisations: Map>; + status: Map; + } = { + visualisations: new Map(), + status: new Map() + }; + + public constructor(public mapFrameworkService: ArlasMapFrameworkService) { } + + /** + * @description Declares the arlas data sources provided in configuration. + * @param dataSourcesIds Identifiers of arlas data sources. + * @param data A feature collection. + * @param map Map instance. + */ + public abstract declareArlasDataSources(dataSourcesIds: Set, data: FeatureCollection, map: AbstractArlasMapGL): void; + + public abstract declareLabelSources(labelSourceId: string, data: FeatureCollection, map: AbstractArlasMapGL): void; + + public abstract declareBasemapSources(basemapSources: Array>, map: AbstractArlasMapGL): void; + + public abstract setLayersMap(mapLayers: MapLayers, layers?: Array); + + public updateLabelSources(labelSourceId: string, data: FeatureCollection, map: AbstractArlasMapGL) { + if (labelSourceId) { + const source = this.mapFrameworkService.getSource(labelSourceId, map); + this.mapFrameworkService.setDataToGeojsonSource(source, data); + } + } + + /** + * @description Inits a map of visulisation sets from the configuration. + * @param visualisationSetsConfig Visualisation set configuration. + */ + public initVisualisationSet(visualisationSetsConfig: VisualisationSetConfig[]) { + if (visualisationSetsConfig) { + visualisationSetsConfig.forEach(visu => { + this.visualisationsSets.visualisations.set(visu.name, new Set(visu.layers)); + this.visualisationsSets.status.set(visu.name, visu.enabled); + }); + } + } + + public initMapLayers(mapLayers: MapLayers, map: AbstractArlasMapGL) { + if (mapLayers) { + this.setLayersMap(mapLayers); + } + } + + public abstract moveArlasDataLayer(map: AbstractArlasMapGL, layer: any, layersMap: Map, beforeId?: string); + + /** + * Add a layer to the map instance. This method handles any specific treatment when adding ARLAS data. + * For instance, in mapbox and maplibre implementation, adding a fill layer needs to add systematically the stroke layer. + * @param map Map instance. + * @param layer A layer. It could be a layer identifier OR a layer object (it will depend on the framwork implementation). + * @param layersMap Map of ARLAS data layers and their ids (the ids being the key of the map). + * @param beforeId Identifier of an already added layer. The layers of layersMap are added under this 'beforeId' layer. + */ + public abstract addArlasDataLayer(map: AbstractArlasMapGL, layer: ArlasDataLayer | string, + layersMap: Map, beforeId?: string); + + public addArlasDataLayers(visualisationSetsConfig: VisualisationSetConfig[], mapLayers: MapLayers, map: AbstractArlasMapGL) { + this.initMapLayers(mapLayers, map); + this.initVisualisationSet(visualisationSetsConfig); + for (let i = visualisationSetsConfig.length - 1; i >= 0; i--) { + const visualisation: VisualisationSetConfig = visualisationSetsConfig[i]; + if (visualisation.layers) { + for (let j = visualisation.layers.length - 1; j >= 0; j--) { + const l = visualisation.layers[j]; + const layer = this.layersMap.get(l); + this.addArlasDataLayer(map, layer, this.layersMap); + } + } + } + this._addExternalEventLayers(mapLayers, map); + this.visualisationsSets.status.forEach((visible, vs) => { + this.visualisationsSets.visualisations.get(vs).forEach(l => { + this.mapFrameworkService.setLayerVisibility(l, visible, map); + }); + }); + this.reorderLayers(visualisationSetsConfig, map); + } + + private _addExternalEventLayers(mapLayers: MapLayers, map: AbstractArlasMapGL) { + if (mapLayers.externalEventLayers) { + mapLayers.layers + .filter(layer => mapLayers.externalEventLayers.map(e => e.id).indexOf(layer.id) >= 0) + .forEach(l => { + this.mapFrameworkService.addLayer(map, l as L); + }); + } + } + + + public reorderLayers(visualisationSetsConfig: VisualisationSetConfig[], map: AbstractArlasMapGL) { + // parses the visulisation list from bottom in order to put the fist ones first + for (let i = visualisationSetsConfig.length - 1; i >= 0; i--) { + const visualisation: VisualisationSetConfig = visualisationSetsConfig[i]; + if (!!visualisation.layers && visualisation.enabled) { + for (let j = visualisation.layers.length - 1; j >= 0; j--) { + const l = visualisation.layers[j]; + this.moveArlasDataLayer(map, l, this.layersMap); + } + } + } + this.reorderDrawLayers(map); + + } + + protected abstract reorderDrawLayers(map: AbstractArlasMapGL); + + + public abstract filterLayers(mapLayers: MapLayers, map: AbstractArlasMapGL, + visibilityCondition: boolean, visibilityFilter: Array, visibilityEvent: ExternalEvent, + collection?: string): void; + + public selectFeatures(mapLayers: MapLayers, map: AbstractArlasMapGL, elementToSelect: Array) { + if (elementToSelect) { + const ids = elementToSelect.length > 0 ? + elementToSelect.reduce((memo, element) => { + memo.push(element.idValue); + return memo; + }, []) : []; + const numericalIds = ids.filter(id => !isNaN(+id)).map(id => +id); + const visibilityFilter = ids.length > 0 ? ['in', ['get', elementToSelect[0].idFieldName], ['literal', ids.concat(numericalIds)]] : []; + this.filterLayers(mapLayers, map, (elementToSelect.length > 0), visibilityFilter, ExternalEvent.select); + } + } + + public highlightFeature(mapLayers: MapLayers, map: AbstractArlasMapGL, + featureToHightLight: { isleaving: boolean; elementidentifier: ElementIdentifier; }) { + if (featureToHightLight?.elementidentifier) { + const ids: Array = [featureToHightLight.elementidentifier.idValue]; + if (!isNaN(+featureToHightLight.elementidentifier.idValue)) { + ids.push(+featureToHightLight.elementidentifier.idValue); + } + const visibilityFilter = ['in', ['get', featureToHightLight.elementidentifier.idFieldName], + ['literal', ids]]; + this.filterLayers(mapLayers, map, !featureToHightLight.isleaving, visibilityFilter, ExternalEvent.hover); + } + } + + public selectFeaturesByCollection(mapLayers: MapLayers, map: AbstractArlasMapGL, + features: Array, collection: string) { + const ids: Array = features.map(f => f.idValue); + const numericalIds = ids.filter(id => !isNaN(+id)).map(id => +id); + const visibilityFilter = ids.length > 0 ? ['in', ['get', features[0].idFieldName], ['literal', ids.concat(numericalIds)]] : []; + this.filterLayers(mapLayers, map, (features.length > 0), visibilityFilter, ExternalEvent.select, collection); + } + + + public updateLayoutVisibility(visualisationName: string, visualisationSetsConfig: VisualisationSetConfig[], map: AbstractArlasMapGL) { + const visuStatus = !this.visualisationsSets.status.get(visualisationName); + visualisationSetsConfig.find(v => v.name === visualisationName).enabled = visuStatus; + if (!visuStatus) { + const layersSet = new Set(this.visualisationsSets.visualisations.get(visualisationName)); + this.visualisationsSets.visualisations.forEach((ls, v) => { + if (v !== visualisationName) { + ls.forEach(ll => { + if (layersSet?.has(ll)) { + layersSet.delete(ll); + } + }); + } + }); + layersSet.forEach(ll => { + this.mapFrameworkService.setLayerVisibility(ll, false, map); + }); + } + this.visualisationsSets.status.set(visualisationName, visuStatus); + const layers = new Set(); + this.visualisationsSets.visualisations.forEach((ls, v) => { + if (this.visualisationsSets.status.get(v)) { + ls.forEach(l => { + layers.add(l); + this.mapFrameworkService.setLayerVisibility(l, true, map); + }); + } + }); + return layers; + } + + public updateVisibility(visibilityStatus: Map, visualisationSetsConfig: VisualisationSetConfig[], map: AbstractArlasMapGL) { + visibilityStatus.forEach((visibilityStatus, l) => { + let layerInVisualisations = false; + if (!visibilityStatus) { + visualisationSetsConfig.forEach(v => { + const ls = new Set(v.layers); + if (!layerInVisualisations) { + layerInVisualisations = ls.has(l); + } + }); + if (layerInVisualisations) { + this.mapFrameworkService.setLayerVisibility(l, false, map); + } + } else { + let oneVisualisationEnabled = false; + visualisationSetsConfig.forEach(v => { + const ls = new Set(v.layers); + if (!layerInVisualisations) { + layerInVisualisations = ls.has(l); + } + if (ls.has(l) && v.enabled) { + oneVisualisationEnabled = true; + this.mapFrameworkService.setLayerVisibility(l, true, map); + } + }); + if (!oneVisualisationEnabled && layerInVisualisations) { + this.mapFrameworkService.setLayerVisibility(l, false, map); + } + } + }); + } + + + public findVisualisationSetLayer(visuName: string, visualisationSetsConfig: VisualisationSetConfig[]) { + return visualisationSetsConfig.find(v => v.name === visuName).layers; + } + public setVisualisationSetLayers(visuName: string, layers: string[], visualisationSetsConfig: VisualisationSetConfig[]) { + const f = visualisationSetsConfig.find(v => v.name === visuName); + if (f) { + f.layers = layers; + } + } + + public abstract updateMapStyle(map: AbstractArlasMapGL, l: any, ids: Array, sourceName: string): void; + + public abstract getVisibleIdsFilter(map: AbstractArlasMapGL, layer: any, ids: Array); +} diff --git a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.html b/projects/arlas-map/src/lib/basemaps/basemap.component.html similarity index 82% rename from projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.html rename to projects/arlas-map/src/lib/basemaps/basemap.component.html index 78241d7b..6d9ed356 100644 --- a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.html +++ b/projects/arlas-map/src/lib/basemaps/basemap.component.html @@ -1,6 +1,7 @@
-
+
diff --git a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.scss b/projects/arlas-map/src/lib/basemaps/basemap.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.component.scss rename to projects/arlas-map/src/lib/basemaps/basemap.component.scss diff --git a/projects/arlas-map/src/lib/basemaps/basemap.component.ts b/projects/arlas-map/src/lib/basemaps/basemap.component.ts new file mode 100644 index 00000000..e6c700ad --- /dev/null +++ b/projects/arlas-map/src/lib/basemaps/basemap.component.ts @@ -0,0 +1,105 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; +import { Subject } from 'rxjs/internal/Subject'; +import { AbstractArlasMapGL } from '../map/AbstractArlasMapGL'; +import { ArlasMapSource } from '../map/model/sources'; +import { ArlasBasemaps } from './basemaps.model'; +import { BasemapService } from './basemap.service'; +import { BasemapStyle } from './basemap.config'; +import { ArlasMapFrameworkService } from '../arlas-map-framework.service'; +import { AbstractArlasMapService } from '../arlas-map.service'; +import { takeUntil } from 'rxjs'; + +@Component({ + selector: 'arlas-basemap', + templateUrl: './basemap.component.html', + styleUrls: ['./basemap.component.scss'] +}) +/** L: a layer class/interface. + * S: a source class/interface. + * M: a Map configuration class/interface. + */ +export class BasemapComponentimplements OnInit, OnDestroy { + + private readonly _onDestroy$ = new Subject(); + + @Input() public map: AbstractArlasMapGL; + @Input() public mapSources: Array>; + + @Output() public basemapChanged = new EventEmitter(); + @Output() public blur = new Subject(); + + public showList = false; + public basemaps: ArlasBasemaps; + + public constructor(protected basemapService: BasemapService, + protected mapService: AbstractArlasMapService, + protected mapFrameworkService: ArlasMapFrameworkService) { + + this.basemapService.basemapChanged$.pipe(takeUntil(this._onDestroy$)).subscribe(() => this.basemapChanged.emit()); + + } + + public ngOnInit(): void { + this.initBasemaps(); + } + + protected initBasemaps() { + this.basemaps = this.basemapService.basemaps; + if (this.basemaps) { + const styles = this.basemaps.styles(); + if (styles) { + this.showList = styles.length > 0; + styles.filter(bm => !bm.image).forEach(bm => { + if (bm.type !== 'protomap' && !!bm.url) { + const splitUrl = bm.url.split('/style.json?key='); + if (splitUrl.length === 2) { + bm.image = `${splitUrl[0]}/0/0/0.png?key=${splitUrl[1]}`; + } + } + }); + } + } + } + + /** Removes the old basemap and set the new one that is given as a parameter + * @param newBasemap: Basemap selected by the user + */ + public onChangeBasemap(newBasemap: BasemapStyle) { + const selectedBasemap = this.basemaps.getSelected(); + if (selectedBasemap.type === 'protomap') { + this.basemapService.removeProtomapBasemap(this.map); + } + this.setBaseMapStyle(newBasemap); + } + + public setBaseMapStyle(newBasemap: BasemapStyle) { + if (this.map) { + this.basemapService.setBasemap(this.basemaps.getSelected().styleFile as any, newBasemap, this.map, this.mapSources); + } + } + + public ngOnDestroy() { + this._onDestroy$.next(true); + this._onDestroy$.complete(); + } + +} diff --git a/projects/arlas-components/src/lib/components/mapgl/basemaps/basemap.config.ts b/projects/arlas-map/src/lib/basemaps/basemap.config.ts similarity index 95% rename from projects/arlas-components/src/lib/components/mapgl/basemaps/basemap.config.ts rename to projects/arlas-map/src/lib/basemaps/basemap.config.ts index 204e07d4..a77b852a 100644 --- a/projects/arlas-components/src/lib/components/mapgl/basemaps/basemap.config.ts +++ b/projects/arlas-map/src/lib/basemaps/basemap.config.ts @@ -17,10 +17,9 @@ * under the License. */ - export interface BasemapStyle { name: string; - styleFile: string | mapboxgl.Style; + styleFile: any; url?: string; image?: string; type?: 'protomap' | 'mapbox'; diff --git a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.module.ts b/projects/arlas-map/src/lib/basemaps/basemap.module.ts similarity index 81% rename from projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.module.ts rename to projects/arlas-map/src/lib/basemaps/basemap.module.ts index e6075e97..ea6d12b3 100644 --- a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.module.ts +++ b/projects/arlas-map/src/lib/basemaps/basemap.module.ts @@ -18,19 +18,20 @@ */ import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MapglLayerIconComponent } from './mapgl-layer-icon.component'; +import { MatIconModule } from '@angular/material/icon'; import { TranslateModule } from '@ngx-translate/core'; - +import { NgModule } from '@angular/core'; +import { BasemapComponent } from './basemap.component'; @NgModule({ imports: [ CommonModule, + MatIconModule, TranslateModule ], - declarations: [MapglLayerIconComponent], - exports: [MapglLayerIconComponent] + declarations: [BasemapComponent], + exports: [BasemapComponent] }) -export class MapglLayerIconModule { +export class BasemapModule { } diff --git a/projects/arlas-map/src/lib/basemaps/basemap.service.ts b/projects/arlas-map/src/lib/basemaps/basemap.service.ts new file mode 100644 index 00000000..984eb7b5 --- /dev/null +++ b/projects/arlas-map/src/lib/basemaps/basemap.service.ts @@ -0,0 +1,103 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { ArlasBasemaps } from './basemaps.model'; +import { BasemapStyle } from './basemap.config'; +import { Observable, Subject } from 'rxjs'; +import { HttpClient } from '@angular/common/http'; +import { AbstractArlasMapGL } from '../map/AbstractArlasMapGL'; +import { ArlasMapFrameworkService } from '../arlas-map-framework.service'; + +@Injectable({ + providedIn: 'root' +}) +/** L: a layer class/interface. + * S: a source class/interface. + * M: a Map configuration class/interface. + */ +export abstract class BasemapService { + + protected POWERED_BY_ARLAS = ' Powered by ARLAS.'; + protected LOCAL_STORAGE_BASEMAPS = 'arlas_last_base_map'; + + + protected basemapChangedSource: Subject = new Subject(); + public basemapChanged$ = this.basemapChangedSource.asObservable(); + public basemaps: ArlasBasemaps; + + protected protomapBasemapAddedSource = new Subject(); + public protomapBasemapAdded$ = this.protomapBasemapAddedSource.asObservable(); + + protected constructor(protected http: HttpClient, protected mapFrameworkService: ArlasMapFrameworkService) { } + + public setBasemaps(basemaps: ArlasBasemaps) { + this.basemaps = basemaps; + } + + public abstract addProtomapBasemap(map: AbstractArlasMapGL); + + protected addPMtilesToSource(map: AbstractArlasMapGL, pmtilesSource: any) { + /* eslint-disable max-len */ + pmtilesSource['attribution'] = 'Protomaps © OpenStreetMap'; + pmtilesSource['attribution'] = pmtilesSource['attribution'] + this.POWERED_BY_ARLAS; + this.mapFrameworkService.setSource('arlas_protomaps_source', pmtilesSource, map); + } + + protected addProtomapLayerToMap(map: AbstractArlasMapGL, styleFile: any) { + styleFile.layers.forEach(l => { + this.mapFrameworkService.removeLayer(map, l.id); + this.mapFrameworkService.addLayer(map, l); + }); + } + + public notifyProtomapAddition() { + this.protomapBasemapAddedSource.next(true); + } + + public abstract removeProtomapBasemap(map: AbstractArlasMapGL); + + public abstract declareProtomapProtocol(map: AbstractArlasMapGL): void; + public cloneStyleFile(selected: any) { + return { ...selected.styleFile as T}; + } + + public buildInitStyle(clonedStyleFile: StyleType) { + (clonedStyleFile).sources = { + protomaps_attribution: { + 'type': 'vector', + // eslint-disable-next-line max-len + 'attribution': 'Protomaps © OpenStreetMap' + this.POWERED_BY_ARLAS + } + }; + (clonedStyleFile).layers = [{ + id: 'backgrounds', + type: 'background', + source: 'protomaps_attribution', + paint: { + 'background-color': 'rgba(0,0,0,0)' + } + } as unknown as LayerSpec]; + return clonedStyleFile; + }; + public abstract getInitStyle(selected: BasemapStyle): any; + public abstract fetchSources$(): Observable; + protected abstract getStyleFile(b: BasemapStyle): Observable; + public abstract setBasemap(s: any, newBasemap: BasemapStyle, map: AbstractArlasMapGL, options?: any); +} diff --git a/projects/arlas-components/src/lib/components/mapgl/basemaps/basemaps.ts b/projects/arlas-map/src/lib/basemaps/basemaps.model.ts similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl/basemaps/basemaps.ts rename to projects/arlas-map/src/lib/basemaps/basemaps.model.ts diff --git a/projects/arlas-components/src/lib/components/bbox-generator/bbox-form-error.pipe.spec.ts b/projects/arlas-map/src/lib/bbox-generator/bbox-form-error.pipe.spec.ts similarity index 100% rename from projects/arlas-components/src/lib/components/bbox-generator/bbox-form-error.pipe.spec.ts rename to projects/arlas-map/src/lib/bbox-generator/bbox-form-error.pipe.spec.ts diff --git a/projects/arlas-components/src/lib/components/bbox-generator/bbox-form-error.pipe.ts b/projects/arlas-map/src/lib/bbox-generator/bbox-form-error.pipe.ts similarity index 100% rename from projects/arlas-components/src/lib/components/bbox-generator/bbox-form-error.pipe.ts rename to projects/arlas-map/src/lib/bbox-generator/bbox-form-error.pipe.ts diff --git a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.html b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.html similarity index 97% rename from projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.html rename to projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.html index 9523c729..30e314b0 100644 --- a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.html +++ b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.html @@ -1,7 +1,7 @@
{{'BBox generator' | translate}} - clear + clear
diff --git a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.scss b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.scss rename to projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.scss diff --git a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.ts b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.ts similarity index 95% rename from projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.ts rename to projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.ts index 8c91957d..832177fc 100644 --- a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.component.ts +++ b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.component.ts @@ -19,10 +19,10 @@ import { AfterViewInit, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { marker } from '@colsen1991/ngx-translate-extract-marker'; -import { Corner } from '../mapgl/draw/draw.models'; -import { MapboxAoiDrawService } from '../mapgl/draw/draw.service'; import { BboxFormGroup } from './bbox-generator.utils'; +import { marker } from '@colsen1991/ngx-translate-extract-marker'; +import { MapboxAoiDrawService } from '../draw/draw.service'; +import { Corner } from '../draw/draw.models'; @Component({ selector: 'arlas-bbox-generator', diff --git a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.module.ts b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.module.ts similarity index 95% rename from projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.module.ts rename to projects/arlas-map/src/lib/bbox-generator/bbox-generator.module.ts index f7b4d5ab..4229e459 100644 --- a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.module.ts +++ b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.module.ts @@ -23,7 +23,6 @@ import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { BrowserModule } from '@angular/platform-browser'; import { TranslateModule } from '@ngx-translate/core'; import { BboxGeneratorComponent } from './bbox-generator.component'; import { NgModule } from '@angular/core'; @@ -33,7 +32,6 @@ import { BboxFormErrorPipe } from './bbox-form-error.pipe'; @NgModule({ imports: [ CommonModule, - BrowserModule, FormsModule, MatDialogModule, MatFormFieldModule, diff --git a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.utils.ts b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.utils.ts similarity index 95% rename from projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.utils.ts rename to projects/arlas-map/src/lib/bbox-generator/bbox-generator.utils.ts index a942c408..0c6640b7 100644 --- a/projects/arlas-components/src/lib/components/bbox-generator/bbox-generator.utils.ts +++ b/projects/arlas-map/src/lib/bbox-generator/bbox-generator.utils.ts @@ -18,8 +18,8 @@ */ import { FormGroup } from '@angular/forms'; -import { Coordinate, PointFormGroup } from '../../tools/coordinates.tools'; -import { Corner } from '../mapgl/draw/draw.models'; +import { Coordinate, PointFormGroup } from './coordinates.tools'; +import { Corner } from '../draw/draw.models'; import { Subscription } from 'rxjs'; diff --git a/projects/arlas-components/src/lib/tools/coordinates.tools.ts b/projects/arlas-map/src/lib/bbox-generator/coordinates.tools.ts similarity index 99% rename from projects/arlas-components/src/lib/tools/coordinates.tools.ts rename to projects/arlas-map/src/lib/bbox-generator/coordinates.tools.ts index a55dc168..5ddee289 100644 --- a/projects/arlas-components/src/lib/tools/coordinates.tools.ts +++ b/projects/arlas-map/src/lib/bbox-generator/coordinates.tools.ts @@ -53,7 +53,7 @@ export class Coordinate { /** Parses a coordinate in decimal or sexagesimal degrees and returns the decimal degrees */ public static parse(value: string) { const coordinatesRegex = DECIMAL_SEXAGESIMAL_REGEX; - const parsedCoordinates = (String(value)).match(coordinatesRegex); + const parsedCoordinates = (String(value)).match(coordinatesRegex) as any; if (parsedCoordinates && parsedCoordinates.groups) { const groups = parsedCoordinates.groups; if (groups.decimal) { diff --git a/projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.html b/projects/arlas-map/src/lib/coordinates/coordinates.component.html similarity index 76% rename from projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.html rename to projects/arlas-map/src/lib/coordinates/coordinates.component.html index a33b91e9..71aa3967 100644 --- a/projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.html +++ b/projects/arlas-map/src/lib/coordinates/coordinates.component.html @@ -1,4 +1,4 @@ -
{{ 'Lat:' | translate }} {{ currentLat | number:'1.5-5' }} {{ 'Lng:' | translate }} {{ currentLng | number:'1.5-5' }} @@ -10,7 +10,7 @@ {{'Latitude' | translate}} - {{getErrorMessage(coordinatesForm.latitude) | translate}} + {{coordinatesForm.latitude | coordinatesFormError | translate}}
@@ -18,16 +18,16 @@ {{'Longitude' | translate}} - {{getErrorMessage(coordinatesForm.longitude) | + {{coordinatesForm.longitude | coordinatesFormError | translate}}
-
+
clear
diff --git a/projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.scss b/projects/arlas-map/src/lib/coordinates/coordinates.component.scss similarity index 98% rename from projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.scss rename to projects/arlas-map/src/lib/coordinates/coordinates.component.scss index b9611318..3312b4fe 100644 --- a/projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.scss +++ b/projects/arlas-map/src/lib/coordinates/coordinates.component.scss @@ -33,7 +33,6 @@ $default-font-size: 14px; background-color: white; border: 1px solid #a1a1a1; border-radius: 4px; - padding: 0 $sm-spacing; cursor: pointer; font-size: $default-font-size; padding: $xs-spacing $sm-spacing; diff --git a/projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.ts b/projects/arlas-map/src/lib/coordinates/coordinates.component.ts similarity index 86% rename from projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.ts rename to projects/arlas-map/src/lib/coordinates/coordinates.component.ts index 6e13b90f..8a69634c 100644 --- a/projects/arlas-components/src/lib/components/mapgl/coordinates/coordinates.component.ts +++ b/projects/arlas-map/src/lib/coordinates/coordinates.component.ts @@ -18,7 +18,7 @@ */ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { Coordinate, PointFormGroup } from '../../../tools/coordinates.tools'; +import { Coordinate, PointFormGroup } from '../bbox-generator/coordinates.tools'; import { FormControl, FormGroup } from '@angular/forms'; import { marker } from '@colsen1991/ngx-translate-extract-marker'; @@ -50,13 +50,6 @@ export class CoordinatesComponent implements OnInit { this.coordinatesForm.longitude.setValue(this.currentLng); } - public getErrorMessage(formControl: FormControl | FormGroup) { - if (formControl.hasError('required')) { - return marker('You must enter a coordinate'); - } - return formControl.hasError('pattern') ? this.placeHolder : ''; - } - public moveToCoordinates() { const lat = Coordinate.parse(this.coordinatesForm.latitude.value); const lng = Coordinate.parse(this.coordinatesForm.longitude.value); diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.module.ts b/projects/arlas-map/src/lib/coordinates/coordinates.module.ts similarity index 50% rename from projects/arlas-components/src/lib/components/mapgl/mapgl.module.ts rename to projects/arlas-map/src/lib/coordinates/coordinates.module.ts index 272d5bcc..7a5da6b0 100644 --- a/projects/arlas-components/src/lib/components/mapgl/mapgl.module.ts +++ b/projects/arlas-map/src/lib/coordinates/coordinates.module.ts @@ -18,58 +18,30 @@ */ import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; import { TranslateModule } from '@ngx-translate/core'; -import { MapglComponent } from './mapgl.component'; -import { MapglLegendModule } from '../mapgl-legend/mapgl-legend.module'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatChipsModule } from '@angular/material/chips'; -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { GetCollectionPipe, GetLayerPipe } from './mapgl.component.util'; -import { MapglBasemapModule } from '../mapgl-basemap/mapgl-basemap.module'; -import { MapboxAoiDrawService } from './draw/draw.service'; -import { CoordinatesComponent } from './coordinates/coordinates.component'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NgModule } from '@angular/core'; +import { CoordinatesComponent } from './coordinates.component'; import { MatFormFieldModule } from '@angular/material/form-field'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { MatInputModule } from '@angular/material/input'; -import { GetValueModule } from '../../pipes/get-value/get-value.module'; - +import { CoordinatesErrorPipe } from './coordinates.pipe'; @NgModule({ imports: [ CommonModule, MatIconModule, - MatButtonModule, - MatSelectModule, - MatRadioModule, - TranslateModule, - MapglLegendModule, - MapglBasemapModule, - MatSnackBarModule, - MatSlideToggleModule, - MatTooltipModule, - MatChipsModule, - FormsModule, MatFormFieldModule, - MatIconModule, - MatButtonModule, - MatInputModule, + FormsModule, ReactiveFormsModule, - DragDropModule, - GetValueModule - ], - declarations: [MapglComponent, GetCollectionPipe, GetLayerPipe, CoordinatesComponent], - providers: [ - MapboxAoiDrawService + MatTooltipModule, + MatInputModule, + TranslateModule ], - exports: [MapglComponent] + declarations: [CoordinatesComponent, CoordinatesErrorPipe], + exports: [CoordinatesComponent] }) -export class MapglModule { +export class CoordinatesModule { } diff --git a/projects/arlas-map/src/lib/coordinates/coordinates.pipe.ts b/projects/arlas-map/src/lib/coordinates/coordinates.pipe.ts new file mode 100644 index 00000000..57f009d7 --- /dev/null +++ b/projects/arlas-map/src/lib/coordinates/coordinates.pipe.ts @@ -0,0 +1,36 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Pipe, PipeTransform } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { marker } from '@colsen1991/ngx-translate-extract-marker'; + +@Pipe({ + name: 'coordinatesFormError' +}) +export class CoordinatesErrorPipe implements PipeTransform { + + public transform(formControl: FormControl | FormGroup): string { + if (formControl.hasError('required')) { + return marker('You must enter a coordinate'); + } + return formControl.hasError('pattern') ? marker('1.1 or 1°6\'3"') : ''; + } + +} diff --git a/projects/arlas-map/src/lib/draw/AbstractDraw.ts b/projects/arlas-map/src/lib/draw/AbstractDraw.ts new file mode 100644 index 00000000..7fec4915 --- /dev/null +++ b/projects/arlas-map/src/lib/draw/AbstractDraw.ts @@ -0,0 +1,219 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import MapboxDraw from '@mapbox/mapbox-gl-draw'; +import { AbstractArlasMapGL } from '../map/AbstractArlasMapGL'; +import { Feature, FeatureCollection, Geometry } from '@turf/helpers'; + +export type DrawEvents = 'draw.create' | 'draw.delete' | 'draw.combine' | 'draw.uncombine' | + 'draw.update' | 'draw.selectionchange' | 'draw.modechange' | 'draw.render' | 'draw.actionable' | + 'draw.edit.saveInitialFeature' | 'draw.onClick' | 'draw.onStart' | 'draw.onStop' + | 'draw.invalidGeometry'; + +export type DrawModes = 'SIMPLE_SELECT' | 'DRAW_CIRCLE' | 'DIRECT_SELECT' | + 'DRAW_LINE_STRING' | 'DRAW_POLYGON' | 'DRAW_POINT' | 'DRAW_RADIUS_CIRCLE' | + 'DRAW_STRIP' | 'DIRECT_STRIP'| 'STATIC'; + +export interface DrawEventsInterface { + onDrawCreate: (...args) => void; + onDrawUpdate: (...args) => void; + onDrawDelete: (...args) => void; + onDrawOnClick: (...args) => void; + onDrawOnStart: (...args) => void; + onDrawOnStop: (...args) => void; + onDrawInvalidGeometry: (...args) => void; + onDrawEditSaveInitialFeature: (...args) => void; + onDrawSelectionchange: (...args) => void; + onDrawModeChange: (...args) => void; +} + +export class AbstractDraw implements DrawEventsInterface { + protected config; + public arlasMap: AbstractArlasMapGL; + public enabled: boolean; + public drawProvider: MapboxDraw; + public constructor(config: any, enabled: boolean, map: AbstractArlasMapGL) { + const modes = MapboxDraw.modes; + this.config = JSON.parse(JSON.stringify(config)); + this.config.modes = Object.assign(modes, config.modes); + this.drawProvider = new MapboxDraw(this.config); + this.arlasMap = map; + this.enabled = enabled; + } + + public onAdd(map) { + const controlContainer = this.drawProvider.onAdd(map); + if (!this.enabled) { + controlContainer.className += ' draw-control-disabled'; + } + return controlContainer; + } + + public onRemove(map) { + return this.drawProvider.onRemove(map); + } + + public setMode(drawModes: DrawModes, replaceMode: any) { + this.drawProvider.modes[drawModes] = replaceMode; + } + + public getAllFeatures() { + return this.getAll().features; + } + + public onDrawCreate(fn: (e) => void): void { + this.on('draw.create', (e) => { + fn(e); + }); + } + + public onDrawDelete(fn: (e) => void): void { + this.on('draw.delete', (e) => { + fn(e); + }); + } + + public onDrawEditSaveInitialFeature(fn: (e) => void): void { + this.on('draw.edit.saveInitialFeature', (e) => { + fn(e); + }); + } + + public onDrawInvalidGeometry(fn: (e) => void): void { + this.on('draw.invalidGeometry', (e) => { + fn(e); + }); + } + + public onDrawModeChange(fn: (e) => void): void { + this.on('draw.modechange', (e) => { + fn(e); + }); + } + + public onDrawOnClick(fn: (e) => void): void { + this.on('draw.onClick', (e) => { + fn(e); + }); + } + + public onDrawOnStart(fn: (e) => void): void { + this.on('draw.onStart', (e) => { + fn(e); + }); + } + + public onDrawOnStop(fn: (e) => void): void { + this.on('draw.onStop', (e) => { + fn(e); + }); + } + + public onDrawSelectionchange(fn: (e) => void): void { + this.on('draw.selectionchange', (e) => { + fn(e); + }); + } + + public onDrawUpdate(fn: (e) => void): void { + this.on('draw.update', (e) => { + fn(e); + }); + } + + public getMode(modes: DrawModes) { + return this.drawProvider.modes[modes]; + } + + public on(event: DrawEvents, func: (e) => void): void { + this.arlasMap.on(event, func); + } + + public add(feature: Feature | FeatureCollection) { + this.drawProvider.add(feature); + } + + public get(featureId: string): Feature | undefined { + return this.drawProvider.get(featureId); + } + + public delete(ids: string | Array): this { + this.drawProvider.delete(ids); + return this; + } + public deleteAll(): this { + this.drawProvider.deleteAll(); + return this; + } + + public set(featureCollection: FeatureCollection): Array { + return this.drawProvider.set(featureCollection); + } + + public trash(): this { + this.drawProvider.trash(); + return this; + } + + public combineFeatures(): this { + this.drawProvider.combineFeatures(); + return this; + } + public uncombineFeatures(): this { + this.drawProvider.uncombineFeatures(); + return this; + } + + public getCurrentMode(): string { + return this.drawProvider.getMode(); + } + + public getFeatureIdsAt(point: { x: number; y: number; }): Array { + return this.drawProvider.getFeatureIdsAt(point); + } + + public getSelectedIds(): Array { + return this.drawProvider.getSelectedIds(); + } + + public getSelected() { + return this.drawProvider.getSelected(); + } + + public getAll() { + return this.drawProvider.getAll(); + } + + public getSelectedFeatures() { + return this.getSelected().features; + } + + public setFeatureProperty(featureId: string, property: string, value: any): this { + this.drawProvider.setFeatureProperty(featureId, property, value); + return this; + } + + public changeMode(mode: string, opt?: any): this { + this.drawProvider.changeMode(mode, opt); + return this; + } + + + +} diff --git a/projects/arlas-map/src/lib/draw/arlas-draw.component.html b/projects/arlas-map/src/lib/draw/arlas-draw.component.html new file mode 100644 index 00000000..403f9dd6 --- /dev/null +++ b/projects/arlas-map/src/lib/draw/arlas-draw.component.html @@ -0,0 +1,2 @@ +
+ {{FINISH_DRAWING | translate}}
\ No newline at end of file diff --git a/projects/arlas-map/src/lib/draw/arlas-draw.component.scss b/projects/arlas-map/src/lib/draw/arlas-draw.component.scss new file mode 100644 index 00000000..0c79a0f2 --- /dev/null +++ b/projects/arlas-map/src/lib/draw/arlas-draw.component.scss @@ -0,0 +1,19 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + \ No newline at end of file diff --git a/projects/arlas-map/src/lib/draw/arlas-draw.component.ts b/projects/arlas-map/src/lib/draw/arlas-draw.component.ts new file mode 100644 index 00000000..1baf44b6 --- /dev/null +++ b/projects/arlas-map/src/lib/draw/arlas-draw.component.ts @@ -0,0 +1,735 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Component, EventEmitter, HostListener, Input, OnInit, Output, SimpleChanges, ViewEncapsulation } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { marker } from '@colsen1991/ngx-translate-extract-marker'; +import StaticMode from '@mapbox/mapbox-gl-draw-static-mode'; +import { TranslateService } from '@ngx-translate/core'; +import centroid from '@turf/centroid'; +import cleanCoords from '@turf/clean-coords'; +import { Feature, FeatureCollection, Geometry, Polygon, polygon } from '@turf/helpers'; +import { ArlasMapFrameworkService } from '../arlas-map-framework.service'; +import { AbstractArlasMapService } from '../arlas-map.service'; +import { AbstractArlasMapGL } from '../map/AbstractArlasMapGL'; +import { DrawControlsOption } from '../map/model/controls'; +import { MapMouseEvent } from '../map/model/events'; +import { ArlasPoint } from '../map/model/geometry'; +import { latLngToWKT } from '../map/tools'; +import { AbstractDraw } from './AbstractDraw'; +import { AoiDimensions, BboxDrawCommand } from './draw.models'; +import { MapboxAoiDrawService } from './draw.service'; +import limitVertexDirectSelectMode from './modes/LimitVertexDirectSelectMode'; +import validGeomDrawPolygonMode from './modes/ValidGeomDrawPolygonMode'; +import { circleMode } from './modes/circles/circle.mode'; +import radiusCircleMode from './modes/circles/radius.circle.mode'; +import directModeOverride from './modes/directSelectOverride'; +import simpleSelectModeOverride from './modes/simpleSelectOverride'; +import { stripDirectSelectMode } from './modes/strip/strip.direct.mode'; +import stripMode from './modes/strip/strip.mode'; +import * as styles from './themes/default-theme'; +@Component({ + selector: 'arlas-draw', + templateUrl: './arlas-draw.component.html', + styleUrls: ['./arlas-draw.component.scss'], + encapsulation: ViewEncapsulation.None +}) +/** L: a layer class/interface. + * S: a source class/interface. + * M: a Map configuration class/interface. + */ +export class ArlasDrawComponent implements OnInit { + + @Input() public map: AbstractArlasMapGL; + + @Input() private emptyData: FeatureCollection = { + 'type': 'FeatureCollection', + 'features': [] + }; + /** @description Options object for draw tools : https://github.com/mapbox/mapbox-gl-draw/blob/master/docs/API.md#options */ + @Input() public drawOption: any = {}; + /** Draw instance. */ + public draw: AbstractDraw; + /** @description Features drawn at component start */ + @Input() public drawData: FeatureCollection = ({ ...this.emptyData }); + /** @description Whether the draw tools are activated. */ + @Input() public drawButtonEnabled = false; + /** @description Maximum number of vertices allowed for a polygon. */ + @Input() public drawPolygonVerticesLimit: number; + /** @description Whether the drawing buffer is activated */ + /** If true, the map's canvas can be exported to a PNG using map.getCanvas().toDataURL(). Default: false */ + @Input() public preserveDrawingBuffer = false; + + /** @description Emits the geojson of an aoi added to the map. */ + @Output() public onAoiChanged: EventEmitter> = new EventEmitter(); + + /** @description Emits the the dimensions of the polygon/bbox that is being drawn. */ + @Output() public onAoiEdit: EventEmitter = new EventEmitter(); + + + /** Set to true when the selected drawn geometry is changed. */ + protected drawnSelectionChanged = false; + /** Number of drawn vertices (incremented in draw mode). Reset to 0 when the drawing is finished. */ + public nbPolygonVertices = 0; + /** Number of clicks while drawing a geometry. */ + public drawClickCounter = 0; + + /** List of drawn polygons centroid */ + public polygonlabeldata: FeatureCollection = ({ ...this.emptyData }); + + + /** Drawn geometry's state when editing/updating. */ + protected savedEditFeature = null; + /** Map container Html element */ + protected canvas: HTMLElement; + /** Canvas of the bbox while being drawn. This variable is set to undefined when the draw ends. */ + private box: HTMLElement; + /** Point coordinates when the bbox drawing starts*/ + protected start: ArlasPoint; + /** Point coordinates when the bbox drawing is being drawn. Changes on move.*/ + protected current: ArlasPoint; + /** Message shown to explain how to end drawing. */ + public FINISH_DRAWING = marker('Double click to finish drawing'); + /** Html element that holds the FINISH_DRAWING message. */ + protected finishDrawTooltip: HTMLElement; + + + public constructor(private readonly drawService: MapboxAoiDrawService, private readonly _snackBar: MatSnackBar, + private readonly translate: TranslateService, + protected mapFrameworkService: ArlasMapFrameworkService, + protected mapService: AbstractArlasMapService) { + this.drawService.editAoi$.pipe(takeUntilDestroyed()).subscribe(ae => this.onAoiEdit.emit(ae)); + this.drawService.drawBbox$.pipe(takeUntilDestroyed()).subscribe({ + next: (bboxDC: BboxDrawCommand) => { + this.drawBbox(bboxDC.east, bboxDC.south, bboxDC.west, bboxDC.north); + } + }); + } + + /** + * @description Stops the drawing mode by changing to static mode. + */ + private stopDrawingAtVerticeLimit() { + if (this.nbPolygonVertices === this.drawPolygonVerticesLimit) { + this.draw.changeMode('static'); + this.drawService.isDrawingPolygon = false; + this.nbPolygonVertices = 0; + } + } + + private listenToDrawOnCreate() { + this.draw.on('draw.create', (e) => { + this.onAoiChanged.next( + { + 'type': 'FeatureCollection', + 'features': this.draw.getAllFeatures().filter(fc => + this.drawService.isValidPolygon(fc) || + this.drawService.isValidCircle(fc) + ).map(f => cleanCoords(f)) + }); + }); + } + + private listenToDrawUpdate() { + this.draw.on('draw.update', (e) => { + if (e) { + const features = e.features; + if (features && features.length > 0) { + this.savedEditFeature = { ...features[0] }; + this.savedEditFeature.coordinates = [[]]; + features[0].geometry.coordinates[0].forEach(f => this.savedEditFeature.coordinates[0].push(f)); + } + } + }); + } + + private listenToDrawDelete() { + this.draw.on('draw.delete', (e) => { + this.onAoiChanged.next( + { + 'type': 'FeatureCollection', + 'features': this.draw.getAllFeatures().filter(fc => + this.drawService.isPolygon(fc) || + this.drawService.isCircle(fc) + ).map(f => cleanCoords(f)) + }); + }); + } + + private listenToDrawInvalidGeometry() { + this.draw.onDrawInvalidGeometry((e) => { + if (this.savedEditFeature) { + const featureCoords = this.savedEditFeature.coordinates[0].slice(); + if (featureCoords[0][0] !== featureCoords[featureCoords.length - 1][0] || + featureCoords[0][1] !== featureCoords[featureCoords.length - 1][1]) { + featureCoords.push(featureCoords[0]); + } + const currentFeature = { + id: '', + type: 'Feature', + geometry: { + 'type': 'Polygon', + 'coordinates': [featureCoords] + }, + properties: {} + }; + currentFeature.id = this.savedEditFeature.id; + currentFeature.properties = this.savedEditFeature.properties; + this.draw.add(currentFeature as Feature); + } + this.openInvalidGeometrySnackBar(); + this.mapFrameworkService.setMapCursor(this.map, ''); + }); + } + + private listenToDrawSelectionChange() { + this.draw.onDrawSelectionchange((e) => { + this.drawnSelectionChanged = true; + if (e.features.length > 0) { + this.drawService.isDrawSelected = true; + } else { + this.savedEditFeature = null; + this.drawService.isDrawSelected = false; + this.onAoiChanged.next( + { + 'type': 'FeatureCollection', + 'features': this.draw.getAllFeatures().filter(fc => + this.drawService.isValidPolygon(fc) || + this.drawService.isValidCircle(fc) + ).map(f => cleanCoords(f)) + }); + this.drawService.isDrawingBbox = false; + this.drawService.isDrawingPolygon = false; + this.drawService.isDrawingCircle = false; + this.drawService.isDrawingStrip = false; + this.drawService.isInSimpleDrawMode = false; + this.draw.changeMode('static'); + this.mapFrameworkService.setMapCursor(this.map, ''); + } + }); + } + + private listenToDrawModeChange() { + this.draw.onDrawModeChange((e) => { + this.drawService.isDrawingPolygon = e.mode === this.draw.getMode('DRAW_POLYGON'); + this.drawService.isDrawingStrip = e.mode === this.draw.getMode('DIRECT_STRIP'); + this.drawService.isDrawingCircle = e.mode === this.draw.getMode('DRAW_CIRCLE') || e.mode === this.draw.getMode('DRAW_RADIUS_CIRCLE'); + if (this.drawService.isDrawingPolygon || this.drawService.isDrawingCircle || this.drawService.isDrawingStrip || e.mode === 'static') { + this.drawService.isInSimpleDrawMode = false; + } + if (e.mode === 'simple_select') { + this.drawService.isInSimpleDrawMode = true; + } else if (e.mode === 'static') { + this.mapFrameworkService.setMapCursor(this.map, ''); + } else if (e.mode === 'direct_select') { + const selectedFeatures = this.draw.getSelectedFeatures(); + const selectedIds = this.draw.getSelectedIds(); + if (selectedFeatures && selectedIds && selectedIds.length > 0) { + if (selectedFeatures[0].properties.source === 'bbox') { + this.draw.changeMode('simple_select', { + featureIds: [selectedIds[0]] + }); + this.drawService.isInSimpleDrawMode = true; + } else if (this.drawPolygonVerticesLimit && selectedFeatures[0].properties.meta !== 'strip') { + this.draw.changeMode('limit_vertex', { + featureId: selectedIds[0], + maxVertexByPolygon: this.drawPolygonVerticesLimit, + selectedCoordPaths: (selectedFeatures[0] as Feature).geometry.coordinates + }); + this.drawService.isInSimpleDrawMode = false; + } else if (this.drawPolygonVerticesLimit && selectedFeatures[0].properties.meta === 'strip') { + this.draw.changeMode('direct_strip', { + featureId: selectedIds[0], + maxLength: selectedFeatures[0].properties.maxLength, + halfSwath: selectedFeatures[0].properties.halfSwath, + }); + this.drawService.isInSimpleDrawMode = false; + } + } else { + this.drawService.isInSimpleDrawMode = false; + this.mapFrameworkService.setMapCursor(this.map, ''); + } + } + }); + + } + + public ngOnInit(): void { + this.finishDrawTooltip = document.getElementById('polygon-finish-draw-tooltip'); + const drawStyles = styles.default; + const drawOptions = { + ...this.drawOption, + ...{ + styles: drawStyles, + modes: { + static: StaticMode, + limit_vertex: limitVertexDirectSelectMode, + draw_polygon: validGeomDrawPolygonMode, + draw_circle: circleMode, + draw_radius_circle: radiusCircleMode, + draw_strip: stripMode, + direct_strip: stripDirectSelectMode, + direct_select: directModeOverride, + simple_select: simpleSelectModeOverride + } + } + }; + this.draw = this.mapFrameworkService.createDraw(drawOptions, this.drawButtonEnabled, this.map); + this.draw.setMode('DRAW_CIRCLE', 'draw_circle'); + this.draw.setMode('DRAW_RADIUS_CIRCLE', 'draw_radius_circle'); + this.draw.setMode('DRAW_STRIP', 'draw_strip'); + this.draw.setMode('STATIC', 'static'); + this.draw.setMode('DIRECT_STRIP', 'direct_strip'); + const drawControlConfig: DrawControlsOption = { + draw: { control: this.draw }, + addGeoBox: { + enable: true, + overrideEvent: + { + event: 'click', + fn: this.addGeoBox + } + }, + removeAois: { + enable: true, + overrideEvent: { event: 'click', fn: this.removeAois } + } + }; + this.map.initDrawControls(drawControlConfig); + this.drawService.setDraw(this.draw); + this.mapFrameworkService.onMapEvent('load', this.map, () => { + this.mapService.declareLabelSources('', this.polygonlabeldata, this.map); + this.draw.changeMode('static'); + this.canvas = this.map.getCanvasContainer(); + this.canvas.addEventListener('mousedown', this.mousedown, true); + this.listenToDrawOnCreate(); + this.listenToDrawUpdate(); + this.listenToDrawDelete(); + const mouseMoveForDraw = (e: MouseEvent) => { + const x = e.clientX; + const y = e.clientY; + this.finishDrawTooltip.style.top = (y + 20) + 'px'; + this.finishDrawTooltip.style.left = (x + 20) + 'px'; + }; + + this.draw.onDrawOnClick((e) => { + if (this.drawClickCounter === 0) { + window.addEventListener('mousemove', mouseMoveForDraw); + } + this.drawClickCounter++; + }); + this.draw.onDrawOnStart((e) => { + window.removeEventListener('mousemove', mouseMoveForDraw); + this.drawClickCounter = 0; + this.mapFrameworkService.setMapCursor(this.map, ''); + }); + this.draw.onDrawOnStop((e) => { + window.removeEventListener('mousemove', mouseMoveForDraw); + this.drawClickCounter = 0; + this.mapFrameworkService.setMapCursor(this.map, ''); + }); + + this.listenToDrawInvalidGeometry(); + + this.draw.onDrawEditSaveInitialFeature((edition) => { + this.savedEditFeature = { ...edition.feature }; + this.savedEditFeature.coordinates = [[]]; + edition.feature.coordinates[0].forEach(c => this.savedEditFeature.coordinates[0].push(c)); + }); + + this.listenToDrawSelectionChange(); + this.listenToDrawModeChange(); + this.mapFrameworkService.onMapEvent('click', this.map, (e) => { + if (this.drawService.isDrawingCircle) { + return; + } + if (this.drawService.isDrawingPolygon) { + this.nbPolygonVertices++; + this.stopDrawingAtVerticeLimit(); + } else { + this.nbPolygonVertices = 0; + const features = this.map.queryRenderedFeatures(e.point); + // edit polygon condition : no arlas feature && mapbox-gl-draw source present + const editCondition = features.filter(f => f.layer.id?.indexOf('arlas') >= 0).length === 0 && + features.filter(f => f.source.startsWith('mapbox-gl-draw')).length > 0; + if (editCondition) { + const candidates = features.filter(f => f.source.startsWith('mapbox-gl-draw')); + // edit only on click on the border of the polygon + const candidatesProperties = candidates.filter(f => f.layer.id?.indexOf('stroke') >= 0)[0]?.properties; + if (candidatesProperties?.id) { + if (candidatesProperties.user_meta === 'strip') { + this.draw.changeMode('direct_strip', { + featureId: candidatesProperties.id, + maxLength: candidatesProperties.user_maxLength, + halfSwath: candidatesProperties.user_halfSwath + }); + this.drawService.isInSimpleDrawMode = false; + } else { + this.draw.changeMode('simple_select', { + featureIds: [candidatesProperties.id] + }); + this.drawService.isInSimpleDrawMode = true; + } + + } + } + } + }); + }); + + // Mouse events + this.mapFrameworkService.onMapEvent('mousedown', this.map, (e: MapMouseEvent) => { + this.drawService.startBboxDrawing(); + }); + this.mapFrameworkService.onMapEvent('mouseup', this.map, (e: MapMouseEvent) => { + this.drawService.stopBboxDrawing(); + }); + + this.mapFrameworkService.onMapEvent('mousemove', this.map, (e: MapMouseEvent) => { + const lngLat = e.lngLat; + if (this.drawService.isDrawingBbox || this.drawService.isDrawingPolygon) { + this.mapFrameworkService.setMapCursor(this.map, 'crosshair'); + this.map.moveLngLat = lngLat; + } + if (this.drawService.bboxEditionState.isDrawing) { + const startlng: number = this.map.startLngLat.lng; + const endlng: number = this.map.moveLngLat.lng; + const startlat: number = this.map.startLngLat.lat; + const endlat: number = this.map.moveLngLat.lat; + const west = Math.min(startlng, endlng); + const north = Math.max(startlat, endlat); + const east = Math.max(startlng, endlng); + const south = Math.min(startlat, endlat); + const coordinates = [[ + [east, south], + [east, north], + [west, north], + [west, south], + [east, south], + ]]; + const polygonGeojson = { + type: 'Feature', + properties: { + source: 'bbox' + }, + geometry: { + type: 'Polygon', + coordinates: coordinates + } + }; + this.drawService.emitDimensions(polygonGeojson as Feature); + } + }); + + } + + public ngOnChanges(changes: SimpleChanges): void { + if (this.map && this.map.getMapProvider() !== undefined) { + if (changes['drawData'] !== undefined && this.drawService.isReady) { + this.drawData = changes['drawData'].currentValue; + console.log(this.drawData); + const centroides = new Array(); + this.drawData.features.forEach(feature => { + const poly = polygon((feature.geometry as Polygon).coordinates); + const cent = centroid(poly); + cent.properties.arlas_id = feature.properties.arlas_id; + centroides.push(cent); + }); + this.polygonlabeldata = { + type: 'FeatureCollection', + features: centroides + }; + if (!this.drawnSelectionChanged) { + this.drawService.addFeatures(this.drawData, /** deleteOld */ true); + } + this.drawnSelectionChanged = false; + this.mapService.updateLabelSources(this.map.POLYGON_LABEL_SOURCE, this.polygonlabeldata, this.map); + } + + } + } + + /** + * @description Triggered when drawing a bbox has started: + * - It disables the map drag pan. + * - It stores in the component's scope the start's cooordinates. + */ + private readonly mousedown = (e) => { + // Continue the rest of the function if we add a geobox. + if (!this.drawService.isDrawingBbox) { + return; + } + // Disable default drag zooming when we add a geobox. + this.map.disableDragPan(); + // Call functions for the following events + document.addEventListener('mousemove', this.mousemove); + document.addEventListener('mouseup', this.mouseup); + // Capture the first xy coordinates + this.start = this.mapFrameworkService.getPointFromScreen(e, this.canvas); + }; + + /** + * @description Triggered while moving the mouse when drawing the bbox: + * - It draws on the map a bbox canvas. + * - It stores in the component's scope the current mouse's cooordinates. + */ + private readonly mousemove = (e) => { + // Capture the ongoing xy coordinates + this.current = this.mapFrameworkService.getPointFromScreen(e, this.canvas); + // Append the box element if it doesn't exist + if (this.box === undefined) { + this.box = document.createElement('div'); + this.box.classList.add('boxdraw'); + this.canvas.appendChild(this.box); + } + const minX = Math.min(this.start.x, this.current.x); + const maxX = Math.max(this.start.x, this.current.x); + const minY = Math.min(this.start.y, this.current.y); + const maxY = Math.max(this.start.y, this.current.y); + // Adjust width and xy position of the box element ongoing + const pos = 'translate(' + minX + 'px,' + minY + 'px)'; + this.box.style.transform = pos; + this.box.style.webkitTransform = pos; + this.box.style.width = maxX - minX + 'px'; + this.box.style.height = maxY - minY + 'px'; + }; + + /** + * @description Triggerd on the second click to end drawing the bbox. + * - Restores the drag pan on the map. + * - Removes the bbox canvas. + * - Draws the bbox feature on the map. + * @param e Mouse event + */ + private readonly mouseup = (e) => { + const f = this.mapFrameworkService.getPointFromScreen(e, this.canvas); + document.removeEventListener('mousemove', this.mousemove); + document.removeEventListener('mouseup', this.mouseup); + this.mapFrameworkService.setMapCursor(this.map, ''); + this.map.enableDragPan(); + // Capture xy coordinates + if (this.start.x !== f.x && this.start.y !== f.y) { + this.finish([[this.start, f], [e.lngLat]]); + } else if (this.box) { + this.box.parentNode.removeChild(this.box); + this.box = undefined; + } + this.drawService.endDimensionsEmission(); + }; + + /** + * @description Draws the bbox feature on the map and removes the bbox canvas. + * @param bbox Start/End coordinates of the bbox. + */ + private finish(bbox?) { + if (bbox) { + const startlng: number = this.map.startLngLat.lng; + const endlng: number = this.map.endLngLat.lng; + const startlat: number = this.map.startLngLat.lat; + const endlat: number = this.map.endLngLat.lat; + const west = Math.min(startlng, endlng); + const north = Math.max(startlat, endlat); + const east = Math.max(startlng, endlng); + const south = Math.min(startlat, endlat); + this.drawBbox(east, south, west, north); + if (this.box) { + this.box.parentNode.removeChild(this.box); + this.box = undefined; + } + } + } + + /** + * @description Emits the newly drawn bbox. It completes the drawBbox event emitted by the drawService. + * @param east + * @param south + * @param west + * @param north + */ + protected drawBbox(east, south, west, north) { + const coordinates = [[ + [east, south], + [east, north], + [west, north], + [west, south], + [east, south], + ]]; + const polygonGeojson: Feature = { + type: 'Feature', + properties: { + source: 'bbox' + }, + geometry: { + type: 'Polygon', + coordinates: coordinates + } + }; + const geoboxdata = { ...this.emptyData}; + geoboxdata.features = []; + if (this.drawData?.features && this.drawData.features.length > 0) { + this.drawData.features.forEach(df => geoboxdata.features.push(df)); + } + geoboxdata.features.push(polygonGeojson); + /** This allows to keep the drawn box on the map. It will be overriden in ngOnChanges `changes['drawData']` */ + this.drawService.addFeatures(geoboxdata, /** deleteOld */ true); + this.onAoiChanged.next(geoboxdata); + this.drawService.isDrawingBbox = false; + this.drawService.disableBboxEdition(); + this.drawService.endDimensionsEmission(); + } + + /** @description Enables bbox drawing mode.*/ + public addGeoBox() { + this.mapFrameworkService.setMapCursor(this.map, 'crosshair'); + this.drawService.enableBboxEdition(); + this.drawService.isDrawingBbox = true; + } + + /** + * @description Removes all the aois if none of them is selected. Otherwise it removes the selected one only + */ + public removeAois() { + this.mapFrameworkService.setMapCursor(this.map, ''); + this.drawService.isDrawingBbox = false; + this.deleteSelectedItem(); + } + + /** @description Deletes the selected drawn geometry. If no drawn geometry is selected, all geometries are deteleted */ + public deleteSelectedItem() { + if (this.drawService.isDrawSelected) { + this.draw.trash(); + } else { + this.drawService.deleteAll(); + } + this.drawService.isDrawSelected = false; + this.onAoiChanged.next(this.draw.getAll() as FeatureCollection); + } + + /** + * @description Shows an invalid-geometry error on a snack bar. + */ + public openInvalidGeometrySnackBar() { + this._snackBar.open(this.translate.instant('Invalid geometry'), this.translate.instant('Ok'), { + duration: 3 * 1000, + verticalPosition: 'top', + panelClass: 'invalid-geo-toast' + }); + } + + /** + * @description Switches to a drawing mode of a polygon, circle or radisu circle. + * @param mode Draw mode (DRAW_POLYGON, DRAW_CIRCLE or DRAW_RADIUS_CIRCLE). Default to DRAW_POLYGON + * @param option Mapboxdraw option. + */ + public switchToDrawMode(mode?: string, option?: any) { + const selectedMode = mode ?? this.draw.getMode('DRAW_POLYGON'); + this.drawService.isDrawingCircle = selectedMode === this.draw.getMode('DRAW_CIRCLE') + || selectedMode === this.draw.getMode('DRAW_RADIUS_CIRCLE'); + this.drawService.isDrawingPolygon = selectedMode === this.draw.getMode('DRAW_POLYGON'); + this.drawService.isInSimpleDrawMode = false; + this.draw.changeMode(selectedMode, option ?? {}); + } + + /** + * @description Switches to direct_select mode. + * @param option Mapboxdraw option. + */ + public switchToDirectSelectMode(option?: { featureIds: Array; allowCircleResize: boolean; } + | { featureId: string; allowCircleResize: boolean; }) { + this.draw.changeMode('direct_select', option); + this.drawService.isInSimpleDrawMode = false; + this.drawService.isDrawingCircle = false; + this.drawService.isDrawingStrip = false; + this.drawService.isDrawingPolygon = false; + } + + /** + * @description Switches to simple_select mode. + * @param option Mapboxdraw option. + */ + public switchToEditMode() { + this.draw.changeMode('simple_select', { + featureIds: this.draw.getAll().features.map(f => f.id) + }); + this.drawService.isInSimpleDrawMode = true; + this.drawService.isDrawingCircle = false; + this.drawService.isDrawingStrip = false; + this.drawService.isDrawingPolygon = false; + } + + /** + * @description Returns all the drawn polygons as wkt or geojson. + * @param mode 'wkt' | 'geojson' + * @returns + */ + public getAllPolygon(mode: 'wkt' | 'geojson'): string | Object { + let polygon; + if (mode === 'wkt') { + polygon = latLngToWKT(this.draw.getAll().features.filter(f => this.drawService.isPolygon(f) || + this.drawService.isCircle(f)).map(f => cleanCoords(f))); + } else { + polygon = { + 'type': 'FeatureCollection', + 'features': this.draw.getAll().features.filter(f => this.drawService.isPolygon(f) || + this.drawService.isCircle(f)).map(f => cleanCoords(f)) + }; + } + return polygon; + } + + /** + * @returns the selected polygon geometry in WKT or GeoJson given the mode + * @param mode : 'wkt' | 'geojson' + * @returns Wkt string or Geojson object. + */ + public getSelectedPolygon(mode: 'wkt' | 'geojson'): string | Object { + let polygon; + if (mode === 'wkt') { + polygon = latLngToWKT(this.draw.getSelected().features.filter(f => this.drawService.isPolygon(f) || + this.drawService.isCircle(f))); + } else { + polygon = { + 'type': 'FeatureCollection', + 'features': this.draw.getSelected().features.filter(f => this.drawService.isPolygon(f) || + this.drawService.isCircle(f)) + }; + } + return polygon; + } + + @HostListener('document:keydown', ['$event']) + public handleKeyboardEvent(event: KeyboardEvent) { + if (event.key === 'Escape' && this.drawService.isDrawingBbox) { + this.mapFrameworkService.setMapCursor(this.map, ''); + this.drawService.isDrawingBbox = false; + document.removeEventListener('mousemove', this.mousemove); + document.removeEventListener('mouseup', this.mouseup); + this.mapFrameworkService.setMapCursor(this.map, ''); + if (this.box) { + this.box.parentNode.removeChild(this.box); + this.box = undefined; + } + this.map.enableDragPan(); + this.drawService.endDimensionsEmission(); + } + } + +} + diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/draw.models.ts b/projects/arlas-map/src/lib/draw/draw.models.ts similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl/draw/draw.models.ts rename to projects/arlas-map/src/lib/draw/draw.models.ts diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/draw.service.ts b/projects/arlas-map/src/lib/draw/draw.service.ts similarity index 88% rename from projects/arlas-components/src/lib/components/mapgl/draw/draw.service.ts rename to projects/arlas-map/src/lib/draw/draw.service.ts index 1b8044e9..207315b1 100644 --- a/projects/arlas-components/src/lib/components/mapgl/draw/draw.service.ts +++ b/projects/arlas-map/src/lib/draw/draw.service.ts @@ -18,8 +18,6 @@ */ import { Injectable } from '@angular/core'; -import mapboxgl from 'mapbox-gl'; -import MapboxDraw from '@mapbox/mapbox-gl-draw'; import area from '@turf/area'; import { Feature, FeatureCollection, lineString } from '@turf/helpers'; import bbox from '@turf/bbox'; @@ -27,11 +25,11 @@ import length from '@turf/length'; import { Subject } from 'rxjs'; import { AoiDimensions, BboxDrawCommand, Corner, EditionState } from './draw.models'; import { marker } from '@colsen1991/ngx-translate-extract-marker'; +import { AbstractDraw } from './AbstractDraw'; @Injectable() export class MapboxAoiDrawService { - private map: mapboxgl.Map; - private mapDraw: MapboxDraw; + private mapDraw: AbstractDraw; private editionId: string; private registeringMode: boolean; private ids: Set = new Set(); @@ -45,6 +43,20 @@ export class MapboxAoiDrawService { public bboxEditionState: EditionState; public polygonEditionState: EditionState; + /** Set to true when the user is drawing a bbox. */ + public isDrawingBbox = false; + /** Set to true when the user is drawing a circle. */ + public isDrawingCircle = false; + /** Set to true when the user is drawing a strip. */ + public isDrawingStrip = false; + /** Set to true when the user is drawing a polygon. */ + public isDrawingPolygon = false; + /** Set to true when the user is in simple draw mode. */ + public isInSimpleDrawMode = false; + /** Set to true when the drawn geometry is selected. */ + public isDrawSelected = false; + public isReady = false; + public constructor() { this.bboxEditionState = { enabled: false, @@ -98,18 +110,15 @@ export class MapboxAoiDrawService { this.bboxEditionState.isEditing = false; } - public setMap(map: mapboxgl.Map) { - this.map = map; + public setDraw(mapboxDraw: AbstractDraw) { + this.mapDraw = mapboxDraw; + this.isReady = true; this.onSelectionChange(); this.onRender(); this.onDelete(); this.onStop(); } - public setMapboxDraw(mapboxDraw: mapboxgl.Map) { - this.mapDraw = mapboxDraw; - } - /** * Add new features to the mapboxdraw object. * @param fc Featurecollection to be added to mapboxdraw object. @@ -150,7 +159,7 @@ export class MapboxAoiDrawService { /** on selection of a drawn polygon, we get its corresponding id. */ private onSelectionChange() { - this.map.on('draw.selectionchange', (e) => { + this.mapDraw.on('draw.selectionchange', (e) => { const features = e.features; if (this.hasFeatures(features)) { this.editionId = features[0].id; @@ -171,7 +180,7 @@ export class MapboxAoiDrawService { * - Stops emitting Aoi dimension info. * */ private onDelete() { - this.map.on('draw.delete', (e) => { + this.mapDraw.on('draw.delete', (e) => { e.features.forEach(f => this.unregister(f.id)); this.editionId = undefined; this.endDimensionsEmission(); @@ -180,7 +189,7 @@ export class MapboxAoiDrawService { private onStop() { - this.map.on('draw.onStop', (e) => { + this.mapDraw.on('draw.onStop', (e) => { this.register(this.editionId); this.editionId = undefined; this.endDimensionsEmission(); @@ -194,7 +203,7 @@ export class MapboxAoiDrawService { * - on adding/deleting features from mapboxdraw object. */ private onRender() { - this.map.on('draw.render', (e) => { + this.mapDraw.on('draw.render', (e) => { if (this.mapDraw) { this.registerAll(); const unregisteredFeatures = this.getUnregistredFeatures(); @@ -253,7 +262,7 @@ export class MapboxAoiDrawService { * this method detects this feature on 'draw.render' event. */ private getUnregistredFeatures(): Feature[] { - return this.mapDraw.getAll().features.filter(f => !this.ids.has(f.id)); + return (this.mapDraw.getAllFeatures() as Feature[]).filter(f => !this.ids.has(f.id.toString())); } /** registers the identifiers of each drawn polygon in this service. */ @@ -262,7 +271,7 @@ export class MapboxAoiDrawService { this.ids.clear(); const fc = this.mapDraw.getAll(); if (!!fc && !!fc.features) { - this.ids = new Set(fc.features.map(f => f.id)); + this.ids = new Set(fc.features.map(f => f.id.toString())); } this.registeringMode = false; } @@ -279,8 +288,8 @@ export class MapboxAoiDrawService { } /** Gets the given feature from MapboxDraw object. */ - private getFeature(featureId: string, mapDraw: MapboxDraw): Feature { - return mapDraw.get(featureId); + private getFeature(featureId: string, mapDraw: AbstractDraw): Feature { + return mapDraw.get(featureId) as Feature; } /** Checks if the given feature has enough coordinates to represent an area (polygon) */ diff --git a/projects/arlas-components/src/lib/components/mapgl/model/LimitVertexDirectSelectMode.ts b/projects/arlas-map/src/lib/draw/modes/LimitVertexDirectSelectMode.ts similarity index 98% rename from projects/arlas-components/src/lib/components/mapgl/model/LimitVertexDirectSelectMode.ts rename to projects/arlas-map/src/lib/draw/modes/LimitVertexDirectSelectMode.ts index d647a17a..eb2c24db 100644 --- a/projects/arlas-components/src/lib/components/mapgl/model/LimitVertexDirectSelectMode.ts +++ b/projects/arlas-map/src/lib/draw/modes/LimitVertexDirectSelectMode.ts @@ -20,7 +20,7 @@ import MapboxDraw from '@mapbox/mapbox-gl-draw'; import * as jsts from 'jsts/dist/jsts.min'; -const limitVertexDirectSelectMode = MapboxDraw.modes.direct_select; +export const limitVertexDirectSelectMode = MapboxDraw.modes.direct_select; const reader = new jsts.io.GeoJSONReader(); limitVertexDirectSelectMode.fireInvalidGeom = function (feature) { diff --git a/projects/arlas-components/src/lib/components/mapgl/model/ValidGeomDrawPolygonMode.ts b/projects/arlas-map/src/lib/draw/modes/ValidGeomDrawPolygonMode.ts similarity index 97% rename from projects/arlas-components/src/lib/components/mapgl/model/ValidGeomDrawPolygonMode.ts rename to projects/arlas-map/src/lib/draw/modes/ValidGeomDrawPolygonMode.ts index 671372a2..758699f3 100644 --- a/projects/arlas-components/src/lib/components/mapgl/model/ValidGeomDrawPolygonMode.ts +++ b/projects/arlas-map/src/lib/draw/modes/ValidGeomDrawPolygonMode.ts @@ -20,7 +20,7 @@ import MapboxDraw from '@mapbox/mapbox-gl-draw'; import * as jsts from 'jsts/dist/jsts.min'; -const validGeomDrawPolygonMode = MapboxDraw.modes.draw_polygon; +export const validGeomDrawPolygonMode = MapboxDraw.modes.draw_polygon; const reader = new jsts.io.GeoJSONReader(); validGeomDrawPolygonMode.fireInvalidGeom = function (feature) { diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/circle.mode.ts b/projects/arlas-map/src/lib/draw/modes/circles/circle.mode.ts similarity index 97% rename from projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/circle.mode.ts rename to projects/arlas-map/src/lib/draw/modes/circles/circle.mode.ts index 75fa10bc..d38cc3e3 100644 --- a/projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/circle.mode.ts +++ b/projects/arlas-map/src/lib/draw/modes/circles/circle.mode.ts @@ -21,7 +21,7 @@ import MapboxDraw from '@mapbox/mapbox-gl-draw'; import circle from '@turf/circle'; -const circleMode = { ...MapboxDraw.modes.draw_polygon }; +export const circleMode = { ...MapboxDraw.modes.draw_polygon }; const DEFAULT_RADIUS_IN_KM = 2; circleMode.onSetup = function (opts) { diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/radius.circle.mode.ts b/projects/arlas-map/src/lib/draw/modes/circles/radius.circle.mode.ts similarity index 78% rename from projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/radius.circle.mode.ts rename to projects/arlas-map/src/lib/draw/modes/circles/radius.circle.mode.ts index 7d84e5f2..91875232 100644 --- a/projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/radius.circle.mode.ts +++ b/projects/arlas-map/src/lib/draw/modes/circles/radius.circle.mode.ts @@ -21,28 +21,15 @@ import MapboxDraw from '@mapbox/mapbox-gl-draw'; import circle from '@turf/circle'; import length from '@turf/length'; import numeral from 'numeral'; -const radiusCircleMode = { ...MapboxDraw.modes.draw_line_string }; +import { displayFeatures, updateCoordinates } from '../utils'; + +export const radiusCircleMode = { ...MapboxDraw.modes.draw_line_string }; radiusCircleMode.fireOnStop = function () { this.map.fire('draw.onStop', 'draw end'); }; -function createVertex(parentId, coordinates, path, selected) { - return { - type: 'Feature', - properties: { - meta: 'vertex', - parent: parentId, - coord_path: path, - active: selected ? 'true' : 'false', - }, - geometry: { - type: 'Point', - coordinates, - }, - }; -} function getDisplayMeasurements(feature) { // should log both metric and standard display strings for the current drawn feature @@ -143,17 +130,7 @@ radiusCircleMode.clickAnywhere = function (state, e) { e.lngLat.lng, e.lngLat.lat ); - if (state.direction === 'forward') { - state.currentVertexPosition += 1; // eslint-disable-line - state.line.updateCoordinate( - state.currentVertexPosition, - e.lngLat.lng, - e.lngLat.lat - ); - } else { - state.line.addCoordinate(0, e.lngLat.lng, e.lngLat.lat); - } - + updateCoordinates(state, e); return null; }; @@ -198,41 +175,7 @@ radiusCircleMode.onStop = function (state) { }; radiusCircleMode.toDisplayFeatures = function (state, geojson, display) { - const isActiveLine = geojson.properties.id === state.line.id; - geojson.properties.active = isActiveLine ? 'true' : 'false'; - if (!isActiveLine) { - if (!geojson.geometry.coordinates[0][0]) { - return null; - } - return display(geojson); - } - - // Only render the line if it has at least one real coordinate - if (geojson.geometry.coordinates.length < 2) { - return null; - } - geojson.properties.meta = 'feature'; - - // displays center vertex as a point feature - display( - createVertex( - state.line.id, - geojson.geometry.coordinates[ - state.direction === 'forward' - ? geojson.geometry.coordinates.length - 2 - : 1 - ], - `${state.direction === 'forward' - ? geojson.geometry.coordinates.length - 2 - : 1 - }`, - false - ) - ); - - // displays the line as it is drawn - display(geojson); - + displayFeatures(state, geojson, display); const displayMeasurements = getDisplayMeasurements(geojson); // create custom feature for the current pointer position diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/utils.ts b/projects/arlas-map/src/lib/draw/modes/circles/utils.ts similarity index 99% rename from projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/utils.ts rename to projects/arlas-map/src/lib/draw/modes/circles/utils.ts index f42cb885..18f26fce 100644 --- a/projects/arlas-components/src/lib/components/mapgl/draw/modes/circles/utils.ts +++ b/projects/arlas-map/src/lib/draw/modes/circles/utils.ts @@ -59,4 +59,3 @@ export const dragPan = { }, 0); } }; - diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/modes/directSelectOverride.ts b/projects/arlas-map/src/lib/draw/modes/directSelectOverride.ts similarity index 98% rename from projects/arlas-components/src/lib/components/mapgl/draw/modes/directSelectOverride.ts rename to projects/arlas-map/src/lib/draw/modes/directSelectOverride.ts index a2f13111..de4d3e83 100644 --- a/projects/arlas-components/src/lib/components/mapgl/draw/modes/directSelectOverride.ts +++ b/projects/arlas-map/src/lib/draw/modes/directSelectOverride.ts @@ -24,7 +24,7 @@ import distance from '@turf/distance'; import { createSupplementaryPointsForCircle } from './circles/utils'; -const directModeOverride = MapboxDraw.modes.direct_select; +export const directModeOverride = MapboxDraw.modes.direct_select; directModeOverride.dragFeature = function (state, e, delta) { MapboxDraw.lib.moveFeatures(this.getSelected(), delta); diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/modes/simpleSelectOverride.ts b/projects/arlas-map/src/lib/draw/modes/simpleSelectOverride.ts similarity index 96% rename from projects/arlas-components/src/lib/components/mapgl/draw/modes/simpleSelectOverride.ts rename to projects/arlas-map/src/lib/draw/modes/simpleSelectOverride.ts index ed6c7f99..7e0bb858 100644 --- a/projects/arlas-components/src/lib/components/mapgl/draw/modes/simpleSelectOverride.ts +++ b/projects/arlas-map/src/lib/draw/modes/simpleSelectOverride.ts @@ -21,7 +21,7 @@ import MapboxDraw from '@mapbox/mapbox-gl-draw'; import { createSupplementaryPointsForCircle } from './circles/utils'; -const simpleSelectModeOverride = MapboxDraw.modes.simple_select; +export const simpleSelectModeOverride = MapboxDraw.modes.simple_select; simpleSelectModeOverride.dragMove = function (state, e) { // Dragging when drag move is enabled diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/modes/strip/strip.direct.mode.ts b/projects/arlas-map/src/lib/draw/modes/strip/strip.direct.mode.ts similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl/draw/modes/strip/strip.direct.mode.ts rename to projects/arlas-map/src/lib/draw/modes/strip/strip.direct.mode.ts diff --git a/projects/arlas-components/src/lib/components/mapgl/draw/modes/strip/strip.mode.ts b/projects/arlas-map/src/lib/draw/modes/strip/strip.mode.ts similarity index 81% rename from projects/arlas-components/src/lib/components/mapgl/draw/modes/strip/strip.mode.ts rename to projects/arlas-map/src/lib/draw/modes/strip/strip.mode.ts index 3fe4d653..b22691a4 100644 --- a/projects/arlas-components/src/lib/components/mapgl/draw/modes/strip/strip.mode.ts +++ b/projects/arlas-map/src/lib/draw/modes/strip/strip.mode.ts @@ -18,30 +18,15 @@ */ import MapboxDraw from '@mapbox/mapbox-gl-draw'; -import { polygon, point, bearingToAzimuth } from '@turf/helpers'; -import rhumbDestination from '@turf/rhumb-destination'; -import rhumbBearing from '@turf/rhumb-bearing'; +import { bearingToAzimuth, point, polygon } from '@turf/helpers'; import length from '@turf/length'; +import rhumbBearing from '@turf/rhumb-bearing'; +import rhumbDestination from '@turf/rhumb-destination'; import transformRotate from '@turf/transform-rotate'; import transformTranslate from '@turf/transform-translate'; +import { displayFeatures, updateCoordinates } from '../utils'; -const stripMode = { ...MapboxDraw.modes.draw_line_string }; - -function createVertex(parentId, coordinates, path, selected) { - return { - type: 'Feature', - properties: { - meta: 'vertex', - parent: parentId, - coord_path: path, - active: selected ? 'true' : 'false', - }, - geometry: { - type: 'Point', - coordinates, - }, - }; -} +export const stripMode = { ...MapboxDraw.modes.draw_line_string }; export function rotateStrip(start, end, state, currentMaxBearing = 0, options: any = {}) { const properties = options.properties ? options.properties : {}; @@ -149,16 +134,7 @@ stripMode.clickAnywhere = function (state, e) { e.lngLat.lng, e.lngLat.lat ); - if (state.direction === 'forward') { - state.currentVertexPosition += 1; // eslint-disable-line - state.line.updateCoordinate( - state.currentVertexPosition, - e.lngLat.lng, - e.lngLat.lat - ); - } else { - state.line.addCoordinate(0, e.lngLat.lng, e.lngLat.lat); - } + updateCoordinates(state, e); return null; }; @@ -177,7 +153,7 @@ stripMode.onMouseMove = function (state, e) { const translatedPoint = transformTranslate(endPoint, translateDistance, bearing); const stripFeature = buildStrip(start, translatedPoint.geometry.coordinates, state.halfSwath); stripFeature.properties.parent = state.line.id; - (stripFeature.properties as any).meta = 'strip'; + (stripFeature.properties).meta = 'strip'; state.strip.setCoordinates(stripFeature.geometry.coordinates); state.currentMaxBearing = bearing; state.isStripDrew = true; @@ -228,40 +204,8 @@ stripMode.onStop = function (state) { }; stripMode.toDisplayFeatures = function (state, geojson, display) { - const isActiveLine = geojson.properties.id === state.line.id; - geojson.properties.active = isActiveLine ? 'true' : 'false'; - if (!isActiveLine) { - if (!geojson.geometry.coordinates[0][0]) { - return null; - } - return display(geojson); - } - - // Only render the line if it has at least one real coordinate - if (geojson.geometry.coordinates.length < 2) { - return null; - } - geojson.properties.meta = 'feature'; - - // displays center vertex as a point feature - display( - createVertex( - state.line.id, - geojson.geometry.coordinates[ - state.direction === 'forward' - ? geojson.geometry.coordinates.length - 2 - : 1 - ], - `${state.direction === 'forward' - ? geojson.geometry.coordinates.length - 2 - : 1 - }`, - false - ) - ); + displayFeatures(state, geojson, display); - // displays the line as it is drawn - display(geojson); // create custom feature for the current pointer position const currentVertex = { diff --git a/projects/arlas-map/src/lib/draw/modes/utils.ts b/projects/arlas-map/src/lib/draw/modes/utils.ts new file mode 100644 index 00000000..7f109e98 --- /dev/null +++ b/projects/arlas-map/src/lib/draw/modes/utils.ts @@ -0,0 +1,85 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export function createDrawVertex(parentId, coordinates, path, selected) { + return { + type: 'Feature', + properties: { + meta: 'vertex', + parent: parentId, + coord_path: path, + active: selected ? 'true' : 'false', + }, + geometry: { + type: 'Point', + coordinates, + }, + }; +} +export function displayFeatures(state, geojson, display) { + const isActiveLine = geojson.properties.id === state.line.id; + geojson.properties.active = isActiveLine ? 'true' : 'false'; + if (!isActiveLine) { + if (!geojson.geometry.coordinates[0][0]) { + return null; + } + return display(geojson); + } + + // Only render the line if it has at least one real coordinate + if (geojson.geometry.coordinates.length < 2) { + return null; + } + geojson.properties.meta = 'feature'; + + // displays center vertex as a point feature + display( + createDrawVertex( + state.line.id, + geojson.geometry.coordinates[ + state.direction === 'forward' + ? geojson.geometry.coordinates.length - 2 + : 1 + ], + `${state.direction === 'forward' + ? geojson.geometry.coordinates.length - 2 + : 1 + }`, + false + ) + ); + + // displays the line as it is drawn + display(geojson); + +} + + +export function updateCoordinates(state, e) { + if (state.direction === 'forward') { + state.currentVertexPosition += 1; // eslint-disable-line + state.line.updateCoordinate( + state.currentVertexPosition, + e.lngLat.lng, + e.lngLat.lat + ); + } else { + state.line.addCoordinate(0, e.lngLat.lng, e.lngLat.lat); + } +} diff --git a/projects/arlas-components/src/lib/components/mapgl/model/theme.ts b/projects/arlas-map/src/lib/draw/themes/default-theme.ts similarity index 55% rename from projects/arlas-components/src/lib/components/mapgl/model/theme.ts rename to projects/arlas-map/src/lib/draw/themes/default-theme.ts index 3b0ccc52..a364c9a1 100644 --- a/projects/arlas-components/src/lib/components/mapgl/model/theme.ts +++ b/projects/arlas-map/src/lib/draw/themes/default-theme.ts @@ -17,15 +17,70 @@ * under the License. */ +const roundLineLayout = { + 'line-cap': 'round', + 'line-join': 'round' +}; + +const staticModeVertex = ['all', + ['==', 'meta', 'vertex'], + ['==', '$type', 'Point'], + ['!=', 'mode', 'static'] +]; + +const deactivatedStaticModeFeature = ['all', + ['==', 'active', 'false'], + ['==', '$type', 'Point'], + ['==', 'meta', 'feature'], + ['!=', 'mode', 'static'] +]; +const deactivatedStaticPolygon = ['all', + ['==', 'active', 'false'], + ['==', '$type', 'Polygon'], + ['!=', 'mode', 'static'] +]; + +const activatedMidPoint = ['all', + ['==', '$type', 'Point'], + ['==', 'active', 'true'], + ['!=', 'meta', 'midpoint'] +]; +const staticLineMidPoint = ['all', ['==', 'meta', 'midpoint'], + ['==', 'actionType', 'rotation'], + ['==', '$type', 'LineString'], + ['!=', 'mode', 'static'] +]; + +const staticPolygon = ['all', ['==', 'mode', 'static'], ['==', '$type', 'Polygon']]; +const activePolygon = ['all', ['==', 'active', 'true'], ['==', '$type', 'Polygon']]; +const staticMidpoint = ['all', + ['==', 'meta', 'midpoint'], + ['==', 'actionType', 'resize'], + ['==', '$type', 'Point'], + ['!=', 'mode', 'static'] +]; +const dashedLinePaint = { + 'line-color': '#fbb03b', + 'line-dasharray': [0.2, 2], + 'line-width': 2 +}; + +const linePaint = { + 'line-color': '#3bb2d0', + 'line-width': 2 +}; + +const rotatePointFilter = ['all', + ['==', 'meta', 'midpoint'], + ['==', 'actionType', 'rotation'], + ['==', '$type', 'Point'], + ['!=', 'mode', 'static'] +]; export default [ { 'id': 'gl-draw-polygon-fill-inactive', 'type': 'fill', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Polygon'], - ['!=', 'mode', 'static'] - ], + 'filter': deactivatedStaticPolygon, 'paint': { 'fill-color': '#3bb2d0', 'fill-outline-color': '#3bb2d0', @@ -35,7 +90,7 @@ export default [ { 'id': 'gl-draw-polygon-fill-active', 'type': 'fill', - 'filter': ['all', ['==', 'active', 'true'], ['==', '$type', 'Polygon']], + 'filter': activePolygon, 'paint': { 'fill-color': '#fbb03b', 'fill-outline-color': '#fbb03b', @@ -56,33 +111,16 @@ export default [ { 'id': 'gl-draw-polygon-stroke-inactive', 'type': 'line', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Polygon'], - ['!=', 'mode', 'static'] - ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#3bb2d0', - 'line-width': 2 - } + 'filter': deactivatedStaticPolygon, + 'layout': roundLineLayout, + 'paint': linePaint }, { 'id': 'gl-draw-polygon-stroke-active', 'type': 'line', - 'filter': ['all', ['==', 'active', 'true'], ['==', '$type', 'Polygon']], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#fbb03b', - 'line-dasharray': [0.2, 2], - 'line-width': 2 - } + 'filter': activePolygon, + 'layout': roundLineLayout, + 'paint': dashedLinePaint }, { 'id': 'gl-draw-line-inactive', @@ -92,14 +130,9 @@ export default [ ['==', '$type', 'LineString'], ['!=', 'mode', 'static'] ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#3bb2d0', - 'line-width': 2 - } + 'layout': roundLineLayout, + + 'paint': linePaint }, { 'id': 'gl-draw-line-active', @@ -108,24 +141,13 @@ export default [ ['==', '$type', 'LineString'], ['==', 'active', 'true'] ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#fbb03b', - 'line-dasharray': [0.2, 2], - 'line-width': 2 - } + 'layout': roundLineLayout, + 'paint': dashedLinePaint }, { 'id': 'gl-draw-polygon-and-line-vertex-stroke-inactive', 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'vertex'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': staticModeVertex, 'paint': { 'circle-radius': 5, 'circle-color': '#fff' @@ -134,11 +156,7 @@ export default [ { 'id': 'gl-draw-polygon-and-line-vertex-inactive', 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'vertex'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': staticModeVertex, 'paint': { 'circle-radius': 3, 'circle-color': '#fbb03b' @@ -147,12 +165,7 @@ export default [ { 'id': 'gl-draw-point-point-stroke-inactive', 'type': 'circle', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Point'], - ['==', 'meta', 'feature'], - ['!=', 'mode', 'static'] - ], + 'filter': deactivatedStaticModeFeature, 'paint': { 'circle-radius': 5, 'circle-opacity': 1, @@ -162,12 +175,7 @@ export default [ { 'id': 'gl-draw-point-inactive', 'type': 'circle', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Point'], - ['==', 'meta', 'feature'], - ['!=', 'mode', 'static'] - ], + 'filter': deactivatedStaticModeFeature, 'paint': { 'circle-radius': 3, 'circle-color': '#3bb2d0' @@ -176,11 +184,7 @@ export default [ { 'id': 'gl-draw-point-stroke-active', 'type': 'circle', - 'filter': ['all', - ['==', '$type', 'Point'], - ['==', 'active', 'true'], - ['!=', 'meta', 'midpoint'] - ], + 'filter': activatedMidPoint, 'paint': { 'circle-radius': 7, 'circle-color': '#fff' @@ -189,10 +193,7 @@ export default [ { 'id': 'gl-draw-point-active', 'type': 'circle', - 'filter': ['all', - ['==', '$type', 'Point'], - ['!=', 'meta', 'midpoint'], - ['==', 'active', 'true']], + 'filter': activatedMidPoint, 'paint': { 'circle-radius': 5, 'circle-color': '#fbb03b' @@ -201,7 +202,7 @@ export default [ { 'id': 'gl-draw-polygon-fill-static', 'type': 'fill', - 'filter': ['all', ['==', 'mode', 'static'], ['==', '$type', 'Polygon']], + 'filter': staticPolygon, 'paint': { 'fill-color': '#3bb2d0', 'fill-outline-color': '#3bb2d0', @@ -211,24 +212,17 @@ export default [ { 'id': 'gl-draw-polygon-stroke-static', 'type': 'line', - 'filter': ['all', ['==', 'mode', 'static'], ['==', '$type', 'Polygon']], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#3bb2d0', - 'line-width': 2 - } + 'filter': staticPolygon, + 'layout': roundLineLayout, + + 'paint': linePaint }, { 'id': 'gl-draw-line-static', 'type': 'line', 'filter': ['all', ['==', 'mode', 'static'], ['==', '$type', 'LineString']], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, + 'layout': roundLineLayout, + 'paint': { 'line-color': '#404040', 'line-width': 2 @@ -246,32 +240,15 @@ export default [ { 'id': 'gl-draw-line-rotate-point', 'type': 'line', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'rotation'], - ['==', '$type', 'LineString'], - ['!=', 'mode', 'static'] - // ['==', 'active', 'true'] - ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#fbb03b', - 'line-dasharray': [0.2, 2], - 'line-width': 2 - } + 'filter': staticLineMidPoint, + 'layout': roundLineLayout, + + 'paint': dashedLinePaint }, { 'id': 'gl-draw-polygon-rotate-point-stroke', 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'rotation'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': rotatePointFilter, 'paint': { 'circle-radius': 4, 'circle-color': '#fff' @@ -280,12 +257,7 @@ export default [ { 'id': 'gl-draw-polygon-rotate-point', 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'rotation'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': rotatePointFilter, 'paint': { 'circle-radius': 2, 'circle-color': '#fbb03b' @@ -294,12 +266,7 @@ export default [ { 'id': 'gl-draw-polygon-rotate-point-icon', 'type': 'symbol', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'rotation'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': rotatePointFilter, 'layout': { 'icon-image': 'rotate', 'icon-allow-overlap': true, @@ -318,32 +285,15 @@ export default [ { 'id': 'gl-draw-line-resize-point', 'type': 'line', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'rotation'], - ['==', '$type', 'LineString'], - ['!=', 'mode', 'static'] - // ['==', 'active', 'true'] - ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#fbb03b', - 'line-dasharray': [0.2, 2], - 'line-width': 2 - } + 'filter': staticLineMidPoint, + 'layout': roundLineLayout, + + 'paint': dashedLinePaint }, { 'id': 'gl-draw-polygon-resize-point-stroke', 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'resize'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': staticMidpoint, 'paint': { 'circle-radius': 5, 'circle-color': '#fff' @@ -352,12 +302,7 @@ export default [ { 'id': 'gl-draw-polygon-resize-point', 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'resize'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': staticMidpoint, 'paint': { 'circle-radius': 6, 'circle-color': '#fbb03b' @@ -366,12 +311,7 @@ export default [ { 'id': 'gl-draw-polygon-resize-point-icon', 'type': 'symbol', - 'filter': ['all', - ['==', 'meta', 'midpoint'], - ['==', 'actionType', 'resize'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], + 'filter': staticMidpoint, 'layout': { 'icon-image': 'resize', 'icon-allow-overlap': true, diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/layer-name.pipe.ts b/projects/arlas-map/src/lib/legend/layer-name.pipe.ts similarity index 95% rename from projects/arlas-components/src/lib/components/mapgl-legend/layer-name.pipe.ts rename to projects/arlas-map/src/lib/legend/layer-name.pipe.ts index 87cb4299..5ca33ce2 100644 --- a/projects/arlas-components/src/lib/components/mapgl-legend/layer-name.pipe.ts +++ b/projects/arlas-map/src/lib/legend/layer-name.pipe.ts @@ -18,7 +18,7 @@ */ import { Pipe, PipeTransform } from '@angular/core'; -import { getLayerName } from '../componentsUtils'; +import { getLayerName } from '../map/model/layers'; @Pipe({ diff --git a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.html b/projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.html similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.html rename to projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.html diff --git a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.scss b/projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.scss rename to projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.scss diff --git a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.spec.ts b/projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.spec.ts similarity index 51% rename from projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.spec.ts rename to projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.spec.ts index 35b64209..dd026e9c 100644 --- a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.spec.ts +++ b/projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.spec.ts @@ -1,19 +1,19 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MapglLayerIconComponent } from './mapgl-layer-icon.component'; +import { LayerIconComponent } from './layer-icon.component'; -describe('MapglLayerIconComponent', () => { - let component: MapglLayerIconComponent; - let fixture: ComponentFixture; +describe('LayerIconComponent', () => { + let component: LayerIconComponent; + let fixture: ComponentFixture; beforeEach(async () => { TestBed.configureTestingModule({ - declarations: [MapglLayerIconComponent] + declarations: [LayerIconComponent] }) .compileComponents(); }); beforeEach(() => { - fixture = TestBed.createComponent(MapglLayerIconComponent); + fixture = TestBed.createComponent(LayerIconComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.ts b/projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.ts similarity index 94% rename from projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.ts rename to projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.ts index ef8cbc7d..da07ddc5 100644 --- a/projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.component.ts +++ b/projects/arlas-map/src/lib/legend/legend-icon/layer-icon.component.ts @@ -17,17 +17,17 @@ * under the License. */ -import { Component, OnInit, ViewChild, ElementRef, Input, AfterViewInit, SimpleChanges, OnChanges } from '@angular/core'; +import { Component, ViewChild, ElementRef, Input, AfterViewInit, SimpleChanges, OnChanges } from '@angular/core'; import { select } from 'd3-selection'; -import { Legend, PROPERTY_SELECTOR_SOURCE } from '../mapgl/mapgl.component.util'; +import { Legend, PROPERTY_SELECTOR_SOURCE } from '../legend.config'; @Component({ - selector: 'arlas-mapgl-layer-icon', - templateUrl: './mapgl-layer-icon.component.html', - styleUrls: ['./mapgl-layer-icon.component.scss'] + selector: 'arlas-layer-icon', + templateUrl: './layer-icon.component.html', + styleUrls: ['./layer-icon.component.scss'] }) -export class MapglLayerIconComponent implements OnInit, AfterViewInit, OnChanges { - @Input() public layer: mapboxgl.Layer; +export class LayerIconComponent implements AfterViewInit, OnChanges { + @Input() public layer: any; @Input() public colorLegend: Legend = {}; @Input() public strokeColorLegend: Legend = {}; @Input() public widthLegend: Legend = {}; @@ -38,9 +38,6 @@ export class MapglLayerIconComponent implements OnInit, AfterViewInit, OnChanges public constructor() { } - public ngOnInit() { - } - public ngAfterViewInit() { if (this.layer) { this.drawIcons(); @@ -57,12 +54,10 @@ export class MapglLayerIconComponent implements OnInit, AfterViewInit, OnChanges private drawIcons(): void { const type = this.layer.type; - const paint = this.layer.paint; const source: string = this.layer.source as string; switch (type) { case 'circle': case 'circle-heatmap': { - const p: mapboxgl.CirclePaint = (paint as mapboxgl.CirclePaint); if (source.startsWith('feature-metric')) { drawFeatureCircleIcon(this.layerIconElement.nativeElement, this.colorLegend, this.strokeColorLegend, true); } else if (source.startsWith('feature')) { @@ -96,7 +91,7 @@ export class MapglLayerIconComponent implements OnInit, AfterViewInit, OnChanges break; } case 'symbol': { - const l: mapboxgl.SymbolLayout = (this.layer.layout as mapboxgl.SymbolLayout); + const l: any = (this.layer.layout); if (l['text-field']) { drawTextIcon(this.layerIconElement.nativeElement, this.colorLegend); } @@ -460,14 +455,12 @@ export function populateListFromLegend(list: Array, legend: Leg list.push(legend.fixValue); } else if (legend.type === PROPERTY_SELECTOR_SOURCE.interpolated) { const iv = legend.interpolatedValues; - if (iv) { - if (iv.length === 1) { - list.push(iv[0], iv[0], iv[0]); - } else if (iv.length === 2) { - list.push(iv[0], iv[0], iv[1]); - } else if (iv.length >= 3) { - list.push(iv[0], iv[Math.trunc(iv.length / 2)], iv[iv.length - 1]); - } + if (iv?.length === 1) { + list.push(iv[0], iv[0], iv[0]); + } else if (iv.length === 2) { + list.push(iv[0], iv[0], iv[1]); + } else if (iv.length >= 3) { + list.push(iv[0], iv[Math.trunc(iv.length / 2)], iv[iv.length - 1]); } } else if (legend.type === PROPERTY_SELECTOR_SOURCE.manual || legend.type === PROPERTY_SELECTOR_SOURCE.generated || legend.type === PROPERTY_SELECTOR_SOURCE.provided) { diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.html b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.html similarity index 86% rename from projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.html rename to projects/arlas-map/src/lib/legend/legend-item/legend-item.component.html index c1d1c694..f3771e7e 100644 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.html +++ b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.html @@ -1,8 +1,7 @@
- - {{ title }} {{ l.translateKey | translate: {metric: l.metric | translate, field: l.field | translate, normalized: l.normalized | translate: {normalizedKey: l.normalizedKey | translate} } }} + {{ title | translate}} {{ l.translateKey | translate: {metric: l.metric | translate, field: l.field | translate, normalized: l.normalized | translate: {normalizedKey: l.normalizedKey | translate} } }}
diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.scss b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.scss similarity index 97% rename from projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.scss rename to projects/arlas-map/src/lib/legend/legend-item/legend-item.component.scss index 5cc23222..eb420a65 100644 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.scss +++ b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.scss @@ -17,7 +17,7 @@ * under the License. */ -@import "../../../../../assets/styles/sizes.scss"; +@import "../../../../assets/styles/sizes.scss"; .legend { &__title { diff --git a/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.spec.ts b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.spec.ts new file mode 100644 index 00000000..bb32aa64 --- /dev/null +++ b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { LegendItemComponent } from './legend-item.component'; + +describe('LegendItemComponent', () => { + let component: LegendItemComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ LegendItemComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(LegendItemComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.ts b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.ts similarity index 70% rename from projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.ts rename to projects/arlas-map/src/lib/legend/legend-item/legend-item.component.ts index 5466b2b8..7b741bd7 100644 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend-item/mapgl-legend-item.component.ts +++ b/projects/arlas-map/src/lib/legend/legend-item/legend-item.component.ts @@ -17,19 +17,18 @@ * under the License. */ -import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; -import { Legend, PROPERTY_SELECTOR_SOURCE } from '../../mapgl/mapgl.component.util'; -import { Layer } from 'mapbox-gl'; +import { Component, ElementRef, Input, ViewChild } from '@angular/core'; +import { Legend, PROPERTY_SELECTOR_SOURCE } from '../legend.config'; @Component({ - selector: 'arlas-mapgl-legend-item', - templateUrl: './mapgl-legend-item.component.html', - styleUrls: ['./mapgl-legend-item.component.scss'] + selector: 'arlas-legend-item', + templateUrl: './legend-item.component.html', + styleUrls: ['./legend-item.component.scss'] }) -export class MapglLegendItemComponent implements OnInit { +export class LegendItemComponent { @Input() public legend: Legend; @Input() public title: string; - @Input() public layer: Layer; + @Input() public layer: any; @Input() public colorPalette: string; @ViewChild('interpolated_svg', { read: ElementRef, static: false }) public interpolatedElement: ElementRef; @@ -37,7 +36,4 @@ export class MapglLegendItemComponent implements OnInit { public constructor() { } - public ngOnInit(): void { - } - } diff --git a/projects/arlas-map/src/lib/legend/legend.component.html b/projects/arlas-map/src/lib/legend/legend.component.html new file mode 100644 index 00000000..e9888d47 --- /dev/null +++ b/projects/arlas-map/src/lib/legend/legend.component.html @@ -0,0 +1,47 @@ + +
+
+
+
+
+ +
+
+ {{layer?.id | layerIdToName | translate}} +
+
+
+
+ file_download + + + + +
+
+ {{ detail ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} +
+
+
+ +
+ + + + + + + +
+
+ \ No newline at end of file diff --git a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.scss b/projects/arlas-map/src/lib/legend/legend.component.scss similarity index 97% rename from projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.scss rename to projects/arlas-map/src/lib/legend/legend.component.scss index 2c724be6..7a6fe7cc 100644 --- a/projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.component.scss +++ b/projects/arlas-map/src/lib/legend/legend.component.scss @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ - @import "../../../../assets/styles/sizes.scss"; + @import "../../../assets/styles/sizes.scss"; .layer_name { font-size: $sm-font-size; @@ -74,4 +74,4 @@ .legend-wrapper { width: 210px; padding-left: 10px; -} +} \ No newline at end of file diff --git a/projects/arlas-map/src/lib/legend/legend.component.ts b/projects/arlas-map/src/lib/legend/legend.component.ts new file mode 100644 index 00000000..d16ebac4 --- /dev/null +++ b/projects/arlas-map/src/lib/legend/legend.component.ts @@ -0,0 +1,388 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AfterViewInit, Component, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { HistogramData } from 'arlas-d3/histograms/utils/HistogramUtils'; +import { ArlasColorService } from 'arlas-web-components'; +import { scaleLinear, ScaleLinear } from 'd3-scale'; +import { select } from 'd3-selection'; +import { area, curveLinear, line } from 'd3-shape'; +import { Subject, takeUntil } from 'rxjs'; +import { ARLAS_ID, FILLSTROKE_LAYER_PREFIX, HOVER_LAYER_PREFIX, SELECT_LAYER_PREFIX } from '../map/model/layers'; +import { Legend, LegendData, PROPERTY_SELECTOR_SOURCE } from './legend.config'; +import { LegendService } from './legend.service'; +import { MAX_LINE_WIDTH } from './legend.tools'; + + +@Component({ + selector: 'arlas-legend', + templateUrl: './legend.component.html', + styleUrls: ['./legend.component.scss'] +}) +export class LegendComponent implements OnInit, AfterViewInit, OnChanges { + /** + * @Input : Angular + * @description Layer object + */ + @Input() public layer: any; + /** + * @Input : Angular + * @description Collection of the layer + */ + @Input() public collection: string; + /** + * @Input : Angular + * @description Current zoom level of the map + */ + @Input() public zoom: number; + /** + * @Input : Angular + * @description Whether the layer is enabled. + */ + @Input() public enabled: boolean; + /** + * @Input : Angular + * @description Subject of [collection, [field, legendData]] map. The map subscribes to it to keep + * the legend updated with the data displayed on the map. + */ + @Input() public legendUpdater: Subject>> = new Subject(); + /** + * @Input : Angular + * @description Subject of [field, boolean] map. The map subscribes to it to keep + * the legend updated with the visibility of the layer. + */ + @Input() public visibilityUpdater: Subject> = new Subject(); + + /** + * @Output : Angular + * @description Notifies the parent component that this layer is visible or not + */ + @Output() public visibilityStatus: Subject = new Subject(); + + /** + * @Output : Angular + * @description Notifies the parent component that the user wants to download the layer + */ + @Output() public downloadSourceEmitter: Subject<{ layer: any; downloadType: string; }> = new Subject(); + + @ViewChild('width_legend', { static: false }) public lineWidthLegend: any; + @ViewChild('radius_legend', { static: false }) public circleRadiusLegend: any; + + public colorLegend: Legend = {}; + public lineDasharray: Array; + public strokeColorLegend: Legend = {}; + public widthLegend: Legend = {}; + public radiusLegend: Legend = {}; + public detail = false; + public visibleMode = false; + public PROPERTY_SELECTOR_SOURCE = PROPERTY_SELECTOR_SOURCE; + + private legendData: Map = new Map(); + public colorPalette = ''; + public strokeColorPalette = ''; + + private readonly MAX_CIRLE_RADIUS = 7; + private readonly LEGEND_WIDTH = 210; + private readonly _onDestroy$ = new Subject(); + + public constructor( + public translate: TranslateService, + public colorService: ArlasColorService, + public legendService: LegendService + ) { } + + public ngOnInit() { + this.legendUpdater + .pipe(takeUntil(this._onDestroy$)) + .subscribe(legendDataPerCollection => { + + this.legendData = legendDataPerCollection.get(this.collection); + if (this.layer) { + this.drawLegends(this.visibleMode); + } + }); + this.visibilityUpdater + .pipe(takeUntil(this._onDestroy$)) + .subscribe(visibilityUpdater => { + /** check legend visibility according to Data source status (mapcontirbutor) */ + if (this.layer) { + /** if the visibility updater contains the layer we pick the visibility status otherwise we keep it unchaged */ + this.visibleMode = visibilityUpdater.get(this.layer.id) !== undefined ? visibilityUpdater.get(this.layer.id) : this.visibleMode; + } else { + this.visibleMode = false; + } + /** check legend visibility according to VisibilityRules */ + if (this.visibleMode && this.layer && !!this.layer.minzoom && !!this.layer.maxzoom) { + this.visibleMode = (this.zoom <= this.layer.maxzoom && this.zoom >= this.layer.minzoom); + } + /** check legend visibility according to legend enabled or not */ + if (!this.enabled) { + this.visibleMode = false; + } + if (!this.visibleMode) { + this.detail = this.visibleMode; + } + /** check legend visibility for external layers that are not set by config nor map contributors */ + if (this.layer && !this.layer.id.startsWith(ARLAS_ID) && + !this.layer.id.startsWith(FILLSTROKE_LAYER_PREFIX) && !this.layer.id.startsWith(HOVER_LAYER_PREFIX) + && !this.layer.id.startsWith(SELECT_LAYER_PREFIX)) { + this.visibleMode = this.enabled; + if (!!this.layer.metadata && this.layer.metadata.showLegend === false) { + this.visibleMode = false; + } + } + if (this.layer) { + this.drawLegends(this.visibleMode); + } + this.visibilityStatus.next(this.visibleMode); + }); + } + + public ngAfterViewInit() { + if (this.layer) { + this.drawLegends(this.visibleMode); + } + } + + public ngOnChanges(changes: SimpleChanges) { + if (changes['layer'] !== undefined) { + if (this.layer) { + this.drawLegends(this.visibleMode); + } + } + } + + public ngOnDestroy() { + this._onDestroy$.next(true); + this._onDestroy$.complete(); + } + + public downloadLayerSource(layer: any, downloadType: string): void { + const download = { + layer, + downloadType + }; + this.downloadSourceEmitter.next(download); + } + + public showDetail(event: Event) { + this.detail = !this.detail; + event.stopPropagation(); + } + + /** Parses the `paint` attribute of a layer and draws the legend elements such as + * - color palette + * - line width evolution + * - circle radius evolution + */ + private drawLegends(visibileMode: boolean): void { + const type = this.layer.type; + const paint = this.layer.paint; + switch (type) { + case 'circle': { + const circleLegend = this.legendService.getCircleLegend(paint, visibileMode, this.legendData, this.layer); + this.colorLegend = circleLegend.color; + this.strokeColorLegend = circleLegend.strokeColor; + this.colorPalette = circleLegend.colorPalette; + this.strokeColorPalette = circleLegend.strokeColorPalette; + this.radiusLegend = circleLegend.radius; + if (this.circleRadiusLegend?.interpolatedElement) { + const circleRadiusEvolution = circleLegend.radius.histogram; + drawCircleSupportLine(this.circleRadiusLegend.interpolatedElement.nativeElement, circleRadiusEvolution, this.colorLegend, + this.LEGEND_WIDTH, Math.min(this.MAX_CIRLE_RADIUS, getMax(circleRadiusEvolution)) * 2); + } + break; + } + case 'line': { + const lineLegend = this.legendService.getLineLegend(paint, visibileMode, this.legendData, this.layer); + this.lineDasharray = lineLegend.dashes; + this.colorLegend = lineLegend.color; + this.colorPalette = lineLegend.colorPalette; + this.widthLegend = lineLegend.width; + if (this.lineWidthLegend?.interpolatedElement) { + const lineWidthEvolution = lineLegend.width.histogram; + drawLineWidth(this.lineWidthLegend.interpolatedElement.nativeElement, lineWidthEvolution, this.colorLegend, + this.LEGEND_WIDTH, MAX_LINE_WIDTH); + } + break; + } + case 'fill': { + const fillLegend = this.legendService.getFillLegend(paint, visibileMode, this.legendData, this.layer); + this.colorLegend = fillLegend.color; + this.colorPalette = fillLegend.colorPalette; + this.strokeColorLegend = fillLegend?.strokeColor; + this.strokeColorPalette = fillLegend?.strokeColorPalette; + break; + } + case 'heatmap': { + const heatmapLegend = this.legendService.getHeatmapLegend(paint, visibileMode, this.legendData, this.layer); + + this.colorLegend = heatmapLegend.color; + this.colorPalette = heatmapLegend.colorPalette; + this.radiusLegend = heatmapLegend.radius; + if (this.circleRadiusLegend?.interpolatedElement) { + const heatmapRadiusEvolution = heatmapLegend.radius.histogram; + drawCircleSupportLine(this.circleRadiusLegend.interpolatedElement.nativeElement, heatmapRadiusEvolution, this.colorLegend, + this.LEGEND_WIDTH, Math.min(this.MAX_CIRLE_RADIUS, getMax(heatmapRadiusEvolution)) * 2); + } + break; + } + case 'symbol': { + const symbolLegend = this.legendService.getLabelLegend(paint, visibileMode, this.legendData, this.layer); + this.colorLegend = symbolLegend.color; + this.colorPalette = symbolLegend.colorPalette; + this.widthLegend = symbolLegend.size; + if (!!this.lineWidthLegend && !!this.lineWidthLegend.interpolatedElement) { + const lineWidthEvolution = symbolLegend.size.histogram; + drawLineWidth(this.lineWidthLegend.interpolatedElement.nativeElement, lineWidthEvolution, this.colorLegend, + this.LEGEND_WIDTH, MAX_LINE_WIDTH); + } + break; + } + } + if (!this.colorLegend.fixValue) { + this.colorLegend.fixValue = visibileMode ? '#444' : '#d3d3d3'; + } + const layer = { ...this.layer }; + this.layer = null; + this.layer = { ...layer }; + } + + +} + +/** + * draws the line width legend + * @param svgNode SVG element on which we append the line using d3. + * @param lineWidths List of {key, linewidth} + * @param cLegend Color legend, to give the drawn legend lines the same color on the map + * @param legendWidth The width that the svg will take to draw the legend + * @param legendHeight The height that the svg will take to draw the legend + */ +export function drawLineWidth(svgNode: SVGElement, lineWidths: Array, + cLegend: Legend, legendWidth: number, legendHeight: number) { + const maxHeight = getMax(lineWidths); + const xDomain: any = (scaleLinear()).range([0, legendWidth]); + const xDomainExtent = [lineWidths[0].key, lineWidths[lineWidths.length - 1].key]; + xDomain.domain(xDomainExtent); + const yDomain: ScaleLinear = scaleLinear().range([maxHeight, 0]); + yDomain.domain([0, maxHeight]); + const svg = select(svgNode).attr('width', legendWidth).attr('height', legendHeight); + svg.selectAll('g').remove(); + const context = svg.append('g').attr('class', 'context'); + const ar = area() + .curve(curveLinear) + .x((d: any) => xDomain(d.key)) + .y0(maxHeight) + .y1((d: any) => yDomain(d.value)); + + const widthLineColor = getMiddleColor(cLegend); + context.append('path') + .datum(lineWidths) + .style('fill', widthLineColor) + .style('fill-opacity', 0.6) + .style('stroke', widthLineColor) + .style('stroke-opacity', 0.6) + .style('stroke-width', 0.5) + .attr('d', ar); +} + +export function getMiddleColor(colorLegend: Legend): string { + let color = ''; + if (colorLegend.type === PROPERTY_SELECTOR_SOURCE.fix) { + color = colorLegend.fixValue as string; + } else if (colorLegend.type === PROPERTY_SELECTOR_SOURCE.interpolated) { + const iv = colorLegend.interpolatedValues as Array; + if (iv.length === 1 || iv.length === 2) { + color = iv[0]; + } else if (iv.length >= 3) { + color = iv[Math.trunc(iv.length / 2)]; + } + } else if (colorLegend.type === PROPERTY_SELECTOR_SOURCE.manual || colorLegend.type === PROPERTY_SELECTOR_SOURCE.generated + || colorLegend.type === PROPERTY_SELECTOR_SOURCE.provided) { + const iv = colorLegend.manualValues as Map; + if (iv) { + if (iv.size === 1) { + color = iv.keys().next().value; + } else if (iv.size >= 2) { + color = Array.from(iv.values())[Math.trunc(Array.from(iv.keys()).length / 2)]; + } + } + } + return color; +} +/** + * draws the circle radius legend + * @param svgNode SVG element on which we append the circles using d3. + * @param circlesRadiuses List of {key, circleradius} + * @param cLegend Color legend, to give the drawn legend circles the same color on the map + * @param legendWidth The width that the svg will take to draw the legend + * @param legendHeight The height that the svg will take to draw the legend + */ +export function drawCircleSupportLine(svgNode: SVGElement, circlesRadiuses: Array, + cLegend: Legend, legendWidth: number, legendHeight: number) { + const circleDiameters = []; + circlesRadiuses.forEach(cr => circleDiameters.push({ key: cr.key, value: cr.value * 2 })); + const maxHeight = getMax(circleDiameters); + const firstRadius = circlesRadiuses[0].value; + const lastRadius = circlesRadiuses[circlesRadiuses.length - 1].value; + const xDomain: any = (scaleLinear()).range([0, legendWidth - firstRadius - lastRadius]); + const xDomainExtent = [circleDiameters[0].key, circleDiameters[circleDiameters.length - 1].key]; + xDomain.domain(xDomainExtent); + const yDomain: ScaleLinear = scaleLinear().range([maxHeight, 0]); + yDomain.domain([0, maxHeight]); + const svg = select(svgNode).attr('width', legendWidth).attr('height', legendHeight); + svg.selectAll('g').remove(); + const context = svg.append('g').attr('class', 'context'); + const l = line() + .x((d: any) => xDomain(d.key)) + .y((d: any) => yDomain(d.value)); + context.append('path') + .datum(circleDiameters) + .attr('fill', 'none') + .attr('stroke', '#eaeaea') + .attr('stroke-width', 0.8) + .attr('transform', 'translate(' + firstRadius + ', 0)') + .attr('d', l); + context.append('g').append('line') + .attr('x1', 0).attr('y1', maxHeight) + .attr('x2', legendWidth - firstRadius - lastRadius).attr('y2', maxHeight) + .attr('cx', 2).attr('cy', 2).attr('fill', 'none') + .attr('stroke', '#eaeaea') + .attr('stroke-width', 0.8) + .attr('transform', 'translate(' + firstRadius + ', 0)'); + const circles = [circlesRadiuses[0], circlesRadiuses[circlesRadiuses.length - 1]]; + const circleColor = getMiddleColor(cLegend); + context.append('g') + .selectAll('dot').data(circles).enter().append('circle') + .attr('r', (d) => d.value) + .attr('cx', (d) => xDomain(d.key)) + .attr('cy', (d) => maxHeight - d.value) + .attr('transform', 'translate(' + firstRadius + ', 0)') + .style('fill', circleColor) + .style('fill-opacity', 0.6) + .style('stroke', circleColor) + .style('stroke-width', 0.5); + +} + +export function getMax(data: Array): number { + return Math.max(...data.map(hd => +hd.value)); +} diff --git a/projects/arlas-map/src/lib/legend/legend.config.ts b/projects/arlas-map/src/lib/legend/legend.config.ts new file mode 100644 index 00000000..be4999a6 --- /dev/null +++ b/projects/arlas-map/src/lib/legend/legend.config.ts @@ -0,0 +1,79 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { HistogramData } from 'arlas-d3/histograms/utils/HistogramUtils'; + +export interface LegendData { + minValue?: string; + maxValue?: string; + keysColorsMap?: Map; +} + +export interface Legend { + type?: PROPERTY_SELECTOR_SOURCE; + title?: string; + minValue?: string; + maxValue?: string; + fixValue?: string | number; + interpolatedValues?: Array; + manualValues?: Map; + visible?: boolean; + /** data to be plotted as histogram in the legend */ + histogram?: Array; +} + +export interface CircleLegend extends FillLegend { + radius: Legend; +} + +export interface FillLegend { + color: Legend; + colorPalette: string; + strokeColor: Legend; + strokeColorPalette: string; +} + +export interface HeatmapLegend { + color: Legend; + colorPalette: string; + radius: Legend; +} + +export interface LabelLegend { + color: Legend; + colorPalette: string; + size: Legend; +} + +export interface LineLegend { + color: Legend; + colorPalette: string; + dashes: Array; + width: Legend; +} + +export enum PROPERTY_SELECTOR_SOURCE { + fix = 'Fix', + provided = 'Provided', + generated = 'Generated', + manual = 'Manual', + interpolated = 'Interpolated', + metric_on_field = 'Metric on field', + heatmap_density = 'Density' +} diff --git a/projects/arlas-map/src/lib/legend/legend.service.ts b/projects/arlas-map/src/lib/legend/legend.service.ts new file mode 100644 index 00000000..0aa0fba8 --- /dev/null +++ b/projects/arlas-map/src/lib/legend/legend.service.ts @@ -0,0 +1,298 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { CircleLegend, FillLegend, HeatmapLegend, LabelLegend, Legend, LegendData, LineLegend, PROPERTY_SELECTOR_SOURCE } from './legend.config'; +import { TranslateService } from '@ngx-translate/core'; +import { HEATMAP_DENSITY, IN, INTERPOLATE, MATCH, NOT_IN, OTHER } from '../map/model/filters'; +import tinycolor from 'tinycolor2'; +import { HistogramData } from 'arlas-d3/histograms/utils/HistogramUtils'; +import { getMax } from './legend.component'; +import { MAX_CIRLE_RADIUS, MAX_LINE_WIDTH } from './legend.tools'; + + +@Injectable({ + providedIn: 'root' +}) +export abstract class LegendService { + + public getCircleLegend(paint: any, visibileMode: boolean, legendData: Map, layer: any): CircleLegend { + return undefined; + } + + public getLineLegend(paint: any, visibileMode: boolean, legendData: Map, layer: any): LineLegend { + return undefined; + } + + public getFillLegend(paint: any, visibileMode: boolean, legendData: Map, layer: any): FillLegend { + return undefined; + } + + public getHeatmapLegend(paint: any, visibileMode: boolean, legendData: Map, layer: any): HeatmapLegend { + return undefined; + } + + public getLabelLegend(paint: any, visibileMode: boolean, legendData: Map, layer: any): LabelLegend { + return undefined; + } + + public static setProvidedColorLegend(colorLegend: Legend, field: string, + legendData: Map, filter, translate: TranslateService) { + colorLegend.title = field; + if (!Array.isArray(field)) { + colorLegend.type = PROPERTY_SELECTOR_SOURCE.provided; + if (field.endsWith('_arlas__color')) { + colorLegend.type = PROPERTY_SELECTOR_SOURCE.generated; + } + colorLegend.manualValues = new Map(); + if (legendData?.get(field)) { + const keysToColors = legendData.get(field).keysColorsMap; + const colorList = Array.from(keysToColors.keys()).map(k => [k, keysToColors.get(k)]).flat(); + for (let i = 0; i < colorList.length; i += 2) { + colorLegend.manualValues.set(translate ? translate.instant(colorList[i]) : colorList[i], colorList[i + 1]); + } + if (colorList.length === 0) { + colorLegend.manualValues.set('', '#eee'); + } + } else { + colorLegend.manualValues.set('', '#eee'); + } + if (filter) { + LegendService.filterLegend(colorLegend.manualValues, filter, + (field).endsWith('_arlas__color') ? (field).slice(0, -13) : field); + } + } + } + + + public static setMatchColorLegend(colorLegend: Legend, colorExpression: any[], legendData: Map, + filter, translate: TranslateService) { + /** color = ["match", ["get", "field"], .... ]**/ + colorLegend.type = PROPERTY_SELECTOR_SOURCE.manual; + const colorsLength = colorExpression.length; + let hasDefaultColor = false; + if (colorsLength % 2 !== 0) { + hasDefaultColor = true; + } + const field = colorExpression[1].length === 2 ? colorExpression[1][1] : ''; + colorLegend.title = field; + colorLegend.manualValues = new Map(); + let keysToColors: Map; + if (legendData?.get(field + '_color')) { + // If there is a legendData, use only the colors in the keysToColors + keysToColors = legendData.get(field + '_color').keysColorsMap; + } else { + // If no legendData for this field, use all the colors of colorExpression + keysToColors = new Map(); + for (let i = 2; i < colorExpression.length; i += 2) { + if (hasDefaultColor && i === colorsLength - 3) { + keysToColors.set(colorExpression[i] + '', colorExpression[i + 1]); + keysToColors.set(OTHER, colorExpression[i + 2]); + break; + } else { + keysToColors.set(colorExpression[i] + '', colorExpression[i + 1]); + } + } + } + for (let i = 2; i < colorExpression.length; i += 2) { + if (hasDefaultColor && i === colorsLength - 3) { + if (keysToColors.has(colorExpression[i] + '')) { + colorLegend.manualValues.set(translate ? translate.instant(colorExpression[i] + '') : colorExpression[i], + colorExpression[i + 1]); + } + colorLegend.manualValues.set(translate ? translate.instant(OTHER) : OTHER, colorExpression[i + 2]); + break; + } else if (keysToColors.has(colorExpression[i] + '')) { + colorLegend.manualValues.set(translate ? translate.instant(colorExpression[i] + '') : colorExpression[i], + colorExpression[i + 1]); + } + } + + if (filter) { + LegendService.filterLegend(colorLegend.manualValues, filter, field); + } + } + + + public static setInterpolatedColorLegend(colorLegend: Legend, colorExpression: any[], + legendData: Map, + visibleMode: boolean) { + colorLegend.type = PROPERTY_SELECTOR_SOURCE.interpolated; + /** color = ["interplate", ['linear'], ["get", "field"], 0, 1... ]**/ + // todo throw exception if interpolation is not linear + const field = colorExpression[2].length === 2 ? colorExpression[2][1] : HEATMAP_DENSITY; + colorLegend.title = field; + colorLegend.interpolatedValues = []; + const palette = []; + const colors = colorExpression.slice(3); + colors.forEach((c, i) => { + if (i % 2 === 0) { + palette.push({ + proportion: c, + value: colors[i + 1] + }); + } + }); + const minimum = palette[0].proportion; + const maximum = palette.slice(-1)[0].proportion; + palette.forEach(c => colorLegend.interpolatedValues.push(c.value)); + const colorValues = colorExpression.filter((c, i) => i > 2 && i % 2 !== 0); + if (legendData?.get(field) && field !== 'count') { + colorLegend.minValue = legendData.get(field).minValue; + colorLegend.maxValue = legendData.get(field).maxValue; + // For heatmaps, the count is used to fetch data, so we use it for the legend + } else if (field === HEATMAP_DENSITY && legendData?.get('count')) { + colorLegend.minValue = legendData.get('count').minValue; + colorLegend.maxValue = legendData.get('count').maxValue; + } else { + colorLegend.minValue = colorValues[0] + ''; + colorLegend.maxValue = colorValues[colorValues.length - 1] + ''; + } + if (!visibleMode) { + /** apply greyscale because the layer is not visible */ + colorLegend.interpolatedValues = colorLegend.interpolatedValues + .map((c) => tinycolor(c.toString()).greyscale().lighten(20).toHexString()); + palette.forEach(p => { + p.value = tinycolor(p.value.toString()).greyscale().lighten(20).toHexString(); + }); + } + return palette.map(c => c.value + ' ' + (100 * (c.proportion - minimum) / (maximum - minimum)) + '%').join(','); + + } + + public static filterLegend(colorLegendValues: Map, filter: any[], field: string) { + filter.forEach((f, idx) => { + if (idx !== 0 && idx !== filter.length - 1) { + switch (f[0]) { + case IN: { + if (f[1][1] === field) { + const valuesToKeep: Array = f[2][1]; + colorLegendValues.forEach((val, key) => { + if (!(valuesToKeep.includes(key))) { + colorLegendValues.delete(key); + } + }); + } + break; + } + case NOT_IN: { + if (f[1][0] === IN && f[1][1][1] === field) { + const valuesToExclude: Array = f[1][2][1]; + valuesToExclude.forEach(value => { + colorLegendValues.delete(value); + }); + } + break; + } + } + } + }); + } + + public static buildColorLegend(colorExpression: string | any, visibleMode: boolean, legendData: Map, + filter?: any, translate?: TranslateService): [Legend, string] { + const colorLegend: Legend = { visible: true }; + let colorPalette = ''; + if (typeof colorExpression === 'string') { + colorLegend.type = PROPERTY_SELECTOR_SOURCE.fix; + colorLegend.fixValue = colorExpression; + } else if (Array.isArray(colorExpression)) { + if (colorExpression.length === 2) { + /** color = ["get", "field"] ==> Generated or Provided */ + const field = colorExpression[1]; + colorLegend.title = field; + LegendService.setProvidedColorLegend(colorLegend, field, legendData, filter, translate); + } else if (colorExpression.length >= 3) { + if (colorExpression[0] === MATCH) { + LegendService.setMatchColorLegend(colorLegend, colorExpression, legendData, filter, translate); + } else if (colorExpression[0] === INTERPOLATE) { + colorPalette = LegendService.setInterpolatedColorLegend(colorLegend, colorExpression, legendData, visibleMode); + } + } + } + + colorLegend.visible = visibleMode; + return [colorLegend, colorPalette]; + }; + + public static buildRadiusLegend(radiusExpression: string | any, legendData: Map): Legend { + const radiusLegend: Legend = {}; + const circleRadiusEvolution: Array = new Array(); + if (Array.isArray(radiusExpression)) { + if (radiusExpression.length >= 3) { + if (radiusExpression[0] === INTERPOLATE) { + const field = radiusExpression[2][1]; + radiusExpression.filter((w, i) => i >= 3).forEach((w, i) => { + if (i % 2 === 0) { + circleRadiusEvolution.push({ key: w, value: radiusExpression[i + 1 + 3] }); + } + }); + radiusLegend.title = field; + if (legendData?.get(field)) { + radiusLegend.minValue = legendData.get(field).minValue; + radiusLegend.maxValue = legendData.get(field).maxValue; + } else { + radiusLegend.minValue = circleRadiusEvolution[0].key + ''; + radiusLegend.maxValue = circleRadiusEvolution[circleRadiusEvolution.length - 1].key + ''; + } + radiusLegend.type = PROPERTY_SELECTOR_SOURCE.interpolated; + const maxCircleRadius = getMax(circleRadiusEvolution); + if (maxCircleRadius > MAX_CIRLE_RADIUS) { + circleRadiusEvolution.forEach(lw => lw.value = lw.value * MAX_CIRLE_RADIUS / maxCircleRadius); + } + radiusLegend.histogram = circleRadiusEvolution; + } + } + } + return radiusLegend; + + }; + + protected static buildWidthLegend(lineWidth: number | any, + legendData: Map): Legend { + /** if the line width is fix then it is not added to the legend*/ + const widthLegend: Legend = {}; + if (Array.isArray(lineWidth)) { + if (lineWidth.length >= 3) { + if (lineWidth[0] === INTERPOLATE) { + const field = lineWidth[2][1]; + widthLegend.title = field; + if (legendData?.get(field)) { + widthLegend.minValue = legendData.get(field).minValue; + widthLegend.maxValue = legendData.get(field).maxValue; + } + widthLegend.type = PROPERTY_SELECTOR_SOURCE.interpolated; + const lineWidthEvolution: Array = new Array(); + lineWidth.filter((w, i) => i >= 3).forEach((w, i) => { + if (i % 2 === 0) { + lineWidthEvolution.push({ key: w, value: lineWidth[i + 1 + 3] }); + } + }); + const maxLineWidth = getMax(lineWidthEvolution); + if (maxLineWidth > MAX_LINE_WIDTH) { + lineWidthEvolution.forEach(lw => lw.value = lw.value * MAX_LINE_WIDTH / maxLineWidth); + } + widthLegend.histogram = lineWidthEvolution; + } + } + } + return widthLegend; + } + +} diff --git a/projects/arlas-map/src/lib/legend/legend.tools.ts b/projects/arlas-map/src/lib/legend/legend.tools.ts new file mode 100644 index 00000000..9d886e87 --- /dev/null +++ b/projects/arlas-map/src/lib/legend/legend.tools.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { HistogramData } from 'arlas-d3/histograms/utils/HistogramUtils'; + +export function getMax(data: Array): number { + return Math.max(...data.map(hd => +hd.value)); +} + +export const MAX_CIRLE_RADIUS = 7; +export const MAX_LINE_WIDTH = 10; diff --git a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import-dialog.component.html b/projects/arlas-map/src/lib/map-import/map-import-dialog.component.html similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-import/mapgl-import-dialog.component.html rename to projects/arlas-map/src/lib/map-import/map-import-dialog.component.html diff --git a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import-dialog.component.scss b/projects/arlas-map/src/lib/map-import/map-import-dialog.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-import/mapgl-import-dialog.component.scss rename to projects/arlas-map/src/lib/map-import/map-import-dialog.component.scss diff --git a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.html b/projects/arlas-map/src/lib/map-import/map-import.component.html similarity index 50% rename from projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.html rename to projects/arlas-map/src/lib/map-import/map-import.component.html index 8b137891..139597f9 100644 --- a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.html +++ b/projects/arlas-map/src/lib/map-import/map-import.component.html @@ -1 +1,2 @@ + diff --git a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.scss b/projects/arlas-map/src/lib/map-import/map-import.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.scss rename to projects/arlas-map/src/lib/map-import/map-import.component.scss diff --git a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.spec.ts b/projects/arlas-map/src/lib/map-import/map-import.component.spec.ts similarity index 79% rename from projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.spec.ts rename to projects/arlas-map/src/lib/map-import/map-import.component.spec.ts index f3754c55..dac3696f 100644 --- a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.spec.ts +++ b/projects/arlas-map/src/lib/map-import/map-import.component.spec.ts @@ -1,3 +1,4 @@ +import { MapImportComponent } from './map-import.component'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; @@ -6,15 +7,14 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; -import { MapglImportComponent } from './mapgl-import.component'; describe('MapglImportComponent', () => { - let component: MapglImportComponent; - let fixture: ComponentFixture; + let component: MapImportComponent; + let fixture: ComponentFixture>; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ MapglImportComponent ], + declarations: [ MapImportComponent ], imports: [ MatDialogModule, FormsModule, @@ -30,7 +30,7 @@ describe('MapglImportComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(MapglImportComponent); + fixture = TestBed.createComponent(MapImportComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.ts b/projects/arlas-map/src/lib/map-import/map-import.component.ts similarity index 85% rename from projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.ts rename to projects/arlas-map/src/lib/map-import/map-import.component.ts index 65591737..1b1d81e5 100644 --- a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.ts +++ b/projects/arlas-map/src/lib/map-import/map-import.component.ts @@ -17,12 +17,11 @@ * under the License. */ -import { Component, ElementRef, Inject, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { Component, ElementRef, Inject, Input, Output, ViewChild } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; import * as toGeoJSON from '@tmcw/togeojson'; import centroid from '@turf/centroid'; import JSZip from 'jszip'; -import { MapglComponent } from '../mapgl/mapgl.component'; import { FeatureCollection, polygon } from '@turf/helpers'; import { Subject } from 'rxjs'; import * as shp_ from 'shpjs/dist/shp'; @@ -32,6 +31,8 @@ import { valid } from 'geojson-validation'; import { marker } from '@colsen1991/ngx-translate-extract-marker'; import * as gpsi_ from 'geojson-polygon-self-intersections'; import { Feature } from 'geojson'; +import { ArlasMapComponent } from '../arlas-map.component'; +import { ArlasMapFrameworkService } from '../arlas-map-framework.service'; const gpsi = gpsi_.default; @@ -40,11 +41,11 @@ const extent = extent_.default; @Component({ - templateUrl: './mapgl-import-dialog.component.html', - selector: 'arlas-mapgl-import-dialog', - styleUrls: ['./mapgl-import-dialog.component.scss'] + templateUrl: './map-import-dialog.component.html', + selector: 'arlas-map-import-dialog', + styleUrls: ['./map-import-dialog.component.scss'] }) -export class MapglImportDialogComponent implements OnInit { +export class MapImportDialogComponent { public displayError = false; public isRunning = false; public fitResult = false; @@ -67,7 +68,7 @@ export class MapglImportDialogComponent implements OnInit { @ViewChild('fileInput', { static: false }) public fileInput: ElementRef; public constructor( - private dialogRef: MatDialogRef, + private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) private data: { allowedImportType: Array; defaultFitResult?: boolean; } ) { this.fitResult = data.defaultFitResult ?? false; @@ -85,8 +86,6 @@ export class MapglImportDialogComponent implements OnInit { this.changeType(); } - public ngOnInit(): void { } - public onFileChange(files: FileList) { this.file.next(files.item(0)); this.currentFile = files.item(0); @@ -117,11 +116,15 @@ export class MapglImportDialogComponent implements OnInit { export type AllowedImportGeometry = 'Polygon' | 'Point'; const SIMPLE_GEOMETRY_OBJECT = ['Polygon', 'Point', 'LineString']; @Component({ - templateUrl: './mapgl-import.component.html', - selector: 'arlas-mapgl-import', - styleUrls: ['./mapgl-import.component.scss'] + selector: 'arlas-map-import', + templateUrl: './map-import.component.html', + styleUrls: ['./map-import.component.scss'] }) -export class MapglImportComponent { +/** L: a layer class/interface. + * S: a source class/interface. + * M: a Map configuration class/interface. + */ +export class MapImportComponent { public SHP = 'shp'; public KML = 'kml'; @@ -137,20 +140,20 @@ export class MapglImportComponent { public TIMEOUT = marker('Timeout'); public currentFile: File; - public dialogRef: MatDialogRef; + public dialogRef: MatDialogRef; public reader: FileReader; private tooManyVertex = false; private fitResult = false; private jszip: JSZip; - private SOURCE_NAME_POLYGON_LABEL = 'polygon_label'; + private readonly SOURCE_NAME_POLYGON_LABEL = 'polygon_label'; private emptyData: FeatureCollection = { 'type': 'FeatureCollection', 'features': [] }; private featureIndex = 0; - @Input() public mapComponent: MapglComponent; + @Input() public mapComponent: ArlasMapComponent; @Input() public maxVertexByPolygon: number; @Input() public maxFeatures?: number; @Input() public maxFileSize?: number; @@ -161,7 +164,8 @@ export class MapglImportComponent { @Output() public error = new Subject(); private _currentAllowedGeom: string[]; public constructor( - public dialog: MatDialog + public dialog: MatDialog, + public mapService: ArlasMapFrameworkService ) { } public promiseTimeout(ms, promise) { @@ -203,7 +207,7 @@ export class MapglImportComponent { } public openDialog(defaultFitResult?: boolean) { - this.dialogRef = this.dialog.open(MapglImportDialogComponent, { data: { allowedImportType: this.allowedImportType, defaultFitResult } }); + this.dialogRef = this.dialog.open(MapImportDialogComponent, { data: { allowedImportType: this.allowedImportType, defaultFitResult } }); this.dialogRef.componentInstance.file.subscribe((file: File) => { this.currentFile = file; }); @@ -310,15 +314,20 @@ export class MapglImportComponent { if (this.maxFileSize && this.currentFile.size > this.maxFileSize) { reject(new Error(this.FILE_TOO_LARGE)); - } else { - if (this.currentFile.name.split('.').pop().toLowerCase() === this.KML) { + } else if (this.currentFile.name.split('.').pop().toLowerCase() === this.KML) { reader.readAsText(this.currentFile); } else if (this.currentFile.name.split('.').pop().toLowerCase() === 'kmz') { reader.readAsArrayBuffer(this.currentFile); } else { reject(new Error(marker('Only `kml` or `zip` file is allowed'))); } - } + }); + } + + private resolveFileFromGzip(result, resolve) { + this.jszip.loadAsync(result).then(kmzContent => { + const kmlFile = Object.keys(kmzContent.files).filter(file => file.split('.').pop().toLowerCase() === this.KML)[0]; + this.jszip.file(kmlFile).async('text').then((data) => resolve(data)); }); } @@ -328,12 +337,7 @@ export class MapglImportComponent { let readKmzFile = readKmlFile; if (this.currentFile.name.split('.').pop().toLowerCase() === 'kmz') { readKmzFile = readKmlFile.then(result => new Promise((resolve, reject) => { - this.jszip.loadAsync(result).then(kmzContent => { - const kmlFile = Object.keys(kmzContent.files).filter(file => file.split('.').pop().toLowerCase() === this.KML)[0]; - this.jszip.file(kmlFile).async('text').then(function (data) { - resolve(data); - }); - }); + this.resolveFileFromGzip(result, resolve); })); } @@ -436,26 +440,26 @@ export class MapglImportComponent { if (this.maxFileSize && this.currentFile.size > this.maxFileSize) { reject(new Error(this.FILE_TOO_LARGE)); - } else { - if (this.currentFile.name.split('.').pop().toLowerCase() !== 'zip') { + } else if (this.currentFile.name.split('.').pop().toLowerCase() !== 'zip') { reject(new Error(marker('Only `zip` file is allowed'))); } else { reader.readAsArrayBuffer(this.currentFile); } - } }); } + private areFilesInvalid(zipResult): boolean { + const testArray = Object.keys(zipResult.files).map(fileName => fileName.split('.').pop().toLowerCase()); + return (testArray.filter(elem => elem === this.SHP || elem === 'shx' || elem === 'dbf').length < 3) && + (testArray.filter(elem => elem === 'json').length !== 1); + } + public processAllShape() { const fileReaderPromise = this.readZipFile(); const zipLoaderPromise = fileReaderPromise.then((buffer: ArrayBuffer) => new Promise((resolve, reject) => { this.jszip.loadAsync(buffer).then(zipResult => { - const testArray = Object.keys(zipResult.files).map(fileName => fileName.split('.').pop().toLowerCase()); - if ( - !(testArray.filter(elem => elem === this.SHP || elem === 'shx' || elem === 'dbf').length >= 3) && - !(testArray.filter(elem => elem === 'json').length === 1) - ) { + if (this.areFilesInvalid(zipResult)) { reject(new Error(marker('Zip file must contain at least a `*.shp`, `*.shx` and `*.dbf` or a `*.json`'))); } else { resolve(buffer); @@ -511,11 +515,11 @@ export class MapglImportComponent { /** *************/ public clearPolygons() { // Clean source of imported polygons - const labelSource = this.mapComponent.map.getSource(this.SOURCE_NAME_POLYGON_LABEL) as mapboxgl.GeoJSONSource; + const labelSource = this.mapService.getSource(this.SOURCE_NAME_POLYGON_LABEL, this.mapComponent.map); this.featureIndex = 0; this.mapComponent.onAoiChanged.next(this.emptyData); if (labelSource !== undefined) { - labelSource.setData(this.emptyData); + this.mapService.setDataToGeojsonSource(labelSource, this.emptyData); } } @@ -532,22 +536,20 @@ export class MapglImportComponent { throw new Error(this.TOO_MANY_VERTICES); } else if (this.maxFeatures && importedResult.geojson.features.length > this.maxFeatures) { throw new Error(this.TOO_MANY_FEATURES); - } else { - if (importedResult.geojson.features.length > 0) { - this.dialogRef.componentInstance.isRunning = false; - if (this.fitResult) { - this.mapComponent.paddedFitBounds(extent(importedResult.geojson)); - } - if (this.mapComponent.drawData.features.length > 0) { - this.mapComponent.drawData.features.forEach(df => importedResult.geojson.features.push(df)); - } - this.mapComponent.draw.changeMode('static'); - this.imported.next(importedResult.geojson.features); - this.mapComponent.onAoiChanged.next(importedResult.geojson); - this.dialogRef.close(); - } else { - throw new Error(marker('No polygon to display in this file')); + } else if (importedResult.geojson.features.length > 0) { + this.dialogRef.componentInstance.isRunning = false; + if (this.fitResult) { + this.mapComponent.fitToPaddedBounds(extent(importedResult.geojson)); } + if (this.mapComponent.drawData.features.length > 0) { + this.mapComponent.drawData.features.forEach(df => importedResult.geojson.features.push(df)); + } + this.mapComponent.drawComponent.draw.changeMode('static'); + this.imported.next(importedResult.geojson.features); + this.mapComponent.onAoiChanged.next(importedResult.geojson); + this.dialogRef.close(); + } else { + throw new Error(marker('No polygon to display in this file')); } } @@ -575,20 +577,20 @@ export class MapglImportComponent { this.dialogRef.componentInstance.isRunning = false; this.dialogRef.componentInstance.errorMessage = error.message; switch (this.dialogRef.componentInstance.errorMessage) { - case this.TOO_MANY_FEATURES: - this.dialogRef.componentInstance.errorThreshold = this.maxFeatures.toString(); - break; - case this.TOO_MANY_VERTICES: - this.dialogRef.componentInstance.errorThreshold = this.maxVertexByPolygon.toString(); - break; - case this.FILE_TOO_LARGE: - this.dialogRef.componentInstance.errorThreshold = this.formatBytes(this.maxFileSize); - break; - case this.TIMEOUT: - this.dialogRef.componentInstance.errorThreshold = this.maxLoadingTime + ' ms'; - break; - default: - this.dialogRef.componentInstance.errorThreshold = ''; + case this.TOO_MANY_FEATURES: + this.dialogRef.componentInstance.errorThreshold = this.maxFeatures.toString(); + break; + case this.TOO_MANY_VERTICES: + this.dialogRef.componentInstance.errorThreshold = this.maxVertexByPolygon.toString(); + break; + case this.FILE_TOO_LARGE: + this.dialogRef.componentInstance.errorThreshold = this.formatBytes(this.maxFileSize); + break; + case this.TIMEOUT: + this.dialogRef.componentInstance.errorThreshold = this.maxLoadingTime + ' ms'; + break; + default: + this.dialogRef.componentInstance.errorThreshold = ''; } if (this.dialogRef.componentInstance.fileInput) { this.dialogRef.componentInstance.fileInput.nativeElement.value = ''; diff --git a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.module.ts b/projects/arlas-map/src/lib/map-import/map-import.module.ts similarity index 83% rename from projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.module.ts rename to projects/arlas-map/src/lib/map-import/map-import.module.ts index 9956975e..14fd78a0 100644 --- a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.module.ts +++ b/projects/arlas-map/src/lib/map-import/map-import.module.ts @@ -26,16 +26,14 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; -import { BrowserModule } from '@angular/platform-browser'; import { TranslateModule } from '@ngx-translate/core'; -import { MapglImportComponent, MapglImportDialogComponent } from './mapgl-import.component'; +import { MapImportComponent, MapImportDialogComponent } from './map-import.component'; @NgModule({ imports: [ CommonModule, - BrowserModule, FormsModule, MatButtonModule, MatCheckboxModule, @@ -45,9 +43,9 @@ import { MapglImportComponent, MapglImportDialogComponent } from './mapgl-import MatRadioModule, TranslateModule ], - declarations: [MapglImportComponent, MapglImportDialogComponent], - exports: [MapglImportComponent] + declarations: [MapImportComponent, MapImportDialogComponent], + exports: [MapImportComponent] }) -export class MapglImportModule { +export class MapImportModule { } diff --git a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings-dialog.component.html b/projects/arlas-map/src/lib/map-settings/map-settings-dialog.component.html similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings-dialog.component.html rename to projects/arlas-map/src/lib/map-settings/map-settings-dialog.component.html diff --git a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings-dialog.component.scss b/projects/arlas-map/src/lib/map-settings/map-settings-dialog.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings-dialog.component.scss rename to projects/arlas-map/src/lib/map-settings/map-settings-dialog.component.scss diff --git a/projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.html b/projects/arlas-map/src/lib/map-settings/map-settings.component.html similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.component.html rename to projects/arlas-map/src/lib/map-settings/map-settings.component.html diff --git a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.scss b/projects/arlas-map/src/lib/map-settings/map-settings.component.scss similarity index 100% rename from projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.scss rename to projects/arlas-map/src/lib/map-settings/map-settings.component.scss diff --git a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.spec.ts b/projects/arlas-map/src/lib/map-settings/map-settings.component.spec.ts similarity index 77% rename from projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.spec.ts rename to projects/arlas-map/src/lib/map-settings/map-settings.component.spec.ts index a4251528..1738e3ce 100644 --- a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.spec.ts +++ b/projects/arlas-map/src/lib/map-settings/map-settings.component.spec.ts @@ -1,3 +1,5 @@ +import { MapSettingsComponent } from './map-settings.component'; +import { MatTabsModule } from '@angular/material/tabs'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatButtonModule } from '@angular/material/button'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; @@ -6,16 +8,14 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MapglSettingsComponent } from './mapgl-settings.component'; -describe('MapglSettingsComponent', () => { - let component: MapglSettingsComponent; - let fixture: ComponentFixture; +describe('MapSettingsComponent', () => { + let component: MapSettingsComponent; + let fixture: ComponentFixture; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MapglSettingsComponent], + declarations: [MapSettingsComponent], imports: [ MatTabsModule, MatDialogModule, @@ -31,7 +31,7 @@ describe('MapglSettingsComponent', () => { })); beforeEach(() => { - fixture = TestBed.createComponent(MapglSettingsComponent); + fixture = TestBed.createComponent(MapSettingsComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.ts b/projects/arlas-map/src/lib/map-settings/map-settings.component.ts similarity index 78% rename from projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.ts rename to projects/arlas-map/src/lib/map-settings/map-settings.component.ts index 65c44f06..60079566 100644 --- a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.component.ts +++ b/projects/arlas-map/src/lib/map-settings/map-settings.component.ts @@ -17,13 +17,12 @@ * under the License. */ -import { Component, OnInit, Output } from '@angular/core'; -import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { Component, Output } from '@angular/core'; +import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { marker } from '@colsen1991/ngx-translate-extract-marker'; import { Subject, takeUntil } from 'rxjs'; -import { ArlasColorService } from '../../services/color.generator.service'; -import { SelectFormControl } from '../componentsUtils'; +import { ArlasColorService } from 'arlas-web-components'; export interface GeometrySelectModel { path: string; @@ -45,16 +44,39 @@ export enum GeoQueryOperator { NOT_INTERSECTS = 'notintersects' } +export class SelectFormControl extends UntypedFormControl { + + // used only for autocomplete: list of filtered options + public filteredOptions: Array; + public syncOptions: Array = []; + + public constructor( + formState: any, + label: string, + options: Array) { + + super(formState, Validators.required); + this.setValue(formState); + this.setSyncOptions(options); + + } + + public setSyncOptions(newOptions: Array) { + this.syncOptions = newOptions; + this.filteredOptions = newOptions; + } +} + export interface MapSettingsService { getGeoQueries(): Map, Array, string]>; } @Component({ - selector: 'arlas-mapgl-settings-dialog', - templateUrl: './mapgl-settings-dialog.component.html', - styleUrls: ['./mapgl-settings-dialog.component.scss'] + selector: 'arlas-map-settings-dialog', + templateUrl: './map-settings-dialog.component.html', + styleUrls: ['./map-settings-dialog.component.scss'] }) -export class MapglSettingsDialogComponent implements OnInit { +export class MapSettingsDialogComponent { /** * @Output : Angular * Emits the geo-query to apply. A geo-query is defined by @@ -70,13 +92,11 @@ export class MapglSettingsDialogComponent implements OnInit { public collectionsColors = new Array(); public selectionsSnapshot = new Map(); - private _onDestroy$ = new Subject(); + private readonly _onDestroy$ = new Subject(); public constructor( - private dialogRef: MatDialogRef, - private colorGeneratorLoader: ArlasColorService) { } - - public ngOnInit() { } + private readonly dialogRef: MatDialogRef, + private readonly colorGeneratorLoader: ArlasColorService) { } public ngOnDestroy() { this._onDestroy$.next(true); @@ -135,11 +155,11 @@ export class MapglSettingsDialogComponent implements OnInit { } @Component({ - selector: 'arlas-mapgl-settings', - templateUrl: './mapgl-settings.component.html', - styleUrls: ['./mapgl-settings.component.scss'] + selector: 'arlas-map-settings', + templateUrl: './map-settings.component.html', + styleUrls: ['./map-settings.component.scss'] }) -export class MapglSettingsComponent implements OnInit { +export class MapSettingsComponent { /** * @Output : Angular @@ -149,14 +169,12 @@ export class MapglSettingsComponent implements OnInit { */ @Output() public geoQueryEmitter = new Subject>(); - public dialogRef: MatDialogRef; + public dialogRef: MatDialogRef; public constructor(public dialog: MatDialog) { } - public ngOnInit() { } - public openDialog(mapSettingsService: MapSettingsService) { - this.dialogRef = this.dialog.open(MapglSettingsDialogComponent, { data: null, panelClass: 'map-settings-dialog' }); + this.dialogRef = this.dialog.open(MapSettingsDialogComponent, { data: null, panelClass: 'map-settings-dialog' }); const mapGeoQueries = mapSettingsService.getGeoQueries(); if (!!mapGeoQueries) { mapGeoQueries.forEach((geoQueries, collection) => { diff --git a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.module.ts b/projects/arlas-map/src/lib/map-settings/map-settings.module.ts similarity index 80% rename from projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.module.ts rename to projects/arlas-map/src/lib/map-settings/map-settings.module.ts index 8dd911a2..279ab3b0 100644 --- a/projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.module.ts +++ b/projects/arlas-map/src/lib/map-settings/map-settings.module.ts @@ -28,16 +28,14 @@ import { MatIconModule } from '@angular/material/icon'; import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; import { MatTabsModule } from '@angular/material/tabs'; -import { BrowserModule } from '@angular/platform-browser'; import { TranslateModule } from '@ngx-translate/core'; -import { MapglSettingsComponent, MapglSettingsDialogComponent } from './mapgl-settings.component'; -import { GetCollectionDisplayModule } from '../../pipes/get-collection-display-name/get-collection-display.module'; +import { MapSettingsComponent, MapSettingsDialogComponent } from './map-settings.component'; +import { GetCollectionDisplayModule } from 'arlas-web-components'; @NgModule({ imports: [ CommonModule, - BrowserModule, FormsModule, MatTabsModule, MatDialogModule, @@ -51,9 +49,9 @@ import { GetCollectionDisplayModule } from '../../pipes/get-collection-display-n TranslateModule, GetCollectionDisplayModule ], - declarations: [MapglSettingsComponent, MapglSettingsDialogComponent], - exports: [MapglSettingsComponent] + declarations: [MapSettingsComponent, MapSettingsDialogComponent], + exports: [MapSettingsComponent] }) -export class MapglSettingsModule { +export class MapSettingsModule { } diff --git a/projects/arlas-map/src/lib/map/AbstractArlasMapGL.ts b/projects/arlas-map/src/lib/map/AbstractArlasMapGL.ts new file mode 100644 index 00000000..cb3d71b3 --- /dev/null +++ b/projects/arlas-map/src/lib/map/AbstractArlasMapGL.ts @@ -0,0 +1,353 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { fromEvent, map, Observable, Subscription } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { ControlPosition, ControlsOption, DrawControlsOption } from './model/controls'; +import { MapExtent } from './model/extent'; +import { ArlasLngLat, ArlasLngLatBounds, OnMoveResult } from './model/map'; +import { marker } from '@colsen1991/ngx-translate-extract-marker'; +import bbox from '@turf/bbox'; + + +/** Conf */ +export interface MapConfig { + displayCurrentCoordinates: boolean; + fitBoundsPadding: number; + margePanForLoad: number; + margePanForTest: number; + wrapLatLng: boolean; + offset: ArlasMapOffset; + mapProviderOptions?: T; + maxWidthScale?: number; + unitScale?: string; + controls?: ControlsOption; +} + +export interface ArlasMapOffset { + north: number; + east: number; + south: number; + west: number; +} + +export const GEOJSON_SOURCE_TYPE = 'geojson'; + +export const CROSS_LAYER_PREFIX = 'arlas_cross'; +export const ZOOM_IN = marker('Zoom in'); +export const ZOOM_OUT = marker('Zoom out'); +export const RESET_BEARING = marker('Reset bearing to north'); +export const LAYER_SWITCHER_TOOLTIP = marker('Manage layers'); + +/** + * The aim of this class is to handle all core interaction we have + * with a map provider. + * The aim is also to separate the Arlas map from the Angular framework. + * It will be instantiated in the map.component and will be responsible for initializing the map and all map behavior. + */ +export abstract class AbstractArlasMapGL { + /** + * props and methods with unknown type will be specific to the map provider + * we use. + * ex: endLngLat will have a type Maplibre.Pointlike/ Mapbox.Point + */ + + public abstract startLngLat: ArlasLngLat; + public abstract endLngLat: ArlasLngLat; + public abstract moveLngLat: ArlasLngLat; + protected _offset: ArlasMapOffset; + protected _margePanForLoad: number; + protected _margePanForTest: number; + protected _fitBoundsPadding: number; + protected _displayCurrentCoordinates: boolean; + protected _wrapLatLng: boolean; + protected _controls: ControlsOption; + protected _maxWidthScale?: number; + protected _unitScale?: string; + public currentLat: string; + public currentLng: string; + public readonly POLYGON_LABEL_SOURCE = 'polygon_label'; + + protected _north: number; + protected _east: number; + protected _west: number; + protected _south: number; + public zoom: number; + protected _zoomStart: number; + + protected _dragStartX: number; + protected _dragStartY: number; + + protected _dragEndX: number; + protected _dragEndY: number; + + protected _xMoveRatio: number; + protected _yMoveRatio: number; + + protected _moveEnd$: Observable; + protected _zoomStart$: Observable; + protected _dragStart$: Observable; + protected _dragEnd$: Observable; + + protected _eventSubscription: Subscription[] = []; + + protected evented = new EventTarget(); + + protected constructor(protected config: MapConfig) { + this.config = config; + this._offset = config.offset; + this._margePanForLoad = config.margePanForLoad; + this._margePanForTest = config.margePanForTest; + this._displayCurrentCoordinates = config.displayCurrentCoordinates ?? false; + this._wrapLatLng = config.wrapLatLng ?? true; + this._controls = config.controls; + this._fitBoundsPadding = config.fitBoundsPadding ?? 10; + this._maxWidthScale = config.maxWidthScale; + this._unitScale = config.unitScale; + this.init(config); + } + + protected init(config: MapConfig): void { + try { + this._initMapProvider(config); + this._initControls(); + this._initOnLoad(); + this._initMapMoveEvents(); + } catch (e) { + console.log(e); + } + } + + protected _initOnLoad() { + this.onLoad(() => { + this.evented.dispatchEvent(new Event('beforeOnLoadInit')); + this._updateBounds(); + this._updateZoom(); + this.getMapProvider().fitBounds(this.getBounds()); + }); + } + + public onCustomEvent(event: string, loadFn: () => void) { + this.evented.addEventListener(event, loadFn); + } + + protected _initMapMoveEvents() { + this._zoomStart$ = fromEvent(this.getMapProvider(), 'zoomstart') + .pipe(debounceTime(750)); + + this._dragStart$ = fromEvent(this.getMapProvider(), 'dragstart') + .pipe(debounceTime(750)); + + this._dragEnd$ = fromEvent(this.getMapProvider(), 'dragend') + .pipe(debounceTime(750)); + + this._moveEnd$ = fromEvent(this.getMapProvider(), 'moveend') + .pipe(debounceTime(750)); + + this._updateOnZoomStart(); + this._updateOnDragStart(); + this._updateOnDragEnd(); + this._updateOnMoveEnd(); + } + + protected _updateBounds(): void { + this._west = this.getWestBounds(); + this._south = this.getSouthBounds(); + this._east = this.getEastBounds(); + this._north = this.getNorthBounds(); + } + + protected _updateZoom(e?: any): void { + this.zoom = this.getZoom(); + } + + protected _updateCurrentLngLat(e: any): void { + const lngLat = e.lngLat; + if (this._displayCurrentCoordinates) { + const displayedLngLat = this._wrapLatLng ? lngLat.wrap() : lngLat; + this.currentLng = String(Math.round(displayedLngLat.lng * 100000) / 100000); + this.currentLat = String(Math.round(displayedLngLat.lat * 100000) / 100000); + } + } + + protected _updateDragEnd(e: any): void { + if (e.originalEvent) { + this._dragEndX = e.originalEvent.clientX; + this._dragEndY = e.originalEvent.clientY; + } + } + + protected _updateDragStart(e: any): void { + this._dragStartX = e.originalEvent.clientX; + this._dragStartY = e.originalEvent.clientY; + } + + protected _updateEndLngLat(e: any): void { + this.endLngLat = e.lngLat; + } + + protected _updateMoveRatio(e: any): void { + this._xMoveRatio = Math.abs(this._dragEndX - this._dragStartX) / e.target._canvas.clientWidth; + this._yMoveRatio = Math.abs(this._dragEndY - this._dragStartY) / e.target._canvas.clientHeight; + } + + protected _updateStartLngLat(e: any): void { + this.startLngLat = e.lngLat; + } + + + protected _updateZoomStart(): void { + this._zoomStart = this.getZoom(); + } + + protected _updateOnZoomStart() { + const sub = this._zoomStart$.subscribe(_ => this._updateZoomStart()); + this._eventSubscription.push(sub); + } + + protected _updateOnDragStart() { + const sub = this._dragStart$.subscribe(e => this._updateDragStart(e)); + this._eventSubscription.push(sub); + } + + protected _updateOnDragEnd() { + const sub = this._dragEnd$ + .subscribe(e => { + this._updateDragEnd(e); + this._updateMoveRatio(e); + }); + this._eventSubscription.push(sub); + } + + protected _updateOnMoveEnd() { + const sub = this._moveEnd$ + .subscribe(_ => { + this._updateBounds(); + this._updateZoom(); + }); + this._eventSubscription.push(sub); + } + + public onMoveEnd(visualisationsSets: { + visualisations: Map>; + status: Map; + }, cb?: () => void) { + return this._moveEnd$ + .pipe(map(_ => { + this._updateBounds(); + this._updateZoom(); + if (cb) { + cb(); + } + return this._getMoveEnd(visualisationsSets); + })); + } + + public setLayoutProperty(layer: string, name: string, value: any, options?: any) { + this.getMapProvider().setLayoutProperty(layer, name, value, options); + return this; + } + + public unsubscribeEvents() { + this._eventSubscription.forEach(s => s.unsubscribe()); + } + + public getMaxZoom(): number { + return this.getMapProvider().getMaxZoom(); + } + + public getMinZoom(): number { + return this.getMapProvider().getMinZoom(); + } + + public getPitch(): number { + return this.getMapProvider().getPitch(); + } + + protected abstract _initMapProvider(BaseMapGlConfig): void; + protected abstract _initControls(): void; + protected abstract _getMoveEnd(visualisationsSets: { + visualisations: Map>; + status: Map; + }): OnMoveResult; + + public abstract addControl(control: any, position?: ControlPosition, eventOverride?: { + event: string; fn: (e?) => void; + }); + public abstract calcOffsetPoint(): any; + public abstract disableDragPan(): void; + public abstract enableDragPan(): void; + public abstract fitBounds(bounds: ArlasLngLatBounds | number[], options?: unknown, unknown?: unknown): this; + public abstract fitToPaddedBounds(bounds: ArlasLngLatBounds | number[]); + public abstract getBounds(): unknown; + public abstract getCanvasContainer(): HTMLElement; + public abstract getEastBounds(): number; + public abstract getMapExtend(): MapExtent; + public abstract getMapProvider(): any; + public abstract getMaxBounds(): unknown; + public abstract getNorthBounds(): number; + public abstract getNorthEastBounds(): ArlasLngLat; + public abstract getSouthBounds(): number; + public abstract getSouthWestBounds(): ArlasLngLat; + public abstract getWestBounds(): number; + public abstract getZoom(): number; + public abstract initDrawControls(config: DrawControlsOption): void; + public abstract on(type: string, listener: (ev: any) => void): this; + public abstract onLoad(fn: () => void): void; + public abstract queryRenderedFeatures(pointOrBox?: unknown, options?: { layers?: string[]; filter?: any[]; }): any[]; + public abstract resize(eventData?: unknown): this; + public abstract setCenter(center: unknown, unknown?: unknown): this; + public abstract setMaxBounds(unknown?: unknown): this; + public abstract setFilter(layer: string, filter?: boolean | any[], options?: unknown): this; + public abstract paddedBounds(npad: number, spad: number, epad: number, + wpad: number, map: any, SW: ArlasLngLat, NE: ArlasLngLat): ArlasLngLat[]; + + + /** Gets bounds of the given geometry */ + public geometryToBounds(geometry: any, paddingPercentage?: number): ArlasLngLatBounds { + const boundingBox: any = bbox(geometry); + let west = boundingBox[0]; + let south = boundingBox[1]; + let east = boundingBox[2]; + let north = boundingBox[3]; + if (paddingPercentage !== undefined) { + let width = east - west; + let height = north - south; + /** if there is one hit, then west=east ===> we consider a width of 0.05°*/ + if (width === 0) { + width = 0.05; + } + /** if there is one hit, then north=south ===> we consider a height of 0.05°*/ + if (height === 0) { + height = 0.05; + } + west = west - paddingPercentage * width; + south = Math.max(-90, south - paddingPercentage * height); + east = east + paddingPercentage * width; + north = Math.min(90, north + paddingPercentage * height); + } + const bounds = new ArlasLngLatBounds( + new ArlasLngLat(west, south), + new ArlasLngLat(east, north) + ); + return bounds; + } + +} + diff --git a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.control.ts b/projects/arlas-map/src/lib/map/model/controls.ts similarity index 68% rename from projects/arlas-components/src/lib/components/mapgl/mapgl.component.control.ts rename to projects/arlas-map/src/lib/map/model/controls.ts index 7f062cbc..f0776675 100644 --- a/projects/arlas-components/src/lib/components/mapgl/mapgl.component.control.ts +++ b/projects/arlas-map/src/lib/map/model/controls.ts @@ -18,9 +18,50 @@ */ import { marker } from '@colsen1991/ngx-translate-extract-marker'; -import MapboxDraw from '@mapbox/mapbox-gl-draw'; +/** All the map controls configuration + * These interfaces are generic. + */ + +export type ControlPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'; + +export interface IconConfig { + path: string; + recolorable?: boolean; +} + +export interface ConfigControls { + enable: boolean; + position?: ControlPosition; + config?: any; + overrideEvent?: { event: any; fn: (e) => void; }; +} + +export interface PitchToggleConfigControls extends ConfigControls { + enable: boolean; + position?: ControlPosition; + config: { bearing: number; pitch: number; minpitchzoom: number; }; + overrideEvent?: { event: any; fn: (e?) => void; }; +} + +export interface ControlsOption { + mapAttribution?: ConfigControls; + scale?: ConfigControls; + pitchToggle?: PitchToggleConfigControls; + navigationControl?: ConfigControls; +} + +export interface DrawConfigControl extends ConfigControls { + name?: string; +} + +export interface DrawControlsOption { + draw: { control: any; position?: ControlPosition; }; + addGeoBox: DrawConfigControl; + removeAois: DrawConfigControl; +} + export class PitchToggle { public bearing: number; public pitch: number; @@ -28,6 +69,7 @@ export class PitchToggle { public map: any; public btn: HTMLButtonElement; public container: HTMLDivElement; + public image3D = 'url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzM' + 'CI+ICAgIDx0ZXh0IHg9IjUwJSIgeT0iNTAlIiBkeT0iLjM1ZW0iIHN0eWxlPSJmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLEFya' + 'WFsLEhlbHZldGljYSxzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbmNob3I6IG1pZGRsZTsiPjNEPC90ZXh0Pjwvc3ZnPg==)'; @@ -35,16 +77,25 @@ export class PitchToggle { 'CI+ICAgIDx0ZXh0IHg9IjUwJSIgeT0iNTAlIiBkeT0iLjM1ZW0iIHN0eWxlPSJmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLEFyaWF' + 'sLEhlbHZldGljYSxzYW5zLXNlcmlmOyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbmNob3I6IG1pZGRsZTsiPjJEPC90ZXh0Pjwvc3ZnPg==)'; + public btnClasses: string[] = []; + public containerClasses: string[] = []; + public constructor(bearing, pitch, minpitchzoom) { this.bearing = bearing; this.pitch = pitch; this.minpitchzoom = minpitchzoom; + this._buildClasses(); + } + + protected _buildClasses() { + this.btnClasses = []; + this.containerClasses = []; } public onAdd(map) { this.map = map; this.btn = document.createElement('button'); - this.btn.className = 'mapboxgl-ctrl-icon mapboxgl-ctrl-pitch'; + this.btn.className = this.btnClasses.join(' '); this.btn.style.backgroundImage = this.image3D; this.btn.type = 'button'; this.btn['aria-label'] = marker('Toggle Pitch'); @@ -62,7 +113,7 @@ export class PitchToggle { } }; this.container = document.createElement('div'); - this.container.className = 'mapboxgl-ctrl mapboxgl-ctrl-group mapboxgl-ctrl-group-pitch'; + this.container.className = this.containerClasses.join(' '); this.container.appendChild(this.btn); return this.container; } @@ -72,26 +123,7 @@ export class PitchToggle { this.map = undefined; } } -export class DrawControl { - public mapboxDraw: MapboxDraw; - public enabled: boolean; - public constructor(drawOptions: any, enabled: boolean) { - this.mapboxDraw = new MapboxDraw(drawOptions); - this.enabled = enabled; - } - public onAdd(map) { - const controlContainer = this.mapboxDraw.onAdd(map); - if (!this.enabled) { - controlContainer.className += ' draw-control-disabled'; - } - return controlContainer; - } - - public onRemove(map) { - return this.mapboxDraw.onRemove(map); - } -} export class ControlButton { public map: any; public btn: HTMLButtonElement; @@ -99,18 +131,26 @@ export class ControlButton { public icon; public name; private tooltip; + public btnClasses: string[] = []; + public containerClasses: string[] = []; public constructor(name: string, tooltip?: string) { this.name = name; this.tooltip = tooltip; + this._buildClasses(); + } + + protected _buildClasses() { + this.btnClasses = []; + this.containerClasses = []; } public onAdd(map) { this.map = map; this.btn = document.createElement('button'); - this.btn.className = 'mapboxgl-ctrl-icon map__controls__icons map__controls__icons--' + this.name; + this.btn.className = this.btnClasses.join(' '); this.btn.type = 'button'; this.btn.id = 'layers_switcher_btn'; this.container = document.createElement('div'); - this.container.className = 'mapboxgl-ctrl mapboxgl-ctrl-group mapboxgl-ctrl-group-' + this.name; + this.container.className = this.containerClasses.join(' '); this.container.setAttribute('title', this.tooltip); this.container.appendChild(this.btn); return this.container; diff --git a/projects/arlas-map/src/lib/map/model/events.ts b/projects/arlas-map/src/lib/map/model/events.ts new file mode 100644 index 00000000..8dbe2df1 --- /dev/null +++ b/projects/arlas-map/src/lib/map/model/events.ts @@ -0,0 +1,31 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ArlasPoint } from './geometry'; +import { ArlasLngLat } from './map'; + +export interface MapMouseEvent { + type: string; + point: ArlasPoint; + lngLat: ArlasLngLat; +} + +export interface MapLayerMouseEvent extends MapMouseEvent { + features: GeoJSON.Feature[]; +} diff --git a/projects/arlas-map/src/lib/map/model/extent.ts b/projects/arlas-map/src/lib/map/model/extent.ts new file mode 100644 index 00000000..973d179c --- /dev/null +++ b/projects/arlas-map/src/lib/map/model/extent.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface MapExtent { + bounds: number[][]; + center: number[]; + zoom: number; +} diff --git a/projects/arlas-map/src/lib/map/model/filters.ts b/projects/arlas-map/src/lib/map/model/filters.ts new file mode 100644 index 00000000..aa2b737a --- /dev/null +++ b/projects/arlas-map/src/lib/map/model/filters.ts @@ -0,0 +1,31 @@ + +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { marker } from '@colsen1991/ngx-translate-extract-marker'; + + +export const GET = 'get'; +export const MATCH = 'match'; +export const INTERPOLATE = 'interpolate'; +export const OTHER = marker('other_color'); +export const IN = 'in'; +export const NOT_IN = '!'; +export const HEATMAP_DENSITY = 'Heatmap-density'; + diff --git a/projects/arlas-map/src/lib/map/model/geometry.ts b/projects/arlas-map/src/lib/map/model/geometry.ts new file mode 100644 index 00000000..35abe706 --- /dev/null +++ b/projects/arlas-map/src/lib/map/model/geometry.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export class ArlasPoint { + public x: number; + public y: number; + + public constructor(x: number, y: number) { + this.x = x; + this.y = y; + } +} diff --git a/projects/arlas-components/src/lib/components/mapgl/model/mapLayers.ts b/projects/arlas-map/src/lib/map/model/layers.ts similarity index 72% rename from projects/arlas-components/src/lib/components/mapgl/model/mapLayers.ts rename to projects/arlas-map/src/lib/map/model/layers.ts index 6485d0ac..f5d16fc5 100644 --- a/projects/arlas-components/src/lib/components/mapgl/model/mapLayers.ts +++ b/projects/arlas-map/src/lib/map/model/layers.ts @@ -17,10 +17,18 @@ * under the License. */ -import { AnyLayer } from 'mapbox-gl'; +export interface ArlasDataLayer { + id: string; + type: string; + source?: string; + metadata?: LayerMetadata; + paint: PaintValue; + layout?: any; + filter?: any; +} -export interface MapLayers { - layers: Array; +export interface MapLayers { + layers: Array; externalEventLayers?: Array; events: LayerEvents; } @@ -46,6 +54,12 @@ export interface FillStroke { opacity?: number; color?: PaintValue; } + +/** Metadata of a layer containing info about + * - the collection + * - whether it has an interaction with the resultlist (scrollable) + * - geomType for circle heatmap. + */ export interface LayerMetadata { collection?: string; collectionDisplayName?: string; @@ -73,4 +87,14 @@ export const SCROLLABLE_ARLAS_ID = 'scrollable_arlas_id:'; export const ARLAS_ID = 'arlas_id:'; export const ARLAS_VSET = ':arlas_vset:'; - +/** FROM V15.0.0 layer ids look like 'arlas_id:NAME:timestamp + * This pipe extracts the 'NAME' in that id + */ +export function getLayerName(id: string): string { + if (!!id && id.startsWith(ARLAS_ID)) { + const datedName = id.split(ARLAS_ID)[1]; + const undatedName = datedName.split(':')[0]; + return undatedName; + } + return id; +} diff --git a/projects/arlas-map/src/lib/map/model/map.ts b/projects/arlas-map/src/lib/map/model/map.ts new file mode 100644 index 00000000..145f7c33 --- /dev/null +++ b/projects/arlas-map/src/lib/map/model/map.ts @@ -0,0 +1,77 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +export interface OnMoveResult { + zoom: number; + zoomStart: number; + center: Array; + centerWithOffset: Array; + extend: Array; + extendWithOffset: Array; + rawExtendWithOffset: Array; + extendForLoad: Array; + extendForTest: Array; + rawExtendForLoad: Array; + rawExtendForTest: Array; + xMoveRatio: number; + yMoveRatio: number; + visibleLayers: Set; +} + +export class ArlasLngLat { + public lng: number; + public lat: number; + + public constructor(lng, lat) { + this.lng = lng; + this.lat = lat; + } + + public toArray(): number[] { + return [this.lng, this.lat]; + } +} + +export class ArlasLngLatBounds { + public sw: ArlasLngLat; + public ne: ArlasLngLat; + + public constructor(sw: ArlasLngLat, ne: ArlasLngLat) { + this.sw = sw; + this.ne = ne; + } + + public getEast() { + return this.ne.lng; + } + + public getNorth() { + return this.ne.lat; + } + + public getWest() { + return this.sw.lng; + } + + public getSouth() { + return this.sw.lat; + } +} + diff --git a/projects/arlas-components/src/lib/components/mapgl/model/mapSource.ts b/projects/arlas-map/src/lib/map/model/sources.ts similarity index 76% rename from projects/arlas-components/src/lib/components/mapgl/model/mapSource.ts rename to projects/arlas-map/src/lib/map/model/sources.ts index a7bce17d..5817f9e8 100644 --- a/projects/arlas-components/src/lib/components/mapgl/model/mapSource.ts +++ b/projects/arlas-map/src/lib/map/model/sources.ts @@ -17,9 +17,9 @@ * under the License. */ -export class MapSource { + +/** Data source of a layer */ +export class ArlasMapSource { public id: string; - public source: string | mapboxgl.AnySourceData | mapboxgl.VectorSource | mapboxgl.RasterSource | - mapboxgl.GeoJSONSource | mapboxgl.GeoJSONSourceRaw | - mapboxgl.CanvasSource | mapboxgl.ImageSource | mapboxgl.VideoSource; + public source: string | SourceType; } diff --git a/projects/arlas-map/src/lib/map/model/vector-style.ts b/projects/arlas-map/src/lib/map/model/vector-style.ts new file mode 100644 index 00000000..8a5a3e9d --- /dev/null +++ b/projects/arlas-map/src/lib/map/model/vector-style.ts @@ -0,0 +1,66 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/** This file describes how to style a vector layer */ + +export enum VectorStyleEnum { + circle = 'circle', + fill = 'fill', + line = 'line' +} + +export interface ArlasCircle { + 'circle-color': any; + 'circle-radius': any; + 'circle-blur': any; + 'circle-opacity': any; + 'circle-stroke-width': any; + 'circle-stroke-color': any; + 'circle-stroke-opacity': any; +} + +export interface ArlasFill { + 'fill-color': any; + 'fill-opacity': any; + 'fill-outline-color': any; +} + +export abstract class VectorStyle { + public type: VectorStyleEnum; + public style: ArlasCircle | ArlasFill; + public constructor(type: VectorStyleEnum, style: ArlasCircle | ArlasFill ) { + this.type = type; + this.style = style; + } + + public applyStyle(layer: any) { + switch (this.type) { + case VectorStyleEnum.circle: + this.circle(layer); + break; + case VectorStyleEnum.fill: + this.fill(layer); + break; + } + } + + public abstract circle(layer: any); + public abstract fill(layer: any); +} diff --git a/projects/arlas-map/src/lib/map/model/visualisationsets.ts b/projects/arlas-map/src/lib/map/model/visualisationsets.ts new file mode 100644 index 00000000..6aa73f1b --- /dev/null +++ b/projects/arlas-map/src/lib/map/model/visualisationsets.ts @@ -0,0 +1,25 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +export interface VisualisationSetConfig { + name: string; + layers: Array; + enabled?: boolean; +} diff --git a/projects/arlas-map/src/lib/map/tools.ts b/projects/arlas-map/src/lib/map/tools.ts new file mode 100644 index 00000000..151666a5 --- /dev/null +++ b/projects/arlas-map/src/lib/map/tools.ts @@ -0,0 +1,42 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export function latLngToWKT(features): string { + let wktType = 'POLYGON[###]'; + if (features.length > 1) { + wktType = 'MULTIPOLYGON([###])'; + } + + let polygons = ''; + features.forEach((feat, indexFeature) => { + if (feat) { + const currentFeat: Array = feat.geometry.coordinates; + polygons += (indexFeature === 0 ? '' : ',') + '(('; + currentFeat[0].forEach((coord, index) => { + polygons += (index === 0 ? '' : ',') + coord[0] + ' ' + coord[1]; + }); + polygons += '))'; + } + }); + + let wkt = ''; + if (polygons !== '') { + wkt = wktType.replace('[###]', polygons); + } + return wkt; +} diff --git a/projects/arlas-map/src/public-api.ts b/projects/arlas-map/src/public-api.ts new file mode 100644 index 00000000..8eb18fa3 --- /dev/null +++ b/projects/arlas-map/src/public-api.ts @@ -0,0 +1,97 @@ + +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Public API Surface of arlas-map + */ + +export { + MapSettingsComponent, MapSettingsService, GeoQuery, GeometrySelectModel, OperationSelectModel, MapSettingsDialogComponent, + GeoQueryOperator +} from './lib/map-settings/map-settings.component'; +export { + AllowedImportGeometry, MapImportComponent, MapImportDialogComponent +} from './lib/map-import/map-import.component'; +export { MapSettingsModule } from './lib/map-settings/map-settings.module'; +export { MapImportModule } from './lib/map-import/map-import.module'; +export { GetCollectionPipe } from './lib/arlas-map.pipe'; +export { LayerIdToName } from './lib/legend/layer-name.pipe'; +export { LegendService } from './lib/legend/legend.service'; +export { ArlasMapModule } from './lib/arlas-map.module'; +export { LegendItemComponent } from './lib/legend/legend-item/legend-item.component'; +export { LegendComponent } from './lib/legend/legend.component'; +export { LayerIconComponent } from './lib/legend/legend-icon/layer-icon.component'; +export * from './lib/arlas-map-framework.service'; +export * from './lib/arlas-map.component'; +export * from './lib/arlas-map.module'; +export { CoordinatesComponent } from './lib/coordinates/coordinates.component'; +export { CoordinatesErrorPipe } from './lib/coordinates/coordinates.pipe'; +export { BasemapComponent } from './lib/basemaps/basemap.component'; +export { BasemapStyle } from './lib/basemaps/basemap.config'; +export { BasemapService } from './lib/basemaps/basemap.service'; +export { ArlasBasemaps } from './lib/basemaps/basemaps.model'; +export { BboxFormErrorPipe } from './lib/bbox-generator/bbox-form-error.pipe'; +export { BboxGeneratorComponent } from './lib/bbox-generator/bbox-generator.component'; +export { BboxGeneratorModule } from './lib/bbox-generator/bbox-generator.module'; +export { BboxFormGroup } from './lib/bbox-generator/bbox-generator.utils'; +export { Coordinate } from './lib/bbox-generator/coordinates.tools'; +export { AbstractDraw } from './lib/draw/AbstractDraw'; +export { AoiDimensions as AoiEdition, BboxDrawCommand, Corner, EditionState } from './lib/draw/draw.models'; +export { MapboxAoiDrawService } from './lib/draw/draw.service'; +export { limitVertexDirectSelectMode } from './lib/draw/modes/LimitVertexDirectSelectMode'; +export { validGeomDrawPolygonMode } from './lib/draw/modes/ValidGeomDrawPolygonMode'; +export { directModeOverride } from './lib/draw/modes/directSelectOverride'; +export { simpleSelectModeOverride } from './lib/draw/modes/simpleSelectOverride'; +export { circleMode } from './lib/draw/modes/circles/circle.mode'; +export { radiusCircleMode } from './lib/draw/modes/circles/radius.circle.mode'; +export { createSupplementaryPointsForCircle, dragPan } from './lib/draw/modes/circles/utils'; +export { stripDirectSelectMode } from './lib/draw/modes/strip/strip.direct.mode'; +export { stripMode } from './lib/draw/modes/strip/strip.mode'; +export { + AbstractArlasMapGL, ArlasMapOffset, CROSS_LAYER_PREFIX, + GEOJSON_SOURCE_TYPE, LAYER_SWITCHER_TOOLTIP, + MapConfig, RESET_BEARING, ZOOM_IN, ZOOM_OUT +} from './lib/map/AbstractArlasMapGL'; +export { + ConfigControls, ControlButton, ControlPosition, ControlsOption, DrawConfigControl, + DrawControlsOption, IconConfig, PitchToggle, PitchToggleConfigControls +} from './lib/map/model/controls'; +export { MapExtent } from './lib/map/model/extent'; +export { + ARLAS_ID, ARLAS_VSET, ExternalEvent, ExternalEventLayer, FILLSTROKE_LAYER_PREFIX, FillStroke, HOVER_LAYER_PREFIX, + LayerEvents, LayerMetadata, MapLayers, MetadataHiddenProps, PaintColor, PaintValue, SCROLLABLE_ARLAS_ID, SELECT_LAYER_PREFIX, + getLayerName, ArlasDataLayer, +} from './lib/map/model/layers'; +export { ArlasMapSource } from './lib/map/model/sources'; +export { VisualisationSetConfig } from './lib/map/model/visualisationsets'; +export { + Legend, LegendData, PROPERTY_SELECTOR_SOURCE, CircleLegend, LineLegend, + FillLegend, HeatmapLegend, LabelLegend +} from './lib/legend/legend.config'; +export { getMax, MAX_CIRLE_RADIUS, MAX_LINE_WIDTH } from './lib/legend/legend.tools'; +export * as styles from './lib/draw/themes/default-theme'; +export { ArlasMapComponent } from './lib/arlas-map.component'; +export { ArlasLngLat, OnMoveResult, ArlasLngLatBounds, } from './lib/map/model/map'; +export { VectorStyle, ArlasCircle, ArlasFill, VectorStyleEnum } from './lib/map/model/vector-style'; +/** Map component logic */ +export { AbstractArlasMapService } from './lib/arlas-map.service'; +/** Map framework logic */ +export { ArlasMapFrameworkService } from './lib/arlas-map-framework.service'; +export { GET, HEATMAP_DENSITY, IN, INTERPOLATE, MATCH, NOT_IN, OTHER } from './lib/map/model/filters'; +export { MapLayerMouseEvent, MapMouseEvent} from './lib/map/model/events'; diff --git a/projects/arlas-map/src/test.ts b/projects/arlas-map/src/test.ts new file mode 100644 index 00000000..44b5a75c --- /dev/null +++ b/projects/arlas-map/src/test.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js'; +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); diff --git a/projects/arlas-map/tsconfig.lib.json b/projects/arlas-map/tsconfig.lib.json new file mode 100644 index 00000000..ad24bf84 --- /dev/null +++ b/projects/arlas-map/tsconfig.lib.json @@ -0,0 +1,25 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2020", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/arlas-map/tsconfig.lib.prod.json b/projects/arlas-map/tsconfig.lib.prod.json new file mode 100644 index 00000000..06de549e --- /dev/null +++ b/projects/arlas-map/tsconfig.lib.prod.json @@ -0,0 +1,10 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/projects/arlas-map/tsconfig.spec.json b/projects/arlas-map/tsconfig.spec.json new file mode 100644 index 00000000..715dd0a5 --- /dev/null +++ b/projects/arlas-map/tsconfig.spec.json @@ -0,0 +1,17 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/arlas-mapbox/README.md b/projects/arlas-mapbox/README.md new file mode 100644 index 00000000..7082c809 --- /dev/null +++ b/projects/arlas-mapbox/README.md @@ -0,0 +1,19 @@ +# arlas-mapbox + +**arlas-mapbox** is an Angular library a mapboxgl implementation of the arlas-map library. + +## Build + +On the root of this repository, run + +```shell +$ npm run build-mapbox +``` + +## Running unit tests + +On the root of this repository, run + +```shell +$ npm run test-mapbox +``` \ No newline at end of file diff --git a/projects/arlas-mapbox/assets/styles/sizes.scss b/projects/arlas-mapbox/assets/styles/sizes.scss new file mode 100644 index 00000000..8f444ced --- /dev/null +++ b/projects/arlas-mapbox/assets/styles/sizes.scss @@ -0,0 +1,25 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** Font sizes **/ +$xxs-font-size: 9px; +$xs-font-size: 10px; +$sm-font-size: 12px; +$default-font-size: 14px; +$title-font-size: 18px; \ No newline at end of file diff --git a/projects/arlas-mapbox/ng-package.json b/projects/arlas-mapbox/ng-package.json new file mode 100644 index 00000000..2faf64ab --- /dev/null +++ b/projects/arlas-mapbox/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/arlas-mapbox", + "lib": { + "entryFile": "src/public-api.ts" + }, + "allowedNonPeerDependencies": ["arlas-map", "."] +} \ No newline at end of file diff --git a/projects/arlas-mapbox/package.json b/projects/arlas-mapbox/package.json new file mode 100644 index 00000000..e5c46ad5 --- /dev/null +++ b/projects/arlas-mapbox/package.json @@ -0,0 +1,24 @@ +{ + "name": "arlas-mapbox", + "version": "27.0.0-z-rc.0", + "peerDependencies": { + "@angular/animations": "^18.2.13", + "@angular/cdk": "^18.2.14", + "@angular/common": "^18.2.13", + "@angular/compiler": "^18.2.13", + "@angular/core": "^18.2.13", + "@angular/forms": "^18.2.13", + "@angular/material": "^18.2.14", + "@angular/platform-browser": "^18.2.13", + "@angular/platform-browser-dynamic": "^18.2.13", + "@angular/router": "^18.2.13", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0" + }, + "dependencies": { + "arlas-map": "~27.0.0-z-rc.0", + "mapbox-gl": "^1.6.1", + "rxjs": "^7.4.0", + "tslib": "^2.3.0" + } +} diff --git a/projects/arlas-mapbox/src/lib/arlas-map.service.ts b/projects/arlas-mapbox/src/lib/arlas-map.service.ts new file mode 100644 index 00000000..a09073a4 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/arlas-map.service.ts @@ -0,0 +1,293 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { AbstractArlasMapService, ARLAS_ID, ExternalEvent, FILLSTROKE_LAYER_PREFIX, SCROLLABLE_ARLAS_ID, + ArlasMapSource, LayerMetadata, MapLayers, VisualisationSetConfig, ArlasDataLayer + } from 'arlas-map'; +import { ArlasMapboxService } from './arlas-mapbox.service'; +import { FeatureCollection } from '@turf/helpers'; +import { ArlasMapboxGL } from './map/ArlasMapboxGL'; +import { MapboxSourceType } from './map/model/sources'; +import { Expression, GeoJSONSource, MapboxOptions } from 'mapbox-gl'; +import { ArlasAnyLayer } from './map/model/layers'; + + +@Injectable({ + providedIn: 'root' +}) +export class ArlasMapService extends AbstractArlasMapService { + public layersMap: Map; + public dataSources: GeoJSONSource[] = []; + public constructor(public mapService: ArlasMapboxService) { + super(mapService); + } + + /** + * @description Declares the arlas data sources provided in configuration. + * @param dataSourcesIds Identifiers of arlas data sources. + * @param data A feature collection. + * @param map Map instance. + */ + public declareArlasDataSources(dataSourcesIds: Set, data: FeatureCollection, map: ArlasMapboxGL) { + if (dataSourcesIds) { + dataSourcesIds.forEach(sourceId => { + const source = this.mapFrameworkService.createGeojsonSource(data); + this.dataSources.push(source as GeoJSONSource); + this.mapFrameworkService.setSource(sourceId, source, map); + }); + } + } + + /** + * Declares label sources for draw layers. + * @param labelSourceId Label source identifier. + * @param data A feature collection. + * @param map Map instance. + */ + public declareLabelSources(labelSourceId: string, data: FeatureCollection, map: ArlasMapboxGL) { + if (labelSourceId) { + const source = this.mapFrameworkService.createGeojsonSource(data); + this.mapFrameworkService.setSource(labelSourceId, source, map); + } + } + + public updateLabelSources(labelSourceId: string, data: FeatureCollection, map: ArlasMapboxGL) { + super.updateLabelSources(labelSourceId, data, map); + } + + /** + * Declares basemap sources + * @param basemapSources List of basemap sources. + * @param map Map instance. + */ + public declareBasemapSources(basemapSources: Array>, map: ArlasMapboxGL) { + // Add sources defined as input in mapSources; + const mapSourcesMap = new Map>(); + if (basemapSources) { + basemapSources.forEach(mapSource => { + mapSourcesMap.set(mapSource.id, mapSource); + }); + mapSourcesMap.forEach((mapSource, id) => { + if (typeof (mapSource.source) !== 'string') { + this.mapFrameworkService.setSource(id, mapSource.source, map); + } + }); + } + } + + public setLayersMap(mapLayers: MapLayers, layers?: Array) { + if (mapLayers) { + const mapLayersCopy = mapLayers; + if (layers) { + mapLayersCopy.layers = mapLayersCopy.layers.concat(layers); + } + const layersMap = new Map(); + mapLayersCopy.layers.forEach(layer => layersMap.set(layer.id, layer)); + this.layersMap = layersMap; + } + } + + public initMapLayers(mapLayers: MapLayers, map: ArlasMapboxGL) { + super.initMapLayers(mapLayers, map); + } + + public updateMapStyle(map: ArlasMapboxGL, l: any, ids: Array, sourceName: string): void { + const layer = this.mapService.getLayer(map, l); + if (!!layer && typeof (layer.source) === 'string' && layer.source.indexOf(sourceName) >= 0) { + if (ids && ids.length > 0) { + // Tests value in camel and kebab case due to an unknown issue on other projects + if ((layer.metadata as LayerMetadata).isScrollableLayer || layer.metadata['is-scrollable-layer']) { + map.setFilter(l, this.getVisibleIdsFilter(l, ids)); + const strokeLayerId = l.replace('_id:', '-fill_stroke-'); + const strokeLayer = this.mapService.getLayer(map, strokeLayerId); + if (strokeLayer) { + map.setFilter(strokeLayerId, this.getVisibleIdsFilter(strokeLayerId, ids)); + } + } + } else { + map.setFilter(l, this.layersMap.get(l).filter); + const strokeLayerId = l.replace('_id:', '-fill_stroke-'); + const strokeLayer = this.mapService.getLayer(map, strokeLayerId); + if (strokeLayer) { + map.setFilter(strokeLayerId, + this.layersMap.get(strokeLayerId).filter); + } + } + } + } + + public getVisibleIdsFilter(layer: any, ids: Array): Expression[] { + const lFilter = this.layersMap.get(layer).filter as Expression; + const filters = []; + if (lFilter) { + lFilter.forEach(f => { + filters.push(f); + }); + } + if (filters.length === 0) { + filters.push('all'); + } + filters.push([ + 'match', + ['get', 'id'], + Array.from(new Set(ids)), + true, + false + ]); + return filters; + } + + public addVisualisation(visualisation: VisualisationSetConfig, visualisations: VisualisationSetConfig[], layers: Array, + sources: Array>, mapLayers: MapLayers, map: ArlasMapboxGL): void { + sources.forEach((s) => { + if (typeof (s.source) !== 'string') { + map.getMapProvider().addSource(s.id, s.source); + } + }); + visualisations.unshift(visualisation); + this.visualisationsSets.visualisations.set(visualisation.name, new Set(visualisation.layers)); + this.visualisationsSets.status.set(visualisation.name, visualisation.enabled); + layers.forEach(layer => { + this.mapService.addLayer(map, layer as ArlasAnyLayer); + }); + this.setLayersMap(mapLayers, layers); + this.reorderLayers(visualisations, map); + } + + protected reorderDrawLayers(map: ArlasMapboxGL) { + this.mapService.getLayersFromPattern(map, '.cold').forEach(l => this.mapService.moveLayer(map, l.id)); + this.mapService.getLayersFromPattern(map, '.hot').forEach(l => this.mapService.moveLayer(map, l.id)); + } + + /** + * @override Mapbox implementation. + * @description Moves the given layer to the top in map instance OR optionnaly before a layer. + * This method handles any specific treatment when adding ARLAS data. + * For instance, in mapbox implementation, moving a fill layer needs to move systematically the stroke layer. + * @param map Map instance. + * @param layer A layer. It could be a layer identifier OR a layer object (it will depend on the framwork implementation). + * @param arlasDataLayers Map of ARLAS data layers and their ids (the ids being the key of the map). + * @param beforeId Identifier of an already added layer. The layers of layersMap are added under this 'beforeId' layer. + */ + public moveArlasDataLayer(map: ArlasMapboxGL, layerId: string, arlasDataLayers: Map, beforeId?: string) { + const layer = arlasDataLayers.get(layerId); + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + const scrollableLayer = arlasDataLayers.get(scrollableId); + if (!!scrollableLayer && this.mapService.hasLayer(map, scrollableId)) { + this.mapService.moveLayer(map, scrollableId, beforeId); + } + if (this.mapService.hasLayer(map, layerId)) { + this.mapService.moveLayer(map, layerId, beforeId); + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + const strokeLayer = arlasDataLayers.get(strokeId); + if (!!strokeLayer && this.mapService.hasLayer(map, strokeId)) { + this.mapService.moveLayer(map, strokeId, beforeId); + } + if (!!strokeLayer && !!strokeLayer.id) { + const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + strokeLayer.id; + const selectLayer = arlasDataLayers.get(selectId); + if (!!selectLayer && this.mapService.hasLayer(map, selectId)) { + this.mapService.moveLayer(map, selectId, beforeId); + } + const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + strokeLayer.id; + const hoverLayer = arlasDataLayers.get(hoverId); + if (!!hoverLayer && this.mapService.hasLayer(map, hoverId)) { + this.mapService.moveLayer(map, hoverId, beforeId); + } + } + } + } + const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + layer.id; + const selectLayer = arlasDataLayers.get(selectId); + if (!!selectLayer && this.mapService.hasLayer(map, selectId)) { + this.mapService.moveLayer(map, selectId, beforeId); + } + const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + layer.id; + const hoverLayer = arlasDataLayers.get(hoverId); + if (!!hoverLayer && this.mapService.hasLayer(map, hoverId)) { + this.mapService.moveLayer(map, hoverId, beforeId); + } + } + + + /** + * Add a layer to the map instance. This method handles any specific treatment when adding ARLAS data. + * For instance, in mapbox implementation, adding a fill layer needs to add systematically the stroke layer. + * @param map Map instance. + * @param layer A layer. It could be a layer identifier OR a layer object (it will depend on the framwork implementation). + * @param arlasDataLayers Map of ARLAS data layers and their ids (the ids being the key of the map). + * @param beforeId Identifier of an already added layer. The layers of layersMap are added under this 'beforeId' layer. + */ + public addArlasDataLayer(map: ArlasMapboxGL, layer: ArlasDataLayer, arlasDataLayers: Map, before?: string) { + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + const scrollableLayer = arlasDataLayers.get(scrollableId) as ArlasAnyLayer; + if (scrollableLayer) { + this.mapService.addLayer(map, scrollableLayer, before); + } + this.mapService.addLayer(map, layer as ArlasAnyLayer, before); + /** add stroke layer if the layer is a fill */ + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + const strokeLayer = arlasDataLayers.get(strokeId) as ArlasAnyLayer; + if (strokeLayer) { + this.mapService.addLayer(map, strokeLayer, before); + } + } + } + + public filterLayers(mapLayers: MapLayers, map: ArlasMapboxGL, + visibilityCondition: boolean, visibilityFilter: Array, visibilityEvent: ExternalEvent, + collection?: string): void { + if (mapLayers?.externalEventLayers) { + mapLayers.externalEventLayers.filter(layer => layer.on === visibilityEvent).forEach(layer => { + if (this.mapService.hasLayer(map, layer.id)) { + let originalLayerIsVisible = false; + const fullLayer = this.layersMap.get(layer.id); + const isCollectionCompatible = (!collection || (!!collection && (fullLayer.source).includes(collection))); + if (isCollectionCompatible) { + const originalLayerId = layer.id.replace('arlas-' + visibilityEvent.toString() + '-', ''); + const originalLayer = this.mapService.getAllLayers(map).find(l => l.id === originalLayerId); + if (originalLayer) { + originalLayerIsVisible = this.mapService.isLayerVisible(originalLayer); + } + const layerFilter: Array = []; + const externalEventLayer = this.layersMap.get(layer.id); + if (!!externalEventLayer && !!externalEventLayer.filter) { + externalEventLayer.filter.forEach(f => { + layerFilter.push(f); + }); + } + if (layerFilter.length === 0) { + layerFilter.push('all'); + } + if (visibilityCondition && originalLayerIsVisible) { + layerFilter.push(visibilityFilter); + this.mapService.filterGeojsonData(map, layer.id, layerFilter); + } else { + this.mapService.filterGeojsonData(map, layer.id, (layer as any).filter); + } + this.mapService.setLayerVisibility(layer.id, visibilityCondition && originalLayerIsVisible, map); + } + } + }); + } + } +} diff --git a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.module.ts b/projects/arlas-mapbox/src/lib/arlas-mapbox.module.ts similarity index 70% rename from projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.module.ts rename to projects/arlas-mapbox/src/lib/arlas-mapbox.module.ts index 8385802b..463feadf 100644 --- a/projects/arlas-components/src/lib/components/mapgl-basemap/mapgl-basemap.module.ts +++ b/projects/arlas-mapbox/src/lib/arlas-mapbox.module.ts @@ -17,23 +17,23 @@ * under the License. */ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { MatIconModule } from '@angular/material/icon'; -import { TranslateModule } from '@ngx-translate/core'; -import { MapglBasemapComponent } from './mapgl-basemap.component'; +import { ArlasMapboxService } from './arlas-mapbox.service'; +import { MapboxBasemapService } from './basemaps/mapbox-basemap.service'; +import { MapboxLegendService } from './legend/legend.service'; @NgModule({ declarations: [ - MapglBasemapComponent ], imports: [ - CommonModule, - TranslateModule, - MatIconModule + + ], + providers: [ + ArlasMapboxService, + MapboxBasemapService, + MapboxLegendService ], exports: [ - MapglBasemapComponent ] }) -export class MapglBasemapModule { } +export class ArlasMapboxModule { } diff --git a/projects/arlas-mapbox/src/lib/arlas-mapbox.service.spec.ts b/projects/arlas-mapbox/src/lib/arlas-mapbox.service.spec.ts new file mode 100644 index 00000000..d04629a2 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/arlas-mapbox.service.spec.ts @@ -0,0 +1,20 @@ +import { TestBed, waitForAsync } from '@angular/core/testing'; + +import { ArlasMapboxService } from './arlas-mapbox.service'; + +describe('ArlasMapboxService', () => { + let service: ArlasMapboxService; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + providers: [ + ArlasMapboxService + ] + }); + service = TestBed.inject(ArlasMapboxService); + })); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/arlas-mapbox/src/lib/arlas-mapbox.service.ts b/projects/arlas-mapbox/src/lib/arlas-mapbox.service.ts new file mode 100644 index 00000000..8b782875 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/arlas-mapbox.service.ts @@ -0,0 +1,503 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { FeatureCollection } from '@turf/helpers'; +import { + AbstractArlasMapGL, + ARLAS_ID, ArlasMapFrameworkService, FILLSTROKE_LAYER_PREFIX, + SCROLLABLE_ARLAS_ID +} from 'arlas-map'; +import { + AnyLayer, AnySourceData, GeoJSONSource, + GeoJSONSourceRaw, + MapboxOptions, Point, Popup, RasterLayer, RasterSource, SymbolLayer +} from 'mapbox-gl'; +import { ArlasDraw } from './draw/ArlasDraw'; +import { ArlasMapboxConfig, ArlasMapboxGL } from './map/ArlasMapboxGL'; +import { ArlasAnyLayer } from './map/model/layers'; +import { MapboxSourceType } from './map/model/sources'; +import { MapboxVectorStyle } from './map/model/vector-style'; + +@Injectable() +export class ArlasMapboxService extends ArlasMapFrameworkService { + + public constructor() { + super(); + } + + /** + * Returns the canvas element of the map. + * @param map Map instance. + */ + public getCanvas(map: ArlasMapboxGL): HTMLCanvasElement { + return map.getMapProvider().getCanvas(); + } + + public getInitTransformRequest(): Function { + return (url: string, resourceType: mapboxgl.ResourceType) => ({ + url, + }); + } + + public createMap(config: ArlasMapboxConfig): ArlasMapboxGL { + return new ArlasMapboxGL(config); + } + + public createDraw(drawOptions: any, enabled: boolean, map: ArlasMapboxGL): any { + return (new ArlasDraw(drawOptions, enabled, map)); + } + + /** + * Gets the Point (geometry) from mouse click on the screen. + * @param mouseEvent Click mouse event. + * @param container Map container. + * @returns a Point instance. + */ + public getPointFromScreen(mouseEvent: MouseEvent, container: HTMLElement): Point { + const rect = container.getBoundingClientRect(); + return new Point( + mouseEvent.clientX - rect.left - container.clientLeft, + mouseEvent.clientY - rect.top - container.clientTop + ); + }; + + + public getBoundsAsString(map: ArlasMapboxGL): string { + const bounds = map.getBounds(); + return bounds.getWest() + ',' + bounds.getSouth() + ',' + bounds.getEast() + ',' + bounds.getNorth(); + } + + + /** + * Fits the map to its current bounds. To be used when a map container is resized. + * @param map Map instance. + */ + public fitMapBounds(map: ArlasMapboxGL) { + map.getMapProvider().fitBounds(map.getMapProvider().getBounds()); + }; + + public setDataToGeojsonSource(source: GeoJSONSource, data: FeatureCollection) { + if (source) { + source.setData(data); + } + } + + /** + * @override Add an Image to the map. + * @param name Name of the image. + * @param url URL to fetch the image. + * @param map Mapbox map instance. + * @param errorMessage Error message shown as a warning if the image is not loaded. + * @param opt Options of image visualisation. + */ + public addImage(name: string, url: string, map: ArlasMapboxGL, errorMessage: string, opt?: any) { + const mapboxMap = map.getMapProvider(); + mapboxMap.loadImage( + url, + (error, image) => { + if (error) { + console.warn(errorMessage); + } + if (!mapboxMap.hasImage(name)) { + mapboxMap.addImage(name, image, opt); + } + }); + } + + /** + * @override Mapbox implementation. + * Checks if the given layer is already added to the map instance + * @param map Map instance + * @param layer layer identifier + */ + public hasLayer(map: ArlasMapboxGL, layer: string): boolean { + return !!map.getMapProvider().getLayer(layer); + }; + + /** + * Checks if the given source is already added to the map instance + * @param sourceId source identifier + * @param map Map instance + */ + public hasSource(map: ArlasMapboxGL, sourceId: string): boolean { + return !!map.getMapProvider().getSource(sourceId); + } + /** + * Creates and returns a Geojson source instance. + * @param data Geojson data to add to the source. + * @returns returns a Geojson source instance + */ + public createGeojsonSource(data: GeoJSON.Feature | GeoJSON.FeatureCollection): GeoJSONSourceRaw { + return { + type: 'geojson', + data + }; + }; + + /** + * @override Mapbox implementation. + * Adds the given source to the map instance + * @param sourceId Source identifier + * @param source Source instance + * @param map Map + */ + public setSource(sourceId: string, source: AnySourceData, map: ArlasMapboxGL) { + if (!this.hasSource(map, sourceId)) { + map.getMapProvider().addSource(sourceId, source); + } else { + console.warn(`The source ${sourceId} is already added to the map`); + } + }; + + /** + * @override Mapbox implementation. + * Adds the given layer to the map instance, optionnaly before a layer. Otherwise it's added to the top. + * @param map Map + * @param layer Layer to add to the map + * @param before Identifier of an already added layer. The given Layer (second param) is added under this 'before' layer. + */ + public addLayer(map: ArlasMapboxGL, layer: AnyLayer, before?: string) { + if (!this.hasLayer(map, layer.id)) { + map.getMapProvider().addLayer(layer, before); + } else { + console.warn(`The layer ${layer.id} is already added to the map`); + } + } + + + /** + * Executes the 'fn' function on 'eventName' triggered from the given 'layer' of the 'map' instance. + * @param eventName Event name. + * @param map Map instance. + * @param layer Layer identifier. + * @param fn Function to execute on event of the given layer. + */ + public onLayerEvent(eventName: 'click' | 'mousemove' | 'mouseleave', map: ArlasMapboxGL, layer: string, fn: (e) => void): void { + map.getMapProvider().on(eventName, layer, fn); + } + + /** + * @override Mapbox implementation. + * Executes the 'fn' function on 'eventName' triggered from the 'map' instance. + * @param eventName Event. + * @param map Map instance. + * @param fn Function to execute on given event on the map. + */ + public onMapEvent(eventName: 'load' | 'moveend' | 'zoomend', map: ArlasMapboxGL, fn: (e) => void) { + map.getMapProvider().on(eventName, fn); + } + + /** + * @override Mapbox implementation. + * Removes the given layer from the map. If the source of this layer is still on the map, it is also removed. + * @param map Map instance. + * @param layer layer to remove. + */ + public removeLayer(map: ArlasMapboxGL, layer: string): void { + if (this.hasLayer(map, layer)) { + const sourceId = this.getLayer(map, layer)?.source as string; + map.getMapProvider().removeLayer(layer); + this.removeSource(map, sourceId); + } + }; + + /** + * Returns the layer object of the given layer id. + * @param map Map instance. + * @param layer Layer identifier + * @returns the layer object. + */ + public getLayer(map: ArlasMapboxGL, layer: string): ArlasAnyLayer { + return map.getMapProvider().getLayer(layer) as ArlasAnyLayer; + } + + /** + * @override Mapbox implementation. + * @param layerId Layer identifier. + * @param isVisible If true, the layer is made visible, otherwise, it is hidden. + * @param map Map instance. + */ + public setLayerVisibility(layerId: string, isVisible: boolean, map: ArlasMapboxGL): void { + if (this.hasLayer(map, layerId)) { + map.getMapProvider().setLayoutProperty(layerId, 'visibility', isVisible ? 'visible' : 'none'); + const layer = this.getLayer(map, layerId); + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + if (this.hasLayer(map, strokeId)) { + map.getMapProvider().setLayoutProperty(strokeId, 'visibility', isVisible ? 'visible' : 'none'); + } + } + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + if (!layer.id.startsWith(SCROLLABLE_ARLAS_ID) && this.hasLayer(map, scrollableId)) { + map.getMapProvider().setLayoutProperty(scrollableId, 'visibility', isVisible ? 'visible' : 'none'); + } + } + } + + + /** + * @override Mapbox implementation. + * Removes the source from the map instance + * @param map Map instance + * @param source Source identifier. + */ + public removeSource(map: ArlasMapboxGL, source: string) { + if (!!source && this.hasSource(map, source)) { + map.getMapProvider().removeSource(source); + } + }; + + /** + * @override Mapbox implementation. + * Creates a popup at lng,lat with the given message. The popup is not yet added to the map. + * @param lng Longitude. + * @param lat Latitude. + * @param message The popup message. + * @returns The popup instance. + */ + public createPopup(lng: number, lat: number, message: string): Popup { + const popup = new Popup({ + closeButton: false, + closeOnClick: false + }); + return popup.setLngLat([lat, lng]) + .setHTML(message); + } + + /** + * @override Mapbox implementation. + * Adds the given popup to the map. + * @param map Map instance. + * @param popup Popup instance. + */ + public addPopup(map: ArlasMapboxGL, popup: Popup): void { + popup.addTo(map.getMapProvider()); + } + + /** + * @override Mapbox implementation. + * Removes the given popup from the map. + * @param map Map instance. + * @param popup Popup instance. + */ + public removePopup(map: ArlasMapboxGL, popup: Popup): void { + popup.remove(); + } + + /** + * @override Mapbox implementation. + * Removes all the given layers (and their sources) from the map. + * @param map Map instance. + * @param layers Identifiers of layers to remove. + */ + public removeLayers(map: ArlasMapboxGL, layers: string[]): void { + layers.forEach(l => this.removeLayer(map, l)); + } + + /** + * @override Mapbox implementation. + * Removes all layers which identifier includes the given id pattern. + * @param map Map instance. + * @param layersIdPattern Identifiers pattern to remove from the map. + */ + public removeLayersFromPattern(map: ArlasMapboxGL, layersIdPattern: string) { + map.getMapProvider().getStyle().layers.filter(l => l.id.includes(layersIdPattern)).forEach(l => this.removeLayer(map, l.id)); + } + + /** + * @override Mapbox implementation. + * Checks if there are any layers respecting the given id pattern + * @param map Map instance. + * @param layersIdPattern Identifiers pattern. + * @returns true if any layer's id includes the given id pattern. + */ + public hasLayersFromPattern(map: ArlasMapboxGL, layersIdPattern: string): boolean { + return map.getMapProvider().getStyle().layers.filter(l => l.id.includes(layersIdPattern)).length > 0; + } + + /** + * @override Mapbox implementation. + * Set the mouse cursor when it's over the map + * @param map Map instance. + * @param cursor cursor type (https://developer.mozilla.org/fr/docs/Web/CSS/cursor) + */ + public setMapCursor(map: ArlasMapboxGL, cursor: string): void { + map.getMapProvider().getCanvas().style.cursor = cursor; + } + + /** + * @override Mapbox implementation. + * Creates and returns a raster source instance. + * @param url Url to the raster source. + * @param bounds Bounds of the image [west, south, east, north]. + * @param maxZoom Maximal zoom to display the raster. + * @param minZoom Minimal zoom to display the raster. + * @param tileSize Size of the tiles fetched to display the raster (in pixels). Default to 256. + * @returns a raster source instance. + */ + public createRasterSource(url: string, bounds: number[], + maxZoom: number, minZoom: number, tileSize: number = 256): RasterSource { + return { + type: 'raster', + tiles: [url], + bounds: bounds as [number, number, number, number], + maxzoom: maxZoom, + minzoom: minZoom, + tileSize: tileSize + }; + } + + /** + * @override Mapbox implementation. + * Creates a new Raster layer and adds it to the map. + * @param map Map instance + * @param url Url to the raster source. + * @param bounds Bounds of the image [west, south, east, north]. + * @param maxZoom Maximal zoom to display the raster. + * @param minZoom Minimal zoom to display the raster. + * @param tileSize Size of the tiles fetched to display the raster (in pixels). Default to 256. + * @param beforeId Identifier of an already added layer. The raster Layer is added under this 'beforeId' layer. + */ + + public addRasterLayer(map: ArlasMapboxGL, layerId: string, url: string, bounds: number[], + maxZoom: number, minZoom: number, tileSize: number, beforeId?: string): void { + const rasterSource: RasterSource = this.createRasterSource(url, bounds, maxZoom, minZoom, tileSize); + const sourceId = layerId; + this.setSource(sourceId, rasterSource, map); + const iconLayer: RasterLayer = { + id: layerId, + source: sourceId, + type: 'raster', + layout: { + visibility: 'visible' + } + }; + this.addLayer(map, iconLayer, beforeId); + } + + /** + * @override Mapbox implementation. + * Creates a new Icon layer and adds to the map + * @param map Map instance + * @param layerId The identifier of the new icon layer + * @param iconName The icon name + * @param iconSize The icon size + * @param data Geojson data which features will be represented with the given icon. + */ + public addIconLayer(map: ArlasMapboxGL, layerId: string, iconName: string, iconSize: number, + data: GeoJSON.Feature | GeoJSON.FeatureCollection) { + const iconSource: GeoJSONSourceRaw = this.createGeojsonSource(data); + const sourceId = layerId; + this.setSource(sourceId, iconSource, map); + const iconLayer: SymbolLayer = { + id: layerId, + source: sourceId, + type: 'symbol', + layout: { + 'icon-image': iconName, + 'icon-size': iconSize, + 'visibility': 'visible' + } + }; + this.addLayer(map, iconLayer); + }; + + /** + * @override Mapbox implementation. + * Creates a new geojsob layer and adds to the map + * @param map Map instance + * @param layerId The identifier of the new icon layer + * @param style Vector style to apply to the geojson + * @param data Geojson data which features will be styled with the given style. + */ + public addGeojsonLayer(map: ArlasMapboxGL, layerId: string, style: MapboxVectorStyle, + data: GeoJSON.Feature | GeoJSON.FeatureCollection): void { + const source: GeoJSONSourceRaw = this.createGeojsonSource(data); + const sourceId = layerId; + this.setSource(sourceId, source, map); + const geojsonLayer: ArlasAnyLayer = { + id: layerId, + source: sourceId, + type: style.type, + layout: { + 'visibility': 'visible' + }, + }; + style.applyStyle(geojsonLayer); + this.addLayer(map, geojsonLayer); + } + + + public flyTo(lat: number, lng: number, zoom: number, map: ArlasMapboxGL) { + map.getMapProvider().flyTo({ center: [lng, lat], zoom }); + } + + public filterGeojsonData(map: ArlasMapboxGL, layerId: string, filter: any) { + map.getMapProvider().setFilter(layerId, filter); + } + + public queryFeatures(e: any, map: ArlasMapboxGL, layersIdPattern: string, options: any) { + map.getMapProvider().queryRenderedFeatures(e.point, options).filter(f => !!f.layer && !!f.layer.id && f.layer.id.includes(layersIdPattern)); + }; + + + public isLayerVisible(layer: ArlasAnyLayer): boolean { + return layer.layout.visibility === 'visible'; + } + + public getSource(sourceId: string, map: ArlasMapboxGL) { + return map.getMapProvider().getSource(sourceId); + } + + /** + * @override Mapbox implementation. + * Returns a list of layers whose ids include the the given id pattern. + * @param map Map instance. + * @param layersIdPattern Identifiers pattern. + * @returns a list of layers whose ids include the the given id pattern. + */ + public getLayersFromPattern(map: ArlasMapboxGL, layersIdPattern: string): ArlasAnyLayer[] { + return map.getMapProvider().getStyle().layers.filter(l => l.id.includes(layersIdPattern)) as ArlasAnyLayer[]; + } + + public getAllLayers(map: ArlasMapboxGL): ArlasAnyLayer[] { + return map.getMapProvider().getStyle().layers as ArlasAnyLayer[]; + } + + /** + * @override Mapbox implementation. + * Moves the given layer to the top in map instance OR optionnaly before a layer. + * @param map Map instance. + * @param layer Layer to add to the map. + * @param before Identifier of an already added layer. The given Layer (second param) is moved under this 'before' layer. + */ + public moveLayer(map: ArlasMapboxGL, layer: string, before?: string) { + if (this.hasLayer(map, layer)) { + map.getMapProvider().moveLayer(layer, before); + } else { + console.warn(`The layer ${layer} is not added to the map`); + } + } + + public getAllSources(map: ArlasMapboxGL) { + return (map as AbstractArlasMapGL).getMapProvider().getStyle().sources; + } +} diff --git a/projects/arlas-mapbox/src/lib/basemaps/basemap.config.ts b/projects/arlas-mapbox/src/lib/basemaps/basemap.config.ts new file mode 100644 index 00000000..5c5abe95 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/basemaps/basemap.config.ts @@ -0,0 +1,26 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import mapboxgl from 'mapbox-gl'; +import { BasemapStyle } from 'arlas-map'; + +export interface MapboxBasemapStyle extends BasemapStyle { + styleFile: string | mapboxgl.Style; +} diff --git a/projects/arlas-mapbox/src/lib/basemaps/mapbox-basemap.service.ts b/projects/arlas-mapbox/src/lib/basemaps/mapbox-basemap.service.ts new file mode 100644 index 00000000..6ad83840 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/basemaps/mapbox-basemap.service.ts @@ -0,0 +1,161 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { ArlasMapSource, BasemapService, BasemapStyle } from 'arlas-map'; +import mapboxgl, { GeoJSONSource, MapboxOptions } from 'mapbox-gl'; +import * as pmtiles from 'pmtiles'; +import { catchError, forkJoin, Observable, of, tap } from 'rxjs'; +import { ArlasMapService } from '../arlas-map.service'; +import { ArlasMapboxService } from '../arlas-mapbox.service'; +import { ArlasMapboxGL } from '../map/ArlasMapboxGL'; +import { ArlasAnyLayer } from '../map/model/layers'; +import { MapboxSourceType } from '../map/model/sources'; +import { CustomProtocol } from '../map/protocols/mapbox-gl-custom-protocol'; +import { MapboxBasemapStyle } from './basemap.config'; + +@Injectable() +export class MapboxBasemapService extends BasemapService { + + public constructor(protected http: HttpClient, protected mapFrameworkService: ArlasMapboxService, + private readonly mapService: ArlasMapService + ) { + super(http, mapFrameworkService); + } + + public addProtomapBasemap(map: ArlasMapboxGL) { + const selectedBasemap = this.basemaps.getSelected(); + if (selectedBasemap.type === 'protomap') { + const styleFile = selectedBasemap.styleFile as mapboxgl.Style; + const pmtilesSource = styleFile.sources['arlas_protomaps_source']; + if (pmtilesSource) { + // eslint-disable-next-line max-len + this.addPMtilesToSource(map, pmtilesSource); + this.addProtomapLayerToMap(map, styleFile); + } + } else { + /** no action needed. The base map has been added already thanks to getInitStyle */ + } + } + + public removeProtomapBasemap(map: ArlasMapboxGL) { + const selectedBasemap = this.basemaps.getSelected(); + if (selectedBasemap.type === 'protomap') { + (selectedBasemap.styleFile as mapboxgl.Style).layers.forEach(l => { + this.mapFrameworkService.removeLayer(map, l.id); + }); + this.mapFrameworkService.removeSource(map, 'arlas_protomaps_source'); + } + } + + public declareProtomapProtocol(map: ArlasMapboxGL) { + const protocol = new pmtiles.Protocol(); + if (!(mapboxgl as any).Style.getSourceType('pmtiles-type')) { + /** addSourceType is private readonly */ + (map as any).addSourceType('pmtiles-type', CustomProtocol(mapboxgl).vector, (e) => e && console.error('There was an error', e)); + (mapboxgl as any).addProtocol('pmtiles', protocol.tile); + } + } + + public getInitStyle(selected: MapboxBasemapStyle) { + if (selected.type === 'protomap') { + /** This is necessaty to make it work for mapbox. */ + const clonedStyleFile: mapboxgl.Style = this.cloneStyleFile(selected); + return this.buildInitStyle(clonedStyleFile); + } + return selected.styleFile as mapboxgl.Style; + } + + + public fetchSources$(): Observable { + const sources$: Observable[] = []; + this.basemaps.styles().forEach(s => { + sources$.push(this.getStyleFile(s).pipe( + tap(sf => { + Object.keys(sf.sources).forEach(k => { + const attribution = sf.sources[k]['attribution']; + if (attribution) { + sf.sources[k]['attribution'] = attribution + this.POWERED_BY_ARLAS; + } else { + sf.sources[k]['attribution'] = this.POWERED_BY_ARLAS; + } + }); + s.styleFile = sf; + }), + catchError(() => { + s.errored = true; + return of(); + }) + )); + }); + return forkJoin(sources$); + } + + protected getStyleFile(b: MapboxBasemapStyle): Observable { + if (typeof b.styleFile === 'string') { + return this.http.get(b.styleFile) as Observable; + } else { + return of(b.styleFile); + } + } + + public setBasemap(s: any, newBasemap: BasemapStyle, map: ArlasMapboxGL, mapSources: Array>) { + const selectedBasemapLayersSet = new Set(); + const layers: Array = this.mapFrameworkService.getAllLayers(map); + const sources = this.mapFrameworkService.getAllSources(map); + if (s.layers) { + s.layers.forEach(l => selectedBasemapLayersSet.add(l.id)); + } + const layersToSave = new Array(); + const sourcesToSave = new Array>(); + layers.filter((l: any) => !selectedBasemapLayersSet.has(l.id) && !!l.source).forEach(l => { + layersToSave.push(l); + if (sourcesToSave.filter(ms => ms.id === l.source.toString()).length === 0) { + sourcesToSave.push({ id: l.source.toString(), source: sources[l.source.toString()] as MapboxSourceType }); + } + }); + const sourcesToSaveSet = new Set(); + sourcesToSave.forEach(mapSource => sourcesToSaveSet.add(mapSource.id)); + if (mapSources) { + mapSources.forEach(mapSource => { + if (!sourcesToSaveSet.has(mapSource.id)) { + sourcesToSave.push(mapSource); + } + }); + } + const initStyle = this.getInitStyle(newBasemap); + map.getMapProvider().setStyle(initStyle).once('styledata', () => { + setTimeout(() => { + /** the timeout fixes a mapboxgl bug related to layer placement*/ + this.mapService.declareBasemapSources(sourcesToSave, map); + layersToSave.forEach(l => { + this.mapFrameworkService.addLayer(map, l); + }); + localStorage.setItem(this.LOCAL_STORAGE_BASEMAPS, JSON.stringify(newBasemap)); + this.basemaps.setSelected(newBasemap); + if (newBasemap.type === 'protomap') { + this.addProtomapBasemap(map); + this.notifyProtomapAddition(); + } + this.basemapChangedSource.next(); + }, 0); + }); + } +} diff --git a/projects/arlas-mapbox/src/lib/draw/ArlasDraw.ts b/projects/arlas-mapbox/src/lib/draw/ArlasDraw.ts new file mode 100644 index 00000000..6530f696 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/draw/ArlasDraw.ts @@ -0,0 +1,35 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AbstractDraw } from 'arlas-map'; +import { ArlasMapboxGL } from '../map/ArlasMapboxGL'; +import MapboxDraw from '@mapbox/mapbox-gl-draw'; + + +export class ArlasDraw extends AbstractDraw { + public constructor(config: any, enabled: boolean, map: ArlasMapboxGL) { + super(config, enabled, map); + + MapboxDraw.constants.classes.CONTROL_BASE = 'mapboxgl-ctrl'; + MapboxDraw.constants.classes.CONTROL_PREFIX = 'mapboxgl-ctrl-'; + MapboxDraw.constants.classes.CONTROL_GROUP = 'mapboxgl-ctrl-group'; + + } + +} diff --git a/projects/arlas-mapbox/src/lib/legend/legend.service.ts b/projects/arlas-mapbox/src/lib/legend/legend.service.ts new file mode 100644 index 00000000..78a75fbc --- /dev/null +++ b/projects/arlas-mapbox/src/lib/legend/legend.service.ts @@ -0,0 +1,144 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { HistogramData } from 'arlas-d3/histograms/utils/HistogramUtils'; +import { + CircleLegend, + FillLegend, + getMax, HEATMAP_DENSITY, + HeatmapLegend, + INTERPOLATE, + LabelLegend, + LayerMetadata, + Legend, LegendData, + LegendService, + LineLegend, + MATCH, + MAX_CIRLE_RADIUS, + MAX_LINE_WIDTH, + OTHER, PaintValue, PROPERTY_SELECTOR_SOURCE +} from 'arlas-map'; +import { CirclePaint, Expression, FillPaint, HeatmapPaint, Layer, LinePaint, StyleFunction, SymbolPaint } from 'mapbox-gl'; +import tinycolor from 'tinycolor2'; + + +@Injectable({ + providedIn: 'root' +}) +export class MapboxLegendService extends LegendService { + + public constructor(public translate: TranslateService) { + super(); + } + + public static filterLegend(colorLegendValues: Map, filter: any[], field: string) { + LegendService.filterLegend(colorLegendValues, filter, field); + } + + public static buildColorLegend(colorExpression: string | StyleFunction | Expression | PaintValue, + visibleMode: boolean, legendData: Map, + filter?: any, translate?: TranslateService): [Legend, string] { + + return LegendService.buildColorLegend(colorExpression, visibleMode, legendData, filter, translate); + }; + + public static buildRadiusLegend(radiusExpression: string | any, legendData: Map): Legend { + return LegendService.buildRadiusLegend(radiusExpression, legendData); + }; + + protected static buildWidthLegend(lineWidth: number | mapboxgl.StyleFunction | mapboxgl.Expression, + legendData: Map): Legend { + return LegendService.buildWidthLegend(lineWidth, legendData); + } + + public getCircleLegend(paint: CirclePaint, visibileMode: boolean, legendData: Map, layer: Layer): CircleLegend { + const p: CirclePaint = paint; + const colors = MapboxLegendService.buildColorLegend(p['circle-color'], visibileMode, legendData, layer.filter, this.translate); + const strokeColors = MapboxLegendService.buildColorLegend(p['circle-stroke-color'], visibileMode, legendData, + layer.filter, this.translate); + const radius = MapboxLegendService.buildRadiusLegend(p['circle-radius'], legendData); + return ({ + color: colors[0], + colorPalette: colors[1], + strokeColor: strokeColors[0], + strokeColorPalette: strokeColors[1], + radius: radius + }); + } + + public getLineLegend(paint: LinePaint, visibileMode: boolean, legendData: Map, layer: Layer): LineLegend { + const p: LinePaint = paint; + const colors = MapboxLegendService.buildColorLegend(p['line-color'], visibileMode, legendData, layer.filter, this.translate); + const width = MapboxLegendService.buildWidthLegend(p['line-width'], legendData); + return ({ + color: colors[0], + colorPalette: colors[1], + width: width, + dashes: p['line-dasharray'] + }); + } + + public getFillLegend(paint: FillPaint, visibileMode: boolean, legendData: Map, layer: Layer): FillLegend { + const p: FillPaint = paint; + const colors = MapboxLegendService.buildColorLegend(p['fill-color'], visibileMode, legendData, layer.filter, this.translate); + const metadata = layer.metadata as LayerMetadata; + let strokeColors: [Legend, string] = [undefined, '']; + if (!!layer.metadata && !!metadata.stroke) { + strokeColors = MapboxLegendService.buildColorLegend(metadata.stroke.color, visibileMode, legendData, + layer.filter, this.translate); + + } + return ({ + color: colors[0], + colorPalette: colors[1], + strokeColor: strokeColors[0], + strokeColorPalette: strokeColors[1], + }); + } + + + public getHeatmapLegend(paint: HeatmapPaint, visibileMode: boolean, legendData: Map, layer: Layer): HeatmapLegend { + const p: HeatmapPaint = paint; + const colors = MapboxLegendService.buildColorLegend(p['heatmap-color'], visibileMode, legendData, layer.filter, this.translate); + const radius = MapboxLegendService.buildRadiusLegend(p['heatmap-radius'], legendData); + if (layer.source.toString().startsWith('feature-metric')) { + colors[0].visible = false; + } + return ({ + color: colors[0], + colorPalette: colors[1], + radius: radius + }); + } + + + public getLabelLegend(paint: SymbolPaint, visibileMode: boolean, legendData: Map, layer: Layer): LabelLegend { + const p: SymbolPaint = paint; + const colors = MapboxLegendService.buildColorLegend(p['text-color'], visibileMode, legendData, layer.filter, this.translate); + const size = MapboxLegendService.buildWidthLegend(p['text-size'], legendData); + return ({ + color: colors[0], + colorPalette: colors[1], + size: size + }); + } + +} diff --git a/projects/arlas-mapbox/src/lib/map/ArlasMapboxGL.ts b/projects/arlas-mapbox/src/lib/map/ArlasMapboxGL.ts new file mode 100644 index 00000000..56ffaec3 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/map/ArlasMapboxGL.ts @@ -0,0 +1,386 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + AbstractArlasMapGL, + MapConfig, + OnMoveResult, + MapLayers, ControlButton, ControlPosition, DrawControlsOption, + MapExtent, ArlasLngLatBounds, ArlasLngLat +} from 'arlas-map'; +import mapboxgl, { + AnyLayer, + Control, + IControl, + LngLat, + LngLatBounds, + MapboxOptions, + Point +} from 'mapbox-gl'; +import MapboxDraw from '@mapbox/mapbox-gl-draw';; +import { MapBoxControlButton, MapBoxPitchToggle } from './model/controls'; + +export interface ArlasMapboxConfig extends MapConfig { + mapLayers: MapLayers; +} + +export class ArlasMapboxGL extends AbstractArlasMapGL { + + protected _mapProvider: mapboxgl.Map; + // Lat/lng on mousedown (start); mouseup (end) and mousemove (between start and end) + public startLngLat: mapboxgl.LngLat; + public endLngLat: mapboxgl.LngLat; + public moveLngLat: mapboxgl.LngLat; + + public constructor(protected config: ArlasMapboxConfig) { + super(config); + } + + public paddedBounds(npad: number, spad: number, epad: number, wpad: number, + mapboxMapInstance: mapboxgl.Map, SW: ArlasLngLat, NE: ArlasLngLat): LngLat[] { + const topRight = mapboxMapInstance.project(NE); + const bottomLeft = mapboxMapInstance.project(SW); + const scale = 1; + const swToPoint = mapboxMapInstance.project(SW); + const southWestPoint = new Point(((swToPoint.x - bottomLeft.x) * scale) - wpad, ((swToPoint.y - topRight.y) * scale) + spad); + const southWestWorld = new Point(southWestPoint.x / scale + bottomLeft.x, southWestPoint.y / scale + topRight.y); + const sw = mapboxMapInstance.unproject(southWestWorld); + const neToPoint = mapboxMapInstance.project(NE); + const northEastPoint = new Point(((neToPoint.x - bottomLeft.x) * scale) + epad, ((neToPoint.y - topRight.y) * scale) - npad); + const northEastWorld = new Point(northEastPoint.x / scale + bottomLeft.x, northEastPoint.y / scale + topRight.y); + const ne = mapboxMapInstance.unproject(northEastWorld); + return [sw, ne]; + } + + public on(type: string, listener: (ev: any) => void): this { + this.getMapProvider().on(type, listener); + return this; + } + + /** + * Creates a mapboxgl map instance + * @param config Mapbox configuration at instanciation. + */ + protected _initMapProvider(config: ArlasMapboxConfig) { + this._mapProvider = new mapboxgl.Map( + config.mapProviderOptions + ); + // Disable map pitch and rotation with keyboard + this.getMapProvider().keyboard.disableRotation(); + + // disable box zoom; + this.getMapProvider().boxZoom.disable(); + } + + protected _initMapMoveEvents() { + super._initMapMoveEvents(); + this.getMapProvider().on('mousedown', (e) => + this._updateStartLngLat(e) + ); + this.getMapProvider().on('mouseup', (e) => + this._updateEndLngLat(e) + ); + + this.getMapProvider().on('mousemove', (e) => + this._updateCurrentLngLat(e) + ); + } + + public _initControls(): void { + if (this._controls) { + if (this._controls.mapAttribution) { + this.addControl(new mapboxgl.AttributionControl(this._controls.mapAttribution.config), this._controls.mapAttribution.position); + } + + /** Whether to display scale */ + if (this._controls?.scale?.enable) { + const defaultOpt = { + maxWidth: this._maxWidthScale, + unit: this._unitScale, + }; + const opt = this._controls?.scale?.config ?? defaultOpt; + const scale = new mapboxgl.ScaleControl(opt); + this.addControl(scale, this._controls.scale?.position ?? 'bottom-right'); + } + + if (this._controls?.pitchToggle?.enable) { + const conf = this._controls.pitchToggle.config; + this.addControl(new MapBoxPitchToggle(conf.bearing, conf.pitch, conf.minpitchzoom), this._controls.pitchToggle?.position ?? 'top-right'); + } + + if (this._controls?.navigationControl?.enable) { + this.addControl( + new mapboxgl.NavigationControl(this._controls.navigationControl.config), + this._controls.navigationControl?.position ?? 'top-right'); + } + } + } + + public initDrawControls(config: DrawControlsOption) { + if (!(config.draw.control instanceof MapboxDraw)) { + console.warn(' Draw control is not instance of MapBoxDraw'); + } + this.addControl(config.draw.control as Control, (config.draw?.position ?? 'top-right')); + + if (config.addGeoBox.enable) { + const addGeoBoxButton = new MapBoxControlButton(config.addGeoBox?.name ?? 'addgeobox'); + this.addControl(addGeoBoxButton, config.addGeoBox?.position ?? 'top-right', config.addGeoBox?.overrideEvent); + + } + if (config.addGeoBox.enable) { + const removeAoisButton = new MapBoxControlButton('removeaois'); + this.addControl(removeAoisButton, config.removeAois?.position ?? 'top-right', config.removeAois?.overrideEvent); + } + } + + public getMapExtend(): MapExtent { + const bounds = this.getBounds(); + return { bounds: bounds.toArray(), center: bounds.getCenter().toArray(), zoom: this.getMapProvider().getZoom() }; + } + + public addControl(control: Control | IControl | ControlButton, + position?: ControlPosition, + eventOverride?: { + event: string; fn: (e?) => void; + }) { + this.getMapProvider().addControl(control, position); + if (control instanceof ControlButton && eventOverride) { + control.btn[eventOverride.event] = () => eventOverride.fn(); + } + return this; + } + + public enableDragPan() { + this.getMapProvider().dragPan.enable(); + } + + public disableDragPan() { + this.getMapProvider().dragPan.disable(); + } + + + public getMapProvider(): mapboxgl.Map { + return this._mapProvider; + } + + public getLayers() { + return this.getMapProvider().getStyle().layers; + } + + public onLoad(fn: () => void): void { + this.getMapProvider().on('load', fn); + } + + public calcOffsetPoint() { + return new mapboxgl.Point((this._offset.east + this._offset.west) / 2, (this._offset.north + this._offset.south) / 2); + } + + protected _getMoveEnd(visualisationsSets: { + visualisations: Map>; + status: Map; + }) { + const offsetPoint = this.calcOffsetPoint(); + const centerOffsetPoint = this.getMapProvider().project(this.getMapProvider().getCenter()).add(offsetPoint); + const centerOffSetLatLng = this.getMapProvider().unproject(centerOffsetPoint); + + const southWest = this.getSouthWestBounds(); + const northEast = this.getNorthEastBounds(); + const bottomLeft = this.getMapProvider().project(southWest); + const topRght = this.getMapProvider().project(northEast); + const height = bottomLeft.y; + const width = topRght.x; + + const bottomLeftOffset = bottomLeft.add(new mapboxgl.Point(this._offset.west, this._offset.south)); + const topRghtOffset = topRght.add(new mapboxgl.Point(this._offset.east, this._offset.north)); + + const bottomLeftOffsetLatLng = this.getMapProvider().unproject(bottomLeftOffset); + const topRghtOffsetLatLng = this.getMapProvider().unproject(topRghtOffset); + + const wrapWestOffset = bottomLeftOffsetLatLng.wrap().lng; + const wrapSouthOffset = bottomLeftOffsetLatLng.wrap().lat; + const wrapEastOffset = topRghtOffsetLatLng.wrap().lng; + const wrapNorthOffset = topRghtOffsetLatLng.wrap().lat; + + const rawWestOffset = bottomLeftOffsetLatLng.lng; + const rawSouthOffset = bottomLeftOffsetLatLng.lat; + const rawEastOffset = topRghtOffsetLatLng.lng; + const rawNorthOffset = topRghtOffsetLatLng.lat; + const visibleLayers = new Set(); + visualisationsSets.status.forEach((b, vs) => { + if (b) { + visualisationsSets.visualisations.get(vs).forEach(l => visibleLayers.add(l)); + } + }); + const onMoveData: OnMoveResult = { + zoom: this.zoom, + zoomStart: this._zoomStart, + center: this.getMapProvider().getCenter().toArray(), + centerWithOffset: [centerOffSetLatLng.lng, centerOffSetLatLng.lat], + extendWithOffset: [wrapNorthOffset, wrapWestOffset, wrapSouthOffset, wrapEastOffset], + rawExtendWithOffset: [rawNorthOffset, rawWestOffset, rawSouthOffset, rawEastOffset], + extend: [this._north, this._west, this._south, this._east], + extendForLoad: [], + extendForTest: [], + rawExtendForLoad: [], + rawExtendForTest: [], + xMoveRatio: this._xMoveRatio, + yMoveRatio: this._yMoveRatio, + visibleLayers: visibleLayers + }; + + const panLoad = this._margePanForLoad * Math.max(height, width) / 100; + const panTest = this._margePanForTest * Math.max(height, width) / 100; + const loadLatLngExtent = this.paddedBounds(panLoad, panLoad, panLoad, panLoad, this.getMapProvider(), southWest, northEast); + const testLatLngExtent = this.paddedBounds(panTest, panTest, panTest, panTest, this.getMapProvider(), southWest, northEast); + onMoveData.extendForTest = [ + testLatLngExtent[1].wrap().lat, + testLatLngExtent[0].wrap().lng, + testLatLngExtent[0].wrap().lat, + testLatLngExtent[1].wrap().lng + ]; + onMoveData.extendForLoad = [ + loadLatLngExtent[1].wrap().lat, + loadLatLngExtent[0].wrap().lng, + loadLatLngExtent[0].wrap().lat, + loadLatLngExtent[1].wrap().lng + ]; + onMoveData.rawExtendForTest = [ + testLatLngExtent[1].lat, + testLatLngExtent[0].lng, + testLatLngExtent[0].lat, + testLatLngExtent[1].lng, + ]; + onMoveData.rawExtendForLoad = [ + loadLatLngExtent[1].lat, + loadLatLngExtent[0].lng, + loadLatLngExtent[0].lat, + loadLatLngExtent[1].lng, + ]; + return onMoveData; + } + + /** + * @description Fits to given bounds + padding provided by the map configuration. + * @param bounds Bounds defined by sw and ne coordinates Or a [west, south, east, north] array. + */ + public fitToPaddedBounds(bounds: ArlasLngLatBounds | [number, number, number, number]) { + const boundsOptions: mapboxgl.FitBoundsOptions = {}; + boundsOptions.padding = { + top: this._offset.north + this._fitBoundsPadding, + bottom: this._offset.south + this._fitBoundsPadding, + left: this._offset.west + this._fitBoundsPadding, + right: this._offset.east + this._fitBoundsPadding + }; + this.fitBounds(bounds, boundsOptions); + } + + public addSourceType(ind: string, protocol: any, cb: (e?) => void) { + (this.getMapProvider() as any).addSourceType(ind, protocol, cb); + } + + public getWestBounds() { + return this.getBounds().getWest(); + } + public getNorthBounds() { + return this.getBounds().getNorth(); + } + + public getNorthEastBounds() { + return this.getBounds().getNorthEast(); + } + + public getSouthBounds() { + return this.getBounds().getSouth(); + } + + public getSouthWestBounds() { + return this.getBounds().getSouthWest(); + } + public getEastBounds() { + return this.getBounds().getEast(); + } + + public getSource(id: string) { + return this._mapProvider.getSource(id); + } + + public fitBounds(bounds: ArlasLngLatBounds | number[], options?: mapboxgl.FitBoundsOptions, eventData?: mapboxgl.EventData) { + this.getMapProvider().fitBounds(ArlasMapboxGL.toMapboxBound(bounds), options, eventData); + return this; + } + + public setCenter(lngLat: [number, number]) { + this._mapProvider.setCenter(lngLat); + return this; + } + + public getZoom() { + return this._mapProvider.getZoom(); + } + + public getCanvasContainer() { + return this._mapProvider.getCanvasContainer(); + } + + public queryRenderedFeatures(point) { + return this._mapProvider.queryRenderedFeatures(point); + } + + public getMaxBounds(): mapboxgl.LngLatBounds | null { + return this._mapProvider.getMaxBounds(); + } + + public resize(eventData?: mapboxgl.EventData): this { + this._mapProvider.resize(eventData); + return this; + } + + public setFilter(layer: string, filter?: any[] | boolean | null, options?: mapboxgl.FilterOptions | null): this { + this._mapProvider.setFilter(layer, filter, options); + return this; + } + + public setMaxBounds(lnglatbounds?: mapboxgl.LngLatBoundsLike): this { + this._mapProvider.setMaxBounds(lnglatbounds); + return this; + } + + public setZoom(zoom: number, eventData?: mapboxgl.EventData): this { + this._mapProvider.setZoom(zoom, eventData); + return this; + } + + public getBounds() { + return this.getMapProvider().getBounds(); + } + + /** + * + * @param bounds Bounds defined by ARLAS + * @returns Transforms the ArlasLngLatBounds to LngLatBounds as defined by mapbox + */ + public static toMapboxBound(bounds: ArlasLngLatBounds | number[]) { + if (bounds instanceof ArlasLngLatBounds) { + return new LngLatBounds([bounds.sw, bounds.ne]); + } else { + return new LngLatBounds(bounds as [number, number, number, number]); + + } + } +} diff --git a/projects/arlas-mapbox/src/lib/map/model/controls.ts b/projects/arlas-mapbox/src/lib/map/model/controls.ts new file mode 100644 index 00000000..0b5a0f80 --- /dev/null +++ b/projects/arlas-mapbox/src/lib/map/model/controls.ts @@ -0,0 +1,35 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControlButton, PitchToggle } from 'arlas-map'; + +export class MapBoxPitchToggle extends PitchToggle { + + protected _buildClasses() { + this.btnClasses = ['mapboxgl-ctrl-icon', 'mapboxgl-ctrl-pitch']; + this.containerClasses = ['mapboxgl-ctrl', 'mapboxgl-ctrl-group', 'mapboxgl-ctrl-group-pitch']; + } +} + +export class MapBoxControlButton extends ControlButton { + protected _buildClasses() { + this.btnClasses = ['mapboxgl-ctrl-icon', 'map__controls__icons', 'map__controls__icons--' + this.name]; + this.containerClasses = ['mapboxgl-ctrl', 'mapboxgl-ctrl-group', 'mapboxgl-ctrl-group-' + this.name]; + } +} diff --git a/projects/arlas-mapbox/src/lib/map/model/layers.ts b/projects/arlas-mapbox/src/lib/map/model/layers.ts new file mode 100644 index 00000000..33ebe92a --- /dev/null +++ b/projects/arlas-mapbox/src/lib/map/model/layers.ts @@ -0,0 +1,22 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import mapboxgl from 'mapbox-gl'; + +export type ArlasAnyLayer = mapboxgl.CircleLayer | mapboxgl.FillLayer | mapboxgl.HeatmapLayer | mapboxgl.LineLayer | mapboxgl.SymbolLayer; diff --git a/projects/arlas-mapbox/src/lib/map/model/sources.ts b/projects/arlas-mapbox/src/lib/map/model/sources.ts new file mode 100644 index 00000000..28629a2d --- /dev/null +++ b/projects/arlas-mapbox/src/lib/map/model/sources.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import mapboxgl from 'mapbox-gl'; + +export type MapboxSourceType = mapboxgl.AnySourceData | mapboxgl.VectorSource | mapboxgl.RasterSource | +mapboxgl.GeoJSONSource | mapboxgl.GeoJSONSourceRaw | +mapboxgl.CanvasSource | mapboxgl.ImageSource | mapboxgl.VideoSource; diff --git a/projects/arlas-mapbox/src/lib/map/model/vector-style.ts b/projects/arlas-mapbox/src/lib/map/model/vector-style.ts new file mode 100644 index 00000000..2972240b --- /dev/null +++ b/projects/arlas-mapbox/src/lib/map/model/vector-style.ts @@ -0,0 +1,43 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { VectorStyleEnum } from 'arlas-map'; +import { ArlasFill } from 'arlas-map'; +import { ArlasCircle } from 'arlas-map'; +import { VectorStyle } from 'arlas-map'; +import { CircleLayer, FillLayer } from 'mapbox-gl'; + + +/** This file describes how to style a vector layer */ + +export class MapboxVectorStyle extends VectorStyle { + public constructor(type: VectorStyleEnum, style: ArlasCircle | ArlasFill) { + super(type, style); + } + + /** Any adjustment from ArlasCircle to the layer circle style should be implemented here. */ + public circle(layer: CircleLayer) { + layer.paint = this.style as any; + }; + + /** Any adjustment from ArlasFill to the layer fill style should be implemented here. */ + public fill(layer: FillLayer) { + layer.paint = this.style as any; + }; +} diff --git a/projects/arlas-components/src/lib/components/mapgl/custom-protocol/mapbox-gl-custom-protocol.ts b/projects/arlas-mapbox/src/lib/map/protocols/mapbox-gl-custom-protocol.ts similarity index 95% rename from projects/arlas-components/src/lib/components/mapgl/custom-protocol/mapbox-gl-custom-protocol.ts rename to projects/arlas-mapbox/src/lib/map/protocols/mapbox-gl-custom-protocol.ts index f400d62c..6faa7a72 100644 --- a/projects/arlas-components/src/lib/components/mapgl/custom-protocol/mapbox-gl-custom-protocol.ts +++ b/projects/arlas-mapbox/src/lib/map/protocols/mapbox-gl-custom-protocol.ts @@ -20,7 +20,7 @@ const getReqObjectUrl = (loadFn, rawUrl, type, collectResourceTiming, transformRequestFunction) => new Promise((res, rej) => { const requestParameters: any = { url: rawUrl, - type: (type === 'vector') || (type === 'raster') ? 'arrayBuffer' : 'string', + type: (type ==='vector' || type === 'raster') ? 'arrayBuffer' : 'string', collectResourceTiming: collectResourceTiming }; if (type === 'raster') { @@ -117,11 +117,11 @@ export const CustomProtocol = (mapLibrary) => { // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility loadTile(tile, callback) { // eslint-disable-next-line @typescript-eslint/naming-convention - let _a, _b; + let _c, _d; const rawUrl = tile.tileID.canonical.url(this.tiles, this.scheme); const protocol = rawUrl.substring(0, rawUrl.indexOf('://')); - if (!alreadySupported && ((_a = mapLibrary._protocols) === null || _a === void 0 ? void 0 : _a.has(protocol))) { - const loadFn = (_b = mapLibrary._protocols) === null || _b === void 0 ? void 0 : _b.get(protocol); + if (!alreadySupported && ((_c = mapLibrary._protocols) === null || _c === void 0 ? void 0 : _c.has(protocol))) { + const loadFn = (_d = mapLibrary._protocols) === null || _d === void 0 ? void 0 : _d.get(protocol); getReqObjectUrl(loadFn, rawUrl, this.type, this._collectResourceTiming, this.map._requestManager._transformRequestFn.bind(this)).then((url: string) => { tile.tileID.canonical.url = function () { diff --git a/projects/arlas-mapbox/src/public-api.ts b/projects/arlas-mapbox/src/public-api.ts new file mode 100644 index 00000000..10684ffc --- /dev/null +++ b/projects/arlas-mapbox/src/public-api.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * Public API Surface of arlas-mapbox + */ + +export { MapboxLegendService } from './lib/legend/legend.service'; +export * from './lib/arlas-mapbox.service'; +export * from './lib/arlas-mapbox.module'; +export { MapboxBasemapService } from './lib/basemaps/mapbox-basemap.service'; +export { ArlasMapService } from './lib/arlas-map.service'; diff --git a/projects/arlas-mapbox/src/test.ts b/projects/arlas-mapbox/src/test.ts new file mode 100644 index 00000000..6fbbda22 --- /dev/null +++ b/projects/arlas-mapbox/src/test.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js'; +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); diff --git a/projects/arlas-mapbox/tsconfig.lib.json b/projects/arlas-mapbox/tsconfig.lib.json new file mode 100644 index 00000000..a2f7638a --- /dev/null +++ b/projects/arlas-mapbox/tsconfig.lib.json @@ -0,0 +1,25 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2020", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2019", + ], + }, + "angularCompilerOptions": { + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} \ No newline at end of file diff --git a/projects/arlas-mapbox/tsconfig.lib.prod.json b/projects/arlas-mapbox/tsconfig.lib.prod.json new file mode 100644 index 00000000..7148abfa --- /dev/null +++ b/projects/arlas-mapbox/tsconfig.lib.prod.json @@ -0,0 +1,10 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false, + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/projects/arlas-mapbox/tsconfig.spec.json b/projects/arlas-mapbox/tsconfig.spec.json new file mode 100644 index 00000000..715dd0a5 --- /dev/null +++ b/projects/arlas-mapbox/tsconfig.spec.json @@ -0,0 +1,17 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/arlas-maplibre/README.md b/projects/arlas-maplibre/README.md new file mode 100644 index 00000000..7c5d7781 --- /dev/null +++ b/projects/arlas-maplibre/README.md @@ -0,0 +1,19 @@ +# arlas-maplibre + +**arlas-maplibre** is an Angular library a maplibregl implementation of the arlas-map library. + +## Build + +On the root of this repository, run + +```shell +$ npm run build-maplibre +``` + +## Running unit tests + +On the root of this repository, run + +```shell +$ npm run test-maplibre +``` diff --git a/projects/arlas-maplibre/ng-package.json b/projects/arlas-maplibre/ng-package.json new file mode 100644 index 00000000..e332dd4b --- /dev/null +++ b/projects/arlas-maplibre/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/arlas-maplibre", + "lib": { + "entryFile": "src/public-api.ts" + }, + "allowedNonPeerDependencies": ["arlas-map", "."] +} \ No newline at end of file diff --git a/projects/arlas-maplibre/package.json b/projects/arlas-maplibre/package.json new file mode 100644 index 00000000..beda69be --- /dev/null +++ b/projects/arlas-maplibre/package.json @@ -0,0 +1,24 @@ +{ + "name": "arlas-maplibre", + "version": "27.0.0-z-rc.0", + "peerDependencies": { + "@angular/animations": "^18.2.13", + "@angular/cdk": "^18.2.14", + "@angular/common": "^18.2.13", + "@angular/compiler": "^18.2.13", + "@angular/core": "^18.2.13", + "@angular/forms": "^18.2.13", + "@angular/material": "^18.2.14", + "@angular/platform-browser": "^18.2.13", + "@angular/platform-browser-dynamic": "^18.2.13", + "@angular/router": "^18.2.13", + "@ngx-translate/core": "^15.0.0", + "@ngx-translate/http-loader": "^8.0.0" + }, + "dependencies": { + "arlas-map": "~27.0.0-z-rc.0", + "maplibre-gl": "^4.7.1", + "rxjs": "^7.4.0", + "tslib": "^2.3.0" + } +} diff --git a/projects/arlas-maplibre/src/lib/arlas-map.service.ts b/projects/arlas-maplibre/src/lib/arlas-map.service.ts new file mode 100644 index 00000000..b221f0e5 --- /dev/null +++ b/projects/arlas-maplibre/src/lib/arlas-map.service.ts @@ -0,0 +1,301 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { FeatureCollection } from '@turf/helpers'; +import { + AbstractArlasMapService, ARLAS_ID, ArlasDataLayer, ArlasMapSource, + ExternalEvent, FILLSTROKE_LAYER_PREFIX, LayerMetadata, MapLayers, + SCROLLABLE_ARLAS_ID, VisualisationSetConfig +} from 'arlas-map'; +import { + AddLayerObject, CanvasSourceSpecification, ExpressionSpecification, + GeoJSONSource, GeoJSONSourceSpecification, LayerSpecification, MapOptions, + RasterSourceSpecification, SourceSpecification, TypedStyleLayer +} from 'maplibre-gl'; +import { ArlasMaplibreService } from './arlas-maplibre.service'; +import { ArlasMaplibreGL } from './map/ArlasMaplibreGL'; +import { MaplibreSourceType } from './map/model/sources'; + +@Injectable({ + providedIn: 'root' +}) +export class ArlasMapService extends AbstractArlasMapService { + public layersMap: Map; + + + public dataSources: GeoJSONSourceSpecification[] = []; + public constructor(public mapService: ArlasMaplibreService) { + super(mapService); + } + + /** + * @description Declares the arlas data sources provided in configuration. + * @param dataSourcesIds Identifiers of arlas data sources. + * @param data A feature collection. + * @param map Map instance. + */ + public declareArlasDataSources(dataSourcesIds: Set, data: FeatureCollection, map: ArlasMaplibreGL) { + if (dataSourcesIds) { + dataSourcesIds.forEach(sourceId => { + const source = this.mapFrameworkService.createGeojsonSource(data); + this.dataSources.push(source as GeoJSONSourceSpecification); + this.mapFrameworkService.setSource(sourceId, source, map); + }); + } + } + + /** + * Declares label sources for draw layers. + * @param labelSourceId Label source identifier. + * @param data A feature collection. + * @param map Map instance. + */ + public declareLabelSources(labelSourceId: string, data: FeatureCollection, map: ArlasMaplibreGL) { + if (labelSourceId) { + const source = this.mapFrameworkService.createGeojsonSource(data); + this.mapFrameworkService.setSource(labelSourceId, source, map); + } + } + + public updateLabelSources(labelSourceId: string, data: FeatureCollection, map: ArlasMaplibreGL) { + super.updateLabelSources(labelSourceId, data, map); + } + + /** + * Declares basemap sources + * @param basemapSources List of basemap sources. + * @param map Map instance. + */ + public declareBasemapSources(basemapSources: Array>, map: ArlasMaplibreGL) { + // Add sources defined as input in mapSources; + const mapSourcesMap = new Map>(); + if (basemapSources) { + basemapSources.forEach(mapSource => { + mapSourcesMap.set(mapSource.id, mapSource); + }); + mapSourcesMap.forEach((mapSource, id) => { + if (typeof (mapSource.source) !== 'string') { + this.mapFrameworkService.setSource(id, mapSource.source, map); + } + }); + } + } + + public setLayersMap(mapLayers: MapLayers, layers?: Array) { + if (mapLayers) { + const mapLayersCopy = mapLayers; + if (layers) { + mapLayersCopy.layers = mapLayersCopy.layers.concat(layers); + } + const layersMap = new Map(); + mapLayersCopy.layers.forEach(layer => layersMap.set(layer.id, layer)); + this.layersMap = layersMap; + } + } + + public initMapLayers(mapLayers: MapLayers, map: ArlasMaplibreGL) { + super.initMapLayers(mapLayers, map); + } + + public updateMapStyle(map: ArlasMaplibreGL, l: any, ids: Array, sourceName: string): void { + const layer = this.mapService.getLayer(map, l) as TypedStyleLayer; + if (!!layer && typeof (layer.source) === 'string' && layer.source.indexOf(sourceName) >= 0) { + if (ids && ids.length > 0) { + // Tests value in camel and kebab case due to an unknown issue on other projects + if ((layer.metadata as LayerMetadata).isScrollableLayer || layer.metadata['is-scrollable-layer']) { + map.setFilter(l, this.getVisibleIdsFilter(l, ids)); + const strokeLayerId = l.replace('_id:', '-fill_stroke-'); + const strokeLayer = this.mapService.getLayer(map, strokeLayerId); + if (!!strokeLayer) { + map.setFilter(strokeLayerId, this.getVisibleIdsFilter(strokeLayerId, ids)); + } + } + } else { + map.setFilter(l, this.layersMap.get(l).filter as ExpressionSpecification); + const strokeLayerId = l.replace('_id:', '-fill_stroke-'); + const strokeLayer = this.mapService.getLayer(map, strokeLayerId); + if (!!strokeLayer) { + map.setFilter(strokeLayerId, + this.layersMap.get(strokeLayerId).filter as ExpressionSpecification); + } + } + } + } + + public getVisibleIdsFilter(layer: any, ids: Array): ExpressionSpecification[] { + const lFilter = this.layersMap.get(layer).filter as ExpressionSpecification; + const filters = []; + if (lFilter) { + lFilter.forEach(f => { + filters.push(f); + }); + } + if (filters.length === 0) { + filters.push('all'); + } + filters.push([ + 'match', + ['get', 'id'], + Array.from(new Set(ids)), + true, + false + ]); + return filters; + } + + public addVisualisation(visualisation: VisualisationSetConfig, visualisations: VisualisationSetConfig[], layers: Array, + sources: Array>, mapLayers: MapLayers, map: ArlasMaplibreGL): void { + sources.forEach((s) => { + if (typeof (s.source) !== 'string') { + map.getMapProvider().addSource(s.id, s.source); + } + }); + visualisations.unshift(visualisation); + this.visualisationsSets.visualisations.set(visualisation.name, new Set(visualisation.layers)); + this.visualisationsSets.status.set(visualisation.name, visualisation.enabled); + layers.forEach(layer => { + this.mapService.addLayer(map, layer as LayerSpecification); + }); + this.setLayersMap(mapLayers, layers); + this.reorderLayers(visualisations, map); + } + + protected reorderDrawLayers(map: ArlasMaplibreGL) { + this.mapService.getLayersFromPattern(map, '.cold').forEach(l => this.mapService.moveLayer(map, l.id)); + this.mapService.getLayersFromPattern(map, '.hot').forEach(l => this.mapService.moveLayer(map, l.id)); + } + + /** + * @override Maplibre implementation. + * @description Moves the given layer to the top in map instance OR optionnaly before a layer. + * This method handles any specific treatment when adding ARLAS data. + * For instance, in mapbox implementation, moving a fill layer needs to move systematically the stroke layer. + * @param map Map instance. + * @param layer A layer. It could be a layer identifier OR a layer object (it will depend on the framwork implementation). + * @param arlasDataLayers Map of ARLAS data layers and their ids (the ids being the key of the map). + * @param beforeId Identifier of an already added layer. The layers of layersMap are added under this 'beforeId' layer. + */ + + public moveArlasDataLayer(map: ArlasMaplibreGL, layerId: string, arlasDataLayers: Map, before?: string) { + const layer = arlasDataLayers.get(layerId); + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + const scrollableLayer = arlasDataLayers.get(scrollableId); + if (!!scrollableLayer && this.mapService.hasLayer(map, scrollableId)) { + this.mapService.moveLayer(map, scrollableId); + } + if (!!this.mapService.hasLayer(map, layerId)) { + this.mapService.moveLayer(map, layerId); + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + const strokeLayer = arlasDataLayers.get(strokeId); + if (!!strokeLayer && this.mapService.hasLayer(map, strokeId)) { + this.mapService.moveLayer(map, strokeId); + } + if (!!strokeLayer && !!strokeLayer.id) { + const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + strokeLayer.id; + const selectLayer = arlasDataLayers.get(selectId); + if (!!selectLayer && this.mapService.hasLayer(map, selectId)) { + this.mapService.moveLayer(map, selectId); + } + const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + strokeLayer.id; + const hoverLayer = arlasDataLayers.get(hoverId); + if (!!hoverLayer && this.mapService.hasLayer(map, hoverId)) { + this.mapService.moveLayer(map, hoverId); + } + } + } + } + const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + layer.id; + const selectLayer = arlasDataLayers.get(selectId); + if (!!selectLayer && this.mapService.hasLayer(map, selectId)) { + this.mapService.moveLayer(map, selectId); + } + const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + layer.id; + const hoverLayer = arlasDataLayers.get(hoverId); + if (!!hoverLayer && this.mapService.hasLayer(map, hoverId)) { + this.mapService.moveLayer(map, hoverId); + } + } + + /** + * Add a layer to the map instance. This method handles any specific treatment when adding ARLAS data. + * For instance, in maplibre implementation, adding a fill layer needs to add systematically the stroke layer. + * @param map Map instance. + * @param layer A layer. It could be a layer identifier OR a layer object (it will depend on the framwork implementation). + * @param layersMap Map of ARLAS data layers and their ids (the ids being the key of the map). + * @param beforeId Identifier of an already added layer. The layers of layersMap are added under this 'beforeId' layer. + */ + public addArlasDataLayer(map: ArlasMaplibreGL, layer: ArlasDataLayer, arlasDataLayers: Map, before?: string) { + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + const scrollableLayer = arlasDataLayers.get(scrollableId) as LayerSpecification; + if (!!scrollableLayer) { + this.mapService.addLayer(map, scrollableLayer, before); + } + this.mapService.addLayer(map, layer as LayerSpecification, before); + /** add stroke layer if the layer is a fill */ + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + const strokeLayer = arlasDataLayers.get(strokeId) as LayerSpecification; + if (!!strokeLayer) { + this.mapService.addLayer(map, strokeLayer, before); + } + } + } + + + public filterLayers(mapLayers: MapLayers, map: ArlasMaplibreGL, + visibilityCondition: boolean, visibilityFilter: Array, visibilityEvent: ExternalEvent, + collection?: string): void { + if (mapLayers && mapLayers.externalEventLayers) { + mapLayers.externalEventLayers.filter(layer => layer.on === visibilityEvent).forEach(layer => { + if (this.mapService.hasLayer(map, layer.id)) { + let originalLayerIsVisible = false; + const fullLayer = this.layersMap.get(layer.id); + const isCollectionCompatible = (!collection || (!!collection && (fullLayer.source as string).includes(collection))); + if (isCollectionCompatible) { + const originalLayerId = layer.id.replace('arlas-' + visibilityEvent.toString() + '-', ''); + const originalLayer = this.mapService.getAllLayers(map).find(l => l.id === originalLayerId); + if (!!originalLayer) { + originalLayerIsVisible = this.mapService.isLayerVisible(originalLayer as LayerSpecification); + } + const layerFilter: Array = []; + const externalEventLayer = this.layersMap.get(layer.id); + if (!!externalEventLayer && !!externalEventLayer.filter) { + (externalEventLayer.filter as ExpressionSpecification).forEach(f => { + layerFilter.push(f); + }); + } + if (layerFilter.length === 0) { + layerFilter.push('all'); + } + if (visibilityCondition && originalLayerIsVisible) { + layerFilter.push(visibilityFilter); + this.mapService.filterGeojsonData(map, layer.id, layerFilter); + } else { + this.mapService.filterGeojsonData(map, layer.id, (layer as any).filter); + } + this.mapService.setLayerVisibility(layer.id, visibilityCondition && originalLayerIsVisible, map); + } + } + }); + } + } +} diff --git a/projects/arlas-maplibre/src/lib/arlas-maplibre.module.ts b/projects/arlas-maplibre/src/lib/arlas-maplibre.module.ts new file mode 100644 index 00000000..91e6c947 --- /dev/null +++ b/projects/arlas-maplibre/src/lib/arlas-maplibre.module.ts @@ -0,0 +1,40 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { NgModule } from '@angular/core'; +import { ArlasMaplibreService } from './arlas-maplibre.service'; +import { MaplibreBasemapService } from './basemaps/maplibre-basemap.service'; +import { MaplibreLegendService } from './legend/legend.service'; + + + +@NgModule({ + declarations: [ + ], + imports: [ + ], + providers: [ + ArlasMaplibreService, + MaplibreBasemapService, + MaplibreLegendService + ], + exports: [ + ] +}) +export class ArlasMaplibreModule { } diff --git a/projects/arlas-maplibre/src/lib/arlas-maplibre.service.spec.ts b/projects/arlas-maplibre/src/lib/arlas-maplibre.service.spec.ts new file mode 100644 index 00000000..24345e3d --- /dev/null +++ b/projects/arlas-maplibre/src/lib/arlas-maplibre.service.spec.ts @@ -0,0 +1,20 @@ +import { TestBed, waitForAsync } from '@angular/core/testing'; + +import { ArlasMaplibreService } from './arlas-maplibre.service'; + +describe('ArlasMaplibreService', () => { + let service: ArlasMaplibreService; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + providers: [ + ArlasMaplibreService + ] + }); + service = TestBed.inject(ArlasMaplibreService); + })); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/arlas-maplibre/src/lib/arlas-maplibre.service.ts b/projects/arlas-maplibre/src/lib/arlas-maplibre.service.ts new file mode 100644 index 00000000..5f3b95be --- /dev/null +++ b/projects/arlas-maplibre/src/lib/arlas-maplibre.service.ts @@ -0,0 +1,587 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { FeatureCollection } from '@turf/helpers'; +import { + AbstractArlasMapGL, + ARLAS_ID, ArlasMapFrameworkService, + ExternalEvent, + FILLSTROKE_LAYER_PREFIX, SCROLLABLE_ARLAS_ID +} from 'arlas-map'; +import { + AddLayerObject, CanvasSourceSpecification, GeoJSONSource, + GeoJSONSourceSpecification, LayerSpecification, MapOptions, Point, Popup, + RasterLayerSpecification, RasterSourceSpecification, ResourceType, + SourceSpecification, SymbolLayerSpecification, TypedStyleLayer +} from 'maplibre-gl'; +import { from } from 'rxjs'; +import { ArlasDraw } from './draw/ArlasDraw'; +import { ArlasMaplibreConfig, ArlasMaplibreGL } from './map/ArlasMaplibreGL'; +import { MaplibreSourceType } from './map/model/sources'; +import { MaplibreVectorStyle } from './map/model/vector-style'; + +/** Maplibre implementation of ArlasMapFrameworkService */ +@Injectable() +export class ArlasMaplibreService extends ArlasMapFrameworkService { + + public constructor() { + super(); + } + + /** + * Returns the canvas element of the map + * @param map Map instance. + */ + public getCanvas(map: ArlasMaplibreGL): HTMLCanvasElement { + return map.getMapProvider().getCanvas(); + } + + public getInitTransformRequest(): Function { + return (url: string, resourceType: ResourceType) => ({ + url, + }); + } + + /** + * Fits the map to its current bounds. To be used when a map container is resized. + * @param map Map instance. + */ + public fitMapBounds(map: ArlasMaplibreGL) { + map.getMapProvider().fitBounds(map.getMapProvider().getBounds()); + }; + + + public createMap(config: ArlasMaplibreConfig): ArlasMaplibreGL { + return new ArlasMaplibreGL(config); + } + + public createDraw(drawOptions: any, enabled: boolean, map: ArlasMaplibreGL): ArlasDraw { + return new ArlasDraw(drawOptions, enabled, map); + } + + /** + * Gets the Point (geometry) from mouse click on the screen. + * @param mouseEvent Click mouse event. + * @param container Map container. + * @returns a Point instance. + */ + public getPointFromScreen(mouseEvent: MouseEvent, container: HTMLElement): Point { + const rect = container.getBoundingClientRect(); + return new Point( + mouseEvent.clientX - rect.left - container.clientLeft, + mouseEvent.clientY - rect.top - container.clientTop + ); + }; + + public getBoundsAsString(map: ArlasMaplibreGL): string { + const bounds = map.getBounds(); + return bounds.getWest() + ',' + bounds.getSouth() + ',' + bounds.getEast() + ',' + bounds.getNorth(); + } + + public setDataToGeojsonSource(source: GeoJSONSource, data: FeatureCollection) { + if (source) { + source.setData(data); + } + }; + + /** + * @override Add an Image to the map. + * @param name Name of the image. + * @param url URL to fetch the image. + * @param map Maplibre map instance. + * @param errorMessage Error message shown as a warning if the image is not loaded. + * @param opt Options of image visualisation. + */ + public addImage(name: string, url: string, map: ArlasMaplibreGL, errorMessage: string, opt?: any) { + const maplibreMap = map.getMapProvider(); + from(maplibreMap.loadImage(url)).subscribe({ + next: (r) => { + if (!maplibreMap.hasImage(name)) { + maplibreMap.addImage(name, r.data, opt); + } + }, + error: (err) => { + console.warn(errorMessage); + } + }); + } + + /** + * @override Maplibre implementation. + * Checks if the given layer is already added to the map instance + * @param map Map instance + * @param layer layer identifier + */ + public hasLayer(map: ArlasMaplibreGL, layer: string): boolean { + return layer && !!map.getMapProvider().getLayer(layer); + }; + + /** + * Checks if the given source is already added to the map instance + * @param sourceId source identifier + * @param map Map instance + */ + public hasSource(map: ArlasMaplibreGL, sourceId: string): boolean { + return !!map.getMapProvider().getSource(sourceId); + } + /** + * Creates and returns a Geojson source instance. + * @param data Geojson data to add to the source. + * @returns returns a Geojson source instance + */ + public createGeojsonSource(data: GeoJSON.Feature | GeoJSON.FeatureCollection): GeoJSONSourceSpecification { + return { + type: 'geojson', + data + }; + }; + + /** + * @override Maplibre implementation. + * Adds the given source to the map instance + * @param sourceId Source identifier + * @param source Source instance + * @param map Map + */ + public setSource(sourceId: string, source: SourceSpecification | CanvasSourceSpecification, map: ArlasMaplibreGL) { + if (!this.hasSource(map, sourceId)) { + map.getMapProvider().addSource(sourceId, source); + } else { + console.warn(`The source ${sourceId} is already added to the map`); + } + }; + + + public getAllSources(map: ArlasMaplibreGL) { + return (map as AbstractArlasMapGL).getMapProvider().getStyle().sources; + } + + /** + * @override Maplibre implementation. + * Adds the given layer to the map instance, optionnaly before a layer. Otherwise it's added to the top. + * @param map Map + * @param layer Layer to add to the map + * @param before Identifier of an already added layer. The given Layer (second param) is added under this 'before' layer. + */ + public addLayer(map: ArlasMaplibreGL, layer: AddLayerObject, before?: string) { + if (!this.hasLayer(map, layer.id)) { + map.getMapProvider().addLayer(layer, before); + } else { + console.warn(`The layer ${layer.id} is already added to the map`); + } + } + + public addArlasDataLayer(map: ArlasMaplibreGL, layer: AddLayerObject, arlasDataLayers: Map, before?: string) { + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + const scrollableLayer = arlasDataLayers.get(scrollableId); + if (scrollableLayer) { + this.addLayer(map, scrollableLayer, before); + } + this.addLayer(map, layer, before); + /** add stroke layer if the layer is a fill */ + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + const strokeLayer = arlasDataLayers.get(strokeId); + if (strokeLayer) { + this.addLayer(map, strokeLayer, before); + } + } + } + + /** + * @override Maplibre implementation. + * Moves the given layer to the top in map instance OR optionnaly before a layer. + * @param map Map + * @param layer Layer to add to the map + * @param before Identifier of an already added layer. The given Layer (second param) is moved under this 'before' layer. + */ + public moveLayer(map: ArlasMaplibreGL, layer: string, before?: string) { + if (this.hasLayer(map, layer)) { + map.getMapProvider().moveLayer(layer, before); + } else { + console.warn(`The layer ${layer} is not added to the map`); + } + } + + /** + * @override Maplibre implementation. + * @description Moves the given layer to the top in map instance OR optionnaly before a layer. + * This method handles any specific treatment when adding ARLAS data. + * For instance, in Maplibre implementation, moving a fill layer needs to move systematically the stroke layer. + * @param map Map instance. + * @param layer A layer. It could be a layer identifier OR a layer object (it will depend on the framwork implementation). + * @param arlasDataLayers Map of ARLAS data layers and their ids (the ids being the key of the map). + * @param beforeId Identifier of an already added layer. The layers of layersMap are added under this 'beforeId' layer. + */ + public moveArlasDataLayer(map: ArlasMaplibreGL, layerId: string, arlasDataLayers: Map, before?: string) { + const layer = arlasDataLayers.get(layerId); + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + const scrollableLayer = arlasDataLayers.get(scrollableId); + if (!!scrollableLayer && this.hasLayer(map, scrollableId)) { + this.moveLayer(map, scrollableId); + } + if (this.hasLayer(map, layerId)) { + this.moveLayer(map, layerId); + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + const strokeLayer = arlasDataLayers.get(strokeId); + if (!!strokeLayer && this.hasLayer(map, strokeId)) { + this.moveLayer(map, strokeId); + } + if (!!strokeLayer && !!strokeLayer.id) { + const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + strokeLayer.id; + const selectLayer = arlasDataLayers.get(selectId); + if (!!selectLayer && this.hasLayer(map, selectId)) { + this.moveLayer(map, selectId); + } + const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + strokeLayer.id; + const hoverLayer = arlasDataLayers.get(hoverId); + if (!!hoverLayer && this.hasLayer(map, hoverId)) { + this.moveLayer(map, hoverId); + } + } + } + } + const selectId = 'arlas-' + ExternalEvent.select.toString() + '-' + layer.id; + const selectLayer = arlasDataLayers.get(selectId); + if (!!selectLayer && this.hasLayer(map, selectId)) { + this.moveLayer(map, selectId); + } + const hoverId = 'arlas-' + ExternalEvent.hover.toString() + '-' + layer.id; + const hoverLayer = arlasDataLayers.get(hoverId); + if (!!hoverLayer && this.hasLayer(map, hoverId)) { + this.moveLayer(map, hoverId); + } + + + } + + + /** + * @override Maplibre implementation. + * Executes the 'fn' function on 'eventName' triggered from the given 'layer' of the 'map' instance. + * @param eventName + * @param map + * @param layer + * @param fn + */ + public onLayerEvent(eventName: 'click' | 'mousemove' | 'mouseleave' | 'mouseenter', + map: ArlasMaplibreGL, layer: string, fn: (e) => void): void { + map.getMapProvider().on(eventName, layer, fn); + } + + /** + * @override Maplibre implementation. + * Executes the 'fn' function on 'eventName' triggered from the 'map' instance. + * @param eventName event. + * @param map Map instance. + * @param fn Function to execute on map event. + */ + public onMapEvent(eventName: 'load' | 'moveend' | 'zoomend', map: ArlasMaplibreGL, fn: (e) => void) { + map.getMapProvider().on(eventName, fn); + } + + + /** + * @override Maplibre implementation. + * Removes the given layer from the map. If the source of this layer is still on the map, it is also removed. + * @param map Map instance. + * @param layer layer to remove. + */ + public removeLayer(map: ArlasMaplibreGL, layer: string): void { + if (this.hasLayer(map, layer)) { + const sourceId = this.getLayer(map, layer).source; + map.getMapProvider().removeLayer(layer); + this.removeSource(map, sourceId); + } + }; + + + + /** + * @overload + * Returns the layer object of the given layer id. + * @param map Map instance. + * @param layer Layer identifier + * @returns the layer object. + */ + public getLayer(map: ArlasMaplibreGL, layer: string): TypedStyleLayer { + return map.getMapProvider().getLayer(layer) as TypedStyleLayer; + } + + public getAllLayers(map: ArlasMaplibreGL): TypedStyleLayer[] { + return map.getMapProvider().getStyle().layers as TypedStyleLayer[]; + } + + /** + * @override Maplibre implementation. + * @param layer Layer identifier. + * @param isVisible If true, the layer is made visible, otherwise, it is hidden. + * @param map Map instance. + */ + public setLayerVisibility(layerId: string, isVisible: boolean, map: ArlasMaplibreGL): void { + if (this.hasLayer(map, layerId)) { + map.getMapProvider().setLayoutProperty(layerId, 'visibility', isVisible ? 'visible' : 'none'); + const layer = this.getLayer(map, layerId); + if (layer.type === 'fill') { + const strokeId = layer.id.replace(ARLAS_ID, FILLSTROKE_LAYER_PREFIX); + if (this.hasLayer(map, strokeId)) { + map.getMapProvider().setLayoutProperty(strokeId, 'visibility', isVisible ? 'visible' : 'none'); + } + } + const scrollableId = layer.id.replace(ARLAS_ID, SCROLLABLE_ARLAS_ID); + if (this.hasLayer(map, scrollableId)) { + map.getMapProvider().setLayoutProperty(scrollableId, 'visibility', isVisible ? 'visible' : 'none'); + } + } + } + + + + /** + * @override Maplibre implementation. + * Removes the source from the map instance + * @param map Map Instance. + * @param source Source identifier. + */ + public removeSource(map: ArlasMaplibreGL, source: string) { + if (!!source && this.hasSource(map, source)) { + map.getMapProvider().removeSource(source); + } + }; + + /** + * @override Maplibre implementation. + * Creates a popup at lng,lat with the given message. The popup is not yet added to the map. + * @param lng Longitude. + * @param lat Latitude. + * @param message The popup message. + * @returns The popup instance. + */ + public createPopup(lng: number, lat: number, message: string): Popup { + const popup = new Popup({ + closeButton: false, + closeOnClick: false + }); + return popup.setLngLat([lat, lng]) + .setHTML(message); + } + + /** + * @override Maplibre implementation. + * Adds the given popup to the map. + * @param map Map instance. + * @param popup Popup instance. + */ + public addPopup(map: ArlasMaplibreGL, popup: Popup): void { + popup.addTo(map.getMapProvider()); + } + + /** + * @override Maplibre implementation. + * Removes the given popup from the map. + * @param map Map instance. + * @param popup Popup instance. + */ + public removePopup(map: ArlasMaplibreGL, popup: Popup): void { + popup.remove(); + } + + /** + * @override Maplibre implementation. + * Removes all the given layers (and their sources) from the map. + * @param map Map instance. + * @param layers Identifiers of layers to remove. + */ + public removeLayers(map: ArlasMaplibreGL, layers: string[]): void { + layers.forEach(l => this.removeLayer(map, l)); + } + + /** + * @override Maplibre implementation. + * Removes all layers which identifier includes the given id pattern. + * @param map Map instance. + * @param layersIdPattern Identifiers pattern to remove from the map. + */ + public removeLayersFromPattern(map: ArlasMaplibreGL, layersIdPattern: string) { + map.getMapProvider().getStyle().layers.filter(l => l.id.includes(layersIdPattern)).forEach(l => this.removeLayer(map, l.id)); + } + + /** + * @override Maplibre implementation. + * Checks if there are any layers respecting the given id pattern. + * @param map Map instance. + * @param layersIdPattern Identifiers pattern. + * @returns + */ + public hasLayersFromPattern(map: ArlasMaplibreGL, layersIdPattern: string) { + return map.getMapProvider().getStyle().layers.filter(l => l.id.includes(layersIdPattern)).length > 0; + } + + /** + * @override Maplibre implementation. + * Return any layer respecting the given id pattern + * @param map Map instance. + * @param layersIdPattern Identifiers pattern. + * @returns a list of layers respecting the given id pattern + */ + public getLayersFromPattern(map: ArlasMaplibreGL, layersIdPattern: string): AddLayerObject[] { + return map.getMapProvider().getStyle().layers.filter(l => l.id.includes(layersIdPattern)); + } + + /** + * @override Maplibre implementation. + * Set the mouse cursor when it's over the map + * @param map Map instance. + * @param cursor cursor type (https://developer.mozilla.org/fr/docs/Web/CSS/cursor) + */ + public setMapCursor(map: ArlasMaplibreGL, cursor: string): void { + map.getMapProvider().getCanvas().style.cursor = cursor; + } + + /** + * @override Maplibre implementation. + * Creates and returns a raster source instance. + * @param url Url to the raster source. + * @param bounds Bounds of the image [west, south, east, north]. + * @param maxZoom Maximal zoom to display the raster. + * @param minZoom Minimal zoom to display the raster. + * @param tileSize Size of the tiles fetched to display the raster (in pixels). Default to 256. + * @returns a raster source instance. + */ + public createRasterSource(url: string, bounds: number[], + maxZoom: number, minZoom: number, tileSize: number = 256): RasterSourceSpecification { + return { + type: 'raster', + tiles: [url], + bounds: bounds as [number, number, number, number], + maxzoom: maxZoom, + tileSize: tileSize + }; + } + + /** + * @override Maplibre implementation. + * Creates a new Raster layer and adds it to the map. + * @param map Map instance + * @param url Url to the raster source. + * @param bounds Bounds of the image [west, south, east, north]. + * @param maxZoom Maximal zoom to display the raster. + * @param minZoom Minimal zoom to display the raster. + * @param tileSize Size of the tiles fetched to display the raster (in pixels). Default to 256. + * @param beforeId Identifier of an already added layer. The raster Layer is added under this 'beforeId' layer. + */ + public addRasterLayer(map: ArlasMaplibreGL, layerId: string, url: string, bounds: number[], + maxZoom: number, minZoom: number, tileSize: number, beforeId?: string): void { + const rasterSource: RasterSourceSpecification = this.createRasterSource(url, bounds, maxZoom, minZoom, tileSize); + const sourceId = layerId; + this.setSource(sourceId, rasterSource, map); + const iconLayer: RasterLayerSpecification = { + id: layerId, + source: sourceId, + type: 'raster', + layout: { + visibility: 'visible' + } + }; + this.addLayer(map, iconLayer, beforeId); + } + + /** + * @override Maplibre implementation. + * Creates a new geojsob layer and adds to the map + * @param map Map instance + * @param layerId The identifier of the new icon layer + * @param style Vector style to apply to the geojson + * @param data Geojson data which features will be styled with the given style. + */ + public addGeojsonLayer(map: ArlasMaplibreGL, layerId: string, style: MaplibreVectorStyle, + data: GeoJSON.Feature | GeoJSON.FeatureCollection): void { + const source: GeoJSONSourceSpecification = this.createGeojsonSource(data); + const sourceId = layerId; + this.setSource(sourceId, source, map); + const geojsonLayer: LayerSpecification = { + id: layerId, + source: sourceId, + type: style.type, + layout: { + 'visibility': 'visible' + }, + }; + style.applyStyle(geojsonLayer); + this.addLayer(map, geojsonLayer); + } + + /** + * @override Maplibre implementation. + * Creates a new Icon layer and adds to the map + * @param map Map instance + * @param layerId The identifier of the new icon layer + * @param iconName The icon name + * @param iconSize The icon size + * @param data Geojson data which features will be represented with the given icon. + */ + public addIconLayer(map: ArlasMaplibreGL, layerId: string, iconName: string, + iconSize: number, data: GeoJSON.Feature | GeoJSON.FeatureCollection) { + const iconSource: GeoJSONSourceSpecification = this.createGeojsonSource(data); + const sourceId = layerId; + this.setSource(sourceId, iconSource, map); + const iconLayer: SymbolLayerSpecification = { + id: layerId, + source: sourceId, + type: 'symbol', + layout: { + 'icon-image': iconName, + 'icon-size': iconSize, + 'visibility': 'visible' + } + }; + this.addLayer(map, iconLayer); + }; + + public flyTo(lat: number, lng: number, zoom: number, map: ArlasMaplibreGL) { + map.getMapProvider().flyTo({ center: [lng, lat], zoom }); + } + + public filterGeojsonData(map: ArlasMaplibreGL, layerId: string, filter: any) { + map.getMapProvider().setFilter(layerId, filter); + } + + public queryFeatures(e: any, map: ArlasMaplibreGL, layersIdPattern: string, options: any) { + map.getMapProvider().queryRenderedFeatures(e.point, options) + .filter(f => !!f.layer && !!f.layer.id && f.layer.id.includes(layersIdPattern)); + }; + + + public isLayerVisible(layer: LayerSpecification): boolean { + return layer.layout.visibility === 'visible'; + } + + public getSource(sourceId: string, map: ArlasMaplibreGL) { + return (map as AbstractArlasMapGL).getMapProvider().getSource(sourceId); + } + + + + + + +} diff --git a/projects/arlas-maplibre/src/lib/basemaps/basemap.config.ts b/projects/arlas-maplibre/src/lib/basemaps/basemap.config.ts new file mode 100644 index 00000000..0db354c6 --- /dev/null +++ b/projects/arlas-maplibre/src/lib/basemaps/basemap.config.ts @@ -0,0 +1,26 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import maplibre from 'maplibre-gl'; +import { BasemapStyle } from 'arlas-map'; + +export interface MapLibreBasemapStyle extends BasemapStyle{ + styleFile: string | maplibre.StyleSpecification; +} diff --git a/projects/arlas-maplibre/src/lib/basemaps/maplibre-basemap.service.ts b/projects/arlas-maplibre/src/lib/basemaps/maplibre-basemap.service.ts new file mode 100644 index 00000000..576302e1 --- /dev/null +++ b/projects/arlas-maplibre/src/lib/basemaps/maplibre-basemap.service.ts @@ -0,0 +1,170 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import * as pmtiles from 'pmtiles'; +import { MapLibreBasemapStyle } from './basemap.config'; +import { catchError, forkJoin, Observable, of, tap } from 'rxjs'; +import { HttpClient } from '@angular/common/http'; +import maplibre, { AddLayerObject, CanvasSourceSpecification, GeoJSONSource, MapOptions, RequestParameters, TypedStyleLayer } from 'maplibre-gl'; +import { BackgroundLayerSpecification, RasterSourceSpecification, SourceSpecification } from '@maplibre/maplibre-gl-style-spec'; +import { BasemapService, BasemapStyle } from 'arlas-map'; +import { ArlasMaplibreGL } from '../map/ArlasMaplibreGL'; +import { ArlasMaplibreService } from '../arlas-maplibre.service'; +import { ArlasMapSource } from 'arlas-map'; +import { ArlasMapService } from '../arlas-map.service'; +import { MaplibreSourceType } from '../map/model/sources'; + +@Injectable({ + providedIn: 'root' +}) +export class MaplibreBasemapService extends BasemapService { + + public constructor(protected http: HttpClient, protected mapFrameworkService: ArlasMaplibreService, + private mapService: ArlasMapService + ) { + super(http, mapFrameworkService); + } + + public addProtomapBasemap(map: ArlasMaplibreGL) { + const selectedBasemap = this.basemaps.getSelected(); + if (selectedBasemap.type === 'protomap') { + const styleFile = selectedBasemap.styleFile as any; + const pmtilesSource = styleFile.sources['arlas_protomaps_source']; + pmtilesSource['type'] = 'vector'; + if (pmtilesSource) { + this.addPMtilesToSource(map, pmtilesSource); + this.addProtomapLayerToMap(map, styleFile); + } + } + } + + public removeProtomapBasemap(map: ArlasMaplibreGL) { + const selectedBasemap = this.basemaps.getSelected(); + if (selectedBasemap.type === 'protomap') { + (selectedBasemap.styleFile as maplibre.StyleSpecification).layers.forEach(l => { + this.mapFrameworkService.removeLayer(map, l.id); + }); + this.mapFrameworkService.removeSource(map, 'arlas_protomaps_source'); + } + } + + public declareProtomapProtocol(map: ArlasMaplibreGL) { + const protocol = new pmtiles.Protocol(); + maplibre.addProtocol('pmtiles', (requestParameters: RequestParameters, abortController: AbortController) => + new Promise((res, rej) => { + protocol.tile(requestParameters, (error?: Error | null, data?: any | null, cacheControl?: string | null, expires?: string | null) => { + if (error) { + rej(error); + } + res({ + cacheControl, + expires, + data + }); + }); + }) + ); + } + + public getInitStyle(selected: MapLibreBasemapStyle) { + if (selected.type === 'protomap') { + const clonedStyleFile = this.cloneStyleFile(selected); + return this.buildInitStyle(clonedStyleFile); + } + return selected.styleFile; + } + + + public fetchSources$(): Observable { + const sources$: Observable[] = []; + this.basemaps.styles().forEach(s => { + sources$.push(this.getStyleFile(s).pipe( + tap(sf => { + Object.keys(sf.sources).forEach(k => { + const attribution = sf.sources[k]['attribution']; + if (!!attribution) { + sf.sources[k]['attribution'] = attribution + this.POWERED_BY_ARLAS; + } else { + sf.sources[k]['attribution'] = this.POWERED_BY_ARLAS; + } + }); + s.styleFile = sf as maplibre.StyleSpecification; + }), + catchError(() => { + s.errored = true; + return of(); + }) + )); + }); + return forkJoin(sources$); + } + + protected getStyleFile(b: MapLibreBasemapStyle): Observable { + if (typeof b.styleFile === 'string') { + return this.http.get(b.styleFile) as Observable; + } else { + return of(b.styleFile); + } + } + + public setBasemap(s: any, newBasemap: BasemapStyle, map: ArlasMaplibreGL, mapSources: Array>) { + const selectedBasemapLayersSet = new Set(); + const layers: Array = this.mapFrameworkService.getAllLayers(map); + const sources = this.mapFrameworkService.getAllSources(map); + if (s.layers) { + s.layers.forEach(l => selectedBasemapLayersSet.add(l.id)); + } + const layersToSave = new Array(); + const sourcesToSave = new Array>(); + layers.filter((l: any) => !selectedBasemapLayersSet.has(l.id) && !!l.source).forEach(l => { + layersToSave.push(l as AddLayerObject); + if (sourcesToSave.filter(ms => ms.id === l.source.toString()).length === 0) { + sourcesToSave.push({ id: l.source.toString(), source: sources[l.source.toString()] as MaplibreSourceType }); + } + }); + const sourcesToSaveSet = new Set(); + sourcesToSave.forEach(mapSource => sourcesToSaveSet.add(mapSource.id)); + if (mapSources) { + mapSources.forEach(mapSource => { + if (!sourcesToSaveSet.has(mapSource.id)) { + sourcesToSave.push(mapSource); + } + }); + } + const initStyle = this.getInitStyle(newBasemap); + map.getMapProvider().setStyle(initStyle).once('styledata', () => { + setTimeout(() => { + /** the timeout fixes a mapboxgl bug related to layer placement*/ + this.mapService.declareBasemapSources(sourcesToSave, map); + layersToSave.forEach(l => { + this.mapFrameworkService.addLayer(map, l); + }); + localStorage.setItem(this.LOCAL_STORAGE_BASEMAPS, JSON.stringify(newBasemap)); + this.basemaps.setSelected(newBasemap); + if (newBasemap.type === 'protomap') { + this.addProtomapBasemap(map); + this.notifyProtomapAddition(); + } + this.basemapChangedSource.next(); + }, 0); + }); + } +} diff --git a/projects/arlas-maplibre/src/lib/draw/ArlasDraw.ts b/projects/arlas-maplibre/src/lib/draw/ArlasDraw.ts new file mode 100644 index 00000000..17257f3a --- /dev/null +++ b/projects/arlas-maplibre/src/lib/draw/ArlasDraw.ts @@ -0,0 +1,35 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AbstractDraw } from 'arlas-map'; +import MapboxDraw from '@mapbox/mapbox-gl-draw'; +import { ArlasMaplibreGL } from '../map/ArlasMaplibreGL'; + + +export class ArlasDraw extends AbstractDraw { + public constructor(config: any, enabled: boolean, map: ArlasMaplibreGL) { + super(config, enabled, map); + + MapboxDraw.constants.classes.CONTROL_BASE = 'maplibregl-ctrl'; + MapboxDraw.constants.classes.CONTROL_PREFIX = 'maplibregl-ctrl-'; + MapboxDraw.constants.classes.CONTROL_GROUP = 'maplibregl-ctrl-group'; + + } + +} diff --git a/projects/arlas-maplibre/src/lib/legend/legend.service.ts b/projects/arlas-maplibre/src/lib/legend/legend.service.ts new file mode 100644 index 00000000..2a29babb --- /dev/null +++ b/projects/arlas-maplibre/src/lib/legend/legend.service.ts @@ -0,0 +1,136 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Injectable } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { HistogramData } from 'arlas-d3/histograms/utils/HistogramUtils'; +import { + CircleLegend, FillLegend, getMax, HeatmapLegend, INTERPOLATE, + LabelLegend, LayerMetadata, Legend, LegendData, LegendService, LineLegend, MATCH, + MAX_CIRLE_RADIUS, MAX_LINE_WIDTH, PROPERTY_SELECTOR_SOURCE +} from 'arlas-map'; +import { + CirclePaintProps, FillPaintProps, HeatmapPaintProps, + LinePaintProps, SymbolPaintProps, TypedStyleLayer +} from 'maplibre-gl'; + +@Injectable({ + providedIn: 'root' +}) +export class MaplibreLegendService extends LegendService { + + public constructor(public translate: TranslateService) { + super(); + } + + public static filterLegend(colorLegendValues: Map, filter: any[], field: string) { + LegendService.filterLegend(colorLegendValues, filter, field); + } + + public static buildColorLegend(colorExpression: string | any, visibleMode: boolean, legendData: Map, + filter?: any, translate?: TranslateService): [Legend, string] { + return LegendService.buildColorLegend(colorExpression, visibleMode, legendData, filter, translate); + + }; + + public static buildRadiusLegend(radiusExpression: string | any, legendData: Map): Legend { + return LegendService.buildRadiusLegend(radiusExpression, legendData); + }; + + protected static buildWidthLegend(lineWidth: number | any, + legendData: Map): Legend { + return LegendService.buildWidthLegend(lineWidth, legendData); + } + + public getCircleLegend(paint: CirclePaintProps, visibileMode: boolean, legendData: + Map, layer: TypedStyleLayer): CircleLegend { + const p: CirclePaintProps = paint; + const colors = MaplibreLegendService.buildColorLegend(p['circle-color'], visibileMode, + legendData, layer.filter, this.translate); + const strokeColors = MaplibreLegendService.buildColorLegend(p['circle-stroke-color'], visibileMode, legendData, + layer.filter, this.translate); + const radius = MaplibreLegendService.buildRadiusLegend(p['circle-radius'], legendData); + return ({ + color: colors[0], + colorPalette: colors[1], + strokeColor: strokeColors[0], + strokeColorPalette: strokeColors[1], + radius: radius + }); + } + + public getLineLegend(paint: LinePaintProps, visibileMode: boolean, legendData: Map, layer: TypedStyleLayer): LineLegend { + const p: LinePaintProps = paint; + const colors = MaplibreLegendService.buildColorLegend(p['line-color'], visibileMode, legendData, layer.filter, this.translate); + const width = MaplibreLegendService.buildWidthLegend(p['line-width'], legendData); + return ({ + color: colors[0], + colorPalette: colors[1], + width: width, + // todo check dashes + dashes: p['line-dasharray'] as any + }); + } + + public getFillLegend(paint: FillPaintProps, visibileMode: boolean, legendData: Map, layer: TypedStyleLayer): FillLegend { + const p: FillPaintProps = paint; + const colors = MaplibreLegendService.buildColorLegend(p['fill-color'], visibileMode, legendData, layer.filter, this.translate); + const metadata = layer.metadata as LayerMetadata; + let strokeColors: [Legend, string] = [undefined, '']; + if (!!layer.metadata && !!metadata.stroke) { + strokeColors = MaplibreLegendService.buildColorLegend(metadata.stroke.color, visibileMode, legendData, + layer.filter, this.translate); + } + return ({ + color: colors[0], + colorPalette: colors[1], + strokeColor: strokeColors[0], + strokeColorPalette: strokeColors[1], + }); + } + + + public getHeatmapLegend(paint: HeatmapPaintProps, visibileMode: boolean, legendData: Map, + layer: TypedStyleLayer): HeatmapLegend { + const p: HeatmapPaintProps = paint; + const colors = MaplibreLegendService.buildColorLegend(p['heatmap-color'], visibileMode, legendData, layer.filter, this.translate); + const radius = MaplibreLegendService.buildRadiusLegend(p['heatmap-radius'], legendData); + if (layer.source.toString().startsWith('feature-metric')) { + colors[0].visible = false; + } + return ({ + color: colors[0], + colorPalette: colors[1], + radius: radius + }); + } + + public getLabelLegend(paint: SymbolPaintProps, visibileMode: boolean, legendData: Map, + layer: TypedStyleLayer): LabelLegend { + const p: SymbolPaintProps = paint; + const colors = MaplibreLegendService.buildColorLegend(p['text-color'], visibileMode, legendData, layer.filter, this.translate); + const size = MaplibreLegendService.buildWidthLegend(p['text-size'], legendData); + return ({ + color: colors[0], + colorPalette: colors[1], + size: size + }); + } + +} diff --git a/projects/arlas-maplibre/src/lib/map/ArlasMaplibreGL.ts b/projects/arlas-maplibre/src/lib/map/ArlasMaplibreGL.ts new file mode 100644 index 00000000..7c89fe1e --- /dev/null +++ b/projects/arlas-maplibre/src/lib/map/ArlasMaplibreGL.ts @@ -0,0 +1,390 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + AbstractArlasMapGL, ArlasLngLat, ArlasLngLatBounds, + ControlButton, DrawControlsOption, MapConfig, MapExtent, OnMoveResult +} from 'arlas-map'; +import maplibregl, { + ControlPosition, + FitBoundsOptions, + IControl, + LngLat, + LngLatBounds, + MapGeoJSONFeature, + Map as MaplibreMap, + MapOptions, + Point, + PointLike, + QueryRenderedFeaturesOptions, + StyleSetterOptions, +} from 'maplibre-gl'; +import { MaplibreControlButton, MaplibrePitchToggle } from './model/controls'; + + +export interface ArlasMaplibreConfig extends MapConfig { } + +export class ArlasMaplibreGL extends AbstractArlasMapGL { + public setCenter(lngLat: [number, number]) { + this._mapProvider.setCenter(lngLat); + return this; + } + + public getCanvasContainer() { + return this._mapProvider.getCanvasContainer(); + } + + public resize(eventData?: unknown): this { + this._mapProvider.resize(eventData); + return this; + } + + protected _mapProvider: maplibregl.Map; + public endLngLat: maplibregl.LngLat; + public moveLngLat: maplibregl.LngLat; + public startLngLat: maplibregl.LngLat; + + public constructor(protected config: ArlasMaplibreConfig) { + super(config); + } + + protected _initMapProvider(config: ArlasMaplibreConfig) { + this._mapProvider = new maplibregl.Map( + config.mapProviderOptions + ); + // Disable map pitch and rotation with keyboard + this.getMapProvider().keyboard.disableRotation(); + + // disable box zoom; + this.getMapProvider().boxZoom.disable(); + } + + public calcOffsetPoint() { + return new maplibregl.Point((this._offset.east + this._offset.west) / 2, (this._offset.north + this._offset.south) / 2); + } + + public paddedBounds(npad: number, spad: number, epad: number, wpad: number, map: maplibregl.Map, SW: ArlasLngLat, NE: ArlasLngLat): LngLat[] { + const topRight = map.project(NE); + const bottomLeft = map.project(SW); + const scale = 1; + const southWestToPoint = map.project(SW); + const southWestPoint = new Point(((southWestToPoint.x - bottomLeft.x) * scale) - wpad, ((southWestToPoint.y - topRight.y) * scale) + spad); + const southWestWorld = new Point(southWestPoint.x / scale + bottomLeft.x, southWestPoint.y / scale + topRight.y); + const swWorld = map.unproject(southWestWorld); + const northEastToPoint = map.project(NE); + const northEastPoint = new Point(((northEastToPoint.x - bottomLeft.x) * scale) + epad, ((northEastToPoint.y - topRight.y) * scale) - npad); + const northEastWorld = new Point(northEastPoint.x / scale + bottomLeft.x, northEastPoint.y / scale + topRight.y); + const neWorld = map.unproject(northEastWorld); + return [swWorld, neWorld]; + } + + + public on(type: string, listener: (ev: any) => void): this { + this.getMapProvider().on(type, listener); + return this; + } + + protected _getMoveEnd(visualisationsSets: { + visualisations: Map>; + status: Map; + }) { + const offsetPoint = this.calcOffsetPoint(); + const centerOffsetPoint = this.getMapProvider().project(this.getMapProvider().getCenter()).add(offsetPoint); + const centerOffSetLatLng = this.getMapProvider().unproject(centerOffsetPoint); + + const southWest = this.getSouthWestBounds(); + const northEast = this.getNorthEastBounds(); + const bottomLeft = this.getMapProvider().project(southWest); + const topRght = this.getMapProvider().project(northEast); + const height = bottomLeft.y; + const width = topRght.x; + + const bottomLeftOffset = bottomLeft.add(new maplibregl.Point(this._offset.west, this._offset.south)); + const topRghtOffset = topRght.add(new maplibregl.Point(this._offset.east, this._offset.north)); + + const bottomLeftOffsetLatLng = this.getMapProvider().unproject(bottomLeftOffset); + const topRghtOffsetLatLng = this.getMapProvider().unproject(topRghtOffset); + + const wrapWestOffset = bottomLeftOffsetLatLng.wrap().lng; + const wrapSouthOffset = bottomLeftOffsetLatLng.wrap().lat; + const wrapEastOffset = topRghtOffsetLatLng.wrap().lng; + const wrapNorthOffset = topRghtOffsetLatLng.wrap().lat; + + const rawWestOffset = bottomLeftOffsetLatLng.lng; + const rawSouthOffset = bottomLeftOffsetLatLng.lat; + const rawEastOffset = topRghtOffsetLatLng.lng; + const rawNorthOffset = topRghtOffsetLatLng.lat; + const visibleLayers = new Set(); + visualisationsSets.status.forEach((b, vs) => { + if (b) { + visualisationsSets.visualisations.get(vs).forEach(l => visibleLayers.add(l)); + } + }); + const onMoveData: OnMoveResult = { + zoom: this.zoom, + zoomStart: this._zoomStart, + center: this.getMapProvider().getCenter().toArray(), + centerWithOffset: [centerOffSetLatLng.lng, centerOffSetLatLng.lat], + extendWithOffset: [wrapNorthOffset, wrapWestOffset, wrapSouthOffset, wrapEastOffset], + rawExtendWithOffset: [rawNorthOffset, rawWestOffset, rawSouthOffset, rawEastOffset], + extend: [this._north, this._west, this._south, this._east], + extendForLoad: [], + extendForTest: [], + rawExtendForLoad: [], + rawExtendForTest: [], + xMoveRatio: this._xMoveRatio, + yMoveRatio: this._yMoveRatio, + visibleLayers: visibleLayers + }; + + const panLoad = this._margePanForLoad * Math.max(height, width) / 100; + const panTest = this._margePanForTest * Math.max(height, width) / 100; + const extendForLoadLatLng = this.paddedBounds(panLoad, panLoad, panLoad, panLoad, this.getMapProvider(), southWest, northEast); + const extendForTestdLatLng = this.paddedBounds(panTest, panTest, panTest, panTest, this.getMapProvider(), southWest, northEast); + onMoveData.extendForLoad = [ + extendForLoadLatLng[1].wrap().lat, + extendForLoadLatLng[0].wrap().lng, + extendForLoadLatLng[0].wrap().lat, + extendForLoadLatLng[1].wrap().lng + ]; + onMoveData.extendForTest = [ + extendForTestdLatLng[1].wrap().lat, + extendForTestdLatLng[0].wrap().lng, + extendForTestdLatLng[0].wrap().lat, + extendForTestdLatLng[1].wrap().lng + ]; + onMoveData.rawExtendForLoad = [ + extendForLoadLatLng[1].lat, + extendForLoadLatLng[0].lng, + extendForLoadLatLng[0].lat, + extendForLoadLatLng[1].lng, + ]; + onMoveData.rawExtendForTest = [ + extendForTestdLatLng[1].lat, + extendForTestdLatLng[0].lng, + extendForTestdLatLng[0].lat, + extendForTestdLatLng[1].lng, + ]; + + return onMoveData; + } + + protected _initControls(): void { + if (this._controls) { + if (this._controls.mapAttribution) { + this.addControl(new maplibregl.AttributionControl(this._controls.mapAttribution.config), this._controls.mapAttribution.position); + } + + /** Whether to display scale */ + if (this._controls?.scale?.enable) { + const defaultOpt = { + maxWidth: this._maxWidthScale, + unit: this._unitScale, + }; + const opt = this._controls?.scale?.config ?? defaultOpt; + const scale = new maplibregl.ScaleControl(opt); + this.addControl(scale, this._controls.scale?.position ?? 'bottom-right'); + } + + if (this._controls?.pitchToggle?.enable) { + const conf = this._controls.pitchToggle.config; + this.addControl(new MaplibrePitchToggle(conf.bearing, conf.pitch, conf.minpitchzoom), + this._controls.pitchToggle?.position ?? 'top-right'); + } + + if (this._controls?.navigationControl?.enable) { + this.addControl( + new maplibregl.NavigationControl(this._controls.navigationControl.config), + this._controls.navigationControl?.position ?? 'top-right'); + } + } + } + + protected _initMapMoveEvents(): void { + super._initMapMoveEvents(); + this.getMapProvider().on('mousedown', (e) => + this._updateStartLngLat(e) + ); + this.getMapProvider().on('mouseup', (e) => + this._updateEndLngLat(e) + ); + + this.getMapProvider().on('mousemove', (e) => + this._updateCurrentLngLat(e) + ); + } + + public addControl(control: IControl, position?: ControlPosition, eventOverride?: { event: string; fn: (e?) => void; }); + public addControl(control: IControl, position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'): this; + public addControl(control: IControl, position?: ControlPosition | 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left', eventOverride?: { + event: string; + fn: (e?) => void; + }) { + this.getMapProvider().addControl(control, position); + if (control instanceof ControlButton && eventOverride) { + control.btn[eventOverride.event] = () => eventOverride.fn(); + } + return this; + } + + + public setFilter(layer: string, filter?: boolean | any[], options?: StyleSetterOptions): this { + this._mapProvider.setFilter(layer, filter as any, options); + return this; + } + + public disableDragPan(): void { + this.getMapProvider().dragPan.disable(); + } + + public enableDragPan(): void { + this.getMapProvider().dragPan.enable(); + } + + public getBounds(): LngLatBounds { + return this.getMapProvider().getBounds(); + } + + public getEastBounds(): any { + return this.getBounds().getEast(); + } + + public getLayers(): any { + return this.getMapProvider().getStyle().layers; + } + + public getMapExtend(): MapExtent { + const bounds = this.getBounds(); + return { bounds: bounds.toArray(), center: bounds.getCenter().toArray(), zoom: this.getMapProvider().getZoom() }; + } + + public getMapProvider(): MaplibreMap { + return this._mapProvider; + } + + public getMaxBounds(): unknown { + return this._mapProvider.getMaxBounds(); + } + + public getNorthBounds(): number { + return this.getBounds().getNorth(); + } + + public getNorthEastBounds() { + return this.getBounds().getNorthEast(); + } + + public getSouthBounds(): number { + return this.getBounds().getSouth(); + } + + public getSouthWestBounds(): ArlasLngLat { + return this.getBounds().getSouthWest(); + } + + public getWestBounds(): number { + return this.getBounds().getWest(); + } + + public hasImage(id: string): boolean { + return this.getMapProvider().hasImage(id); + } + + + public initDrawControls(config: DrawControlsOption) { + + if (!(config.draw.control)) { + console.warn(' Draw control is not instance of MapBoxDraw'); + } else { + this.addControl(config.draw.control as IControl, (config.draw?.position ?? 'top-right')); + } + + if (config.addGeoBox.enable) { + const addGeoBoxButton = new MaplibreControlButton(config.addGeoBox?.name ?? 'addgeobox'); + this.addControl(addGeoBoxButton, config.addGeoBox?.position ?? 'top-right', config.addGeoBox?.overrideEvent); + + } + if (config.addGeoBox.enable) { + const removeAoisButton = new MaplibreControlButton('removeaois'); + this.addControl(removeAoisButton, config.removeAois?.position ?? 'top-right', config.removeAois?.overrideEvent); + } + } + + public isLayerVisible(layer: any): boolean { + return layer.layout.visibility === 'visible'; + } + + public onLoad(fn: () => void): void { + this.getMapProvider().on('load', fn); + } + + + /** + * @description Fits to given bounds + padding provided by the map configuration. + * @param bounds Bounds defined by sw and ne coordinates Or a [west, south, east, north] array. + */ + public fitToPaddedBounds(bounds: ArlasLngLatBounds | [number, number, number, number]) { + const boundsOptions: maplibregl.FitBoundsOptions = {}; + boundsOptions.padding = { + top: this._offset.north + this._fitBoundsPadding, + bottom: this._offset.south + this._fitBoundsPadding, + left: this._offset.west + this._fitBoundsPadding, + right: this._offset.east + this._fitBoundsPadding + }; + this.fitBounds(bounds, boundsOptions); + } + + + public setMaxBounds(lnglatbounds?: maplibregl.LngLatBoundsLike): this { + this.getMapProvider().setMaxBounds(lnglatbounds); + return this; + } + + + public queryRenderedFeatures(pointOrBox?: PointLike | [PointLike, PointLike], + options?: { layers?: string[]; filter?: any[]; }): MapGeoJSONFeature[] { + return this._mapProvider.queryRenderedFeatures(pointOrBox, options as QueryRenderedFeaturesOptions); + } + + public getZoom(): number { + return this._mapProvider.getZoom(); + } + + + public fitBounds(bounds: ArlasLngLatBounds | number[] | LngLatBounds, options?: FitBoundsOptions, eventData?: any): this { + this._mapProvider.fitBounds(this.toMaplibreBound(bounds), options, eventData); + return this; + } + + /** + * + * @param bounds Bounds defined by ARLAS + * @returns Transforms the ArlasLngLatBounds to LngLatBounds as defined by maplibre + */ + private toMaplibreBound(bounds: ArlasLngLatBounds | number[] | LngLatBounds) { + if (bounds instanceof ArlasLngLatBounds) { + return new LngLatBounds(bounds.sw, bounds.ne); + } else { + return new LngLatBounds(bounds as [number, number, number, number]); + + } + } + + +} diff --git a/projects/arlas-maplibre/src/lib/map/model/controls.ts b/projects/arlas-maplibre/src/lib/map/model/controls.ts new file mode 100644 index 00000000..8fb38197 --- /dev/null +++ b/projects/arlas-maplibre/src/lib/map/model/controls.ts @@ -0,0 +1,37 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControlButton, PitchToggle } from 'arlas-map'; + + +export class MaplibrePitchToggle extends PitchToggle { + protected _buildClasses(){ + this.btnClasses = ['maplibregl-ctrl-icon', 'maplibregl-ctrl-pitch']; + this.containerClasses = ['maplibregl-ctrl', 'maplibregl-ctrl-group', 'maplibregl-ctrl-group-pitch']; + } +} + + +export class MaplibreControlButton extends ControlButton { + + protected _buildClasses(){ + this.btnClasses = ['maplibregl-ctrl-icon', 'map__controls__icons', 'map__controls__icons--' + this.name]; + this.containerClasses = ['maplibregl-ctrl', 'maplibregl-ctrl-group', 'maplibregl-ctrl-group-' + this.name]; + } +} diff --git a/projects/arlas-maplibre/src/lib/map/model/sources.ts b/projects/arlas-maplibre/src/lib/map/model/sources.ts new file mode 100644 index 00000000..8bdfdd61 --- /dev/null +++ b/projects/arlas-maplibre/src/lib/map/model/sources.ts @@ -0,0 +1,21 @@ + +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export type MaplibreSourceType = maplibregl.VectorSourceSpecification | maplibregl.RasterSourceSpecification | +maplibregl.GeoJSONSourceSpecification; diff --git a/projects/arlas-maplibre/src/lib/map/model/vector-style.ts b/projects/arlas-maplibre/src/lib/map/model/vector-style.ts new file mode 100644 index 00000000..4e6ae05e --- /dev/null +++ b/projects/arlas-maplibre/src/lib/map/model/vector-style.ts @@ -0,0 +1,42 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ArlasFill, VectorStyleEnum } from 'arlas-map'; +import { ArlasCircle } from 'arlas-map'; +import { VectorStyle } from 'arlas-map'; +import { CircleLayerSpecification, FillLayerSpecification } from 'maplibre-gl'; + + +/** This file describes how to style a vector layer */ + +export class MaplibreVectorStyle extends VectorStyle { + public constructor(type: VectorStyleEnum, style: ArlasCircle | ArlasFill) { + super(type, style); + } + + /** Any adjustment from ArlasCircle to the layer circle style should be implemented here. */ + public circle(layer: CircleLayerSpecification) { + layer.paint = this.style as any; + }; + + /** Any adjustment from ArlasFill to the layer fill style should be implemented here. */ + public fill(layer: FillLayerSpecification) { + layer.paint = this.style as any; + }; +} diff --git a/projects/arlas-maplibre/src/public-api.ts b/projects/arlas-maplibre/src/public-api.ts new file mode 100644 index 00000000..cbff17f5 --- /dev/null +++ b/projects/arlas-maplibre/src/public-api.ts @@ -0,0 +1,30 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/* + * Public API Surface of arlas-maplibre + */ + +export * from './lib/arlas-maplibre.service'; +export * from './lib/arlas-maplibre.module'; +export { MaplibreLegendService } from './lib/legend/legend.service'; +export { MaplibreBasemapService } from './lib/basemaps/maplibre-basemap.service'; +export { MaplibreVectorStyle } from './lib/map/model/vector-style'; +export { ArlasMapService } from './lib/arlas-map.service'; +export { MaplibreSourceType } from './lib/map/model/sources'; + diff --git a/projects/arlas-maplibre/src/test.ts b/projects/arlas-maplibre/src/test.ts new file mode 100644 index 00000000..6fbbda22 --- /dev/null +++ b/projects/arlas-maplibre/src/test.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js'; +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); diff --git a/projects/arlas-maplibre/tsconfig.lib.json b/projects/arlas-maplibre/tsconfig.lib.json new file mode 100644 index 00000000..09752360 --- /dev/null +++ b/projects/arlas-maplibre/tsconfig.lib.json @@ -0,0 +1,25 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2020", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2019", + ] + }, + "angularCompilerOptions": { + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/arlas-maplibre/tsconfig.lib.prod.json b/projects/arlas-maplibre/tsconfig.lib.prod.json new file mode 100644 index 00000000..06de549e --- /dev/null +++ b/projects/arlas-maplibre/tsconfig.lib.prod.json @@ -0,0 +1,10 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/projects/arlas-maplibre/tsconfig.spec.json b/projects/arlas-maplibre/tsconfig.spec.json new file mode 100644 index 00000000..715dd0a5 --- /dev/null +++ b/projects/arlas-maplibre/tsconfig.spec.json @@ -0,0 +1,17 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/release-actions.sh b/release-actions.sh index 65f8c7a2..5791dfa6 100755 --- a/release-actions.sh +++ b/release-actions.sh @@ -33,11 +33,33 @@ releaseProd(){ echo "=> Test to lint and build the project on "$BRANCH" branch" npm --no-git-tag-version version ${VERSION} npm --no-git-tag-version --prefix projects/arlas-components version ${VERSION} + npm --no-git-tag-version --prefix projects/arlas-map version ${VERSION} + npm --no-git-tag-version --prefix projects/arlas-maplibre version ${VERSION} + npm --no-git-tag-version --prefix projects/arlas-mapbox version ${VERSION} + echo "=> Installing" + npm install + + echo "=> Update arlas-web-components library in arlas-map" + cd projects/arlas-map + npm install arlas-web-components@~${VERSION} + cd ../.. + echo "=> Update arlas-map library in arlas-maplibre" + + cd projects/arlas-maplibre + npm install arlas-map@~${VERSION} + cd ../.. + + cd projects/arlas-mapbox + npm install arlas-map@~${VERSION} + cd ../.. echo "=> Build the ARLAS-web-components library" - npm install + npm run lint - npm run build-release + npm run build-components + npm run build-map + npm run build-maplibre + npm run build-mapbox echo "=> Tag version $VERSION" git add . @@ -68,9 +90,48 @@ releaseProd(){ cp README-NPM.md dist/arlas-web-components/README.md cp LICENSE.txt dist/arlas-web-components/LICENSE + cp LICENSE.txt dist/arlas-map/LICENSE + cp LICENSE.txt dist/arlas-maplibre/LICENSE + cp LICENSE.txt dist/arlas-mapbox/LICENSE cd dist/arlas-web-components/ - echo "=> Publish to npm" + echo "=> Publish arlas-web-components to npm" + if [ "${STAGE_LOCAL}" == "rc" ] || [ "${STAGE_LOCAL}" == "beta" ]; + then + echo " -- tagged as ${STAGE_LOCAL}" + npm publish --tag=${STAGE_LOCAL} + else + npm publish + fi + cd ../.. + + cd dist/arlas-map/ + + echo "=> Publish arlas-map to npm" + if [ "${STAGE_LOCAL}" == "rc" ] || [ "${STAGE_LOCAL}" == "beta" ]; + then + echo " -- tagged as ${STAGE_LOCAL}" + npm publish --tag=${STAGE_LOCAL} + else + npm publish + fi + cd ../.. + + cd dist/arlas-maplibre/ + + echo "=> Publish arlas-maplibre to npm" + if [ "${STAGE_LOCAL}" == "rc" ] || [ "${STAGE_LOCAL}" == "beta" ]; + then + echo " -- tagged as ${STAGE_LOCAL}" + npm publish --tag=${STAGE_LOCAL} + else + npm publish + fi + cd ../.. + + cd dist/arlas-mapbox/ + + echo "=> Publish arlas-mapbox to npm" if [ "${STAGE_LOCAL}" == "rc" ] || [ "${STAGE_LOCAL}" == "beta" ]; then echo " -- tagged as ${STAGE_LOCAL}" @@ -98,6 +159,22 @@ releaseProd(){ newminor=$(( $minor + 1 )) newDevVersion=${major}.${newminor}.0 npm --no-git-tag-version version ""$newDevVersion"-dev0" + + # remove released dependencies and keep based on npm workspaces for dev. + cd projects/arlas-map + npm uninstall arlas-web-components + cd ../.. + echo "=> Update arlas-map library in arlas-maplibre" + + cd projects/arlas-maplibre + npm uninstall arlas-map + cd ../.. + + cd projects/arlas-mapbox + npm uninstall arlas-map + cd ../.. + + git add . commit_message="update package.json to"-"$newDevVersion" git commit -m "$commit_message" --allow-empty diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 00000000..4099cdec --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,2 @@ +sonar.language=ts +sonar.exclusions=**/node_modules/**,**/**.js/** \ No newline at end of file diff --git a/src/app/app.component.html b/src/app/app.component.html index 93641266..c18ba450 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,8 @@ + + diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 7bf888ea..608f42da 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -30,6 +30,7 @@ export class AppComponent implements OnInit { public activeLinkIndex = 0; public navLinks = [ '/', + '/maplibre', '/donut', '/histogram', '/powerbars', @@ -39,7 +40,9 @@ export class AppComponent implements OnInit { '/multi-collection' ]; - public constructor(private translate: TranslateService, private router: Router) { + + + public constructor(private readonly translate: TranslateService, private readonly router: Router) { this.translate.setDefaultLang('fr'); } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7354c7a2..d9958884 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -27,37 +27,43 @@ import { MatRadioModule } from '@angular/material/radio'; import { MatSelectModule } from '@angular/material/select'; import { MatSidenavModule } from '@angular/material/sidenav'; import { MatTabsModule } from '@angular/material/tabs'; -import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterModule, Routes } from '@angular/router'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; -import { CalendarTimelineModule } from '../../projects/arlas-components/src/lib/components/calendar-timeline/calendar-timeline.module'; -import { DonutModule } from '../../projects/arlas-components/src/lib/components/donut/donut.module'; -import { HistogramModule } from '../../projects/arlas-components/src/lib/components/histogram/histogram.module'; -import { MapglImportModule } from '../../projects/arlas-components/src/lib/components/mapgl-import/mapgl-import.module'; -import { MapglLayerIconModule } from '../../projects/arlas-components/src/lib/components/mapgl-layer-icon/mapgl-layer-icon.module'; -import { MapglLegendModule } from '../../projects/arlas-components/src/lib/components/mapgl-legend/mapgl-legend.module'; -import { MapglSettingsModule } from '../../projects/arlas-components/src/lib/components/mapgl-settings/mapgl-settings.module'; -import { MapglModule } from '../../projects/arlas-components/src/lib/components/mapgl/mapgl.module'; -import { MetricModule } from '../../projects/arlas-components/src/lib/components/metric/metric.module'; -import { MetricsTableModule } from '../../projects/arlas-components/src/lib/components/metrics-table/metrics-table.module'; -import { PowerbarsModule } from '../../projects/arlas-components/src/lib/components/powerbars/powerbars.module'; -import { ResultsModule } from '../../projects/arlas-components/src/lib/components/results/results.module'; -import { WmtsLayerManagerModule } from '../../projects/arlas-components/src/lib/components/wmts-layer-manager/wmts-layer-manager.module'; -import { FormatLegendModule } from '../../projects/arlas-components/src/lib/pipes/format-legend/format-legend.module'; -import { CollectionModule } from '../../projects/arlas-components/src/lib/services/collection.module'; -import { AwcCollectionService, BaseCollectionService } from '../../projects/arlas-components/src/lib/services/collection.service'; +import { + AwcCollectionService, + BaseCollectionService, + CollectionModule, + DonutModule, + FormatLegendModule, + HistogramModule, + MetricModule, + MetricsTableModule, + PowerbarsModule, + ResultsModule, + WmtsLayerManagerModule, + WmtsLayerManagertDialogComponent +} from '../../projects/arlas-components/src/public-api'; import { AppComponent } from './app.component'; -import { CalendarTimelineDemoComponent } from './calendar-timeline-demo/calendar-timeline-demo.component'; import { DonutDemoComponent } from './donut-demo/donut-demo.component'; import { HistogramDemoComponent } from './histogram-demo/histogram-demo.component'; import { MapglDemoComponent } from './mapgl-demo/mapgl-demo.component'; -import { MetricsTableDemoComponent } from './metrics-table-demo/metrics-table-demo.component'; import { PowerbarsDemoComponent } from './powerbars-demo/powerbars-demo.component'; import { ResultsDemoComponent } from './results-demo/results-demo.component'; import { WmtsLayerManagerDemoComponent } from './wmts-layer-manager-demo/wmts-layer-manager-demo.component'; +import { + CalendarTimelineModule +} from '../../projects/arlas-components/src/lib/components/calendar-timeline/calendar-timeline.module'; +import { ArlasMapModule, MapSettingsModule } from '../../projects/arlas-map/src/public-api'; +import { ArlasMapboxModule } from '../../projects/arlas-mapbox/src/public-api'; +import { ArlasMaplibreModule } from '../../projects/arlas-maplibre/src/public-api'; +import { CalendarTimelineDemoComponent } from './calendar-timeline-demo/calendar-timeline-demo.component'; +import { MapboxDemoModule } from './mapgl-demo/mapbox-demo.module'; +import { MaplibreDemoModule } from './mapgl-libre-demo/maplibre-demo.module'; +import { MetricsTableDemoComponent } from './metrics-table-demo/metrics-table-demo.component'; + export function httpLoaderFactory(http: HttpClient): TranslateHttpLoader { return new TranslateHttpLoader(http, './assets/i18n/', '.json'); @@ -65,6 +71,7 @@ export function httpLoaderFactory(http: HttpClient): TranslateHttpLoader { const routes: Routes = [ { path: '', component: MapglDemoComponent }, + { path: 'maplibre', component: MapglDemoComponent }, { path: 'histogram', component: HistogramDemoComponent }, { path: 'donut', component: DonutDemoComponent }, { path: 'powerbars', component: PowerbarsDemoComponent }, @@ -74,50 +81,57 @@ const routes: Routes = [ { path: 'multi-collection', component: MetricsTableDemoComponent } ]; -@NgModule({ declarations: [ - AppComponent, - HistogramDemoComponent, - ResultsDemoComponent, - MapglDemoComponent, - PowerbarsDemoComponent, - DonutDemoComponent, - WmtsLayerManagerDemoComponent, - CalendarTimelineDemoComponent, - MetricsTableDemoComponent - ], - bootstrap: [AppComponent], imports: [BrowserModule, - FormatLegendModule, - BrowserAnimationsModule, - CalendarTimelineModule, - FormsModule, - MapglModule, - MapglImportModule, - MapglSettingsModule, - MapglLegendModule, - MapglLayerIconModule, - MatButtonModule, - MatIconModule, - MatRadioModule, - MatSelectModule, - MatSidenavModule, - MatTabsModule, - HistogramModule, - DonutModule, - ResultsModule, - MetricModule, - MetricsTableModule, - RouterModule.forRoot(routes), - PowerbarsModule, - WmtsLayerManagerModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: httpLoaderFactory, - deps: [HttpClient] - } - }), - CollectionModule.forRoot({ loader: { +@NgModule({ + declarations: [ + AppComponent, + HistogramDemoComponent, + ResultsDemoComponent, + PowerbarsDemoComponent, + DonutDemoComponent, + WmtsLayerManagerDemoComponent, + CalendarTimelineDemoComponent, + MetricsTableDemoComponent, + MapglDemoComponent + ], + exports: [MapglDemoComponent], + imports: [ + FormatLegendModule, + BrowserAnimationsModule, + CalendarTimelineModule, + FormsModule, + MapSettingsModule, + MatButtonModule, + MatIconModule, + MatRadioModule, + MatSelectModule, + MatSidenavModule, + MatTabsModule, + HistogramModule, + ArlasMaplibreModule, + ArlasMapboxModule, + ArlasMapModule, + DonutModule, + ResultsModule, + MetricModule, + MetricsTableModule, + MapboxDemoModule, + MaplibreDemoModule, + RouterModule.forRoot(routes), + PowerbarsModule, + WmtsLayerManagerModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: httpLoaderFactory, + deps: [HttpClient] + } + }), + CollectionModule.forRoot({ loader: { provide: BaseCollectionService, useClass: AwcCollectionService - } })], providers: [{ provide: MAT_DATE_LOCALE, useValue: 'es-ES' }, provideHttpClient(withInterceptorsFromDi())] }) + } }) + ], + providers: [{ provide: MAT_DATE_LOCALE, useValue: 'es-ES' }, provideHttpClient(withInterceptorsFromDi())], + bootstrap: [AppComponent] +}) export class AppModule { } diff --git a/src/app/calendar-timeline-demo/calendar-timeline-demo.component.ts b/src/app/calendar-timeline-demo/calendar-timeline-demo.component.ts index 1939750b..21211cbe 100644 --- a/src/app/calendar-timeline-demo/calendar-timeline-demo.component.ts +++ b/src/app/calendar-timeline-demo/calendar-timeline-demo.component.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { Granularity } from 'arlas-d3'; import { Subject } from 'rxjs'; @@ -28,14 +28,11 @@ import { Subject } from 'rxjs'; templateUrl: './calendar-timeline-demo.component.html', styleUrls: ['./calendar-timeline-demo.component.css'] }) -export class CalendarTimelineDemoComponent implements OnInit { +export class CalendarTimelineDemoComponent { public granularity: Subject = new Subject(); public constructor() { } - public ngOnInit(): void { - } - public day() { this.granularity.next(Granularity.day); } diff --git a/src/app/mapgl-demo/mapbox-demo.module.ts b/src/app/mapgl-demo/mapbox-demo.module.ts new file mode 100644 index 00000000..3006cbe2 --- /dev/null +++ b/src/app/mapgl-demo/mapbox-demo.module.ts @@ -0,0 +1,70 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CommonModule } from '@angular/common'; + +import { NgModule } from '@angular/core'; +import { ArlasMapService } from '../../../projects/arlas-mapbox/src/lib/arlas-map.service'; +import { AbstractArlasMapService } from '../../../projects/arlas-map/src/lib/arlas-map.service'; +import { ArlasMapFrameworkService } from '../../../projects/arlas-map/src/lib/arlas-map-framework.service'; +import { ArlasMapboxService } from '../../../projects/arlas-mapbox/src/lib/arlas-mapbox.service'; +import { ArlasMapboxModule } from '../../../projects/arlas-mapbox/src/lib/arlas-mapbox.module'; +import { BasemapService } from '../../../projects/arlas-map/src/lib/basemaps/basemap.service'; +import { LegendService } from '../../../projects/arlas-map/src/lib/legend/legend.service'; +import { MapboxBasemapService } from '../../../projects/arlas-mapbox/src/lib/basemaps/mapbox-basemap.service'; +import { MapboxLegendService } from '../../../projects/arlas-mapbox/src/lib/legend/legend.service'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatIconModule } from '@angular/material/icon'; +import { FormsModule } from '@angular/forms'; +import { ArlasMapModule } from '../../../projects/arlas-map/src/lib/arlas-map.module'; +import { MapSettingsModule } from '../../../projects/arlas-map/src/lib/map-settings/map-settings.module'; + +@NgModule({ + imports: [ + CommonModule, + MatRadioModule, + MatIconModule, + FormsModule, + ArlasMapboxModule, + MapSettingsModule, + ArlasMapModule + ], + providers: [ + { + provide: AbstractArlasMapService, + useClass: ArlasMapService + }, + ArlasMapService, + { + provide: BasemapService, + useClass: MapboxBasemapService + }, + { + provide: LegendService, + useClass: MapboxLegendService + }, + { + provide: ArlasMapFrameworkService, + useClass: ArlasMapboxService + }, + ] +}) +export class MapboxDemoModule { + +} \ No newline at end of file diff --git a/src/app/mapgl-demo/mapgl-demo.component.html b/src/app/mapgl-demo/mapgl-demo.component.html index 82e1e3cf..33b9a185 100644 --- a/src/app/mapgl-demo/mapgl-demo.component.html +++ b/src/app/mapgl-demo/mapgl-demo.component.html @@ -22,18 +22,18 @@
- - - + + - - + - + (onMapLoaded)="onMapLoaded()" [dataSources]="mapDataSources"> +
diff --git a/src/app/mapgl-demo/mapgl-demo.component.ts b/src/app/mapgl-demo/mapgl-demo.component.ts index ad176738..b984dd63 100644 --- a/src/app/mapgl-demo/mapgl-demo.component.ts +++ b/src/app/mapgl-demo/mapgl-demo.component.ts @@ -17,867 +17,90 @@ * under the License. */ -import { Component, ViewChild, OnInit } from '@angular/core'; -import { - ARLAS_VSET, - GeometrySelectModel, GeoQueryOperator, MapglComponent, MapglImportComponent, MapglSettingsComponent, - MapSettingsService, OperationSelectModel, - VisualisationSetConfig -} from '../../../projects/arlas-components/src/public-api'; + +import { Component, ViewChild } from '@angular/core'; + import { Subject } from 'rxjs'; +import { VisualisationSetConfig } from '../../../projects/arlas-map/src/lib/map/model/visualisationsets'; +import { ARLAS_VSET } from '../../../projects/arlas-map/src/lib/map/model/layers'; +import { ArlasMapComponent } from '../../../projects/arlas-map/src/lib/arlas-map.component'; +import { + GeometrySelectModel, GeoQueryOperator, MapSettingsComponent, MapSettingsService, + OperationSelectModel +} from '../../../projects/arlas-map/src/lib/map-settings/map-settings.component'; +import { MapImportComponent } from '../../../projects/arlas-map/src/lib/map-import/map-import.component'; +import { ArlasAnyLayer } from '../../../projects/arlas-mapbox/src/lib/map/model/layers'; +import { MapboxSourceType } from '../../../projects/arlas-mapbox/src/lib/map/model/sources'; +import { GeoJSONSource, GeoJSONSourceRaw, MapboxOptions } from 'mapbox-gl'; +import { + defaultBasemapStyle, basemapStyles, geojsondata, drawOptions, mapDataSources, mapLayers, + mapSources, visualisationSets +} from '../../tools/map.constants'; + @Component({ selector: 'arlas-mapgl-demo', templateUrl: './mapgl-demo.component.html', styleUrls: ['./mapgl-demo.component.css'] }) -export class MapglDemoComponent implements OnInit { +export class MapglDemoComponent { - @ViewChild('demoMap', { static: true }) public mapComponent: MapglComponent; - @ViewChild('demoImportMap', { static: true }) public mapImportComponent: MapglImportComponent; - @ViewChild('mapSettings', { static: true }) public mapSettings: MapglSettingsComponent; + @ViewChild('demoMap', { static: true }) public mapComponent: ArlasMapComponent; + @ViewChild('demoImportMap', { static: true }) public mapImportComponent: MapImportComponent;; + @ViewChild('mapSettings', { static: true }) public mapSettings: MapSettingsComponent; public modeChoice = 'all'; public idToSelect: number; public actionDisabled = false; public drawEnabled = true; - public defaultBasemapStyle = { - name: 'Basic', - styleFile: 'https://api.maptiler.com/maps/basic/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/basic.png' - }; - public basemapStyles = [ - { - name: 'Basic', - styleFile: 'https://api.maptiler.com/maps/basic/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/basic.png' - }, - { - name: 'Bright', - styleFile: 'https://api.maptiler.com/maps/bright/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/bright.png' - }, - { - name: 'Pastel', - styleFile: 'https://api.maptiler.com/maps/pastel/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/pastel.png' - }, - { - name: 'Satellite Hybrid', - styleFile: 'https://api.maptiler.com/maps/hybrid/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/hybrid.png' - }, - { - name: 'Streets', - styleFile: 'https://api.maptiler.com/maps/streets/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/streets.png' - }, - { - name: 'Topo', - styleFile: 'https://api.maptiler.com/maps/topo/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/topo.png' - }, - { - name: 'Topographique', - styleFile: 'https://api.maptiler.com/maps/topographique/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/topographique.png' - }, - { - name: 'Voyager', - styleFile: 'https://api.maptiler.com/maps/voyager/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://cloud.maptiler.com/static/img/maps/voyager.png' - }, - { - name: 'Positron', - styleFile: 'https://api.maptiler.com/maps/8bb9093c-9865-452b-8be4-7a397f552b49/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://api.maptiler.com/maps/8bb9093c-9865-452b-8be4-7a397f552b49/0/0/0.png?key=xIhbu1RwgdbxfZNmoXn4' - }, - { - name: 'Dark Topo', - styleFile: 'https://api.maptiler.com/maps/99521f88-ff7f-4c7b-b1dc-05a5a773b1f1/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://api.maptiler.com/maps/99521f88-ff7f-4c7b-b1dc-05a5a773b1f1/0/0/0.png?key=xIhbu1RwgdbxfZNmoXn4' - }, - { - name: 'Streets-dark', - styleFile: 'https://api.maptiler.com/maps/a1e62ee0-aca6-451a-a4b8-42250422a212/style.json?key=xIhbu1RwgdbxfZNmoXn4', - image: 'https://api.maptiler.com/maps/a1e62ee0-aca6-451a-a4b8-42250422a212/0/0/0.png?key=xIhbu1RwgdbxfZNmoXn4' - }, - { - name: 'Streets-light', - styleFile: 'https://api.maptiler.com/maps/208a41eb-368f-4003-8e3c-2dba0d90b3cb/style.json?key=xIhbu1RwgdbxfZNmoXn4', - 'image': 'https://api.maptiler.com/maps/208a41eb-368f-4003-8e3c-2dba0d90b3cb/0/0/0.png?key=xIhbu1RwgdbxfZNmoXn4' - } - ]; - - public geojsondata = { - 'type': 'FeatureCollection', - 'features': [] - }; - - public mapLayers = { - layers: [{ - id: 'arlas_id:Latest products:1677155839933', - type: 'fill', - source: 'feature-_geometry_wkt-window-demo_eo', - minzoom: 0, - maxzoom: 22, - layout: { - visibility: 'visible' - }, - paint: { - 'fill-opacity': 0, - 'fill-color': [ - 'match', - [ - 'get', - 'metadata_ObservationContext_processusUsed_platform' - ], - 'SENTINEL 2', - '#ff61ec', - 'PLEIADES', - '#ec4040', - 'SPOT 6', - '#0087e9', - 'SPOT 5', - '#0041ff', - 'SPOT 4', - '#00b4ff', - 'SPOT 7', - '#1102c6', - 'TerraSAR-X 1', - '#5e5e5e', - 'ALOS2', - '#00c926', - 'SENTINEL 2A', - '#ff0094', - 'DRONE', - '#ffe300', - '#9d9ca9' - ] - }, - metadata: { - collection: 'demo_eo', - 'collection-display-name': 'demo_eo', - stroke: { - 'color': [ - 'get', - 'metadata_ObservationContext_processusUsed_platform_arlas__color' - ], - 'width': 3, - 'opacity': 0.7 - }, - 'is-scrollable-layer': true - }, - filter: [ - 'all', - [ - 'all' - ] - ] - }, - { - id: 'arlas_id:Density of products:1677155972496', - type: 'circle', - source: 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', - minzoom: 0, - maxzoom: 15, - layout: { - 'visibility': 'visible' - }, - paint: { - 'circle-opacity': [ - 'interpolate', - [ - 'linear' - ], - [ - 'get', - 'count_:normalized' - ], - 0, - 0, - 0.2, - 0.02, - 0.4, - 0.04, - 0.6, - 0.06000000000000001, - 0.8, - 0.08, - 1, - 0.1 - ], - 'circle-color': [ - 'interpolate', - [ - 'linear' - ], - [ - 'get', - 'count_:normalized' - ], - 0, - '#fffa83', - 0.45, - '#ffcc26', - 0.9, - '#ff7700', - 1, - '#ff5700' - ], - 'circle-radius': [ - 'interpolate', - [ - 'linear' - ], - [ - 'get', - 'count_:normalized' - ], - 0, - 5, - 0.2, - 14, - 0.4, - 23, - 0.6, - 32, - 0.8, - 41, - 1, - 50 - ], - 'circle-stroke-width': 2, - 'circle-stroke-color': [ - 'interpolate', - [ - 'linear' - ], - [ - 'get', - 'count_:normalized' - ], - 0, - '#fff500', - 0.8, - '#ffa700', - 1, - '#ff5418' - ], - 'circle-stroke-opacity': 1 - }, - metadata: { - collection: 'demo_eo', - 'collection-display-name': 'demo_eo' - }, - filter: [ - 'all', - [ - 'all' - ] - ] - }, - { - id: 'arlas_id:Number of products:1677155990578', - type: 'symbol', - source: 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', - minzoom: 0, - maxzoom: 15, - layout: { - visibility: 'visible', - 'text-field': [ - 'get', - 'count_:_arlas__short_format' - ], - 'text-font': [ - 'Open Sans Bold', - 'Arial Unicode MS Bold' - ], - 'text-size': [ - 'interpolate', - [ - 'linear' - ], - [ - 'get', - 'count_:normalized' - ], - 0, - 8, - 0.2, - 13.2, - 0.4, - 18.4, - 0.6, - 23.6, - 0.8, - 28.8, - 1, - 34 - ], - 'text-rotate': 0, - 'text-allow-overlap': true, - 'text-anchor': 'center', - 'symbol-placement': 'point' - }, - paint: { - 'text-color': '#ffffff', - 'text-opacity': 1, - 'text-halo-color': '#000', - 'text-halo-width': 1.3, - 'text-halo-blur': 2, - 'text-translate': [ - 0, - 0 - ] - }, - metadata: { - 'collection': 'demo_eo', - 'collection-display-name': 'demo_eo' - }, - filter: [ - 'all', - [ - 'all' - ] - ] - }], - events: { - zoomOnClick: [], - emitOnClick: [], - onHover: [] - }, - styleGroups: [ - { - id: 'point-0', - name: 'Point 0', - base: [ - ], - styles: [ - { - id: 'heat-distrib', - name: 'Path', - layerIds: [ - ], - isDefault: false, - geomStrategy: 'centroid' - }, - { - id: 'fill', - name: 'Dot', - layerIds: [ - ], - isDefault: true, - geomStrategy: 'geohash' - } - ] - }, - { - id: 'point-1', - name: 'Point 1', - base: [ - ], - styles: [ - { - id: 'heat-distrib', - name: 'Path', - layerIds: [ - ], - isDefault: false, - geomStrategy: 'centroid' - }, - { - id: 'fill', - name: 'Dot', - layerIds: [ - ], - isDefault: true, - geomStrategy: 'geohash' - } - ] - }, - { - id: 'point-2', - name: 'Point 2', - base: [ - ], - styles: [ - { - id: 'heat-distrib', - name: 'Heats', - layerIds: [ - ], - isDefault: false, - geomStrategy: 'centroid' - }, - { - id: 'fill', - name: 'Rectangle', - layerIds: [ - ], - isDefault: true, - geomStrategy: 'geohash' - } - ] - }, - { - id: 'point-3', - name: 'Point 3', - base: [ - ], - styles: [ - { - id: 'heat-distrib', - name: 'Heats', - layerIds: [ - ], - isDefault: false, - geomStrategy: 'centroid' - }, - { - id: 'fill', - name: 'Rectangle', - layerIds: [ - ], - isDefault: true, - geomStrategy: 'geohash' - } - ] - }, - { - id: 'distribution', - name: 'Distribution', - base: [ - ], - styles: [ - { - id: 'heat-distrib', - name: 'Heats', - layerIds: [ - ], - isDefault: false, - geomStrategy: 'centroid' - }, - { - id: 'fill', - name: 'Rectangle', - layerIds: [ - ], - isDefault: true, - geomStrategy: 'geohash' - } - ] - }, - { - id: 'accuracy', - name: 'Accuracy', - base: [], - styles: [ - { - id: 'heat-acc', - name: 'Heats', - layerIds: [ - ], - isDefault: false, - geomStrategy: 'centroid' - }, - { - id: 'fill-precision', - name: 'Rectangle', - layerIds: [ - ], - isDefault: true, - geomStrategy: 'geohash' - } - ] - } - ] - }; - - public drawOptions = { - displayControlsDefault: false, - controls: { - polygon: true, - trash: true - }, - userProperties: true, - styles: [ - { - 'id': 'gl-draw-polygon-fill-inactive', - 'type': 'fill', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Polygon'], - ['!=', 'mode', 'static'] - ], - 'paint': { - 'fill-color': '#3bb2d0', - 'fill-outline-color': '#3bb2d0', - 'fill-opacity': 0.1 - } - }, - { - 'id': 'gl-draw-polygon-fill-active', - 'type': 'fill', - 'filter': ['all', ['==', 'active', 'true'], ['==', '$type', 'Polygon']], - 'paint': { - 'fill-color': '#fbb03b', - 'fill-outline-color': '#fbb03b', - 'fill-opacity': 0.1 - } - }, - { - 'id': 'gl-draw-polygon-midpoint', - 'type': 'circle', - 'filter': ['all', - ['==', '$type', 'Point'], - ['==', 'meta', 'midpoint']], - 'paint': { - 'circle-radius': 3, - 'circle-color': '#fbb03b' - } - }, - { - 'id': 'gl-draw-polygon-stroke-inactive', - 'type': 'line', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Polygon'], - ['!=', 'mode', 'static'] - ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#3bb2d0', - 'line-width': 2 - } - }, - { - 'id': 'gl-draw-polygon-stroke-active', - 'type': 'line', - 'filter': ['all', ['==', 'active', 'true'], ['==', '$type', 'Polygon']], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#fbb03b', - 'line-dasharray': [0.2, 2], - 'line-width': 2 - } - }, - { - 'id': 'gl-draw-line-inactive', - 'type': 'line', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'LineString'], - ['!=', 'mode', 'static'] - ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#3bb2d0', - 'line-width': 2 - } - }, - { - 'id': 'gl-draw-line-active', - 'type': 'line', - 'filter': ['all', - ['==', '$type', 'LineString'], - ['==', 'active', 'true'] - ], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#fbb03b', - 'line-dasharray': [0.2, 2], - 'line-width': 2 - } - }, - { - 'id': 'gl-draw-polygon-and-line-vertex-stroke-inactive', - 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'vertex'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], - 'paint': { - 'circle-radius': 5, - 'circle-color': '#fff' - } - }, - { - 'id': 'gl-draw-polygon-and-line-vertex-inactive', - 'type': 'circle', - 'filter': ['all', - ['==', 'meta', 'vertex'], - ['==', '$type', 'Point'], - ['!=', 'mode', 'static'] - ], - 'paint': { - 'circle-radius': 3, - 'circle-color': '#fbb03b' - } - }, - { - 'id': 'gl-draw-point-point-stroke-inactive', - 'type': 'circle', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Point'], - ['==', 'meta', 'feature'], - ['!=', 'mode', 'static'] - ], - 'paint': { - 'circle-radius': 5, - 'circle-opacity': 1, - 'circle-color': '#fff' - } - }, - { - 'id': 'gl-draw-point-inactive', - 'type': 'circle', - 'filter': ['all', - ['==', 'active', 'false'], - ['==', '$type', 'Point'], - ['==', 'meta', 'feature'], - ['!=', 'mode', 'static'] - ], - 'paint': { - 'circle-radius': 3, - 'circle-color': '#3bb2d0' - } - }, - { - 'id': 'gl-draw-point-stroke-active', - 'type': 'circle', - 'filter': ['all', - ['==', '$type', 'Point'], - ['==', 'active', 'true'], - ['!=', 'meta', 'midpoint'] - ], - 'paint': { - 'circle-radius': 7, - 'circle-color': '#fff' - } - }, - { - 'id': 'gl-draw-point-active', - 'type': 'circle', - 'filter': ['all', - ['==', '$type', 'Point'], - ['!=', 'meta', 'midpoint'], - ['==', 'active', 'true']], - 'paint': { - 'circle-radius': 5, - 'circle-color': '#fbb03b' - } - }, - { - 'id': 'gl-draw-polygon-fill-static', - 'type': 'fill', - 'filter': ['all', ['==', 'mode', 'static'], ['==', '$type', 'Polygon']], - 'paint': { - 'fill-color': '#404040', - 'fill-outline-color': '#404040', - 'fill-opacity': 0.1 - } - }, - { - 'id': 'gl-draw-polygon-stroke-static', - 'type': 'line', - 'filter': ['all', ['==', 'mode', 'static'], ['==', '$type', 'Polygon']], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#404040', - 'line-width': 2 - } - }, - { - 'id': 'gl-draw-line-static', - 'type': 'line', - 'filter': ['all', ['==', 'mode', 'static'], ['==', '$type', 'LineString']], - 'layout': { - 'line-cap': 'round', - 'line-join': 'round' - }, - 'paint': { - 'line-color': '#404040', - 'line-width': 2 - } - }, - { - 'id': 'gl-draw-point-static', - 'type': 'circle', - 'filter': ['all', ['==', 'mode', 'static'], ['==', '$type', 'Point']], - 'paint': { - 'circle-radius': 5, - 'circle-color': '#404040' - } - } - ] - }; + public defaultBasemapStyle = defaultBasemapStyle + public basemapStyles = basemapStyles; - public mapDataSources = new Set(['feature-_geometry_wkt-window-demo_eo', 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo']); + public geojsondata = geojsondata; - public mapSources = [ - { - 'id': 'arlas_id:Latest products:1677155839933', - 'name': 'Latest products', - 'source': 'feature-_geometry_wkt-window-demo_eo', - 'minzoom': 0, - 'maxzoom': 22, - 'include_fields': [ - 'metadata.ObservationContext.processusUsed.platform' - ], - 'short_form_fields': [], - 'colors_from_fields': [ - 'metadata.ObservationContext.processusUsed.platform' - ], - 'provided_fields': [], - 'normalization_fields': [], - 'metrics': [], - 'returned_geometry': '_geometry_wkt', - 'render_mode': 'window' - }, - { - 'id': 'arlas_id:Density of products:1677155972496', - 'name': 'Density of products', - 'source': 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', - 'minzoom': 0, - 'maxzoom': 15, - 'include_fields': [], - 'short_form_fields': [], - 'colors_from_fields': [], - 'provided_fields': [], - 'normalization_fields': [], - 'metrics': [ - { - 'field': '', - 'metric': 'count', - 'normalize': true - }, - { - 'field': '', - 'metric': 'count', - 'normalize': true - }, - { - 'field': '', - 'metric': 'count', - 'normalize': true - }, - { - 'field': '', - 'metric': 'count', - 'normalize': true - } - ], - 'agg_geo_field': '_centroid_wkt', - 'aggType': 'tile', - 'granularity': 'Coarse', - 'minfeatures': 1000, - 'aggregated_geometry': 'centroid' - }, - { - 'id': 'arlas_id:Number of products:1677155990578', - 'name': 'Number of products', - 'source': 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', - 'minzoom': 0, - 'maxzoom': 15, - 'include_fields': [], - 'short_form_fields': [], - 'colors_from_fields': [], - 'provided_fields': [], - 'normalization_fields': [], - 'metrics': [ - { - 'field': '', - 'metric': 'count', - 'normalize': true - }, - { - 'field': '', - 'metric': 'count', - 'normalize': false, - 'short_format': true - } - ], - 'agg_geo_field': '_centroid_wkt', - 'aggType': 'tile', - 'granularity': 'Coarse', - 'minfeatures': 1000, - 'aggregated_geometry': 'centroid' - } - ]; + public mapLayers = mapLayers; + public drawOptions = drawOptions; - public visualisationSets: Array = [{ - 'name': 'Latest products', - 'layers': [ - 'arlas_id:Latest products:1677155839933' - ], - 'enabled': true - }, - { - 'name': 'All products', - 'layers': [ - 'arlas_id:Number of products:1677155990578', - 'arlas_id:Density of products:1677155972496' - ], - 'enabled': true - }]; + public mapDataSources = mapDataSources; + public mapSources = mapSources + public visualisationSets: Array = visualisationSets; public visibilityUpdater = new Subject>(); public drawData = { 'type': 'FeatureCollection', 'features': [] - }; + } as any; public constructor() { } - public ngOnInit(): void { - } - public polygonChange(event) { console.log(event); } public getWKT() { switch (this.modeChoice) { - case 'all': - console.log(this.mapComponent.getAllPolygon('wkt')); - break; - case 'selected': - console.log(this.mapComponent.getSelectedPolygon('wkt')); - break; + case 'all': + console.log(this.mapComponent.getAllPolygon('wkt')); + break; + case 'selected': + console.log(this.mapComponent.getSelectedPolygon('wkt')); + break; } } public getGeojson() { switch (this.modeChoice) { - case 'all': - console.log(JSON.stringify(this.mapComponent.getAllPolygon('geojson'))); - break; - case 'selected': - console.log(JSON.stringify(this.mapComponent.getSelectedPolygon('geojson'))); - break; + case 'all': + console.log(JSON.stringify(this.mapComponent.getAllPolygon('geojson'))); + break; + case 'selected': + console.log(JSON.stringify(this.mapComponent.getSelectedPolygon('geojson'))); + break; } } - public switchToDrawMode(mode?,opts?) { + public switchToDrawMode(mode?, opts?) { this.mapComponent.switchToDrawMode(mode, opts); } @@ -1015,7 +238,7 @@ export class MapSettings implements MapSettingsService { public getGeoQueries(): Map { const geoQueriesMap = new Map(); - geoQueriesMap.set('Test', [[{path: '_centroid'}], this.getOperations(), 'Display name Test']); + geoQueriesMap.set('Test', [[{ path: '_centroid' }], this.getOperations(), 'Display name Test']); return geoQueriesMap; } diff --git a/src/app/mapgl-libre-demo/maplibre-demo.module.ts b/src/app/mapgl-libre-demo/maplibre-demo.module.ts new file mode 100644 index 00000000..68f18ccc --- /dev/null +++ b/src/app/mapgl-libre-demo/maplibre-demo.module.ts @@ -0,0 +1,70 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CommonModule } from '@angular/common'; + +import { NgModule } from '@angular/core'; +import { ArlasMapService } from '../../../projects/arlas-maplibre/src/lib/arlas-map.service'; +import { AbstractArlasMapService } from '../../../projects/arlas-map/src/lib/arlas-map.service'; +import { ArlasMapFrameworkService } from '../../../projects/arlas-map/src/lib/arlas-map-framework.service'; +import { ArlasMaplibreService } from '../../../projects/arlas-maplibre/src/lib/arlas-maplibre.service'; +import { ArlasMaplibreModule } from '../../../projects/arlas-maplibre/src/lib/arlas-maplibre.module'; +import { BasemapService } from '../../../projects/arlas-map/src/lib/basemaps/basemap.service'; +import { LegendService } from '../../../projects/arlas-map/src/lib/legend/legend.service'; +import { MaplibreBasemapService } from '../../../projects/arlas-maplibre/src/lib/basemaps/maplibre-basemap.service'; +import { MaplibreLegendService } from '../../../projects/arlas-maplibre/src/lib/legend/legend.service'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatIconModule } from '@angular/material/icon'; +import { FormsModule } from '@angular/forms'; +import { ArlasMapModule } from '../../../projects/arlas-map/src/lib/arlas-map.module'; +import { MapSettingsModule } from '../../../projects/arlas-map/src/lib/map-settings/map-settings.module'; + +@NgModule({ + imports: [ + CommonModule, + MatRadioModule, + MatIconModule, + FormsModule, + ArlasMaplibreModule, + MapSettingsModule, + ArlasMapModule + ], + providers: [ + { + provide: AbstractArlasMapService, + useClass: ArlasMapService + }, + ArlasMapService, + { + provide: BasemapService, + useClass: MaplibreBasemapService + }, + { + provide: LegendService, + useClass: MaplibreLegendService + }, + { + provide: ArlasMapFrameworkService, + useClass: ArlasMaplibreService + }, + ] +}) +export class MaplibreDemoModule { + +} \ No newline at end of file diff --git a/src/app/metrics-table-demo/metrics-table-demo.component.ts b/src/app/metrics-table-demo/metrics-table-demo.component.ts index a70e9213..32dd7b5d 100644 --- a/src/app/metrics-table-demo/metrics-table-demo.component.ts +++ b/src/app/metrics-table-demo/metrics-table-demo.component.ts @@ -17,14 +17,14 @@ * under the License. */ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { MetricsTable } from '../../../projects/arlas-components/src/lib/components/metrics-table/model/metrics-table'; @Component({ selector: 'arlas-multi-bar-demo', templateUrl: './metrics-table-demo.component.html', styleUrls: ['./metrics-table-demo.component.css'], }) -export class MetricsTableDemoComponent implements OnInit { +export class MetricsTableDemoComponent { public multiBarTableSameTitle: MetricsTable = { header: [ // eslint-disable-next-line max-len @@ -506,7 +506,4 @@ export class MetricsTableDemoComponent implements OnInit { }; public constructor() { } - public ngOnInit(): void { - } - } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index b819e52f..62863f4b 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -10,14 +10,8 @@ "Import": "Import", "Fill": "Fill", "Contour": "Contour", - "Geo-queries & basemaps": "Geo-queries & basemaps", "Geo-queries": "Geo-queries", - "operation": "operation", - "a_operation": "operation", - "b_geometryPath": "geometry", "of_collecion": "of {{collection}}", - "Basemaps": "Basemaps", - "Choose one of the following basemaps": "Choose one of the following basemaps", "Apply geo-queries": "Apply", "Set geo-queries": "Set", "Manage layers": "Manage map layers", @@ -41,10 +35,6 @@ "Ok": "Ok", "Link": "Link", "Filter on": "Filter on", - "click for descending sort": "click for descending sort", - "click for ascending sort": "click for ascending sort", - "Check in between": "Check in between", - "Check all visible items": "Check all visible items", "Global actions": "Global actions", "Grid mode": "Grid mode", "List mode": "List mode", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index c8f721c3..c8080991 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -50,17 +50,7 @@ "Link": "Enlace", "ASC_short": "↑", "DESC_short": "↓", - "Geo-queries & basemaps": "Peticiones geográficas y mapas base", - "operation": "operación", - "a_operation": "operación", - "b_geometryPath": "geometría", - "Basemaps": "Mapas base", - "Choose one of the following basemaps": "Elegir un mapa base", "Filter on": "Filtrar por", - "click for descending sort": "Haga clic para ordenar en orden descendente", - "click for ascending sort": "Haga clic para ordenar en orden ascendente", - "Check in between": "Seleccionar entre las dos casillas marcadas", - "Check all visible items": "Seleccionar todos los elementos visibles", "Global actions": "Acciones", "Grid mode": "Vista en cuadrícula", "List mode": "Vista en lista", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index e4e3b4a6..25c7578a 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -10,14 +10,8 @@ "Import": "Importer", "Fill": "Remplissage", "Contour": "Contour", - "Geo-queries & basemaps": "Requêtes géographiques et fonds de carte", "Geo-queries": "Requêtes géographiques", - "operation": "opération", - "a_operation": "opération", - "b_geometryPath": "géométrie", "of_collecion": "de la collection {{collection}}", - "Basemaps": "Fonds de carte", - "Choose one of the following basemaps": "Choisir un fond de carte", "Apply geo-queries": "Appliquer", "Set geo-queries": "Ok", "Manage layers": "Gérer les couches cartographiques", @@ -41,10 +35,6 @@ "Ok": "Ok", "Link": "Lien", "Filter on": "Filtre sur", - "click for descending sort": "Cliquer pour tri décroissant", - "click for ascending sort": "Cliquer pour tri croissant", - "Check in between": "Cocher l'intervalle", - "Check all visible items": "Cocher tous les éléments visibles", "Global actions": "Actions", "Grid mode": "Vue grille", "List mode": "Vue liste", @@ -82,14 +72,14 @@ "METRIC_COLUMN_min": "minimal(e)", "METRIC_COLUMN_max": "maxiaml(e)", "METRIC_COLUMN_cardinality": "cardinalité", - "legend": "{{metric}} des {{field}} ({{normalized}})", - "legend without normalized": "{{metric}} des {{field}}", - "legend without field": "{{metric}} ({{normalized}})", - "avg": "Moyenne", - "sum": "Somme", - "min": "Minimum", - "max": "Maximum", - "cardinality": "Cardinalité", - "count": "Compte", - "normalized": "normalisé" -} + "legend": "{{metric}} des {{field}} ({{normalized}})", + "legend without normalized": "{{metric}} des {{field}}", + "legend without field": "{{metric}} ({{normalized}})", + "avg": "Moyenne", + "sum": "Somme", + "min": "Minimum", + "max": "Maximum", + "cardinality": "Cardinalité", + "count": "Compte", + "normalized": "normalisé" +} \ No newline at end of file diff --git a/src/assets/i18n/template.json b/src/assets/i18n/template.json index 4df513a0..20bb5c45 100644 --- a/src/assets/i18n/template.json +++ b/src/assets/i18n/template.json @@ -10,12 +10,8 @@ "Import": "Import", "Fill": "Fill", "Contour": "Contour", - "Geo-queries & basemaps": "Geo-queries & basemaps", "Geo-queries": "Geo-queries", - "operation": "operation", "point or geometry": "point or geometry", - "Basemaps": "Basemaps", - "Choose one of the following basemaps": "Choose one of the following basemaps", "Apply geo-queries": "Apply geo-queries", "Set geo-queries": "Set geo-queries", "Manage layers": "Manage layers", diff --git a/src/styles.css b/src/styles.css index 49c0d050..f6833341 100644 --- a/src/styles.css +++ b/src/styles.css @@ -98,15 +98,45 @@ body { .mapboxgl-ctrl-group-removeaois { margin-top: 0px!important; border-radius: 0px 0px 4px 4px!important; - ; box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1)!important; } .mapboxgl-ctrl-group-addgeobox { border-radius: 4px 4px 0px 0px!important; - ; } +.maplibregl-ctrl-compass { + border-bottom: 1px solid #ddd !important; +} + +.maplibregl-ctrl-pitch { + border-bottom: 1px solid #ddd !important; +} + +.maplibregl-ctrl-group { + border-radius: 4px 4px 0px 0px!important; + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.1)!important; + overflow: hidden; + background: #fff; +} + +.maplibregl-ctrl-group-pitch { + margin-top: 0px!important; + border-radius: 0px 0px 4px 4px!important; +} + +.maplibregl-ctrl-group-removeaois { + margin-top: 0px!important; + border-radius: 0px 0px 4px 4px!important; + box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1)!important; +} + +.maplibregl-ctrl-group-addgeobox { + border-radius: 4px 4px 0px 0px!important; +} + + + .donut { height: 500px !important; } diff --git a/src/tools/map.constants.ts b/src/tools/map.constants.ts new file mode 100644 index 00000000..5e073e42 --- /dev/null +++ b/src/tools/map.constants.ts @@ -0,0 +1,399 @@ +/* + * Licensed to Gisaïa under one or more contributor + * license agreements. See the NOTICE.txt file distributed with + * this work for additional information regarding copyright + * ownership. Gisaïa licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { VisualisationSetConfig } from '../../projects/arlas-map/src/lib/map/model/visualisationsets'; +import * as styles from '../../projects/arlas-map/src/lib/draw/themes/default-theme'; + +export const defaultBasemapStyle = { + name: 'Basic', + styleFile: 'https://api.maptiler.com/maps/basic/style.json?key=xIhbu1RwgdbxfZNmoXn4', + image: 'https://cloud.maptiler.com/static/img/maps/basic.png' +}; + +export function getStyle(name: string) { + return ({ + name, + styleFile: `https://api.maptiler.com/maps/${name}/style.json?key=xIhbu1RwgdbxfZNmoXn4`, + image: `https://cloud.maptiler.com/static/img/maps/${name}.png` + }) +} +export const basemapStyles = [ + getStyle('basic'), + getStyle('bright'), + getStyle('hybrid') +]; + +export const geojsondata = { + 'type': 'FeatureCollection', + 'features': [] +}; + +export const mapLayers = { + layers: [{ + id: 'arlas_id:Latest products:1677155839933', + type: 'fill', + source: 'feature-_geometry_wkt-window-demo_eo', + minzoom: 0, + maxzoom: 22, + layout: { + visibility: 'visible' + }, + paint: { + 'fill-opacity': 0, + 'fill-color': [ + 'match', + [ + 'get', + 'metadata_ObservationContext_processusUsed_platform' + ], + 'SENTINEL 2', + '#ff61ec', + 'PLEIADES', + '#ec4040', + 'SPOT 6', + '#0087e9', + 'SPOT 5', + '#0041ff', + 'SPOT 4', + '#00b4ff', + 'SPOT 7', + '#1102c6', + 'TerraSAR-X 1', + '#5e5e5e', + 'ALOS2', + '#00c926', + 'SENTINEL 2A', + '#ff0094', + 'DRONE', + '#ffe300', + '#9d9ca9' + ] + }, + metadata: { + collection: 'demo_eo', + 'collection-display-name': 'demo_eo', + stroke: { + 'color': [ + 'get', + 'metadata_ObservationContext_processusUsed_platform_arlas__color' + ], + 'width': 3, + 'opacity': 0.7 + }, + 'is-scrollable-layer': true + }, + filter: [ + 'all', + [ + 'all' + ] + ] + }, + { + id: 'arlas_id:Density of products:1677155972496', + type: 'circle', + source: 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', + minzoom: 0, + maxzoom: 15, + layout: { + 'visibility': 'visible' + }, + paint: { + 'circle-opacity': [ + 'interpolate', + [ + 'linear' + ], + [ + 'get', + 'count_:normalized' + ], + 0, + 0, + 0.2, + 0.02, + 0.4, + 0.04, + 0.6, + 0.06000000000000001, + 0.8, + 0.08, + 1, + 0.1 + ], + 'circle-color': [ + 'interpolate', + [ + 'linear' + ], + [ + 'get', + 'count_:normalized' + ], + 0, + '#fffa83', + 0.45, + '#ffcc26', + 0.9, + '#ff7700', + 1, + '#ff5700' + ], + 'circle-radius': [ + 'interpolate', + [ + 'linear' + ], + [ + 'get', + 'count_:normalized' + ], + 0, + 5, + 0.2, + 14, + 0.4, + 23, + 0.6, + 32, + 0.8, + 41, + 1, + 50 + ], + 'circle-stroke-width': 2, + 'circle-stroke-color': [ + 'interpolate', + [ + 'linear' + ], + [ + 'get', + 'count_:normalized' + ], + 0, + '#fff500', + 0.8, + '#ffa700', + 1, + '#ff5418' + ], + 'circle-stroke-opacity': 1 + }, + metadata: { + collection: 'demo_eo', + 'collection-display-name': 'demo_eo' + }, + filter: [ + 'all', + [ + 'all' + ] + ] + }, + { + id: 'arlas_id:Number of products:1677155990578', + type: 'symbol', + source: 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', + minzoom: 0, + maxzoom: 15, + layout: { + visibility: 'visible', + 'text-field': [ + 'get', + 'count_:_arlas__short_format' + ], + 'text-font': [ + 'Open Sans Bold', + 'Arial Unicode MS Bold' + ], + 'text-size': [ + 'interpolate', + [ + 'linear' + ], + [ + 'get', + 'count_:normalized' + ], + 0, + 8, + 0.2, + 13.2, + 0.4, + 18.4, + 0.6, + 23.6, + 0.8, + 28.8, + 1, + 34 + ], + 'text-rotate': 0, + 'text-allow-overlap': true, + 'text-anchor': 'center', + 'symbol-placement': 'point' + }, + paint: { + 'text-color': '#ffffff', + 'text-opacity': 1, + 'text-halo-color': '#000', + 'text-halo-width': 1.3, + 'text-halo-blur': 2, + 'text-translate': [ + 0, + 0 + ] + }, + metadata: { + 'collection': 'demo_eo', + 'collection-display-name': 'demo_eo' + }, + filter: [ + 'all', + [ + 'all' + ] + ] + }], + events: { + zoomOnClick: [], + emitOnClick: [], + onHover: [] + } +} as any; + +export const drawOptions = { + displayControlsDefault: false, + controls: { + polygon: true, + trash: true + }, + userProperties: true, + styles +}; + +export const mapDataSources = new Set(['feature-_geometry_wkt-window-demo_eo', 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo']); + +export const mapSources = [ + { + 'id': 'arlas_id:Latest products:1677155839933', + 'name': 'Latest products', + 'source': 'feature-_geometry_wkt-window-demo_eo', + 'minzoom': 0, + 'maxzoom': 22, + 'include_fields': [ + 'metadata.ObservationContext.processusUsed.platform' + ], + 'short_form_fields': [], + 'colors_from_fields': [ + 'metadata.ObservationContext.processusUsed.platform' + ], + 'provided_fields': [], + 'normalization_fields': [], + 'metrics': [], + 'returned_geometry': '_geometry_wkt', + 'render_mode': 'window' + }, + { + 'id': 'arlas_id:Density of products:1677155972496', + 'name': 'Density of products', + 'source': 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', + 'minzoom': 0, + 'maxzoom': 15, + 'include_fields': [], + 'short_form_fields': [], + 'colors_from_fields': [], + 'provided_fields': [], + 'normalization_fields': [], + 'metrics': [ + { + 'field': '', + 'metric': 'count', + 'normalize': true + }, + { + 'field': '', + 'metric': 'count', + 'normalize': true + }, + { + 'field': '', + 'metric': 'count', + 'normalize': true + }, + { + 'field': '', + 'metric': 'count', + 'normalize': true + } + ], + 'agg_geo_field': '_centroid_wkt', + 'aggType': 'tile', + 'granularity': 'Coarse', + 'minfeatures': 1000, + 'aggregated_geometry': 'centroid' + }, + { + 'id': 'arlas_id:Number of products:1677155990578', + 'name': 'Number of products', + 'source': 'cluster-_centroid_wkt-Coarse-tile-centroid-demo_eo', + 'minzoom': 0, + 'maxzoom': 15, + 'include_fields': [], + 'short_form_fields': [], + 'colors_from_fields': [], + 'provided_fields': [], + 'normalization_fields': [], + 'metrics': [ + { + 'field': '', + 'metric': 'count', + 'normalize': true + }, + { + 'field': '', + 'metric': 'count', + 'normalize': false, + 'short_format': true + } + ], + 'agg_geo_field': '_centroid_wkt', + 'aggType': 'tile', + 'granularity': 'Coarse', + 'minfeatures': 1000, + 'aggregated_geometry': 'centroid' + } +]; + +export const visualisationSets: Array = [{ + 'name': 'Latest products', + 'layers': [ + 'arlas_id:Latest products:1677155839933' + ], + 'enabled': true + }, + { + 'name': 'All products', + 'layers': [ + 'arlas_id:Number of products:1677155990578', + 'arlas_id:Density of products:1677155972496' + ], + 'enabled': true + }]; \ No newline at end of file diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json index a18c0847..87dab9c3 100644 --- a/src/tsconfig.app.json +++ b/src/tsconfig.app.json @@ -1,10 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "../out-tsc/app", - "module": "es2015", - "baseUrl": "", - "types": ["mapbox-gl", "geojson"] + }, diff --git a/tsconfig-build.json b/tsconfig-build.json index c5c02004..2170dccb 100644 --- a/tsconfig-build.json +++ b/tsconfig-build.json @@ -22,7 +22,7 @@ "node_modules/@types" ], "lib": [ - "es2015", + "es2016", "es6", "dom" ] diff --git a/tsconfig.json b/tsconfig.json index 7d22ec91..d2526b65 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,13 +3,27 @@ "compilerOptions": { "importHelpers": true, "paths": { - "arlas-components": [ - "dist/arlas-components/arlas-components", - "dist/arlas-components" + "arlas-web-components": [ + "dist/arlas-web-components", + "projects/arlas-components/src/public-api.ts", + ], + "arlas-map": [ + "dist/arlas-map", + "projects/arlas-map/src/public-api.ts", + ], + "arlas-mapbox": [ + "projects/arlas-mapbox/src/public-api.ts", + "dist/arlas-mapbox" + ], + "arlas-maplibre": [ + "projects/arlas-maplibre/src/public-api.ts", + "dist/arlas-maplibre" + ] }, "outDir": "./dist/out-tsc", - "baseUrl": "src", + "baseUrl": "./", + "rootDir": "./", "sourceMap": true, "declaration": true, "moduleResolution": "node", @@ -28,8 +42,7 @@ "node_modules/@types" ], "lib": [ - "es2015", - "es6", + "es2019", "dom" ], "module": "es2015", @@ -43,4 +56,4 @@ "strictMetadataEmit": true, "skipTemplateCodegen": true, } -} +} \ No newline at end of file