├── .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 | }
--------------------------------------------------------------------------------