├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmrc ├── Alfred Workflow - Obsidian Snippet Manager.alfredworkflow ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── manifest.json ├── package-lock.json ├── package.json ├── src ├── ChatGPTPromptManager.ts ├── SnippetManagerPlugin.ts ├── SnippetManagerSettingTab.ts ├── SnippetSuggestModal.ts └── main.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 = tab 9 | indent_size = 4 10 | tab_width = 4 11 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | main.js 4 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "env": { "node": true }, 5 | "plugins": [ 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 | } -------------------------------------------------------------------------------- /.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 | alfred-snippets.json 24 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /Alfred Workflow - Obsidian Snippet Manager.alfredworkflow: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramandv/obsidian-snippets-manager/0b993de84c954b85f8271d293f855a75019819b9/Alfred Workflow - Obsidian Snippet Manager.alfredworkflow -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [fullname] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Snippets Manager - Text Expansion Plugin for Obsidian 3 | 4 | ## Overview 5 | 6 | The **Snippets Manager Plugin** for Obsidian allows you to manage and quickly insert text snippets stored in a markdown file (or folder of markdown files, including subfolders). This plugin enhances your workflow by enabling fuzzy search for snippets, allowing you to copy them to your clipboard or directly paste them at the cursor position in your active note. Now, with Alfred integration and Awesome ChatGPT Prompts support, it's even more powerful. 7 | 8 | ![Obsidian Snippet Manager](https://github.com/user-attachments/assets/95f10833-faff-4313-8263-89dae134c60b) 9 | 10 | ## New Features 11 | 12 | ### Alfred Support 13 | Snippets can now be saved in Alfred JSON format for integration with Alfred. If enabled, your snippets will be automatically saved in a JSON format compatible with Alfred workflows. 14 | 15 | #### How to Use Alfred Support: 16 | 17 | 1. In the plugin settings, toggle Enable Alfred Support. 18 | 2. Snippets will be saved as alfred-snippets.json inside the plugin folder. 19 | 3. Install the alfred workflow by downloading [here](https://github.com/ramandv/obsidian-snippets-manager/raw/refs/heads/master/Alfred%20Workflow%20-%20Obsidian%20Snippet%20Manager.alfredworkflow) 20 | 4. You need to add the alfred-snippets.json file path to the alfredworkflow configuration. [In the snippets manager plugin settings panel, the full path to the generated Alfred JSON file is displayed, and you can copy it by double clicking and copy it for easy access.] 21 | 22 | ### Fetch Latest Awesome ChatGPT Prompts 23 | You can fetch the latest Awesome ChatGPT Prompts directly into your snippets. The plugin will download the latest prompt file from the Awesome ChatGPT Prompts GitHub repository and convert it to a markdown and store it in your snippets folder. 24 | You can easily search through those prompts. 25 | 26 | #### How to Sync Awesome ChatGPT Prompts: 27 | Use the command palette (Cmd/Ctrl + P) and search for Sync Awesome ChatGPT Prompts. 28 | The plugin will fetch the latest version from the repository and save it. 29 | 30 | 31 | ## Usecases 32 | 33 | ### Do i need this plugin if i already you Text Expander kind of apps? 34 | Yes, you need it. In most of the cases, those apps will be available only for desktops. But this plugin will work on your mobile too. 35 | 36 | ### Mobile Use: 37 | I use Snippet Manager to quickly copy things like addresses, map locations, URLs, and quotes. With the help of the "[Website shortcut](https://play.google.com/store/apps/details?id=com.deltacdev.websiteshortcut&hl=en_IN)" Android app and the [Obsidian Advanced URI plugin](https://github.com/Vinzent03/obsidian-advanced-uri), I’ve set up a shortcut directly to the snippet search modal. Now, with just one click, I can copy whatever I need to my clipboard and paste it anywhere on my phone. 38 | 39 | Example Advanced URI link for Obsidian. You can create the link to the URL. [Replace your vault name accordingly] 40 | ``` 41 | obsidian://advanced-uri?vault=&commandid=snippets-manager%3Aopen-snippet-search 42 | ``` 43 | 44 | ### Desktop Use: 45 | On my desktop, Snippet Manager is my go-to tool for copying ChatGPT prompts. I’ve stored a bunch of prompts from [Awesome ChatGPT Prompts](https://github.com/f/awesome-chatgpt-prompts), and with Snippet Manager, I can quickly find and copy the one I need. 46 | 47 | 48 | ## Features 49 | 50 | - **Snippet Management:** Store snippets in a markdown file with headings as keys (whether personal details like email signature, passport number, code snippets or anything). 51 | - **Folder Support:** The plugin supports snippets stored in a folder of markdown files, including subfolders. Either select the single markdown file in Settings for the plugin, or the folder containing the markdown files with snippets. 52 | - **Code Snippets**: The plugin supports code snippets stored in markdown code blocks. When retrieving a code snippet, the plugin automatically strips the backticks, providing you with just the clean code. 53 | - **Fuzzy Search:** Quickly search through snippets using a fuzzy search interface. 54 | - **Clipboard Copying:** Copy selected snippets to your clipboard. 55 | - **Direct Insertion:** Paste snippets directly at the cursor position in the active markdown note. 56 | - **Configurable Snippet Location:** Choose a markdown file or folder to store your snippets. 57 | - **Mobile Support:** The plugin is fully compatible with Obsidian's mobile app. You can easily create a shortcut to the Snippet Search using the Advanced URI plugin, making it even more convenient to search and copy snippets on the go. 58 | - **Alfred Support:** Generate an Alfred-compatible JSON file for use in Alfred workflows. This file is saved inside the Snippet Manager plugin folder, and the path can be easily copied from the settings. 59 | - [**Awesome ChatGPT Prompts:**](https://github.com/f/awesome-chatgpt-prompts) Download and sync the latest prompts from the Awesome ChatGPT Prompts repository as snippets. 60 | 61 | 62 | 63 | ## Links 64 | 65 | ✨ [Check out latest updates](https://github.com/ramandv/obsidian-snippets-manager/releases)
66 | 🪲 [Report bugs and suggest features](https://github.com/ramandv/obsidian-snippets-manager/issues)
67 | ❓ [Ask questions](https://github.com/ramandv/obsidian-snippets-manager/discussions/new?category=q-a)
68 | 👍 [Give thumbs up to issues important to you](https://github.com/ramandv/obsidian-snippets-manager/issues)
69 | 70 | 71 | 72 | ## Installation 73 | 74 | - **Obsidian Community Plugins:** 75 | - This plugin will be available in the Obsidian community plugins list. If so, you can install it directly from Obsidian: 76 | - Go to `Settings` > `Community Plugins` > `Browse`. 77 | - Search for `Snippets Manager`. 78 | - Click `Install` and then `Enable`. 79 | 80 | ## Usage 81 | 82 | ### Setting Up Snippets 83 | 84 | 1. **Single File or Folder Setup:** 85 | 86 | You can store snippets in a single markdown file (e.g., Snippets.md) or in multiple markdown files within a folder (e.g., Snippets/ 87 | 88 | 2. **Markdown Snippet Structure:** 89 | 90 | - Each snippet should be stored under a heading (### Heading), with the content under the heading representing the snippet. 91 | - Example in a single file: 92 | 93 | ````markdown 94 | ### Greeting 95 | Hello, how are you doing today? 96 | 97 | ### Signature 98 | Best regards, 99 | [Your Name] 100 | 101 | ### Hello World 102 | ```js 103 | helloworld() { 104 | console.log("Hello World!!!"); 105 | } 106 | ``` 107 | ```` 108 | 109 | - Example with multiple files: 110 | 111 | - Snippets/Email.md (with headings for email templates) 112 | - Snippets/Code.md (with headings for code snippets) 113 | 114 | 2. **Configure the Snippet File:** 115 | - In Obsidian, go to `Settings` > `Snippets Manager`. 116 | - Set the path to your snippet file (e.g., Snippets.md) or folder (e.g., Snippets/). 117 | 118 | ### Using Snippets Manager 119 | 120 | 1. **Search and Insert Snippets:** 121 | - Use the command palette (CMD/CTRL + P) and search for `Search Snippets`. 122 | - A fuzzy search modal will appear, allowing you to search for your snippets by their headings. 123 | - Press `Enter` to copy the snippet to your clipboard. 124 | - Press `CMD/CTRL + Enter` to paste the snippet directly at the cursor position in the active note. 125 | 126 | 2. **Keyboard Shortcuts:** 127 | - `Enter`: Copy the selected snippet to the clipboard. 128 | - `CMD/CTRL + Enter`: Copy the selected snippet to the clipboard and paste it at the cursor position in the active note. 129 | 130 | 131 | ## Development 132 | 133 | ### Requirements 134 | 135 | - Node.js and npm 136 | - TypeScript 137 | 138 | ### Building the Plugin 139 | 140 | 1. **Clone the repository:** 141 | ```bash 142 | git clone https://github.com/your-repo/snippet-manager 143 | cd snippet-manager 144 | ``` 145 | 146 | 2. **Install dependencies:** 147 | ```bash 148 | npm install 149 | ``` 150 | 151 | 3. **Build the plugin:** 152 | ```bash 153 | npm run build 154 | ``` 155 | 156 | 4. **Develop with live reload:** 157 | ```bash 158 | npm run dev 159 | ``` 160 | 161 | ### Contributing 162 | 163 | Contributions are welcome! If you have any bug reports, feature requests, or code improvements, feel free to open an issue or submit a pull request. 164 | 165 | ### License 166 | 167 | This plugin is open-source software licensed under the MIT License. 168 | -------------------------------------------------------------------------------- /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 | }); 42 | 43 | if (prod) { 44 | await context.rebuild(); 45 | process.exit(0); 46 | } else { 47 | await context.watch(); 48 | } -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "snippets-manager", 3 | "name": "Snippets Manager", 4 | "version": "1.1.1", 5 | "minAppVersion": "0.15.0", 6 | "description": "A versatile text expansion plugin with full mobile support. Easily manage code snippets, personal info like passport numbers, email signatures, and more. Includes seamless Alfred integration and the ability to sync Awesome ChatGPT prompts as snippets.", 7 | "author": "Venkatraman Dhamodaran", 8 | "authorUrl": "https://ramandv.com", 9 | "fundingUrl": "https://buymeacoffee.com/ramandv", 10 | "isDesktopOnly": false 11 | } 12 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-snippets-manager", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "obsidian-snippets-manager", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "papaparse": "^5.4.1" 13 | }, 14 | "devDependencies": { 15 | "@types/node": "^16.11.6", 16 | "@types/papaparse": "^5.3.14", 17 | "@typescript-eslint/eslint-plugin": "5.29.0", 18 | "@typescript-eslint/parser": "5.29.0", 19 | "builtin-modules": "3.3.0", 20 | "esbuild": "0.17.3", 21 | "obsidian": "latest", 22 | "tslib": "2.4.0", 23 | "typescript": "4.7.4" 24 | } 25 | }, 26 | "node_modules/@codemirror/state": { 27 | "version": "6.4.1", 28 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", 29 | "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", 30 | "dev": true, 31 | "license": "MIT", 32 | "peer": true 33 | }, 34 | "node_modules/@codemirror/view": { 35 | "version": "6.30.0", 36 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.30.0.tgz", 37 | "integrity": "sha512-96Nmn8OeLh6aONQprIeYk8hGVnEuYpWuxKSkdsODOx9hWPxyuyZGvmvxV/JmLsp+CubMO1PsLaN5TNNgrl0UrQ==", 38 | "dev": true, 39 | "license": "MIT", 40 | "peer": true, 41 | "dependencies": { 42 | "@codemirror/state": "^6.4.0", 43 | "style-mod": "^4.1.0", 44 | "w3c-keyname": "^2.2.4" 45 | } 46 | }, 47 | "node_modules/@esbuild/android-arm": { 48 | "version": "0.17.3", 49 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", 50 | "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", 51 | "cpu": [ 52 | "arm" 53 | ], 54 | "dev": true, 55 | "license": "MIT", 56 | "optional": true, 57 | "os": [ 58 | "android" 59 | ], 60 | "engines": { 61 | "node": ">=12" 62 | } 63 | }, 64 | "node_modules/@esbuild/android-arm64": { 65 | "version": "0.17.3", 66 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", 67 | "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", 68 | "cpu": [ 69 | "arm64" 70 | ], 71 | "dev": true, 72 | "license": "MIT", 73 | "optional": true, 74 | "os": [ 75 | "android" 76 | ], 77 | "engines": { 78 | "node": ">=12" 79 | } 80 | }, 81 | "node_modules/@esbuild/android-x64": { 82 | "version": "0.17.3", 83 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", 84 | "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", 85 | "cpu": [ 86 | "x64" 87 | ], 88 | "dev": true, 89 | "license": "MIT", 90 | "optional": true, 91 | "os": [ 92 | "android" 93 | ], 94 | "engines": { 95 | "node": ">=12" 96 | } 97 | }, 98 | "node_modules/@esbuild/darwin-arm64": { 99 | "version": "0.17.3", 100 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", 101 | "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", 102 | "cpu": [ 103 | "arm64" 104 | ], 105 | "dev": true, 106 | "license": "MIT", 107 | "optional": true, 108 | "os": [ 109 | "darwin" 110 | ], 111 | "engines": { 112 | "node": ">=12" 113 | } 114 | }, 115 | "node_modules/@esbuild/darwin-x64": { 116 | "version": "0.17.3", 117 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", 118 | "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", 119 | "cpu": [ 120 | "x64" 121 | ], 122 | "dev": true, 123 | "license": "MIT", 124 | "optional": true, 125 | "os": [ 126 | "darwin" 127 | ], 128 | "engines": { 129 | "node": ">=12" 130 | } 131 | }, 132 | "node_modules/@esbuild/freebsd-arm64": { 133 | "version": "0.17.3", 134 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", 135 | "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", 136 | "cpu": [ 137 | "arm64" 138 | ], 139 | "dev": true, 140 | "license": "MIT", 141 | "optional": true, 142 | "os": [ 143 | "freebsd" 144 | ], 145 | "engines": { 146 | "node": ">=12" 147 | } 148 | }, 149 | "node_modules/@esbuild/freebsd-x64": { 150 | "version": "0.17.3", 151 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", 152 | "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", 153 | "cpu": [ 154 | "x64" 155 | ], 156 | "dev": true, 157 | "license": "MIT", 158 | "optional": true, 159 | "os": [ 160 | "freebsd" 161 | ], 162 | "engines": { 163 | "node": ">=12" 164 | } 165 | }, 166 | "node_modules/@esbuild/linux-arm": { 167 | "version": "0.17.3", 168 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", 169 | "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", 170 | "cpu": [ 171 | "arm" 172 | ], 173 | "dev": true, 174 | "license": "MIT", 175 | "optional": true, 176 | "os": [ 177 | "linux" 178 | ], 179 | "engines": { 180 | "node": ">=12" 181 | } 182 | }, 183 | "node_modules/@esbuild/linux-arm64": { 184 | "version": "0.17.3", 185 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", 186 | "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", 187 | "cpu": [ 188 | "arm64" 189 | ], 190 | "dev": true, 191 | "license": "MIT", 192 | "optional": true, 193 | "os": [ 194 | "linux" 195 | ], 196 | "engines": { 197 | "node": ">=12" 198 | } 199 | }, 200 | "node_modules/@esbuild/linux-ia32": { 201 | "version": "0.17.3", 202 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", 203 | "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", 204 | "cpu": [ 205 | "ia32" 206 | ], 207 | "dev": true, 208 | "license": "MIT", 209 | "optional": true, 210 | "os": [ 211 | "linux" 212 | ], 213 | "engines": { 214 | "node": ">=12" 215 | } 216 | }, 217 | "node_modules/@esbuild/linux-loong64": { 218 | "version": "0.17.3", 219 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", 220 | "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", 221 | "cpu": [ 222 | "loong64" 223 | ], 224 | "dev": true, 225 | "license": "MIT", 226 | "optional": true, 227 | "os": [ 228 | "linux" 229 | ], 230 | "engines": { 231 | "node": ">=12" 232 | } 233 | }, 234 | "node_modules/@esbuild/linux-mips64el": { 235 | "version": "0.17.3", 236 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", 237 | "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", 238 | "cpu": [ 239 | "mips64el" 240 | ], 241 | "dev": true, 242 | "license": "MIT", 243 | "optional": true, 244 | "os": [ 245 | "linux" 246 | ], 247 | "engines": { 248 | "node": ">=12" 249 | } 250 | }, 251 | "node_modules/@esbuild/linux-ppc64": { 252 | "version": "0.17.3", 253 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", 254 | "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", 255 | "cpu": [ 256 | "ppc64" 257 | ], 258 | "dev": true, 259 | "license": "MIT", 260 | "optional": true, 261 | "os": [ 262 | "linux" 263 | ], 264 | "engines": { 265 | "node": ">=12" 266 | } 267 | }, 268 | "node_modules/@esbuild/linux-riscv64": { 269 | "version": "0.17.3", 270 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", 271 | "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", 272 | "cpu": [ 273 | "riscv64" 274 | ], 275 | "dev": true, 276 | "license": "MIT", 277 | "optional": true, 278 | "os": [ 279 | "linux" 280 | ], 281 | "engines": { 282 | "node": ">=12" 283 | } 284 | }, 285 | "node_modules/@esbuild/linux-s390x": { 286 | "version": "0.17.3", 287 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", 288 | "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", 289 | "cpu": [ 290 | "s390x" 291 | ], 292 | "dev": true, 293 | "license": "MIT", 294 | "optional": true, 295 | "os": [ 296 | "linux" 297 | ], 298 | "engines": { 299 | "node": ">=12" 300 | } 301 | }, 302 | "node_modules/@esbuild/linux-x64": { 303 | "version": "0.17.3", 304 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", 305 | "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", 306 | "cpu": [ 307 | "x64" 308 | ], 309 | "dev": true, 310 | "license": "MIT", 311 | "optional": true, 312 | "os": [ 313 | "linux" 314 | ], 315 | "engines": { 316 | "node": ">=12" 317 | } 318 | }, 319 | "node_modules/@esbuild/netbsd-x64": { 320 | "version": "0.17.3", 321 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", 322 | "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", 323 | "cpu": [ 324 | "x64" 325 | ], 326 | "dev": true, 327 | "license": "MIT", 328 | "optional": true, 329 | "os": [ 330 | "netbsd" 331 | ], 332 | "engines": { 333 | "node": ">=12" 334 | } 335 | }, 336 | "node_modules/@esbuild/openbsd-x64": { 337 | "version": "0.17.3", 338 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", 339 | "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", 340 | "cpu": [ 341 | "x64" 342 | ], 343 | "dev": true, 344 | "license": "MIT", 345 | "optional": true, 346 | "os": [ 347 | "openbsd" 348 | ], 349 | "engines": { 350 | "node": ">=12" 351 | } 352 | }, 353 | "node_modules/@esbuild/sunos-x64": { 354 | "version": "0.17.3", 355 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", 356 | "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", 357 | "cpu": [ 358 | "x64" 359 | ], 360 | "dev": true, 361 | "license": "MIT", 362 | "optional": true, 363 | "os": [ 364 | "sunos" 365 | ], 366 | "engines": { 367 | "node": ">=12" 368 | } 369 | }, 370 | "node_modules/@esbuild/win32-arm64": { 371 | "version": "0.17.3", 372 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", 373 | "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", 374 | "cpu": [ 375 | "arm64" 376 | ], 377 | "dev": true, 378 | "license": "MIT", 379 | "optional": true, 380 | "os": [ 381 | "win32" 382 | ], 383 | "engines": { 384 | "node": ">=12" 385 | } 386 | }, 387 | "node_modules/@esbuild/win32-ia32": { 388 | "version": "0.17.3", 389 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", 390 | "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", 391 | "cpu": [ 392 | "ia32" 393 | ], 394 | "dev": true, 395 | "license": "MIT", 396 | "optional": true, 397 | "os": [ 398 | "win32" 399 | ], 400 | "engines": { 401 | "node": ">=12" 402 | } 403 | }, 404 | "node_modules/@esbuild/win32-x64": { 405 | "version": "0.17.3", 406 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", 407 | "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", 408 | "cpu": [ 409 | "x64" 410 | ], 411 | "dev": true, 412 | "license": "MIT", 413 | "optional": true, 414 | "os": [ 415 | "win32" 416 | ], 417 | "engines": { 418 | "node": ">=12" 419 | } 420 | }, 421 | "node_modules/@eslint-community/eslint-utils": { 422 | "version": "4.4.0", 423 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 424 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 425 | "dev": true, 426 | "license": "MIT", 427 | "peer": true, 428 | "dependencies": { 429 | "eslint-visitor-keys": "^3.3.0" 430 | }, 431 | "engines": { 432 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 433 | }, 434 | "peerDependencies": { 435 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 436 | } 437 | }, 438 | "node_modules/@eslint-community/regexpp": { 439 | "version": "4.11.0", 440 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", 441 | "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", 442 | "dev": true, 443 | "license": "MIT", 444 | "peer": true, 445 | "engines": { 446 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 447 | } 448 | }, 449 | "node_modules/@eslint/eslintrc": { 450 | "version": "2.1.4", 451 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 452 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 453 | "dev": true, 454 | "license": "MIT", 455 | "peer": true, 456 | "dependencies": { 457 | "ajv": "^6.12.4", 458 | "debug": "^4.3.2", 459 | "espree": "^9.6.0", 460 | "globals": "^13.19.0", 461 | "ignore": "^5.2.0", 462 | "import-fresh": "^3.2.1", 463 | "js-yaml": "^4.1.0", 464 | "minimatch": "^3.1.2", 465 | "strip-json-comments": "^3.1.1" 466 | }, 467 | "engines": { 468 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 469 | }, 470 | "funding": { 471 | "url": "https://opencollective.com/eslint" 472 | } 473 | }, 474 | "node_modules/@eslint/js": { 475 | "version": "8.57.0", 476 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", 477 | "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", 478 | "dev": true, 479 | "license": "MIT", 480 | "peer": true, 481 | "engines": { 482 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 483 | } 484 | }, 485 | "node_modules/@humanwhocodes/config-array": { 486 | "version": "0.11.14", 487 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", 488 | "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", 489 | "deprecated": "Use @eslint/config-array instead", 490 | "dev": true, 491 | "license": "Apache-2.0", 492 | "peer": true, 493 | "dependencies": { 494 | "@humanwhocodes/object-schema": "^2.0.2", 495 | "debug": "^4.3.1", 496 | "minimatch": "^3.0.5" 497 | }, 498 | "engines": { 499 | "node": ">=10.10.0" 500 | } 501 | }, 502 | "node_modules/@humanwhocodes/module-importer": { 503 | "version": "1.0.1", 504 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 505 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 506 | "dev": true, 507 | "license": "Apache-2.0", 508 | "peer": true, 509 | "engines": { 510 | "node": ">=12.22" 511 | }, 512 | "funding": { 513 | "type": "github", 514 | "url": "https://github.com/sponsors/nzakas" 515 | } 516 | }, 517 | "node_modules/@humanwhocodes/object-schema": { 518 | "version": "2.0.3", 519 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", 520 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 521 | "deprecated": "Use @eslint/object-schema instead", 522 | "dev": true, 523 | "license": "BSD-3-Clause", 524 | "peer": true 525 | }, 526 | "node_modules/@nodelib/fs.scandir": { 527 | "version": "2.1.5", 528 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 529 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 530 | "dev": true, 531 | "license": "MIT", 532 | "dependencies": { 533 | "@nodelib/fs.stat": "2.0.5", 534 | "run-parallel": "^1.1.9" 535 | }, 536 | "engines": { 537 | "node": ">= 8" 538 | } 539 | }, 540 | "node_modules/@nodelib/fs.stat": { 541 | "version": "2.0.5", 542 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 543 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 544 | "dev": true, 545 | "license": "MIT", 546 | "engines": { 547 | "node": ">= 8" 548 | } 549 | }, 550 | "node_modules/@nodelib/fs.walk": { 551 | "version": "1.2.8", 552 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 553 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 554 | "dev": true, 555 | "license": "MIT", 556 | "dependencies": { 557 | "@nodelib/fs.scandir": "2.1.5", 558 | "fastq": "^1.6.0" 559 | }, 560 | "engines": { 561 | "node": ">= 8" 562 | } 563 | }, 564 | "node_modules/@types/codemirror": { 565 | "version": "5.60.8", 566 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", 567 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", 568 | "dev": true, 569 | "license": "MIT", 570 | "dependencies": { 571 | "@types/tern": "*" 572 | } 573 | }, 574 | "node_modules/@types/estree": { 575 | "version": "1.0.5", 576 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 577 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 578 | "dev": true, 579 | "license": "MIT" 580 | }, 581 | "node_modules/@types/json-schema": { 582 | "version": "7.0.15", 583 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 584 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 585 | "dev": true, 586 | "license": "MIT" 587 | }, 588 | "node_modules/@types/node": { 589 | "version": "16.18.105", 590 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.105.tgz", 591 | "integrity": "sha512-w2d0Z9yMk07uH3+Cx0N8lqFyi3yjXZxlbYappPj+AsOlT02OyxyiuNoNHdGt6EuiSm8Wtgp2YV7vWg+GMFrvFA==", 592 | "dev": true, 593 | "license": "MIT" 594 | }, 595 | "node_modules/@types/papaparse": { 596 | "version": "5.3.14", 597 | "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.14.tgz", 598 | "integrity": "sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g==", 599 | "dev": true, 600 | "license": "MIT", 601 | "dependencies": { 602 | "@types/node": "*" 603 | } 604 | }, 605 | "node_modules/@types/tern": { 606 | "version": "0.23.9", 607 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", 608 | "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", 609 | "dev": true, 610 | "license": "MIT", 611 | "dependencies": { 612 | "@types/estree": "*" 613 | } 614 | }, 615 | "node_modules/@typescript-eslint/eslint-plugin": { 616 | "version": "5.29.0", 617 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", 618 | "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", 619 | "dev": true, 620 | "license": "MIT", 621 | "dependencies": { 622 | "@typescript-eslint/scope-manager": "5.29.0", 623 | "@typescript-eslint/type-utils": "5.29.0", 624 | "@typescript-eslint/utils": "5.29.0", 625 | "debug": "^4.3.4", 626 | "functional-red-black-tree": "^1.0.1", 627 | "ignore": "^5.2.0", 628 | "regexpp": "^3.2.0", 629 | "semver": "^7.3.7", 630 | "tsutils": "^3.21.0" 631 | }, 632 | "engines": { 633 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 634 | }, 635 | "funding": { 636 | "type": "opencollective", 637 | "url": "https://opencollective.com/typescript-eslint" 638 | }, 639 | "peerDependencies": { 640 | "@typescript-eslint/parser": "^5.0.0", 641 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 642 | }, 643 | "peerDependenciesMeta": { 644 | "typescript": { 645 | "optional": true 646 | } 647 | } 648 | }, 649 | "node_modules/@typescript-eslint/parser": { 650 | "version": "5.29.0", 651 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", 652 | "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", 653 | "dev": true, 654 | "license": "BSD-2-Clause", 655 | "dependencies": { 656 | "@typescript-eslint/scope-manager": "5.29.0", 657 | "@typescript-eslint/types": "5.29.0", 658 | "@typescript-eslint/typescript-estree": "5.29.0", 659 | "debug": "^4.3.4" 660 | }, 661 | "engines": { 662 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 663 | }, 664 | "funding": { 665 | "type": "opencollective", 666 | "url": "https://opencollective.com/typescript-eslint" 667 | }, 668 | "peerDependencies": { 669 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 670 | }, 671 | "peerDependenciesMeta": { 672 | "typescript": { 673 | "optional": true 674 | } 675 | } 676 | }, 677 | "node_modules/@typescript-eslint/scope-manager": { 678 | "version": "5.29.0", 679 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", 680 | "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", 681 | "dev": true, 682 | "license": "MIT", 683 | "dependencies": { 684 | "@typescript-eslint/types": "5.29.0", 685 | "@typescript-eslint/visitor-keys": "5.29.0" 686 | }, 687 | "engines": { 688 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 689 | }, 690 | "funding": { 691 | "type": "opencollective", 692 | "url": "https://opencollective.com/typescript-eslint" 693 | } 694 | }, 695 | "node_modules/@typescript-eslint/type-utils": { 696 | "version": "5.29.0", 697 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", 698 | "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", 699 | "dev": true, 700 | "license": "MIT", 701 | "dependencies": { 702 | "@typescript-eslint/utils": "5.29.0", 703 | "debug": "^4.3.4", 704 | "tsutils": "^3.21.0" 705 | }, 706 | "engines": { 707 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 708 | }, 709 | "funding": { 710 | "type": "opencollective", 711 | "url": "https://opencollective.com/typescript-eslint" 712 | }, 713 | "peerDependencies": { 714 | "eslint": "*" 715 | }, 716 | "peerDependenciesMeta": { 717 | "typescript": { 718 | "optional": true 719 | } 720 | } 721 | }, 722 | "node_modules/@typescript-eslint/types": { 723 | "version": "5.29.0", 724 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", 725 | "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", 726 | "dev": true, 727 | "license": "MIT", 728 | "engines": { 729 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 730 | }, 731 | "funding": { 732 | "type": "opencollective", 733 | "url": "https://opencollective.com/typescript-eslint" 734 | } 735 | }, 736 | "node_modules/@typescript-eslint/typescript-estree": { 737 | "version": "5.29.0", 738 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", 739 | "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", 740 | "dev": true, 741 | "license": "BSD-2-Clause", 742 | "dependencies": { 743 | "@typescript-eslint/types": "5.29.0", 744 | "@typescript-eslint/visitor-keys": "5.29.0", 745 | "debug": "^4.3.4", 746 | "globby": "^11.1.0", 747 | "is-glob": "^4.0.3", 748 | "semver": "^7.3.7", 749 | "tsutils": "^3.21.0" 750 | }, 751 | "engines": { 752 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 753 | }, 754 | "funding": { 755 | "type": "opencollective", 756 | "url": "https://opencollective.com/typescript-eslint" 757 | }, 758 | "peerDependenciesMeta": { 759 | "typescript": { 760 | "optional": true 761 | } 762 | } 763 | }, 764 | "node_modules/@typescript-eslint/utils": { 765 | "version": "5.29.0", 766 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", 767 | "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", 768 | "dev": true, 769 | "license": "MIT", 770 | "dependencies": { 771 | "@types/json-schema": "^7.0.9", 772 | "@typescript-eslint/scope-manager": "5.29.0", 773 | "@typescript-eslint/types": "5.29.0", 774 | "@typescript-eslint/typescript-estree": "5.29.0", 775 | "eslint-scope": "^5.1.1", 776 | "eslint-utils": "^3.0.0" 777 | }, 778 | "engines": { 779 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 780 | }, 781 | "funding": { 782 | "type": "opencollective", 783 | "url": "https://opencollective.com/typescript-eslint" 784 | }, 785 | "peerDependencies": { 786 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 787 | } 788 | }, 789 | "node_modules/@typescript-eslint/visitor-keys": { 790 | "version": "5.29.0", 791 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", 792 | "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", 793 | "dev": true, 794 | "license": "MIT", 795 | "dependencies": { 796 | "@typescript-eslint/types": "5.29.0", 797 | "eslint-visitor-keys": "^3.3.0" 798 | }, 799 | "engines": { 800 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 801 | }, 802 | "funding": { 803 | "type": "opencollective", 804 | "url": "https://opencollective.com/typescript-eslint" 805 | } 806 | }, 807 | "node_modules/@ungap/structured-clone": { 808 | "version": "1.2.0", 809 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 810 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 811 | "dev": true, 812 | "license": "ISC", 813 | "peer": true 814 | }, 815 | "node_modules/acorn": { 816 | "version": "8.12.1", 817 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 818 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 819 | "dev": true, 820 | "license": "MIT", 821 | "peer": true, 822 | "bin": { 823 | "acorn": "bin/acorn" 824 | }, 825 | "engines": { 826 | "node": ">=0.4.0" 827 | } 828 | }, 829 | "node_modules/acorn-jsx": { 830 | "version": "5.3.2", 831 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 832 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 833 | "dev": true, 834 | "license": "MIT", 835 | "peer": true, 836 | "peerDependencies": { 837 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 838 | } 839 | }, 840 | "node_modules/ajv": { 841 | "version": "6.12.6", 842 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 843 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 844 | "dev": true, 845 | "license": "MIT", 846 | "peer": true, 847 | "dependencies": { 848 | "fast-deep-equal": "^3.1.1", 849 | "fast-json-stable-stringify": "^2.0.0", 850 | "json-schema-traverse": "^0.4.1", 851 | "uri-js": "^4.2.2" 852 | }, 853 | "funding": { 854 | "type": "github", 855 | "url": "https://github.com/sponsors/epoberezkin" 856 | } 857 | }, 858 | "node_modules/ansi-regex": { 859 | "version": "5.0.1", 860 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 861 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 862 | "dev": true, 863 | "license": "MIT", 864 | "peer": true, 865 | "engines": { 866 | "node": ">=8" 867 | } 868 | }, 869 | "node_modules/ansi-styles": { 870 | "version": "4.3.0", 871 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 872 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 873 | "dev": true, 874 | "license": "MIT", 875 | "peer": true, 876 | "dependencies": { 877 | "color-convert": "^2.0.1" 878 | }, 879 | "engines": { 880 | "node": ">=8" 881 | }, 882 | "funding": { 883 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 884 | } 885 | }, 886 | "node_modules/argparse": { 887 | "version": "2.0.1", 888 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 889 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 890 | "dev": true, 891 | "license": "Python-2.0", 892 | "peer": true 893 | }, 894 | "node_modules/array-union": { 895 | "version": "2.1.0", 896 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 897 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 898 | "dev": true, 899 | "license": "MIT", 900 | "engines": { 901 | "node": ">=8" 902 | } 903 | }, 904 | "node_modules/balanced-match": { 905 | "version": "1.0.2", 906 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 907 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 908 | "dev": true, 909 | "license": "MIT", 910 | "peer": true 911 | }, 912 | "node_modules/brace-expansion": { 913 | "version": "1.1.11", 914 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 915 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 916 | "dev": true, 917 | "license": "MIT", 918 | "peer": true, 919 | "dependencies": { 920 | "balanced-match": "^1.0.0", 921 | "concat-map": "0.0.1" 922 | } 923 | }, 924 | "node_modules/braces": { 925 | "version": "3.0.3", 926 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 927 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 928 | "dev": true, 929 | "license": "MIT", 930 | "dependencies": { 931 | "fill-range": "^7.1.1" 932 | }, 933 | "engines": { 934 | "node": ">=8" 935 | } 936 | }, 937 | "node_modules/builtin-modules": { 938 | "version": "3.3.0", 939 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 940 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 941 | "dev": true, 942 | "license": "MIT", 943 | "engines": { 944 | "node": ">=6" 945 | }, 946 | "funding": { 947 | "url": "https://github.com/sponsors/sindresorhus" 948 | } 949 | }, 950 | "node_modules/callsites": { 951 | "version": "3.1.0", 952 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 953 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 954 | "dev": true, 955 | "license": "MIT", 956 | "peer": true, 957 | "engines": { 958 | "node": ">=6" 959 | } 960 | }, 961 | "node_modules/chalk": { 962 | "version": "4.1.2", 963 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 964 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 965 | "dev": true, 966 | "license": "MIT", 967 | "peer": true, 968 | "dependencies": { 969 | "ansi-styles": "^4.1.0", 970 | "supports-color": "^7.1.0" 971 | }, 972 | "engines": { 973 | "node": ">=10" 974 | }, 975 | "funding": { 976 | "url": "https://github.com/chalk/chalk?sponsor=1" 977 | } 978 | }, 979 | "node_modules/color-convert": { 980 | "version": "2.0.1", 981 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 982 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 983 | "dev": true, 984 | "license": "MIT", 985 | "peer": true, 986 | "dependencies": { 987 | "color-name": "~1.1.4" 988 | }, 989 | "engines": { 990 | "node": ">=7.0.0" 991 | } 992 | }, 993 | "node_modules/color-name": { 994 | "version": "1.1.4", 995 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 996 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 997 | "dev": true, 998 | "license": "MIT", 999 | "peer": true 1000 | }, 1001 | "node_modules/concat-map": { 1002 | "version": "0.0.1", 1003 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1004 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1005 | "dev": true, 1006 | "license": "MIT", 1007 | "peer": true 1008 | }, 1009 | "node_modules/cross-spawn": { 1010 | "version": "7.0.3", 1011 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1012 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1013 | "dev": true, 1014 | "license": "MIT", 1015 | "peer": true, 1016 | "dependencies": { 1017 | "path-key": "^3.1.0", 1018 | "shebang-command": "^2.0.0", 1019 | "which": "^2.0.1" 1020 | }, 1021 | "engines": { 1022 | "node": ">= 8" 1023 | } 1024 | }, 1025 | "node_modules/debug": { 1026 | "version": "4.3.6", 1027 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 1028 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 1029 | "dev": true, 1030 | "license": "MIT", 1031 | "dependencies": { 1032 | "ms": "2.1.2" 1033 | }, 1034 | "engines": { 1035 | "node": ">=6.0" 1036 | }, 1037 | "peerDependenciesMeta": { 1038 | "supports-color": { 1039 | "optional": true 1040 | } 1041 | } 1042 | }, 1043 | "node_modules/deep-is": { 1044 | "version": "0.1.4", 1045 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1046 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1047 | "dev": true, 1048 | "license": "MIT", 1049 | "peer": true 1050 | }, 1051 | "node_modules/dir-glob": { 1052 | "version": "3.0.1", 1053 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1054 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1055 | "dev": true, 1056 | "license": "MIT", 1057 | "dependencies": { 1058 | "path-type": "^4.0.0" 1059 | }, 1060 | "engines": { 1061 | "node": ">=8" 1062 | } 1063 | }, 1064 | "node_modules/doctrine": { 1065 | "version": "3.0.0", 1066 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1067 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1068 | "dev": true, 1069 | "license": "Apache-2.0", 1070 | "peer": true, 1071 | "dependencies": { 1072 | "esutils": "^2.0.2" 1073 | }, 1074 | "engines": { 1075 | "node": ">=6.0.0" 1076 | } 1077 | }, 1078 | "node_modules/esbuild": { 1079 | "version": "0.17.3", 1080 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", 1081 | "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", 1082 | "dev": true, 1083 | "hasInstallScript": true, 1084 | "license": "MIT", 1085 | "bin": { 1086 | "esbuild": "bin/esbuild" 1087 | }, 1088 | "engines": { 1089 | "node": ">=12" 1090 | }, 1091 | "optionalDependencies": { 1092 | "@esbuild/android-arm": "0.17.3", 1093 | "@esbuild/android-arm64": "0.17.3", 1094 | "@esbuild/android-x64": "0.17.3", 1095 | "@esbuild/darwin-arm64": "0.17.3", 1096 | "@esbuild/darwin-x64": "0.17.3", 1097 | "@esbuild/freebsd-arm64": "0.17.3", 1098 | "@esbuild/freebsd-x64": "0.17.3", 1099 | "@esbuild/linux-arm": "0.17.3", 1100 | "@esbuild/linux-arm64": "0.17.3", 1101 | "@esbuild/linux-ia32": "0.17.3", 1102 | "@esbuild/linux-loong64": "0.17.3", 1103 | "@esbuild/linux-mips64el": "0.17.3", 1104 | "@esbuild/linux-ppc64": "0.17.3", 1105 | "@esbuild/linux-riscv64": "0.17.3", 1106 | "@esbuild/linux-s390x": "0.17.3", 1107 | "@esbuild/linux-x64": "0.17.3", 1108 | "@esbuild/netbsd-x64": "0.17.3", 1109 | "@esbuild/openbsd-x64": "0.17.3", 1110 | "@esbuild/sunos-x64": "0.17.3", 1111 | "@esbuild/win32-arm64": "0.17.3", 1112 | "@esbuild/win32-ia32": "0.17.3", 1113 | "@esbuild/win32-x64": "0.17.3" 1114 | } 1115 | }, 1116 | "node_modules/escape-string-regexp": { 1117 | "version": "4.0.0", 1118 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1119 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1120 | "dev": true, 1121 | "license": "MIT", 1122 | "peer": true, 1123 | "engines": { 1124 | "node": ">=10" 1125 | }, 1126 | "funding": { 1127 | "url": "https://github.com/sponsors/sindresorhus" 1128 | } 1129 | }, 1130 | "node_modules/eslint": { 1131 | "version": "8.57.0", 1132 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", 1133 | "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", 1134 | "dev": true, 1135 | "license": "MIT", 1136 | "peer": true, 1137 | "dependencies": { 1138 | "@eslint-community/eslint-utils": "^4.2.0", 1139 | "@eslint-community/regexpp": "^4.6.1", 1140 | "@eslint/eslintrc": "^2.1.4", 1141 | "@eslint/js": "8.57.0", 1142 | "@humanwhocodes/config-array": "^0.11.14", 1143 | "@humanwhocodes/module-importer": "^1.0.1", 1144 | "@nodelib/fs.walk": "^1.2.8", 1145 | "@ungap/structured-clone": "^1.2.0", 1146 | "ajv": "^6.12.4", 1147 | "chalk": "^4.0.0", 1148 | "cross-spawn": "^7.0.2", 1149 | "debug": "^4.3.2", 1150 | "doctrine": "^3.0.0", 1151 | "escape-string-regexp": "^4.0.0", 1152 | "eslint-scope": "^7.2.2", 1153 | "eslint-visitor-keys": "^3.4.3", 1154 | "espree": "^9.6.1", 1155 | "esquery": "^1.4.2", 1156 | "esutils": "^2.0.2", 1157 | "fast-deep-equal": "^3.1.3", 1158 | "file-entry-cache": "^6.0.1", 1159 | "find-up": "^5.0.0", 1160 | "glob-parent": "^6.0.2", 1161 | "globals": "^13.19.0", 1162 | "graphemer": "^1.4.0", 1163 | "ignore": "^5.2.0", 1164 | "imurmurhash": "^0.1.4", 1165 | "is-glob": "^4.0.0", 1166 | "is-path-inside": "^3.0.3", 1167 | "js-yaml": "^4.1.0", 1168 | "json-stable-stringify-without-jsonify": "^1.0.1", 1169 | "levn": "^0.4.1", 1170 | "lodash.merge": "^4.6.2", 1171 | "minimatch": "^3.1.2", 1172 | "natural-compare": "^1.4.0", 1173 | "optionator": "^0.9.3", 1174 | "strip-ansi": "^6.0.1", 1175 | "text-table": "^0.2.0" 1176 | }, 1177 | "bin": { 1178 | "eslint": "bin/eslint.js" 1179 | }, 1180 | "engines": { 1181 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1182 | }, 1183 | "funding": { 1184 | "url": "https://opencollective.com/eslint" 1185 | } 1186 | }, 1187 | "node_modules/eslint-scope": { 1188 | "version": "5.1.1", 1189 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1190 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1191 | "dev": true, 1192 | "license": "BSD-2-Clause", 1193 | "dependencies": { 1194 | "esrecurse": "^4.3.0", 1195 | "estraverse": "^4.1.1" 1196 | }, 1197 | "engines": { 1198 | "node": ">=8.0.0" 1199 | } 1200 | }, 1201 | "node_modules/eslint-utils": { 1202 | "version": "3.0.0", 1203 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1204 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1205 | "dev": true, 1206 | "license": "MIT", 1207 | "dependencies": { 1208 | "eslint-visitor-keys": "^2.0.0" 1209 | }, 1210 | "engines": { 1211 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 1212 | }, 1213 | "funding": { 1214 | "url": "https://github.com/sponsors/mysticatea" 1215 | }, 1216 | "peerDependencies": { 1217 | "eslint": ">=5" 1218 | } 1219 | }, 1220 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 1221 | "version": "2.1.0", 1222 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1223 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1224 | "dev": true, 1225 | "license": "Apache-2.0", 1226 | "engines": { 1227 | "node": ">=10" 1228 | } 1229 | }, 1230 | "node_modules/eslint-visitor-keys": { 1231 | "version": "3.4.3", 1232 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1233 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1234 | "dev": true, 1235 | "license": "Apache-2.0", 1236 | "engines": { 1237 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1238 | }, 1239 | "funding": { 1240 | "url": "https://opencollective.com/eslint" 1241 | } 1242 | }, 1243 | "node_modules/eslint/node_modules/eslint-scope": { 1244 | "version": "7.2.2", 1245 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 1246 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 1247 | "dev": true, 1248 | "license": "BSD-2-Clause", 1249 | "peer": true, 1250 | "dependencies": { 1251 | "esrecurse": "^4.3.0", 1252 | "estraverse": "^5.2.0" 1253 | }, 1254 | "engines": { 1255 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1256 | }, 1257 | "funding": { 1258 | "url": "https://opencollective.com/eslint" 1259 | } 1260 | }, 1261 | "node_modules/eslint/node_modules/estraverse": { 1262 | "version": "5.3.0", 1263 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1264 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1265 | "dev": true, 1266 | "license": "BSD-2-Clause", 1267 | "peer": true, 1268 | "engines": { 1269 | "node": ">=4.0" 1270 | } 1271 | }, 1272 | "node_modules/espree": { 1273 | "version": "9.6.1", 1274 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 1275 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 1276 | "dev": true, 1277 | "license": "BSD-2-Clause", 1278 | "peer": true, 1279 | "dependencies": { 1280 | "acorn": "^8.9.0", 1281 | "acorn-jsx": "^5.3.2", 1282 | "eslint-visitor-keys": "^3.4.1" 1283 | }, 1284 | "engines": { 1285 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1286 | }, 1287 | "funding": { 1288 | "url": "https://opencollective.com/eslint" 1289 | } 1290 | }, 1291 | "node_modules/esquery": { 1292 | "version": "1.6.0", 1293 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1294 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1295 | "dev": true, 1296 | "license": "BSD-3-Clause", 1297 | "peer": true, 1298 | "dependencies": { 1299 | "estraverse": "^5.1.0" 1300 | }, 1301 | "engines": { 1302 | "node": ">=0.10" 1303 | } 1304 | }, 1305 | "node_modules/esquery/node_modules/estraverse": { 1306 | "version": "5.3.0", 1307 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1308 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1309 | "dev": true, 1310 | "license": "BSD-2-Clause", 1311 | "peer": true, 1312 | "engines": { 1313 | "node": ">=4.0" 1314 | } 1315 | }, 1316 | "node_modules/esrecurse": { 1317 | "version": "4.3.0", 1318 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1319 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1320 | "dev": true, 1321 | "license": "BSD-2-Clause", 1322 | "dependencies": { 1323 | "estraverse": "^5.2.0" 1324 | }, 1325 | "engines": { 1326 | "node": ">=4.0" 1327 | } 1328 | }, 1329 | "node_modules/esrecurse/node_modules/estraverse": { 1330 | "version": "5.3.0", 1331 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1332 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1333 | "dev": true, 1334 | "license": "BSD-2-Clause", 1335 | "engines": { 1336 | "node": ">=4.0" 1337 | } 1338 | }, 1339 | "node_modules/estraverse": { 1340 | "version": "4.3.0", 1341 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1342 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1343 | "dev": true, 1344 | "license": "BSD-2-Clause", 1345 | "engines": { 1346 | "node": ">=4.0" 1347 | } 1348 | }, 1349 | "node_modules/esutils": { 1350 | "version": "2.0.3", 1351 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1352 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1353 | "dev": true, 1354 | "license": "BSD-2-Clause", 1355 | "peer": true, 1356 | "engines": { 1357 | "node": ">=0.10.0" 1358 | } 1359 | }, 1360 | "node_modules/fast-deep-equal": { 1361 | "version": "3.1.3", 1362 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1363 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1364 | "dev": true, 1365 | "license": "MIT", 1366 | "peer": true 1367 | }, 1368 | "node_modules/fast-glob": { 1369 | "version": "3.3.2", 1370 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1371 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1372 | "dev": true, 1373 | "license": "MIT", 1374 | "dependencies": { 1375 | "@nodelib/fs.stat": "^2.0.2", 1376 | "@nodelib/fs.walk": "^1.2.3", 1377 | "glob-parent": "^5.1.2", 1378 | "merge2": "^1.3.0", 1379 | "micromatch": "^4.0.4" 1380 | }, 1381 | "engines": { 1382 | "node": ">=8.6.0" 1383 | } 1384 | }, 1385 | "node_modules/fast-glob/node_modules/glob-parent": { 1386 | "version": "5.1.2", 1387 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1388 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1389 | "dev": true, 1390 | "license": "ISC", 1391 | "dependencies": { 1392 | "is-glob": "^4.0.1" 1393 | }, 1394 | "engines": { 1395 | "node": ">= 6" 1396 | } 1397 | }, 1398 | "node_modules/fast-json-stable-stringify": { 1399 | "version": "2.1.0", 1400 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1401 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1402 | "dev": true, 1403 | "license": "MIT", 1404 | "peer": true 1405 | }, 1406 | "node_modules/fast-levenshtein": { 1407 | "version": "2.0.6", 1408 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1409 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1410 | "dev": true, 1411 | "license": "MIT", 1412 | "peer": true 1413 | }, 1414 | "node_modules/fastq": { 1415 | "version": "1.17.1", 1416 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1417 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1418 | "dev": true, 1419 | "license": "ISC", 1420 | "dependencies": { 1421 | "reusify": "^1.0.4" 1422 | } 1423 | }, 1424 | "node_modules/file-entry-cache": { 1425 | "version": "6.0.1", 1426 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1427 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1428 | "dev": true, 1429 | "license": "MIT", 1430 | "peer": true, 1431 | "dependencies": { 1432 | "flat-cache": "^3.0.4" 1433 | }, 1434 | "engines": { 1435 | "node": "^10.12.0 || >=12.0.0" 1436 | } 1437 | }, 1438 | "node_modules/fill-range": { 1439 | "version": "7.1.1", 1440 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1441 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1442 | "dev": true, 1443 | "license": "MIT", 1444 | "dependencies": { 1445 | "to-regex-range": "^5.0.1" 1446 | }, 1447 | "engines": { 1448 | "node": ">=8" 1449 | } 1450 | }, 1451 | "node_modules/find-up": { 1452 | "version": "5.0.0", 1453 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1454 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1455 | "dev": true, 1456 | "license": "MIT", 1457 | "peer": true, 1458 | "dependencies": { 1459 | "locate-path": "^6.0.0", 1460 | "path-exists": "^4.0.0" 1461 | }, 1462 | "engines": { 1463 | "node": ">=10" 1464 | }, 1465 | "funding": { 1466 | "url": "https://github.com/sponsors/sindresorhus" 1467 | } 1468 | }, 1469 | "node_modules/flat-cache": { 1470 | "version": "3.2.0", 1471 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 1472 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 1473 | "dev": true, 1474 | "license": "MIT", 1475 | "peer": true, 1476 | "dependencies": { 1477 | "flatted": "^3.2.9", 1478 | "keyv": "^4.5.3", 1479 | "rimraf": "^3.0.2" 1480 | }, 1481 | "engines": { 1482 | "node": "^10.12.0 || >=12.0.0" 1483 | } 1484 | }, 1485 | "node_modules/flatted": { 1486 | "version": "3.3.1", 1487 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 1488 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 1489 | "dev": true, 1490 | "license": "ISC", 1491 | "peer": true 1492 | }, 1493 | "node_modules/fs.realpath": { 1494 | "version": "1.0.0", 1495 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1496 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1497 | "dev": true, 1498 | "license": "ISC", 1499 | "peer": true 1500 | }, 1501 | "node_modules/functional-red-black-tree": { 1502 | "version": "1.0.1", 1503 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1504 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 1505 | "dev": true, 1506 | "license": "MIT" 1507 | }, 1508 | "node_modules/glob": { 1509 | "version": "7.2.3", 1510 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1511 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1512 | "deprecated": "Glob versions prior to v9 are no longer supported", 1513 | "dev": true, 1514 | "license": "ISC", 1515 | "peer": true, 1516 | "dependencies": { 1517 | "fs.realpath": "^1.0.0", 1518 | "inflight": "^1.0.4", 1519 | "inherits": "2", 1520 | "minimatch": "^3.1.1", 1521 | "once": "^1.3.0", 1522 | "path-is-absolute": "^1.0.0" 1523 | }, 1524 | "engines": { 1525 | "node": "*" 1526 | }, 1527 | "funding": { 1528 | "url": "https://github.com/sponsors/isaacs" 1529 | } 1530 | }, 1531 | "node_modules/glob-parent": { 1532 | "version": "6.0.2", 1533 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1534 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1535 | "dev": true, 1536 | "license": "ISC", 1537 | "peer": true, 1538 | "dependencies": { 1539 | "is-glob": "^4.0.3" 1540 | }, 1541 | "engines": { 1542 | "node": ">=10.13.0" 1543 | } 1544 | }, 1545 | "node_modules/globals": { 1546 | "version": "13.24.0", 1547 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 1548 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 1549 | "dev": true, 1550 | "license": "MIT", 1551 | "peer": true, 1552 | "dependencies": { 1553 | "type-fest": "^0.20.2" 1554 | }, 1555 | "engines": { 1556 | "node": ">=8" 1557 | }, 1558 | "funding": { 1559 | "url": "https://github.com/sponsors/sindresorhus" 1560 | } 1561 | }, 1562 | "node_modules/globby": { 1563 | "version": "11.1.0", 1564 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1565 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1566 | "dev": true, 1567 | "license": "MIT", 1568 | "dependencies": { 1569 | "array-union": "^2.1.0", 1570 | "dir-glob": "^3.0.1", 1571 | "fast-glob": "^3.2.9", 1572 | "ignore": "^5.2.0", 1573 | "merge2": "^1.4.1", 1574 | "slash": "^3.0.0" 1575 | }, 1576 | "engines": { 1577 | "node": ">=10" 1578 | }, 1579 | "funding": { 1580 | "url": "https://github.com/sponsors/sindresorhus" 1581 | } 1582 | }, 1583 | "node_modules/graphemer": { 1584 | "version": "1.4.0", 1585 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1586 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1587 | "dev": true, 1588 | "license": "MIT", 1589 | "peer": true 1590 | }, 1591 | "node_modules/has-flag": { 1592 | "version": "4.0.0", 1593 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1594 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1595 | "dev": true, 1596 | "license": "MIT", 1597 | "peer": true, 1598 | "engines": { 1599 | "node": ">=8" 1600 | } 1601 | }, 1602 | "node_modules/ignore": { 1603 | "version": "5.3.1", 1604 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", 1605 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", 1606 | "dev": true, 1607 | "license": "MIT", 1608 | "engines": { 1609 | "node": ">= 4" 1610 | } 1611 | }, 1612 | "node_modules/import-fresh": { 1613 | "version": "3.3.0", 1614 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1615 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1616 | "dev": true, 1617 | "license": "MIT", 1618 | "peer": true, 1619 | "dependencies": { 1620 | "parent-module": "^1.0.0", 1621 | "resolve-from": "^4.0.0" 1622 | }, 1623 | "engines": { 1624 | "node": ">=6" 1625 | }, 1626 | "funding": { 1627 | "url": "https://github.com/sponsors/sindresorhus" 1628 | } 1629 | }, 1630 | "node_modules/imurmurhash": { 1631 | "version": "0.1.4", 1632 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1633 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1634 | "dev": true, 1635 | "license": "MIT", 1636 | "peer": true, 1637 | "engines": { 1638 | "node": ">=0.8.19" 1639 | } 1640 | }, 1641 | "node_modules/inflight": { 1642 | "version": "1.0.6", 1643 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1644 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1645 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1646 | "dev": true, 1647 | "license": "ISC", 1648 | "peer": true, 1649 | "dependencies": { 1650 | "once": "^1.3.0", 1651 | "wrappy": "1" 1652 | } 1653 | }, 1654 | "node_modules/inherits": { 1655 | "version": "2.0.4", 1656 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1657 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1658 | "dev": true, 1659 | "license": "ISC", 1660 | "peer": true 1661 | }, 1662 | "node_modules/is-extglob": { 1663 | "version": "2.1.1", 1664 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1665 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1666 | "dev": true, 1667 | "license": "MIT", 1668 | "engines": { 1669 | "node": ">=0.10.0" 1670 | } 1671 | }, 1672 | "node_modules/is-glob": { 1673 | "version": "4.0.3", 1674 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1675 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1676 | "dev": true, 1677 | "license": "MIT", 1678 | "dependencies": { 1679 | "is-extglob": "^2.1.1" 1680 | }, 1681 | "engines": { 1682 | "node": ">=0.10.0" 1683 | } 1684 | }, 1685 | "node_modules/is-number": { 1686 | "version": "7.0.0", 1687 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1688 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1689 | "dev": true, 1690 | "license": "MIT", 1691 | "engines": { 1692 | "node": ">=0.12.0" 1693 | } 1694 | }, 1695 | "node_modules/is-path-inside": { 1696 | "version": "3.0.3", 1697 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1698 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1699 | "dev": true, 1700 | "license": "MIT", 1701 | "peer": true, 1702 | "engines": { 1703 | "node": ">=8" 1704 | } 1705 | }, 1706 | "node_modules/isexe": { 1707 | "version": "2.0.0", 1708 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1709 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1710 | "dev": true, 1711 | "license": "ISC", 1712 | "peer": true 1713 | }, 1714 | "node_modules/js-yaml": { 1715 | "version": "4.1.0", 1716 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1717 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1718 | "dev": true, 1719 | "license": "MIT", 1720 | "peer": true, 1721 | "dependencies": { 1722 | "argparse": "^2.0.1" 1723 | }, 1724 | "bin": { 1725 | "js-yaml": "bin/js-yaml.js" 1726 | } 1727 | }, 1728 | "node_modules/json-buffer": { 1729 | "version": "3.0.1", 1730 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1731 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1732 | "dev": true, 1733 | "license": "MIT", 1734 | "peer": true 1735 | }, 1736 | "node_modules/json-schema-traverse": { 1737 | "version": "0.4.1", 1738 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1739 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1740 | "dev": true, 1741 | "license": "MIT", 1742 | "peer": true 1743 | }, 1744 | "node_modules/json-stable-stringify-without-jsonify": { 1745 | "version": "1.0.1", 1746 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1747 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1748 | "dev": true, 1749 | "license": "MIT", 1750 | "peer": true 1751 | }, 1752 | "node_modules/keyv": { 1753 | "version": "4.5.4", 1754 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1755 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1756 | "dev": true, 1757 | "license": "MIT", 1758 | "peer": true, 1759 | "dependencies": { 1760 | "json-buffer": "3.0.1" 1761 | } 1762 | }, 1763 | "node_modules/levn": { 1764 | "version": "0.4.1", 1765 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1766 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1767 | "dev": true, 1768 | "license": "MIT", 1769 | "peer": true, 1770 | "dependencies": { 1771 | "prelude-ls": "^1.2.1", 1772 | "type-check": "~0.4.0" 1773 | }, 1774 | "engines": { 1775 | "node": ">= 0.8.0" 1776 | } 1777 | }, 1778 | "node_modules/locate-path": { 1779 | "version": "6.0.0", 1780 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1781 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1782 | "dev": true, 1783 | "license": "MIT", 1784 | "peer": true, 1785 | "dependencies": { 1786 | "p-locate": "^5.0.0" 1787 | }, 1788 | "engines": { 1789 | "node": ">=10" 1790 | }, 1791 | "funding": { 1792 | "url": "https://github.com/sponsors/sindresorhus" 1793 | } 1794 | }, 1795 | "node_modules/lodash.merge": { 1796 | "version": "4.6.2", 1797 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1798 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1799 | "dev": true, 1800 | "license": "MIT", 1801 | "peer": true 1802 | }, 1803 | "node_modules/merge2": { 1804 | "version": "1.4.1", 1805 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1806 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1807 | "dev": true, 1808 | "license": "MIT", 1809 | "engines": { 1810 | "node": ">= 8" 1811 | } 1812 | }, 1813 | "node_modules/micromatch": { 1814 | "version": "4.0.7", 1815 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", 1816 | "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", 1817 | "dev": true, 1818 | "license": "MIT", 1819 | "dependencies": { 1820 | "braces": "^3.0.3", 1821 | "picomatch": "^2.3.1" 1822 | }, 1823 | "engines": { 1824 | "node": ">=8.6" 1825 | } 1826 | }, 1827 | "node_modules/minimatch": { 1828 | "version": "3.1.2", 1829 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1830 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1831 | "dev": true, 1832 | "license": "ISC", 1833 | "peer": true, 1834 | "dependencies": { 1835 | "brace-expansion": "^1.1.7" 1836 | }, 1837 | "engines": { 1838 | "node": "*" 1839 | } 1840 | }, 1841 | "node_modules/moment": { 1842 | "version": "2.29.4", 1843 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", 1844 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", 1845 | "dev": true, 1846 | "license": "MIT", 1847 | "engines": { 1848 | "node": "*" 1849 | } 1850 | }, 1851 | "node_modules/ms": { 1852 | "version": "2.1.2", 1853 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1854 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1855 | "dev": true, 1856 | "license": "MIT" 1857 | }, 1858 | "node_modules/natural-compare": { 1859 | "version": "1.4.0", 1860 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1861 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1862 | "dev": true, 1863 | "license": "MIT", 1864 | "peer": true 1865 | }, 1866 | "node_modules/obsidian": { 1867 | "version": "1.6.6", 1868 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.6.6.tgz", 1869 | "integrity": "sha512-GZHzeOiwmw/wBjB5JwrsxAZBLqxGQmqtEKSvJJvT0LtTcqeOFnV8jv0ZK5kO7hBb44WxJc+LdS7mZgLXbb+qXQ==", 1870 | "dev": true, 1871 | "license": "MIT", 1872 | "dependencies": { 1873 | "@types/codemirror": "5.60.8", 1874 | "moment": "2.29.4" 1875 | }, 1876 | "peerDependencies": { 1877 | "@codemirror/state": "^6.0.0", 1878 | "@codemirror/view": "^6.0.0" 1879 | } 1880 | }, 1881 | "node_modules/once": { 1882 | "version": "1.4.0", 1883 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1884 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1885 | "dev": true, 1886 | "license": "ISC", 1887 | "peer": true, 1888 | "dependencies": { 1889 | "wrappy": "1" 1890 | } 1891 | }, 1892 | "node_modules/optionator": { 1893 | "version": "0.9.4", 1894 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1895 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1896 | "dev": true, 1897 | "license": "MIT", 1898 | "peer": true, 1899 | "dependencies": { 1900 | "deep-is": "^0.1.3", 1901 | "fast-levenshtein": "^2.0.6", 1902 | "levn": "^0.4.1", 1903 | "prelude-ls": "^1.2.1", 1904 | "type-check": "^0.4.0", 1905 | "word-wrap": "^1.2.5" 1906 | }, 1907 | "engines": { 1908 | "node": ">= 0.8.0" 1909 | } 1910 | }, 1911 | "node_modules/p-limit": { 1912 | "version": "3.1.0", 1913 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1914 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1915 | "dev": true, 1916 | "license": "MIT", 1917 | "peer": true, 1918 | "dependencies": { 1919 | "yocto-queue": "^0.1.0" 1920 | }, 1921 | "engines": { 1922 | "node": ">=10" 1923 | }, 1924 | "funding": { 1925 | "url": "https://github.com/sponsors/sindresorhus" 1926 | } 1927 | }, 1928 | "node_modules/p-locate": { 1929 | "version": "5.0.0", 1930 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1931 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1932 | "dev": true, 1933 | "license": "MIT", 1934 | "peer": true, 1935 | "dependencies": { 1936 | "p-limit": "^3.0.2" 1937 | }, 1938 | "engines": { 1939 | "node": ">=10" 1940 | }, 1941 | "funding": { 1942 | "url": "https://github.com/sponsors/sindresorhus" 1943 | } 1944 | }, 1945 | "node_modules/papaparse": { 1946 | "version": "5.4.1", 1947 | "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", 1948 | "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", 1949 | "license": "MIT" 1950 | }, 1951 | "node_modules/parent-module": { 1952 | "version": "1.0.1", 1953 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1954 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1955 | "dev": true, 1956 | "license": "MIT", 1957 | "peer": true, 1958 | "dependencies": { 1959 | "callsites": "^3.0.0" 1960 | }, 1961 | "engines": { 1962 | "node": ">=6" 1963 | } 1964 | }, 1965 | "node_modules/path-exists": { 1966 | "version": "4.0.0", 1967 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1968 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1969 | "dev": true, 1970 | "license": "MIT", 1971 | "peer": true, 1972 | "engines": { 1973 | "node": ">=8" 1974 | } 1975 | }, 1976 | "node_modules/path-is-absolute": { 1977 | "version": "1.0.1", 1978 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1979 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1980 | "dev": true, 1981 | "license": "MIT", 1982 | "peer": true, 1983 | "engines": { 1984 | "node": ">=0.10.0" 1985 | } 1986 | }, 1987 | "node_modules/path-key": { 1988 | "version": "3.1.1", 1989 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1990 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1991 | "dev": true, 1992 | "license": "MIT", 1993 | "peer": true, 1994 | "engines": { 1995 | "node": ">=8" 1996 | } 1997 | }, 1998 | "node_modules/path-type": { 1999 | "version": "4.0.0", 2000 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2001 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2002 | "dev": true, 2003 | "license": "MIT", 2004 | "engines": { 2005 | "node": ">=8" 2006 | } 2007 | }, 2008 | "node_modules/picomatch": { 2009 | "version": "2.3.1", 2010 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2011 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2012 | "dev": true, 2013 | "license": "MIT", 2014 | "engines": { 2015 | "node": ">=8.6" 2016 | }, 2017 | "funding": { 2018 | "url": "https://github.com/sponsors/jonschlinkert" 2019 | } 2020 | }, 2021 | "node_modules/prelude-ls": { 2022 | "version": "1.2.1", 2023 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2024 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2025 | "dev": true, 2026 | "license": "MIT", 2027 | "peer": true, 2028 | "engines": { 2029 | "node": ">= 0.8.0" 2030 | } 2031 | }, 2032 | "node_modules/punycode": { 2033 | "version": "2.3.1", 2034 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2035 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2036 | "dev": true, 2037 | "license": "MIT", 2038 | "peer": true, 2039 | "engines": { 2040 | "node": ">=6" 2041 | } 2042 | }, 2043 | "node_modules/queue-microtask": { 2044 | "version": "1.2.3", 2045 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2046 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2047 | "dev": true, 2048 | "funding": [ 2049 | { 2050 | "type": "github", 2051 | "url": "https://github.com/sponsors/feross" 2052 | }, 2053 | { 2054 | "type": "patreon", 2055 | "url": "https://www.patreon.com/feross" 2056 | }, 2057 | { 2058 | "type": "consulting", 2059 | "url": "https://feross.org/support" 2060 | } 2061 | ], 2062 | "license": "MIT" 2063 | }, 2064 | "node_modules/regexpp": { 2065 | "version": "3.2.0", 2066 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 2067 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 2068 | "dev": true, 2069 | "license": "MIT", 2070 | "engines": { 2071 | "node": ">=8" 2072 | }, 2073 | "funding": { 2074 | "url": "https://github.com/sponsors/mysticatea" 2075 | } 2076 | }, 2077 | "node_modules/resolve-from": { 2078 | "version": "4.0.0", 2079 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2080 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2081 | "dev": true, 2082 | "license": "MIT", 2083 | "peer": true, 2084 | "engines": { 2085 | "node": ">=4" 2086 | } 2087 | }, 2088 | "node_modules/reusify": { 2089 | "version": "1.0.4", 2090 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2091 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2092 | "dev": true, 2093 | "license": "MIT", 2094 | "engines": { 2095 | "iojs": ">=1.0.0", 2096 | "node": ">=0.10.0" 2097 | } 2098 | }, 2099 | "node_modules/rimraf": { 2100 | "version": "3.0.2", 2101 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2102 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2103 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 2104 | "dev": true, 2105 | "license": "ISC", 2106 | "peer": true, 2107 | "dependencies": { 2108 | "glob": "^7.1.3" 2109 | }, 2110 | "bin": { 2111 | "rimraf": "bin.js" 2112 | }, 2113 | "funding": { 2114 | "url": "https://github.com/sponsors/isaacs" 2115 | } 2116 | }, 2117 | "node_modules/run-parallel": { 2118 | "version": "1.2.0", 2119 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2120 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2121 | "dev": true, 2122 | "funding": [ 2123 | { 2124 | "type": "github", 2125 | "url": "https://github.com/sponsors/feross" 2126 | }, 2127 | { 2128 | "type": "patreon", 2129 | "url": "https://www.patreon.com/feross" 2130 | }, 2131 | { 2132 | "type": "consulting", 2133 | "url": "https://feross.org/support" 2134 | } 2135 | ], 2136 | "license": "MIT", 2137 | "dependencies": { 2138 | "queue-microtask": "^1.2.2" 2139 | } 2140 | }, 2141 | "node_modules/semver": { 2142 | "version": "7.6.3", 2143 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 2144 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 2145 | "dev": true, 2146 | "license": "ISC", 2147 | "bin": { 2148 | "semver": "bin/semver.js" 2149 | }, 2150 | "engines": { 2151 | "node": ">=10" 2152 | } 2153 | }, 2154 | "node_modules/shebang-command": { 2155 | "version": "2.0.0", 2156 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2157 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2158 | "dev": true, 2159 | "license": "MIT", 2160 | "peer": true, 2161 | "dependencies": { 2162 | "shebang-regex": "^3.0.0" 2163 | }, 2164 | "engines": { 2165 | "node": ">=8" 2166 | } 2167 | }, 2168 | "node_modules/shebang-regex": { 2169 | "version": "3.0.0", 2170 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2171 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2172 | "dev": true, 2173 | "license": "MIT", 2174 | "peer": true, 2175 | "engines": { 2176 | "node": ">=8" 2177 | } 2178 | }, 2179 | "node_modules/slash": { 2180 | "version": "3.0.0", 2181 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2182 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2183 | "dev": true, 2184 | "license": "MIT", 2185 | "engines": { 2186 | "node": ">=8" 2187 | } 2188 | }, 2189 | "node_modules/strip-ansi": { 2190 | "version": "6.0.1", 2191 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2192 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2193 | "dev": true, 2194 | "license": "MIT", 2195 | "peer": true, 2196 | "dependencies": { 2197 | "ansi-regex": "^5.0.1" 2198 | }, 2199 | "engines": { 2200 | "node": ">=8" 2201 | } 2202 | }, 2203 | "node_modules/strip-json-comments": { 2204 | "version": "3.1.1", 2205 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2206 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2207 | "dev": true, 2208 | "license": "MIT", 2209 | "peer": true, 2210 | "engines": { 2211 | "node": ">=8" 2212 | }, 2213 | "funding": { 2214 | "url": "https://github.com/sponsors/sindresorhus" 2215 | } 2216 | }, 2217 | "node_modules/style-mod": { 2218 | "version": "4.1.2", 2219 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", 2220 | "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", 2221 | "dev": true, 2222 | "license": "MIT", 2223 | "peer": true 2224 | }, 2225 | "node_modules/supports-color": { 2226 | "version": "7.2.0", 2227 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2228 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2229 | "dev": true, 2230 | "license": "MIT", 2231 | "peer": true, 2232 | "dependencies": { 2233 | "has-flag": "^4.0.0" 2234 | }, 2235 | "engines": { 2236 | "node": ">=8" 2237 | } 2238 | }, 2239 | "node_modules/text-table": { 2240 | "version": "0.2.0", 2241 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2242 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2243 | "dev": true, 2244 | "license": "MIT", 2245 | "peer": true 2246 | }, 2247 | "node_modules/to-regex-range": { 2248 | "version": "5.0.1", 2249 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2250 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2251 | "dev": true, 2252 | "license": "MIT", 2253 | "dependencies": { 2254 | "is-number": "^7.0.0" 2255 | }, 2256 | "engines": { 2257 | "node": ">=8.0" 2258 | } 2259 | }, 2260 | "node_modules/tslib": { 2261 | "version": "2.4.0", 2262 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 2263 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 2264 | "dev": true, 2265 | "license": "0BSD" 2266 | }, 2267 | "node_modules/tsutils": { 2268 | "version": "3.21.0", 2269 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 2270 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 2271 | "dev": true, 2272 | "license": "MIT", 2273 | "dependencies": { 2274 | "tslib": "^1.8.1" 2275 | }, 2276 | "engines": { 2277 | "node": ">= 6" 2278 | }, 2279 | "peerDependencies": { 2280 | "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" 2281 | } 2282 | }, 2283 | "node_modules/tsutils/node_modules/tslib": { 2284 | "version": "1.14.1", 2285 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2286 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2287 | "dev": true, 2288 | "license": "0BSD" 2289 | }, 2290 | "node_modules/type-check": { 2291 | "version": "0.4.0", 2292 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2293 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2294 | "dev": true, 2295 | "license": "MIT", 2296 | "peer": true, 2297 | "dependencies": { 2298 | "prelude-ls": "^1.2.1" 2299 | }, 2300 | "engines": { 2301 | "node": ">= 0.8.0" 2302 | } 2303 | }, 2304 | "node_modules/type-fest": { 2305 | "version": "0.20.2", 2306 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2307 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2308 | "dev": true, 2309 | "license": "(MIT OR CC0-1.0)", 2310 | "peer": true, 2311 | "engines": { 2312 | "node": ">=10" 2313 | }, 2314 | "funding": { 2315 | "url": "https://github.com/sponsors/sindresorhus" 2316 | } 2317 | }, 2318 | "node_modules/typescript": { 2319 | "version": "4.7.4", 2320 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", 2321 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", 2322 | "dev": true, 2323 | "license": "Apache-2.0", 2324 | "bin": { 2325 | "tsc": "bin/tsc", 2326 | "tsserver": "bin/tsserver" 2327 | }, 2328 | "engines": { 2329 | "node": ">=4.2.0" 2330 | } 2331 | }, 2332 | "node_modules/uri-js": { 2333 | "version": "4.4.1", 2334 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2335 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2336 | "dev": true, 2337 | "license": "BSD-2-Clause", 2338 | "peer": true, 2339 | "dependencies": { 2340 | "punycode": "^2.1.0" 2341 | } 2342 | }, 2343 | "node_modules/w3c-keyname": { 2344 | "version": "2.2.8", 2345 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", 2346 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", 2347 | "dev": true, 2348 | "license": "MIT", 2349 | "peer": true 2350 | }, 2351 | "node_modules/which": { 2352 | "version": "2.0.2", 2353 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2354 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2355 | "dev": true, 2356 | "license": "ISC", 2357 | "peer": true, 2358 | "dependencies": { 2359 | "isexe": "^2.0.0" 2360 | }, 2361 | "bin": { 2362 | "node-which": "bin/node-which" 2363 | }, 2364 | "engines": { 2365 | "node": ">= 8" 2366 | } 2367 | }, 2368 | "node_modules/word-wrap": { 2369 | "version": "1.2.5", 2370 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2371 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2372 | "dev": true, 2373 | "license": "MIT", 2374 | "peer": true, 2375 | "engines": { 2376 | "node": ">=0.10.0" 2377 | } 2378 | }, 2379 | "node_modules/wrappy": { 2380 | "version": "1.0.2", 2381 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2382 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2383 | "dev": true, 2384 | "license": "ISC", 2385 | "peer": true 2386 | }, 2387 | "node_modules/yocto-queue": { 2388 | "version": "0.1.0", 2389 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2390 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2391 | "dev": true, 2392 | "license": "MIT", 2393 | "peer": true, 2394 | "engines": { 2395 | "node": ">=10" 2396 | }, 2397 | "funding": { 2398 | "url": "https://github.com/sponsors/sindresorhus" 2399 | } 2400 | } 2401 | } 2402 | } 2403 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-snippets-manager", 3 | "version": "1.0.0", 4 | "description": "Snippets manager for Obsidian", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json" 10 | }, 11 | "keywords": [], 12 | "author": "Venkatraman Dhamodaran", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@types/node": "^16.11.6", 16 | "@types/papaparse": "^5.3.14", 17 | "@typescript-eslint/eslint-plugin": "5.29.0", 18 | "@typescript-eslint/parser": "5.29.0", 19 | "builtin-modules": "3.3.0", 20 | "esbuild": "0.17.3", 21 | "obsidian": "latest", 22 | "tslib": "2.4.0", 23 | "typescript": "4.7.4" 24 | }, 25 | "dependencies": { 26 | "papaparse": "^5.4.1" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/ChatGPTPromptManager.ts: -------------------------------------------------------------------------------- 1 | import { TFolder, TFile, Notice } from 'obsidian'; 2 | import * as Papa from 'papaparse'; 3 | 4 | export default class ChatGPTPromptManager { 5 | plugin: any; 6 | 7 | constructor(plugin: any) { 8 | this.plugin = plugin; 9 | } 10 | 11 | async fetchLatestChatGPTPrompts(snippetFolderPath: string) { 12 | try { 13 | // Step 1: Fetch the latest content from the Awesome ChatGPT Prompts repository 14 | const response = await fetch('https://raw.githubusercontent.com/f/awesome-chatgpt-prompts/main/prompts.csv'); 15 | if (!response.ok) { 16 | throw new Error('Failed to fetch the latest prompts file'); 17 | } 18 | 19 | const csvContent = await response.text(); 20 | 21 | // Step 2: Convert the CSV content to Markdown format 22 | const markdownContent = this.convertCSVToMarkdown(csvContent); 23 | 24 | // Step 3: Create a markdown file in the snippets folder 25 | await this.createMarkdownFile(snippetFolderPath, 'Awesome ChatGPT Prompts.md', markdownContent); 26 | 27 | new Notice('Awesome ChatGPT Prompts file has been successfully saved to your snippets folder!'); 28 | } catch (error) { 29 | console.error('Error fetching ChatGPT prompts:', error); 30 | new Notice('Failed to fetch and save the latest Awesome ChatGPT Prompts.'); 31 | } 32 | } 33 | 34 | convertCSVToMarkdown(csvContent: string): string { 35 | // Parse CSV content using Papa Parse 36 | const parsedData = Papa.parse<{ act: string, prompt: string }>(csvContent, { 37 | header: true, // Skip the header row automatically 38 | skipEmptyLines: true, // Ignore empty lines 39 | }); 40 | 41 | let markdownContent = ''; 42 | 43 | // Iterate through each row of the parsed data 44 | parsedData.data.forEach((row: any) => { 45 | const act = row['act']; // Assuming this is the header in your CSV 46 | const prompt = row['prompt']; // Replace 'Prompt' with the actual column name from your CSV 47 | 48 | if (act && prompt) { 49 | markdownContent += `### ${act.trim()}\n${prompt.trim()}\n\n`; 50 | } 51 | }); 52 | 53 | return markdownContent; 54 | } 55 | 56 | // Helper method to create a markdown file in the specified folder 57 | async createMarkdownFile(folderPath: string, fileName: string, content: string) { 58 | const folder = this.plugin.app.vault.getAbstractFileByPath(folderPath); 59 | 60 | if (folder && folder instanceof TFolder) { 61 | const filePath = `${folder.path}/${fileName}`; 62 | const existingFile = this.plugin.app.vault.getAbstractFileByPath(filePath); 63 | 64 | if (existingFile && existingFile instanceof TFile) { 65 | await this.plugin.app.vault.modify(existingFile, content); // Overwrite if the file exists 66 | } else { 67 | await this.plugin.app.vault.create(filePath, content); // Create a new file if it doesn't exist 68 | } 69 | } else { 70 | new Notice(`The folder path ${folderPath} does not exist or is not a valid folder.`); 71 | throw new Error('Invalid folder path'); 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/SnippetManagerPlugin.ts: -------------------------------------------------------------------------------- 1 | import { Plugin, Notice, TFile, TFolder, CachedMetadata } from 'obsidian'; 2 | import SnippetSuggestModal from './SnippetSuggestModal'; 3 | import SnippetManagerSettingTab from './SnippetManagerSettingTab'; 4 | import ChatGPTPromptManager from './ChatGPTPromptManager'; 5 | 6 | export interface SnippetManagerSettings { 7 | snippetPath: string; // Can be either a file or a directory 8 | alfredSupport: boolean; 9 | } 10 | 11 | const DEFAULT_SETTINGS: SnippetManagerSettings = { 12 | snippetPath: "Snippets.md", // Default to single file for backward compatibility 13 | alfredSupport: false, 14 | }; 15 | 16 | export default class SnippetManagerPlugin extends Plugin { 17 | settings: SnippetManagerSettings; 18 | snippets: Record = {}; 19 | lastModifiedTimes: Record = {}; // Track modified times for multiple files 20 | isSnippetsReloaded = false; 21 | 22 | async onload() { 23 | // Load settings 24 | await this.loadSettings(); 25 | 26 | // Add settings tab 27 | this.addSettingTab(new SnippetManagerSettingTab(this.app, this)); 28 | 29 | // Add command to trigger the fuzzy suggester 30 | this.addCommand({ 31 | id: 'open-snippet-search', 32 | name: 'Search Snippets', 33 | editorCallback: (editor, view) => { 34 | new SnippetSuggestModal(this.app, this, editor).open(); 35 | } 36 | }); 37 | 38 | // Add command to sync Awesome ChatGPT prompts 39 | this.addCommand({ 40 | id: 'sync-chatgpt-prompts', 41 | name: 'Sync Awesome ChatGPT Prompts', 42 | callback: async () => { 43 | const snippetPath = this.settings.snippetPath; // You can make this dynamic based on user settings 44 | const fileOrFolder = this.app.vault.getAbstractFileByPath(snippetPath); 45 | if (!fileOrFolder) { 46 | new Notice(`Snippet path not found: ${snippetPath}`); 47 | return; 48 | } 49 | if (fileOrFolder instanceof TFolder) { 50 | const promptManager = new ChatGPTPromptManager(this); 51 | // Define your snippets folder path, e.g., 'Snippets/' 52 | await promptManager.fetchLatestChatGPTPrompts(snippetPath); 53 | this.loadSnippets(); 54 | } 55 | else { 56 | new Notice(`Error: Snippet path should be an folder.`); 57 | } 58 | 59 | } 60 | }); 61 | 62 | // Wait for the layout to be ready before loading snippets 63 | this.app.workspace.onLayoutReady(() => { 64 | this.loadSnippets(); 65 | }); 66 | } 67 | 68 | clearSnippets() { 69 | this.snippets = {}; 70 | this.lastModifiedTimes = {}; 71 | } 72 | 73 | async loadSnippets() { 74 | this.isSnippetsReloaded = false; 75 | const snippetPath = this.settings.snippetPath; 76 | const fileOrFolder = this.app.vault.getAbstractFileByPath(snippetPath); 77 | 78 | if (!fileOrFolder) { 79 | new Notice(`Snippet path not found: ${snippetPath}`); 80 | return; 81 | } 82 | 83 | if (fileOrFolder instanceof TFolder) { 84 | const markdownFiles = this.getAllMarkdownFiles(fileOrFolder); 85 | const addFilePrefix = markdownFiles.length > 1; 86 | 87 | // Handle directory: load snippets from all markdown files in the folder 88 | for (let file of markdownFiles) { 89 | if (file instanceof TFile) { 90 | await this.loadSnippetsFromFile(file, addFilePrefix); 91 | } 92 | } 93 | } else if (fileOrFolder instanceof TFile && fileOrFolder.extension === 'md') { 94 | // Handle single file 95 | await this.loadSnippetsFromFile(fileOrFolder, false); 96 | } else { 97 | new Notice(`Invalid snippet path: ${snippetPath}`); 98 | } 99 | 100 | if(this.isSnippetsReloaded) { 101 | await this.saveSnippetsAsAlfredJson(); 102 | this.isSnippetsReloaded = false; 103 | } 104 | } 105 | 106 | async loadSnippetsFromFile(file: TFile, addFilePrefix: boolean) { 107 | const filePath = file.path; 108 | const fileStat = await this.app.vault.adapter.stat(filePath); 109 | const modifiedTime = fileStat?.mtime; 110 | 111 | // Check if the file has been modified since the last load 112 | if (modifiedTime && (!this.lastModifiedTimes[filePath] || modifiedTime > this.lastModifiedTimes[filePath])) { 113 | const content = await this.app.vault.cachedRead(file); 114 | const contentCache = this.app.metadataCache.getFileCache(file); 115 | 116 | // Merge snippets from this file into the global snippets 117 | const filePrefix = addFilePrefix ? this.getRelativePath(file, this.settings.snippetPath) : null; 118 | Object.assign(this.snippets, this.getSnippets(content, contentCache, filePrefix)); 119 | 120 | this.lastModifiedTimes[filePath] = modifiedTime; 121 | // new Notice(`Snippets reloaded from: ${filePath}`); 122 | this.isSnippetsReloaded = true; 123 | } 124 | } 125 | 126 | getSnippets(content: string, contentCache: CachedMetadata | null, filePrefix: string | null): Record { 127 | const snippets: Record = {}; 128 | 129 | if (!contentCache?.headings) { 130 | return snippets; // No headings found, return empty snippets 131 | } 132 | 133 | const headings = contentCache.headings; 134 | const level = headings[0].level; 135 | 136 | // Ensure all headings are at the same level 137 | for (let i = 0; i < headings.length; i++) { 138 | if (headings[i].level !== level) { 139 | new Notice(`Please follow the same heading level throughout the file`); 140 | return snippets; 141 | } 142 | } 143 | 144 | // Iterate over headings and capture content 145 | for (let i = 0; i < headings.length; i++) { 146 | const currentHeading = headings[i]; 147 | let sectionContent = ''; 148 | 149 | if (i + 1 === headings.length) { 150 | sectionContent = content.slice(currentHeading.position.end.offset + 1); 151 | } else { 152 | const nextHeading = headings[i + 1]; 153 | sectionContent = content.slice( 154 | currentHeading.position.end.offset + 1, 155 | nextHeading.position.start.offset - 1 156 | ); 157 | } 158 | 159 | // Remove code block formatting 160 | sectionContent = this.stripCodeBlockFormatting(sectionContent).trim(); 161 | 162 | // Prefix with file name if needed 163 | const snippetKey = filePrefix && filePrefix !== '' ? `${filePrefix}: ${currentHeading.heading}` : currentHeading.heading; 164 | 165 | // Store the section content with the heading as the key 166 | snippets[snippetKey] = sectionContent; 167 | } 168 | 169 | return snippets; 170 | } 171 | 172 | stripCodeBlockFormatting(content: string): string { 173 | return content.replace(/```[\s\S]*?```/g, (match) => { 174 | // Remove the starting and ending backticks, and any language identifier 175 | return match.replace(/```(\w+)?\n?/, '').replace(/\n?```$/, ''); 176 | }); 177 | } 178 | 179 | 180 | // Save the snippets as a JSON file in Alfred's snippet format 181 | async saveSnippetsAsAlfredJson() { 182 | if(!this.settings.alfredSupport) { 183 | return; 184 | } 185 | 186 | let idCounter = 1; // Initialize a counter for sequential UIDs 187 | const alfredSnippets = Object.keys(this.snippets).map((key) => { 188 | return { 189 | "uid": idCounter++, // Unique ID for each snippet 190 | "title": key, // Snippet title 191 | "subtitle": this.snippets[key], // Snippet content 192 | "arg": this.snippets[key], // Snippet content 193 | "key": key // Set the key as the trigger keyword 194 | }; 195 | }); 196 | 197 | const jsonContent = JSON.stringify({ items: alfredSnippets }, null, 2); // Format the JSON 198 | const jsonFilePath = `${this.manifest.dir}/alfred-snippets.json`; // Path to store the JSON file in the plugin's directory 199 | 200 | try { 201 | await this.app.vault.adapter.write(jsonFilePath, jsonContent); // Save the JSON file 202 | // new Notice(`Snippets saved as Alfred JSON in: ${jsonFilePath}`); 203 | } catch (error) { 204 | console.error('Error saving snippets as Alfred JSON:', error); 205 | new Notice('Failed to save snippets as Alfred JSON'); 206 | } 207 | } 208 | 209 | async loadSettings() { 210 | const data = await this.loadData(); 211 | 212 | // Migrate old setting (snippetFilePath) to the new one (snippetPath) if it exists 213 | if (data?.snippetFilePath && !data.snippetPath) { 214 | data.snippetPath = data.snippetFilePath; // Copy old setting to the new key 215 | delete data.snippetFilePath; // Optionally remove the old key if no longer needed 216 | } 217 | 218 | // Merge default settings with loaded/migrated settings 219 | this.settings = Object.assign({}, DEFAULT_SETTINGS, data); 220 | 221 | // Save settings after migration to ensure future consistency 222 | await this.saveSettings(); 223 | } 224 | 225 | async saveSettings() { 226 | await this.saveData(this.settings); 227 | } 228 | 229 | getRelativePath(file: TFile, rootPath: string): string { 230 | let relativePath = file.path.slice(rootPath.length); 231 | if (relativePath.startsWith('/')) { 232 | relativePath = relativePath.slice(1); 233 | } 234 | return relativePath.replace(/\.md$/, ''); 235 | } 236 | 237 | getAllMarkdownFiles(folder: TFolder): TFile[] { 238 | let markdownFiles: TFile[] = []; 239 | folder.children.forEach((child) => { 240 | if (child instanceof TFile && child.extension === "md") { 241 | markdownFiles.push(child); 242 | } else if (child instanceof TFolder) { 243 | markdownFiles = markdownFiles.concat(this.getAllMarkdownFiles(child)); 244 | } 245 | }); 246 | return markdownFiles; 247 | } 248 | } 249 | -------------------------------------------------------------------------------- /src/SnippetManagerSettingTab.ts: -------------------------------------------------------------------------------- 1 | import { PluginSettingTab, Setting } from 'obsidian'; 2 | import SnippetManagerPlugin from './SnippetManagerPlugin'; 3 | 4 | export default class SnippetManagerSettingTab extends PluginSettingTab { 5 | plugin: SnippetManagerPlugin; 6 | 7 | constructor(app: any, plugin: SnippetManagerPlugin) { 8 | super(app, plugin); 9 | this.plugin = plugin; 10 | } 11 | 12 | display(): void { 13 | const { containerEl } = this; 14 | containerEl.empty(); 15 | 16 | new Setting(containerEl) 17 | .setName('Snippets file path or Snippets folder path') 18 | .setDesc('Path to the markdown file where snippets are stored. or Path to Folder which contains multiple Snippets file') 19 | .addText(text => text 20 | .setPlaceholder('Snippets.md') 21 | .setValue(this.plugin.settings.snippetPath) 22 | .onChange(async (value) => { 23 | // Remove trailing slash if it exists 24 | if (value.endsWith('/')) { 25 | value = value.slice(0, -1); 26 | } 27 | this.plugin.settings.snippetPath = value; 28 | await this.plugin.saveSettings(); 29 | this.plugin.clearSnippets(); 30 | })); 31 | 32 | new Setting(containerEl) 33 | .setName('Enable Alfred Support') 34 | .setDesc( 35 | createFragment((fragment) => { 36 | fragment.appendText('If enabled, snippets will be saved in '); 37 | fragment.append( 38 | createEl( 39 | "a", 40 | { 41 | text: "Alfred", 42 | href: "https://www.alfredapp.com/?utm_source=Obsidian_Snippet_Manager", 43 | }, 44 | (a) => { 45 | a.setAttr("target", "_blank"); 46 | }, 47 | ), 48 | ); 49 | fragment.appendText(' JSON format.'); 50 | fragment.append(createEl('br')); 51 | 52 | fragment.appendText('Add the following file in the Alfred workflow configuration. (Just double click and copy the path)'); 53 | fragment.append(createEl('br')); 54 | 55 | const fullPath = `${(this.plugin.app.vault.adapter as any).basePath}/${this.plugin.manifest.dir}/alfred-snippets.json`; 56 | const pathSpan = createEl('span', { text: fullPath }); 57 | pathSpan.style.userSelect = 'text'; 58 | fragment.append(pathSpan); 59 | }) 60 | ) 61 | .addToggle(toggle => toggle 62 | .setValue(this.plugin.settings.alfredSupport) 63 | .onChange(async (value) => { 64 | this.plugin.settings.alfredSupport = value; 65 | await this.plugin.saveSettings(); 66 | if(value) { 67 | this.plugin.clearSnippets(); 68 | this.plugin.loadSnippets(); 69 | } 70 | }) 71 | ); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/SnippetSuggestModal.ts: -------------------------------------------------------------------------------- 1 | import { Editor, FuzzySuggestModal, MarkdownView, Notice } from 'obsidian'; 2 | import SnippetManagerPlugin from './SnippetManagerPlugin'; 3 | 4 | export default class SnippetSuggestModal extends FuzzySuggestModal { 5 | plugin: SnippetManagerPlugin; 6 | items: Record = {}; 7 | editor: Editor; 8 | 9 | constructor(app: any, plugin: SnippetManagerPlugin, editor: Editor ) { 10 | super(app); 11 | this.plugin = plugin; 12 | this.editor = editor; 13 | this.refreshSnippets(); 14 | this.scope.register(['Mod'], 'Enter', (evt: KeyboardEvent) => { 15 | if (evt.isComposing) { 16 | return; 17 | } 18 | // @ts-ignore 19 | this.chooser.useSelectedItem(evt); 20 | return false; 21 | }) 22 | this.setPlaceholder("Search snippets..."); 23 | } 24 | 25 | async refreshSnippets() { 26 | await this.plugin.loadSnippets(); 27 | this.items = this.plugin.snippets; 28 | // this.updateSuggestions(Object.keys(this.items)); 29 | } 30 | 31 | getItems(): string[] { 32 | return Object.keys(this.items); 33 | } 34 | 35 | getItemText(item: string): string { 36 | return item; 37 | } 38 | 39 | onChooseItem(item: string, evt: KeyboardEvent) { 40 | const value = this.plugin.snippets[item]; 41 | navigator.clipboard.writeText(value).then(() => { 42 | new Notice(`Copied snippet: ${item}`); 43 | }); 44 | 45 | if (evt.metaKey || evt.ctrlKey) { 46 | this.insertSnippetAtCursor(value); 47 | } 48 | } 49 | 50 | insertSnippetAtCursor(value: string) { 51 | if (this.editor) { 52 | this.editor.replaceSelection(value); 53 | // new Notice(`Pasted snippet at cursor: ${value}`); 54 | } else { 55 | new Notice("Active view is not a markdown editor. Snippet was copied to clipboard."); 56 | } 57 | } 58 | 59 | onOpen() { 60 | super.onOpen(); 61 | this.displayInstructions(); 62 | } 63 | 64 | displayInstructions() { 65 | this.setInstructions([ 66 | { command: "↵", purpose: "to copy to clipboard" }, 67 | { command: "⌘ ↵", purpose: "to copy and paste at cursor position" }, 68 | ]); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import SnippetManagerPlugin from './SnippetManagerPlugin'; 2 | 3 | export default SnippetManagerPlugin; 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | "rootDir": "./src", 15 | "lib": [ 16 | "DOM", 17 | "ES5", 18 | "ES6", 19 | "ES7" 20 | ] 21 | }, 22 | "include": [ 23 | "**/*.ts" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /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.15.0" 3 | } 4 | --------------------------------------------------------------------------------