├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .husky └── pre-commit ├── .npmrc ├── .prettierrc.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── manifest.json ├── package-lock.json ├── package.json ├── src ├── decs.d.ts ├── main.ts └── serialize.ts ├── tsconfig.json ├── version-bump.mjs └── versions.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | indent_style = space 9 | indent_size = 2 10 | tab_width = 2 11 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | main.js 4 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "env": { "node": true }, 5 | "plugins": ["@typescript-eslint"], 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:@typescript-eslint/eslint-recommended", 9 | "plugin:@typescript-eslint/recommended" 10 | ], 11 | "parserOptions": { 12 | "sourceType": "module" 13 | }, 14 | "rules": { 15 | "no-unused-vars": "off", 16 | "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], 17 | "@typescript-eslint/ban-ts-comment": "off", 18 | "no-prototype-builtins": "off", 19 | "@typescript-eslint/no-empty-function": "off" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # vscode 2 | .vscode 3 | 4 | # Intellij 5 | *.iml 6 | .idea 7 | 8 | # npm 9 | node_modules 10 | 11 | # Don't include the compiled main.js file in the repo. 12 | # They should be uploaded to GitHub releases instead. 13 | main.js 14 | 15 | # Exclude sourcemaps 16 | *.map 17 | 18 | # obsidian 19 | data.json 20 | 21 | # Exclude macOS Finder (System Explorer) View States 22 | .DS_Store 23 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "proseWrap": "always", 4 | "tabWidth": 2, 5 | "useTabs": false, 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | This plugin started as a hacky thing to make my own life better. That said, it is public in the hope 4 | that it might be useful to other people as well. 5 | 6 | If you have ideas for improvements, fixes, or new features, please feel free to open an issue to 7 | discuss. Pull requests are similarly very welcome, though I do want to keep the project small and 8 | focused. If you are not sure if your idea would fit, please open an issue first! 9 | 10 | All that said, thanks so much for your interest in contributing that you are looking here! Even if 11 | you decide against it, I am really grateful you would consider it! 12 | 13 | ## Setup 14 | 15 | To set up things such as precommit hooks and other tooling, as well as installing the necessary 16 | dependencies, please run `npm install` first. 17 | 18 | ## Building 19 | 20 | Building this project is as simple as `npm run build`. Please make sure you `npx prettier --write .` 21 | before pull-requesting any changes. 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2023, Ara Adkins 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Persistent Key-Value Store for Obsidian 2 | 3 | This plugin provides a persistent key-value store for use inside scripts in Obsidian, as well as a 4 | portable [web inspector](#web-inspector) to aid in debugging. This means that you can persist data 5 | between runs of [Templater](https://github.com/SilentVoid13/Templater) templates or 6 | [Dataview](https://github.com/blacksmithgu/obsidian-dataview) (or 7 | [Datacore](https://github.com/blacksmithgu/datacore)) queries. Not only that, but you can also 8 | persist data across sync services that sync the plugin's `data.json`; this means persistence of 9 | saved state between devices using the same vault. 10 | 11 | Note that this plugin uses `eval` under the hood in combination with 12 | [serialize-javascript](https://github.com/yahoo/serialize-javascript) to allow for serialization of 13 | rich JS objects. You must **never store or load untrusted data**, and **usage of this plugin is at 14 | your own risk**. 15 | 16 | ## Usage 17 | 18 | This plugin is intended to be used from _other plugins_ (such as those mentioned above) that allow 19 | you to execute JavaScript code in the Obsidian JS virtual machine. It is not intended to be 20 | user-facing or provide a non-code interface outside of its settings. If you are not familiar with 21 | JavaScript, or its use to script Obsidian, this plugin is **not for you**. 22 | 23 | ### Interface 24 | 25 | The data store is made available to you in the window scope under the name `window.pkvs` (implicitly 26 | accessible as `pkvs`). The operations available to you are given by the following interface. 27 | 28 | ```ts 29 | // The user-facing interface to the persistent key-value store. 30 | interface PKVS { 31 | // Loads the value at `key` in the persistent data, returning the value if it exists or 32 | // `undefined` otherwise. 33 | async load(key: PropertyKey): Promise; 34 | 35 | // Stores the provided `value` at the provided `key` in the data store, returning the previous 36 | // value at that `key` if it was previously written, or `undefined` otherwise. 37 | // 38 | // If eager persistence is on, this will write the changes to disk before returning. 39 | async store(key: PropertyKey, value: any): Promise; 40 | 41 | // Deletes any value at the provided `key`, returning the previous value if `key` was previously 42 | // written, or `undefined` otherwise. 43 | // 44 | // If eager persistence is on, this will write the changes to disk before returning. 45 | async delete(key: PropertyKey): Promise; 46 | 47 | // Returns `true` if `key` exists in the data store, or `false` otherwise. 48 | async exists(key: PropertyKey): Promise; 49 | 50 | // Forces any in-memory changes to the data store to be written to disk. Once it has returned, the 51 | // on-disk state and in-memory state are guaranteed to be the same. 52 | async persist(): Promise; 53 | 54 | // Sets the store to use lazy persistence regardless of the option in settings. 55 | setLazyPersistance(): void; 56 | 57 | // Sets the store to use eager persistence regardless of the option in settings. 58 | setEagerPersistence(): void; 59 | 60 | // Sets the store to persist as specified by the option in settings. 61 | disablePersistenceOverride(): void; 62 | ``` 63 | 64 | ## Web Inspector 65 | 66 | Sometimes it is useful to be able to evaluate JavaScript to access this persistent store without 67 | having to write a DVJS query or Templater template. To that end, this plugin includes the 68 | [Eruda](https://github.com/liriliri/eruda) portable web-inspector front-end. 69 | 70 | When opening the inspector (using the command palette), you will see the console by default. In 71 | settings, you can enable additional tabs, such as a DOM tree, network request and resource 72 | monitoring, sources viewing, performance and timing graphs, and so on. Please see the settings 73 | themselves for descriptions of what each tab gives you. 74 | 75 | This function is useful for general development, not just interacting with the persistent store. 76 | 77 | ## Performance 78 | 79 | If you are writing and reading lots of data or large data at once, you may want to enable the "Lazy 80 | Persistence" option in settings. This will only persist data to disk at app-close on a best-effort 81 | basis, and instead requires you to manually persist. You can also enable this option 82 | _programmatically_ by calling `setLazyPersistance` and `setEagerPersistence` as shown above. These 83 | will not change the setting for the plugin, but only the currently active behavior. 84 | 85 | Manual persistence can be performed by calling `persist` above and awaiting on the result to return 86 | to guarantee writing is complete, or running the "Persist Data" command from the command palette. 87 | 88 | > ### WARNING 89 | > 90 | > Please note that use of lazy persistence **may incur data loss** if you do not persist before 91 | > closing Obsidian. This is particularly relevant on mobile, where the app may be killed in the 92 | > background at any time. 93 | 94 | ## Installation 95 | 96 | You can install the plugin using the following two installation methods. 97 | 98 | ### Community Plugins 99 | 100 | 1. Go to Settings and select the Community Plugins tab. 101 | 2. Open the Browse view, and search for "Persistent Key-Value Store". 102 | 3. Select this plugin, and press "Install" and then "Enable". 103 | 4. It should now work! 104 | 105 | ### BRAT 106 | 107 | 1. Install [BRAT](https://github.com/TfTHacker/obsidian42-brat). 108 | 2. In BRAT settings, select "Add Beta Plugin" and paste 109 | `https://github.com/iamrecursion/obsidian-pkvs` as the URL. 110 | 3. Go to the "Community Plugins" tab and enable the plugin. 111 | 112 | ## Contributing 113 | 114 | If you are interested in contributing code, documentation, or ideas to this project, please take a 115 | look at the [CONTRIBUTING](./CONTRIBUTING.md) guide. 116 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from "builtin-modules"; 4 | 5 | const banner = `/* 6 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 7 | if you want to view the source, please visit the github repository of this plugin 8 | */ 9 | `; 10 | 11 | const prod = process.argv[2] === "production"; 12 | 13 | const context = await esbuild.context({ 14 | banner: { 15 | js: banner, 16 | }, 17 | entryPoints: ["src/main.ts"], 18 | bundle: true, 19 | external: [ 20 | "obsidian", 21 | "electron", 22 | "@codemirror/autocomplete", 23 | "@codemirror/collab", 24 | "@codemirror/commands", 25 | "@codemirror/language", 26 | "@codemirror/lint", 27 | "@codemirror/search", 28 | "@codemirror/state", 29 | "@codemirror/view", 30 | "@lezer/common", 31 | "@lezer/highlight", 32 | "@lezer/lr", 33 | ...builtins, 34 | ], 35 | format: "cjs", 36 | target: "es2018", 37 | logLevel: "info", 38 | sourcemap: prod ? false : "inline", 39 | treeShaking: true, 40 | outfile: "main.js", 41 | }); 42 | 43 | if (prod) { 44 | await context.rebuild(); 45 | process.exit(0); 46 | } else { 47 | await context.watch(); 48 | } 49 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "pkvs", 3 | "name": "Persistent Key-Value Store", 4 | "version": "1.1.1", 5 | "minAppVersion": "1.5.12", 6 | "description": "Provides a persistent key-value store for use in scripts, along with a portable web inspector.", 7 | "author": "Ara Adkins", 8 | "authorUrl": "https://github.com/iamrecursion", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-pkvs", 3 | "version": "1.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "obsidian-pkvs", 9 | "version": "1.1.0", 10 | "hasInstallScript": true, 11 | "license": "MIT", 12 | "dependencies": { 13 | "eruda": "^3.0.1", 14 | "eruda-benchmark": "^2.0.1", 15 | "eruda-code": "^2.1.0", 16 | "eruda-features": "^2.0.0", 17 | "eruda-geolocation": "^2.0.0", 18 | "eruda-monitor": "^1.0.0", 19 | "eruda-orientation": "^2.0.0", 20 | "eruda-timing": "^2.0.1", 21 | "eruda-touches": "^2.0.0" 22 | }, 23 | "devDependencies": { 24 | "@types/node": "20.10.6", 25 | "@types/serialize-javascript": "^5.0.4", 26 | "@typescript-eslint/eslint-plugin": "6.17.0", 27 | "@typescript-eslint/parser": "6.17.0", 28 | "builtin-modules": "3.3.0", 29 | "esbuild": "0.19.11", 30 | "husky": "^7.0.2", 31 | "lint-staged": "^10.5.3", 32 | "obsidian": "latest", 33 | "prettier": "^3.1.1", 34 | "tslib": "2.6.2", 35 | "typescript": "5.3.3" 36 | } 37 | }, 38 | "node_modules/@aashutoshrathi/word-wrap": { 39 | "version": "1.2.6", 40 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 41 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 42 | "dev": true, 43 | "peer": true, 44 | "engines": { 45 | "node": ">=0.10.0" 46 | } 47 | }, 48 | "node_modules/@babel/code-frame": { 49 | "version": "7.24.2", 50 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", 51 | "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", 52 | "dev": true, 53 | "dependencies": { 54 | "@babel/highlight": "^7.24.2", 55 | "picocolors": "^1.0.0" 56 | }, 57 | "engines": { 58 | "node": ">=6.9.0" 59 | } 60 | }, 61 | "node_modules/@babel/helper-validator-identifier": { 62 | "version": "7.22.20", 63 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 64 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 65 | "dev": true, 66 | "engines": { 67 | "node": ">=6.9.0" 68 | } 69 | }, 70 | "node_modules/@babel/highlight": { 71 | "version": "7.24.2", 72 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", 73 | "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", 74 | "dev": true, 75 | "dependencies": { 76 | "@babel/helper-validator-identifier": "^7.22.20", 77 | "chalk": "^2.4.2", 78 | "js-tokens": "^4.0.0", 79 | "picocolors": "^1.0.0" 80 | }, 81 | "engines": { 82 | "node": ">=6.9.0" 83 | } 84 | }, 85 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 86 | "version": "3.2.1", 87 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 88 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 89 | "dev": true, 90 | "dependencies": { 91 | "color-convert": "^1.9.0" 92 | }, 93 | "engines": { 94 | "node": ">=4" 95 | } 96 | }, 97 | "node_modules/@babel/highlight/node_modules/chalk": { 98 | "version": "2.4.2", 99 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 100 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 101 | "dev": true, 102 | "dependencies": { 103 | "ansi-styles": "^3.2.1", 104 | "escape-string-regexp": "^1.0.5", 105 | "supports-color": "^5.3.0" 106 | }, 107 | "engines": { 108 | "node": ">=4" 109 | } 110 | }, 111 | "node_modules/@babel/highlight/node_modules/color-convert": { 112 | "version": "1.9.3", 113 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 114 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 115 | "dev": true, 116 | "dependencies": { 117 | "color-name": "1.1.3" 118 | } 119 | }, 120 | "node_modules/@babel/highlight/node_modules/color-name": { 121 | "version": "1.1.3", 122 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 123 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 124 | "dev": true 125 | }, 126 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 127 | "version": "1.0.5", 128 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 129 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 130 | "dev": true, 131 | "engines": { 132 | "node": ">=0.8.0" 133 | } 134 | }, 135 | "node_modules/@babel/highlight/node_modules/has-flag": { 136 | "version": "3.0.0", 137 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 138 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 139 | "dev": true, 140 | "engines": { 141 | "node": ">=4" 142 | } 143 | }, 144 | "node_modules/@babel/highlight/node_modules/supports-color": { 145 | "version": "5.5.0", 146 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 147 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 148 | "dev": true, 149 | "dependencies": { 150 | "has-flag": "^3.0.0" 151 | }, 152 | "engines": { 153 | "node": ">=4" 154 | } 155 | }, 156 | "node_modules/@codemirror/state": { 157 | "version": "6.4.0", 158 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.0.tgz", 159 | "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==", 160 | "dev": true, 161 | "peer": true 162 | }, 163 | "node_modules/@codemirror/view": { 164 | "version": "6.23.0", 165 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.23.0.tgz", 166 | "integrity": "sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==", 167 | "dev": true, 168 | "peer": true, 169 | "dependencies": { 170 | "@codemirror/state": "^6.4.0", 171 | "style-mod": "^4.1.0", 172 | "w3c-keyname": "^2.2.4" 173 | } 174 | }, 175 | "node_modules/@esbuild/aix-ppc64": { 176 | "version": "0.19.11", 177 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", 178 | "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", 179 | "cpu": [ 180 | "ppc64" 181 | ], 182 | "dev": true, 183 | "optional": true, 184 | "os": [ 185 | "aix" 186 | ], 187 | "engines": { 188 | "node": ">=12" 189 | } 190 | }, 191 | "node_modules/@esbuild/android-arm": { 192 | "version": "0.19.11", 193 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", 194 | "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", 195 | "cpu": [ 196 | "arm" 197 | ], 198 | "dev": true, 199 | "optional": true, 200 | "os": [ 201 | "android" 202 | ], 203 | "engines": { 204 | "node": ">=12" 205 | } 206 | }, 207 | "node_modules/@esbuild/android-arm64": { 208 | "version": "0.19.11", 209 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", 210 | "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", 211 | "cpu": [ 212 | "arm64" 213 | ], 214 | "dev": true, 215 | "optional": true, 216 | "os": [ 217 | "android" 218 | ], 219 | "engines": { 220 | "node": ">=12" 221 | } 222 | }, 223 | "node_modules/@esbuild/android-x64": { 224 | "version": "0.19.11", 225 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", 226 | "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", 227 | "cpu": [ 228 | "x64" 229 | ], 230 | "dev": true, 231 | "optional": true, 232 | "os": [ 233 | "android" 234 | ], 235 | "engines": { 236 | "node": ">=12" 237 | } 238 | }, 239 | "node_modules/@esbuild/darwin-arm64": { 240 | "version": "0.19.11", 241 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", 242 | "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", 243 | "cpu": [ 244 | "arm64" 245 | ], 246 | "dev": true, 247 | "optional": true, 248 | "os": [ 249 | "darwin" 250 | ], 251 | "engines": { 252 | "node": ">=12" 253 | } 254 | }, 255 | "node_modules/@esbuild/darwin-x64": { 256 | "version": "0.19.11", 257 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", 258 | "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", 259 | "cpu": [ 260 | "x64" 261 | ], 262 | "dev": true, 263 | "optional": true, 264 | "os": [ 265 | "darwin" 266 | ], 267 | "engines": { 268 | "node": ">=12" 269 | } 270 | }, 271 | "node_modules/@esbuild/freebsd-arm64": { 272 | "version": "0.19.11", 273 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", 274 | "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", 275 | "cpu": [ 276 | "arm64" 277 | ], 278 | "dev": true, 279 | "optional": true, 280 | "os": [ 281 | "freebsd" 282 | ], 283 | "engines": { 284 | "node": ">=12" 285 | } 286 | }, 287 | "node_modules/@esbuild/freebsd-x64": { 288 | "version": "0.19.11", 289 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", 290 | "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", 291 | "cpu": [ 292 | "x64" 293 | ], 294 | "dev": true, 295 | "optional": true, 296 | "os": [ 297 | "freebsd" 298 | ], 299 | "engines": { 300 | "node": ">=12" 301 | } 302 | }, 303 | "node_modules/@esbuild/linux-arm": { 304 | "version": "0.19.11", 305 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", 306 | "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", 307 | "cpu": [ 308 | "arm" 309 | ], 310 | "dev": true, 311 | "optional": true, 312 | "os": [ 313 | "linux" 314 | ], 315 | "engines": { 316 | "node": ">=12" 317 | } 318 | }, 319 | "node_modules/@esbuild/linux-arm64": { 320 | "version": "0.19.11", 321 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", 322 | "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", 323 | "cpu": [ 324 | "arm64" 325 | ], 326 | "dev": true, 327 | "optional": true, 328 | "os": [ 329 | "linux" 330 | ], 331 | "engines": { 332 | "node": ">=12" 333 | } 334 | }, 335 | "node_modules/@esbuild/linux-ia32": { 336 | "version": "0.19.11", 337 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", 338 | "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", 339 | "cpu": [ 340 | "ia32" 341 | ], 342 | "dev": true, 343 | "optional": true, 344 | "os": [ 345 | "linux" 346 | ], 347 | "engines": { 348 | "node": ">=12" 349 | } 350 | }, 351 | "node_modules/@esbuild/linux-loong64": { 352 | "version": "0.19.11", 353 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", 354 | "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", 355 | "cpu": [ 356 | "loong64" 357 | ], 358 | "dev": true, 359 | "optional": true, 360 | "os": [ 361 | "linux" 362 | ], 363 | "engines": { 364 | "node": ">=12" 365 | } 366 | }, 367 | "node_modules/@esbuild/linux-mips64el": { 368 | "version": "0.19.11", 369 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", 370 | "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", 371 | "cpu": [ 372 | "mips64el" 373 | ], 374 | "dev": true, 375 | "optional": true, 376 | "os": [ 377 | "linux" 378 | ], 379 | "engines": { 380 | "node": ">=12" 381 | } 382 | }, 383 | "node_modules/@esbuild/linux-ppc64": { 384 | "version": "0.19.11", 385 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", 386 | "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", 387 | "cpu": [ 388 | "ppc64" 389 | ], 390 | "dev": true, 391 | "optional": true, 392 | "os": [ 393 | "linux" 394 | ], 395 | "engines": { 396 | "node": ">=12" 397 | } 398 | }, 399 | "node_modules/@esbuild/linux-riscv64": { 400 | "version": "0.19.11", 401 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", 402 | "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", 403 | "cpu": [ 404 | "riscv64" 405 | ], 406 | "dev": true, 407 | "optional": true, 408 | "os": [ 409 | "linux" 410 | ], 411 | "engines": { 412 | "node": ">=12" 413 | } 414 | }, 415 | "node_modules/@esbuild/linux-s390x": { 416 | "version": "0.19.11", 417 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", 418 | "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", 419 | "cpu": [ 420 | "s390x" 421 | ], 422 | "dev": true, 423 | "optional": true, 424 | "os": [ 425 | "linux" 426 | ], 427 | "engines": { 428 | "node": ">=12" 429 | } 430 | }, 431 | "node_modules/@esbuild/linux-x64": { 432 | "version": "0.19.11", 433 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", 434 | "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", 435 | "cpu": [ 436 | "x64" 437 | ], 438 | "dev": true, 439 | "optional": true, 440 | "os": [ 441 | "linux" 442 | ], 443 | "engines": { 444 | "node": ">=12" 445 | } 446 | }, 447 | "node_modules/@esbuild/netbsd-x64": { 448 | "version": "0.19.11", 449 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", 450 | "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", 451 | "cpu": [ 452 | "x64" 453 | ], 454 | "dev": true, 455 | "optional": true, 456 | "os": [ 457 | "netbsd" 458 | ], 459 | "engines": { 460 | "node": ">=12" 461 | } 462 | }, 463 | "node_modules/@esbuild/openbsd-x64": { 464 | "version": "0.19.11", 465 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", 466 | "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", 467 | "cpu": [ 468 | "x64" 469 | ], 470 | "dev": true, 471 | "optional": true, 472 | "os": [ 473 | "openbsd" 474 | ], 475 | "engines": { 476 | "node": ">=12" 477 | } 478 | }, 479 | "node_modules/@esbuild/sunos-x64": { 480 | "version": "0.19.11", 481 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", 482 | "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", 483 | "cpu": [ 484 | "x64" 485 | ], 486 | "dev": true, 487 | "optional": true, 488 | "os": [ 489 | "sunos" 490 | ], 491 | "engines": { 492 | "node": ">=12" 493 | } 494 | }, 495 | "node_modules/@esbuild/win32-arm64": { 496 | "version": "0.19.11", 497 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", 498 | "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", 499 | "cpu": [ 500 | "arm64" 501 | ], 502 | "dev": true, 503 | "optional": true, 504 | "os": [ 505 | "win32" 506 | ], 507 | "engines": { 508 | "node": ">=12" 509 | } 510 | }, 511 | "node_modules/@esbuild/win32-ia32": { 512 | "version": "0.19.11", 513 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", 514 | "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", 515 | "cpu": [ 516 | "ia32" 517 | ], 518 | "dev": true, 519 | "optional": true, 520 | "os": [ 521 | "win32" 522 | ], 523 | "engines": { 524 | "node": ">=12" 525 | } 526 | }, 527 | "node_modules/@esbuild/win32-x64": { 528 | "version": "0.19.11", 529 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", 530 | "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", 531 | "cpu": [ 532 | "x64" 533 | ], 534 | "dev": true, 535 | "optional": true, 536 | "os": [ 537 | "win32" 538 | ], 539 | "engines": { 540 | "node": ">=12" 541 | } 542 | }, 543 | "node_modules/@eslint-community/eslint-utils": { 544 | "version": "4.4.0", 545 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 546 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 547 | "dev": true, 548 | "dependencies": { 549 | "eslint-visitor-keys": "^3.3.0" 550 | }, 551 | "engines": { 552 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 553 | }, 554 | "peerDependencies": { 555 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 556 | } 557 | }, 558 | "node_modules/@eslint-community/regexpp": { 559 | "version": "4.10.0", 560 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", 561 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", 562 | "dev": true, 563 | "engines": { 564 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 565 | } 566 | }, 567 | "node_modules/@eslint/eslintrc": { 568 | "version": "2.1.4", 569 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 570 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 571 | "dev": true, 572 | "peer": true, 573 | "dependencies": { 574 | "ajv": "^6.12.4", 575 | "debug": "^4.3.2", 576 | "espree": "^9.6.0", 577 | "globals": "^13.19.0", 578 | "ignore": "^5.2.0", 579 | "import-fresh": "^3.2.1", 580 | "js-yaml": "^4.1.0", 581 | "minimatch": "^3.1.2", 582 | "strip-json-comments": "^3.1.1" 583 | }, 584 | "engines": { 585 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 586 | }, 587 | "funding": { 588 | "url": "https://opencollective.com/eslint" 589 | } 590 | }, 591 | "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { 592 | "version": "1.1.11", 593 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 594 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 595 | "dev": true, 596 | "peer": true, 597 | "dependencies": { 598 | "balanced-match": "^1.0.0", 599 | "concat-map": "0.0.1" 600 | } 601 | }, 602 | "node_modules/@eslint/eslintrc/node_modules/minimatch": { 603 | "version": "3.1.2", 604 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 605 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 606 | "dev": true, 607 | "peer": true, 608 | "dependencies": { 609 | "brace-expansion": "^1.1.7" 610 | }, 611 | "engines": { 612 | "node": "*" 613 | } 614 | }, 615 | "node_modules/@eslint/js": { 616 | "version": "8.56.0", 617 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", 618 | "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", 619 | "dev": true, 620 | "peer": true, 621 | "engines": { 622 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 623 | } 624 | }, 625 | "node_modules/@humanwhocodes/config-array": { 626 | "version": "0.11.13", 627 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", 628 | "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", 629 | "dev": true, 630 | "peer": true, 631 | "dependencies": { 632 | "@humanwhocodes/object-schema": "^2.0.1", 633 | "debug": "^4.1.1", 634 | "minimatch": "^3.0.5" 635 | }, 636 | "engines": { 637 | "node": ">=10.10.0" 638 | } 639 | }, 640 | "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { 641 | "version": "1.1.11", 642 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 643 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 644 | "dev": true, 645 | "peer": true, 646 | "dependencies": { 647 | "balanced-match": "^1.0.0", 648 | "concat-map": "0.0.1" 649 | } 650 | }, 651 | "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { 652 | "version": "3.1.2", 653 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 654 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 655 | "dev": true, 656 | "peer": true, 657 | "dependencies": { 658 | "brace-expansion": "^1.1.7" 659 | }, 660 | "engines": { 661 | "node": "*" 662 | } 663 | }, 664 | "node_modules/@humanwhocodes/module-importer": { 665 | "version": "1.0.1", 666 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 667 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 668 | "dev": true, 669 | "peer": true, 670 | "engines": { 671 | "node": ">=12.22" 672 | }, 673 | "funding": { 674 | "type": "github", 675 | "url": "https://github.com/sponsors/nzakas" 676 | } 677 | }, 678 | "node_modules/@humanwhocodes/object-schema": { 679 | "version": "2.0.1", 680 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", 681 | "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", 682 | "dev": true, 683 | "peer": true 684 | }, 685 | "node_modules/@nodelib/fs.scandir": { 686 | "version": "2.1.5", 687 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 688 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 689 | "dev": true, 690 | "dependencies": { 691 | "@nodelib/fs.stat": "2.0.5", 692 | "run-parallel": "^1.1.9" 693 | }, 694 | "engines": { 695 | "node": ">= 8" 696 | } 697 | }, 698 | "node_modules/@nodelib/fs.stat": { 699 | "version": "2.0.5", 700 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 701 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 702 | "dev": true, 703 | "engines": { 704 | "node": ">= 8" 705 | } 706 | }, 707 | "node_modules/@nodelib/fs.walk": { 708 | "version": "1.2.8", 709 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 710 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 711 | "dev": true, 712 | "dependencies": { 713 | "@nodelib/fs.scandir": "2.1.5", 714 | "fastq": "^1.6.0" 715 | }, 716 | "engines": { 717 | "node": ">= 8" 718 | } 719 | }, 720 | "node_modules/@types/codemirror": { 721 | "version": "5.60.8", 722 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 723 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 724 | "dev": true, 725 | "dependencies": { 726 | "@types/tern": "*" 727 | } 728 | }, 729 | "node_modules/@types/estree": { 730 | "version": "1.0.5", 731 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 732 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 733 | "dev": true 734 | }, 735 | "node_modules/@types/json-schema": { 736 | "version": "7.0.15", 737 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 738 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 739 | "dev": true 740 | }, 741 | "node_modules/@types/node": { 742 | "version": "20.10.6", 743 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", 744 | "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", 745 | "dev": true, 746 | "dependencies": { 747 | "undici-types": "~5.26.4" 748 | } 749 | }, 750 | "node_modules/@types/parse-json": { 751 | "version": "4.0.2", 752 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", 753 | "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", 754 | "dev": true 755 | }, 756 | "node_modules/@types/semver": { 757 | "version": "7.5.6", 758 | "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", 759 | "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", 760 | "dev": true 761 | }, 762 | "node_modules/@types/serialize-javascript": { 763 | "version": "5.0.4", 764 | "resolved": "https://registry.npmjs.org/@types/serialize-javascript/-/serialize-javascript-5.0.4.tgz", 765 | "integrity": "sha512-Z2R7UKFuNWCP8eoa2o9e5rkD3hmWxx/1L0CYz0k2BZzGh0PhEVMp9kfGiqEml/0IglwNERXZ2hwNzIrSz/KHTA==", 766 | "dev": true 767 | }, 768 | "node_modules/@types/tern": { 769 | "version": "0.23.9", 770 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 771 | "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 772 | "dev": true, 773 | "dependencies": { 774 | "@types/estree": "*" 775 | } 776 | }, 777 | "node_modules/@typescript-eslint/eslint-plugin": { 778 | "version": "6.17.0", 779 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz", 780 | "integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==", 781 | "dev": true, 782 | "dependencies": { 783 | "@eslint-community/regexpp": "^4.5.1", 784 | "@typescript-eslint/scope-manager": "6.17.0", 785 | "@typescript-eslint/type-utils": "6.17.0", 786 | "@typescript-eslint/utils": "6.17.0", 787 | "@typescript-eslint/visitor-keys": "6.17.0", 788 | "debug": "^4.3.4", 789 | "graphemer": "^1.4.0", 790 | "ignore": "^5.2.4", 791 | "natural-compare": "^1.4.0", 792 | "semver": "^7.5.4", 793 | "ts-api-utils": "^1.0.1" 794 | }, 795 | "engines": { 796 | "node": "^16.0.0 || >=18.0.0" 797 | }, 798 | "funding": { 799 | "type": "opencollective", 800 | "url": "https://opencollective.com/typescript-eslint" 801 | }, 802 | "peerDependencies": { 803 | "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", 804 | "eslint": "^7.0.0 || ^8.0.0" 805 | }, 806 | "peerDependenciesMeta": { 807 | "typescript": { 808 | "optional": true 809 | } 810 | } 811 | }, 812 | "node_modules/@typescript-eslint/parser": { 813 | "version": "6.17.0", 814 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz", 815 | "integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==", 816 | "dev": true, 817 | "dependencies": { 818 | "@typescript-eslint/scope-manager": "6.17.0", 819 | "@typescript-eslint/types": "6.17.0", 820 | "@typescript-eslint/typescript-estree": "6.17.0", 821 | "@typescript-eslint/visitor-keys": "6.17.0", 822 | "debug": "^4.3.4" 823 | }, 824 | "engines": { 825 | "node": "^16.0.0 || >=18.0.0" 826 | }, 827 | "funding": { 828 | "type": "opencollective", 829 | "url": "https://opencollective.com/typescript-eslint" 830 | }, 831 | "peerDependencies": { 832 | "eslint": "^7.0.0 || ^8.0.0" 833 | }, 834 | "peerDependenciesMeta": { 835 | "typescript": { 836 | "optional": true 837 | } 838 | } 839 | }, 840 | "node_modules/@typescript-eslint/scope-manager": { 841 | "version": "6.17.0", 842 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz", 843 | "integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==", 844 | "dev": true, 845 | "dependencies": { 846 | "@typescript-eslint/types": "6.17.0", 847 | "@typescript-eslint/visitor-keys": "6.17.0" 848 | }, 849 | "engines": { 850 | "node": "^16.0.0 || >=18.0.0" 851 | }, 852 | "funding": { 853 | "type": "opencollective", 854 | "url": "https://opencollective.com/typescript-eslint" 855 | } 856 | }, 857 | "node_modules/@typescript-eslint/type-utils": { 858 | "version": "6.17.0", 859 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz", 860 | "integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==", 861 | "dev": true, 862 | "dependencies": { 863 | "@typescript-eslint/typescript-estree": "6.17.0", 864 | "@typescript-eslint/utils": "6.17.0", 865 | "debug": "^4.3.4", 866 | "ts-api-utils": "^1.0.1" 867 | }, 868 | "engines": { 869 | "node": "^16.0.0 || >=18.0.0" 870 | }, 871 | "funding": { 872 | "type": "opencollective", 873 | "url": "https://opencollective.com/typescript-eslint" 874 | }, 875 | "peerDependencies": { 876 | "eslint": "^7.0.0 || ^8.0.0" 877 | }, 878 | "peerDependenciesMeta": { 879 | "typescript": { 880 | "optional": true 881 | } 882 | } 883 | }, 884 | "node_modules/@typescript-eslint/types": { 885 | "version": "6.17.0", 886 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz", 887 | "integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==", 888 | "dev": true, 889 | "engines": { 890 | "node": "^16.0.0 || >=18.0.0" 891 | }, 892 | "funding": { 893 | "type": "opencollective", 894 | "url": "https://opencollective.com/typescript-eslint" 895 | } 896 | }, 897 | "node_modules/@typescript-eslint/typescript-estree": { 898 | "version": "6.17.0", 899 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz", 900 | "integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==", 901 | "dev": true, 902 | "dependencies": { 903 | "@typescript-eslint/types": "6.17.0", 904 | "@typescript-eslint/visitor-keys": "6.17.0", 905 | "debug": "^4.3.4", 906 | "globby": "^11.1.0", 907 | "is-glob": "^4.0.3", 908 | "minimatch": "9.0.3", 909 | "semver": "^7.5.4", 910 | "ts-api-utils": "^1.0.1" 911 | }, 912 | "engines": { 913 | "node": "^16.0.0 || >=18.0.0" 914 | }, 915 | "funding": { 916 | "type": "opencollective", 917 | "url": "https://opencollective.com/typescript-eslint" 918 | }, 919 | "peerDependenciesMeta": { 920 | "typescript": { 921 | "optional": true 922 | } 923 | } 924 | }, 925 | "node_modules/@typescript-eslint/utils": { 926 | "version": "6.17.0", 927 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz", 928 | "integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==", 929 | "dev": true, 930 | "dependencies": { 931 | "@eslint-community/eslint-utils": "^4.4.0", 932 | "@types/json-schema": "^7.0.12", 933 | "@types/semver": "^7.5.0", 934 | "@typescript-eslint/scope-manager": "6.17.0", 935 | "@typescript-eslint/types": "6.17.0", 936 | "@typescript-eslint/typescript-estree": "6.17.0", 937 | "semver": "^7.5.4" 938 | }, 939 | "engines": { 940 | "node": "^16.0.0 || >=18.0.0" 941 | }, 942 | "funding": { 943 | "type": "opencollective", 944 | "url": "https://opencollective.com/typescript-eslint" 945 | }, 946 | "peerDependencies": { 947 | "eslint": "^7.0.0 || ^8.0.0" 948 | } 949 | }, 950 | "node_modules/@typescript-eslint/visitor-keys": { 951 | "version": "6.17.0", 952 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz", 953 | "integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==", 954 | "dev": true, 955 | "dependencies": { 956 | "@typescript-eslint/types": "6.17.0", 957 | "eslint-visitor-keys": "^3.4.1" 958 | }, 959 | "engines": { 960 | "node": "^16.0.0 || >=18.0.0" 961 | }, 962 | "funding": { 963 | "type": "opencollective", 964 | "url": "https://opencollective.com/typescript-eslint" 965 | } 966 | }, 967 | "node_modules/@ungap/structured-clone": { 968 | "version": "1.2.0", 969 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 970 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 971 | "dev": true, 972 | "peer": true 973 | }, 974 | "node_modules/acorn": { 975 | "version": "8.11.3", 976 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 977 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 978 | "dev": true, 979 | "peer": true, 980 | "bin": { 981 | "acorn": "bin/acorn" 982 | }, 983 | "engines": { 984 | "node": ">=0.4.0" 985 | } 986 | }, 987 | "node_modules/acorn-jsx": { 988 | "version": "5.3.2", 989 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 990 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 991 | "dev": true, 992 | "peer": true, 993 | "peerDependencies": { 994 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 995 | } 996 | }, 997 | "node_modules/aggregate-error": { 998 | "version": "3.1.0", 999 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 1000 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "clean-stack": "^2.0.0", 1004 | "indent-string": "^4.0.0" 1005 | }, 1006 | "engines": { 1007 | "node": ">=8" 1008 | } 1009 | }, 1010 | "node_modules/ajv": { 1011 | "version": "6.12.6", 1012 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1013 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1014 | "dev": true, 1015 | "peer": true, 1016 | "dependencies": { 1017 | "fast-deep-equal": "^3.1.1", 1018 | "fast-json-stable-stringify": "^2.0.0", 1019 | "json-schema-traverse": "^0.4.1", 1020 | "uri-js": "^4.2.2" 1021 | }, 1022 | "funding": { 1023 | "type": "github", 1024 | "url": "https://github.com/sponsors/epoberezkin" 1025 | } 1026 | }, 1027 | "node_modules/ansi-colors": { 1028 | "version": "4.1.3", 1029 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 1030 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 1031 | "dev": true, 1032 | "engines": { 1033 | "node": ">=6" 1034 | } 1035 | }, 1036 | "node_modules/ansi-escapes": { 1037 | "version": "4.3.2", 1038 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1039 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1040 | "dev": true, 1041 | "dependencies": { 1042 | "type-fest": "^0.21.3" 1043 | }, 1044 | "engines": { 1045 | "node": ">=8" 1046 | }, 1047 | "funding": { 1048 | "url": "https://github.com/sponsors/sindresorhus" 1049 | } 1050 | }, 1051 | "node_modules/ansi-escapes/node_modules/type-fest": { 1052 | "version": "0.21.3", 1053 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1054 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 1055 | "dev": true, 1056 | "engines": { 1057 | "node": ">=10" 1058 | }, 1059 | "funding": { 1060 | "url": "https://github.com/sponsors/sindresorhus" 1061 | } 1062 | }, 1063 | "node_modules/ansi-regex": { 1064 | "version": "5.0.1", 1065 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1066 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1067 | "dev": true, 1068 | "engines": { 1069 | "node": ">=8" 1070 | } 1071 | }, 1072 | "node_modules/ansi-styles": { 1073 | "version": "4.3.0", 1074 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1075 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1076 | "dev": true, 1077 | "dependencies": { 1078 | "color-convert": "^2.0.1" 1079 | }, 1080 | "engines": { 1081 | "node": ">=8" 1082 | }, 1083 | "funding": { 1084 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1085 | } 1086 | }, 1087 | "node_modules/argparse": { 1088 | "version": "2.0.1", 1089 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1090 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1091 | "dev": true, 1092 | "peer": true 1093 | }, 1094 | "node_modules/array-union": { 1095 | "version": "2.1.0", 1096 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 1097 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 1098 | "dev": true, 1099 | "engines": { 1100 | "node": ">=8" 1101 | } 1102 | }, 1103 | "node_modules/astral-regex": { 1104 | "version": "2.0.0", 1105 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 1106 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 1107 | "dev": true, 1108 | "engines": { 1109 | "node": ">=8" 1110 | } 1111 | }, 1112 | "node_modules/balanced-match": { 1113 | "version": "1.0.2", 1114 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1115 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1116 | "dev": true 1117 | }, 1118 | "node_modules/brace-expansion": { 1119 | "version": "2.0.1", 1120 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1121 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1122 | "dev": true, 1123 | "dependencies": { 1124 | "balanced-match": "^1.0.0" 1125 | } 1126 | }, 1127 | "node_modules/braces": { 1128 | "version": "3.0.2", 1129 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1130 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1131 | "dev": true, 1132 | "dependencies": { 1133 | "fill-range": "^7.0.1" 1134 | }, 1135 | "engines": { 1136 | "node": ">=8" 1137 | } 1138 | }, 1139 | "node_modules/builtin-modules": { 1140 | "version": "3.3.0", 1141 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 1142 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 1143 | "dev": true, 1144 | "engines": { 1145 | "node": ">=6" 1146 | }, 1147 | "funding": { 1148 | "url": "https://github.com/sponsors/sindresorhus" 1149 | } 1150 | }, 1151 | "node_modules/callsites": { 1152 | "version": "3.1.0", 1153 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1154 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1155 | "dev": true, 1156 | "engines": { 1157 | "node": ">=6" 1158 | } 1159 | }, 1160 | "node_modules/chalk": { 1161 | "version": "4.1.2", 1162 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1163 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1164 | "dev": true, 1165 | "dependencies": { 1166 | "ansi-styles": "^4.1.0", 1167 | "supports-color": "^7.1.0" 1168 | }, 1169 | "engines": { 1170 | "node": ">=10" 1171 | }, 1172 | "funding": { 1173 | "url": "https://github.com/chalk/chalk?sponsor=1" 1174 | } 1175 | }, 1176 | "node_modules/clean-stack": { 1177 | "version": "2.2.0", 1178 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 1179 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 1180 | "dev": true, 1181 | "engines": { 1182 | "node": ">=6" 1183 | } 1184 | }, 1185 | "node_modules/cli-cursor": { 1186 | "version": "3.1.0", 1187 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 1188 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 1189 | "dev": true, 1190 | "dependencies": { 1191 | "restore-cursor": "^3.1.0" 1192 | }, 1193 | "engines": { 1194 | "node": ">=8" 1195 | } 1196 | }, 1197 | "node_modules/cli-truncate": { 1198 | "version": "2.1.0", 1199 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", 1200 | "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", 1201 | "dev": true, 1202 | "dependencies": { 1203 | "slice-ansi": "^3.0.0", 1204 | "string-width": "^4.2.0" 1205 | }, 1206 | "engines": { 1207 | "node": ">=8" 1208 | }, 1209 | "funding": { 1210 | "url": "https://github.com/sponsors/sindresorhus" 1211 | } 1212 | }, 1213 | "node_modules/color-convert": { 1214 | "version": "2.0.1", 1215 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1216 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1217 | "dev": true, 1218 | "dependencies": { 1219 | "color-name": "~1.1.4" 1220 | }, 1221 | "engines": { 1222 | "node": ">=7.0.0" 1223 | } 1224 | }, 1225 | "node_modules/color-name": { 1226 | "version": "1.1.4", 1227 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1228 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1229 | "dev": true 1230 | }, 1231 | "node_modules/colorette": { 1232 | "version": "2.0.20", 1233 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", 1234 | "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", 1235 | "dev": true 1236 | }, 1237 | "node_modules/commander": { 1238 | "version": "6.2.1", 1239 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 1240 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", 1241 | "dev": true, 1242 | "engines": { 1243 | "node": ">= 6" 1244 | } 1245 | }, 1246 | "node_modules/concat-map": { 1247 | "version": "0.0.1", 1248 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1249 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1250 | "dev": true, 1251 | "peer": true 1252 | }, 1253 | "node_modules/cosmiconfig": { 1254 | "version": "7.1.0", 1255 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", 1256 | "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", 1257 | "dev": true, 1258 | "dependencies": { 1259 | "@types/parse-json": "^4.0.0", 1260 | "import-fresh": "^3.2.1", 1261 | "parse-json": "^5.0.0", 1262 | "path-type": "^4.0.0", 1263 | "yaml": "^1.10.0" 1264 | }, 1265 | "engines": { 1266 | "node": ">=10" 1267 | } 1268 | }, 1269 | "node_modules/cross-spawn": { 1270 | "version": "7.0.3", 1271 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1272 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1273 | "dev": true, 1274 | "dependencies": { 1275 | "path-key": "^3.1.0", 1276 | "shebang-command": "^2.0.0", 1277 | "which": "^2.0.1" 1278 | }, 1279 | "engines": { 1280 | "node": ">= 8" 1281 | } 1282 | }, 1283 | "node_modules/debug": { 1284 | "version": "4.3.4", 1285 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1286 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1287 | "dev": true, 1288 | "dependencies": { 1289 | "ms": "2.1.2" 1290 | }, 1291 | "engines": { 1292 | "node": ">=6.0" 1293 | }, 1294 | "peerDependenciesMeta": { 1295 | "supports-color": { 1296 | "optional": true 1297 | } 1298 | } 1299 | }, 1300 | "node_modules/dedent": { 1301 | "version": "0.7.0", 1302 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 1303 | "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", 1304 | "dev": true 1305 | }, 1306 | "node_modules/deep-is": { 1307 | "version": "0.1.4", 1308 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1309 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1310 | "dev": true, 1311 | "peer": true 1312 | }, 1313 | "node_modules/dir-glob": { 1314 | "version": "3.0.1", 1315 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1316 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1317 | "dev": true, 1318 | "dependencies": { 1319 | "path-type": "^4.0.0" 1320 | }, 1321 | "engines": { 1322 | "node": ">=8" 1323 | } 1324 | }, 1325 | "node_modules/doctrine": { 1326 | "version": "3.0.0", 1327 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1328 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1329 | "dev": true, 1330 | "peer": true, 1331 | "dependencies": { 1332 | "esutils": "^2.0.2" 1333 | }, 1334 | "engines": { 1335 | "node": ">=6.0.0" 1336 | } 1337 | }, 1338 | "node_modules/emoji-regex": { 1339 | "version": "8.0.0", 1340 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1341 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1342 | "dev": true 1343 | }, 1344 | "node_modules/end-of-stream": { 1345 | "version": "1.4.4", 1346 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1347 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1348 | "dev": true, 1349 | "dependencies": { 1350 | "once": "^1.4.0" 1351 | } 1352 | }, 1353 | "node_modules/enquirer": { 1354 | "version": "2.4.1", 1355 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", 1356 | "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", 1357 | "dev": true, 1358 | "dependencies": { 1359 | "ansi-colors": "^4.1.1", 1360 | "strip-ansi": "^6.0.1" 1361 | }, 1362 | "engines": { 1363 | "node": ">=8.6" 1364 | } 1365 | }, 1366 | "node_modules/error-ex": { 1367 | "version": "1.3.2", 1368 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1369 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1370 | "dev": true, 1371 | "dependencies": { 1372 | "is-arrayish": "^0.2.1" 1373 | } 1374 | }, 1375 | "node_modules/eruda": { 1376 | "version": "3.0.1", 1377 | "resolved": "https://registry.npmjs.org/eruda/-/eruda-3.0.1.tgz", 1378 | "integrity": "sha512-6q1Xdwga4JTr1mKSW4mzuWSSbmXgqpm/8Wa1QGFGfCWRjC0bCQjbS4u06M1te1moucIS3hBLlbSTPWYH2W0qbQ==" 1379 | }, 1380 | "node_modules/eruda-benchmark": { 1381 | "version": "2.0.1", 1382 | "resolved": "https://registry.npmjs.org/eruda-benchmark/-/eruda-benchmark-2.0.1.tgz", 1383 | "integrity": "sha512-HFcsReldgLyOd+1pyOjoqfHsyu2r2y7I1EWhyCkAdesEXsgPTEB7yF33ws6wWSoDWJAx9U+2A3OmS6JzlwCf+A==" 1384 | }, 1385 | "node_modules/eruda-code": { 1386 | "version": "2.1.0", 1387 | "resolved": "https://registry.npmjs.org/eruda-code/-/eruda-code-2.1.0.tgz", 1388 | "integrity": "sha512-4RR6ct314ufDUG0b7nBYjCqaXThgcbiqnxblGJoN98SaWCSuSnMk3DEMUPXV522z0/BzkEcqfcRlayjO1EaQng==" 1389 | }, 1390 | "node_modules/eruda-features": { 1391 | "version": "2.0.0", 1392 | "resolved": "https://registry.npmjs.org/eruda-features/-/eruda-features-2.0.0.tgz", 1393 | "integrity": "sha512-giwAIV2tgc1+vuuid06juc+3+SrLFxXE1It7RGkfhctC9fEH/UhSiTcvyiKcAbZ6IRSEPyP+cQe/RTipoEcetQ==" 1394 | }, 1395 | "node_modules/eruda-geolocation": { 1396 | "version": "2.0.0", 1397 | "resolved": "https://registry.npmjs.org/eruda-geolocation/-/eruda-geolocation-2.0.0.tgz", 1398 | "integrity": "sha512-V8bF3rt4W4re9KnJLmVBdi2xNhF65S1rPiiyKmGv7IxXNvW70byuAbSqzmvrqv4gHpcU4vpjh2yiAKYfbbmwog==" 1399 | }, 1400 | "node_modules/eruda-monitor": { 1401 | "version": "1.0.0", 1402 | "resolved": "https://registry.npmjs.org/eruda-monitor/-/eruda-monitor-1.0.0.tgz", 1403 | "integrity": "sha512-DB4NWsg+XQbIzaBLQMKtu2f3DNMXdEnEDkIuCUFHnSgYYzFur4CxR16XbZmDUC+bWiZBPvk9Pq7BkD+v4nUz+Q==" 1404 | }, 1405 | "node_modules/eruda-orientation": { 1406 | "version": "2.0.0", 1407 | "resolved": "https://registry.npmjs.org/eruda-orientation/-/eruda-orientation-2.0.0.tgz", 1408 | "integrity": "sha512-4WO2YJzLxQV4fzMQiEYtRUWF2ewwm5DjPMJfv1MzujZRwbohWdJmIxklBF9BGp6kgY2l6Dxto5NHwW64syR7XQ==" 1409 | }, 1410 | "node_modules/eruda-timing": { 1411 | "version": "2.0.1", 1412 | "resolved": "https://registry.npmjs.org/eruda-timing/-/eruda-timing-2.0.1.tgz", 1413 | "integrity": "sha512-68Cir2pjgw4kkamabhZMrn00uuGt9uTltAflzGQhr6yeG2nB+dRXFEn2whJGvwinBA9GKMpselsH529LNWKJIw==" 1414 | }, 1415 | "node_modules/eruda-touches": { 1416 | "version": "2.0.0", 1417 | "resolved": "https://registry.npmjs.org/eruda-touches/-/eruda-touches-2.0.0.tgz", 1418 | "integrity": "sha512-Qq5fXk6d1BbCBBa7FCjNhJ1iizSoyXL2ivsoVhrn8Zw9uj02iQTwfl+wiXaBsAI187JnY0Oqc4RGRejgH8jNLg==" 1419 | }, 1420 | "node_modules/esbuild": { 1421 | "version": "0.19.11", 1422 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", 1423 | "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", 1424 | "dev": true, 1425 | "hasInstallScript": true, 1426 | "bin": { 1427 | "esbuild": "bin/esbuild" 1428 | }, 1429 | "engines": { 1430 | "node": ">=12" 1431 | }, 1432 | "optionalDependencies": { 1433 | "@esbuild/aix-ppc64": "0.19.11", 1434 | "@esbuild/android-arm": "0.19.11", 1435 | "@esbuild/android-arm64": "0.19.11", 1436 | "@esbuild/android-x64": "0.19.11", 1437 | "@esbuild/darwin-arm64": "0.19.11", 1438 | "@esbuild/darwin-x64": "0.19.11", 1439 | "@esbuild/freebsd-arm64": "0.19.11", 1440 | "@esbuild/freebsd-x64": "0.19.11", 1441 | "@esbuild/linux-arm": "0.19.11", 1442 | "@esbuild/linux-arm64": "0.19.11", 1443 | "@esbuild/linux-ia32": "0.19.11", 1444 | "@esbuild/linux-loong64": "0.19.11", 1445 | "@esbuild/linux-mips64el": "0.19.11", 1446 | "@esbuild/linux-ppc64": "0.19.11", 1447 | "@esbuild/linux-riscv64": "0.19.11", 1448 | "@esbuild/linux-s390x": "0.19.11", 1449 | "@esbuild/linux-x64": "0.19.11", 1450 | "@esbuild/netbsd-x64": "0.19.11", 1451 | "@esbuild/openbsd-x64": "0.19.11", 1452 | "@esbuild/sunos-x64": "0.19.11", 1453 | "@esbuild/win32-arm64": "0.19.11", 1454 | "@esbuild/win32-ia32": "0.19.11", 1455 | "@esbuild/win32-x64": "0.19.11" 1456 | } 1457 | }, 1458 | "node_modules/escape-string-regexp": { 1459 | "version": "4.0.0", 1460 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1461 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1462 | "dev": true, 1463 | "peer": true, 1464 | "engines": { 1465 | "node": ">=10" 1466 | }, 1467 | "funding": { 1468 | "url": "https://github.com/sponsors/sindresorhus" 1469 | } 1470 | }, 1471 | "node_modules/eslint": { 1472 | "version": "8.56.0", 1473 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", 1474 | "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", 1475 | "dev": true, 1476 | "peer": true, 1477 | "dependencies": { 1478 | "@eslint-community/eslint-utils": "^4.2.0", 1479 | "@eslint-community/regexpp": "^4.6.1", 1480 | "@eslint/eslintrc": "^2.1.4", 1481 | "@eslint/js": "8.56.0", 1482 | "@humanwhocodes/config-array": "^0.11.13", 1483 | "@humanwhocodes/module-importer": "^1.0.1", 1484 | "@nodelib/fs.walk": "^1.2.8", 1485 | "@ungap/structured-clone": "^1.2.0", 1486 | "ajv": "^6.12.4", 1487 | "chalk": "^4.0.0", 1488 | "cross-spawn": "^7.0.2", 1489 | "debug": "^4.3.2", 1490 | "doctrine": "^3.0.0", 1491 | "escape-string-regexp": "^4.0.0", 1492 | "eslint-scope": "^7.2.2", 1493 | "eslint-visitor-keys": "^3.4.3", 1494 | "espree": "^9.6.1", 1495 | "esquery": "^1.4.2", 1496 | "esutils": "^2.0.2", 1497 | "fast-deep-equal": "^3.1.3", 1498 | "file-entry-cache": "^6.0.1", 1499 | "find-up": "^5.0.0", 1500 | "glob-parent": "^6.0.2", 1501 | "globals": "^13.19.0", 1502 | "graphemer": "^1.4.0", 1503 | "ignore": "^5.2.0", 1504 | "imurmurhash": "^0.1.4", 1505 | "is-glob": "^4.0.0", 1506 | "is-path-inside": "^3.0.3", 1507 | "js-yaml": "^4.1.0", 1508 | "json-stable-stringify-without-jsonify": "^1.0.1", 1509 | "levn": "^0.4.1", 1510 | "lodash.merge": "^4.6.2", 1511 | "minimatch": "^3.1.2", 1512 | "natural-compare": "^1.4.0", 1513 | "optionator": "^0.9.3", 1514 | "strip-ansi": "^6.0.1", 1515 | "text-table": "^0.2.0" 1516 | }, 1517 | "bin": { 1518 | "eslint": "bin/eslint.js" 1519 | }, 1520 | "engines": { 1521 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1522 | }, 1523 | "funding": { 1524 | "url": "https://opencollective.com/eslint" 1525 | } 1526 | }, 1527 | "node_modules/eslint-scope": { 1528 | "version": "7.2.2", 1529 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 1530 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 1531 | "dev": true, 1532 | "peer": true, 1533 | "dependencies": { 1534 | "esrecurse": "^4.3.0", 1535 | "estraverse": "^5.2.0" 1536 | }, 1537 | "engines": { 1538 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1539 | }, 1540 | "funding": { 1541 | "url": "https://opencollective.com/eslint" 1542 | } 1543 | }, 1544 | "node_modules/eslint-visitor-keys": { 1545 | "version": "3.4.3", 1546 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1547 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1548 | "dev": true, 1549 | "engines": { 1550 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1551 | }, 1552 | "funding": { 1553 | "url": "https://opencollective.com/eslint" 1554 | } 1555 | }, 1556 | "node_modules/eslint/node_modules/brace-expansion": { 1557 | "version": "1.1.11", 1558 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1559 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1560 | "dev": true, 1561 | "peer": true, 1562 | "dependencies": { 1563 | "balanced-match": "^1.0.0", 1564 | "concat-map": "0.0.1" 1565 | } 1566 | }, 1567 | "node_modules/eslint/node_modules/minimatch": { 1568 | "version": "3.1.2", 1569 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1570 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1571 | "dev": true, 1572 | "peer": true, 1573 | "dependencies": { 1574 | "brace-expansion": "^1.1.7" 1575 | }, 1576 | "engines": { 1577 | "node": "*" 1578 | } 1579 | }, 1580 | "node_modules/espree": { 1581 | "version": "9.6.1", 1582 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 1583 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 1584 | "dev": true, 1585 | "peer": true, 1586 | "dependencies": { 1587 | "acorn": "^8.9.0", 1588 | "acorn-jsx": "^5.3.2", 1589 | "eslint-visitor-keys": "^3.4.1" 1590 | }, 1591 | "engines": { 1592 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1593 | }, 1594 | "funding": { 1595 | "url": "https://opencollective.com/eslint" 1596 | } 1597 | }, 1598 | "node_modules/esquery": { 1599 | "version": "1.5.0", 1600 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 1601 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 1602 | "dev": true, 1603 | "peer": true, 1604 | "dependencies": { 1605 | "estraverse": "^5.1.0" 1606 | }, 1607 | "engines": { 1608 | "node": ">=0.10" 1609 | } 1610 | }, 1611 | "node_modules/esrecurse": { 1612 | "version": "4.3.0", 1613 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1614 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1615 | "dev": true, 1616 | "peer": true, 1617 | "dependencies": { 1618 | "estraverse": "^5.2.0" 1619 | }, 1620 | "engines": { 1621 | "node": ">=4.0" 1622 | } 1623 | }, 1624 | "node_modules/estraverse": { 1625 | "version": "5.3.0", 1626 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1627 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1628 | "dev": true, 1629 | "peer": true, 1630 | "engines": { 1631 | "node": ">=4.0" 1632 | } 1633 | }, 1634 | "node_modules/esutils": { 1635 | "version": "2.0.3", 1636 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1637 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1638 | "dev": true, 1639 | "peer": true, 1640 | "engines": { 1641 | "node": ">=0.10.0" 1642 | } 1643 | }, 1644 | "node_modules/execa": { 1645 | "version": "4.1.0", 1646 | "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", 1647 | "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", 1648 | "dev": true, 1649 | "dependencies": { 1650 | "cross-spawn": "^7.0.0", 1651 | "get-stream": "^5.0.0", 1652 | "human-signals": "^1.1.1", 1653 | "is-stream": "^2.0.0", 1654 | "merge-stream": "^2.0.0", 1655 | "npm-run-path": "^4.0.0", 1656 | "onetime": "^5.1.0", 1657 | "signal-exit": "^3.0.2", 1658 | "strip-final-newline": "^2.0.0" 1659 | }, 1660 | "engines": { 1661 | "node": ">=10" 1662 | }, 1663 | "funding": { 1664 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1665 | } 1666 | }, 1667 | "node_modules/fast-deep-equal": { 1668 | "version": "3.1.3", 1669 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1670 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1671 | "dev": true, 1672 | "peer": true 1673 | }, 1674 | "node_modules/fast-glob": { 1675 | "version": "3.3.2", 1676 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1677 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1678 | "dev": true, 1679 | "dependencies": { 1680 | "@nodelib/fs.stat": "^2.0.2", 1681 | "@nodelib/fs.walk": "^1.2.3", 1682 | "glob-parent": "^5.1.2", 1683 | "merge2": "^1.3.0", 1684 | "micromatch": "^4.0.4" 1685 | }, 1686 | "engines": { 1687 | "node": ">=8.6.0" 1688 | } 1689 | }, 1690 | "node_modules/fast-glob/node_modules/glob-parent": { 1691 | "version": "5.1.2", 1692 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1693 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1694 | "dev": true, 1695 | "dependencies": { 1696 | "is-glob": "^4.0.1" 1697 | }, 1698 | "engines": { 1699 | "node": ">= 6" 1700 | } 1701 | }, 1702 | "node_modules/fast-json-stable-stringify": { 1703 | "version": "2.1.0", 1704 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1705 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1706 | "dev": true, 1707 | "peer": true 1708 | }, 1709 | "node_modules/fast-levenshtein": { 1710 | "version": "2.0.6", 1711 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1712 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1713 | "dev": true, 1714 | "peer": true 1715 | }, 1716 | "node_modules/fastq": { 1717 | "version": "1.16.0", 1718 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", 1719 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 1720 | "dev": true, 1721 | "dependencies": { 1722 | "reusify": "^1.0.4" 1723 | } 1724 | }, 1725 | "node_modules/file-entry-cache": { 1726 | "version": "6.0.1", 1727 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1728 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1729 | "dev": true, 1730 | "peer": true, 1731 | "dependencies": { 1732 | "flat-cache": "^3.0.4" 1733 | }, 1734 | "engines": { 1735 | "node": "^10.12.0 || >=12.0.0" 1736 | } 1737 | }, 1738 | "node_modules/fill-range": { 1739 | "version": "7.0.1", 1740 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1741 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1742 | "dev": true, 1743 | "dependencies": { 1744 | "to-regex-range": "^5.0.1" 1745 | }, 1746 | "engines": { 1747 | "node": ">=8" 1748 | } 1749 | }, 1750 | "node_modules/find-up": { 1751 | "version": "5.0.0", 1752 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1753 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1754 | "dev": true, 1755 | "peer": true, 1756 | "dependencies": { 1757 | "locate-path": "^6.0.0", 1758 | "path-exists": "^4.0.0" 1759 | }, 1760 | "engines": { 1761 | "node": ">=10" 1762 | }, 1763 | "funding": { 1764 | "url": "https://github.com/sponsors/sindresorhus" 1765 | } 1766 | }, 1767 | "node_modules/flat-cache": { 1768 | "version": "3.2.0", 1769 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 1770 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 1771 | "dev": true, 1772 | "peer": true, 1773 | "dependencies": { 1774 | "flatted": "^3.2.9", 1775 | "keyv": "^4.5.3", 1776 | "rimraf": "^3.0.2" 1777 | }, 1778 | "engines": { 1779 | "node": "^10.12.0 || >=12.0.0" 1780 | } 1781 | }, 1782 | "node_modules/flatted": { 1783 | "version": "3.2.9", 1784 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", 1785 | "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", 1786 | "dev": true, 1787 | "peer": true 1788 | }, 1789 | "node_modules/fs.realpath": { 1790 | "version": "1.0.0", 1791 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1792 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1793 | "dev": true, 1794 | "peer": true 1795 | }, 1796 | "node_modules/get-own-enumerable-property-symbols": { 1797 | "version": "3.0.2", 1798 | "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", 1799 | "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", 1800 | "dev": true 1801 | }, 1802 | "node_modules/get-stream": { 1803 | "version": "5.2.0", 1804 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1805 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1806 | "dev": true, 1807 | "dependencies": { 1808 | "pump": "^3.0.0" 1809 | }, 1810 | "engines": { 1811 | "node": ">=8" 1812 | }, 1813 | "funding": { 1814 | "url": "https://github.com/sponsors/sindresorhus" 1815 | } 1816 | }, 1817 | "node_modules/glob": { 1818 | "version": "7.2.3", 1819 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1820 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1821 | "dev": true, 1822 | "peer": true, 1823 | "dependencies": { 1824 | "fs.realpath": "^1.0.0", 1825 | "inflight": "^1.0.4", 1826 | "inherits": "2", 1827 | "minimatch": "^3.1.1", 1828 | "once": "^1.3.0", 1829 | "path-is-absolute": "^1.0.0" 1830 | }, 1831 | "engines": { 1832 | "node": "*" 1833 | }, 1834 | "funding": { 1835 | "url": "https://github.com/sponsors/isaacs" 1836 | } 1837 | }, 1838 | "node_modules/glob-parent": { 1839 | "version": "6.0.2", 1840 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1841 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1842 | "dev": true, 1843 | "peer": true, 1844 | "dependencies": { 1845 | "is-glob": "^4.0.3" 1846 | }, 1847 | "engines": { 1848 | "node": ">=10.13.0" 1849 | } 1850 | }, 1851 | "node_modules/glob/node_modules/brace-expansion": { 1852 | "version": "1.1.11", 1853 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1854 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1855 | "dev": true, 1856 | "peer": true, 1857 | "dependencies": { 1858 | "balanced-match": "^1.0.0", 1859 | "concat-map": "0.0.1" 1860 | } 1861 | }, 1862 | "node_modules/glob/node_modules/minimatch": { 1863 | "version": "3.1.2", 1864 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1865 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1866 | "dev": true, 1867 | "peer": true, 1868 | "dependencies": { 1869 | "brace-expansion": "^1.1.7" 1870 | }, 1871 | "engines": { 1872 | "node": "*" 1873 | } 1874 | }, 1875 | "node_modules/globals": { 1876 | "version": "13.24.0", 1877 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 1878 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 1879 | "dev": true, 1880 | "peer": true, 1881 | "dependencies": { 1882 | "type-fest": "^0.20.2" 1883 | }, 1884 | "engines": { 1885 | "node": ">=8" 1886 | }, 1887 | "funding": { 1888 | "url": "https://github.com/sponsors/sindresorhus" 1889 | } 1890 | }, 1891 | "node_modules/globby": { 1892 | "version": "11.1.0", 1893 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1894 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1895 | "dev": true, 1896 | "dependencies": { 1897 | "array-union": "^2.1.0", 1898 | "dir-glob": "^3.0.1", 1899 | "fast-glob": "^3.2.9", 1900 | "ignore": "^5.2.0", 1901 | "merge2": "^1.4.1", 1902 | "slash": "^3.0.0" 1903 | }, 1904 | "engines": { 1905 | "node": ">=10" 1906 | }, 1907 | "funding": { 1908 | "url": "https://github.com/sponsors/sindresorhus" 1909 | } 1910 | }, 1911 | "node_modules/graphemer": { 1912 | "version": "1.4.0", 1913 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1914 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1915 | "dev": true 1916 | }, 1917 | "node_modules/has-flag": { 1918 | "version": "4.0.0", 1919 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1920 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1921 | "dev": true, 1922 | "engines": { 1923 | "node": ">=8" 1924 | } 1925 | }, 1926 | "node_modules/human-signals": { 1927 | "version": "1.1.1", 1928 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", 1929 | "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", 1930 | "dev": true, 1931 | "engines": { 1932 | "node": ">=8.12.0" 1933 | } 1934 | }, 1935 | "node_modules/husky": { 1936 | "version": "7.0.4", 1937 | "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", 1938 | "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", 1939 | "dev": true, 1940 | "bin": { 1941 | "husky": "lib/bin.js" 1942 | }, 1943 | "engines": { 1944 | "node": ">=12" 1945 | }, 1946 | "funding": { 1947 | "url": "https://github.com/sponsors/typicode" 1948 | } 1949 | }, 1950 | "node_modules/ignore": { 1951 | "version": "5.3.0", 1952 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", 1953 | "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", 1954 | "dev": true, 1955 | "engines": { 1956 | "node": ">= 4" 1957 | } 1958 | }, 1959 | "node_modules/import-fresh": { 1960 | "version": "3.3.0", 1961 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1962 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1963 | "dev": true, 1964 | "dependencies": { 1965 | "parent-module": "^1.0.0", 1966 | "resolve-from": "^4.0.0" 1967 | }, 1968 | "engines": { 1969 | "node": ">=6" 1970 | }, 1971 | "funding": { 1972 | "url": "https://github.com/sponsors/sindresorhus" 1973 | } 1974 | }, 1975 | "node_modules/imurmurhash": { 1976 | "version": "0.1.4", 1977 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1978 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1979 | "dev": true, 1980 | "peer": true, 1981 | "engines": { 1982 | "node": ">=0.8.19" 1983 | } 1984 | }, 1985 | "node_modules/indent-string": { 1986 | "version": "4.0.0", 1987 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1988 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 1989 | "dev": true, 1990 | "engines": { 1991 | "node": ">=8" 1992 | } 1993 | }, 1994 | "node_modules/inflight": { 1995 | "version": "1.0.6", 1996 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1997 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1998 | "dev": true, 1999 | "peer": true, 2000 | "dependencies": { 2001 | "once": "^1.3.0", 2002 | "wrappy": "1" 2003 | } 2004 | }, 2005 | "node_modules/inherits": { 2006 | "version": "2.0.4", 2007 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2008 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2009 | "dev": true, 2010 | "peer": true 2011 | }, 2012 | "node_modules/is-arrayish": { 2013 | "version": "0.2.1", 2014 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2015 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 2016 | "dev": true 2017 | }, 2018 | "node_modules/is-extglob": { 2019 | "version": "2.1.1", 2020 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2021 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2022 | "dev": true, 2023 | "engines": { 2024 | "node": ">=0.10.0" 2025 | } 2026 | }, 2027 | "node_modules/is-fullwidth-code-point": { 2028 | "version": "3.0.0", 2029 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2030 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2031 | "dev": true, 2032 | "engines": { 2033 | "node": ">=8" 2034 | } 2035 | }, 2036 | "node_modules/is-glob": { 2037 | "version": "4.0.3", 2038 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2039 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2040 | "dev": true, 2041 | "dependencies": { 2042 | "is-extglob": "^2.1.1" 2043 | }, 2044 | "engines": { 2045 | "node": ">=0.10.0" 2046 | } 2047 | }, 2048 | "node_modules/is-number": { 2049 | "version": "7.0.0", 2050 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2051 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2052 | "dev": true, 2053 | "engines": { 2054 | "node": ">=0.12.0" 2055 | } 2056 | }, 2057 | "node_modules/is-obj": { 2058 | "version": "1.0.1", 2059 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 2060 | "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", 2061 | "dev": true, 2062 | "engines": { 2063 | "node": ">=0.10.0" 2064 | } 2065 | }, 2066 | "node_modules/is-path-inside": { 2067 | "version": "3.0.3", 2068 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 2069 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 2070 | "dev": true, 2071 | "peer": true, 2072 | "engines": { 2073 | "node": ">=8" 2074 | } 2075 | }, 2076 | "node_modules/is-regexp": { 2077 | "version": "1.0.0", 2078 | "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", 2079 | "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", 2080 | "dev": true, 2081 | "engines": { 2082 | "node": ">=0.10.0" 2083 | } 2084 | }, 2085 | "node_modules/is-stream": { 2086 | "version": "2.0.1", 2087 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 2088 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 2089 | "dev": true, 2090 | "engines": { 2091 | "node": ">=8" 2092 | }, 2093 | "funding": { 2094 | "url": "https://github.com/sponsors/sindresorhus" 2095 | } 2096 | }, 2097 | "node_modules/is-unicode-supported": { 2098 | "version": "0.1.0", 2099 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 2100 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 2101 | "dev": true, 2102 | "engines": { 2103 | "node": ">=10" 2104 | }, 2105 | "funding": { 2106 | "url": "https://github.com/sponsors/sindresorhus" 2107 | } 2108 | }, 2109 | "node_modules/isexe": { 2110 | "version": "2.0.0", 2111 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2112 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2113 | "dev": true 2114 | }, 2115 | "node_modules/js-tokens": { 2116 | "version": "4.0.0", 2117 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2118 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2119 | "dev": true 2120 | }, 2121 | "node_modules/js-yaml": { 2122 | "version": "4.1.0", 2123 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2124 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2125 | "dev": true, 2126 | "peer": true, 2127 | "dependencies": { 2128 | "argparse": "^2.0.1" 2129 | }, 2130 | "bin": { 2131 | "js-yaml": "bin/js-yaml.js" 2132 | } 2133 | }, 2134 | "node_modules/json-buffer": { 2135 | "version": "3.0.1", 2136 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 2137 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2138 | "dev": true, 2139 | "peer": true 2140 | }, 2141 | "node_modules/json-parse-even-better-errors": { 2142 | "version": "2.3.1", 2143 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2144 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2145 | "dev": true 2146 | }, 2147 | "node_modules/json-schema-traverse": { 2148 | "version": "0.4.1", 2149 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2150 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2151 | "dev": true, 2152 | "peer": true 2153 | }, 2154 | "node_modules/json-stable-stringify-without-jsonify": { 2155 | "version": "1.0.1", 2156 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2157 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2158 | "dev": true, 2159 | "peer": true 2160 | }, 2161 | "node_modules/keyv": { 2162 | "version": "4.5.4", 2163 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 2164 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2165 | "dev": true, 2166 | "peer": true, 2167 | "dependencies": { 2168 | "json-buffer": "3.0.1" 2169 | } 2170 | }, 2171 | "node_modules/levn": { 2172 | "version": "0.4.1", 2173 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2174 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2175 | "dev": true, 2176 | "peer": true, 2177 | "dependencies": { 2178 | "prelude-ls": "^1.2.1", 2179 | "type-check": "~0.4.0" 2180 | }, 2181 | "engines": { 2182 | "node": ">= 0.8.0" 2183 | } 2184 | }, 2185 | "node_modules/lines-and-columns": { 2186 | "version": "1.2.4", 2187 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2188 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2189 | "dev": true 2190 | }, 2191 | "node_modules/lint-staged": { 2192 | "version": "10.5.4", 2193 | "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", 2194 | "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", 2195 | "dev": true, 2196 | "dependencies": { 2197 | "chalk": "^4.1.0", 2198 | "cli-truncate": "^2.1.0", 2199 | "commander": "^6.2.0", 2200 | "cosmiconfig": "^7.0.0", 2201 | "debug": "^4.2.0", 2202 | "dedent": "^0.7.0", 2203 | "enquirer": "^2.3.6", 2204 | "execa": "^4.1.0", 2205 | "listr2": "^3.2.2", 2206 | "log-symbols": "^4.0.0", 2207 | "micromatch": "^4.0.2", 2208 | "normalize-path": "^3.0.0", 2209 | "please-upgrade-node": "^3.2.0", 2210 | "string-argv": "0.3.1", 2211 | "stringify-object": "^3.3.0" 2212 | }, 2213 | "bin": { 2214 | "lint-staged": "bin/lint-staged.js" 2215 | }, 2216 | "funding": { 2217 | "url": "https://opencollective.com/lint-staged" 2218 | } 2219 | }, 2220 | "node_modules/listr2": { 2221 | "version": "3.14.0", 2222 | "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", 2223 | "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", 2224 | "dev": true, 2225 | "dependencies": { 2226 | "cli-truncate": "^2.1.0", 2227 | "colorette": "^2.0.16", 2228 | "log-update": "^4.0.0", 2229 | "p-map": "^4.0.0", 2230 | "rfdc": "^1.3.0", 2231 | "rxjs": "^7.5.1", 2232 | "through": "^2.3.8", 2233 | "wrap-ansi": "^7.0.0" 2234 | }, 2235 | "engines": { 2236 | "node": ">=10.0.0" 2237 | }, 2238 | "peerDependencies": { 2239 | "enquirer": ">= 2.3.0 < 3" 2240 | }, 2241 | "peerDependenciesMeta": { 2242 | "enquirer": { 2243 | "optional": true 2244 | } 2245 | } 2246 | }, 2247 | "node_modules/locate-path": { 2248 | "version": "6.0.0", 2249 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2250 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2251 | "dev": true, 2252 | "peer": true, 2253 | "dependencies": { 2254 | "p-locate": "^5.0.0" 2255 | }, 2256 | "engines": { 2257 | "node": ">=10" 2258 | }, 2259 | "funding": { 2260 | "url": "https://github.com/sponsors/sindresorhus" 2261 | } 2262 | }, 2263 | "node_modules/lodash.merge": { 2264 | "version": "4.6.2", 2265 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2266 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2267 | "dev": true, 2268 | "peer": true 2269 | }, 2270 | "node_modules/log-symbols": { 2271 | "version": "4.1.0", 2272 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2273 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2274 | "dev": true, 2275 | "dependencies": { 2276 | "chalk": "^4.1.0", 2277 | "is-unicode-supported": "^0.1.0" 2278 | }, 2279 | "engines": { 2280 | "node": ">=10" 2281 | }, 2282 | "funding": { 2283 | "url": "https://github.com/sponsors/sindresorhus" 2284 | } 2285 | }, 2286 | "node_modules/log-update": { 2287 | "version": "4.0.0", 2288 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", 2289 | "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", 2290 | "dev": true, 2291 | "dependencies": { 2292 | "ansi-escapes": "^4.3.0", 2293 | "cli-cursor": "^3.1.0", 2294 | "slice-ansi": "^4.0.0", 2295 | "wrap-ansi": "^6.2.0" 2296 | }, 2297 | "engines": { 2298 | "node": ">=10" 2299 | }, 2300 | "funding": { 2301 | "url": "https://github.com/sponsors/sindresorhus" 2302 | } 2303 | }, 2304 | "node_modules/log-update/node_modules/slice-ansi": { 2305 | "version": "4.0.0", 2306 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 2307 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 2308 | "dev": true, 2309 | "dependencies": { 2310 | "ansi-styles": "^4.0.0", 2311 | "astral-regex": "^2.0.0", 2312 | "is-fullwidth-code-point": "^3.0.0" 2313 | }, 2314 | "engines": { 2315 | "node": ">=10" 2316 | }, 2317 | "funding": { 2318 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 2319 | } 2320 | }, 2321 | "node_modules/log-update/node_modules/wrap-ansi": { 2322 | "version": "6.2.0", 2323 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 2324 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 2325 | "dev": true, 2326 | "dependencies": { 2327 | "ansi-styles": "^4.0.0", 2328 | "string-width": "^4.1.0", 2329 | "strip-ansi": "^6.0.0" 2330 | }, 2331 | "engines": { 2332 | "node": ">=8" 2333 | } 2334 | }, 2335 | "node_modules/lru-cache": { 2336 | "version": "6.0.0", 2337 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2338 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2339 | "dev": true, 2340 | "dependencies": { 2341 | "yallist": "^4.0.0" 2342 | }, 2343 | "engines": { 2344 | "node": ">=10" 2345 | } 2346 | }, 2347 | "node_modules/merge-stream": { 2348 | "version": "2.0.0", 2349 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2350 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2351 | "dev": true 2352 | }, 2353 | "node_modules/merge2": { 2354 | "version": "1.4.1", 2355 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2356 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2357 | "dev": true, 2358 | "engines": { 2359 | "node": ">= 8" 2360 | } 2361 | }, 2362 | "node_modules/micromatch": { 2363 | "version": "4.0.5", 2364 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2365 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2366 | "dev": true, 2367 | "dependencies": { 2368 | "braces": "^3.0.2", 2369 | "picomatch": "^2.3.1" 2370 | }, 2371 | "engines": { 2372 | "node": ">=8.6" 2373 | } 2374 | }, 2375 | "node_modules/mimic-fn": { 2376 | "version": "2.1.0", 2377 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2378 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2379 | "dev": true, 2380 | "engines": { 2381 | "node": ">=6" 2382 | } 2383 | }, 2384 | "node_modules/minimatch": { 2385 | "version": "9.0.3", 2386 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 2387 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 2388 | "dev": true, 2389 | "dependencies": { 2390 | "brace-expansion": "^2.0.1" 2391 | }, 2392 | "engines": { 2393 | "node": ">=16 || 14 >=14.17" 2394 | }, 2395 | "funding": { 2396 | "url": "https://github.com/sponsors/isaacs" 2397 | } 2398 | }, 2399 | "node_modules/moment": { 2400 | "version": "2.29.4", 2401 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 2402 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 2403 | "dev": true, 2404 | "engines": { 2405 | "node": "*" 2406 | } 2407 | }, 2408 | "node_modules/ms": { 2409 | "version": "2.1.2", 2410 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2411 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2412 | "dev": true 2413 | }, 2414 | "node_modules/natural-compare": { 2415 | "version": "1.4.0", 2416 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2417 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2418 | "dev": true 2419 | }, 2420 | "node_modules/normalize-path": { 2421 | "version": "3.0.0", 2422 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2423 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2424 | "dev": true, 2425 | "engines": { 2426 | "node": ">=0.10.0" 2427 | } 2428 | }, 2429 | "node_modules/npm-run-path": { 2430 | "version": "4.0.1", 2431 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2432 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2433 | "dev": true, 2434 | "dependencies": { 2435 | "path-key": "^3.0.0" 2436 | }, 2437 | "engines": { 2438 | "node": ">=8" 2439 | } 2440 | }, 2441 | "node_modules/obsidian": { 2442 | "version": "1.4.11", 2443 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.4.11.tgz", 2444 | "integrity": "sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==", 2445 | "dev": true, 2446 | "dependencies": { 2447 | "@types/codemirror": "5.60.8", 2448 | "moment": "2.29.4" 2449 | }, 2450 | "peerDependencies": { 2451 | "@codemirror/state": "^6.0.0", 2452 | "@codemirror/view": "^6.0.0" 2453 | } 2454 | }, 2455 | "node_modules/once": { 2456 | "version": "1.4.0", 2457 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2458 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2459 | "dev": true, 2460 | "dependencies": { 2461 | "wrappy": "1" 2462 | } 2463 | }, 2464 | "node_modules/onetime": { 2465 | "version": "5.1.2", 2466 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2467 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2468 | "dev": true, 2469 | "dependencies": { 2470 | "mimic-fn": "^2.1.0" 2471 | }, 2472 | "engines": { 2473 | "node": ">=6" 2474 | }, 2475 | "funding": { 2476 | "url": "https://github.com/sponsors/sindresorhus" 2477 | } 2478 | }, 2479 | "node_modules/optionator": { 2480 | "version": "0.9.3", 2481 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 2482 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 2483 | "dev": true, 2484 | "peer": true, 2485 | "dependencies": { 2486 | "@aashutoshrathi/word-wrap": "^1.2.3", 2487 | "deep-is": "^0.1.3", 2488 | "fast-levenshtein": "^2.0.6", 2489 | "levn": "^0.4.1", 2490 | "prelude-ls": "^1.2.1", 2491 | "type-check": "^0.4.0" 2492 | }, 2493 | "engines": { 2494 | "node": ">= 0.8.0" 2495 | } 2496 | }, 2497 | "node_modules/p-limit": { 2498 | "version": "3.1.0", 2499 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2500 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2501 | "dev": true, 2502 | "peer": true, 2503 | "dependencies": { 2504 | "yocto-queue": "^0.1.0" 2505 | }, 2506 | "engines": { 2507 | "node": ">=10" 2508 | }, 2509 | "funding": { 2510 | "url": "https://github.com/sponsors/sindresorhus" 2511 | } 2512 | }, 2513 | "node_modules/p-locate": { 2514 | "version": "5.0.0", 2515 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2516 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2517 | "dev": true, 2518 | "peer": true, 2519 | "dependencies": { 2520 | "p-limit": "^3.0.2" 2521 | }, 2522 | "engines": { 2523 | "node": ">=10" 2524 | }, 2525 | "funding": { 2526 | "url": "https://github.com/sponsors/sindresorhus" 2527 | } 2528 | }, 2529 | "node_modules/p-map": { 2530 | "version": "4.0.0", 2531 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 2532 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 2533 | "dev": true, 2534 | "dependencies": { 2535 | "aggregate-error": "^3.0.0" 2536 | }, 2537 | "engines": { 2538 | "node": ">=10" 2539 | }, 2540 | "funding": { 2541 | "url": "https://github.com/sponsors/sindresorhus" 2542 | } 2543 | }, 2544 | "node_modules/parent-module": { 2545 | "version": "1.0.1", 2546 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2547 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2548 | "dev": true, 2549 | "dependencies": { 2550 | "callsites": "^3.0.0" 2551 | }, 2552 | "engines": { 2553 | "node": ">=6" 2554 | } 2555 | }, 2556 | "node_modules/parse-json": { 2557 | "version": "5.2.0", 2558 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2559 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2560 | "dev": true, 2561 | "dependencies": { 2562 | "@babel/code-frame": "^7.0.0", 2563 | "error-ex": "^1.3.1", 2564 | "json-parse-even-better-errors": "^2.3.0", 2565 | "lines-and-columns": "^1.1.6" 2566 | }, 2567 | "engines": { 2568 | "node": ">=8" 2569 | }, 2570 | "funding": { 2571 | "url": "https://github.com/sponsors/sindresorhus" 2572 | } 2573 | }, 2574 | "node_modules/path-exists": { 2575 | "version": "4.0.0", 2576 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2577 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2578 | "dev": true, 2579 | "peer": true, 2580 | "engines": { 2581 | "node": ">=8" 2582 | } 2583 | }, 2584 | "node_modules/path-is-absolute": { 2585 | "version": "1.0.1", 2586 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2587 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2588 | "dev": true, 2589 | "peer": true, 2590 | "engines": { 2591 | "node": ">=0.10.0" 2592 | } 2593 | }, 2594 | "node_modules/path-key": { 2595 | "version": "3.1.1", 2596 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2597 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2598 | "dev": true, 2599 | "engines": { 2600 | "node": ">=8" 2601 | } 2602 | }, 2603 | "node_modules/path-type": { 2604 | "version": "4.0.0", 2605 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2606 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2607 | "dev": true, 2608 | "engines": { 2609 | "node": ">=8" 2610 | } 2611 | }, 2612 | "node_modules/picocolors": { 2613 | "version": "1.0.0", 2614 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2615 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2616 | "dev": true 2617 | }, 2618 | "node_modules/picomatch": { 2619 | "version": "2.3.1", 2620 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2621 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2622 | "dev": true, 2623 | "engines": { 2624 | "node": ">=8.6" 2625 | }, 2626 | "funding": { 2627 | "url": "https://github.com/sponsors/jonschlinkert" 2628 | } 2629 | }, 2630 | "node_modules/please-upgrade-node": { 2631 | "version": "3.2.0", 2632 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", 2633 | "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", 2634 | "dev": true, 2635 | "dependencies": { 2636 | "semver-compare": "^1.0.0" 2637 | } 2638 | }, 2639 | "node_modules/prelude-ls": { 2640 | "version": "1.2.1", 2641 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2642 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2643 | "dev": true, 2644 | "peer": true, 2645 | "engines": { 2646 | "node": ">= 0.8.0" 2647 | } 2648 | }, 2649 | "node_modules/prettier": { 2650 | "version": "3.1.1", 2651 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", 2652 | "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", 2653 | "dev": true, 2654 | "bin": { 2655 | "prettier": "bin/prettier.cjs" 2656 | }, 2657 | "engines": { 2658 | "node": ">=14" 2659 | }, 2660 | "funding": { 2661 | "url": "https://github.com/prettier/prettier?sponsor=1" 2662 | } 2663 | }, 2664 | "node_modules/pump": { 2665 | "version": "3.0.0", 2666 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2667 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2668 | "dev": true, 2669 | "dependencies": { 2670 | "end-of-stream": "^1.1.0", 2671 | "once": "^1.3.1" 2672 | } 2673 | }, 2674 | "node_modules/punycode": { 2675 | "version": "2.3.1", 2676 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2677 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2678 | "dev": true, 2679 | "peer": true, 2680 | "engines": { 2681 | "node": ">=6" 2682 | } 2683 | }, 2684 | "node_modules/queue-microtask": { 2685 | "version": "1.2.3", 2686 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2687 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2688 | "dev": true, 2689 | "funding": [ 2690 | { 2691 | "type": "github", 2692 | "url": "https://github.com/sponsors/feross" 2693 | }, 2694 | { 2695 | "type": "patreon", 2696 | "url": "https://www.patreon.com/feross" 2697 | }, 2698 | { 2699 | "type": "consulting", 2700 | "url": "https://feross.org/support" 2701 | } 2702 | ] 2703 | }, 2704 | "node_modules/resolve-from": { 2705 | "version": "4.0.0", 2706 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2707 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2708 | "dev": true, 2709 | "engines": { 2710 | "node": ">=4" 2711 | } 2712 | }, 2713 | "node_modules/restore-cursor": { 2714 | "version": "3.1.0", 2715 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 2716 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2717 | "dev": true, 2718 | "dependencies": { 2719 | "onetime": "^5.1.0", 2720 | "signal-exit": "^3.0.2" 2721 | }, 2722 | "engines": { 2723 | "node": ">=8" 2724 | } 2725 | }, 2726 | "node_modules/reusify": { 2727 | "version": "1.0.4", 2728 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2729 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2730 | "dev": true, 2731 | "engines": { 2732 | "iojs": ">=1.0.0", 2733 | "node": ">=0.10.0" 2734 | } 2735 | }, 2736 | "node_modules/rfdc": { 2737 | "version": "1.3.1", 2738 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", 2739 | "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", 2740 | "dev": true 2741 | }, 2742 | "node_modules/rimraf": { 2743 | "version": "3.0.2", 2744 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2745 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2746 | "dev": true, 2747 | "peer": true, 2748 | "dependencies": { 2749 | "glob": "^7.1.3" 2750 | }, 2751 | "bin": { 2752 | "rimraf": "bin.js" 2753 | }, 2754 | "funding": { 2755 | "url": "https://github.com/sponsors/isaacs" 2756 | } 2757 | }, 2758 | "node_modules/run-parallel": { 2759 | "version": "1.2.0", 2760 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2761 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2762 | "dev": true, 2763 | "funding": [ 2764 | { 2765 | "type": "github", 2766 | "url": "https://github.com/sponsors/feross" 2767 | }, 2768 | { 2769 | "type": "patreon", 2770 | "url": "https://www.patreon.com/feross" 2771 | }, 2772 | { 2773 | "type": "consulting", 2774 | "url": "https://feross.org/support" 2775 | } 2776 | ], 2777 | "dependencies": { 2778 | "queue-microtask": "^1.2.2" 2779 | } 2780 | }, 2781 | "node_modules/rxjs": { 2782 | "version": "7.8.1", 2783 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", 2784 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", 2785 | "dev": true, 2786 | "dependencies": { 2787 | "tslib": "^2.1.0" 2788 | } 2789 | }, 2790 | "node_modules/semver": { 2791 | "version": "7.5.4", 2792 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2793 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2794 | "dev": true, 2795 | "dependencies": { 2796 | "lru-cache": "^6.0.0" 2797 | }, 2798 | "bin": { 2799 | "semver": "bin/semver.js" 2800 | }, 2801 | "engines": { 2802 | "node": ">=10" 2803 | } 2804 | }, 2805 | "node_modules/semver-compare": { 2806 | "version": "1.0.0", 2807 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 2808 | "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", 2809 | "dev": true 2810 | }, 2811 | "node_modules/shebang-command": { 2812 | "version": "2.0.0", 2813 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2814 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2815 | "dev": true, 2816 | "dependencies": { 2817 | "shebang-regex": "^3.0.0" 2818 | }, 2819 | "engines": { 2820 | "node": ">=8" 2821 | } 2822 | }, 2823 | "node_modules/shebang-regex": { 2824 | "version": "3.0.0", 2825 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2826 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2827 | "dev": true, 2828 | "engines": { 2829 | "node": ">=8" 2830 | } 2831 | }, 2832 | "node_modules/signal-exit": { 2833 | "version": "3.0.7", 2834 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2835 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2836 | "dev": true 2837 | }, 2838 | "node_modules/slash": { 2839 | "version": "3.0.0", 2840 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2841 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2842 | "dev": true, 2843 | "engines": { 2844 | "node": ">=8" 2845 | } 2846 | }, 2847 | "node_modules/slice-ansi": { 2848 | "version": "3.0.0", 2849 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", 2850 | "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", 2851 | "dev": true, 2852 | "dependencies": { 2853 | "ansi-styles": "^4.0.0", 2854 | "astral-regex": "^2.0.0", 2855 | "is-fullwidth-code-point": "^3.0.0" 2856 | }, 2857 | "engines": { 2858 | "node": ">=8" 2859 | } 2860 | }, 2861 | "node_modules/string-argv": { 2862 | "version": "0.3.1", 2863 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", 2864 | "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", 2865 | "dev": true, 2866 | "engines": { 2867 | "node": ">=0.6.19" 2868 | } 2869 | }, 2870 | "node_modules/string-width": { 2871 | "version": "4.2.3", 2872 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2873 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2874 | "dev": true, 2875 | "dependencies": { 2876 | "emoji-regex": "^8.0.0", 2877 | "is-fullwidth-code-point": "^3.0.0", 2878 | "strip-ansi": "^6.0.1" 2879 | }, 2880 | "engines": { 2881 | "node": ">=8" 2882 | } 2883 | }, 2884 | "node_modules/stringify-object": { 2885 | "version": "3.3.0", 2886 | "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", 2887 | "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", 2888 | "dev": true, 2889 | "dependencies": { 2890 | "get-own-enumerable-property-symbols": "^3.0.0", 2891 | "is-obj": "^1.0.1", 2892 | "is-regexp": "^1.0.0" 2893 | }, 2894 | "engines": { 2895 | "node": ">=4" 2896 | } 2897 | }, 2898 | "node_modules/strip-ansi": { 2899 | "version": "6.0.1", 2900 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2901 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2902 | "dev": true, 2903 | "dependencies": { 2904 | "ansi-regex": "^5.0.1" 2905 | }, 2906 | "engines": { 2907 | "node": ">=8" 2908 | } 2909 | }, 2910 | "node_modules/strip-final-newline": { 2911 | "version": "2.0.0", 2912 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 2913 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 2914 | "dev": true, 2915 | "engines": { 2916 | "node": ">=6" 2917 | } 2918 | }, 2919 | "node_modules/strip-json-comments": { 2920 | "version": "3.1.1", 2921 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2922 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2923 | "dev": true, 2924 | "peer": true, 2925 | "engines": { 2926 | "node": ">=8" 2927 | }, 2928 | "funding": { 2929 | "url": "https://github.com/sponsors/sindresorhus" 2930 | } 2931 | }, 2932 | "node_modules/style-mod": { 2933 | "version": "4.1.0", 2934 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", 2935 | "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==", 2936 | "dev": true, 2937 | "peer": true 2938 | }, 2939 | "node_modules/supports-color": { 2940 | "version": "7.2.0", 2941 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2942 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2943 | "dev": true, 2944 | "dependencies": { 2945 | "has-flag": "^4.0.0" 2946 | }, 2947 | "engines": { 2948 | "node": ">=8" 2949 | } 2950 | }, 2951 | "node_modules/text-table": { 2952 | "version": "0.2.0", 2953 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2954 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2955 | "dev": true, 2956 | "peer": true 2957 | }, 2958 | "node_modules/through": { 2959 | "version": "2.3.8", 2960 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2961 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 2962 | "dev": true 2963 | }, 2964 | "node_modules/to-regex-range": { 2965 | "version": "5.0.1", 2966 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2967 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2968 | "dev": true, 2969 | "dependencies": { 2970 | "is-number": "^7.0.0" 2971 | }, 2972 | "engines": { 2973 | "node": ">=8.0" 2974 | } 2975 | }, 2976 | "node_modules/ts-api-utils": { 2977 | "version": "1.0.3", 2978 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", 2979 | "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", 2980 | "dev": true, 2981 | "engines": { 2982 | "node": ">=16.13.0" 2983 | }, 2984 | "peerDependencies": { 2985 | "typescript": ">=4.2.0" 2986 | } 2987 | }, 2988 | "node_modules/tslib": { 2989 | "version": "2.6.2", 2990 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 2991 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 2992 | "dev": true 2993 | }, 2994 | "node_modules/type-check": { 2995 | "version": "0.4.0", 2996 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2997 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2998 | "dev": true, 2999 | "peer": true, 3000 | "dependencies": { 3001 | "prelude-ls": "^1.2.1" 3002 | }, 3003 | "engines": { 3004 | "node": ">= 0.8.0" 3005 | } 3006 | }, 3007 | "node_modules/type-fest": { 3008 | "version": "0.20.2", 3009 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 3010 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 3011 | "dev": true, 3012 | "peer": true, 3013 | "engines": { 3014 | "node": ">=10" 3015 | }, 3016 | "funding": { 3017 | "url": "https://github.com/sponsors/sindresorhus" 3018 | } 3019 | }, 3020 | "node_modules/typescript": { 3021 | "version": "5.3.3", 3022 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", 3023 | "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", 3024 | "dev": true, 3025 | "bin": { 3026 | "tsc": "bin/tsc", 3027 | "tsserver": "bin/tsserver" 3028 | }, 3029 | "engines": { 3030 | "node": ">=14.17" 3031 | } 3032 | }, 3033 | "node_modules/undici-types": { 3034 | "version": "5.26.5", 3035 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 3036 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 3037 | "dev": true 3038 | }, 3039 | "node_modules/uri-js": { 3040 | "version": "4.4.1", 3041 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3042 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3043 | "dev": true, 3044 | "peer": true, 3045 | "dependencies": { 3046 | "punycode": "^2.1.0" 3047 | } 3048 | }, 3049 | "node_modules/w3c-keyname": { 3050 | "version": "2.2.8", 3051 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 3052 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 3053 | "dev": true, 3054 | "peer": true 3055 | }, 3056 | "node_modules/which": { 3057 | "version": "2.0.2", 3058 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3059 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3060 | "dev": true, 3061 | "dependencies": { 3062 | "isexe": "^2.0.0" 3063 | }, 3064 | "bin": { 3065 | "node-which": "bin/node-which" 3066 | }, 3067 | "engines": { 3068 | "node": ">= 8" 3069 | } 3070 | }, 3071 | "node_modules/wrap-ansi": { 3072 | "version": "7.0.0", 3073 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3074 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3075 | "dev": true, 3076 | "dependencies": { 3077 | "ansi-styles": "^4.0.0", 3078 | "string-width": "^4.1.0", 3079 | "strip-ansi": "^6.0.0" 3080 | }, 3081 | "engines": { 3082 | "node": ">=10" 3083 | }, 3084 | "funding": { 3085 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3086 | } 3087 | }, 3088 | "node_modules/wrappy": { 3089 | "version": "1.0.2", 3090 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3091 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3092 | "dev": true 3093 | }, 3094 | "node_modules/yallist": { 3095 | "version": "4.0.0", 3096 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3097 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3098 | "dev": true 3099 | }, 3100 | "node_modules/yaml": { 3101 | "version": "1.10.2", 3102 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 3103 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 3104 | "dev": true, 3105 | "engines": { 3106 | "node": ">= 6" 3107 | } 3108 | }, 3109 | "node_modules/yocto-queue": { 3110 | "version": "0.1.0", 3111 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3112 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3113 | "dev": true, 3114 | "peer": true, 3115 | "engines": { 3116 | "node": ">=10" 3117 | }, 3118 | "funding": { 3119 | "url": "https://github.com/sponsors/sindresorhus" 3120 | } 3121 | } 3122 | } 3123 | } 3124 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-pkvs", 3 | "version": "1.1.1", 4 | "description": "Provides a persistent key-value store for use in scripts in Obsidian.", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json", 10 | "postinstall": "husky install; npx husky add .husky/pre-commit \"npx lint-staged\"" 11 | }, 12 | "keywords": [], 13 | "author": "Ara Adkins", 14 | "license": "MIT", 15 | "devDependencies": { 16 | "@types/node": "20.10.6", 17 | "@types/serialize-javascript": "^5.0.4", 18 | "@typescript-eslint/eslint-plugin": "6.17.0", 19 | "@typescript-eslint/parser": "6.17.0", 20 | "builtin-modules": "3.3.0", 21 | "esbuild": "0.19.11", 22 | "husky": "^7.0.2", 23 | "lint-staged": "^10.5.3", 24 | "obsidian": "latest", 25 | "prettier": "^3.1.1", 26 | "tslib": "2.6.2", 27 | "typescript": "5.3.3" 28 | }, 29 | "dependencies": { 30 | "eruda": "^3.0.1", 31 | "eruda-benchmark": "^2.0.1", 32 | "eruda-code": "^2.1.0", 33 | "eruda-features": "^2.0.0", 34 | "eruda-geolocation": "^2.0.0", 35 | "eruda-monitor": "^1.0.0", 36 | "eruda-orientation": "^2.0.0", 37 | "eruda-timing": "^2.0.1", 38 | "eruda-touches": "^2.0.0" 39 | }, 40 | "lint-staged": { 41 | "*.md": [ 42 | "prettier --write" 43 | ], 44 | "*.json": [ 45 | "prettier --write" 46 | ], 47 | "*.yaml": [ 48 | "prettier --write" 49 | ], 50 | "*.css": [ 51 | "prettier --write" 52 | ], 53 | "*.js": [ 54 | "prettier --write" 55 | ], 56 | "*.ts": [ 57 | "prettier --write" 58 | ] 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/decs.d.ts: -------------------------------------------------------------------------------- 1 | // Definitions for the Eruda extensions that lack types. 2 | declare module "eruda-benchmark" {} 3 | declare module "eruda-code" {} 4 | declare module "eruda-features" {} 5 | declare module "eruda-geolocation" {} 6 | declare module "eruda-monitor" {} 7 | declare module "eruda-orientation" {} 8 | declare module "eruda-timing" {} 9 | declare module "eruda-touches" {} 10 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import eruda, { Eruda, Tool } from "eruda"; 2 | import { 3 | App, 4 | Platform, 5 | Plugin, 6 | PluginManifest, 7 | PluginSettingTab, 8 | Setting, 9 | Tasks, 10 | ToggleComponent, 11 | } from "obsidian"; 12 | 13 | import { serializeJS } from "./serialize"; 14 | 15 | import erudaBenchmark from "eruda-benchmark"; 16 | import erudaCode from "eruda-code"; 17 | import erudaFeatures from "eruda-features"; 18 | import erudaGeolocation from "eruda-geolocation"; 19 | import erudaMonitor from "eruda-monitor"; 20 | import erudaOrientation from "eruda-orientation"; 21 | import erudaTiming from "eruda-timing"; 22 | import erudaTouches from "eruda-touches"; 23 | 24 | // Ensure that we can register the storage on the window to make it easy to access. 25 | declare global { 26 | interface Window { 27 | pkvs?: PersistentStoreGlobal; 28 | eruda?: Eruda; 29 | } 30 | } 31 | 32 | // The default state of the save every time option. 33 | const DEFAULT_LAZY_PERSISTENCE: boolean = false; 34 | 35 | interface PKVSPluginSettings { 36 | // Persistence-Related Settings 37 | lazyPersistence: boolean; 38 | persistedData: string; 39 | 40 | // Inspector-Related Settings 41 | enableDomTab: boolean; 42 | enableNetworkTab: boolean; 43 | enableResourcesTab: boolean; 44 | enableInfoTab: boolean; 45 | enableSnippetsTab: boolean; 46 | enableSourcesTab: boolean; 47 | enableBenchmarkingToolkit: boolean; 48 | enableCodeTab: boolean; 49 | enableFeaturesTab: boolean; 50 | enableGeolocationTab: boolean; 51 | enableMonitorTab: boolean; 52 | enableOrientationTab: boolean; 53 | enableTimingTab: boolean; 54 | enableTouchesTab: boolean; 55 | } 56 | 57 | const DEFAULT_SETTINGS: PKVSPluginSettings = { 58 | // Persistence-Related Settings 59 | lazyPersistence: DEFAULT_LAZY_PERSISTENCE, 60 | persistedData: "{}", 61 | 62 | // Inspector-Related Settings 63 | enableDomTab: false, 64 | enableInfoTab: false, 65 | enableNetworkTab: false, 66 | enableResourcesTab: false, 67 | enableSnippetsTab: false, 68 | enableSourcesTab: false, 69 | enableBenchmarkingToolkit: false, 70 | enableCodeTab: false, 71 | enableFeaturesTab: false, 72 | enableGeolocationTab: false, 73 | enableMonitorTab: false, 74 | enableOrientationTab: false, 75 | enableTimingTab: false, 76 | enableTouchesTab: false, 77 | }; 78 | 79 | export default class PKVSPlugin extends Plugin { 80 | settings: PKVSPluginSettings; 81 | dataStore: PersistentStore; 82 | storeInterface: PersistentStoreGlobal; 83 | 84 | constructor(app: App, manifest: PluginManifest) { 85 | super(app, manifest); 86 | this.settings = DEFAULT_SETTINGS; 87 | this.dataStore = new PersistentStore(this); 88 | this.storeInterface = new PersistentStoreGlobal(this); 89 | } 90 | 91 | // Functionality that runs when the plugin is loaded, rather than when it is instantiated. 92 | override async onload() { 93 | // Load settings and persisted data. 94 | await this.loadSettings(); 95 | this.dataStore.loadData(); 96 | 97 | // This adds a settings tab so the user can configure various aspects of the plugin. 98 | this.addSettingTab(new PKVSSettingsTab(this.app, this)); 99 | 100 | // Register the persistent store on the window. 101 | window.pkvs = this.storeInterface; 102 | 103 | // Add a command to force saving by the plugin. 104 | this.addCommand({ 105 | id: "persist", 106 | name: "Persist Data", 107 | repeatable: false, 108 | callback: async () => { 109 | const plugin = this; 110 | await plugin.dataStore.storeData(); 111 | }, 112 | }); 113 | 114 | // Add a command to create a new virtual web inspector 115 | this.addCommand({ 116 | id: "inspector:new", 117 | name: "New Virtual Web Inspector", 118 | repeatable: false, 119 | callback: async () => { 120 | const plugin = this; 121 | await plugin.newInspector(); 122 | }, 123 | }); 124 | 125 | this.addCommand({ 126 | id: "inspector:exit", 127 | name: "Exit Virtual Web Inspector", 128 | repeatable: false, 129 | callback: async () => { 130 | const plugin = this; 131 | await plugin.exitInspector(); 132 | }, 133 | }); 134 | 135 | // Make a best effort to save data when quitting Obsidian. 136 | this.registerEvent( 137 | this.app.workspace.on("quit", async (_: Tasks) => { 138 | await this.dataStore.storeData(); 139 | }), 140 | ); 141 | } 142 | 143 | // Things that are done 144 | override async onunload() { 145 | // Force data to be saved 146 | await this.dataStore.storeData(); 147 | 148 | // Remove the global access as well. 149 | delete window.pkvs; 150 | } 151 | 152 | // Loads the plugin's settings from disk. 153 | async loadSettings() { 154 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 155 | } 156 | 157 | // Saves the plugin's settings to disk. 158 | async saveSettings() { 159 | await this.saveData(this.settings); 160 | } 161 | 162 | // Returns `true` if the plugin is set up to persist to disk with every operation, or false 163 | // otherwise. 164 | eagerPersistenceEnabled(): boolean { 165 | return !this.settings.lazyPersistence; 166 | } 167 | 168 | // Creates and opens a new virtual console. 169 | async newInspector(): Promise { 170 | // We always provide the console. 171 | let tools = ["console"]; 172 | 173 | // And then other tabs can be added conditionally. 174 | if (this.settings.enableDomTab) { 175 | tools.push("elements"); 176 | } 177 | if (this.settings.enableInfoTab) { 178 | tools.push("info"); 179 | } 180 | if (this.settings.enableNetworkTab) { 181 | tools.push("network"); 182 | } 183 | if (this.settings.enableResourcesTab) { 184 | tools.push("resources"); 185 | } 186 | if (this.settings.enableSnippetsTab) { 187 | tools.push("snippets"); 188 | } 189 | if (this.settings.enableSourcesTab) { 190 | tools.push("sources"); 191 | } 192 | 193 | // Initialize the inspector itself. 194 | eruda.init({ 195 | tool: tools, 196 | useShadowDom: true, 197 | autoScale: true, 198 | defaults: { 199 | displaySize: 50, 200 | transparency: 0.9, 201 | theme: "Monokai Pro", 202 | }, 203 | }); 204 | 205 | // Add any plugin-based tabs conditionally. 206 | if (this.settings.enableBenchmarkingToolkit) { 207 | eruda.add(erudaBenchmark as Tool); 208 | } 209 | if (this.settings.enableCodeTab) { 210 | eruda.add(erudaCode as Tool); 211 | } 212 | if (this.settings.enableFeaturesTab) { 213 | eruda.add(erudaFeatures as Tool); 214 | } 215 | if (this.settings.enableGeolocationTab) { 216 | eruda.add(erudaGeolocation as Tool); 217 | } 218 | if (this.settings.enableMonitorTab) { 219 | eruda.add(erudaMonitor as Tool); 220 | } 221 | if (this.settings.enableOrientationTab && Platform.isMobile) { 222 | eruda.add(erudaOrientation as Tool); 223 | } 224 | if (this.settings.enableTimingTab) { 225 | eruda.add(erudaTiming as Tool); 226 | } 227 | if (this.settings.enableTouchesTab && Platform.isMobile) { 228 | eruda.add(erudaTouches as Tool); 229 | } 230 | } 231 | 232 | // Exists the virtual console if it exists. 233 | async exitInspector(): Promise { 234 | if (window.eruda) { 235 | eruda.destroy(); 236 | } 237 | } 238 | } 239 | 240 | // The settings tab for the plugin. 241 | class PKVSSettingsTab extends PluginSettingTab { 242 | plugin: PKVSPlugin; 243 | 244 | constructor(app: App, plugin: PKVSPlugin) { 245 | super(app, plugin); 246 | this.plugin = plugin; 247 | } 248 | 249 | display(): void { 250 | const { containerEl } = this; 251 | containerEl.empty(); 252 | 253 | this.containerEl.createEl("h3", { text: "Peristence Settings" }); 254 | this.containerEl.createEl("p", { 255 | text: "These settings deal with how data in the in-memory store is persisted to disk. Please read the plugin documentation before changing these", 256 | }); 257 | 258 | this._createToggle( 259 | "lazyPersistence", 260 | "Lazy Persistence", 261 | "Changes will be persisted to disk at app close on a best effort basis. Enabling lazy persistence may result in data loss unless you manually persist data as needed. Lazy persistence is likely faster if you are performing lots of reads and writes of large amounts of data.", 262 | ); 263 | 264 | this.containerEl.createEl("h3", { text: "Web Inspector Settings" }); 265 | this.containerEl.createEl("p", { 266 | text: "As sometimes you just want to be able to write JavaScript to interact with the persistent data store, this plugin includes a virtual web inspector. These settings allow you to enable and disable modules in the virtual web inspector.", 267 | }); 268 | this.containerEl.createEl("p", { 269 | text: "Note that changing these will not take effect until you kill and restart the inspector.", 270 | }); 271 | 272 | this._createToggle( 273 | "enableDomTab", 274 | "Enable DOM Tab", 275 | "Lets you view the DOM and select items by tapping on them.", 276 | ); 277 | this._createToggle( 278 | "enableInfoTab", 279 | "Enable Info Tab", 280 | "Allows displaying arbitrary user-created information. By default displays page URL and User Agent.", 281 | ); 282 | this._createToggle( 283 | "enableNetworkTab", 284 | "Enable Network Tab", 285 | "Shows the status of network requests.", 286 | ); 287 | this._createToggle( 288 | "enableResourcesTab", 289 | "Enable Resources Tab", 290 | "Shows information on data in local storage and cookies.", 291 | ); 292 | this._createToggle( 293 | "enableSnippetsTab", 294 | "Enable Snippets Tab", 295 | "Includes useful snippets for interacting with and inspecting the DOM.", 296 | ); 297 | this._createToggle( 298 | "enableSourcesTab", 299 | "Enable Sources Tab", 300 | "A viewer for the HTML, CSS and JavaScript sources of the page.", 301 | ); 302 | this._createToggle( 303 | "enableBenchmarkingToolkit", 304 | "Enable Benchmarking Tools", 305 | "Enables the Eruda Benchmark library for running local benchmarks.", 306 | ); 307 | this._createToggle( 308 | "enableCodeTab", 309 | "Enable Code Tab", 310 | "A code editor for JavaScript which can run it directly in the inspector.", 311 | ); 312 | this._createToggle( 313 | "enableFeaturesTab", 314 | "Enable Feature-Detection Tab", 315 | "Feature detection for the current platform.", 316 | ); 317 | this._createToggle( 318 | "enableGeolocationTab", 319 | "Enable Geolocation Tab", 320 | "A utility tab for testing geolocation features.", 321 | ); 322 | this._createToggle( 323 | "enableMonitorTab", 324 | "Enable Monitoring Tab", 325 | "A graph of rendering frame-rate and JS heap usage.", 326 | ); 327 | this._createToggle( 328 | "enableOrientationTab", 329 | "Enable Orientation Tab", 330 | "A utility tab for testing device orientation features. Disabled on desktop.", 331 | ); 332 | this._createToggle("enableTimingTab", "Enable Timing Tab", "Performance and resource timing."); 333 | this._createToggle( 334 | "enableTouchesTab", 335 | "Enable Touches Tab", 336 | "A utility tab for displaying touches onscreen. Disabled on desktop.", 337 | ); 338 | } 339 | 340 | /** Creates a toggle setting. 341 | * 342 | * @param settingsProperty The name of the property in `InobsidianSettings` 343 | * that this setting is associated with. 344 | * @param name The name of the setting to be shown to the user. 345 | * @param description A description of the setting that will be shown to the 346 | * user. 347 | */ 348 | _createToggle>( 349 | settingsProperty: Key, 350 | name: string | DocumentFragment, 351 | description: string | DocumentFragment, 352 | ): void { 353 | new Setting(this.containerEl) 354 | .setName(name) 355 | .setDesc(description) 356 | .addToggle((component: ToggleComponent) => { 357 | return component 358 | .setValue(this.plugin.settings[settingsProperty]) 359 | .onChange((newValue: PKVSPluginSettings[Key]) => { 360 | this.plugin.settings[settingsProperty] = newValue; 361 | this.plugin.saveSettings(); 362 | }); 363 | }); 364 | } 365 | } 366 | 367 | // The persistent data store itself. It is not intended to be exposed to users. 368 | class PersistentStore { 369 | plugin: PKVSPlugin; 370 | data: { [key: PropertyKey]: any }; 371 | 372 | constructor(plugin: PKVSPlugin) { 373 | this.plugin = plugin; 374 | this.data = this.loadFromString(this.plugin.settings.persistedData); 375 | } 376 | 377 | loadFromString(data: string): { [key: PropertyKey]: any } { 378 | const indirectEval = eval; 379 | return indirectEval(`(${data})`); 380 | } 381 | 382 | storeToString(): string { 383 | return serializeJS(this.data); 384 | } 385 | 386 | async loadData(): Promise { 387 | await this.plugin.loadSettings(); 388 | this.data = this.loadFromString(this.plugin.settings.persistedData); 389 | } 390 | 391 | async storeData(): Promise { 392 | this.plugin.settings.persistedData = this.storeToString(); 393 | await this.plugin.saveSettings(); 394 | } 395 | 396 | async existsMember(key: PropertyKey): Promise { 397 | return this.data.hasOwnProperty(key); 398 | } 399 | 400 | async deleteMember(key: PropertyKey): Promise { 401 | const oldValue = this.data[key]; 402 | delete this.data[key]; 403 | return oldValue; 404 | } 405 | 406 | async storeMember(key: PropertyKey, value: any): Promise { 407 | const oldValue = this.data[key]; 408 | this.data[key] = value; 409 | return oldValue; 410 | } 411 | 412 | async loadMember(key: PropertyKey): Promise { 413 | return this.data[key]; 414 | } 415 | } 416 | 417 | // The user-facing interface to the persistent key-value store. 418 | class PersistentStoreGlobal { 419 | private plugin: PKVSPlugin; 420 | private dataStore: PersistentStore; 421 | private lazyPersistenceOverride: boolean | undefined; 422 | 423 | constructor(plugin: PKVSPlugin) { 424 | this.plugin = plugin; 425 | this.dataStore = this.plugin.dataStore; 426 | this.lazyPersistenceOverride = undefined; 427 | } 428 | 429 | // Persists data to disk if eager persistence is enabled. 430 | private async persistIfEnabled(): Promise { 431 | if (!this.lazyPersistenceOverride) { 432 | if (this.plugin.eagerPersistenceEnabled()) { 433 | await this.dataStore.storeData(); 434 | } 435 | } 436 | } 437 | 438 | // Loads the value at `key` in the persistent data, returning the value if it exists or 439 | // `undefined` otherwise. 440 | async load(key: PropertyKey): Promise { 441 | return await this.dataStore.loadMember(key); 442 | } 443 | 444 | // Stores the provided `value` at the provided `key` in the data store, returning the previous 445 | // value at that `key` if it was previously written, or `undefined` otherwise. 446 | // 447 | // If eager persistence is on, this will write the changes to disk before returning. 448 | async store(key: PropertyKey, value: any): Promise { 449 | const previousValue = await this.dataStore.storeMember(key, value); 450 | await this.persistIfEnabled(); 451 | return previousValue; 452 | } 453 | 454 | // Deletes any value at the provided `key`, returning the previous value if `key` was previously 455 | // written, or `undefined` otherwise. 456 | // 457 | // If eager persistence is on, this will write the changes to disk before returning. 458 | async delete(key: PropertyKey): Promise { 459 | const previousValue = await this.dataStore.deleteMember(key); 460 | await this.persistIfEnabled(); 461 | return previousValue; 462 | } 463 | 464 | // Returns `true` if `key` exists in the data store, or `false` otherwise. 465 | async exists(key: PropertyKey): Promise { 466 | return await this.dataStore.existsMember(key); 467 | } 468 | 469 | // Forces any in-memory changes to the data store to be written to disk. Once it has returned, the 470 | // on-disk state and in-memory state are guaranteed to be the same. 471 | async persist(): Promise { 472 | await this.dataStore.storeData(); 473 | } 474 | 475 | // Sets the store to use lazy persistence regardless of the option in settings. 476 | setLazyPersistance(): void { 477 | this.lazyPersistenceOverride = true; 478 | } 479 | 480 | // Sets the store to use eager persistence regardless of the option in settings. 481 | setEagerPersistence(): void { 482 | this.lazyPersistenceOverride = false; 483 | } 484 | 485 | // Sets the store to persist as specified by the option in settings. 486 | disablePersistenceOverride(): void { 487 | this.lazyPersistenceOverride = undefined; 488 | } 489 | } 490 | 491 | // Type-Level Functions ======================================================= 492 | 493 | /** Produces the set of keys of type `boolean` in the provided `Type`. 494 | * 495 | * @param Type the type to get the keys from 496 | */ 497 | type BooleanPropsOf = keyof { 498 | // We filter things from a mapped type by producing `never`. 499 | [K in keyof Type as Type[K] extends boolean ? K : never]: K; 500 | }; 501 | -------------------------------------------------------------------------------- /src/serialize.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2014, Yahoo! Inc. All rights reserved. 3 | Copyrights licensed under the New BSD License. 4 | See the accompanying LICENSE file for terms. 5 | 6 | Modified by @iamrecursion (Ara Adkins) to not depend on random-bytes. 7 | */ 8 | 9 | "use strict"; 10 | 11 | // Generate an internal UID to make the regexp pattern harder to guess. 12 | var UID_LENGTH = 16; 13 | var UID = generateUID(); 14 | var PLACE_HOLDER_REGEXP = new RegExp( 15 | '(\\\\)?"@__(F|R|D|M|S|A|U|I|B|L)-' + UID + '-(\\d+)__@"', 16 | "g", 17 | ); 18 | 19 | var IS_NATIVE_CODE_REGEXP = /\{\s*\[native code\]\s*\}/g; 20 | var IS_PURE_FUNCTION = /function.*?\(/; 21 | var IS_ARROW_FUNCTION = /.*?=>.*?/; 22 | var UNSAFE_CHARS_REGEXP = /[<>\/\u2028\u2029]/g; 23 | 24 | var RESERVED_SYMBOLS = ["*", "async"]; 25 | 26 | // Mapping of unsafe HTML and invalid JavaScript line terminator chars to their 27 | // Unicode char counterparts which are safe to use in JavaScript strings. 28 | var ESCAPED_CHARS: StringIndexable = { 29 | "<": "\\u003C", 30 | ">": "\\u003E", 31 | "/": "\\u002F", 32 | "\u2028": "\\u2028", 33 | "\u2029": "\\u2029", 34 | }; 35 | 36 | function escapeUnsafeChars(unsafeChar: string): string { 37 | return ESCAPED_CHARS[unsafeChar]; 38 | } 39 | 40 | function generateUID() { 41 | var bytes: Uint8Array = new Uint8Array(UID_LENGTH); 42 | crypto.getRandomValues(bytes); 43 | var result = ""; 44 | for (var i = 0; i < UID_LENGTH; ++i) { 45 | const index = bytes[i]; 46 | if (index !== undefined) { 47 | result += index.toString(16); 48 | } 49 | } 50 | return result; 51 | } 52 | 53 | interface StringIndexable { 54 | [index: string]: any; 55 | } 56 | 57 | interface SerializeJSOptions { 58 | /** 59 | * This option is the same as the space argument that can be passed to JSON.stringify. 60 | * It can be used to add whitespace and indentation to the serialized output to make it more readable. 61 | */ 62 | space?: string | number | undefined; 63 | /** 64 | * This option is a signal to serialize() that the object being serialized does not contain any function or regexps values. 65 | * This enables a hot-path that allows serialization to be over 3x faster. 66 | * If you're serializing a lot of data, and know its pure JSON, then you can enable this option for a speed-up. 67 | */ 68 | isJSON?: boolean | undefined; 69 | /** 70 | * This option is to signal serialize() that we want to do a straight conversion, without the XSS protection. 71 | * This options needs to be explicitly set to true. HTML characters and JavaScript line terminators will not be escaped. 72 | * You will have to roll your own. 73 | */ 74 | unsafe?: true | undefined; 75 | /** 76 | * This option is to signal serialize() that we do not want serialize JavaScript function. 77 | * Just treat function like JSON.stringify do, but other features will work as expected. 78 | */ 79 | ignoreFunction?: boolean | undefined; 80 | } 81 | 82 | function deleteFunctions(obj: StringIndexable) { 83 | var functionKeys: string[] = []; 84 | for (var key in obj) { 85 | if (typeof obj[key] === "function") { 86 | functionKeys.push(key); 87 | } 88 | } 89 | for (var i = 0; i < functionKeys.length; i++) { 90 | const key: string | undefined = functionKeys[i]; 91 | 92 | if (key) { 93 | delete obj[key]; 94 | } 95 | } 96 | } 97 | 98 | function serializeJS(obj: any, options?: SerializeJSOptions): string { 99 | options || (options = {}); 100 | 101 | // Backwards-compatibility for `space` as the second argument. 102 | if (typeof options === "number" || typeof options === "string") { 103 | options = { space: options }; 104 | } 105 | 106 | var functions: any[] = []; 107 | var regexps: any[] = []; 108 | var dates: any[] = []; 109 | var maps: any[] = []; 110 | var sets: any[] = []; 111 | var arrays: any[] = []; 112 | var undefs: any[] = []; 113 | var infinities: any[] = []; 114 | var bigInts: any[] = []; 115 | var urls: any[] = []; 116 | 117 | // Returns placeholders for functions and regexps (identified by index) 118 | // which are later replaced by their string representation. 119 | function replacer(this: StringIndexable, key: string, value: any) { 120 | // For nested function 121 | if (options !== undefined && options.ignoreFunction) { 122 | deleteFunctions(value); 123 | } 124 | 125 | if (!value && value !== undefined && value !== BigInt(0)) { 126 | return value; 127 | } 128 | 129 | // If the value is an object w/ a toJSON method, toJSON is called before 130 | // the replacer runs, so we use this[key] to get the non-toJSONed value. 131 | var origValue = this[key]; 132 | var type = typeof origValue; 133 | 134 | if (type === "object") { 135 | if (origValue instanceof RegExp) { 136 | return "@__R-" + UID + "-" + (regexps.push(origValue) - 1) + "__@"; 137 | } 138 | 139 | if (origValue instanceof Date) { 140 | return "@__D-" + UID + "-" + (dates.push(origValue) - 1) + "__@"; 141 | } 142 | 143 | if (origValue instanceof Map) { 144 | return "@__M-" + UID + "-" + (maps.push(origValue) - 1) + "__@"; 145 | } 146 | 147 | if (origValue instanceof Set) { 148 | return "@__S-" + UID + "-" + (sets.push(origValue) - 1) + "__@"; 149 | } 150 | 151 | if (origValue instanceof Array) { 152 | var isSparse = 153 | origValue.filter(function () { 154 | return true; 155 | }).length !== origValue.length; 156 | if (isSparse) { 157 | return "@__A-" + UID + "-" + (arrays.push(origValue) - 1) + "__@"; 158 | } 159 | } 160 | 161 | if (origValue instanceof URL) { 162 | return "@__L-" + UID + "-" + (urls.push(origValue) - 1) + "__@"; 163 | } 164 | } 165 | 166 | if (type === "function") { 167 | return "@__F-" + UID + "-" + (functions.push(origValue) - 1) + "__@"; 168 | } 169 | 170 | if (type === "undefined") { 171 | return "@__U-" + UID + "-" + (undefs.push(origValue) - 1) + "__@"; 172 | } 173 | 174 | if (type === "number" && !isNaN(origValue) && !isFinite(origValue)) { 175 | return "@__I-" + UID + "-" + (infinities.push(origValue) - 1) + "__@"; 176 | } 177 | 178 | if (type === "bigint") { 179 | return "@__B-" + UID + "-" + (bigInts.push(origValue) - 1) + "__@"; 180 | } 181 | 182 | return value; 183 | } 184 | 185 | function serializeFunc(fn: Function) { 186 | var serializedFn = fn.toString(); 187 | if (IS_NATIVE_CODE_REGEXP.test(serializedFn)) { 188 | throw new TypeError("Serializing native function: " + fn.name); 189 | } 190 | 191 | // pure functions, example: {key: function() {}} 192 | if (IS_PURE_FUNCTION.test(serializedFn)) { 193 | return serializedFn; 194 | } 195 | 196 | // arrow functions, example: arg1 => arg1+5 197 | if (IS_ARROW_FUNCTION.test(serializedFn)) { 198 | return serializedFn; 199 | } 200 | 201 | var argsStartsAt = serializedFn.indexOf("("); 202 | var def = serializedFn 203 | .substr(0, argsStartsAt) 204 | .trim() 205 | .split(" ") 206 | .filter(function (val) { 207 | return val.length > 0; 208 | }); 209 | 210 | var nonReservedSymbols = def.filter(function (val) { 211 | return RESERVED_SYMBOLS.indexOf(val) === -1; 212 | }); 213 | 214 | // enhanced literal objects, example: {key() {}} 215 | if (nonReservedSymbols.length > 0) { 216 | return ( 217 | (def.indexOf("async") > -1 ? "async " : "") + 218 | "function" + 219 | (def.join("").indexOf("*") > -1 ? "*" : "") + 220 | serializedFn.substr(argsStartsAt) 221 | ); 222 | } 223 | 224 | // arrow functions 225 | return serializedFn; 226 | } 227 | 228 | // Check if the parameter is function 229 | if (options.ignoreFunction && typeof obj === "function") { 230 | obj = undefined; 231 | } 232 | // Protects against `JSON.stringify()` returning `undefined`, by serializing 233 | // to the literal string: "undefined". 234 | if (obj === undefined) { 235 | return String(obj); 236 | } 237 | 238 | var str; 239 | 240 | // Creates a JSON string representation of the value. 241 | // NOTE: Node 0.12 goes into slow mode with extra JSON.stringify() args. 242 | if (options.isJSON && !options.space) { 243 | str = JSON.stringify(obj); 244 | } else { 245 | str = JSON.stringify(obj, options.isJSON ? undefined : replacer, options.space); 246 | } 247 | 248 | // Protects against `JSON.stringify()` returning `undefined`, by serializing 249 | // to the literal string: "undefined". 250 | if (typeof str !== "string") { 251 | return String(str); 252 | } 253 | 254 | // Replace unsafe HTML and invalid JavaScript line terminator chars with 255 | // their safe Unicode char counterpart. This _must_ happen before the 256 | // regexps and functions are serialized and added back to the string. 257 | if (options.unsafe !== true) { 258 | str = str.replace(UNSAFE_CHARS_REGEXP, escapeUnsafeChars); 259 | } 260 | 261 | if ( 262 | functions.length === 0 && 263 | regexps.length === 0 && 264 | dates.length === 0 && 265 | maps.length === 0 && 266 | sets.length === 0 && 267 | arrays.length === 0 && 268 | undefs.length === 0 && 269 | infinities.length === 0 && 270 | bigInts.length === 0 && 271 | urls.length === 0 272 | ) { 273 | return str; 274 | } 275 | 276 | // Replaces all occurrences of function, regexp, date, map and set placeholders in the 277 | // JSON string with their string representations. If the original value can 278 | // not be found, then `undefined` is used. 279 | return str.replace(PLACE_HOLDER_REGEXP, function (match, backSlash, type, valueIndex) { 280 | // The placeholder may not be preceded by a backslash. This is to prevent 281 | // replacing things like `"a\"@__R--0__@"` and thus outputting 282 | // invalid JS. 283 | if (backSlash) { 284 | return match; 285 | } 286 | 287 | if (type === "D") { 288 | return 'new Date("' + dates[valueIndex].toISOString() + '")'; 289 | } 290 | 291 | if (type === "R") { 292 | return ( 293 | "new RegExp(" + 294 | serializeJS(regexps[valueIndex].source) + 295 | ', "' + 296 | regexps[valueIndex].flags + 297 | '")' 298 | ); 299 | } 300 | 301 | if (type === "M") { 302 | return "new Map(" + serializeJS(Array.from(maps[valueIndex].entries()), options) + ")"; 303 | } 304 | 305 | if (type === "S") { 306 | return "new Set(" + serializeJS(Array.from(sets[valueIndex].values()), options) + ")"; 307 | } 308 | 309 | if (type === "A") { 310 | return ( 311 | "Array.prototype.slice.call(" + 312 | serializeJS( 313 | Object.assign({ length: arrays[valueIndex].length }, arrays[valueIndex]), 314 | options, 315 | ) + 316 | ")" 317 | ); 318 | } 319 | 320 | if (type === "U") { 321 | return "undefined"; 322 | } 323 | 324 | if (type === "I") { 325 | return infinities[valueIndex]; 326 | } 327 | 328 | if (type === "B") { 329 | return 'BigInt("' + bigInts[valueIndex] + '")'; 330 | } 331 | 332 | if (type === "L") { 333 | return "new URL(" + serializeJS(urls[valueIndex].toString(), options) + ")"; 334 | } 335 | 336 | var fn = functions[valueIndex]; 337 | 338 | return serializeFunc(fn); 339 | }); 340 | } 341 | 342 | export { serializeJS, SerializeJSOptions }; 343 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "esModuleInterop": true, 4 | "allowUnreachableCode": false, 5 | "allowUnusedLabels": false, 6 | "alwaysStrict": true, 7 | "baseUrl": ".", 8 | "checkJs": true, 9 | "emitDecoratorMetadata": true, 10 | "exactOptionalPropertyTypes": true, 11 | "experimentalDecorators": true, 12 | "inlineSourceMap": true, 13 | "inlineSources": true, 14 | "module": "ES2022", 15 | "moduleResolution": "node", 16 | "noFallthroughCasesInSwitch": true, 17 | "noImplicitAny": true, 18 | "noImplicitOverride": true, 19 | "noImplicitReturns": true, 20 | "noImplicitThis": true, 21 | "noPropertyAccessFromIndexSignature": true, 22 | "noUncheckedIndexedAccess": true, 23 | "noUnusedLocals": true, 24 | "noUnusedParameters": true, 25 | "strict": true, 26 | "useUnknownInCatchVariables": true 27 | }, 28 | "include": ["src/**.ts"] 29 | } 30 | -------------------------------------------------------------------------------- /version-bump.mjs: -------------------------------------------------------------------------------- 1 | import { readFileSync, writeFileSync } from "fs"; 2 | 3 | const targetVersion = process.env.npm_package_version; 4 | 5 | // read minAppVersion from manifest.json and bump version to target version 6 | let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); 7 | const { minAppVersion } = manifest; 8 | manifest.version = targetVersion; 9 | writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); 10 | 11 | // update versions.json with target version and minAppVersion from manifest.json 12 | let versions = JSON.parse(readFileSync("versions.json", "utf8")); 13 | versions[targetVersion] = minAppVersion; 14 | writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); 15 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.0": "1.5.1", 3 | "1.0.1": "1.5.1", 4 | "1.0.2": "1.5.1", 5 | "1.0.3": "1.5.1", 6 | "1.1.0": "1.5.12", 7 | "1.1.1": "1.5.12" 8 | } 9 | --------------------------------------------------------------------------------