├── .editorconfig
├── .eslintignore
├── .eslintrc
├── .gitignore
├── .npmrc
├── LICENSE
├── README.md
├── demo_images
├── block_demo.gif
└── title_link_demo.gif
├── esbuild.config.mjs
├── main.ts
├── manifest.json
├── package-lock.json
├── package.json
├── settings.ts
├── styles.css
├── tsconfig.json
├── version-bump.mjs
└── versions.json
/.editorconfig:
--------------------------------------------------------------------------------
1 | # top-most EditorConfig file
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | end_of_line = lf
7 | insert_final_newline = true
8 | indent_style = tab
9 | indent_size = 4
10 | tab_width = 4
11 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | 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 | }
--------------------------------------------------------------------------------
/.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 |
24 | # Exclude env
25 | .env
26 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | tag-version-prefix=""
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Michael Harris
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | # Obsidian Thumbnails
4 | This plugin lets you insert video thumbnails into your notes to help you keep track of what you're actually linking.
5 |
6 | Works with Youtube and Vimeo.
7 |
8 |
9 | ## Usage
10 | Use the "Insert thumbnail from URL in clipboard" command
11 |
12 | ***OR***
13 |
14 | Manually place a code block with the `vid` type, and include the link to your video:
15 | ````markdown
16 | ```vid
17 | https://youtu.be/dQw4w9WgXcQ
18 | ```
19 | ````
20 | ## Commands
21 | ### Insert thumbnail from URL in clipboard
22 | If you have a video URL in your clipboard, this command will create the code block for you.
23 |
24 | ### Insert video title link from URL in clipboard
25 | If you have a video URL in your clipboard, this command will automatically create a link with the text set to the video title.
26 |
27 |
28 |
29 | ## Offline Settings
30 | ### **Save Thumbnail Info**
31 | Default: Enabled
32 | When offline, thumbnails will have blank images but still show the title and channel.
33 | ### **Save Images**
34 | Default: Disabled
35 | Store your thumbnail images locally in a location you specify.
36 |
--------------------------------------------------------------------------------
/demo_images/block_demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meikul/obsidian-thumbnails/7bf9c319b614080eb4a144e4048a7892cbb3e4d3/demo_images/block_demo.gif
--------------------------------------------------------------------------------
/demo_images/title_link_demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Meikul/obsidian-thumbnails/7bf9c319b614080eb4a144e4048a7892cbb3e4d3/demo_images/title_link_demo.gif
--------------------------------------------------------------------------------
/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: ['main.ts'],
19 | bundle: true,
20 | external: [
21 | 'obsidian',
22 | 'electron',
23 | '@codemirror/autocomplete',
24 | '@codemirror/closebrackets',
25 | '@codemirror/collab',
26 | '@codemirror/commands',
27 | '@codemirror/comment',
28 | '@codemirror/fold',
29 | '@codemirror/gutter',
30 | '@codemirror/highlight',
31 | '@codemirror/history',
32 | '@codemirror/language',
33 | '@codemirror/lint',
34 | '@codemirror/matchbrackets',
35 | '@codemirror/panel',
36 | '@codemirror/rangeset',
37 | '@codemirror/rectangular-selection',
38 | '@codemirror/search',
39 | '@codemirror/state',
40 | '@codemirror/stream-parser',
41 | '@codemirror/text',
42 | '@codemirror/tooltip',
43 | '@codemirror/view',
44 | ...builtins],
45 | format: 'cjs',
46 | watch: !prod,
47 | target: 'es2016',
48 | logLevel: "info",
49 | sourcemap: prod ? false : 'inline',
50 | treeShaking: true,
51 | outfile: 'main.js',
52 | }).catch(() => process.exit(1));
53 |
--------------------------------------------------------------------------------
/main.ts:
--------------------------------------------------------------------------------
1 | import { Editor, MarkdownRenderer, MarkdownRenderChild, Plugin, MarkdownView, Notice, requestUrl, RequestUrlParam, MarkdownPostProcessorContext, EditorPosition, TAbstractFile, TFile } from 'obsidian';
2 | import ThumbySettingTab from "./settings";
3 |
4 | interface VidInfo {
5 | url: string;
6 | thumbnail: string;
7 | title: string;
8 | author: string;
9 | authorUrl: string;
10 | vidFound: boolean;
11 | networkError: boolean;
12 | infoStored: boolean;
13 | imageSaved: boolean;
14 | }
15 |
16 | interface ThumbySettings {
17 | storeInfo: boolean;
18 | saveImages: boolean;
19 | imageLocation: string;
20 | imageFolder: string;
21 | responsiveCardStyle: boolean;
22 | youtubeApiKey: string;
23 | }
24 |
25 | const DEFAULT_SETTINGS: Partial = {
26 | storeInfo: true,
27 | saveImages: false,
28 | imageLocation: 'defaultAttachment',
29 | imageFolder: '',
30 | responsiveCardStyle: true,
31 | youtubeApiKey: ''
32 | };
33 |
34 | const URL_TYPES = {
35 | youtube: [
36 | {match: 'youtube.com/watch?v=', idPattern: /v=([-\w\d]+)/},
37 | {match: 'youtu.be/', idPattern: /youtu.be\/([-\w\d]+)/},
38 | {match: 'youtube.com/shorts/', idPattern: /shorts\/([-\w\d]+)/},
39 | {match: 'youtube.com/live/', idPattern: /live\/(\w+)/}
40 | ],
41 | vimeo: [
42 | {match: 'vimeo.com/', idPattern: /vimeo.com\/([\w\d]+)/}
43 | ]
44 | };
45 |
46 | export default class ThumbyPlugin extends Plugin {
47 | settings: ThumbySettings;
48 |
49 | async loadSettings() {
50 | this.settings = Object.assign(
51 | {},
52 | DEFAULT_SETTINGS,
53 | await this.loadData()
54 | );
55 | }
56 |
57 | async saveSettings() {
58 | await this.saveData(this.settings);
59 | // Run responsive check in case responsiveCardStyle setting changed
60 | this.responsiveCardCheckAllEditors();
61 | }
62 |
63 | responsiveCardCheckAllEditors() {
64 | const editors = document.querySelectorAll(
65 | ".workspace-leaf .view-content"
66 | );
67 |
68 | for (const key in editors) {
69 | if (Object.prototype.hasOwnProperty.call(editors, key)) {
70 | const editor = editors[key];
71 | this.responsiveCardCheck(editor);
72 | }
73 | }
74 | }
75 |
76 | responsiveCardCheck(editor: Element) {
77 | const vidBlocks = editor.querySelectorAll(".block-language-vid");
78 |
79 | for (const key in vidBlocks) {
80 | if (Object.prototype.hasOwnProperty.call(vidBlocks, key)) {
81 | const block = vidBlocks[key] as HTMLElement;
82 |
83 | // Check if setting is enabled here so we can remove the card style class from blocks if it was just disabled
84 | if (
85 | this.settings.responsiveCardStyle &&
86 | block &&
87 | block.offsetWidth < 290
88 | ) {
89 | block.addClass("thumbnail-card-style");
90 | } else {
91 | block.removeClass("thumbnail-card-style");
92 | }
93 | }
94 | }
95 | }
96 |
97 | // setEditorResizeObservers sets the resize observer to observe all editor elements
98 | setEditorResizeObservers() {
99 | if (!this.editorObserver) return;
100 |
101 | this.editorObserver.disconnect();
102 | const editorElems = document.querySelectorAll(
103 | ".workspace-leaf .view-content"
104 | );
105 | for (const key in editorElems) {
106 | if (Object.prototype.hasOwnProperty.call(editorElems, key)) {
107 | const editor = editorElems[key];
108 | this.editorObserver.observe(editor);
109 | }
110 | }
111 | }
112 |
113 | // waitForVidBlockLoad waits for the note's vid language blocks to be loaded
114 | // before running the callback
115 | waitForVidBlockLoad(view: MarkdownView, callback: () => void) {
116 | let intervalCount = 0;
117 | const interval = window.setInterval(() => {
118 | const elements = view.contentEl.querySelectorAll(
119 | ".block-language-vid"
120 | );
121 | if (elements.length > 0) {
122 | window.clearInterval(interval);
123 | callback();
124 | }
125 | if (intervalCount > 20) {
126 | // If it takes more than 2 seconds, give up
127 | window.clearInterval(interval);
128 | }
129 | intervalCount++;
130 | }, 100); // Check every 100ms
131 | this.registerInterval(interval);
132 | }
133 |
134 | // A resize observer that runs responsiveCardCheck on all entries
135 | private editorObserver = new ResizeObserver((entries) => {
136 | for (const editor of entries) {
137 | this.responsiveCardCheck(editor.target);
138 | }
139 | });
140 |
141 | async onload() {
142 | await this.loadSettings();
143 | this.addSettingTab(new ThumbySettingTab(this.app, this));
144 |
145 | this.app.workspace.onLayoutReady(() => {
146 | this.setEditorResizeObservers();
147 | this.registerEvent(
148 | this.app.workspace.on("file-open", () => {
149 | this.setEditorResizeObservers();
150 | })
151 | );
152 | });
153 |
154 | const activeView = this.app.workspace.getActiveViewOfType(MarkdownView);
155 | if (activeView) {
156 | this.waitForVidBlockLoad(activeView, () => {
157 | this.responsiveCardCheck(activeView.contentEl);
158 | });
159 | }
160 |
161 | this.registerMarkdownCodeBlockProcessor(
162 | "vid",
163 | async (source, el, ctx) => {
164 | this.createDummyBlock(el);
165 | const sourceLines = source.trim().split("\n");
166 | const url = sourceLines[0];
167 | let info: VidInfo;
168 |
169 | if (this.settings.storeInfo) {
170 | info = this.parseStoredInfo(source);
171 | }
172 |
173 | if (!this.settings.storeInfo || !info.infoStored) {
174 | info = await this.getVideoInfo(url);
175 | }
176 |
177 | if (info.networkError && !info.infoStored) {
178 | // If offline and info not stored, just show link
179 | this.removeDummyBlock(el);
180 | const url = source.trim().split("\n")[0];
181 | el.createEl("a", { text: url, href: url });
182 | return;
183 | }
184 |
185 | const sourcePath =
186 | typeof ctx == "string"
187 | ? ctx
188 | : ctx?.sourcePath ??
189 | this.app.workspace.getActiveFile()?.path ??
190 | "";
191 |
192 | if (!info.vidFound) {
193 | const component = new MarkdownRenderChild(el);
194 | this.removeDummyBlock(el);
195 | MarkdownRenderer.render(
196 | this.app,
197 | `>[!WARNING] Cannot find video\n>${info.url}`,
198 | el,
199 | sourcePath,
200 | component
201 | );
202 | return;
203 | }
204 |
205 | if (this.hasManyUrls(sourceLines)) {
206 | const component = new MarkdownRenderChild(el);
207 | this.removeDummyBlock(el);
208 | MarkdownRenderer.render(
209 | this.app,
210 | `>[!WARNING] Cannot accept multiple video URLs`,
211 | el,
212 | sourcePath,
213 | component
214 | );
215 | return;
216 | }
217 |
218 | // Sketchy? Can get be called infinitely if this.storeVideoInfo changes text
219 | // and it doesn't make this.parseStoredInfo set info.infoStored to true
220 | if (this.settings.storeInfo && !info.infoStored) {
221 | this.storeVideoInfo(info, el, ctx);
222 | }
223 |
224 | if (!this.settings.storeInfo && sourceLines.length > 1) {
225 | this.removeStoredInfo(info, el, ctx);
226 | }
227 |
228 | this.removeDummyBlock(el);
229 | this.createThumbnail(el, info);
230 | }
231 | );
232 |
233 | this.addCommand({
234 | id: "insert-thumbnail-from-clipboard",
235 | name: "Insert thumbnail from URL in clipboard",
236 | editorCallback: async (editor: Editor, view: MarkdownView) => {
237 | const clipText = await navigator.clipboard.readText();
238 | const id = await this.getVideoId(clipText);
239 | if (id === "") {
240 | new Notice("No valid video in clipboard", 2000);
241 | return;
242 | }
243 | editor.replaceSelection(`\`\`\`vid\n${clipText}\n\`\`\``);
244 | },
245 | });
246 |
247 | this.addCommand({
248 | id: "insert-video-title-link",
249 | name: "Insert video title link from URL in clipboard",
250 | editorCallback: async (editor: Editor, view: MarkdownView) => {
251 | const clipText = await navigator.clipboard.readText();
252 | const id = await this.getVideoId(clipText);
253 | if (id === "") {
254 | new Notice("No valid video in clipboard", 2000);
255 | return;
256 | }
257 | const info = await this.getVideoInfo(clipText);
258 |
259 | editor.replaceSelection(`[${info.title}](${info.url})`);
260 | },
261 | });
262 | }
263 |
264 | onunload() {
265 | if (this.editorObserver) {
266 | this.editorObserver.disconnect();
267 | }
268 | }
269 |
270 | hasManyUrls(lines: string[]): boolean {
271 | // Will be used for future features
272 | return (
273 | lines.length > 1 &&
274 | lines.every((e) => /^((https*:\/\/)|(www\.))+\S*$/.test(e.trim()))
275 | );
276 | }
277 |
278 | createThumbnail(el: HTMLElement, info: VidInfo) {
279 | let thumbnailUrl = info.thumbnail;
280 | if (this.pathIsLocal(thumbnailUrl)) {
281 | const file = this.app.vault.getAbstractFileByPath(thumbnailUrl);
282 |
283 | if (file) {
284 | //@ts-ignore
285 | thumbnailUrl = this.app.vault.getResourcePath(file);
286 | }
287 | }
288 |
289 | const container = el.createEl("a", {
290 | href: info.url,
291 | cls: "thumbnail",
292 | });
293 | const imgContainer = container.createDiv({
294 | cls: "thumbnail-img-container",
295 | });
296 | imgContainer.createEl("img", {
297 | attr: { src: thumbnailUrl },
298 | cls: "thumbnail-img",
299 | });
300 | const iconsContainer = imgContainer.createDiv({
301 | cls: "img-icons-container",
302 | });
303 | const textBox = container.createDiv({ cls: "thumbnail-text" });
304 | textBox.createDiv({
305 | text: info.title,
306 | title: info.title,
307 | cls: "thumbnail-title",
308 | });
309 | textBox.createEl("a", {
310 | text: info.author,
311 | href: info.authorUrl,
312 | title: info.author,
313 | cls: "thumbnail-author",
314 | });
315 |
316 | const isInPlaylist = this.isInPlaylist(info.url);
317 | if (isInPlaylist) {
318 | const graphic = iconsContainer.createSvg("svg", {
319 | attr: { height: "24", width: "24", viewBox: "0 0 24 24" },
320 | cls: "thumbnail-playlist-svg",
321 | });
322 | const titleTag = graphic.createSvg("title");
323 | titleTag.textContent = "In a playlist";
324 | graphic.createSvg("path", {
325 | attr: {
326 | stroke: "white",
327 | d: "M22 7H2v1h20V7zm-9 5H2v-1h11v1zm0 4H2v-1h11v1zm2 3v-8l7 4-7 4z",
328 | },
329 | });
330 | }
331 |
332 | const timestamp = this.getTimestamp(info.url);
333 | if (timestamp !== "") {
334 | iconsContainer.createDiv({ text: timestamp, cls: "timestamp" });
335 | }
336 | }
337 |
338 | createDummyBlock(el: HTMLElement) {
339 | const container = el.createDiv();
340 | container.addClass("dummy-container");
341 | // container.createDiv().addClass('dummy-image');
342 | // container.createDiv().addClass('dummy-title');
343 | }
344 |
345 | removeDummyBlock(el: HTMLElement) {
346 | const dummy = el.querySelector(".dummy-container");
347 | if (dummy) {
348 | el.removeChild(dummy);
349 | }
350 | }
351 |
352 | isInPlaylist(url: string): boolean {
353 | return url.contains("&list=") || url.contains("?list=");
354 | }
355 |
356 | getTimestamp(url: string): string {
357 | let tIndex = url.indexOf("?t=");
358 | if (tIndex === -1) {
359 | tIndex = url.indexOf("&t=");
360 | }
361 | if (tIndex === -1) {
362 | tIndex = url.indexOf("#t=");
363 | }
364 | if (tIndex === -1) {
365 | return "";
366 | }
367 |
368 | const search = /[?]t=(?:(\d+)h)*(?:(\d+)m)*(?:(\d+)s)*(\d+)*/.exec(
369 | url
370 | );
371 | search.shift();
372 | const times = search.map((v) => parseInt(v) || 0);
373 | //0-h 1-m 2-s 3-s(seconds only format)
374 |
375 | let seconds = times.pop();
376 |
377 | if (times[2] > 59) {
378 | // Vimeo seconds only format still includes an "s"
379 | // so it ends up in times[2] instead of times[3]
380 | seconds = times[2];
381 | }
382 | if (seconds) {
383 | times[2] = seconds % 60;
384 | times[1] = Math.floor(seconds / 60) % 60;
385 | times[0] = Math.floor(seconds / 3600);
386 | }
387 | const secStr = String(times[2]).padStart(2, "0");
388 | let minStr = String(times[1]);
389 | const hrStr = String(times[0]);
390 |
391 | let timeStr = `${minStr}:${secStr}`;
392 | if (times[0]) {
393 | minStr = minStr.padStart(2, "0");
394 | timeStr = `${hrStr}:${minStr}:${secStr}`;
395 | }
396 |
397 | return timeStr;
398 | }
399 |
400 | pathIsLocal(path: string): boolean {
401 | return path.indexOf("https://") !== 0;
402 | }
403 |
404 | parseStoredInfo(source: string): VidInfo {
405 | const info: VidInfo = {
406 | url: "",
407 | thumbnail: "",
408 | title: "",
409 | author: "",
410 | authorUrl: "",
411 | vidFound: false,
412 | networkError: false,
413 | infoStored: false,
414 | imageSaved: false,
415 | };
416 |
417 | const input = source.trim().split("\n");
418 | if (input.length !== 5) {
419 | return info;
420 | }
421 |
422 | const parsedInput = {
423 | Url: "",
424 | Title: "",
425 | Author: "",
426 | Thumbnail: "",
427 | AuthorUrl: "",
428 | };
429 |
430 | for (const [i, line] of input.entries()) {
431 | if (i !== 0) {
432 | const matches = line.match(/(\w+): (.+)/);
433 | if (matches === null) {
434 | return info;
435 | }
436 | const key = matches[1];
437 | const val = matches[2];
438 |
439 | parsedInput[key as keyof typeof parsedInput] = val;
440 | } else {
441 | parsedInput["Url"] = input[0];
442 | }
443 | }
444 |
445 | // Check each item is filled
446 | for (const key in parsedInput) {
447 | if (Object.prototype.hasOwnProperty.call(parsedInput, key)) {
448 | const value = parsedInput[key as keyof typeof parsedInput];
449 | if (!value || value === "") {
450 | return info;
451 | }
452 | }
453 | }
454 |
455 | info.url = parsedInput["Url"];
456 | info.title = parsedInput["Title"];
457 | info.author = parsedInput["Author"];
458 | info.thumbnail = parsedInput["Thumbnail"];
459 | info.authorUrl = parsedInput["AuthorUrl"];
460 | info.vidFound = true;
461 |
462 | if (this.pathIsLocal(info.thumbnail)) {
463 | // Check file exists
464 | const existingFile = this.app.vault.getAbstractFileByPath(
465 | info.thumbnail
466 | );
467 |
468 | if (existingFile) {
469 | info.imageSaved = true;
470 | } else if (this.settings.saveImages) {
471 | return info;
472 | }
473 |
474 | if (!this.settings.saveImages) {
475 | return info;
476 | }
477 | } else if (this.settings.saveImages) {
478 | return info;
479 | }
480 |
481 | info.infoStored = true;
482 |
483 | return info;
484 | }
485 |
486 | async storeVideoInfo(
487 | info: VidInfo,
488 | el: HTMLElement,
489 | ctx: MarkdownPostProcessorContext
490 | ) {
491 | const section = ctx.getSectionInfo(el);
492 |
493 | if (!section) {
494 | return;
495 | }
496 |
497 | if (this.settings.saveImages && !info.imageSaved) {
498 | info.thumbnail = await this.saveImage(info);
499 | }
500 |
501 | const content = `\`\`\`vid\n${info.url}\nTitle: ${info.title}\nAuthor: ${info.author}\nThumbnail: ${info.thumbnail}\nAuthorUrl: ${info.authorUrl}\n\`\`\``;
502 |
503 | const view = this.app.workspace.getActiveViewOfType(MarkdownView);
504 | if (view) {
505 | const startPos: EditorPosition = {
506 | line: section.lineStart,
507 | ch: 0,
508 | };
509 |
510 | const endPos: EditorPosition = {
511 | line: section.lineEnd,
512 | ch: view.editor.getLine(section.lineEnd).length,
513 | };
514 |
515 | view.editor.replaceRange(content, startPos, endPos);
516 | }
517 | }
518 |
519 | async saveImage(info: VidInfo): Promise {
520 | // Save image and return path, or url if save failed
521 |
522 | // TODO
523 | // - getAvailablePathForAttachment gives indexed file locations when file exists, exisiting file check misses relative paths
524 | // - Make relative paths work for "specified folder" setting
525 | // - As is relative paths in `filePath` turn out relative to vault root
526 | const id = await this.getVideoId(info.url);
527 | let filePath = "";
528 |
529 | const currentNote = this.app.workspace.getActiveFile();
530 |
531 | if (this.settings.imageLocation === "specifiedFolder") {
532 | filePath = `${this.settings.imageFolder}/${id}.jpg`;
533 | } else {
534 | //@ts-ignore
535 | // let attachmentPath = this.app.vault.getConfig('attachmentFolderPath');
536 | // If last character is '/', trim it
537 | // if(attachmentPath.substring(attachmentPath.length - 1) === '/'){
538 | // attachmentPath = attachmentPath.substring(0, attachmentPath.length - 1);
539 | // }
540 | // filePath = `${attachmentPath}/${id}.jpg`;
541 |
542 | //@ts-ignore
543 | filePath = await this.app.vault.getAvailablePathForAttachments(
544 | id,
545 | "jpg",
546 | currentNote
547 | );
548 | // method source: https://forum.obsidian.md/t/api-get-the-directory-of-the-default-location-for-new-attachments-setting/36847/2
549 |
550 | //Regex to remove number from end of path from `getAvailablePathForAttachments`
551 | const pathRegex = /(.*) \d+\.jpg/;
552 | filePath = filePath.replace(pathRegex, "$1.jpg");
553 | }
554 |
555 | const existingFile = this.app.vault.getAbstractFileByPath(filePath);
556 | // this check isn't catching relative subfolder paths
557 |
558 | if (existingFile) {
559 | // file exists
560 | return existingFile.path;
561 | }
562 |
563 | const folderMatch = filePath.match(/(.+)\/.+\.jpg/);
564 | if (folderMatch) {
565 | const folderPath = folderMatch[1];
566 |
567 | const existingFolder =
568 | this.app.vault.getAbstractFileByPath(folderPath);
569 |
570 | if (
571 | this.settings.imageLocation === "specifiedFolder" &&
572 | !existingFolder
573 | ) {
574 | new Notice(
575 | `Thumbnails: The folder you specified (${this.settings.imageFolder}) does not exist.`
576 | );
577 | return info.thumbnail;
578 | }
579 | }
580 |
581 | const reqParam: RequestUrlParam = {
582 | url: info.thumbnail,
583 | };
584 |
585 | let file: TFile;
586 |
587 | try {
588 | const req = await requestUrl(reqParam);
589 |
590 | if (req.status === 200) {
591 | // Relative paths in `filePath` turn out relative to vault root
592 | file = await this.app.vault.createBinary(
593 | filePath,
594 | req.arrayBuffer
595 | );
596 | } else {
597 | // HTTP fail
598 | }
599 | } catch (error) {
600 | // If error when saving, just return thumbnail url
601 | console.log(error);
602 |
603 | return info.thumbnail;
604 | }
605 |
606 | if (file) {
607 | const localUrl = file.path;
608 | return localUrl;
609 | }
610 |
611 | return info.thumbnail;
612 | }
613 |
614 | getTrimmedResourcePath(file: TAbstractFile): string {
615 | //@ts-ignore
616 | const path = this.app.vault.getResourcePath(file);
617 | const endPos = path.indexOf(".jpg") + 4;
618 | return path.substring(0, endPos);
619 | }
620 |
621 | removeStoredInfo(
622 | info: VidInfo,
623 | el: HTMLElement,
624 | ctx: MarkdownPostProcessorContext
625 | ) {
626 | const section = ctx.getSectionInfo(el);
627 |
628 | if (!section) {
629 | return;
630 | }
631 |
632 | const content = `\`\`\`vid\n${info.url}\n\`\`\``;
633 |
634 | const view = this.app.workspace.getActiveViewOfType(MarkdownView);
635 | if (view) {
636 | const startPos: EditorPosition = {
637 | line: section.lineStart,
638 | ch: 0,
639 | };
640 |
641 | const endPos: EditorPosition = {
642 | line: section.lineEnd,
643 | ch: view.editor.getLine(section.lineEnd).length,
644 | };
645 |
646 | view.editor.replaceRange(content, startPos, endPos);
647 | }
648 | }
649 |
650 | async getVideoInfo(url: string): Promise {
651 | const info: VidInfo = {
652 | url: url,
653 | thumbnail: "",
654 | title: "",
655 | author: "",
656 | authorUrl: "",
657 | vidFound: false,
658 | networkError: false,
659 | infoStored: false,
660 | imageSaved: false,
661 | };
662 | let reqUrl = "";
663 | let isYoutube = false;
664 | for (const type of URL_TYPES.youtube) {
665 | if (url.includes(type.match)) {
666 | isYoutube = true;
667 | }
668 | }
669 | let isVimeo = false;
670 | for (const type of URL_TYPES.vimeo) {
671 | if (url.includes(type.match)) {
672 | isVimeo = true;
673 | }
674 | }
675 |
676 | // Use oEmbed to get data (https://oembed.com/)
677 | if (isYoutube) {
678 | reqUrl = `https://www.youtube.com/oembed?format=json&url=${url}`;
679 | } else if (isVimeo) {
680 | reqUrl = `https://vimeo.com/api/oembed.json?url=${url}`;
681 | } else {
682 | //vid not found
683 | return info;
684 | }
685 |
686 | try {
687 | const reqParam: RequestUrlParam = {
688 | url: reqUrl,
689 | throw: false,
690 | };
691 | const res = await requestUrl(reqParam);
692 |
693 | if (res.status === 200) {
694 | info.title = res.json.title;
695 | info.author = res.json.author_name;
696 | info.authorUrl = res.json.author_url;
697 |
698 | info.vidFound = true;
699 | } else if (this.settings.youtubeApiKey && isYoutube) {
700 | console.log("Thumbnails: Oembed failed, using YouTube API");
701 |
702 | const videoId = await this.getVideoId(url);
703 | const youtubeUrl = `https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id=${videoId}&key=${this.settings.youtubeApiKey}`;
704 | const youtubeReqParam: RequestUrlParam = {
705 | url: youtubeUrl,
706 | throw: false,
707 | };
708 | const youtubeApiRes = await requestUrl(youtubeReqParam);
709 |
710 | if (youtubeApiRes.status === 200) {
711 | const vidSnippet = youtubeApiRes.json.items[0].snippet;
712 |
713 | info.authorUrl = "javascript:void(0)";
714 | const channelQueryUrl = `https://youtube.googleapis.com/youtube/v3/channels?part=snippet&id=${vidSnippet.channelId}&key=${this.settings.youtubeApiKey}`;
715 | const channelQueryParam: RequestUrlParam = {
716 | url: channelQueryUrl,
717 | throw: false,
718 | };
719 | const channelQueryRes = await requestUrl(channelQueryParam);
720 |
721 | if (channelQueryRes.status === 200) {
722 | const channelSnippet =
723 | channelQueryRes.json.items[0].snippet;
724 | const channelCustomUrl = channelSnippet.customUrl;
725 | const channelUrl = `https://www.youtube.com/${channelCustomUrl}`;
726 | info.authorUrl = channelUrl;
727 | }
728 |
729 | info.title = vidSnippet.title;
730 | info.author = vidSnippet.channelTitle;
731 | // The api doesn't give back an author url. Could make another API call to find author url using channel ID.
732 | // To avoid making another API call, I'm just making it an empty link.
733 | // info.authorUrl = 'javascript:void(0);';
734 | info.vidFound = true;
735 | }
736 | }
737 |
738 | if (info.vidFound) {
739 | if (isYoutube) {
740 | // Use "mqdefault.jpg" instead of the "hqdefault.jpg" that oEmbed returns
741 | // "hqdefault.jpg" is letterboxed, "mqdefault.jpg" is cropped
742 | const videoId = await this.getVideoId(url);
743 | info.thumbnail = `https://i.ytimg.com/vi/${videoId}/mqdefault.jpg`;
744 | } else {
745 | info.thumbnail = res.json.thumbnail_url;
746 | }
747 | }
748 | } catch (error) {
749 | console.error(error);
750 | // Network error
751 | info.networkError = true;
752 | }
753 |
754 | return info;
755 | }
756 |
757 | async getVideoId(url: string): Promise {
758 | let id = "";
759 | for (const type of URL_TYPES.youtube) {
760 | if (url.includes(type.match)) {
761 | const matches = url.match(type.idPattern);
762 | if (matches !== null) {
763 | id = matches[1];
764 | }
765 | }
766 | }
767 | const vimeoType = URL_TYPES.vimeo[0];
768 | if (url.includes(vimeoType.match)) {
769 | const matches = url.match(vimeoType.idPattern);
770 | if (matches !== null) {
771 | id = matches[1];
772 | if (!/^[0-9]+$/.exec(id)) {
773 | // Special vimeo url's that don't contain a video id
774 | id = await this.fetchVimeoVideoId(url);
775 | }
776 | }
777 | }
778 | return id;
779 | }
780 |
781 | async fetchVimeoVideoId(url: string): Promise {
782 | let id = "";
783 | try {
784 | const reqParam: RequestUrlParam = {
785 | url: `https://vimeo.com/api/oembed.json?url=${url}`,
786 | };
787 |
788 | const res = await requestUrl(reqParam);
789 |
790 | if (res.status === 200 && res.json.video_id) {
791 | id = res.json.video_id.toString();
792 | }
793 | } catch (error) {
794 | console.error(error);
795 | }
796 | return id;
797 | }
798 | }
799 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "obsidian-thumbnails",
3 | "name": "Thumbnails",
4 | "version": "1.3.1",
5 | "minAppVersion": "1.0.0",
6 | "description": "Insert video thumbnails into your notes",
7 | "author": "Michael Harris",
8 | "authorUrl": "https://github.com/meikul",
9 | "isDesktopOnly": false
10 | }
11 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "obsidian-thumbnails",
3 | "version": "1.0.4",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "obsidian-thumbnails",
9 | "version": "1.0.4",
10 | "license": "MIT",
11 | "dependencies": {
12 | "axios": "^0.27.2",
13 | "dotenv": "^16.0.1"
14 | },
15 | "devDependencies": {
16 | "@types/node": "^16.11.6",
17 | "@typescript-eslint/eslint-plugin": "^5.2.0",
18 | "@typescript-eslint/parser": "^5.2.0",
19 | "builtin-modules": "^3.2.0",
20 | "esbuild": "0.13.12",
21 | "obsidian": "latest",
22 | "tslib": "2.3.1",
23 | "typescript": "4.4.4"
24 | }
25 | },
26 | "node_modules/@codemirror/state": {
27 | "version": "6.2.1",
28 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz",
29 | "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==",
30 | "dev": true,
31 | "peer": true
32 | },
33 | "node_modules/@codemirror/view": {
34 | "version": "6.18.1",
35 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.18.1.tgz",
36 | "integrity": "sha512-xcsXcMkIMd7l3WZEWoc4ljteAiqzxb5gVerRxk5132p5cLix6rTydWTQjsj2oxORepfsrwy1fC4r20iMa9plrg==",
37 | "dev": true,
38 | "peer": true,
39 | "dependencies": {
40 | "@codemirror/state": "^6.1.4",
41 | "style-mod": "^4.1.0",
42 | "w3c-keyname": "^2.2.4"
43 | }
44 | },
45 | "node_modules/@eslint/eslintrc": {
46 | "version": "1.2.3",
47 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz",
48 | "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==",
49 | "dev": true,
50 | "peer": true,
51 | "dependencies": {
52 | "ajv": "^6.12.4",
53 | "debug": "^4.3.2",
54 | "espree": "^9.3.2",
55 | "globals": "^13.9.0",
56 | "ignore": "^5.2.0",
57 | "import-fresh": "^3.2.1",
58 | "js-yaml": "^4.1.0",
59 | "minimatch": "^3.1.2",
60 | "strip-json-comments": "^3.1.1"
61 | },
62 | "engines": {
63 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
64 | }
65 | },
66 | "node_modules/@humanwhocodes/config-array": {
67 | "version": "0.9.5",
68 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
69 | "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
70 | "dev": true,
71 | "peer": true,
72 | "dependencies": {
73 | "@humanwhocodes/object-schema": "^1.2.1",
74 | "debug": "^4.1.1",
75 | "minimatch": "^3.0.4"
76 | },
77 | "engines": {
78 | "node": ">=10.10.0"
79 | }
80 | },
81 | "node_modules/@humanwhocodes/object-schema": {
82 | "version": "1.2.1",
83 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
84 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
85 | "dev": true,
86 | "peer": true
87 | },
88 | "node_modules/@nodelib/fs.scandir": {
89 | "version": "2.1.5",
90 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
91 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
92 | "dev": true,
93 | "dependencies": {
94 | "@nodelib/fs.stat": "2.0.5",
95 | "run-parallel": "^1.1.9"
96 | },
97 | "engines": {
98 | "node": ">= 8"
99 | }
100 | },
101 | "node_modules/@nodelib/fs.stat": {
102 | "version": "2.0.5",
103 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
104 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
105 | "dev": true,
106 | "engines": {
107 | "node": ">= 8"
108 | }
109 | },
110 | "node_modules/@nodelib/fs.walk": {
111 | "version": "1.2.8",
112 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
113 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
114 | "dev": true,
115 | "dependencies": {
116 | "@nodelib/fs.scandir": "2.1.5",
117 | "fastq": "^1.6.0"
118 | },
119 | "engines": {
120 | "node": ">= 8"
121 | }
122 | },
123 | "node_modules/@types/codemirror": {
124 | "version": "5.60.8",
125 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz",
126 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==",
127 | "dev": true,
128 | "dependencies": {
129 | "@types/tern": "*"
130 | }
131 | },
132 | "node_modules/@types/estree": {
133 | "version": "1.0.1",
134 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
135 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
136 | "dev": true
137 | },
138 | "node_modules/@types/json-schema": {
139 | "version": "7.0.11",
140 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
141 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
142 | "dev": true
143 | },
144 | "node_modules/@types/node": {
145 | "version": "16.11.35",
146 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.35.tgz",
147 | "integrity": "sha512-QXu45LyepgnhUfnIAj/FyT4uM87ug5KpIrgXfQtUPNAlx8w5hmd8z8emqCLNvG11QkpRSCG9Qg2buMxvqfjfsQ==",
148 | "dev": true
149 | },
150 | "node_modules/@types/tern": {
151 | "version": "0.23.5",
152 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.5.tgz",
153 | "integrity": "sha512-POau56wDk3TQ0mQ0qG7XDzv96U5whSENZ9lC0htDvEH+9YUREo+J2U+apWcVRgR2UydEE70JXZo44goG+akTNQ==",
154 | "dev": true,
155 | "dependencies": {
156 | "@types/estree": "*"
157 | }
158 | },
159 | "node_modules/@typescript-eslint/eslint-plugin": {
160 | "version": "5.23.0",
161 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.23.0.tgz",
162 | "integrity": "sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA==",
163 | "dev": true,
164 | "dependencies": {
165 | "@typescript-eslint/scope-manager": "5.23.0",
166 | "@typescript-eslint/type-utils": "5.23.0",
167 | "@typescript-eslint/utils": "5.23.0",
168 | "debug": "^4.3.2",
169 | "functional-red-black-tree": "^1.0.1",
170 | "ignore": "^5.1.8",
171 | "regexpp": "^3.2.0",
172 | "semver": "^7.3.5",
173 | "tsutils": "^3.21.0"
174 | },
175 | "engines": {
176 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
177 | },
178 | "funding": {
179 | "type": "opencollective",
180 | "url": "https://opencollective.com/typescript-eslint"
181 | },
182 | "peerDependencies": {
183 | "@typescript-eslint/parser": "^5.0.0",
184 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
185 | },
186 | "peerDependenciesMeta": {
187 | "typescript": {
188 | "optional": true
189 | }
190 | }
191 | },
192 | "node_modules/@typescript-eslint/parser": {
193 | "version": "5.23.0",
194 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.23.0.tgz",
195 | "integrity": "sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw==",
196 | "dev": true,
197 | "dependencies": {
198 | "@typescript-eslint/scope-manager": "5.23.0",
199 | "@typescript-eslint/types": "5.23.0",
200 | "@typescript-eslint/typescript-estree": "5.23.0",
201 | "debug": "^4.3.2"
202 | },
203 | "engines": {
204 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
205 | },
206 | "funding": {
207 | "type": "opencollective",
208 | "url": "https://opencollective.com/typescript-eslint"
209 | },
210 | "peerDependencies": {
211 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
212 | },
213 | "peerDependenciesMeta": {
214 | "typescript": {
215 | "optional": true
216 | }
217 | }
218 | },
219 | "node_modules/@typescript-eslint/scope-manager": {
220 | "version": "5.23.0",
221 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.23.0.tgz",
222 | "integrity": "sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw==",
223 | "dev": true,
224 | "dependencies": {
225 | "@typescript-eslint/types": "5.23.0",
226 | "@typescript-eslint/visitor-keys": "5.23.0"
227 | },
228 | "engines": {
229 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
230 | },
231 | "funding": {
232 | "type": "opencollective",
233 | "url": "https://opencollective.com/typescript-eslint"
234 | }
235 | },
236 | "node_modules/@typescript-eslint/type-utils": {
237 | "version": "5.23.0",
238 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz",
239 | "integrity": "sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw==",
240 | "dev": true,
241 | "dependencies": {
242 | "@typescript-eslint/utils": "5.23.0",
243 | "debug": "^4.3.2",
244 | "tsutils": "^3.21.0"
245 | },
246 | "engines": {
247 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
248 | },
249 | "funding": {
250 | "type": "opencollective",
251 | "url": "https://opencollective.com/typescript-eslint"
252 | },
253 | "peerDependencies": {
254 | "eslint": "*"
255 | },
256 | "peerDependenciesMeta": {
257 | "typescript": {
258 | "optional": true
259 | }
260 | }
261 | },
262 | "node_modules/@typescript-eslint/types": {
263 | "version": "5.23.0",
264 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.23.0.tgz",
265 | "integrity": "sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw==",
266 | "dev": true,
267 | "engines": {
268 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
269 | },
270 | "funding": {
271 | "type": "opencollective",
272 | "url": "https://opencollective.com/typescript-eslint"
273 | }
274 | },
275 | "node_modules/@typescript-eslint/typescript-estree": {
276 | "version": "5.23.0",
277 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.23.0.tgz",
278 | "integrity": "sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg==",
279 | "dev": true,
280 | "dependencies": {
281 | "@typescript-eslint/types": "5.23.0",
282 | "@typescript-eslint/visitor-keys": "5.23.0",
283 | "debug": "^4.3.2",
284 | "globby": "^11.0.4",
285 | "is-glob": "^4.0.3",
286 | "semver": "^7.3.5",
287 | "tsutils": "^3.21.0"
288 | },
289 | "engines": {
290 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
291 | },
292 | "funding": {
293 | "type": "opencollective",
294 | "url": "https://opencollective.com/typescript-eslint"
295 | },
296 | "peerDependenciesMeta": {
297 | "typescript": {
298 | "optional": true
299 | }
300 | }
301 | },
302 | "node_modules/@typescript-eslint/utils": {
303 | "version": "5.23.0",
304 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.23.0.tgz",
305 | "integrity": "sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA==",
306 | "dev": true,
307 | "dependencies": {
308 | "@types/json-schema": "^7.0.9",
309 | "@typescript-eslint/scope-manager": "5.23.0",
310 | "@typescript-eslint/types": "5.23.0",
311 | "@typescript-eslint/typescript-estree": "5.23.0",
312 | "eslint-scope": "^5.1.1",
313 | "eslint-utils": "^3.0.0"
314 | },
315 | "engines": {
316 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
317 | },
318 | "funding": {
319 | "type": "opencollective",
320 | "url": "https://opencollective.com/typescript-eslint"
321 | },
322 | "peerDependencies": {
323 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
324 | }
325 | },
326 | "node_modules/@typescript-eslint/visitor-keys": {
327 | "version": "5.23.0",
328 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz",
329 | "integrity": "sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg==",
330 | "dev": true,
331 | "dependencies": {
332 | "@typescript-eslint/types": "5.23.0",
333 | "eslint-visitor-keys": "^3.0.0"
334 | },
335 | "engines": {
336 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
337 | },
338 | "funding": {
339 | "type": "opencollective",
340 | "url": "https://opencollective.com/typescript-eslint"
341 | }
342 | },
343 | "node_modules/acorn": {
344 | "version": "8.7.1",
345 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
346 | "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
347 | "dev": true,
348 | "peer": true,
349 | "bin": {
350 | "acorn": "bin/acorn"
351 | },
352 | "engines": {
353 | "node": ">=0.4.0"
354 | }
355 | },
356 | "node_modules/acorn-jsx": {
357 | "version": "5.3.2",
358 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
359 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
360 | "dev": true,
361 | "peer": true,
362 | "peerDependencies": {
363 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
364 | }
365 | },
366 | "node_modules/ajv": {
367 | "version": "6.12.6",
368 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
369 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
370 | "dev": true,
371 | "peer": true,
372 | "dependencies": {
373 | "fast-deep-equal": "^3.1.1",
374 | "fast-json-stable-stringify": "^2.0.0",
375 | "json-schema-traverse": "^0.4.1",
376 | "uri-js": "^4.2.2"
377 | },
378 | "funding": {
379 | "type": "github",
380 | "url": "https://github.com/sponsors/epoberezkin"
381 | }
382 | },
383 | "node_modules/ansi-regex": {
384 | "version": "5.0.1",
385 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
386 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
387 | "dev": true,
388 | "peer": true,
389 | "engines": {
390 | "node": ">=8"
391 | }
392 | },
393 | "node_modules/ansi-styles": {
394 | "version": "4.3.0",
395 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
396 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
397 | "dev": true,
398 | "peer": true,
399 | "dependencies": {
400 | "color-convert": "^2.0.1"
401 | },
402 | "engines": {
403 | "node": ">=8"
404 | },
405 | "funding": {
406 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
407 | }
408 | },
409 | "node_modules/argparse": {
410 | "version": "2.0.1",
411 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
412 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
413 | "dev": true,
414 | "peer": true
415 | },
416 | "node_modules/array-union": {
417 | "version": "2.1.0",
418 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
419 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
420 | "dev": true,
421 | "engines": {
422 | "node": ">=8"
423 | }
424 | },
425 | "node_modules/asynckit": {
426 | "version": "0.4.0",
427 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
428 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
429 | },
430 | "node_modules/axios": {
431 | "version": "0.27.2",
432 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
433 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
434 | "dependencies": {
435 | "follow-redirects": "^1.14.9",
436 | "form-data": "^4.0.0"
437 | }
438 | },
439 | "node_modules/balanced-match": {
440 | "version": "1.0.2",
441 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
442 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
443 | "dev": true,
444 | "peer": true
445 | },
446 | "node_modules/brace-expansion": {
447 | "version": "1.1.11",
448 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
449 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
450 | "dev": true,
451 | "peer": true,
452 | "dependencies": {
453 | "balanced-match": "^1.0.0",
454 | "concat-map": "0.0.1"
455 | }
456 | },
457 | "node_modules/braces": {
458 | "version": "3.0.3",
459 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
460 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
461 | "dev": true,
462 | "dependencies": {
463 | "fill-range": "^7.1.1"
464 | },
465 | "engines": {
466 | "node": ">=8"
467 | }
468 | },
469 | "node_modules/builtin-modules": {
470 | "version": "3.3.0",
471 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
472 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
473 | "dev": true,
474 | "engines": {
475 | "node": ">=6"
476 | },
477 | "funding": {
478 | "url": "https://github.com/sponsors/sindresorhus"
479 | }
480 | },
481 | "node_modules/callsites": {
482 | "version": "3.1.0",
483 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
484 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
485 | "dev": true,
486 | "peer": true,
487 | "engines": {
488 | "node": ">=6"
489 | }
490 | },
491 | "node_modules/chalk": {
492 | "version": "4.1.2",
493 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
494 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
495 | "dev": true,
496 | "peer": true,
497 | "dependencies": {
498 | "ansi-styles": "^4.1.0",
499 | "supports-color": "^7.1.0"
500 | },
501 | "engines": {
502 | "node": ">=10"
503 | },
504 | "funding": {
505 | "url": "https://github.com/chalk/chalk?sponsor=1"
506 | }
507 | },
508 | "node_modules/color-convert": {
509 | "version": "2.0.1",
510 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
511 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
512 | "dev": true,
513 | "peer": true,
514 | "dependencies": {
515 | "color-name": "~1.1.4"
516 | },
517 | "engines": {
518 | "node": ">=7.0.0"
519 | }
520 | },
521 | "node_modules/color-name": {
522 | "version": "1.1.4",
523 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
524 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
525 | "dev": true,
526 | "peer": true
527 | },
528 | "node_modules/combined-stream": {
529 | "version": "1.0.8",
530 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
531 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
532 | "dependencies": {
533 | "delayed-stream": "~1.0.0"
534 | },
535 | "engines": {
536 | "node": ">= 0.8"
537 | }
538 | },
539 | "node_modules/concat-map": {
540 | "version": "0.0.1",
541 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
542 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
543 | "dev": true,
544 | "peer": true
545 | },
546 | "node_modules/cross-spawn": {
547 | "version": "7.0.6",
548 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
549 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
550 | "dev": true,
551 | "peer": true,
552 | "dependencies": {
553 | "path-key": "^3.1.0",
554 | "shebang-command": "^2.0.0",
555 | "which": "^2.0.1"
556 | },
557 | "engines": {
558 | "node": ">= 8"
559 | }
560 | },
561 | "node_modules/debug": {
562 | "version": "4.3.4",
563 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
564 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
565 | "dev": true,
566 | "dependencies": {
567 | "ms": "2.1.2"
568 | },
569 | "engines": {
570 | "node": ">=6.0"
571 | },
572 | "peerDependenciesMeta": {
573 | "supports-color": {
574 | "optional": true
575 | }
576 | }
577 | },
578 | "node_modules/deep-is": {
579 | "version": "0.1.4",
580 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
581 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
582 | "dev": true,
583 | "peer": true
584 | },
585 | "node_modules/delayed-stream": {
586 | "version": "1.0.0",
587 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
588 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
589 | "engines": {
590 | "node": ">=0.4.0"
591 | }
592 | },
593 | "node_modules/dir-glob": {
594 | "version": "3.0.1",
595 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
596 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
597 | "dev": true,
598 | "dependencies": {
599 | "path-type": "^4.0.0"
600 | },
601 | "engines": {
602 | "node": ">=8"
603 | }
604 | },
605 | "node_modules/doctrine": {
606 | "version": "3.0.0",
607 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
608 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
609 | "dev": true,
610 | "peer": true,
611 | "dependencies": {
612 | "esutils": "^2.0.2"
613 | },
614 | "engines": {
615 | "node": ">=6.0.0"
616 | }
617 | },
618 | "node_modules/dotenv": {
619 | "version": "16.0.1",
620 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
621 | "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==",
622 | "engines": {
623 | "node": ">=12"
624 | }
625 | },
626 | "node_modules/esbuild": {
627 | "version": "0.13.12",
628 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz",
629 | "integrity": "sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow==",
630 | "dev": true,
631 | "hasInstallScript": true,
632 | "bin": {
633 | "esbuild": "bin/esbuild"
634 | },
635 | "optionalDependencies": {
636 | "esbuild-android-arm64": "0.13.12",
637 | "esbuild-darwin-64": "0.13.12",
638 | "esbuild-darwin-arm64": "0.13.12",
639 | "esbuild-freebsd-64": "0.13.12",
640 | "esbuild-freebsd-arm64": "0.13.12",
641 | "esbuild-linux-32": "0.13.12",
642 | "esbuild-linux-64": "0.13.12",
643 | "esbuild-linux-arm": "0.13.12",
644 | "esbuild-linux-arm64": "0.13.12",
645 | "esbuild-linux-mips64le": "0.13.12",
646 | "esbuild-linux-ppc64le": "0.13.12",
647 | "esbuild-netbsd-64": "0.13.12",
648 | "esbuild-openbsd-64": "0.13.12",
649 | "esbuild-sunos-64": "0.13.12",
650 | "esbuild-windows-32": "0.13.12",
651 | "esbuild-windows-64": "0.13.12",
652 | "esbuild-windows-arm64": "0.13.12"
653 | }
654 | },
655 | "node_modules/esbuild-android-arm64": {
656 | "version": "0.13.12",
657 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.12.tgz",
658 | "integrity": "sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==",
659 | "cpu": [
660 | "arm64"
661 | ],
662 | "dev": true,
663 | "optional": true,
664 | "os": [
665 | "android"
666 | ]
667 | },
668 | "node_modules/esbuild-darwin-64": {
669 | "version": "0.13.12",
670 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.12.tgz",
671 | "integrity": "sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==",
672 | "cpu": [
673 | "x64"
674 | ],
675 | "dev": true,
676 | "optional": true,
677 | "os": [
678 | "darwin"
679 | ]
680 | },
681 | "node_modules/esbuild-darwin-arm64": {
682 | "version": "0.13.12",
683 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.12.tgz",
684 | "integrity": "sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==",
685 | "cpu": [
686 | "arm64"
687 | ],
688 | "dev": true,
689 | "optional": true,
690 | "os": [
691 | "darwin"
692 | ]
693 | },
694 | "node_modules/esbuild-freebsd-64": {
695 | "version": "0.13.12",
696 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.12.tgz",
697 | "integrity": "sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==",
698 | "cpu": [
699 | "x64"
700 | ],
701 | "dev": true,
702 | "optional": true,
703 | "os": [
704 | "freebsd"
705 | ]
706 | },
707 | "node_modules/esbuild-freebsd-arm64": {
708 | "version": "0.13.12",
709 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.12.tgz",
710 | "integrity": "sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==",
711 | "cpu": [
712 | "arm64"
713 | ],
714 | "dev": true,
715 | "optional": true,
716 | "os": [
717 | "freebsd"
718 | ]
719 | },
720 | "node_modules/esbuild-linux-32": {
721 | "version": "0.13.12",
722 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.12.tgz",
723 | "integrity": "sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==",
724 | "cpu": [
725 | "ia32"
726 | ],
727 | "dev": true,
728 | "optional": true,
729 | "os": [
730 | "linux"
731 | ]
732 | },
733 | "node_modules/esbuild-linux-64": {
734 | "version": "0.13.12",
735 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.12.tgz",
736 | "integrity": "sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==",
737 | "cpu": [
738 | "x64"
739 | ],
740 | "dev": true,
741 | "optional": true,
742 | "os": [
743 | "linux"
744 | ]
745 | },
746 | "node_modules/esbuild-linux-arm": {
747 | "version": "0.13.12",
748 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.12.tgz",
749 | "integrity": "sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==",
750 | "cpu": [
751 | "arm"
752 | ],
753 | "dev": true,
754 | "optional": true,
755 | "os": [
756 | "linux"
757 | ]
758 | },
759 | "node_modules/esbuild-linux-arm64": {
760 | "version": "0.13.12",
761 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.12.tgz",
762 | "integrity": "sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==",
763 | "cpu": [
764 | "arm64"
765 | ],
766 | "dev": true,
767 | "optional": true,
768 | "os": [
769 | "linux"
770 | ]
771 | },
772 | "node_modules/esbuild-linux-mips64le": {
773 | "version": "0.13.12",
774 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.12.tgz",
775 | "integrity": "sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==",
776 | "cpu": [
777 | "mips64el"
778 | ],
779 | "dev": true,
780 | "optional": true,
781 | "os": [
782 | "linux"
783 | ]
784 | },
785 | "node_modules/esbuild-linux-ppc64le": {
786 | "version": "0.13.12",
787 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.12.tgz",
788 | "integrity": "sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==",
789 | "cpu": [
790 | "ppc64"
791 | ],
792 | "dev": true,
793 | "optional": true,
794 | "os": [
795 | "linux"
796 | ]
797 | },
798 | "node_modules/esbuild-netbsd-64": {
799 | "version": "0.13.12",
800 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.12.tgz",
801 | "integrity": "sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==",
802 | "cpu": [
803 | "x64"
804 | ],
805 | "dev": true,
806 | "optional": true,
807 | "os": [
808 | "netbsd"
809 | ]
810 | },
811 | "node_modules/esbuild-openbsd-64": {
812 | "version": "0.13.12",
813 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.12.tgz",
814 | "integrity": "sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==",
815 | "cpu": [
816 | "x64"
817 | ],
818 | "dev": true,
819 | "optional": true,
820 | "os": [
821 | "openbsd"
822 | ]
823 | },
824 | "node_modules/esbuild-sunos-64": {
825 | "version": "0.13.12",
826 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.12.tgz",
827 | "integrity": "sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==",
828 | "cpu": [
829 | "x64"
830 | ],
831 | "dev": true,
832 | "optional": true,
833 | "os": [
834 | "sunos"
835 | ]
836 | },
837 | "node_modules/esbuild-windows-32": {
838 | "version": "0.13.12",
839 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz",
840 | "integrity": "sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==",
841 | "cpu": [
842 | "ia32"
843 | ],
844 | "dev": true,
845 | "optional": true,
846 | "os": [
847 | "win32"
848 | ]
849 | },
850 | "node_modules/esbuild-windows-64": {
851 | "version": "0.13.12",
852 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.12.tgz",
853 | "integrity": "sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==",
854 | "cpu": [
855 | "x64"
856 | ],
857 | "dev": true,
858 | "optional": true,
859 | "os": [
860 | "win32"
861 | ]
862 | },
863 | "node_modules/esbuild-windows-arm64": {
864 | "version": "0.13.12",
865 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.12.tgz",
866 | "integrity": "sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==",
867 | "cpu": [
868 | "arm64"
869 | ],
870 | "dev": true,
871 | "optional": true,
872 | "os": [
873 | "win32"
874 | ]
875 | },
876 | "node_modules/escape-string-regexp": {
877 | "version": "4.0.0",
878 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
879 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
880 | "dev": true,
881 | "peer": true,
882 | "engines": {
883 | "node": ">=10"
884 | },
885 | "funding": {
886 | "url": "https://github.com/sponsors/sindresorhus"
887 | }
888 | },
889 | "node_modules/eslint": {
890 | "version": "8.15.0",
891 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz",
892 | "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==",
893 | "dev": true,
894 | "peer": true,
895 | "dependencies": {
896 | "@eslint/eslintrc": "^1.2.3",
897 | "@humanwhocodes/config-array": "^0.9.2",
898 | "ajv": "^6.10.0",
899 | "chalk": "^4.0.0",
900 | "cross-spawn": "^7.0.2",
901 | "debug": "^4.3.2",
902 | "doctrine": "^3.0.0",
903 | "escape-string-regexp": "^4.0.0",
904 | "eslint-scope": "^7.1.1",
905 | "eslint-utils": "^3.0.0",
906 | "eslint-visitor-keys": "^3.3.0",
907 | "espree": "^9.3.2",
908 | "esquery": "^1.4.0",
909 | "esutils": "^2.0.2",
910 | "fast-deep-equal": "^3.1.3",
911 | "file-entry-cache": "^6.0.1",
912 | "functional-red-black-tree": "^1.0.1",
913 | "glob-parent": "^6.0.1",
914 | "globals": "^13.6.0",
915 | "ignore": "^5.2.0",
916 | "import-fresh": "^3.0.0",
917 | "imurmurhash": "^0.1.4",
918 | "is-glob": "^4.0.0",
919 | "js-yaml": "^4.1.0",
920 | "json-stable-stringify-without-jsonify": "^1.0.1",
921 | "levn": "^0.4.1",
922 | "lodash.merge": "^4.6.2",
923 | "minimatch": "^3.1.2",
924 | "natural-compare": "^1.4.0",
925 | "optionator": "^0.9.1",
926 | "regexpp": "^3.2.0",
927 | "strip-ansi": "^6.0.1",
928 | "strip-json-comments": "^3.1.0",
929 | "text-table": "^0.2.0",
930 | "v8-compile-cache": "^2.0.3"
931 | },
932 | "bin": {
933 | "eslint": "bin/eslint.js"
934 | },
935 | "engines": {
936 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
937 | },
938 | "funding": {
939 | "url": "https://opencollective.com/eslint"
940 | }
941 | },
942 | "node_modules/eslint-scope": {
943 | "version": "5.1.1",
944 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
945 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
946 | "dev": true,
947 | "dependencies": {
948 | "esrecurse": "^4.3.0",
949 | "estraverse": "^4.1.1"
950 | },
951 | "engines": {
952 | "node": ">=8.0.0"
953 | }
954 | },
955 | "node_modules/eslint-utils": {
956 | "version": "3.0.0",
957 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
958 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
959 | "dev": true,
960 | "dependencies": {
961 | "eslint-visitor-keys": "^2.0.0"
962 | },
963 | "engines": {
964 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
965 | },
966 | "funding": {
967 | "url": "https://github.com/sponsors/mysticatea"
968 | },
969 | "peerDependencies": {
970 | "eslint": ">=5"
971 | }
972 | },
973 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
974 | "version": "2.1.0",
975 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
976 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
977 | "dev": true,
978 | "engines": {
979 | "node": ">=10"
980 | }
981 | },
982 | "node_modules/eslint-visitor-keys": {
983 | "version": "3.3.0",
984 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
985 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
986 | "dev": true,
987 | "engines": {
988 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
989 | }
990 | },
991 | "node_modules/eslint/node_modules/eslint-scope": {
992 | "version": "7.1.1",
993 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
994 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
995 | "dev": true,
996 | "peer": true,
997 | "dependencies": {
998 | "esrecurse": "^4.3.0",
999 | "estraverse": "^5.2.0"
1000 | },
1001 | "engines": {
1002 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1003 | }
1004 | },
1005 | "node_modules/eslint/node_modules/estraverse": {
1006 | "version": "5.3.0",
1007 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1008 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1009 | "dev": true,
1010 | "peer": true,
1011 | "engines": {
1012 | "node": ">=4.0"
1013 | }
1014 | },
1015 | "node_modules/espree": {
1016 | "version": "9.3.2",
1017 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
1018 | "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
1019 | "dev": true,
1020 | "peer": true,
1021 | "dependencies": {
1022 | "acorn": "^8.7.1",
1023 | "acorn-jsx": "^5.3.2",
1024 | "eslint-visitor-keys": "^3.3.0"
1025 | },
1026 | "engines": {
1027 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1028 | }
1029 | },
1030 | "node_modules/esquery": {
1031 | "version": "1.4.0",
1032 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
1033 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
1034 | "dev": true,
1035 | "peer": true,
1036 | "dependencies": {
1037 | "estraverse": "^5.1.0"
1038 | },
1039 | "engines": {
1040 | "node": ">=0.10"
1041 | }
1042 | },
1043 | "node_modules/esquery/node_modules/estraverse": {
1044 | "version": "5.3.0",
1045 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1046 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1047 | "dev": true,
1048 | "peer": true,
1049 | "engines": {
1050 | "node": ">=4.0"
1051 | }
1052 | },
1053 | "node_modules/esrecurse": {
1054 | "version": "4.3.0",
1055 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1056 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1057 | "dev": true,
1058 | "dependencies": {
1059 | "estraverse": "^5.2.0"
1060 | },
1061 | "engines": {
1062 | "node": ">=4.0"
1063 | }
1064 | },
1065 | "node_modules/esrecurse/node_modules/estraverse": {
1066 | "version": "5.3.0",
1067 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1068 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1069 | "dev": true,
1070 | "engines": {
1071 | "node": ">=4.0"
1072 | }
1073 | },
1074 | "node_modules/estraverse": {
1075 | "version": "4.3.0",
1076 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1077 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
1078 | "dev": true,
1079 | "engines": {
1080 | "node": ">=4.0"
1081 | }
1082 | },
1083 | "node_modules/esutils": {
1084 | "version": "2.0.3",
1085 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1086 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1087 | "dev": true,
1088 | "peer": true,
1089 | "engines": {
1090 | "node": ">=0.10.0"
1091 | }
1092 | },
1093 | "node_modules/fast-deep-equal": {
1094 | "version": "3.1.3",
1095 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1096 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1097 | "dev": true,
1098 | "peer": true
1099 | },
1100 | "node_modules/fast-glob": {
1101 | "version": "3.2.11",
1102 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
1103 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
1104 | "dev": true,
1105 | "dependencies": {
1106 | "@nodelib/fs.stat": "^2.0.2",
1107 | "@nodelib/fs.walk": "^1.2.3",
1108 | "glob-parent": "^5.1.2",
1109 | "merge2": "^1.3.0",
1110 | "micromatch": "^4.0.4"
1111 | },
1112 | "engines": {
1113 | "node": ">=8.6.0"
1114 | }
1115 | },
1116 | "node_modules/fast-glob/node_modules/glob-parent": {
1117 | "version": "5.1.2",
1118 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1119 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1120 | "dev": true,
1121 | "dependencies": {
1122 | "is-glob": "^4.0.1"
1123 | },
1124 | "engines": {
1125 | "node": ">= 6"
1126 | }
1127 | },
1128 | "node_modules/fast-json-stable-stringify": {
1129 | "version": "2.1.0",
1130 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1131 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1132 | "dev": true,
1133 | "peer": true
1134 | },
1135 | "node_modules/fast-levenshtein": {
1136 | "version": "2.0.6",
1137 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1138 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1139 | "dev": true,
1140 | "peer": true
1141 | },
1142 | "node_modules/fastq": {
1143 | "version": "1.13.0",
1144 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
1145 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
1146 | "dev": true,
1147 | "dependencies": {
1148 | "reusify": "^1.0.4"
1149 | }
1150 | },
1151 | "node_modules/file-entry-cache": {
1152 | "version": "6.0.1",
1153 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
1154 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
1155 | "dev": true,
1156 | "peer": true,
1157 | "dependencies": {
1158 | "flat-cache": "^3.0.4"
1159 | },
1160 | "engines": {
1161 | "node": "^10.12.0 || >=12.0.0"
1162 | }
1163 | },
1164 | "node_modules/fill-range": {
1165 | "version": "7.1.1",
1166 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1167 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1168 | "dev": true,
1169 | "dependencies": {
1170 | "to-regex-range": "^5.0.1"
1171 | },
1172 | "engines": {
1173 | "node": ">=8"
1174 | }
1175 | },
1176 | "node_modules/flat-cache": {
1177 | "version": "3.0.4",
1178 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
1179 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
1180 | "dev": true,
1181 | "peer": true,
1182 | "dependencies": {
1183 | "flatted": "^3.1.0",
1184 | "rimraf": "^3.0.2"
1185 | },
1186 | "engines": {
1187 | "node": "^10.12.0 || >=12.0.0"
1188 | }
1189 | },
1190 | "node_modules/flatted": {
1191 | "version": "3.2.5",
1192 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
1193 | "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
1194 | "dev": true,
1195 | "peer": true
1196 | },
1197 | "node_modules/follow-redirects": {
1198 | "version": "1.15.9",
1199 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
1200 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
1201 | "funding": [
1202 | {
1203 | "type": "individual",
1204 | "url": "https://github.com/sponsors/RubenVerborgh"
1205 | }
1206 | ],
1207 | "engines": {
1208 | "node": ">=4.0"
1209 | },
1210 | "peerDependenciesMeta": {
1211 | "debug": {
1212 | "optional": true
1213 | }
1214 | }
1215 | },
1216 | "node_modules/form-data": {
1217 | "version": "4.0.0",
1218 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1219 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1220 | "dependencies": {
1221 | "asynckit": "^0.4.0",
1222 | "combined-stream": "^1.0.8",
1223 | "mime-types": "^2.1.12"
1224 | },
1225 | "engines": {
1226 | "node": ">= 6"
1227 | }
1228 | },
1229 | "node_modules/fs.realpath": {
1230 | "version": "1.0.0",
1231 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1232 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1233 | "dev": true,
1234 | "peer": true
1235 | },
1236 | "node_modules/functional-red-black-tree": {
1237 | "version": "1.0.1",
1238 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1239 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
1240 | "dev": true
1241 | },
1242 | "node_modules/glob": {
1243 | "version": "7.2.3",
1244 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1245 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1246 | "dev": true,
1247 | "peer": true,
1248 | "dependencies": {
1249 | "fs.realpath": "^1.0.0",
1250 | "inflight": "^1.0.4",
1251 | "inherits": "2",
1252 | "minimatch": "^3.1.1",
1253 | "once": "^1.3.0",
1254 | "path-is-absolute": "^1.0.0"
1255 | },
1256 | "engines": {
1257 | "node": "*"
1258 | },
1259 | "funding": {
1260 | "url": "https://github.com/sponsors/isaacs"
1261 | }
1262 | },
1263 | "node_modules/glob-parent": {
1264 | "version": "6.0.2",
1265 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1266 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1267 | "dev": true,
1268 | "peer": true,
1269 | "dependencies": {
1270 | "is-glob": "^4.0.3"
1271 | },
1272 | "engines": {
1273 | "node": ">=10.13.0"
1274 | }
1275 | },
1276 | "node_modules/globals": {
1277 | "version": "13.15.0",
1278 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
1279 | "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
1280 | "dev": true,
1281 | "peer": true,
1282 | "dependencies": {
1283 | "type-fest": "^0.20.2"
1284 | },
1285 | "engines": {
1286 | "node": ">=8"
1287 | },
1288 | "funding": {
1289 | "url": "https://github.com/sponsors/sindresorhus"
1290 | }
1291 | },
1292 | "node_modules/globby": {
1293 | "version": "11.1.0",
1294 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
1295 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
1296 | "dev": true,
1297 | "dependencies": {
1298 | "array-union": "^2.1.0",
1299 | "dir-glob": "^3.0.1",
1300 | "fast-glob": "^3.2.9",
1301 | "ignore": "^5.2.0",
1302 | "merge2": "^1.4.1",
1303 | "slash": "^3.0.0"
1304 | },
1305 | "engines": {
1306 | "node": ">=10"
1307 | },
1308 | "funding": {
1309 | "url": "https://github.com/sponsors/sindresorhus"
1310 | }
1311 | },
1312 | "node_modules/has-flag": {
1313 | "version": "4.0.0",
1314 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1315 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1316 | "dev": true,
1317 | "peer": true,
1318 | "engines": {
1319 | "node": ">=8"
1320 | }
1321 | },
1322 | "node_modules/ignore": {
1323 | "version": "5.2.0",
1324 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
1325 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
1326 | "dev": true,
1327 | "engines": {
1328 | "node": ">= 4"
1329 | }
1330 | },
1331 | "node_modules/import-fresh": {
1332 | "version": "3.3.0",
1333 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1334 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1335 | "dev": true,
1336 | "peer": true,
1337 | "dependencies": {
1338 | "parent-module": "^1.0.0",
1339 | "resolve-from": "^4.0.0"
1340 | },
1341 | "engines": {
1342 | "node": ">=6"
1343 | },
1344 | "funding": {
1345 | "url": "https://github.com/sponsors/sindresorhus"
1346 | }
1347 | },
1348 | "node_modules/imurmurhash": {
1349 | "version": "0.1.4",
1350 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1351 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1352 | "dev": true,
1353 | "peer": true,
1354 | "engines": {
1355 | "node": ">=0.8.19"
1356 | }
1357 | },
1358 | "node_modules/inflight": {
1359 | "version": "1.0.6",
1360 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1361 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1362 | "dev": true,
1363 | "peer": true,
1364 | "dependencies": {
1365 | "once": "^1.3.0",
1366 | "wrappy": "1"
1367 | }
1368 | },
1369 | "node_modules/inherits": {
1370 | "version": "2.0.4",
1371 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1372 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1373 | "dev": true,
1374 | "peer": true
1375 | },
1376 | "node_modules/is-extglob": {
1377 | "version": "2.1.1",
1378 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1379 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1380 | "dev": true,
1381 | "engines": {
1382 | "node": ">=0.10.0"
1383 | }
1384 | },
1385 | "node_modules/is-glob": {
1386 | "version": "4.0.3",
1387 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1388 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1389 | "dev": true,
1390 | "dependencies": {
1391 | "is-extglob": "^2.1.1"
1392 | },
1393 | "engines": {
1394 | "node": ">=0.10.0"
1395 | }
1396 | },
1397 | "node_modules/is-number": {
1398 | "version": "7.0.0",
1399 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1400 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1401 | "dev": true,
1402 | "engines": {
1403 | "node": ">=0.12.0"
1404 | }
1405 | },
1406 | "node_modules/isexe": {
1407 | "version": "2.0.0",
1408 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1409 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1410 | "dev": true,
1411 | "peer": true
1412 | },
1413 | "node_modules/js-yaml": {
1414 | "version": "4.1.0",
1415 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1416 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1417 | "dev": true,
1418 | "peer": true,
1419 | "dependencies": {
1420 | "argparse": "^2.0.1"
1421 | },
1422 | "bin": {
1423 | "js-yaml": "bin/js-yaml.js"
1424 | }
1425 | },
1426 | "node_modules/json-schema-traverse": {
1427 | "version": "0.4.1",
1428 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1429 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1430 | "dev": true,
1431 | "peer": true
1432 | },
1433 | "node_modules/json-stable-stringify-without-jsonify": {
1434 | "version": "1.0.1",
1435 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1436 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1437 | "dev": true,
1438 | "peer": true
1439 | },
1440 | "node_modules/levn": {
1441 | "version": "0.4.1",
1442 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1443 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1444 | "dev": true,
1445 | "peer": true,
1446 | "dependencies": {
1447 | "prelude-ls": "^1.2.1",
1448 | "type-check": "~0.4.0"
1449 | },
1450 | "engines": {
1451 | "node": ">= 0.8.0"
1452 | }
1453 | },
1454 | "node_modules/lodash.merge": {
1455 | "version": "4.6.2",
1456 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
1457 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
1458 | "dev": true,
1459 | "peer": true
1460 | },
1461 | "node_modules/lru-cache": {
1462 | "version": "6.0.0",
1463 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1464 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1465 | "dev": true,
1466 | "dependencies": {
1467 | "yallist": "^4.0.0"
1468 | },
1469 | "engines": {
1470 | "node": ">=10"
1471 | }
1472 | },
1473 | "node_modules/merge2": {
1474 | "version": "1.4.1",
1475 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1476 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1477 | "dev": true,
1478 | "engines": {
1479 | "node": ">= 8"
1480 | }
1481 | },
1482 | "node_modules/micromatch": {
1483 | "version": "4.0.8",
1484 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1485 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1486 | "dev": true,
1487 | "dependencies": {
1488 | "braces": "^3.0.3",
1489 | "picomatch": "^2.3.1"
1490 | },
1491 | "engines": {
1492 | "node": ">=8.6"
1493 | }
1494 | },
1495 | "node_modules/mime-db": {
1496 | "version": "1.52.0",
1497 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1498 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1499 | "engines": {
1500 | "node": ">= 0.6"
1501 | }
1502 | },
1503 | "node_modules/mime-types": {
1504 | "version": "2.1.35",
1505 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1506 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1507 | "dependencies": {
1508 | "mime-db": "1.52.0"
1509 | },
1510 | "engines": {
1511 | "node": ">= 0.6"
1512 | }
1513 | },
1514 | "node_modules/minimatch": {
1515 | "version": "3.1.2",
1516 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1517 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1518 | "dev": true,
1519 | "peer": true,
1520 | "dependencies": {
1521 | "brace-expansion": "^1.1.7"
1522 | },
1523 | "engines": {
1524 | "node": "*"
1525 | }
1526 | },
1527 | "node_modules/moment": {
1528 | "version": "2.29.4",
1529 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
1530 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
1531 | "dev": true,
1532 | "engines": {
1533 | "node": "*"
1534 | }
1535 | },
1536 | "node_modules/ms": {
1537 | "version": "2.1.2",
1538 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1539 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1540 | "dev": true
1541 | },
1542 | "node_modules/natural-compare": {
1543 | "version": "1.4.0",
1544 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1545 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1546 | "dev": true,
1547 | "peer": true
1548 | },
1549 | "node_modules/obsidian": {
1550 | "version": "1.4.11",
1551 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.4.11.tgz",
1552 | "integrity": "sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==",
1553 | "dev": true,
1554 | "dependencies": {
1555 | "@types/codemirror": "5.60.8",
1556 | "moment": "2.29.4"
1557 | },
1558 | "peerDependencies": {
1559 | "@codemirror/state": "^6.0.0",
1560 | "@codemirror/view": "^6.0.0"
1561 | }
1562 | },
1563 | "node_modules/once": {
1564 | "version": "1.4.0",
1565 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1566 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1567 | "dev": true,
1568 | "peer": true,
1569 | "dependencies": {
1570 | "wrappy": "1"
1571 | }
1572 | },
1573 | "node_modules/optionator": {
1574 | "version": "0.9.1",
1575 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
1576 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
1577 | "dev": true,
1578 | "peer": true,
1579 | "dependencies": {
1580 | "deep-is": "^0.1.3",
1581 | "fast-levenshtein": "^2.0.6",
1582 | "levn": "^0.4.1",
1583 | "prelude-ls": "^1.2.1",
1584 | "type-check": "^0.4.0",
1585 | "word-wrap": "^1.2.3"
1586 | },
1587 | "engines": {
1588 | "node": ">= 0.8.0"
1589 | }
1590 | },
1591 | "node_modules/parent-module": {
1592 | "version": "1.0.1",
1593 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1594 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1595 | "dev": true,
1596 | "peer": true,
1597 | "dependencies": {
1598 | "callsites": "^3.0.0"
1599 | },
1600 | "engines": {
1601 | "node": ">=6"
1602 | }
1603 | },
1604 | "node_modules/path-is-absolute": {
1605 | "version": "1.0.1",
1606 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1607 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1608 | "dev": true,
1609 | "peer": true,
1610 | "engines": {
1611 | "node": ">=0.10.0"
1612 | }
1613 | },
1614 | "node_modules/path-key": {
1615 | "version": "3.1.1",
1616 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1617 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1618 | "dev": true,
1619 | "peer": true,
1620 | "engines": {
1621 | "node": ">=8"
1622 | }
1623 | },
1624 | "node_modules/path-type": {
1625 | "version": "4.0.0",
1626 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
1627 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
1628 | "dev": true,
1629 | "engines": {
1630 | "node": ">=8"
1631 | }
1632 | },
1633 | "node_modules/picomatch": {
1634 | "version": "2.3.1",
1635 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1636 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1637 | "dev": true,
1638 | "engines": {
1639 | "node": ">=8.6"
1640 | },
1641 | "funding": {
1642 | "url": "https://github.com/sponsors/jonschlinkert"
1643 | }
1644 | },
1645 | "node_modules/prelude-ls": {
1646 | "version": "1.2.1",
1647 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
1648 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
1649 | "dev": true,
1650 | "peer": true,
1651 | "engines": {
1652 | "node": ">= 0.8.0"
1653 | }
1654 | },
1655 | "node_modules/punycode": {
1656 | "version": "2.1.1",
1657 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1658 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1659 | "dev": true,
1660 | "peer": true,
1661 | "engines": {
1662 | "node": ">=6"
1663 | }
1664 | },
1665 | "node_modules/queue-microtask": {
1666 | "version": "1.2.3",
1667 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1668 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1669 | "dev": true,
1670 | "funding": [
1671 | {
1672 | "type": "github",
1673 | "url": "https://github.com/sponsors/feross"
1674 | },
1675 | {
1676 | "type": "patreon",
1677 | "url": "https://www.patreon.com/feross"
1678 | },
1679 | {
1680 | "type": "consulting",
1681 | "url": "https://feross.org/support"
1682 | }
1683 | ]
1684 | },
1685 | "node_modules/regexpp": {
1686 | "version": "3.2.0",
1687 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
1688 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
1689 | "dev": true,
1690 | "engines": {
1691 | "node": ">=8"
1692 | },
1693 | "funding": {
1694 | "url": "https://github.com/sponsors/mysticatea"
1695 | }
1696 | },
1697 | "node_modules/resolve-from": {
1698 | "version": "4.0.0",
1699 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1700 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1701 | "dev": true,
1702 | "peer": true,
1703 | "engines": {
1704 | "node": ">=4"
1705 | }
1706 | },
1707 | "node_modules/reusify": {
1708 | "version": "1.0.4",
1709 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1710 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1711 | "dev": true,
1712 | "engines": {
1713 | "iojs": ">=1.0.0",
1714 | "node": ">=0.10.0"
1715 | }
1716 | },
1717 | "node_modules/rimraf": {
1718 | "version": "3.0.2",
1719 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1720 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1721 | "dev": true,
1722 | "peer": true,
1723 | "dependencies": {
1724 | "glob": "^7.1.3"
1725 | },
1726 | "bin": {
1727 | "rimraf": "bin.js"
1728 | },
1729 | "funding": {
1730 | "url": "https://github.com/sponsors/isaacs"
1731 | }
1732 | },
1733 | "node_modules/run-parallel": {
1734 | "version": "1.2.0",
1735 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1736 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1737 | "dev": true,
1738 | "funding": [
1739 | {
1740 | "type": "github",
1741 | "url": "https://github.com/sponsors/feross"
1742 | },
1743 | {
1744 | "type": "patreon",
1745 | "url": "https://www.patreon.com/feross"
1746 | },
1747 | {
1748 | "type": "consulting",
1749 | "url": "https://feross.org/support"
1750 | }
1751 | ],
1752 | "dependencies": {
1753 | "queue-microtask": "^1.2.2"
1754 | }
1755 | },
1756 | "node_modules/semver": {
1757 | "version": "7.5.4",
1758 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1759 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1760 | "dev": true,
1761 | "dependencies": {
1762 | "lru-cache": "^6.0.0"
1763 | },
1764 | "bin": {
1765 | "semver": "bin/semver.js"
1766 | },
1767 | "engines": {
1768 | "node": ">=10"
1769 | }
1770 | },
1771 | "node_modules/shebang-command": {
1772 | "version": "2.0.0",
1773 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1774 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1775 | "dev": true,
1776 | "peer": true,
1777 | "dependencies": {
1778 | "shebang-regex": "^3.0.0"
1779 | },
1780 | "engines": {
1781 | "node": ">=8"
1782 | }
1783 | },
1784 | "node_modules/shebang-regex": {
1785 | "version": "3.0.0",
1786 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1787 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1788 | "dev": true,
1789 | "peer": true,
1790 | "engines": {
1791 | "node": ">=8"
1792 | }
1793 | },
1794 | "node_modules/slash": {
1795 | "version": "3.0.0",
1796 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
1797 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
1798 | "dev": true,
1799 | "engines": {
1800 | "node": ">=8"
1801 | }
1802 | },
1803 | "node_modules/strip-ansi": {
1804 | "version": "6.0.1",
1805 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1806 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1807 | "dev": true,
1808 | "peer": true,
1809 | "dependencies": {
1810 | "ansi-regex": "^5.0.1"
1811 | },
1812 | "engines": {
1813 | "node": ">=8"
1814 | }
1815 | },
1816 | "node_modules/strip-json-comments": {
1817 | "version": "3.1.1",
1818 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
1819 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
1820 | "dev": true,
1821 | "peer": true,
1822 | "engines": {
1823 | "node": ">=8"
1824 | },
1825 | "funding": {
1826 | "url": "https://github.com/sponsors/sindresorhus"
1827 | }
1828 | },
1829 | "node_modules/style-mod": {
1830 | "version": "4.1.0",
1831 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz",
1832 | "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==",
1833 | "dev": true,
1834 | "peer": true
1835 | },
1836 | "node_modules/supports-color": {
1837 | "version": "7.2.0",
1838 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1839 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1840 | "dev": true,
1841 | "peer": true,
1842 | "dependencies": {
1843 | "has-flag": "^4.0.0"
1844 | },
1845 | "engines": {
1846 | "node": ">=8"
1847 | }
1848 | },
1849 | "node_modules/text-table": {
1850 | "version": "0.2.0",
1851 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1852 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1853 | "dev": true,
1854 | "peer": true
1855 | },
1856 | "node_modules/to-regex-range": {
1857 | "version": "5.0.1",
1858 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1859 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1860 | "dev": true,
1861 | "dependencies": {
1862 | "is-number": "^7.0.0"
1863 | },
1864 | "engines": {
1865 | "node": ">=8.0"
1866 | }
1867 | },
1868 | "node_modules/tslib": {
1869 | "version": "2.3.1",
1870 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
1871 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
1872 | "dev": true
1873 | },
1874 | "node_modules/tsutils": {
1875 | "version": "3.21.0",
1876 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
1877 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
1878 | "dev": true,
1879 | "dependencies": {
1880 | "tslib": "^1.8.1"
1881 | },
1882 | "engines": {
1883 | "node": ">= 6"
1884 | },
1885 | "peerDependencies": {
1886 | "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"
1887 | }
1888 | },
1889 | "node_modules/tsutils/node_modules/tslib": {
1890 | "version": "1.14.1",
1891 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
1892 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
1893 | "dev": true
1894 | },
1895 | "node_modules/type-check": {
1896 | "version": "0.4.0",
1897 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
1898 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
1899 | "dev": true,
1900 | "peer": true,
1901 | "dependencies": {
1902 | "prelude-ls": "^1.2.1"
1903 | },
1904 | "engines": {
1905 | "node": ">= 0.8.0"
1906 | }
1907 | },
1908 | "node_modules/type-fest": {
1909 | "version": "0.20.2",
1910 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
1911 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
1912 | "dev": true,
1913 | "peer": true,
1914 | "engines": {
1915 | "node": ">=10"
1916 | },
1917 | "funding": {
1918 | "url": "https://github.com/sponsors/sindresorhus"
1919 | }
1920 | },
1921 | "node_modules/typescript": {
1922 | "version": "4.4.4",
1923 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
1924 | "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
1925 | "dev": true,
1926 | "bin": {
1927 | "tsc": "bin/tsc",
1928 | "tsserver": "bin/tsserver"
1929 | },
1930 | "engines": {
1931 | "node": ">=4.2.0"
1932 | }
1933 | },
1934 | "node_modules/uri-js": {
1935 | "version": "4.4.1",
1936 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1937 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1938 | "dev": true,
1939 | "peer": true,
1940 | "dependencies": {
1941 | "punycode": "^2.1.0"
1942 | }
1943 | },
1944 | "node_modules/v8-compile-cache": {
1945 | "version": "2.3.0",
1946 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
1947 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
1948 | "dev": true,
1949 | "peer": true
1950 | },
1951 | "node_modules/w3c-keyname": {
1952 | "version": "2.2.8",
1953 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
1954 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
1955 | "dev": true,
1956 | "peer": true
1957 | },
1958 | "node_modules/which": {
1959 | "version": "2.0.2",
1960 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1961 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1962 | "dev": true,
1963 | "peer": true,
1964 | "dependencies": {
1965 | "isexe": "^2.0.0"
1966 | },
1967 | "bin": {
1968 | "node-which": "bin/node-which"
1969 | },
1970 | "engines": {
1971 | "node": ">= 8"
1972 | }
1973 | },
1974 | "node_modules/word-wrap": {
1975 | "version": "1.2.5",
1976 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
1977 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
1978 | "dev": true,
1979 | "peer": true,
1980 | "engines": {
1981 | "node": ">=0.10.0"
1982 | }
1983 | },
1984 | "node_modules/wrappy": {
1985 | "version": "1.0.2",
1986 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1987 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1988 | "dev": true,
1989 | "peer": true
1990 | },
1991 | "node_modules/yallist": {
1992 | "version": "4.0.0",
1993 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1994 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
1995 | "dev": true
1996 | }
1997 | },
1998 | "dependencies": {
1999 | "@codemirror/state": {
2000 | "version": "6.2.1",
2001 | "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz",
2002 | "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==",
2003 | "dev": true,
2004 | "peer": true
2005 | },
2006 | "@codemirror/view": {
2007 | "version": "6.18.1",
2008 | "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.18.1.tgz",
2009 | "integrity": "sha512-xcsXcMkIMd7l3WZEWoc4ljteAiqzxb5gVerRxk5132p5cLix6rTydWTQjsj2oxORepfsrwy1fC4r20iMa9plrg==",
2010 | "dev": true,
2011 | "peer": true,
2012 | "requires": {
2013 | "@codemirror/state": "^6.1.4",
2014 | "style-mod": "^4.1.0",
2015 | "w3c-keyname": "^2.2.4"
2016 | }
2017 | },
2018 | "@eslint/eslintrc": {
2019 | "version": "1.2.3",
2020 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz",
2021 | "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==",
2022 | "dev": true,
2023 | "peer": true,
2024 | "requires": {
2025 | "ajv": "^6.12.4",
2026 | "debug": "^4.3.2",
2027 | "espree": "^9.3.2",
2028 | "globals": "^13.9.0",
2029 | "ignore": "^5.2.0",
2030 | "import-fresh": "^3.2.1",
2031 | "js-yaml": "^4.1.0",
2032 | "minimatch": "^3.1.2",
2033 | "strip-json-comments": "^3.1.1"
2034 | }
2035 | },
2036 | "@humanwhocodes/config-array": {
2037 | "version": "0.9.5",
2038 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
2039 | "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
2040 | "dev": true,
2041 | "peer": true,
2042 | "requires": {
2043 | "@humanwhocodes/object-schema": "^1.2.1",
2044 | "debug": "^4.1.1",
2045 | "minimatch": "^3.0.4"
2046 | }
2047 | },
2048 | "@humanwhocodes/object-schema": {
2049 | "version": "1.2.1",
2050 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
2051 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
2052 | "dev": true,
2053 | "peer": true
2054 | },
2055 | "@nodelib/fs.scandir": {
2056 | "version": "2.1.5",
2057 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
2058 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
2059 | "dev": true,
2060 | "requires": {
2061 | "@nodelib/fs.stat": "2.0.5",
2062 | "run-parallel": "^1.1.9"
2063 | }
2064 | },
2065 | "@nodelib/fs.stat": {
2066 | "version": "2.0.5",
2067 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
2068 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
2069 | "dev": true
2070 | },
2071 | "@nodelib/fs.walk": {
2072 | "version": "1.2.8",
2073 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
2074 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
2075 | "dev": true,
2076 | "requires": {
2077 | "@nodelib/fs.scandir": "2.1.5",
2078 | "fastq": "^1.6.0"
2079 | }
2080 | },
2081 | "@types/codemirror": {
2082 | "version": "5.60.8",
2083 | "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz",
2084 | "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==",
2085 | "dev": true,
2086 | "requires": {
2087 | "@types/tern": "*"
2088 | }
2089 | },
2090 | "@types/estree": {
2091 | "version": "1.0.1",
2092 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
2093 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
2094 | "dev": true
2095 | },
2096 | "@types/json-schema": {
2097 | "version": "7.0.11",
2098 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
2099 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
2100 | "dev": true
2101 | },
2102 | "@types/node": {
2103 | "version": "16.11.35",
2104 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.35.tgz",
2105 | "integrity": "sha512-QXu45LyepgnhUfnIAj/FyT4uM87ug5KpIrgXfQtUPNAlx8w5hmd8z8emqCLNvG11QkpRSCG9Qg2buMxvqfjfsQ==",
2106 | "dev": true
2107 | },
2108 | "@types/tern": {
2109 | "version": "0.23.5",
2110 | "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.5.tgz",
2111 | "integrity": "sha512-POau56wDk3TQ0mQ0qG7XDzv96U5whSENZ9lC0htDvEH+9YUREo+J2U+apWcVRgR2UydEE70JXZo44goG+akTNQ==",
2112 | "dev": true,
2113 | "requires": {
2114 | "@types/estree": "*"
2115 | }
2116 | },
2117 | "@typescript-eslint/eslint-plugin": {
2118 | "version": "5.23.0",
2119 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.23.0.tgz",
2120 | "integrity": "sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA==",
2121 | "dev": true,
2122 | "requires": {
2123 | "@typescript-eslint/scope-manager": "5.23.0",
2124 | "@typescript-eslint/type-utils": "5.23.0",
2125 | "@typescript-eslint/utils": "5.23.0",
2126 | "debug": "^4.3.2",
2127 | "functional-red-black-tree": "^1.0.1",
2128 | "ignore": "^5.1.8",
2129 | "regexpp": "^3.2.0",
2130 | "semver": "^7.3.5",
2131 | "tsutils": "^3.21.0"
2132 | }
2133 | },
2134 | "@typescript-eslint/parser": {
2135 | "version": "5.23.0",
2136 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.23.0.tgz",
2137 | "integrity": "sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw==",
2138 | "dev": true,
2139 | "requires": {
2140 | "@typescript-eslint/scope-manager": "5.23.0",
2141 | "@typescript-eslint/types": "5.23.0",
2142 | "@typescript-eslint/typescript-estree": "5.23.0",
2143 | "debug": "^4.3.2"
2144 | }
2145 | },
2146 | "@typescript-eslint/scope-manager": {
2147 | "version": "5.23.0",
2148 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.23.0.tgz",
2149 | "integrity": "sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw==",
2150 | "dev": true,
2151 | "requires": {
2152 | "@typescript-eslint/types": "5.23.0",
2153 | "@typescript-eslint/visitor-keys": "5.23.0"
2154 | }
2155 | },
2156 | "@typescript-eslint/type-utils": {
2157 | "version": "5.23.0",
2158 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz",
2159 | "integrity": "sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw==",
2160 | "dev": true,
2161 | "requires": {
2162 | "@typescript-eslint/utils": "5.23.0",
2163 | "debug": "^4.3.2",
2164 | "tsutils": "^3.21.0"
2165 | }
2166 | },
2167 | "@typescript-eslint/types": {
2168 | "version": "5.23.0",
2169 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.23.0.tgz",
2170 | "integrity": "sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw==",
2171 | "dev": true
2172 | },
2173 | "@typescript-eslint/typescript-estree": {
2174 | "version": "5.23.0",
2175 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.23.0.tgz",
2176 | "integrity": "sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg==",
2177 | "dev": true,
2178 | "requires": {
2179 | "@typescript-eslint/types": "5.23.0",
2180 | "@typescript-eslint/visitor-keys": "5.23.0",
2181 | "debug": "^4.3.2",
2182 | "globby": "^11.0.4",
2183 | "is-glob": "^4.0.3",
2184 | "semver": "^7.3.5",
2185 | "tsutils": "^3.21.0"
2186 | }
2187 | },
2188 | "@typescript-eslint/utils": {
2189 | "version": "5.23.0",
2190 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.23.0.tgz",
2191 | "integrity": "sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA==",
2192 | "dev": true,
2193 | "requires": {
2194 | "@types/json-schema": "^7.0.9",
2195 | "@typescript-eslint/scope-manager": "5.23.0",
2196 | "@typescript-eslint/types": "5.23.0",
2197 | "@typescript-eslint/typescript-estree": "5.23.0",
2198 | "eslint-scope": "^5.1.1",
2199 | "eslint-utils": "^3.0.0"
2200 | }
2201 | },
2202 | "@typescript-eslint/visitor-keys": {
2203 | "version": "5.23.0",
2204 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz",
2205 | "integrity": "sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg==",
2206 | "dev": true,
2207 | "requires": {
2208 | "@typescript-eslint/types": "5.23.0",
2209 | "eslint-visitor-keys": "^3.0.0"
2210 | }
2211 | },
2212 | "acorn": {
2213 | "version": "8.7.1",
2214 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
2215 | "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
2216 | "dev": true,
2217 | "peer": true
2218 | },
2219 | "acorn-jsx": {
2220 | "version": "5.3.2",
2221 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
2222 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
2223 | "dev": true,
2224 | "peer": true,
2225 | "requires": {}
2226 | },
2227 | "ajv": {
2228 | "version": "6.12.6",
2229 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
2230 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
2231 | "dev": true,
2232 | "peer": true,
2233 | "requires": {
2234 | "fast-deep-equal": "^3.1.1",
2235 | "fast-json-stable-stringify": "^2.0.0",
2236 | "json-schema-traverse": "^0.4.1",
2237 | "uri-js": "^4.2.2"
2238 | }
2239 | },
2240 | "ansi-regex": {
2241 | "version": "5.0.1",
2242 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2243 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2244 | "dev": true,
2245 | "peer": true
2246 | },
2247 | "ansi-styles": {
2248 | "version": "4.3.0",
2249 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2250 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2251 | "dev": true,
2252 | "peer": true,
2253 | "requires": {
2254 | "color-convert": "^2.0.1"
2255 | }
2256 | },
2257 | "argparse": {
2258 | "version": "2.0.1",
2259 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
2260 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
2261 | "dev": true,
2262 | "peer": true
2263 | },
2264 | "array-union": {
2265 | "version": "2.1.0",
2266 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
2267 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
2268 | "dev": true
2269 | },
2270 | "asynckit": {
2271 | "version": "0.4.0",
2272 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
2273 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
2274 | },
2275 | "axios": {
2276 | "version": "0.27.2",
2277 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
2278 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
2279 | "requires": {
2280 | "follow-redirects": "^1.14.9",
2281 | "form-data": "^4.0.0"
2282 | }
2283 | },
2284 | "balanced-match": {
2285 | "version": "1.0.2",
2286 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
2287 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2288 | "dev": true,
2289 | "peer": true
2290 | },
2291 | "brace-expansion": {
2292 | "version": "1.1.11",
2293 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
2294 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
2295 | "dev": true,
2296 | "peer": true,
2297 | "requires": {
2298 | "balanced-match": "^1.0.0",
2299 | "concat-map": "0.0.1"
2300 | }
2301 | },
2302 | "braces": {
2303 | "version": "3.0.3",
2304 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
2305 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
2306 | "dev": true,
2307 | "requires": {
2308 | "fill-range": "^7.1.1"
2309 | }
2310 | },
2311 | "builtin-modules": {
2312 | "version": "3.3.0",
2313 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
2314 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
2315 | "dev": true
2316 | },
2317 | "callsites": {
2318 | "version": "3.1.0",
2319 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
2320 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
2321 | "dev": true,
2322 | "peer": true
2323 | },
2324 | "chalk": {
2325 | "version": "4.1.2",
2326 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2327 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2328 | "dev": true,
2329 | "peer": true,
2330 | "requires": {
2331 | "ansi-styles": "^4.1.0",
2332 | "supports-color": "^7.1.0"
2333 | }
2334 | },
2335 | "color-convert": {
2336 | "version": "2.0.1",
2337 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2338 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2339 | "dev": true,
2340 | "peer": true,
2341 | "requires": {
2342 | "color-name": "~1.1.4"
2343 | }
2344 | },
2345 | "color-name": {
2346 | "version": "1.1.4",
2347 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2348 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2349 | "dev": true,
2350 | "peer": true
2351 | },
2352 | "combined-stream": {
2353 | "version": "1.0.8",
2354 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
2355 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
2356 | "requires": {
2357 | "delayed-stream": "~1.0.0"
2358 | }
2359 | },
2360 | "concat-map": {
2361 | "version": "0.0.1",
2362 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2363 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
2364 | "dev": true,
2365 | "peer": true
2366 | },
2367 | "cross-spawn": {
2368 | "version": "7.0.6",
2369 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
2370 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
2371 | "dev": true,
2372 | "peer": true,
2373 | "requires": {
2374 | "path-key": "^3.1.0",
2375 | "shebang-command": "^2.0.0",
2376 | "which": "^2.0.1"
2377 | }
2378 | },
2379 | "debug": {
2380 | "version": "4.3.4",
2381 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
2382 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
2383 | "dev": true,
2384 | "requires": {
2385 | "ms": "2.1.2"
2386 | }
2387 | },
2388 | "deep-is": {
2389 | "version": "0.1.4",
2390 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
2391 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
2392 | "dev": true,
2393 | "peer": true
2394 | },
2395 | "delayed-stream": {
2396 | "version": "1.0.0",
2397 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
2398 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
2399 | },
2400 | "dir-glob": {
2401 | "version": "3.0.1",
2402 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
2403 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
2404 | "dev": true,
2405 | "requires": {
2406 | "path-type": "^4.0.0"
2407 | }
2408 | },
2409 | "doctrine": {
2410 | "version": "3.0.0",
2411 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
2412 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
2413 | "dev": true,
2414 | "peer": true,
2415 | "requires": {
2416 | "esutils": "^2.0.2"
2417 | }
2418 | },
2419 | "dotenv": {
2420 | "version": "16.0.1",
2421 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
2422 | "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
2423 | },
2424 | "esbuild": {
2425 | "version": "0.13.12",
2426 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz",
2427 | "integrity": "sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow==",
2428 | "dev": true,
2429 | "requires": {
2430 | "esbuild-android-arm64": "0.13.12",
2431 | "esbuild-darwin-64": "0.13.12",
2432 | "esbuild-darwin-arm64": "0.13.12",
2433 | "esbuild-freebsd-64": "0.13.12",
2434 | "esbuild-freebsd-arm64": "0.13.12",
2435 | "esbuild-linux-32": "0.13.12",
2436 | "esbuild-linux-64": "0.13.12",
2437 | "esbuild-linux-arm": "0.13.12",
2438 | "esbuild-linux-arm64": "0.13.12",
2439 | "esbuild-linux-mips64le": "0.13.12",
2440 | "esbuild-linux-ppc64le": "0.13.12",
2441 | "esbuild-netbsd-64": "0.13.12",
2442 | "esbuild-openbsd-64": "0.13.12",
2443 | "esbuild-sunos-64": "0.13.12",
2444 | "esbuild-windows-32": "0.13.12",
2445 | "esbuild-windows-64": "0.13.12",
2446 | "esbuild-windows-arm64": "0.13.12"
2447 | }
2448 | },
2449 | "esbuild-android-arm64": {
2450 | "version": "0.13.12",
2451 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.12.tgz",
2452 | "integrity": "sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==",
2453 | "dev": true,
2454 | "optional": true
2455 | },
2456 | "esbuild-darwin-64": {
2457 | "version": "0.13.12",
2458 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.12.tgz",
2459 | "integrity": "sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==",
2460 | "dev": true,
2461 | "optional": true
2462 | },
2463 | "esbuild-darwin-arm64": {
2464 | "version": "0.13.12",
2465 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.12.tgz",
2466 | "integrity": "sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==",
2467 | "dev": true,
2468 | "optional": true
2469 | },
2470 | "esbuild-freebsd-64": {
2471 | "version": "0.13.12",
2472 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.12.tgz",
2473 | "integrity": "sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==",
2474 | "dev": true,
2475 | "optional": true
2476 | },
2477 | "esbuild-freebsd-arm64": {
2478 | "version": "0.13.12",
2479 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.12.tgz",
2480 | "integrity": "sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==",
2481 | "dev": true,
2482 | "optional": true
2483 | },
2484 | "esbuild-linux-32": {
2485 | "version": "0.13.12",
2486 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.12.tgz",
2487 | "integrity": "sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==",
2488 | "dev": true,
2489 | "optional": true
2490 | },
2491 | "esbuild-linux-64": {
2492 | "version": "0.13.12",
2493 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.12.tgz",
2494 | "integrity": "sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==",
2495 | "dev": true,
2496 | "optional": true
2497 | },
2498 | "esbuild-linux-arm": {
2499 | "version": "0.13.12",
2500 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.12.tgz",
2501 | "integrity": "sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==",
2502 | "dev": true,
2503 | "optional": true
2504 | },
2505 | "esbuild-linux-arm64": {
2506 | "version": "0.13.12",
2507 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.12.tgz",
2508 | "integrity": "sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==",
2509 | "dev": true,
2510 | "optional": true
2511 | },
2512 | "esbuild-linux-mips64le": {
2513 | "version": "0.13.12",
2514 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.12.tgz",
2515 | "integrity": "sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==",
2516 | "dev": true,
2517 | "optional": true
2518 | },
2519 | "esbuild-linux-ppc64le": {
2520 | "version": "0.13.12",
2521 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.12.tgz",
2522 | "integrity": "sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==",
2523 | "dev": true,
2524 | "optional": true
2525 | },
2526 | "esbuild-netbsd-64": {
2527 | "version": "0.13.12",
2528 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.12.tgz",
2529 | "integrity": "sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==",
2530 | "dev": true,
2531 | "optional": true
2532 | },
2533 | "esbuild-openbsd-64": {
2534 | "version": "0.13.12",
2535 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.12.tgz",
2536 | "integrity": "sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==",
2537 | "dev": true,
2538 | "optional": true
2539 | },
2540 | "esbuild-sunos-64": {
2541 | "version": "0.13.12",
2542 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.12.tgz",
2543 | "integrity": "sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==",
2544 | "dev": true,
2545 | "optional": true
2546 | },
2547 | "esbuild-windows-32": {
2548 | "version": "0.13.12",
2549 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz",
2550 | "integrity": "sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==",
2551 | "dev": true,
2552 | "optional": true
2553 | },
2554 | "esbuild-windows-64": {
2555 | "version": "0.13.12",
2556 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.12.tgz",
2557 | "integrity": "sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==",
2558 | "dev": true,
2559 | "optional": true
2560 | },
2561 | "esbuild-windows-arm64": {
2562 | "version": "0.13.12",
2563 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.12.tgz",
2564 | "integrity": "sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==",
2565 | "dev": true,
2566 | "optional": true
2567 | },
2568 | "escape-string-regexp": {
2569 | "version": "4.0.0",
2570 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
2571 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
2572 | "dev": true,
2573 | "peer": true
2574 | },
2575 | "eslint": {
2576 | "version": "8.15.0",
2577 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz",
2578 | "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==",
2579 | "dev": true,
2580 | "peer": true,
2581 | "requires": {
2582 | "@eslint/eslintrc": "^1.2.3",
2583 | "@humanwhocodes/config-array": "^0.9.2",
2584 | "ajv": "^6.10.0",
2585 | "chalk": "^4.0.0",
2586 | "cross-spawn": "^7.0.2",
2587 | "debug": "^4.3.2",
2588 | "doctrine": "^3.0.0",
2589 | "escape-string-regexp": "^4.0.0",
2590 | "eslint-scope": "^7.1.1",
2591 | "eslint-utils": "^3.0.0",
2592 | "eslint-visitor-keys": "^3.3.0",
2593 | "espree": "^9.3.2",
2594 | "esquery": "^1.4.0",
2595 | "esutils": "^2.0.2",
2596 | "fast-deep-equal": "^3.1.3",
2597 | "file-entry-cache": "^6.0.1",
2598 | "functional-red-black-tree": "^1.0.1",
2599 | "glob-parent": "^6.0.1",
2600 | "globals": "^13.6.0",
2601 | "ignore": "^5.2.0",
2602 | "import-fresh": "^3.0.0",
2603 | "imurmurhash": "^0.1.4",
2604 | "is-glob": "^4.0.0",
2605 | "js-yaml": "^4.1.0",
2606 | "json-stable-stringify-without-jsonify": "^1.0.1",
2607 | "levn": "^0.4.1",
2608 | "lodash.merge": "^4.6.2",
2609 | "minimatch": "^3.1.2",
2610 | "natural-compare": "^1.4.0",
2611 | "optionator": "^0.9.1",
2612 | "regexpp": "^3.2.0",
2613 | "strip-ansi": "^6.0.1",
2614 | "strip-json-comments": "^3.1.0",
2615 | "text-table": "^0.2.0",
2616 | "v8-compile-cache": "^2.0.3"
2617 | },
2618 | "dependencies": {
2619 | "eslint-scope": {
2620 | "version": "7.1.1",
2621 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
2622 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
2623 | "dev": true,
2624 | "peer": true,
2625 | "requires": {
2626 | "esrecurse": "^4.3.0",
2627 | "estraverse": "^5.2.0"
2628 | }
2629 | },
2630 | "estraverse": {
2631 | "version": "5.3.0",
2632 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
2633 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
2634 | "dev": true,
2635 | "peer": true
2636 | }
2637 | }
2638 | },
2639 | "eslint-scope": {
2640 | "version": "5.1.1",
2641 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
2642 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
2643 | "dev": true,
2644 | "requires": {
2645 | "esrecurse": "^4.3.0",
2646 | "estraverse": "^4.1.1"
2647 | }
2648 | },
2649 | "eslint-utils": {
2650 | "version": "3.0.0",
2651 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
2652 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
2653 | "dev": true,
2654 | "requires": {
2655 | "eslint-visitor-keys": "^2.0.0"
2656 | },
2657 | "dependencies": {
2658 | "eslint-visitor-keys": {
2659 | "version": "2.1.0",
2660 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
2661 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
2662 | "dev": true
2663 | }
2664 | }
2665 | },
2666 | "eslint-visitor-keys": {
2667 | "version": "3.3.0",
2668 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
2669 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
2670 | "dev": true
2671 | },
2672 | "espree": {
2673 | "version": "9.3.2",
2674 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
2675 | "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
2676 | "dev": true,
2677 | "peer": true,
2678 | "requires": {
2679 | "acorn": "^8.7.1",
2680 | "acorn-jsx": "^5.3.2",
2681 | "eslint-visitor-keys": "^3.3.0"
2682 | }
2683 | },
2684 | "esquery": {
2685 | "version": "1.4.0",
2686 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
2687 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
2688 | "dev": true,
2689 | "peer": true,
2690 | "requires": {
2691 | "estraverse": "^5.1.0"
2692 | },
2693 | "dependencies": {
2694 | "estraverse": {
2695 | "version": "5.3.0",
2696 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
2697 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
2698 | "dev": true,
2699 | "peer": true
2700 | }
2701 | }
2702 | },
2703 | "esrecurse": {
2704 | "version": "4.3.0",
2705 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
2706 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
2707 | "dev": true,
2708 | "requires": {
2709 | "estraverse": "^5.2.0"
2710 | },
2711 | "dependencies": {
2712 | "estraverse": {
2713 | "version": "5.3.0",
2714 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
2715 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
2716 | "dev": true
2717 | }
2718 | }
2719 | },
2720 | "estraverse": {
2721 | "version": "4.3.0",
2722 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
2723 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
2724 | "dev": true
2725 | },
2726 | "esutils": {
2727 | "version": "2.0.3",
2728 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
2729 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
2730 | "dev": true,
2731 | "peer": true
2732 | },
2733 | "fast-deep-equal": {
2734 | "version": "3.1.3",
2735 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
2736 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
2737 | "dev": true,
2738 | "peer": true
2739 | },
2740 | "fast-glob": {
2741 | "version": "3.2.11",
2742 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
2743 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
2744 | "dev": true,
2745 | "requires": {
2746 | "@nodelib/fs.stat": "^2.0.2",
2747 | "@nodelib/fs.walk": "^1.2.3",
2748 | "glob-parent": "^5.1.2",
2749 | "merge2": "^1.3.0",
2750 | "micromatch": "^4.0.4"
2751 | },
2752 | "dependencies": {
2753 | "glob-parent": {
2754 | "version": "5.1.2",
2755 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
2756 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
2757 | "dev": true,
2758 | "requires": {
2759 | "is-glob": "^4.0.1"
2760 | }
2761 | }
2762 | }
2763 | },
2764 | "fast-json-stable-stringify": {
2765 | "version": "2.1.0",
2766 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
2767 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
2768 | "dev": true,
2769 | "peer": true
2770 | },
2771 | "fast-levenshtein": {
2772 | "version": "2.0.6",
2773 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
2774 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
2775 | "dev": true,
2776 | "peer": true
2777 | },
2778 | "fastq": {
2779 | "version": "1.13.0",
2780 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
2781 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
2782 | "dev": true,
2783 | "requires": {
2784 | "reusify": "^1.0.4"
2785 | }
2786 | },
2787 | "file-entry-cache": {
2788 | "version": "6.0.1",
2789 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
2790 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
2791 | "dev": true,
2792 | "peer": true,
2793 | "requires": {
2794 | "flat-cache": "^3.0.4"
2795 | }
2796 | },
2797 | "fill-range": {
2798 | "version": "7.1.1",
2799 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
2800 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
2801 | "dev": true,
2802 | "requires": {
2803 | "to-regex-range": "^5.0.1"
2804 | }
2805 | },
2806 | "flat-cache": {
2807 | "version": "3.0.4",
2808 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
2809 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
2810 | "dev": true,
2811 | "peer": true,
2812 | "requires": {
2813 | "flatted": "^3.1.0",
2814 | "rimraf": "^3.0.2"
2815 | }
2816 | },
2817 | "flatted": {
2818 | "version": "3.2.5",
2819 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
2820 | "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
2821 | "dev": true,
2822 | "peer": true
2823 | },
2824 | "follow-redirects": {
2825 | "version": "1.15.9",
2826 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
2827 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
2828 | },
2829 | "form-data": {
2830 | "version": "4.0.0",
2831 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
2832 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
2833 | "requires": {
2834 | "asynckit": "^0.4.0",
2835 | "combined-stream": "^1.0.8",
2836 | "mime-types": "^2.1.12"
2837 | }
2838 | },
2839 | "fs.realpath": {
2840 | "version": "1.0.0",
2841 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
2842 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
2843 | "dev": true,
2844 | "peer": true
2845 | },
2846 | "functional-red-black-tree": {
2847 | "version": "1.0.1",
2848 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
2849 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
2850 | "dev": true
2851 | },
2852 | "glob": {
2853 | "version": "7.2.3",
2854 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
2855 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
2856 | "dev": true,
2857 | "peer": true,
2858 | "requires": {
2859 | "fs.realpath": "^1.0.0",
2860 | "inflight": "^1.0.4",
2861 | "inherits": "2",
2862 | "minimatch": "^3.1.1",
2863 | "once": "^1.3.0",
2864 | "path-is-absolute": "^1.0.0"
2865 | }
2866 | },
2867 | "glob-parent": {
2868 | "version": "6.0.2",
2869 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
2870 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
2871 | "dev": true,
2872 | "peer": true,
2873 | "requires": {
2874 | "is-glob": "^4.0.3"
2875 | }
2876 | },
2877 | "globals": {
2878 | "version": "13.15.0",
2879 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
2880 | "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
2881 | "dev": true,
2882 | "peer": true,
2883 | "requires": {
2884 | "type-fest": "^0.20.2"
2885 | }
2886 | },
2887 | "globby": {
2888 | "version": "11.1.0",
2889 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
2890 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
2891 | "dev": true,
2892 | "requires": {
2893 | "array-union": "^2.1.0",
2894 | "dir-glob": "^3.0.1",
2895 | "fast-glob": "^3.2.9",
2896 | "ignore": "^5.2.0",
2897 | "merge2": "^1.4.1",
2898 | "slash": "^3.0.0"
2899 | }
2900 | },
2901 | "has-flag": {
2902 | "version": "4.0.0",
2903 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2904 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2905 | "dev": true,
2906 | "peer": true
2907 | },
2908 | "ignore": {
2909 | "version": "5.2.0",
2910 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
2911 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
2912 | "dev": true
2913 | },
2914 | "import-fresh": {
2915 | "version": "3.3.0",
2916 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
2917 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
2918 | "dev": true,
2919 | "peer": true,
2920 | "requires": {
2921 | "parent-module": "^1.0.0",
2922 | "resolve-from": "^4.0.0"
2923 | }
2924 | },
2925 | "imurmurhash": {
2926 | "version": "0.1.4",
2927 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2928 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2929 | "dev": true,
2930 | "peer": true
2931 | },
2932 | "inflight": {
2933 | "version": "1.0.6",
2934 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2935 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2936 | "dev": true,
2937 | "peer": true,
2938 | "requires": {
2939 | "once": "^1.3.0",
2940 | "wrappy": "1"
2941 | }
2942 | },
2943 | "inherits": {
2944 | "version": "2.0.4",
2945 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
2946 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2947 | "dev": true,
2948 | "peer": true
2949 | },
2950 | "is-extglob": {
2951 | "version": "2.1.1",
2952 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2953 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
2954 | "dev": true
2955 | },
2956 | "is-glob": {
2957 | "version": "4.0.3",
2958 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
2959 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
2960 | "dev": true,
2961 | "requires": {
2962 | "is-extglob": "^2.1.1"
2963 | }
2964 | },
2965 | "is-number": {
2966 | "version": "7.0.0",
2967 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
2968 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
2969 | "dev": true
2970 | },
2971 | "isexe": {
2972 | "version": "2.0.0",
2973 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2974 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2975 | "dev": true,
2976 | "peer": true
2977 | },
2978 | "js-yaml": {
2979 | "version": "4.1.0",
2980 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2981 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2982 | "dev": true,
2983 | "peer": true,
2984 | "requires": {
2985 | "argparse": "^2.0.1"
2986 | }
2987 | },
2988 | "json-schema-traverse": {
2989 | "version": "0.4.1",
2990 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2991 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2992 | "dev": true,
2993 | "peer": true
2994 | },
2995 | "json-stable-stringify-without-jsonify": {
2996 | "version": "1.0.1",
2997 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2998 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
2999 | "dev": true,
3000 | "peer": true
3001 | },
3002 | "levn": {
3003 | "version": "0.4.1",
3004 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
3005 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
3006 | "dev": true,
3007 | "peer": true,
3008 | "requires": {
3009 | "prelude-ls": "^1.2.1",
3010 | "type-check": "~0.4.0"
3011 | }
3012 | },
3013 | "lodash.merge": {
3014 | "version": "4.6.2",
3015 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
3016 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
3017 | "dev": true,
3018 | "peer": true
3019 | },
3020 | "lru-cache": {
3021 | "version": "6.0.0",
3022 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
3023 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
3024 | "dev": true,
3025 | "requires": {
3026 | "yallist": "^4.0.0"
3027 | }
3028 | },
3029 | "merge2": {
3030 | "version": "1.4.1",
3031 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
3032 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
3033 | "dev": true
3034 | },
3035 | "micromatch": {
3036 | "version": "4.0.8",
3037 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
3038 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
3039 | "dev": true,
3040 | "requires": {
3041 | "braces": "^3.0.3",
3042 | "picomatch": "^2.3.1"
3043 | }
3044 | },
3045 | "mime-db": {
3046 | "version": "1.52.0",
3047 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
3048 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
3049 | },
3050 | "mime-types": {
3051 | "version": "2.1.35",
3052 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
3053 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
3054 | "requires": {
3055 | "mime-db": "1.52.0"
3056 | }
3057 | },
3058 | "minimatch": {
3059 | "version": "3.1.2",
3060 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
3061 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
3062 | "dev": true,
3063 | "peer": true,
3064 | "requires": {
3065 | "brace-expansion": "^1.1.7"
3066 | }
3067 | },
3068 | "moment": {
3069 | "version": "2.29.4",
3070 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
3071 | "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
3072 | "dev": true
3073 | },
3074 | "ms": {
3075 | "version": "2.1.2",
3076 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
3077 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
3078 | "dev": true
3079 | },
3080 | "natural-compare": {
3081 | "version": "1.4.0",
3082 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
3083 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
3084 | "dev": true,
3085 | "peer": true
3086 | },
3087 | "obsidian": {
3088 | "version": "1.4.11",
3089 | "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.4.11.tgz",
3090 | "integrity": "sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==",
3091 | "dev": true,
3092 | "requires": {
3093 | "@types/codemirror": "5.60.8",
3094 | "moment": "2.29.4"
3095 | }
3096 | },
3097 | "once": {
3098 | "version": "1.4.0",
3099 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
3100 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
3101 | "dev": true,
3102 | "peer": true,
3103 | "requires": {
3104 | "wrappy": "1"
3105 | }
3106 | },
3107 | "optionator": {
3108 | "version": "0.9.1",
3109 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
3110 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
3111 | "dev": true,
3112 | "peer": true,
3113 | "requires": {
3114 | "deep-is": "^0.1.3",
3115 | "fast-levenshtein": "^2.0.6",
3116 | "levn": "^0.4.1",
3117 | "prelude-ls": "^1.2.1",
3118 | "type-check": "^0.4.0",
3119 | "word-wrap": "^1.2.3"
3120 | }
3121 | },
3122 | "parent-module": {
3123 | "version": "1.0.1",
3124 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
3125 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
3126 | "dev": true,
3127 | "peer": true,
3128 | "requires": {
3129 | "callsites": "^3.0.0"
3130 | }
3131 | },
3132 | "path-is-absolute": {
3133 | "version": "1.0.1",
3134 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3135 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
3136 | "dev": true,
3137 | "peer": true
3138 | },
3139 | "path-key": {
3140 | "version": "3.1.1",
3141 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
3142 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
3143 | "dev": true,
3144 | "peer": true
3145 | },
3146 | "path-type": {
3147 | "version": "4.0.0",
3148 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
3149 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
3150 | "dev": true
3151 | },
3152 | "picomatch": {
3153 | "version": "2.3.1",
3154 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
3155 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
3156 | "dev": true
3157 | },
3158 | "prelude-ls": {
3159 | "version": "1.2.1",
3160 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
3161 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
3162 | "dev": true,
3163 | "peer": true
3164 | },
3165 | "punycode": {
3166 | "version": "2.1.1",
3167 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
3168 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
3169 | "dev": true,
3170 | "peer": true
3171 | },
3172 | "queue-microtask": {
3173 | "version": "1.2.3",
3174 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
3175 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
3176 | "dev": true
3177 | },
3178 | "regexpp": {
3179 | "version": "3.2.0",
3180 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
3181 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
3182 | "dev": true
3183 | },
3184 | "resolve-from": {
3185 | "version": "4.0.0",
3186 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
3187 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
3188 | "dev": true,
3189 | "peer": true
3190 | },
3191 | "reusify": {
3192 | "version": "1.0.4",
3193 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
3194 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
3195 | "dev": true
3196 | },
3197 | "rimraf": {
3198 | "version": "3.0.2",
3199 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
3200 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
3201 | "dev": true,
3202 | "peer": true,
3203 | "requires": {
3204 | "glob": "^7.1.3"
3205 | }
3206 | },
3207 | "run-parallel": {
3208 | "version": "1.2.0",
3209 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
3210 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
3211 | "dev": true,
3212 | "requires": {
3213 | "queue-microtask": "^1.2.2"
3214 | }
3215 | },
3216 | "semver": {
3217 | "version": "7.5.4",
3218 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
3219 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
3220 | "dev": true,
3221 | "requires": {
3222 | "lru-cache": "^6.0.0"
3223 | }
3224 | },
3225 | "shebang-command": {
3226 | "version": "2.0.0",
3227 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
3228 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
3229 | "dev": true,
3230 | "peer": true,
3231 | "requires": {
3232 | "shebang-regex": "^3.0.0"
3233 | }
3234 | },
3235 | "shebang-regex": {
3236 | "version": "3.0.0",
3237 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
3238 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
3239 | "dev": true,
3240 | "peer": true
3241 | },
3242 | "slash": {
3243 | "version": "3.0.0",
3244 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
3245 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
3246 | "dev": true
3247 | },
3248 | "strip-ansi": {
3249 | "version": "6.0.1",
3250 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3251 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3252 | "dev": true,
3253 | "peer": true,
3254 | "requires": {
3255 | "ansi-regex": "^5.0.1"
3256 | }
3257 | },
3258 | "strip-json-comments": {
3259 | "version": "3.1.1",
3260 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
3261 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
3262 | "dev": true,
3263 | "peer": true
3264 | },
3265 | "style-mod": {
3266 | "version": "4.1.0",
3267 | "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz",
3268 | "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==",
3269 | "dev": true,
3270 | "peer": true
3271 | },
3272 | "supports-color": {
3273 | "version": "7.2.0",
3274 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
3275 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
3276 | "dev": true,
3277 | "peer": true,
3278 | "requires": {
3279 | "has-flag": "^4.0.0"
3280 | }
3281 | },
3282 | "text-table": {
3283 | "version": "0.2.0",
3284 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
3285 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
3286 | "dev": true,
3287 | "peer": true
3288 | },
3289 | "to-regex-range": {
3290 | "version": "5.0.1",
3291 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
3292 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
3293 | "dev": true,
3294 | "requires": {
3295 | "is-number": "^7.0.0"
3296 | }
3297 | },
3298 | "tslib": {
3299 | "version": "2.3.1",
3300 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
3301 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
3302 | "dev": true
3303 | },
3304 | "tsutils": {
3305 | "version": "3.21.0",
3306 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
3307 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
3308 | "dev": true,
3309 | "requires": {
3310 | "tslib": "^1.8.1"
3311 | },
3312 | "dependencies": {
3313 | "tslib": {
3314 | "version": "1.14.1",
3315 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
3316 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
3317 | "dev": true
3318 | }
3319 | }
3320 | },
3321 | "type-check": {
3322 | "version": "0.4.0",
3323 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
3324 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
3325 | "dev": true,
3326 | "peer": true,
3327 | "requires": {
3328 | "prelude-ls": "^1.2.1"
3329 | }
3330 | },
3331 | "type-fest": {
3332 | "version": "0.20.2",
3333 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
3334 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
3335 | "dev": true,
3336 | "peer": true
3337 | },
3338 | "typescript": {
3339 | "version": "4.4.4",
3340 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
3341 | "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
3342 | "dev": true
3343 | },
3344 | "uri-js": {
3345 | "version": "4.4.1",
3346 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
3347 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
3348 | "dev": true,
3349 | "peer": true,
3350 | "requires": {
3351 | "punycode": "^2.1.0"
3352 | }
3353 | },
3354 | "v8-compile-cache": {
3355 | "version": "2.3.0",
3356 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
3357 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
3358 | "dev": true,
3359 | "peer": true
3360 | },
3361 | "w3c-keyname": {
3362 | "version": "2.2.8",
3363 | "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
3364 | "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
3365 | "dev": true,
3366 | "peer": true
3367 | },
3368 | "which": {
3369 | "version": "2.0.2",
3370 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3371 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3372 | "dev": true,
3373 | "peer": true,
3374 | "requires": {
3375 | "isexe": "^2.0.0"
3376 | }
3377 | },
3378 | "word-wrap": {
3379 | "version": "1.2.5",
3380 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
3381 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
3382 | "dev": true,
3383 | "peer": true
3384 | },
3385 | "wrappy": {
3386 | "version": "1.0.2",
3387 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3388 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3389 | "dev": true,
3390 | "peer": true
3391 | },
3392 | "yallist": {
3393 | "version": "4.0.0",
3394 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
3395 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
3396 | "dev": true
3397 | }
3398 | }
3399 | }
3400 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "obsidian-thumbnails",
3 | "version": "1.0.4",
4 | "description": "This plugin can insert youtube thumbnails and titles into your notes",
5 | "main": "main.js",
6 | "scripts": {
7 | "dev": "node esbuild.config.mjs",
8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
9 | "version": "node version-bump.mjs && git add manifest.json versions.json"
10 | },
11 | "keywords": [],
12 | "author": "",
13 | "license": "MIT",
14 | "devDependencies": {
15 | "@types/node": "^16.11.6",
16 | "@typescript-eslint/eslint-plugin": "^5.2.0",
17 | "@typescript-eslint/parser": "^5.2.0",
18 | "builtin-modules": "^3.2.0",
19 | "esbuild": "0.13.12",
20 | "obsidian": "latest",
21 | "tslib": "2.3.1",
22 | "typescript": "4.4.4"
23 | },
24 | "dependencies": {
25 | "axios": "^0.27.2",
26 | "dotenv": "^16.0.1"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/settings.ts:
--------------------------------------------------------------------------------
1 | import ThumbyPlugin from "main";
2 | import { App, PluginSettingTab, Setting } from "obsidian";
3 |
4 | export default class ThumbySettingTab extends PluginSettingTab {
5 | plugin: ThumbyPlugin;
6 |
7 | constructor(app: App, plugin: ThumbyPlugin) {
8 | super(app, plugin);
9 | this.plugin = plugin;
10 | }
11 |
12 | display(): void {
13 | const { containerEl } = this;
14 |
15 | containerEl.empty();
16 | containerEl.createEl('h2', { text: 'Thumbnails Settings' });
17 |
18 | console.log(this.plugin.settings);
19 |
20 | // Store data locally (default: off)
21 | // - Save images (default: on)
22 | // - Image location (default: attachment_location/specified_folder)
23 | // - Attachment point info (if attachment_location)
24 | // - Folder path (if specified_folder)
25 |
26 | new Setting(containerEl)
27 | .setName('Save Thumbnail Info')
28 | .setDesc('Save thumbnail information inside your note, so they work offline')
29 | .addToggle((toggle) =>
30 | toggle
31 | .setValue(this.plugin.settings.storeInfo)
32 | .onChange(async (value) => {
33 | this.plugin.settings.storeInfo = value;
34 | await this.plugin.saveSettings();
35 | this.display();
36 | })
37 | );
38 |
39 | if(this.plugin.settings.storeInfo){
40 | new Setting(containerEl)
41 | .setName('Save Images')
42 | .setDesc('Save thumbnail images locally in vault')
43 | .addToggle((toggle) =>
44 | toggle
45 | .setValue(this.plugin.settings.saveImages)
46 | .onChange(async (value) => {
47 | this.plugin.settings.saveImages = value;
48 | await this.plugin.saveSettings();
49 | this.display();
50 | })
51 | );
52 | if(this.plugin.settings.saveImages){
53 | new Setting(containerEl)
54 | .setName('Image Location')
55 | .setDesc('Where thumbnail images should be saved')
56 | .addDropdown((dropdown) =>
57 | dropdown
58 | .addOption('defaultAttachment', 'Default attachment location')
59 | .addOption('specifiedFolder', 'In the folder specified below')
60 | .setValue(this.plugin.settings.imageLocation)
61 | .onChange(async (value) => {
62 | this.plugin.settings.imageLocation = value;
63 | this.display();
64 | await this.plugin.saveSettings();
65 | })
66 | );
67 | if (this.plugin.settings.imageLocation === 'defaultAttachment'){
68 | //@ts-ignore
69 | const attachmentLocation = this.app.vault.getConfig('attachmentFolderPath');
70 | new Setting(containerEl)
71 | .setName('Default attachment location')
72 | .setDesc('Options > Files & Links > Default location for new attachments')
73 | .addText((text) =>
74 | text
75 | .setValue(attachmentLocation)
76 | .setDisabled(true)
77 | )
78 | .setClass('default-attachment-info')
79 | }
80 | else if (this.plugin.settings.imageLocation === 'specifiedFolder') {
81 | new Setting(containerEl)
82 | .setName('Image Folder')
83 | .setDesc('The folder where thumbnail images should be saved')
84 | .addText((text) =>
85 | text
86 | .setPlaceholder('ex: Files/Thumbnails')
87 | .setValue(this.plugin.settings.imageFolder)
88 | .onChange(async (value) => {
89 | this.plugin.settings.imageFolder = value;
90 | await this.plugin.saveSettings();
91 | })
92 | );
93 | }
94 | }
95 | }
96 | new Setting(containerEl)
97 | .setName('Responsive Mobile-Style Thumbnails')
98 | .setDesc('Switch to mobile-style thumbnails on narrow screens (title below the image)')
99 | .addToggle((toggle) =>
100 | toggle
101 | .setValue(this.plugin.settings.responsiveCardStyle)
102 | .onChange(async (value) => {
103 | this.plugin.settings.responsiveCardStyle = value;
104 | await this.plugin.saveSettings();
105 | this.display();
106 | })
107 | );
108 | new Setting(containerEl)
109 | .setName('YouTube API Key (optional)')
110 | .setDesc('An API Key for the YouTube Data API')
111 | .addExtraButton((btn) =>
112 | btn
113 | .setIcon('info')
114 | //@ts-ignore
115 | .setTooltip('A few videos have been discovered that can\'t be found the normal way. If you provide an API key for the YouTube Data API, this plugin will use the API as a backup.', {placement: 'top'})
116 | .setDisabled(true)
117 | )
118 | .addText((text) =>
119 | text
120 | .setValue(this.plugin.settings.youtubeApiKey)
121 | .onChange(async (value) => {
122 | this.plugin.settings.youtubeApiKey = value;
123 | await this.plugin.saveSettings();
124 | })
125 | );
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/styles.css:
--------------------------------------------------------------------------------
1 | .block-language-vid{
2 | position: relative;
3 | /* display: block; */
4 | --corner-radius: 8px;
5 | }
6 |
7 | .block-language-vid~.edit-block-button{
8 | z-index: 10;
9 | }
10 |
11 | .block-language-vid>a.thumbnail{
12 | display: flex;
13 | flex-direction: row;
14 | color: var(--text-default);
15 | text-decoration: none;
16 | margin: 10px 0;
17 | max-width: 400px;
18 | width: 100%;
19 | /* border-radius: var(--corner-radius); */
20 | /* overflow: hidden; */
21 | box-shadow: none;
22 | }
23 |
24 | .block-language-vid .thumbnail-text{
25 | /* Negative left margin so that the hover color extends under image's rounded corners */
26 | padding: 0 16px;
27 | margin-left: -8px;
28 | flex-grow: 1;
29 | flex-shrink: 1;
30 | line-height: 1.3;
31 | border-radius: 0 var(--corner-radius) var(--corner-radius) 0;
32 | transition: background 0.3s;
33 | z-index: 1;
34 | }
35 |
36 | /* .block-language-vid>a:hover{
37 | box-shadow: 0 .2rem .5rem var(--background-modifier-box-shadow);
38 | } */
39 |
40 | .block-language-vid>a.thumbnail:hover .thumbnail-text{
41 | background: var(--background-primary-alt);
42 | }
43 |
44 | .block-language-vid .thumbnail-title{
45 | position: relative;
46 | display: -webkit-box;
47 | -webkit-box-orient: vertical;
48 | -webkit-line-clamp: 2;
49 | overflow: hidden;
50 | }
51 |
52 | .block-language-vid .thumbnail-img-container{
53 | position: relative;
54 | margin: 0;
55 | padding: 0;
56 | width: 150px;
57 | flex-shrink: 0;
58 | flex-grow: 0;
59 |
60 | .thumbnail-img{
61 | display: block;
62 | object-fit: contain;
63 | border-radius: var(--corner-radius);
64 | position: relative;
65 | z-index: 2;
66 | }
67 |
68 | .img-icons-container{
69 | display: flex;
70 | position: absolute;
71 | bottom: 4px;
72 | left: 4px;
73 | height: 18px;
74 | width: 100%;
75 | flex-direction: row;
76 | align-items: center;
77 | justify-content: stretch;
78 | z-index: 3;
79 | gap: 4px;
80 |
81 | .thumbnail-playlist-svg{
82 | height: 100%;
83 | background: rgba(0, 0, 0, 0.6);
84 | border-radius: 4px;
85 | padding: 1px;
86 | }
87 |
88 | .timestamp{
89 | font-size: calc(var(--font-text-size) - 5px);
90 | display: block;
91 | padding: 0 5px 0 5px;
92 | background: rgba(0, 0, 0, 0.6);
93 | border-radius: 4px;
94 | }
95 | }
96 | }
97 |
98 |
99 | .block-language-vid .thumbnail-author{
100 | display: block;
101 | color: var(--text-faint);
102 | font-size: calc(var(--font-text-size) - 3px);
103 | width: fit-content;
104 | margin-top: 3px;
105 | text-decoration: none;
106 | transition: color 0.1s;
107 | }
108 |
109 | .block-language-vid .thumbnail-author:hover{
110 | color: var(--text-muted);
111 | }
112 |
113 |
114 | .block-language-vid .thumbnail-error{
115 | color: var(--text-error);
116 | }
117 |
118 | .block-language-vid .dummy-container{
119 | position: relative;
120 | height: 84.34px;
121 | width: 400px;
122 | /* background: var(--background-primary-alt); */
123 | /* background: linear-gradient(-80deg, var(--background-primary-alt) 45%, rgba(125, 125, 125, 0.2) 50%, var(--background-primary-alt) 55%); */
124 | background: linear-gradient(-80deg, rgba(125, 125, 125, 0.05) 45%, rgba(125, 125, 125, 0.2) 50%, rgba(125, 125, 125, 0.05) 55%);
125 | animation: gradient 2s linear infinite;
126 | background-size: 400% 400%;
127 | margin: 10px 0;
128 | opacity: 1;
129 | /* transition: opacity 1s linear;
130 | &.hidden{
131 | position: absolute;
132 | opacity: 0;
133 | } */
134 | }
135 |
136 | @keyframes gradient {
137 | 0% {
138 | background-position: 100% 50%;
139 | }
140 |
141 | 60% {
142 | background-position: 0% 50%;
143 | }
144 |
145 | 100% {
146 | background-position: 0% 50%;
147 | }
148 | }
149 |
150 | .block-language-vid .dummy-image{
151 | height: 100%;
152 | width: 150px;
153 | background: rgba(125, 125, 125, 0.2);
154 | }
155 |
156 | .block-language-vid .dummy-title{
157 | position: absolute;
158 | left: 160px;
159 | top: 6px;
160 | height: 20px;
161 | width: calc(100% - 170px);
162 | background: rgba(125, 125, 125, 0.2);
163 | }
164 |
165 | .mod-settings .setting-item.default-attachment-info{
166 | border: none;
167 | padding-top: 0;
168 | }
169 |
170 | .mod-settings .setting-item.default-attachment-info input{
171 | color: var(--text-muted);
172 | }
173 |
174 | .mod-settings .setting-item.default-attachment-info .setting-item-description{
175 | font-style: italic;
176 | }
177 |
178 | /**** SUPPORT FOR CARD-STYLE THUMBNAILS ****/
179 | .kanban-plugin__item-title .block-language-vid,
180 | :not(.kanban-plugin__item-title) .block-language-vid.thumbnail-card-style{
181 | &>a.thumbnail{
182 | /* margin: auto; */
183 | position: relative;
184 | flex-direction: column;
185 | max-width: 190px;
186 | }
187 | .thumbnail-img-container{
188 | width: 100%;
189 | }
190 | .thumbnail-text{
191 | padding: 12px 2px 2px 2px;
192 | margin: -8px 0px;
193 | border-radius: 0 0 var(--corner-radius) var(--corner-radius);
194 | }
195 | }
196 |
197 | /* :not(.kanban-plugin__item-title) .block-language-vid.thumbnail-card-style {
198 | &>a.thumbnail {
199 | margin: auto;
200 | flex-direction: column;
201 | max-width: 250px;
202 | }
203 |
204 | .thumbnail-img {
205 | width: 100%;
206 | }
207 |
208 | .thumbnail-text {
209 | padding: 16px 2px;
210 | margin: -8px 0px;
211 | }
212 | } */
213 |
--------------------------------------------------------------------------------
/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 | "lib": [
14 | "DOM",
15 | "ES5",
16 | "ES6",
17 | "ES7"
18 | ]
19 | },
20 | "include": [
21 | "**/*.ts"
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/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.14.0",
3 | "1.0.1": "0.14.0",
4 | "1.0.3": "0.14.0",
5 | "1.0.4": "0.14.0",
6 | "1.1.0": "0.14.0",
7 | "1.1.1": "0.14.0",
8 | "1.2.0": "0.14.0",
9 | "1.2.1": "0.14.0",
10 | "1.2.2": "0.14.0",
11 | "1.2.3": "0.14.0",
12 | "1.2.4": "0.14.0",
13 | "1.2.5": "1.0.0",
14 | "1.2.6": "1.0.0",
15 | "1.2.7": "1.0.0",
16 | "1.2.8": "1.0.0",
17 | "1.3.0": "1.0.0",
18 | "1.3.1": "1.0.0"
19 | }
20 |
--------------------------------------------------------------------------------