obsidian-dev-utils 33.1.0 → 34.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,44 +5,179 @@ if you want to view the source, please visit the github repository of this plugi
5
5
 
6
6
  (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
- import { parse } from "shell-quote";
8
+ import { getFrontMatterInfo } from "obsidian";
9
9
  import { abortSignalNever } from "../AbortController.mjs";
10
- import { throwExpression } from "../Error.mjs";
11
- import { replaceAll } from "../String.mjs";
10
+ import {
11
+ hasSingleOccurrence,
12
+ indent,
13
+ replaceAll,
14
+ unindent
15
+ } from "../String.mjs";
12
16
  import { resolveValue } from "../ValueProvider.mjs";
13
17
  import { process } from "./Vault.mjs";
14
- function getCodeBlockArguments(ctx, el) {
15
- const sectionInfo = ctx.getSectionInfo(el);
16
- if (!sectionInfo) {
17
- return [];
18
+ async function getCodeBlockSectionInfo(options) {
19
+ const { app, ctx, el, source } = options;
20
+ const approximateSectionInfo = ctx.getSectionInfo(el) ?? await createApproximateSectionInfo(app, ctx);
21
+ const isInCallout = !!el.parentElement?.classList.contains("callout-content");
22
+ const language = getLanguageFromElement(el);
23
+ const sourceLines = source.split("\n");
24
+ const textLines = approximateSectionInfo.text.split("\n");
25
+ const potentialCodeBlockTextLines = textLines.map(
26
+ (line, index) => approximateSectionInfo.lineStart <= index && index <= approximateSectionInfo.lineEnd ? line : ""
27
+ );
28
+ const potentialCodeBlockText = potentialCodeBlockTextLines.join("\n");
29
+ const REG_EXP = /(?<=^|\n)(?<LinePrefix> {0,3}(?:> {1,3})*)(?<CodeBlockStartDelimiter>(?<CodeBlockStartDelimiterChar>[`~])(?:\k<CodeBlockStartDelimiterChar>{2,}))(?<CodeBlockLanguage>\S*)(?:[ \t]+(?<CodeBlockArgs>.*?)[ \t]+)?(?:\n(?<CodeBlockContent>(?:\n?\k<LinePrefix>.*)+?))?\n\k<LinePrefix>(?<CodeBlockEndDelimiter>\k<CodeBlockStartDelimiter>\k<CodeBlockStartDelimiterChar>*)[ \t]*(?:\n|$)/g;
30
+ let sectionInfo = null;
31
+ for (const match of potentialCodeBlockText.matchAll(REG_EXP)) {
32
+ if (!isSuitableCodeBlock(match, language, source, isInCallout)) {
33
+ continue;
34
+ }
35
+ if (sectionInfo) {
36
+ throw new Error("Multiple suitable code blocks found.");
37
+ }
38
+ sectionInfo = createSectionInfoFromMatch(potentialCodeBlockText, match, approximateSectionInfo, sourceLines);
18
39
  }
19
- const lines = sectionInfo.text.split("\n");
20
- const codeBlockHeader = lines[sectionInfo.lineStart] ?? throwExpression(new Error("Code block header not found"));
21
- const match = /^(?:`{3,}|~{3,})\S+\s+(?<Arguments>.*)$/.exec(codeBlockHeader);
22
- if (!match) {
23
- return [];
40
+ if (!sectionInfo) {
41
+ throw new Error("No suitable code block found.");
24
42
  }
25
- return parse(match.groups?.["Arguments"] ?? "").map(String);
43
+ return sectionInfo;
44
+ }
45
+ async function insertAfterCodeBlock(options) {
46
+ const { app, ctx, lineOffset = 0, text } = options;
47
+ const sectionInfo = await getCodeBlockSectionInfo(options);
48
+ await process(app, ctx.sourcePath, (_abortSignal, content) => {
49
+ if (!hasSingleOccurrence(content, sectionInfo.text)) {
50
+ throw new Error("Multiple suitable code blocks found.");
51
+ }
52
+ const index = content.indexOf(sectionInfo.text);
53
+ const textBeforeSection = content.slice(0, index);
54
+ const linesBeforeSection = textBeforeSection.split("\n");
55
+ const insertLineIndex = linesBeforeSection.length + sectionInfo.lineEnd + lineOffset;
56
+ return insertText(content, insertLineIndex, text, options.shouldPreserveLinePrefix);
57
+ });
58
+ }
59
+ async function insertBeforeCodeBlock(options) {
60
+ const { app, ctx, lineOffset = 0, text } = options;
61
+ const sectionInfo = await getCodeBlockSectionInfo(options);
62
+ await process(app, ctx.sourcePath, (_abortSignal, content) => {
63
+ if (!hasSingleOccurrence(content, sectionInfo.text)) {
64
+ throw new Error("Multiple suitable code blocks found.");
65
+ }
66
+ const index = content.indexOf(sectionInfo.text);
67
+ const textBeforeSection = content.slice(0, index);
68
+ const linesBeforeSection = textBeforeSection.split("\n");
69
+ const insertLineIndex = linesBeforeSection.length + sectionInfo.lineStart - lineOffset - 1;
70
+ return insertText(content, insertLineIndex, text, options.shouldPreserveLinePrefix);
71
+ });
72
+ }
73
+ async function removeCodeBlock(options) {
74
+ await replaceCodeBlock({
75
+ ...options,
76
+ codeBlockProvider: ""
77
+ });
26
78
  }
27
- async function replaceCodeBlock(app, ctx, el, codeBlockProvider, abortSignal) {
28
- abortSignal ??= abortSignalNever();
79
+ async function replaceCodeBlock(options) {
80
+ const { app, codeBlockProvider, ctx } = options;
81
+ const abortSignal = options.abortSignal ?? abortSignalNever();
29
82
  abortSignal.throwIfAborted();
30
- const sectionInfo = ctx.getSectionInfo(el);
31
- if (!sectionInfo) {
32
- return;
33
- }
83
+ const sectionInfo = await getCodeBlockSectionInfo(options);
34
84
  const lines = sectionInfo.text.split("\n");
35
- const prefix = lines.slice(0, sectionInfo.lineStart).join("\n");
36
- const oldCodeBlock = lines.slice(sectionInfo.lineStart, sectionInfo.lineEnd + 1).join("\n");
37
- const suffix = lines.slice(sectionInfo.lineEnd + 1).join("\n");
38
- const newCodeBlock = await resolveValue(codeBlockProvider, abortSignal, oldCodeBlock);
85
+ const textBeforeCodeBlock = lines.slice(0, sectionInfo.lineStart).join("\n");
86
+ let oldCodeBlock = lines.slice(sectionInfo.lineStart, sectionInfo.lineEnd + 1).join("\n");
87
+ if (options.shouldPreserveLinePrefix) {
88
+ oldCodeBlock = unindent(oldCodeBlock, sectionInfo.prefix);
89
+ }
90
+ const textAfterCodeBlock = lines.slice(sectionInfo.lineEnd + 1).join("\n");
91
+ let newCodeBlock = await resolveValue(codeBlockProvider, abortSignal, oldCodeBlock);
39
92
  abortSignal.throwIfAborted();
40
- const newSectionText = `${prefix}
41
- ${newCodeBlock}${newCodeBlock ? "\n" : ""}${suffix}`;
42
- await process(app, ctx.sourcePath, (_abortSignal, content) => replaceAll(content, sectionInfo.text, newSectionText));
93
+ if (newCodeBlock && options.shouldPreserveLinePrefix) {
94
+ newCodeBlock = indent(newCodeBlock, sectionInfo.prefix);
95
+ }
96
+ const newSectionText = `${appendNewLine(textBeforeCodeBlock)}${appendNewLine(newCodeBlock)}${textAfterCodeBlock}`;
97
+ await process(app, ctx.sourcePath, (_abortSignal, content) => {
98
+ if (!hasSingleOccurrence(content, sectionInfo.text)) {
99
+ throw new Error("Multiple suitable code blocks found.");
100
+ }
101
+ return replaceAll(content, sectionInfo.text, newSectionText);
102
+ });
103
+ }
104
+ function appendNewLine(text) {
105
+ return text === "" ? "" : `${text}
106
+ `;
107
+ }
108
+ async function createApproximateSectionInfo(app, ctx) {
109
+ const sourceFile = app.vault.getFileByPath(ctx.sourcePath);
110
+ if (!sourceFile) {
111
+ throw new Error(`Source file ${ctx.sourcePath} not found.`);
112
+ }
113
+ const cache = app.metadataCache.getFileCache(sourceFile);
114
+ const frontmatterEndOffset = cache?.frontmatterPosition?.end.offset;
115
+ const content = await app.vault.cachedRead(sourceFile);
116
+ const contentStartOffset = frontmatterEndOffset === void 0 ? getFrontMatterInfo(content).contentStart : frontmatterEndOffset + 1;
117
+ const text = content.slice(contentStartOffset);
118
+ return {
119
+ lineEnd: text.split("\n").length - 1,
120
+ lineStart: 0,
121
+ text
122
+ };
123
+ }
124
+ function createSectionInfoFromMatch(potentialCodeBlockText, match, approximateSectionInfo, sourceLines) {
125
+ const linePrefix = match.groups?.["LinePrefix"] ?? "";
126
+ const codeBlockStartDelimiter = match.groups?.["CodeBlockStartDelimiter"] ?? "";
127
+ const codeBlockEndDelimiter = match.groups?.["CodeBlockEndDelimiter"] ?? "";
128
+ const codeBlockArgs = match.groups?.["CodeBlockArgs"] ?? "";
129
+ const language = match.groups?.["CodeBlockLanguage"] ?? "";
130
+ const previousText = potentialCodeBlockText.slice(0, match.index);
131
+ const previousTextLines = previousText.split("\n");
132
+ return {
133
+ args: codeBlockArgs,
134
+ endDelimiter: codeBlockEndDelimiter,
135
+ language,
136
+ lineEnd: previousTextLines.length + sourceLines.length,
137
+ lineStart: previousTextLines.length - 1,
138
+ prefix: linePrefix,
139
+ startDelimiter: codeBlockStartDelimiter,
140
+ text: approximateSectionInfo.text
141
+ };
142
+ }
143
+ function getLanguageFromElement(el) {
144
+ const BLOCK_LANGUAGE_PREFIX = "block-language-";
145
+ return Array.from(el.classList).find((cls) => cls.startsWith(BLOCK_LANGUAGE_PREFIX))?.slice(BLOCK_LANGUAGE_PREFIX.length) ?? "";
146
+ }
147
+ function insertText(content, insertLineIndex, text, shouldPreserveLinePrefix) {
148
+ const lines = content.split("\n");
149
+ const newLines = lines.slice();
150
+ const textLines = text.split("\n");
151
+ if (insertLineIndex < 0) {
152
+ insertLineIndex = 0;
153
+ }
154
+ if (insertLineIndex > lines.length) {
155
+ insertLineIndex = lines.length;
156
+ }
157
+ const PREFIX_LINE_REG_EXP = /^ {0,3}(?:> {1,3})*/g;
158
+ const match = (lines[insertLineIndex] ?? "").match(PREFIX_LINE_REG_EXP);
159
+ const linePrefix = match?.[0] ?? "";
160
+ newLines.splice(insertLineIndex, 0, ...shouldPreserveLinePrefix ? textLines.map((line) => indent(line, linePrefix)) : textLines);
161
+ return newLines.join("\n");
162
+ }
163
+ function isSuitableCodeBlock(match, language, source, isInCallout) {
164
+ const codeBlockLanguage = match.groups?.["CodeBlockLanguage"] ?? "";
165
+ if (codeBlockLanguage !== language) {
166
+ return false;
167
+ }
168
+ const linePrefix = match.groups?.["LinePrefix"] ?? "";
169
+ if (isInCallout && !linePrefix.includes("> ")) {
170
+ return false;
171
+ }
172
+ const codeBlockContent = match.groups?.["CodeBlockContent"] ?? "";
173
+ const cleanCodeBlockContent = codeBlockContent.split("\n").map((line) => line.slice(linePrefix.length)).join("\n");
174
+ return cleanCodeBlockContent === source;
43
175
  }
44
176
  export {
45
- getCodeBlockArguments,
177
+ getCodeBlockSectionInfo,
178
+ insertAfterCodeBlock,
179
+ insertBeforeCodeBlock,
180
+ removeCodeBlock,
46
181
  replaceCodeBlock
47
182
  };
48
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL01hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIGNvZGUgYmxvY2tzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzaGVsbC1xdW90ZSc7XG5cbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJy4uL1ZhbHVlUHJvdmlkZXIudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vQWJvcnRDb250cm9sbGVyLnRzJztcbmltcG9ydCB7IHRocm93RXhwcmVzc2lvbiB9IGZyb20gJy4uL0Vycm9yLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQgeyBwcm9jZXNzIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhcmd1bWVudCBvZiBhIGNvZGUgYmxvY2sgZnJvbSB0aGUgZ2l2ZW4gTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCBhbmQgSFRNTEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIGN0eCAtIFRoZSBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0IG9iamVjdC5cbiAqIEBwYXJhbSBlbCAtIFRoZSBIVE1MRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvZGUgYmxvY2suXG4gKiBAcmV0dXJucyBUaGUgYXJndW1lbnQgb2YgdGhlIGNvZGUgYmxvY2sgYXMgYSBzdHJpbmcsIG9yIG51bGwgaWYgbm8gYXJndW1lbnQgaXMgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2RlQmxvY2tBcmd1bWVudHMoY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlY3Rpb25JbmZvID0gY3R4LmdldFNlY3Rpb25JbmZvKGVsKTtcbiAgaWYgKCFzZWN0aW9uSW5mbykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBsaW5lcyA9IHNlY3Rpb25JbmZvLnRleHQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBjb2RlQmxvY2tIZWFkZXIgPSBsaW5lc1tzZWN0aW9uSW5mby5saW5lU3RhcnRdID8/IHRocm93RXhwcmVzc2lvbihuZXcgRXJyb3IoJ0NvZGUgYmxvY2sgaGVhZGVyIG5vdCBmb3VuZCcpKTtcbiAgY29uc3QgbWF0Y2ggPSAvXig/OmB7Myx9fH57Myx9KVxcUytcXHMrKD88QXJndW1lbnRzPi4qKSQvLmV4ZWMoY29kZUJsb2NrSGVhZGVyKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gcGFyc2UobWF0Y2guZ3JvdXBzPy5bJ0FyZ3VtZW50cyddID8/ICcnKS5tYXAoU3RyaW5nKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIEFwcCBvYmplY3QuXG4gKiBAcGFyYW0gY3R4IC0gVGhlIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQgb2JqZWN0LlxuICogQHBhcmFtIGVsIC0gVGhlIEhUTUxFbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY29kZSBibG9jay5cbiAqIEBwYXJhbSBjb2RlQmxvY2tQcm92aWRlciAtIFRoZSBWYWx1ZVByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIG5ldyBjb2RlIGJsb2NrLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUNvZGVCbG9jayhcbiAgYXBwOiBBcHAsXG4gIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCxcbiAgZWw6IEhUTUxFbGVtZW50LFxuICBjb2RlQmxvY2tQcm92aWRlcjogVmFsdWVQcm92aWRlcjxzdHJpbmcsIFtzdHJpbmddPixcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3Qgc2VjdGlvbkluZm8gPSBjdHguZ2V0U2VjdGlvbkluZm8oZWwpO1xuICBpZiAoIXNlY3Rpb25JbmZvKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGxpbmVzID0gc2VjdGlvbkluZm8udGV4dC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IHByZWZpeCA9IGxpbmVzLnNsaWNlKDAsIHNlY3Rpb25JbmZvLmxpbmVTdGFydCkuam9pbignXFxuJyk7XG4gIGNvbnN0IG9sZENvZGVCbG9jayA9IGxpbmVzLnNsaWNlKHNlY3Rpb25JbmZvLmxpbmVTdGFydCwgc2VjdGlvbkluZm8ubGluZUVuZCArIDEpLmpvaW4oJ1xcbicpO1xuICBjb25zdCBzdWZmaXggPSBsaW5lcy5zbGljZShzZWN0aW9uSW5mby5saW5lRW5kICsgMSkuam9pbignXFxuJyk7XG4gIGNvbnN0IG5ld0NvZGVCbG9jayA9IGF3YWl0IHJlc29sdmVWYWx1ZShjb2RlQmxvY2tQcm92aWRlciwgYWJvcnRTaWduYWwsIG9sZENvZGVCbG9jayk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGNvbnN0IG5ld1NlY3Rpb25UZXh0ID0gYCR7cHJlZml4fVxcbiR7bmV3Q29kZUJsb2NrfSR7bmV3Q29kZUJsb2NrID8gJ1xcbicgOiAnJ30ke3N1ZmZpeH1gO1xuICBhd2FpdCBwcm9jZXNzKGFwcCwgY3R4LnNvdXJjZVBhdGgsIChfYWJvcnRTaWduYWwsIGNvbnRlbnQpID0+IHJlcGxhY2VBbGwoY29udGVudCwgc2VjdGlvbkluZm8udGV4dCwgbmV3U2VjdGlvblRleHQpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFXQSxTQUFTLGFBQWE7QUFJdEIsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxlQUFlO0FBU2pCLFNBQVMsc0JBQXNCLEtBQW1DLElBQTJCO0FBQ2xHLFFBQU0sY0FBYyxJQUFJLGVBQWUsRUFBRTtBQUN6QyxNQUFJLENBQUMsYUFBYTtBQUNoQixXQUFPLENBQUM7QUFBQSxFQUNWO0FBQ0EsUUFBTSxRQUFRLFlBQVksS0FBSyxNQUFNLElBQUk7QUFDekMsUUFBTSxrQkFBa0IsTUFBTSxZQUFZLFNBQVMsS0FBSyxnQkFBZ0IsSUFBSSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hILFFBQU0sUUFBUSwwQ0FBMEMsS0FBSyxlQUFlO0FBQzVFLE1BQUksQ0FBQyxPQUFPO0FBQ1YsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNBLFNBQU8sTUFBTSxNQUFNLFNBQVMsV0FBVyxLQUFLLEVBQUUsRUFBRSxJQUFJLE1BQU07QUFDNUQ7QUFXQSxlQUFzQixpQkFDcEIsS0FDQSxLQUNBLElBQ0EsbUJBQ0EsYUFDZTtBQUNmLGtCQUFnQixpQkFBaUI7QUFDakMsY0FBWSxlQUFlO0FBRTNCLFFBQU0sY0FBYyxJQUFJLGVBQWUsRUFBRTtBQUN6QyxNQUFJLENBQUMsYUFBYTtBQUNoQjtBQUFBLEVBQ0Y7QUFDQSxRQUFNLFFBQVEsWUFBWSxLQUFLLE1BQU0sSUFBSTtBQUN6QyxRQUFNLFNBQVMsTUFBTSxNQUFNLEdBQUcsWUFBWSxTQUFTLEVBQUUsS0FBSyxJQUFJO0FBQzlELFFBQU0sZUFBZSxNQUFNLE1BQU0sWUFBWSxXQUFXLFlBQVksVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQzFGLFFBQU0sU0FBUyxNQUFNLE1BQU0sWUFBWSxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUk7QUFDN0QsUUFBTSxlQUFlLE1BQU0sYUFBYSxtQkFBbUIsYUFBYSxZQUFZO0FBQ3BGLGNBQVksZUFBZTtBQUMzQixRQUFNLGlCQUFpQixHQUFHLE1BQU07QUFBQSxFQUFLLFlBQVksR0FBRyxlQUFlLE9BQU8sRUFBRSxHQUFHLE1BQU07QUFDckYsUUFBTSxRQUFRLEtBQUssSUFBSSxZQUFZLENBQUMsY0FBYyxZQUFZLFdBQVcsU0FBUyxZQUFZLE1BQU0sY0FBYyxDQUFDO0FBQ3JIOyIsCiAgIm5hbWVzIjogW10KfQo=
183
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL01hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIGNvZGUgYmxvY2tzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldEZyb250TWF0dGVySW5mbyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9BYm9ydENvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHtcbiAgaGFzU2luZ2xlT2NjdXJyZW5jZSxcbiAgaW5kZW50LFxuICByZXBsYWNlQWxsLFxuICB1bmluZGVudFxufSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQgeyBwcm9jZXNzIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2RlIGJsb2NrIGluIGEgTWFya2Rvd24gc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiBleHRlbmRzIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICBhcmdzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmQgZGVsaW1pdGVyIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgZW5kRGVsaW1pdGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggb2YgdGhlIGNvZGUgYmxvY2suXG4gICAqL1xuICBwcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YXJ0IGRlbGltaXRlciBvZiB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHN0YXJ0RGVsaW1pdGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgZ2V0dGluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb2RlIGJsb2NrIGluIGEgTWFya2Rvd24gc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBvYmplY3QuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQgb2JqZWN0LlxuICAgKi9cbiAgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgSFRNTEVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgZWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIG9mIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgaW5zZXJ0aW5nIHRleHQgYWZ0ZXIgYSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydENvZGVCbG9ja09wdGlvbnMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBsaW5lcyB0byBvZmZzZXQgdGhlIGluc2VydGlvbiBieS4gRGVmYXVsdCBpcyBgMGAuXG4gICAqL1xuICBsaW5lT2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsaW5lIHByZWZpeCBvZiB0aGUgY29kZSBibG9jay4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gaW5zZXJ0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG9wdGlvbnMgZm9yIHJlcGxhY2luZyBhIGNvZGUgYmxvY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUNvZGVCbG9ja09wdGlvbnMgZXh0ZW5kcyBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIG5ldyBjb2RlIGJsb2NrLlxuICAgKi9cbiAgY29kZUJsb2NrUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8c3RyaW5nLCBbc3RyaW5nXT47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxpbmUgcHJlZml4IG9mIHRoZSBjb2RlIGJsb2NrLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICBzaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXg/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgY29kZSBibG9jayBpbiBhIE1hcmtkb3duIHNlY3Rpb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlIGJsb2NrIGluIHRoZSBNYXJrZG93biBzZWN0aW9uLlxuICpcbiAqIEB0aHJvd3MgSWYgbm8gc3VpdGFibGUgY29kZSBibG9jayBpcyBmb3VuZC5cbiAqIEB0aHJvd3MgSWYgbXVsdGlwbGUgc3VpdGFibGUgY29kZSBibG9ja3MgYXJlIGZvdW5kLiBIYXBwZW5zIHdoZW4gdGhlIGNvZGUgYmxvY2sgaXMgaW4gYSBjYWxsb3V0LiBDYXVzZWQgYnkgdGhlIGJ1ZyBpbiBPYnNpZGlhbjoge0BsaW5rIGh0dHBzOi8vZm9ydW0ub2JzaWRpYW4ubWQvdC9idWctZ2V0c2VjdGlvbmluZm8taXMtaW5hY2N1cmF0ZS1pbnNpZGUtY2FsbG91dHMvMTA0Mjg5fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUJsb2NrU2VjdGlvbkluZm8ob3B0aW9uczogR2V0Q29kZUJsb2NrU2VjdGlvbkluZm9PcHRpb25zKTogUHJvbWlzZTxDb2RlQmxvY2tNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbj4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBlbCwgc291cmNlIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGFwcHJveGltYXRlU2VjdGlvbkluZm8gPSBjdHguZ2V0U2VjdGlvbkluZm8oZWwpID8/IGF3YWl0IGNyZWF0ZUFwcHJveGltYXRlU2VjdGlvbkluZm8oYXBwLCBjdHgpO1xuICBjb25zdCBpc0luQ2FsbG91dCA9ICEhZWwucGFyZW50RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjYWxsb3V0LWNvbnRlbnQnKTtcblxuICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlRnJvbUVsZW1lbnQoZWwpO1xuICBjb25zdCBzb3VyY2VMaW5lcyA9IHNvdXJjZS5zcGxpdCgnXFxuJyk7XG5cbiAgY29uc3QgdGV4dExpbmVzID0gYXBwcm94aW1hdGVTZWN0aW9uSW5mby50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgcG90ZW50aWFsQ29kZUJsb2NrVGV4dExpbmVzID0gdGV4dExpbmVzLm1hcCgobGluZSwgaW5kZXgpID0+XG4gICAgYXBwcm94aW1hdGVTZWN0aW9uSW5mby5saW5lU3RhcnQgPD0gaW5kZXggJiYgaW5kZXggPD0gYXBwcm94aW1hdGVTZWN0aW9uSW5mby5saW5lRW5kID8gbGluZSA6ICcnXG4gICk7XG4gIGNvbnN0IHBvdGVudGlhbENvZGVCbG9ja1RleHQgPSBwb3RlbnRpYWxDb2RlQmxvY2tUZXh0TGluZXMuam9pbignXFxuJyk7XG5cbiAgY29uc3QgUkVHX0VYUCA9XG4gICAgLyg/PD1efFxcbikoPzxMaW5lUHJlZml4PiB7MCwzfSg/Oj4gezEsM30pKikoPzxDb2RlQmxvY2tTdGFydERlbGltaXRlcj4oPzxDb2RlQmxvY2tTdGFydERlbGltaXRlckNoYXI+W2B+XSkoPzpcXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXJDaGFyPnsyLH0pKSg/PENvZGVCbG9ja0xhbmd1YWdlPlxcUyopKD86WyBcXHRdKyg/PENvZGVCbG9ja0FyZ3M+Lio/KVsgXFx0XSspPyg/Olxcbig/PENvZGVCbG9ja0NvbnRlbnQ+KD86XFxuP1xcazxMaW5lUHJlZml4Pi4qKSs/KSk/XFxuXFxrPExpbmVQcmVmaXg+KD88Q29kZUJsb2NrRW5kRGVsaW1pdGVyPlxcazxDb2RlQmxvY2tTdGFydERlbGltaXRlcj5cXGs8Q29kZUJsb2NrU3RhcnREZWxpbWl0ZXJDaGFyPiopWyBcXHRdKig/OlxcbnwkKS9nO1xuXG4gIGxldCBzZWN0aW9uSW5mbzogQ29kZUJsb2NrTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHBvdGVudGlhbENvZGVCbG9ja1RleHQubWF0Y2hBbGwoUkVHX0VYUCkpIHtcbiAgICBpZiAoIWlzU3VpdGFibGVDb2RlQmxvY2sobWF0Y2gsIGxhbmd1YWdlLCBzb3VyY2UsIGlzSW5DYWxsb3V0KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHNlY3Rpb25JbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIHN1aXRhYmxlIGNvZGUgYmxvY2tzIGZvdW5kLicpO1xuICAgIH1cblxuICAgIHNlY3Rpb25JbmZvID0gY3JlYXRlU2VjdGlvbkluZm9Gcm9tTWF0Y2gocG90ZW50aWFsQ29kZUJsb2NrVGV4dCwgbWF0Y2gsIGFwcHJveGltYXRlU2VjdGlvbkluZm8sIHNvdXJjZUxpbmVzKTtcbiAgfVxuXG4gIGlmICghc2VjdGlvbkluZm8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1aXRhYmxlIGNvZGUgYmxvY2sgZm91bmQuJyk7XG4gIH1cblxuICByZXR1cm4gc2VjdGlvbkluZm87XG59XG5cbi8qKlxuICogSW5zZXJ0cyB0ZXh0IGFmdGVyIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc2VydEFmdGVyQ29kZUJsb2NrKG9wdGlvbnM6IEluc2VydENvZGVCbG9ja09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIGN0eCwgbGluZU9mZnNldCA9IDAsIHRleHQgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc2VjdGlvbkluZm8gPSBhd2FpdCBnZXRDb2RlQmxvY2tTZWN0aW9uSW5mbyhvcHRpb25zKTtcbiAgYXdhaXQgcHJvY2VzcyhhcHAsIGN0eC5zb3VyY2VQYXRoLCAoX2Fib3J0U2lnbmFsLCBjb250ZW50KSA9PiB7XG4gICAgaWYgKCFoYXNTaW5nbGVPY2N1cnJlbmNlKGNvbnRlbnQsIHNlY3Rpb25JbmZvLnRleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIHN1aXRhYmxlIGNvZGUgYmxvY2tzIGZvdW5kLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHNlY3Rpb25JbmZvLnRleHQpO1xuICAgIGNvbnN0IHRleHRCZWZvcmVTZWN0aW9uID0gY29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gICAgY29uc3QgbGluZXNCZWZvcmVTZWN0aW9uID0gdGV4dEJlZm9yZVNlY3Rpb24uc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGluc2VydExpbmVJbmRleCA9IGxpbmVzQmVmb3JlU2VjdGlvbi5sZW5ndGggKyBzZWN0aW9uSW5mby5saW5lRW5kICsgbGluZU9mZnNldDtcbiAgICByZXR1cm4gaW5zZXJ0VGV4dChjb250ZW50LCBpbnNlcnRMaW5lSW5kZXgsIHRleHQsIG9wdGlvbnMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyB0ZXh0IGJlZm9yZSB0aGUgY29kZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRCZWZvcmVDb2RlQmxvY2sob3B0aW9uczogSW5zZXJ0Q29kZUJsb2NrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY3R4LCBsaW5lT2Zmc2V0ID0gMCwgdGV4dCB9ID0gb3B0aW9ucztcblxuICBjb25zdCBzZWN0aW9uSW5mbyA9IGF3YWl0IGdldENvZGVCbG9ja1NlY3Rpb25JbmZvKG9wdGlvbnMpO1xuICBhd2FpdCBwcm9jZXNzKGFwcCwgY3R4LnNvdXJjZVBhdGgsIChfYWJvcnRTaWduYWwsIGNvbnRlbnQpID0+IHtcbiAgICBpZiAoIWhhc1NpbmdsZU9jY3VycmVuY2UoY29udGVudCwgc2VjdGlvbkluZm8udGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGlwbGUgc3VpdGFibGUgY29kZSBibG9ja3MgZm91bmQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2Yoc2VjdGlvbkluZm8udGV4dCk7XG4gICAgY29uc3QgdGV4dEJlZm9yZVNlY3Rpb24gPSBjb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgICBjb25zdCBsaW5lc0JlZm9yZVNlY3Rpb24gPSB0ZXh0QmVmb3JlU2VjdGlvbi5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgaW5zZXJ0TGluZUluZGV4ID0gbGluZXNCZWZvcmVTZWN0aW9uLmxlbmd0aCArIHNlY3Rpb25JbmZvLmxpbmVTdGFydCAtIGxpbmVPZmZzZXQgLSAxO1xuICAgIHJldHVybiBpbnNlcnRUZXh0KGNvbnRlbnQsIGluc2VydExpbmVJbmRleCwgdGV4dCwgb3B0aW9ucy5zaG91bGRQcmVzZXJ2ZUxpbmVQcmVmaXgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBjb2RlIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUNvZGVCbG9jayhvcHRpb25zOiBHZXRDb2RlQmxvY2tTZWN0aW9uSW5mb09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVwbGFjZUNvZGVCbG9jayh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBjb2RlQmxvY2tQcm92aWRlcjogJydcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGNvZGUgYmxvY2suXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUNvZGVCbG9jayhvcHRpb25zOiBSZXBsYWNlQ29kZUJsb2NrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgY29kZUJsb2NrUHJvdmlkZXIsIGN0eCB9ID0gb3B0aW9ucztcblxuICBjb25zdCBhYm9ydFNpZ25hbCA9IG9wdGlvbnMuYWJvcnRTaWduYWwgPz8gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGNvbnN0IHNlY3Rpb25JbmZvID0gYXdhaXQgZ2V0Q29kZUJsb2NrU2VjdGlvbkluZm8ob3B0aW9ucyk7XG5cbiAgY29uc3QgbGluZXMgPSBzZWN0aW9uSW5mby50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgdGV4dEJlZm9yZUNvZGVCbG9jayA9IGxpbmVzLnNsaWNlKDAsIHNlY3Rpb25JbmZvLmxpbmVTdGFydCkuam9pbignXFxuJyk7XG4gIGxldCBvbGRDb2RlQmxvY2sgPSBsaW5lcy5zbGljZShzZWN0aW9uSW5mby5saW5lU3RhcnQsIHNlY3Rpb25JbmZvLmxpbmVFbmQgKyAxKS5qb2luKCdcXG4nKTtcbiAgaWYgKG9wdGlvbnMuc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4KSB7XG4gICAgb2xkQ29kZUJsb2NrID0gdW5pbmRlbnQob2xkQ29kZUJsb2NrLCBzZWN0aW9uSW5mby5wcmVmaXgpO1xuICB9XG4gIGNvbnN0IHRleHRBZnRlckNvZGVCbG9jayA9IGxpbmVzLnNsaWNlKHNlY3Rpb25JbmZvLmxpbmVFbmQgKyAxKS5qb2luKCdcXG4nKTtcbiAgbGV0IG5ld0NvZGVCbG9jayA9IGF3YWl0IHJlc29sdmVWYWx1ZShjb2RlQmxvY2tQcm92aWRlciwgYWJvcnRTaWduYWwsIG9sZENvZGVCbG9jayk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG5ld0NvZGVCbG9jayAmJiBvcHRpb25zLnNob3VsZFByZXNlcnZlTGluZVByZWZpeCkge1xuICAgIG5ld0NvZGVCbG9jayA9IGluZGVudChuZXdDb2RlQmxvY2ssIHNlY3Rpb25JbmZvLnByZWZpeCk7XG4gIH1cblxuICBjb25zdCBuZXdTZWN0aW9uVGV4dCA9IGAke2FwcGVuZE5ld0xpbmUodGV4dEJlZm9yZUNvZGVCbG9jayl9JHthcHBlbmROZXdMaW5lKG5ld0NvZGVCbG9jayl9JHt0ZXh0QWZ0ZXJDb2RlQmxvY2t9YDtcbiAgYXdhaXQgcHJvY2VzcyhhcHAsIGN0eC5zb3VyY2VQYXRoLCAoX2Fib3J0U2lnbmFsLCBjb250ZW50KSA9PiB7XG4gICAgaWYgKCFoYXNTaW5nbGVPY2N1cnJlbmNlKGNvbnRlbnQsIHNlY3Rpb25JbmZvLnRleHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIHN1aXRhYmxlIGNvZGUgYmxvY2tzIGZvdW5kLicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVwbGFjZUFsbChjb250ZW50LCBzZWN0aW9uSW5mby50ZXh0LCBuZXdTZWN0aW9uVGV4dCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBlbmROZXdMaW5lKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0ID09PSAnJyA/ICcnIDogYCR7dGV4dH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBcHByb3hpbWF0ZVNlY3Rpb25JbmZvKGFwcDogQXBwLCBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQpOiBQcm9taXNlPE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uPiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBhcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChjdHguc291cmNlUGF0aCk7XG4gIGlmICghc291cmNlRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIGZpbGUgJHtjdHguc291cmNlUGF0aH0gbm90IGZvdW5kLmApO1xuICB9XG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKHNvdXJjZUZpbGUpO1xuICBjb25zdCBmcm9udG1hdHRlckVuZE9mZnNldCA9IGNhY2hlPy5mcm9udG1hdHRlclBvc2l0aW9uPy5lbmQub2Zmc2V0O1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoc291cmNlRmlsZSk7XG4gIGNvbnN0IGNvbnRlbnRTdGFydE9mZnNldCA9IGZyb250bWF0dGVyRW5kT2Zmc2V0ID09PSB1bmRlZmluZWQgPyBnZXRGcm9udE1hdHRlckluZm8oY29udGVudCkuY29udGVudFN0YXJ0IDogZnJvbnRtYXR0ZXJFbmRPZmZzZXQgKyAxO1xuICBjb25zdCB0ZXh0ID0gY29udGVudC5zbGljZShjb250ZW50U3RhcnRPZmZzZXQpO1xuICByZXR1cm4ge1xuICAgIGxpbmVFbmQ6IHRleHQuc3BsaXQoJ1xcbicpLmxlbmd0aCAtIDEsXG4gICAgbGluZVN0YXJ0OiAwLFxuICAgIHRleHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkluZm9Gcm9tTWF0Y2goXG4gIHBvdGVudGlhbENvZGVCbG9ja1RleHQ6IHN0cmluZyxcbiAgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXksXG4gIGFwcHJveGltYXRlU2VjdGlvbkluZm86IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLFxuICBzb3VyY2VMaW5lczogc3RyaW5nW11cbik6IENvZGVCbG9ja01hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHtcbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoLmdyb3Vwcz8uWydMaW5lUHJlZml4J10gPz8gJyc7XG4gIGNvbnN0IGNvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyJ10gPz8gJyc7XG4gIGNvbnN0IGNvZGVCbG9ja0VuZERlbGltaXRlciA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tFbmREZWxpbWl0ZXInXSA/PyAnJztcbiAgY29uc3QgY29kZUJsb2NrQXJncyA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tBcmdzJ10gPz8gJyc7XG4gIGNvbnN0IGxhbmd1YWdlID0gbWF0Y2guZ3JvdXBzPy5bJ0NvZGVCbG9ja0xhbmd1YWdlJ10gPz8gJyc7XG5cbiAgY29uc3QgcHJldmlvdXNUZXh0ID0gcG90ZW50aWFsQ29kZUJsb2NrVGV4dC5zbGljZSgwLCBtYXRjaC5pbmRleCk7XG4gIGNvbnN0IHByZXZpb3VzVGV4dExpbmVzID0gcHJldmlvdXNUZXh0LnNwbGl0KCdcXG4nKTtcblxuICByZXR1cm4ge1xuICAgIGFyZ3M6IGNvZGVCbG9ja0FyZ3MsXG4gICAgZW5kRGVsaW1pdGVyOiBjb2RlQmxvY2tFbmREZWxpbWl0ZXIsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbGluZUVuZDogcHJldmlvdXNUZXh0TGluZXMubGVuZ3RoICsgc291cmNlTGluZXMubGVuZ3RoLFxuICAgIGxpbmVTdGFydDogcHJldmlvdXNUZXh0TGluZXMubGVuZ3RoIC0gMSxcbiAgICBwcmVmaXg6IGxpbmVQcmVmaXgsXG4gICAgc3RhcnREZWxpbWl0ZXI6IGNvZGVCbG9ja1N0YXJ0RGVsaW1pdGVyLFxuICAgIHRleHQ6IGFwcHJveGltYXRlU2VjdGlvbkluZm8udGV4dFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyb21FbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IEJMT0NLX0xBTkdVQUdFX1BSRUZJWCA9ICdibG9jay1sYW5ndWFnZS0nO1xuICByZXR1cm4gQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QpLmZpbmQoKGNscykgPT4gY2xzLnN0YXJ0c1dpdGgoQkxPQ0tfTEFOR1VBR0VfUFJFRklYKSk/LnNsaWNlKEJMT0NLX0xBTkdVQUdFX1BSRUZJWC5sZW5ndGgpID8/ICcnO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRUZXh0KGNvbnRlbnQ6IHN0cmluZywgaW5zZXJ0TGluZUluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZywgc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4PzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IG5ld0xpbmVzID0gbGluZXMuc2xpY2UoKTtcbiAgY29uc3QgdGV4dExpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG5cbiAgaWYgKGluc2VydExpbmVJbmRleCA8IDApIHtcbiAgICBpbnNlcnRMaW5lSW5kZXggPSAwO1xuICB9XG4gIGlmIChpbnNlcnRMaW5lSW5kZXggPiBsaW5lcy5sZW5ndGgpIHtcbiAgICBpbnNlcnRMaW5lSW5kZXggPSBsaW5lcy5sZW5ndGg7XG4gIH1cblxuICBjb25zdCBQUkVGSVhfTElORV9SRUdfRVhQID0gL14gezAsM30oPzo+IHsxLDN9KSovZztcbiAgY29uc3QgbWF0Y2ggPSAobGluZXNbaW5zZXJ0TGluZUluZGV4XSA/PyAnJykubWF0Y2goUFJFRklYX0xJTkVfUkVHX0VYUCk7XG4gIGNvbnN0IGxpbmVQcmVmaXggPSBtYXRjaD8uWzBdID8/ICcnO1xuICBuZXdMaW5lcy5zcGxpY2UoaW5zZXJ0TGluZUluZGV4LCAwLCAuLi4oc2hvdWxkUHJlc2VydmVMaW5lUHJlZml4ID8gdGV4dExpbmVzLm1hcCgobGluZSkgPT4gaW5kZW50KGxpbmUsIGxpbmVQcmVmaXgpKSA6IHRleHRMaW5lcykpO1xuICByZXR1cm4gbmV3TGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzU3VpdGFibGVDb2RlQmxvY2soXG4gIG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5LFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzb3VyY2U6IHN0cmluZyxcbiAgaXNJbkNhbGxvdXQ6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBjb2RlQmxvY2tMYW5ndWFnZSA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tMYW5ndWFnZSddID8/ICcnO1xuICBpZiAoY29kZUJsb2NrTGFuZ3VhZ2UgIT09IGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbGluZVByZWZpeCA9IG1hdGNoLmdyb3Vwcz8uWydMaW5lUHJlZml4J10gPz8gJyc7XG5cbiAgaWYgKGlzSW5DYWxsb3V0ICYmICFsaW5lUHJlZml4LmluY2x1ZGVzKCc+ICcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29kZUJsb2NrQ29udGVudCA9IG1hdGNoLmdyb3Vwcz8uWydDb2RlQmxvY2tDb250ZW50J10gPz8gJyc7XG4gIGNvbnN0IGNsZWFuQ29kZUJsb2NrQ29udGVudCA9IGNvZGVCbG9ja0NvbnRlbnQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShsaW5lUHJlZml4Lmxlbmd0aCkpLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBjbGVhbkNvZGVCbG9ja0NvbnRlbnQgPT09IHNvdXJjZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFZQSxTQUFTLDBCQUEwQjtBQUluQyxTQUFTLHdCQUF3QjtBQUNqQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxlQUFlO0FBMEd4QixlQUFzQix3QkFBd0IsU0FBdUY7QUFDbkksUUFBTSxFQUFFLEtBQUssS0FBSyxJQUFJLE9BQU8sSUFBSTtBQUVqQyxRQUFNLHlCQUF5QixJQUFJLGVBQWUsRUFBRSxLQUFLLE1BQU0sNkJBQTZCLEtBQUssR0FBRztBQUNwRyxRQUFNLGNBQWMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxVQUFVLFNBQVMsaUJBQWlCO0FBRTVFLFFBQU0sV0FBVyx1QkFBdUIsRUFBRTtBQUMxQyxRQUFNLGNBQWMsT0FBTyxNQUFNLElBQUk7QUFFckMsUUFBTSxZQUFZLHVCQUF1QixLQUFLLE1BQU0sSUFBSTtBQUN4RCxRQUFNLDhCQUE4QixVQUFVO0FBQUEsSUFBSSxDQUFDLE1BQU0sVUFDdkQsdUJBQXVCLGFBQWEsU0FBUyxTQUFTLHVCQUF1QixVQUFVLE9BQU87QUFBQSxFQUNoRztBQUNBLFFBQU0seUJBQXlCLDRCQUE0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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "33.1.0",
3
+ "version": "34.0.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development",
5
5
  "keywords": [
6
6
  "obsidian"
@@ -452,15 +452,15 @@
452
452
  "@types/doctrine": "^0.0.9",
453
453
  "@types/eslint": "^9.6.1",
454
454
  "@types/luxon": "^3.7.1",
455
- "@types/node": "^24.2.1",
455
+ "@types/node": "^24.3.0",
456
456
  "@types/parsimmon": "^1.10.9",
457
457
  "@types/path-browserify": "^1.0.3",
458
458
  "@types/picomatch": "^4.0.2",
459
459
  "@types/pug": "^2.0.10",
460
460
  "@types/react": "^19.1.10",
461
461
  "@types/shell-quote": "^1.7.5",
462
- "@typescript-eslint/eslint-plugin": "^8.39.1",
463
- "@typescript-eslint/parser": "^8.39.1",
462
+ "@typescript-eslint/eslint-plugin": "^8.40.0",
463
+ "@typescript-eslint/parser": "^8.40.0",
464
464
  "better-typescript-lib": "^2.11.0",
465
465
  "commander": "^14.0.0",
466
466
  "compare-versions": "^6.1.1",
@@ -475,7 +475,7 @@
475
475
  "eslint": "^9.33.0",
476
476
  "eslint-import-resolver-typescript": "^4.4.4",
477
477
  "eslint-plugin-import-x": "^4.16.1",
478
- "eslint-plugin-jsdoc": "^54.0.0",
478
+ "eslint-plugin-jsdoc": "^54.1.0",
479
479
  "eslint-plugin-modules-newlines": "^0.0.7",
480
480
  "eslint-plugin-perfectionist": "^4.15.0",
481
481
  "eslint-plugin-tsdoc": "^0.4.0",
@@ -486,12 +486,12 @@
486
486
  "moment": "^2.30.1",
487
487
  "monkey-around": "^3.0.0",
488
488
  "npm-run-all": "^4.1.5",
489
- "obsidian": "^1.8.7",
490
- "obsidian-typings": "^3.16.0",
489
+ "obsidian": "latest",
490
+ "obsidian-typings": "obsidian-public-latest",
491
491
  "path-browserify": "^1.0.1",
492
492
  "postcss": "^8.5.6",
493
493
  "postcss-modules": "^6.0.1",
494
- "preact": "^10.27.0",
494
+ "preact": "^10.27.1",
495
495
  "react": "^19.1.1",
496
496
  "remark": "^15.0.1",
497
497
  "remark-parse": "^11.0.0",
@@ -503,7 +503,7 @@
503
503
  "tsx": "^4.20.4",
504
504
  "type-fest": "^4.41.0",
505
505
  "typescript": "^5.9.2",
506
- "typescript-eslint": "^8.39.1",
506
+ "typescript-eslint": "^8.40.0",
507
507
  "unist-util-visit": "^5.0.0"
508
508
  },
509
509
  "overrides": {