@mnaoumov/obsidian-lib 4.2.1 → 5.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.
- package/dist/lib/cjs/__merged.cjs +54 -1
- package/dist/lib/cjs/__merged.d.cts +5 -4
- package/dist/lib/cjs/attachment-path.cjs +1 -1
- package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +1 -1
- package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +1 -1
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +1 -1
- package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +1 -1
- package/dist/lib/cjs/components/settings-migration-component.cjs +1 -1
- package/dist/lib/cjs/components/settings-migration-component.d.cts +1 -1
- package/dist/lib/cjs/css-class.cjs +1 -1
- package/dist/lib/cjs/css-class.d.cts +4 -2
- package/dist/lib/cjs/demo-vault-helper-settings.cjs +1 -1
- package/dist/lib/cjs/demo-vault-helper-settings.d.cts +1 -1
- package/dist/lib/cjs/frontmatter.cjs +1 -1
- package/dist/lib/cjs/frontmatter.d.cts +1 -1
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/generated-during-build.d.cts +2 -2
- package/dist/lib/cjs/i18n/i18n.cjs +2 -2
- package/dist/lib/cjs/i18n/i18n.d.cts +1 -1
- package/dist/lib/cjs/i18n/locales/en.cjs +5 -2
- package/dist/lib/cjs/i18n/locales/en.d.cts +4 -1
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -1
- package/dist/lib/cjs/link.cjs +5 -3
- package/dist/lib/cjs/link.d.cts +22 -0
- package/dist/lib/cjs/metadata-cache.cjs +1 -1
- package/dist/lib/cjs/modals/minimizable-modal.cjs +1 -1
- package/dist/lib/cjs/modals/minimizable-modal.d.cts +1 -1
- package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
- package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +3 -3
- package/dist/lib/cjs/obsidian-dev-utils-state.cjs +1 -1
- package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +5 -2
- package/dist/lib/cjs/path-settings.cjs +214 -35
- package/dist/lib/cjs/path-settings.d.cts +21 -5
- package/dist/lib/cjs/plugin/plugin-api.cjs +17 -2
- package/dist/lib/cjs/plugin/plugin-api.d.cts +24 -7
- package/dist/lib/cjs/plugin/plugin-context.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin.cjs +2 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
- package/dist/lib/cjs/resource-lock.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/date-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/date-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/date-time-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/date-time-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/email-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/email-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/file-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/file-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/month-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/month-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-email-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-file-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-text-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/number-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/number-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/password-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/password-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/telephone-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/telephone-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/time-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/time-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/url-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/url-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/week-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/week-component.d.cts +1 -1
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/cjs/vault.d.cts +2 -2
- package/dist/lib/esm/__merged.d.mts +5 -4
- package/dist/lib/esm/__merged.mjs +57 -3
- package/dist/lib/esm/attachment-path.mjs +1 -1
- package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +1 -1
- package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +1 -1
- package/dist/lib/esm/components/plugin-suggestion-component.d.mts +1 -1
- package/dist/lib/esm/components/plugin-suggestion-component.mjs +1 -1
- package/dist/lib/esm/components/settings-migration-component.d.mts +1 -1
- package/dist/lib/esm/components/settings-migration-component.mjs +1 -1
- package/dist/lib/esm/css-class.d.mts +4 -2
- package/dist/lib/esm/css-class.mjs +1 -1
- package/dist/lib/esm/demo-vault-helper-settings.d.mts +1 -1
- package/dist/lib/esm/frontmatter.d.mts +1 -1
- package/dist/lib/esm/frontmatter.mjs +1 -1
- package/dist/lib/esm/generated-during-build.d.mts +2 -2
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/i18n/i18n.d.mts +1 -1
- package/dist/lib/esm/i18n/i18n.mjs +2 -2
- package/dist/lib/esm/i18n/locales/en.d.mts +4 -1
- package/dist/lib/esm/i18n/locales/en.mjs +5 -2
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -1
- package/dist/lib/esm/link.d.mts +22 -0
- package/dist/lib/esm/link.mjs +5 -3
- package/dist/lib/esm/metadata-cache.mjs +1 -1
- package/dist/lib/esm/modals/minimizable-modal.d.mts +1 -1
- package/dist/lib/esm/modals/minimizable-modal.mjs +1 -1
- package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +3 -3
- package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +1 -1
- package/dist/lib/esm/obsidian-dev-utils-state.d.mts +5 -2
- package/dist/lib/esm/obsidian-dev-utils-state.mjs +1 -1
- package/dist/lib/esm/path-settings.d.mts +21 -5
- package/dist/lib/esm/path-settings.mjs +215 -41
- package/dist/lib/esm/plugin/plugin-api.d.mts +24 -7
- package/dist/lib/esm/plugin/plugin-api.mjs +16 -2
- package/dist/lib/esm/plugin/plugin-context.mjs +1 -1
- package/dist/lib/esm/plugin/plugin.d.mts +1 -1
- package/dist/lib/esm/plugin/plugin.mjs +2 -2
- package/dist/lib/esm/resource-lock.mjs +1 -1
- package/dist/lib/esm/setting-components/checkbox-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/checkbox-component.mjs +1 -1
- package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/code-highlighter-component.mjs +1 -1
- package/dist/lib/esm/setting-components/date-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/date-component.mjs +1 -1
- package/dist/lib/esm/setting-components/date-time-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/date-time-component.mjs +1 -1
- package/dist/lib/esm/setting-components/email-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/email-component.mjs +1 -1
- package/dist/lib/esm/setting-components/file-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/file-component.mjs +1 -1
- package/dist/lib/esm/setting-components/month-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/month-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-email-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-email-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-file-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-file-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-text-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-text-component.mjs +1 -1
- package/dist/lib/esm/setting-components/number-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/number-component.mjs +1 -1
- package/dist/lib/esm/setting-components/password-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/password-component.mjs +1 -1
- package/dist/lib/esm/setting-components/telephone-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/telephone-component.mjs +1 -1
- package/dist/lib/esm/setting-components/time-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/time-component.mjs +1 -1
- package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +1 -1
- package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +1 -1
- package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +1 -1
- package/dist/lib/esm/setting-components/url-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/url-component.mjs +1 -1
- package/dist/lib/esm/setting-components/week-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/week-component.mjs +1 -1
- package/dist/lib/esm/vault.d.mts +2 -2
- package/dist/lib/esm/vault.mjs +2 -2
- package/package.json +5 -4
|
@@ -30,20 +30,26 @@ function ensureBrowserProcess() {
|
|
|
30
30
|
ensureBrowserProcess();
|
|
31
31
|
})();
|
|
32
32
|
|
|
33
|
-
import {
|
|
34
|
-
ALWAYS_MATCH_REG_EXP,
|
|
35
|
-
escapeRegExp,
|
|
36
|
-
isValidRegExp,
|
|
37
|
-
NEVER_MATCH_REG_EXP
|
|
38
|
-
} from "@mnaoumov/typescript-lib/reg-exp";
|
|
39
|
-
import { trimEnd } from "@mnaoumov/typescript-lib/string";
|
|
33
|
+
import { escapeRegExp } from "@mnaoumov/typescript-lib/reg-exp";
|
|
40
34
|
import { assertNever } from "@mnaoumov/typescript-lib/type-guards";
|
|
41
35
|
import { t } from "./i18n/i18n.mjs";
|
|
36
|
+
const REG_EXP_ENTRY_REG_EXP = /^\/.*\/[a-z]*$/s;
|
|
37
|
+
const CASE_INSENSITIVE_FLAG = "i";
|
|
38
|
+
const STATEFUL_FLAGS_REG_EXP = /[gy]/g;
|
|
39
|
+
const GLOB_CHARACTERS = /* @__PURE__ */ new Set(["?", "[", "*"]);
|
|
40
|
+
const GLOBSTAR = "**";
|
|
41
|
+
const GLOBSTAR_FOLDERS = "**/";
|
|
42
|
+
const ALWAYS_MATCHER = {
|
|
43
|
+
isMatch: () => true
|
|
44
|
+
};
|
|
45
|
+
const NEVER_MATCHER = {
|
|
46
|
+
isMatch: () => false
|
|
47
|
+
};
|
|
42
48
|
class PathSetting {
|
|
43
49
|
constructor(type) {
|
|
44
50
|
this.type = type;
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
51
|
+
this.defaultMatcher = getDefaultMatcher(type);
|
|
52
|
+
this.matchers = [this.defaultMatcher];
|
|
47
53
|
}
|
|
48
54
|
type;
|
|
49
55
|
get array() {
|
|
@@ -51,19 +57,20 @@ class PathSetting {
|
|
|
51
57
|
}
|
|
52
58
|
set array(value) {
|
|
53
59
|
this._array = value.filter(Boolean);
|
|
54
|
-
this.
|
|
60
|
+
this.matchers = makeMatchers(this._array, this.defaultMatcher) ?? [this.defaultMatcher];
|
|
55
61
|
}
|
|
56
62
|
_array = [];
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
isPathIgnored(path) {
|
|
63
|
+
defaultMatcher;
|
|
64
|
+
matchers;
|
|
65
|
+
isPathIgnored(path, isFolder) {
|
|
66
|
+
const isMatch = this.matchers.some((matcher) => matcher.isMatch(path, isFolder));
|
|
60
67
|
switch (this.type) {
|
|
61
68
|
/* v8 ignore stop */
|
|
62
69
|
case "Exclude" /* Exclude */: {
|
|
63
|
-
return
|
|
70
|
+
return isMatch;
|
|
64
71
|
}
|
|
65
72
|
case "Include" /* Include */: {
|
|
66
|
-
return !
|
|
73
|
+
return !isMatch;
|
|
67
74
|
}
|
|
68
75
|
default: {
|
|
69
76
|
assertNever(this.type);
|
|
@@ -110,58 +117,225 @@ class PathSettings {
|
|
|
110
117
|
* Checks if a path is ignored by the include/exclude path settings.
|
|
111
118
|
*
|
|
112
119
|
* @param path - The path to check.
|
|
120
|
+
* @param isFolder - Whether the path is a folder. Only a folder-only glob (one ending in `/`) reads it: such a glob
|
|
121
|
+
* always matches the contents of a matching folder, and matches the folder itself only when this is `true`.
|
|
113
122
|
* @returns `true` if the path is ignored, `false` otherwise.
|
|
114
123
|
*/
|
|
115
|
-
isPathIgnored(path) {
|
|
116
|
-
return this._includePaths.isPathIgnored(path) || this._excludePaths.isPathIgnored(path);
|
|
124
|
+
isPathIgnored(path, isFolder = false) {
|
|
125
|
+
return this._includePaths.isPathIgnored(path, isFolder) || this._excludePaths.isPathIgnored(path, isFolder);
|
|
117
126
|
}
|
|
118
127
|
}
|
|
119
128
|
function pathsValidator(paths) {
|
|
120
129
|
for (const path of paths) {
|
|
121
|
-
|
|
122
|
-
|
|
130
|
+
const { error } = compileEntry(path, NEVER_MATCHER);
|
|
131
|
+
if (error !== void 0) {
|
|
132
|
+
return error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function compileEntry(entry, defaultMatcher) {
|
|
137
|
+
if (entry === "/") {
|
|
138
|
+
return { matcher: defaultMatcher };
|
|
139
|
+
}
|
|
140
|
+
if (REG_EXP_ENTRY_REG_EXP.test(entry)) {
|
|
141
|
+
const flagsSeparatorIndex = entry.lastIndexOf("/");
|
|
142
|
+
return compileRegExpEntry(entry, entry.slice(1, flagsSeparatorIndex), entry.slice(flagsSeparatorIndex + 1));
|
|
143
|
+
}
|
|
144
|
+
return hasUnescapedGlobCharacter(entry) ? compileGlobEntry(entry) : compilePlainPathEntry(entry);
|
|
145
|
+
}
|
|
146
|
+
function compileGlobEntry(glob) {
|
|
147
|
+
const isFolderOnly = glob.endsWith("/");
|
|
148
|
+
const body = glob.replace(/\/+$/, "");
|
|
149
|
+
const globSource = getGlobSource(body);
|
|
150
|
+
if (!globSource.isValid) {
|
|
151
|
+
return {
|
|
152
|
+
error: t(($) => $.obsidianDevUtils.pathSettings.invalidGlob, { glob, reason: globSource.error })
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const { source } = globSource;
|
|
156
|
+
const prefix = body.includes("/") ? "^" : "(?:^|/)";
|
|
157
|
+
let selfRegExp;
|
|
158
|
+
let contentsRegExp;
|
|
159
|
+
try {
|
|
160
|
+
selfRegExp = new RegExp(`${prefix}${source}$`, CASE_INSENSITIVE_FLAG);
|
|
161
|
+
contentsRegExp = new RegExp(`${prefix}${source}/`, CASE_INSENSITIVE_FLAG);
|
|
162
|
+
} catch (error_) {
|
|
163
|
+
return {
|
|
164
|
+
error: t(($) => $.obsidianDevUtils.pathSettings.invalidGlob, { glob, reason: getRegExpErrorReason(error_) })
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
matcher: {
|
|
169
|
+
isMatch: (path, isFolder) => contentsRegExp.test(path) || (isFolder || !isFolderOnly) && selfRegExp.test(path)
|
|
123
170
|
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function compilePlainPathEntry(path) {
|
|
174
|
+
const unescapedPath = path.replaceAll(/\\(?<character>.)/gs, "$<character>").replace(/\/+$/, "");
|
|
175
|
+
const regExp = new RegExp(`^${escapeRegExp(unescapedPath)}(?:/|$)`, CASE_INSENSITIVE_FLAG);
|
|
176
|
+
return {
|
|
177
|
+
matcher: {
|
|
178
|
+
isMatch: (pathToCheck) => regExp.test(pathToCheck)
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function compileRegExpEntry(entry, source, flags) {
|
|
183
|
+
let regExp;
|
|
184
|
+
try {
|
|
185
|
+
new RegExp(source, flags);
|
|
186
|
+
const effectiveFlags = flags.replaceAll(STATEFUL_FLAGS_REG_EXP, "");
|
|
187
|
+
regExp = new RegExp(source, effectiveFlags.includes(CASE_INSENSITIVE_FLAG) ? effectiveFlags : `${effectiveFlags}${CASE_INSENSITIVE_FLAG}`);
|
|
188
|
+
} catch (error) {
|
|
189
|
+
return {
|
|
190
|
+
error: t(($) => $.obsidianDevUtils.pathSettings.invalidRegularExpression, { reason: getRegExpErrorReason(error), regExp: entry })
|
|
191
|
+
};
|
|
124
192
|
}
|
|
193
|
+
return {
|
|
194
|
+
matcher: {
|
|
195
|
+
isMatch: (path) => regExp.test(path)
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function escapeCharacterClassCharacter(character) {
|
|
200
|
+
return /[-\\\]^[]/.test(character) ? `\\${character}` : character;
|
|
125
201
|
}
|
|
126
|
-
function
|
|
202
|
+
function getCharacterClassSource(glob, openIndex) {
|
|
203
|
+
let index = openIndex + 1;
|
|
204
|
+
let isNegated = false;
|
|
205
|
+
if (glob[index] === "!" || glob[index] === "^") {
|
|
206
|
+
isNegated = true;
|
|
207
|
+
index++;
|
|
208
|
+
}
|
|
209
|
+
let content = "";
|
|
210
|
+
if (glob[index] === "]") {
|
|
211
|
+
content += String.raw`\]`;
|
|
212
|
+
index++;
|
|
213
|
+
}
|
|
214
|
+
while (index < glob.length) {
|
|
215
|
+
const character = glob.charAt(index);
|
|
216
|
+
if (character === "]") {
|
|
217
|
+
return {
|
|
218
|
+
endIndex: index + 1,
|
|
219
|
+
isValid: true,
|
|
220
|
+
source: `[${isNegated ? "^/" : ""}${content}]`
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
if (character === "\\") {
|
|
224
|
+
index++;
|
|
225
|
+
if (index >= glob.length) {
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
content += escapeCharacterClassCharacter(glob.charAt(index));
|
|
229
|
+
} else {
|
|
230
|
+
content += character === "-" ? character : escapeCharacterClassCharacter(character);
|
|
231
|
+
}
|
|
232
|
+
index++;
|
|
233
|
+
}
|
|
234
|
+
return { error: t(($) => $.obsidianDevUtils.pathSettings.unclosedCharacterClass), isValid: false };
|
|
235
|
+
}
|
|
236
|
+
function getDefaultMatcher(type) {
|
|
127
237
|
switch (type) {
|
|
128
238
|
/* v8 ignore stop */
|
|
129
239
|
case "Exclude" /* Exclude */: {
|
|
130
|
-
return
|
|
240
|
+
return NEVER_MATCHER;
|
|
131
241
|
}
|
|
132
242
|
case "Include" /* Include */: {
|
|
133
|
-
return
|
|
243
|
+
return ALWAYS_MATCHER;
|
|
134
244
|
}
|
|
135
245
|
default: {
|
|
136
246
|
assertNever(type);
|
|
137
247
|
}
|
|
138
248
|
}
|
|
139
249
|
}
|
|
140
|
-
function
|
|
141
|
-
|
|
142
|
-
|
|
250
|
+
function getGlobSource(glob) {
|
|
251
|
+
let source = "";
|
|
252
|
+
let index = 0;
|
|
253
|
+
while (index < glob.length) {
|
|
254
|
+
const character = glob.charAt(index);
|
|
255
|
+
switch (character) {
|
|
256
|
+
case "?": {
|
|
257
|
+
source += "[^/]";
|
|
258
|
+
index++;
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case "[": {
|
|
262
|
+
const characterClass = getCharacterClassSource(glob, index);
|
|
263
|
+
if (!characterClass.isValid) {
|
|
264
|
+
return characterClass;
|
|
265
|
+
}
|
|
266
|
+
source += characterClass.source;
|
|
267
|
+
index = characterClass.endIndex;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
case "*": {
|
|
271
|
+
if (!glob.startsWith(GLOBSTAR, index)) {
|
|
272
|
+
source += "[^/]*";
|
|
273
|
+
index++;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
const isSegmentStart = index === 0 || glob[index - 1] === "/";
|
|
277
|
+
if (isSegmentStart && glob.startsWith(GLOBSTAR_FOLDERS, index)) {
|
|
278
|
+
source += "(?:[^/]*/)*";
|
|
279
|
+
index += GLOBSTAR_FOLDERS.length;
|
|
280
|
+
} else if (isSegmentStart && index + GLOBSTAR.length === glob.length) {
|
|
281
|
+
source += ".*";
|
|
282
|
+
index += GLOBSTAR.length;
|
|
283
|
+
} else {
|
|
284
|
+
source += "[^/]*";
|
|
285
|
+
index += GLOBSTAR.length;
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
case "\\": {
|
|
290
|
+
index++;
|
|
291
|
+
if (index >= glob.length) {
|
|
292
|
+
return { error: t(($) => $.obsidianDevUtils.pathSettings.trailingEscape), isValid: false };
|
|
293
|
+
}
|
|
294
|
+
source += escapeRegExp(glob.charAt(index));
|
|
295
|
+
index++;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
default: {
|
|
299
|
+
source += escapeRegExp(character);
|
|
300
|
+
index++;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
143
304
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
305
|
+
return { isValid: true, source };
|
|
306
|
+
}
|
|
307
|
+
function getRegExpErrorReason(error) {
|
|
308
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
309
|
+
const match = /^Invalid regular expression: \/.*\/[a-z]*: (?<reason>.*)$/s.exec(message);
|
|
310
|
+
return match?.groups?.["reason"] ?? message;
|
|
311
|
+
}
|
|
312
|
+
function hasUnescapedGlobCharacter(entry) {
|
|
313
|
+
for (let index = 0; index < entry.length; index++) {
|
|
314
|
+
const character = entry.charAt(index);
|
|
315
|
+
if (character === "\\") {
|
|
316
|
+
index++;
|
|
317
|
+
} else if (GLOB_CHARACTERS.has(character)) {
|
|
318
|
+
return true;
|
|
147
319
|
}
|
|
148
|
-
|
|
149
|
-
|
|
320
|
+
}
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
function makeMatchers(paths, defaultMatcher) {
|
|
324
|
+
if (paths.length === 0) {
|
|
325
|
+
return [defaultMatcher];
|
|
326
|
+
}
|
|
327
|
+
const matchers = [];
|
|
328
|
+
for (const path of paths) {
|
|
329
|
+
const { matcher } = compileEntry(path, defaultMatcher);
|
|
330
|
+
if (!matcher) {
|
|
331
|
+
return null;
|
|
150
332
|
}
|
|
151
|
-
|
|
152
|
-
$string: path,
|
|
153
|
-
suffix: "/"
|
|
154
|
-
});
|
|
155
|
-
return `^${escapeRegExp(path)}(/|$)`;
|
|
156
|
-
}).map((regExpString) => `(${regExpString})`).join("|");
|
|
157
|
-
try {
|
|
158
|
-
return new RegExp(regExpStringCombined);
|
|
159
|
-
} catch {
|
|
160
|
-
return null;
|
|
333
|
+
matchers.push(matcher);
|
|
161
334
|
}
|
|
335
|
+
return matchers;
|
|
162
336
|
}
|
|
163
337
|
export {
|
|
164
338
|
PathSettings,
|
|
165
339
|
pathsValidator
|
|
166
340
|
};
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXRoLXNldHRpbmdzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjbGFzc2VzIGFuZCB2YWxpZGF0b3JzIGZvciBtYW5hZ2luZyBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuXG5pbXBvcnQge1xuICBBTFdBWVNfTUFUQ0hfUkVHX0VYUCxcbiAgZXNjYXBlUmVnRXhwLFxuICBpc1ZhbGlkUmVnRXhwLFxuICBORVZFUl9NQVRDSF9SRUdfRVhQXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcblxuZW51bSBQYXRoU2V0dGluZ1R5cGUge1xuICBFeGNsdWRlID0gJ0V4Y2x1ZGUnLFxuICBJbmNsdWRlID0gJ0luY2x1ZGUnXG59XG5cbmNsYXNzIFBhdGhTZXR0aW5nIHtcbiAgcHVibGljIGdldCBhcnJheSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5O1xuICB9XG5cbiAgcHVibGljIHNldCBhcnJheSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hcnJheSA9IHZhbHVlLmZpbHRlcihCb29sZWFuKTtcbiAgICB0aGlzLnJlZ0V4cCA9IG1ha2VSZWdFeHAodGhpcy5fYXJyYXksIHRoaXMuZGVmYXVsdFJlZ0V4cCkgPz8gdGhpcy5kZWZhdWx0UmVnRXhwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFJlZ0V4cDogUmVnRXhwO1xuICBwcml2YXRlIHJlZ0V4cDogUmVnRXhwO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFBhdGhTZXR0aW5nVHlwZSkge1xuICAgIHRoaXMuZGVmYXVsdFJlZ0V4cCA9IGdldERlZmF1bHRSZWdFeHAodHlwZSk7XG4gICAgdGhpcy5yZWdFeHAgPSB0aGlzLmRlZmF1bHRSZWdFeHA7XG4gIH1cblxuICBwdWJsaWMgaXNQYXRoSWdub3JlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIFBhdGhTZXR0aW5nVHlwZS5FeGNsdWRlOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ0V4cC50ZXN0KHBhdGgpO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXRoU2V0dGluZ1R5cGUuSW5jbHVkZToge1xuICAgICAgICByZXR1cm4gIXRoaXMucmVnRXhwLnRlc3QocGF0aCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZC4gKi9cbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy50eXBlKTtcbiAgICAgIH1cbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIGZvciBtYW5hZ2luZyBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBleGNsdWRlIHBhdGhzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZXhjbHVkZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZXhjbHVkZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZVBhdGhzLmFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4Y2x1ZGUgcGF0aHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBleGNsdWRlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIHNldCBleGNsdWRlUGF0aHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZVBhdGhzLmFycmF5ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW5jbHVkZSBwYXRocy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGluY2x1ZGUgcGF0aHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluY2x1ZGVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVQYXRocy5hcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbmNsdWRlIHBhdGhzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5jbHVkZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBzZXQgaW5jbHVkZVBhdGhzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVQYXRocy5hcnJheSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhjbHVkZVBhdGhzID0gbmV3IFBhdGhTZXR0aW5nKFBhdGhTZXR0aW5nVHlwZS5FeGNsdWRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5jbHVkZVBhdGhzID0gbmV3IFBhdGhTZXR0aW5nKFBhdGhTZXR0aW5nVHlwZS5JbmNsdWRlKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBpZ25vcmVkIGJ5IHRoZSBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGlnbm9yZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVQYXRocy5pc1BhdGhJZ25vcmVkKHBhdGgpIHx8IHRoaXMuX2V4Y2x1ZGVQYXRocy5pc1BhdGhJZ25vcmVkKHBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGluY2x1ZGUvZXhjbHVkZSBwYXRoIGVudHJpZXMsIHJlcG9ydGluZyB0aGUgZmlyc3QgZW50cnkgdGhhdCBpcyBub3QgYSBwYXJzZWFibGUgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEFuIGVudHJ5IHRoYXQgc3RhcnRzIGFuZCBlbmRzIHdpdGggYC9gIGlzIGEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWw7IGV2ZXJ5IG90aGVyIGVudHJ5IGlzIGEgcGxhaW4gcGF0aCBhbmQgaXNcbiAqIGFsd2F5cyB2YWxpZC4gQW4gaW52YWxpZCBlbnRyeSBkb2VzIG5vdCB0aHJvdyB3aGVuIGFzc2lnbmVkIHRvIHtAbGluayBQYXRoU2V0dGluZ3N9IOKAlCB0aGUgd2hvbGUgbGlzdCBmYWxscyBiYWNrIHRvXG4gKiBpdHMgZGVmYXVsdCBwYXR0ZXJuIGluc3RlYWQg4oCUIHNvIHRoaXMgdmFsaWRhdG9yIGlzIHdoYXQgc3VyZmFjZXMgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXIuXG4gKlxuICogQHBhcmFtIHBhdGhzIC0gVGhlIHBhdGggZW50cmllcyB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIEEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpcnN0IGludmFsaWQgZW50cnksIG9yIG5vdGhpbmcgd2hlbiBldmVyeSBlbnRyeSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzVmFsaWRhdG9yKHBhdGhzOiBzdHJpbmdbXSk6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykgJiYgcGF0aC5lbmRzV2l0aCgnLycpICYmICFpc1ZhbGlkUmVnRXhwKHBhdGguc2xpY2UoMSwgLTEpKSkge1xuICAgICAgcmV0dXJuIHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wYXRoU2V0dGluZ3MuaW52YWxpZFJlZ3VsYXJFeHByZXNzaW9uLCB7IHJlZ0V4cDogcGF0aCB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlZ0V4cCh0eXBlOiBQYXRoU2V0dGluZ1R5cGUpOiBSZWdFeHAge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY2FzZSBQYXRoU2V0dGluZ1R5cGUuRXhjbHVkZToge1xuICAgICAgcmV0dXJuIE5FVkVSX01BVENIX1JFR19FWFA7XG4gICAgfVxuICAgIGNhc2UgUGF0aFNldHRpbmdUeXBlLkluY2x1ZGU6IHtcbiAgICAgIHJldHVybiBBTFdBWVNfTUFUQ0hfUkVHX0VYUDtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgYXNzZXJ0TmV2ZXIodHlwZSk7XG4gICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlUmVnRXhwKHBhdGhzOiBzdHJpbmdbXSwgZGVmYXVsdFJlZ0V4cDogUmVnRXhwKTogbnVsbCB8IFJlZ0V4cCB7XG4gIGlmIChwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZGVmYXVsdFJlZ0V4cDtcbiAgfVxuXG4gIGNvbnN0IHJlZ0V4cFN0cmluZ0NvbWJpbmVkID0gcGF0aHMubWFwKChwYXRoKSA9PiB7XG4gICAgaWYgKHBhdGggPT09ICcvJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRSZWdFeHAuc291cmNlO1xuICAgIH1cblxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy8nKSAmJiBwYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICBwYXRoID0gdHJpbUVuZCh7XG4gICAgICAkc3RyaW5nOiBwYXRoLFxuICAgICAgc3VmZml4OiAnLydcbiAgICB9KTtcbiAgICByZXR1cm4gYF4ke2VzY2FwZVJlZ0V4cChwYXRoKX0oL3wkKWA7XG4gIH0pXG4gICAgLm1hcCgocmVnRXhwU3RyaW5nKSA9PiBgKCR7cmVnRXhwU3RyaW5nfSlgKVxuICAgIC5qb2luKCd8Jyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdFeHBTdHJpbmdDb21iaW5lZCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgcGFydGlhbGx5IHR5cGVkIHJlZ2V4IGxpdGVyYWwgKGAvXkluYm94XFwvYCkgaXMgbm90IHBhcnNlYWJsZS5cbiAgICAvLyBSZXBvcnQgaXQgaW5zdGVhZCBvZiB0aHJvd2luZyBmcm9tIGEgc2V0dGluZ3Mgc2V0dGVyLCB3aGljaCB3b3VsZCBicmVhayBib3RoIHRoZSBzZXR0aW5ncyBVSSBhbmQgdGhlIHNhdmUgcGF0aC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGVBQWU7QUFDeEIsU0FBUyxtQkFBbUI7QUFFNUIs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
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXRoLXNldHRpbmdzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjbGFzc2VzIGFuZCB2YWxpZGF0b3JzIGZvciBtYW5hZ2luZyBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAqXG4gKiBBbiBlbnRyeSB0YWtlcyBvbmUgb2YgdGhyZWUgZm9ybXMsIGFuZCBldmVyeSBmb3JtIG1hdGNoZXMgY2FzZS1pbnNlbnNpdGl2ZWx5OlxuICpcbiAqIC0gQSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCwgYC9wYXR0ZXJuL2ZsYWdzYC4gSXRzIG93biBmbGFncyBhcmUgaG9ub3VyZWQgYW5kIGBpYCBpcyBhbHdheXMgYWRkZWQuIGBnYCBhbmQgYHlgIGFyZVxuICogICBhY2NlcHRlZCBhbmQgZHJvcHBlZCwgc2luY2UgdGhleSBtYWtlIGBSZWdFeHAudGVzdGAgc3RhdGVmdWwgYW5kIHNheSBub3RoaW5nIGFib3V0IHdoaWNoIHBhdGhzIG1hdGNoLlxuICogLSBBIGdsb2IsIGFuIGVudHJ5IGhvbGRpbmcgYW4gdW5lc2NhcGVkIGAqYCwgYD9gIG9yIGBbYC4gYCpgIG1hdGNoZXMgd2l0aGluIG9uZSBwYXRoIHNlZ21lbnQsIGAqKmAgYWNyb3NzIHNlZ21lbnRzLFxuICogICBgP2Agb25lIGNoYXJhY3RlciBhbmQgYFthYmNdYCAvIGBbIWFiY11gIGEgY2hhcmFjdGVyIGNsYXNzLiBBIGdsb2Igd2l0aCBubyBgL2AgbWF0Y2hlcyBhIGZpbGUgb3IgZm9sZGVyIE5BTUUgYXQgYW55XG4gKiAgIGRlcHRoLCBhcyBpbiBgLmdpdGlnbm9yZWAgKGAqLnBkZmAgbWF0Y2hlcyBgYS9iL2MucGRmYCk7IG9uZSB3aXRoIGEgYC9gIGlzIGFuY2hvcmVkIHRvIHRoZSB2YXVsdCByb290XG4gKiAgIChgQXR0YWNobWVudHMvKi5wZGZgKS4gQSB0cmFpbGluZyBgL2AgbWFrZXMgaXQgbWF0Y2ggZm9sZGVycyBvbmx5LlxuICogLSBBIHBsYWluIHBhdGgsIGV2ZXJ5IG90aGVyIGVudHJ5LCB3aGljaCBtYXRjaGVzIHRoYXQgcGF0aCBhbmQgZXZlcnl0aGluZyBpbnNpZGUgaXQuIEEgbGl0ZXJhbCBgKmAsIGA/YCwgYFtgIG9yIGBcXGAgaW5cbiAqICAgYSBwbGFpbiBwYXRoIG9yIGEgZ2xvYiBpcyB3cml0dGVuIGVzY2FwZWQgKGBcXCpgKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5cbmVudW0gUGF0aFNldHRpbmdUeXBlIHtcbiAgRXhjbHVkZSA9ICdFeGNsdWRlJyxcbiAgSW5jbHVkZSA9ICdJbmNsdWRlJ1xufVxuXG50eXBlIENoYXJhY3RlckNsYXNzU291cmNlUmVzdWx0ID0gSW52YWxpZFNvdXJjZVJlc3VsdCB8IFZhbGlkQ2hhcmFjdGVyQ2xhc3NTb3VyY2VSZXN1bHQ7XG5cbmludGVyZmFjZSBDb21waWxlUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXJyb3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hdGNoZXI/OiBQYXRoTWF0Y2hlcjtcbn1cblxudHlwZSBHbG9iU291cmNlUmVzdWx0ID0gSW52YWxpZFNvdXJjZVJlc3VsdCB8IFZhbGlkR2xvYlNvdXJjZVJlc3VsdDtcblxuaW50ZXJmYWNlIEludmFsaWRTb3VyY2VSZXN1bHQge1xuICByZWFkb25seSBlcnJvcjogc3RyaW5nO1xuICByZWFkb25seSBpc1ZhbGlkOiBmYWxzZTtcbn1cblxuaW50ZXJmYWNlIFBhdGhNYXRjaGVyIHtcbiAgaXNNYXRjaDogKHBhdGg6IHN0cmluZywgaXNGb2xkZXI6IGJvb2xlYW4pID0+IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBWYWxpZENoYXJhY3RlckNsYXNzU291cmNlUmVzdWx0IGV4dGVuZHMgVmFsaWRHbG9iU291cmNlUmVzdWx0IHtcbiAgcmVhZG9ubHkgZW5kSW5kZXg6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZhbGlkR2xvYlNvdXJjZVJlc3VsdCB7XG4gIHJlYWRvbmx5IGlzVmFsaWQ6IHRydWU7XG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG5jb25zdCBSRUdfRVhQX0VOVFJZX1JFR19FWFAgPSAvXlxcLy4qXFwvW2Etel0qJC9zO1xuY29uc3QgQ0FTRV9JTlNFTlNJVElWRV9GTEFHID0gJ2knO1xuY29uc3QgU1RBVEVGVUxfRkxBR1NfUkVHX0VYUCA9IC9bZ3ldL2c7XG5jb25zdCBHTE9CX0NIQVJBQ1RFUlMgPSBuZXcgU2V0KFsnPycsICdbJywgJyonXSk7XG5jb25zdCBHTE9CU1RBUiA9ICcqKic7XG5jb25zdCBHTE9CU1RBUl9GT0xERVJTID0gJyoqLyc7XG5cbmNvbnN0IEFMV0FZU19NQVRDSEVSOiBQYXRoTWF0Y2hlciA9IHtcbiAgaXNNYXRjaDogKCkgPT4gdHJ1ZVxufTtcblxuY29uc3QgTkVWRVJfTUFUQ0hFUjogUGF0aE1hdGNoZXIgPSB7XG4gIGlzTWF0Y2g6ICgpID0+IGZhbHNlXG59O1xuXG5jbGFzcyBQYXRoU2V0dGluZyB7XG4gIHB1YmxpYyBnZXQgYXJyYXkoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hcnJheTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYXJyYXkodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXJyYXkgPSB2YWx1ZS5maWx0ZXIoQm9vbGVhbik7XG4gICAgdGhpcy5tYXRjaGVycyA9IG1ha2VNYXRjaGVycyh0aGlzLl9hcnJheSwgdGhpcy5kZWZhdWx0TWF0Y2hlcikgPz8gW3RoaXMuZGVmYXVsdE1hdGNoZXJdO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1hdGNoZXI6IFBhdGhNYXRjaGVyO1xuICBwcml2YXRlIG1hdGNoZXJzOiBQYXRoTWF0Y2hlcltdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFBhdGhTZXR0aW5nVHlwZSkge1xuICAgIHRoaXMuZGVmYXVsdE1hdGNoZXIgPSBnZXREZWZhdWx0TWF0Y2hlcih0eXBlKTtcbiAgICB0aGlzLm1hdGNoZXJzID0gW3RoaXMuZGVmYXVsdE1hdGNoZXJdO1xuICB9XG5cbiAgcHVibGljIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nLCBpc0ZvbGRlcjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzTWF0Y2ggPSB0aGlzLm1hdGNoZXJzLnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoZXIuaXNNYXRjaChwYXRoLCBpc0ZvbGRlcikpO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgYnJhbmNoZXMgY292ZXJlZCBidXQgdjggcmVwb3J0cyBzd2l0Y2ggYXMgcGFydGlhbC4gKi9cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgUGF0aFNldHRpbmdUeXBlLkV4Y2x1ZGU6IHtcbiAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICB9XG4gICAgICBjYXNlIFBhdGhTZXR0aW5nVHlwZS5JbmNsdWRlOiB7XG4gICAgICAgIHJldHVybiAhaXNNYXRjaDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLnR5cGUpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgZm9yIG1hbmFnaW5nIGluY2x1ZGUvZXhjbHVkZSBwYXRoIHNldHRpbmdzLlxuICpcbiAqIFNlZSB0aGUgbW9kdWxlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlbnRyeSBzeW50YXg6IHBsYWluIHBhdGhzLCBnbG9icyBhbmQgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWxzLCBhbGwgbWF0Y2hlZFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICovXG5leHBvcnQgY2xhc3MgUGF0aFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGV4Y2x1ZGUgcGF0aHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBleGNsdWRlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIGdldCBleGNsdWRlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlUGF0aHMuYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhjbHVkZSBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGV4Y2x1ZGUgcGF0aHMuXG4gICAqL1xuICBwdWJsaWMgc2V0IGV4Y2x1ZGVQYXRocyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9leGNsdWRlUGF0aHMuYXJyYXkgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbmNsdWRlIHBhdGhzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaW5jbHVkZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5jbHVkZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZVBhdGhzLmFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGluY2x1ZGUgcGF0aHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmNsdWRlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIHNldCBpbmNsdWRlUGF0aHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZVBhdGhzLmFycmF5ID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9leGNsdWRlUGF0aHMgPSBuZXcgUGF0aFNldHRpbmcoUGF0aFNldHRpbmdUeXBlLkV4Y2x1ZGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbmNsdWRlUGF0aHMgPSBuZXcgUGF0aFNldHRpbmcoUGF0aFNldHRpbmdUeXBlLkluY2x1ZGUpO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBwYXRoIGlzIGlnbm9yZWQgYnkgdGhlIGluY2x1ZGUvZXhjbHVkZSBwYXRoIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gaXNGb2xkZXIgLSBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgZm9sZGVyLiBPbmx5IGEgZm9sZGVyLW9ubHkgZ2xvYiAob25lIGVuZGluZyBpbiBgL2ApIHJlYWRzIGl0OiBzdWNoIGEgZ2xvYlxuICAgKiBhbHdheXMgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgYSBtYXRjaGluZyBmb2xkZXIsIGFuZCBtYXRjaGVzIHRoZSBmb2xkZXIgaXRzZWxmIG9ubHkgd2hlbiB0aGlzIGlzIGB0cnVlYC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGlnbm9yZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nLCBpc0ZvbGRlciA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVQYXRocy5pc1BhdGhJZ25vcmVkKHBhdGgsIGlzRm9sZGVyKSB8fCB0aGlzLl9leGNsdWRlUGF0aHMuaXNQYXRoSWdub3JlZChwYXRoLCBpc0ZvbGRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgaW5jbHVkZS9leGNsdWRlIHBhdGggZW50cmllcywgcmVwb3J0aW5nIHRoZSBmaXJzdCBlbnRyeSB0aGF0IGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBnbG9iLlxuICpcbiAqIEFuIGludmFsaWQgZW50cnkgZG9lcyBub3QgdGhyb3cgd2hlbiBhc3NpZ25lZCB0byB7QGxpbmsgUGF0aFNldHRpbmdzfSDigJQgdGhlIHdob2xlIGxpc3QgZmFsbHMgYmFjayB0byBpdHMgZGVmYXVsdFxuICogcGF0dGVybiBpbnN0ZWFkIOKAlCBzbyB0aGlzIHZhbGlkYXRvciBpcyB3aGF0IHN1cmZhY2VzIHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyLiBUaGUgbWVzc2FnZSBuYW1lcyB0aGUgZW50cnkgYW5kIHRoZVxuICogcmVhc29uIGl0IGlzIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHBhdGhzIC0gVGhlIHBhdGggZW50cmllcyB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIEEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpcnN0IGludmFsaWQgZW50cnksIG9yIG5vdGhpbmcgd2hlbiBldmVyeSBlbnRyeSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzVmFsaWRhdG9yKHBhdGhzOiBzdHJpbmdbXSk6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBjb25zdCB7IGVycm9yIH0gPSBjb21waWxlRW50cnkocGF0aCwgTkVWRVJfTUFUQ0hFUik7XG4gICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZUVudHJ5KGVudHJ5OiBzdHJpbmcsIGRlZmF1bHRNYXRjaGVyOiBQYXRoTWF0Y2hlcik6IENvbXBpbGVSZXN1bHQge1xuICBpZiAoZW50cnkgPT09ICcvJykge1xuICAgIHJldHVybiB7IG1hdGNoZXI6IGRlZmF1bHRNYXRjaGVyIH07XG4gIH1cblxuICBpZiAoUkVHX0VYUF9FTlRSWV9SRUdfRVhQLnRlc3QoZW50cnkpKSB7XG4gICAgY29uc3QgZmxhZ3NTZXBhcmF0b3JJbmRleCA9IGVudHJ5Lmxhc3RJbmRleE9mKCcvJyk7XG4gICAgcmV0dXJuIGNvbXBpbGVSZWdFeHBFbnRyeShlbnRyeSwgZW50cnkuc2xpY2UoMSwgZmxhZ3NTZXBhcmF0b3JJbmRleCksIGVudHJ5LnNsaWNlKGZsYWdzU2VwYXJhdG9ySW5kZXggKyAxKSk7XG4gIH1cblxuICByZXR1cm4gaGFzVW5lc2NhcGVkR2xvYkNoYXJhY3RlcihlbnRyeSkgPyBjb21waWxlR2xvYkVudHJ5KGVudHJ5KSA6IGNvbXBpbGVQbGFpblBhdGhFbnRyeShlbnRyeSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVHbG9iRW50cnkoZ2xvYjogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCB7XG4gIGNvbnN0IGlzRm9sZGVyT25seSA9IGdsb2IuZW5kc1dpdGgoJy8nKTtcbiAgY29uc3QgYm9keSA9IGdsb2IucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGNvbnN0IGdsb2JTb3VyY2UgPSBnZXRHbG9iU291cmNlKGJvZHkpO1xuICBpZiAoIWdsb2JTb3VyY2UuaXNWYWxpZCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy5pbnZhbGlkR2xvYiwgeyBnbG9iLCByZWFzb246IGdsb2JTb3VyY2UuZXJyb3IgfSlcbiAgICB9O1xuICB9XG4gIGNvbnN0IHsgc291cmNlIH0gPSBnbG9iU291cmNlO1xuXG4gIGNvbnN0IHByZWZpeCA9IGJvZHkuaW5jbHVkZXMoJy8nKSA/ICdeJyA6ICcoPzpefC8pJztcblxuICBsZXQgc2VsZlJlZ0V4cDogUmVnRXhwO1xuICBsZXQgY29udGVudHNSZWdFeHA6IFJlZ0V4cDtcbiAgdHJ5IHtcbiAgICBzZWxmUmVnRXhwID0gbmV3IFJlZ0V4cChgJHtwcmVmaXh9JHtzb3VyY2V9JGAsIENBU0VfSU5TRU5TSVRJVkVfRkxBRyk7XG4gICAgY29udGVudHNSZWdFeHAgPSBuZXcgUmVnRXhwKGAke3ByZWZpeH0ke3NvdXJjZX0vYCwgQ0FTRV9JTlNFTlNJVElWRV9GTEFHKTtcbiAgfSBjYXRjaCAoZXJyb3JfKSB7XG4gICAgLy8gQW4gb3V0LW9mLW9yZGVyIGNoYXJhY3RlciBjbGFzcyByYW5nZSAoYFt6LWFdYCkgaXMgdGhlIG9uZSBpbnZhbGlkIGdsb2Igb25seSB0aGUgZW5naW5lIGNhbiB0ZWxsLlxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy5pbnZhbGlkR2xvYiwgeyBnbG9iLCByZWFzb246IGdldFJlZ0V4cEVycm9yUmVhc29uKGVycm9yXykgfSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVyOiB7XG4gICAgICBpc01hdGNoOiAocGF0aCwgaXNGb2xkZXIpID0+IGNvbnRlbnRzUmVnRXhwLnRlc3QocGF0aCkgfHwgKChpc0ZvbGRlciB8fCAhaXNGb2xkZXJPbmx5KSAmJiBzZWxmUmVnRXhwLnRlc3QocGF0aCkpXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21waWxlUGxhaW5QYXRoRW50cnkocGF0aDogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCB7XG4gIGNvbnN0IHVuZXNjYXBlZFBhdGggPSBwYXRoLnJlcGxhY2VBbGwoL1xcXFwoPzxjaGFyYWN0ZXI+LikvZ3MsICckPGNoYXJhY3Rlcj4nKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlUmVnRXhwKHVuZXNjYXBlZFBhdGgpfSg/Oi98JClgLCBDQVNFX0lOU0VOU0lUSVZFX0ZMQUcpO1xuICByZXR1cm4ge1xuICAgIG1hdGNoZXI6IHtcbiAgICAgIGlzTWF0Y2g6IChwYXRoVG9DaGVjaykgPT4gcmVnRXhwLnRlc3QocGF0aFRvQ2hlY2spXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21waWxlUmVnRXhwRW50cnkoZW50cnk6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIGZsYWdzOiBzdHJpbmcpOiBDb21waWxlUmVzdWx0IHtcbiAgbGV0IHJlZ0V4cDogUmVnRXhwO1xuICB0cnkge1xuICAgIC8vIENvbXBpbGVkIHdpdGggdGhlIGZsYWdzIGFzIHdyaXR0ZW4gZmlyc3QsIHNvIGFuIHVua25vd24gb3IgcmVwZWF0ZWQgZmxhZyBpcyByZXBvcnRlZCByYXRoZXIgdGhhbiBpZ25vcmVkLlxuICAgIG5ldyBSZWdFeHAoc291cmNlLCBmbGFncyk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmxhZ3MgPSBmbGFncy5yZXBsYWNlQWxsKFNUQVRFRlVMX0ZMQUdTX1JFR19FWFAsICcnKTtcbiAgICByZWdFeHAgPSBuZXcgUmVnRXhwKHNvdXJjZSwgZWZmZWN0aXZlRmxhZ3MuaW5jbHVkZXMoQ0FTRV9JTlNFTlNJVElWRV9GTEFHKSA/IGVmZmVjdGl2ZUZsYWdzIDogYCR7ZWZmZWN0aXZlRmxhZ3N9JHtDQVNFX0lOU0VOU0lUSVZFX0ZMQUd9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQSBwYXJ0aWFsbHkgdHlwZWQgcmVnZXggbGl0ZXJhbCAoYC9eSW5ib3hcXC9gKSBpcyBub3QgcGFyc2VhYmxlLlxuICAgIC8vIFJlcG9ydCBpdCBpbnN0ZWFkIG9mIHRocm93aW5nIGZyb20gYSBzZXR0aW5ncyBzZXR0ZXIsIHdoaWNoIHdvdWxkIGJyZWFrIGJvdGggdGhlIHNldHRpbmdzIFVJIGFuZCB0aGUgc2F2ZSBwYXRoLlxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy5pbnZhbGlkUmVndWxhckV4cHJlc3Npb24sIHsgcmVhc29uOiBnZXRSZWdFeHBFcnJvclJlYXNvbihlcnJvciksIHJlZ0V4cDogZW50cnkgfSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVyOiB7XG4gICAgICBpc01hdGNoOiAocGF0aCkgPT4gcmVnRXhwLnRlc3QocGF0aClcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUNoYXJhY3RlckNsYXNzQ2hhcmFjdGVyKGNoYXJhY3Rlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9bLVxcXFxcXF1eW10vLnRlc3QoY2hhcmFjdGVyKSA/IGBcXFxcJHtjaGFyYWN0ZXJ9YCA6IGNoYXJhY3Rlcjtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ2xhc3NTb3VyY2UoZ2xvYjogc3RyaW5nLCBvcGVuSW5kZXg6IG51bWJlcik6IENoYXJhY3RlckNsYXNzU291cmNlUmVzdWx0IHtcbiAgbGV0IGluZGV4ID0gb3BlbkluZGV4ICsgMTtcbiAgbGV0IGlzTmVnYXRlZCA9IGZhbHNlO1xuICBpZiAoZ2xvYltpbmRleF0gPT09ICchJyB8fCBnbG9iW2luZGV4XSA9PT0gJ14nKSB7XG4gICAgaXNOZWdhdGVkID0gdHJ1ZTtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgbGV0IGNvbnRlbnQgPSAnJztcbiAgaWYgKGdsb2JbaW5kZXhdID09PSAnXScpIHtcbiAgICBjb250ZW50ICs9IFN0cmluZy5yYXdgXFxdYDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgd2hpbGUgKGluZGV4IDwgZ2xvYi5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbG9iLmNoYXJBdChpbmRleCk7XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ10nKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbmRJbmRleDogaW5kZXggKyAxLFxuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzb3VyY2U6IGBbJHtpc05lZ2F0ZWQgPyAnXi8nIDogJyd9JHtjb250ZW50fV1gXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIGlmIChpbmRleCA+PSBnbG9iLmxlbmd0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gZXNjYXBlQ2hhcmFjdGVyQ2xhc3NDaGFyYWN0ZXIoZ2xvYi5jaGFyQXQoaW5kZXgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCArPSBjaGFyYWN0ZXIgPT09ICctJyA/IGNoYXJhY3RlciA6IGVzY2FwZUNoYXJhY3RlckNsYXNzQ2hhcmFjdGVyKGNoYXJhY3Rlcik7XG4gICAgfVxuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4geyBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy51bmNsb3NlZENoYXJhY3RlckNsYXNzKSwgaXNWYWxpZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdE1hdGNoZXIodHlwZTogUGF0aFNldHRpbmdUeXBlKTogUGF0aE1hdGNoZXIge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY2FzZSBQYXRoU2V0dGluZ1R5cGUuRXhjbHVkZToge1xuICAgICAgcmV0dXJuIE5FVkVSX01BVENIRVI7XG4gICAgfVxuICAgIGNhc2UgUGF0aFNldHRpbmdUeXBlLkluY2x1ZGU6IHtcbiAgICAgIHJldHVybiBBTFdBWVNfTUFUQ0hFUjtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgYXNzZXJ0TmV2ZXIodHlwZSk7XG4gICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRHbG9iU291cmNlKGdsb2I6IHN0cmluZyk6IEdsb2JTb3VyY2VSZXN1bHQge1xuICBsZXQgc291cmNlID0gJyc7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGluZGV4IDwgZ2xvYi5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbG9iLmNoYXJBdChpbmRleCk7XG4gICAgc3dpdGNoIChjaGFyYWN0ZXIpIHtcbiAgICAgIGNhc2UgJz8nOiB7XG4gICAgICAgIHNvdXJjZSArPSAnW14vXSc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnWyc6IHtcbiAgICAgICAgY29uc3QgY2hhcmFjdGVyQ2xhc3MgPSBnZXRDaGFyYWN0ZXJDbGFzc1NvdXJjZShnbG9iLCBpbmRleCk7XG4gICAgICAgIGlmICghY2hhcmFjdGVyQ2xhc3MuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBjaGFyYWN0ZXJDbGFzcztcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgKz0gY2hhcmFjdGVyQ2xhc3Muc291cmNlO1xuICAgICAgICBpbmRleCA9IGNoYXJhY3RlckNsYXNzLmVuZEluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJyonOiB7XG4gICAgICAgIGlmICghZ2xvYi5zdGFydHNXaXRoKEdMT0JTVEFSLCBpbmRleCkpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gJ1teL10qJztcbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNTZWdtZW50U3RhcnQgPSBpbmRleCA9PT0gMCB8fCBnbG9iW2luZGV4IC0gMV0gPT09ICcvJztcbiAgICAgICAgaWYgKGlzU2VnbWVudFN0YXJ0ICYmIGdsb2Iuc3RhcnRzV2l0aChHTE9CU1RBUl9GT0xERVJTLCBpbmRleCkpIHtcbiAgICAgICAgICAvLyBgKiovYCBpcyB6ZXJvIG9yIG1vcmUgd2hvbGUgZm9sZGVycy5cbiAgICAgICAgICBzb3VyY2UgKz0gJyg/OlteL10qLykqJztcbiAgICAgICAgICBpbmRleCArPSBHTE9CU1RBUl9GT0xERVJTLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChpc1NlZ21lbnRTdGFydCAmJiBpbmRleCArIEdMT0JTVEFSLmxlbmd0aCA9PT0gZ2xvYi5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBBIHRyYWlsaW5nIGAvKipgIGlzIGV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAgICAgICAgc291cmNlICs9ICcuKic7XG4gICAgICAgICAgaW5kZXggKz0gR0xPQlNUQVIubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFueSBvdGhlciBgKipgIGlzIGFuIG9yZGluYXJ5IGAqYCwgYXMgaW4gYC5naXRpZ25vcmVgLlxuICAgICAgICAgIHNvdXJjZSArPSAnW14vXSonO1xuICAgICAgICAgIGluZGV4ICs9IEdMT0JTVEFSLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1xcXFwnOiB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGlmIChpbmRleCA+PSBnbG9iLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGF0aFNldHRpbmdzLnRyYWlsaW5nRXNjYXBlKSwgaXNWYWxpZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgKz0gZXNjYXBlUmVnRXhwKGdsb2IuY2hhckF0KGluZGV4KSk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBzb3VyY2UgKz0gZXNjYXBlUmVnRXhwKGNoYXJhY3Rlcik7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIHNvdXJjZSB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWdFeHBFcnJvclJlYXNvbihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGUgUmVnRXhwIGNvbnN0cnVjdG9yIG9ubHkgZXZlciB0aHJvd3MgYSBTeW50YXhFcnJvci4gKi9cbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgLy8gVjggcGhyYXNlcyBpdCBgSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IC88c291cmNlPi88ZmxhZ3M+OiA8cmVhc29uPmA7IHRoZSBlbnRyeSBpcyBhbHJlYWR5IG5hbWVkLlxuICBjb25zdCBtYXRjaCA9IC9eSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IFxcLy4qXFwvW2Etel0qOiAoPzxyZWFzb24+LiopJC9zLmV4ZWMobWVzc2FnZSk7XG4gIHJldHVybiBtYXRjaD8uZ3JvdXBzPy5bJ3JlYXNvbiddID8/IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGhhc1VuZXNjYXBlZEdsb2JDaGFyYWN0ZXIoZW50cnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZW50cnkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gZW50cnkuY2hhckF0KGluZGV4KTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfSBlbHNlIGlmIChHTE9CX0NIQVJBQ1RFUlMuaGFzKGNoYXJhY3RlcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1ha2VNYXRjaGVycyhwYXRoczogc3RyaW5nW10sIGRlZmF1bHRNYXRjaGVyOiBQYXRoTWF0Y2hlcik6IG51bGwgfCBQYXRoTWF0Y2hlcltdIHtcbiAgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbZGVmYXVsdE1hdGNoZXJdO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlcnM6IFBhdGhNYXRjaGVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgY29uc3QgeyBtYXRjaGVyIH0gPSBjb21waWxlRW50cnkocGF0aCwgZGVmYXVsdE1hdGNoZXIpO1xuICAgIGlmICghbWF0Y2hlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG1hdGNoZXJzLnB1c2gobWF0Y2hlcik7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXJzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLG1CQUFtQjtBQUU1QixTQUFTLFNBQVM7QUFrQ2xCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sa0JBQWtCLG9CQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQy9DLE1BQU0sV0FBVztBQUNqQixNQUFNLG1CQUFtQjtBQUV6QixNQUFNLGlCQUE4QjtBQUFBLEVBQ2xDLFNBQVMsTUFBTTtBQUNqQjtBQUVBLE1BQU0sZ0JBQTZCO0FBQUEsRUFDakMsU0FBUyxNQUFNO0FBQ2pCO0FBRUEsTUFBTSxZQUFZO0FBQUEsRUFjVCxZQUE2QixNQUF1QjtBQUF2QjtBQUNsQyxTQUFLLGlCQUFpQixrQkFBa0IsSUFBSTtBQUM1QyxTQUFLLFdBQVcsQ0FBQyxLQUFLLGNBQWM7QUFBQSxFQUN0QztBQUFBLEVBSG9DO0FBQUEsRUFicEMsSUFBVyxRQUFrQjtBQUMzQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFQSxJQUFXLE1BQU0sT0FBaUI7QUFDaEMsU0FBSyxTQUFTLE1BQU0sT0FBTyxPQUFPO0FBQ2xDLFNBQUssV0FBVyxhQUFhLEtBQUssUUFBUSxLQUFLLGNBQWMsS0FBSyxDQUFDLEtBQUssY0FBYztBQUFBLEVBQ3hGO0FBQUEsRUFFUSxTQUFtQixDQUFD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
|
|
@@ -48,13 +48,15 @@
|
|
|
48
48
|
*
|
|
49
49
|
* Payload validation is opt-in per method through {@link https://standardschema.dev | Standard Schema}, so
|
|
50
50
|
* zod / valibot / arktype / a hand-written validator all plug in and none of them is a dependency here. It
|
|
51
|
-
* runs only while the `obsidian-
|
|
51
|
+
* runs only while the `obsidian-lib:validate-plugin-api-payloads` debug switch is on (off by default, see
|
|
52
|
+
* {@link getValidatePluginApiPayloadsDebugSwitch}), so production pays nothing. The `obsidian-dev-utils:PluginApi`
|
|
53
|
+
* debugger controls logging only: turning it on changes no behavior.
|
|
52
54
|
*
|
|
53
55
|
* The contract itself — its types and the schema builders — is not Obsidian-specific and lives in
|
|
54
56
|
* `@mnaoumov/typescript-lib/api-contract` (`ApiContract`, `createArgumentsSchema`, `createTypeGuardSchema`,
|
|
55
57
|
* `defineApiContract`). This module owns what is: the registry keyed by plugin id, the revocable handles, the
|
|
56
|
-
* debug
|
|
57
|
-
* record is usable at all; its schemas are only ever consulted while
|
|
58
|
+
* debug switch and the validation errors. A contract's KEYS drive the shape check that decides whether a published
|
|
59
|
+
* record is usable at all; its schemas are only ever consulted while the switch is on.
|
|
58
60
|
*
|
|
59
61
|
* Why the shape check is a `typeof` rather than a schema over the whole API object. In zod 4 `z.function()`
|
|
60
62
|
* returns a function FACTORY, not a schema, so it cannot be a `z.object()` member directly. There is a known
|
|
@@ -62,12 +64,12 @@
|
|
|
62
64
|
* `z.infer` types for a function member. It does not buy runtime validation here, though: `z.custom` is a
|
|
63
65
|
* boolean predicate that returns its input unchanged, so the validating wrapper `implement` builds is
|
|
64
66
|
* discarded and the check collapses back to "is it callable". Keeping that wrapper would need a further
|
|
65
|
-
* `.transform()`, and would then move validation onto every call instead of behind the debug
|
|
67
|
+
* `.transform()`, and would then move validation onto every call instead of behind the debug switch, and bind
|
|
66
68
|
* the contract to zod specifically — which is exactly what reaching through Standard Schema avoids. So the
|
|
67
69
|
* declared method names are checked with `typeof`, and the payloads are validated per method instead.
|
|
68
70
|
*
|
|
69
71
|
* @remarks
|
|
70
|
-
* Every plugin bundles its OWN copy of `obsidian-dev-utils
|
|
72
|
+
* Every plugin bundles its OWN copy of this library (or of the older `obsidian-dev-utils`), so a registry record is a wire format between
|
|
71
73
|
* different library versions and must stay backward-compatible forever. Nothing crossing it may be
|
|
72
74
|
* `instanceof`-checked — reads are structural, and only plain data objects and plain functions are stored.
|
|
73
75
|
*
|
|
@@ -81,6 +83,7 @@
|
|
|
81
83
|
*/
|
|
82
84
|
import type { ApiContract, ApiMethodContract, ApiMethodName, ApiMethods, TypedApiContract } from '@mnaoumov/typescript-lib/api-contract';
|
|
83
85
|
import type { AsyncEventSource } from '@mnaoumov/typescript-lib/async-events';
|
|
86
|
+
import type { DebugSwitch } from '@mnaoumov/typescript-lib/debug-switches';
|
|
84
87
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
85
88
|
import type { App, Component, Plugin } from 'obsidian';
|
|
86
89
|
/**
|
|
@@ -413,8 +416,8 @@ export declare class PluginApiRevokedError extends PluginApiUnavailableError {
|
|
|
413
416
|
/**
|
|
414
417
|
* Thrown when a published API's payload fails the schema its contract declares.
|
|
415
418
|
*
|
|
416
|
-
* Only ever thrown while the `obsidian-
|
|
417
|
-
*
|
|
419
|
+
* Only ever thrown while the `obsidian-lib:validate-plugin-api-payloads` debug switch is on (see
|
|
420
|
+
* {@link getValidatePluginApiPayloadsDebugSwitch}) — otherwise no payload is validated at all.
|
|
418
421
|
*/
|
|
419
422
|
export declare class PluginApiValidationError extends Error {
|
|
420
423
|
/**
|
|
@@ -451,6 +454,20 @@ export declare class PluginApiValidationError extends Error {
|
|
|
451
454
|
* @returns The API, or `null` when no live record satisfies the range and the contract.
|
|
452
455
|
*/
|
|
453
456
|
export declare function findPluginApi<TApi extends object>(params: FindPluginApiParams<NoInfer<TApi>>): null | TApi;
|
|
457
|
+
/**
|
|
458
|
+
* Gets the debug switch that decides whether a plugin-API call's payloads are validated against the contract.
|
|
459
|
+
*
|
|
460
|
+
* Its id is `obsidian-lib:validate-plugin-api-payloads` and it is off by default. While it is on, every call
|
|
461
|
+
* through a handle from {@link watchPluginApi} or {@link findPluginApi} checks its arguments and its return value
|
|
462
|
+
* against the method's declared schemas and throws a {@link PluginApiValidationError} on a mismatch. The
|
|
463
|
+
* `obsidian-dev-utils:PluginApi` debugger does not affect it: that only logs.
|
|
464
|
+
*
|
|
465
|
+
* The switch is registered on every read, which is idempotent, and whenever an API is published, watched or looked
|
|
466
|
+
* up, so a debug-settings UI lists it as soon as any plugin API is in play.
|
|
467
|
+
*
|
|
468
|
+
* @returns The debug switch.
|
|
469
|
+
*/
|
|
470
|
+
export declare function getValidatePluginApiPayloadsDebugSwitch(): DebugSwitch;
|
|
454
471
|
/**
|
|
455
472
|
* Publishes a plugin's API so other plugins can consume it, keyed by the plugin's `manifest.id` and revoked
|
|
456
473
|
* automatically when the plugin unloads.
|