├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github └── workflows │ └── release.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── examples ├── js-module │ ├── README.md │ └── module.js ├── js-plugin │ ├── README.md │ └── plugin.js ├── js-snippet │ ├── README.md │ └── snippet.js └── ts-plugin │ ├── .editorconfig │ ├── .eslintignore │ ├── .eslintrc │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── esbuild.config.mjs │ ├── main.ts │ ├── manifest.json │ ├── package.json │ ├── styles.css │ └── tsconfig.json ├── manifest.json ├── package-lock.json ├── package.json ├── src ├── helpers │ ├── Helpers.ts │ └── Suggester.ts ├── loaders │ ├── cjsModuleLoader.ts │ └── loader.ts ├── main.ts └── settings │ ├── Settings.ts │ ├── suggesters │ ├── FolderSuggester.ts │ └── suggest.ts │ └── utils │ ├── Error.ts │ └── Utils.ts ├── styles.css ├── 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 = 4 10 | tab_width = 4 11 | 12 | 13 | [*.js] 14 | max_line_length = 120 15 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | npm node_modules 2 | build 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 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Plugin release 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: denolib/setup-deno@v2 14 | with: 15 | deno-version: v1.x 16 | - name: npm build 17 | run: | 18 | npm install 19 | npm run build --if-present 20 | - name: Create Release 21 | # https://github.com/ncipollo/release-action 22 | uses: ncipollo/release-action@v1.7.3 23 | with: 24 | artifacts: "main.js,manifest.json,styles.css" 25 | token: ${{ secrets.GITHUB_TOKEN }} 26 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022 Michał Nowotnik 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Obsidian User Plugins 2 | 3 | Lets you use the Obsidian plugin API in your snippets or JavaScript files to modify the behavior of Obsidian, just as if you created a plugin, but without the hassle. 4 | 5 | # Stop and read 6 | 7 | > :warning: **This plugin is for advanced users only**: DO NOT use code in scripts you do not fully understand. 8 | > It can delete your notes or worse. See [legal notice](#Notice). 9 | 10 | # Caveats 11 | 12 | ## Obsidian API compatibility 13 | 14 | > :warning: Do not assume user scripts can run any Obsidian API functions other 15 | > than what is shown in the examples. Creating settings is especially not supported, but it is on the [roadmap](#roadmap). 16 | 17 | ## Versioning 18 | 19 | Newer versions of this plugin will usually require the newest Obsidian version due to its API changes. Consider this plugin "bleeding edge" for now. 20 | 21 | # Use cases 22 | 23 | - [Adding custom commands](https://docs.obsidian.md/Reference/TypeScript+API/Command) 24 | - Testing an idea for a plugin 25 | - Using Obsidian plugin API to do anything you want 26 | 27 | # Motivating example 28 | 29 | Add command `Create new note in folder` that allows you to choose a folder 30 | before creating a note: 31 | 32 | ```javascript 33 | module.exports = { 34 | async onload(plugin) { 35 | plugin.addCommand({ 36 | id: "new-note-in-folder", 37 | name: "Create new note in a folder", 38 | callback: async () => { 39 | const api = plugin.api; 40 | const folders = api.getAllFolders(); 41 | const folder = await api.suggest(folders, folders); 42 | const createdNote = await plugin.app.vault.create(folder + "/Hello World.md", "Hello World!"); 43 | api.openFile(createdNote); 44 | }, 45 | }); 46 | }, 47 | async onunload() { 48 | // optional 49 | console.log("unloading plugin"); 50 | }, 51 | }; 52 | 53 | ``` 54 | 55 | ![Command in palette](https://user-images.githubusercontent.com/8244123/167032593-0dbe59b1-2c2a-4700-83f4-01609cf0d30a.png) 56 | 57 | # Quick start 58 | 59 | ## Installation 60 | 61 | You can easily add this plugin from Community Plugins panel. 62 | Alternatively, here's a manual way: 63 | 64 | Clone this repository into the `/.obsidian/plugins` folder and then execute: 65 | 66 | ```bash 67 | npm install 68 | npm run build 69 | ``` 70 | 71 | ## Usage 72 | 73 | You can add scripts either by manually adding snippets or enabling each individual file in the defined scripts directory in your vault. 74 | 75 | To use scripts, specify a scripts folder in settings, hit the reload button to search for scripts in the specified path, 76 | then enable each script found using a toggle button. 77 | 78 | There are a few types of scripts that you can use. 79 | 80 | ### Obsidian plugin type 81 | 82 | Has the basic structure of an Obsidian plugin: 83 | 84 | ```typescript 85 | import { Plugin } from "obsidian"; 86 | 87 | export default class MyPlugin extends Plugin { 88 | async onload() { 89 | // code here 90 | } 91 | } 92 | ``` 93 | Written in either [Typescript](./examples/ts-plugin/main.ts) or [Javascript](./examples/js-plugin/plugin.js) flavour. 94 | 95 | You have access to [Helper API](#helper-api) by getting `obsidian-user-plugins` via `this.app.plugins.getPlugin`. 96 | 97 | ### Module type 98 | 99 | A JavaScript module that exports at least an `async onload(plugin): void` method and 100 | optionally an `async onnunload(): void` method. It has access to the global function 101 | `require` to get the `obsidian` module. 102 | The `plugin` parameter is an instance of `obsidian-user-plugins` with the [Helper API](#helper-api). 103 | 104 | See [example](./examples/js-module/module.js). 105 | 106 | ### Snippet 107 | 108 | A snippet is a JavaScript block of code that has access to the global `plugin` 109 | variable. It also has access to the global function `require` to get the `obsidian` 110 | module. Snippets are executed during the plugin initialization phase in `onload()`. 111 | You can also access [Helper API](#helper-api) via the `plugin.api` object. 112 | 113 | See [example](./examples/js-snippet/snippet.js). 114 | 115 | # Helper API 116 | 117 | This plugin exposes an `api` object with handy methods. Check them out [here](./src/helpers/Helpers.ts). 118 | 119 | # Roadmap 120 | 121 | - [ ] Custom configuration per script file 122 | - [ ] Additional functions in the [Helper API](#helper-api) 123 | 124 | # Obsidian Plugin API 125 | 126 | The Obsidian plugin API is declared [here](https://github.com/obsidianmd/obsidian-api/blob/master/obsidian.d.ts). 127 | 128 | The [Obsidian Developer platform](https://docs.obsidian.md/Reference/TypeScript+API/) contains extensive documentation for the various plugin methods and interfaces, e.g. for the [Command](https://docs.obsidian.md/Reference/TypeScript+API/Command) interface or the [Plugin](https://docs.obsidian.md/Reference/TypeScript+API/Plugin) class. 129 | 130 | # Notice 131 | 132 | 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. 133 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from "builtin-modules"; 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 | if you want to view the source, please visit the github repository of this plugin 9 | */ 10 | `; 11 | 12 | const prod = (process.argv[2] === "production"); 13 | 14 | const context = await esbuild.context({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ["src/main.ts"], 19 | bundle: true, 20 | external: [ 21 | "obsidian", 22 | "electron", 23 | "@codemirror/autocomplete", 24 | "@codemirror/collab", 25 | "@codemirror/commands", 26 | "@codemirror/language", 27 | "@codemirror/lint", 28 | "@codemirror/search", 29 | "@codemirror/state", 30 | "@codemirror/view", 31 | "@lezer/common", 32 | "@lezer/highlight", 33 | "@lezer/lr", 34 | ...builtins], 35 | format: "cjs", 36 | target: "es2018", 37 | logLevel: "info", 38 | sourcemap: prod ? false : "inline", 39 | treeShaking: true, 40 | outfile: "main.js", 41 | minify: prod, 42 | }); 43 | 44 | if (prod) { 45 | await context.rebuild(); 46 | process.exit(0); 47 | } else { 48 | await context.watch(); 49 | } 50 | -------------------------------------------------------------------------------- /examples/js-module/README.md: -------------------------------------------------------------------------------- 1 | # Sample JS module 2 | 3 | Put it in the directory set in Obsidian User Plugins configuration. Should appear on the list of available scripts. 4 | -------------------------------------------------------------------------------- /examples/js-module/module.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | async onload(plugin) { 3 | plugin.addCommand({ 4 | id: "new-note-in-folder", 5 | name: "Create new note in a folder", 6 | callback: async () => { 7 | const api = plugin.api; 8 | const folders = api.getAllFolders(); 9 | const folder = await api.suggest(folders, folders); 10 | const createdNote = await plugin.app.vault.create(folder + "/Hello World.md", "Hello World!"); 11 | api.openFile(createdNote); 12 | }, 13 | }); 14 | }, 15 | async onunload() { 16 | // optional 17 | console.log("unloading plugin"); 18 | }, 19 | }; 20 | -------------------------------------------------------------------------------- /examples/js-plugin/README.md: -------------------------------------------------------------------------------- 1 | # Sample JS plugin 2 | 3 | Put it in the directory set in Obsidian User Plugins configuration. Should appear on the list of available scripts. 4 | -------------------------------------------------------------------------------- /examples/js-plugin/plugin.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | const Plugin = require('obsidian').Plugin; 3 | module.exports.default = class MyPlugin extends Plugin { 4 | async onload() { 5 | this.addCommand({ 6 | id: "new-note-in-folder", 7 | name: "Create new note in a folder", 8 | callback: async () => { 9 | const api = this.app.plugins.getPlugin("obsidian-user-plugins").api; 10 | const folders = api.getAllFolders(); 11 | const folder = await api.suggest(folders, folders); 12 | const createdNote = await this.app.vault.create(folder + "/Hello World.md", "Hello World!"); 13 | api.openFile(createdNote); 14 | }, 15 | }); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /examples/js-snippet/README.md: -------------------------------------------------------------------------------- 1 | # Sample JS snippet 2 | 3 | Paste it as one of the snippets in Obsidian User Plugins configuration. 4 | -------------------------------------------------------------------------------- /examples/js-snippet/snippet.js: -------------------------------------------------------------------------------- 1 | plugin.addCommand({ 2 | id: "new-note-in-folder", 3 | name: "Create new note in a folder", 4 | callback: async () => { 5 | const folders = plugin.api.getAllFolders(); 6 | const folder = await plugin.api.suggest(folders, folders); 7 | const createdNote = await plugin.app.vault.create(folder + "/Hello World.md", "Hello World!"); 8 | plugin.api.openFile(createdNote); 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /examples/ts-plugin/.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 = tab 9 | indent_size = 2 10 | tab_width = 2 11 | -------------------------------------------------------------------------------- /examples/ts-plugin/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | main.js 4 | -------------------------------------------------------------------------------- /examples/ts-plugin/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "env": { "node": true }, 5 | "plugins": [ 6 | "@typescript-eslint" 7 | ], 8 | "extends": [ 9 | "eslint:recommended", 10 | "plugin:@typescript-eslint/eslint-recommended", 11 | "plugin:@typescript-eslint/recommended" 12 | ], 13 | "parserOptions": { 14 | "sourceType": "module" 15 | }, 16 | "rules": { 17 | "no-unused-vars": "off", 18 | "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], 19 | "@typescript-eslint/ban-ts-comment": "off", 20 | "no-prototype-builtins": "off", 21 | "@typescript-eslint/no-empty-function": "off" 22 | } 23 | } -------------------------------------------------------------------------------- /examples/ts-plugin/.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 | -------------------------------------------------------------------------------- /examples/ts-plugin/.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /examples/ts-plugin/README.md: -------------------------------------------------------------------------------- 1 | # Sample Plugin 2 | 3 | This is just cloned [Obsidian sample plugin](https://github.com/obsidianmd/obsidian-sample-plugin) with [main.ts](./main.ts) modified. 4 | 5 | Compile it with 6 | 7 | ```bash 8 | npm install 9 | npm run build 10 | ``` 11 | 12 | and set the directory in Obsidian User Plugins. 13 | The file `main.js` should appear on the list of available scripts. 14 | Change `esbuild.config.mjs` to modify the name of the output file `main.js`. 15 | -------------------------------------------------------------------------------- /examples/ts-plugin/esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from "builtin-modules"; 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 | if you want to view the source, please visit the github repository of this plugin 9 | */ 10 | `; 11 | 12 | const prod = (process.argv[2] === "production"); 13 | 14 | const context = await esbuild.context({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ["main.ts"], 19 | bundle: true, 20 | external: [ 21 | "obsidian", 22 | "electron", 23 | "@codemirror/autocomplete", 24 | "@codemirror/collab", 25 | "@codemirror/commands", 26 | "@codemirror/language", 27 | "@codemirror/lint", 28 | "@codemirror/search", 29 | "@codemirror/state", 30 | "@codemirror/view", 31 | "@lezer/common", 32 | "@lezer/highlight", 33 | "@lezer/lr", 34 | ...builtins], 35 | format: "cjs", 36 | target: "es2018", 37 | logLevel: "info", 38 | sourcemap: prod ? false : "inline", 39 | treeShaking: true, 40 | outfile: "main.js", 41 | minify: prod, 42 | }); 43 | 44 | if (prod) { 45 | await context.rebuild(); 46 | process.exit(0); 47 | } else { 48 | await context.watch(); 49 | } 50 | -------------------------------------------------------------------------------- /examples/ts-plugin/main.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from "obsidian"; 2 | 3 | export default class MyPlugin extends Plugin { 4 | async onload() { 5 | this.addCommand({ 6 | id: "new-note-in-folder", 7 | name: "Create new note in a folder", 8 | callback: async () => { 9 | const api = (this.app as any).plugins.getPlugin( 10 | "obsidian-user-plugins" 11 | ).api; 12 | const folders = api.getAllFolders(); 13 | const folder = await api.suggest(folders, folders); 14 | const createdNote = await this.app.vault.create( 15 | folder + "/Hello World.md", 16 | "Hello World!" 17 | ); 18 | api.openFile(createdNote); 19 | }, 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/ts-plugin/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "sample-plugin", 3 | "name": "Sample Plugin", 4 | "version": "1.0.0", 5 | "minAppVersion": "0.15.0", 6 | "description": "Demonstrates some of the capabilities of the Obsidian API.", 7 | "author": "Obsidian", 8 | "authorUrl": "https://obsidian.md", 9 | "fundingUrl": "https://obsidian.md/pricing", 10 | "isDesktopOnly": false 11 | } 12 | -------------------------------------------------------------------------------- /examples/ts-plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-sample-plugin", 3 | "version": "1.0.0", 4 | "description": "This is a sample plugin for Obsidian (https://obsidian.md)", 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 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@types/node": "^16.11.6", 16 | "@typescript-eslint/eslint-plugin": "5.29.0", 17 | "@typescript-eslint/parser": "5.29.0", 18 | "builtin-modules": "3.3.0", 19 | "esbuild": "0.17.3", 20 | "obsidian": "^1.5.7-1", 21 | "tslib": "2.4.0", 22 | "typescript": "4.7.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /examples/ts-plugin/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | This CSS file will be included with your plugin, and 4 | available in the app when your plugin is enabled. 5 | 6 | If your plugin does not need CSS, delete this file. 7 | 8 | */ 9 | -------------------------------------------------------------------------------- /examples/ts-plugin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "lib": [ 15 | "DOM", 16 | "ES5", 17 | "ES6", 18 | "ES7" 19 | ] 20 | }, 21 | "include": [ 22 | "**/*.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-user-plugins", 3 | "name": "User Plugins", 4 | "minAppVersion": "1.7.2", 5 | "description": "Use ts and js modules or js snippets to code your own plugins", 6 | "author": "mnowotnik", 7 | "authorUrl": "https://mnowotnik.com", 8 | "isDesktopOnly": false, 9 | "version": "1.4.0" 10 | } 11 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-user-plugins", 3 | "version": "1.4.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "obsidian-user-plugins", 9 | "version": "1.4.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@popperjs/core": "^2.11.2" 13 | }, 14 | "devDependencies": { 15 | "@types/node": "^16.11.6", 16 | "@typescript-eslint/eslint-plugin": "5.29.0", 17 | "@typescript-eslint/parser": "5.29.0", 18 | "builtin-modules": "^3.3.0", 19 | "esbuild": "0.17.3", 20 | "obsidian": "^1.7.2", 21 | "tslib": "2.4.0", 22 | "typescript": "4.7.4" 23 | } 24 | }, 25 | "node_modules/@codemirror/state": { 26 | "version": "6.4.1", 27 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", 28 | "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", 29 | "dev": true, 30 | "license": "MIT", 31 | "peer": true 32 | }, 33 | "node_modules/@codemirror/view": { 34 | "version": "6.34.2", 35 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.34.2.tgz", 36 | "integrity": "sha512-d6n0WFvL970A9Z+l9N2dO+Hk9ev4hDYQzIx+B9tCyBP0W5wPEszi1rhuyFesNSkLZzXbQE5FPH7F/z/TMJfoPA==", 37 | "dev": true, 38 | "license": "MIT", 39 | "peer": true, 40 | "dependencies": { 41 | "@codemirror/state": "^6.4.0", 42 | "style-mod": "^4.1.0", 43 | "w3c-keyname": "^2.2.4" 44 | } 45 | }, 46 | "node_modules/@esbuild/android-arm": { 47 | "version": "0.17.3", 48 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", 49 | "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", 50 | "cpu": [ 51 | "arm" 52 | ], 53 | "dev": true, 54 | "license": "MIT", 55 | "optional": true, 56 | "os": [ 57 | "android" 58 | ], 59 | "engines": { 60 | "node": ">=12" 61 | } 62 | }, 63 | "node_modules/@esbuild/android-arm64": { 64 | "version": "0.17.3", 65 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", 66 | "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", 67 | "cpu": [ 68 | "arm64" 69 | ], 70 | "dev": true, 71 | "license": "MIT", 72 | "optional": true, 73 | "os": [ 74 | "android" 75 | ], 76 | "engines": { 77 | "node": ">=12" 78 | } 79 | }, 80 | "node_modules/@esbuild/android-x64": { 81 | "version": "0.17.3", 82 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", 83 | "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", 84 | "cpu": [ 85 | "x64" 86 | ], 87 | "dev": true, 88 | "license": "MIT", 89 | "optional": true, 90 | "os": [ 91 | "android" 92 | ], 93 | "engines": { 94 | "node": ">=12" 95 | } 96 | }, 97 | "node_modules/@esbuild/darwin-arm64": { 98 | "version": "0.17.3", 99 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", 100 | "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", 101 | "cpu": [ 102 | "arm64" 103 | ], 104 | "dev": true, 105 | "license": "MIT", 106 | "optional": true, 107 | "os": [ 108 | "darwin" 109 | ], 110 | "engines": { 111 | "node": ">=12" 112 | } 113 | }, 114 | "node_modules/@esbuild/darwin-x64": { 115 | "version": "0.17.3", 116 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", 117 | "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", 118 | "cpu": [ 119 | "x64" 120 | ], 121 | "dev": true, 122 | "license": "MIT", 123 | "optional": true, 124 | "os": [ 125 | "darwin" 126 | ], 127 | "engines": { 128 | "node": ">=12" 129 | } 130 | }, 131 | "node_modules/@esbuild/freebsd-arm64": { 132 | "version": "0.17.3", 133 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", 134 | "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", 135 | "cpu": [ 136 | "arm64" 137 | ], 138 | "dev": true, 139 | "license": "MIT", 140 | "optional": true, 141 | "os": [ 142 | "freebsd" 143 | ], 144 | "engines": { 145 | "node": ">=12" 146 | } 147 | }, 148 | "node_modules/@esbuild/freebsd-x64": { 149 | "version": "0.17.3", 150 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", 151 | "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", 152 | "cpu": [ 153 | "x64" 154 | ], 155 | "dev": true, 156 | "license": "MIT", 157 | "optional": true, 158 | "os": [ 159 | "freebsd" 160 | ], 161 | "engines": { 162 | "node": ">=12" 163 | } 164 | }, 165 | "node_modules/@esbuild/linux-arm": { 166 | "version": "0.17.3", 167 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", 168 | "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", 169 | "cpu": [ 170 | "arm" 171 | ], 172 | "dev": true, 173 | "license": "MIT", 174 | "optional": true, 175 | "os": [ 176 | "linux" 177 | ], 178 | "engines": { 179 | "node": ">=12" 180 | } 181 | }, 182 | "node_modules/@esbuild/linux-arm64": { 183 | "version": "0.17.3", 184 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", 185 | "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", 186 | "cpu": [ 187 | "arm64" 188 | ], 189 | "dev": true, 190 | "license": "MIT", 191 | "optional": true, 192 | "os": [ 193 | "linux" 194 | ], 195 | "engines": { 196 | "node": ">=12" 197 | } 198 | }, 199 | "node_modules/@esbuild/linux-ia32": { 200 | "version": "0.17.3", 201 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", 202 | "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", 203 | "cpu": [ 204 | "ia32" 205 | ], 206 | "dev": true, 207 | "license": "MIT", 208 | "optional": true, 209 | "os": [ 210 | "linux" 211 | ], 212 | "engines": { 213 | "node": ">=12" 214 | } 215 | }, 216 | "node_modules/@esbuild/linux-loong64": { 217 | "version": "0.17.3", 218 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", 219 | "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", 220 | "cpu": [ 221 | "loong64" 222 | ], 223 | "dev": true, 224 | "license": "MIT", 225 | "optional": true, 226 | "os": [ 227 | "linux" 228 | ], 229 | "engines": { 230 | "node": ">=12" 231 | } 232 | }, 233 | "node_modules/@esbuild/linux-mips64el": { 234 | "version": "0.17.3", 235 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", 236 | "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", 237 | "cpu": [ 238 | "mips64el" 239 | ], 240 | "dev": true, 241 | "license": "MIT", 242 | "optional": true, 243 | "os": [ 244 | "linux" 245 | ], 246 | "engines": { 247 | "node": ">=12" 248 | } 249 | }, 250 | "node_modules/@esbuild/linux-ppc64": { 251 | "version": "0.17.3", 252 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", 253 | "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", 254 | "cpu": [ 255 | "ppc64" 256 | ], 257 | "dev": true, 258 | "license": "MIT", 259 | "optional": true, 260 | "os": [ 261 | "linux" 262 | ], 263 | "engines": { 264 | "node": ">=12" 265 | } 266 | }, 267 | "node_modules/@esbuild/linux-riscv64": { 268 | "version": "0.17.3", 269 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", 270 | "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", 271 | "cpu": [ 272 | "riscv64" 273 | ], 274 | "dev": true, 275 | "license": "MIT", 276 | "optional": true, 277 | "os": [ 278 | "linux" 279 | ], 280 | "engines": { 281 | "node": ">=12" 282 | } 283 | }, 284 | "node_modules/@esbuild/linux-s390x": { 285 | "version": "0.17.3", 286 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", 287 | "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", 288 | "cpu": [ 289 | "s390x" 290 | ], 291 | "dev": true, 292 | "license": "MIT", 293 | "optional": true, 294 | "os": [ 295 | "linux" 296 | ], 297 | "engines": { 298 | "node": ">=12" 299 | } 300 | }, 301 | "node_modules/@esbuild/linux-x64": { 302 | "version": "0.17.3", 303 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", 304 | "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", 305 | "cpu": [ 306 | "x64" 307 | ], 308 | "dev": true, 309 | "license": "MIT", 310 | "optional": true, 311 | "os": [ 312 | "linux" 313 | ], 314 | "engines": { 315 | "node": ">=12" 316 | } 317 | }, 318 | "node_modules/@esbuild/netbsd-x64": { 319 | "version": "0.17.3", 320 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", 321 | "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", 322 | "cpu": [ 323 | "x64" 324 | ], 325 | "dev": true, 326 | "license": "MIT", 327 | "optional": true, 328 | "os": [ 329 | "netbsd" 330 | ], 331 | "engines": { 332 | "node": ">=12" 333 | } 334 | }, 335 | "node_modules/@esbuild/openbsd-x64": { 336 | "version": "0.17.3", 337 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", 338 | "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", 339 | "cpu": [ 340 | "x64" 341 | ], 342 | "dev": true, 343 | "license": "MIT", 344 | "optional": true, 345 | "os": [ 346 | "openbsd" 347 | ], 348 | "engines": { 349 | "node": ">=12" 350 | } 351 | }, 352 | "node_modules/@esbuild/sunos-x64": { 353 | "version": "0.17.3", 354 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", 355 | "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", 356 | "cpu": [ 357 | "x64" 358 | ], 359 | "dev": true, 360 | "license": "MIT", 361 | "optional": true, 362 | "os": [ 363 | "sunos" 364 | ], 365 | "engines": { 366 | "node": ">=12" 367 | } 368 | }, 369 | "node_modules/@esbuild/win32-arm64": { 370 | "version": "0.17.3", 371 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", 372 | "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", 373 | "cpu": [ 374 | "arm64" 375 | ], 376 | "dev": true, 377 | "license": "MIT", 378 | "optional": true, 379 | "os": [ 380 | "win32" 381 | ], 382 | "engines": { 383 | "node": ">=12" 384 | } 385 | }, 386 | "node_modules/@esbuild/win32-ia32": { 387 | "version": "0.17.3", 388 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", 389 | "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", 390 | "cpu": [ 391 | "ia32" 392 | ], 393 | "dev": true, 394 | "license": "MIT", 395 | "optional": true, 396 | "os": [ 397 | "win32" 398 | ], 399 | "engines": { 400 | "node": ">=12" 401 | } 402 | }, 403 | "node_modules/@esbuild/win32-x64": { 404 | "version": "0.17.3", 405 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", 406 | "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", 407 | "cpu": [ 408 | "x64" 409 | ], 410 | "dev": true, 411 | "license": "MIT", 412 | "optional": true, 413 | "os": [ 414 | "win32" 415 | ], 416 | "engines": { 417 | "node": ">=12" 418 | } 419 | }, 420 | "node_modules/@eslint/eslintrc": { 421 | "version": "1.2.2", 422 | "dev": true, 423 | "license": "MIT", 424 | "peer": true, 425 | "dependencies": { 426 | "ajv": "^6.12.4", 427 | "debug": "^4.3.2", 428 | "espree": "^9.3.1", 429 | "globals": "^13.9.0", 430 | "ignore": "^5.2.0", 431 | "import-fresh": "^3.2.1", 432 | "js-yaml": "^4.1.0", 433 | "minimatch": "^3.0.4", 434 | "strip-json-comments": "^3.1.1" 435 | }, 436 | "engines": { 437 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 438 | } 439 | }, 440 | "node_modules/@humanwhocodes/config-array": { 441 | "version": "0.9.5", 442 | "dev": true, 443 | "license": "Apache-2.0", 444 | "peer": true, 445 | "dependencies": { 446 | "@humanwhocodes/object-schema": "^1.2.1", 447 | "debug": "^4.1.1", 448 | "minimatch": "^3.0.4" 449 | }, 450 | "engines": { 451 | "node": ">=10.10.0" 452 | } 453 | }, 454 | "node_modules/@humanwhocodes/object-schema": { 455 | "version": "1.2.1", 456 | "dev": true, 457 | "license": "BSD-3-Clause", 458 | "peer": true 459 | }, 460 | "node_modules/@nodelib/fs.scandir": { 461 | "version": "2.1.5", 462 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 463 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 464 | "dev": true, 465 | "license": "MIT", 466 | "dependencies": { 467 | "@nodelib/fs.stat": "2.0.5", 468 | "run-parallel": "^1.1.9" 469 | }, 470 | "engines": { 471 | "node": ">= 8" 472 | } 473 | }, 474 | "node_modules/@nodelib/fs.stat": { 475 | "version": "2.0.5", 476 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 477 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 478 | "dev": true, 479 | "license": "MIT", 480 | "engines": { 481 | "node": ">= 8" 482 | } 483 | }, 484 | "node_modules/@nodelib/fs.walk": { 485 | "version": "1.2.8", 486 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 487 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 488 | "dev": true, 489 | "license": "MIT", 490 | "dependencies": { 491 | "@nodelib/fs.scandir": "2.1.5", 492 | "fastq": "^1.6.0" 493 | }, 494 | "engines": { 495 | "node": ">= 8" 496 | } 497 | }, 498 | "node_modules/@popperjs/core": { 499 | "version": "2.11.5", 500 | "license": "MIT", 501 | "funding": { 502 | "type": "opencollective", 503 | "url": "https://opencollective.com/popperjs" 504 | } 505 | }, 506 | "node_modules/@types/codemirror": { 507 | "version": "5.60.8", 508 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 509 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 510 | "dev": true, 511 | "license": "MIT", 512 | "dependencies": { 513 | "@types/tern": "*" 514 | } 515 | }, 516 | "node_modules/@types/estree": { 517 | "version": "1.0.6", 518 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 519 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 520 | "dev": true, 521 | "license": "MIT" 522 | }, 523 | "node_modules/@types/json-schema": { 524 | "version": "7.0.15", 525 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 526 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 527 | "dev": true, 528 | "license": "MIT" 529 | }, 530 | "node_modules/@types/node": { 531 | "version": "16.11.33", 532 | "dev": true, 533 | "license": "MIT" 534 | }, 535 | "node_modules/@types/tern": { 536 | "version": "0.23.9", 537 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 538 | "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 539 | "dev": true, 540 | "license": "MIT", 541 | "dependencies": { 542 | "@types/estree": "*" 543 | } 544 | }, 545 | "node_modules/@typescript-eslint/eslint-plugin": { 546 | "version": "5.29.0", 547 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", 548 | "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", 549 | "dev": true, 550 | "license": "MIT", 551 | "dependencies": { 552 | "@typescript-eslint/scope-manager": "5.29.0", 553 | "@typescript-eslint/type-utils": "5.29.0", 554 | "@typescript-eslint/utils": "5.29.0", 555 | "debug": "^4.3.4", 556 | "functional-red-black-tree": "^1.0.1", 557 | "ignore": "^5.2.0", 558 | "regexpp": "^3.2.0", 559 | "semver": "^7.3.7", 560 | "tsutils": "^3.21.0" 561 | }, 562 | "engines": { 563 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 564 | }, 565 | "funding": { 566 | "type": "opencollective", 567 | "url": "https://opencollective.com/typescript-eslint" 568 | }, 569 | "peerDependencies": { 570 | "@typescript-eslint/parser": "^5.0.0", 571 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 572 | }, 573 | "peerDependenciesMeta": { 574 | "typescript": { 575 | "optional": true 576 | } 577 | } 578 | }, 579 | "node_modules/@typescript-eslint/parser": { 580 | "version": "5.29.0", 581 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", 582 | "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", 583 | "dev": true, 584 | "license": "BSD-2-Clause", 585 | "dependencies": { 586 | "@typescript-eslint/scope-manager": "5.29.0", 587 | "@typescript-eslint/types": "5.29.0", 588 | "@typescript-eslint/typescript-estree": "5.29.0", 589 | "debug": "^4.3.4" 590 | }, 591 | "engines": { 592 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 593 | }, 594 | "funding": { 595 | "type": "opencollective", 596 | "url": "https://opencollective.com/typescript-eslint" 597 | }, 598 | "peerDependencies": { 599 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 600 | }, 601 | "peerDependenciesMeta": { 602 | "typescript": { 603 | "optional": true 604 | } 605 | } 606 | }, 607 | "node_modules/@typescript-eslint/scope-manager": { 608 | "version": "5.29.0", 609 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", 610 | "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", 611 | "dev": true, 612 | "license": "MIT", 613 | "dependencies": { 614 | "@typescript-eslint/types": "5.29.0", 615 | "@typescript-eslint/visitor-keys": "5.29.0" 616 | }, 617 | "engines": { 618 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 619 | }, 620 | "funding": { 621 | "type": "opencollective", 622 | "url": "https://opencollective.com/typescript-eslint" 623 | } 624 | }, 625 | "node_modules/@typescript-eslint/type-utils": { 626 | "version": "5.29.0", 627 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", 628 | "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", 629 | "dev": true, 630 | "license": "MIT", 631 | "dependencies": { 632 | "@typescript-eslint/utils": "5.29.0", 633 | "debug": "^4.3.4", 634 | "tsutils": "^3.21.0" 635 | }, 636 | "engines": { 637 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 638 | }, 639 | "funding": { 640 | "type": "opencollective", 641 | "url": "https://opencollective.com/typescript-eslint" 642 | }, 643 | "peerDependencies": { 644 | "eslint": "*" 645 | }, 646 | "peerDependenciesMeta": { 647 | "typescript": { 648 | "optional": true 649 | } 650 | } 651 | }, 652 | "node_modules/@typescript-eslint/types": { 653 | "version": "5.29.0", 654 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", 655 | "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", 656 | "dev": true, 657 | "license": "MIT", 658 | "engines": { 659 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 660 | }, 661 | "funding": { 662 | "type": "opencollective", 663 | "url": "https://opencollective.com/typescript-eslint" 664 | } 665 | }, 666 | "node_modules/@typescript-eslint/typescript-estree": { 667 | "version": "5.29.0", 668 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", 669 | "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", 670 | "dev": true, 671 | "license": "BSD-2-Clause", 672 | "dependencies": { 673 | "@typescript-eslint/types": "5.29.0", 674 | "@typescript-eslint/visitor-keys": "5.29.0", 675 | "debug": "^4.3.4", 676 | "globby": "^11.1.0", 677 | "is-glob": "^4.0.3", 678 | "semver": "^7.3.7", 679 | "tsutils": "^3.21.0" 680 | }, 681 | "engines": { 682 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 683 | }, 684 | "funding": { 685 | "type": "opencollective", 686 | "url": "https://opencollective.com/typescript-eslint" 687 | }, 688 | "peerDependenciesMeta": { 689 | "typescript": { 690 | "optional": true 691 | } 692 | } 693 | }, 694 | "node_modules/@typescript-eslint/utils": { 695 | "version": "5.29.0", 696 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", 697 | "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", 698 | "dev": true, 699 | "license": "MIT", 700 | "dependencies": { 701 | "@types/json-schema": "^7.0.9", 702 | "@typescript-eslint/scope-manager": "5.29.0", 703 | "@typescript-eslint/types": "5.29.0", 704 | "@typescript-eslint/typescript-estree": "5.29.0", 705 | "eslint-scope": "^5.1.1", 706 | "eslint-utils": "^3.0.0" 707 | }, 708 | "engines": { 709 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 710 | }, 711 | "funding": { 712 | "type": "opencollective", 713 | "url": "https://opencollective.com/typescript-eslint" 714 | }, 715 | "peerDependencies": { 716 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 717 | } 718 | }, 719 | "node_modules/@typescript-eslint/visitor-keys": { 720 | "version": "5.29.0", 721 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", 722 | "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", 723 | "dev": true, 724 | "license": "MIT", 725 | "dependencies": { 726 | "@typescript-eslint/types": "5.29.0", 727 | "eslint-visitor-keys": "^3.3.0" 728 | }, 729 | "engines": { 730 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 731 | }, 732 | "funding": { 733 | "type": "opencollective", 734 | "url": "https://opencollective.com/typescript-eslint" 735 | } 736 | }, 737 | "node_modules/acorn": { 738 | "version": "8.7.1", 739 | "dev": true, 740 | "license": "MIT", 741 | "peer": true, 742 | "bin": { 743 | "acorn": "bin/acorn" 744 | }, 745 | "engines": { 746 | "node": ">=0.4.0" 747 | } 748 | }, 749 | "node_modules/acorn-jsx": { 750 | "version": "5.3.2", 751 | "dev": true, 752 | "license": "MIT", 753 | "peer": true, 754 | "peerDependencies": { 755 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 756 | } 757 | }, 758 | "node_modules/ajv": { 759 | "version": "6.12.6", 760 | "dev": true, 761 | "license": "MIT", 762 | "peer": true, 763 | "dependencies": { 764 | "fast-deep-equal": "^3.1.1", 765 | "fast-json-stable-stringify": "^2.0.0", 766 | "json-schema-traverse": "^0.4.1", 767 | "uri-js": "^4.2.2" 768 | }, 769 | "funding": { 770 | "type": "github", 771 | "url": "https://github.com/sponsors/epoberezkin" 772 | } 773 | }, 774 | "node_modules/ansi-regex": { 775 | "version": "5.0.1", 776 | "dev": true, 777 | "license": "MIT", 778 | "peer": true, 779 | "engines": { 780 | "node": ">=8" 781 | } 782 | }, 783 | "node_modules/ansi-styles": { 784 | "version": "4.3.0", 785 | "dev": true, 786 | "license": "MIT", 787 | "peer": true, 788 | "dependencies": { 789 | "color-convert": "^2.0.1" 790 | }, 791 | "engines": { 792 | "node": ">=8" 793 | }, 794 | "funding": { 795 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 796 | } 797 | }, 798 | "node_modules/argparse": { 799 | "version": "2.0.1", 800 | "dev": true, 801 | "license": "Python-2.0", 802 | "peer": true 803 | }, 804 | "node_modules/array-union": { 805 | "version": "2.1.0", 806 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 807 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 808 | "dev": true, 809 | "license": "MIT", 810 | "engines": { 811 | "node": ">=8" 812 | } 813 | }, 814 | "node_modules/balanced-match": { 815 | "version": "1.0.2", 816 | "dev": true, 817 | "license": "MIT", 818 | "peer": true 819 | }, 820 | "node_modules/brace-expansion": { 821 | "version": "1.1.11", 822 | "dev": true, 823 | "license": "MIT", 824 | "peer": true, 825 | "dependencies": { 826 | "balanced-match": "^1.0.0", 827 | "concat-map": "0.0.1" 828 | } 829 | }, 830 | "node_modules/braces": { 831 | "version": "3.0.3", 832 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 833 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 834 | "dev": true, 835 | "license": "MIT", 836 | "dependencies": { 837 | "fill-range": "^7.1.1" 838 | }, 839 | "engines": { 840 | "node": ">=8" 841 | } 842 | }, 843 | "node_modules/builtin-modules": { 844 | "version": "3.3.0", 845 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 846 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 847 | "dev": true, 848 | "license": "MIT", 849 | "engines": { 850 | "node": ">=6" 851 | }, 852 | "funding": { 853 | "url": "https://github.com/sponsors/sindresorhus" 854 | } 855 | }, 856 | "node_modules/callsites": { 857 | "version": "3.1.0", 858 | "dev": true, 859 | "license": "MIT", 860 | "peer": true, 861 | "engines": { 862 | "node": ">=6" 863 | } 864 | }, 865 | "node_modules/chalk": { 866 | "version": "4.1.2", 867 | "dev": true, 868 | "license": "MIT", 869 | "peer": true, 870 | "dependencies": { 871 | "ansi-styles": "^4.1.0", 872 | "supports-color": "^7.1.0" 873 | }, 874 | "engines": { 875 | "node": ">=10" 876 | }, 877 | "funding": { 878 | "url": "https://github.com/chalk/chalk?sponsor=1" 879 | } 880 | }, 881 | "node_modules/color-convert": { 882 | "version": "2.0.1", 883 | "dev": true, 884 | "license": "MIT", 885 | "peer": true, 886 | "dependencies": { 887 | "color-name": "~1.1.4" 888 | }, 889 | "engines": { 890 | "node": ">=7.0.0" 891 | } 892 | }, 893 | "node_modules/color-name": { 894 | "version": "1.1.4", 895 | "dev": true, 896 | "license": "MIT", 897 | "peer": true 898 | }, 899 | "node_modules/concat-map": { 900 | "version": "0.0.1", 901 | "dev": true, 902 | "license": "MIT", 903 | "peer": true 904 | }, 905 | "node_modules/cross-spawn": { 906 | "version": "7.0.3", 907 | "dev": true, 908 | "license": "MIT", 909 | "peer": true, 910 | "dependencies": { 911 | "path-key": "^3.1.0", 912 | "shebang-command": "^2.0.0", 913 | "which": "^2.0.1" 914 | }, 915 | "engines": { 916 | "node": ">= 8" 917 | } 918 | }, 919 | "node_modules/debug": { 920 | "version": "4.3.4", 921 | "dev": true, 922 | "license": "MIT", 923 | "dependencies": { 924 | "ms": "2.1.2" 925 | }, 926 | "engines": { 927 | "node": ">=6.0" 928 | }, 929 | "peerDependenciesMeta": { 930 | "supports-color": { 931 | "optional": true 932 | } 933 | } 934 | }, 935 | "node_modules/deep-is": { 936 | "version": "0.1.4", 937 | "dev": true, 938 | "license": "MIT", 939 | "peer": true 940 | }, 941 | "node_modules/dir-glob": { 942 | "version": "3.0.1", 943 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 944 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 945 | "dev": true, 946 | "license": "MIT", 947 | "dependencies": { 948 | "path-type": "^4.0.0" 949 | }, 950 | "engines": { 951 | "node": ">=8" 952 | } 953 | }, 954 | "node_modules/doctrine": { 955 | "version": "3.0.0", 956 | "dev": true, 957 | "license": "Apache-2.0", 958 | "peer": true, 959 | "dependencies": { 960 | "esutils": "^2.0.2" 961 | }, 962 | "engines": { 963 | "node": ">=6.0.0" 964 | } 965 | }, 966 | "node_modules/esbuild": { 967 | "version": "0.17.3", 968 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", 969 | "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", 970 | "dev": true, 971 | "hasInstallScript": true, 972 | "license": "MIT", 973 | "bin": { 974 | "esbuild": "bin/esbuild" 975 | }, 976 | "engines": { 977 | "node": ">=12" 978 | }, 979 | "optionalDependencies": { 980 | "@esbuild/android-arm": "0.17.3", 981 | "@esbuild/android-arm64": "0.17.3", 982 | "@esbuild/android-x64": "0.17.3", 983 | "@esbuild/darwin-arm64": "0.17.3", 984 | "@esbuild/darwin-x64": "0.17.3", 985 | "@esbuild/freebsd-arm64": "0.17.3", 986 | "@esbuild/freebsd-x64": "0.17.3", 987 | "@esbuild/linux-arm": "0.17.3", 988 | "@esbuild/linux-arm64": "0.17.3", 989 | "@esbuild/linux-ia32": "0.17.3", 990 | "@esbuild/linux-loong64": "0.17.3", 991 | "@esbuild/linux-mips64el": "0.17.3", 992 | "@esbuild/linux-ppc64": "0.17.3", 993 | "@esbuild/linux-riscv64": "0.17.3", 994 | "@esbuild/linux-s390x": "0.17.3", 995 | "@esbuild/linux-x64": "0.17.3", 996 | "@esbuild/netbsd-x64": "0.17.3", 997 | "@esbuild/openbsd-x64": "0.17.3", 998 | "@esbuild/sunos-x64": "0.17.3", 999 | "@esbuild/win32-arm64": "0.17.3", 1000 | "@esbuild/win32-ia32": "0.17.3", 1001 | "@esbuild/win32-x64": "0.17.3" 1002 | } 1003 | }, 1004 | "node_modules/escape-string-regexp": { 1005 | "version": "4.0.0", 1006 | "dev": true, 1007 | "license": "MIT", 1008 | "peer": true, 1009 | "engines": { 1010 | "node": ">=10" 1011 | }, 1012 | "funding": { 1013 | "url": "https://github.com/sponsors/sindresorhus" 1014 | } 1015 | }, 1016 | "node_modules/eslint": { 1017 | "version": "8.14.0", 1018 | "dev": true, 1019 | "license": "MIT", 1020 | "peer": true, 1021 | "dependencies": { 1022 | "@eslint/eslintrc": "^1.2.2", 1023 | "@humanwhocodes/config-array": "^0.9.2", 1024 | "ajv": "^6.10.0", 1025 | "chalk": "^4.0.0", 1026 | "cross-spawn": "^7.0.2", 1027 | "debug": "^4.3.2", 1028 | "doctrine": "^3.0.0", 1029 | "escape-string-regexp": "^4.0.0", 1030 | "eslint-scope": "^7.1.1", 1031 | "eslint-utils": "^3.0.0", 1032 | "eslint-visitor-keys": "^3.3.0", 1033 | "espree": "^9.3.1", 1034 | "esquery": "^1.4.0", 1035 | "esutils": "^2.0.2", 1036 | "fast-deep-equal": "^3.1.3", 1037 | "file-entry-cache": "^6.0.1", 1038 | "functional-red-black-tree": "^1.0.1", 1039 | "glob-parent": "^6.0.1", 1040 | "globals": "^13.6.0", 1041 | "ignore": "^5.2.0", 1042 | "import-fresh": "^3.0.0", 1043 | "imurmurhash": "^0.1.4", 1044 | "is-glob": "^4.0.0", 1045 | "js-yaml": "^4.1.0", 1046 | "json-stable-stringify-without-jsonify": "^1.0.1", 1047 | "levn": "^0.4.1", 1048 | "lodash.merge": "^4.6.2", 1049 | "minimatch": "^3.0.4", 1050 | "natural-compare": "^1.4.0", 1051 | "optionator": "^0.9.1", 1052 | "regexpp": "^3.2.0", 1053 | "strip-ansi": "^6.0.1", 1054 | "strip-json-comments": "^3.1.0", 1055 | "text-table": "^0.2.0", 1056 | "v8-compile-cache": "^2.0.3" 1057 | }, 1058 | "bin": { 1059 | "eslint": "bin/eslint.js" 1060 | }, 1061 | "engines": { 1062 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1063 | }, 1064 | "funding": { 1065 | "url": "https://opencollective.com/eslint" 1066 | } 1067 | }, 1068 | "node_modules/eslint-scope": { 1069 | "version": "5.1.1", 1070 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1071 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1072 | "dev": true, 1073 | "license": "BSD-2-Clause", 1074 | "dependencies": { 1075 | "esrecurse": "^4.3.0", 1076 | "estraverse": "^4.1.1" 1077 | }, 1078 | "engines": { 1079 | "node": ">=8.0.0" 1080 | } 1081 | }, 1082 | "node_modules/eslint-utils": { 1083 | "version": "3.0.0", 1084 | "dev": true, 1085 | "license": "MIT", 1086 | "dependencies": { 1087 | "eslint-visitor-keys": "^2.0.0" 1088 | }, 1089 | "engines": { 1090 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 1091 | }, 1092 | "funding": { 1093 | "url": "https://github.com/sponsors/mysticatea" 1094 | }, 1095 | "peerDependencies": { 1096 | "eslint": ">=5" 1097 | } 1098 | }, 1099 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 1100 | "version": "2.1.0", 1101 | "dev": true, 1102 | "license": "Apache-2.0", 1103 | "engines": { 1104 | "node": ">=10" 1105 | } 1106 | }, 1107 | "node_modules/eslint-visitor-keys": { 1108 | "version": "3.3.0", 1109 | "dev": true, 1110 | "license": "Apache-2.0", 1111 | "engines": { 1112 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1113 | } 1114 | }, 1115 | "node_modules/eslint/node_modules/eslint-scope": { 1116 | "version": "7.1.1", 1117 | "dev": true, 1118 | "license": "BSD-2-Clause", 1119 | "peer": true, 1120 | "dependencies": { 1121 | "esrecurse": "^4.3.0", 1122 | "estraverse": "^5.2.0" 1123 | }, 1124 | "engines": { 1125 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1126 | } 1127 | }, 1128 | "node_modules/eslint/node_modules/estraverse": { 1129 | "version": "5.3.0", 1130 | "dev": true, 1131 | "license": "BSD-2-Clause", 1132 | "peer": true, 1133 | "engines": { 1134 | "node": ">=4.0" 1135 | } 1136 | }, 1137 | "node_modules/espree": { 1138 | "version": "9.3.1", 1139 | "dev": true, 1140 | "license": "BSD-2-Clause", 1141 | "peer": true, 1142 | "dependencies": { 1143 | "acorn": "^8.7.0", 1144 | "acorn-jsx": "^5.3.1", 1145 | "eslint-visitor-keys": "^3.3.0" 1146 | }, 1147 | "engines": { 1148 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1149 | } 1150 | }, 1151 | "node_modules/esquery": { 1152 | "version": "1.4.0", 1153 | "dev": true, 1154 | "license": "BSD-3-Clause", 1155 | "peer": true, 1156 | "dependencies": { 1157 | "estraverse": "^5.1.0" 1158 | }, 1159 | "engines": { 1160 | "node": ">=0.10" 1161 | } 1162 | }, 1163 | "node_modules/esquery/node_modules/estraverse": { 1164 | "version": "5.3.0", 1165 | "dev": true, 1166 | "license": "BSD-2-Clause", 1167 | "peer": true, 1168 | "engines": { 1169 | "node": ">=4.0" 1170 | } 1171 | }, 1172 | "node_modules/esrecurse": { 1173 | "version": "4.3.0", 1174 | "dev": true, 1175 | "license": "BSD-2-Clause", 1176 | "dependencies": { 1177 | "estraverse": "^5.2.0" 1178 | }, 1179 | "engines": { 1180 | "node": ">=4.0" 1181 | } 1182 | }, 1183 | "node_modules/esrecurse/node_modules/estraverse": { 1184 | "version": "5.3.0", 1185 | "dev": true, 1186 | "license": "BSD-2-Clause", 1187 | "engines": { 1188 | "node": ">=4.0" 1189 | } 1190 | }, 1191 | "node_modules/estraverse": { 1192 | "version": "4.3.0", 1193 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1194 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1195 | "dev": true, 1196 | "license": "BSD-2-Clause", 1197 | "engines": { 1198 | "node": ">=4.0" 1199 | } 1200 | }, 1201 | "node_modules/esutils": { 1202 | "version": "2.0.3", 1203 | "dev": true, 1204 | "license": "BSD-2-Clause", 1205 | "peer": true, 1206 | "engines": { 1207 | "node": ">=0.10.0" 1208 | } 1209 | }, 1210 | "node_modules/fast-deep-equal": { 1211 | "version": "3.1.3", 1212 | "dev": true, 1213 | "license": "MIT", 1214 | "peer": true 1215 | }, 1216 | "node_modules/fast-glob": { 1217 | "version": "3.3.2", 1218 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1219 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1220 | "dev": true, 1221 | "license": "MIT", 1222 | "dependencies": { 1223 | "@nodelib/fs.stat": "^2.0.2", 1224 | "@nodelib/fs.walk": "^1.2.3", 1225 | "glob-parent": "^5.1.2", 1226 | "merge2": "^1.3.0", 1227 | "micromatch": "^4.0.4" 1228 | }, 1229 | "engines": { 1230 | "node": ">=8.6.0" 1231 | } 1232 | }, 1233 | "node_modules/fast-glob/node_modules/glob-parent": { 1234 | "version": "5.1.2", 1235 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1236 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1237 | "dev": true, 1238 | "license": "ISC", 1239 | "dependencies": { 1240 | "is-glob": "^4.0.1" 1241 | }, 1242 | "engines": { 1243 | "node": ">= 6" 1244 | } 1245 | }, 1246 | "node_modules/fast-json-stable-stringify": { 1247 | "version": "2.1.0", 1248 | "dev": true, 1249 | "license": "MIT", 1250 | "peer": true 1251 | }, 1252 | "node_modules/fast-levenshtein": { 1253 | "version": "2.0.6", 1254 | "dev": true, 1255 | "license": "MIT", 1256 | "peer": true 1257 | }, 1258 | "node_modules/fastq": { 1259 | "version": "1.17.1", 1260 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1261 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1262 | "dev": true, 1263 | "license": "ISC", 1264 | "dependencies": { 1265 | "reusify": "^1.0.4" 1266 | } 1267 | }, 1268 | "node_modules/file-entry-cache": { 1269 | "version": "6.0.1", 1270 | "dev": true, 1271 | "license": "MIT", 1272 | "peer": true, 1273 | "dependencies": { 1274 | "flat-cache": "^3.0.4" 1275 | }, 1276 | "engines": { 1277 | "node": "^10.12.0 || >=12.0.0" 1278 | } 1279 | }, 1280 | "node_modules/fill-range": { 1281 | "version": "7.1.1", 1282 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1283 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1284 | "dev": true, 1285 | "license": "MIT", 1286 | "dependencies": { 1287 | "to-regex-range": "^5.0.1" 1288 | }, 1289 | "engines": { 1290 | "node": ">=8" 1291 | } 1292 | }, 1293 | "node_modules/flat-cache": { 1294 | "version": "3.0.4", 1295 | "dev": true, 1296 | "license": "MIT", 1297 | "peer": true, 1298 | "dependencies": { 1299 | "flatted": "^3.1.0", 1300 | "rimraf": "^3.0.2" 1301 | }, 1302 | "engines": { 1303 | "node": "^10.12.0 || >=12.0.0" 1304 | } 1305 | }, 1306 | "node_modules/flatted": { 1307 | "version": "3.2.5", 1308 | "dev": true, 1309 | "license": "ISC", 1310 | "peer": true 1311 | }, 1312 | "node_modules/fs.realpath": { 1313 | "version": "1.0.0", 1314 | "dev": true, 1315 | "license": "ISC", 1316 | "peer": true 1317 | }, 1318 | "node_modules/functional-red-black-tree": { 1319 | "version": "1.0.1", 1320 | "dev": true, 1321 | "license": "MIT" 1322 | }, 1323 | "node_modules/glob": { 1324 | "version": "7.2.0", 1325 | "dev": true, 1326 | "license": "ISC", 1327 | "peer": true, 1328 | "dependencies": { 1329 | "fs.realpath": "^1.0.0", 1330 | "inflight": "^1.0.4", 1331 | "inherits": "2", 1332 | "minimatch": "^3.0.4", 1333 | "once": "^1.3.0", 1334 | "path-is-absolute": "^1.0.0" 1335 | }, 1336 | "engines": { 1337 | "node": "*" 1338 | }, 1339 | "funding": { 1340 | "url": "https://github.com/sponsors/isaacs" 1341 | } 1342 | }, 1343 | "node_modules/glob-parent": { 1344 | "version": "6.0.2", 1345 | "dev": true, 1346 | "license": "ISC", 1347 | "peer": true, 1348 | "dependencies": { 1349 | "is-glob": "^4.0.3" 1350 | }, 1351 | "engines": { 1352 | "node": ">=10.13.0" 1353 | } 1354 | }, 1355 | "node_modules/globals": { 1356 | "version": "13.13.0", 1357 | "dev": true, 1358 | "license": "MIT", 1359 | "peer": true, 1360 | "dependencies": { 1361 | "type-fest": "^0.20.2" 1362 | }, 1363 | "engines": { 1364 | "node": ">=8" 1365 | }, 1366 | "funding": { 1367 | "url": "https://github.com/sponsors/sindresorhus" 1368 | } 1369 | }, 1370 | "node_modules/globby": { 1371 | "version": "11.1.0", 1372 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1373 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1374 | "dev": true, 1375 | "license": "MIT", 1376 | "dependencies": { 1377 | "array-union": "^2.1.0", 1378 | "dir-glob": "^3.0.1", 1379 | "fast-glob": "^3.2.9", 1380 | "ignore": "^5.2.0", 1381 | "merge2": "^1.4.1", 1382 | "slash": "^3.0.0" 1383 | }, 1384 | "engines": { 1385 | "node": ">=10" 1386 | }, 1387 | "funding": { 1388 | "url": "https://github.com/sponsors/sindresorhus" 1389 | } 1390 | }, 1391 | "node_modules/has-flag": { 1392 | "version": "4.0.0", 1393 | "dev": true, 1394 | "license": "MIT", 1395 | "peer": true, 1396 | "engines": { 1397 | "node": ">=8" 1398 | } 1399 | }, 1400 | "node_modules/ignore": { 1401 | "version": "5.2.0", 1402 | "dev": true, 1403 | "license": "MIT", 1404 | "engines": { 1405 | "node": ">= 4" 1406 | } 1407 | }, 1408 | "node_modules/import-fresh": { 1409 | "version": "3.3.0", 1410 | "dev": true, 1411 | "license": "MIT", 1412 | "peer": true, 1413 | "dependencies": { 1414 | "parent-module": "^1.0.0", 1415 | "resolve-from": "^4.0.0" 1416 | }, 1417 | "engines": { 1418 | "node": ">=6" 1419 | }, 1420 | "funding": { 1421 | "url": "https://github.com/sponsors/sindresorhus" 1422 | } 1423 | }, 1424 | "node_modules/imurmurhash": { 1425 | "version": "0.1.4", 1426 | "dev": true, 1427 | "license": "MIT", 1428 | "peer": true, 1429 | "engines": { 1430 | "node": ">=0.8.19" 1431 | } 1432 | }, 1433 | "node_modules/inflight": { 1434 | "version": "1.0.6", 1435 | "dev": true, 1436 | "license": "ISC", 1437 | "peer": true, 1438 | "dependencies": { 1439 | "once": "^1.3.0", 1440 | "wrappy": "1" 1441 | } 1442 | }, 1443 | "node_modules/inherits": { 1444 | "version": "2.0.4", 1445 | "dev": true, 1446 | "license": "ISC", 1447 | "peer": true 1448 | }, 1449 | "node_modules/is-extglob": { 1450 | "version": "2.1.1", 1451 | "dev": true, 1452 | "license": "MIT", 1453 | "engines": { 1454 | "node": ">=0.10.0" 1455 | } 1456 | }, 1457 | "node_modules/is-glob": { 1458 | "version": "4.0.3", 1459 | "dev": true, 1460 | "license": "MIT", 1461 | "dependencies": { 1462 | "is-extglob": "^2.1.1" 1463 | }, 1464 | "engines": { 1465 | "node": ">=0.10.0" 1466 | } 1467 | }, 1468 | "node_modules/is-number": { 1469 | "version": "7.0.0", 1470 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1471 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1472 | "dev": true, 1473 | "license": "MIT", 1474 | "engines": { 1475 | "node": ">=0.12.0" 1476 | } 1477 | }, 1478 | "node_modules/isexe": { 1479 | "version": "2.0.0", 1480 | "dev": true, 1481 | "license": "ISC", 1482 | "peer": true 1483 | }, 1484 | "node_modules/js-yaml": { 1485 | "version": "4.1.0", 1486 | "dev": true, 1487 | "license": "MIT", 1488 | "peer": true, 1489 | "dependencies": { 1490 | "argparse": "^2.0.1" 1491 | }, 1492 | "bin": { 1493 | "js-yaml": "bin/js-yaml.js" 1494 | } 1495 | }, 1496 | "node_modules/json-schema-traverse": { 1497 | "version": "0.4.1", 1498 | "dev": true, 1499 | "license": "MIT", 1500 | "peer": true 1501 | }, 1502 | "node_modules/json-stable-stringify-without-jsonify": { 1503 | "version": "1.0.1", 1504 | "dev": true, 1505 | "license": "MIT", 1506 | "peer": true 1507 | }, 1508 | "node_modules/levn": { 1509 | "version": "0.4.1", 1510 | "dev": true, 1511 | "license": "MIT", 1512 | "peer": true, 1513 | "dependencies": { 1514 | "prelude-ls": "^1.2.1", 1515 | "type-check": "~0.4.0" 1516 | }, 1517 | "engines": { 1518 | "node": ">= 0.8.0" 1519 | } 1520 | }, 1521 | "node_modules/lodash.merge": { 1522 | "version": "4.6.2", 1523 | "dev": true, 1524 | "license": "MIT", 1525 | "peer": true 1526 | }, 1527 | "node_modules/lru-cache": { 1528 | "version": "6.0.0", 1529 | "dev": true, 1530 | "license": "ISC", 1531 | "dependencies": { 1532 | "yallist": "^4.0.0" 1533 | }, 1534 | "engines": { 1535 | "node": ">=10" 1536 | } 1537 | }, 1538 | "node_modules/merge2": { 1539 | "version": "1.4.1", 1540 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1541 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1542 | "dev": true, 1543 | "license": "MIT", 1544 | "engines": { 1545 | "node": ">= 8" 1546 | } 1547 | }, 1548 | "node_modules/micromatch": { 1549 | "version": "4.0.8", 1550 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1551 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1552 | "dev": true, 1553 | "license": "MIT", 1554 | "dependencies": { 1555 | "braces": "^3.0.3", 1556 | "picomatch": "^2.3.1" 1557 | }, 1558 | "engines": { 1559 | "node": ">=8.6" 1560 | } 1561 | }, 1562 | "node_modules/minimatch": { 1563 | "version": "3.1.2", 1564 | "dev": true, 1565 | "license": "ISC", 1566 | "peer": true, 1567 | "dependencies": { 1568 | "brace-expansion": "^1.1.7" 1569 | }, 1570 | "engines": { 1571 | "node": "*" 1572 | } 1573 | }, 1574 | "node_modules/moment": { 1575 | "version": "2.29.4", 1576 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 1577 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 1578 | "dev": true, 1579 | "license": "MIT", 1580 | "engines": { 1581 | "node": "*" 1582 | } 1583 | }, 1584 | "node_modules/ms": { 1585 | "version": "2.1.2", 1586 | "dev": true, 1587 | "license": "MIT" 1588 | }, 1589 | "node_modules/natural-compare": { 1590 | "version": "1.4.0", 1591 | "dev": true, 1592 | "license": "MIT", 1593 | "peer": true 1594 | }, 1595 | "node_modules/obsidian": { 1596 | "version": "1.7.2", 1597 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.7.2.tgz", 1598 | "integrity": "sha512-k9hN9brdknJC+afKr5FQzDRuEFGDKbDjfCazJwpgibwCAoZNYHYV8p/s3mM8I6AsnKrPKNXf8xGuMZ4enWelZQ==", 1599 | "dev": true, 1600 | "license": "MIT", 1601 | "dependencies": { 1602 | "@types/codemirror": "5.60.8", 1603 | "moment": "2.29.4" 1604 | }, 1605 | "peerDependencies": { 1606 | "@codemirror/state": "^6.0.0", 1607 | "@codemirror/view": "^6.0.0" 1608 | } 1609 | }, 1610 | "node_modules/once": { 1611 | "version": "1.4.0", 1612 | "dev": true, 1613 | "license": "ISC", 1614 | "peer": true, 1615 | "dependencies": { 1616 | "wrappy": "1" 1617 | } 1618 | }, 1619 | "node_modules/optionator": { 1620 | "version": "0.9.1", 1621 | "dev": true, 1622 | "license": "MIT", 1623 | "peer": true, 1624 | "dependencies": { 1625 | "deep-is": "^0.1.3", 1626 | "fast-levenshtein": "^2.0.6", 1627 | "levn": "^0.4.1", 1628 | "prelude-ls": "^1.2.1", 1629 | "type-check": "^0.4.0", 1630 | "word-wrap": "^1.2.3" 1631 | }, 1632 | "engines": { 1633 | "node": ">= 0.8.0" 1634 | } 1635 | }, 1636 | "node_modules/parent-module": { 1637 | "version": "1.0.1", 1638 | "dev": true, 1639 | "license": "MIT", 1640 | "peer": true, 1641 | "dependencies": { 1642 | "callsites": "^3.0.0" 1643 | }, 1644 | "engines": { 1645 | "node": ">=6" 1646 | } 1647 | }, 1648 | "node_modules/path-is-absolute": { 1649 | "version": "1.0.1", 1650 | "dev": true, 1651 | "license": "MIT", 1652 | "peer": true, 1653 | "engines": { 1654 | "node": ">=0.10.0" 1655 | } 1656 | }, 1657 | "node_modules/path-key": { 1658 | "version": "3.1.1", 1659 | "dev": true, 1660 | "license": "MIT", 1661 | "peer": true, 1662 | "engines": { 1663 | "node": ">=8" 1664 | } 1665 | }, 1666 | "node_modules/path-type": { 1667 | "version": "4.0.0", 1668 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1669 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1670 | "dev": true, 1671 | "license": "MIT", 1672 | "engines": { 1673 | "node": ">=8" 1674 | } 1675 | }, 1676 | "node_modules/picomatch": { 1677 | "version": "2.3.1", 1678 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1679 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1680 | "dev": true, 1681 | "license": "MIT", 1682 | "engines": { 1683 | "node": ">=8.6" 1684 | }, 1685 | "funding": { 1686 | "url": "https://github.com/sponsors/jonschlinkert" 1687 | } 1688 | }, 1689 | "node_modules/prelude-ls": { 1690 | "version": "1.2.1", 1691 | "dev": true, 1692 | "license": "MIT", 1693 | "peer": true, 1694 | "engines": { 1695 | "node": ">= 0.8.0" 1696 | } 1697 | }, 1698 | "node_modules/punycode": { 1699 | "version": "2.1.1", 1700 | "dev": true, 1701 | "license": "MIT", 1702 | "peer": true, 1703 | "engines": { 1704 | "node": ">=6" 1705 | } 1706 | }, 1707 | "node_modules/queue-microtask": { 1708 | "version": "1.2.3", 1709 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1710 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1711 | "dev": true, 1712 | "funding": [ 1713 | { 1714 | "type": "github", 1715 | "url": "https://github.com/sponsors/feross" 1716 | }, 1717 | { 1718 | "type": "patreon", 1719 | "url": "https://www.patreon.com/feross" 1720 | }, 1721 | { 1722 | "type": "consulting", 1723 | "url": "https://feross.org/support" 1724 | } 1725 | ], 1726 | "license": "MIT" 1727 | }, 1728 | "node_modules/regexpp": { 1729 | "version": "3.2.0", 1730 | "dev": true, 1731 | "license": "MIT", 1732 | "engines": { 1733 | "node": ">=8" 1734 | }, 1735 | "funding": { 1736 | "url": "https://github.com/sponsors/mysticatea" 1737 | } 1738 | }, 1739 | "node_modules/resolve-from": { 1740 | "version": "4.0.0", 1741 | "dev": true, 1742 | "license": "MIT", 1743 | "peer": true, 1744 | "engines": { 1745 | "node": ">=4" 1746 | } 1747 | }, 1748 | "node_modules/reusify": { 1749 | "version": "1.0.4", 1750 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1751 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1752 | "dev": true, 1753 | "license": "MIT", 1754 | "engines": { 1755 | "iojs": ">=1.0.0", 1756 | "node": ">=0.10.0" 1757 | } 1758 | }, 1759 | "node_modules/rimraf": { 1760 | "version": "3.0.2", 1761 | "dev": true, 1762 | "license": "ISC", 1763 | "peer": true, 1764 | "dependencies": { 1765 | "glob": "^7.1.3" 1766 | }, 1767 | "bin": { 1768 | "rimraf": "bin.js" 1769 | }, 1770 | "funding": { 1771 | "url": "https://github.com/sponsors/isaacs" 1772 | } 1773 | }, 1774 | "node_modules/run-parallel": { 1775 | "version": "1.2.0", 1776 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1777 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1778 | "dev": true, 1779 | "funding": [ 1780 | { 1781 | "type": "github", 1782 | "url": "https://github.com/sponsors/feross" 1783 | }, 1784 | { 1785 | "type": "patreon", 1786 | "url": "https://www.patreon.com/feross" 1787 | }, 1788 | { 1789 | "type": "consulting", 1790 | "url": "https://feross.org/support" 1791 | } 1792 | ], 1793 | "license": "MIT", 1794 | "dependencies": { 1795 | "queue-microtask": "^1.2.2" 1796 | } 1797 | }, 1798 | "node_modules/semver": { 1799 | "version": "7.3.7", 1800 | "dev": true, 1801 | "license": "ISC", 1802 | "dependencies": { 1803 | "lru-cache": "^6.0.0" 1804 | }, 1805 | "bin": { 1806 | "semver": "bin/semver.js" 1807 | }, 1808 | "engines": { 1809 | "node": ">=10" 1810 | } 1811 | }, 1812 | "node_modules/shebang-command": { 1813 | "version": "2.0.0", 1814 | "dev": true, 1815 | "license": "MIT", 1816 | "peer": true, 1817 | "dependencies": { 1818 | "shebang-regex": "^3.0.0" 1819 | }, 1820 | "engines": { 1821 | "node": ">=8" 1822 | } 1823 | }, 1824 | "node_modules/shebang-regex": { 1825 | "version": "3.0.0", 1826 | "dev": true, 1827 | "license": "MIT", 1828 | "peer": true, 1829 | "engines": { 1830 | "node": ">=8" 1831 | } 1832 | }, 1833 | "node_modules/slash": { 1834 | "version": "3.0.0", 1835 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1836 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1837 | "dev": true, 1838 | "license": "MIT", 1839 | "engines": { 1840 | "node": ">=8" 1841 | } 1842 | }, 1843 | "node_modules/strip-ansi": { 1844 | "version": "6.0.1", 1845 | "dev": true, 1846 | "license": "MIT", 1847 | "peer": true, 1848 | "dependencies": { 1849 | "ansi-regex": "^5.0.1" 1850 | }, 1851 | "engines": { 1852 | "node": ">=8" 1853 | } 1854 | }, 1855 | "node_modules/strip-json-comments": { 1856 | "version": "3.1.1", 1857 | "dev": true, 1858 | "license": "MIT", 1859 | "peer": true, 1860 | "engines": { 1861 | "node": ">=8" 1862 | }, 1863 | "funding": { 1864 | "url": "https://github.com/sponsors/sindresorhus" 1865 | } 1866 | }, 1867 | "node_modules/style-mod": { 1868 | "version": "4.1.2", 1869 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", 1870 | "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", 1871 | "dev": true, 1872 | "license": "MIT", 1873 | "peer": true 1874 | }, 1875 | "node_modules/supports-color": { 1876 | "version": "7.2.0", 1877 | "dev": true, 1878 | "license": "MIT", 1879 | "peer": true, 1880 | "dependencies": { 1881 | "has-flag": "^4.0.0" 1882 | }, 1883 | "engines": { 1884 | "node": ">=8" 1885 | } 1886 | }, 1887 | "node_modules/text-table": { 1888 | "version": "0.2.0", 1889 | "dev": true, 1890 | "license": "MIT", 1891 | "peer": true 1892 | }, 1893 | "node_modules/to-regex-range": { 1894 | "version": "5.0.1", 1895 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1896 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1897 | "dev": true, 1898 | "license": "MIT", 1899 | "dependencies": { 1900 | "is-number": "^7.0.0" 1901 | }, 1902 | "engines": { 1903 | "node": ">=8.0" 1904 | } 1905 | }, 1906 | "node_modules/tslib": { 1907 | "version": "2.4.0", 1908 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 1909 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 1910 | "dev": true, 1911 | "license": "0BSD" 1912 | }, 1913 | "node_modules/tsutils": { 1914 | "version": "3.21.0", 1915 | "dev": true, 1916 | "license": "MIT", 1917 | "dependencies": { 1918 | "tslib": "^1.8.1" 1919 | }, 1920 | "engines": { 1921 | "node": ">= 6" 1922 | }, 1923 | "peerDependencies": { 1924 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 1925 | } 1926 | }, 1927 | "node_modules/tsutils/node_modules/tslib": { 1928 | "version": "1.14.1", 1929 | "dev": true, 1930 | "license": "0BSD" 1931 | }, 1932 | "node_modules/type-check": { 1933 | "version": "0.4.0", 1934 | "dev": true, 1935 | "license": "MIT", 1936 | "peer": true, 1937 | "dependencies": { 1938 | "prelude-ls": "^1.2.1" 1939 | }, 1940 | "engines": { 1941 | "node": ">= 0.8.0" 1942 | } 1943 | }, 1944 | "node_modules/type-fest": { 1945 | "version": "0.20.2", 1946 | "dev": true, 1947 | "license": "(MIT OR CC0-1.0)", 1948 | "peer": true, 1949 | "engines": { 1950 | "node": ">=10" 1951 | }, 1952 | "funding": { 1953 | "url": "https://github.com/sponsors/sindresorhus" 1954 | } 1955 | }, 1956 | "node_modules/typescript": { 1957 | "version": "4.7.4", 1958 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 1959 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 1960 | "dev": true, 1961 | "license": "Apache-2.0", 1962 | "bin": { 1963 | "tsc": "bin/tsc", 1964 | "tsserver": "bin/tsserver" 1965 | }, 1966 | "engines": { 1967 | "node": ">=4.2.0" 1968 | } 1969 | }, 1970 | "node_modules/uri-js": { 1971 | "version": "4.4.1", 1972 | "dev": true, 1973 | "license": "BSD-2-Clause", 1974 | "peer": true, 1975 | "dependencies": { 1976 | "punycode": "^2.1.0" 1977 | } 1978 | }, 1979 | "node_modules/v8-compile-cache": { 1980 | "version": "2.3.0", 1981 | "dev": true, 1982 | "license": "MIT", 1983 | "peer": true 1984 | }, 1985 | "node_modules/w3c-keyname": { 1986 | "version": "2.2.8", 1987 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 1988 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 1989 | "dev": true, 1990 | "license": "MIT", 1991 | "peer": true 1992 | }, 1993 | "node_modules/which": { 1994 | "version": "2.0.2", 1995 | "dev": true, 1996 | "license": "ISC", 1997 | "peer": true, 1998 | "dependencies": { 1999 | "isexe": "^2.0.0" 2000 | }, 2001 | "bin": { 2002 | "node-which": "bin/node-which" 2003 | }, 2004 | "engines": { 2005 | "node": ">= 8" 2006 | } 2007 | }, 2008 | "node_modules/word-wrap": { 2009 | "version": "1.2.3", 2010 | "dev": true, 2011 | "license": "MIT", 2012 | "peer": true, 2013 | "engines": { 2014 | "node": ">=0.10.0" 2015 | } 2016 | }, 2017 | "node_modules/wrappy": { 2018 | "version": "1.0.2", 2019 | "dev": true, 2020 | "license": "ISC", 2021 | "peer": true 2022 | }, 2023 | "node_modules/yallist": { 2024 | "version": "4.0.0", 2025 | "dev": true, 2026 | "license": "ISC" 2027 | } 2028 | }, 2029 | "dependencies": { 2030 | "@codemirror/state": { 2031 | "version": "6.4.1", 2032 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", 2033 | "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", 2034 | "dev": true, 2035 | "peer": true 2036 | }, 2037 | "@codemirror/view": { 2038 | "version": "6.34.2", 2039 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.34.2.tgz", 2040 | "integrity": "sha512-d6n0WFvL970A9Z+l9N2dO+Hk9ev4hDYQzIx+B9tCyBP0W5wPEszi1rhuyFesNSkLZzXbQE5FPH7F/z/TMJfoPA==", 2041 | "dev": true, 2042 | "peer": true, 2043 | "requires": { 2044 | "@codemirror/state": "^6.4.0", 2045 | "style-mod": "^4.1.0", 2046 | "w3c-keyname": "^2.2.4" 2047 | } 2048 | }, 2049 | "@esbuild/android-arm": { 2050 | "version": "0.17.3", 2051 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", 2052 | "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", 2053 | "dev": true, 2054 | "optional": true 2055 | }, 2056 | "@esbuild/android-arm64": { 2057 | "version": "0.17.3", 2058 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", 2059 | "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", 2060 | "dev": true, 2061 | "optional": true 2062 | }, 2063 | "@esbuild/android-x64": { 2064 | "version": "0.17.3", 2065 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", 2066 | "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", 2067 | "dev": true, 2068 | "optional": true 2069 | }, 2070 | "@esbuild/darwin-arm64": { 2071 | "version": "0.17.3", 2072 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", 2073 | "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", 2074 | "dev": true, 2075 | "optional": true 2076 | }, 2077 | "@esbuild/darwin-x64": { 2078 | "version": "0.17.3", 2079 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", 2080 | "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", 2081 | "dev": true, 2082 | "optional": true 2083 | }, 2084 | "@esbuild/freebsd-arm64": { 2085 | "version": "0.17.3", 2086 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", 2087 | "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", 2088 | "dev": true, 2089 | "optional": true 2090 | }, 2091 | "@esbuild/freebsd-x64": { 2092 | "version": "0.17.3", 2093 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", 2094 | "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", 2095 | "dev": true, 2096 | "optional": true 2097 | }, 2098 | "@esbuild/linux-arm": { 2099 | "version": "0.17.3", 2100 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", 2101 | "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", 2102 | "dev": true, 2103 | "optional": true 2104 | }, 2105 | "@esbuild/linux-arm64": { 2106 | "version": "0.17.3", 2107 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", 2108 | "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", 2109 | "dev": true, 2110 | "optional": true 2111 | }, 2112 | "@esbuild/linux-ia32": { 2113 | "version": "0.17.3", 2114 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", 2115 | "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", 2116 | "dev": true, 2117 | "optional": true 2118 | }, 2119 | "@esbuild/linux-loong64": { 2120 | "version": "0.17.3", 2121 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", 2122 | "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", 2123 | "dev": true, 2124 | "optional": true 2125 | }, 2126 | "@esbuild/linux-mips64el": { 2127 | "version": "0.17.3", 2128 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", 2129 | "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", 2130 | "dev": true, 2131 | "optional": true 2132 | }, 2133 | "@esbuild/linux-ppc64": { 2134 | "version": "0.17.3", 2135 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", 2136 | "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", 2137 | "dev": true, 2138 | "optional": true 2139 | }, 2140 | "@esbuild/linux-riscv64": { 2141 | "version": "0.17.3", 2142 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", 2143 | "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", 2144 | "dev": true, 2145 | "optional": true 2146 | }, 2147 | "@esbuild/linux-s390x": { 2148 | "version": "0.17.3", 2149 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", 2150 | "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", 2151 | "dev": true, 2152 | "optional": true 2153 | }, 2154 | "@esbuild/linux-x64": { 2155 | "version": "0.17.3", 2156 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", 2157 | "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", 2158 | "dev": true, 2159 | "optional": true 2160 | }, 2161 | "@esbuild/netbsd-x64": { 2162 | "version": "0.17.3", 2163 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", 2164 | "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", 2165 | "dev": true, 2166 | "optional": true 2167 | }, 2168 | "@esbuild/openbsd-x64": { 2169 | "version": "0.17.3", 2170 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", 2171 | "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", 2172 | "dev": true, 2173 | "optional": true 2174 | }, 2175 | "@esbuild/sunos-x64": { 2176 | "version": "0.17.3", 2177 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", 2178 | "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", 2179 | "dev": true, 2180 | "optional": true 2181 | }, 2182 | "@esbuild/win32-arm64": { 2183 | "version": "0.17.3", 2184 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", 2185 | "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", 2186 | "dev": true, 2187 | "optional": true 2188 | }, 2189 | "@esbuild/win32-ia32": { 2190 | "version": "0.17.3", 2191 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", 2192 | "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", 2193 | "dev": true, 2194 | "optional": true 2195 | }, 2196 | "@esbuild/win32-x64": { 2197 | "version": "0.17.3", 2198 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", 2199 | "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", 2200 | "dev": true, 2201 | "optional": true 2202 | }, 2203 | "@eslint/eslintrc": { 2204 | "version": "1.2.2", 2205 | "dev": true, 2206 | "peer": true, 2207 | "requires": { 2208 | "ajv": "^6.12.4", 2209 | "debug": "^4.3.2", 2210 | "espree": "^9.3.1", 2211 | "globals": "^13.9.0", 2212 | "ignore": "^5.2.0", 2213 | "import-fresh": "^3.2.1", 2214 | "js-yaml": "^4.1.0", 2215 | "minimatch": "^3.0.4", 2216 | "strip-json-comments": "^3.1.1" 2217 | } 2218 | }, 2219 | "@humanwhocodes/config-array": { 2220 | "version": "0.9.5", 2221 | "dev": true, 2222 | "peer": true, 2223 | "requires": { 2224 | "@humanwhocodes/object-schema": "^1.2.1", 2225 | "debug": "^4.1.1", 2226 | "minimatch": "^3.0.4" 2227 | } 2228 | }, 2229 | "@humanwhocodes/object-schema": { 2230 | "version": "1.2.1", 2231 | "dev": true, 2232 | "peer": true 2233 | }, 2234 | "@nodelib/fs.scandir": { 2235 | "version": "2.1.5", 2236 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 2237 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 2238 | "dev": true, 2239 | "requires": { 2240 | "@nodelib/fs.stat": "2.0.5", 2241 | "run-parallel": "^1.1.9" 2242 | } 2243 | }, 2244 | "@nodelib/fs.stat": { 2245 | "version": "2.0.5", 2246 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 2247 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 2248 | "dev": true 2249 | }, 2250 | "@nodelib/fs.walk": { 2251 | "version": "1.2.8", 2252 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 2253 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 2254 | "dev": true, 2255 | "requires": { 2256 | "@nodelib/fs.scandir": "2.1.5", 2257 | "fastq": "^1.6.0" 2258 | } 2259 | }, 2260 | "@popperjs/core": { 2261 | "version": "2.11.5" 2262 | }, 2263 | "@types/codemirror": { 2264 | "version": "5.60.8", 2265 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 2266 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 2267 | "dev": true, 2268 | "requires": { 2269 | "@types/tern": "*" 2270 | } 2271 | }, 2272 | "@types/estree": { 2273 | "version": "1.0.6", 2274 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 2275 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 2276 | "dev": true 2277 | }, 2278 | "@types/json-schema": { 2279 | "version": "7.0.15", 2280 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 2281 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 2282 | "dev": true 2283 | }, 2284 | "@types/node": { 2285 | "version": "16.11.33", 2286 | "dev": true 2287 | }, 2288 | "@types/tern": { 2289 | "version": "0.23.9", 2290 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 2291 | "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 2292 | "dev": true, 2293 | "requires": { 2294 | "@types/estree": "*" 2295 | } 2296 | }, 2297 | "@typescript-eslint/eslint-plugin": { 2298 | "version": "5.29.0", 2299 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", 2300 | "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", 2301 | "dev": true, 2302 | "requires": { 2303 | "@typescript-eslint/scope-manager": "5.29.0", 2304 | "@typescript-eslint/type-utils": "5.29.0", 2305 | "@typescript-eslint/utils": "5.29.0", 2306 | "debug": "^4.3.4", 2307 | "functional-red-black-tree": "^1.0.1", 2308 | "ignore": "^5.2.0", 2309 | "regexpp": "^3.2.0", 2310 | "semver": "^7.3.7", 2311 | "tsutils": "^3.21.0" 2312 | } 2313 | }, 2314 | "@typescript-eslint/parser": { 2315 | "version": "5.29.0", 2316 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", 2317 | "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", 2318 | "dev": true, 2319 | "requires": { 2320 | "@typescript-eslint/scope-manager": "5.29.0", 2321 | "@typescript-eslint/types": "5.29.0", 2322 | "@typescript-eslint/typescript-estree": "5.29.0", 2323 | "debug": "^4.3.4" 2324 | } 2325 | }, 2326 | "@typescript-eslint/scope-manager": { 2327 | "version": "5.29.0", 2328 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", 2329 | "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", 2330 | "dev": true, 2331 | "requires": { 2332 | "@typescript-eslint/types": "5.29.0", 2333 | "@typescript-eslint/visitor-keys": "5.29.0" 2334 | } 2335 | }, 2336 | "@typescript-eslint/type-utils": { 2337 | "version": "5.29.0", 2338 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", 2339 | "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", 2340 | "dev": true, 2341 | "requires": { 2342 | "@typescript-eslint/utils": "5.29.0", 2343 | "debug": "^4.3.4", 2344 | "tsutils": "^3.21.0" 2345 | } 2346 | }, 2347 | "@typescript-eslint/types": { 2348 | "version": "5.29.0", 2349 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", 2350 | "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", 2351 | "dev": true 2352 | }, 2353 | "@typescript-eslint/typescript-estree": { 2354 | "version": "5.29.0", 2355 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", 2356 | "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", 2357 | "dev": true, 2358 | "requires": { 2359 | "@typescript-eslint/types": "5.29.0", 2360 | "@typescript-eslint/visitor-keys": "5.29.0", 2361 | "debug": "^4.3.4", 2362 | "globby": "^11.1.0", 2363 | "is-glob": "^4.0.3", 2364 | "semver": "^7.3.7", 2365 | "tsutils": "^3.21.0" 2366 | } 2367 | }, 2368 | "@typescript-eslint/utils": { 2369 | "version": "5.29.0", 2370 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", 2371 | "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", 2372 | "dev": true, 2373 | "requires": { 2374 | "@types/json-schema": "^7.0.9", 2375 | "@typescript-eslint/scope-manager": "5.29.0", 2376 | "@typescript-eslint/types": "5.29.0", 2377 | "@typescript-eslint/typescript-estree": "5.29.0", 2378 | "eslint-scope": "^5.1.1", 2379 | "eslint-utils": "^3.0.0" 2380 | } 2381 | }, 2382 | "@typescript-eslint/visitor-keys": { 2383 | "version": "5.29.0", 2384 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", 2385 | "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", 2386 | "dev": true, 2387 | "requires": { 2388 | "@typescript-eslint/types": "5.29.0", 2389 | "eslint-visitor-keys": "^3.3.0" 2390 | } 2391 | }, 2392 | "acorn": { 2393 | "version": "8.7.1", 2394 | "dev": true, 2395 | "peer": true 2396 | }, 2397 | "acorn-jsx": { 2398 | "version": "5.3.2", 2399 | "dev": true, 2400 | "peer": true, 2401 | "requires": {} 2402 | }, 2403 | "ajv": { 2404 | "version": "6.12.6", 2405 | "dev": true, 2406 | "peer": true, 2407 | "requires": { 2408 | "fast-deep-equal": "^3.1.1", 2409 | "fast-json-stable-stringify": "^2.0.0", 2410 | "json-schema-traverse": "^0.4.1", 2411 | "uri-js": "^4.2.2" 2412 | } 2413 | }, 2414 | "ansi-regex": { 2415 | "version": "5.0.1", 2416 | "dev": true, 2417 | "peer": true 2418 | }, 2419 | "ansi-styles": { 2420 | "version": "4.3.0", 2421 | "dev": true, 2422 | "peer": true, 2423 | "requires": { 2424 | "color-convert": "^2.0.1" 2425 | } 2426 | }, 2427 | "argparse": { 2428 | "version": "2.0.1", 2429 | "dev": true, 2430 | "peer": true 2431 | }, 2432 | "array-union": { 2433 | "version": "2.1.0", 2434 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 2435 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 2436 | "dev": true 2437 | }, 2438 | "balanced-match": { 2439 | "version": "1.0.2", 2440 | "dev": true, 2441 | "peer": true 2442 | }, 2443 | "brace-expansion": { 2444 | "version": "1.1.11", 2445 | "dev": true, 2446 | "peer": true, 2447 | "requires": { 2448 | "balanced-match": "^1.0.0", 2449 | "concat-map": "0.0.1" 2450 | } 2451 | }, 2452 | "braces": { 2453 | "version": "3.0.3", 2454 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 2455 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 2456 | "dev": true, 2457 | "requires": { 2458 | "fill-range": "^7.1.1" 2459 | } 2460 | }, 2461 | "builtin-modules": { 2462 | "version": "3.3.0", 2463 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 2464 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 2465 | "dev": true 2466 | }, 2467 | "callsites": { 2468 | "version": "3.1.0", 2469 | "dev": true, 2470 | "peer": true 2471 | }, 2472 | "chalk": { 2473 | "version": "4.1.2", 2474 | "dev": true, 2475 | "peer": true, 2476 | "requires": { 2477 | "ansi-styles": "^4.1.0", 2478 | "supports-color": "^7.1.0" 2479 | } 2480 | }, 2481 | "color-convert": { 2482 | "version": "2.0.1", 2483 | "dev": true, 2484 | "peer": true, 2485 | "requires": { 2486 | "color-name": "~1.1.4" 2487 | } 2488 | }, 2489 | "color-name": { 2490 | "version": "1.1.4", 2491 | "dev": true, 2492 | "peer": true 2493 | }, 2494 | "concat-map": { 2495 | "version": "0.0.1", 2496 | "dev": true, 2497 | "peer": true 2498 | }, 2499 | "cross-spawn": { 2500 | "version": "7.0.3", 2501 | "dev": true, 2502 | "peer": true, 2503 | "requires": { 2504 | "path-key": "^3.1.0", 2505 | "shebang-command": "^2.0.0", 2506 | "which": "^2.0.1" 2507 | } 2508 | }, 2509 | "debug": { 2510 | "version": "4.3.4", 2511 | "dev": true, 2512 | "requires": { 2513 | "ms": "2.1.2" 2514 | } 2515 | }, 2516 | "deep-is": { 2517 | "version": "0.1.4", 2518 | "dev": true, 2519 | "peer": true 2520 | }, 2521 | "dir-glob": { 2522 | "version": "3.0.1", 2523 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 2524 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 2525 | "dev": true, 2526 | "requires": { 2527 | "path-type": "^4.0.0" 2528 | } 2529 | }, 2530 | "doctrine": { 2531 | "version": "3.0.0", 2532 | "dev": true, 2533 | "peer": true, 2534 | "requires": { 2535 | "esutils": "^2.0.2" 2536 | } 2537 | }, 2538 | "esbuild": { 2539 | "version": "0.17.3", 2540 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", 2541 | "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", 2542 | "dev": true, 2543 | "requires": { 2544 | "@esbuild/android-arm": "0.17.3", 2545 | "@esbuild/android-arm64": "0.17.3", 2546 | "@esbuild/android-x64": "0.17.3", 2547 | "@esbuild/darwin-arm64": "0.17.3", 2548 | "@esbuild/darwin-x64": "0.17.3", 2549 | "@esbuild/freebsd-arm64": "0.17.3", 2550 | "@esbuild/freebsd-x64": "0.17.3", 2551 | "@esbuild/linux-arm": "0.17.3", 2552 | "@esbuild/linux-arm64": "0.17.3", 2553 | "@esbuild/linux-ia32": "0.17.3", 2554 | "@esbuild/linux-loong64": "0.17.3", 2555 | "@esbuild/linux-mips64el": "0.17.3", 2556 | "@esbuild/linux-ppc64": "0.17.3", 2557 | "@esbuild/linux-riscv64": "0.17.3", 2558 | "@esbuild/linux-s390x": "0.17.3", 2559 | "@esbuild/linux-x64": "0.17.3", 2560 | "@esbuild/netbsd-x64": "0.17.3", 2561 | "@esbuild/openbsd-x64": "0.17.3", 2562 | "@esbuild/sunos-x64": "0.17.3", 2563 | "@esbuild/win32-arm64": "0.17.3", 2564 | "@esbuild/win32-ia32": "0.17.3", 2565 | "@esbuild/win32-x64": "0.17.3" 2566 | } 2567 | }, 2568 | "escape-string-regexp": { 2569 | "version": "4.0.0", 2570 | "dev": true, 2571 | "peer": true 2572 | }, 2573 | "eslint": { 2574 | "version": "8.14.0", 2575 | "dev": true, 2576 | "peer": true, 2577 | "requires": { 2578 | "@eslint/eslintrc": "^1.2.2", 2579 | "@humanwhocodes/config-array": "^0.9.2", 2580 | "ajv": "^6.10.0", 2581 | "chalk": "^4.0.0", 2582 | "cross-spawn": "^7.0.2", 2583 | "debug": "^4.3.2", 2584 | "doctrine": "^3.0.0", 2585 | "escape-string-regexp": "^4.0.0", 2586 | "eslint-scope": "^7.1.1", 2587 | "eslint-utils": "^3.0.0", 2588 | "eslint-visitor-keys": "^3.3.0", 2589 | "espree": "^9.3.1", 2590 | "esquery": "^1.4.0", 2591 | "esutils": "^2.0.2", 2592 | "fast-deep-equal": "^3.1.3", 2593 | "file-entry-cache": "^6.0.1", 2594 | "functional-red-black-tree": "^1.0.1", 2595 | "glob-parent": "^6.0.1", 2596 | "globals": "^13.6.0", 2597 | "ignore": "^5.2.0", 2598 | "import-fresh": "^3.0.0", 2599 | "imurmurhash": "^0.1.4", 2600 | "is-glob": "^4.0.0", 2601 | "js-yaml": "^4.1.0", 2602 | "json-stable-stringify-without-jsonify": "^1.0.1", 2603 | "levn": "^0.4.1", 2604 | "lodash.merge": "^4.6.2", 2605 | "minimatch": "^3.0.4", 2606 | "natural-compare": "^1.4.0", 2607 | "optionator": "^0.9.1", 2608 | "regexpp": "^3.2.0", 2609 | "strip-ansi": "^6.0.1", 2610 | "strip-json-comments": "^3.1.0", 2611 | "text-table": "^0.2.0", 2612 | "v8-compile-cache": "^2.0.3" 2613 | }, 2614 | "dependencies": { 2615 | "eslint-scope": { 2616 | "version": "7.1.1", 2617 | "dev": true, 2618 | "peer": true, 2619 | "requires": { 2620 | "esrecurse": "^4.3.0", 2621 | "estraverse": "^5.2.0" 2622 | } 2623 | }, 2624 | "estraverse": { 2625 | "version": "5.3.0", 2626 | "dev": true, 2627 | "peer": true 2628 | } 2629 | } 2630 | }, 2631 | "eslint-scope": { 2632 | "version": "5.1.1", 2633 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 2634 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 2635 | "dev": true, 2636 | "requires": { 2637 | "esrecurse": "^4.3.0", 2638 | "estraverse": "^4.1.1" 2639 | } 2640 | }, 2641 | "eslint-utils": { 2642 | "version": "3.0.0", 2643 | "dev": true, 2644 | "requires": { 2645 | "eslint-visitor-keys": "^2.0.0" 2646 | }, 2647 | "dependencies": { 2648 | "eslint-visitor-keys": { 2649 | "version": "2.1.0", 2650 | "dev": true 2651 | } 2652 | } 2653 | }, 2654 | "eslint-visitor-keys": { 2655 | "version": "3.3.0", 2656 | "dev": true 2657 | }, 2658 | "espree": { 2659 | "version": "9.3.1", 2660 | "dev": true, 2661 | "peer": true, 2662 | "requires": { 2663 | "acorn": "^8.7.0", 2664 | "acorn-jsx": "^5.3.1", 2665 | "eslint-visitor-keys": "^3.3.0" 2666 | } 2667 | }, 2668 | "esquery": { 2669 | "version": "1.4.0", 2670 | "dev": true, 2671 | "peer": true, 2672 | "requires": { 2673 | "estraverse": "^5.1.0" 2674 | }, 2675 | "dependencies": { 2676 | "estraverse": { 2677 | "version": "5.3.0", 2678 | "dev": true, 2679 | "peer": true 2680 | } 2681 | } 2682 | }, 2683 | "esrecurse": { 2684 | "version": "4.3.0", 2685 | "dev": true, 2686 | "requires": { 2687 | "estraverse": "^5.2.0" 2688 | }, 2689 | "dependencies": { 2690 | "estraverse": { 2691 | "version": "5.3.0", 2692 | "dev": true 2693 | } 2694 | } 2695 | }, 2696 | "estraverse": { 2697 | "version": "4.3.0", 2698 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 2699 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 2700 | "dev": true 2701 | }, 2702 | "esutils": { 2703 | "version": "2.0.3", 2704 | "dev": true, 2705 | "peer": true 2706 | }, 2707 | "fast-deep-equal": { 2708 | "version": "3.1.3", 2709 | "dev": true, 2710 | "peer": true 2711 | }, 2712 | "fast-glob": { 2713 | "version": "3.3.2", 2714 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 2715 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 2716 | "dev": true, 2717 | "requires": { 2718 | "@nodelib/fs.stat": "^2.0.2", 2719 | "@nodelib/fs.walk": "^1.2.3", 2720 | "glob-parent": "^5.1.2", 2721 | "merge2": "^1.3.0", 2722 | "micromatch": "^4.0.4" 2723 | }, 2724 | "dependencies": { 2725 | "glob-parent": { 2726 | "version": "5.1.2", 2727 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2728 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2729 | "dev": true, 2730 | "requires": { 2731 | "is-glob": "^4.0.1" 2732 | } 2733 | } 2734 | } 2735 | }, 2736 | "fast-json-stable-stringify": { 2737 | "version": "2.1.0", 2738 | "dev": true, 2739 | "peer": true 2740 | }, 2741 | "fast-levenshtein": { 2742 | "version": "2.0.6", 2743 | "dev": true, 2744 | "peer": true 2745 | }, 2746 | "fastq": { 2747 | "version": "1.17.1", 2748 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 2749 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 2750 | "dev": true, 2751 | "requires": { 2752 | "reusify": "^1.0.4" 2753 | } 2754 | }, 2755 | "file-entry-cache": { 2756 | "version": "6.0.1", 2757 | "dev": true, 2758 | "peer": true, 2759 | "requires": { 2760 | "flat-cache": "^3.0.4" 2761 | } 2762 | }, 2763 | "fill-range": { 2764 | "version": "7.1.1", 2765 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2766 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2767 | "dev": true, 2768 | "requires": { 2769 | "to-regex-range": "^5.0.1" 2770 | } 2771 | }, 2772 | "flat-cache": { 2773 | "version": "3.0.4", 2774 | "dev": true, 2775 | "peer": true, 2776 | "requires": { 2777 | "flatted": "^3.1.0", 2778 | "rimraf": "^3.0.2" 2779 | } 2780 | }, 2781 | "flatted": { 2782 | "version": "3.2.5", 2783 | "dev": true, 2784 | "peer": true 2785 | }, 2786 | "fs.realpath": { 2787 | "version": "1.0.0", 2788 | "dev": true, 2789 | "peer": true 2790 | }, 2791 | "functional-red-black-tree": { 2792 | "version": "1.0.1", 2793 | "dev": true 2794 | }, 2795 | "glob": { 2796 | "version": "7.2.0", 2797 | "dev": true, 2798 | "peer": true, 2799 | "requires": { 2800 | "fs.realpath": "^1.0.0", 2801 | "inflight": "^1.0.4", 2802 | "inherits": "2", 2803 | "minimatch": "^3.0.4", 2804 | "once": "^1.3.0", 2805 | "path-is-absolute": "^1.0.0" 2806 | } 2807 | }, 2808 | "glob-parent": { 2809 | "version": "6.0.2", 2810 | "dev": true, 2811 | "peer": true, 2812 | "requires": { 2813 | "is-glob": "^4.0.3" 2814 | } 2815 | }, 2816 | "globals": { 2817 | "version": "13.13.0", 2818 | "dev": true, 2819 | "peer": true, 2820 | "requires": { 2821 | "type-fest": "^0.20.2" 2822 | } 2823 | }, 2824 | "globby": { 2825 | "version": "11.1.0", 2826 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 2827 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 2828 | "dev": true, 2829 | "requires": { 2830 | "array-union": "^2.1.0", 2831 | "dir-glob": "^3.0.1", 2832 | "fast-glob": "^3.2.9", 2833 | "ignore": "^5.2.0", 2834 | "merge2": "^1.4.1", 2835 | "slash": "^3.0.0" 2836 | } 2837 | }, 2838 | "has-flag": { 2839 | "version": "4.0.0", 2840 | "dev": true, 2841 | "peer": true 2842 | }, 2843 | "ignore": { 2844 | "version": "5.2.0", 2845 | "dev": true 2846 | }, 2847 | "import-fresh": { 2848 | "version": "3.3.0", 2849 | "dev": true, 2850 | "peer": true, 2851 | "requires": { 2852 | "parent-module": "^1.0.0", 2853 | "resolve-from": "^4.0.0" 2854 | } 2855 | }, 2856 | "imurmurhash": { 2857 | "version": "0.1.4", 2858 | "dev": true, 2859 | "peer": true 2860 | }, 2861 | "inflight": { 2862 | "version": "1.0.6", 2863 | "dev": true, 2864 | "peer": true, 2865 | "requires": { 2866 | "once": "^1.3.0", 2867 | "wrappy": "1" 2868 | } 2869 | }, 2870 | "inherits": { 2871 | "version": "2.0.4", 2872 | "dev": true, 2873 | "peer": true 2874 | }, 2875 | "is-extglob": { 2876 | "version": "2.1.1", 2877 | "dev": true 2878 | }, 2879 | "is-glob": { 2880 | "version": "4.0.3", 2881 | "dev": true, 2882 | "requires": { 2883 | "is-extglob": "^2.1.1" 2884 | } 2885 | }, 2886 | "is-number": { 2887 | "version": "7.0.0", 2888 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2889 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2890 | "dev": true 2891 | }, 2892 | "isexe": { 2893 | "version": "2.0.0", 2894 | "dev": true, 2895 | "peer": true 2896 | }, 2897 | "js-yaml": { 2898 | "version": "4.1.0", 2899 | "dev": true, 2900 | "peer": true, 2901 | "requires": { 2902 | "argparse": "^2.0.1" 2903 | } 2904 | }, 2905 | "json-schema-traverse": { 2906 | "version": "0.4.1", 2907 | "dev": true, 2908 | "peer": true 2909 | }, 2910 | "json-stable-stringify-without-jsonify": { 2911 | "version": "1.0.1", 2912 | "dev": true, 2913 | "peer": true 2914 | }, 2915 | "levn": { 2916 | "version": "0.4.1", 2917 | "dev": true, 2918 | "peer": true, 2919 | "requires": { 2920 | "prelude-ls": "^1.2.1", 2921 | "type-check": "~0.4.0" 2922 | } 2923 | }, 2924 | "lodash.merge": { 2925 | "version": "4.6.2", 2926 | "dev": true, 2927 | "peer": true 2928 | }, 2929 | "lru-cache": { 2930 | "version": "6.0.0", 2931 | "dev": true, 2932 | "requires": { 2933 | "yallist": "^4.0.0" 2934 | } 2935 | }, 2936 | "merge2": { 2937 | "version": "1.4.1", 2938 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2939 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2940 | "dev": true 2941 | }, 2942 | "micromatch": { 2943 | "version": "4.0.8", 2944 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 2945 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2946 | "dev": true, 2947 | "requires": { 2948 | "braces": "^3.0.3", 2949 | "picomatch": "^2.3.1" 2950 | } 2951 | }, 2952 | "minimatch": { 2953 | "version": "3.1.2", 2954 | "dev": true, 2955 | "peer": true, 2956 | "requires": { 2957 | "brace-expansion": "^1.1.7" 2958 | } 2959 | }, 2960 | "moment": { 2961 | "version": "2.29.4", 2962 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 2963 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 2964 | "dev": true 2965 | }, 2966 | "ms": { 2967 | "version": "2.1.2", 2968 | "dev": true 2969 | }, 2970 | "natural-compare": { 2971 | "version": "1.4.0", 2972 | "dev": true, 2973 | "peer": true 2974 | }, 2975 | "obsidian": { 2976 | "version": "1.7.2", 2977 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.7.2.tgz", 2978 | "integrity": "sha512-k9hN9brdknJC+afKr5FQzDRuEFGDKbDjfCazJwpgibwCAoZNYHYV8p/s3mM8I6AsnKrPKNXf8xGuMZ4enWelZQ==", 2979 | "dev": true, 2980 | "requires": { 2981 | "@types/codemirror": "5.60.8", 2982 | "moment": "2.29.4" 2983 | } 2984 | }, 2985 | "once": { 2986 | "version": "1.4.0", 2987 | "dev": true, 2988 | "peer": true, 2989 | "requires": { 2990 | "wrappy": "1" 2991 | } 2992 | }, 2993 | "optionator": { 2994 | "version": "0.9.1", 2995 | "dev": true, 2996 | "peer": true, 2997 | "requires": { 2998 | "deep-is": "^0.1.3", 2999 | "fast-levenshtein": "^2.0.6", 3000 | "levn": "^0.4.1", 3001 | "prelude-ls": "^1.2.1", 3002 | "type-check": "^0.4.0", 3003 | "word-wrap": "^1.2.3" 3004 | } 3005 | }, 3006 | "parent-module": { 3007 | "version": "1.0.1", 3008 | "dev": true, 3009 | "peer": true, 3010 | "requires": { 3011 | "callsites": "^3.0.0" 3012 | } 3013 | }, 3014 | "path-is-absolute": { 3015 | "version": "1.0.1", 3016 | "dev": true, 3017 | "peer": true 3018 | }, 3019 | "path-key": { 3020 | "version": "3.1.1", 3021 | "dev": true, 3022 | "peer": true 3023 | }, 3024 | "path-type": { 3025 | "version": "4.0.0", 3026 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 3027 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 3028 | "dev": true 3029 | }, 3030 | "picomatch": { 3031 | "version": "2.3.1", 3032 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3033 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3034 | "dev": true 3035 | }, 3036 | "prelude-ls": { 3037 | "version": "1.2.1", 3038 | "dev": true, 3039 | "peer": true 3040 | }, 3041 | "punycode": { 3042 | "version": "2.1.1", 3043 | "dev": true, 3044 | "peer": true 3045 | }, 3046 | "queue-microtask": { 3047 | "version": "1.2.3", 3048 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 3049 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 3050 | "dev": true 3051 | }, 3052 | "regexpp": { 3053 | "version": "3.2.0", 3054 | "dev": true 3055 | }, 3056 | "resolve-from": { 3057 | "version": "4.0.0", 3058 | "dev": true, 3059 | "peer": true 3060 | }, 3061 | "reusify": { 3062 | "version": "1.0.4", 3063 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3064 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3065 | "dev": true 3066 | }, 3067 | "rimraf": { 3068 | "version": "3.0.2", 3069 | "dev": true, 3070 | "peer": true, 3071 | "requires": { 3072 | "glob": "^7.1.3" 3073 | } 3074 | }, 3075 | "run-parallel": { 3076 | "version": "1.2.0", 3077 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 3078 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 3079 | "dev": true, 3080 | "requires": { 3081 | "queue-microtask": "^1.2.2" 3082 | } 3083 | }, 3084 | "semver": { 3085 | "version": "7.3.7", 3086 | "dev": true, 3087 | "requires": { 3088 | "lru-cache": "^6.0.0" 3089 | } 3090 | }, 3091 | "shebang-command": { 3092 | "version": "2.0.0", 3093 | "dev": true, 3094 | "peer": true, 3095 | "requires": { 3096 | "shebang-regex": "^3.0.0" 3097 | } 3098 | }, 3099 | "shebang-regex": { 3100 | "version": "3.0.0", 3101 | "dev": true, 3102 | "peer": true 3103 | }, 3104 | "slash": { 3105 | "version": "3.0.0", 3106 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3107 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3108 | "dev": true 3109 | }, 3110 | "strip-ansi": { 3111 | "version": "6.0.1", 3112 | "dev": true, 3113 | "peer": true, 3114 | "requires": { 3115 | "ansi-regex": "^5.0.1" 3116 | } 3117 | }, 3118 | "strip-json-comments": { 3119 | "version": "3.1.1", 3120 | "dev": true, 3121 | "peer": true 3122 | }, 3123 | "style-mod": { 3124 | "version": "4.1.2", 3125 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", 3126 | "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", 3127 | "dev": true, 3128 | "peer": true 3129 | }, 3130 | "supports-color": { 3131 | "version": "7.2.0", 3132 | "dev": true, 3133 | "peer": true, 3134 | "requires": { 3135 | "has-flag": "^4.0.0" 3136 | } 3137 | }, 3138 | "text-table": { 3139 | "version": "0.2.0", 3140 | "dev": true, 3141 | "peer": true 3142 | }, 3143 | "to-regex-range": { 3144 | "version": "5.0.1", 3145 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3146 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3147 | "dev": true, 3148 | "requires": { 3149 | "is-number": "^7.0.0" 3150 | } 3151 | }, 3152 | "tslib": { 3153 | "version": "2.4.0", 3154 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 3155 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 3156 | "dev": true 3157 | }, 3158 | "tsutils": { 3159 | "version": "3.21.0", 3160 | "dev": true, 3161 | "requires": { 3162 | "tslib": "^1.8.1" 3163 | }, 3164 | "dependencies": { 3165 | "tslib": { 3166 | "version": "1.14.1", 3167 | "dev": true 3168 | } 3169 | } 3170 | }, 3171 | "type-check": { 3172 | "version": "0.4.0", 3173 | "dev": true, 3174 | "peer": true, 3175 | "requires": { 3176 | "prelude-ls": "^1.2.1" 3177 | } 3178 | }, 3179 | "type-fest": { 3180 | "version": "0.20.2", 3181 | "dev": true, 3182 | "peer": true 3183 | }, 3184 | "typescript": { 3185 | "version": "4.7.4", 3186 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 3187 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 3188 | "dev": true 3189 | }, 3190 | "uri-js": { 3191 | "version": "4.4.1", 3192 | "dev": true, 3193 | "peer": true, 3194 | "requires": { 3195 | "punycode": "^2.1.0" 3196 | } 3197 | }, 3198 | "v8-compile-cache": { 3199 | "version": "2.3.0", 3200 | "dev": true, 3201 | "peer": true 3202 | }, 3203 | "w3c-keyname": { 3204 | "version": "2.2.8", 3205 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 3206 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 3207 | "dev": true, 3208 | "peer": true 3209 | }, 3210 | "which": { 3211 | "version": "2.0.2", 3212 | "dev": true, 3213 | "peer": true, 3214 | "requires": { 3215 | "isexe": "^2.0.0" 3216 | } 3217 | }, 3218 | "word-wrap": { 3219 | "version": "1.2.3", 3220 | "dev": true, 3221 | "peer": true 3222 | }, 3223 | "wrappy": { 3224 | "version": "1.0.2", 3225 | "dev": true, 3226 | "peer": true 3227 | }, 3228 | "yallist": { 3229 | "version": "4.0.0", 3230 | "dev": true 3231 | } 3232 | } 3233 | } 3234 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-user-plugins", 3 | "version": "1.4.0", 4 | "description": "Use ts and js modules or js snippets to code your own plugins", 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 | }, 11 | "keywords": [ 12 | "obsidian", 13 | "obsidian-md", 14 | "obsidian-plugin", 15 | "obsidian-md-plugin" 16 | ], 17 | "author": "mnowotnik", 18 | "license": "MIT", 19 | "devDependencies": { 20 | "@types/node": "^16.11.6", 21 | "@typescript-eslint/eslint-plugin": "5.29.0", 22 | "@typescript-eslint/parser": "5.29.0", 23 | "builtin-modules": "^3.3.0", 24 | "esbuild": "0.17.3", 25 | "obsidian": "^1.7.2", 26 | "tslib": "2.4.0", 27 | "typescript": "4.7.4" 28 | }, 29 | "dependencies": { 30 | "@popperjs/core": "^2.11.2" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/helpers/Helpers.ts: -------------------------------------------------------------------------------- 1 | import { 2 | App, 3 | Notice, 4 | PaneType, 5 | SplitDirection, 6 | TFile, 7 | TFolder, 8 | WorkspaceLeaf, 9 | } from "obsidian"; 10 | import { suggest } from "./Suggester"; 11 | 12 | export class Helpers { 13 | constructor(private app: App) {} 14 | 15 | suggest( 16 | itemLabels: string[] | ((item: T) => string), 17 | items: T[], 18 | placeholder?: string, 19 | limit?: number 20 | ) { 21 | return suggest(this.app, itemLabels, items, placeholder || "", limit); 22 | } 23 | 24 | notify(message: string, time: number = 5000) { 25 | new Notice(message, time); 26 | } 27 | 28 | getAllFolders() { 29 | return this.app.vault 30 | .getAllLoadedFiles() 31 | .filter((f) => f instanceof TFolder) 32 | .map((folder) => folder.path); 33 | } 34 | 35 | async openFile( 36 | file: TFile, 37 | params: { 38 | paneType?: PaneType; 39 | openInNewTab?: boolean; 40 | direction?: SplitDirection; 41 | mode?: "source" | "preview" | "default"; 42 | focus?: boolean; 43 | } = {} 44 | ) { 45 | let leaf: WorkspaceLeaf; 46 | 47 | if (params.paneType === "split") { 48 | leaf = this.app.workspace.getLeaf( 49 | params.paneType, 50 | params.direction 51 | ); 52 | } else { 53 | leaf = this.app.workspace.getLeaf(params.paneType); 54 | } 55 | 56 | if (params.mode) { 57 | await leaf.openFile(file, { state: { mode: params.mode } }); 58 | } else { 59 | await leaf.openFile(file); 60 | } 61 | 62 | if (params.focus) { 63 | this.app.workspace.setActiveLeaf(leaf, { focus: true }); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/helpers/Suggester.ts: -------------------------------------------------------------------------------- 1 | import { App, FuzzyMatch, FuzzySuggestModal } from "obsidian"; 2 | 3 | class SuggesterModal extends FuzzySuggestModal { 4 | private resolved = false; 5 | constructor( 6 | app: App, 7 | private textItems: string[] | ((item: T) => string), 8 | private items: T[], 9 | private resolve: (value: unknown) => void, 10 | private reject: (reason?: any) => void, 11 | placeholder: string, 12 | limit?: number 13 | ) { 14 | super(app); 15 | this.setPlaceholder(placeholder); 16 | this.limit = limit || 20; 17 | } 18 | 19 | getItems(): T[] { 20 | return this.items; 21 | } 22 | 23 | getItemText(item: T): string { 24 | if (this.textItems instanceof Function) { 25 | return this.textItems(item); 26 | } 27 | return this.textItems[this.items.indexOf(item)] || "Undefined"; 28 | } 29 | 30 | onChooseItem(item: T, evt: MouseEvent | KeyboardEvent) { 31 | this.resolved = true; 32 | this.resolve(item); 33 | } 34 | 35 | selectSuggestion( 36 | value: FuzzyMatch, 37 | evt: MouseEvent | KeyboardEvent 38 | ): void { 39 | this.onChooseSuggestion(value, evt); 40 | this.close(); 41 | } 42 | 43 | onClose(): void { 44 | if (!this.resolved) { 45 | this.reject("Modal cancelled"); 46 | } 47 | } 48 | 49 | onChooseSuggestion( 50 | item: FuzzyMatch, 51 | evt: MouseEvent | KeyboardEvent 52 | ): void { 53 | this.onChooseItem(item.item, evt); 54 | } 55 | } 56 | 57 | export async function suggest( 58 | app: App, 59 | itemLabels: string[] | ((item: T) => string), 60 | items: T[], 61 | placeholder: string, 62 | limit?: number 63 | ) { 64 | return new Promise((resolve, reject) => { 65 | new SuggesterModal( 66 | app, 67 | itemLabels, 68 | items, 69 | resolve, 70 | reject, 71 | placeholder, 72 | limit 73 | ).open(); 74 | }); 75 | } 76 | -------------------------------------------------------------------------------- /src/loaders/cjsModuleLoader.ts: -------------------------------------------------------------------------------- 1 | import * as obsidian from "obsidian"; 2 | import { App, Notice, Plugin, PluginManifest, TFile } from "obsidian"; 3 | import UserPlugins from "src/main"; 4 | import { Settings } from "src/settings/Settings"; 5 | import { UserPluginError } from "src/settings/utils/Error"; 6 | import { resolve_tfile } from "src/settings/utils/Utils"; 7 | import { Loader } from "./loader"; 8 | 9 | interface UserCjsModule { 10 | exports?: { 11 | onload?: (plugin?: UserPlugins) => Promise; 12 | onunload?: (plugin?: UserPlugins) => Promise; 13 | default?: new (app: App, pluginManifest: PluginManifest) => Plugin; 14 | }; 15 | } 16 | 17 | interface UserModule { 18 | onload: (plugin?: UserPlugins) => Promise; 19 | onunload?: (plugin?: UserPlugins) => Promise; 20 | } 21 | 22 | interface UserModuleOrPlugin { 23 | object: UserModule | Plugin; 24 | type: "module" | "plugin"; 25 | } 26 | 27 | export default class CjsModuleLoader implements Loader { 28 | modulesWithUnload: Array<[string, UserModuleOrPlugin]> = []; 29 | app: obsidian.App; 30 | 31 | constructor(private plugin: UserPlugins, private settings: Settings) { 32 | this.app = plugin.app; 33 | } 34 | 35 | async onload() { 36 | try { 37 | await this.runJsModules(); 38 | await this.runSnippets(); 39 | } catch (e) { 40 | Error.captureStackTrace(e); 41 | this.logScriptError(`Failed with error: ${e.message}`, e); 42 | } 43 | } 44 | 45 | async runSnippet(snippet: string, idx: number) { 46 | try { 47 | Function("plugin", "require", snippet)(this.plugin, require); 48 | } catch (e) { 49 | Error.captureStackTrace(e); 50 | new Notice( 51 | `obsidian-user-plugins: error running snippet no.${idx}`, 52 | 5000 53 | ); 54 | this.logScriptError( 55 | `Error running snippet no.${idx}: ${e.message}`, 56 | e 57 | ); 58 | } 59 | } 60 | 61 | async runSnippets() { 62 | let count = 0; 63 | for (const script of this.settings.snippets) { 64 | await this.runSnippet(script, count); 65 | count++; 66 | } 67 | } 68 | 69 | async runJsModule(path: string) { 70 | if (!path && path === "") { 71 | return; 72 | } 73 | let file: TFile; 74 | try { 75 | file = resolve_tfile(this.app, path); 76 | } catch (e) { 77 | if (e instanceof UserPluginError) { 78 | this.logError(`Error resolving file ${path}: ${e.message}`); 79 | new Notice("obsidian-user-plugins: " + e.message, 5000); 80 | return; 81 | } 82 | this.logError(`Error: ${e}`); 83 | return; 84 | } 85 | const userModule: UserCjsModule = {}; 86 | try { 87 | Function( 88 | "module", 89 | "require", 90 | await this.app.vault.read(file) 91 | )(userModule, require); 92 | } catch (e) { 93 | Error.captureStackTrace(e); 94 | this.logScriptError( 95 | `${file.path} evaluation error: ${e.message}`, 96 | e 97 | ); 98 | new Notice( 99 | "obsidian-user-plugins: cannot evaluate: " + file.path, 100 | 5000 101 | ); 102 | return; 103 | } 104 | 105 | try { 106 | if (!userModule.exports) { 107 | console.log( 108 | "[obsidian-user-plugins] no exports found in " + file.path 109 | ); 110 | return; 111 | } 112 | if (userModule.exports.onload) { 113 | await userModule.exports.onload(this.plugin); 114 | if (userModule.exports.onunload) { 115 | this.modulesWithUnload.push([ 116 | file.path, 117 | { 118 | type: "module", 119 | object: { 120 | onunload: userModule.exports.onunload, 121 | onload: userModule.exports.onload, 122 | }, 123 | }, 124 | ]); 125 | } 126 | } else if (userModule.exports.default) { 127 | const userPlugin = new userModule.exports.default( 128 | this.app, 129 | this.plugin.manifest 130 | ); 131 | await userPlugin.onload(); 132 | this.modulesWithUnload.push([ 133 | file.path, 134 | { type: "plugin", object: userPlugin }, 135 | ]); 136 | } 137 | } catch (e) { 138 | Error.captureStackTrace(e); 139 | this.logScriptError(`${file.path}.onload error: ${e.message}`, e); 140 | new Notice( 141 | "obsidian-user-plugins: error in onload: " + file.path, 142 | 5000 143 | ); 144 | return; 145 | } 146 | } 147 | 148 | async runOnunload(path: string) { 149 | const toRemove: Array = []; 150 | await Promise.all( 151 | this.modulesWithUnload 152 | .filter(([p, _]) => p === path) 153 | .map(async ([path, userModule], idx) => { 154 | await this.runOnunloadOfUserModule(path, userModule); 155 | toRemove.push(idx); 156 | }) 157 | ); 158 | 159 | toRemove 160 | .slice() 161 | .reverse() 162 | .forEach((idx) => this.modulesWithUnload.splice(idx, 1)); 163 | } 164 | 165 | private async runJsModules() { 166 | for (const path of this.settings.enabledScripts) { 167 | await this.runJsModule(path); 168 | } 169 | } 170 | 171 | private logScriptError(msg: string, error: Error) { 172 | this.logError(`${msg}. stacktrace: ${error.stack}`); 173 | } 174 | 175 | private logError(msg: string) { 176 | console.error(`[obsidian-user-plugins] ${msg}`); 177 | } 178 | 179 | private async runOnunloadOfUserModule( 180 | path: string, 181 | userModule: UserModuleOrPlugin 182 | ) { 183 | try { 184 | if (userModule.object.onunload) { 185 | if (userModule.type === "plugin") { 186 | await userModule.object.onunload(); 187 | } else { 188 | await userModule.object.onunload(this.plugin); 189 | } 190 | } 191 | } catch (e) { 192 | Error.captureStackTrace(e); 193 | this.logScriptError( 194 | `Error running ${path}.onunload: ${e.message}`, 195 | e 196 | ); 197 | new Notice( 198 | "obsidian-user-plugins: error in onunload: " + path, 199 | 5000 200 | ); 201 | } 202 | } 203 | 204 | async onunload() { 205 | for (const [path, userModule] of this.modulesWithUnload) { 206 | await this.runOnunloadOfUserModule(path, userModule); 207 | } 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /src/loaders/loader.ts: -------------------------------------------------------------------------------- 1 | export interface Loader { 2 | onload(): Promise; 3 | onunload(): Promise; 4 | } 5 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from "obsidian"; 2 | import CjsModuleLoader from "./loaders/cjsModuleLoader"; 3 | import * as obsidian from "obsidian"; 4 | import { SettingsManager, SettingTab } from "./settings/Settings"; 5 | import { Helpers } from "./helpers/Helpers"; 6 | 7 | export default class UserPlugins extends Plugin { 8 | api: Helpers; 9 | /** 10 | * @deprecated 11 | */ 12 | passedModules: Record; 13 | /** 14 | * @deprecated 15 | */ 16 | helpers: Helpers; 17 | private commonJsModuleLoader: CjsModuleLoader; 18 | private settingsManager: SettingsManager; 19 | 20 | async onload() { 21 | this.settingsManager = new SettingsManager(this, await this.loadData()); 22 | this.commonJsModuleLoader = new CjsModuleLoader( 23 | this, 24 | this.settingsManager.settings 25 | ); 26 | 27 | this.passedModules = { obsidian }; 28 | this.helpers = new Helpers(this.app); 29 | this.api = new Helpers(this.app); 30 | this.addSettingTab( 31 | new SettingTab({ 32 | settingsManager: this.settingsManager, 33 | cjsModuleRunner: this.commonJsModuleLoader, 34 | app: this.app, 35 | plugin: this, 36 | }) 37 | ); 38 | 39 | // wait for vault files to load 40 | // FIXME maybe there's a better hook 41 | this.app.workspace.onLayoutReady(async () => { 42 | try { 43 | await this.commonJsModuleLoader.onload(); 44 | } catch (e) { 45 | Error.captureStackTrace(e); 46 | this.logScriptError(`Failed with error: ${e.message}`, e); 47 | } 48 | }); 49 | } 50 | 51 | private logScriptError(msg: string, error: Error) { 52 | this.logError(`${msg}. stacktrace: ${error.stack}`); 53 | } 54 | 55 | private logError(msg: string) { 56 | console.error(`[obsidian-user-plugins] ${msg}`); 57 | } 58 | 59 | async onunload() { 60 | await this.commonJsModuleLoader.onunload(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/settings/Settings.ts: -------------------------------------------------------------------------------- 1 | import { App, Notice, PluginSettingTab, Setting, TFile } from "obsidian"; 2 | import CjsModuleLoader from "src/loaders/cjsModuleLoader"; 3 | import UserPlugins from "../main"; 4 | import FolderSuggester from "./suggesters/FolderSuggester"; 5 | import { get_tfiles_from_folder } from "./utils/Utils"; 6 | 7 | export interface Settings { 8 | snippets: Array; 9 | scriptsFolder: string; 10 | enabledScripts: Array; 11 | } 12 | 13 | export const DEFAULT_SETTINGS: Settings = { 14 | snippets: [""], 15 | scriptsFolder: "", 16 | enabledScripts: [""], 17 | }; 18 | 19 | export class SettingsManager { 20 | settings: Settings; 21 | constructor(private plugin: UserPlugins, pluginData: any) { 22 | this.loadSettings(pluginData); 23 | } 24 | 25 | private async loadSettings(pluginData: any) { 26 | this.settings = Object.assign({}, DEFAULT_SETTINGS, pluginData); 27 | } 28 | 29 | async saveSettings() { 30 | await this.plugin.saveData(this.settings); 31 | } 32 | } 33 | 34 | interface Args { 35 | app: App; 36 | plugin: UserPlugins; 37 | settingsManager: SettingsManager; 38 | cjsModuleRunner: CjsModuleLoader; 39 | } 40 | 41 | export class SettingTab extends PluginSettingTab { 42 | cjsModuleRunner: CjsModuleLoader; 43 | settingsManager: SettingsManager; 44 | 45 | constructor({ app, plugin, settingsManager, cjsModuleRunner }: Args) { 46 | super(app, plugin); 47 | this.cjsModuleRunner = cjsModuleRunner; 48 | this.settingsManager = settingsManager; 49 | } 50 | 51 | display(): void { 52 | const { containerEl } = this; 53 | 54 | containerEl.empty(); 55 | this.addScriptFolderSetting(); 56 | this.addUserScriptsListSetting(); 57 | this.addSnippetsSetting(); 58 | } 59 | 60 | addUserScriptsListSetting(): void { 61 | if (!this.settingsManager.settings.scriptsFolder) { 62 | new Setting(this.containerEl) 63 | .setName("No user scripts folder set") 64 | .addExtraButton((extra) => { 65 | extra 66 | .setIcon("sync") 67 | .setTooltip("Refresh") 68 | .onClick(() => { 69 | this.display(); 70 | }); 71 | }); 72 | return; 73 | } 74 | let name: string; 75 | let files: Array = []; 76 | try { 77 | files = get_tfiles_from_folder( 78 | this.app, 79 | this.settingsManager.settings.scriptsFolder 80 | ); 81 | files = files.filter( 82 | (f) => f.path.contains("node_modules") == false 83 | ); 84 | } catch (e) { 85 | console.error(`Failed to read user scripts folder: ${e.message}`); 86 | new Notice("Failed to read user scripts folder"); 87 | } 88 | 89 | if (files.length == 0) { 90 | name = "No user scripts found"; 91 | } else { 92 | const added = this.addUserScriptEntries(files); 93 | if (added == 0) { 94 | name = "No user scripts found"; 95 | } else { 96 | name = `Found ${added} user scripts`; 97 | } 98 | } 99 | 100 | new Setting(this.containerEl).setName(name).addExtraButton((extra) => { 101 | extra 102 | .setIcon("sync") 103 | .setTooltip("Refresh") 104 | .onClick(() => { 105 | this.display(); 106 | }); 107 | }); 108 | } 109 | 110 | addUserScriptEntries(files: Array): number { 111 | let added = 0; 112 | const enabled = this.settingsManager.settings.enabledScripts; 113 | const absentFilesToRemove = [...enabled]; 114 | for (const file of files) { 115 | if (file.extension === "js") { 116 | new Setting(this.containerEl) 117 | .setName(file.name) 118 | .setDesc("Enable this script") 119 | .addToggle((cb) => { 120 | cb.setValue(enabled.includes(file.path)).onChange( 121 | (newValue) => { 122 | const idx = enabled.indexOf(file.path); 123 | if (newValue && idx == -1) { 124 | enabled.push(file.path); 125 | } else if (!newValue && idx > -1) { 126 | enabled.splice(idx, 1); 127 | } 128 | this.settingsManager.saveSettings(); 129 | this.display(); 130 | if (newValue) { 131 | this.cjsModuleRunner.runJsModule(file.path); 132 | } else { 133 | this.cjsModuleRunner.runOnunload(file.path); 134 | } 135 | } 136 | ); 137 | }); 138 | added++; 139 | } 140 | if (enabled.includes(file.path)) { 141 | absentFilesToRemove.remove(file.path); 142 | } 143 | } 144 | if (absentFilesToRemove.length > 0) { 145 | for (const file of absentFilesToRemove) { 146 | enabled.remove(file); 147 | } 148 | this.settingsManager.saveSettings(); 149 | } 150 | return added; 151 | } 152 | 153 | addSnippetsSetting(): void { 154 | const { containerEl } = this; 155 | containerEl.createEl("h2", { text: "Snippets" }); 156 | 157 | const scripts = this.settingsManager.settings.snippets; 158 | this.settingsManager.settings.snippets.forEach((_, idx) => { 159 | const setting = new Setting(this.containerEl) 160 | .addExtraButton((extra) => { 161 | extra 162 | .setIcon("right-arrow") 163 | .setTooltip("Run snippet") 164 | .onClick(() => { 165 | const script = scripts[idx]; 166 | this.cjsModuleRunner.runSnippet(script, idx); 167 | }); 168 | }) 169 | .addTextArea((text) => { 170 | const t = text 171 | .setPlaceholder("User script") 172 | .setValue(scripts[idx]) 173 | .onChange((new_script) => { 174 | const script = scripts[idx]; 175 | const index = 176 | this.settingsManager.settings.snippets.indexOf( 177 | script 178 | ); 179 | if (index > -1) { 180 | this.settingsManager.settings.snippets[index] = 181 | new_script; 182 | this.settingsManager.saveSettings(); 183 | } 184 | }); 185 | 186 | t.inputEl.setAttr("rows", 5); 187 | t.inputEl.addClass("obsidian_user_plugins_snippet"); 188 | return t; 189 | }) 190 | .addExtraButton((extra) => { 191 | extra 192 | .setIcon("cross") 193 | .setTooltip("Delete") 194 | .onClick(() => { 195 | const script = scripts[idx]; 196 | const index = 197 | this.settingsManager.settings.snippets.indexOf( 198 | script 199 | ); 200 | if (index > -1) { 201 | this.settingsManager.settings.snippets.splice( 202 | index, 203 | 1 204 | ); 205 | this.settingsManager.saveSettings(); 206 | this.display(); 207 | } 208 | }); 209 | }); 210 | setting.infoEl.remove(); 211 | }); 212 | const setting = new Setting(this.containerEl).addButton((button) => { 213 | button 214 | .setButtonText("Add new user script") 215 | .setCta() 216 | .onClick(() => { 217 | this.settingsManager.settings.snippets.push(""); 218 | this.settingsManager.saveSettings(); 219 | this.display(); 220 | }); 221 | }); 222 | setting.infoEl.remove(); 223 | } 224 | 225 | addScriptFolderSetting(): void { 226 | this.containerEl.createEl("h2", { text: "Scripts" }); 227 | new Setting(this.containerEl) 228 | .setName("Scripts folder location") 229 | .setDesc("Files in this folder can be run on Obsidian startup") 230 | .addSearch((cb) => { 231 | new FolderSuggester(this.app, cb.inputEl); 232 | cb.setPlaceholder("Ex.: Folder/MyScripts") 233 | .setValue(this.settingsManager.settings.scriptsFolder) 234 | .onChange((newFolder) => { 235 | this.settingsManager.settings.scriptsFolder = newFolder; 236 | this.settingsManager.saveSettings(); 237 | }); 238 | }); 239 | } 240 | } 241 | -------------------------------------------------------------------------------- /src/settings/suggesters/FolderSuggester.ts: -------------------------------------------------------------------------------- 1 | // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes 2 | // MIT License 3 | // Copyright (c) 2021 Liam Cain 4 | 5 | import { TAbstractFile, TFolder } from "obsidian"; 6 | import { TextInputSuggest } from "./suggest"; 7 | 8 | export default class extends TextInputSuggest { 9 | getSuggestions(inputStr: string): TFolder[] { 10 | const abstractFiles = this.app.vault.getAllLoadedFiles(); 11 | const folders: TFolder[] = []; 12 | const lowerCaseInputStr = inputStr.toLowerCase(); 13 | 14 | abstractFiles.forEach((folder: TAbstractFile) => { 15 | if ( 16 | folder instanceof TFolder && 17 | folder.path.toLowerCase().contains(lowerCaseInputStr) 18 | ) { 19 | folders.push(folder); 20 | } 21 | }); 22 | 23 | return folders; 24 | } 25 | 26 | renderSuggestion(file: TFolder, el: HTMLElement): void { 27 | el.setText(file.path); 28 | } 29 | 30 | selectSuggestion(file: TFolder): void { 31 | this.inputEl.value = file.path; 32 | this.inputEl.trigger("input"); 33 | this.close(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/settings/suggesters/suggest.ts: -------------------------------------------------------------------------------- 1 | // Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes 2 | // MIT License 3 | // Copyright (c) 2021 Liam Cain 4 | 5 | import { App, ISuggestOwner, Scope } from "obsidian"; 6 | import { createPopper, Instance as PopperInstance } from "@popperjs/core"; 7 | 8 | const wrapAround = (value: number, size: number): number => { 9 | return ((value % size) + size) % size; 10 | }; 11 | 12 | class Suggest { 13 | private owner: ISuggestOwner; 14 | private values: T[]; 15 | private suggestions: HTMLDivElement[]; 16 | private selectedItem: number; 17 | private containerEl: HTMLElement; 18 | 19 | constructor( 20 | owner: ISuggestOwner, 21 | containerEl: HTMLElement, 22 | scope: Scope 23 | ) { 24 | this.owner = owner; 25 | this.containerEl = containerEl; 26 | 27 | containerEl.on( 28 | "click", 29 | ".suggestion-item", 30 | this.onSuggestionClick.bind(this) 31 | ); 32 | containerEl.on( 33 | "mousemove", 34 | ".suggestion-item", 35 | this.onSuggestionMouseover.bind(this) 36 | ); 37 | 38 | scope.register([], "ArrowUp", (event) => { 39 | if (!event.isComposing) { 40 | this.setSelectedItem(this.selectedItem - 1, true); 41 | return false; 42 | } 43 | }); 44 | 45 | scope.register([], "ArrowDown", (event) => { 46 | if (!event.isComposing) { 47 | this.setSelectedItem(this.selectedItem + 1, true); 48 | return false; 49 | } 50 | }); 51 | 52 | scope.register([], "Enter", (event) => { 53 | if (!event.isComposing) { 54 | this.useSelectedItem(event); 55 | return false; 56 | } 57 | }); 58 | } 59 | 60 | onSuggestionClick(event: MouseEvent, el: HTMLDivElement): void { 61 | event.preventDefault(); 62 | 63 | const item = this.suggestions.indexOf(el); 64 | this.setSelectedItem(item, false); 65 | this.useSelectedItem(event); 66 | } 67 | 68 | onSuggestionMouseover(_event: MouseEvent, el: HTMLDivElement): void { 69 | const item = this.suggestions.indexOf(el); 70 | this.setSelectedItem(item, false); 71 | } 72 | 73 | setSuggestions(values: T[]) { 74 | this.containerEl.empty(); 75 | const suggestionEls: HTMLDivElement[] = []; 76 | 77 | values.forEach((value) => { 78 | const suggestionEl = this.containerEl.createDiv("suggestion-item"); 79 | this.owner.renderSuggestion(value, suggestionEl); 80 | suggestionEls.push(suggestionEl); 81 | }); 82 | 83 | this.values = values; 84 | this.suggestions = suggestionEls; 85 | this.setSelectedItem(0, false); 86 | } 87 | 88 | useSelectedItem(event: MouseEvent | KeyboardEvent) { 89 | const currentValue = this.values[this.selectedItem]; 90 | if (currentValue) { 91 | this.owner.selectSuggestion(currentValue, event); 92 | } 93 | } 94 | 95 | setSelectedItem(selectedIndex: number, scrollIntoView: boolean) { 96 | const normalizedIndex = wrapAround( 97 | selectedIndex, 98 | this.suggestions.length 99 | ); 100 | const prevSelectedSuggestion = this.suggestions[this.selectedItem]; 101 | const selectedSuggestion = this.suggestions[normalizedIndex]; 102 | 103 | prevSelectedSuggestion?.removeClass("is-selected"); 104 | selectedSuggestion?.addClass("is-selected"); 105 | 106 | this.selectedItem = normalizedIndex; 107 | 108 | if (scrollIntoView) { 109 | selectedSuggestion.scrollIntoView(false); 110 | } 111 | } 112 | } 113 | 114 | export abstract class TextInputSuggest implements ISuggestOwner { 115 | protected app: App; 116 | protected inputEl: HTMLInputElement | HTMLTextAreaElement; 117 | 118 | private popper: PopperInstance; 119 | private scope: Scope; 120 | private suggestEl: HTMLElement; 121 | private suggest: Suggest; 122 | 123 | constructor(app: App, inputEl: HTMLInputElement | HTMLTextAreaElement) { 124 | this.app = app; 125 | this.inputEl = inputEl; 126 | this.scope = new Scope(); 127 | 128 | this.suggestEl = createDiv("suggestion-container"); 129 | const suggestion = this.suggestEl.createDiv("suggestion"); 130 | this.suggest = new Suggest(this, suggestion, this.scope); 131 | 132 | this.scope.register([], "Escape", this.close.bind(this)); 133 | 134 | this.inputEl.addEventListener("input", this.onInputChanged.bind(this)); 135 | this.inputEl.addEventListener("focus", this.onInputChanged.bind(this)); 136 | this.inputEl.addEventListener("blur", this.close.bind(this)); 137 | this.suggestEl.on( 138 | "mousedown", 139 | ".suggestion-container", 140 | (event: MouseEvent) => { 141 | event.preventDefault(); 142 | } 143 | ); 144 | } 145 | 146 | onInputChanged(): void { 147 | const inputStr = this.inputEl.value; 148 | const suggestions = this.getSuggestions(inputStr); 149 | 150 | if (!suggestions) { 151 | this.close(); 152 | return; 153 | } 154 | 155 | if (suggestions.length > 0) { 156 | this.suggest.setSuggestions(suggestions); 157 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 158 | this.open((this.app).dom.appContainerEl, this.inputEl); 159 | } else { 160 | this.close(); 161 | } 162 | } 163 | 164 | open(container: HTMLElement, inputEl: HTMLElement): void { 165 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 166 | (this.app).keymap.pushScope(this.scope); 167 | 168 | container.appendChild(this.suggestEl); 169 | this.popper = createPopper(inputEl, this.suggestEl, { 170 | placement: "bottom-start", 171 | modifiers: [ 172 | { 173 | name: "sameWidth", 174 | enabled: true, 175 | fn: ({ state, instance }) => { 176 | // Note: positioning needs to be calculated twice - 177 | // first pass - positioning it according to the width of the popper 178 | // second pass - position it with the width bound to the reference element 179 | // we need to early exit to avoid an infinite loop 180 | const targetWidth = `${state.rects.reference.width}px`; 181 | if (state.styles.popper.width === targetWidth) { 182 | return; 183 | } 184 | state.styles.popper.width = targetWidth; 185 | instance.update(); 186 | }, 187 | phase: "beforeWrite", 188 | requires: ["computeStyles"], 189 | }, 190 | ], 191 | }); 192 | } 193 | 194 | close(): void { 195 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 196 | (this.app).keymap.popScope(this.scope); 197 | 198 | this.suggest.setSuggestions([]); 199 | if (this.popper) this.popper.destroy(); 200 | this.suggestEl.detach(); 201 | } 202 | 203 | abstract getSuggestions(inputStr: string): T[]; 204 | abstract renderSuggestion(item: T, el: HTMLElement): void; 205 | abstract selectSuggestion(item: T): void; 206 | } 207 | -------------------------------------------------------------------------------- /src/settings/utils/Error.ts: -------------------------------------------------------------------------------- 1 | export class UserPluginError extends Error {} 2 | -------------------------------------------------------------------------------- /src/settings/utils/Utils.ts: -------------------------------------------------------------------------------- 1 | import { 2 | App, 3 | normalizePath, 4 | TAbstractFile, 5 | TFile, 6 | TFolder, 7 | Vault, 8 | } from "obsidian"; 9 | import { UserPluginError } from "./Error"; 10 | 11 | // attribution: SilentVoid13, https://github.com/SilentVoid13/Templater 12 | // License: AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html 13 | export function resolve_tfolder(app: App, folder_str: string): TFolder { 14 | folder_str = normalizePath(folder_str); 15 | 16 | const folder = app.vault.getAbstractFileByPath(folder_str); 17 | if (!folder) { 18 | throw new UserPluginError(`Folder "${folder_str}" doesn't exist`); 19 | } 20 | if (!(folder instanceof TFolder)) { 21 | throw new UserPluginError(`${folder_str} is a file, not a folder`); 22 | } 23 | 24 | return folder; 25 | } 26 | 27 | // attribution: SilentVoid13, https://github.com/SilentVoid13/Templater 28 | // License: AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html 29 | export function resolve_tfile(app: App, file_str: string): TFile { 30 | file_str = normalizePath(file_str); 31 | 32 | const file = app.vault.getAbstractFileByPath(file_str); 33 | if (!file) { 34 | throw new UserPluginError(`File "${file_str}" doesn't exist`); 35 | } 36 | if (!(file instanceof TFile)) { 37 | throw new UserPluginError(`${file_str} is a folder, not a file`); 38 | } 39 | 40 | return file; 41 | } 42 | 43 | // attribution: SilentVoid13, https://github.com/SilentVoid13/Templater 44 | // License: AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html 45 | export function get_tfiles_from_folder( 46 | app: App, 47 | folder_str: string 48 | ): Array { 49 | const folder = resolve_tfolder(app, folder_str); 50 | 51 | const files: Array = []; 52 | 53 | Vault.recurseChildren(folder, (file: TAbstractFile) => { 54 | if (file instanceof TFile) { 55 | files.push(file); 56 | } 57 | }); 58 | 59 | files.sort((a, b) => { 60 | return a.basename.localeCompare(b.basename); 61 | }); 62 | 63 | return files; 64 | } 65 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | 2 | .obsidian_user_plugins_snippet{ 3 | margin-left: 5px; 4 | margin-right: 5px; 5 | font-size: 16px; 6 | width: 100%; 7 | } 8 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "lib": [ 15 | "DOM", 16 | "ES5", 17 | "ES6", 18 | "ES7" 19 | ] 20 | }, 21 | "include": [ 22 | "**/*.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /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": "0.9.7", 3 | "1.0.1": "0.12.0", 4 | "1.0.2": "0.12.0", 5 | "1.0.3": "0.12.0", 6 | "1.1.0": "0.12.0", 7 | "1.1.1": "0.12.0", 8 | "1.2.0": "0.12.0", 9 | "1.3.0": "0.12.0", 10 | "1.4.0": "1.7.2" 11 | } 12 | --------------------------------------------------------------------------------