├── .editorconfig ├── .eslintrc.js ├── .github └── workflows │ └── static.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── LICENSE.md ├── README.md ├── example ├── index.html ├── index.js ├── package-lock.json ├── package.json ├── webpack.config.js └── xrkeys.gif ├── package-lock.json ├── package.json ├── src ├── index.ts └── xrkeys.glb └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | }, 6 | extends: [ 7 | 'eslint:recommended', 8 | 'prettier', 9 | 'plugin:@typescript-eslint/recommended', 10 | ], 11 | parser: '@typescript-eslint/parser', 12 | plugins: ['@typescript-eslint'], 13 | parserOptions: { 14 | ecmaVersion: 12, 15 | sourceType: 'module', 16 | }, 17 | rules: { 18 | 'sort-imports': [ 19 | 'error', 20 | { 21 | ignoreCase: false, 22 | ignoreDeclarationSort: false, 23 | ignoreMemberSort: false, 24 | memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], 25 | allowSeparatedGroups: false, 26 | }, 27 | ], 28 | 'no-unused-vars': [ 29 | 'error', 30 | { vars: 'all', args: 'all', argsIgnorePattern: '^_' }, 31 | ], 32 | 'lines-between-class-members': ['warn', 'always'], 33 | }, 34 | root: true, 35 | }; 36 | -------------------------------------------------------------------------------- /.github/workflows/static.yml: -------------------------------------------------------------------------------- 1 | name: Build and deploy example to GitHub Pages 2 | 3 | on: 4 | # Runs on pushes targeting the default branch 5 | push: 6 | branches: ['main'] 7 | 8 | # Allows you to run this workflow manually from the Actions tab 9 | workflow_dispatch: 10 | 11 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 12 | permissions: 13 | contents: read 14 | pages: write 15 | id-token: write 16 | 17 | # Allow one concurrent deployment 18 | concurrency: 19 | group: 'pages' 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | deploy: 24 | environment: 25 | name: github-pages 26 | url: ${{ steps.deployment.outputs.page_url }} 27 | 28 | runs-on: ubuntu-latest 29 | 30 | strategy: 31 | matrix: 32 | node-version: [16.x] 33 | 34 | steps: 35 | - uses: actions/checkout@v3 36 | 37 | - name: Use Node.js ${{ matrix.node-version }} 38 | uses: actions/setup-node@v3 39 | with: 40 | node-version: ${{ matrix.node-version }} 41 | 42 | - name: Build library 43 | run: npm install && npm run build:src 44 | 45 | - name: Build example 46 | run: cd example && npm install && npm run build && cd .. 47 | 48 | - name: Upload artifact 49 | uses: actions/upload-pages-artifact@v1 50 | with: 51 | # Upload entire repository 52 | path: './example/dist' 53 | 54 | - name: Deploy to GitHub Pages 55 | id: deployment 56 | uses: actions/deploy-pages@v1 57 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.yarn/* 2 | !/.yarn/releases 3 | !/.yarn/plugins 4 | !/.yarn/sdks 5 | 6 | # Swap the comments on the following lines if you don't wish to use zero-installs 7 | # Documentation here: https://yarnpkg.com/features/zero-installs 8 | !/.yarn/cache 9 | #/.pnp.* 10 | 11 | dist/ 12 | node_modules/ 13 | 14 | /.vscode/ 15 | 16 | # blender backups 17 | *.blend? 18 | 19 | .DS_Store 20 | 21 | *.raw.glb 22 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /src/assets/* 2 | /src/style/* -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "filepath": "./.eslintrc.js", 3 | "endOfLine": "lf", 4 | "useTabs": true, 5 | "trailingComma": "all", 6 | "arrowParens": "always", 7 | "singleQuote": true, 8 | "jsxSingleQuote": false 9 | } 10 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Felix (Tianrui) Zhang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # XRKeys 2 | 3 | [![npm version](https://badge.fury.io/js/xrkeys.svg)](https://badge.fury.io/js/xrkeys) 4 | [![language](https://badgen.net/badge/icon/typescript?icon=typescript&label)](https://www.typescriptlang.org/) 5 | [![license](https://badgen.net/github/license/felixtrz/xrkeys)](/LICENSE.md) 6 | 7 | A highly performant and plug-and-play WebXR keyboard library for Three.js applications. XRKeys empowers your WebXR applications with typing capabilities at the minimal expense of just **two draw calls**, while eliminating the need for extra setup such as loading fonts for the keyboard. 8 | 9 | ![](example/xrkeys.gif) 10 | 11 | ## Features 12 | 13 | - 🔌 **Plug-and-Play:** No need for extra setup like loading fonts for the keyboard. Just install and use it right away. 14 | - ⚡️ **High Performance:** Requires only 2 drawcalls, minimal impact on performance of your WebXR applications. 15 | - 🌍 **Three.js Compatible:** Specifically built for Three.js WebXR applications. 16 | 17 | ## Demo App 18 | 19 | A demo app has been built using Three.js to showcase XRKeys in action. You can check out the demo app at https://felixtrz.github.io/xrkeys/ to see how XRKeys works and to get a feel for its capabilities. 20 | 21 | This demo app is a great resource for developers who are considering using XRKeys in their projects. It provides a hands-on experience with the library and will give you a better understanding of how it works and what it can do. 22 | 23 | ## Installation 24 | 25 | To install XRKeys, simply run the following command in your terminal: 26 | 27 | ```sh 28 | $ npm install xrkeys 29 | ``` 30 | 31 | Or if you prefer using Yarn: 32 | 33 | ```sh 34 | $ yarn add xrkeys 35 | ``` 36 | 37 | ## Usage 38 | 39 | Using XRKeys is simple. First, import the package in your WebXR project: 40 | 41 | ```js 42 | import XRKeys from 'xrkeys'; 43 | ``` 44 | 45 | > **_NOTE:_** NOTE: XRKeys requires Three.js as a peer dependency, make sure to have a recent version installed. 46 | 47 | Then, create an instance of the XR keyboard: 48 | 49 | ```js 50 | const keyboard = await XRKeys.create(); 51 | ``` 52 | 53 | The XRKeys object created extends [THREE.Group](https://threejs.org/docs/#api/en/objects/Group), and can be used as such. Setup the keyboard and add it to your scene: 54 | 55 | ```js 56 | // listen for keypress events 57 | keyboard.addEventListener('keypress', (e) => { 58 | console.log('Key pressed: ' + e.key); 59 | }); 60 | 61 | // you can bind a custom function to the enter key 62 | keyboard.onEnter = (text) => { 63 | console.log('Entered text: ' + text); 64 | }; 65 | 66 | scene.add(keyboard); 67 | ``` 68 | 69 | Update the keyboard in your render loop: 70 | 71 | ```js 72 | function render() { 73 | // update the keyboard with a target ray and a pressing flag 74 | const targetRaySpace = renderer.xr.getController(0); 75 | keyboard.update(targetRaySpace, triggerIsPressed); 76 | 77 | // you can also access the keyboard's text content anytime 78 | console.log(keyboard.text); 79 | } 80 | ``` 81 | 82 | ## API Reference 83 | 84 | ### `XRKeysConfig` type 85 | 86 | `XRKeysConfig` is an object type that can have the following optional properties: 87 | 88 | - `path?: string`: Path override for custom keyboard model. 89 | - `keyMaskOffset?: number`: Z Offset for the key mask. 90 | - `hoverColor?: string`: Color of the key mask when hovered. 91 | - `pressedColor?: string`: Color of the key mask when pressed. 92 | 93 | ### `XRKeys` class 94 | 95 | `XRKeys` is a class that extends `THREE.Group`. 96 | 97 | #### Properties 98 | 99 | - `activeKeyboard: THREE.Mesh`: Returns the active keyboard mesh. 100 | - `activeKeysetIndex: number`: Returns the index of the active keyset. 101 | - `text: string`: Returns the text inputted using the keyboard. 102 | - `onEnter: (text: string) => void`: Callback function called when the Enter key is pressed. 103 | 104 | #### Methods 105 | 106 | - `static create(config?: XRKeysConfig): Promise`: Static method that creates and returns a promise that resolves to an `XRKeys` instance. Takes an optional `XRKeysConfig` object as a parameter. 107 | - `update(targetRaySpace: THREE.Object3D, pressed: boolean): void`: Method to update the keyboard based on the target ray space and whether a key is being pressed. 108 | 109 | ## License 110 | 111 | [MIT License](/LICENSE.md) © 2023 Felix Zhang 112 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | XRKeys Demo 10 | 11 | 12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | 3 | import { BoxLineGeometry } from 'three/examples/jsm/geometries/BoxLineGeometry'; 4 | import { VRButton } from 'three/addons/webxr/VRButton.js'; 5 | import { XRConsoleFactory } from 'logxr'; 6 | import { XRControllerModelFactory } from 'three/examples/jsm/webxr/XRControllerModelFactory.js'; 7 | import XRKeys from 'xrkeys'; 8 | 9 | let camera, scene, renderer, targetRaySpace, xrkeys; 10 | 11 | init(); 12 | animate(); 13 | 14 | function init() { 15 | scene = new THREE.Scene(); 16 | scene.background = new THREE.Color(0x505050); 17 | 18 | camera = new THREE.PerspectiveCamera( 19 | 50, 20 | window.innerWidth / window.innerHeight, 21 | 0.1, 22 | 10, 23 | ); 24 | camera.position.set(0, 1.6, 3); 25 | 26 | const room = new THREE.LineSegments( 27 | new BoxLineGeometry(6, 6, 6, 10, 10, 10), 28 | new THREE.LineBasicMaterial({ color: 0x808080 }), 29 | ); 30 | room.geometry.translate(0, 3, 0); 31 | scene.add(room); 32 | 33 | scene.add(new THREE.HemisphereLight(0x606060, 0x404040)); 34 | 35 | const light = new THREE.DirectionalLight(0xffffff); 36 | light.position.set(1, 1, 1).normalize(); 37 | scene.add(light); 38 | 39 | renderer = new THREE.WebGLRenderer({ antialias: true }); 40 | renderer.setPixelRatio(window.devicePixelRatio); 41 | renderer.setSize(window.innerWidth, window.innerHeight); 42 | renderer.outputEncoding = THREE.sRGBEncoding; 43 | renderer.xr.enabled = true; 44 | renderer.xr.setFoveation(0); 45 | document.body.appendChild(renderer.domElement); 46 | 47 | document.body.appendChild(VRButton.createButton(renderer)); 48 | 49 | const controllerModelFactory = new XRControllerModelFactory(); 50 | for (let i = 0; i < 2; i++) { 51 | const controller = renderer.xr.getController(i); 52 | controller.addEventListener('connected', function (event) { 53 | if (event.data.handedness === 'left') { 54 | const xrConsole = XRConsoleFactory.getInstance().createConsole({ 55 | pixelHeight: 512, 56 | pixelWidth: 1024, 57 | actualHeight: 0.25, 58 | actualWidth: 0.5, 59 | fontSize: 24, 60 | }); 61 | controller.add(xrConsole); 62 | xrConsole.position.set(0, 0.26, -0.14); 63 | console.info('Welcome to XRKeys demo!'); 64 | console.debug('Console powered by logxr'); 65 | 66 | XRKeys.create().then((instance) => { 67 | xrkeys = instance; 68 | controller.add(xrkeys); 69 | xrkeys.addEventListener('keypress', (e) => { 70 | console.log('Key pressed: ' + e.key); 71 | }); 72 | xrkeys.onEnter = (text) => { 73 | console.log('Entered text: ' + text); 74 | }; 75 | xrkeys.position.set(0, 0.075, -0.075); 76 | xrkeys.rotateX(Math.PI / 4); 77 | }); 78 | } else { 79 | const geometry = new THREE.BufferGeometry().setFromPoints([ 80 | new THREE.Vector3(0, 0, 0), 81 | new THREE.Vector3(0, 0, -1), 82 | ]); 83 | const line = new THREE.Line(geometry); 84 | line.name = 'line'; 85 | line.scale.z = 5; 86 | controller.add(line); 87 | targetRaySpace = controller; 88 | targetRaySpace.userData = { selecting: false }; 89 | controller.addEventListener('selectstart', function () { 90 | targetRaySpace.userData.selecting = true; 91 | }); 92 | controller.addEventListener('selectend', function () { 93 | targetRaySpace.userData.selecting = false; 94 | }); 95 | } 96 | }); 97 | controller.addEventListener('disconnected', function () { 98 | if (event.data.handedness === 'left') { 99 | this.remove(this.children[0]); 100 | } 101 | }); 102 | scene.add(controller); 103 | 104 | const controllerGrip = renderer.xr.getControllerGrip(i); 105 | controllerGrip.add( 106 | controllerModelFactory.createControllerModel(controllerGrip), 107 | ); 108 | scene.add(controllerGrip); 109 | } 110 | 111 | renderer.xr.setFramebufferScaleFactor(2.0); 112 | 113 | window.addEventListener('resize', onWindowResize); 114 | } 115 | 116 | function onWindowResize() { 117 | camera.aspect = window.innerWidth / window.innerHeight; 118 | camera.updateProjectionMatrix(); 119 | 120 | renderer.setSize(window.innerWidth, window.innerHeight); 121 | } 122 | 123 | function animate() { 124 | renderer.setAnimationLoop(render); 125 | } 126 | 127 | function render() { 128 | if (targetRaySpace && xrkeys) { 129 | xrkeys.update(targetRaySpace, targetRaySpace.userData.selecting); 130 | } 131 | renderer.render(scene, camera); 132 | } 133 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xrkeys-demo", 3 | "private": true, 4 | "devDependencies": { 5 | "css-loader": "^5.2.1", 6 | "copy-webpack-plugin": "^11.0.0", 7 | "html-webpack-plugin": "^5.3.1", 8 | "pre-commit": "^1.2.2", 9 | "style-loader": "^2.0.0", 10 | "webpack": "^5.33.2", 11 | "webpack-cli": "^4.6.0", 12 | "webpack-dev-server": "^4.11.1" 13 | }, 14 | "scripts": { 15 | "build": "webpack", 16 | "serve": "webpack serve" 17 | }, 18 | "dependencies": { 19 | "gamepad-wrapper": "^1.2.0", 20 | "logxr": "0.4.2", 21 | "xrkeys": "file:..", 22 | "three": "^0.149.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /example/webpack.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node */ 2 | const path = require('path'); 3 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 4 | const CopyPlugin = require('copy-webpack-plugin'); 5 | 6 | module.exports = { 7 | mode: 'development', 8 | entry: { 9 | index: './index.js', 10 | }, 11 | module: { 12 | rules: [ 13 | { 14 | test: /\.css$/i, 15 | use: ['style-loader', 'css-loader'], 16 | }, 17 | ], 18 | }, 19 | devServer: { 20 | static: { 21 | directory: path.join(__dirname, 'dist'), 22 | }, 23 | host: '0.0.0.0', 24 | server: 'https', 25 | compress: true, 26 | port: 8081, 27 | }, 28 | output: { 29 | filename: '[name].bundle.js', 30 | path: path.resolve(__dirname, 'dist'), 31 | clean: true, 32 | }, 33 | plugins: [ 34 | new HtmlWebpackPlugin({ 35 | template: './index.html', 36 | }), 37 | new CopyPlugin({ 38 | patterns: [{ from: '../dist/xrkeys.glb', to: 'assets' }], 39 | }), 40 | ], 41 | devtool: 'source-map', 42 | }; 43 | -------------------------------------------------------------------------------- /example/xrkeys.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixtrz/xrkeys/5e607b788b1eef50eb5cff8d53bbeb9c33f49a6b/example/xrkeys.gif -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xrkeys", 3 | "version": "0.1.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "xrkeys", 9 | "version": "0.1.1", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@types/node": "^18.7.13", 13 | "@types/three": "^0.149.0", 14 | "eslint": "^8.23.0", 15 | "eslint-config-prettier": "^8.5.0", 16 | "npm-watch": "^0.11.0", 17 | "prettier": "^2.7.1", 18 | "typescript": "^4.8.2" 19 | }, 20 | "peerDependencies": { 21 | "three": "^0.149.0" 22 | } 23 | }, 24 | "node_modules/@eslint/eslintrc": { 25 | "version": "1.3.1", 26 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", 27 | "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", 28 | "dev": true, 29 | "dependencies": { 30 | "ajv": "^6.12.4", 31 | "debug": "^4.3.2", 32 | "espree": "^9.4.0", 33 | "globals": "^13.15.0", 34 | "ignore": "^5.2.0", 35 | "import-fresh": "^3.2.1", 36 | "js-yaml": "^4.1.0", 37 | "minimatch": "^3.1.2", 38 | "strip-json-comments": "^3.1.1" 39 | }, 40 | "engines": { 41 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 42 | }, 43 | "funding": { 44 | "url": "https://opencollective.com/eslint" 45 | } 46 | }, 47 | "node_modules/@humanwhocodes/config-array": { 48 | "version": "0.10.4", 49 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", 50 | "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", 51 | "dev": true, 52 | "dependencies": { 53 | "@humanwhocodes/object-schema": "^1.2.1", 54 | "debug": "^4.1.1", 55 | "minimatch": "^3.0.4" 56 | }, 57 | "engines": { 58 | "node": ">=10.10.0" 59 | } 60 | }, 61 | "node_modules/@humanwhocodes/gitignore-to-minimatch": { 62 | "version": "1.0.2", 63 | "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", 64 | "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", 65 | "dev": true, 66 | "funding": { 67 | "type": "github", 68 | "url": "https://github.com/sponsors/nzakas" 69 | } 70 | }, 71 | "node_modules/@humanwhocodes/module-importer": { 72 | "version": "1.0.1", 73 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 74 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 75 | "dev": true, 76 | "engines": { 77 | "node": ">=12.22" 78 | }, 79 | "funding": { 80 | "type": "github", 81 | "url": "https://github.com/sponsors/nzakas" 82 | } 83 | }, 84 | "node_modules/@humanwhocodes/object-schema": { 85 | "version": "1.2.1", 86 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 87 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 88 | "dev": true 89 | }, 90 | "node_modules/@nodelib/fs.scandir": { 91 | "version": "2.1.5", 92 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 93 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 94 | "dev": true, 95 | "dependencies": { 96 | "@nodelib/fs.stat": "2.0.5", 97 | "run-parallel": "^1.1.9" 98 | }, 99 | "engines": { 100 | "node": ">= 8" 101 | } 102 | }, 103 | "node_modules/@nodelib/fs.stat": { 104 | "version": "2.0.5", 105 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 106 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 107 | "dev": true, 108 | "engines": { 109 | "node": ">= 8" 110 | } 111 | }, 112 | "node_modules/@nodelib/fs.walk": { 113 | "version": "1.2.8", 114 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 115 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 116 | "dev": true, 117 | "dependencies": { 118 | "@nodelib/fs.scandir": "2.1.5", 119 | "fastq": "^1.6.0" 120 | }, 121 | "engines": { 122 | "node": ">= 8" 123 | } 124 | }, 125 | "node_modules/@types/node": { 126 | "version": "18.7.13", 127 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", 128 | "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==", 129 | "dev": true 130 | }, 131 | "node_modules/@types/three": { 132 | "version": "0.149.0", 133 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.149.0.tgz", 134 | "integrity": "sha512-fgNBm9LWc65ER/W0cvoXdC0iMy7Ke9e2CONmEr6Jt8sDSY3sw4DgOubZfmdZ747dkPhbQrgRQAWwDEr2S/7IEg==", 135 | "dev": true, 136 | "dependencies": { 137 | "@types/webxr": "*" 138 | } 139 | }, 140 | "node_modules/@types/webxr": { 141 | "version": "0.5.1", 142 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.1.tgz", 143 | "integrity": "sha512-xlFXPfgJR5vIuDefhaHuUM9uUgvPaXB6GKdXy2gdEh8gBWQZ2ul24AJz3foUd8NNKlSTQuWYJpCb1/pL81m1KQ==", 144 | "dev": true 145 | }, 146 | "node_modules/abbrev": { 147 | "version": "1.1.1", 148 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 149 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 150 | "dev": true 151 | }, 152 | "node_modules/acorn": { 153 | "version": "8.8.0", 154 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 155 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 156 | "dev": true, 157 | "bin": { 158 | "acorn": "bin/acorn" 159 | }, 160 | "engines": { 161 | "node": ">=0.4.0" 162 | } 163 | }, 164 | "node_modules/acorn-jsx": { 165 | "version": "5.3.2", 166 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 167 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 168 | "dev": true, 169 | "peerDependencies": { 170 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 171 | } 172 | }, 173 | "node_modules/ajv": { 174 | "version": "6.12.6", 175 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 176 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 177 | "dev": true, 178 | "dependencies": { 179 | "fast-deep-equal": "^3.1.1", 180 | "fast-json-stable-stringify": "^2.0.0", 181 | "json-schema-traverse": "^0.4.1", 182 | "uri-js": "^4.2.2" 183 | }, 184 | "funding": { 185 | "type": "github", 186 | "url": "https://github.com/sponsors/epoberezkin" 187 | } 188 | }, 189 | "node_modules/ansi-regex": { 190 | "version": "5.0.1", 191 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 192 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 193 | "dev": true, 194 | "engines": { 195 | "node": ">=8" 196 | } 197 | }, 198 | "node_modules/ansi-styles": { 199 | "version": "4.3.0", 200 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 201 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 202 | "dev": true, 203 | "dependencies": { 204 | "color-convert": "^2.0.1" 205 | }, 206 | "engines": { 207 | "node": ">=8" 208 | }, 209 | "funding": { 210 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 211 | } 212 | }, 213 | "node_modules/anymatch": { 214 | "version": "3.1.3", 215 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 216 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 217 | "dev": true, 218 | "dependencies": { 219 | "normalize-path": "^3.0.0", 220 | "picomatch": "^2.0.4" 221 | }, 222 | "engines": { 223 | "node": ">= 8" 224 | } 225 | }, 226 | "node_modules/argparse": { 227 | "version": "2.0.1", 228 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 229 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 230 | "dev": true 231 | }, 232 | "node_modules/array-union": { 233 | "version": "2.1.0", 234 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 235 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 236 | "dev": true, 237 | "engines": { 238 | "node": ">=8" 239 | } 240 | }, 241 | "node_modules/balanced-match": { 242 | "version": "1.0.2", 243 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 244 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 245 | "dev": true 246 | }, 247 | "node_modules/binary-extensions": { 248 | "version": "2.2.0", 249 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 250 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 251 | "dev": true, 252 | "engines": { 253 | "node": ">=8" 254 | } 255 | }, 256 | "node_modules/brace-expansion": { 257 | "version": "1.1.11", 258 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 259 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 260 | "dev": true, 261 | "dependencies": { 262 | "balanced-match": "^1.0.0", 263 | "concat-map": "0.0.1" 264 | } 265 | }, 266 | "node_modules/braces": { 267 | "version": "3.0.2", 268 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 269 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 270 | "dev": true, 271 | "dependencies": { 272 | "fill-range": "^7.0.1" 273 | }, 274 | "engines": { 275 | "node": ">=8" 276 | } 277 | }, 278 | "node_modules/callsites": { 279 | "version": "3.1.0", 280 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 281 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 282 | "dev": true, 283 | "engines": { 284 | "node": ">=6" 285 | } 286 | }, 287 | "node_modules/chalk": { 288 | "version": "4.1.2", 289 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 290 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 291 | "dev": true, 292 | "dependencies": { 293 | "ansi-styles": "^4.1.0", 294 | "supports-color": "^7.1.0" 295 | }, 296 | "engines": { 297 | "node": ">=10" 298 | }, 299 | "funding": { 300 | "url": "https://github.com/chalk/chalk?sponsor=1" 301 | } 302 | }, 303 | "node_modules/chokidar": { 304 | "version": "3.5.3", 305 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 306 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 307 | "dev": true, 308 | "funding": [ 309 | { 310 | "type": "individual", 311 | "url": "https://paulmillr.com/funding/" 312 | } 313 | ], 314 | "dependencies": { 315 | "anymatch": "~3.1.2", 316 | "braces": "~3.0.2", 317 | "glob-parent": "~5.1.2", 318 | "is-binary-path": "~2.1.0", 319 | "is-glob": "~4.0.1", 320 | "normalize-path": "~3.0.0", 321 | "readdirp": "~3.6.0" 322 | }, 323 | "engines": { 324 | "node": ">= 8.10.0" 325 | }, 326 | "optionalDependencies": { 327 | "fsevents": "~2.3.2" 328 | } 329 | }, 330 | "node_modules/chokidar/node_modules/glob-parent": { 331 | "version": "5.1.2", 332 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 333 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 334 | "dev": true, 335 | "dependencies": { 336 | "is-glob": "^4.0.1" 337 | }, 338 | "engines": { 339 | "node": ">= 6" 340 | } 341 | }, 342 | "node_modules/color-convert": { 343 | "version": "2.0.1", 344 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 345 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 346 | "dev": true, 347 | "dependencies": { 348 | "color-name": "~1.1.4" 349 | }, 350 | "engines": { 351 | "node": ">=7.0.0" 352 | } 353 | }, 354 | "node_modules/color-name": { 355 | "version": "1.1.4", 356 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 357 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 358 | "dev": true 359 | }, 360 | "node_modules/concat-map": { 361 | "version": "0.0.1", 362 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 363 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 364 | "dev": true 365 | }, 366 | "node_modules/cross-spawn": { 367 | "version": "7.0.3", 368 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 369 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 370 | "dev": true, 371 | "dependencies": { 372 | "path-key": "^3.1.0", 373 | "shebang-command": "^2.0.0", 374 | "which": "^2.0.1" 375 | }, 376 | "engines": { 377 | "node": ">= 8" 378 | } 379 | }, 380 | "node_modules/debug": { 381 | "version": "4.3.4", 382 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 383 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 384 | "dev": true, 385 | "dependencies": { 386 | "ms": "2.1.2" 387 | }, 388 | "engines": { 389 | "node": ">=6.0" 390 | }, 391 | "peerDependenciesMeta": { 392 | "supports-color": { 393 | "optional": true 394 | } 395 | } 396 | }, 397 | "node_modules/deep-is": { 398 | "version": "0.1.4", 399 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 400 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 401 | "dev": true 402 | }, 403 | "node_modules/dir-glob": { 404 | "version": "3.0.1", 405 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 406 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 407 | "dev": true, 408 | "dependencies": { 409 | "path-type": "^4.0.0" 410 | }, 411 | "engines": { 412 | "node": ">=8" 413 | } 414 | }, 415 | "node_modules/doctrine": { 416 | "version": "3.0.0", 417 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 418 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 419 | "dev": true, 420 | "dependencies": { 421 | "esutils": "^2.0.2" 422 | }, 423 | "engines": { 424 | "node": ">=6.0.0" 425 | } 426 | }, 427 | "node_modules/escape-string-regexp": { 428 | "version": "4.0.0", 429 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 430 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 431 | "dev": true, 432 | "engines": { 433 | "node": ">=10" 434 | }, 435 | "funding": { 436 | "url": "https://github.com/sponsors/sindresorhus" 437 | } 438 | }, 439 | "node_modules/eslint": { 440 | "version": "8.23.0", 441 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", 442 | "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", 443 | "dev": true, 444 | "dependencies": { 445 | "@eslint/eslintrc": "^1.3.1", 446 | "@humanwhocodes/config-array": "^0.10.4", 447 | "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", 448 | "@humanwhocodes/module-importer": "^1.0.1", 449 | "ajv": "^6.10.0", 450 | "chalk": "^4.0.0", 451 | "cross-spawn": "^7.0.2", 452 | "debug": "^4.3.2", 453 | "doctrine": "^3.0.0", 454 | "escape-string-regexp": "^4.0.0", 455 | "eslint-scope": "^7.1.1", 456 | "eslint-utils": "^3.0.0", 457 | "eslint-visitor-keys": "^3.3.0", 458 | "espree": "^9.4.0", 459 | "esquery": "^1.4.0", 460 | "esutils": "^2.0.2", 461 | "fast-deep-equal": "^3.1.3", 462 | "file-entry-cache": "^6.0.1", 463 | "find-up": "^5.0.0", 464 | "functional-red-black-tree": "^1.0.1", 465 | "glob-parent": "^6.0.1", 466 | "globals": "^13.15.0", 467 | "globby": "^11.1.0", 468 | "grapheme-splitter": "^1.0.4", 469 | "ignore": "^5.2.0", 470 | "import-fresh": "^3.0.0", 471 | "imurmurhash": "^0.1.4", 472 | "is-glob": "^4.0.0", 473 | "js-yaml": "^4.1.0", 474 | "json-stable-stringify-without-jsonify": "^1.0.1", 475 | "levn": "^0.4.1", 476 | "lodash.merge": "^4.6.2", 477 | "minimatch": "^3.1.2", 478 | "natural-compare": "^1.4.0", 479 | "optionator": "^0.9.1", 480 | "regexpp": "^3.2.0", 481 | "strip-ansi": "^6.0.1", 482 | "strip-json-comments": "^3.1.0", 483 | "text-table": "^0.2.0" 484 | }, 485 | "bin": { 486 | "eslint": "bin/eslint.js" 487 | }, 488 | "engines": { 489 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 490 | }, 491 | "funding": { 492 | "url": "https://opencollective.com/eslint" 493 | } 494 | }, 495 | "node_modules/eslint-config-prettier": { 496 | "version": "8.5.0", 497 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", 498 | "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", 499 | "dev": true, 500 | "bin": { 501 | "eslint-config-prettier": "bin/cli.js" 502 | }, 503 | "peerDependencies": { 504 | "eslint": ">=7.0.0" 505 | } 506 | }, 507 | "node_modules/eslint-scope": { 508 | "version": "7.1.1", 509 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 510 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 511 | "dev": true, 512 | "dependencies": { 513 | "esrecurse": "^4.3.0", 514 | "estraverse": "^5.2.0" 515 | }, 516 | "engines": { 517 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 518 | } 519 | }, 520 | "node_modules/eslint-utils": { 521 | "version": "3.0.0", 522 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 523 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 524 | "dev": true, 525 | "dependencies": { 526 | "eslint-visitor-keys": "^2.0.0" 527 | }, 528 | "engines": { 529 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 530 | }, 531 | "funding": { 532 | "url": "https://github.com/sponsors/mysticatea" 533 | }, 534 | "peerDependencies": { 535 | "eslint": ">=5" 536 | } 537 | }, 538 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 539 | "version": "2.1.0", 540 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 541 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 542 | "dev": true, 543 | "engines": { 544 | "node": ">=10" 545 | } 546 | }, 547 | "node_modules/eslint-visitor-keys": { 548 | "version": "3.3.0", 549 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 550 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 551 | "dev": true, 552 | "engines": { 553 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 554 | } 555 | }, 556 | "node_modules/espree": { 557 | "version": "9.4.0", 558 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", 559 | "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", 560 | "dev": true, 561 | "dependencies": { 562 | "acorn": "^8.8.0", 563 | "acorn-jsx": "^5.3.2", 564 | "eslint-visitor-keys": "^3.3.0" 565 | }, 566 | "engines": { 567 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 568 | }, 569 | "funding": { 570 | "url": "https://opencollective.com/eslint" 571 | } 572 | }, 573 | "node_modules/esquery": { 574 | "version": "1.4.0", 575 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 576 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 577 | "dev": true, 578 | "dependencies": { 579 | "estraverse": "^5.1.0" 580 | }, 581 | "engines": { 582 | "node": ">=0.10" 583 | } 584 | }, 585 | "node_modules/esrecurse": { 586 | "version": "4.3.0", 587 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 588 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 589 | "dev": true, 590 | "dependencies": { 591 | "estraverse": "^5.2.0" 592 | }, 593 | "engines": { 594 | "node": ">=4.0" 595 | } 596 | }, 597 | "node_modules/estraverse": { 598 | "version": "5.3.0", 599 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 600 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 601 | "dev": true, 602 | "engines": { 603 | "node": ">=4.0" 604 | } 605 | }, 606 | "node_modules/esutils": { 607 | "version": "2.0.3", 608 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 609 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 610 | "dev": true, 611 | "engines": { 612 | "node": ">=0.10.0" 613 | } 614 | }, 615 | "node_modules/fast-deep-equal": { 616 | "version": "3.1.3", 617 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 618 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 619 | "dev": true 620 | }, 621 | "node_modules/fast-glob": { 622 | "version": "3.2.11", 623 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 624 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 625 | "dev": true, 626 | "dependencies": { 627 | "@nodelib/fs.stat": "^2.0.2", 628 | "@nodelib/fs.walk": "^1.2.3", 629 | "glob-parent": "^5.1.2", 630 | "merge2": "^1.3.0", 631 | "micromatch": "^4.0.4" 632 | }, 633 | "engines": { 634 | "node": ">=8.6.0" 635 | } 636 | }, 637 | "node_modules/fast-glob/node_modules/glob-parent": { 638 | "version": "5.1.2", 639 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 640 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 641 | "dev": true, 642 | "dependencies": { 643 | "is-glob": "^4.0.1" 644 | }, 645 | "engines": { 646 | "node": ">= 6" 647 | } 648 | }, 649 | "node_modules/fast-json-stable-stringify": { 650 | "version": "2.1.0", 651 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 652 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 653 | "dev": true 654 | }, 655 | "node_modules/fast-levenshtein": { 656 | "version": "2.0.6", 657 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 658 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 659 | "dev": true 660 | }, 661 | "node_modules/fastq": { 662 | "version": "1.13.0", 663 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 664 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 665 | "dev": true, 666 | "dependencies": { 667 | "reusify": "^1.0.4" 668 | } 669 | }, 670 | "node_modules/file-entry-cache": { 671 | "version": "6.0.1", 672 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 673 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 674 | "dev": true, 675 | "dependencies": { 676 | "flat-cache": "^3.0.4" 677 | }, 678 | "engines": { 679 | "node": "^10.12.0 || >=12.0.0" 680 | } 681 | }, 682 | "node_modules/fill-range": { 683 | "version": "7.0.1", 684 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 685 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 686 | "dev": true, 687 | "dependencies": { 688 | "to-regex-range": "^5.0.1" 689 | }, 690 | "engines": { 691 | "node": ">=8" 692 | } 693 | }, 694 | "node_modules/find-up": { 695 | "version": "5.0.0", 696 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 697 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 698 | "dev": true, 699 | "dependencies": { 700 | "locate-path": "^6.0.0", 701 | "path-exists": "^4.0.0" 702 | }, 703 | "engines": { 704 | "node": ">=10" 705 | }, 706 | "funding": { 707 | "url": "https://github.com/sponsors/sindresorhus" 708 | } 709 | }, 710 | "node_modules/flat-cache": { 711 | "version": "3.0.4", 712 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 713 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 714 | "dev": true, 715 | "dependencies": { 716 | "flatted": "^3.1.0", 717 | "rimraf": "^3.0.2" 718 | }, 719 | "engines": { 720 | "node": "^10.12.0 || >=12.0.0" 721 | } 722 | }, 723 | "node_modules/flatted": { 724 | "version": "3.2.7", 725 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 726 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 727 | "dev": true 728 | }, 729 | "node_modules/fs.realpath": { 730 | "version": "1.0.0", 731 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 732 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 733 | "dev": true 734 | }, 735 | "node_modules/fsevents": { 736 | "version": "2.3.2", 737 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 738 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 739 | "dev": true, 740 | "hasInstallScript": true, 741 | "optional": true, 742 | "os": [ 743 | "darwin" 744 | ], 745 | "engines": { 746 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 747 | } 748 | }, 749 | "node_modules/functional-red-black-tree": { 750 | "version": "1.0.1", 751 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 752 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 753 | "dev": true 754 | }, 755 | "node_modules/glob": { 756 | "version": "7.2.3", 757 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 758 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 759 | "dev": true, 760 | "dependencies": { 761 | "fs.realpath": "^1.0.0", 762 | "inflight": "^1.0.4", 763 | "inherits": "2", 764 | "minimatch": "^3.1.1", 765 | "once": "^1.3.0", 766 | "path-is-absolute": "^1.0.0" 767 | }, 768 | "engines": { 769 | "node": "*" 770 | }, 771 | "funding": { 772 | "url": "https://github.com/sponsors/isaacs" 773 | } 774 | }, 775 | "node_modules/glob-parent": { 776 | "version": "6.0.2", 777 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 778 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 779 | "dev": true, 780 | "dependencies": { 781 | "is-glob": "^4.0.3" 782 | }, 783 | "engines": { 784 | "node": ">=10.13.0" 785 | } 786 | }, 787 | "node_modules/globals": { 788 | "version": "13.17.0", 789 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", 790 | "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", 791 | "dev": true, 792 | "dependencies": { 793 | "type-fest": "^0.20.2" 794 | }, 795 | "engines": { 796 | "node": ">=8" 797 | }, 798 | "funding": { 799 | "url": "https://github.com/sponsors/sindresorhus" 800 | } 801 | }, 802 | "node_modules/globby": { 803 | "version": "11.1.0", 804 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 805 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 806 | "dev": true, 807 | "dependencies": { 808 | "array-union": "^2.1.0", 809 | "dir-glob": "^3.0.1", 810 | "fast-glob": "^3.2.9", 811 | "ignore": "^5.2.0", 812 | "merge2": "^1.4.1", 813 | "slash": "^3.0.0" 814 | }, 815 | "engines": { 816 | "node": ">=10" 817 | }, 818 | "funding": { 819 | "url": "https://github.com/sponsors/sindresorhus" 820 | } 821 | }, 822 | "node_modules/grapheme-splitter": { 823 | "version": "1.0.4", 824 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 825 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 826 | "dev": true 827 | }, 828 | "node_modules/has-flag": { 829 | "version": "4.0.0", 830 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 831 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 832 | "dev": true, 833 | "engines": { 834 | "node": ">=8" 835 | } 836 | }, 837 | "node_modules/ignore": { 838 | "version": "5.2.0", 839 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 840 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 841 | "dev": true, 842 | "engines": { 843 | "node": ">= 4" 844 | } 845 | }, 846 | "node_modules/ignore-by-default": { 847 | "version": "1.0.1", 848 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 849 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 850 | "dev": true 851 | }, 852 | "node_modules/import-fresh": { 853 | "version": "3.3.0", 854 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 855 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 856 | "dev": true, 857 | "dependencies": { 858 | "parent-module": "^1.0.0", 859 | "resolve-from": "^4.0.0" 860 | }, 861 | "engines": { 862 | "node": ">=6" 863 | }, 864 | "funding": { 865 | "url": "https://github.com/sponsors/sindresorhus" 866 | } 867 | }, 868 | "node_modules/imurmurhash": { 869 | "version": "0.1.4", 870 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 871 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 872 | "dev": true, 873 | "engines": { 874 | "node": ">=0.8.19" 875 | } 876 | }, 877 | "node_modules/inflight": { 878 | "version": "1.0.6", 879 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 880 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 881 | "dev": true, 882 | "dependencies": { 883 | "once": "^1.3.0", 884 | "wrappy": "1" 885 | } 886 | }, 887 | "node_modules/inherits": { 888 | "version": "2.0.4", 889 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 890 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 891 | "dev": true 892 | }, 893 | "node_modules/is-binary-path": { 894 | "version": "2.1.0", 895 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 896 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 897 | "dev": true, 898 | "dependencies": { 899 | "binary-extensions": "^2.0.0" 900 | }, 901 | "engines": { 902 | "node": ">=8" 903 | } 904 | }, 905 | "node_modules/is-extglob": { 906 | "version": "2.1.1", 907 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 908 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 909 | "dev": true, 910 | "engines": { 911 | "node": ">=0.10.0" 912 | } 913 | }, 914 | "node_modules/is-glob": { 915 | "version": "4.0.3", 916 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 917 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 918 | "dev": true, 919 | "dependencies": { 920 | "is-extglob": "^2.1.1" 921 | }, 922 | "engines": { 923 | "node": ">=0.10.0" 924 | } 925 | }, 926 | "node_modules/is-number": { 927 | "version": "7.0.0", 928 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 929 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 930 | "dev": true, 931 | "engines": { 932 | "node": ">=0.12.0" 933 | } 934 | }, 935 | "node_modules/isexe": { 936 | "version": "2.0.0", 937 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 938 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 939 | "dev": true 940 | }, 941 | "node_modules/js-yaml": { 942 | "version": "4.1.0", 943 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 944 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 945 | "dev": true, 946 | "dependencies": { 947 | "argparse": "^2.0.1" 948 | }, 949 | "bin": { 950 | "js-yaml": "bin/js-yaml.js" 951 | } 952 | }, 953 | "node_modules/json-schema-traverse": { 954 | "version": "0.4.1", 955 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 956 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 957 | "dev": true 958 | }, 959 | "node_modules/json-stable-stringify-without-jsonify": { 960 | "version": "1.0.1", 961 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 962 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 963 | "dev": true 964 | }, 965 | "node_modules/levn": { 966 | "version": "0.4.1", 967 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 968 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 969 | "dev": true, 970 | "dependencies": { 971 | "prelude-ls": "^1.2.1", 972 | "type-check": "~0.4.0" 973 | }, 974 | "engines": { 975 | "node": ">= 0.8.0" 976 | } 977 | }, 978 | "node_modules/locate-path": { 979 | "version": "6.0.0", 980 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 981 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 982 | "dev": true, 983 | "dependencies": { 984 | "p-locate": "^5.0.0" 985 | }, 986 | "engines": { 987 | "node": ">=10" 988 | }, 989 | "funding": { 990 | "url": "https://github.com/sponsors/sindresorhus" 991 | } 992 | }, 993 | "node_modules/lodash.merge": { 994 | "version": "4.6.2", 995 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 996 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 997 | "dev": true 998 | }, 999 | "node_modules/merge2": { 1000 | "version": "1.4.1", 1001 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1002 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1003 | "dev": true, 1004 | "engines": { 1005 | "node": ">= 8" 1006 | } 1007 | }, 1008 | "node_modules/micromatch": { 1009 | "version": "4.0.5", 1010 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1011 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1012 | "dev": true, 1013 | "dependencies": { 1014 | "braces": "^3.0.2", 1015 | "picomatch": "^2.3.1" 1016 | }, 1017 | "engines": { 1018 | "node": ">=8.6" 1019 | } 1020 | }, 1021 | "node_modules/minimatch": { 1022 | "version": "3.1.2", 1023 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1024 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "brace-expansion": "^1.1.7" 1028 | }, 1029 | "engines": { 1030 | "node": "*" 1031 | } 1032 | }, 1033 | "node_modules/ms": { 1034 | "version": "2.1.2", 1035 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1036 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1037 | "dev": true 1038 | }, 1039 | "node_modules/natural-compare": { 1040 | "version": "1.4.0", 1041 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1042 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1043 | "dev": true 1044 | }, 1045 | "node_modules/nodemon": { 1046 | "version": "2.0.20", 1047 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", 1048 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", 1049 | "dev": true, 1050 | "dependencies": { 1051 | "chokidar": "^3.5.2", 1052 | "debug": "^3.2.7", 1053 | "ignore-by-default": "^1.0.1", 1054 | "minimatch": "^3.1.2", 1055 | "pstree.remy": "^1.1.8", 1056 | "semver": "^5.7.1", 1057 | "simple-update-notifier": "^1.0.7", 1058 | "supports-color": "^5.5.0", 1059 | "touch": "^3.1.0", 1060 | "undefsafe": "^2.0.5" 1061 | }, 1062 | "bin": { 1063 | "nodemon": "bin/nodemon.js" 1064 | }, 1065 | "engines": { 1066 | "node": ">=8.10.0" 1067 | }, 1068 | "funding": { 1069 | "type": "opencollective", 1070 | "url": "https://opencollective.com/nodemon" 1071 | } 1072 | }, 1073 | "node_modules/nodemon/node_modules/debug": { 1074 | "version": "3.2.7", 1075 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1076 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1077 | "dev": true, 1078 | "dependencies": { 1079 | "ms": "^2.1.1" 1080 | } 1081 | }, 1082 | "node_modules/nodemon/node_modules/has-flag": { 1083 | "version": "3.0.0", 1084 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1085 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1086 | "dev": true, 1087 | "engines": { 1088 | "node": ">=4" 1089 | } 1090 | }, 1091 | "node_modules/nodemon/node_modules/supports-color": { 1092 | "version": "5.5.0", 1093 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1094 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1095 | "dev": true, 1096 | "dependencies": { 1097 | "has-flag": "^3.0.0" 1098 | }, 1099 | "engines": { 1100 | "node": ">=4" 1101 | } 1102 | }, 1103 | "node_modules/nopt": { 1104 | "version": "1.0.10", 1105 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1106 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1107 | "dev": true, 1108 | "dependencies": { 1109 | "abbrev": "1" 1110 | }, 1111 | "bin": { 1112 | "nopt": "bin/nopt.js" 1113 | }, 1114 | "engines": { 1115 | "node": "*" 1116 | } 1117 | }, 1118 | "node_modules/normalize-path": { 1119 | "version": "3.0.0", 1120 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1121 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1122 | "dev": true, 1123 | "engines": { 1124 | "node": ">=0.10.0" 1125 | } 1126 | }, 1127 | "node_modules/npm-watch": { 1128 | "version": "0.11.0", 1129 | "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.11.0.tgz", 1130 | "integrity": "sha512-wAOd0moNX2kSA2FNvt8+7ORwYaJpQ1ZoWjUYdb1bBCxq4nkWuU0IiJa9VpVxrj5Ks+FGXQd62OC/Bjk0aSr+dg==", 1131 | "dev": true, 1132 | "dependencies": { 1133 | "nodemon": "^2.0.7", 1134 | "through2": "^4.0.2" 1135 | }, 1136 | "bin": { 1137 | "npm-watch": "cli.js" 1138 | } 1139 | }, 1140 | "node_modules/once": { 1141 | "version": "1.4.0", 1142 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1143 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1144 | "dev": true, 1145 | "dependencies": { 1146 | "wrappy": "1" 1147 | } 1148 | }, 1149 | "node_modules/optionator": { 1150 | "version": "0.9.1", 1151 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1152 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1153 | "dev": true, 1154 | "dependencies": { 1155 | "deep-is": "^0.1.3", 1156 | "fast-levenshtein": "^2.0.6", 1157 | "levn": "^0.4.1", 1158 | "prelude-ls": "^1.2.1", 1159 | "type-check": "^0.4.0", 1160 | "word-wrap": "^1.2.3" 1161 | }, 1162 | "engines": { 1163 | "node": ">= 0.8.0" 1164 | } 1165 | }, 1166 | "node_modules/p-limit": { 1167 | "version": "3.1.0", 1168 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1169 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1170 | "dev": true, 1171 | "dependencies": { 1172 | "yocto-queue": "^0.1.0" 1173 | }, 1174 | "engines": { 1175 | "node": ">=10" 1176 | }, 1177 | "funding": { 1178 | "url": "https://github.com/sponsors/sindresorhus" 1179 | } 1180 | }, 1181 | "node_modules/p-locate": { 1182 | "version": "5.0.0", 1183 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1184 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1185 | "dev": true, 1186 | "dependencies": { 1187 | "p-limit": "^3.0.2" 1188 | }, 1189 | "engines": { 1190 | "node": ">=10" 1191 | }, 1192 | "funding": { 1193 | "url": "https://github.com/sponsors/sindresorhus" 1194 | } 1195 | }, 1196 | "node_modules/parent-module": { 1197 | "version": "1.0.1", 1198 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1199 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1200 | "dev": true, 1201 | "dependencies": { 1202 | "callsites": "^3.0.0" 1203 | }, 1204 | "engines": { 1205 | "node": ">=6" 1206 | } 1207 | }, 1208 | "node_modules/path-exists": { 1209 | "version": "4.0.0", 1210 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1211 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1212 | "dev": true, 1213 | "engines": { 1214 | "node": ">=8" 1215 | } 1216 | }, 1217 | "node_modules/path-is-absolute": { 1218 | "version": "1.0.1", 1219 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1220 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1221 | "dev": true, 1222 | "engines": { 1223 | "node": ">=0.10.0" 1224 | } 1225 | }, 1226 | "node_modules/path-key": { 1227 | "version": "3.1.1", 1228 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1229 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1230 | "dev": true, 1231 | "engines": { 1232 | "node": ">=8" 1233 | } 1234 | }, 1235 | "node_modules/path-type": { 1236 | "version": "4.0.0", 1237 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1238 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1239 | "dev": true, 1240 | "engines": { 1241 | "node": ">=8" 1242 | } 1243 | }, 1244 | "node_modules/picomatch": { 1245 | "version": "2.3.1", 1246 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1247 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1248 | "dev": true, 1249 | "engines": { 1250 | "node": ">=8.6" 1251 | }, 1252 | "funding": { 1253 | "url": "https://github.com/sponsors/jonschlinkert" 1254 | } 1255 | }, 1256 | "node_modules/prelude-ls": { 1257 | "version": "1.2.1", 1258 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1259 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1260 | "dev": true, 1261 | "engines": { 1262 | "node": ">= 0.8.0" 1263 | } 1264 | }, 1265 | "node_modules/prettier": { 1266 | "version": "2.7.1", 1267 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", 1268 | "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", 1269 | "dev": true, 1270 | "bin": { 1271 | "prettier": "bin-prettier.js" 1272 | }, 1273 | "engines": { 1274 | "node": ">=10.13.0" 1275 | }, 1276 | "funding": { 1277 | "url": "https://github.com/prettier/prettier?sponsor=1" 1278 | } 1279 | }, 1280 | "node_modules/pstree.remy": { 1281 | "version": "1.1.8", 1282 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1283 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1284 | "dev": true 1285 | }, 1286 | "node_modules/punycode": { 1287 | "version": "2.1.1", 1288 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1289 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1290 | "dev": true, 1291 | "engines": { 1292 | "node": ">=6" 1293 | } 1294 | }, 1295 | "node_modules/queue-microtask": { 1296 | "version": "1.2.3", 1297 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1298 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1299 | "dev": true, 1300 | "funding": [ 1301 | { 1302 | "type": "github", 1303 | "url": "https://github.com/sponsors/feross" 1304 | }, 1305 | { 1306 | "type": "patreon", 1307 | "url": "https://www.patreon.com/feross" 1308 | }, 1309 | { 1310 | "type": "consulting", 1311 | "url": "https://feross.org/support" 1312 | } 1313 | ] 1314 | }, 1315 | "node_modules/readable-stream": { 1316 | "version": "3.6.0", 1317 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1318 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1319 | "dev": true, 1320 | "dependencies": { 1321 | "inherits": "^2.0.3", 1322 | "string_decoder": "^1.1.1", 1323 | "util-deprecate": "^1.0.1" 1324 | }, 1325 | "engines": { 1326 | "node": ">= 6" 1327 | } 1328 | }, 1329 | "node_modules/readdirp": { 1330 | "version": "3.6.0", 1331 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1332 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1333 | "dev": true, 1334 | "dependencies": { 1335 | "picomatch": "^2.2.1" 1336 | }, 1337 | "engines": { 1338 | "node": ">=8.10.0" 1339 | } 1340 | }, 1341 | "node_modules/regexpp": { 1342 | "version": "3.2.0", 1343 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1344 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1345 | "dev": true, 1346 | "engines": { 1347 | "node": ">=8" 1348 | }, 1349 | "funding": { 1350 | "url": "https://github.com/sponsors/mysticatea" 1351 | } 1352 | }, 1353 | "node_modules/resolve-from": { 1354 | "version": "4.0.0", 1355 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1356 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1357 | "dev": true, 1358 | "engines": { 1359 | "node": ">=4" 1360 | } 1361 | }, 1362 | "node_modules/reusify": { 1363 | "version": "1.0.4", 1364 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1365 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1366 | "dev": true, 1367 | "engines": { 1368 | "iojs": ">=1.0.0", 1369 | "node": ">=0.10.0" 1370 | } 1371 | }, 1372 | "node_modules/rimraf": { 1373 | "version": "3.0.2", 1374 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1375 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1376 | "dev": true, 1377 | "dependencies": { 1378 | "glob": "^7.1.3" 1379 | }, 1380 | "bin": { 1381 | "rimraf": "bin.js" 1382 | }, 1383 | "funding": { 1384 | "url": "https://github.com/sponsors/isaacs" 1385 | } 1386 | }, 1387 | "node_modules/run-parallel": { 1388 | "version": "1.2.0", 1389 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1390 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1391 | "dev": true, 1392 | "funding": [ 1393 | { 1394 | "type": "github", 1395 | "url": "https://github.com/sponsors/feross" 1396 | }, 1397 | { 1398 | "type": "patreon", 1399 | "url": "https://www.patreon.com/feross" 1400 | }, 1401 | { 1402 | "type": "consulting", 1403 | "url": "https://feross.org/support" 1404 | } 1405 | ], 1406 | "dependencies": { 1407 | "queue-microtask": "^1.2.2" 1408 | } 1409 | }, 1410 | "node_modules/safe-buffer": { 1411 | "version": "5.2.1", 1412 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1413 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1414 | "dev": true, 1415 | "funding": [ 1416 | { 1417 | "type": "github", 1418 | "url": "https://github.com/sponsors/feross" 1419 | }, 1420 | { 1421 | "type": "patreon", 1422 | "url": "https://www.patreon.com/feross" 1423 | }, 1424 | { 1425 | "type": "consulting", 1426 | "url": "https://feross.org/support" 1427 | } 1428 | ] 1429 | }, 1430 | "node_modules/semver": { 1431 | "version": "5.7.2", 1432 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 1433 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 1434 | "dev": true, 1435 | "bin": { 1436 | "semver": "bin/semver" 1437 | } 1438 | }, 1439 | "node_modules/shebang-command": { 1440 | "version": "2.0.0", 1441 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1442 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1443 | "dev": true, 1444 | "dependencies": { 1445 | "shebang-regex": "^3.0.0" 1446 | }, 1447 | "engines": { 1448 | "node": ">=8" 1449 | } 1450 | }, 1451 | "node_modules/shebang-regex": { 1452 | "version": "3.0.0", 1453 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1454 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1455 | "dev": true, 1456 | "engines": { 1457 | "node": ">=8" 1458 | } 1459 | }, 1460 | "node_modules/simple-update-notifier": { 1461 | "version": "1.1.0", 1462 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 1463 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 1464 | "dev": true, 1465 | "dependencies": { 1466 | "semver": "~7.0.0" 1467 | }, 1468 | "engines": { 1469 | "node": ">=8.10.0" 1470 | } 1471 | }, 1472 | "node_modules/simple-update-notifier/node_modules/semver": { 1473 | "version": "7.0.0", 1474 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1475 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1476 | "dev": true, 1477 | "bin": { 1478 | "semver": "bin/semver.js" 1479 | } 1480 | }, 1481 | "node_modules/slash": { 1482 | "version": "3.0.0", 1483 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1484 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1485 | "dev": true, 1486 | "engines": { 1487 | "node": ">=8" 1488 | } 1489 | }, 1490 | "node_modules/string_decoder": { 1491 | "version": "1.3.0", 1492 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1493 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1494 | "dev": true, 1495 | "dependencies": { 1496 | "safe-buffer": "~5.2.0" 1497 | } 1498 | }, 1499 | "node_modules/strip-ansi": { 1500 | "version": "6.0.1", 1501 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1502 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1503 | "dev": true, 1504 | "dependencies": { 1505 | "ansi-regex": "^5.0.1" 1506 | }, 1507 | "engines": { 1508 | "node": ">=8" 1509 | } 1510 | }, 1511 | "node_modules/strip-json-comments": { 1512 | "version": "3.1.1", 1513 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1514 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1515 | "dev": true, 1516 | "engines": { 1517 | "node": ">=8" 1518 | }, 1519 | "funding": { 1520 | "url": "https://github.com/sponsors/sindresorhus" 1521 | } 1522 | }, 1523 | "node_modules/supports-color": { 1524 | "version": "7.2.0", 1525 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1526 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1527 | "dev": true, 1528 | "dependencies": { 1529 | "has-flag": "^4.0.0" 1530 | }, 1531 | "engines": { 1532 | "node": ">=8" 1533 | } 1534 | }, 1535 | "node_modules/text-table": { 1536 | "version": "0.2.0", 1537 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1538 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1539 | "dev": true 1540 | }, 1541 | "node_modules/three": { 1542 | "version": "0.149.0", 1543 | "resolved": "https://registry.npmjs.org/three/-/three-0.149.0.tgz", 1544 | "integrity": "sha512-tohpUxPDht0qExRLDTM8sjRLc5d9STURNrdnK3w9A+V4pxaTBfKWWT/IqtiLfg23Vfc3Z+ImNfvRw1/0CtxrkQ==", 1545 | "peer": true 1546 | }, 1547 | "node_modules/through2": { 1548 | "version": "4.0.2", 1549 | "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", 1550 | "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", 1551 | "dev": true, 1552 | "dependencies": { 1553 | "readable-stream": "3" 1554 | } 1555 | }, 1556 | "node_modules/to-regex-range": { 1557 | "version": "5.0.1", 1558 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1559 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1560 | "dev": true, 1561 | "dependencies": { 1562 | "is-number": "^7.0.0" 1563 | }, 1564 | "engines": { 1565 | "node": ">=8.0" 1566 | } 1567 | }, 1568 | "node_modules/touch": { 1569 | "version": "3.1.0", 1570 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1571 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1572 | "dev": true, 1573 | "dependencies": { 1574 | "nopt": "~1.0.10" 1575 | }, 1576 | "bin": { 1577 | "nodetouch": "bin/nodetouch.js" 1578 | } 1579 | }, 1580 | "node_modules/type-check": { 1581 | "version": "0.4.0", 1582 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1583 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1584 | "dev": true, 1585 | "dependencies": { 1586 | "prelude-ls": "^1.2.1" 1587 | }, 1588 | "engines": { 1589 | "node": ">= 0.8.0" 1590 | } 1591 | }, 1592 | "node_modules/type-fest": { 1593 | "version": "0.20.2", 1594 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1595 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1596 | "dev": true, 1597 | "engines": { 1598 | "node": ">=10" 1599 | }, 1600 | "funding": { 1601 | "url": "https://github.com/sponsors/sindresorhus" 1602 | } 1603 | }, 1604 | "node_modules/typescript": { 1605 | "version": "4.8.2", 1606 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 1607 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 1608 | "dev": true, 1609 | "bin": { 1610 | "tsc": "bin/tsc", 1611 | "tsserver": "bin/tsserver" 1612 | }, 1613 | "engines": { 1614 | "node": ">=4.2.0" 1615 | } 1616 | }, 1617 | "node_modules/undefsafe": { 1618 | "version": "2.0.5", 1619 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1620 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1621 | "dev": true 1622 | }, 1623 | "node_modules/uri-js": { 1624 | "version": "4.4.1", 1625 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1626 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1627 | "dev": true, 1628 | "dependencies": { 1629 | "punycode": "^2.1.0" 1630 | } 1631 | }, 1632 | "node_modules/util-deprecate": { 1633 | "version": "1.0.2", 1634 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1635 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1636 | "dev": true 1637 | }, 1638 | "node_modules/which": { 1639 | "version": "2.0.2", 1640 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1641 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1642 | "dev": true, 1643 | "dependencies": { 1644 | "isexe": "^2.0.0" 1645 | }, 1646 | "bin": { 1647 | "node-which": "bin/node-which" 1648 | }, 1649 | "engines": { 1650 | "node": ">= 8" 1651 | } 1652 | }, 1653 | "node_modules/word-wrap": { 1654 | "version": "1.2.5", 1655 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1656 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1657 | "dev": true, 1658 | "engines": { 1659 | "node": ">=0.10.0" 1660 | } 1661 | }, 1662 | "node_modules/wrappy": { 1663 | "version": "1.0.2", 1664 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1665 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1666 | "dev": true 1667 | }, 1668 | "node_modules/yocto-queue": { 1669 | "version": "0.1.0", 1670 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1671 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1672 | "dev": true, 1673 | "engines": { 1674 | "node": ">=10" 1675 | }, 1676 | "funding": { 1677 | "url": "https://github.com/sponsors/sindresorhus" 1678 | } 1679 | } 1680 | }, 1681 | "dependencies": { 1682 | "@eslint/eslintrc": { 1683 | "version": "1.3.1", 1684 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", 1685 | "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", 1686 | "dev": true, 1687 | "requires": { 1688 | "ajv": "^6.12.4", 1689 | "debug": "^4.3.2", 1690 | "espree": "^9.4.0", 1691 | "globals": "^13.15.0", 1692 | "ignore": "^5.2.0", 1693 | "import-fresh": "^3.2.1", 1694 | "js-yaml": "^4.1.0", 1695 | "minimatch": "^3.1.2", 1696 | "strip-json-comments": "^3.1.1" 1697 | } 1698 | }, 1699 | "@humanwhocodes/config-array": { 1700 | "version": "0.10.4", 1701 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", 1702 | "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", 1703 | "dev": true, 1704 | "requires": { 1705 | "@humanwhocodes/object-schema": "^1.2.1", 1706 | "debug": "^4.1.1", 1707 | "minimatch": "^3.0.4" 1708 | } 1709 | }, 1710 | "@humanwhocodes/gitignore-to-minimatch": { 1711 | "version": "1.0.2", 1712 | "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", 1713 | "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", 1714 | "dev": true 1715 | }, 1716 | "@humanwhocodes/module-importer": { 1717 | "version": "1.0.1", 1718 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 1719 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 1720 | "dev": true 1721 | }, 1722 | "@humanwhocodes/object-schema": { 1723 | "version": "1.2.1", 1724 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 1725 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 1726 | "dev": true 1727 | }, 1728 | "@nodelib/fs.scandir": { 1729 | "version": "2.1.5", 1730 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1731 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1732 | "dev": true, 1733 | "requires": { 1734 | "@nodelib/fs.stat": "2.0.5", 1735 | "run-parallel": "^1.1.9" 1736 | } 1737 | }, 1738 | "@nodelib/fs.stat": { 1739 | "version": "2.0.5", 1740 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1741 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1742 | "dev": true 1743 | }, 1744 | "@nodelib/fs.walk": { 1745 | "version": "1.2.8", 1746 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1747 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1748 | "dev": true, 1749 | "requires": { 1750 | "@nodelib/fs.scandir": "2.1.5", 1751 | "fastq": "^1.6.0" 1752 | } 1753 | }, 1754 | "@types/node": { 1755 | "version": "18.7.13", 1756 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", 1757 | "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==", 1758 | "dev": true 1759 | }, 1760 | "@types/three": { 1761 | "version": "0.149.0", 1762 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.149.0.tgz", 1763 | "integrity": "sha512-fgNBm9LWc65ER/W0cvoXdC0iMy7Ke9e2CONmEr6Jt8sDSY3sw4DgOubZfmdZ747dkPhbQrgRQAWwDEr2S/7IEg==", 1764 | "dev": true, 1765 | "requires": { 1766 | "@types/webxr": "*" 1767 | } 1768 | }, 1769 | "@types/webxr": { 1770 | "version": "0.5.1", 1771 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.1.tgz", 1772 | "integrity": "sha512-xlFXPfgJR5vIuDefhaHuUM9uUgvPaXB6GKdXy2gdEh8gBWQZ2ul24AJz3foUd8NNKlSTQuWYJpCb1/pL81m1KQ==", 1773 | "dev": true 1774 | }, 1775 | "abbrev": { 1776 | "version": "1.1.1", 1777 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1778 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1779 | "dev": true 1780 | }, 1781 | "acorn": { 1782 | "version": "8.8.0", 1783 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 1784 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 1785 | "dev": true 1786 | }, 1787 | "acorn-jsx": { 1788 | "version": "5.3.2", 1789 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1790 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1791 | "dev": true, 1792 | "requires": {} 1793 | }, 1794 | "ajv": { 1795 | "version": "6.12.6", 1796 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1797 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1798 | "dev": true, 1799 | "requires": { 1800 | "fast-deep-equal": "^3.1.1", 1801 | "fast-json-stable-stringify": "^2.0.0", 1802 | "json-schema-traverse": "^0.4.1", 1803 | "uri-js": "^4.2.2" 1804 | } 1805 | }, 1806 | "ansi-regex": { 1807 | "version": "5.0.1", 1808 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1809 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1810 | "dev": true 1811 | }, 1812 | "ansi-styles": { 1813 | "version": "4.3.0", 1814 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1815 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1816 | "dev": true, 1817 | "requires": { 1818 | "color-convert": "^2.0.1" 1819 | } 1820 | }, 1821 | "anymatch": { 1822 | "version": "3.1.3", 1823 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1824 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1825 | "dev": true, 1826 | "requires": { 1827 | "normalize-path": "^3.0.0", 1828 | "picomatch": "^2.0.4" 1829 | } 1830 | }, 1831 | "argparse": { 1832 | "version": "2.0.1", 1833 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1834 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1835 | "dev": true 1836 | }, 1837 | "array-union": { 1838 | "version": "2.1.0", 1839 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 1840 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 1841 | "dev": true 1842 | }, 1843 | "balanced-match": { 1844 | "version": "1.0.2", 1845 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1846 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1847 | "dev": true 1848 | }, 1849 | "binary-extensions": { 1850 | "version": "2.2.0", 1851 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1852 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1853 | "dev": true 1854 | }, 1855 | "brace-expansion": { 1856 | "version": "1.1.11", 1857 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1858 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1859 | "dev": true, 1860 | "requires": { 1861 | "balanced-match": "^1.0.0", 1862 | "concat-map": "0.0.1" 1863 | } 1864 | }, 1865 | "braces": { 1866 | "version": "3.0.2", 1867 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1868 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1869 | "dev": true, 1870 | "requires": { 1871 | "fill-range": "^7.0.1" 1872 | } 1873 | }, 1874 | "callsites": { 1875 | "version": "3.1.0", 1876 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1877 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1878 | "dev": true 1879 | }, 1880 | "chalk": { 1881 | "version": "4.1.2", 1882 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1883 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1884 | "dev": true, 1885 | "requires": { 1886 | "ansi-styles": "^4.1.0", 1887 | "supports-color": "^7.1.0" 1888 | } 1889 | }, 1890 | "chokidar": { 1891 | "version": "3.5.3", 1892 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1893 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1894 | "dev": true, 1895 | "requires": { 1896 | "anymatch": "~3.1.2", 1897 | "braces": "~3.0.2", 1898 | "fsevents": "~2.3.2", 1899 | "glob-parent": "~5.1.2", 1900 | "is-binary-path": "~2.1.0", 1901 | "is-glob": "~4.0.1", 1902 | "normalize-path": "~3.0.0", 1903 | "readdirp": "~3.6.0" 1904 | }, 1905 | "dependencies": { 1906 | "glob-parent": { 1907 | "version": "5.1.2", 1908 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1909 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1910 | "dev": true, 1911 | "requires": { 1912 | "is-glob": "^4.0.1" 1913 | } 1914 | } 1915 | } 1916 | }, 1917 | "color-convert": { 1918 | "version": "2.0.1", 1919 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1920 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1921 | "dev": true, 1922 | "requires": { 1923 | "color-name": "~1.1.4" 1924 | } 1925 | }, 1926 | "color-name": { 1927 | "version": "1.1.4", 1928 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1929 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1930 | "dev": true 1931 | }, 1932 | "concat-map": { 1933 | "version": "0.0.1", 1934 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1935 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1936 | "dev": true 1937 | }, 1938 | "cross-spawn": { 1939 | "version": "7.0.3", 1940 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1941 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1942 | "dev": true, 1943 | "requires": { 1944 | "path-key": "^3.1.0", 1945 | "shebang-command": "^2.0.0", 1946 | "which": "^2.0.1" 1947 | } 1948 | }, 1949 | "debug": { 1950 | "version": "4.3.4", 1951 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1952 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1953 | "dev": true, 1954 | "requires": { 1955 | "ms": "2.1.2" 1956 | } 1957 | }, 1958 | "deep-is": { 1959 | "version": "0.1.4", 1960 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1961 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1962 | "dev": true 1963 | }, 1964 | "dir-glob": { 1965 | "version": "3.0.1", 1966 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1967 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1968 | "dev": true, 1969 | "requires": { 1970 | "path-type": "^4.0.0" 1971 | } 1972 | }, 1973 | "doctrine": { 1974 | "version": "3.0.0", 1975 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1976 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1977 | "dev": true, 1978 | "requires": { 1979 | "esutils": "^2.0.2" 1980 | } 1981 | }, 1982 | "escape-string-regexp": { 1983 | "version": "4.0.0", 1984 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1985 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1986 | "dev": true 1987 | }, 1988 | "eslint": { 1989 | "version": "8.23.0", 1990 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", 1991 | "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", 1992 | "dev": true, 1993 | "requires": { 1994 | "@eslint/eslintrc": "^1.3.1", 1995 | "@humanwhocodes/config-array": "^0.10.4", 1996 | "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", 1997 | "@humanwhocodes/module-importer": "^1.0.1", 1998 | "ajv": "^6.10.0", 1999 | "chalk": "^4.0.0", 2000 | "cross-spawn": "^7.0.2", 2001 | "debug": "^4.3.2", 2002 | "doctrine": "^3.0.0", 2003 | "escape-string-regexp": "^4.0.0", 2004 | "eslint-scope": "^7.1.1", 2005 | "eslint-utils": "^3.0.0", 2006 | "eslint-visitor-keys": "^3.3.0", 2007 | "espree": "^9.4.0", 2008 | "esquery": "^1.4.0", 2009 | "esutils": "^2.0.2", 2010 | "fast-deep-equal": "^3.1.3", 2011 | "file-entry-cache": "^6.0.1", 2012 | "find-up": "^5.0.0", 2013 | "functional-red-black-tree": "^1.0.1", 2014 | "glob-parent": "^6.0.1", 2015 | "globals": "^13.15.0", 2016 | "globby": "^11.1.0", 2017 | "grapheme-splitter": "^1.0.4", 2018 | "ignore": "^5.2.0", 2019 | "import-fresh": "^3.0.0", 2020 | "imurmurhash": "^0.1.4", 2021 | "is-glob": "^4.0.0", 2022 | "js-yaml": "^4.1.0", 2023 | "json-stable-stringify-without-jsonify": "^1.0.1", 2024 | "levn": "^0.4.1", 2025 | "lodash.merge": "^4.6.2", 2026 | "minimatch": "^3.1.2", 2027 | "natural-compare": "^1.4.0", 2028 | "optionator": "^0.9.1", 2029 | "regexpp": "^3.2.0", 2030 | "strip-ansi": "^6.0.1", 2031 | "strip-json-comments": "^3.1.0", 2032 | "text-table": "^0.2.0" 2033 | } 2034 | }, 2035 | "eslint-config-prettier": { 2036 | "version": "8.5.0", 2037 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", 2038 | "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", 2039 | "dev": true, 2040 | "requires": {} 2041 | }, 2042 | "eslint-scope": { 2043 | "version": "7.1.1", 2044 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 2045 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 2046 | "dev": true, 2047 | "requires": { 2048 | "esrecurse": "^4.3.0", 2049 | "estraverse": "^5.2.0" 2050 | } 2051 | }, 2052 | "eslint-utils": { 2053 | "version": "3.0.0", 2054 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 2055 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 2056 | "dev": true, 2057 | "requires": { 2058 | "eslint-visitor-keys": "^2.0.0" 2059 | }, 2060 | "dependencies": { 2061 | "eslint-visitor-keys": { 2062 | "version": "2.1.0", 2063 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 2064 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 2065 | "dev": true 2066 | } 2067 | } 2068 | }, 2069 | "eslint-visitor-keys": { 2070 | "version": "3.3.0", 2071 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 2072 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 2073 | "dev": true 2074 | }, 2075 | "espree": { 2076 | "version": "9.4.0", 2077 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", 2078 | "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", 2079 | "dev": true, 2080 | "requires": { 2081 | "acorn": "^8.8.0", 2082 | "acorn-jsx": "^5.3.2", 2083 | "eslint-visitor-keys": "^3.3.0" 2084 | } 2085 | }, 2086 | "esquery": { 2087 | "version": "1.4.0", 2088 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 2089 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 2090 | "dev": true, 2091 | "requires": { 2092 | "estraverse": "^5.1.0" 2093 | } 2094 | }, 2095 | "esrecurse": { 2096 | "version": "4.3.0", 2097 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2098 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2099 | "dev": true, 2100 | "requires": { 2101 | "estraverse": "^5.2.0" 2102 | } 2103 | }, 2104 | "estraverse": { 2105 | "version": "5.3.0", 2106 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2107 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2108 | "dev": true 2109 | }, 2110 | "esutils": { 2111 | "version": "2.0.3", 2112 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2113 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2114 | "dev": true 2115 | }, 2116 | "fast-deep-equal": { 2117 | "version": "3.1.3", 2118 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2119 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2120 | "dev": true 2121 | }, 2122 | "fast-glob": { 2123 | "version": "3.2.11", 2124 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 2125 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 2126 | "dev": true, 2127 | "requires": { 2128 | "@nodelib/fs.stat": "^2.0.2", 2129 | "@nodelib/fs.walk": "^1.2.3", 2130 | "glob-parent": "^5.1.2", 2131 | "merge2": "^1.3.0", 2132 | "micromatch": "^4.0.4" 2133 | }, 2134 | "dependencies": { 2135 | "glob-parent": { 2136 | "version": "5.1.2", 2137 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2138 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2139 | "dev": true, 2140 | "requires": { 2141 | "is-glob": "^4.0.1" 2142 | } 2143 | } 2144 | } 2145 | }, 2146 | "fast-json-stable-stringify": { 2147 | "version": "2.1.0", 2148 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2149 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2150 | "dev": true 2151 | }, 2152 | "fast-levenshtein": { 2153 | "version": "2.0.6", 2154 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2155 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2156 | "dev": true 2157 | }, 2158 | "fastq": { 2159 | "version": "1.13.0", 2160 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 2161 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 2162 | "dev": true, 2163 | "requires": { 2164 | "reusify": "^1.0.4" 2165 | } 2166 | }, 2167 | "file-entry-cache": { 2168 | "version": "6.0.1", 2169 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 2170 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 2171 | "dev": true, 2172 | "requires": { 2173 | "flat-cache": "^3.0.4" 2174 | } 2175 | }, 2176 | "fill-range": { 2177 | "version": "7.0.1", 2178 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2179 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2180 | "dev": true, 2181 | "requires": { 2182 | "to-regex-range": "^5.0.1" 2183 | } 2184 | }, 2185 | "find-up": { 2186 | "version": "5.0.0", 2187 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2188 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2189 | "dev": true, 2190 | "requires": { 2191 | "locate-path": "^6.0.0", 2192 | "path-exists": "^4.0.0" 2193 | } 2194 | }, 2195 | "flat-cache": { 2196 | "version": "3.0.4", 2197 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 2198 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 2199 | "dev": true, 2200 | "requires": { 2201 | "flatted": "^3.1.0", 2202 | "rimraf": "^3.0.2" 2203 | } 2204 | }, 2205 | "flatted": { 2206 | "version": "3.2.7", 2207 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 2208 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 2209 | "dev": true 2210 | }, 2211 | "fs.realpath": { 2212 | "version": "1.0.0", 2213 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2214 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 2215 | "dev": true 2216 | }, 2217 | "fsevents": { 2218 | "version": "2.3.2", 2219 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2220 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2221 | "dev": true, 2222 | "optional": true 2223 | }, 2224 | "functional-red-black-tree": { 2225 | "version": "1.0.1", 2226 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 2227 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 2228 | "dev": true 2229 | }, 2230 | "glob": { 2231 | "version": "7.2.3", 2232 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2233 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2234 | "dev": true, 2235 | "requires": { 2236 | "fs.realpath": "^1.0.0", 2237 | "inflight": "^1.0.4", 2238 | "inherits": "2", 2239 | "minimatch": "^3.1.1", 2240 | "once": "^1.3.0", 2241 | "path-is-absolute": "^1.0.0" 2242 | } 2243 | }, 2244 | "glob-parent": { 2245 | "version": "6.0.2", 2246 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2247 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2248 | "dev": true, 2249 | "requires": { 2250 | "is-glob": "^4.0.3" 2251 | } 2252 | }, 2253 | "globals": { 2254 | "version": "13.17.0", 2255 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", 2256 | "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", 2257 | "dev": true, 2258 | "requires": { 2259 | "type-fest": "^0.20.2" 2260 | } 2261 | }, 2262 | "globby": { 2263 | "version": "11.1.0", 2264 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 2265 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 2266 | "dev": true, 2267 | "requires": { 2268 | "array-union": "^2.1.0", 2269 | "dir-glob": "^3.0.1", 2270 | "fast-glob": "^3.2.9", 2271 | "ignore": "^5.2.0", 2272 | "merge2": "^1.4.1", 2273 | "slash": "^3.0.0" 2274 | } 2275 | }, 2276 | "grapheme-splitter": { 2277 | "version": "1.0.4", 2278 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 2279 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 2280 | "dev": true 2281 | }, 2282 | "has-flag": { 2283 | "version": "4.0.0", 2284 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2285 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2286 | "dev": true 2287 | }, 2288 | "ignore": { 2289 | "version": "5.2.0", 2290 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 2291 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 2292 | "dev": true 2293 | }, 2294 | "ignore-by-default": { 2295 | "version": "1.0.1", 2296 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 2297 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 2298 | "dev": true 2299 | }, 2300 | "import-fresh": { 2301 | "version": "3.3.0", 2302 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2303 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2304 | "dev": true, 2305 | "requires": { 2306 | "parent-module": "^1.0.0", 2307 | "resolve-from": "^4.0.0" 2308 | } 2309 | }, 2310 | "imurmurhash": { 2311 | "version": "0.1.4", 2312 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2313 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2314 | "dev": true 2315 | }, 2316 | "inflight": { 2317 | "version": "1.0.6", 2318 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2319 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2320 | "dev": true, 2321 | "requires": { 2322 | "once": "^1.3.0", 2323 | "wrappy": "1" 2324 | } 2325 | }, 2326 | "inherits": { 2327 | "version": "2.0.4", 2328 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2329 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2330 | "dev": true 2331 | }, 2332 | "is-binary-path": { 2333 | "version": "2.1.0", 2334 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2335 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2336 | "dev": true, 2337 | "requires": { 2338 | "binary-extensions": "^2.0.0" 2339 | } 2340 | }, 2341 | "is-extglob": { 2342 | "version": "2.1.1", 2343 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2344 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2345 | "dev": true 2346 | }, 2347 | "is-glob": { 2348 | "version": "4.0.3", 2349 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2350 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2351 | "dev": true, 2352 | "requires": { 2353 | "is-extglob": "^2.1.1" 2354 | } 2355 | }, 2356 | "is-number": { 2357 | "version": "7.0.0", 2358 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2359 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2360 | "dev": true 2361 | }, 2362 | "isexe": { 2363 | "version": "2.0.0", 2364 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2365 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2366 | "dev": true 2367 | }, 2368 | "js-yaml": { 2369 | "version": "4.1.0", 2370 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2371 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2372 | "dev": true, 2373 | "requires": { 2374 | "argparse": "^2.0.1" 2375 | } 2376 | }, 2377 | "json-schema-traverse": { 2378 | "version": "0.4.1", 2379 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2380 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2381 | "dev": true 2382 | }, 2383 | "json-stable-stringify-without-jsonify": { 2384 | "version": "1.0.1", 2385 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2386 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2387 | "dev": true 2388 | }, 2389 | "levn": { 2390 | "version": "0.4.1", 2391 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2392 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2393 | "dev": true, 2394 | "requires": { 2395 | "prelude-ls": "^1.2.1", 2396 | "type-check": "~0.4.0" 2397 | } 2398 | }, 2399 | "locate-path": { 2400 | "version": "6.0.0", 2401 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2402 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2403 | "dev": true, 2404 | "requires": { 2405 | "p-locate": "^5.0.0" 2406 | } 2407 | }, 2408 | "lodash.merge": { 2409 | "version": "4.6.2", 2410 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2411 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2412 | "dev": true 2413 | }, 2414 | "merge2": { 2415 | "version": "1.4.1", 2416 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2417 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2418 | "dev": true 2419 | }, 2420 | "micromatch": { 2421 | "version": "4.0.5", 2422 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2423 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2424 | "dev": true, 2425 | "requires": { 2426 | "braces": "^3.0.2", 2427 | "picomatch": "^2.3.1" 2428 | } 2429 | }, 2430 | "minimatch": { 2431 | "version": "3.1.2", 2432 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2433 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2434 | "dev": true, 2435 | "requires": { 2436 | "brace-expansion": "^1.1.7" 2437 | } 2438 | }, 2439 | "ms": { 2440 | "version": "2.1.2", 2441 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2442 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2443 | "dev": true 2444 | }, 2445 | "natural-compare": { 2446 | "version": "1.4.0", 2447 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2448 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2449 | "dev": true 2450 | }, 2451 | "nodemon": { 2452 | "version": "2.0.20", 2453 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", 2454 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", 2455 | "dev": true, 2456 | "requires": { 2457 | "chokidar": "^3.5.2", 2458 | "debug": "^3.2.7", 2459 | "ignore-by-default": "^1.0.1", 2460 | "minimatch": "^3.1.2", 2461 | "pstree.remy": "^1.1.8", 2462 | "semver": "^5.7.1", 2463 | "simple-update-notifier": "^1.0.7", 2464 | "supports-color": "^5.5.0", 2465 | "touch": "^3.1.0", 2466 | "undefsafe": "^2.0.5" 2467 | }, 2468 | "dependencies": { 2469 | "debug": { 2470 | "version": "3.2.7", 2471 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 2472 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 2473 | "dev": true, 2474 | "requires": { 2475 | "ms": "^2.1.1" 2476 | } 2477 | }, 2478 | "has-flag": { 2479 | "version": "3.0.0", 2480 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2481 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2482 | "dev": true 2483 | }, 2484 | "supports-color": { 2485 | "version": "5.5.0", 2486 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2487 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2488 | "dev": true, 2489 | "requires": { 2490 | "has-flag": "^3.0.0" 2491 | } 2492 | } 2493 | } 2494 | }, 2495 | "nopt": { 2496 | "version": "1.0.10", 2497 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 2498 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 2499 | "dev": true, 2500 | "requires": { 2501 | "abbrev": "1" 2502 | } 2503 | }, 2504 | "normalize-path": { 2505 | "version": "3.0.0", 2506 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2507 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2508 | "dev": true 2509 | }, 2510 | "npm-watch": { 2511 | "version": "0.11.0", 2512 | "resolved": "https://registry.npmjs.org/npm-watch/-/npm-watch-0.11.0.tgz", 2513 | "integrity": "sha512-wAOd0moNX2kSA2FNvt8+7ORwYaJpQ1ZoWjUYdb1bBCxq4nkWuU0IiJa9VpVxrj5Ks+FGXQd62OC/Bjk0aSr+dg==", 2514 | "dev": true, 2515 | "requires": { 2516 | "nodemon": "^2.0.7", 2517 | "through2": "^4.0.2" 2518 | } 2519 | }, 2520 | "once": { 2521 | "version": "1.4.0", 2522 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2523 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2524 | "dev": true, 2525 | "requires": { 2526 | "wrappy": "1" 2527 | } 2528 | }, 2529 | "optionator": { 2530 | "version": "0.9.1", 2531 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2532 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2533 | "dev": true, 2534 | "requires": { 2535 | "deep-is": "^0.1.3", 2536 | "fast-levenshtein": "^2.0.6", 2537 | "levn": "^0.4.1", 2538 | "prelude-ls": "^1.2.1", 2539 | "type-check": "^0.4.0", 2540 | "word-wrap": "^1.2.3" 2541 | } 2542 | }, 2543 | "p-limit": { 2544 | "version": "3.1.0", 2545 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2546 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2547 | "dev": true, 2548 | "requires": { 2549 | "yocto-queue": "^0.1.0" 2550 | } 2551 | }, 2552 | "p-locate": { 2553 | "version": "5.0.0", 2554 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2555 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2556 | "dev": true, 2557 | "requires": { 2558 | "p-limit": "^3.0.2" 2559 | } 2560 | }, 2561 | "parent-module": { 2562 | "version": "1.0.1", 2563 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2564 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2565 | "dev": true, 2566 | "requires": { 2567 | "callsites": "^3.0.0" 2568 | } 2569 | }, 2570 | "path-exists": { 2571 | "version": "4.0.0", 2572 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2573 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2574 | "dev": true 2575 | }, 2576 | "path-is-absolute": { 2577 | "version": "1.0.1", 2578 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2579 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2580 | "dev": true 2581 | }, 2582 | "path-key": { 2583 | "version": "3.1.1", 2584 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2585 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2586 | "dev": true 2587 | }, 2588 | "path-type": { 2589 | "version": "4.0.0", 2590 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2591 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2592 | "dev": true 2593 | }, 2594 | "picomatch": { 2595 | "version": "2.3.1", 2596 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2597 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2598 | "dev": true 2599 | }, 2600 | "prelude-ls": { 2601 | "version": "1.2.1", 2602 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2603 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2604 | "dev": true 2605 | }, 2606 | "prettier": { 2607 | "version": "2.7.1", 2608 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", 2609 | "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", 2610 | "dev": true 2611 | }, 2612 | "pstree.remy": { 2613 | "version": "1.1.8", 2614 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 2615 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 2616 | "dev": true 2617 | }, 2618 | "punycode": { 2619 | "version": "2.1.1", 2620 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2621 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2622 | "dev": true 2623 | }, 2624 | "queue-microtask": { 2625 | "version": "1.2.3", 2626 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2627 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2628 | "dev": true 2629 | }, 2630 | "readable-stream": { 2631 | "version": "3.6.0", 2632 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2633 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2634 | "dev": true, 2635 | "requires": { 2636 | "inherits": "^2.0.3", 2637 | "string_decoder": "^1.1.1", 2638 | "util-deprecate": "^1.0.1" 2639 | } 2640 | }, 2641 | "readdirp": { 2642 | "version": "3.6.0", 2643 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2644 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2645 | "dev": true, 2646 | "requires": { 2647 | "picomatch": "^2.2.1" 2648 | } 2649 | }, 2650 | "regexpp": { 2651 | "version": "3.2.0", 2652 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 2653 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 2654 | "dev": true 2655 | }, 2656 | "resolve-from": { 2657 | "version": "4.0.0", 2658 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2659 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2660 | "dev": true 2661 | }, 2662 | "reusify": { 2663 | "version": "1.0.4", 2664 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2665 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2666 | "dev": true 2667 | }, 2668 | "rimraf": { 2669 | "version": "3.0.2", 2670 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2671 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2672 | "dev": true, 2673 | "requires": { 2674 | "glob": "^7.1.3" 2675 | } 2676 | }, 2677 | "run-parallel": { 2678 | "version": "1.2.0", 2679 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2680 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2681 | "dev": true, 2682 | "requires": { 2683 | "queue-microtask": "^1.2.2" 2684 | } 2685 | }, 2686 | "safe-buffer": { 2687 | "version": "5.2.1", 2688 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2689 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2690 | "dev": true 2691 | }, 2692 | "semver": { 2693 | "version": "5.7.2", 2694 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 2695 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 2696 | "dev": true 2697 | }, 2698 | "shebang-command": { 2699 | "version": "2.0.0", 2700 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2701 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2702 | "dev": true, 2703 | "requires": { 2704 | "shebang-regex": "^3.0.0" 2705 | } 2706 | }, 2707 | "shebang-regex": { 2708 | "version": "3.0.0", 2709 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2710 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2711 | "dev": true 2712 | }, 2713 | "simple-update-notifier": { 2714 | "version": "1.1.0", 2715 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 2716 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 2717 | "dev": true, 2718 | "requires": { 2719 | "semver": "~7.0.0" 2720 | }, 2721 | "dependencies": { 2722 | "semver": { 2723 | "version": "7.0.0", 2724 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 2725 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 2726 | "dev": true 2727 | } 2728 | } 2729 | }, 2730 | "slash": { 2731 | "version": "3.0.0", 2732 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2733 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2734 | "dev": true 2735 | }, 2736 | "string_decoder": { 2737 | "version": "1.3.0", 2738 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2739 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2740 | "dev": true, 2741 | "requires": { 2742 | "safe-buffer": "~5.2.0" 2743 | } 2744 | }, 2745 | "strip-ansi": { 2746 | "version": "6.0.1", 2747 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2748 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2749 | "dev": true, 2750 | "requires": { 2751 | "ansi-regex": "^5.0.1" 2752 | } 2753 | }, 2754 | "strip-json-comments": { 2755 | "version": "3.1.1", 2756 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2757 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2758 | "dev": true 2759 | }, 2760 | "supports-color": { 2761 | "version": "7.2.0", 2762 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2763 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2764 | "dev": true, 2765 | "requires": { 2766 | "has-flag": "^4.0.0" 2767 | } 2768 | }, 2769 | "text-table": { 2770 | "version": "0.2.0", 2771 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2772 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2773 | "dev": true 2774 | }, 2775 | "three": { 2776 | "version": "0.149.0", 2777 | "resolved": "https://registry.npmjs.org/three/-/three-0.149.0.tgz", 2778 | "integrity": "sha512-tohpUxPDht0qExRLDTM8sjRLc5d9STURNrdnK3w9A+V4pxaTBfKWWT/IqtiLfg23Vfc3Z+ImNfvRw1/0CtxrkQ==", 2779 | "peer": true 2780 | }, 2781 | "through2": { 2782 | "version": "4.0.2", 2783 | "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", 2784 | "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", 2785 | "dev": true, 2786 | "requires": { 2787 | "readable-stream": "3" 2788 | } 2789 | }, 2790 | "to-regex-range": { 2791 | "version": "5.0.1", 2792 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2793 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2794 | "dev": true, 2795 | "requires": { 2796 | "is-number": "^7.0.0" 2797 | } 2798 | }, 2799 | "touch": { 2800 | "version": "3.1.0", 2801 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 2802 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 2803 | "dev": true, 2804 | "requires": { 2805 | "nopt": "~1.0.10" 2806 | } 2807 | }, 2808 | "type-check": { 2809 | "version": "0.4.0", 2810 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2811 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2812 | "dev": true, 2813 | "requires": { 2814 | "prelude-ls": "^1.2.1" 2815 | } 2816 | }, 2817 | "type-fest": { 2818 | "version": "0.20.2", 2819 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2820 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2821 | "dev": true 2822 | }, 2823 | "typescript": { 2824 | "version": "4.8.2", 2825 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", 2826 | "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", 2827 | "dev": true 2828 | }, 2829 | "undefsafe": { 2830 | "version": "2.0.5", 2831 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 2832 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 2833 | "dev": true 2834 | }, 2835 | "uri-js": { 2836 | "version": "4.4.1", 2837 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2838 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2839 | "dev": true, 2840 | "requires": { 2841 | "punycode": "^2.1.0" 2842 | } 2843 | }, 2844 | "util-deprecate": { 2845 | "version": "1.0.2", 2846 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2847 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2848 | "dev": true 2849 | }, 2850 | "which": { 2851 | "version": "2.0.2", 2852 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2853 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2854 | "dev": true, 2855 | "requires": { 2856 | "isexe": "^2.0.0" 2857 | } 2858 | }, 2859 | "word-wrap": { 2860 | "version": "1.2.5", 2861 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2862 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2863 | "dev": true 2864 | }, 2865 | "wrappy": { 2866 | "version": "1.0.2", 2867 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2868 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2869 | "dev": true 2870 | }, 2871 | "yocto-queue": { 2872 | "version": "0.1.0", 2873 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2874 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2875 | "dev": true 2876 | } 2877 | } 2878 | } 2879 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xrkeys", 3 | "version": "0.1.1", 4 | "description": "Super performant WebXR keyboard", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "files": [ 8 | "dist" 9 | ], 10 | "scripts": { 11 | "build:src": "tsc && cp ./src/xrkeys.glb ./dist", 12 | "build:example": "cd example && npm run build", 13 | "build": "npm run build:src && npm run build:example", 14 | "format": "prettier --write ./src/**/*", 15 | "test": "echo \"Error: no test specified\" && exit 1", 16 | "prepublishOnly": "npm run build", 17 | "watch": "npm-watch" 18 | }, 19 | "watch": { 20 | "build:src": { 21 | "patterns": [ 22 | "src" 23 | ], 24 | "extensions": "ts", 25 | "quiet": false 26 | } 27 | }, 28 | "repository": { 29 | "type": "git", 30 | "url": "git+https://github.com/felixtrz/logxr.git" 31 | }, 32 | "keywords": [ 33 | "game", 34 | "html5", 35 | "threejs", 36 | "webxr", 37 | "webvr", 38 | "keyboard", 39 | "input", 40 | "devtool", 41 | "devtools" 42 | ], 43 | "author": "Felix Zhang ", 44 | "license": "MIT", 45 | "bugs": { 46 | "url": "https://github.com/felixtrz/xrkeys/issues" 47 | }, 48 | "homepage": "https://github.com/felixtrz/xrkeys#readme", 49 | "devDependencies": { 50 | "@types/node": "^18.7.13", 51 | "@types/three": "^0.149.0", 52 | "eslint": "^8.23.0", 53 | "eslint-config-prettier": "^8.5.0", 54 | "npm-watch": "^0.11.0", 55 | "prettier": "^2.7.1", 56 | "typescript": "^4.8.2" 57 | }, 58 | "peerDependencies": { 59 | "three": "^0.149.0" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | 3 | import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; 4 | 5 | const KEY_MAPPING = { 6 | key1: ['q', 'Q', '1'], 7 | key2: ['w', 'W', '2'], 8 | key3: ['e', 'E', '3'], 9 | key4: ['r', 'R', '4'], 10 | key5: ['t', 'T', '5'], 11 | key6: ['y', 'Y', '6'], 12 | key7: ['u', 'U', '7'], 13 | key8: ['i', 'I', '8'], 14 | key9: ['o', 'O', '9'], 15 | key10: ['p', 'P', '0'], 16 | key11: ['a', 'A', '@'], 17 | key12: ['s', 'S', '#'], 18 | key13: ['d', 'D', '$'], 19 | key14: ['f', 'F', '&'], 20 | key15: ['g', 'G', '*'], 21 | key16: ['h', 'H', '('], 22 | key17: ['j', 'J', ')'], 23 | key18: ['k', 'K', "'"], 24 | key19: ['l', 'L', '"'], 25 | key21: ['z', 'Z', '-'], 26 | key22: ['x', 'X', '+'], 27 | key23: ['c', 'C', '='], 28 | key24: ['v', 'V', '/'], 29 | key25: ['b', 'B', ';'], 30 | key26: ['n', 'N', ':'], 31 | key27: ['m', 'M', '_'], 32 | key28: [',', ',', '!'], 33 | key29: ['.', '.', '?'], 34 | keyspace: [' ', ' ', ' '], 35 | }; 36 | 37 | const raycaster = new THREE.Raycaster(); 38 | 39 | const loader = new GLTFLoader(); 40 | 41 | export type XRKeysConfig = { 42 | path?: string; 43 | keyMaskOffset?: number; 44 | hoverColor?: string; 45 | pressedColor?: string; 46 | }; 47 | 48 | export default class XRKeys extends THREE.Group { 49 | private _keyboards: THREE.Mesh[] = []; 50 | 51 | private _keysetIndex = 0; 52 | 53 | private _isUpperCase = false; 54 | 55 | private _isNumber = false; 56 | 57 | private _keys: THREE.Object3D[]; 58 | 59 | private _keyMask: THREE.Mesh; 60 | 61 | private _longKeyMask: THREE.Mesh; 62 | 63 | private _spaceKeyMask: THREE.Mesh; 64 | 65 | private _text: string = ''; 66 | 67 | private _hoveredKey: { 68 | name: string; 69 | pressed: boolean; 70 | } | null = null; 71 | 72 | private _tempVec31 = new THREE.Vector3(); 73 | 74 | private _tempVec32 = new THREE.Vector3(); 75 | 76 | private _hoveredColor: string; 77 | 78 | private _pressedColor: string; 79 | 80 | public onEnter: (text: string) => {}; 81 | 82 | private constructor( 83 | model: THREE.Object3D, 84 | keyMaskOffset = 0.00001, 85 | hoveredColor = '#666E73', 86 | pressedColor = '#ffffff', 87 | ) { 88 | super(); 89 | const lowerCaseKeys = model.getObjectByName('lowercase') as THREE.Mesh; 90 | const keysMaterial = new THREE.MeshBasicMaterial({ 91 | map: (lowerCaseKeys.material as THREE.MeshStandardMaterial).map, 92 | transparent: true, 93 | }); 94 | const upperCaseKeys = model.getObjectByName('uppercase') as THREE.Mesh; 95 | const numbersKeys = model.getObjectByName('number') as THREE.Mesh; 96 | lowerCaseKeys.material = keysMaterial; 97 | upperCaseKeys.material = keysMaterial; 98 | numbersKeys.material = keysMaterial; 99 | upperCaseKeys.visible = false; 100 | numbersKeys.visible = false; 101 | 102 | this._keyboards.push(lowerCaseKeys, upperCaseKeys, numbersKeys); 103 | 104 | const keymaskMaterial = new THREE.MeshBasicMaterial(); 105 | this._keyMask = model.getObjectByName('shortkeymask') as THREE.Mesh; 106 | this._longKeyMask = model.getObjectByName('longkeymask') as THREE.Mesh; 107 | this._spaceKeyMask = model.getObjectByName('spacemask') as THREE.Mesh; 108 | this._keyMask.material = keymaskMaterial; 109 | this._longKeyMask.material = keymaskMaterial; 110 | this._spaceKeyMask.material = keymaskMaterial; 111 | this._keyMask.position.y = keyMaskOffset; 112 | this._longKeyMask.position.y = keyMaskOffset; 113 | this._spaceKeyMask.position.y = keyMaskOffset; 114 | this._keyMask.visible = false; 115 | this._longKeyMask.visible = false; 116 | this._spaceKeyMask.visible = false; 117 | 118 | this._keys = model.children.filter((child) => child.name.startsWith('key')); 119 | 120 | this._hoveredColor = hoveredColor; 121 | 122 | this._pressedColor = pressedColor; 123 | 124 | this.add( 125 | ...this._keyboards, 126 | this._keyMask, 127 | this._longKeyMask, 128 | this._spaceKeyMask, 129 | ); 130 | } 131 | 132 | public static async create(config: XRKeysConfig = {}) { 133 | const model = await loader.loadAsync( 134 | config.path ?? 'https://www.unpkg.com/xrkeys/dist/xrkeys.glb', 135 | ); 136 | return new XRKeys(model.scene, config.keyMaskOffset); 137 | } 138 | 139 | public get activeKeyboard() { 140 | return this._keyboards[this._keysetIndex]; 141 | } 142 | 143 | public get activeKeysetIndex() { 144 | return this._keysetIndex; 145 | } 146 | 147 | public get text() { 148 | return this._text; 149 | } 150 | 151 | private _updateKeyMask( 152 | keyMask: THREE.Mesh, 153 | key: THREE.Object3D, 154 | pressed: boolean, 155 | ) { 156 | keyMask.position.set(key.position.x, 0.00001, key.position.z); 157 | keyMask.visible = true; 158 | (keyMask.material as THREE.MeshBasicMaterial).color.set( 159 | pressed ? this._pressedColor : this._hoveredColor, 160 | ); 161 | this._hoveredKey = { name: key.name, pressed }; 162 | } 163 | 164 | public update(targetRaySpace: THREE.Object3D, pressed: boolean) { 165 | this._keyMask.visible = false; 166 | this._longKeyMask.visible = false; 167 | this._spaceKeyMask.visible = false; 168 | this._keyboards.forEach((keyboard) => { 169 | keyboard.visible = false; 170 | keyboard.position.y = -0.01; 171 | }); 172 | const activeKeys = this.activeKeyboard; 173 | activeKeys.visible = true; 174 | activeKeys.position.y = 0; 175 | 176 | const lastHoveredKey = this._hoveredKey; 177 | this._hoveredKey = null; 178 | 179 | raycaster.set( 180 | targetRaySpace.getWorldPosition(this._tempVec31), 181 | targetRaySpace.getWorldDirection(this._tempVec32).negate(), 182 | ); 183 | 184 | const intersect = raycaster.intersectObject(activeKeys, true)[0]; 185 | if (intersect) { 186 | const vec2 = new THREE.Vector2( 187 | (intersect.uv.x - 0.5) * 0.3495, 188 | (intersect.uv.y * 3 - this.activeKeysetIndex - 0.5) * 0.1425, 189 | ); 190 | this._keys.forEach((key) => { 191 | if (['keydelete', 'keyenter', 'keyset'].includes(key.name)) { 192 | if ( 193 | Math.abs(key.position.x - vec2.x) < 0.03225 && 194 | Math.abs(key.position.z - vec2.y) < 0.015 195 | ) { 196 | this._updateKeyMask(this._longKeyMask, key, pressed); 197 | } 198 | } else if (key.name === 'keyspace') { 199 | if ( 200 | Math.abs(key.position.x - vec2.x) < 0.06675 && 201 | Math.abs(key.position.z - vec2.y) < 0.015 202 | ) { 203 | this._updateKeyMask(this._spaceKeyMask, key, pressed); 204 | } 205 | } else if ( 206 | Math.abs(key.position.x - vec2.x) < 0.015 && 207 | Math.abs(key.position.z - vec2.y) < 0.015 208 | ) { 209 | this._updateKeyMask(this._keyMask, key, pressed); 210 | } 211 | }); 212 | if (this._hoveredKey && lastHoveredKey) { 213 | if ( 214 | this._hoveredKey.name === lastHoveredKey.name && 215 | this._hoveredKey.pressed && 216 | !lastHoveredKey.pressed 217 | ) { 218 | const mapped = 219 | KEY_MAPPING[this._hoveredKey.name as keyof typeof KEY_MAPPING]; 220 | if (mapped) { 221 | this._text += mapped[this.activeKeysetIndex]; 222 | this.dispatchEvent({ 223 | type: 'keypress', 224 | target: this, 225 | key: mapped[this.activeKeysetIndex], 226 | }); 227 | } else { 228 | switch (this._hoveredKey.name) { 229 | case 'keydelete': 230 | this._text = this._text.slice(0, -1); 231 | this.dispatchEvent({ 232 | type: 'keypress', 233 | target: this, 234 | key: 'delete', 235 | }); 236 | break; 237 | case 'keyenter': 238 | if (this.onEnter) { 239 | this.onEnter(this._text); 240 | this._text = ''; 241 | } 242 | this.dispatchEvent({ 243 | type: 'keypress', 244 | target: this, 245 | key: 'enter', 246 | }); 247 | break; 248 | case 'key20': 249 | if (this._isNumber) { 250 | this._text += '%'; 251 | this.dispatchEvent({ 252 | type: 'keypress', 253 | target: this, 254 | key: '%', 255 | }); 256 | } else { 257 | this._isUpperCase = !this._isUpperCase; 258 | this._keysetIndex = this._isUpperCase ? 1 : 0; 259 | } 260 | break; 261 | case 'keyset': 262 | if (this._isNumber) { 263 | this._isNumber = false; 264 | this._keysetIndex = this._isUpperCase ? 1 : 0; 265 | } else { 266 | this._isNumber = true; 267 | this._keysetIndex = 2; 268 | } 269 | break; 270 | default: 271 | break; 272 | } 273 | } 274 | } 275 | } 276 | } 277 | } 278 | } 279 | -------------------------------------------------------------------------------- /src/xrkeys.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/felixtrz/xrkeys/5e607b788b1eef50eb5cff8d53bbeb9c33f49a6b/src/xrkeys.glb -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | /* Basic Options */ 5 | // "incremental": true, /* Enable incremental compilation */ 6 | "target": "ESNext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 7 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 8 | // "lib": [], /* Specify library files to be included in the compilation. */ 9 | // "allowJs": true, /* Allow javascript files to be compiled. */ 10 | // "checkJs": true, /* Report errors in .js files. */ 11 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ 12 | "declaration": true /* Generates corresponding '.d.ts' file. */, 13 | "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, 14 | "sourceMap": false /* Generates corresponding '.map' file. */, 15 | // "outFile": "./", /* Concatenate and emit output to single file. */ 16 | "outDir": "dist" /* Redirect output structure to the directory. */, 17 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 18 | // "composite": true, /* Enable project compilation */ 19 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 20 | "removeComments": false /* Do not emit comments to output. */, 21 | // "noEmit": true, /* Do not emit outputs. */ 22 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 23 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 24 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 25 | /* Strict Type-Checking Options */ 26 | "strict": true /* Enable all strict type-checking options. */, 27 | "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, 28 | "strictNullChecks": false /* Enable strict null checks. */, 29 | "strictFunctionTypes": true /* Enable strict checking of function types. */, 30 | "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, 31 | "strictPropertyInitialization": false /* Enable strict checking of property initialization in classes. */, 32 | "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, 33 | "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, 34 | /* Additional Checks */ 35 | "noUnusedLocals": true /* Report errors on unused locals. */, 36 | "noUnusedParameters": true /* Report errors on unused parameters. */, 37 | "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, 38 | "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, 39 | "noUncheckedIndexedAccess": true /* Include 'undefined' in index signature results */, 40 | // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ 41 | /* Module Resolution Options */ 42 | "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, 43 | // "baseUrl": "." /* Base directory to resolve non-absolute module names. */, 44 | // "paths": { }, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 45 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 46 | // "typeRoots": [], /* List of folders to include type definitions from. */ 47 | // "types": [], /* Type declaration files to be included in compilation. */ 48 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 49 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 50 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 51 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 52 | /* Source Map Options */ 53 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 54 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 55 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 56 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 57 | /* Experimental Options */ 58 | "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, 59 | "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, 60 | /* Advanced Options */ 61 | "skipLibCheck": true /* Skip type checking of declaration files. */, 62 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, 63 | "types": ["node"] 64 | }, 65 | "include": ["src/**/*"] 66 | } 67 | --------------------------------------------------------------------------------