@mnaoumov/obsidian-lib 4.3.0 → 5.1.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.
Files changed (174) hide show
  1. package/dist/lib/cjs/__merged.cjs +11 -1
  2. package/dist/lib/cjs/__merged.d.cts +3 -3
  3. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +1 -1
  4. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +1 -1
  5. package/dist/lib/cjs/components/plugin-context-component.cjs +3 -1
  6. package/dist/lib/cjs/components/plugin-context-component.d.cts +2 -1
  7. package/dist/lib/cjs/components/plugin-gate-component.cjs +3 -3
  8. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +2 -2
  9. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +1 -1
  10. package/dist/lib/cjs/components/settings-migration-component.cjs +1 -1
  11. package/dist/lib/cjs/components/settings-migration-component.d.cts +1 -1
  12. package/dist/lib/cjs/css-class.cjs +3 -2
  13. package/dist/lib/cjs/css-class.d.cts +12 -4
  14. package/dist/lib/cjs/debug.cjs +22 -2
  15. package/dist/lib/cjs/debug.d.cts +10 -3
  16. package/dist/lib/cjs/demo-vault-helper-settings.cjs +1 -1
  17. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +1 -1
  18. package/dist/lib/cjs/frontmatter.cjs +1 -1
  19. package/dist/lib/cjs/frontmatter.d.cts +1 -1
  20. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  21. package/dist/lib/cjs/generated-during-build.d.cts +2 -2
  22. package/dist/lib/cjs/i18n/i18n.cjs +2 -2
  23. package/dist/lib/cjs/i18n/i18n.d.cts +1 -1
  24. package/dist/lib/cjs/i18n/locales/en.cjs +5 -2
  25. package/dist/lib/cjs/i18n/locales/en.d.cts +4 -1
  26. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -1
  27. package/dist/lib/cjs/library-styles.cjs +2 -2
  28. package/dist/lib/cjs/library.cjs +5 -2
  29. package/dist/lib/cjs/library.d.cts +12 -5
  30. package/dist/lib/cjs/modals/minimizable-modal.cjs +1 -1
  31. package/dist/lib/cjs/modals/minimizable-modal.d.cts +1 -1
  32. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  33. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +3 -3
  34. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +21 -1
  35. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +10 -2
  36. package/dist/lib/cjs/path-settings.cjs +214 -35
  37. package/dist/lib/cjs/path-settings.d.cts +21 -5
  38. package/dist/lib/cjs/plugin/plugin-api.cjs +1 -1
  39. package/dist/lib/cjs/plugin/plugin-api.d.cts +1 -1
  40. package/dist/lib/cjs/plugin/plugin-context.cjs +5 -2
  41. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +44 -4
  42. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +66 -15
  43. package/dist/lib/cjs/plugin/plugin.cjs +2 -2
  44. package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
  45. package/dist/lib/cjs/resource-lock.cjs +1 -1
  46. package/dist/lib/cjs/setting-components/checkbox-component.cjs +1 -1
  47. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +1 -1
  48. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +1 -1
  49. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +1 -1
  50. package/dist/lib/cjs/setting-components/date-component.cjs +1 -1
  51. package/dist/lib/cjs/setting-components/date-component.d.cts +1 -1
  52. package/dist/lib/cjs/setting-components/date-time-component.cjs +1 -1
  53. package/dist/lib/cjs/setting-components/date-time-component.d.cts +1 -1
  54. package/dist/lib/cjs/setting-components/email-component.cjs +1 -1
  55. package/dist/lib/cjs/setting-components/email-component.d.cts +1 -1
  56. package/dist/lib/cjs/setting-components/file-component.cjs +1 -1
  57. package/dist/lib/cjs/setting-components/file-component.d.cts +1 -1
  58. package/dist/lib/cjs/setting-components/month-component.cjs +1 -1
  59. package/dist/lib/cjs/setting-components/month-component.d.cts +1 -1
  60. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +1 -1
  61. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +1 -1
  62. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +1 -1
  63. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +1 -1
  64. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +1 -1
  65. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +1 -1
  66. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +1 -1
  67. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +1 -1
  68. package/dist/lib/cjs/setting-components/number-component.cjs +1 -1
  69. package/dist/lib/cjs/setting-components/number-component.d.cts +1 -1
  70. package/dist/lib/cjs/setting-components/password-component.cjs +1 -1
  71. package/dist/lib/cjs/setting-components/password-component.d.cts +1 -1
  72. package/dist/lib/cjs/setting-components/telephone-component.cjs +1 -1
  73. package/dist/lib/cjs/setting-components/telephone-component.d.cts +1 -1
  74. package/dist/lib/cjs/setting-components/time-component.cjs +1 -1
  75. package/dist/lib/cjs/setting-components/time-component.d.cts +1 -1
  76. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +1 -1
  77. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +1 -1
  78. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +1 -1
  79. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +1 -1
  80. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +1 -1
  81. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +1 -1
  82. package/dist/lib/cjs/setting-components/url-component.cjs +1 -1
  83. package/dist/lib/cjs/setting-components/url-component.d.cts +1 -1
  84. package/dist/lib/cjs/setting-components/week-component.cjs +1 -1
  85. package/dist/lib/cjs/setting-components/week-component.d.cts +1 -1
  86. package/dist/lib/cjs/vault.cjs +1 -1
  87. package/dist/lib/cjs/vault.d.cts +2 -2
  88. package/dist/lib/esm/__merged.d.mts +3 -3
  89. package/dist/lib/esm/__merged.mjs +11 -1
  90. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +1 -1
  91. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +1 -1
  92. package/dist/lib/esm/components/plugin-context-component.d.mts +2 -1
  93. package/dist/lib/esm/components/plugin-context-component.mjs +3 -1
  94. package/dist/lib/esm/components/plugin-gate-component.mjs +3 -3
  95. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +1 -1
  96. package/dist/lib/esm/components/plugin-suggestion-component.mjs +2 -2
  97. package/dist/lib/esm/components/settings-migration-component.d.mts +1 -1
  98. package/dist/lib/esm/components/settings-migration-component.mjs +1 -1
  99. package/dist/lib/esm/css-class.d.mts +12 -4
  100. package/dist/lib/esm/css-class.mjs +3 -2
  101. package/dist/lib/esm/debug.d.mts +10 -3
  102. package/dist/lib/esm/debug.mjs +26 -3
  103. package/dist/lib/esm/demo-vault-helper-settings.d.mts +1 -1
  104. package/dist/lib/esm/frontmatter.d.mts +1 -1
  105. package/dist/lib/esm/frontmatter.mjs +1 -1
  106. package/dist/lib/esm/generated-during-build.d.mts +2 -2
  107. package/dist/lib/esm/generated-during-build.mjs +2 -2
  108. package/dist/lib/esm/i18n/i18n.d.mts +1 -1
  109. package/dist/lib/esm/i18n/i18n.mjs +2 -2
  110. package/dist/lib/esm/i18n/locales/en.d.mts +4 -1
  111. package/dist/lib/esm/i18n/locales/en.mjs +5 -2
  112. package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -1
  113. package/dist/lib/esm/library-styles.mjs +3 -3
  114. package/dist/lib/esm/library.d.mts +12 -5
  115. package/dist/lib/esm/library.mjs +4 -2
  116. package/dist/lib/esm/modals/minimizable-modal.d.mts +1 -1
  117. package/dist/lib/esm/modals/minimizable-modal.mjs +1 -1
  118. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +3 -3
  119. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +1 -1
  120. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +10 -2
  121. package/dist/lib/esm/obsidian-dev-utils-state.mjs +20 -1
  122. package/dist/lib/esm/path-settings.d.mts +21 -5
  123. package/dist/lib/esm/path-settings.mjs +215 -41
  124. package/dist/lib/esm/plugin/plugin-api.d.mts +1 -1
  125. package/dist/lib/esm/plugin/plugin-api.mjs +1 -1
  126. package/dist/lib/esm/plugin/plugin-context.mjs +6 -3
  127. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +66 -15
  128. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +41 -4
  129. package/dist/lib/esm/plugin/plugin.d.mts +1 -1
  130. package/dist/lib/esm/plugin/plugin.mjs +2 -2
  131. package/dist/lib/esm/resource-lock.mjs +1 -1
  132. package/dist/lib/esm/setting-components/checkbox-component.d.mts +1 -1
  133. package/dist/lib/esm/setting-components/checkbox-component.mjs +1 -1
  134. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +1 -1
  135. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +1 -1
  136. package/dist/lib/esm/setting-components/date-component.d.mts +1 -1
  137. package/dist/lib/esm/setting-components/date-component.mjs +1 -1
  138. package/dist/lib/esm/setting-components/date-time-component.d.mts +1 -1
  139. package/dist/lib/esm/setting-components/date-time-component.mjs +1 -1
  140. package/dist/lib/esm/setting-components/email-component.d.mts +1 -1
  141. package/dist/lib/esm/setting-components/email-component.mjs +1 -1
  142. package/dist/lib/esm/setting-components/file-component.d.mts +1 -1
  143. package/dist/lib/esm/setting-components/file-component.mjs +1 -1
  144. package/dist/lib/esm/setting-components/month-component.d.mts +1 -1
  145. package/dist/lib/esm/setting-components/month-component.mjs +1 -1
  146. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +1 -1
  147. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +1 -1
  148. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +1 -1
  149. package/dist/lib/esm/setting-components/multiple-email-component.mjs +1 -1
  150. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +1 -1
  151. package/dist/lib/esm/setting-components/multiple-file-component.mjs +1 -1
  152. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +1 -1
  153. package/dist/lib/esm/setting-components/multiple-text-component.mjs +1 -1
  154. package/dist/lib/esm/setting-components/number-component.d.mts +1 -1
  155. package/dist/lib/esm/setting-components/number-component.mjs +1 -1
  156. package/dist/lib/esm/setting-components/password-component.d.mts +1 -1
  157. package/dist/lib/esm/setting-components/password-component.mjs +1 -1
  158. package/dist/lib/esm/setting-components/telephone-component.d.mts +1 -1
  159. package/dist/lib/esm/setting-components/telephone-component.mjs +1 -1
  160. package/dist/lib/esm/setting-components/time-component.d.mts +1 -1
  161. package/dist/lib/esm/setting-components/time-component.mjs +1 -1
  162. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +1 -1
  163. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +1 -1
  164. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +1 -1
  165. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +1 -1
  166. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +1 -1
  167. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +1 -1
  168. package/dist/lib/esm/setting-components/url-component.d.mts +1 -1
  169. package/dist/lib/esm/setting-components/url-component.mjs +1 -1
  170. package/dist/lib/esm/setting-components/week-component.d.mts +1 -1
  171. package/dist/lib/esm/setting-components/week-component.mjs +1 -1
  172. package/dist/lib/esm/vault.d.mts +2 -2
  173. package/dist/lib/esm/vault.mjs +1 -1
  174. package/package.json +3 -3
@@ -119,14 +119,25 @@ __export(path_settings_exports, {
119
119
  });
120
120
  module.exports = __toCommonJS(path_settings_exports);
121
121
  var import_reg_exp = require('@mnaoumov/typescript-lib/reg-exp');
122
- var import_string = require('@mnaoumov/typescript-lib/string');
123
122
  var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
124
123
  var import_i18n = require('./i18n/i18n.cjs');
124
+ const REG_EXP_ENTRY_REG_EXP = /^\/.*\/[a-z]*$/s;
125
+ const CASE_INSENSITIVE_FLAG = "i";
126
+ const STATEFUL_FLAGS_REG_EXP = /[gy]/g;
127
+ const GLOB_CHARACTERS = /* @__PURE__ */ new Set(["?", "[", "*"]);
128
+ const GLOBSTAR = "**";
129
+ const GLOBSTAR_FOLDERS = "**/";
130
+ const ALWAYS_MATCHER = {
131
+ isMatch: () => true
132
+ };
133
+ const NEVER_MATCHER = {
134
+ isMatch: () => false
135
+ };
125
136
  class PathSetting {
126
137
  constructor(type) {
127
138
  this.type = type;
128
- this.defaultRegExp = getDefaultRegExp(type);
129
- this.regExp = this.defaultRegExp;
139
+ this.defaultMatcher = getDefaultMatcher(type);
140
+ this.matchers = [this.defaultMatcher];
130
141
  }
131
142
  type;
132
143
  get array() {
@@ -134,19 +145,20 @@ class PathSetting {
134
145
  }
135
146
  set array(value) {
136
147
  this._array = value.filter(Boolean);
137
- this.regExp = makeRegExp(this._array, this.defaultRegExp) ?? this.defaultRegExp;
148
+ this.matchers = makeMatchers(this._array, this.defaultMatcher) ?? [this.defaultMatcher];
138
149
  }
139
150
  _array = [];
140
- defaultRegExp;
141
- regExp;
142
- isPathIgnored(path) {
151
+ defaultMatcher;
152
+ matchers;
153
+ isPathIgnored(path, isFolder) {
154
+ const isMatch = this.matchers.some((matcher) => matcher.isMatch(path, isFolder));
143
155
  switch (this.type) {
144
156
  /* v8 ignore stop */
145
157
  case "Exclude" /* Exclude */: {
146
- return this.regExp.test(path);
158
+ return isMatch;
147
159
  }
148
160
  case "Include" /* Include */: {
149
- return !this.regExp.test(path);
161
+ return !isMatch;
150
162
  }
151
163
  default: {
152
164
  (0, import_type_guards.assertNever)(this.type);
@@ -193,59 +205,226 @@ class PathSettings {
193
205
  * Checks if a path is ignored by the include/exclude path settings.
194
206
  *
195
207
  * @param path - The path to check.
208
+ * @param isFolder - Whether the path is a folder. Only a folder-only glob (one ending in `/`) reads it: such a glob
209
+ * always matches the contents of a matching folder, and matches the folder itself only when this is `true`.
196
210
  * @returns `true` if the path is ignored, `false` otherwise.
197
211
  */
198
- isPathIgnored(path) {
199
- return this._includePaths.isPathIgnored(path) || this._excludePaths.isPathIgnored(path);
212
+ isPathIgnored(path, isFolder = false) {
213
+ return this._includePaths.isPathIgnored(path, isFolder) || this._excludePaths.isPathIgnored(path, isFolder);
200
214
  }
201
215
  }
202
216
  function pathsValidator(paths) {
203
217
  for (const path of paths) {
204
- if (path.startsWith("/") && path.endsWith("/") && !(0, import_reg_exp.isValidRegExp)(path.slice(1, -1))) {
205
- return (0, import_i18n.t)(($) => $.obsidianDevUtils.pathSettings.invalidRegularExpression, { regExp: path });
218
+ const { error } = compileEntry(path, NEVER_MATCHER);
219
+ if (error !== void 0) {
220
+ return error;
221
+ }
222
+ }
223
+ }
224
+ function compileEntry(entry, defaultMatcher) {
225
+ if (entry === "/") {
226
+ return { matcher: defaultMatcher };
227
+ }
228
+ if (REG_EXP_ENTRY_REG_EXP.test(entry)) {
229
+ const flagsSeparatorIndex = entry.lastIndexOf("/");
230
+ return compileRegExpEntry(entry, entry.slice(1, flagsSeparatorIndex), entry.slice(flagsSeparatorIndex + 1));
231
+ }
232
+ return hasUnescapedGlobCharacter(entry) ? compileGlobEntry(entry) : compilePlainPathEntry(entry);
233
+ }
234
+ function compileGlobEntry(glob) {
235
+ const isFolderOnly = glob.endsWith("/");
236
+ const body = glob.replace(/\/+$/, "");
237
+ const globSource = getGlobSource(body);
238
+ if (!globSource.isValid) {
239
+ return {
240
+ error: (0, import_i18n.t)(($) => $.obsidianDevUtils.pathSettings.invalidGlob, { glob, reason: globSource.error })
241
+ };
242
+ }
243
+ const { source } = globSource;
244
+ const prefix = body.includes("/") ? "^" : "(?:^|/)";
245
+ let selfRegExp;
246
+ let contentsRegExp;
247
+ try {
248
+ selfRegExp = new RegExp(`${prefix}${source}$`, CASE_INSENSITIVE_FLAG);
249
+ contentsRegExp = new RegExp(`${prefix}${source}/`, CASE_INSENSITIVE_FLAG);
250
+ } catch (error_) {
251
+ return {
252
+ error: (0, import_i18n.t)(($) => $.obsidianDevUtils.pathSettings.invalidGlob, { glob, reason: getRegExpErrorReason(error_) })
253
+ };
254
+ }
255
+ return {
256
+ matcher: {
257
+ isMatch: (path, isFolder) => contentsRegExp.test(path) || (isFolder || !isFolderOnly) && selfRegExp.test(path)
258
+ }
259
+ };
260
+ }
261
+ function compilePlainPathEntry(path) {
262
+ const unescapedPath = path.replaceAll(/\\(?<character>.)/gs, "$<character>").replace(/\/+$/, "");
263
+ const regExp = new RegExp(`^${(0, import_reg_exp.escapeRegExp)(unescapedPath)}(?:/|$)`, CASE_INSENSITIVE_FLAG);
264
+ return {
265
+ matcher: {
266
+ isMatch: (pathToCheck) => regExp.test(pathToCheck)
267
+ }
268
+ };
269
+ }
270
+ function compileRegExpEntry(entry, source, flags) {
271
+ let regExp;
272
+ try {
273
+ new RegExp(source, flags);
274
+ const effectiveFlags = flags.replaceAll(STATEFUL_FLAGS_REG_EXP, "");
275
+ regExp = new RegExp(source, effectiveFlags.includes(CASE_INSENSITIVE_FLAG) ? effectiveFlags : `${effectiveFlags}${CASE_INSENSITIVE_FLAG}`);
276
+ } catch (error) {
277
+ return {
278
+ error: (0, import_i18n.t)(($) => $.obsidianDevUtils.pathSettings.invalidRegularExpression, { reason: getRegExpErrorReason(error), regExp: entry })
279
+ };
280
+ }
281
+ return {
282
+ matcher: {
283
+ isMatch: (path) => regExp.test(path)
284
+ }
285
+ };
286
+ }
287
+ function escapeCharacterClassCharacter(character) {
288
+ return /[-\\\]^[]/.test(character) ? `\\${character}` : character;
289
+ }
290
+ function getCharacterClassSource(glob, openIndex) {
291
+ let index = openIndex + 1;
292
+ let isNegated = false;
293
+ if (glob[index] === "!" || glob[index] === "^") {
294
+ isNegated = true;
295
+ index++;
296
+ }
297
+ let content = "";
298
+ if (glob[index] === "]") {
299
+ content += String.raw`\]`;
300
+ index++;
301
+ }
302
+ while (index < glob.length) {
303
+ const character = glob.charAt(index);
304
+ if (character === "]") {
305
+ return {
306
+ endIndex: index + 1,
307
+ isValid: true,
308
+ source: `[${isNegated ? "^/" : ""}${content}]`
309
+ };
310
+ }
311
+ if (character === "\\") {
312
+ index++;
313
+ if (index >= glob.length) {
314
+ break;
315
+ }
316
+ content += escapeCharacterClassCharacter(glob.charAt(index));
317
+ } else {
318
+ content += character === "-" ? character : escapeCharacterClassCharacter(character);
206
319
  }
320
+ index++;
207
321
  }
322
+ return { error: (0, import_i18n.t)(($) => $.obsidianDevUtils.pathSettings.unclosedCharacterClass), isValid: false };
208
323
  }
209
- function getDefaultRegExp(type) {
324
+ function getDefaultMatcher(type) {
210
325
  switch (type) {
211
326
  /* v8 ignore stop */
212
327
  case "Exclude" /* Exclude */: {
213
- return import_reg_exp.NEVER_MATCH_REG_EXP;
328
+ return NEVER_MATCHER;
214
329
  }
215
330
  case "Include" /* Include */: {
216
- return import_reg_exp.ALWAYS_MATCH_REG_EXP;
331
+ return ALWAYS_MATCHER;
217
332
  }
218
333
  default: {
219
334
  (0, import_type_guards.assertNever)(type);
220
335
  }
221
336
  }
222
337
  }
223
- function makeRegExp(paths, defaultRegExp) {
224
- if (paths.length === 0) {
225
- return defaultRegExp;
338
+ function getGlobSource(glob) {
339
+ let source = "";
340
+ let index = 0;
341
+ while (index < glob.length) {
342
+ const character = glob.charAt(index);
343
+ switch (character) {
344
+ case "?": {
345
+ source += "[^/]";
346
+ index++;
347
+ break;
348
+ }
349
+ case "[": {
350
+ const characterClass = getCharacterClassSource(glob, index);
351
+ if (!characterClass.isValid) {
352
+ return characterClass;
353
+ }
354
+ source += characterClass.source;
355
+ index = characterClass.endIndex;
356
+ break;
357
+ }
358
+ case "*": {
359
+ if (!glob.startsWith(GLOBSTAR, index)) {
360
+ source += "[^/]*";
361
+ index++;
362
+ break;
363
+ }
364
+ const isSegmentStart = index === 0 || glob[index - 1] === "/";
365
+ if (isSegmentStart && glob.startsWith(GLOBSTAR_FOLDERS, index)) {
366
+ source += "(?:[^/]*/)*";
367
+ index += GLOBSTAR_FOLDERS.length;
368
+ } else if (isSegmentStart && index + GLOBSTAR.length === glob.length) {
369
+ source += ".*";
370
+ index += GLOBSTAR.length;
371
+ } else {
372
+ source += "[^/]*";
373
+ index += GLOBSTAR.length;
374
+ }
375
+ break;
376
+ }
377
+ case "\\": {
378
+ index++;
379
+ if (index >= glob.length) {
380
+ return { error: (0, import_i18n.t)(($) => $.obsidianDevUtils.pathSettings.trailingEscape), isValid: false };
381
+ }
382
+ source += (0, import_reg_exp.escapeRegExp)(glob.charAt(index));
383
+ index++;
384
+ break;
385
+ }
386
+ default: {
387
+ source += (0, import_reg_exp.escapeRegExp)(character);
388
+ index++;
389
+ break;
390
+ }
391
+ }
226
392
  }
227
- const regExpStringCombined = paths.map((path) => {
228
- if (path === "/") {
229
- return defaultRegExp.source;
393
+ return { isValid: true, source };
394
+ }
395
+ function getRegExpErrorReason(error) {
396
+ const message = error instanceof Error ? error.message : String(error);
397
+ const match = /^Invalid regular expression: \/.*\/[a-z]*: (?<reason>.*)$/s.exec(message);
398
+ return match?.groups?.["reason"] ?? message;
399
+ }
400
+ function hasUnescapedGlobCharacter(entry) {
401
+ for (let index = 0; index < entry.length; index++) {
402
+ const character = entry.charAt(index);
403
+ if (character === "\\") {
404
+ index++;
405
+ } else if (GLOB_CHARACTERS.has(character)) {
406
+ return true;
230
407
  }
231
- if (path.startsWith("/") && path.endsWith("/")) {
232
- return path.slice(1, -1);
408
+ }
409
+ return false;
410
+ }
411
+ function makeMatchers(paths, defaultMatcher) {
412
+ if (paths.length === 0) {
413
+ return [defaultMatcher];
414
+ }
415
+ const matchers = [];
416
+ for (const path of paths) {
417
+ const { matcher } = compileEntry(path, defaultMatcher);
418
+ if (!matcher) {
419
+ return null;
233
420
  }
234
- path = (0, import_string.trimEnd)({
235
- $string: path,
236
- suffix: "/"
237
- });
238
- return `^${(0, import_reg_exp.escapeRegExp)(path)}(/|$)`;
239
- }).map((regExpString) => `(${regExpString})`).join("|");
240
- try {
241
- return new RegExp(regExpStringCombined);
242
- } catch {
243
- return null;
421
+ matchers.push(matcher);
244
422
  }
423
+ return matchers;
245
424
  }
246
425
  // Annotate the CommonJS export names for ESM import in node:
247
426
  0 && (module.exports = {
248
427
  PathSettings,
249
428
  pathsValidator
250
429
  });
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXRoLXNldHRpbmdzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjbGFzc2VzIGFuZCB2YWxpZGF0b3JzIGZvciBtYW5hZ2luZyBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuXG5pbXBvcnQge1xuICBBTFdBWVNfTUFUQ0hfUkVHX0VYUCxcbiAgZXNjYXBlUmVnRXhwLFxuICBpc1ZhbGlkUmVnRXhwLFxuICBORVZFUl9NQVRDSF9SRUdfRVhQXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcblxuZW51bSBQYXRoU2V0dGluZ1R5cGUge1xuICBFeGNsdWRlID0gJ0V4Y2x1ZGUnLFxuICBJbmNsdWRlID0gJ0luY2x1ZGUnXG59XG5cbmNsYXNzIFBhdGhTZXR0aW5nIHtcbiAgcHVibGljIGdldCBhcnJheSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5O1xuICB9XG5cbiAgcHVibGljIHNldCBhcnJheSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hcnJheSA9IHZhbHVlLmZpbHRlcihCb29sZWFuKTtcbiAgICB0aGlzLnJlZ0V4cCA9IG1ha2VSZWdFeHAodGhpcy5fYXJyYXksIHRoaXMuZGVmYXVsdFJlZ0V4cCkgPz8gdGhpcy5kZWZhdWx0UmVnRXhwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFJlZ0V4cDogUmVnRXhwO1xuICBwcml2YXRlIHJlZ0V4cDogUmVnRXhwO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFBhdGhTZXR0aW5nVHlwZSkge1xuICAgIHRoaXMuZGVmYXVsdFJlZ0V4cCA9IGdldERlZmF1bHRSZWdFeHAodHlwZSk7XG4gICAgdGhpcy5yZWdFeHAgPSB0aGlzLmRlZmF1bHRSZWdFeHA7XG4gIH1cblxuICBwdWJsaWMgaXNQYXRoSWdub3JlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIFBhdGhTZXR0aW5nVHlwZS5FeGNsdWRlOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ0V4cC50ZXN0KHBhdGgpO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXRoU2V0dGluZ1R5cGUuSW5jbHVkZToge1xuICAgICAgICByZXR1cm4gIXRoaXMucmVnRXhwLnRlc3QocGF0aCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZC4gKi9cbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy50eXBlKTtcbiAgICAgIH1cbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIGZvciBtYW5hZ2luZyBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBleGNsdWRlIHBhdGhzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZXhjbHVkZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZXhjbHVkZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZVBhdGhzLmFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4Y2x1ZGUgcGF0aHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBleGNsdWRlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIHNldCBleGNsdWRlUGF0aHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZVBhdGhzLmFycmF5ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW5jbHVkZSBwYXRocy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGluY2x1ZGUgcGF0aHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluY2x1ZGVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVQYXRocy5hcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbmNsdWRlIHBhdGhzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5jbHVkZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBzZXQgaW5jbHVkZVBhdGhzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVQYXRocy5hcnJheSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhjbHVkZVBhdGhzID0gbmV3IFBhdGhTZXR0aW5nKFBhdGhTZXR0aW5nVHlwZS5FeGNsdWRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5jbHVkZVBhdGhzID0gbmV3IFBhdGhTZXR0aW5nKFBhdGhTZXR0aW5nVHlwZS5JbmNsdWRlKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBpZ25vcmVkIGJ5IHRoZSBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGlnbm9yZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVQYXRocy5pc1BhdGhJZ25vcmVkKHBhdGgpIHx8IHRoaXMuX2V4Y2x1ZGVQYXRocy5pc1BhdGhJZ25vcmVkKHBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGluY2x1ZGUvZXhjbHVkZSBwYXRoIGVudHJpZXMsIHJlcG9ydGluZyB0aGUgZmlyc3QgZW50cnkgdGhhdCBpcyBub3QgYSBwYXJzZWFibGUgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEFuIGVudHJ5IHRoYXQgc3RhcnRzIGFuZCBlbmRzIHdpdGggYC9gIGlzIGEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWw7IGV2ZXJ5IG90aGVyIGVudHJ5IGlzIGEgcGxhaW4gcGF0aCBhbmQgaXNcbiAqIGFsd2F5cyB2YWxpZC4gQW4gaW52YWxpZCBlbnRyeSBkb2VzIG5vdCB0aHJvdyB3aGVuIGFzc2lnbmVkIHRvIHtAbGluayBQYXRoU2V0dGluZ3N9IOKAlCB0aGUgd2hvbGUgbGlzdCBmYWxscyBiYWNrIHRvXG4gKiBpdHMgZGVmYXVsdCBwYXR0ZXJuIGluc3RlYWQg4oCUIHNvIHRoaXMgdmFsaWRhdG9yIGlzIHdoYXQgc3VyZmFjZXMgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXIuXG4gKlxuICogQHBhcmFtIHBhdGhzIC0gVGhlIHBhdGggZW50cmllcyB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIEEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpcnN0IGludmFsaWQgZW50cnksIG9yIG5vdGhpbmcgd2hlbiBldmVyeSBlbnRyeSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzVmFsaWRhdG9yKHBhdGhzOiBzdHJpbmdbXSk6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykgJiYgcGF0aC5lbmRzV2l0aCgnLycpICYmICFpc1ZhbGlkUmVnRXhwKHBhdGguc2xpY2UoMSwgLTEpKSkge1xuICAgICAgcmV0dXJuIHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wYXRoU2V0dGluZ3MuaW52YWxpZFJlZ3VsYXJFeHByZXNzaW9uLCB7IHJlZ0V4cDogcGF0aCB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlZ0V4cCh0eXBlOiBQYXRoU2V0dGluZ1R5cGUpOiBSZWdFeHAge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY2FzZSBQYXRoU2V0dGluZ1R5cGUuRXhjbHVkZToge1xuICAgICAgcmV0dXJuIE5FVkVSX01BVENIX1JFR19FWFA7XG4gICAgfVxuICAgIGNhc2UgUGF0aFNldHRpbmdUeXBlLkluY2x1ZGU6IHtcbiAgICAgIHJldHVybiBBTFdBWVNfTUFUQ0hfUkVHX0VYUDtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgYXNzZXJ0TmV2ZXIodHlwZSk7XG4gICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlUmVnRXhwKHBhdGhzOiBzdHJpbmdbXSwgZGVmYXVsdFJlZ0V4cDogUmVnRXhwKTogbnVsbCB8IFJlZ0V4cCB7XG4gIGlmIChwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZGVmYXVsdFJlZ0V4cDtcbiAgfVxuXG4gIGNvbnN0IHJlZ0V4cFN0cmluZ0NvbWJpbmVkID0gcGF0aHMubWFwKChwYXRoKSA9PiB7XG4gICAgaWYgKHBhdGggPT09ICcvJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRSZWdFeHAuc291cmNlO1xuICAgIH1cblxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy8nKSAmJiBwYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICBwYXRoID0gdHJpbUVuZCh7XG4gICAgICAkc3RyaW5nOiBwYXRoLFxuICAgICAgc3VmZml4OiAnLydcbiAgICB9KTtcbiAgICByZXR1cm4gYF4ke2VzY2FwZVJlZ0V4cChwYXRoKX0oL3wkKWA7XG4gIH0pXG4gICAgLm1hcCgocmVnRXhwU3RyaW5nKSA9PiBgKCR7cmVnRXhwU3RyaW5nfSlgKVxuICAgIC5qb2luKCd8Jyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdFeHBTdHJpbmdDb21iaW5lZCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgcGFydGlhbGx5IHR5cGVkIHJlZ2V4IGxpdGVyYWwgKGAvXkluYm94XFwvYCkgaXMgbm90IHBhcnNlYWJsZS5cbiAgICAvLyBSZXBvcnQgaXQgaW5zdGVhZCBvZiB0aHJvd2luZyBmcm9tIGEgc2V0dGluZ3Mgc2V0dGVyLCB3aGljaCB3b3VsZCBicmVhayBib3RoIHRoZSBzZXR0aW5ncyBVSSBhbmQgdGhlIHNhdmUgcGF0aC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FB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
430
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXRoLXNldHRpbmdzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjbGFzc2VzIGFuZCB2YWxpZGF0b3JzIGZvciBtYW5hZ2luZyBpbmNsdWRlL2V4Y2x1ZGUgcGF0aCBzZXR0aW5ncy5cbiAqXG4gKiBBbiBlbnRyeSB0YWtlcyBvbmUgb2YgdGhyZWUgZm9ybXMsIGFuZCBldmVyeSBmb3JtIG1hdGNoZXMgY2FzZS1pbnNlbnNpdGl2ZWx5OlxuICpcbiAqIC0gQSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbCwgYC9wYXR0ZXJuL2ZsYWdzYC4gSXRzIG93biBmbGFncyBhcmUgaG9ub3VyZWQgYW5kIGBpYCBpcyBhbHdheXMgYWRkZWQuIGBnYCBhbmQgYHlgIGFyZVxuICogICBhY2NlcHRlZCBhbmQgZHJvcHBlZCwgc2luY2UgdGhleSBtYWtlIGBSZWdFeHAudGVzdGAgc3RhdGVmdWwgYW5kIHNheSBub3RoaW5nIGFib3V0IHdoaWNoIHBhdGhzIG1hdGNoLlxuICogLSBBIGdsb2IsIGFuIGVudHJ5IGhvbGRpbmcgYW4gdW5lc2NhcGVkIGAqYCwgYD9gIG9yIGBbYC4gYCpgIG1hdGNoZXMgd2l0aGluIG9uZSBwYXRoIHNlZ21lbnQsIGAqKmAgYWNyb3NzIHNlZ21lbnRzLFxuICogICBgP2Agb25lIGNoYXJhY3RlciBhbmQgYFthYmNdYCAvIGBbIWFiY11gIGEgY2hhcmFjdGVyIGNsYXNzLiBBIGdsb2Igd2l0aCBubyBgL2AgbWF0Y2hlcyBhIGZpbGUgb3IgZm9sZGVyIE5BTUUgYXQgYW55XG4gKiAgIGRlcHRoLCBhcyBpbiBgLmdpdGlnbm9yZWAgKGAqLnBkZmAgbWF0Y2hlcyBgYS9iL2MucGRmYCk7IG9uZSB3aXRoIGEgYC9gIGlzIGFuY2hvcmVkIHRvIHRoZSB2YXVsdCByb290XG4gKiAgIChgQXR0YWNobWVudHMvKi5wZGZgKS4gQSB0cmFpbGluZyBgL2AgbWFrZXMgaXQgbWF0Y2ggZm9sZGVycyBvbmx5LlxuICogLSBBIHBsYWluIHBhdGgsIGV2ZXJ5IG90aGVyIGVudHJ5LCB3aGljaCBtYXRjaGVzIHRoYXQgcGF0aCBhbmQgZXZlcnl0aGluZyBpbnNpZGUgaXQuIEEgbGl0ZXJhbCBgKmAsIGA/YCwgYFtgIG9yIGBcXGAgaW5cbiAqICAgYSBwbGFpbiBwYXRoIG9yIGEgZ2xvYiBpcyB3cml0dGVuIGVzY2FwZWQgKGBcXCpgKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5cbmVudW0gUGF0aFNldHRpbmdUeXBlIHtcbiAgRXhjbHVkZSA9ICdFeGNsdWRlJyxcbiAgSW5jbHVkZSA9ICdJbmNsdWRlJ1xufVxuXG50eXBlIENoYXJhY3RlckNsYXNzU291cmNlUmVzdWx0ID0gSW52YWxpZFNvdXJjZVJlc3VsdCB8IFZhbGlkQ2hhcmFjdGVyQ2xhc3NTb3VyY2VSZXN1bHQ7XG5cbmludGVyZmFjZSBDb21waWxlUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXJyb3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hdGNoZXI/OiBQYXRoTWF0Y2hlcjtcbn1cblxudHlwZSBHbG9iU291cmNlUmVzdWx0ID0gSW52YWxpZFNvdXJjZVJlc3VsdCB8IFZhbGlkR2xvYlNvdXJjZVJlc3VsdDtcblxuaW50ZXJmYWNlIEludmFsaWRTb3VyY2VSZXN1bHQge1xuICByZWFkb25seSBlcnJvcjogc3RyaW5nO1xuICByZWFkb25seSBpc1ZhbGlkOiBmYWxzZTtcbn1cblxuaW50ZXJmYWNlIFBhdGhNYXRjaGVyIHtcbiAgaXNNYXRjaDogKHBhdGg6IHN0cmluZywgaXNGb2xkZXI6IGJvb2xlYW4pID0+IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBWYWxpZENoYXJhY3RlckNsYXNzU291cmNlUmVzdWx0IGV4dGVuZHMgVmFsaWRHbG9iU291cmNlUmVzdWx0IHtcbiAgcmVhZG9ubHkgZW5kSW5kZXg6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZhbGlkR2xvYlNvdXJjZVJlc3VsdCB7XG4gIHJlYWRvbmx5IGlzVmFsaWQ6IHRydWU7XG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG5jb25zdCBSRUdfRVhQX0VOVFJZX1JFR19FWFAgPSAvXlxcLy4qXFwvW2Etel0qJC9zO1xuY29uc3QgQ0FTRV9JTlNFTlNJVElWRV9GTEFHID0gJ2knO1xuY29uc3QgU1RBVEVGVUxfRkxBR1NfUkVHX0VYUCA9IC9bZ3ldL2c7XG5jb25zdCBHTE9CX0NIQVJBQ1RFUlMgPSBuZXcgU2V0KFsnPycsICdbJywgJyonXSk7XG5jb25zdCBHTE9CU1RBUiA9ICcqKic7XG5jb25zdCBHTE9CU1RBUl9GT0xERVJTID0gJyoqLyc7XG5cbmNvbnN0IEFMV0FZU19NQVRDSEVSOiBQYXRoTWF0Y2hlciA9IHtcbiAgaXNNYXRjaDogKCkgPT4gdHJ1ZVxufTtcblxuY29uc3QgTkVWRVJfTUFUQ0hFUjogUGF0aE1hdGNoZXIgPSB7XG4gIGlzTWF0Y2g6ICgpID0+IGZhbHNlXG59O1xuXG5jbGFzcyBQYXRoU2V0dGluZyB7XG4gIHB1YmxpYyBnZXQgYXJyYXkoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hcnJheTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYXJyYXkodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXJyYXkgPSB2YWx1ZS5maWx0ZXIoQm9vbGVhbik7XG4gICAgdGhpcy5tYXRjaGVycyA9IG1ha2VNYXRjaGVycyh0aGlzLl9hcnJheSwgdGhpcy5kZWZhdWx0TWF0Y2hlcikgPz8gW3RoaXMuZGVmYXVsdE1hdGNoZXJdO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1hdGNoZXI6IFBhdGhNYXRjaGVyO1xuICBwcml2YXRlIG1hdGNoZXJzOiBQYXRoTWF0Y2hlcltdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFBhdGhTZXR0aW5nVHlwZSkge1xuICAgIHRoaXMuZGVmYXVsdE1hdGNoZXIgPSBnZXREZWZhdWx0TWF0Y2hlcih0eXBlKTtcbiAgICB0aGlzLm1hdGNoZXJzID0gW3RoaXMuZGVmYXVsdE1hdGNoZXJdO1xuICB9XG5cbiAgcHVibGljIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nLCBpc0ZvbGRlcjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzTWF0Y2ggPSB0aGlzLm1hdGNoZXJzLnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoZXIuaXNNYXRjaChwYXRoLCBpc0ZvbGRlcikpO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgYnJhbmNoZXMgY292ZXJlZCBidXQgdjggcmVwb3J0cyBzd2l0Y2ggYXMgcGFydGlhbC4gKi9cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgUGF0aFNldHRpbmdUeXBlLkV4Y2x1ZGU6IHtcbiAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICB9XG4gICAgICBjYXNlIFBhdGhTZXR0aW5nVHlwZS5JbmNsdWRlOiB7XG4gICAgICAgIHJldHVybiAhaXNNYXRjaDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLnR5cGUpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgZm9yIG1hbmFnaW5nIGluY2x1ZGUvZXhjbHVkZSBwYXRoIHNldHRpbmdzLlxuICpcbiAqIFNlZSB0aGUgbW9kdWxlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlbnRyeSBzeW50YXg6IHBsYWluIHBhdGhzLCBnbG9icyBhbmQgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWxzLCBhbGwgbWF0Y2hlZFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICovXG5leHBvcnQgY2xhc3MgUGF0aFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGV4Y2x1ZGUgcGF0aHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBleGNsdWRlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIGdldCBleGNsdWRlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlUGF0aHMuYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhjbHVkZSBwYXRocy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGV4Y2x1ZGUgcGF0aHMuXG4gICAqL1xuICBwdWJsaWMgc2V0IGV4Y2x1ZGVQYXRocyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9leGNsdWRlUGF0aHMuYXJyYXkgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbmNsdWRlIHBhdGhzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaW5jbHVkZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5jbHVkZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZVBhdGhzLmFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGluY2x1ZGUgcGF0aHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmNsdWRlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIHNldCBpbmNsdWRlUGF0aHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZVBhdGhzLmFycmF5ID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9leGNsdWRlUGF0aHMgPSBuZXcgUGF0aFNldHRpbmcoUGF0aFNldHRpbmdUeXBlLkV4Y2x1ZGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbmNsdWRlUGF0aHMgPSBuZXcgUGF0aFNldHRpbmcoUGF0aFNldHRpbmdUeXBlLkluY2x1ZGUpO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBwYXRoIGlzIGlnbm9yZWQgYnkgdGhlIGluY2x1ZGUvZXhjbHVkZSBwYXRoIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gaXNGb2xkZXIgLSBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgZm9sZGVyLiBPbmx5IGEgZm9sZGVyLW9ubHkgZ2xvYiAob25lIGVuZGluZyBpbiBgL2ApIHJlYWRzIGl0OiBzdWNoIGEgZ2xvYlxuICAgKiBhbHdheXMgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgYSBtYXRjaGluZyBmb2xkZXIsIGFuZCBtYXRjaGVzIHRoZSBmb2xkZXIgaXRzZWxmIG9ubHkgd2hlbiB0aGlzIGlzIGB0cnVlYC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGlnbm9yZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nLCBpc0ZvbGRlciA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVQYXRocy5pc1BhdGhJZ25vcmVkKHBhdGgsIGlzRm9sZGVyKSB8fCB0aGlzLl9leGNsdWRlUGF0aHMuaXNQYXRoSWdub3JlZChwYXRoLCBpc0ZvbGRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgaW5jbHVkZS9leGNsdWRlIHBhdGggZW50cmllcywgcmVwb3J0aW5nIHRoZSBmaXJzdCBlbnRyeSB0aGF0IGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBnbG9iLlxuICpcbiAqIEFuIGludmFsaWQgZW50cnkgZG9lcyBub3QgdGhyb3cgd2hlbiBhc3NpZ25lZCB0byB7QGxpbmsgUGF0aFNldHRpbmdzfSDigJQgdGhlIHdob2xlIGxpc3QgZmFsbHMgYmFjayB0byBpdHMgZGVmYXVsdFxuICogcGF0dGVybiBpbnN0ZWFkIOKAlCBzbyB0aGlzIHZhbGlkYXRvciBpcyB3aGF0IHN1cmZhY2VzIHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyLiBUaGUgbWVzc2FnZSBuYW1lcyB0aGUgZW50cnkgYW5kIHRoZVxuICogcmVhc29uIGl0IGlzIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHBhdGhzIC0gVGhlIHBhdGggZW50cmllcyB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIEEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpcnN0IGludmFsaWQgZW50cnksIG9yIG5vdGhpbmcgd2hlbiBldmVyeSBlbnRyeSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhzVmFsaWRhdG9yKHBhdGhzOiBzdHJpbmdbXSk6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBjb25zdCB7IGVycm9yIH0gPSBjb21waWxlRW50cnkocGF0aCwgTkVWRVJfTUFUQ0hFUik7XG4gICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZUVudHJ5KGVudHJ5OiBzdHJpbmcsIGRlZmF1bHRNYXRjaGVyOiBQYXRoTWF0Y2hlcik6IENvbXBpbGVSZXN1bHQge1xuICBpZiAoZW50cnkgPT09ICcvJykge1xuICAgIHJldHVybiB7IG1hdGNoZXI6IGRlZmF1bHRNYXRjaGVyIH07XG4gIH1cblxuICBpZiAoUkVHX0VYUF9FTlRSWV9SRUdfRVhQLnRlc3QoZW50cnkpKSB7XG4gICAgY29uc3QgZmxhZ3NTZXBhcmF0b3JJbmRleCA9IGVudHJ5Lmxhc3RJbmRleE9mKCcvJyk7XG4gICAgcmV0dXJuIGNvbXBpbGVSZWdFeHBFbnRyeShlbnRyeSwgZW50cnkuc2xpY2UoMSwgZmxhZ3NTZXBhcmF0b3JJbmRleCksIGVudHJ5LnNsaWNlKGZsYWdzU2VwYXJhdG9ySW5kZXggKyAxKSk7XG4gIH1cblxuICByZXR1cm4gaGFzVW5lc2NhcGVkR2xvYkNoYXJhY3RlcihlbnRyeSkgPyBjb21waWxlR2xvYkVudHJ5KGVudHJ5KSA6IGNvbXBpbGVQbGFpblBhdGhFbnRyeShlbnRyeSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVHbG9iRW50cnkoZ2xvYjogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCB7XG4gIGNvbnN0IGlzRm9sZGVyT25seSA9IGdsb2IuZW5kc1dpdGgoJy8nKTtcbiAgY29uc3QgYm9keSA9IGdsb2IucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGNvbnN0IGdsb2JTb3VyY2UgPSBnZXRHbG9iU291cmNlKGJvZHkpO1xuICBpZiAoIWdsb2JTb3VyY2UuaXNWYWxpZCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy5pbnZhbGlkR2xvYiwgeyBnbG9iLCByZWFzb246IGdsb2JTb3VyY2UuZXJyb3IgfSlcbiAgICB9O1xuICB9XG4gIGNvbnN0IHsgc291cmNlIH0gPSBnbG9iU291cmNlO1xuXG4gIGNvbnN0IHByZWZpeCA9IGJvZHkuaW5jbHVkZXMoJy8nKSA/ICdeJyA6ICcoPzpefC8pJztcblxuICBsZXQgc2VsZlJlZ0V4cDogUmVnRXhwO1xuICBsZXQgY29udGVudHNSZWdFeHA6IFJlZ0V4cDtcbiAgdHJ5IHtcbiAgICBzZWxmUmVnRXhwID0gbmV3IFJlZ0V4cChgJHtwcmVmaXh9JHtzb3VyY2V9JGAsIENBU0VfSU5TRU5TSVRJVkVfRkxBRyk7XG4gICAgY29udGVudHNSZWdFeHAgPSBuZXcgUmVnRXhwKGAke3ByZWZpeH0ke3NvdXJjZX0vYCwgQ0FTRV9JTlNFTlNJVElWRV9GTEFHKTtcbiAgfSBjYXRjaCAoZXJyb3JfKSB7XG4gICAgLy8gQW4gb3V0LW9mLW9yZGVyIGNoYXJhY3RlciBjbGFzcyByYW5nZSAoYFt6LWFdYCkgaXMgdGhlIG9uZSBpbnZhbGlkIGdsb2Igb25seSB0aGUgZW5naW5lIGNhbiB0ZWxsLlxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy5pbnZhbGlkR2xvYiwgeyBnbG9iLCByZWFzb246IGdldFJlZ0V4cEVycm9yUmVhc29uKGVycm9yXykgfSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVyOiB7XG4gICAgICBpc01hdGNoOiAocGF0aCwgaXNGb2xkZXIpID0+IGNvbnRlbnRzUmVnRXhwLnRlc3QocGF0aCkgfHwgKChpc0ZvbGRlciB8fCAhaXNGb2xkZXJPbmx5KSAmJiBzZWxmUmVnRXhwLnRlc3QocGF0aCkpXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21waWxlUGxhaW5QYXRoRW50cnkocGF0aDogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCB7XG4gIGNvbnN0IHVuZXNjYXBlZFBhdGggPSBwYXRoLnJlcGxhY2VBbGwoL1xcXFwoPzxjaGFyYWN0ZXI+LikvZ3MsICckPGNoYXJhY3Rlcj4nKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlUmVnRXhwKHVuZXNjYXBlZFBhdGgpfSg/Oi98JClgLCBDQVNFX0lOU0VOU0lUSVZFX0ZMQUcpO1xuICByZXR1cm4ge1xuICAgIG1hdGNoZXI6IHtcbiAgICAgIGlzTWF0Y2g6IChwYXRoVG9DaGVjaykgPT4gcmVnRXhwLnRlc3QocGF0aFRvQ2hlY2spXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21waWxlUmVnRXhwRW50cnkoZW50cnk6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIGZsYWdzOiBzdHJpbmcpOiBDb21waWxlUmVzdWx0IHtcbiAgbGV0IHJlZ0V4cDogUmVnRXhwO1xuICB0cnkge1xuICAgIC8vIENvbXBpbGVkIHdpdGggdGhlIGZsYWdzIGFzIHdyaXR0ZW4gZmlyc3QsIHNvIGFuIHVua25vd24gb3IgcmVwZWF0ZWQgZmxhZyBpcyByZXBvcnRlZCByYXRoZXIgdGhhbiBpZ25vcmVkLlxuICAgIG5ldyBSZWdFeHAoc291cmNlLCBmbGFncyk7XG4gICAgY29uc3QgZWZmZWN0aXZlRmxhZ3MgPSBmbGFncy5yZXBsYWNlQWxsKFNUQVRFRlVMX0ZMQUdTX1JFR19FWFAsICcnKTtcbiAgICByZWdFeHAgPSBuZXcgUmVnRXhwKHNvdXJjZSwgZWZmZWN0aXZlRmxhZ3MuaW5jbHVkZXMoQ0FTRV9JTlNFTlNJVElWRV9GTEFHKSA/IGVmZmVjdGl2ZUZsYWdzIDogYCR7ZWZmZWN0aXZlRmxhZ3N9JHtDQVNFX0lOU0VOU0lUSVZFX0ZMQUd9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQSBwYXJ0aWFsbHkgdHlwZWQgcmVnZXggbGl0ZXJhbCAoYC9eSW5ib3hcXC9gKSBpcyBub3QgcGFyc2VhYmxlLlxuICAgIC8vIFJlcG9ydCBpdCBpbnN0ZWFkIG9mIHRocm93aW5nIGZyb20gYSBzZXR0aW5ncyBzZXR0ZXIsIHdoaWNoIHdvdWxkIGJyZWFrIGJvdGggdGhlIHNldHRpbmdzIFVJIGFuZCB0aGUgc2F2ZSBwYXRoLlxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy5pbnZhbGlkUmVndWxhckV4cHJlc3Npb24sIHsgcmVhc29uOiBnZXRSZWdFeHBFcnJvclJlYXNvbihlcnJvciksIHJlZ0V4cDogZW50cnkgfSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVyOiB7XG4gICAgICBpc01hdGNoOiAocGF0aCkgPT4gcmVnRXhwLnRlc3QocGF0aClcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUNoYXJhY3RlckNsYXNzQ2hhcmFjdGVyKGNoYXJhY3Rlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9bLVxcXFxcXF1eW10vLnRlc3QoY2hhcmFjdGVyKSA/IGBcXFxcJHtjaGFyYWN0ZXJ9YCA6IGNoYXJhY3Rlcjtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ2xhc3NTb3VyY2UoZ2xvYjogc3RyaW5nLCBvcGVuSW5kZXg6IG51bWJlcik6IENoYXJhY3RlckNsYXNzU291cmNlUmVzdWx0IHtcbiAgbGV0IGluZGV4ID0gb3BlbkluZGV4ICsgMTtcbiAgbGV0IGlzTmVnYXRlZCA9IGZhbHNlO1xuICBpZiAoZ2xvYltpbmRleF0gPT09ICchJyB8fCBnbG9iW2luZGV4XSA9PT0gJ14nKSB7XG4gICAgaXNOZWdhdGVkID0gdHJ1ZTtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgbGV0IGNvbnRlbnQgPSAnJztcbiAgaWYgKGdsb2JbaW5kZXhdID09PSAnXScpIHtcbiAgICBjb250ZW50ICs9IFN0cmluZy5yYXdgXFxdYDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgd2hpbGUgKGluZGV4IDwgZ2xvYi5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbG9iLmNoYXJBdChpbmRleCk7XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ10nKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbmRJbmRleDogaW5kZXggKyAxLFxuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzb3VyY2U6IGBbJHtpc05lZ2F0ZWQgPyAnXi8nIDogJyd9JHtjb250ZW50fV1gXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIGlmIChpbmRleCA+PSBnbG9iLmxlbmd0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gZXNjYXBlQ2hhcmFjdGVyQ2xhc3NDaGFyYWN0ZXIoZ2xvYi5jaGFyQXQoaW5kZXgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCArPSBjaGFyYWN0ZXIgPT09ICctJyA/IGNoYXJhY3RlciA6IGVzY2FwZUNoYXJhY3RlckNsYXNzQ2hhcmFjdGVyKGNoYXJhY3Rlcik7XG4gICAgfVxuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4geyBlcnJvcjogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBhdGhTZXR0aW5ncy51bmNsb3NlZENoYXJhY3RlckNsYXNzKSwgaXNWYWxpZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdE1hdGNoZXIodHlwZTogUGF0aFNldHRpbmdUeXBlKTogUGF0aE1hdGNoZXIge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY2FzZSBQYXRoU2V0dGluZ1R5cGUuRXhjbHVkZToge1xuICAgICAgcmV0dXJuIE5FVkVSX01BVENIRVI7XG4gICAgfVxuICAgIGNhc2UgUGF0aFNldHRpbmdUeXBlLkluY2x1ZGU6IHtcbiAgICAgIHJldHVybiBBTFdBWVNfTUFUQ0hFUjtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgYXNzZXJ0TmV2ZXIodHlwZSk7XG4gICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRHbG9iU291cmNlKGdsb2I6IHN0cmluZyk6IEdsb2JTb3VyY2VSZXN1bHQge1xuICBsZXQgc291cmNlID0gJyc7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGluZGV4IDwgZ2xvYi5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbG9iLmNoYXJBdChpbmRleCk7XG4gICAgc3dpdGNoIChjaGFyYWN0ZXIpIHtcbiAgICAgIGNhc2UgJz8nOiB7XG4gICAgICAgIHNvdXJjZSArPSAnW14vXSc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnWyc6IHtcbiAgICAgICAgY29uc3QgY2hhcmFjdGVyQ2xhc3MgPSBnZXRDaGFyYWN0ZXJDbGFzc1NvdXJjZShnbG9iLCBpbmRleCk7XG4gICAgICAgIGlmICghY2hhcmFjdGVyQ2xhc3MuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBjaGFyYWN0ZXJDbGFzcztcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgKz0gY2hhcmFjdGVyQ2xhc3Muc291cmNlO1xuICAgICAgICBpbmRleCA9IGNoYXJhY3RlckNsYXNzLmVuZEluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJyonOiB7XG4gICAgICAgIGlmICghZ2xvYi5zdGFydHNXaXRoKEdMT0JTVEFSLCBpbmRleCkpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gJ1teL10qJztcbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNTZWdtZW50U3RhcnQgPSBpbmRleCA9PT0gMCB8fCBnbG9iW2luZGV4IC0gMV0gPT09ICcvJztcbiAgICAgICAgaWYgKGlzU2VnbWVudFN0YXJ0ICYmIGdsb2Iuc3RhcnRzV2l0aChHTE9CU1RBUl9GT0xERVJTLCBpbmRleCkpIHtcbiAgICAgICAgICAvLyBgKiovYCBpcyB6ZXJvIG9yIG1vcmUgd2hvbGUgZm9sZGVycy5cbiAgICAgICAgICBzb3VyY2UgKz0gJyg/OlteL10qLykqJztcbiAgICAgICAgICBpbmRleCArPSBHTE9CU1RBUl9GT0xERVJTLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChpc1NlZ21lbnRTdGFydCAmJiBpbmRleCArIEdMT0JTVEFSLmxlbmd0aCA9PT0gZ2xvYi5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBBIHRyYWlsaW5nIGAvKipgIGlzIGV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAgICAgICAgc291cmNlICs9ICcuKic7XG4gICAgICAgICAgaW5kZXggKz0gR0xPQlNUQVIubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFueSBvdGhlciBgKipgIGlzIGFuIG9yZGluYXJ5IGAqYCwgYXMgaW4gYC5naXRpZ25vcmVgLlxuICAgICAgICAgIHNvdXJjZSArPSAnW14vXSonO1xuICAgICAgICAgIGluZGV4ICs9IEdMT0JTVEFSLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1xcXFwnOiB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGlmIChpbmRleCA+PSBnbG9iLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGF0aFNldHRpbmdzLnRyYWlsaW5nRXNjYXBlKSwgaXNWYWxpZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgKz0gZXNjYXBlUmVnRXhwKGdsb2IuY2hhckF0KGluZGV4KSk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBzb3VyY2UgKz0gZXNjYXBlUmVnRXhwKGNoYXJhY3Rlcik7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIHNvdXJjZSB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWdFeHBFcnJvclJlYXNvbihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGUgUmVnRXhwIGNvbnN0cnVjdG9yIG9ubHkgZXZlciB0aHJvd3MgYSBTeW50YXhFcnJvci4gKi9cbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgLy8gVjggcGhyYXNlcyBpdCBgSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IC88c291cmNlPi88ZmxhZ3M+OiA8cmVhc29uPmA7IHRoZSBlbnRyeSBpcyBhbHJlYWR5IG5hbWVkLlxuICBjb25zdCBtYXRjaCA9IC9eSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IFxcLy4qXFwvW2Etel0qOiAoPzxyZWFzb24+LiopJC9zLmV4ZWMobWVzc2FnZSk7XG4gIHJldHVybiBtYXRjaD8uZ3JvdXBzPy5bJ3JlYXNvbiddID8/IG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGhhc1VuZXNjYXBlZEdsb2JDaGFyYWN0ZXIoZW50cnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZW50cnkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gZW50cnkuY2hhckF0KGluZGV4KTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfSBlbHNlIGlmIChHTE9CX0NIQVJBQ1RFUlMuaGFzKGNoYXJhY3RlcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1ha2VNYXRjaGVycyhwYXRoczogc3RyaW5nW10sIGRlZmF1bHRNYXRjaGVyOiBQYXRoTWF0Y2hlcik6IG51bGwgfCBQYXRoTWF0Y2hlcltdIHtcbiAgaWYgKHBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbZGVmYXVsdE1hdGNoZXJdO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlcnM6IFBhdGhNYXRjaGVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgY29uc3QgeyBtYXRjaGVyIH0gPSBjb21waWxlRW50cnkocGF0aCwgZGVmYXVsdE1hdGNoZXIpO1xuICAgIGlmICghbWF0Y2hlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG1hdGNoZXJzLnB1c2gobWF0Y2hlcik7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXJzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQkEscUJBQTZCO0FBQzdCLHlCQUE0QjtBQUU1QixrQkFBa0I7QUFrQ2xCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sa0JBQWtCLG9CQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQy9DLE1BQU0sV0FBVztBQUNqQixNQUFNLG1CQUFtQjtBQUV6QixNQUFNLGlCQUE4QjtBQUFBLEVBQ2xDLFNBQVMsTUFBTTtBQUNqQjtBQUVBLE1BQU0sZ0JBQTZCO0FBQUEsRUFDakMsU0FBUyxNQUFNO0FBQ2pCO0FBRUEsTUFBTSxZQUFZO0FBQUEsRUFjVCxZQUE2QixNQUF1QjtBQUF2QjtBQUNsQyxTQUFLLGlCQUFpQixrQkFBa0IsSUFBSTtBQUM1QyxTQUFLLFdBQVcsQ0FBQyxLQUFLLGNBQWM7QUFBQSxFQUN0QztBQUFBLEVBSG9DO0FBQUEsRUFicEMsSUFBVyxRQUFrQjtBQUMzQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFQSxJQUFXLE1BQU0sT0FBaUI7QUFDaEMsU0FBSyxTQUFTLE1BQU0sT0FB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
@@ -3,10 +3,24 @@
3
3
  * @file
4
4
  *
5
5
  * This module provides classes and validators for managing include/exclude path settings.
6
+ *
7
+ * An entry takes one of three forms, and every form matches case-insensitively:
8
+ *
9
+ * - A regular expression literal, `/pattern/flags`. Its own flags are honoured and `i` is always added. `g` and `y` are
10
+ * accepted and dropped, since they make `RegExp.test` stateful and say nothing about which paths match.
11
+ * - A glob, an entry holding an unescaped `*`, `?` or `[`. `*` matches within one path segment, `**` across segments,
12
+ * `?` one character and `[abc]` / `[!abc]` a character class. A glob with no `/` matches a file or folder NAME at any
13
+ * depth, as in `.gitignore` (`*.pdf` matches `a/b/c.pdf`); one with a `/` is anchored to the vault root
14
+ * (`Attachments/*.pdf`). A trailing `/` makes it match folders only.
15
+ * - A plain path, every other entry, which matches that path and everything inside it. A literal `*`, `?`, `[` or `\` in
16
+ * a plain path or a glob is written escaped (`\*`).
6
17
  */
7
18
  import type { MaybeReturn } from '@mnaoumov/typescript-lib/type' with { 'resolution-mode': 'import' };
8
19
  /**
9
20
  * A class for managing include/exclude path settings.
21
+ *
22
+ * See the module documentation for the entry syntax: plain paths, globs and regular expression literals, all matched
23
+ * case-insensitively.
10
24
  */
11
25
  export declare class PathSettings {
12
26
  /**
@@ -39,16 +53,18 @@ export declare class PathSettings {
39
53
  * Checks if a path is ignored by the include/exclude path settings.
40
54
  *
41
55
  * @param path - The path to check.
56
+ * @param isFolder - Whether the path is a folder. Only a folder-only glob (one ending in `/`) reads it: such a glob
57
+ * always matches the contents of a matching folder, and matches the folder itself only when this is `true`.
42
58
  * @returns `true` if the path is ignored, `false` otherwise.
43
59
  */
44
- isPathIgnored(path: string): boolean;
60
+ isPathIgnored(path: string, isFolder?: boolean): boolean;
45
61
  }
46
62
  /**
47
- * Validates include/exclude path entries, reporting the first entry that is not a parseable regular expression.
63
+ * Validates include/exclude path entries, reporting the first entry that is not a valid regular expression or glob.
48
64
  *
49
- * An entry that starts and ends with `/` is a regular expression literal; every other entry is a plain path and is
50
- * always valid. An invalid entry does not throw when assigned to {@link PathSettings} — the whole list falls back to
51
- * its default pattern instead — so this validator is what surfaces the problem to the user.
65
+ * An invalid entry does not throw when assigned to {@link PathSettings} — the whole list falls back to its default
66
+ * pattern instead — so this validator is what surfaces the problem to the user. The message names the entry and the
67
+ * reason it is invalid.
52
68
  *
53
69
  * @param paths - The path entries to validate.
54
70
  * @returns A message naming the first invalid entry, or nothing when every entry is valid.