Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Major updates to Obsidian Khoj plugin chat interface and editing features #1109

Open
wants to merge 79 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
f2d50c2
Add /research command to help message
hjamet Feb 10, 2025
e94bd11
Add chat mode selector with radio buttons in Obsidian interface
hjamet Feb 10, 2025
00586d1
Enhance chat mode selector with emoji labels and styling
hjamet Feb 10, 2025
b458c93
Implement chat mode command parsing and display logic
hjamet Feb 10, 2025
7972c7c
Add edit functionality to chat messages in Obsidian interface
hjamet Feb 10, 2025
253569a
Enhance chat action buttons with hover states and edit button visibility
hjamet Feb 10, 2025
793020d
Add agent selection and new chat functionality to Obsidian chat inter…
hjamet Feb 10, 2025
52816bb
Remove verbose console logging in Obsidian chat view
hjamet Feb 10, 2025
475bc85
Improve agent selection UI with hint and layout adjustments
hjamet Feb 10, 2025
e1bd629
Add file access mode toggle with open files context for chat
hjamet Feb 10, 2025
be036eb
Implement file edit confirmation UI and advanced edit mode for Obsidi…
hjamet Feb 10, 2025
b2f2a6d
Enhance chat view with command-to-emoji conversion and file edit impr…
hjamet Feb 10, 2025
fd3a375
Improve multiline text replacement in Obsidian chat file editing
hjamet Feb 10, 2025
e807e2d
Refine multiline text replacement with improved parsing and handling …
hjamet Feb 10, 2025
0b68149
Enhance file editing with improved edit instructions, status messages…
hjamet Feb 10, 2025
27365ad
Refactor file editing with simplified edit instructions and more robu…
hjamet Feb 10, 2025
9208887
Improve edit block parsing with more flexible regex and better handli…
hjamet Feb 10, 2025
e879ebf
Add styling and transformation for Khoj edit blocks in Obsidian chat
hjamet Feb 10, 2025
492faed
Refine Khoj edit block instructions and text replacement logic in Obs…
hjamet Feb 10, 2025
a276a63
Enhance Khoj edit block replacement with intelligent diff tracking an…
hjamet Feb 11, 2025
9fce56d
Improve line-by-line diff formatting and cleanup in Khoj edit block p…
hjamet Feb 11, 2025
650bcec
Add code block copy functionality in Obsidian chat view
hjamet Feb 11, 2025
6bfc7c9
Refactor Khoj edit block parsing and processing with JSON-based format
hjamet Feb 11, 2025
373429c
Enhance Khoj edit block UI and error handling in Obsidian interface
hjamet Feb 11, 2025
90f464d
Add JSON5 parsing support for more robust Khoj edit block processing
hjamet Feb 11, 2025
3d316ff
Optimize Khoj edit block text removal and line cleanup logic
hjamet Feb 11, 2025
6aafea1
Improve JSON parsing and line handling in Khoj edit block processing
hjamet Feb 11, 2025
1477ecd
Merge branch 'khoj-ai:master' into master
hjamet Feb 11, 2025
a6d2726
Update TypeScript configuration and import for JSON5 in Obsidian inte…
hjamet Feb 11, 2025
2af49c5
Merge branch 'master' of github.com:hjamet/khoj
hjamet Feb 11, 2025
e438764
Chore: Minor configuration file updates
hjamet Feb 11, 2025
0fbae78
Feature: Add toggle for automatic voice response in Obsidian plugin
hjamet Feb 12, 2025
e32b764
Enhance file edit processing to preserve frontmatter in Obsidian plugin
hjamet Feb 12, 2025
ec92d14
Enhance edit block processing with robust error handling and retry me…
hjamet Feb 12, 2025
f612fb6
Add keyboard shortcuts and UI enhancements for edit block interactions
hjamet Feb 12, 2025
0827dd5
Improve frontmatter removal in targeted edit block processing
hjamet Feb 12, 2025
1927d33
Refactor edit block retry mechanism with improved error handling and …
hjamet Feb 13, 2025
3caece9
Enhance edit block validation and error handling in Obsidian plugin
hjamet Feb 13, 2025
878fcbc
Add retry badge and enhanced error handling for edit block processing
hjamet Feb 13, 2025
2954e82
Modify keyboard shortcuts and remove keyboard hint styling
hjamet Feb 13, 2025
8c5c122
Merge branch 'khoj-ai:master' into master
hjamet Feb 15, 2025
73955f7
Merge branch 'khoj-ai:master' into master
hjamet Feb 26, 2025
4e1ebd8
Refactor file interactions into a separate module for Obsidian plugin
hjamet Mar 3, 2025
fbc3f63
Replace khoj-edit code blocks with XML tags for more reliable parsing
hjamet Mar 3, 2025
2978b54
Improve message editing and deletion in Obsidian chat view
hjamet Mar 3, 2025
c1955ed
Update chat action button hover styles in Obsidian theme
hjamet Mar 3, 2025
5b94d4a
Refactor Obsidian chat interface with header-level new chat and agent…
hjamet Mar 3, 2025
64b85e3
Add global hotkeys and improve chat view navigation in Obsidian plugin
hjamet Mar 3, 2025
a39ab9a
Add keybindings and commands for chat view navigation in Obsidian plugin
hjamet Mar 3, 2025
bd4f573
Enhance Obsidian chat UI with refined styling and smoother interactions
hjamet Mar 5, 2025
b2ed65a
Refactor Obsidian chat UI styles for improved responsiveness and mobi…
hjamet Mar 5, 2025
cd4de85
Refine Obsidian chat UI styles with subtle visual improvements
hjamet Mar 5, 2025
62f81ea
Enhance chat input styling and interaction in Obsidian plugin
hjamet Mar 5, 2025
fe42397
Modernize Obsidian plugin header and navigation styles
hjamet Mar 5, 2025
7262d11
Add mode dropdown for chat input with keyboard navigation
hjamet Mar 5, 2025
6f21860
Merge branch 'khoj-ai:master' into master
hjamet Mar 12, 2025
71eda25
Merge branch 'khoj-ai:master' into master
hjamet Mar 13, 2025
8252da6
Enhance khoj-edit block handling by adding support for partial edits …
hjamet Mar 13, 2025
c3fba30
Add Similar Documents View and enhance formatting handling
hjamet Mar 17, 2025
54ab9be
Mise à jour de l'interface utilisateur : amélioration de la gestion d…
hjamet Mar 17, 2025
abb7c74
Refactor khoj-edit block handling and update UI styles
hjamet Mar 17, 2025
5549628
Update UI styles and icons in Similar Documents view
hjamet Mar 17, 2025
7ab3bf2
Enhance Similar Documents view with new styles and loading indicators
hjamet Mar 17, 2025
6bd5e8d
Refactor button styles in Similar Documents view
hjamet Mar 17, 2025
c29e087
Refactor chat input styles and auto-resize functionality
hjamet Mar 17, 2025
0713b8d
Enhance khoj-edit block handling to support partial edits and improve…
hjamet Mar 17, 2025
9259d28
Refactor khoj-edit block validation and application process
hjamet Mar 17, 2025
e7d1d26
Refactor chat view and styles for improved streaming experience
hjamet Mar 17, 2025
228edcc
Update CSS styles for khoj-retry-container and khoj-retry-badge to en…
hjamet Mar 17, 2025
e154ab6
Merge branch 'khoj-ai:master' into master
hjamet Mar 17, 2025
8555d30
Refactor chat view and styles for improved user experience
hjamet Mar 22, 2025
967a4c3
Enhance chat view sanitization and error handling
hjamet Mar 22, 2025
7b52bf9
Remove event listener for "New Chat" button in chat view header
hjamet Mar 22, 2025
7e2b22d
Refactor CSS styles and chat view structure for improved layout
hjamet Mar 22, 2025
fca0cd1
Update starting message in chat view for clarity
hjamet Mar 22, 2025
0393485
Enhance chat view dropdown functionality and input handling
hjamet Mar 22, 2025
b20e092
Merge branch 'khoj-ai:master' into master
hjamet Mar 22, 2025
700e5f8
Refactor chat view and styles to use icons instead of emojis
hjamet Mar 22, 2025
06579e6
Merge branch 'khoj-ai:master' into master
hjamet Mar 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add JSON5 parsing support for more robust Khoj edit block processing
hjamet committed Feb 11, 2025
commit 90f464d05a8e2eed73ea727a2937b373c7f22303
3 changes: 2 additions & 1 deletion src/interface/obsidian/package.json
Original file line number Diff line number Diff line change
@@ -29,6 +29,7 @@
"typescript": "4.7.4"
},
"dependencies": {
"dompurify": "^3.1.4"
"dompurify": "^3.1.4",
"json5": "^2.2.3"
}
}
187 changes: 78 additions & 109 deletions src/interface/obsidian/src/chat_view.ts
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import { KhojSetting } from 'src/settings';
import { KhojPaneView } from 'src/pane_view';
import { KhojView, createCopyParentText, getLinkToEntry, pasteTextAtCursor } from 'src/utils';
import { KhojSearchModal } from './search_modal';
import JSON5 from 'json5';

export interface ChatJsonResult {
image?: string;
@@ -1968,10 +1969,12 @@ export class KhojChatView extends KhojPaneView {
"start": "<start words>",
"end": "<end words>"
},
"content": "<complete new content>"
"content": "<complete new content, including end marker if you want to keep it>"
}
\`\`\`
⚠️ Important: The end marker text is included in the edited section and will be deleted. If you want to keep it, make sure to include it in your "content".
📝 Example note:
\`\`\`
@@ -1990,7 +1993,7 @@ Next steps:
Examples of targeted edits:
1. Using just a few words to identify long text:
1. Using just a few words to identify long text (notice how "campaign launch" is kept in content):
\`\`\`khoj-edit
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, simple protocol! Did you use some existing research / product to come up with this specification, or did you determine this format yourself?

I have reservations about using references from the text itself to choose the delimiters of the edit, since phrases can be repeated multiple times throughout a text. However, LLMs wouldn't be good enough yet at counting to choose the character positions, for instance. I can look into this a bit further, but this is probably good for a v0.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, it is not perfect, but I have used it for the past two weeks and I have never had a problem to be honest :) Originally, I was using regex for more targeting and bulk modifications, but only Claude managed to make something out of it... once every two times. So I switched to this simpler version :) But in any case, only the first identified and modified element (which prevents accidentally modifying other open files that we might not have in view: it limits the damage ^^)

Once again, I plan to slightly modify this format for XML (because currently, it is impossible to correctly parse Khoj's response when its khoj-edit block itself contains a code block!)

"note": "Add deadline and specificity to the marketing team follow-up",
@@ -2040,9 +2043,8 @@ Examples of targeted edits:
- note: Brief one-line explanation of what the edit does
- location.start: few words from start of target text (no ambiguity). Can use <file-start> marker to target file beginning
- location.end: few words from end of target text (no ambiguity). Can use <file-end> marker to target file end
- content: complete new content
- content: complete new content, including end marker text if you want to keep it
- Words must uniquely identify the location (no ambiguity)
- Use \\n for line breaks
- Changes apply to first matching location
[END OF EDIT INSTRUCTIONS]\n\n`;
@@ -2075,76 +2077,78 @@ Examples of targeted edits:
return openFilesContent;
}

// Add these new methods
private sanitizeJsonContent(content: string): string {
// Replace literal newlines with \n
return content.replace(/\n/g, '\\n')
// Escape other special characters
.replace(/[\b\f\r\t\v]/g, '')
// Handle unicode characters
.replace(/[\u0000-\u0019]+/g, '');
// Common method to parse a khoj-edit block
private parseKhojEditBlock(content: string): {
editData: any,
cleanContent: string,
error?: Error
} {
let cleanContent = '';
try {
// Normalize line breaks and clean control characters
cleanContent = content
.replace(/\r\n/g, '\n')
.replace(/\r/g, '\n')
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '')
.trim();

// Escape newlines in strings
const escapeNewlinesInStrings = (str: string): string => {
return str.replace(/"(?:\\.|[^"\\])*"/g, (match) => {
return match.replace(/\n/g, '\\n');
});
};
const safeContent = escapeNewlinesInStrings(cleanContent);

// Use JSON5 for tolerant parsing
const editData = JSON5.parse(safeContent);

// Validate required fields
if (!editData.note || !editData.location?.start || !editData.location?.end || !editData.content) {
throw new Error("Missing required fields in edit block");
}

return { editData, cleanContent };
} catch (e) {
console.error("Failed to parse JSON:", e);
console.debug("Original content:", content);
console.debug("Cleaned content:", cleanContent);
return { editData: null, cleanContent: content, error: e as Error };
}
}

private parseEditBlocks(message: string): EditBlock[] {
const editBlocks: EditBlock[] = [];
// Use the same regex more tolerant than transformKhojEditBlocks
const editBlockRegex = /```khoj-edit\s*([\s\S]*?)```/g;
let hasError = false;

let match;
while ((match = editBlockRegex.exec(message)) !== null) {
try {
// Normalize and clean as in transformKhojEditBlocks
const cleanContent = match[1]
.replace(/\r\n/g, '\n')
.replace(/\r/g, '\n')
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '')
.trim();

// Rechercher le JSON valide dans le contenu
const jsonMatch = cleanContent.match(/(\{[\s\S]*\})/);
if (!jsonMatch) {
throw new Error("No valid JSON object found in edit block");
}
const { editData, cleanContent, error } = this.parseKhojEditBlock(match[1]);

// Parser le JSON
const editBlock = JSON.parse(jsonMatch[1]);

// Validate required fields
if (!editBlock.note || !editBlock.location?.start || !editBlock.location?.end || !editBlock.content) {
console.error("Invalid edit block format:", editBlock);
hasError = true;
editBlocks.push({
note: "Error: Missing required fields",
before: "",
after: "",
replacement: `Invalid edit block format. Required fields missing.\nOriginal content:\n${jsonMatch[1]}`
});
continue;
}

editBlocks.push({
note: editBlock.note,
before: editBlock.location.start,
after: editBlock.location.end,
replacement: editBlock.content
});
} catch (e) {
console.error("Failed to parse edit block:", e);
console.debug("Content causing error:", match[1]); // Pour le debug
if (error) {
console.error("Failed to parse edit block:", error);
console.debug("Content causing error:", match[1]);
hasError = true;
editBlocks.push({
note: "Error parsing edit block",
before: "",
after: "",
replacement: `Error: ${e.message}\nOriginal content:\n${match[1]}`
replacement: `Error: ${error.message}\nOriginal content:\n${match[1]}`
});
continue;
}

editBlocks.push({
note: editData.note,
before: editData.location.start,
after: editData.location.end,
replacement: editData.content
});
}

// Add hasError flag to the first block to signal error state
if (editBlocks.length > 0) {
editBlocks[0] = { ...editBlocks[0], hasError: hasError };
editBlocks[0] = { ...editBlocks[0], hasError };
}

return editBlocks;
@@ -2257,14 +2261,10 @@ Examples of targeted edits:
(newDiff ? formatLines(newDiff, '==') : '') +
commonSuffix;

// Add note if available
const note = block.note ? `\n💡 ${block.note}` : '';
const previewWithNote = formattedPreview + note;

plannedEdits.push({
startIndex,
endIndex,
preview: previewWithNote
preview: formattedPreview
});
hasChanges = true;
}
@@ -2412,59 +2412,21 @@ Examples of targeted edits:
// Add this new method to handle khoj-edit block transformation
private transformKhojEditBlocks(message: string): string {
return message.replace(/```khoj-edit\s*([\s\S]*?)```/g, (match, content) => {
try {
// Normalize line breaks and clean control characters more thoroughly
const cleanContent = content
.replace(/\r\n/g, '\n') // Normalize CRLF to LF
.replace(/\r/g, '\n') // Normalize remaining CR to LF
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') // Remove control chars except \n and \t
.trim(); // Remove leading/trailing whitespace

// Recherche du JSON valide dans le contenu
const jsonMatch = cleanContent.match(/(\{[\s\S]*\})/);
if (!jsonMatch) {
throw new Error("No valid JSON object found in edit block");
}
const { editData, cleanContent, error } = this.parseKhojEditBlock(content);

// Parse the JSON after cleaning
const editData = JSON.parse(jsonMatch[1]);
// Escape content for HTML display
const escapedContent = cleanContent
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;');

// Validate required fields
if (!editData.note || !editData.location?.start || !editData.location?.end || !editData.content) {
throw new Error("Missing required fields in edit block");
}
if (error) {
console.error("Error parsing khoj-edit block:", error);
console.debug("Content causing error:", content);

// Escape content for HTML display
const escapedContent = cleanContent
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;');

// Create a more informative title
const title = `${editData.note}`;

return `<details class="khoj-edit-accordion">
<summary>${title}</summary>
<div class="khoj-edit-content">
<pre><code class="language-khoj-edit">${escapedContent}</code></pre>
</div>
</details>`;
} catch (e) {
console.error("Error parsing khoj-edit block:", e);
console.debug("Content causing error:", content); // Pour le debug

// Escape the original content for safe display
const escapedContent = content
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;');

// Create a more detailed error message
const errorTitle = `Error: ${e.message}`;
const errorTitle = `Error: ${error.message}`;
const errorDetails = `Failed to parse edit block. Please check the JSON format and ensure all required fields are present.`;

return `<details class="khoj-edit-accordion error">
@@ -2475,6 +2437,13 @@ Examples of targeted edits:
</div>
</details>`;
}

return `<details class="khoj-edit-accordion">
<summary>${editData.note}</summary>
<div class="khoj-edit-content">
<pre><code class="language-khoj-edit">${escapedContent}</code></pre>
</div>
</details>`;
});
}
}
121 changes: 63 additions & 58 deletions src/interface/obsidian/yarn.lock
Original file line number Diff line number Diff line change
@@ -4,76 +4,76 @@

"@eslint-community/eslint-utils@^4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
dependencies:
eslint-visitor-keys "^3.3.0"

"@eslint-community/regexpp@^4.10.0":
version "4.11.0"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae"
resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz"
integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==

"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
dependencies:
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"

"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==

"@nodelib/fs.walk@^1.2.3":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
dependencies:
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"

"@types/codemirror@5.60.8":
version "5.60.8"
resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.8.tgz#b647d04b470e8e1836dd84b2879988fc55c9de68"
resolved "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz"
integrity sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==
dependencies:
"@types/tern" "*"

"@types/dompurify@^3.0.5":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-3.0.5.tgz#02069a2fcb89a163bacf1a788f73cb415dd75cb7"
resolved "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz"
integrity sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==
dependencies:
"@types/trusted-types" "*"

"@types/estree@*":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==

"@types/node@^16.11.6":
version "16.18.108"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.108.tgz#b794e2b2a85b4c12935ea7d0f18641be68b352f9"
resolved "https://registry.npmjs.org/@types/node/-/node-16.18.108.tgz"
integrity sha512-fj42LD82fSv6yN9C6Q4dzS+hujHj+pTv0IpRR3kI20fnYeS0ytBpjFO9OjmDowSPPt4lNKN46JLaKbCyP+BW2A==

"@types/tern@*":
version "0.23.9"
resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.9.tgz#6f6093a4a9af3e6bb8dde528e024924d196b367c"
resolved "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz"
integrity sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==
dependencies:
"@types/estree" "*"

"@types/trusted-types@*":
version "2.0.7"
resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11"
resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz"
integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==

"@typescript-eslint/eslint-plugin@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz#cdc521c8bca38b55585cf30db787fb2abad3f9fd"
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz"
integrity sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
@@ -88,7 +88,7 @@

"@typescript-eslint/parser@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.13.1.tgz#fac57811b3e519185f7259bac312291f7b9c4e72"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.1.tgz"
integrity sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==
dependencies:
"@typescript-eslint/scope-manager" "7.13.1"
@@ -99,15 +99,15 @@

"@typescript-eslint/scope-manager@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz#c08041206904bf36f0e6997efdb0ca775e0c452e"
resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz"
integrity sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==
dependencies:
"@typescript-eslint/types" "7.13.1"
"@typescript-eslint/visitor-keys" "7.13.1"

"@typescript-eslint/type-utils@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz#63bec3f1fb43cf0bc409cbdb88ef96d118ca8632"
resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz"
integrity sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==
dependencies:
"@typescript-eslint/typescript-estree" "7.13.1"
@@ -117,12 +117,12 @@

"@typescript-eslint/types@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.13.1.tgz#787db283bd0b58751094c90d5b58bbf5e9fc9bd8"
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.1.tgz"
integrity sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==

"@typescript-eslint/typescript-estree@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz#3412841b130e070db2f675e3d9b8cb1ae49e1c3f"
resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz"
integrity sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==
dependencies:
"@typescript-eslint/types" "7.13.1"
@@ -136,7 +136,7 @@

"@typescript-eslint/utils@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.13.1.tgz#611083379caa0d3a2c09d126c65065a3e4337ba2"
resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.1.tgz"
integrity sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
@@ -146,58 +146,58 @@

"@typescript-eslint/visitor-keys@7.13.1":
version "7.13.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz#9c229a795a919db61f2d7f2337ef584ac05fbe96"
resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz"
integrity sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==
dependencies:
"@typescript-eslint/types" "7.13.1"
eslint-visitor-keys "^3.4.3"

array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==

balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==

brace-expansion@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
dependencies:
balanced-match "^1.0.0"

braces@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.1.1"

builtin-modules@3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz"
integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==

debug@^4.3.4:
version "4.3.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz"
integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
dependencies:
ms "2.1.2"

dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
dependencies:
path-type "^4.0.0"

dompurify@^3.1.4:
version "3.1.6"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2"
resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz"
integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==

esbuild-android-64@0.14.47:
@@ -292,7 +292,7 @@ esbuild-windows-32@0.14.47:

esbuild-windows-64@0.14.47:
version "0.14.47"
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz#2564c3fcf0c23d701edb71af8c52d3be4cec5f8a"
resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz"
integrity sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==

esbuild-windows-arm64@0.14.47:
@@ -302,7 +302,7 @@ esbuild-windows-arm64@0.14.47:

esbuild@0.14.47:
version "0.14.47"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.47.tgz#0d6415f6bd8eb9e73a58f7f9ae04c5276cda0e4d"
resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz"
integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==
optionalDependencies:
esbuild-android-64 "0.14.47"
@@ -328,12 +328,12 @@ esbuild@0.14.47:

eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3:
version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==

fast-glob@^3.2.9:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
@@ -344,28 +344,28 @@ fast-glob@^3.2.9:

fastq@^1.6.0:
version "1.17.1"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz"
integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
dependencies:
reusify "^1.0.4"

fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
dependencies:
to-regex-range "^5.0.1"

glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"

globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
@@ -377,129 +377,134 @@ globby@^11.1.0:

graphemer@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==

ignore@^5.2.0, ignore@^5.3.1:
version "5.3.2"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==

is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==

is-glob@^4.0.1, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"

is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==

json5@^2.2.3:
version "2.2.3"
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==

merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==

micromatch@^4.0.4:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
dependencies:
braces "^3.0.3"
picomatch "^2.3.1"

minimatch@^9.0.4:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
dependencies:
brace-expansion "^2.0.1"

moment@2.29.4:
version "2.29.4"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz"
integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==

ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==

natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==

obsidian@^1.6.6:
version "1.6.6"
resolved "https://registry.yarnpkg.com/obsidian/-/obsidian-1.6.6.tgz#d45c4021c291765e1b77ed4a1c645e562ff6e77f"
resolved "https://registry.npmjs.org/obsidian/-/obsidian-1.6.6.tgz"
integrity sha512-GZHzeOiwmw/wBjB5JwrsxAZBLqxGQmqtEKSvJJvT0LtTcqeOFnV8jv0ZK5kO7hBb44WxJc+LdS7mZgLXbb+qXQ==
dependencies:
"@types/codemirror" "5.60.8"
moment "2.29.4"

path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==

picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==

queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==

reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==

run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
dependencies:
queue-microtask "^1.2.2"

semver@^7.6.0:
version "7.6.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz"
integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==

slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==

to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"

ts-api-utils@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz"
integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==

tslib@2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz"
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==

typescript@4.7.4:
version "4.7.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz"
integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==