├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .nvmrc ├── .prettierrc ├── LICENSE ├── README.md ├── assets ├── 16.png ├── bg.svg ├── dot.png ├── mac.png ├── mac_pointer.png ├── mac_pointer_retina.png ├── mac_retina.png ├── other.png ├── other_pointer.png └── transparent.png ├── control-user-cursor.jpg ├── docs-assets ├── screenshot.png └── thumbnail.jpg ├── index.html ├── index.js ├── package-lock.json ├── package.json ├── setup.js └── style.css /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [*.md] 11 | max_line_length = off 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | }, 6 | extends: 'eslint:recommended', 7 | parserOptions: { 8 | ecmaVersion: 'latest', 9 | sourceType: 'module', 10 | }, 11 | rules: {}, 12 | }; 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /dist 5 | .vercel 6 | /node_modules 7 | /.pnp 8 | .pnp.js 9 | 10 | # testing 11 | /coverage 12 | 13 | # production 14 | /build 15 | 16 | # misc 17 | .DS_Store 18 | .env.local 19 | .env.development.local 20 | .env.test.local 21 | .env.production.local 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18.15 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 80, 4 | "editor.formatOnSave": true, 5 | "proseWrap": "always", 6 | "tabWidth": 2, 7 | "requireConfig": false, 8 | "useTabs": false, 9 | "trailingComma": "es5", 10 | "bracketSpacing": true, 11 | "jsxBracketSameLine": false, 12 | "semi": true 13 | } 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2017, Javier Bórquez 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Control User Cursor 2 | 3 | Small experiment to 'control' the user cursor with JavaScript and CSS. 4 | 5 | [![control-user-cursor](docs-assets/thumbnail.jpg)](https://javier.xyz/control-user-cursor/) 6 | 7 | ## How it works? 8 | 9 | I make the user cursor invisible, and then paint my own cursor with JS! The 10 | `:hover` styles are also fake. 11 | 12 | Most of the math is here 13 | https://github.com/javierbyte/control-user-cursor/blob/master/index.js#L134 14 | -------------------------------------------------------------------------------- /assets/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/16.png -------------------------------------------------------------------------------- /assets/bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/dot.png -------------------------------------------------------------------------------- /assets/mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/mac.png -------------------------------------------------------------------------------- /assets/mac_pointer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/mac_pointer.png -------------------------------------------------------------------------------- /assets/mac_pointer_retina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/mac_pointer_retina.png -------------------------------------------------------------------------------- /assets/mac_retina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/mac_retina.png -------------------------------------------------------------------------------- /assets/other.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/other.png -------------------------------------------------------------------------------- /assets/other_pointer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/other_pointer.png -------------------------------------------------------------------------------- /assets/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/assets/transparent.png -------------------------------------------------------------------------------- /control-user-cursor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/control-user-cursor.jpg -------------------------------------------------------------------------------- /docs-assets/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/docs-assets/screenshot.png -------------------------------------------------------------------------------- /docs-assets/thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/javierbyte/control-user-cursor/c11d82b423f9c3fd361bc64af5e7018f7f9bb179/docs-assets/thumbnail.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Control User Cursor 10 | 11 | 12 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 |
39 |

Control User Cursor

40 | 41 |
42 | Small experiment to alter the cursor behavior. 43 | 47 | How it works?, 49 | 50 | Show Real Cursor 51 | 52 |
53 | 54 | 55 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // config 2 | 3 | const ASSET_CONFIG = { 4 | mac_retina: { 5 | normal: { 6 | src: '/control-user-cursor/assets/mac_retina.png', 7 | height: '22px', 8 | width: '15px', 9 | }, 10 | pointer: { 11 | src: '/control-user-cursor/assets/mac_pointer_retina.png', 12 | width: '18.5px', 13 | height: '19.5px', 14 | }, 15 | }, 16 | mac: { 17 | normal: { 18 | src: '/control-user-cursor/assets/mac.png', 19 | width: '15px', 20 | height: '22px', 21 | }, 22 | pointer: { 23 | src: '/control-user-cursor/assets/mac_pointer.png', 24 | width: '18px', 25 | height: '19px', 26 | }, 27 | }, 28 | other: { 29 | normal: { 30 | src: '/control-user-cursor/assets/other.png', 31 | width: '17px', 32 | height: '23px', 33 | }, 34 | pointer: { 35 | src: '/control-user-cursor/assets/other_pointer.png', 36 | width: '22px', 37 | height: '26px', 38 | }, 39 | }, 40 | }; 41 | 42 | function getCursorInfo() { 43 | let navigator = window.navigator.platform.indexOf('Mac') > -1 ? 'mac' : 'win'; 44 | 45 | if (window.devicePixelRatio > 1) { 46 | navigator += '_retina'; 47 | } 48 | 49 | if (Object.keys(ASSET_CONFIG).includes(navigator)) { 50 | return ASSET_CONFIG[navigator]; 51 | } 52 | 53 | return ASSET_CONFIG.other; 54 | } 55 | 56 | const global = { 57 | mouseX: 0, 58 | mouseY: 0, 59 | trackedAstros: [], 60 | hoverTrackedElements: [], 61 | cursorInfo: getCursorInfo(), 62 | isMouseVisible: false, 63 | }; 64 | const containerEl = document.querySelector('#container'); 65 | const cursorEl = document.querySelector('[data-cursor]'); 66 | 67 | setCursor(global.cursorInfo.normal); 68 | 69 | function setCursor(cursorConfig) { 70 | cursorEl.src = cursorConfig.src; 71 | cursorEl.style.width = cursorConfig.width; 72 | cursorEl.style.height = cursorConfig.height; 73 | } 74 | 75 | window.ControlUserCursor = function ControlUserCursor(config) { 76 | containerEl.innerHTML = ''; 77 | 78 | global.trackedAstros = config.map((newAstroConfig) => { 79 | const astroEl = document.createElement('div'); 80 | astroEl.className = newAstroConfig.className.join(' '); 81 | astroEl.innerHTML = newAstroConfig.innerHTML; 82 | astroEl.style.left = `${newAstroConfig.position[0]}%`; 83 | astroEl.style.top = `${newAstroConfig.position[1]}%`; 84 | containerEl.appendChild(astroEl); 85 | 86 | const clientRect = astroEl.getBoundingClientRect(); 87 | 88 | return { 89 | el: astroEl, 90 | center: { 91 | x: clientRect.left + clientRect.width / 2, 92 | y: clientRect.top + clientRect.height / 2, 93 | }, 94 | ...newAstroConfig, 95 | }; 96 | }); 97 | 98 | onUpdateElementSizes(); 99 | }; 100 | 101 | // UTILS 102 | function polar2cartesian({ distance, angle }) { 103 | return { 104 | x: distance * Math.cos(angle), 105 | y: distance * Math.sin(angle), 106 | }; 107 | } 108 | 109 | function cartesian2polar({ x, y }) { 110 | return { 111 | distance: Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), 112 | angle: Math.atan2(y, x), 113 | }; 114 | } 115 | 116 | const SHORT_RANGE = 0; 117 | const LONG_RANGE = 320; 118 | 119 | function calculateNewCursorPosition(cursor, objects) { 120 | let newCursor = { ...cursor }; 121 | 122 | for (const object of objects) { 123 | const polar = cartesian2polar({ 124 | x: cursor.x - object.center.x, 125 | y: cursor.y - object.center.y, 126 | }); 127 | 128 | let intensity = 0; 129 | if (polar.distance < SHORT_RANGE) { 130 | intensity = 1; 131 | } else if (polar.distance > SHORT_RANGE + LONG_RANGE) { 132 | intensity = 0; 133 | } else { 134 | intensity = 1 - (polar.distance - SHORT_RANGE) / LONG_RANGE; 135 | } 136 | 137 | let newDistance = 0; 138 | if (object.behavior === 'REPEL') { 139 | newDistance = polar.distance + intensity * -40; 140 | } 141 | if (object.behavior === 'ATTRACT') { 142 | newDistance = 143 | polar.distance * (1 - intensity) + polar.distance * 1.5 * intensity; 144 | } 145 | 146 | const modifiedCartesian = polar2cartesian({ 147 | angle: polar.angle, 148 | distance: newDistance, 149 | }); 150 | const paddedModifiedCartesian = { 151 | x: cursor.x - modifiedCartesian.x - object.center.x, 152 | y: cursor.y - modifiedCartesian.y - object.center.y, 153 | }; 154 | 155 | newCursor = { 156 | x: newCursor.x + paddedModifiedCartesian.x, 157 | y: newCursor.y + paddedModifiedCartesian.y, 158 | }; 159 | } 160 | return newCursor; 161 | } 162 | 163 | // iterate over the elements to see if we need to hover anyone 164 | function calculateHover(newCursor) { 165 | let someHovering = false; 166 | global.hoverTrackedElements.forEach((trackedObj) => { 167 | let isHovering = false; 168 | 169 | if ( 170 | trackedObj.rect.x < newCursor.x && 171 | trackedObj.rect.x + trackedObj.rect.width > newCursor.x && 172 | trackedObj.rect.y < newCursor.y && 173 | trackedObj.rect.y + trackedObj.rect.height > newCursor.y 174 | ) { 175 | isHovering = true; 176 | } 177 | 178 | if (isHovering === true) { 179 | trackedObj.el.classList.add('-hover'); 180 | } else if (someHovering === false) { 181 | trackedObj.el.classList.remove('-hover'); 182 | } 183 | 184 | someHovering = someHovering || isHovering; 185 | }); 186 | 187 | if (someHovering === true) { 188 | setCursor(global.cursorInfo.pointer); 189 | } else if (someHovering === false) { 190 | setCursor(global.cursorInfo.normal); 191 | } 192 | } 193 | 194 | // remove the fake cursor when the user moves the real out of the window 195 | function onMouseOut() { 196 | cursorEl.style.opacity = 0; 197 | global.isMouseVisible = false; 198 | } 199 | 200 | // main function that calculates the fake cursor position 201 | function onMouseMove(evt) { 202 | global.mouseX = evt.clientX; 203 | global.mouseY = evt.clientY; 204 | } 205 | 206 | function onClick(evt) { 207 | if (!evt.isTrusted) return; 208 | 209 | const clickedEl = document.querySelector('.-hover'); 210 | 211 | if (!clickedEl) return; 212 | 213 | clickedEl.click(); 214 | } 215 | 216 | function onUpdateElementSizes() { 217 | global.hoverTrackedElements = [ 218 | ...document.querySelectorAll('.-prevent-custom-cursor'), 219 | ].map((el) => { 220 | return { 221 | el, 222 | rect: el.getBoundingClientRect(), 223 | }; 224 | }); 225 | 226 | global.trackedAstros = global.trackedAstros.map((astro) => { 227 | const clientRect = astro.el.getBoundingClientRect(); 228 | 229 | return { 230 | ...astro, 231 | center: { 232 | x: clientRect.left + clientRect.width / 2, 233 | y: clientRect.top + clientRect.height / 2, 234 | }, 235 | }; 236 | }); 237 | } 238 | 239 | window.addEventListener('click', onClick); 240 | window.addEventListener('resize', onUpdateElementSizes); 241 | window.addEventListener('mouseout', onMouseOut); 242 | window.addEventListener('contextmenu', (event) => event.preventDefault()); 243 | window.addEventListener('mousemove', onMouseMove); 244 | 245 | // RENDER 246 | function render() { 247 | if (global.isMouseVisible === false) { 248 | cursorEl.style.opacity = 1; 249 | global.isMouseVisible = true; 250 | } 251 | 252 | const calculatedCursor = calculateNewCursorPosition( 253 | { 254 | x: global.mouseX, 255 | y: global.mouseY, 256 | }, 257 | global.trackedAstros 258 | ); 259 | 260 | calculateHover(calculatedCursor); 261 | 262 | cursorEl.style.transform = 263 | 'translatex(' + 264 | calculatedCursor.x + 265 | 'px) translatey(' + 266 | calculatedCursor.y + 267 | 'px)'; 268 | 269 | window.requestAnimationFrame(render); 270 | } 271 | render(); 272 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "control-user-cursor", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "devDependencies": { 8 | "eslint": "^8.17.0" 9 | } 10 | }, 11 | "node_modules/@eslint/eslintrc": { 12 | "version": "1.3.0", 13 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", 14 | "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", 15 | "dev": true, 16 | "dependencies": { 17 | "ajv": "^6.12.4", 18 | "debug": "^4.3.2", 19 | "espree": "^9.3.2", 20 | "globals": "^13.15.0", 21 | "ignore": "^5.2.0", 22 | "import-fresh": "^3.2.1", 23 | "js-yaml": "^4.1.0", 24 | "minimatch": "^3.1.2", 25 | "strip-json-comments": "^3.1.1" 26 | }, 27 | "engines": { 28 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 29 | } 30 | }, 31 | "node_modules/@humanwhocodes/config-array": { 32 | "version": "0.9.5", 33 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", 34 | "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", 35 | "dev": true, 36 | "dependencies": { 37 | "@humanwhocodes/object-schema": "^1.2.1", 38 | "debug": "^4.1.1", 39 | "minimatch": "^3.0.4" 40 | }, 41 | "engines": { 42 | "node": ">=10.10.0" 43 | } 44 | }, 45 | "node_modules/@humanwhocodes/object-schema": { 46 | "version": "1.2.1", 47 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 48 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 49 | "dev": true 50 | }, 51 | "node_modules/acorn": { 52 | "version": "8.7.1", 53 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", 54 | "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", 55 | "dev": true, 56 | "bin": { 57 | "acorn": "bin/acorn" 58 | }, 59 | "engines": { 60 | "node": ">=0.4.0" 61 | } 62 | }, 63 | "node_modules/acorn-jsx": { 64 | "version": "5.3.2", 65 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 66 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 67 | "dev": true, 68 | "peerDependencies": { 69 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 70 | } 71 | }, 72 | "node_modules/ajv": { 73 | "version": "6.12.6", 74 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 75 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 76 | "dev": true, 77 | "dependencies": { 78 | "fast-deep-equal": "^3.1.1", 79 | "fast-json-stable-stringify": "^2.0.0", 80 | "json-schema-traverse": "^0.4.1", 81 | "uri-js": "^4.2.2" 82 | }, 83 | "funding": { 84 | "type": "github", 85 | "url": "https://github.com/sponsors/epoberezkin" 86 | } 87 | }, 88 | "node_modules/ansi-regex": { 89 | "version": "5.0.1", 90 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 91 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 92 | "dev": true, 93 | "engines": { 94 | "node": ">=8" 95 | } 96 | }, 97 | "node_modules/ansi-styles": { 98 | "version": "4.3.0", 99 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 100 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 101 | "dev": true, 102 | "dependencies": { 103 | "color-convert": "^2.0.1" 104 | }, 105 | "engines": { 106 | "node": ">=8" 107 | }, 108 | "funding": { 109 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 110 | } 111 | }, 112 | "node_modules/argparse": { 113 | "version": "2.0.1", 114 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 115 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 116 | "dev": true 117 | }, 118 | "node_modules/balanced-match": { 119 | "version": "1.0.2", 120 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 121 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 122 | "dev": true 123 | }, 124 | "node_modules/brace-expansion": { 125 | "version": "1.1.11", 126 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 127 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 128 | "dev": true, 129 | "dependencies": { 130 | "balanced-match": "^1.0.0", 131 | "concat-map": "0.0.1" 132 | } 133 | }, 134 | "node_modules/callsites": { 135 | "version": "3.1.0", 136 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 137 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 138 | "dev": true, 139 | "engines": { 140 | "node": ">=6" 141 | } 142 | }, 143 | "node_modules/chalk": { 144 | "version": "4.1.2", 145 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 146 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 147 | "dev": true, 148 | "dependencies": { 149 | "ansi-styles": "^4.1.0", 150 | "supports-color": "^7.1.0" 151 | }, 152 | "engines": { 153 | "node": ">=10" 154 | }, 155 | "funding": { 156 | "url": "https://github.com/chalk/chalk?sponsor=1" 157 | } 158 | }, 159 | "node_modules/color-convert": { 160 | "version": "2.0.1", 161 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 162 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 163 | "dev": true, 164 | "dependencies": { 165 | "color-name": "~1.1.4" 166 | }, 167 | "engines": { 168 | "node": ">=7.0.0" 169 | } 170 | }, 171 | "node_modules/color-name": { 172 | "version": "1.1.4", 173 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 174 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 175 | "dev": true 176 | }, 177 | "node_modules/concat-map": { 178 | "version": "0.0.1", 179 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 180 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 181 | "dev": true 182 | }, 183 | "node_modules/cross-spawn": { 184 | "version": "7.0.3", 185 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 186 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 187 | "dev": true, 188 | "dependencies": { 189 | "path-key": "^3.1.0", 190 | "shebang-command": "^2.0.0", 191 | "which": "^2.0.1" 192 | }, 193 | "engines": { 194 | "node": ">= 8" 195 | } 196 | }, 197 | "node_modules/debug": { 198 | "version": "4.3.4", 199 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 200 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 201 | "dev": true, 202 | "dependencies": { 203 | "ms": "2.1.2" 204 | }, 205 | "engines": { 206 | "node": ">=6.0" 207 | }, 208 | "peerDependenciesMeta": { 209 | "supports-color": { 210 | "optional": true 211 | } 212 | } 213 | }, 214 | "node_modules/deep-is": { 215 | "version": "0.1.4", 216 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 217 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 218 | "dev": true 219 | }, 220 | "node_modules/doctrine": { 221 | "version": "3.0.0", 222 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 223 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 224 | "dev": true, 225 | "dependencies": { 226 | "esutils": "^2.0.2" 227 | }, 228 | "engines": { 229 | "node": ">=6.0.0" 230 | } 231 | }, 232 | "node_modules/escape-string-regexp": { 233 | "version": "4.0.0", 234 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 235 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 236 | "dev": true, 237 | "engines": { 238 | "node": ">=10" 239 | }, 240 | "funding": { 241 | "url": "https://github.com/sponsors/sindresorhus" 242 | } 243 | }, 244 | "node_modules/eslint": { 245 | "version": "8.17.0", 246 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", 247 | "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", 248 | "dev": true, 249 | "dependencies": { 250 | "@eslint/eslintrc": "^1.3.0", 251 | "@humanwhocodes/config-array": "^0.9.2", 252 | "ajv": "^6.10.0", 253 | "chalk": "^4.0.0", 254 | "cross-spawn": "^7.0.2", 255 | "debug": "^4.3.2", 256 | "doctrine": "^3.0.0", 257 | "escape-string-regexp": "^4.0.0", 258 | "eslint-scope": "^7.1.1", 259 | "eslint-utils": "^3.0.0", 260 | "eslint-visitor-keys": "^3.3.0", 261 | "espree": "^9.3.2", 262 | "esquery": "^1.4.0", 263 | "esutils": "^2.0.2", 264 | "fast-deep-equal": "^3.1.3", 265 | "file-entry-cache": "^6.0.1", 266 | "functional-red-black-tree": "^1.0.1", 267 | "glob-parent": "^6.0.1", 268 | "globals": "^13.15.0", 269 | "ignore": "^5.2.0", 270 | "import-fresh": "^3.0.0", 271 | "imurmurhash": "^0.1.4", 272 | "is-glob": "^4.0.0", 273 | "js-yaml": "^4.1.0", 274 | "json-stable-stringify-without-jsonify": "^1.0.1", 275 | "levn": "^0.4.1", 276 | "lodash.merge": "^4.6.2", 277 | "minimatch": "^3.1.2", 278 | "natural-compare": "^1.4.0", 279 | "optionator": "^0.9.1", 280 | "regexpp": "^3.2.0", 281 | "strip-ansi": "^6.0.1", 282 | "strip-json-comments": "^3.1.0", 283 | "text-table": "^0.2.0", 284 | "v8-compile-cache": "^2.0.3" 285 | }, 286 | "bin": { 287 | "eslint": "bin/eslint.js" 288 | }, 289 | "engines": { 290 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 291 | }, 292 | "funding": { 293 | "url": "https://opencollective.com/eslint" 294 | } 295 | }, 296 | "node_modules/eslint-scope": { 297 | "version": "7.1.1", 298 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 299 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 300 | "dev": true, 301 | "dependencies": { 302 | "esrecurse": "^4.3.0", 303 | "estraverse": "^5.2.0" 304 | }, 305 | "engines": { 306 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 307 | } 308 | }, 309 | "node_modules/eslint-utils": { 310 | "version": "3.0.0", 311 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 312 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 313 | "dev": true, 314 | "dependencies": { 315 | "eslint-visitor-keys": "^2.0.0" 316 | }, 317 | "engines": { 318 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 319 | }, 320 | "funding": { 321 | "url": "https://github.com/sponsors/mysticatea" 322 | }, 323 | "peerDependencies": { 324 | "eslint": ">=5" 325 | } 326 | }, 327 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 328 | "version": "2.1.0", 329 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 330 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 331 | "dev": true, 332 | "engines": { 333 | "node": ">=10" 334 | } 335 | }, 336 | "node_modules/eslint-visitor-keys": { 337 | "version": "3.3.0", 338 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 339 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 340 | "dev": true, 341 | "engines": { 342 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 343 | } 344 | }, 345 | "node_modules/espree": { 346 | "version": "9.3.2", 347 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", 348 | "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", 349 | "dev": true, 350 | "dependencies": { 351 | "acorn": "^8.7.1", 352 | "acorn-jsx": "^5.3.2", 353 | "eslint-visitor-keys": "^3.3.0" 354 | }, 355 | "engines": { 356 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 357 | } 358 | }, 359 | "node_modules/esquery": { 360 | "version": "1.4.0", 361 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 362 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 363 | "dev": true, 364 | "dependencies": { 365 | "estraverse": "^5.1.0" 366 | }, 367 | "engines": { 368 | "node": ">=0.10" 369 | } 370 | }, 371 | "node_modules/esrecurse": { 372 | "version": "4.3.0", 373 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 374 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 375 | "dev": true, 376 | "dependencies": { 377 | "estraverse": "^5.2.0" 378 | }, 379 | "engines": { 380 | "node": ">=4.0" 381 | } 382 | }, 383 | "node_modules/estraverse": { 384 | "version": "5.3.0", 385 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 386 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 387 | "dev": true, 388 | "engines": { 389 | "node": ">=4.0" 390 | } 391 | }, 392 | "node_modules/esutils": { 393 | "version": "2.0.3", 394 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 395 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 396 | "dev": true, 397 | "engines": { 398 | "node": ">=0.10.0" 399 | } 400 | }, 401 | "node_modules/fast-deep-equal": { 402 | "version": "3.1.3", 403 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 404 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 405 | "dev": true 406 | }, 407 | "node_modules/fast-json-stable-stringify": { 408 | "version": "2.1.0", 409 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 410 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 411 | "dev": true 412 | }, 413 | "node_modules/fast-levenshtein": { 414 | "version": "2.0.6", 415 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 416 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 417 | "dev": true 418 | }, 419 | "node_modules/file-entry-cache": { 420 | "version": "6.0.1", 421 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 422 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 423 | "dev": true, 424 | "dependencies": { 425 | "flat-cache": "^3.0.4" 426 | }, 427 | "engines": { 428 | "node": "^10.12.0 || >=12.0.0" 429 | } 430 | }, 431 | "node_modules/flat-cache": { 432 | "version": "3.0.4", 433 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 434 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 435 | "dev": true, 436 | "dependencies": { 437 | "flatted": "^3.1.0", 438 | "rimraf": "^3.0.2" 439 | }, 440 | "engines": { 441 | "node": "^10.12.0 || >=12.0.0" 442 | } 443 | }, 444 | "node_modules/flatted": { 445 | "version": "3.2.5", 446 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", 447 | "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", 448 | "dev": true 449 | }, 450 | "node_modules/fs.realpath": { 451 | "version": "1.0.0", 452 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 453 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 454 | "dev": true 455 | }, 456 | "node_modules/functional-red-black-tree": { 457 | "version": "1.0.1", 458 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 459 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 460 | "dev": true 461 | }, 462 | "node_modules/glob": { 463 | "version": "7.2.3", 464 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 465 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 466 | "dev": true, 467 | "dependencies": { 468 | "fs.realpath": "^1.0.0", 469 | "inflight": "^1.0.4", 470 | "inherits": "2", 471 | "minimatch": "^3.1.1", 472 | "once": "^1.3.0", 473 | "path-is-absolute": "^1.0.0" 474 | }, 475 | "engines": { 476 | "node": "*" 477 | }, 478 | "funding": { 479 | "url": "https://github.com/sponsors/isaacs" 480 | } 481 | }, 482 | "node_modules/glob-parent": { 483 | "version": "6.0.2", 484 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 485 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 486 | "dev": true, 487 | "dependencies": { 488 | "is-glob": "^4.0.3" 489 | }, 490 | "engines": { 491 | "node": ">=10.13.0" 492 | } 493 | }, 494 | "node_modules/globals": { 495 | "version": "13.15.0", 496 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", 497 | "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", 498 | "dev": true, 499 | "dependencies": { 500 | "type-fest": "^0.20.2" 501 | }, 502 | "engines": { 503 | "node": ">=8" 504 | }, 505 | "funding": { 506 | "url": "https://github.com/sponsors/sindresorhus" 507 | } 508 | }, 509 | "node_modules/has-flag": { 510 | "version": "4.0.0", 511 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 512 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 513 | "dev": true, 514 | "engines": { 515 | "node": ">=8" 516 | } 517 | }, 518 | "node_modules/ignore": { 519 | "version": "5.2.0", 520 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 521 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 522 | "dev": true, 523 | "engines": { 524 | "node": ">= 4" 525 | } 526 | }, 527 | "node_modules/import-fresh": { 528 | "version": "3.3.0", 529 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 530 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 531 | "dev": true, 532 | "dependencies": { 533 | "parent-module": "^1.0.0", 534 | "resolve-from": "^4.0.0" 535 | }, 536 | "engines": { 537 | "node": ">=6" 538 | }, 539 | "funding": { 540 | "url": "https://github.com/sponsors/sindresorhus" 541 | } 542 | }, 543 | "node_modules/imurmurhash": { 544 | "version": "0.1.4", 545 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 546 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 547 | "dev": true, 548 | "engines": { 549 | "node": ">=0.8.19" 550 | } 551 | }, 552 | "node_modules/inflight": { 553 | "version": "1.0.6", 554 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 555 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 556 | "dev": true, 557 | "dependencies": { 558 | "once": "^1.3.0", 559 | "wrappy": "1" 560 | } 561 | }, 562 | "node_modules/inherits": { 563 | "version": "2.0.4", 564 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 565 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 566 | "dev": true 567 | }, 568 | "node_modules/is-extglob": { 569 | "version": "2.1.1", 570 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 571 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 572 | "dev": true, 573 | "engines": { 574 | "node": ">=0.10.0" 575 | } 576 | }, 577 | "node_modules/is-glob": { 578 | "version": "4.0.3", 579 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 580 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 581 | "dev": true, 582 | "dependencies": { 583 | "is-extglob": "^2.1.1" 584 | }, 585 | "engines": { 586 | "node": ">=0.10.0" 587 | } 588 | }, 589 | "node_modules/isexe": { 590 | "version": "2.0.0", 591 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 592 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 593 | "dev": true 594 | }, 595 | "node_modules/js-yaml": { 596 | "version": "4.1.0", 597 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 598 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 599 | "dev": true, 600 | "dependencies": { 601 | "argparse": "^2.0.1" 602 | }, 603 | "bin": { 604 | "js-yaml": "bin/js-yaml.js" 605 | } 606 | }, 607 | "node_modules/json-schema-traverse": { 608 | "version": "0.4.1", 609 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 610 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 611 | "dev": true 612 | }, 613 | "node_modules/json-stable-stringify-without-jsonify": { 614 | "version": "1.0.1", 615 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 616 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 617 | "dev": true 618 | }, 619 | "node_modules/levn": { 620 | "version": "0.4.1", 621 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 622 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 623 | "dev": true, 624 | "dependencies": { 625 | "prelude-ls": "^1.2.1", 626 | "type-check": "~0.4.0" 627 | }, 628 | "engines": { 629 | "node": ">= 0.8.0" 630 | } 631 | }, 632 | "node_modules/lodash.merge": { 633 | "version": "4.6.2", 634 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 635 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 636 | "dev": true 637 | }, 638 | "node_modules/minimatch": { 639 | "version": "3.1.2", 640 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 641 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 642 | "dev": true, 643 | "dependencies": { 644 | "brace-expansion": "^1.1.7" 645 | }, 646 | "engines": { 647 | "node": "*" 648 | } 649 | }, 650 | "node_modules/ms": { 651 | "version": "2.1.2", 652 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 653 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 654 | "dev": true 655 | }, 656 | "node_modules/natural-compare": { 657 | "version": "1.4.0", 658 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 659 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 660 | "dev": true 661 | }, 662 | "node_modules/once": { 663 | "version": "1.4.0", 664 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 665 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 666 | "dev": true, 667 | "dependencies": { 668 | "wrappy": "1" 669 | } 670 | }, 671 | "node_modules/optionator": { 672 | "version": "0.9.1", 673 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 674 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 675 | "dev": true, 676 | "dependencies": { 677 | "deep-is": "^0.1.3", 678 | "fast-levenshtein": "^2.0.6", 679 | "levn": "^0.4.1", 680 | "prelude-ls": "^1.2.1", 681 | "type-check": "^0.4.0", 682 | "word-wrap": "^1.2.3" 683 | }, 684 | "engines": { 685 | "node": ">= 0.8.0" 686 | } 687 | }, 688 | "node_modules/parent-module": { 689 | "version": "1.0.1", 690 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 691 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 692 | "dev": true, 693 | "dependencies": { 694 | "callsites": "^3.0.0" 695 | }, 696 | "engines": { 697 | "node": ">=6" 698 | } 699 | }, 700 | "node_modules/path-is-absolute": { 701 | "version": "1.0.1", 702 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 703 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 704 | "dev": true, 705 | "engines": { 706 | "node": ">=0.10.0" 707 | } 708 | }, 709 | "node_modules/path-key": { 710 | "version": "3.1.1", 711 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 712 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 713 | "dev": true, 714 | "engines": { 715 | "node": ">=8" 716 | } 717 | }, 718 | "node_modules/prelude-ls": { 719 | "version": "1.2.1", 720 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 721 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 722 | "dev": true, 723 | "engines": { 724 | "node": ">= 0.8.0" 725 | } 726 | }, 727 | "node_modules/punycode": { 728 | "version": "2.1.1", 729 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 730 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 731 | "dev": true, 732 | "engines": { 733 | "node": ">=6" 734 | } 735 | }, 736 | "node_modules/regexpp": { 737 | "version": "3.2.0", 738 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 739 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 740 | "dev": true, 741 | "engines": { 742 | "node": ">=8" 743 | }, 744 | "funding": { 745 | "url": "https://github.com/sponsors/mysticatea" 746 | } 747 | }, 748 | "node_modules/resolve-from": { 749 | "version": "4.0.0", 750 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 751 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 752 | "dev": true, 753 | "engines": { 754 | "node": ">=4" 755 | } 756 | }, 757 | "node_modules/rimraf": { 758 | "version": "3.0.2", 759 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 760 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 761 | "dev": true, 762 | "dependencies": { 763 | "glob": "^7.1.3" 764 | }, 765 | "bin": { 766 | "rimraf": "bin.js" 767 | }, 768 | "funding": { 769 | "url": "https://github.com/sponsors/isaacs" 770 | } 771 | }, 772 | "node_modules/shebang-command": { 773 | "version": "2.0.0", 774 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 775 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 776 | "dev": true, 777 | "dependencies": { 778 | "shebang-regex": "^3.0.0" 779 | }, 780 | "engines": { 781 | "node": ">=8" 782 | } 783 | }, 784 | "node_modules/shebang-regex": { 785 | "version": "3.0.0", 786 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 787 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 788 | "dev": true, 789 | "engines": { 790 | "node": ">=8" 791 | } 792 | }, 793 | "node_modules/strip-ansi": { 794 | "version": "6.0.1", 795 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 796 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 797 | "dev": true, 798 | "dependencies": { 799 | "ansi-regex": "^5.0.1" 800 | }, 801 | "engines": { 802 | "node": ">=8" 803 | } 804 | }, 805 | "node_modules/strip-json-comments": { 806 | "version": "3.1.1", 807 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 808 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 809 | "dev": true, 810 | "engines": { 811 | "node": ">=8" 812 | }, 813 | "funding": { 814 | "url": "https://github.com/sponsors/sindresorhus" 815 | } 816 | }, 817 | "node_modules/supports-color": { 818 | "version": "7.2.0", 819 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 820 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 821 | "dev": true, 822 | "dependencies": { 823 | "has-flag": "^4.0.0" 824 | }, 825 | "engines": { 826 | "node": ">=8" 827 | } 828 | }, 829 | "node_modules/text-table": { 830 | "version": "0.2.0", 831 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 832 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 833 | "dev": true 834 | }, 835 | "node_modules/type-check": { 836 | "version": "0.4.0", 837 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 838 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 839 | "dev": true, 840 | "dependencies": { 841 | "prelude-ls": "^1.2.1" 842 | }, 843 | "engines": { 844 | "node": ">= 0.8.0" 845 | } 846 | }, 847 | "node_modules/type-fest": { 848 | "version": "0.20.2", 849 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 850 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 851 | "dev": true, 852 | "engines": { 853 | "node": ">=10" 854 | }, 855 | "funding": { 856 | "url": "https://github.com/sponsors/sindresorhus" 857 | } 858 | }, 859 | "node_modules/uri-js": { 860 | "version": "4.4.1", 861 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 862 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 863 | "dev": true, 864 | "dependencies": { 865 | "punycode": "^2.1.0" 866 | } 867 | }, 868 | "node_modules/v8-compile-cache": { 869 | "version": "2.3.0", 870 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 871 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 872 | "dev": true 873 | }, 874 | "node_modules/which": { 875 | "version": "2.0.2", 876 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 877 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 878 | "dev": true, 879 | "dependencies": { 880 | "isexe": "^2.0.0" 881 | }, 882 | "bin": { 883 | "node-which": "bin/node-which" 884 | }, 885 | "engines": { 886 | "node": ">= 8" 887 | } 888 | }, 889 | "node_modules/word-wrap": { 890 | "version": "1.2.3", 891 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 892 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 893 | "dev": true, 894 | "engines": { 895 | "node": ">=0.10.0" 896 | } 897 | }, 898 | "node_modules/wrappy": { 899 | "version": "1.0.2", 900 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 901 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 902 | "dev": true 903 | } 904 | }, 905 | "dependencies": { 906 | "@eslint/eslintrc": { 907 | "version": "1.3.0", 908 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", 909 | "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", 910 | "dev": true, 911 | "requires": { 912 | "ajv": "^6.12.4", 913 | "debug": "^4.3.2", 914 | "espree": "^9.3.2", 915 | "globals": "^13.15.0", 916 | "ignore": "^5.2.0", 917 | "import-fresh": "^3.2.1", 918 | "js-yaml": "^4.1.0", 919 | "minimatch": "^3.1.2", 920 | "strip-json-comments": "^3.1.1" 921 | } 922 | }, 923 | "@humanwhocodes/config-array": { 924 | "version": "0.9.5", 925 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", 926 | "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", 927 | "dev": true, 928 | "requires": { 929 | "@humanwhocodes/object-schema": "^1.2.1", 930 | "debug": "^4.1.1", 931 | "minimatch": "^3.0.4" 932 | } 933 | }, 934 | "@humanwhocodes/object-schema": { 935 | "version": "1.2.1", 936 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 937 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 938 | "dev": true 939 | }, 940 | "acorn": { 941 | "version": "8.7.1", 942 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", 943 | "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", 944 | "dev": true 945 | }, 946 | "acorn-jsx": { 947 | "version": "5.3.2", 948 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 949 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 950 | "dev": true, 951 | "requires": {} 952 | }, 953 | "ajv": { 954 | "version": "6.12.6", 955 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 956 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 957 | "dev": true, 958 | "requires": { 959 | "fast-deep-equal": "^3.1.1", 960 | "fast-json-stable-stringify": "^2.0.0", 961 | "json-schema-traverse": "^0.4.1", 962 | "uri-js": "^4.2.2" 963 | } 964 | }, 965 | "ansi-regex": { 966 | "version": "5.0.1", 967 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 968 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 969 | "dev": true 970 | }, 971 | "ansi-styles": { 972 | "version": "4.3.0", 973 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 974 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 975 | "dev": true, 976 | "requires": { 977 | "color-convert": "^2.0.1" 978 | } 979 | }, 980 | "argparse": { 981 | "version": "2.0.1", 982 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 983 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 984 | "dev": true 985 | }, 986 | "balanced-match": { 987 | "version": "1.0.2", 988 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 989 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 990 | "dev": true 991 | }, 992 | "brace-expansion": { 993 | "version": "1.1.11", 994 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 995 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 996 | "dev": true, 997 | "requires": { 998 | "balanced-match": "^1.0.0", 999 | "concat-map": "0.0.1" 1000 | } 1001 | }, 1002 | "callsites": { 1003 | "version": "3.1.0", 1004 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1005 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1006 | "dev": true 1007 | }, 1008 | "chalk": { 1009 | "version": "4.1.2", 1010 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1011 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1012 | "dev": true, 1013 | "requires": { 1014 | "ansi-styles": "^4.1.0", 1015 | "supports-color": "^7.1.0" 1016 | } 1017 | }, 1018 | "color-convert": { 1019 | "version": "2.0.1", 1020 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1021 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1022 | "dev": true, 1023 | "requires": { 1024 | "color-name": "~1.1.4" 1025 | } 1026 | }, 1027 | "color-name": { 1028 | "version": "1.1.4", 1029 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1030 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1031 | "dev": true 1032 | }, 1033 | "concat-map": { 1034 | "version": "0.0.1", 1035 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1036 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1037 | "dev": true 1038 | }, 1039 | "cross-spawn": { 1040 | "version": "7.0.3", 1041 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1042 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1043 | "dev": true, 1044 | "requires": { 1045 | "path-key": "^3.1.0", 1046 | "shebang-command": "^2.0.0", 1047 | "which": "^2.0.1" 1048 | } 1049 | }, 1050 | "debug": { 1051 | "version": "4.3.4", 1052 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1053 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1054 | "dev": true, 1055 | "requires": { 1056 | "ms": "2.1.2" 1057 | } 1058 | }, 1059 | "deep-is": { 1060 | "version": "0.1.4", 1061 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1062 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1063 | "dev": true 1064 | }, 1065 | "doctrine": { 1066 | "version": "3.0.0", 1067 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1068 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1069 | "dev": true, 1070 | "requires": { 1071 | "esutils": "^2.0.2" 1072 | } 1073 | }, 1074 | "escape-string-regexp": { 1075 | "version": "4.0.0", 1076 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1077 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1078 | "dev": true 1079 | }, 1080 | "eslint": { 1081 | "version": "8.17.0", 1082 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", 1083 | "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", 1084 | "dev": true, 1085 | "requires": { 1086 | "@eslint/eslintrc": "^1.3.0", 1087 | "@humanwhocodes/config-array": "^0.9.2", 1088 | "ajv": "^6.10.0", 1089 | "chalk": "^4.0.0", 1090 | "cross-spawn": "^7.0.2", 1091 | "debug": "^4.3.2", 1092 | "doctrine": "^3.0.0", 1093 | "escape-string-regexp": "^4.0.0", 1094 | "eslint-scope": "^7.1.1", 1095 | "eslint-utils": "^3.0.0", 1096 | "eslint-visitor-keys": "^3.3.0", 1097 | "espree": "^9.3.2", 1098 | "esquery": "^1.4.0", 1099 | "esutils": "^2.0.2", 1100 | "fast-deep-equal": "^3.1.3", 1101 | "file-entry-cache": "^6.0.1", 1102 | "functional-red-black-tree": "^1.0.1", 1103 | "glob-parent": "^6.0.1", 1104 | "globals": "^13.15.0", 1105 | "ignore": "^5.2.0", 1106 | "import-fresh": "^3.0.0", 1107 | "imurmurhash": "^0.1.4", 1108 | "is-glob": "^4.0.0", 1109 | "js-yaml": "^4.1.0", 1110 | "json-stable-stringify-without-jsonify": "^1.0.1", 1111 | "levn": "^0.4.1", 1112 | "lodash.merge": "^4.6.2", 1113 | "minimatch": "^3.1.2", 1114 | "natural-compare": "^1.4.0", 1115 | "optionator": "^0.9.1", 1116 | "regexpp": "^3.2.0", 1117 | "strip-ansi": "^6.0.1", 1118 | "strip-json-comments": "^3.1.0", 1119 | "text-table": "^0.2.0", 1120 | "v8-compile-cache": "^2.0.3" 1121 | } 1122 | }, 1123 | "eslint-scope": { 1124 | "version": "7.1.1", 1125 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 1126 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 1127 | "dev": true, 1128 | "requires": { 1129 | "esrecurse": "^4.3.0", 1130 | "estraverse": "^5.2.0" 1131 | } 1132 | }, 1133 | "eslint-utils": { 1134 | "version": "3.0.0", 1135 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1136 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1137 | "dev": true, 1138 | "requires": { 1139 | "eslint-visitor-keys": "^2.0.0" 1140 | }, 1141 | "dependencies": { 1142 | "eslint-visitor-keys": { 1143 | "version": "2.1.0", 1144 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1145 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1146 | "dev": true 1147 | } 1148 | } 1149 | }, 1150 | "eslint-visitor-keys": { 1151 | "version": "3.3.0", 1152 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 1153 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 1154 | "dev": true 1155 | }, 1156 | "espree": { 1157 | "version": "9.3.2", 1158 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", 1159 | "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", 1160 | "dev": true, 1161 | "requires": { 1162 | "acorn": "^8.7.1", 1163 | "acorn-jsx": "^5.3.2", 1164 | "eslint-visitor-keys": "^3.3.0" 1165 | } 1166 | }, 1167 | "esquery": { 1168 | "version": "1.4.0", 1169 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1170 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1171 | "dev": true, 1172 | "requires": { 1173 | "estraverse": "^5.1.0" 1174 | } 1175 | }, 1176 | "esrecurse": { 1177 | "version": "4.3.0", 1178 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1179 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1180 | "dev": true, 1181 | "requires": { 1182 | "estraverse": "^5.2.0" 1183 | } 1184 | }, 1185 | "estraverse": { 1186 | "version": "5.3.0", 1187 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1188 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1189 | "dev": true 1190 | }, 1191 | "esutils": { 1192 | "version": "2.0.3", 1193 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1194 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1195 | "dev": true 1196 | }, 1197 | "fast-deep-equal": { 1198 | "version": "3.1.3", 1199 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1200 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1201 | "dev": true 1202 | }, 1203 | "fast-json-stable-stringify": { 1204 | "version": "2.1.0", 1205 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1206 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1207 | "dev": true 1208 | }, 1209 | "fast-levenshtein": { 1210 | "version": "2.0.6", 1211 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1212 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1213 | "dev": true 1214 | }, 1215 | "file-entry-cache": { 1216 | "version": "6.0.1", 1217 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1218 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1219 | "dev": true, 1220 | "requires": { 1221 | "flat-cache": "^3.0.4" 1222 | } 1223 | }, 1224 | "flat-cache": { 1225 | "version": "3.0.4", 1226 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1227 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1228 | "dev": true, 1229 | "requires": { 1230 | "flatted": "^3.1.0", 1231 | "rimraf": "^3.0.2" 1232 | } 1233 | }, 1234 | "flatted": { 1235 | "version": "3.2.5", 1236 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", 1237 | "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", 1238 | "dev": true 1239 | }, 1240 | "fs.realpath": { 1241 | "version": "1.0.0", 1242 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1243 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1244 | "dev": true 1245 | }, 1246 | "functional-red-black-tree": { 1247 | "version": "1.0.1", 1248 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1249 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 1250 | "dev": true 1251 | }, 1252 | "glob": { 1253 | "version": "7.2.3", 1254 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1255 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1256 | "dev": true, 1257 | "requires": { 1258 | "fs.realpath": "^1.0.0", 1259 | "inflight": "^1.0.4", 1260 | "inherits": "2", 1261 | "minimatch": "^3.1.1", 1262 | "once": "^1.3.0", 1263 | "path-is-absolute": "^1.0.0" 1264 | } 1265 | }, 1266 | "glob-parent": { 1267 | "version": "6.0.2", 1268 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1269 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1270 | "dev": true, 1271 | "requires": { 1272 | "is-glob": "^4.0.3" 1273 | } 1274 | }, 1275 | "globals": { 1276 | "version": "13.15.0", 1277 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", 1278 | "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", 1279 | "dev": true, 1280 | "requires": { 1281 | "type-fest": "^0.20.2" 1282 | } 1283 | }, 1284 | "has-flag": { 1285 | "version": "4.0.0", 1286 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1287 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1288 | "dev": true 1289 | }, 1290 | "ignore": { 1291 | "version": "5.2.0", 1292 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 1293 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 1294 | "dev": true 1295 | }, 1296 | "import-fresh": { 1297 | "version": "3.3.0", 1298 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1299 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1300 | "dev": true, 1301 | "requires": { 1302 | "parent-module": "^1.0.0", 1303 | "resolve-from": "^4.0.0" 1304 | } 1305 | }, 1306 | "imurmurhash": { 1307 | "version": "0.1.4", 1308 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1309 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1310 | "dev": true 1311 | }, 1312 | "inflight": { 1313 | "version": "1.0.6", 1314 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1315 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1316 | "dev": true, 1317 | "requires": { 1318 | "once": "^1.3.0", 1319 | "wrappy": "1" 1320 | } 1321 | }, 1322 | "inherits": { 1323 | "version": "2.0.4", 1324 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1325 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1326 | "dev": true 1327 | }, 1328 | "is-extglob": { 1329 | "version": "2.1.1", 1330 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1331 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1332 | "dev": true 1333 | }, 1334 | "is-glob": { 1335 | "version": "4.0.3", 1336 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1337 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1338 | "dev": true, 1339 | "requires": { 1340 | "is-extglob": "^2.1.1" 1341 | } 1342 | }, 1343 | "isexe": { 1344 | "version": "2.0.0", 1345 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1346 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1347 | "dev": true 1348 | }, 1349 | "js-yaml": { 1350 | "version": "4.1.0", 1351 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1352 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1353 | "dev": true, 1354 | "requires": { 1355 | "argparse": "^2.0.1" 1356 | } 1357 | }, 1358 | "json-schema-traverse": { 1359 | "version": "0.4.1", 1360 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1361 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1362 | "dev": true 1363 | }, 1364 | "json-stable-stringify-without-jsonify": { 1365 | "version": "1.0.1", 1366 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1367 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1368 | "dev": true 1369 | }, 1370 | "levn": { 1371 | "version": "0.4.1", 1372 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1373 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1374 | "dev": true, 1375 | "requires": { 1376 | "prelude-ls": "^1.2.1", 1377 | "type-check": "~0.4.0" 1378 | } 1379 | }, 1380 | "lodash.merge": { 1381 | "version": "4.6.2", 1382 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1383 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1384 | "dev": true 1385 | }, 1386 | "minimatch": { 1387 | "version": "3.1.2", 1388 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1389 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1390 | "dev": true, 1391 | "requires": { 1392 | "brace-expansion": "^1.1.7" 1393 | } 1394 | }, 1395 | "ms": { 1396 | "version": "2.1.2", 1397 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1398 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1399 | "dev": true 1400 | }, 1401 | "natural-compare": { 1402 | "version": "1.4.0", 1403 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1404 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1405 | "dev": true 1406 | }, 1407 | "once": { 1408 | "version": "1.4.0", 1409 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1410 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1411 | "dev": true, 1412 | "requires": { 1413 | "wrappy": "1" 1414 | } 1415 | }, 1416 | "optionator": { 1417 | "version": "0.9.1", 1418 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1419 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1420 | "dev": true, 1421 | "requires": { 1422 | "deep-is": "^0.1.3", 1423 | "fast-levenshtein": "^2.0.6", 1424 | "levn": "^0.4.1", 1425 | "prelude-ls": "^1.2.1", 1426 | "type-check": "^0.4.0", 1427 | "word-wrap": "^1.2.3" 1428 | } 1429 | }, 1430 | "parent-module": { 1431 | "version": "1.0.1", 1432 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1433 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1434 | "dev": true, 1435 | "requires": { 1436 | "callsites": "^3.0.0" 1437 | } 1438 | }, 1439 | "path-is-absolute": { 1440 | "version": "1.0.1", 1441 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1442 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1443 | "dev": true 1444 | }, 1445 | "path-key": { 1446 | "version": "3.1.1", 1447 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1448 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1449 | "dev": true 1450 | }, 1451 | "prelude-ls": { 1452 | "version": "1.2.1", 1453 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1454 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1455 | "dev": true 1456 | }, 1457 | "punycode": { 1458 | "version": "2.1.1", 1459 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1460 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1461 | "dev": true 1462 | }, 1463 | "regexpp": { 1464 | "version": "3.2.0", 1465 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1466 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1467 | "dev": true 1468 | }, 1469 | "resolve-from": { 1470 | "version": "4.0.0", 1471 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1472 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1473 | "dev": true 1474 | }, 1475 | "rimraf": { 1476 | "version": "3.0.2", 1477 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1478 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1479 | "dev": true, 1480 | "requires": { 1481 | "glob": "^7.1.3" 1482 | } 1483 | }, 1484 | "shebang-command": { 1485 | "version": "2.0.0", 1486 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1487 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1488 | "dev": true, 1489 | "requires": { 1490 | "shebang-regex": "^3.0.0" 1491 | } 1492 | }, 1493 | "shebang-regex": { 1494 | "version": "3.0.0", 1495 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1496 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1497 | "dev": true 1498 | }, 1499 | "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 | "requires": { 1505 | "ansi-regex": "^5.0.1" 1506 | } 1507 | }, 1508 | "strip-json-comments": { 1509 | "version": "3.1.1", 1510 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1511 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1512 | "dev": true 1513 | }, 1514 | "supports-color": { 1515 | "version": "7.2.0", 1516 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1517 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1518 | "dev": true, 1519 | "requires": { 1520 | "has-flag": "^4.0.0" 1521 | } 1522 | }, 1523 | "text-table": { 1524 | "version": "0.2.0", 1525 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1526 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1527 | "dev": true 1528 | }, 1529 | "type-check": { 1530 | "version": "0.4.0", 1531 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1532 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1533 | "dev": true, 1534 | "requires": { 1535 | "prelude-ls": "^1.2.1" 1536 | } 1537 | }, 1538 | "type-fest": { 1539 | "version": "0.20.2", 1540 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1541 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1542 | "dev": true 1543 | }, 1544 | "uri-js": { 1545 | "version": "4.4.1", 1546 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1547 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1548 | "dev": true, 1549 | "requires": { 1550 | "punycode": "^2.1.0" 1551 | } 1552 | }, 1553 | "v8-compile-cache": { 1554 | "version": "2.3.0", 1555 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1556 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1557 | "dev": true 1558 | }, 1559 | "which": { 1560 | "version": "2.0.2", 1561 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1562 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1563 | "dev": true, 1564 | "requires": { 1565 | "isexe": "^2.0.0" 1566 | } 1567 | }, 1568 | "word-wrap": { 1569 | "version": "1.2.3", 1570 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1571 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1572 | "dev": true 1573 | }, 1574 | "wrappy": { 1575 | "version": "1.0.2", 1576 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1577 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1578 | "dev": true 1579 | } 1580 | } 1581 | } 1582 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "eslint": "^8.17.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /setup.js: -------------------------------------------------------------------------------- 1 | // EVENTS 2 | let showCursor = true; 3 | const toggleCursorEl = document.querySelector('[data-toggle-cursor]'); 4 | toggleCursorEl.addEventListener('click', () => { 5 | showCursor = !showCursor; 6 | 7 | if (showCursor) { 8 | toggleCursorEl.innerHTML = 'Show Real Cursor'; 9 | document.documentElement.style.cursor = 'none'; 10 | } else { 11 | toggleCursorEl.innerHTML = 'Hide Real Cursor'; 12 | document.documentElement.style.cursor = 'default'; 13 | } 14 | }); 15 | 16 | if ('ontouchstart' in document.documentElement) { 17 | document.querySelector('.info-description').innerHTML += 18 | "
Doesn't work with touchscreens tho... :(
"; 19 | } 20 | 21 | document.querySelector(`[data-new-random]`).addEventListener('click', (evt) => { 22 | evt.preventDefault(); 23 | 24 | const amountOfElements = 25 | (Math.random() > 0.8 ? 5 : 2) + Math.floor(Math.random() * 8); 26 | 27 | const newConfig = new Array(amountOfElements).fill('').map(() => { 28 | return Math.random() > 0.5 29 | ? { 30 | behavior: 'REPEL', 31 | innerHTML: 'Repel', 32 | className: ['clickme', '-nope'], 33 | position: [ 34 | Math.floor(Math.random() * 92) + 4, 35 | Math.floor(Math.random() * 92) + 4, 36 | ], 37 | } 38 | : { 39 | behavior: 'ATTRACT', 40 | innerHTML: 'Attract', 41 | className: ['clickme'], 42 | position: [ 43 | Math.floor(Math.random() * 92) + 4, 44 | Math.floor(Math.random() * 92) + 4, 45 | ], 46 | }; 47 | }); 48 | 49 | window.ControlUserCursor(newConfig); 50 | }); 51 | 52 | // INITIALIZE 53 | window.ControlUserCursor([ 54 | { 55 | behavior: 'REPEL', 56 | innerHTML: 'Repel', 57 | className: ['clickme', '-nope'], 58 | position: [60, 33], 59 | }, 60 | { 61 | behavior: 'ATTRACT', 62 | innerHTML: 'Attract', 63 | className: ['clickme'], 64 | position: [40, 66], 65 | }, 66 | ]); 67 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | position: relative; 5 | box-sizing: border-box; 6 | pointer-events: none; 7 | } 8 | 9 | html { 10 | cursor: none; 11 | -moz-user-select: none; 12 | user-select: none; 13 | -webkit-user-select: none; 14 | } 15 | 16 | body, 17 | html { 18 | font-size: 15px; 19 | } 20 | 21 | body { 22 | font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, Arial, 23 | sans-serif; 24 | background-color: #f8f8f8; 25 | color: #000; 26 | background-image: url(/control-user-cursor/assets/bg.svg); 27 | background-repeat: repeat; 28 | } 29 | 30 | h1 { 31 | font-weight: 900; 32 | font-size: 2rem; 33 | line-height: 1; 34 | } 35 | 36 | a { 37 | color: #2980b9; 38 | } 39 | a:hover { 40 | color: #2980b9; 41 | } 42 | a.-hover { 43 | background: #000; 44 | color: #fff; 45 | } 46 | 47 | button { 48 | font-weight: 900; 49 | border: none; 50 | appearance: none; 51 | font-size: 16px; 52 | background-color: white; 53 | line-height: 1; 54 | padding: 0.75rem; 55 | box-shadow: rgba(0, 0, 0, 0.1) 0 1px 0, rgba(0, 0, 0, 0.1) 0 2px 16px; 56 | } 57 | button.-hover { 58 | background: #000; 59 | color: #fff; 60 | } 61 | 62 | .info { 63 | position: fixed; 64 | top: 1.5rem; 65 | left: 1rem; 66 | line-height: 1; 67 | } 68 | 69 | .info-description { 70 | padding: 0.5rem 0 1rem; 71 | } 72 | 73 | .-prevent-custom-cursor:hover { 74 | cursor: none; 75 | } 76 | 77 | #cursor { 78 | opacity: 0; 79 | margin-top: -2px; 80 | margin-left: -2px; 81 | position: fixed; 82 | z-index: 2; 83 | pointer-events: none; 84 | } 85 | 86 | .clickme { 87 | --border-width: 7px; 88 | --gravity-area: 200px; 89 | position: fixed; 90 | display: block; 91 | width: 64px; 92 | height: 64px; 93 | border-radius: 64px; 94 | background: #2980b9; 95 | text-align: center; 96 | line-height: 64px; 97 | top: 50%; 98 | left: 50%; 99 | text-transform: uppercase; 100 | font-weight: 700; 101 | text-decoration: none; 102 | font-size: 12px; 103 | color: #fff; 104 | font-weight: 500; 105 | } 106 | 107 | .clickme::before { 108 | content: ''; 109 | position: absolute; 110 | top: 50%; 111 | left: 50%; 112 | border-radius: 100%; 113 | display: block; 114 | height: calc(var(--gravity-area) - 2 * var(--border-width)); 115 | width: calc(var(--gravity-area) - 2 * var(--border-width)); 116 | margin-top: calc(var(--gravity-area) * -0.5); 117 | margin-left: calc(var(--gravity-area) * -0.5); 118 | border: var(--border-width) solid #2980b9; 119 | animation: 4s infinite radar reverse; 120 | filter: blur(4px); 121 | } 122 | 123 | .clickme::after { 124 | content: ''; 125 | position: absolute; 126 | top: 50%; 127 | left: 50%; 128 | border-radius: 100%; 129 | display: block; 130 | height: calc(var(--gravity-area) - 2 * var(--border-width)); 131 | width: calc(var(--gravity-area) - 2 * var(--border-width)); 132 | margin-top: calc(var(--gravity-area) * -0.5); 133 | margin-left: calc(var(--gravity-area) * -0.5); 134 | border: var(--border-width) solid #2980b9; 135 | animation: 4s -2s infinite radar reverse; 136 | filter: blur(4px); 137 | } 138 | 139 | @keyframes radar { 140 | 0% { 141 | transform: scale(0); 142 | opacity: 0.05; 143 | } 144 | 145 | 50% { 146 | opacity: 0.05; 147 | } 148 | 149 | 100% { 150 | transform: scale(2); 151 | opacity: 0; 152 | } 153 | } 154 | 155 | .clickme.-nope { 156 | background: #c0392b; 157 | } 158 | .clickme.-nope::before, 159 | .clickme.-nope::after { 160 | border-color: #c0392b; 161 | } 162 | .clickme.-nope::before { 163 | animation: 4s infinite radar; 164 | } 165 | .clickme.-nope::after { 166 | animation: 4s -2s infinite radar; 167 | } 168 | 169 | .clickme.-hover { 170 | opacity: 0.8; 171 | } 172 | --------------------------------------------------------------------------------