├── node_vm2 ├── __pkginfo__.py ├── vm-server │ ├── .eslintrc.js │ ├── package.json │ ├── index.js │ └── package-lock.json └── __init__.py ├── .gitignore ├── .editorconfig ├── requirements.txt ├── .readthedocs.yml ├── .eslintrc.json ├── .github ├── workflows │ └── test.yml └── dependabot.yml ├── docs ├── conf.py └── index.rst ├── LICENSE ├── pyproject.toml ├── .pylintrc ├── requirements-lock.txt ├── cute.py ├── test.py └── README.rst /node_vm2/__pkginfo__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.4.7" 2 | -------------------------------------------------------------------------------- /node_vm2/vm-server/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: "eslint:recommended" 3 | }; 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.dat 2 | *.ini 3 | *.log 4 | *.pyc 5 | 6 | __pycache__/ 7 | build/ 8 | dist/ 9 | *.egg-info/ 10 | node_modules 11 | .venv 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | indent_style = space 3 | indent_size = 2 4 | 5 | [*.py] 6 | indent_style = tab 7 | indent_size = 4 8 | 9 | [*.rst] 10 | indent_size = 3 11 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | build==1.0.3 2 | docutils==0.19 3 | pygments==2.13.0 4 | pylint==2.15.0 5 | pyxcute==0.7.0 6 | setuptools==68.2.2 7 | sphinx==5.1.1 8 | twine==4.0.1 9 | wheel==0.37.1 10 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | build: 4 | os: ubuntu-22.04 5 | tools: 6 | python: "3.10" 7 | 8 | python: 9 | install: 10 | - requirements: requirements-lock.txt 11 | - path: . 12 | 13 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true, 4 | "node": true 5 | }, 6 | "rules": { 7 | "no-use-before-define": [2, "nofunc"], 8 | "semi": [2, "always"], 9 | "no-console": "off" 10 | }, 11 | "extends": [ 12 | "eslint:recommended" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /node_vm2/vm-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vm-server", 3 | "main": "index.js", 4 | "dependencies": { 5 | "vm2": "^3.9.11" 6 | }, 7 | "scripts": { 8 | "test": "eslint ." 9 | }, 10 | "devDependencies": { 11 | "eslint": "^8.51.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | test: 6 | runs-on: ubuntu-latest 7 | 8 | steps: 9 | - uses: actions/checkout@v4 10 | - uses: actions/setup-node@v3 11 | with: 12 | node-version: latest 13 | - uses: actions/setup-python@v4 14 | with: 15 | python-version: '3.x' 16 | - run: pip install -U pip 17 | - run: pip install -r requirements-lock.txt 18 | - run: python cute.py install_npm 19 | - run: pip install . 20 | - run: python cute.py test 21 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/node_vm2/vm-server" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | - package-ecosystem: "pip" # See documentation for possible values 13 | directory: "/" # Location of package manifests 14 | schedule: 15 | interval: "daily" 16 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | #! python3 2 | 3 | import re 4 | import os.path 5 | import sys 6 | 7 | sys.path.insert(0, os.path.realpath(__file__ + "/../..")) 8 | extensions = ["sphinx.ext.intersphinx", "sphinx.ext.autodoc"] 9 | master_doc = "index" 10 | autodoc_member_order = "bysource" 11 | intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} 12 | autoclass_content = 'both' 13 | 14 | # def process_signature(app, what, name, obj, options, signature, 15 | # return_annotation): 16 | # if what == "class": 17 | # return (None, return_annotation) 18 | 19 | # def process_docstring(app, what, name, obj, options, lines): 20 | # lines[:] = [replace_tab(l) for l in lines] 21 | 22 | # def replace_tab(text): 23 | # return re.sub("\s+", " ", text) 24 | 25 | # def setup(app): 26 | # app.connect("autodoc-process-signature", process_signature) 27 | # app.connect("autodoc-process-docstring", process_docstring) 28 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. automodule:: node_vm2 2 | :show-inheritance: 3 | 4 | node_vm2 5 | ======== 6 | 7 | A Python 3 to Node.js + vm2 binding, helps you execute JavaScript safely. 8 | 9 | Also checkout `node_vm2's readme `_. 10 | 11 | .. warning:: 12 | This project is no longer maintained. Please use `deno_vm `__ instead. 13 | 14 | Functions 15 | --------- 16 | 17 | .. autofunction:: eval 18 | 19 | Classes 20 | ------- 21 | 22 | .. autoclass:: BaseVM 23 | :members: __enter__, __exit__, create, destroy 24 | 25 | .. autoclass:: VM 26 | :members: run, call 27 | 28 | .. autoclass:: NodeVM 29 | 30 | .. autoattribute:: event_que 31 | :annotation: = queue.Queue() 32 | 33 | .. automethod:: run 34 | .. automethod:: code 35 | 36 | .. autoclass:: NodeVMModule 37 | :members: __enter__, __exit__, call, get, call_member, get_member, destroy 38 | 39 | .. autoclass:: VMServer 40 | :members: __enter__, __exit__, start, close 41 | 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 eight 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 | 23 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "node_vm2" 7 | version = "0.4.7" 8 | authors = [ 9 | { name="eight04", email="eight04@gmail.com" }, 10 | ] 11 | description = "A binding to Node.js + vm2, helps you execute JavaScript safely." 12 | readme = "README.rst" 13 | requires-python = ">=3.7" 14 | classifiers = [ 15 | "Development Status :: 4 - Beta", 16 | "Environment :: Console", 17 | "Environment :: Win32 (MS Windows)", 18 | "Intended Audience :: Developers", 19 | "License :: OSI Approved :: MIT License", 20 | "Natural Language :: Chinese (Traditional)", 21 | "Operating System :: Microsoft :: Windows :: Windows 7", 22 | "Programming Language :: Python :: 3.6", 23 | "Programming Language :: JavaScript", 24 | "Topic :: Software Development :: Libraries" 25 | ] 26 | keywords = [ 27 | "node", "js", "sandbox", "execute", "javascript" 28 | ] 29 | 30 | [project.urls] 31 | "Homepage" = "https://github.com/eight04/node_vm2" 32 | "Documentation" = "https://node-vm2.readthedocs.io/en/latest/?badge=latest" 33 | "Bug Tracker" = "https://github.com/eight04/node_vm2/issues" 34 | 35 | [tool.setuptools.package-data] 36 | node_vm2 = ["vm-server/**/*"] 37 | 38 | [tool.vpip] 39 | command_fallback = "python cute.py" 40 | -------------------------------------------------------------------------------- /.pylintrc: -------------------------------------------------------------------------------- 1 | [MESSAGES CONTROL] 2 | disable= 3 | bad-indentation, 4 | 5 | raw-checker-failed, locally-disabled, file-ignored, 6 | suppressed-message, fixme, 7 | 8 | # https://github.com/PyCQA/pylint/issues/1369 9 | function-redefined, 10 | 11 | # https://github.com/PyCQA/pylint/issues/782 12 | not-context-manager, 13 | 14 | anomalous-backslash-in-string, 15 | global-statement, 16 | missing-docstring, multiple-imports, 17 | redefined-outer-name, redefined-builtin, 18 | trailing-whitespace, 19 | unused-argument, 20 | unnecessary-pass, 21 | wrong-import-position, 22 | wrong-import-order 23 | 24 | [REPORTS] 25 | # reports=yes 26 | # score=yes 27 | 28 | [REFACTORING] 29 | # Maximum number of nested blocks for function / method body 30 | max-nested-blocks=5 31 | 32 | [BASIC] 33 | argument-rgx=(([a-z][a-z0-9_]{,30})|(_[a-z0-9_]*))$ 34 | attr-rgx=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*)|([A-Z_][A-Z0-9_]*))$ 35 | const-rgx=^(([A-Z_][A-Z0-9_]*)|(__.*__)|[a-z_][a-z0-9_]*)$ 36 | method-rgx=^([a-z_]+|test_[a-zA-Z_]+)$ 37 | variable-rgx=(([a-z][a-z0-9_]{,30})|(_[a-z0-9_]*))$ 38 | 39 | [VARIABLES] 40 | callbacks=_ 41 | init-import=yes 42 | redefining-builtins-modules=six.moves,future.builtins,safeprint 43 | 44 | [DESIGN] 45 | max-args=10 46 | max-attributes=21 47 | max-locals=30 48 | min-public-methods=0 49 | max-parents=14 50 | 51 | [TYPECHECK] 52 | #ignored-modules=worker, comiccrawler.mods.* 53 | -------------------------------------------------------------------------------- /requirements-lock.txt: -------------------------------------------------------------------------------- 1 | alabaster==0.7.12 2 | astroid==2.13.5 3 | Babel==2.10.3 4 | bleach==5.0.1 5 | build==1.0.3 6 | certifi==2023.7.22 7 | chardet==3.0.4 8 | charset-normalizer==3.3.1 9 | colorama==0.4.6 10 | commonmark==0.9.1 11 | dill==0.3.7 12 | docutils==0.19 13 | idna==3.4 14 | imagesize==1.4.1 15 | importlib-metadata==6.8.0 16 | isort==5.12.0 17 | jaraco.classes==3.3.0 18 | Jinja2==3.1.2 19 | keyring==24.2.0 20 | lazy-object-proxy==1.9.0 21 | livereload==2.6.3 22 | markdown-it-py==3.0.0 23 | MarkupSafe==2.1.1 24 | mccabe==0.7.0 25 | mdurl==0.1.2 26 | more-itertools==10.1.0 27 | natsort==6.2.1 28 | nh3==0.2.14 29 | ordered-set==3.1.1 30 | packaging==23.2 31 | pkginfo==1.9.6 32 | platformdirs==3.11.0 33 | Pygments==2.16.1 34 | pylint==2.15.0 35 | pyparsing==3.0.9 36 | pyproject_hooks==1.0.0 37 | pytz==2022.2.1 38 | pywin32-ctypes==0.2.2 39 | pyxcute==0.7.0 40 | readme-renderer==42.0 41 | requests==2.31.0 42 | requests-toolbelt==1.0.0 43 | rfc3986==2.0.0 44 | rich==13.6.0 45 | semver==2.13.0 46 | Send2Trash==1.8.2 47 | setuptools==68.2.2 48 | six==1.16.0 49 | snowballstemmer==2.2.0 50 | Sphinx==5.1.1 51 | sphinxcontrib-applehelp==1.0.2 52 | sphinxcontrib-devhelp==1.0.2 53 | sphinxcontrib-htmlhelp==2.0.0 54 | sphinxcontrib-jsmath==1.0.1 55 | sphinxcontrib-qthelp==1.0.3 56 | sphinxcontrib-serializinghtml==1.1.5 57 | toml==0.10.2 58 | tomli==2.0.1 59 | tomlkit==0.12.1 60 | tornado==6.3.3 61 | tqdm==4.63.0 62 | twine==4.0.1 63 | typing_extensions==4.8.0 64 | urllib3==2.0.7 65 | webencodings==0.5.1 66 | wrapt==1.15.0 67 | zipp==3.17.0 -------------------------------------------------------------------------------- /cute.py: -------------------------------------------------------------------------------- 1 | from xcute import cute, LiveReload, run_task 2 | 3 | class Env: 4 | def __init__(self, task, **env): 5 | self.task = task 6 | self.env = env 7 | 8 | def __call__(self, *args): 9 | import os 10 | backup = {} 11 | try: 12 | for key, value in self.env.items(): 13 | backup[key] = os.environ.get(key, None) 14 | os.environ[key] = value 15 | return run_task(self.task, *args) 16 | finally: 17 | for key, value in backup.items(): 18 | if value is None: 19 | del os.environ[key] 20 | else: 21 | os.environ[key] = value 22 | 23 | class CD: 24 | """Change directory, run the task, then change it back""" 25 | def __init__(self, task, path): 26 | self.task = task 27 | self.path = path 28 | 29 | def __call__(self, *args): 30 | import os 31 | backup = os.getcwd() 32 | try: 33 | os.chdir(self.path) 34 | return run_task(self.task, *args) 35 | finally: 36 | os.chdir(backup) 37 | 38 | cute( 39 | pkg_name = "node_vm2", 40 | lint = [ 41 | 'install_npm', 42 | CD('npm test', 'node_vm2/vm-server'), 43 | 'pylint {pkg_name}' 44 | ], 45 | install_npm = CD('npm install', 'node_vm2/vm-server'), 46 | install_npm_prod = CD('npm install --production', 'node_vm2/vm-server'), 47 | test = ['lint', 'python test.py', 'readme_build'], 48 | bump_pre = 'test', 49 | bump_post = ['dist', 'release', 'publish', 'install'], 50 | dist_pre = [ 51 | 'x-clean build dist node_vm2/vm-server/node_modules', 52 | 'install_npm_prod' 53 | ], 54 | dist = 'python -m build', 55 | release = [ 56 | 'git add .', 57 | 'git commit -m "Release v{version}"', 58 | 'git tag -a v{version} -m "Release v{version}"' 59 | ], 60 | publish = [ 61 | 'twine upload dist/*', 62 | 'git push --follow-tags' 63 | ], 64 | publish_err = 'start https://pypi.python.org/pypi/{pkg_name}/', 65 | install = 'pip install -e .', 66 | readme_build = [ 67 | 'rst2html5.py --no-raw --exit-status=1 --verbose ' 68 | 'README.rst | x-pipe build/readme/index.html' 69 | ], 70 | readme_pre = "readme_build", 71 | readme = LiveReload("README.rst", "readme_build", "build/readme"), 72 | doc_build = "sphinx-build docs build/docs", 73 | doc_pre = "doc_build", 74 | doc = LiveReload(["{pkg_name}", "docs"], "doc_build", "build/docs") 75 | ) 76 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | #! python3 2 | 3 | from io import StringIO 4 | from unittest import TestCase, main 5 | from unittest.mock import patch 6 | from node_vm2 import eval, VM, NodeVM, VMError, VMServer 7 | 8 | class Main(TestCase): 9 | def test_eval(self): 10 | with self.subTest("one line eval"): 11 | r = eval("'foo' + 'bar'") 12 | self.assertEqual(r, "foobar") 13 | 14 | with self.subTest("multiline"): 15 | r = eval(""" 16 | var foo = x => x + 'bar'; 17 | foo('foo'); 18 | """) 19 | self.assertEqual(r, "foobar") 20 | 21 | def test_VM(self): 22 | with self.subTest("create VM"): 23 | vm = VM().create() 24 | r = vm.run("'foo' + 'bar'") 25 | vm.destroy() 26 | self.assertEqual(r, "foobar") 27 | 28 | with self.subTest("with statement"): 29 | with VM() as vm: 30 | r = vm.run("'foo' + 'bar'") 31 | self.assertEqual(r, "foobar") 32 | 33 | def test_NodeVM(self): 34 | with self.subTest("create NodeVM"): 35 | vm = NodeVM().create() 36 | m = vm.run("exports.foo = 'foo'") 37 | r = m.get_member("foo") 38 | self.assertEqual(r, "foo") 39 | vm.destroy() 40 | 41 | with self.subTest("with statement"): 42 | with NodeVM() as vm: 43 | m = vm.run("exports.foo = 'foo'") 44 | r = m.get_member("foo") 45 | self.assertEqual(r, "foo") 46 | 47 | with self.subTest("NodeVM.code()"): 48 | with NodeVM.code("exports.foo = 'foo'") as m: 49 | r = m.get_member("foo") 50 | self.assertEqual(r, "foo") 51 | 52 | def test_VMError(self): 53 | with self.assertRaisesRegex(VMError, "foo"): 54 | eval("throw new Error('foo')") 55 | 56 | # doesn't inherit Error 57 | with self.assertRaisesRegex(VMError, "foo"): 58 | eval("throw 'foo'") 59 | 60 | def test_console(self): 61 | code = "exports.test = s => console.log(s)" 62 | with NodeVM.code(code) as module: 63 | with patch("sys.stdout", new=StringIO()) as out: 64 | module.call_member("test", "Hello") 65 | self.assertEqual(out.getvalue(), "Hello\n") 66 | 67 | # redirect and event 68 | with NodeVM.code(code, console="redirect") as module: 69 | module.call_member("test", "Hello") 70 | event = module.vm.event_que.get_nowait() 71 | self.assertEqual(event["value"], "Hello") 72 | 73 | def test_node(self): 74 | with self.assertRaises(VMError) as cm: 75 | with VMServer("non-exists-executable-node"): 76 | pass 77 | 78 | self.assertTrue("'non-exists-executable-node' is unavailable" in str(cm.exception)) 79 | 80 | def test_freeze_object(self): 81 | result = eval("Object.freeze({foo: {}})") 82 | self.assertEqual(result, {"foo": {}}) 83 | 84 | main() 85 | -------------------------------------------------------------------------------- /node_vm2/vm-server/index.js: -------------------------------------------------------------------------------- 1 | /* eslint no-console: 0 */ 2 | 3 | var readline = require("readline"), 4 | vm2 = require("vm2"), 5 | rl = readline.createInterface({ 6 | input: process.stdin 7 | }), 8 | vmList = collection(); 9 | 10 | rl.on("line", line => { 11 | var result, err, input; 12 | input = JSON.parse(line); 13 | try { 14 | result = processLine(input); 15 | } catch (_err) { 16 | err = _err; 17 | } 18 | if (err) { 19 | result = {status: "error", error: err.message || err}; 20 | } else { 21 | result = result || {}; 22 | result.status = "success"; 23 | } 24 | result.id = input.id; 25 | result.type = "response"; 26 | Promise.resolve(result.value) 27 | .then(value => { 28 | result.value = value; 29 | console.log(JSON.stringify(result)); 30 | }) 31 | .catch(error => { 32 | result.status = "error"; 33 | result.error = error.message || error; 34 | delete result.value; 35 | console.log(JSON.stringify(result)); 36 | }); 37 | }); 38 | 39 | function processLine(input) { 40 | switch (input.action) { 41 | case "ping": 42 | return; 43 | 44 | case "close": 45 | setImmediate(() => rl.close()); 46 | return; 47 | 48 | case "create": 49 | return createVM(input); 50 | 51 | case "destroy": 52 | return destroyVM(input); 53 | 54 | default: 55 | var vm = vmList.get(input.vmId); 56 | if (!vm[input.action]) { 57 | throw new Error("Unknown action: " + input.action); 58 | } 59 | return vm[input.action](input); 60 | } 61 | } 62 | 63 | function createVM(input) { 64 | switch (input.type) { 65 | case "VM": 66 | return createNormalVM(input); 67 | 68 | case "NodeVM": 69 | return createNodeVM(input); 70 | 71 | default: 72 | throw new Error("Unknown VM type: " + input.type); 73 | } 74 | } 75 | 76 | function destroyVM(input) { 77 | vmList.remove(input.vmId); 78 | } 79 | 80 | function createNormalVM(input) { 81 | var _vm = new vm2.VM(input.options); 82 | if (input.code) { 83 | _vm.run(input.code); 84 | } 85 | var vm = { 86 | run({code}) { 87 | return { 88 | value: _vm.run(code) 89 | }; 90 | }, 91 | call({functionName, args}) { 92 | return { 93 | value: _vm.run(functionName)(...args) 94 | }; 95 | } 96 | }; 97 | return { 98 | value: vmList.add(vm) 99 | }; 100 | } 101 | 102 | function createNodeVM(input) { 103 | if (!input.options) { 104 | input.options = {}; 105 | } 106 | var _console = input.options.console || "inherit"; 107 | if (_console != "off") { 108 | input.options.console = "redirect"; 109 | } 110 | var _vm = new vm2.NodeVM(input.options), 111 | modules = collection(); 112 | var vm = { 113 | run({code, filename}) { 114 | const mod = filename != null ? 115 | _vm.run(code, filename) : 116 | _vm.run(code); 117 | return { 118 | value: modules.add(mod) 119 | }; 120 | }, 121 | get({moduleId}) { 122 | return { 123 | value: modules.get(moduleId) 124 | }; 125 | }, 126 | call({moduleId, args = []}) { 127 | return { 128 | value: modules.get(moduleId)(...args) 129 | }; 130 | }, 131 | getMember({moduleId, member}) { 132 | return { 133 | value: modules.get(moduleId)[member] 134 | }; 135 | }, 136 | callMember({moduleId, member, args = []}) { 137 | return { 138 | value: modules.get(moduleId)[member](...args) 139 | }; 140 | }, 141 | destroyModule({moduleId}) { 142 | modules.remove(moduleId); 143 | } 144 | }; 145 | var id = vmList.add(vm); 146 | if (_console != "off") { 147 | _vm.on("console.log", (...args) => { 148 | var event = { 149 | vmId: id, 150 | type: "event", 151 | name: "console.log", 152 | value: args.join(" ") 153 | }; 154 | console.log(JSON.stringify(event)); 155 | }); 156 | _vm.on("console.error", (...args) => { 157 | var event = { 158 | vmId: id, 159 | type: "event", 160 | name: "console.log", 161 | value: args.join(" ") 162 | }; 163 | console.log(JSON.stringify(event)); 164 | }); 165 | } 166 | return { 167 | value: id 168 | }; 169 | } 170 | 171 | function collection() { 172 | var inc = 1, 173 | hold = Object.create(null); 174 | return { 175 | add(item) { 176 | hold[inc] = item; 177 | return inc++; 178 | }, 179 | remove(id) { 180 | if (!(id in hold)) { 181 | throw new Error("Index doesn't exist: " + id); 182 | } 183 | delete hold[id]; 184 | }, 185 | get(id) { 186 | if (!(id in hold)) { 187 | throw new Error("Index doesn't exist: " + id); 188 | } 189 | return hold[id]; 190 | }, 191 | has(id) { 192 | return id in hold; 193 | } 194 | }; 195 | } 196 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | node_vm2 2 | ======== 3 | 4 | .. image:: https://readthedocs.org/projects/node-vm2/badge/?version=latest 5 | :target: http://node-vm2.readthedocs.io/en/latest/?badge=latest 6 | :alt: Documentation Status 7 | 8 | .. image:: https://github.com/eight04/node_vm2/actions/workflows/test.yml/badge.svg 9 | :target: https://github.com/eight04/node_vm2/actions/workflows/test.yml 10 | :alt: test 11 | 12 | .. warning:: 13 | This project is no longer maintained. Please use `deno_vm `__ instead. 14 | 15 | A Python 3 to Node.js + vm2 binding, helps you execute JavaScript safely. 16 | 17 | vm2 18 | --- 19 | 20 | `vm2 `__ is a node module to create **real** sandbox in node. The official node API `vm `__, can only create isolate context and doesn't prevent harmful code to damage your computer. 21 | 22 | How it works 23 | ------------ 24 | 25 | The module launchs a Node.js REPL server, which can be communicated with JSON. All JavaScript code are encoded in JSON and sent to the server. After the server executing the code in vm2, the result is sent back to Python. 26 | 27 | Install 28 | ------- 29 | 30 | You need Node.js. 31 | 32 | https://nodejs.org/ 33 | 34 | Install node_vm2 from pypi wheel. 35 | 36 | .. code-block:: 37 | 38 | pip install node_vm2 39 | 40 | Also make sure you have ``node`` executable in ``PATH``, or you can specify the executable with environment variable ``NODE_EXECUTABLE``. 41 | 42 | Additionally, you will need ``npm`` to build node_vm2 from source. 43 | 44 | Usage 45 | ----- 46 | 47 | Most of the APIs are bound to `vm2 `__. 48 | 49 | Simple eval: 50 | 51 | .. code-block:: python 52 | 53 | from node_vm2 import eval 54 | 55 | print(eval("['foo', 'bar'].join()")) 56 | 57 | Use VM: 58 | 59 | .. code-block:: python 60 | 61 | from node_vm2 import VM 62 | 63 | with VM() as vm: 64 | vm.run(""" 65 | var sum = 0, i; 66 | for (i = 0; i < 10; i++) sum += i; 67 | """) 68 | print(vm.run("sum")) 69 | 70 | Use NodeVM: 71 | 72 | .. code-block:: python 73 | 74 | from node_vm2 import NodeVM 75 | 76 | js = """exports.greet = name => console.log(`Hello ${name}!`);""" 77 | 78 | with NodeVM.code(js) as module: 79 | module.call_member("greet", "John") 80 | 81 | It is possible to do async task with Promise: 82 | 83 | .. code-block:: python 84 | 85 | from datetime import datetime 86 | from node_vm2 import NodeVM 87 | 88 | js = """ 89 | exports.test = () => { 90 | return new Promise(resolve => { 91 | setTimeout(() => { 92 | resolve("hello") 93 | }, 3000); 94 | }); 95 | }; 96 | """ 97 | with NodeVM.code(js) as module: 98 | print(datetime.now()) 99 | print(module.call_member("test")) 100 | print(datetime.now()) 101 | 102 | If you like to allow the VM to crash your server (e.g. ``process.exit()``), you should create the VM in a separate server so it won't affect other VMs: 103 | 104 | .. code-block:: python 105 | 106 | from node_vm2 import VMServer, VM 107 | 108 | with VMServer() as server: 109 | with VM(server=server) as vm: 110 | # now the vm is created in a new server 111 | print(vm.run("1 + 2 + 3")) 112 | 113 | API reference 114 | ------------- 115 | 116 | http://node-vm2.readthedocs.io/ 117 | 118 | Changelog 119 | --------- 120 | 121 | - 0.4.6 (Oct 23, 2023) 122 | 123 | - **Change: add deprecation warning.** 124 | - Update vm2 to 3.9.19. 125 | 126 | - 0.4.5 (Sep 1, 2022) 127 | 128 | - Update vm2 to 3.9.11. 129 | 130 | - 0.4.4 (Mar 14, 2022) 131 | 132 | - Update vm2 to 3.9.9. 133 | 134 | - 0.4.3 (Feb 15, 2022) 135 | 136 | - Update vm2 to 3.9.7. 137 | 138 | - 0.4.2 (Feb 9, 2022) 139 | 140 | - Update vm2 to 3.9.6. 141 | 142 | - Fix: filename is optional. 143 | 144 | - 0.4.1 (Oct 20, 2021) 145 | 146 | - Update vm2 to 3.9.5. 147 | 148 | - 0.4.0 (Sep 2, 2021) 149 | 150 | - Update vm2 to 3.9.3. 151 | - **Change: throw VMError when failed running node.** 152 | 153 | - 0.3.7 (Mar 23, 2020) 154 | 155 | - Update vm2 to 3.9.0. 156 | 157 | - 0.3.6 (Apr 22, 2019) 158 | 159 | - Update vm2 to 3.8.0. Fix security issues. 160 | 161 | - 0.3.5 (Feb 10, 2019) 162 | 163 | - Update vm2 to 3.6.10. Fix security issues. 164 | 165 | - 0.3.4 (Aug 10, 2018) 166 | 167 | - Update vm2 to 3.6.3. Fix security issues. 168 | 169 | - 0.3.3 (Jul 23, 2018) 170 | 171 | - Fix: don't bundle dev dependencies. 172 | 173 | - 0.3.2 (Jul 23, 2018) 174 | 175 | - Fix: getting a freezed object would crash the server. 176 | - Update vm2 to 3.6.2. Fix security issues. 177 | 178 | - 0.3.1 (Apr 25, 2017) 179 | 180 | - Add ``command`` arg to ``VMServer``. 181 | - Fix: A dead default server is created if process spawning failed. 182 | 183 | - 0.3.0 (Apr 23, 2017) 184 | 185 | - **Change: use event queue to handle console redirects.** 186 | - Reconize object thrown by VM which doesn't inherit built-in Error. 187 | 188 | - 0.2.0 (Mar 25, 2017) 189 | 190 | - **Drop NodeBridge.** 191 | - Add VMServer. 192 | - **Make all VMs share a default VMServer.** 193 | - **Method rename: VM.connect -> VM.create, VM.close -> VM.destroy.** 194 | 195 | - 0.1.0 (Mar 23, 2017) 196 | 197 | - First release 198 | 199 | -------------------------------------------------------------------------------- /node_vm2/__init__.py: -------------------------------------------------------------------------------- 1 | #! python3 2 | 3 | import atexit 4 | import json 5 | from queue import Queue 6 | import sys 7 | from threading import Thread, Event, Lock 8 | from subprocess import Popen, PIPE 9 | from os import path, environ 10 | 11 | from .__pkginfo__ import __version__ 12 | 13 | NODE_EXECUTABLE = "node" 14 | VM_SERVER = path.join(path.dirname(__file__), "vm-server") 15 | 16 | import warnings 17 | warnings.warn("node_vm2 is deprecated. Please use deno_vm instead.", FutureWarning) 18 | 19 | def eval(code, **options): 20 | """A shortcut to eval JavaScript. 21 | 22 | :param str code: The code to be run. 23 | :param options: Additional options sent to :meth:`VM.__init__`. 24 | 25 | This function will create a :class:`VM`, run the code, and return the 26 | result. 27 | """ 28 | with VM(**options) as vm: 29 | # https://github.com/PyCQA/pylint/issues/3450 30 | # pylint: disable=no-member 31 | return vm.run(code) 32 | 33 | DEFAULT_BRIDGE = None 34 | 35 | def default_bridge(): 36 | global DEFAULT_BRIDGE 37 | if DEFAULT_BRIDGE is not None: 38 | return DEFAULT_BRIDGE 39 | 40 | DEFAULT_BRIDGE = VMServer().start() 41 | return DEFAULT_BRIDGE 42 | 43 | @atexit.register 44 | def close(): 45 | if DEFAULT_BRIDGE is not None: 46 | DEFAULT_BRIDGE.close() 47 | 48 | class BaseVM: 49 | """BaseVM class, containing some common methods for VMs. 50 | """ 51 | def __init__(self, server=None): 52 | """ 53 | :param VMServer server: Optional. If provided, the VM will be created 54 | on the server. Otherwise, the VM will be created on a default 55 | server, which is started on the first creation of VMs. 56 | """ 57 | if server is None: 58 | server = default_bridge() 59 | self.bridge = server 60 | self.id = None 61 | self.event_que = None 62 | self.console = "off" 63 | 64 | def __enter__(self): 65 | """This class can be used as a context manager, which automatically 66 | :meth:`create` when entering the context. 67 | """ 68 | self.create() 69 | return self 70 | 71 | def __exit__(self, exc_type, exc_value, traceback): 72 | """See :meth:`destroy`""" 73 | self.destroy() 74 | 75 | def before_create(self, data): 76 | """Overwrite. Extend data before creating the VM.""" 77 | pass 78 | 79 | def create(self): 80 | """Create the VM.""" 81 | data = {"action": "create"} 82 | self.before_create(data) 83 | self.id = self.communicate(data) 84 | self.bridge.add_vm(self) 85 | return self 86 | 87 | def destroy(self): 88 | """Destroy the VM.""" 89 | self.communicate({"action": "destroy"}) 90 | self.bridge.remove_vm(self) 91 | self.id = None 92 | return self 93 | 94 | def communicate(self, data): 95 | """Communicate with server. Wraps :meth:`VMServer.communicate` so we 96 | can add additional properties to data. 97 | 98 | This method would raise an :class:`VMError` if vm-server response an 99 | error. 100 | """ 101 | data["vmId"] = self.id 102 | data = self.bridge.communicate(data) 103 | if data["status"] != "success": 104 | raise VMError(data["error"]) 105 | return data.get("value") 106 | 107 | class VM(BaseVM): 108 | """VM class, represent `vm2.VM `_. 109 | """ 110 | def __init__(self, code=None, server=None, **options): 111 | """ 112 | :param str code: Optional JavaScript code to run after creating 113 | the VM. Useful to define some functions. 114 | 115 | :param VMServer server: Optional VMServer. See :class:`BaseVM` 116 | for details. 117 | 118 | :param options: The options for `vm2.VM`_. 119 | """ 120 | super().__init__(server) 121 | self.id = None 122 | self.code = code 123 | self.options = options 124 | 125 | def before_create(self, data): 126 | """Create VM.""" 127 | data.update(type="VM", code=self.code, options=self.options) 128 | 129 | def run(self, code): 130 | """Execute JavaScript and return the result. 131 | 132 | If the server responses an error, a :class:`VMError` will be raised. 133 | """ 134 | return self.communicate({"action": "run", "code": code}) 135 | 136 | def call(self, function_name, *args): 137 | """Call a function and return the result. 138 | 139 | :param str function_name: The function to call. 140 | :param args: Function arguments. 141 | 142 | function_name can include "." to call functions on an object. However, 143 | it is called like: 144 | 145 | .. code-block:: javascript 146 | 147 | var func = vm.run("function.to.call"); 148 | return func(...args); 149 | 150 | So ``this`` keyword might doesn't work as expected. 151 | """ 152 | return self.communicate({ 153 | "action": "call", 154 | "functionName": function_name, 155 | "args": args 156 | }) 157 | 158 | class NodeVM(BaseVM): 159 | """NodeVM class, represent `vm2.NodeVM 160 | `_. 161 | """ 162 | def __init__(self, server=None, **options): 163 | """ 164 | :param VMServer server: Optional VMServer. See :class:`BaseVM` 165 | for details. 166 | 167 | :param options: the options for `vm2.NodeVM`_. 168 | 169 | If ``console="redirect"``, those console output will return as events, 170 | stored in an event queue, which could be accessed with 171 | :attr:`event_que`. 172 | """ 173 | super().__init__(server) 174 | self.options = options 175 | self.console = options.get("console", "inherit") 176 | 177 | self.event_que = Queue() 178 | """A :class:`queue.Queue` object containing console events. 179 | 180 | An event is a :class:`dict` and you can get the text value with: 181 | 182 | .. code:: python 183 | 184 | event = self.event_que.get() 185 | text = event.get("value") 186 | 187 | """ 188 | 189 | def before_create(self, data): 190 | """Create NodeVM.""" 191 | data.update(type="NodeVM", options=self.options) 192 | 193 | def run(self, code, filename=None): 194 | """Run the code and return a :class:`NodeVMModule`. 195 | 196 | :param str code: The code to be run. The code should look like a 197 | commonjs module (or an IIFE module, according to the options). See 198 | `vm2.NodeVM`_ for details. 199 | 200 | :param str filename: Optional, used for stack trace. Currently this 201 | has no effect. (should vm-server send traceback back?) 202 | 203 | :return: :class:`NodeVMModule`. 204 | """ 205 | id = self.communicate({ 206 | "action": "run", 207 | "code": code, 208 | "filename": filename 209 | }) 210 | return NodeVMModule(id, self) 211 | 212 | @classmethod 213 | def code(cls, code, filename=None, **kwargs): 214 | """A class method helping you create a module in VM. 215 | 216 | :param str code: The code sent to :meth:`run`. 217 | :param str filename: The filename sent to :meth:`run`. 218 | :param kwargs: Other arguments are sent to constructor. 219 | 220 | .. code-block:: python 221 | 222 | with NodeVM() as vm: 223 | module = vm.run(code) 224 | result = module.call_member("method") 225 | 226 | vs. 227 | 228 | .. code-block:: python 229 | 230 | with NodeVM.code(code) as module: 231 | result = module.call_member("method") 232 | # access the vm with `module.vm` 233 | """ 234 | vm = cls(**kwargs) 235 | module = vm.create().run(code, filename) 236 | module.CLOSE_ON_EXIT = True 237 | return module 238 | 239 | class NodeVMModule: 240 | """Since we can only pass JSON between python and node, we use 241 | this wrapper to access the module created by :meth:`NodeVM.run`. 242 | 243 | This class shouldn't be initiated by users directly. 244 | 245 | You can access the VM object with attribute :attr:`NodeVMModule.vm`. 246 | """ 247 | def __init__(self, id, vm): 248 | self.id = id 249 | self.vm = vm 250 | self.CLOSE_ON_EXIT = False 251 | 252 | def __enter__(self): 253 | """This class can be used as a context manager. See :meth:`NodeVM.code`. 254 | """ 255 | return self 256 | 257 | def __exit__(self, exc_type, exc_value, tracback): 258 | """Destroy the VM if: 259 | 260 | 1. This method is called. 261 | 2. The module is created by :meth:`NodeVM.code`. 262 | """ 263 | if self.CLOSE_ON_EXIT: 264 | self.vm.destroy() 265 | 266 | def communicate(self, data): 267 | """Wraps :meth:`vm.communicate`. So we can set additional properties 268 | on the data before communication. 269 | """ 270 | data["moduleId"] = self.id 271 | return self.vm.communicate(data) 272 | 273 | def call(self, *args): 274 | """Call the module, in case that the module itself is a function.""" 275 | return self.communicate({ 276 | "action": "call", 277 | "args": args 278 | }) 279 | 280 | def get(self): 281 | """Return the module, in case that the module itself is json-encodable. 282 | """ 283 | return self.communicate({ 284 | "action": "get" 285 | }) 286 | 287 | def call_member(self, member, *args): 288 | """Call a function member. 289 | 290 | :param str member: Member's name. 291 | :param args: Function arguments. 292 | """ 293 | return self.communicate({ 294 | "action": "callMember", 295 | "member": member, 296 | "args": args 297 | }) 298 | 299 | def get_member(self, member): 300 | """Return member value. 301 | 302 | :param str member: Member's name. 303 | """ 304 | return self.communicate({ 305 | "action": "getMember", 306 | "member": member 307 | }) 308 | 309 | def destroy(self): 310 | """Destroy the module. 311 | 312 | You don't need this if you can just destroy the VM. 313 | """ 314 | out = self.communicate({ 315 | "action": "destroyModule" 316 | }) 317 | if self.CLOSE_ON_EXIT: 318 | self.vm.destroy() 319 | return out 320 | 321 | class VMServer: 322 | """VMServer class, represent vm-server. See :meth:`start` for details.""" 323 | def __init__(self, command=None): 324 | """ 325 | :param str command: the command to spawn node process. If not set, it 326 | would use: 327 | 328 | 1. Environment variable ``NODE_EXECUTABLE`` 329 | 2. "node" 330 | """ 331 | 332 | self.closed = None 333 | self.process = None 334 | self.vms = {} 335 | self.poll = {} 336 | self.write_lock = Lock() 337 | self.poll_lock = Lock() 338 | self.inc = 1 339 | if command is None: 340 | command = environ.get("NODE_EXECUTABLE", NODE_EXECUTABLE) 341 | self.command = command 342 | 343 | def __enter__(self): 344 | """This class can be used as a context manager, which automatically 345 | :meth:`start` the server. 346 | 347 | .. code-block:: python 348 | 349 | server = VMServer() 350 | server.start() 351 | # create VMs on the server... 352 | server.close() 353 | 354 | vs. 355 | 356 | .. code-block:: python 357 | 358 | with VMServer() as server: 359 | # create VMs on the server... 360 | """ 361 | return self.start() 362 | 363 | def __exit__(self, exc_type, exc_value, traceback): 364 | """See :meth:`close`.""" 365 | self.close() 366 | 367 | def start(self): 368 | """Spawn a Node.js subprocess and run vm-server. 369 | 370 | vm-server is a REPL server, which allows us to connect to it with 371 | stdios. You can find the script at ``node_vm2/vm-server`` (`Github 372 | `__). 373 | 374 | Communication using JSON:: 375 | 376 | > {"id": 1, "action": "create", "type": "VM"} 377 | {"id": 1, "status": "success"} 378 | 379 | > {"id": 2, "action": "run", "code": "var a = 0; a += 10; a"} 380 | {"id": 2, "status": "success", "value": 10} 381 | 382 | > {"id": 3, "action": "xxx"} 383 | {"id": 3, "status": "error", "error": "Unknown action: xxx"} 384 | 385 | A :class:`VMError` will be thrown if the node process cannot be spawned. 386 | """ 387 | if self.closed: 388 | raise VMError("The VM is closed") 389 | 390 | args = [self.command, VM_SERVER] 391 | try: 392 | self.process = Popen(args, bufsize=0, stdin=PIPE, stdout=PIPE) # pylint: disable=consider-using-with 393 | except FileNotFoundError as err: 394 | raise VMError(f"Failed starting VM server. '{self.command}' is unavailable.") from err 395 | except Exception as err: 396 | raise VMError("Failed starting VM server") from err 397 | 398 | def reader(): 399 | for data in self.process.stdout: 400 | try: 401 | # FIXME: https://github.com/PyCQA/pylint/issues/922 402 | data = json.loads(data.decode("utf-8")) or {} 403 | except json.JSONDecodeError: 404 | # the server is down? 405 | self.close() 406 | return 407 | 408 | if data["type"] == "response": 409 | with self.poll_lock: 410 | self.poll[data["id"]][1] = data 411 | self.poll[data["id"]][0].set() 412 | 413 | elif data["type"] == "event": 414 | try: 415 | vm = self.vms[data["vmId"]] 416 | except KeyError: 417 | # the vm is destroyed 418 | continue 419 | 420 | if data["name"] == "console.log": 421 | if vm.console == "redirect": 422 | vm.event_que.put(data) 423 | 424 | elif vm.console == "inherit": 425 | sys.stdout.write(data.get("value", "") + "\n") 426 | 427 | elif data["name"] == "console.error": 428 | if vm.console == "redirect": 429 | vm.event_que.put(data) 430 | 431 | elif vm.console == "inherit": 432 | sys.stderr.write(data.get("value", "") + "\n") 433 | 434 | Thread(target=reader, daemon=True).start() 435 | 436 | data = self.communicate({"action": "ping"}) 437 | if data["status"] == "error": 438 | raise VMError("Failed to start: " + data["error"]) 439 | self.closed = False 440 | return self 441 | 442 | def close(self): 443 | """Close the server. Once the server is closed, it can't be 444 | re-open.""" 445 | if self.closed: 446 | return self 447 | try: 448 | data = self.communicate({"action": "close"}) 449 | if data["status"] == "error": 450 | raise VMError("Failed to close: " + data["error"]) 451 | except OSError: 452 | # the process is down? 453 | pass 454 | self.process.communicate() 455 | self.process = None 456 | self.closed = True 457 | 458 | with self.poll_lock: 459 | for event, _data in self.poll.values(): 460 | event.set() 461 | return self 462 | 463 | def add_vm(self, vm): 464 | self.vms[vm.id] = vm 465 | 466 | def remove_vm(self, vm): 467 | del self.vms[vm.id] 468 | 469 | def generate_id(self): 470 | """Generate unique id for each communication.""" 471 | inc = self.inc 472 | self.inc += 1 473 | return inc 474 | 475 | def communicate(self, data): 476 | """Send data to Node and return the response. 477 | 478 | :param dict data: must be json-encodable and follow vm-server's 479 | protocol. An unique id is automatically assigned to data. 480 | 481 | This method is thread-safe. 482 | """ 483 | id = self.generate_id() 484 | 485 | data["id"] = id 486 | text = json.dumps(data) + "\n" 487 | 488 | event = Event() 489 | 490 | with self.poll_lock: 491 | self.poll[id] = [event, None] 492 | 493 | # FIXME: do we really need lock for write? 494 | with self.write_lock: 495 | self.process.stdin.write(text.encode("utf-8")) 496 | 497 | event.wait() 498 | 499 | with self.poll_lock: 500 | data = self.poll[id][1] 501 | del self.poll[id] 502 | return data 503 | 504 | class VMError(Exception): 505 | """Errors thrown by VM.""" 506 | pass 507 | 508 | -------------------------------------------------------------------------------- /node_vm2/vm-server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vm-server", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "vm-server", 8 | "dependencies": { 9 | "vm2": "^3.9.11" 10 | }, 11 | "devDependencies": { 12 | "eslint": "^8.51.0" 13 | } 14 | }, 15 | "node_modules/@aashutoshrathi/word-wrap": { 16 | "version": "1.2.6", 17 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 18 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 19 | "dev": true, 20 | "engines": { 21 | "node": ">=0.10.0" 22 | } 23 | }, 24 | "node_modules/@eslint-community/eslint-utils": { 25 | "version": "4.4.0", 26 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 27 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 28 | "dev": true, 29 | "dependencies": { 30 | "eslint-visitor-keys": "^3.3.0" 31 | }, 32 | "engines": { 33 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 34 | }, 35 | "peerDependencies": { 36 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 37 | } 38 | }, 39 | "node_modules/@eslint-community/regexpp": { 40 | "version": "4.9.1", 41 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", 42 | "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", 43 | "dev": true, 44 | "engines": { 45 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 46 | } 47 | }, 48 | "node_modules/@eslint/eslintrc": { 49 | "version": "2.1.2", 50 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", 51 | "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", 52 | "dev": true, 53 | "dependencies": { 54 | "ajv": "^6.12.4", 55 | "debug": "^4.3.2", 56 | "espree": "^9.6.0", 57 | "globals": "^13.19.0", 58 | "ignore": "^5.2.0", 59 | "import-fresh": "^3.2.1", 60 | "js-yaml": "^4.1.0", 61 | "minimatch": "^3.1.2", 62 | "strip-json-comments": "^3.1.1" 63 | }, 64 | "engines": { 65 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 66 | }, 67 | "funding": { 68 | "url": "https://opencollective.com/eslint" 69 | } 70 | }, 71 | "node_modules/@eslint/js": { 72 | "version": "8.51.0", 73 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", 74 | "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", 75 | "dev": true, 76 | "engines": { 77 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 78 | } 79 | }, 80 | "node_modules/@humanwhocodes/config-array": { 81 | "version": "0.11.11", 82 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", 83 | "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", 84 | "dev": true, 85 | "dependencies": { 86 | "@humanwhocodes/object-schema": "^1.2.1", 87 | "debug": "^4.1.1", 88 | "minimatch": "^3.0.5" 89 | }, 90 | "engines": { 91 | "node": ">=10.10.0" 92 | } 93 | }, 94 | "node_modules/@humanwhocodes/module-importer": { 95 | "version": "1.0.1", 96 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 97 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 98 | "dev": true, 99 | "engines": { 100 | "node": ">=12.22" 101 | }, 102 | "funding": { 103 | "type": "github", 104 | "url": "https://github.com/sponsors/nzakas" 105 | } 106 | }, 107 | "node_modules/@humanwhocodes/object-schema": { 108 | "version": "1.2.1", 109 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 110 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 111 | "dev": true 112 | }, 113 | "node_modules/@nodelib/fs.scandir": { 114 | "version": "2.1.5", 115 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 116 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 117 | "dev": true, 118 | "dependencies": { 119 | "@nodelib/fs.stat": "2.0.5", 120 | "run-parallel": "^1.1.9" 121 | }, 122 | "engines": { 123 | "node": ">= 8" 124 | } 125 | }, 126 | "node_modules/@nodelib/fs.stat": { 127 | "version": "2.0.5", 128 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 129 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 130 | "dev": true, 131 | "engines": { 132 | "node": ">= 8" 133 | } 134 | }, 135 | "node_modules/@nodelib/fs.walk": { 136 | "version": "1.2.8", 137 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 138 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 139 | "dev": true, 140 | "dependencies": { 141 | "@nodelib/fs.scandir": "2.1.5", 142 | "fastq": "^1.6.0" 143 | }, 144 | "engines": { 145 | "node": ">= 8" 146 | } 147 | }, 148 | "node_modules/acorn": { 149 | "version": "8.10.0", 150 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 151 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 152 | "bin": { 153 | "acorn": "bin/acorn" 154 | }, 155 | "engines": { 156 | "node": ">=0.4.0" 157 | } 158 | }, 159 | "node_modules/acorn-jsx": { 160 | "version": "5.3.2", 161 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 162 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 163 | "dev": true, 164 | "peerDependencies": { 165 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 166 | } 167 | }, 168 | "node_modules/acorn-walk": { 169 | "version": "8.2.0", 170 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 171 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 172 | "engines": { 173 | "node": ">=0.4.0" 174 | } 175 | }, 176 | "node_modules/ajv": { 177 | "version": "6.12.6", 178 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 179 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 180 | "dev": true, 181 | "dependencies": { 182 | "fast-deep-equal": "^3.1.1", 183 | "fast-json-stable-stringify": "^2.0.0", 184 | "json-schema-traverse": "^0.4.1", 185 | "uri-js": "^4.2.2" 186 | }, 187 | "funding": { 188 | "type": "github", 189 | "url": "https://github.com/sponsors/epoberezkin" 190 | } 191 | }, 192 | "node_modules/ansi-regex": { 193 | "version": "5.0.1", 194 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 195 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 196 | "dev": true, 197 | "engines": { 198 | "node": ">=8" 199 | } 200 | }, 201 | "node_modules/ansi-styles": { 202 | "version": "4.3.0", 203 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 204 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 205 | "dev": true, 206 | "dependencies": { 207 | "color-convert": "^2.0.1" 208 | }, 209 | "engines": { 210 | "node": ">=8" 211 | }, 212 | "funding": { 213 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 214 | } 215 | }, 216 | "node_modules/argparse": { 217 | "version": "2.0.1", 218 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 219 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 220 | "dev": true 221 | }, 222 | "node_modules/balanced-match": { 223 | "version": "1.0.2", 224 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 225 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 226 | "dev": true 227 | }, 228 | "node_modules/brace-expansion": { 229 | "version": "1.1.11", 230 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 231 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 232 | "dev": true, 233 | "dependencies": { 234 | "balanced-match": "^1.0.0", 235 | "concat-map": "0.0.1" 236 | } 237 | }, 238 | "node_modules/callsites": { 239 | "version": "3.1.0", 240 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 241 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 242 | "dev": true, 243 | "engines": { 244 | "node": ">=6" 245 | } 246 | }, 247 | "node_modules/chalk": { 248 | "version": "4.1.2", 249 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 250 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 251 | "dev": true, 252 | "dependencies": { 253 | "ansi-styles": "^4.1.0", 254 | "supports-color": "^7.1.0" 255 | }, 256 | "engines": { 257 | "node": ">=10" 258 | }, 259 | "funding": { 260 | "url": "https://github.com/chalk/chalk?sponsor=1" 261 | } 262 | }, 263 | "node_modules/color-convert": { 264 | "version": "2.0.1", 265 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 266 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 267 | "dev": true, 268 | "dependencies": { 269 | "color-name": "~1.1.4" 270 | }, 271 | "engines": { 272 | "node": ">=7.0.0" 273 | } 274 | }, 275 | "node_modules/color-name": { 276 | "version": "1.1.4", 277 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 278 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 279 | "dev": true 280 | }, 281 | "node_modules/concat-map": { 282 | "version": "0.0.1", 283 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 284 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 285 | "dev": true 286 | }, 287 | "node_modules/cross-spawn": { 288 | "version": "7.0.3", 289 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 290 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 291 | "dev": true, 292 | "dependencies": { 293 | "path-key": "^3.1.0", 294 | "shebang-command": "^2.0.0", 295 | "which": "^2.0.1" 296 | }, 297 | "engines": { 298 | "node": ">= 8" 299 | } 300 | }, 301 | "node_modules/debug": { 302 | "version": "4.3.4", 303 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 304 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 305 | "dev": true, 306 | "dependencies": { 307 | "ms": "2.1.2" 308 | }, 309 | "engines": { 310 | "node": ">=6.0" 311 | }, 312 | "peerDependenciesMeta": { 313 | "supports-color": { 314 | "optional": true 315 | } 316 | } 317 | }, 318 | "node_modules/deep-is": { 319 | "version": "0.1.4", 320 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 321 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 322 | "dev": true 323 | }, 324 | "node_modules/doctrine": { 325 | "version": "3.0.0", 326 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 327 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 328 | "dev": true, 329 | "dependencies": { 330 | "esutils": "^2.0.2" 331 | }, 332 | "engines": { 333 | "node": ">=6.0.0" 334 | } 335 | }, 336 | "node_modules/escape-string-regexp": { 337 | "version": "4.0.0", 338 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 339 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 340 | "dev": true, 341 | "engines": { 342 | "node": ">=10" 343 | }, 344 | "funding": { 345 | "url": "https://github.com/sponsors/sindresorhus" 346 | } 347 | }, 348 | "node_modules/eslint": { 349 | "version": "8.51.0", 350 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", 351 | "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", 352 | "dev": true, 353 | "dependencies": { 354 | "@eslint-community/eslint-utils": "^4.2.0", 355 | "@eslint-community/regexpp": "^4.6.1", 356 | "@eslint/eslintrc": "^2.1.2", 357 | "@eslint/js": "8.51.0", 358 | "@humanwhocodes/config-array": "^0.11.11", 359 | "@humanwhocodes/module-importer": "^1.0.1", 360 | "@nodelib/fs.walk": "^1.2.8", 361 | "ajv": "^6.12.4", 362 | "chalk": "^4.0.0", 363 | "cross-spawn": "^7.0.2", 364 | "debug": "^4.3.2", 365 | "doctrine": "^3.0.0", 366 | "escape-string-regexp": "^4.0.0", 367 | "eslint-scope": "^7.2.2", 368 | "eslint-visitor-keys": "^3.4.3", 369 | "espree": "^9.6.1", 370 | "esquery": "^1.4.2", 371 | "esutils": "^2.0.2", 372 | "fast-deep-equal": "^3.1.3", 373 | "file-entry-cache": "^6.0.1", 374 | "find-up": "^5.0.0", 375 | "glob-parent": "^6.0.2", 376 | "globals": "^13.19.0", 377 | "graphemer": "^1.4.0", 378 | "ignore": "^5.2.0", 379 | "imurmurhash": "^0.1.4", 380 | "is-glob": "^4.0.0", 381 | "is-path-inside": "^3.0.3", 382 | "js-yaml": "^4.1.0", 383 | "json-stable-stringify-without-jsonify": "^1.0.1", 384 | "levn": "^0.4.1", 385 | "lodash.merge": "^4.6.2", 386 | "minimatch": "^3.1.2", 387 | "natural-compare": "^1.4.0", 388 | "optionator": "^0.9.3", 389 | "strip-ansi": "^6.0.1", 390 | "text-table": "^0.2.0" 391 | }, 392 | "bin": { 393 | "eslint": "bin/eslint.js" 394 | }, 395 | "engines": { 396 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 397 | }, 398 | "funding": { 399 | "url": "https://opencollective.com/eslint" 400 | } 401 | }, 402 | "node_modules/eslint-scope": { 403 | "version": "7.2.2", 404 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 405 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 406 | "dev": true, 407 | "dependencies": { 408 | "esrecurse": "^4.3.0", 409 | "estraverse": "^5.2.0" 410 | }, 411 | "engines": { 412 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 413 | }, 414 | "funding": { 415 | "url": "https://opencollective.com/eslint" 416 | } 417 | }, 418 | "node_modules/eslint-visitor-keys": { 419 | "version": "3.4.3", 420 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 421 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 422 | "dev": true, 423 | "engines": { 424 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 425 | }, 426 | "funding": { 427 | "url": "https://opencollective.com/eslint" 428 | } 429 | }, 430 | "node_modules/espree": { 431 | "version": "9.6.1", 432 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 433 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 434 | "dev": true, 435 | "dependencies": { 436 | "acorn": "^8.9.0", 437 | "acorn-jsx": "^5.3.2", 438 | "eslint-visitor-keys": "^3.4.1" 439 | }, 440 | "engines": { 441 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 442 | }, 443 | "funding": { 444 | "url": "https://opencollective.com/eslint" 445 | } 446 | }, 447 | "node_modules/esquery": { 448 | "version": "1.5.0", 449 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 450 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 451 | "dev": true, 452 | "dependencies": { 453 | "estraverse": "^5.1.0" 454 | }, 455 | "engines": { 456 | "node": ">=0.10" 457 | } 458 | }, 459 | "node_modules/esrecurse": { 460 | "version": "4.3.0", 461 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 462 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 463 | "dev": true, 464 | "dependencies": { 465 | "estraverse": "^5.2.0" 466 | }, 467 | "engines": { 468 | "node": ">=4.0" 469 | } 470 | }, 471 | "node_modules/estraverse": { 472 | "version": "5.3.0", 473 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 474 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 475 | "dev": true, 476 | "engines": { 477 | "node": ">=4.0" 478 | } 479 | }, 480 | "node_modules/esutils": { 481 | "version": "2.0.3", 482 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 483 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 484 | "dev": true, 485 | "engines": { 486 | "node": ">=0.10.0" 487 | } 488 | }, 489 | "node_modules/fast-deep-equal": { 490 | "version": "3.1.3", 491 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 492 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 493 | "dev": true 494 | }, 495 | "node_modules/fast-json-stable-stringify": { 496 | "version": "2.1.0", 497 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 498 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 499 | "dev": true 500 | }, 501 | "node_modules/fast-levenshtein": { 502 | "version": "2.0.6", 503 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 504 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 505 | "dev": true 506 | }, 507 | "node_modules/fastq": { 508 | "version": "1.15.0", 509 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 510 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 511 | "dev": true, 512 | "dependencies": { 513 | "reusify": "^1.0.4" 514 | } 515 | }, 516 | "node_modules/file-entry-cache": { 517 | "version": "6.0.1", 518 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 519 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 520 | "dev": true, 521 | "dependencies": { 522 | "flat-cache": "^3.0.4" 523 | }, 524 | "engines": { 525 | "node": "^10.12.0 || >=12.0.0" 526 | } 527 | }, 528 | "node_modules/find-up": { 529 | "version": "5.0.0", 530 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 531 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 532 | "dev": true, 533 | "dependencies": { 534 | "locate-path": "^6.0.0", 535 | "path-exists": "^4.0.0" 536 | }, 537 | "engines": { 538 | "node": ">=10" 539 | }, 540 | "funding": { 541 | "url": "https://github.com/sponsors/sindresorhus" 542 | } 543 | }, 544 | "node_modules/flat-cache": { 545 | "version": "3.0.4", 546 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 547 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 548 | "dev": true, 549 | "dependencies": { 550 | "flatted": "^3.1.0", 551 | "rimraf": "^3.0.2" 552 | }, 553 | "engines": { 554 | "node": "^10.12.0 || >=12.0.0" 555 | } 556 | }, 557 | "node_modules/flatted": { 558 | "version": "3.2.2", 559 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", 560 | "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", 561 | "dev": true 562 | }, 563 | "node_modules/fs.realpath": { 564 | "version": "1.0.0", 565 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 566 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 567 | "dev": true 568 | }, 569 | "node_modules/glob": { 570 | "version": "7.1.7", 571 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 572 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 573 | "dev": true, 574 | "dependencies": { 575 | "fs.realpath": "^1.0.0", 576 | "inflight": "^1.0.4", 577 | "inherits": "2", 578 | "minimatch": "^3.0.4", 579 | "once": "^1.3.0", 580 | "path-is-absolute": "^1.0.0" 581 | }, 582 | "engines": { 583 | "node": "*" 584 | }, 585 | "funding": { 586 | "url": "https://github.com/sponsors/isaacs" 587 | } 588 | }, 589 | "node_modules/glob-parent": { 590 | "version": "6.0.2", 591 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 592 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 593 | "dev": true, 594 | "dependencies": { 595 | "is-glob": "^4.0.3" 596 | }, 597 | "engines": { 598 | "node": ">=10.13.0" 599 | } 600 | }, 601 | "node_modules/globals": { 602 | "version": "13.23.0", 603 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", 604 | "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", 605 | "dev": true, 606 | "dependencies": { 607 | "type-fest": "^0.20.2" 608 | }, 609 | "engines": { 610 | "node": ">=8" 611 | }, 612 | "funding": { 613 | "url": "https://github.com/sponsors/sindresorhus" 614 | } 615 | }, 616 | "node_modules/graphemer": { 617 | "version": "1.4.0", 618 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 619 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 620 | "dev": true 621 | }, 622 | "node_modules/has-flag": { 623 | "version": "4.0.0", 624 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 625 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 626 | "dev": true, 627 | "engines": { 628 | "node": ">=8" 629 | } 630 | }, 631 | "node_modules/ignore": { 632 | "version": "5.2.4", 633 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 634 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 635 | "dev": true, 636 | "engines": { 637 | "node": ">= 4" 638 | } 639 | }, 640 | "node_modules/import-fresh": { 641 | "version": "3.3.0", 642 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 643 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 644 | "dev": true, 645 | "dependencies": { 646 | "parent-module": "^1.0.0", 647 | "resolve-from": "^4.0.0" 648 | }, 649 | "engines": { 650 | "node": ">=6" 651 | }, 652 | "funding": { 653 | "url": "https://github.com/sponsors/sindresorhus" 654 | } 655 | }, 656 | "node_modules/imurmurhash": { 657 | "version": "0.1.4", 658 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 659 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 660 | "dev": true, 661 | "engines": { 662 | "node": ">=0.8.19" 663 | } 664 | }, 665 | "node_modules/inflight": { 666 | "version": "1.0.6", 667 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 668 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 669 | "dev": true, 670 | "dependencies": { 671 | "once": "^1.3.0", 672 | "wrappy": "1" 673 | } 674 | }, 675 | "node_modules/inherits": { 676 | "version": "2.0.4", 677 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 678 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 679 | "dev": true 680 | }, 681 | "node_modules/is-extglob": { 682 | "version": "2.1.1", 683 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 684 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 685 | "dev": true, 686 | "engines": { 687 | "node": ">=0.10.0" 688 | } 689 | }, 690 | "node_modules/is-glob": { 691 | "version": "4.0.3", 692 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 693 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 694 | "dev": true, 695 | "dependencies": { 696 | "is-extglob": "^2.1.1" 697 | }, 698 | "engines": { 699 | "node": ">=0.10.0" 700 | } 701 | }, 702 | "node_modules/is-path-inside": { 703 | "version": "3.0.3", 704 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 705 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 706 | "dev": true, 707 | "engines": { 708 | "node": ">=8" 709 | } 710 | }, 711 | "node_modules/isexe": { 712 | "version": "2.0.0", 713 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 714 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 715 | "dev": true 716 | }, 717 | "node_modules/js-yaml": { 718 | "version": "4.1.0", 719 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 720 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 721 | "dev": true, 722 | "dependencies": { 723 | "argparse": "^2.0.1" 724 | }, 725 | "bin": { 726 | "js-yaml": "bin/js-yaml.js" 727 | } 728 | }, 729 | "node_modules/json-schema-traverse": { 730 | "version": "0.4.1", 731 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 732 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 733 | "dev": true 734 | }, 735 | "node_modules/json-stable-stringify-without-jsonify": { 736 | "version": "1.0.1", 737 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 738 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 739 | "dev": true 740 | }, 741 | "node_modules/levn": { 742 | "version": "0.4.1", 743 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 744 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 745 | "dev": true, 746 | "dependencies": { 747 | "prelude-ls": "^1.2.1", 748 | "type-check": "~0.4.0" 749 | }, 750 | "engines": { 751 | "node": ">= 0.8.0" 752 | } 753 | }, 754 | "node_modules/locate-path": { 755 | "version": "6.0.0", 756 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 757 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 758 | "dev": true, 759 | "dependencies": { 760 | "p-locate": "^5.0.0" 761 | }, 762 | "engines": { 763 | "node": ">=10" 764 | }, 765 | "funding": { 766 | "url": "https://github.com/sponsors/sindresorhus" 767 | } 768 | }, 769 | "node_modules/lodash.merge": { 770 | "version": "4.6.2", 771 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 772 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 773 | "dev": true 774 | }, 775 | "node_modules/minimatch": { 776 | "version": "3.1.2", 777 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 778 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 779 | "dev": true, 780 | "dependencies": { 781 | "brace-expansion": "^1.1.7" 782 | }, 783 | "engines": { 784 | "node": "*" 785 | } 786 | }, 787 | "node_modules/ms": { 788 | "version": "2.1.2", 789 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 790 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 791 | "dev": true 792 | }, 793 | "node_modules/natural-compare": { 794 | "version": "1.4.0", 795 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 796 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 797 | "dev": true 798 | }, 799 | "node_modules/once": { 800 | "version": "1.4.0", 801 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 802 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 803 | "dev": true, 804 | "dependencies": { 805 | "wrappy": "1" 806 | } 807 | }, 808 | "node_modules/optionator": { 809 | "version": "0.9.3", 810 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 811 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 812 | "dev": true, 813 | "dependencies": { 814 | "@aashutoshrathi/word-wrap": "^1.2.3", 815 | "deep-is": "^0.1.3", 816 | "fast-levenshtein": "^2.0.6", 817 | "levn": "^0.4.1", 818 | "prelude-ls": "^1.2.1", 819 | "type-check": "^0.4.0" 820 | }, 821 | "engines": { 822 | "node": ">= 0.8.0" 823 | } 824 | }, 825 | "node_modules/p-limit": { 826 | "version": "3.1.0", 827 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 828 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 829 | "dev": true, 830 | "dependencies": { 831 | "yocto-queue": "^0.1.0" 832 | }, 833 | "engines": { 834 | "node": ">=10" 835 | }, 836 | "funding": { 837 | "url": "https://github.com/sponsors/sindresorhus" 838 | } 839 | }, 840 | "node_modules/p-locate": { 841 | "version": "5.0.0", 842 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 843 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 844 | "dev": true, 845 | "dependencies": { 846 | "p-limit": "^3.0.2" 847 | }, 848 | "engines": { 849 | "node": ">=10" 850 | }, 851 | "funding": { 852 | "url": "https://github.com/sponsors/sindresorhus" 853 | } 854 | }, 855 | "node_modules/parent-module": { 856 | "version": "1.0.1", 857 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 858 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 859 | "dev": true, 860 | "dependencies": { 861 | "callsites": "^3.0.0" 862 | }, 863 | "engines": { 864 | "node": ">=6" 865 | } 866 | }, 867 | "node_modules/path-exists": { 868 | "version": "4.0.0", 869 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 870 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 871 | "dev": true, 872 | "engines": { 873 | "node": ">=8" 874 | } 875 | }, 876 | "node_modules/path-is-absolute": { 877 | "version": "1.0.1", 878 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 879 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 880 | "dev": true, 881 | "engines": { 882 | "node": ">=0.10.0" 883 | } 884 | }, 885 | "node_modules/path-key": { 886 | "version": "3.1.1", 887 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 888 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 889 | "dev": true, 890 | "engines": { 891 | "node": ">=8" 892 | } 893 | }, 894 | "node_modules/prelude-ls": { 895 | "version": "1.2.1", 896 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 897 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 898 | "dev": true, 899 | "engines": { 900 | "node": ">= 0.8.0" 901 | } 902 | }, 903 | "node_modules/punycode": { 904 | "version": "2.3.0", 905 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 906 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 907 | "dev": true, 908 | "engines": { 909 | "node": ">=6" 910 | } 911 | }, 912 | "node_modules/queue-microtask": { 913 | "version": "1.2.3", 914 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 915 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 916 | "dev": true, 917 | "funding": [ 918 | { 919 | "type": "github", 920 | "url": "https://github.com/sponsors/feross" 921 | }, 922 | { 923 | "type": "patreon", 924 | "url": "https://www.patreon.com/feross" 925 | }, 926 | { 927 | "type": "consulting", 928 | "url": "https://feross.org/support" 929 | } 930 | ] 931 | }, 932 | "node_modules/resolve-from": { 933 | "version": "4.0.0", 934 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 935 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 936 | "dev": true, 937 | "engines": { 938 | "node": ">=4" 939 | } 940 | }, 941 | "node_modules/reusify": { 942 | "version": "1.0.4", 943 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 944 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 945 | "dev": true, 946 | "engines": { 947 | "iojs": ">=1.0.0", 948 | "node": ">=0.10.0" 949 | } 950 | }, 951 | "node_modules/rimraf": { 952 | "version": "3.0.2", 953 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 954 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 955 | "dev": true, 956 | "dependencies": { 957 | "glob": "^7.1.3" 958 | }, 959 | "bin": { 960 | "rimraf": "bin.js" 961 | }, 962 | "funding": { 963 | "url": "https://github.com/sponsors/isaacs" 964 | } 965 | }, 966 | "node_modules/run-parallel": { 967 | "version": "1.2.0", 968 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 969 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 970 | "dev": true, 971 | "funding": [ 972 | { 973 | "type": "github", 974 | "url": "https://github.com/sponsors/feross" 975 | }, 976 | { 977 | "type": "patreon", 978 | "url": "https://www.patreon.com/feross" 979 | }, 980 | { 981 | "type": "consulting", 982 | "url": "https://feross.org/support" 983 | } 984 | ], 985 | "dependencies": { 986 | "queue-microtask": "^1.2.2" 987 | } 988 | }, 989 | "node_modules/shebang-command": { 990 | "version": "2.0.0", 991 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 992 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 993 | "dev": true, 994 | "dependencies": { 995 | "shebang-regex": "^3.0.0" 996 | }, 997 | "engines": { 998 | "node": ">=8" 999 | } 1000 | }, 1001 | "node_modules/shebang-regex": { 1002 | "version": "3.0.0", 1003 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1004 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1005 | "dev": true, 1006 | "engines": { 1007 | "node": ">=8" 1008 | } 1009 | }, 1010 | "node_modules/strip-ansi": { 1011 | "version": "6.0.1", 1012 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1013 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "ansi-regex": "^5.0.1" 1017 | }, 1018 | "engines": { 1019 | "node": ">=8" 1020 | } 1021 | }, 1022 | "node_modules/strip-json-comments": { 1023 | "version": "3.1.1", 1024 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1025 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1026 | "dev": true, 1027 | "engines": { 1028 | "node": ">=8" 1029 | }, 1030 | "funding": { 1031 | "url": "https://github.com/sponsors/sindresorhus" 1032 | } 1033 | }, 1034 | "node_modules/supports-color": { 1035 | "version": "7.2.0", 1036 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1037 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1038 | "dev": true, 1039 | "dependencies": { 1040 | "has-flag": "^4.0.0" 1041 | }, 1042 | "engines": { 1043 | "node": ">=8" 1044 | } 1045 | }, 1046 | "node_modules/text-table": { 1047 | "version": "0.2.0", 1048 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1049 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1050 | "dev": true 1051 | }, 1052 | "node_modules/type-check": { 1053 | "version": "0.4.0", 1054 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1055 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1056 | "dev": true, 1057 | "dependencies": { 1058 | "prelude-ls": "^1.2.1" 1059 | }, 1060 | "engines": { 1061 | "node": ">= 0.8.0" 1062 | } 1063 | }, 1064 | "node_modules/type-fest": { 1065 | "version": "0.20.2", 1066 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1067 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1068 | "dev": true, 1069 | "engines": { 1070 | "node": ">=10" 1071 | }, 1072 | "funding": { 1073 | "url": "https://github.com/sponsors/sindresorhus" 1074 | } 1075 | }, 1076 | "node_modules/uri-js": { 1077 | "version": "4.4.1", 1078 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1079 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1080 | "dev": true, 1081 | "dependencies": { 1082 | "punycode": "^2.1.0" 1083 | } 1084 | }, 1085 | "node_modules/vm2": { 1086 | "version": "3.9.19", 1087 | "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", 1088 | "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", 1089 | "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", 1090 | "dependencies": { 1091 | "acorn": "^8.7.0", 1092 | "acorn-walk": "^8.2.0" 1093 | }, 1094 | "bin": { 1095 | "vm2": "bin/vm2" 1096 | }, 1097 | "engines": { 1098 | "node": ">=6.0" 1099 | } 1100 | }, 1101 | "node_modules/which": { 1102 | "version": "2.0.2", 1103 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1104 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1105 | "dev": true, 1106 | "dependencies": { 1107 | "isexe": "^2.0.0" 1108 | }, 1109 | "bin": { 1110 | "node-which": "bin/node-which" 1111 | }, 1112 | "engines": { 1113 | "node": ">= 8" 1114 | } 1115 | }, 1116 | "node_modules/wrappy": { 1117 | "version": "1.0.2", 1118 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1119 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1120 | "dev": true 1121 | }, 1122 | "node_modules/yocto-queue": { 1123 | "version": "0.1.0", 1124 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1125 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1126 | "dev": true, 1127 | "engines": { 1128 | "node": ">=10" 1129 | }, 1130 | "funding": { 1131 | "url": "https://github.com/sponsors/sindresorhus" 1132 | } 1133 | } 1134 | }, 1135 | "dependencies": { 1136 | "@aashutoshrathi/word-wrap": { 1137 | "version": "1.2.6", 1138 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 1139 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 1140 | "dev": true 1141 | }, 1142 | "@eslint-community/eslint-utils": { 1143 | "version": "4.4.0", 1144 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 1145 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 1146 | "dev": true, 1147 | "requires": { 1148 | "eslint-visitor-keys": "^3.3.0" 1149 | } 1150 | }, 1151 | "@eslint-community/regexpp": { 1152 | "version": "4.9.1", 1153 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", 1154 | "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", 1155 | "dev": true 1156 | }, 1157 | "@eslint/eslintrc": { 1158 | "version": "2.1.2", 1159 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", 1160 | "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", 1161 | "dev": true, 1162 | "requires": { 1163 | "ajv": "^6.12.4", 1164 | "debug": "^4.3.2", 1165 | "espree": "^9.6.0", 1166 | "globals": "^13.19.0", 1167 | "ignore": "^5.2.0", 1168 | "import-fresh": "^3.2.1", 1169 | "js-yaml": "^4.1.0", 1170 | "minimatch": "^3.1.2", 1171 | "strip-json-comments": "^3.1.1" 1172 | } 1173 | }, 1174 | "@eslint/js": { 1175 | "version": "8.51.0", 1176 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", 1177 | "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", 1178 | "dev": true 1179 | }, 1180 | "@humanwhocodes/config-array": { 1181 | "version": "0.11.11", 1182 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", 1183 | "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", 1184 | "dev": true, 1185 | "requires": { 1186 | "@humanwhocodes/object-schema": "^1.2.1", 1187 | "debug": "^4.1.1", 1188 | "minimatch": "^3.0.5" 1189 | } 1190 | }, 1191 | "@humanwhocodes/module-importer": { 1192 | "version": "1.0.1", 1193 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 1194 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 1195 | "dev": true 1196 | }, 1197 | "@humanwhocodes/object-schema": { 1198 | "version": "1.2.1", 1199 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 1200 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 1201 | "dev": true 1202 | }, 1203 | "@nodelib/fs.scandir": { 1204 | "version": "2.1.5", 1205 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1206 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1207 | "dev": true, 1208 | "requires": { 1209 | "@nodelib/fs.stat": "2.0.5", 1210 | "run-parallel": "^1.1.9" 1211 | } 1212 | }, 1213 | "@nodelib/fs.stat": { 1214 | "version": "2.0.5", 1215 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1216 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1217 | "dev": true 1218 | }, 1219 | "@nodelib/fs.walk": { 1220 | "version": "1.2.8", 1221 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1222 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1223 | "dev": true, 1224 | "requires": { 1225 | "@nodelib/fs.scandir": "2.1.5", 1226 | "fastq": "^1.6.0" 1227 | } 1228 | }, 1229 | "acorn": { 1230 | "version": "8.10.0", 1231 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 1232 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" 1233 | }, 1234 | "acorn-jsx": { 1235 | "version": "5.3.2", 1236 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1237 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1238 | "dev": true, 1239 | "requires": {} 1240 | }, 1241 | "acorn-walk": { 1242 | "version": "8.2.0", 1243 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 1244 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" 1245 | }, 1246 | "ajv": { 1247 | "version": "6.12.6", 1248 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1249 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1250 | "dev": true, 1251 | "requires": { 1252 | "fast-deep-equal": "^3.1.1", 1253 | "fast-json-stable-stringify": "^2.0.0", 1254 | "json-schema-traverse": "^0.4.1", 1255 | "uri-js": "^4.2.2" 1256 | } 1257 | }, 1258 | "ansi-regex": { 1259 | "version": "5.0.1", 1260 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1261 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1262 | "dev": true 1263 | }, 1264 | "ansi-styles": { 1265 | "version": "4.3.0", 1266 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1267 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1268 | "dev": true, 1269 | "requires": { 1270 | "color-convert": "^2.0.1" 1271 | } 1272 | }, 1273 | "argparse": { 1274 | "version": "2.0.1", 1275 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1276 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1277 | "dev": true 1278 | }, 1279 | "balanced-match": { 1280 | "version": "1.0.2", 1281 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1282 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1283 | "dev": true 1284 | }, 1285 | "brace-expansion": { 1286 | "version": "1.1.11", 1287 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1288 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1289 | "dev": true, 1290 | "requires": { 1291 | "balanced-match": "^1.0.0", 1292 | "concat-map": "0.0.1" 1293 | } 1294 | }, 1295 | "callsites": { 1296 | "version": "3.1.0", 1297 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1298 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1299 | "dev": true 1300 | }, 1301 | "chalk": { 1302 | "version": "4.1.2", 1303 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1304 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1305 | "dev": true, 1306 | "requires": { 1307 | "ansi-styles": "^4.1.0", 1308 | "supports-color": "^7.1.0" 1309 | } 1310 | }, 1311 | "color-convert": { 1312 | "version": "2.0.1", 1313 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1314 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1315 | "dev": true, 1316 | "requires": { 1317 | "color-name": "~1.1.4" 1318 | } 1319 | }, 1320 | "color-name": { 1321 | "version": "1.1.4", 1322 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1323 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1324 | "dev": true 1325 | }, 1326 | "concat-map": { 1327 | "version": "0.0.1", 1328 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1329 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1330 | "dev": true 1331 | }, 1332 | "cross-spawn": { 1333 | "version": "7.0.3", 1334 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1335 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1336 | "dev": true, 1337 | "requires": { 1338 | "path-key": "^3.1.0", 1339 | "shebang-command": "^2.0.0", 1340 | "which": "^2.0.1" 1341 | } 1342 | }, 1343 | "debug": { 1344 | "version": "4.3.4", 1345 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1346 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1347 | "dev": true, 1348 | "requires": { 1349 | "ms": "2.1.2" 1350 | } 1351 | }, 1352 | "deep-is": { 1353 | "version": "0.1.4", 1354 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1355 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1356 | "dev": true 1357 | }, 1358 | "doctrine": { 1359 | "version": "3.0.0", 1360 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1361 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1362 | "dev": true, 1363 | "requires": { 1364 | "esutils": "^2.0.2" 1365 | } 1366 | }, 1367 | "escape-string-regexp": { 1368 | "version": "4.0.0", 1369 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1370 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1371 | "dev": true 1372 | }, 1373 | "eslint": { 1374 | "version": "8.51.0", 1375 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", 1376 | "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", 1377 | "dev": true, 1378 | "requires": { 1379 | "@eslint-community/eslint-utils": "^4.2.0", 1380 | "@eslint-community/regexpp": "^4.6.1", 1381 | "@eslint/eslintrc": "^2.1.2", 1382 | "@eslint/js": "8.51.0", 1383 | "@humanwhocodes/config-array": "^0.11.11", 1384 | "@humanwhocodes/module-importer": "^1.0.1", 1385 | "@nodelib/fs.walk": "^1.2.8", 1386 | "ajv": "^6.12.4", 1387 | "chalk": "^4.0.0", 1388 | "cross-spawn": "^7.0.2", 1389 | "debug": "^4.3.2", 1390 | "doctrine": "^3.0.0", 1391 | "escape-string-regexp": "^4.0.0", 1392 | "eslint-scope": "^7.2.2", 1393 | "eslint-visitor-keys": "^3.4.3", 1394 | "espree": "^9.6.1", 1395 | "esquery": "^1.4.2", 1396 | "esutils": "^2.0.2", 1397 | "fast-deep-equal": "^3.1.3", 1398 | "file-entry-cache": "^6.0.1", 1399 | "find-up": "^5.0.0", 1400 | "glob-parent": "^6.0.2", 1401 | "globals": "^13.19.0", 1402 | "graphemer": "^1.4.0", 1403 | "ignore": "^5.2.0", 1404 | "imurmurhash": "^0.1.4", 1405 | "is-glob": "^4.0.0", 1406 | "is-path-inside": "^3.0.3", 1407 | "js-yaml": "^4.1.0", 1408 | "json-stable-stringify-without-jsonify": "^1.0.1", 1409 | "levn": "^0.4.1", 1410 | "lodash.merge": "^4.6.2", 1411 | "minimatch": "^3.1.2", 1412 | "natural-compare": "^1.4.0", 1413 | "optionator": "^0.9.3", 1414 | "strip-ansi": "^6.0.1", 1415 | "text-table": "^0.2.0" 1416 | } 1417 | }, 1418 | "eslint-scope": { 1419 | "version": "7.2.2", 1420 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 1421 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 1422 | "dev": true, 1423 | "requires": { 1424 | "esrecurse": "^4.3.0", 1425 | "estraverse": "^5.2.0" 1426 | } 1427 | }, 1428 | "eslint-visitor-keys": { 1429 | "version": "3.4.3", 1430 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1431 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1432 | "dev": true 1433 | }, 1434 | "espree": { 1435 | "version": "9.6.1", 1436 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 1437 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 1438 | "dev": true, 1439 | "requires": { 1440 | "acorn": "^8.9.0", 1441 | "acorn-jsx": "^5.3.2", 1442 | "eslint-visitor-keys": "^3.4.1" 1443 | } 1444 | }, 1445 | "esquery": { 1446 | "version": "1.5.0", 1447 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 1448 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 1449 | "dev": true, 1450 | "requires": { 1451 | "estraverse": "^5.1.0" 1452 | } 1453 | }, 1454 | "esrecurse": { 1455 | "version": "4.3.0", 1456 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1457 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1458 | "dev": true, 1459 | "requires": { 1460 | "estraverse": "^5.2.0" 1461 | } 1462 | }, 1463 | "estraverse": { 1464 | "version": "5.3.0", 1465 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1466 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1467 | "dev": true 1468 | }, 1469 | "esutils": { 1470 | "version": "2.0.3", 1471 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1472 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1473 | "dev": true 1474 | }, 1475 | "fast-deep-equal": { 1476 | "version": "3.1.3", 1477 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1478 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1479 | "dev": true 1480 | }, 1481 | "fast-json-stable-stringify": { 1482 | "version": "2.1.0", 1483 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1484 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1485 | "dev": true 1486 | }, 1487 | "fast-levenshtein": { 1488 | "version": "2.0.6", 1489 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1490 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1491 | "dev": true 1492 | }, 1493 | "fastq": { 1494 | "version": "1.15.0", 1495 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 1496 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 1497 | "dev": true, 1498 | "requires": { 1499 | "reusify": "^1.0.4" 1500 | } 1501 | }, 1502 | "file-entry-cache": { 1503 | "version": "6.0.1", 1504 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1505 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1506 | "dev": true, 1507 | "requires": { 1508 | "flat-cache": "^3.0.4" 1509 | } 1510 | }, 1511 | "find-up": { 1512 | "version": "5.0.0", 1513 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1514 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1515 | "dev": true, 1516 | "requires": { 1517 | "locate-path": "^6.0.0", 1518 | "path-exists": "^4.0.0" 1519 | } 1520 | }, 1521 | "flat-cache": { 1522 | "version": "3.0.4", 1523 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1524 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1525 | "dev": true, 1526 | "requires": { 1527 | "flatted": "^3.1.0", 1528 | "rimraf": "^3.0.2" 1529 | } 1530 | }, 1531 | "flatted": { 1532 | "version": "3.2.2", 1533 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", 1534 | "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", 1535 | "dev": true 1536 | }, 1537 | "fs.realpath": { 1538 | "version": "1.0.0", 1539 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1540 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1541 | "dev": true 1542 | }, 1543 | "glob": { 1544 | "version": "7.1.7", 1545 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1546 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1547 | "dev": true, 1548 | "requires": { 1549 | "fs.realpath": "^1.0.0", 1550 | "inflight": "^1.0.4", 1551 | "inherits": "2", 1552 | "minimatch": "^3.0.4", 1553 | "once": "^1.3.0", 1554 | "path-is-absolute": "^1.0.0" 1555 | } 1556 | }, 1557 | "glob-parent": { 1558 | "version": "6.0.2", 1559 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1560 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1561 | "dev": true, 1562 | "requires": { 1563 | "is-glob": "^4.0.3" 1564 | } 1565 | }, 1566 | "globals": { 1567 | "version": "13.23.0", 1568 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", 1569 | "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", 1570 | "dev": true, 1571 | "requires": { 1572 | "type-fest": "^0.20.2" 1573 | } 1574 | }, 1575 | "graphemer": { 1576 | "version": "1.4.0", 1577 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1578 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1579 | "dev": true 1580 | }, 1581 | "has-flag": { 1582 | "version": "4.0.0", 1583 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1584 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1585 | "dev": true 1586 | }, 1587 | "ignore": { 1588 | "version": "5.2.4", 1589 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1590 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1591 | "dev": true 1592 | }, 1593 | "import-fresh": { 1594 | "version": "3.3.0", 1595 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1596 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1597 | "dev": true, 1598 | "requires": { 1599 | "parent-module": "^1.0.0", 1600 | "resolve-from": "^4.0.0" 1601 | } 1602 | }, 1603 | "imurmurhash": { 1604 | "version": "0.1.4", 1605 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1606 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1607 | "dev": true 1608 | }, 1609 | "inflight": { 1610 | "version": "1.0.6", 1611 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1612 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1613 | "dev": true, 1614 | "requires": { 1615 | "once": "^1.3.0", 1616 | "wrappy": "1" 1617 | } 1618 | }, 1619 | "inherits": { 1620 | "version": "2.0.4", 1621 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1622 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1623 | "dev": true 1624 | }, 1625 | "is-extglob": { 1626 | "version": "2.1.1", 1627 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1628 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1629 | "dev": true 1630 | }, 1631 | "is-glob": { 1632 | "version": "4.0.3", 1633 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1634 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1635 | "dev": true, 1636 | "requires": { 1637 | "is-extglob": "^2.1.1" 1638 | } 1639 | }, 1640 | "is-path-inside": { 1641 | "version": "3.0.3", 1642 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1643 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1644 | "dev": true 1645 | }, 1646 | "isexe": { 1647 | "version": "2.0.0", 1648 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1649 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1650 | "dev": true 1651 | }, 1652 | "js-yaml": { 1653 | "version": "4.1.0", 1654 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1655 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1656 | "dev": true, 1657 | "requires": { 1658 | "argparse": "^2.0.1" 1659 | } 1660 | }, 1661 | "json-schema-traverse": { 1662 | "version": "0.4.1", 1663 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1664 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1665 | "dev": true 1666 | }, 1667 | "json-stable-stringify-without-jsonify": { 1668 | "version": "1.0.1", 1669 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1670 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1671 | "dev": true 1672 | }, 1673 | "levn": { 1674 | "version": "0.4.1", 1675 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1676 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1677 | "dev": true, 1678 | "requires": { 1679 | "prelude-ls": "^1.2.1", 1680 | "type-check": "~0.4.0" 1681 | } 1682 | }, 1683 | "locate-path": { 1684 | "version": "6.0.0", 1685 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1686 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1687 | "dev": true, 1688 | "requires": { 1689 | "p-locate": "^5.0.0" 1690 | } 1691 | }, 1692 | "lodash.merge": { 1693 | "version": "4.6.2", 1694 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1695 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1696 | "dev": true 1697 | }, 1698 | "minimatch": { 1699 | "version": "3.1.2", 1700 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1701 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1702 | "dev": true, 1703 | "requires": { 1704 | "brace-expansion": "^1.1.7" 1705 | } 1706 | }, 1707 | "ms": { 1708 | "version": "2.1.2", 1709 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1710 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1711 | "dev": true 1712 | }, 1713 | "natural-compare": { 1714 | "version": "1.4.0", 1715 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1716 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1717 | "dev": true 1718 | }, 1719 | "once": { 1720 | "version": "1.4.0", 1721 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1722 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1723 | "dev": true, 1724 | "requires": { 1725 | "wrappy": "1" 1726 | } 1727 | }, 1728 | "optionator": { 1729 | "version": "0.9.3", 1730 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 1731 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 1732 | "dev": true, 1733 | "requires": { 1734 | "@aashutoshrathi/word-wrap": "^1.2.3", 1735 | "deep-is": "^0.1.3", 1736 | "fast-levenshtein": "^2.0.6", 1737 | "levn": "^0.4.1", 1738 | "prelude-ls": "^1.2.1", 1739 | "type-check": "^0.4.0" 1740 | } 1741 | }, 1742 | "p-limit": { 1743 | "version": "3.1.0", 1744 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1745 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1746 | "dev": true, 1747 | "requires": { 1748 | "yocto-queue": "^0.1.0" 1749 | } 1750 | }, 1751 | "p-locate": { 1752 | "version": "5.0.0", 1753 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1754 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1755 | "dev": true, 1756 | "requires": { 1757 | "p-limit": "^3.0.2" 1758 | } 1759 | }, 1760 | "parent-module": { 1761 | "version": "1.0.1", 1762 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1763 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1764 | "dev": true, 1765 | "requires": { 1766 | "callsites": "^3.0.0" 1767 | } 1768 | }, 1769 | "path-exists": { 1770 | "version": "4.0.0", 1771 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1772 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1773 | "dev": true 1774 | }, 1775 | "path-is-absolute": { 1776 | "version": "1.0.1", 1777 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1778 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1779 | "dev": true 1780 | }, 1781 | "path-key": { 1782 | "version": "3.1.1", 1783 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1784 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1785 | "dev": true 1786 | }, 1787 | "prelude-ls": { 1788 | "version": "1.2.1", 1789 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1790 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1791 | "dev": true 1792 | }, 1793 | "punycode": { 1794 | "version": "2.3.0", 1795 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1796 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1797 | "dev": true 1798 | }, 1799 | "queue-microtask": { 1800 | "version": "1.2.3", 1801 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1802 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1803 | "dev": true 1804 | }, 1805 | "resolve-from": { 1806 | "version": "4.0.0", 1807 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1808 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1809 | "dev": true 1810 | }, 1811 | "reusify": { 1812 | "version": "1.0.4", 1813 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1814 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1815 | "dev": true 1816 | }, 1817 | "rimraf": { 1818 | "version": "3.0.2", 1819 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1820 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1821 | "dev": true, 1822 | "requires": { 1823 | "glob": "^7.1.3" 1824 | } 1825 | }, 1826 | "run-parallel": { 1827 | "version": "1.2.0", 1828 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1829 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1830 | "dev": true, 1831 | "requires": { 1832 | "queue-microtask": "^1.2.2" 1833 | } 1834 | }, 1835 | "shebang-command": { 1836 | "version": "2.0.0", 1837 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1838 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1839 | "dev": true, 1840 | "requires": { 1841 | "shebang-regex": "^3.0.0" 1842 | } 1843 | }, 1844 | "shebang-regex": { 1845 | "version": "3.0.0", 1846 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1847 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1848 | "dev": true 1849 | }, 1850 | "strip-ansi": { 1851 | "version": "6.0.1", 1852 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1853 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1854 | "dev": true, 1855 | "requires": { 1856 | "ansi-regex": "^5.0.1" 1857 | } 1858 | }, 1859 | "strip-json-comments": { 1860 | "version": "3.1.1", 1861 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1862 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1863 | "dev": true 1864 | }, 1865 | "supports-color": { 1866 | "version": "7.2.0", 1867 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1868 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1869 | "dev": true, 1870 | "requires": { 1871 | "has-flag": "^4.0.0" 1872 | } 1873 | }, 1874 | "text-table": { 1875 | "version": "0.2.0", 1876 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1877 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1878 | "dev": true 1879 | }, 1880 | "type-check": { 1881 | "version": "0.4.0", 1882 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1883 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1884 | "dev": true, 1885 | "requires": { 1886 | "prelude-ls": "^1.2.1" 1887 | } 1888 | }, 1889 | "type-fest": { 1890 | "version": "0.20.2", 1891 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1892 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1893 | "dev": true 1894 | }, 1895 | "uri-js": { 1896 | "version": "4.4.1", 1897 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1898 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1899 | "dev": true, 1900 | "requires": { 1901 | "punycode": "^2.1.0" 1902 | } 1903 | }, 1904 | "vm2": { 1905 | "version": "3.9.19", 1906 | "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", 1907 | "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", 1908 | "requires": { 1909 | "acorn": "^8.7.0", 1910 | "acorn-walk": "^8.2.0" 1911 | } 1912 | }, 1913 | "which": { 1914 | "version": "2.0.2", 1915 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1916 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1917 | "dev": true, 1918 | "requires": { 1919 | "isexe": "^2.0.0" 1920 | } 1921 | }, 1922 | "wrappy": { 1923 | "version": "1.0.2", 1924 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1925 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1926 | "dev": true 1927 | }, 1928 | "yocto-queue": { 1929 | "version": "0.1.0", 1930 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1931 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1932 | "dev": true 1933 | } 1934 | } 1935 | } 1936 | --------------------------------------------------------------------------------