├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml └── workflows │ └── release.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── manifest.json ├── newBulletWithTimeIndex.ts ├── package.json ├── pnpm-lock.yaml ├── 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 | npm node_modules 2 | build -------------------------------------------------------------------------------- /.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 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: File a bug report 3 | title: "[Bug]: " 4 | labels: [ "bug" ] 5 | body: 6 | - type: textarea 7 | id: bug-description 8 | attributes: 9 | label: Bug Description 10 | description: A clear and concise description of the bug. 11 | validations: 12 | required: true 13 | - type: textarea 14 | id: screenshot 15 | attributes: 16 | label: Relevant Screenshot 17 | description: If applicable, add screenshots or a screen recording to help explain your problem. 18 | - type: textarea 19 | id: reproduction-steps 20 | attributes: 21 | label: To Reproduce 22 | description: Steps to reproduce the problem 23 | placeholder: | 24 | For example: 25 | 1. Go to '...' 26 | 2. Click on '...' 27 | 3. Scroll down to '...' 28 | - type: input 29 | id: obsi-version 30 | attributes: 31 | label: Obsidian Version 32 | description: You can find the version in the *About* Tab of the settings. 33 | placeholder: 0.13.19 34 | validations: 35 | required: true 36 | - type: checkboxes 37 | id: editor 38 | attributes: 39 | label: Which editor are you using? 40 | options: 41 | - label: New Editor 42 | - label: Legacy Editor 43 | - type: checkboxes 44 | id: checklist 45 | attributes: 46 | label: Checklist 47 | options: 48 | - label: I updated to the latest version of the plugin. 49 | required: true 50 | 51 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 2 | description: Suggest an idea 3 | title: "Feature Request: " 4 | labels: [ "feature request" ] 5 | body: 6 | - type: textarea 7 | id: feature-requested 8 | attributes: 9 | label: Feature Requested 10 | description: A clear and concise description of the feature. 11 | validations: 12 | required: true 13 | - type: textarea 14 | id: screenshot 15 | attributes: 16 | label: Relevant Screenshot 17 | description: If applicable, add screenshots or a screen recording to help explain the request. 18 | - type: checkboxes 19 | id: checklist 20 | attributes: 21 | label: Checklist 22 | options: 23 | - label: The feature would be useful to more users than just me. 24 | required: true 25 | 26 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Obsidian plugin 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | env: 8 | PLUGIN_NAME: obsidian-new-bullet-with-time 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Use Node.js 16 | uses: actions/setup-node@v3 17 | with: 18 | node-version: 16 19 | - name: Build 20 | id: build 21 | run: | 22 | npm install 23 | npm run build 24 | mkdir ${{ env.PLUGIN_NAME }} 25 | cp main.js manifest.json styles.css ${{ env.PLUGIN_NAME }} 26 | zip -r ${{ env.PLUGIN_NAME }}.zip ${{ env.PLUGIN_NAME }} 27 | ls 28 | echo "::set-output name=tag_name::$(git tag --sort version:refname | tail -n 1)" 29 | - name: Upload zip file 30 | id: upload-zip 31 | uses: actions/upload-release-asset@v1 32 | env: 33 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 | with: 35 | upload_url: ${{ github.event.release.upload_url }} 36 | asset_path: ./${{ env.PLUGIN_NAME }}.zip 37 | asset_name: ${{ env.PLUGIN_NAME }}-${{ steps.build.outputs.tag_name }}.zip 38 | asset_content_type: application/zip 39 | 40 | - name: Upload main.js 41 | id: upload-main 42 | uses: actions/upload-release-asset@v1 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | with: 46 | upload_url: ${{ github.event.release.upload_url }} 47 | asset_path: ./main.js 48 | asset_name: main.js 49 | asset_content_type: text/javascript 50 | 51 | - name: Upload manifest.json 52 | id: upload-manifest 53 | uses: actions/upload-release-asset@v1 54 | env: 55 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 56 | with: 57 | upload_url: ${{ github.event.release.upload_url }} 58 | asset_path: ./manifest.json 59 | asset_name: manifest.json 60 | asset_content_type: application/json 61 | 62 | - name: Upload styles.css 63 | id: upload-css 64 | uses: actions/upload-release-asset@v1 65 | env: 66 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 67 | with: 68 | upload_url: ${{ github.event.release.upload_url }} 69 | asset_path: ./styles.css 70 | asset_name: styles.css 71 | asset_content_type: text/css 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # vscode 2 | .vscode 3 | 4 | # Intellij 5 | *.iml 6 | .idea 7 | 8 | # npm 9 | node_modules 10 | 11 | # Don't include the compiled main.js file in the repo. 12 | # They should be uploaded to GitHub releases instead. 13 | main.js 14 | 15 | # Exclude sourcemaps 16 | *.map 17 | 18 | # obsidian 19 | data.json 20 | 21 | # Exclude macOS Finder (System Explorer) View States 22 | .DS_Store 23 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Boninall 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 | # New bullet with time 2 | 3 | A plugin allows you to auto add current time to new bullet line. 4 | 5 | ```markdown 6 | you should have something like this(Bullet that begins with time): 7 | 8 | - 12:00 something | <-- (Enter here) 9 | 10 | get: 11 | 12 | - 12:00 something 13 | - 12:01 (time) 14 | ``` 15 | 16 | ## Features 17 | 18 | You can set the default behavior in plugin settings. 19 | 20 | - Time format: use for inserting time in your favor time format. 21 | - Regex for time format: use for testing last bullet line contains time or not. 22 | 23 | # How to Install 24 | 25 | ## From Plugin Market in Obsidian [Not Yet] 26 | 27 | 💜: Directly install from Obsidian Market. 28 | 29 | ## From BRAT 30 | 31 | 🚗: Add `Quorafind/obsidian-new-bullet-with-time` to BRAT. 32 | 33 | ## Download Manually 34 | 35 | 🚚: Download the latest release. Extract and put the three files (main.js, manifest.json, styles.css) to 36 | folder `{{obsidian_vault}}/.obsidian/plugins/obsidian-new-bullet-with-time`. 37 | 38 | # Say Thank You 39 | 40 | If you are enjoying this plugin then please support my work and enthusiasm by buying me a coffee 41 | on [https://www.buymeacoffee.com/boninall](https://www.buymeacoffee.com/boninall). 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /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 | esbuild.build({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ['newBulletWithTimeIndex.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 | watch: !prod, 37 | target: 'es2018', 38 | logLevel: "info", 39 | sourcemap: prod ? false : 'inline', 40 | treeShaking: true, 41 | outfile: 'main.js', 42 | }).catch(() => process.exit(1)); 43 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-new-bullet-with-time", 3 | "name": "New Bullet With Time", 4 | "version": "2.1.0", 5 | "minAppVersion": "0.15.0", 6 | "description": "Allows you to auto add current time to new bullet line.", 7 | "author": "Boninall", 8 | "authorUrl": "https://github.com/quorafind", 9 | "fundingUrl": { 10 | "Buy Me a Coffee": "https://www.buymeacoffee.com/boninall", 11 | "支付宝": "https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E6%94%AF%E4%BB%98%E5%AE%9D%E4%BB%98%E6%AC%BE%E7%A0%81.jpg" 12 | }, 13 | "isDesktopOnly": false 14 | } -------------------------------------------------------------------------------- /newBulletWithTimeIndex.ts: -------------------------------------------------------------------------------- 1 | import { 2 | addIcon, 3 | App, 4 | ButtonComponent, 5 | Editor, 6 | Plugin, 7 | PluginSettingTab, 8 | setIcon, 9 | Setting, 10 | } from "obsidian"; 11 | import { EditorView, keymap } from "@codemirror/view"; 12 | import { 13 | Annotation, 14 | EditorState, 15 | Prec, 16 | Transaction, 17 | TransactionSpec, 18 | } from "@codemirror/state"; 19 | import { moment } from "obsidian"; 20 | 21 | // Remember to rename these classes and interfaces! 22 | 23 | interface NewBulletWithTimePluginSettings { 24 | timeFormat: string; 25 | timePrefixFormat: string; 26 | timeSuffixFormat: string; 27 | regexForTime: string; 28 | timeZone: string; 29 | respectDaylightSavings: boolean; 30 | } 31 | 32 | const DEFAULT_SETTINGS: NewBulletWithTimePluginSettings = { 33 | timeFormat: "HH:mm", 34 | timePrefixFormat: "", 35 | timeSuffixFormat: "", 36 | regexForTime: "\\d{2}:\\d{2}", 37 | timeZone: "local", 38 | respectDaylightSavings: true, 39 | }; 40 | 41 | // Timezone map with common timezones and their UTC offsets 42 | const TIMEZONE_MAP: Record = { 43 | local: "Local Time", 44 | UTC: "UTC+0", 45 | "Africa/Abidjan": "UTC+0", 46 | "Africa/Accra": "UTC+0", 47 | "Africa/Algiers": "UTC+1", 48 | "Africa/Cairo": "UTC+2", 49 | "Africa/Casablanca": "UTC+1", 50 | "Africa/Johannesburg": "UTC+2", 51 | "Africa/Lagos": "UTC+1", 52 | "Africa/Nairobi": "UTC+3", 53 | "Africa/Tunis": "UTC+1", 54 | "America/Anchorage": "UTC-9", 55 | "America/Bogota": "UTC-5", 56 | "America/Buenos_Aires": "UTC-3", 57 | "America/Caracas": "UTC-4", 58 | "America/Chicago": "UTC-6", 59 | "America/Denver": "UTC-7", 60 | "America/Halifax": "UTC-4", 61 | "America/Los_Angeles": "UTC-8", 62 | "America/Mexico_City": "UTC-6", 63 | "America/New_York": "UTC-5", 64 | "America/Phoenix": "UTC-7", 65 | "America/Santiago": "UTC-4", 66 | "America/Sao_Paulo": "UTC-3", 67 | "America/Toronto": "UTC-5", 68 | "America/Vancouver": "UTC-8", 69 | "Asia/Baghdad": "UTC+3", 70 | "Asia/Bangkok": "UTC+7", 71 | "Asia/Dhaka": "UTC+6", 72 | "Asia/Dubai": "UTC+4", 73 | "Asia/Hong_Kong": "UTC+8", 74 | "Asia/Jakarta": "UTC+7", 75 | "Asia/Jerusalem": "UTC+2", 76 | "Asia/Karachi": "UTC+5", 77 | "Asia/Kolkata": "UTC+5:30", 78 | "Asia/Kuwait": "UTC+3", 79 | "Asia/Manila": "UTC+8", 80 | "Asia/Riyadh": "UTC+3", 81 | "Asia/Seoul": "UTC+9", 82 | "Asia/Shanghai": "UTC+8", 83 | "Asia/Singapore": "UTC+8", 84 | "Asia/Taipei": "UTC+8", 85 | "Asia/Tehran": "UTC+3:30", 86 | "Asia/Tokyo": "UTC+9", 87 | "Australia/Adelaide": "UTC+9:30", 88 | "Australia/Brisbane": "UTC+10", 89 | "Australia/Melbourne": "UTC+10", 90 | "Australia/Perth": "UTC+8", 91 | "Australia/Sydney": "UTC+10", 92 | "Europe/Amsterdam": "UTC+1", 93 | "Europe/Athens": "UTC+2", 94 | "Europe/Berlin": "UTC+1", 95 | "Europe/Brussels": "UTC+1", 96 | "Europe/Budapest": "UTC+1", 97 | "Europe/Copenhagen": "UTC+1", 98 | "Europe/Dublin": "UTC+0", 99 | "Europe/Helsinki": "UTC+2", 100 | "Europe/Istanbul": "UTC+3", 101 | "Europe/Lisbon": "UTC+0", 102 | "Europe/London": "UTC+0", 103 | "Europe/Madrid": "UTC+1", 104 | "Europe/Moscow": "UTC+3", 105 | "Europe/Oslo": "UTC+1", 106 | "Europe/Paris": "UTC+1", 107 | "Europe/Prague": "UTC+1", 108 | "Europe/Rome": "UTC+1", 109 | "Europe/Stockholm": "UTC+1", 110 | "Europe/Vienna": "UTC+1", 111 | "Europe/Warsaw": "UTC+1", 112 | "Europe/Zurich": "UTC+1", 113 | "Pacific/Auckland": "UTC+12", 114 | "Pacific/Fiji": "UTC+12", 115 | "Pacific/Honolulu": "UTC-10", 116 | "Pacific/Midway": "UTC-11", 117 | "Pacific/Tahiti": "UTC-10", 118 | }; 119 | 120 | export default class NewBulletWithTimePlugin extends Plugin { 121 | settings: NewBulletWithTimePluginSettings; 122 | 123 | async onload() { 124 | await this.loadSettings(); 125 | 126 | // This adds a settings tab so the user can configure various aspects of the plugin 127 | this.addSettingTab(new NewBulletWithTimeSettingTab(this.app, this)); 128 | 129 | // Register transaction filter to handle Enter key events 130 | this.registerEditorExtension( 131 | EditorState.transactionFilter.of((tr) => this.handleTransaction(tr)) 132 | ); 133 | 134 | this.addCommand({ 135 | id: "add-time-to-the-start", 136 | name: "Add time to the start", 137 | hotkeys: [], 138 | editorCallback: (editor) => { 139 | // @ts-expect-error, not typed 140 | const editorView = editor.cm as EditorView; 141 | 142 | this.addTime(editor, editorView, "Start"); 143 | }, 144 | }); 145 | 146 | this.addCommand({ 147 | id: "add-time-to-the-end", 148 | name: "Add time to the end", 149 | hotkeys: [], 150 | editorCallback: (editor, view) => { 151 | // @ts-expect-error, not typed 152 | const editorView = editor.cm as EditorView; 153 | 154 | this.addTime(editor, editorView, "End"); 155 | }, 156 | }); 157 | } 158 | 159 | onunload() {} 160 | 161 | async loadSettings() { 162 | this.settings = Object.assign( 163 | {}, 164 | DEFAULT_SETTINGS, 165 | await this.loadData() 166 | ); 167 | } 168 | 169 | async saveSettings() { 170 | await this.saveData(this.settings); 171 | } 172 | 173 | addTime(editor: Editor, view: EditorView, position: string) { 174 | const { state } = view; 175 | const { from } = state.selection.main; 176 | const line = state.doc.lineAt(from); 177 | const text = state.doc.sliceString(line.from, line.to); 178 | 179 | // Get formatted time string 180 | const timeString = this.getFormattedTimeString(); 181 | 182 | // Create regex patterns for time detection 183 | const timePatterns = this.createTimePatterns(); 184 | 185 | // Handle based on position 186 | if (position === "Start") { 187 | this.handleStartPosition( 188 | editor, 189 | line, 190 | text, 191 | timeString, 192 | timePatterns 193 | ); 194 | } else if (position === "End") { 195 | this.handleEndPosition( 196 | editor, 197 | line, 198 | text, 199 | timeString, 200 | timePatterns 201 | ); 202 | } 203 | } 204 | 205 | /** 206 | * Get formatted time string with prefix and suffix 207 | */ 208 | private getFormattedTimeString(): string { 209 | const currentTime = this.getTimeWithTimezone(); 210 | return ( 211 | this.settings.timePrefixFormat + 212 | currentTime.format(this.settings.timeFormat) + 213 | this.settings.timeSuffixFormat 214 | ); 215 | } 216 | 217 | /** 218 | * Create regex patterns for time detection 219 | */ 220 | private createTimePatterns() { 221 | const prefixRegex = this.escapeRegExp(this.settings.timePrefixFormat); 222 | const suffixRegex = this.escapeRegExp(this.settings.timeSuffixFormat); 223 | 224 | // Quote prefix pattern that matches both regular and nested quotes 225 | const quotePrefix = "(?:^\\s*(?:>\\s*)+)?"; 226 | 227 | return { 228 | // For detecting time anywhere in text 229 | timeRegex: new RegExp( 230 | prefixRegex + this.settings.regexForTime + suffixRegex 231 | ), 232 | // For detecting time at the end of text 233 | endTimeRegex: new RegExp( 234 | prefixRegex + this.settings.regexForTime + suffixRegex + "\\s*$" 235 | ), 236 | // For detecting bullets (including in quotes) 237 | bulletRegex: new RegExp( 238 | quotePrefix + "\\s*(([-*+]|\\d+\\.)(\\s\\[(.)\\])?\\s)" 239 | ), 240 | // For detecting headings (including in quotes) 241 | headingRegex: new RegExp(quotePrefix + "#{1,6}\\s"), 242 | // For detecting quotes 243 | quoteRegex: new RegExp("^\\s*(?:>\\s*)+"), 244 | }; 245 | } 246 | 247 | /** 248 | * Handle adding/updating time at the start position 249 | */ 250 | private handleStartPosition( 251 | editor: Editor, 252 | line: { from: number; to: number }, 253 | text: string, 254 | timeString: string, 255 | patterns: { 256 | timeRegex: RegExp; 257 | bulletRegex: RegExp; 258 | headingRegex: RegExp; 259 | } 260 | ) { 261 | // Try to handle as bullet 262 | if ( 263 | this.handleMarkdownElement( 264 | editor, 265 | line, 266 | text, 267 | timeString, 268 | patterns.bulletRegex, 269 | patterns.timeRegex 270 | ) 271 | ) { 272 | return; 273 | } 274 | 275 | // Try to handle as heading 276 | if ( 277 | this.handleMarkdownElement( 278 | editor, 279 | line, 280 | text, 281 | timeString, 282 | patterns.headingRegex, 283 | patterns.timeRegex 284 | ) 285 | ) { 286 | return; 287 | } 288 | 289 | // Handle as plain text (no bullet or heading) 290 | this.handlePlainTextStart( 291 | editor, 292 | line, 293 | text, 294 | timeString, 295 | patterns.timeRegex 296 | ); 297 | } 298 | 299 | /** 300 | * Handle adding/updating time at markdown element (bullet or heading) 301 | * Returns true if handled 302 | */ 303 | private handleMarkdownElement( 304 | editor: Editor, 305 | line: { from: number; to: number }, 306 | text: string, 307 | timeString: string, 308 | elementRegex: RegExp, 309 | timeRegex: RegExp 310 | ): boolean { 311 | if (!elementRegex.test(text)) { 312 | return false; 313 | } 314 | 315 | const matches = text.match(elementRegex); 316 | if (!matches) { 317 | return false; 318 | } 319 | 320 | // Check if we're in a quote 321 | const timePatterns = this.createTimePatterns(); 322 | const quoteMatch = text.match(timePatterns.quoteRegex); 323 | const quotePrefix = quoteMatch ? quoteMatch[0] : ""; 324 | 325 | // Calculate the position after the element (bullet or heading) 326 | // If we're in a quote, we need to include the quote prefix 327 | const afterElementText = text.substring(matches[0].length); 328 | const timeMatch = afterElementText.match(timeRegex); 329 | const insertPosition = line.from + matches[0].length; 330 | 331 | if (timeMatch && timeMatch.index === 0) { 332 | // Update existing time 333 | this.updateExistingTime( 334 | editor, 335 | insertPosition, 336 | insertPosition + timeMatch[0].length, 337 | timeString 338 | ); 339 | 340 | // Set cursor at end of line 341 | editor.setCursor(editor.offsetToPos(line.to)); 342 | } else { 343 | // Add new time 344 | this.insertNewTime( 345 | editor, 346 | insertPosition, 347 | insertPosition, 348 | timeString + " " 349 | ); 350 | 351 | // Set cursor after time 352 | editor.setCursor( 353 | editor.offsetToPos(insertPosition + timeString.length + 1) 354 | ); 355 | } 356 | 357 | return true; 358 | } 359 | 360 | /** 361 | * Handle adding/updating time at the start of plain text 362 | */ 363 | private handlePlainTextStart( 364 | editor: Editor, 365 | line: { from: number; to: number }, 366 | text: string, 367 | timeString: string, 368 | timeRegex: RegExp 369 | ) { 370 | // Check if we're in a quote 371 | const timePatterns = this.createTimePatterns(); 372 | const quoteMatch = text.match(timePatterns.quoteRegex); 373 | 374 | if (quoteMatch) { 375 | // We're in a quote, check if time exists after the quote prefix 376 | const afterQuoteText = text.substring(quoteMatch[0].length); 377 | const timeMatch = afterQuoteText.match(timeRegex); 378 | const insertPosition = line.from + quoteMatch[0].length; 379 | 380 | if (timeMatch && timeMatch.index === 0) { 381 | // Update existing time 382 | this.updateExistingTime( 383 | editor, 384 | insertPosition, 385 | insertPosition + timeMatch[0].length, 386 | timeString 387 | ); 388 | } else { 389 | // Add new time 390 | this.insertNewTime( 391 | editor, 392 | insertPosition, 393 | insertPosition, 394 | timeString + " " 395 | ); 396 | } 397 | 398 | // Set cursor after time 399 | editor.setCursor( 400 | editor.offsetToPos(insertPosition + timeString.length + 1) 401 | ); 402 | } else { 403 | // Not in a quote, handle as before 404 | const timeMatch = text.match(timeRegex); 405 | 406 | if (timeMatch && timeMatch.index === 0) { 407 | // Update existing time 408 | this.updateExistingTime( 409 | editor, 410 | line.from, 411 | line.from + timeMatch[0].length, 412 | timeString 413 | ); 414 | } else { 415 | // Add new time 416 | this.insertNewTime( 417 | editor, 418 | line.from, 419 | line.from, 420 | timeString + " " 421 | ); 422 | } 423 | 424 | // Set cursor after time 425 | editor.setCursor( 426 | editor.offsetToPos(line.from + timeString.length + 1) 427 | ); 428 | } 429 | } 430 | 431 | /** 432 | * Handle adding/updating time at the end position 433 | */ 434 | private handleEndPosition( 435 | editor: Editor, 436 | line: { from: number; to: number }, 437 | text: string, 438 | timeString: string, 439 | patterns: { endTimeRegex: RegExp } 440 | ) { 441 | const endTimeMatch = text.match(patterns.endTimeRegex); 442 | 443 | if (endTimeMatch) { 444 | // Update existing time at end 445 | const startPos = line.from + text.lastIndexOf(endTimeMatch[0]); 446 | this.updateExistingTime(editor, startPos, line.to, timeString); 447 | } else { 448 | // Add new time at end 449 | this.insertNewTime(editor, line.to, line.to, " " + timeString); 450 | } 451 | 452 | // Set cursor at end 453 | editor.setCursor(editor.offsetToPos(line.to + timeString.length)); 454 | } 455 | 456 | /** 457 | * Update existing time with new time string 458 | */ 459 | private updateExistingTime( 460 | editor: Editor, 461 | fromPos: number, 462 | toPos: number, 463 | timeString: string 464 | ) { 465 | editor.transaction({ 466 | changes: [ 467 | { 468 | text: timeString, 469 | from: editor.offsetToPos(fromPos), 470 | to: editor.offsetToPos(toPos), 471 | }, 472 | ], 473 | }); 474 | } 475 | 476 | /** 477 | * Insert new time string 478 | */ 479 | private insertNewTime( 480 | editor: Editor, 481 | fromPos: number, 482 | toPos: number, 483 | timeString: string 484 | ) { 485 | editor.transaction({ 486 | changes: [ 487 | { 488 | text: timeString, 489 | from: editor.offsetToPos(fromPos), 490 | to: editor.offsetToPos(toPos), 491 | }, 492 | ], 493 | }); 494 | } 495 | 496 | /** 497 | * Get current time with timezone consideration 498 | */ 499 | private getTimeWithTimezone() { 500 | // If using local time, return moment() without timezone 501 | if (this.settings.timeZone === "local") { 502 | return moment(); 503 | } 504 | 505 | // For UTC, return the UTC time 506 | if (this.settings.timeZone === "UTC") { 507 | return moment().utc(); 508 | } 509 | 510 | // For other timezones with daylight savings support 511 | if (this.settings.respectDaylightSavings) { 512 | // Create a date in the target timezone by computing the current UTC time 513 | // and then applying the offset for the target timezone including DST 514 | const now = new Date(); 515 | 516 | // Parse the named timezone from our timezone map 517 | const timezone = this.settings.timeZone; 518 | const targetDate = new Date( 519 | now.toLocaleString("en-US", { timeZone: timezone }) 520 | ); 521 | 522 | // If browser doesn't support the timezone, fallback to offset method 523 | if (isNaN(targetDate.getTime())) { 524 | return this.getTimeByOffset(); 525 | } 526 | 527 | // Create a moment object from the target date 528 | return moment(targetDate); 529 | } 530 | 531 | // For timezones without daylight savings support 532 | return this.getTimeByOffset(); 533 | } 534 | 535 | /** 536 | * Get time by applying a fixed offset 537 | */ 538 | private getTimeByOffset() { 539 | // Use UTC as the base 540 | const now = moment().utc(); 541 | 542 | // Apply the fixed offset 543 | return now.utcOffset(this.getTimezoneOffset(this.settings.timeZone)); 544 | } 545 | 546 | /** 547 | * Get timezone offset in minutes from timezone string 548 | */ 549 | private getTimezoneOffset(timezone: string): number { 550 | // Parse the UTC offset from the timezone map 551 | const timezoneInfo = TIMEZONE_MAP[timezone] || "UTC+0"; 552 | const offsetMatch = timezoneInfo.match(/UTC([+-])(\d+)(?::(\d+))?/); 553 | 554 | if (offsetMatch) { 555 | const sign = offsetMatch[1] === "+" ? 1 : -1; 556 | const hours = parseInt(offsetMatch[2], 10); 557 | const minutes = offsetMatch[3] ? parseInt(offsetMatch[3], 10) : 0; 558 | 559 | // Return offset in minutes 560 | return sign * (hours * 60 + minutes); 561 | } 562 | 563 | // Default to UTC if no match 564 | return 0; 565 | } 566 | 567 | /** 568 | * Handle transactions to detect Enter key presses and add time stamps 569 | * This replaces the previous keydown event handler approach 570 | */ 571 | private readonly handleTransaction = ( 572 | tr: Transaction 573 | ): Transaction | TransactionSpec => { 574 | // Only process transactions that change the document and are user input events 575 | if (!tr.docChanged || !tr.isUserEvent("input.type")) { 576 | return tr; 577 | } 578 | 579 | // Check if this is an Enter key transaction (newline insertion) 580 | const isEnterKeyPress = this.isEnterKeyTransaction(tr); 581 | if (!isEnterKeyPress) { 582 | return tr; 583 | } 584 | 585 | // Handle blank bullet case (similar to handleKeydownBeforeNewLine) 586 | if (this.shouldSkipTimeInsertion(tr)) { 587 | return tr; 588 | } 589 | 590 | if (this.shouldRemoveTime(tr)) { 591 | return this.processTimeRemoval(tr) || tr; 592 | } 593 | 594 | // Handle time insertion for bullet with time (similar to handleKeydown) 595 | const timeSpec = this.processTimeInsertion(tr); 596 | return timeSpec || tr; 597 | }; 598 | 599 | /** 600 | * Determine if a transaction represents an Enter key press 601 | */ 602 | private isEnterKeyTransaction(tr: Transaction): boolean { 603 | // Check if the transaction inserts a newline character 604 | let hasNewline = false; 605 | 606 | tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => { 607 | if (inserted.toString().includes("\n")) { 608 | hasNewline = true; 609 | } 610 | }); 611 | return hasNewline; 612 | } 613 | 614 | /** 615 | * Check if we should skip time insertion (blank bullet case or non-bullet line) 616 | */ 617 | private shouldSkipTimeInsertion(tr: Transaction): boolean { 618 | // Find the line before the cursor after the transaction 619 | const pos = tr.startState.selection.main.to || 0; 620 | const { state } = tr; 621 | const prevLineNumber = state.doc.lineAt(pos).number; 622 | 623 | if (prevLineNumber <= 0) return false; 624 | 625 | const prevLine = state.doc.line(prevLineNumber); 626 | const prevLineText = prevLine.text; 627 | 628 | // Create patterns with quote support 629 | const timePatterns = this.createTimePatterns(); 630 | 631 | // Check if previous line is a bullet (including in quotes) 632 | // If it's not a bullet line at all, skip time insertion 633 | if (!timePatterns.bulletRegex.test(prevLineText)) return true; 634 | 635 | // Check if previous line is a blank bullet (including in quotes) 636 | // Extract quote prefix if exists 637 | const quoteMatch = prevLineText.match(timePatterns.quoteRegex); 638 | const quotePrefix = quoteMatch ? quoteMatch[0] : ""; 639 | 640 | // Create regex for blank bullet that accounts for quotes 641 | const blankBulletRegex = new RegExp( 642 | quotePrefix + "\\s*([-*+]|\\d+\\.)(\\s\\[(.)\\])?\\s*$" 643 | ); 644 | 645 | return blankBulletRegex.test(prevLineText); 646 | } 647 | 648 | /** 649 | * Check if we should remove time from the line 650 | */ 651 | private shouldRemoveTime(tr: Transaction): boolean { 652 | const pos = tr.state.selection.main.to || 0; 653 | const { state } = tr; 654 | const currentLine = state.doc.lineAt(pos); 655 | 656 | if (currentLine.number <= 1) return false; 657 | 658 | const prevLineNumber = currentLine.number - 1; 659 | const prevLine = state.doc.line(prevLineNumber); 660 | const prevLineText = prevLine.text; 661 | 662 | // Create patterns with quote support 663 | const timePatterns = this.createTimePatterns(); 664 | 665 | // Extract quote prefix if exists 666 | const quoteMatch = prevLineText.match(timePatterns.quoteRegex); 667 | const quotePrefix = quoteMatch ? quoteMatch[0] : ""; 668 | 669 | const prefixRegex = this.escapeRegExp(this.settings.timePrefixFormat); 670 | const suffixRegex = this.escapeRegExp(this.settings.timeSuffixFormat); 671 | 672 | // Check if the line only contains a bullet and timestamp (including in quotes) 673 | const bulletWithTimeRegex = new RegExp( 674 | quotePrefix + 675 | "\\s*([-*+]|\\d+\\.)(\\s\\[(.)\\])?\\s+" + 676 | prefixRegex + 677 | this.settings.regexForTime + 678 | suffixRegex + 679 | "\\s*$" 680 | ); 681 | 682 | return bulletWithTimeRegex.test(prevLineText); 683 | } 684 | 685 | /** 686 | * Process time insertion for a bullet with time 687 | */ 688 | private processTimeInsertion(tr: Transaction): TransactionSpec | null { 689 | const pos = tr.state.selection.main.to || 0; 690 | const startPos = tr.startState.selection.main.to || 0; 691 | const { state } = tr; 692 | const currentLine = state.doc.lineAt(pos); 693 | 694 | // If we're at the first line, there's no previous line to check 695 | if (currentLine.number <= 1) return null; 696 | 697 | const prevLineNumber = currentLine.number - 1; 698 | const prevLine = state.doc.line(prevLineNumber); 699 | const prevLineText = prevLine.text; 700 | 701 | // Create patterns with quote support 702 | const timePatterns = this.createTimePatterns(); 703 | 704 | // Extract quote prefix if exists 705 | const quoteMatch = prevLineText.match(timePatterns.quoteRegex); 706 | const quotePrefix = quoteMatch ? quoteMatch[0] : ""; 707 | 708 | const prefixRegex = this.escapeRegExp(this.settings.timePrefixFormat); 709 | const suffixRegex = this.escapeRegExp(this.settings.timeSuffixFormat); 710 | 711 | // Check if previous line has a time format (including in quotes) 712 | const timeRegex = new RegExp( 713 | quotePrefix + 714 | "\\s*([-*+]|\\d+\\.)(\\s\\[(.)\\])?\\s" + 715 | prefixRegex + 716 | this.settings.regexForTime + 717 | suffixRegex 718 | ); 719 | 720 | if (!timeRegex.test(prevLineText)) return null; 721 | 722 | // Get current time with timezone consideration 723 | const currentTime = this.getTimeWithTimezone(); 724 | 725 | // Generate time string to insert 726 | const timeString = 727 | this.settings.timePrefixFormat + 728 | currentTime.format(this.settings.timeFormat) + 729 | this.settings.timeSuffixFormat + 730 | " "; 731 | 732 | // Check if the current line also starts with a quote 733 | // If so, we don't need to add the quote prefix to the new line 734 | // as it's already handled by Obsidian's default behavior 735 | 736 | return { 737 | changes: [ 738 | tr.changes, 739 | { 740 | from: startPos, 741 | to: startPos, 742 | insert: timeString, 743 | }, 744 | ], 745 | selection: { 746 | anchor: currentLine.to + timeString.length, 747 | }, 748 | } as TransactionSpec; 749 | } 750 | 751 | /** 752 | * Process time removal for a bullet with time 753 | */ 754 | private processTimeRemoval(tr: Transaction): TransactionSpec | null { 755 | const pos = tr.state.selection.main.to || 0; 756 | const { state } = tr; 757 | const currentLine = state.doc.lineAt(pos); 758 | 759 | if (currentLine.number <= 0) return null; 760 | 761 | const prevLineNumber = currentLine.number - 1; 762 | const prevLine = state.doc.line(prevLineNumber); 763 | const prevLineText = prevLine.text; 764 | 765 | // Create patterns with quote support 766 | const timePatterns = this.createTimePatterns(); 767 | 768 | // Extract quote prefix if exists 769 | const quoteMatch = prevLineText.match(timePatterns.quoteRegex); 770 | 771 | const prefixRegex = this.escapeRegExp(this.settings.timePrefixFormat); 772 | const suffixRegex = this.escapeRegExp(this.settings.timeSuffixFormat); 773 | 774 | // Find the time pattern in the previous line 775 | const timePattern = new RegExp( 776 | prefixRegex + this.settings.regexForTime + suffixRegex + "\\s*" 777 | ); 778 | 779 | // If we're in a quote, we need to search after the quote prefix 780 | let match; 781 | let timeStartPos; 782 | 783 | if (quoteMatch) { 784 | const afterQuoteText = prevLineText.substring(quoteMatch[0].length); 785 | match = afterQuoteText.match(timePattern); 786 | 787 | if (!match) return null; 788 | 789 | timeStartPos = 790 | prevLine.from + 791 | quoteMatch[0].length + 792 | afterQuoteText.indexOf(match[0]); 793 | } else { 794 | match = prevLineText.match(timePattern); 795 | 796 | if (!match) return null; 797 | 798 | timeStartPos = prevLine.from + prevLineText.indexOf(match[0]); 799 | } 800 | 801 | const timeEndPos = timeStartPos + match[0].length; 802 | 803 | return { 804 | changes: { 805 | from: timeStartPos, 806 | to: timeEndPos, 807 | insert: "", 808 | }, 809 | selection: { 810 | anchor: timeStartPos, 811 | }, 812 | } as TransactionSpec; 813 | } 814 | 815 | escapeRegExp(text: string): string { 816 | //eslint-disable-next-line 817 | return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 818 | } 819 | 820 | registerIconList() { 821 | addIcon( 822 | "alipay", 823 | `` 824 | ); 825 | addIcon( 826 | "wechat", 827 | `` 828 | ); 829 | } 830 | } 831 | 832 | class NewBulletWithTimeSettingTab extends PluginSettingTab { 833 | plugin: NewBulletWithTimePlugin; 834 | private applyDebounceTimer: number = 0; 835 | 836 | constructor(app: App, plugin: NewBulletWithTimePlugin) { 837 | super(app, plugin); 838 | this.plugin = plugin; 839 | } 840 | 841 | applySettingsUpdate() { 842 | clearTimeout(this.applyDebounceTimer); 843 | const plugin = this.plugin; 844 | this.applyDebounceTimer = window.setTimeout(() => { 845 | plugin.saveSettings(); 846 | }, 100); 847 | } 848 | 849 | display(): void { 850 | const { containerEl } = this; 851 | 852 | containerEl.empty(); 853 | 854 | new Setting(containerEl) 855 | .setName("Time format") 856 | .setDesc( 857 | "Use time format like HH:mm to insert into newly created bullet item." 858 | ) 859 | .addText((text) => 860 | text 861 | .setPlaceholder("Set your time format") 862 | .setValue(this.plugin.settings.timeFormat) 863 | .onChange(async (value) => { 864 | this.plugin.settings.timeFormat = value; 865 | this.applySettingsUpdate(); 866 | }) 867 | ); 868 | 869 | new Setting(containerEl) 870 | .setName("Prefix") 871 | .setDesc( 872 | "When insert time to bullet, this prefix would be added automatically." 873 | ) 874 | .addText((text) => 875 | text 876 | .setPlaceholder("Set your prefix") 877 | .setValue(this.plugin.settings.timePrefixFormat) 878 | .onChange(async (value) => { 879 | this.plugin.settings.timePrefixFormat = value; 880 | this.applySettingsUpdate(); 881 | }) 882 | ); 883 | 884 | new Setting(containerEl) 885 | .setName("Suffix") 886 | .setDesc( 887 | "When insert time to bullet, suffix would be added automatically." 888 | ) 889 | .addText((text) => 890 | text 891 | .setPlaceholder("Set your suffix") 892 | .setValue(this.plugin.settings.timeSuffixFormat) 893 | .onChange(async (value) => { 894 | this.plugin.settings.timeSuffixFormat = value; 895 | this.applySettingsUpdate(); 896 | }) 897 | ); 898 | 899 | new Setting(containerEl) 900 | .setName("Regex for Time format") 901 | .setDesc( 902 | "When you do not use HH:mm , you should change the regex here to make plugin works correctly." 903 | ) 904 | .addText((text) => 905 | text 906 | .setPlaceholder("Set your regex for time format") 907 | .setValue(this.plugin.settings.regexForTime) 908 | .onChange(async (value) => { 909 | this.plugin.settings.regexForTime = value; 910 | this.applySettingsUpdate(); 911 | }) 912 | ); 913 | 914 | new Setting(containerEl) 915 | .setName("Time zone") 916 | .setDesc("Set your time zone. Default is your local time.") 917 | .addDropdown((dropdown) => { 918 | // Add all timezones from the TIMEZONE_MAP 919 | Object.keys(TIMEZONE_MAP).forEach((timezone) => { 920 | dropdown.addOption( 921 | timezone, 922 | `${timezone} (${TIMEZONE_MAP[timezone]})` 923 | ); 924 | }); 925 | 926 | // Set the current value 927 | dropdown.setValue(this.plugin.settings.timeZone); 928 | 929 | dropdown.onChange(async (value) => { 930 | this.plugin.settings.timeZone = value; 931 | this.applySettingsUpdate(); 932 | }); 933 | }); 934 | 935 | new Setting(containerEl) 936 | .setName("Respect Daylight Savings") 937 | .setDesc( 938 | "Enable to adjust times for daylight savings changes when using named timezones." 939 | ) 940 | .addToggle((toggle) => { 941 | toggle.setValue(this.plugin.settings.respectDaylightSavings); 942 | toggle.onChange(async (value) => { 943 | this.plugin.settings.respectDaylightSavings = value; 944 | this.applySettingsUpdate(); 945 | }); 946 | }); 947 | 948 | new Setting(containerEl) 949 | .setName("Donate") 950 | .setDesc( 951 | "If you like this plugin, consider donating to support continued development:" 952 | ) 953 | .addButton((bt) => { 954 | this.addImageToButton( 955 | bt, 956 | "https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E5%BE%AE%E4%BF%A1%E4%BB%98%E6%AC%BE%E7%A0%81.jpg", 957 | "wechat" 958 | ); 959 | }) 960 | .addButton((bt) => { 961 | this.addImageToButton( 962 | bt, 963 | "https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E6%94%AF%E4%BB%98%E5%AE%9D%E4%BB%98%E6%AC%BE%E7%A0%81.jpg", 964 | "alipay" 965 | ); 966 | }) 967 | .addButton((bt) => { 968 | this.addImageToButton( 969 | bt, 970 | "https://www.buymeacoffee.com/Quorafind", 971 | "bmc", 972 | "https://img.buymeacoffee.com/button-api/?text=Coffee&emoji=&slug=boninall&button_colour=886ce4&font_colour=ffffff&font_family=Comic&outline_colour=000000&coffee_colour=FFDD00" 973 | ); 974 | }); 975 | } 976 | 977 | addImageToButton( 978 | button: ButtonComponent, 979 | url: string, 980 | imageType: string, 981 | imageUrl?: string 982 | ): void { 983 | const aTagEL = button.buttonEl.createEl("a", { 984 | href: url, 985 | }); 986 | button.buttonEl.addClass("dbl-donate-button"); 987 | 988 | switch (imageType) { 989 | case "alipay": 990 | setIcon(aTagEL, "alipay"); 991 | break; 992 | case "wechat": 993 | setIcon(aTagEL, "wechat"); 994 | break; 995 | case "bmc": 996 | const favicon = document.createElement( 997 | "img" 998 | ) as HTMLImageElement; 999 | if (imageUrl) favicon.src = imageUrl; 1000 | aTagEL.appendChild(favicon); 1001 | break; 1002 | default: 1003 | break; 1004 | } 1005 | } 1006 | } 1007 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-new-bullet-with-time", 3 | "version": "2.1.0", 4 | "description": "A plugin allows you to auto add current time to new bullet line.", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "npm run version && tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@codemirror/language": "^6.2.1", 16 | "@codemirror/state": "^6.1.2", 17 | "@codemirror/view": "^6.3.0", 18 | "@types/node": "^16.11.6", 19 | "@typescript-eslint/eslint-plugin": "5.29.0", 20 | "@typescript-eslint/parser": "5.29.0", 21 | "builtin-modules": "3.3.0", 22 | "esbuild": "0.14.47", 23 | "obsidian": "latest", 24 | "tslib": "2.4.0", 25 | "typescript": "4.7.4" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@codemirror/language': 12 | specifier: ^6.2.1 13 | version: 6.10.8 14 | '@codemirror/state': 15 | specifier: ^6.1.2 16 | version: 6.5.2 17 | '@codemirror/view': 18 | specifier: ^6.3.0 19 | version: 6.36.3 20 | '@types/node': 21 | specifier: ^16.11.6 22 | version: 16.18.126 23 | '@typescript-eslint/eslint-plugin': 24 | specifier: 5.29.0 25 | version: 5.29.0(@typescript-eslint/parser@5.29.0(eslint@8.57.1)(typescript@4.7.4))(eslint@8.57.1)(typescript@4.7.4) 26 | '@typescript-eslint/parser': 27 | specifier: 5.29.0 28 | version: 5.29.0(eslint@8.57.1)(typescript@4.7.4) 29 | builtin-modules: 30 | specifier: 3.3.0 31 | version: 3.3.0 32 | esbuild: 33 | specifier: 0.14.47 34 | version: 0.14.47 35 | obsidian: 36 | specifier: latest 37 | version: 1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.3) 38 | tslib: 39 | specifier: 2.4.0 40 | version: 2.4.0 41 | typescript: 42 | specifier: 4.7.4 43 | version: 4.7.4 44 | 45 | packages: 46 | 47 | '@codemirror/language@6.10.8': 48 | resolution: {integrity: sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==} 49 | 50 | '@codemirror/state@6.5.2': 51 | resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} 52 | 53 | '@codemirror/view@6.36.3': 54 | resolution: {integrity: sha512-N2bilM47QWC8Hnx0rMdDxO2x2ImJ1FvZWXubwKgjeoOrWwEiFrtpA7SFHcuZ+o2Ze2VzbkgbzWVj4+V18LVkeg==} 55 | 56 | '@eslint-community/eslint-utils@4.4.1': 57 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 58 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 59 | peerDependencies: 60 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 61 | 62 | '@eslint-community/regexpp@4.12.1': 63 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 64 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 65 | 66 | '@eslint/eslintrc@2.1.4': 67 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 68 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 69 | 70 | '@eslint/js@8.57.1': 71 | resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} 72 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 73 | 74 | '@humanwhocodes/config-array@0.13.0': 75 | resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} 76 | engines: {node: '>=10.10.0'} 77 | deprecated: Use @eslint/config-array instead 78 | 79 | '@humanwhocodes/module-importer@1.0.1': 80 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 81 | engines: {node: '>=12.22'} 82 | 83 | '@humanwhocodes/object-schema@2.0.3': 84 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 85 | deprecated: Use @eslint/object-schema instead 86 | 87 | '@lezer/common@1.2.3': 88 | resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} 89 | 90 | '@lezer/highlight@1.2.1': 91 | resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} 92 | 93 | '@lezer/lr@1.4.2': 94 | resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} 95 | 96 | '@marijn/find-cluster-break@1.0.2': 97 | resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} 98 | 99 | '@nodelib/fs.scandir@2.1.5': 100 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 101 | engines: {node: '>= 8'} 102 | 103 | '@nodelib/fs.stat@2.0.5': 104 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 105 | engines: {node: '>= 8'} 106 | 107 | '@nodelib/fs.walk@1.2.8': 108 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 109 | engines: {node: '>= 8'} 110 | 111 | '@types/codemirror@5.60.8': 112 | resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} 113 | 114 | '@types/estree@1.0.6': 115 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 116 | 117 | '@types/json-schema@7.0.15': 118 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 119 | 120 | '@types/node@16.18.126': 121 | resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} 122 | 123 | '@types/tern@0.23.9': 124 | resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} 125 | 126 | '@typescript-eslint/eslint-plugin@5.29.0': 127 | resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==} 128 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 129 | peerDependencies: 130 | '@typescript-eslint/parser': ^5.0.0 131 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 132 | typescript: '*' 133 | peerDependenciesMeta: 134 | typescript: 135 | optional: true 136 | 137 | '@typescript-eslint/parser@5.29.0': 138 | resolution: {integrity: sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==} 139 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 140 | peerDependencies: 141 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 142 | typescript: '*' 143 | peerDependenciesMeta: 144 | typescript: 145 | optional: true 146 | 147 | '@typescript-eslint/scope-manager@5.29.0': 148 | resolution: {integrity: sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==} 149 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 150 | 151 | '@typescript-eslint/type-utils@5.29.0': 152 | resolution: {integrity: sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==} 153 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 154 | peerDependencies: 155 | eslint: '*' 156 | typescript: '*' 157 | peerDependenciesMeta: 158 | typescript: 159 | optional: true 160 | 161 | '@typescript-eslint/types@5.29.0': 162 | resolution: {integrity: sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==} 163 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 164 | 165 | '@typescript-eslint/typescript-estree@5.29.0': 166 | resolution: {integrity: sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==} 167 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 168 | peerDependencies: 169 | typescript: '*' 170 | peerDependenciesMeta: 171 | typescript: 172 | optional: true 173 | 174 | '@typescript-eslint/utils@5.29.0': 175 | resolution: {integrity: sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==} 176 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 177 | peerDependencies: 178 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 179 | 180 | '@typescript-eslint/visitor-keys@5.29.0': 181 | resolution: {integrity: sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==} 182 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 183 | 184 | '@ungap/structured-clone@1.3.0': 185 | resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 186 | 187 | acorn-jsx@5.3.2: 188 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 189 | peerDependencies: 190 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 191 | 192 | acorn@8.14.0: 193 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 194 | engines: {node: '>=0.4.0'} 195 | hasBin: true 196 | 197 | ajv@6.12.6: 198 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 199 | 200 | ansi-regex@5.0.1: 201 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 202 | engines: {node: '>=8'} 203 | 204 | ansi-styles@4.3.0: 205 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 206 | engines: {node: '>=8'} 207 | 208 | argparse@2.0.1: 209 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 210 | 211 | array-union@2.1.0: 212 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 213 | engines: {node: '>=8'} 214 | 215 | balanced-match@1.0.2: 216 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 217 | 218 | brace-expansion@1.1.11: 219 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 220 | 221 | braces@3.0.3: 222 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 223 | engines: {node: '>=8'} 224 | 225 | builtin-modules@3.3.0: 226 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 227 | engines: {node: '>=6'} 228 | 229 | callsites@3.1.0: 230 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 231 | engines: {node: '>=6'} 232 | 233 | chalk@4.1.2: 234 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 235 | engines: {node: '>=10'} 236 | 237 | color-convert@2.0.1: 238 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 239 | engines: {node: '>=7.0.0'} 240 | 241 | color-name@1.1.4: 242 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 243 | 244 | concat-map@0.0.1: 245 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 246 | 247 | cross-spawn@7.0.6: 248 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 249 | engines: {node: '>= 8'} 250 | 251 | debug@4.4.0: 252 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 253 | engines: {node: '>=6.0'} 254 | peerDependencies: 255 | supports-color: '*' 256 | peerDependenciesMeta: 257 | supports-color: 258 | optional: true 259 | 260 | deep-is@0.1.4: 261 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 262 | 263 | dir-glob@3.0.1: 264 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 265 | engines: {node: '>=8'} 266 | 267 | doctrine@3.0.0: 268 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 269 | engines: {node: '>=6.0.0'} 270 | 271 | esbuild-android-64@0.14.47: 272 | resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} 273 | engines: {node: '>=12'} 274 | cpu: [x64] 275 | os: [android] 276 | 277 | esbuild-android-arm64@0.14.47: 278 | resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} 279 | engines: {node: '>=12'} 280 | cpu: [arm64] 281 | os: [android] 282 | 283 | esbuild-darwin-64@0.14.47: 284 | resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} 285 | engines: {node: '>=12'} 286 | cpu: [x64] 287 | os: [darwin] 288 | 289 | esbuild-darwin-arm64@0.14.47: 290 | resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} 291 | engines: {node: '>=12'} 292 | cpu: [arm64] 293 | os: [darwin] 294 | 295 | esbuild-freebsd-64@0.14.47: 296 | resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} 297 | engines: {node: '>=12'} 298 | cpu: [x64] 299 | os: [freebsd] 300 | 301 | esbuild-freebsd-arm64@0.14.47: 302 | resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} 303 | engines: {node: '>=12'} 304 | cpu: [arm64] 305 | os: [freebsd] 306 | 307 | esbuild-linux-32@0.14.47: 308 | resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} 309 | engines: {node: '>=12'} 310 | cpu: [ia32] 311 | os: [linux] 312 | 313 | esbuild-linux-64@0.14.47: 314 | resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} 315 | engines: {node: '>=12'} 316 | cpu: [x64] 317 | os: [linux] 318 | 319 | esbuild-linux-arm64@0.14.47: 320 | resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} 321 | engines: {node: '>=12'} 322 | cpu: [arm64] 323 | os: [linux] 324 | 325 | esbuild-linux-arm@0.14.47: 326 | resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} 327 | engines: {node: '>=12'} 328 | cpu: [arm] 329 | os: [linux] 330 | 331 | esbuild-linux-mips64le@0.14.47: 332 | resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} 333 | engines: {node: '>=12'} 334 | cpu: [mips64el] 335 | os: [linux] 336 | 337 | esbuild-linux-ppc64le@0.14.47: 338 | resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} 339 | engines: {node: '>=12'} 340 | cpu: [ppc64] 341 | os: [linux] 342 | 343 | esbuild-linux-riscv64@0.14.47: 344 | resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} 345 | engines: {node: '>=12'} 346 | cpu: [riscv64] 347 | os: [linux] 348 | 349 | esbuild-linux-s390x@0.14.47: 350 | resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} 351 | engines: {node: '>=12'} 352 | cpu: [s390x] 353 | os: [linux] 354 | 355 | esbuild-netbsd-64@0.14.47: 356 | resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} 357 | engines: {node: '>=12'} 358 | cpu: [x64] 359 | os: [netbsd] 360 | 361 | esbuild-openbsd-64@0.14.47: 362 | resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} 363 | engines: {node: '>=12'} 364 | cpu: [x64] 365 | os: [openbsd] 366 | 367 | esbuild-sunos-64@0.14.47: 368 | resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} 369 | engines: {node: '>=12'} 370 | cpu: [x64] 371 | os: [sunos] 372 | 373 | esbuild-windows-32@0.14.47: 374 | resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} 375 | engines: {node: '>=12'} 376 | cpu: [ia32] 377 | os: [win32] 378 | 379 | esbuild-windows-64@0.14.47: 380 | resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} 381 | engines: {node: '>=12'} 382 | cpu: [x64] 383 | os: [win32] 384 | 385 | esbuild-windows-arm64@0.14.47: 386 | resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} 387 | engines: {node: '>=12'} 388 | cpu: [arm64] 389 | os: [win32] 390 | 391 | esbuild@0.14.47: 392 | resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} 393 | engines: {node: '>=12'} 394 | hasBin: true 395 | 396 | escape-string-regexp@4.0.0: 397 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 398 | engines: {node: '>=10'} 399 | 400 | eslint-scope@5.1.1: 401 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 402 | engines: {node: '>=8.0.0'} 403 | 404 | eslint-scope@7.2.2: 405 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 406 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 407 | 408 | eslint-utils@3.0.0: 409 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 410 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 411 | peerDependencies: 412 | eslint: '>=5' 413 | 414 | eslint-visitor-keys@2.1.0: 415 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 416 | engines: {node: '>=10'} 417 | 418 | eslint-visitor-keys@3.4.3: 419 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 420 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 421 | 422 | eslint@8.57.1: 423 | resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} 424 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 425 | deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. 426 | hasBin: true 427 | 428 | espree@9.6.1: 429 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 430 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 431 | 432 | esquery@1.6.0: 433 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 434 | engines: {node: '>=0.10'} 435 | 436 | esrecurse@4.3.0: 437 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 438 | engines: {node: '>=4.0'} 439 | 440 | estraverse@4.3.0: 441 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 442 | engines: {node: '>=4.0'} 443 | 444 | estraverse@5.3.0: 445 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 446 | engines: {node: '>=4.0'} 447 | 448 | esutils@2.0.3: 449 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 450 | engines: {node: '>=0.10.0'} 451 | 452 | fast-deep-equal@3.1.3: 453 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 454 | 455 | fast-glob@3.3.3: 456 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 457 | engines: {node: '>=8.6.0'} 458 | 459 | fast-json-stable-stringify@2.1.0: 460 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 461 | 462 | fast-levenshtein@2.0.6: 463 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 464 | 465 | fastq@1.19.0: 466 | resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} 467 | 468 | file-entry-cache@6.0.1: 469 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 470 | engines: {node: ^10.12.0 || >=12.0.0} 471 | 472 | fill-range@7.1.1: 473 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 474 | engines: {node: '>=8'} 475 | 476 | find-up@5.0.0: 477 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 478 | engines: {node: '>=10'} 479 | 480 | flat-cache@3.2.0: 481 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 482 | engines: {node: ^10.12.0 || >=12.0.0} 483 | 484 | flatted@3.3.3: 485 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 486 | 487 | fs.realpath@1.0.0: 488 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 489 | 490 | functional-red-black-tree@1.0.1: 491 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 492 | 493 | glob-parent@5.1.2: 494 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 495 | engines: {node: '>= 6'} 496 | 497 | glob-parent@6.0.2: 498 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 499 | engines: {node: '>=10.13.0'} 500 | 501 | glob@7.2.3: 502 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 503 | deprecated: Glob versions prior to v9 are no longer supported 504 | 505 | globals@13.24.0: 506 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 507 | engines: {node: '>=8'} 508 | 509 | globby@11.1.0: 510 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 511 | engines: {node: '>=10'} 512 | 513 | graphemer@1.4.0: 514 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 515 | 516 | has-flag@4.0.0: 517 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 518 | engines: {node: '>=8'} 519 | 520 | ignore@5.3.2: 521 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 522 | engines: {node: '>= 4'} 523 | 524 | import-fresh@3.3.1: 525 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 526 | engines: {node: '>=6'} 527 | 528 | imurmurhash@0.1.4: 529 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 530 | engines: {node: '>=0.8.19'} 531 | 532 | inflight@1.0.6: 533 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 534 | 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. 535 | 536 | inherits@2.0.4: 537 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 538 | 539 | is-extglob@2.1.1: 540 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 541 | engines: {node: '>=0.10.0'} 542 | 543 | is-glob@4.0.3: 544 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 545 | engines: {node: '>=0.10.0'} 546 | 547 | is-number@7.0.0: 548 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 549 | engines: {node: '>=0.12.0'} 550 | 551 | is-path-inside@3.0.3: 552 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 553 | engines: {node: '>=8'} 554 | 555 | isexe@2.0.0: 556 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 557 | 558 | js-yaml@4.1.0: 559 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 560 | hasBin: true 561 | 562 | json-buffer@3.0.1: 563 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 564 | 565 | json-schema-traverse@0.4.1: 566 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 567 | 568 | json-stable-stringify-without-jsonify@1.0.1: 569 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 570 | 571 | keyv@4.5.4: 572 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 573 | 574 | levn@0.4.1: 575 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 576 | engines: {node: '>= 0.8.0'} 577 | 578 | locate-path@6.0.0: 579 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 580 | engines: {node: '>=10'} 581 | 582 | lodash.merge@4.6.2: 583 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 584 | 585 | merge2@1.4.1: 586 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 587 | engines: {node: '>= 8'} 588 | 589 | micromatch@4.0.8: 590 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 591 | engines: {node: '>=8.6'} 592 | 593 | minimatch@3.1.2: 594 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 595 | 596 | moment@2.29.4: 597 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 598 | 599 | ms@2.1.3: 600 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 601 | 602 | natural-compare@1.4.0: 603 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 604 | 605 | obsidian@1.8.7: 606 | resolution: {integrity: sha512-h4bWwNFAGRXlMlMAzdEiIM2ppTGlrh7uGOJS6w4gClrsjc+ei/3YAtU2VdFUlCiPuTHpY4aBpFJJW75S1Tl/JA==} 607 | peerDependencies: 608 | '@codemirror/state': ^6.0.0 609 | '@codemirror/view': ^6.0.0 610 | 611 | once@1.4.0: 612 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 613 | 614 | optionator@0.9.4: 615 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 616 | engines: {node: '>= 0.8.0'} 617 | 618 | p-limit@3.1.0: 619 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 620 | engines: {node: '>=10'} 621 | 622 | p-locate@5.0.0: 623 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 624 | engines: {node: '>=10'} 625 | 626 | parent-module@1.0.1: 627 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 628 | engines: {node: '>=6'} 629 | 630 | path-exists@4.0.0: 631 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 632 | engines: {node: '>=8'} 633 | 634 | path-is-absolute@1.0.1: 635 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 636 | engines: {node: '>=0.10.0'} 637 | 638 | path-key@3.1.1: 639 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 640 | engines: {node: '>=8'} 641 | 642 | path-type@4.0.0: 643 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 644 | engines: {node: '>=8'} 645 | 646 | picomatch@2.3.1: 647 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 648 | engines: {node: '>=8.6'} 649 | 650 | prelude-ls@1.2.1: 651 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 652 | engines: {node: '>= 0.8.0'} 653 | 654 | punycode@2.3.1: 655 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 656 | engines: {node: '>=6'} 657 | 658 | queue-microtask@1.2.3: 659 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 660 | 661 | regexpp@3.2.0: 662 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 663 | engines: {node: '>=8'} 664 | 665 | resolve-from@4.0.0: 666 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 667 | engines: {node: '>=4'} 668 | 669 | reusify@1.1.0: 670 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 671 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 672 | 673 | rimraf@3.0.2: 674 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 675 | deprecated: Rimraf versions prior to v4 are no longer supported 676 | hasBin: true 677 | 678 | run-parallel@1.2.0: 679 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 680 | 681 | semver@7.7.1: 682 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 683 | engines: {node: '>=10'} 684 | hasBin: true 685 | 686 | shebang-command@2.0.0: 687 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 688 | engines: {node: '>=8'} 689 | 690 | shebang-regex@3.0.0: 691 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 692 | engines: {node: '>=8'} 693 | 694 | slash@3.0.0: 695 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 696 | engines: {node: '>=8'} 697 | 698 | strip-ansi@6.0.1: 699 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 700 | engines: {node: '>=8'} 701 | 702 | strip-json-comments@3.1.1: 703 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 704 | engines: {node: '>=8'} 705 | 706 | style-mod@4.1.2: 707 | resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} 708 | 709 | supports-color@7.2.0: 710 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 711 | engines: {node: '>=8'} 712 | 713 | text-table@0.2.0: 714 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 715 | 716 | to-regex-range@5.0.1: 717 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 718 | engines: {node: '>=8.0'} 719 | 720 | tslib@1.14.1: 721 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 722 | 723 | tslib@2.4.0: 724 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 725 | 726 | tsutils@3.21.0: 727 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 728 | engines: {node: '>= 6'} 729 | peerDependencies: 730 | 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' 731 | 732 | type-check@0.4.0: 733 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 734 | engines: {node: '>= 0.8.0'} 735 | 736 | type-fest@0.20.2: 737 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 738 | engines: {node: '>=10'} 739 | 740 | typescript@4.7.4: 741 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} 742 | engines: {node: '>=4.2.0'} 743 | hasBin: true 744 | 745 | uri-js@4.4.1: 746 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 747 | 748 | w3c-keyname@2.2.8: 749 | resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} 750 | 751 | which@2.0.2: 752 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 753 | engines: {node: '>= 8'} 754 | hasBin: true 755 | 756 | word-wrap@1.2.5: 757 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 758 | engines: {node: '>=0.10.0'} 759 | 760 | wrappy@1.0.2: 761 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 762 | 763 | yocto-queue@0.1.0: 764 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 765 | engines: {node: '>=10'} 766 | 767 | snapshots: 768 | 769 | '@codemirror/language@6.10.8': 770 | dependencies: 771 | '@codemirror/state': 6.5.2 772 | '@codemirror/view': 6.36.3 773 | '@lezer/common': 1.2.3 774 | '@lezer/highlight': 1.2.1 775 | '@lezer/lr': 1.4.2 776 | style-mod: 4.1.2 777 | 778 | '@codemirror/state@6.5.2': 779 | dependencies: 780 | '@marijn/find-cluster-break': 1.0.2 781 | 782 | '@codemirror/view@6.36.3': 783 | dependencies: 784 | '@codemirror/state': 6.5.2 785 | style-mod: 4.1.2 786 | w3c-keyname: 2.2.8 787 | 788 | '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': 789 | dependencies: 790 | eslint: 8.57.1 791 | eslint-visitor-keys: 3.4.3 792 | 793 | '@eslint-community/regexpp@4.12.1': {} 794 | 795 | '@eslint/eslintrc@2.1.4': 796 | dependencies: 797 | ajv: 6.12.6 798 | debug: 4.4.0 799 | espree: 9.6.1 800 | globals: 13.24.0 801 | ignore: 5.3.2 802 | import-fresh: 3.3.1 803 | js-yaml: 4.1.0 804 | minimatch: 3.1.2 805 | strip-json-comments: 3.1.1 806 | transitivePeerDependencies: 807 | - supports-color 808 | 809 | '@eslint/js@8.57.1': {} 810 | 811 | '@humanwhocodes/config-array@0.13.0': 812 | dependencies: 813 | '@humanwhocodes/object-schema': 2.0.3 814 | debug: 4.4.0 815 | minimatch: 3.1.2 816 | transitivePeerDependencies: 817 | - supports-color 818 | 819 | '@humanwhocodes/module-importer@1.0.1': {} 820 | 821 | '@humanwhocodes/object-schema@2.0.3': {} 822 | 823 | '@lezer/common@1.2.3': {} 824 | 825 | '@lezer/highlight@1.2.1': 826 | dependencies: 827 | '@lezer/common': 1.2.3 828 | 829 | '@lezer/lr@1.4.2': 830 | dependencies: 831 | '@lezer/common': 1.2.3 832 | 833 | '@marijn/find-cluster-break@1.0.2': {} 834 | 835 | '@nodelib/fs.scandir@2.1.5': 836 | dependencies: 837 | '@nodelib/fs.stat': 2.0.5 838 | run-parallel: 1.2.0 839 | 840 | '@nodelib/fs.stat@2.0.5': {} 841 | 842 | '@nodelib/fs.walk@1.2.8': 843 | dependencies: 844 | '@nodelib/fs.scandir': 2.1.5 845 | fastq: 1.19.0 846 | 847 | '@types/codemirror@5.60.8': 848 | dependencies: 849 | '@types/tern': 0.23.9 850 | 851 | '@types/estree@1.0.6': {} 852 | 853 | '@types/json-schema@7.0.15': {} 854 | 855 | '@types/node@16.18.126': {} 856 | 857 | '@types/tern@0.23.9': 858 | dependencies: 859 | '@types/estree': 1.0.6 860 | 861 | '@typescript-eslint/eslint-plugin@5.29.0(@typescript-eslint/parser@5.29.0(eslint@8.57.1)(typescript@4.7.4))(eslint@8.57.1)(typescript@4.7.4)': 862 | dependencies: 863 | '@typescript-eslint/parser': 5.29.0(eslint@8.57.1)(typescript@4.7.4) 864 | '@typescript-eslint/scope-manager': 5.29.0 865 | '@typescript-eslint/type-utils': 5.29.0(eslint@8.57.1)(typescript@4.7.4) 866 | '@typescript-eslint/utils': 5.29.0(eslint@8.57.1)(typescript@4.7.4) 867 | debug: 4.4.0 868 | eslint: 8.57.1 869 | functional-red-black-tree: 1.0.1 870 | ignore: 5.3.2 871 | regexpp: 3.2.0 872 | semver: 7.7.1 873 | tsutils: 3.21.0(typescript@4.7.4) 874 | optionalDependencies: 875 | typescript: 4.7.4 876 | transitivePeerDependencies: 877 | - supports-color 878 | 879 | '@typescript-eslint/parser@5.29.0(eslint@8.57.1)(typescript@4.7.4)': 880 | dependencies: 881 | '@typescript-eslint/scope-manager': 5.29.0 882 | '@typescript-eslint/types': 5.29.0 883 | '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) 884 | debug: 4.4.0 885 | eslint: 8.57.1 886 | optionalDependencies: 887 | typescript: 4.7.4 888 | transitivePeerDependencies: 889 | - supports-color 890 | 891 | '@typescript-eslint/scope-manager@5.29.0': 892 | dependencies: 893 | '@typescript-eslint/types': 5.29.0 894 | '@typescript-eslint/visitor-keys': 5.29.0 895 | 896 | '@typescript-eslint/type-utils@5.29.0(eslint@8.57.1)(typescript@4.7.4)': 897 | dependencies: 898 | '@typescript-eslint/utils': 5.29.0(eslint@8.57.1)(typescript@4.7.4) 899 | debug: 4.4.0 900 | eslint: 8.57.1 901 | tsutils: 3.21.0(typescript@4.7.4) 902 | optionalDependencies: 903 | typescript: 4.7.4 904 | transitivePeerDependencies: 905 | - supports-color 906 | 907 | '@typescript-eslint/types@5.29.0': {} 908 | 909 | '@typescript-eslint/typescript-estree@5.29.0(typescript@4.7.4)': 910 | dependencies: 911 | '@typescript-eslint/types': 5.29.0 912 | '@typescript-eslint/visitor-keys': 5.29.0 913 | debug: 4.4.0 914 | globby: 11.1.0 915 | is-glob: 4.0.3 916 | semver: 7.7.1 917 | tsutils: 3.21.0(typescript@4.7.4) 918 | optionalDependencies: 919 | typescript: 4.7.4 920 | transitivePeerDependencies: 921 | - supports-color 922 | 923 | '@typescript-eslint/utils@5.29.0(eslint@8.57.1)(typescript@4.7.4)': 924 | dependencies: 925 | '@types/json-schema': 7.0.15 926 | '@typescript-eslint/scope-manager': 5.29.0 927 | '@typescript-eslint/types': 5.29.0 928 | '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) 929 | eslint: 8.57.1 930 | eslint-scope: 5.1.1 931 | eslint-utils: 3.0.0(eslint@8.57.1) 932 | transitivePeerDependencies: 933 | - supports-color 934 | - typescript 935 | 936 | '@typescript-eslint/visitor-keys@5.29.0': 937 | dependencies: 938 | '@typescript-eslint/types': 5.29.0 939 | eslint-visitor-keys: 3.4.3 940 | 941 | '@ungap/structured-clone@1.3.0': {} 942 | 943 | acorn-jsx@5.3.2(acorn@8.14.0): 944 | dependencies: 945 | acorn: 8.14.0 946 | 947 | acorn@8.14.0: {} 948 | 949 | ajv@6.12.6: 950 | dependencies: 951 | fast-deep-equal: 3.1.3 952 | fast-json-stable-stringify: 2.1.0 953 | json-schema-traverse: 0.4.1 954 | uri-js: 4.4.1 955 | 956 | ansi-regex@5.0.1: {} 957 | 958 | ansi-styles@4.3.0: 959 | dependencies: 960 | color-convert: 2.0.1 961 | 962 | argparse@2.0.1: {} 963 | 964 | array-union@2.1.0: {} 965 | 966 | balanced-match@1.0.2: {} 967 | 968 | brace-expansion@1.1.11: 969 | dependencies: 970 | balanced-match: 1.0.2 971 | concat-map: 0.0.1 972 | 973 | braces@3.0.3: 974 | dependencies: 975 | fill-range: 7.1.1 976 | 977 | builtin-modules@3.3.0: {} 978 | 979 | callsites@3.1.0: {} 980 | 981 | chalk@4.1.2: 982 | dependencies: 983 | ansi-styles: 4.3.0 984 | supports-color: 7.2.0 985 | 986 | color-convert@2.0.1: 987 | dependencies: 988 | color-name: 1.1.4 989 | 990 | color-name@1.1.4: {} 991 | 992 | concat-map@0.0.1: {} 993 | 994 | cross-spawn@7.0.6: 995 | dependencies: 996 | path-key: 3.1.1 997 | shebang-command: 2.0.0 998 | which: 2.0.2 999 | 1000 | debug@4.4.0: 1001 | dependencies: 1002 | ms: 2.1.3 1003 | 1004 | deep-is@0.1.4: {} 1005 | 1006 | dir-glob@3.0.1: 1007 | dependencies: 1008 | path-type: 4.0.0 1009 | 1010 | doctrine@3.0.0: 1011 | dependencies: 1012 | esutils: 2.0.3 1013 | 1014 | esbuild-android-64@0.14.47: 1015 | optional: true 1016 | 1017 | esbuild-android-arm64@0.14.47: 1018 | optional: true 1019 | 1020 | esbuild-darwin-64@0.14.47: 1021 | optional: true 1022 | 1023 | esbuild-darwin-arm64@0.14.47: 1024 | optional: true 1025 | 1026 | esbuild-freebsd-64@0.14.47: 1027 | optional: true 1028 | 1029 | esbuild-freebsd-arm64@0.14.47: 1030 | optional: true 1031 | 1032 | esbuild-linux-32@0.14.47: 1033 | optional: true 1034 | 1035 | esbuild-linux-64@0.14.47: 1036 | optional: true 1037 | 1038 | esbuild-linux-arm64@0.14.47: 1039 | optional: true 1040 | 1041 | esbuild-linux-arm@0.14.47: 1042 | optional: true 1043 | 1044 | esbuild-linux-mips64le@0.14.47: 1045 | optional: true 1046 | 1047 | esbuild-linux-ppc64le@0.14.47: 1048 | optional: true 1049 | 1050 | esbuild-linux-riscv64@0.14.47: 1051 | optional: true 1052 | 1053 | esbuild-linux-s390x@0.14.47: 1054 | optional: true 1055 | 1056 | esbuild-netbsd-64@0.14.47: 1057 | optional: true 1058 | 1059 | esbuild-openbsd-64@0.14.47: 1060 | optional: true 1061 | 1062 | esbuild-sunos-64@0.14.47: 1063 | optional: true 1064 | 1065 | esbuild-windows-32@0.14.47: 1066 | optional: true 1067 | 1068 | esbuild-windows-64@0.14.47: 1069 | optional: true 1070 | 1071 | esbuild-windows-arm64@0.14.47: 1072 | optional: true 1073 | 1074 | esbuild@0.14.47: 1075 | optionalDependencies: 1076 | esbuild-android-64: 0.14.47 1077 | esbuild-android-arm64: 0.14.47 1078 | esbuild-darwin-64: 0.14.47 1079 | esbuild-darwin-arm64: 0.14.47 1080 | esbuild-freebsd-64: 0.14.47 1081 | esbuild-freebsd-arm64: 0.14.47 1082 | esbuild-linux-32: 0.14.47 1083 | esbuild-linux-64: 0.14.47 1084 | esbuild-linux-arm: 0.14.47 1085 | esbuild-linux-arm64: 0.14.47 1086 | esbuild-linux-mips64le: 0.14.47 1087 | esbuild-linux-ppc64le: 0.14.47 1088 | esbuild-linux-riscv64: 0.14.47 1089 | esbuild-linux-s390x: 0.14.47 1090 | esbuild-netbsd-64: 0.14.47 1091 | esbuild-openbsd-64: 0.14.47 1092 | esbuild-sunos-64: 0.14.47 1093 | esbuild-windows-32: 0.14.47 1094 | esbuild-windows-64: 0.14.47 1095 | esbuild-windows-arm64: 0.14.47 1096 | 1097 | escape-string-regexp@4.0.0: {} 1098 | 1099 | eslint-scope@5.1.1: 1100 | dependencies: 1101 | esrecurse: 4.3.0 1102 | estraverse: 4.3.0 1103 | 1104 | eslint-scope@7.2.2: 1105 | dependencies: 1106 | esrecurse: 4.3.0 1107 | estraverse: 5.3.0 1108 | 1109 | eslint-utils@3.0.0(eslint@8.57.1): 1110 | dependencies: 1111 | eslint: 8.57.1 1112 | eslint-visitor-keys: 2.1.0 1113 | 1114 | eslint-visitor-keys@2.1.0: {} 1115 | 1116 | eslint-visitor-keys@3.4.3: {} 1117 | 1118 | eslint@8.57.1: 1119 | dependencies: 1120 | '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) 1121 | '@eslint-community/regexpp': 4.12.1 1122 | '@eslint/eslintrc': 2.1.4 1123 | '@eslint/js': 8.57.1 1124 | '@humanwhocodes/config-array': 0.13.0 1125 | '@humanwhocodes/module-importer': 1.0.1 1126 | '@nodelib/fs.walk': 1.2.8 1127 | '@ungap/structured-clone': 1.3.0 1128 | ajv: 6.12.6 1129 | chalk: 4.1.2 1130 | cross-spawn: 7.0.6 1131 | debug: 4.4.0 1132 | doctrine: 3.0.0 1133 | escape-string-regexp: 4.0.0 1134 | eslint-scope: 7.2.2 1135 | eslint-visitor-keys: 3.4.3 1136 | espree: 9.6.1 1137 | esquery: 1.6.0 1138 | esutils: 2.0.3 1139 | fast-deep-equal: 3.1.3 1140 | file-entry-cache: 6.0.1 1141 | find-up: 5.0.0 1142 | glob-parent: 6.0.2 1143 | globals: 13.24.0 1144 | graphemer: 1.4.0 1145 | ignore: 5.3.2 1146 | imurmurhash: 0.1.4 1147 | is-glob: 4.0.3 1148 | is-path-inside: 3.0.3 1149 | js-yaml: 4.1.0 1150 | json-stable-stringify-without-jsonify: 1.0.1 1151 | levn: 0.4.1 1152 | lodash.merge: 4.6.2 1153 | minimatch: 3.1.2 1154 | natural-compare: 1.4.0 1155 | optionator: 0.9.4 1156 | strip-ansi: 6.0.1 1157 | text-table: 0.2.0 1158 | transitivePeerDependencies: 1159 | - supports-color 1160 | 1161 | espree@9.6.1: 1162 | dependencies: 1163 | acorn: 8.14.0 1164 | acorn-jsx: 5.3.2(acorn@8.14.0) 1165 | eslint-visitor-keys: 3.4.3 1166 | 1167 | esquery@1.6.0: 1168 | dependencies: 1169 | estraverse: 5.3.0 1170 | 1171 | esrecurse@4.3.0: 1172 | dependencies: 1173 | estraverse: 5.3.0 1174 | 1175 | estraverse@4.3.0: {} 1176 | 1177 | estraverse@5.3.0: {} 1178 | 1179 | esutils@2.0.3: {} 1180 | 1181 | fast-deep-equal@3.1.3: {} 1182 | 1183 | fast-glob@3.3.3: 1184 | dependencies: 1185 | '@nodelib/fs.stat': 2.0.5 1186 | '@nodelib/fs.walk': 1.2.8 1187 | glob-parent: 5.1.2 1188 | merge2: 1.4.1 1189 | micromatch: 4.0.8 1190 | 1191 | fast-json-stable-stringify@2.1.0: {} 1192 | 1193 | fast-levenshtein@2.0.6: {} 1194 | 1195 | fastq@1.19.0: 1196 | dependencies: 1197 | reusify: 1.1.0 1198 | 1199 | file-entry-cache@6.0.1: 1200 | dependencies: 1201 | flat-cache: 3.2.0 1202 | 1203 | fill-range@7.1.1: 1204 | dependencies: 1205 | to-regex-range: 5.0.1 1206 | 1207 | find-up@5.0.0: 1208 | dependencies: 1209 | locate-path: 6.0.0 1210 | path-exists: 4.0.0 1211 | 1212 | flat-cache@3.2.0: 1213 | dependencies: 1214 | flatted: 3.3.3 1215 | keyv: 4.5.4 1216 | rimraf: 3.0.2 1217 | 1218 | flatted@3.3.3: {} 1219 | 1220 | fs.realpath@1.0.0: {} 1221 | 1222 | functional-red-black-tree@1.0.1: {} 1223 | 1224 | glob-parent@5.1.2: 1225 | dependencies: 1226 | is-glob: 4.0.3 1227 | 1228 | glob-parent@6.0.2: 1229 | dependencies: 1230 | is-glob: 4.0.3 1231 | 1232 | glob@7.2.3: 1233 | dependencies: 1234 | fs.realpath: 1.0.0 1235 | inflight: 1.0.6 1236 | inherits: 2.0.4 1237 | minimatch: 3.1.2 1238 | once: 1.4.0 1239 | path-is-absolute: 1.0.1 1240 | 1241 | globals@13.24.0: 1242 | dependencies: 1243 | type-fest: 0.20.2 1244 | 1245 | globby@11.1.0: 1246 | dependencies: 1247 | array-union: 2.1.0 1248 | dir-glob: 3.0.1 1249 | fast-glob: 3.3.3 1250 | ignore: 5.3.2 1251 | merge2: 1.4.1 1252 | slash: 3.0.0 1253 | 1254 | graphemer@1.4.0: {} 1255 | 1256 | has-flag@4.0.0: {} 1257 | 1258 | ignore@5.3.2: {} 1259 | 1260 | import-fresh@3.3.1: 1261 | dependencies: 1262 | parent-module: 1.0.1 1263 | resolve-from: 4.0.0 1264 | 1265 | imurmurhash@0.1.4: {} 1266 | 1267 | inflight@1.0.6: 1268 | dependencies: 1269 | once: 1.4.0 1270 | wrappy: 1.0.2 1271 | 1272 | inherits@2.0.4: {} 1273 | 1274 | is-extglob@2.1.1: {} 1275 | 1276 | is-glob@4.0.3: 1277 | dependencies: 1278 | is-extglob: 2.1.1 1279 | 1280 | is-number@7.0.0: {} 1281 | 1282 | is-path-inside@3.0.3: {} 1283 | 1284 | isexe@2.0.0: {} 1285 | 1286 | js-yaml@4.1.0: 1287 | dependencies: 1288 | argparse: 2.0.1 1289 | 1290 | json-buffer@3.0.1: {} 1291 | 1292 | json-schema-traverse@0.4.1: {} 1293 | 1294 | json-stable-stringify-without-jsonify@1.0.1: {} 1295 | 1296 | keyv@4.5.4: 1297 | dependencies: 1298 | json-buffer: 3.0.1 1299 | 1300 | levn@0.4.1: 1301 | dependencies: 1302 | prelude-ls: 1.2.1 1303 | type-check: 0.4.0 1304 | 1305 | locate-path@6.0.0: 1306 | dependencies: 1307 | p-locate: 5.0.0 1308 | 1309 | lodash.merge@4.6.2: {} 1310 | 1311 | merge2@1.4.1: {} 1312 | 1313 | micromatch@4.0.8: 1314 | dependencies: 1315 | braces: 3.0.3 1316 | picomatch: 2.3.1 1317 | 1318 | minimatch@3.1.2: 1319 | dependencies: 1320 | brace-expansion: 1.1.11 1321 | 1322 | moment@2.29.4: {} 1323 | 1324 | ms@2.1.3: {} 1325 | 1326 | natural-compare@1.4.0: {} 1327 | 1328 | obsidian@1.8.7(@codemirror/state@6.5.2)(@codemirror/view@6.36.3): 1329 | dependencies: 1330 | '@codemirror/state': 6.5.2 1331 | '@codemirror/view': 6.36.3 1332 | '@types/codemirror': 5.60.8 1333 | moment: 2.29.4 1334 | 1335 | once@1.4.0: 1336 | dependencies: 1337 | wrappy: 1.0.2 1338 | 1339 | optionator@0.9.4: 1340 | dependencies: 1341 | deep-is: 0.1.4 1342 | fast-levenshtein: 2.0.6 1343 | levn: 0.4.1 1344 | prelude-ls: 1.2.1 1345 | type-check: 0.4.0 1346 | word-wrap: 1.2.5 1347 | 1348 | p-limit@3.1.0: 1349 | dependencies: 1350 | yocto-queue: 0.1.0 1351 | 1352 | p-locate@5.0.0: 1353 | dependencies: 1354 | p-limit: 3.1.0 1355 | 1356 | parent-module@1.0.1: 1357 | dependencies: 1358 | callsites: 3.1.0 1359 | 1360 | path-exists@4.0.0: {} 1361 | 1362 | path-is-absolute@1.0.1: {} 1363 | 1364 | path-key@3.1.1: {} 1365 | 1366 | path-type@4.0.0: {} 1367 | 1368 | picomatch@2.3.1: {} 1369 | 1370 | prelude-ls@1.2.1: {} 1371 | 1372 | punycode@2.3.1: {} 1373 | 1374 | queue-microtask@1.2.3: {} 1375 | 1376 | regexpp@3.2.0: {} 1377 | 1378 | resolve-from@4.0.0: {} 1379 | 1380 | reusify@1.1.0: {} 1381 | 1382 | rimraf@3.0.2: 1383 | dependencies: 1384 | glob: 7.2.3 1385 | 1386 | run-parallel@1.2.0: 1387 | dependencies: 1388 | queue-microtask: 1.2.3 1389 | 1390 | semver@7.7.1: {} 1391 | 1392 | shebang-command@2.0.0: 1393 | dependencies: 1394 | shebang-regex: 3.0.0 1395 | 1396 | shebang-regex@3.0.0: {} 1397 | 1398 | slash@3.0.0: {} 1399 | 1400 | strip-ansi@6.0.1: 1401 | dependencies: 1402 | ansi-regex: 5.0.1 1403 | 1404 | strip-json-comments@3.1.1: {} 1405 | 1406 | style-mod@4.1.2: {} 1407 | 1408 | supports-color@7.2.0: 1409 | dependencies: 1410 | has-flag: 4.0.0 1411 | 1412 | text-table@0.2.0: {} 1413 | 1414 | to-regex-range@5.0.1: 1415 | dependencies: 1416 | is-number: 7.0.0 1417 | 1418 | tslib@1.14.1: {} 1419 | 1420 | tslib@2.4.0: {} 1421 | 1422 | tsutils@3.21.0(typescript@4.7.4): 1423 | dependencies: 1424 | tslib: 1.14.1 1425 | typescript: 4.7.4 1426 | 1427 | type-check@0.4.0: 1428 | dependencies: 1429 | prelude-ls: 1.2.1 1430 | 1431 | type-fest@0.20.2: {} 1432 | 1433 | typescript@4.7.4: {} 1434 | 1435 | uri-js@4.4.1: 1436 | dependencies: 1437 | punycode: 2.3.1 1438 | 1439 | w3c-keyname@2.2.8: {} 1440 | 1441 | which@2.0.2: 1442 | dependencies: 1443 | isexe: 2.0.0 1444 | 1445 | word-wrap@1.2.5: {} 1446 | 1447 | wrappy@1.0.2: {} 1448 | 1449 | yocto-queue@0.1.0: {} 1450 | -------------------------------------------------------------------------------- /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 | 10 | 11 | .dbl-donate-button { 12 | height: auto; 13 | width: auto; 14 | padding: 0; 15 | } 16 | 17 | .dbl-donate-button a { 18 | height: 50px; 19 | width: auto; 20 | padding: 0; 21 | } 22 | 23 | svg.svg-icon.alipay { 24 | height: 50px; 25 | width: 50px; 26 | padding: 0; 27 | } 28 | 29 | svg.svg-icon.wechat { 30 | height: 50px; 31 | width: 50px; 32 | padding: 3px; 33 | } 34 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "lib": [ 15 | "DOM", 16 | "ES5", 17 | "ES6", 18 | "ES7" 19 | ] 20 | }, 21 | "include": [ 22 | "**/*.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /version-bump.mjs: -------------------------------------------------------------------------------- 1 | import { readFileSync, writeFileSync } from "fs"; 2 | 3 | const targetVersion = process.env.npm_package_version; 4 | 5 | // read minAppVersion from manifest.json and bump version to target version 6 | let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); 7 | const { minAppVersion } = manifest; 8 | manifest.version = targetVersion; 9 | writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); 10 | 11 | // update versions.json with target version and minAppVersion from manifest.json 12 | let versions = JSON.parse(readFileSync("versions.json", "utf8")); 13 | versions[targetVersion] = minAppVersion; 14 | writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); 15 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.0": "0.15.0", 3 | "1.1.0": "0.15.0", 4 | "1.1.1": "0.15.0", 5 | "1.1.2": "0.15.0", 6 | "1.1.3": "0.15.0", 7 | "1.2.0": "0.15.0", 8 | "1.3.0": "0.15.0", 9 | "2.0.0": "0.15.0", 10 | "2.1.0": "0.15.0" 11 | } --------------------------------------------------------------------------------