@mnaoumov/obsidian-lib 10.5.1 → 10.7.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 (189) hide show
  1. package/codemirror/inline-token-widgets/package.json +6 -0
  2. package/codemirror/settings-facet/package.json +6 -0
  3. package/command-handlers/open-discussion-command-handler/package.json +6 -0
  4. package/command-handlers/open-feature-request-command-handler/package.json +6 -0
  5. package/command-handlers/open-git-hub-command-handler/package.json +6 -0
  6. package/components/settings-facet-component/package.json +6 -0
  7. package/components/style-sheet-component/package.json +6 -0
  8. package/dist/lib/cjs/__merged.cjs +137 -1
  9. package/dist/lib/cjs/__merged.d.cts +26 -0
  10. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  11. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  12. package/dist/lib/cjs/broken-link-candidates.cjs +366 -0
  13. package/dist/lib/cjs/broken-link-candidates.d.cts +181 -0
  14. package/dist/lib/cjs/bug-report.cjs +4 -2
  15. package/dist/lib/cjs/bug-report.d.cts +1 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/command-handlers/index.cjs +10 -1
  25. package/dist/lib/cjs/command-handlers/index.d.cts +3 -0
  26. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +9 -12
  27. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +6 -8
  28. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +127 -0
  29. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.d.cts +45 -0
  30. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +119 -0
  31. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.d.cts +33 -0
  32. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +121 -0
  33. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.d.cts +43 -0
  34. package/dist/lib/cjs/components/index.cjs +7 -1
  35. package/dist/lib/cjs/components/index.d.cts +2 -0
  36. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  37. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  38. package/dist/lib/cjs/components/style-sheet-component.cjs +198 -0
  39. package/dist/lib/cjs/components/style-sheet-component.d.cts +79 -0
  40. package/dist/lib/cjs/css-class.cjs +8 -1
  41. package/dist/lib/cjs/css-class.d.cts +28 -0
  42. package/dist/lib/cjs/data-stores/data-store-transport.cjs +7 -4
  43. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +1 -1
  44. package/dist/lib/cjs/data-stores/shared-data-store.cjs +1 -1
  45. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +1 -1
  46. package/dist/lib/cjs/desktop-git-runner.cjs +117 -0
  47. package/dist/lib/cjs/desktop-git-runner.d.cts +17 -0
  48. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  49. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  50. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  51. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  52. package/dist/lib/cjs/editor-suggest.cjs +197 -0
  53. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  54. package/dist/lib/cjs/feature-request.cjs +115 -0
  55. package/dist/lib/cjs/feature-request.d.cts +54 -0
  56. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  57. package/dist/lib/cjs/git-hub-discussion.cjs +101 -0
  58. package/dist/lib/cjs/git-hub-discussion.d.cts +28 -0
  59. package/dist/lib/cjs/git-rename-history.cjs +148 -0
  60. package/dist/lib/cjs/git-rename-history.d.cts +43 -0
  61. package/dist/lib/cjs/hotkey.cjs +185 -0
  62. package/dist/lib/cjs/hotkey.d.cts +59 -0
  63. package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
  64. package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
  65. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
  66. package/dist/lib/cjs/index.cjs +46 -1
  67. package/dist/lib/cjs/index.d.cts +15 -0
  68. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  69. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  70. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  71. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  72. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  73. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  74. package/dist/lib/cjs/markdown.cjs +6 -1
  75. package/dist/lib/cjs/markdown.d.cts +10 -1
  76. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  77. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  78. package/dist/lib/cjs/request-url.cjs +523 -0
  79. package/dist/lib/cjs/request-url.d.cts +233 -0
  80. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  81. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  82. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  83. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  84. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  85. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  86. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  87. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  88. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  89. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  90. package/dist/lib/cjs/setting-ex.cjs +51 -1
  91. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  92. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  93. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  94. package/dist/lib/cjs/vault.cjs +2 -2
  95. package/dist/lib/cjs/vault.d.cts +3 -1
  96. package/dist/lib/esm/__merged.d.mts +26 -0
  97. package/dist/lib/esm/__merged.mjs +139 -1
  98. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  99. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  100. package/dist/lib/esm/broken-link-candidates.d.mts +181 -0
  101. package/dist/lib/esm/broken-link-candidates.mjs +275 -0
  102. package/dist/lib/esm/bug-report.d.mts +1 -1
  103. package/dist/lib/esm/bug-report.mjs +4 -2
  104. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  105. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  106. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  107. package/dist/lib/esm/codemirror/index.mjs +5 -1
  108. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  109. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  110. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  111. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  112. package/dist/lib/esm/command-handlers/index.d.mts +3 -0
  113. package/dist/lib/esm/command-handlers/index.mjs +7 -1
  114. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +6 -8
  115. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +9 -12
  116. package/dist/lib/esm/command-handlers/open-discussion-command-handler.d.mts +45 -0
  117. package/dist/lib/esm/command-handlers/open-discussion-command-handler.mjs +39 -0
  118. package/dist/lib/esm/command-handlers/open-feature-request-command-handler.d.mts +33 -0
  119. package/dist/lib/esm/command-handlers/open-feature-request-command-handler.mjs +31 -0
  120. package/dist/lib/esm/command-handlers/open-git-hub-command-handler.d.mts +43 -0
  121. package/dist/lib/esm/command-handlers/open-git-hub-command-handler.mjs +33 -0
  122. package/dist/lib/esm/components/index.d.mts +2 -0
  123. package/dist/lib/esm/components/index.mjs +5 -1
  124. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  125. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  126. package/dist/lib/esm/components/style-sheet-component.d.mts +79 -0
  127. package/dist/lib/esm/components/style-sheet-component.mjs +109 -0
  128. package/dist/lib/esm/css-class.d.mts +28 -0
  129. package/dist/lib/esm/css-class.mjs +8 -1
  130. package/dist/lib/esm/data-stores/data-store-transport.d.mts +1 -1
  131. package/dist/lib/esm/data-stores/data-store-transport.mjs +7 -4
  132. package/dist/lib/esm/data-stores/shared-data-store.d.mts +1 -1
  133. package/dist/lib/esm/data-stores/shared-data-store.mjs +1 -1
  134. package/dist/lib/esm/desktop-git-runner.d.mts +17 -0
  135. package/dist/lib/esm/desktop-git-runner.mjs +19 -0
  136. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  137. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  138. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  139. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  140. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  141. package/dist/lib/esm/editor-suggest.mjs +108 -0
  142. package/dist/lib/esm/feature-request.d.mts +54 -0
  143. package/dist/lib/esm/feature-request.mjs +25 -0
  144. package/dist/lib/esm/generated-during-build.mjs +2 -2
  145. package/dist/lib/esm/git-hub-discussion.d.mts +28 -0
  146. package/dist/lib/esm/git-hub-discussion.mjs +13 -0
  147. package/dist/lib/esm/git-rename-history.d.mts +43 -0
  148. package/dist/lib/esm/git-rename-history.mjs +59 -0
  149. package/dist/lib/esm/hotkey.d.mts +59 -0
  150. package/dist/lib/esm/hotkey.mjs +95 -0
  151. package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
  152. package/dist/lib/esm/i18n/locales/en.mjs +13 -1
  153. package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
  154. package/dist/lib/esm/index.d.mts +15 -0
  155. package/dist/lib/esm/index.mjs +31 -1
  156. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  157. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  158. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  159. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  160. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  161. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  162. package/dist/lib/esm/markdown.d.mts +10 -1
  163. package/dist/lib/esm/markdown.mjs +9 -1
  164. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  165. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  166. package/dist/lib/esm/request-url.d.mts +233 -0
  167. package/dist/lib/esm/request-url.mjs +428 -0
  168. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  169. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  170. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  171. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  172. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  173. package/dist/lib/esm/setting-components/index.mjs +9 -1
  174. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  175. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  176. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  177. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  178. package/dist/lib/esm/setting-ex.d.mts +35 -1
  179. package/dist/lib/esm/setting-ex.mjs +51 -1
  180. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  181. package/dist/lib/esm/settings-tabs.mjs +170 -0
  182. package/dist/lib/esm/vault.d.mts +3 -1
  183. package/dist/lib/esm/vault.mjs +2 -2
  184. package/dist/styles.css +83 -1
  185. package/package.json +2 -2
  186. package/setting-components/folder-list-component/package.json +6 -0
  187. package/setting-components/hotkey-component/package.json +6 -0
  188. package/setting-components/list-component/package.json +6 -0
  189. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,88 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * One definition of an inline token that renders in both Reading view and Live Preview.
7
+ *
8
+ * A token is a regular expression and a render function. {@link registerInlineTokenRenderer} registers a Markdown
9
+ * post processor that renders every match found in the rendered text, and an editor extension that replaces every
10
+ * match with a widget in Live Preview, both calling the same function, so the two views cannot drift apart.
11
+ *
12
+ * The Reading-view half walks text nodes only, so a token is never matched across an element boundary, and it skips
13
+ * text inside the elements `skipSelector` names (code by default). The editor half matches each line's source text,
14
+ * Markdown markup included; see `shouldDecorate` to skip code there.
15
+ */
16
+ import type { MarkdownPostProcessorContext } from 'obsidian' with { 'resolution-mode': 'import' };
17
+ import type { CreateInlineTokenWidgetsExtensionParams, InlineTokenRenderFunction } from './codemirror/inline-token-widgets.cjs';
18
+ import type { EditorExtensionRegistrar } from './editor-extension-registrar.cjs';
19
+ import type { MarkdownPostProcessorRegistrar } from './markdown-post-processor-registrar.cjs';
20
+ /**
21
+ * The default selector of the elements whose text is never matched in Reading view.
22
+ */
23
+ export declare const DEFAULT_INLINE_TOKEN_SKIP_SELECTOR = "code, pre";
24
+ /**
25
+ * Parameters for {@link createInlineTokenPostProcessor}.
26
+ */
27
+ export interface CreateInlineTokenPostProcessorParams {
28
+ /**
29
+ * The regular expression a token matches. The `g` flag is added when missing.
30
+ */
31
+ readonly regExp: RegExp;
32
+ /**
33
+ * Renders a token into its element.
34
+ */
35
+ readonly render: InlineTokenRenderFunction;
36
+ /**
37
+ * The selector of the elements whose text is never matched.
38
+ *
39
+ * @default {@link DEFAULT_INLINE_TOKEN_SKIP_SELECTOR}
40
+ */
41
+ readonly skipSelector?: string;
42
+ }
43
+ /**
44
+ * Parameters for {@link registerInlineTokenRenderer}.
45
+ */
46
+ export interface RegisterInlineTokenRendererParams extends CreateInlineTokenPostProcessorParams, CreateInlineTokenWidgetsExtensionParams {
47
+ /**
48
+ * The registrar the editor extension is registered through.
49
+ */
50
+ readonly editorExtensionRegistrar: EditorExtensionRegistrar;
51
+ /**
52
+ * The registrar the Reading-view post processor is registered through.
53
+ */
54
+ readonly markdownPostProcessorRegistrar: MarkdownPostProcessorRegistrar;
55
+ /**
56
+ * The sort order of the post processor.
57
+ *
58
+ * @default `0`
59
+ */
60
+ readonly sortOrder?: number;
61
+ }
62
+ /**
63
+ * Creates a Markdown post processor that renders every match of a regular expression found in the rendered text.
64
+ *
65
+ * @param params - The post processor parameters.
66
+ * @returns The post processor.
67
+ */
68
+ export declare function createInlineTokenPostProcessor(params: CreateInlineTokenPostProcessorParams): (element: HTMLElement, context: Pick<MarkdownPostProcessorContext, 'sourcePath'>) => void;
69
+ /**
70
+ * Registers an inline token in both Reading view and Live Preview, from one definition.
71
+ *
72
+ * Obsidian ties both registrations to the plugin's lifetime and offers no way to remove either earlier.
73
+ *
74
+ * @param params - The registration parameters.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * registerInlineTokenRenderer({
79
+ * editorExtensionRegistrar: new PluginEditorExtensionRegistrar(this),
80
+ * markdownPostProcessorRegistrar: new PluginMarkdownPostProcessorRegistrar(this),
81
+ * regExp: /:([a-z]+):/,
82
+ * render({ containerEl, match }) {
83
+ * containerEl.setText(EMOJI[match[1] ?? ''] ?? match[0]);
84
+ * }
85
+ * });
86
+ * ```
87
+ */
88
+ export declare function registerInlineTokenRenderer(params: RegisterInlineTokenRendererParams): void;
@@ -0,0 +1,325 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __defProp = Object.defineProperty;
99
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
100
+ var __getOwnPropNames = Object.getOwnPropertyNames;
101
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
102
+ var __export = (target, all) => {
103
+ for (var name in all)
104
+ __defProp(target, name, { get: all[name], enumerable: true });
105
+ };
106
+ var __copyProps = (to, from, except, desc) => {
107
+ if (from && typeof from === "object" || typeof from === "function") {
108
+ for (let key of __getOwnPropNames(from))
109
+ if (!__hasOwnProp.call(to, key) && key !== except)
110
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
111
+ }
112
+ return to;
113
+ };
114
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
+ var link_and_tag_input_suggest_exports = {};
116
+ __export(link_and_tag_input_suggest_exports, {
117
+ LinkAndTagCompletionKind: () => LinkAndTagCompletionKind,
118
+ LinkAndTagInputSuggest: () => LinkAndTagInputSuggest,
119
+ getLinkAndTagCompletionTrigger: () => getLinkAndTagCompletionTrigger,
120
+ getVaultTagSuggestions: () => getVaultTagSuggestions
121
+ });
122
+ module.exports = __toCommonJS(link_and_tag_input_suggest_exports);
123
+ var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
124
+ var import_obsidian = require('obsidian');
125
+ var LinkAndTagCompletionKind = /* @__PURE__ */ ((LinkAndTagCompletionKind2) => {
126
+ LinkAndTagCompletionKind2["Link"] = "link";
127
+ LinkAndTagCompletionKind2["Tag"] = "tag";
128
+ return LinkAndTagCompletionKind2;
129
+ })(LinkAndTagCompletionKind || {});
130
+ const LINK_OPEN = "[[";
131
+ const LINK_CLOSE = "]]";
132
+ const TAG_PREFIX = "#";
133
+ const TAG_BEFORE_CARET_REG_EXP = /(?:^|\s)#[\p{L}\p{N}_/-]*$/u;
134
+ class LinkAndTagInputSuggest extends import_obsidian.AbstractInputSuggest {
135
+ /**
136
+ * The element the suggest completes in.
137
+ */
138
+ inputEl;
139
+ /**
140
+ * Whether `[[` completes links.
141
+ */
142
+ shouldSuggestLinks;
143
+ /**
144
+ * Whether `#` completes tags.
145
+ */
146
+ shouldSuggestTags;
147
+ /**
148
+ * The path that inserted links are relative to.
149
+ */
150
+ sourcePath;
151
+ /**
152
+ * Creates the suggest and attaches it to the element.
153
+ *
154
+ * @param params - The parameters.
155
+ */
156
+ constructor(params) {
157
+ super(params.app, (0, import_object_utils.castTo)(params.inputEl));
158
+ this.inputEl = params.inputEl;
159
+ this.shouldSuggestLinks = params.shouldSuggestLinks ?? true;
160
+ this.shouldSuggestTags = params.shouldSuggestTags ?? true;
161
+ this.sourcePath = params.sourcePath ?? "";
162
+ }
163
+ /**
164
+ * Gets the value of the element.
165
+ *
166
+ * @returns The value.
167
+ */
168
+ getValue() {
169
+ return this.inputEl.value;
170
+ }
171
+ /**
172
+ * Renders a suggestion.
173
+ *
174
+ * @param suggestion - The suggestion.
175
+ * @param el - The element to render into.
176
+ */
177
+ renderSuggestion(suggestion, el) {
178
+ if (suggestion.kind === "link" /* Link */) {
179
+ el.createDiv({ cls: "suggestion-title", text: suggestion.linktext });
180
+ if (suggestion.linktext !== suggestion.file.path) {
181
+ el.createDiv({ cls: "suggestion-note", text: suggestion.file.path });
182
+ }
183
+ return;
184
+ }
185
+ el.addClass("mod-complex");
186
+ el.createDiv({ cls: "suggestion-content", text: `${TAG_PREFIX}${suggestion.tag}` });
187
+ el.createDiv({ cls: "suggestion-aux", text: String(suggestion.count) });
188
+ }
189
+ /**
190
+ * Inserts the suggestion in place of the trigger, moves the caret after it and dispatches an `input` event, so a
191
+ * component listening on the element sees the change.
192
+ *
193
+ * @param suggestion - The suggestion.
194
+ * @param $event - The event that selected it.
195
+ */
196
+ selectSuggestion(suggestion, $event) {
197
+ const trigger = this.getTrigger();
198
+ if (trigger) {
199
+ const value = this.getValue();
200
+ let after = value.slice(trigger.end);
201
+ let insertion;
202
+ if (suggestion.kind === "link" /* Link */) {
203
+ insertion = `${LINK_OPEN}${suggestion.linktext}${LINK_CLOSE}`;
204
+ if (after.startsWith(LINK_CLOSE)) {
205
+ after = after.slice(LINK_CLOSE.length);
206
+ }
207
+ } else {
208
+ insertion = `${TAG_PREFIX}${suggestion.tag} `;
209
+ }
210
+ this.setValue(value.slice(0, trigger.start) + insertion + after);
211
+ const caret = trigger.start + insertion.length;
212
+ this.inputEl.setSelectionRange(caret, caret);
213
+ this.inputEl.dispatchEvent(new Event("input", { bubbles: true }));
214
+ }
215
+ super.selectSuggestion(suggestion, $event);
216
+ this.close();
217
+ }
218
+ /**
219
+ * Sets the value of the element.
220
+ *
221
+ * @param value - The value.
222
+ */
223
+ setValue(value) {
224
+ this.inputEl.value = value;
225
+ }
226
+ /**
227
+ * Gets the link suggestions for a query.
228
+ *
229
+ * @param query - The text typed after `[[`.
230
+ * @returns The suggestions, best match first.
231
+ */
232
+ getLinkSuggestions(query) {
233
+ const fuzzySearch = (0, import_obsidian.prepareFuzzySearch)(query);
234
+ const results = [];
235
+ for (const file of this.app.vault.getFiles()) {
236
+ const linktext = this.app.metadataCache.fileToLinktext(file, this.sourcePath, true);
237
+ const match = fuzzySearch(linktext) ?? fuzzySearch(file.path);
238
+ if (match) {
239
+ results.push({ match, suggestion: { file, kind: "link" /* Link */, linktext } });
240
+ }
241
+ }
242
+ (0, import_obsidian.sortSearchResults)(results);
243
+ return results.map((result) => result.suggestion);
244
+ }
245
+ /**
246
+ * Gets the suggestions for the trigger before the caret. The query Obsidian passes is the whole value, so it is
247
+ * ignored.
248
+ *
249
+ * @returns The suggestions.
250
+ */
251
+ getSuggestions() {
252
+ const trigger = this.getTrigger();
253
+ if (trigger?.kind === "link" /* Link */) {
254
+ return this.getLinkSuggestions(trigger.query);
255
+ }
256
+ return trigger?.kind === "tag" /* Tag */ ? this.getTagSuggestions(trigger.query) : [];
257
+ }
258
+ /**
259
+ * Gets the tag suggestions for a query, from the tags of every note.
260
+ *
261
+ * @param query - The text typed after `#`.
262
+ * @returns The suggestions, best match first, then the most used.
263
+ */
264
+ getTagSuggestions(query) {
265
+ return getVaultTagSuggestions({ app: this.app, query });
266
+ }
267
+ /**
268
+ * Gets the enabled trigger before the caret.
269
+ *
270
+ * @returns The trigger, or `null`.
271
+ */
272
+ getTrigger() {
273
+ const value = this.getValue();
274
+ const trigger = getLinkAndTagCompletionTrigger(value, this.inputEl.selectionStart ?? value.length);
275
+ if (trigger?.kind === "link" /* Link */ && !this.shouldSuggestLinks) {
276
+ return null;
277
+ }
278
+ return trigger?.kind === "tag" /* Tag */ && !this.shouldSuggestTags ? null : trigger;
279
+ }
280
+ }
281
+ function getLinkAndTagCompletionTrigger(text, caret) {
282
+ const beforeCaret = text.slice(0, caret);
283
+ const linkStart = beforeCaret.lastIndexOf(LINK_OPEN);
284
+ if (linkStart !== -1) {
285
+ const query = beforeCaret.slice(linkStart + LINK_OPEN.length);
286
+ if (!query.includes(LINK_CLOSE) && !query.includes("\n") && !query.includes("|")) {
287
+ return { end: caret, kind: "link" /* Link */, query, start: linkStart };
288
+ }
289
+ }
290
+ if (TAG_BEFORE_CARET_REG_EXP.test(beforeCaret)) {
291
+ const start = beforeCaret.lastIndexOf(TAG_PREFIX);
292
+ return { end: caret, kind: "tag" /* Tag */, query: beforeCaret.slice(start + TAG_PREFIX.length), start };
293
+ }
294
+ return null;
295
+ }
296
+ function getVaultTagSuggestions(params) {
297
+ const { app, query } = params;
298
+ const counts = /* @__PURE__ */ new Map();
299
+ for (const file of app.vault.getMarkdownFiles()) {
300
+ const cache = app.metadataCache.getFileCache(file);
301
+ for (const tag of (cache ? (0, import_obsidian.getAllTags)(cache) : null) ?? []) {
302
+ const name = tag.slice(TAG_PREFIX.length);
303
+ counts.set(name, (counts.get(name) ?? 0) + 1);
304
+ }
305
+ }
306
+ const fuzzySearch = (0, import_obsidian.prepareFuzzySearch)(query);
307
+ const results = [];
308
+ const sortedCounts = [...counts].sort(([tag1, count1], [tag2, count2]) => count2 - count1 || tag1.localeCompare(tag2));
309
+ for (const [tag, count] of sortedCounts) {
310
+ const match = fuzzySearch(tag);
311
+ if (match) {
312
+ results.push({ match, suggestion: { count, kind: "tag" /* Tag */, tag } });
313
+ }
314
+ }
315
+ (0, import_obsidian.sortSearchResults)(results);
316
+ return results.map((result) => result.suggestion);
317
+ }
318
+ // Annotate the CommonJS export names for ESM import in node:
319
+ 0 && (module.exports = {
320
+ LinkAndTagCompletionKind,
321
+ LinkAndTagInputSuggest,
322
+ getLinkAndTagCompletionTrigger,
323
+ getVaultTagSuggestions
324
+ });
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLWFuZC10YWctaW5wdXQtc3VnZ2VzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcGxldGVzIGBbW2AgbGlua3MgYW5kIGAjYCB0YWdzIGF0IHRoZSBjYXJldCBvZiBhbnkgYDxpbnB1dD5gIG9yIGA8dGV4dGFyZWE+YCwgdGhlIHdheSB0aGUgZWRpdG9yIGRvZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFNlYXJjaFJlc3VsdCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0SW5wdXRTdWdnZXN0LFxuICBnZXRBbGxUYWdzLFxuICBwcmVwYXJlRnV6enlTZWFyY2gsXG4gIHNvcnRTZWFyY2hSZXN1bHRzXG59IGZyb20gJ29ic2lkaWFuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgVGFnTGlzdENvbXBvbmVudGAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG5pbXBvcnQgdHlwZSB7IFRhZ0xpc3RDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy90YWctbGlzdC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFdoYXQgYSBjb21wbGV0aW9uIHRyaWdnZXIgY29tcGxldGVzLlxuICovXG5leHBvcnQgZW51bSBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQge1xuICAvKipcbiAgICogQSBgW1tgIHdpa2lsaW5rIHRvIGEgdmF1bHQgZmlsZS5cbiAgICovXG4gIExpbmsgPSAnbGluaycsXG5cbiAgLyoqXG4gICAqIEEgYCNgIHRhZy5cbiAgICovXG4gIFRhZyA9ICd0YWcnXG59XG5cbi8qKlxuICogQSBjb21wbGV0aW9uIHRyaWdnZXIgZm91bmQgYmVmb3JlIHRoZSBjYXJldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rQW5kVGFnQ29tcGxldGlvblRyaWdnZXIge1xuICAvKipcbiAgICogVGhlIG9mZnNldCBvZiB0aGUgY2FyZXQsIHdoZXJlIHRoZSBxdWVyeSBlbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRyaWdnZXIgY29tcGxldGVzLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0eXBlZCBhZnRlciB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcXVlcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9mZnNldCBvZiB0aGUgdHJpZ2dlciBjaGFyYWN0ZXJzOiB0aGUgZmlyc3QgYFtgIG9mIGBbW2AsIG9yIHRoZSBgI2AuXG4gICAqL1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgb2Yge0BsaW5rIExpbmtBbmRUYWdJbnB1dFN1Z2dlc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtBbmRUYWdJbnB1dFN1Z2dlc3RDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGNvbXBsZXRlIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYFtbYCBjb21wbGV0ZXMgbGlua3MuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN1Z2dlc3RMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYCNgIGNvbXBsZXRlcyB0YWdzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTdWdnZXN0VGFncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoYXQgaW5zZXJ0ZWQgbGlua3MgYXJlIHJlbGF0aXZlIHRvLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzdWdnZXN0aW9uIG9mIHtAbGluayBMaW5rQW5kVGFnSW5wdXRTdWdnZXN0fS5cbiAqL1xuZXhwb3J0IHR5cGUgTGlua0FuZFRhZ1N1Z2dlc3Rpb24gPSBMaW5rU3VnZ2VzdGlvbiB8IFRhZ1N1Z2dlc3Rpb247XG5cbi8qKlxuICogQSBzdWdnZXN0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU3VnZ2VzdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGUgbGluayBwb2ludHMgdG8uXG4gICAqL1xuICByZWFkb25seSBmaWxlOiBURmlsZTtcblxuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIHN1Z2dlc3Rpb24uXG4gICAqL1xuICByZWFkb25seSBraW5kOiBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaztcblxuICAvKipcbiAgICogVGhlIGxpbmsgdGV4dCBpbnNlcnRlZCBiZXR3ZWVuIGBbW2AgYW5kIGBdXWAuXG4gICAqL1xuICByZWFkb25seSBsaW5rdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc3VnZ2VzdGVkIHRhZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWdTdWdnZXN0aW9uIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IHRhZyBvY2N1cnJlbmNlcyB0aGUgdmF1bHQgaG9sZHMuXG4gICAqL1xuICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiB0aGUgc3VnZ2VzdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5UYWc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWcsIHdpdGhvdXQgaXRzIGAjYC5cbiAgICovXG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3VnZ2VzdGlvblNlYXJjaFJlc3VsdDxUPiB7XG4gIHJlYWRvbmx5IG1hdGNoOiBTZWFyY2hSZXN1bHQ7XG4gIHJlYWRvbmx5IHN1Z2dlc3Rpb246IFQ7XG59XG5cbmNvbnN0IExJTktfT1BFTiA9ICdbWyc7XG5jb25zdCBMSU5LX0NMT1NFID0gJ11dJztcbmNvbnN0IFRBR19QUkVGSVggPSAnIyc7XG5jb25zdCBUQUdfQkVGT1JFX0NBUkVUX1JFR19FWFAgPSAvKD86XnxcXHMpI1tcXHB7TH1cXHB7Tn1fLy1dKiQvdTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0VmF1bHRUYWdTdWdnZXN0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmF1bHRUYWdTdWdnZXN0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHR5cGVkLCB3aXRob3V0IHRoZSBgI2AuXG4gICAqL1xuICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXBsZXRlcyBgW1tgIGxpbmtzIGFuZCBgI2AgdGFncyBpbnNpZGUgYW55IGA8aW5wdXQ+YCBvciBgPHRleHRhcmVhPmAuXG4gKlxuICogT2JzaWRpYW4ncyB7QGxpbmsgQWJzdHJhY3RJbnB1dFN1Z2dlc3R9IHRyZWF0cyB0aGUgd2hvbGUgdmFsdWUgYXMgdGhlIHF1ZXJ5IGFuZCByZXBsYWNlcyBpdCBvbiBzZWxlY3Rpb24uIFRoaXMgb25lXG4gKiByZWFkcyB0aGUgdHJpZ2dlciBiZWZvcmUgdGhlIGNhcmV0IGFuZCByZXBsYWNlcyBvbmx5IHRoYXQsIHNvIGl0IHdvcmtzIGluc2lkZSBmcmVlIHRleHQgc3VjaCBhcyBhIHRlbXBsYXRlIG9yIGFcbiAqIGRlc2NyaXB0aW9uIHNldHRpbmcsIGFuZCBpdCBhY2NlcHRzIGEgYDx0ZXh0YXJlYT5gIHRvby5cbiAqXG4gKiBgYGB0c1xuICogbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLmFkZFRleHRBcmVhKCh0ZXh0QXJlYSkgPT4ge1xuICogICBuZXcgTGlua0FuZFRhZ0lucHV0U3VnZ2VzdCh7IGFwcDogdGhpcy5hcHAsIGlucHV0RWw6IHRleHRBcmVhLmlucHV0RWwgfSk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTGlua0FuZFRhZ0lucHV0U3VnZ2VzdCBleHRlbmRzIEFic3RyYWN0SW5wdXRTdWdnZXN0PExpbmtBbmRUYWdTdWdnZXN0aW9uPiB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0aGUgc3VnZ2VzdCBjb21wbGV0ZXMgaW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYFtbYCBjb21wbGV0ZXMgbGlua3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkU3VnZ2VzdExpbmtzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGAjYCBjb21wbGV0ZXMgdGFncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRTdWdnZXN0VGFnczogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggdGhhdCBpbnNlcnRlZCBsaW5rcyBhcmUgcmVsYXRpdmUgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBzdWdnZXN0IGFuZCBhdHRhY2hlcyBpdCB0byB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTGlua0FuZFRhZ0lucHV0U3VnZ2VzdENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgLy8gT2JzaWRpYW4ncyBzdWdnZXN0IHJlYWRzIHRoZSB2YWx1ZSBvbmx5IHRocm91Z2ggYGdldFZhbHVlYCBhbmQgYHNldFZhbHVlYCwgYm90aCBvdmVycmlkZGVuIGhlcmUsIHNvIGEgdGV4dGFyZWEgd29ya3MgdG9vLlxuICAgIHN1cGVyKHBhcmFtcy5hcHAsIGNhc3RUbzxIVE1MSW5wdXRFbGVtZW50PihwYXJhbXMuaW5wdXRFbCkpO1xuICAgIHRoaXMuaW5wdXRFbCA9IHBhcmFtcy5pbnB1dEVsO1xuICAgIHRoaXMuc2hvdWxkU3VnZ2VzdExpbmtzID0gcGFyYW1zLnNob3VsZFN1Z2dlc3RMaW5rcyA/PyB0cnVlO1xuICAgIHRoaXMuc2hvdWxkU3VnZ2VzdFRhZ3MgPSBwYXJhbXMuc2hvdWxkU3VnZ2VzdFRhZ3MgPz8gdHJ1ZTtcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aCA/PyAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRFbC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgc3VnZ2VzdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHN1Z2dlc3Rpb24gLSBUaGUgc3VnZ2VzdGlvbi5cbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBMaW5rQW5kVGFnU3VnZ2VzdGlvbiwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHN1Z2dlc3Rpb24ua2luZCA9PT0gTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kLkxpbmspIHtcbiAgICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tdGl0bGUnLCB0ZXh0OiBzdWdnZXN0aW9uLmxpbmt0ZXh0IH0pO1xuICAgICAgaWYgKHN1Z2dlc3Rpb24ubGlua3RleHQgIT09IHN1Z2dlc3Rpb24uZmlsZS5wYXRoKSB7XG4gICAgICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tbm90ZScsIHRleHQ6IHN1Z2dlc3Rpb24uZmlsZS5wYXRoIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsLmFkZENsYXNzKCdtb2QtY29tcGxleCcpO1xuICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tY29udGVudCcsIHRleHQ6IGAke1RBR19QUkVGSVh9JHtzdWdnZXN0aW9uLnRhZ31gIH0pO1xuICAgIGVsLmNyZWF0ZURpdih7IGNsczogJ3N1Z2dlc3Rpb24tYXV4JywgdGV4dDogU3RyaW5nKHN1Z2dlc3Rpb24uY291bnQpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgdGhlIHN1Z2dlc3Rpb24gaW4gcGxhY2Ugb2YgdGhlIHRyaWdnZXIsIG1vdmVzIHRoZSBjYXJldCBhZnRlciBpdCBhbmQgZGlzcGF0Y2hlcyBhbiBgaW5wdXRgIGV2ZW50LCBzbyBhXG4gICAqIGNvbXBvbmVudCBsaXN0ZW5pbmcgb24gdGhlIGVsZW1lbnQgc2VlcyB0aGUgY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAtIFRoZSBzdWdnZXN0aW9uLlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgc2VsZWN0ZWQgaXQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBMaW5rQW5kVGFnU3VnZ2VzdGlvbiwgJGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLmdldFRyaWdnZXIoKTtcbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICBsZXQgYWZ0ZXIgPSB2YWx1ZS5zbGljZSh0cmlnZ2VyLmVuZCk7XG4gICAgICBsZXQgaW5zZXJ0aW9uOiBzdHJpbmc7XG4gICAgICBpZiAoc3VnZ2VzdGlvbi5raW5kID09PSBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaykge1xuICAgICAgICBpbnNlcnRpb24gPSBgJHtMSU5LX09QRU59JHtzdWdnZXN0aW9uLmxpbmt0ZXh0fSR7TElOS19DTE9TRX1gO1xuICAgICAgICBpZiAoYWZ0ZXIuc3RhcnRzV2l0aChMSU5LX0NMT1NFKSkge1xuICAgICAgICAgIGFmdGVyID0gYWZ0ZXIuc2xpY2UoTElOS19DTE9TRS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnNlcnRpb24gPSBgJHtUQUdfUFJFRklYfSR7c3VnZ2VzdGlvbi50YWd9IGA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUuc2xpY2UoMCwgdHJpZ2dlci5zdGFydCkgKyBpbnNlcnRpb24gKyBhZnRlcik7XG4gICAgICBjb25zdCBjYXJldCA9IHRyaWdnZXIuc3RhcnQgKyBpbnNlcnRpb24ubGVuZ3RoO1xuICAgICAgdGhpcy5pbnB1dEVsLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XG4gICAgICB0aGlzLmlucHV0RWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICBzdXBlci5zZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24sICRldmVudCk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2V0VmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRFbC52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpbmsgc3VnZ2VzdGlvbnMgZm9yIGEgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeSAtIFRoZSB0ZXh0IHR5cGVkIGFmdGVyIGBbW2AuXG4gICAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucywgYmVzdCBtYXRjaCBmaXJzdC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRMaW5rU3VnZ2VzdGlvbnMocXVlcnk6IHN0cmluZyk6IExpbmtTdWdnZXN0aW9uW10ge1xuICAgIGNvbnN0IGZ1enp5U2VhcmNoID0gcHJlcGFyZUZ1enp5U2VhcmNoKHF1ZXJ5KTtcbiAgICBjb25zdCByZXN1bHRzOiBTdWdnZXN0aW9uU2VhcmNoUmVzdWx0PExpbmtTdWdnZXN0aW9uPltdID0gW107XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCkpIHtcbiAgICAgIGNvbnN0IGxpbmt0ZXh0ID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dChmaWxlLCB0aGlzLnNvdXJjZVBhdGgsIHRydWUpO1xuICAgICAgY29uc3QgbWF0Y2ggPSBmdXp6eVNlYXJjaChsaW5rdGV4dCkgPz8gZnV6enlTZWFyY2goZmlsZS5wYXRoKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXN1bHRzLnB1c2goeyBtYXRjaCwgc3VnZ2VzdGlvbjogeyBmaWxlLCBraW5kOiBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaywgbGlua3RleHQgfSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydFNlYXJjaFJlc3VsdHMocmVzdWx0cyk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5zdWdnZXN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdWdnZXN0aW9ucyBmb3IgdGhlIHRyaWdnZXIgYmVmb3JlIHRoZSBjYXJldC4gVGhlIHF1ZXJ5IE9ic2lkaWFuIHBhc3NlcyBpcyB0aGUgd2hvbGUgdmFsdWUsIHNvIGl0IGlzXG4gICAqIGlnbm9yZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRTdWdnZXN0aW9ucygpOiBMaW5rQW5kVGFnU3VnZ2VzdGlvbltdIHtcbiAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5nZXRUcmlnZ2VyKCk7XG4gICAgaWYgKHRyaWdnZXI/LmtpbmQgPT09IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5MaW5rKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMaW5rU3VnZ2VzdGlvbnModHJpZ2dlci5xdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyPy5raW5kID09PSBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuVGFnID8gdGhpcy5nZXRUYWdTdWdnZXN0aW9ucyh0cmlnZ2VyLnF1ZXJ5KSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRhZyBzdWdnZXN0aW9ucyBmb3IgYSBxdWVyeSwgZnJvbSB0aGUgdGFncyBvZiBldmVyeSBub3RlLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnkgLSBUaGUgdGV4dCB0eXBlZCBhZnRlciBgI2AuXG4gICAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucywgYmVzdCBtYXRjaCBmaXJzdCwgdGhlbiB0aGUgbW9zdCB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFRhZ1N1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiBUYWdTdWdnZXN0aW9uW10ge1xuICAgIHJldHVybiBnZXRWYXVsdFRhZ1N1Z2dlc3Rpb25zKHsgYXBwOiB0aGlzLmFwcCwgcXVlcnkgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZW5hYmxlZCB0cmlnZ2VyIGJlZm9yZSB0aGUgY2FyZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0cmlnZ2VyLCBvciBgbnVsbGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHJpZ2dlcigpOiBMaW5rQW5kVGFnQ29tcGxldGlvblRyaWdnZXIgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB0cmlnZ2VyID0gZ2V0TGlua0FuZFRhZ0NvbXBsZXRpb25UcmlnZ2VyKHZhbHVlLCB0aGlzLmlucHV0RWwuc2VsZWN0aW9uU3RhcnQgPz8gdmFsdWUubGVuZ3RoKTtcbiAgICBpZiAodHJpZ2dlcj8ua2luZCA9PT0gTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kLkxpbmsgJiYgIXRoaXMuc2hvdWxkU3VnZ2VzdExpbmtzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXI/LmtpbmQgPT09IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5UYWcgJiYgIXRoaXMuc2hvdWxkU3VnZ2VzdFRhZ3MgPyBudWxsIDogdHJpZ2dlcjtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBgW1tgIGxpbmsgb3IgYCNgIHRhZyBiZWluZyB0eXBlZCBiZWZvcmUgdGhlIGNhcmV0LlxuICpcbiAqIEEgbGluayB0cmlnZ2VyIGlzIGFuIHVuY2xvc2VkIGBbW2Agb24gdGhlIGNhcmV0J3MgbGluZSB3aXRoIG5vIGB8YCBhZnRlciBpdCwgc28gYW4gYWxpYXMgYmVpbmcgdHlwZWQgaXMgbGVmdCBhbG9uZS4gQVxuICogdGFnIHRyaWdnZXIgaXMgYSBgI2AgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IG9yIGFmdGVyIHdoaXRlc3BhY2UsIGZvbGxvd2VkIG9ubHkgYnkgdGFnIGNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCBvZiB0aGUgZWxlbWVudC5cbiAqIEBwYXJhbSBjYXJldCAtIFRoZSBvZmZzZXQgb2YgdGhlIGNhcmV0LlxuICogQHJldHVybnMgVGhlIHRyaWdnZXIsIG9yIGBudWxsYCB3aGVuIHRoZSBjYXJldCBpcyBub3QgaW4gb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua0FuZFRhZ0NvbXBsZXRpb25UcmlnZ2VyKHRleHQ6IHN0cmluZywgY2FyZXQ6IG51bWJlcik6IExpbmtBbmRUYWdDb21wbGV0aW9uVHJpZ2dlciB8IG51bGwge1xuICBjb25zdCBiZWZvcmVDYXJldCA9IHRleHQuc2xpY2UoMCwgY2FyZXQpO1xuICBjb25zdCBsaW5rU3RhcnQgPSBiZWZvcmVDYXJldC5sYXN0SW5kZXhPZihMSU5LX09QRU4pO1xuICBpZiAobGlua1N0YXJ0ICE9PSAtMSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYmVmb3JlQ2FyZXQuc2xpY2UobGlua1N0YXJ0ICsgTElOS19PUEVOLmxlbmd0aCk7XG4gICAgaWYgKCFxdWVyeS5pbmNsdWRlcyhMSU5LX0NMT1NFKSAmJiAhcXVlcnkuaW5jbHVkZXMoJ1xcbicpICYmICFxdWVyeS5pbmNsdWRlcygnfCcpKSB7XG4gICAgICByZXR1cm4geyBlbmQ6IGNhcmV0LCBraW5kOiBMaW5rQW5kVGFnQ29tcGxldGlvbktpbmQuTGluaywgcXVlcnksIHN0YXJ0OiBsaW5rU3RhcnQgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoVEFHX0JFRk9SRV9DQVJFVF9SRUdfRVhQLnRlc3QoYmVmb3JlQ2FyZXQpKSB7XG4gICAgLy8gVGhlIHF1ZXJ5IGhvbGRzIG5vICMsIHNvIHRoZSBsYXN0IG9uZSBpcyB0aGUgdHJpZ2dlci5cbiAgICBjb25zdCBzdGFydCA9IGJlZm9yZUNhcmV0Lmxhc3RJbmRleE9mKFRBR19QUkVGSVgpO1xuICAgIHJldHVybiB7IGVuZDogY2FyZXQsIGtpbmQ6IExpbmtBbmRUYWdDb21wbGV0aW9uS2luZC5UYWcsIHF1ZXJ5OiBiZWZvcmVDYXJldC5zbGljZShzdGFydCArIFRBR19QUkVGSVgubGVuZ3RoKSwgc3RhcnQgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRhZ3Mgb2YgZXZlcnkgbm90ZSBtYXRjaGluZyBhIHF1ZXJ5LCBhcyB7QGxpbmsgTGlua0FuZFRhZ0lucHV0U3VnZ2VzdH0gYW5kIHtAbGluayBUYWdMaXN0Q29tcG9uZW50fVxuICogc3VnZ2VzdCB0aGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzdWdnZXN0aW9ucywgYmVzdCBtYXRjaCBmaXJzdCwgdGhlbiB0aGUgbW9zdCB1c2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmF1bHRUYWdTdWdnZXN0aW9ucyhwYXJhbXM6IEdldFZhdWx0VGFnU3VnZ2VzdGlvbnNQYXJhbXMpOiBUYWdTdWdnZXN0aW9uW10ge1xuICBjb25zdCB7IGFwcCwgcXVlcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgY291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCkpIHtcbiAgICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiAoY2FjaGUgPyBnZXRBbGxUYWdzKGNhY2hlKSA6IG51bGwpID8/IFtdKSB7XG4gICAgICBjb25zdCBuYW1lID0gdGFnLnNsaWNlKFRBR19QUkVGSVgubGVuZ3RoKTtcbiAgICAgIGNvdW50cy5zZXQobmFtZSwgKGNvdW50cy5nZXQobmFtZSkgPz8gMCkgKyAxKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmdXp6eVNlYXJjaCA9IHByZXBhcmVGdXp6eVNlYXJjaChxdWVyeSk7XG4gIGNvbnN0IHJlc3VsdHM6IFN1Z2dlc3Rpb25TZWFyY2hSZXN1bHQ8VGFnU3VnZ2VzdGlvbj5bXSA9IFtdO1xuICBjb25zdCBzb3J0ZWRDb3VudHMgPSBbLi4uY291bnRzXS5zb3J0KChbdGFnMSwgY291bnQxXSwgW3RhZzIsIGNvdW50Ml0pID0+IGNvdW50MiAtIGNvdW50MSB8fCB0YWcxLmxvY2FsZUNvbXBhcmUodGFnMikpO1xuICBmb3IgKGNvbnN0IFt0YWcsIGNvdW50XSBvZiBzb3J0ZWRDb3VudHMpIHtcbiAgICBjb25zdCBtYXRjaCA9IGZ1enp5U2VhcmNoKHRhZyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBtYXRjaCwgc3VnZ2VzdGlvbjogeyBjb3VudCwga2luZDogTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kLlRhZywgdGFnIH0gfSk7XG4gICAgfVxuICB9XG4gIHNvcnRTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LnN1Z2dlc3Rpb24pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWUEsMEJBQXVCO0FBQ3ZCLHNCQUtPO0FBUUEsSUFBSywyQkFBTCxrQkFBS0EsOEJBQUw7QUFJTCxFQUFBQSwwQkFBQSxVQUFPO0FBS1AsRUFBQUEsMEJBQUEsU0FBTTtBQVRJLFNBQUFBO0FBQUEsR0FBQTtBQXFIWixNQUFNLFlBQVk7QUFDbEIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sYUFBYTtBQUNuQixNQUFNLDJCQUEyQjtBQThCMUIsTUFBTSwrQkFBK0IscUNBQTJDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPWixZQUFZLFFBQWlEO0FBRWxFLFVBQU0sT0FBTyxTQUFLLDRCQUF5QixPQUFPLE9BQU8sQ0FBQztBQUMxRCxTQUFLLFVBQVUsT0FBTztBQUN0QixTQUFLLHFCQUFxQixPQUFPLHNCQUFzQjtBQUN2RCxTQUFLLG9CQUFvQixPQUFPLHFCQUFxQjtBQUNyRCxTQUFLLGFBQWEsT0FBTyxjQUFjO0FBQUEsRUFDekM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPZ0IsV0FBbUI7QUFDakMsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8saUJBQWlCLFlBQWtDLElBQXVCO0FBQy9FLFFBQUksV0FBVyxTQUFTLG1CQUErQjtBQUNyRCxTQUFHLFVBQVUsRUFBRSxLQUFLLG9CQUFvQixNQUFNLFdBQVcsU0FBUyxDQUFDO0FBQ25FLFVBQUksV0FBVyxhQUFhLFdBQVcsS0FBSyxNQUFNO0FBQ2hELFdBQUcsVUFBVSxFQUFFLEtBQUssbUJBQW1CLE1BQU0sV0FBVyxLQUFLLEtBQUssQ0FBQztBQUFBLE1BQ3JFO0FBQ0E7QUFBQSxJQUNGO0FBRUEsT0FBRyxTQUFTLGFBQWE7QUFDekIsT0FBRyxVQUFVLEVBQUUsS0FBSyxzQkFBc0IsTUFBTSxHQUFHLFVBQVUsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBQ2xGLE9BQUcsVUFBVSxFQUFFLEtBQUssa0JBQWtCLE1BQU0sT0FBTyxXQUFXLEtBQUssRUFBRSxDQUFDO0FBQUEsRUFDeEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU2dCLGlCQUFpQixZQUFrQyxRQUEwQztBQUMzRyxVQUFNLFVBQVUsS0FBSyxXQUFXO0FBQ2hDLFFBQUksU0FBUztBQUNYLFlBQU0sUUFBUSxLQUFLLFNBQVM7QUFDNUIsVUFBSSxRQUFRLE1BQU0sTUFBTSxRQUFRLEdBQUc7QUFDbkMsVUFBSTtBQUNKLFVBQUksV0FBVyxTQUFTLG1CQUErQjtBQUNyRCxvQkFBWSxHQUFHLFNBQVMsR0FBRyxXQUFXLFFBQVEsR0FBRyxVQUFVO0FBQzNELFlBQUksTUFBTSxXQUFXLFVBQVUsR0FBRztBQUNoQyxrQkFBUSxNQUFNLE1BQU0sV0FBVyxNQUFNO0FBQUEsUUFDdkM7QUFBQSxNQUNGLE9BQU87QUFDTCxvQkFBWSxHQUFHLFVBQVUsR0FBRyxXQUFXLEdBQUc7QUFBQSxNQUM1QztBQUVBLFdBQUssU0FBUyxNQUFNLE1BQU0sR0FBRyxRQUFRLEtBQUssSUFBSSxZQUFZLEtBQUs7QUFDL0QsWUFBTSxRQUFRLFFBQVEsUUFBUSxVQUFVO0FBQ3hDLFdBQUssUUFBUSxrQkFBa0IsT0FBTyxLQUFLO0FBQzNDLFdBQUssUUFBUSxjQUFjLElBQUksTUFBTSxTQUFTLEVBQUUsU0FBUyxLQUFLLENBQUMsQ0FBQztBQUFBLElBQ2xFO0FBRUEsVUFBTSxpQkFBaUIsWUFBWSxNQUFNO0FBQ3pDLFNBQUssTUFBTTtBQUFBLEVBQ2I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPZ0IsU0FBUyxPQUFxQjtBQUM1QyxTQUFLLFFBQVEsUUFBUTtBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRVSxtQkFBbUIsT0FBaUM7QUFDNUQsVUFBTSxrQkFBYyxvQ0FBbUIsS0FBSztBQUM1QyxVQUFNLFVBQW9ELENBQUM7QUFDM0QsZUFBVyxRQUFRLEtBQUssSUFBSSxNQUFNLFNBQVMsR0FBRztBQUM1QyxZQUFNLFdBQVcsS0FBSyxJQUFJLGNBQWMsZUFBZSxNQUFNLEtBQUssWUFBWSxJQUFJO0FBQ2xGLFlBQU0sUUFBUSxZQUFZLFFBQVEsS0FBSyxZQUFZLEtBQUssSUFBSTtBQUM1RCxVQUFJLE9BQU87QUFDVCxnQkFBUSxLQUFLLEVBQUUsT0FBTyxZQUFZLEVBQUUsTUFBTSxNQUFNLG1CQUErQixTQUFTLEVBQUUsQ0FBQztBQUFBLE1BQzdGO0FBQUEsSUFDRjtBQUNBLDJDQUFrQixPQUFPO0FBQ3pCLFdBQU8sUUFBUSxJQUFJLENBQUMsV0FBVyxPQUFPLFVBQVU7QUFBQSxFQUNsRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUW1CLGlCQUF5QztBQUMxRCxVQUFNLFVBQVUsS0FBSyxXQUFXO0FBQ2hDLFFBQUksU0FBUyxTQUFTLG1CQUErQjtBQUNuRCxhQUFPLEtBQUssbUJBQW1CLFFBQVEsS0FBSztBQUFBLElBQzlDO0FBQ0EsV0FBTyxTQUFTLFNBQVMsa0JBQStCLEtBQUssa0JBQWtCLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUNuRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUVUsa0JBQWtCLE9BQWdDO0FBQzFELFdBQU8sdUJBQXVCLEVBQUUsS0FBSyxLQUFLLEtBQUssTUFBTSxDQUFDO0FBQUEsRUFDeEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVSxhQUFpRDtBQUN6RCxVQUFNLFFBQVEsS0FBSyxTQUFTO0FBQzVCLFVBQU0sVUFBVSwrQkFBK0IsT0FBTyxLQUFLLFFBQVEsa0JBQWtCLE1BQU0sTUFBTTtBQUNqRyxRQUFJLFNBQVMsU0FBUyxxQkFBaUMsQ0FBQyxLQUFLLG9CQUFvQjtBQUMvRSxhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sU0FBUyxTQUFTLG1CQUFnQyxDQUFDLEtBQUssb0JBQW9CLE9BQU87QUFBQSxFQUM1RjtBQUNGO0FBWU8sU0FBUywrQkFBK0IsTUFBYyxPQUFtRDtBQUM5RyxRQUFNLGNBQWMsS0FBSyxNQUFNLEdBQUcsS0FBSztBQUN2QyxRQUFNLFlBQVksWUFBWSxZQUFZLFNBQVM7QUFDbkQsTUFBSSxjQUFjLElBQUk7QUFDcEIsVUFBTSxRQUFRLFlBQVksTUFBTSxZQUFZLFVBQVUsTUFBTTtBQUM1RCxRQUFJLENBQUMsTUFBTSxTQUFTLFVBQVUsS0FBSyxDQUFDLE1BQU0sU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQ2hGLGFBQU8sRUFBRSxLQUFLLE9BQU8sTUFBTSxtQkFBK0IsT0FBTyxPQUFPLFVBQVU7QUFBQSxJQUNwRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLHlCQUF5QixLQUFLLFdBQVcsR0FBRztBQUU5QyxVQUFNLFFBQVEsWUFBWSxZQUFZLFVBQVU7QUFDaEQsV0FBTyxFQUFFLEtBQUssT0FBTyxNQUFNLGlCQUE4QixPQUFPLFlBQVksTUFBTSxRQUFRLFdBQVcsTUFBTSxHQUFHLE1BQU07QUFBQSxFQUN0SDtBQUVBLFNBQU87QUFDVDtBQVNPLFNBQVMsdUJBQXVCLFFBQXVEO0FBQzVGLFFBQU0sRUFBRSxLQUFLLE1BQU0sSUFBSTtBQUN2QixRQUFNLFNBQVMsb0JBQUksSUFBb0I7QUFDdkMsYUFBVyxRQUFRLElBQUksTUFBTSxpQkFBaUIsR0FBRztBQUMvQyxVQUFNLFFBQVEsSUFBSSxjQUFjLGFBQWEsSUFBSTtBQUNqRCxlQUFXLFFBQVEsWUFBUSw0QkFBVyxLQUFLLElBQUksU0FBUyxDQUFDLEdBQUc7QUFDMUQsWUFBTSxPQUFPLElBQUksTUFBTSxXQUFXLE1BQU07QUFDeEMsYUFBTyxJQUFJLE9BQU8sT0FBTyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUM7QUFBQSxJQUM5QztBQUFBLEVBQ0Y7QUFFQSxRQUFNLGtCQUFjLG9DQUFtQixLQUFLO0FBQzVDLFFBQU0sVUFBbUQsQ0FBQztBQUMxRCxRQUFNLGVBQWUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sTUFBTSxNQUFNLFNBQVMsVUFBVSxLQUFLLGNBQWMsSUFBSSxDQUFDO0FBQ3JILGFBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxjQUFjO0FBQ3ZDLFVBQU0sUUFBUSxZQUFZLEdBQUc7QUFDN0IsUUFBSSxPQUFPO0FBQ1QsY0FBUSxLQUFLLEVBQUUsT0FBTyxZQUFZLEVBQUUsT0FBTyxNQUFNLGlCQUE4QixJQUFJLEVBQUUsQ0FBQztBQUFBLElBQ3hGO0FBQUEsRUFDRjtBQUNBLHlDQUFrQixPQUFPO0FBQ3pCLFNBQU8sUUFBUSxJQUFJLENBQUMsV0FBVyxPQUFPLFVBQVU7QUFDbEQ7IiwibmFtZXMiOlsiTGlua0FuZFRhZ0NvbXBsZXRpb25LaW5kIl19
@@ -0,0 +1,229 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Completes `[[` links and `#` tags at the caret of any `<input>` or `<textarea>`, the way the editor does.
7
+ */
8
+ import type { App, TFile } from 'obsidian' with { 'resolution-mode': 'import' };
9
+ import { AbstractInputSuggest } from 'obsidian';
10
+ /**
11
+ * What a completion trigger completes.
12
+ */
13
+ export declare enum LinkAndTagCompletionKind {
14
+ /**
15
+ * A `[[` wikilink to a vault file.
16
+ */
17
+ Link = "link",
18
+ /**
19
+ * A `#` tag.
20
+ */
21
+ Tag = "tag"
22
+ }
23
+ /**
24
+ * A completion trigger found before the caret.
25
+ */
26
+ export interface LinkAndTagCompletionTrigger {
27
+ /**
28
+ * The offset of the caret, where the query ends.
29
+ */
30
+ readonly end: number;
31
+ /**
32
+ * What the trigger completes.
33
+ */
34
+ readonly kind: LinkAndTagCompletionKind;
35
+ /**
36
+ * The text typed after the trigger characters.
37
+ */
38
+ readonly query: string;
39
+ /**
40
+ * The offset of the trigger characters: the first `[` of `[[`, or the `#`.
41
+ */
42
+ readonly start: number;
43
+ }
44
+ /**
45
+ * Parameters of {@link LinkAndTagInputSuggest}.
46
+ */
47
+ export interface LinkAndTagInputSuggestConstructorParams {
48
+ /**
49
+ * The Obsidian app instance.
50
+ */
51
+ readonly app: App;
52
+ /**
53
+ * The element to complete in.
54
+ */
55
+ readonly inputEl: HTMLInputElement | HTMLTextAreaElement;
56
+ /**
57
+ * Whether `[[` completes links. Defaults to `true`.
58
+ */
59
+ readonly shouldSuggestLinks?: boolean;
60
+ /**
61
+ * Whether `#` completes tags. Defaults to `true`.
62
+ */
63
+ readonly shouldSuggestTags?: boolean;
64
+ /**
65
+ * The path that inserted links are relative to. Defaults to the vault root.
66
+ */
67
+ readonly sourcePath?: string;
68
+ }
69
+ /**
70
+ * A suggestion of {@link LinkAndTagInputSuggest}.
71
+ */
72
+ export type LinkAndTagSuggestion = LinkSuggestion | TagSuggestion;
73
+ /**
74
+ * A suggested link.
75
+ */
76
+ export interface LinkSuggestion {
77
+ /**
78
+ * The file the link points to.
79
+ */
80
+ readonly file: TFile;
81
+ /**
82
+ * The kind of the suggestion.
83
+ */
84
+ readonly kind: LinkAndTagCompletionKind.Link;
85
+ /**
86
+ * The link text inserted between `[[` and `]]`.
87
+ */
88
+ readonly linktext: string;
89
+ }
90
+ /**
91
+ * A suggested tag.
92
+ */
93
+ export interface TagSuggestion {
94
+ /**
95
+ * How many tag occurrences the vault holds.
96
+ */
97
+ readonly count: number;
98
+ /**
99
+ * The kind of the suggestion.
100
+ */
101
+ readonly kind: LinkAndTagCompletionKind.Tag;
102
+ /**
103
+ * The tag, without its `#`.
104
+ */
105
+ readonly tag: string;
106
+ }
107
+ /**
108
+ * Parameters for {@link getVaultTagSuggestions}.
109
+ */
110
+ export interface GetVaultTagSuggestionsParams {
111
+ /**
112
+ * The Obsidian app.
113
+ */
114
+ readonly app: App;
115
+ /**
116
+ * The text typed, without the `#`.
117
+ */
118
+ readonly query: string;
119
+ }
120
+ /**
121
+ * Completes `[[` links and `#` tags inside any `<input>` or `<textarea>`.
122
+ *
123
+ * Obsidian's {@link AbstractInputSuggest} treats the whole value as the query and replaces it on selection. This one
124
+ * reads the trigger before the caret and replaces only that, so it works inside free text such as a template or a
125
+ * description setting, and it accepts a `<textarea>` too.
126
+ *
127
+ * ```ts
128
+ * new Setting(containerEl).addTextArea((textArea) => {
129
+ * new LinkAndTagInputSuggest({ app: this.app, inputEl: textArea.inputEl });
130
+ * });
131
+ * ```
132
+ */
133
+ export declare class LinkAndTagInputSuggest extends AbstractInputSuggest<LinkAndTagSuggestion> {
134
+ /**
135
+ * The element the suggest completes in.
136
+ */
137
+ protected readonly inputEl: HTMLInputElement | HTMLTextAreaElement;
138
+ /**
139
+ * Whether `[[` completes links.
140
+ */
141
+ protected readonly shouldSuggestLinks: boolean;
142
+ /**
143
+ * Whether `#` completes tags.
144
+ */
145
+ protected readonly shouldSuggestTags: boolean;
146
+ /**
147
+ * The path that inserted links are relative to.
148
+ */
149
+ protected readonly sourcePath: string;
150
+ /**
151
+ * Creates the suggest and attaches it to the element.
152
+ *
153
+ * @param params - The parameters.
154
+ */
155
+ constructor(params: LinkAndTagInputSuggestConstructorParams);
156
+ /**
157
+ * Gets the value of the element.
158
+ *
159
+ * @returns The value.
160
+ */
161
+ getValue(): string;
162
+ /**
163
+ * Renders a suggestion.
164
+ *
165
+ * @param suggestion - The suggestion.
166
+ * @param el - The element to render into.
167
+ */
168
+ renderSuggestion(suggestion: LinkAndTagSuggestion, el: HTMLElement): void;
169
+ /**
170
+ * Inserts the suggestion in place of the trigger, moves the caret after it and dispatches an `input` event, so a
171
+ * component listening on the element sees the change.
172
+ *
173
+ * @param suggestion - The suggestion.
174
+ * @param $event - The event that selected it.
175
+ */
176
+ selectSuggestion(suggestion: LinkAndTagSuggestion, $event: KeyboardEvent | MouseEvent): void;
177
+ /**
178
+ * Sets the value of the element.
179
+ *
180
+ * @param value - The value.
181
+ */
182
+ setValue(value: string): void;
183
+ /**
184
+ * Gets the link suggestions for a query.
185
+ *
186
+ * @param query - The text typed after `[[`.
187
+ * @returns The suggestions, best match first.
188
+ */
189
+ protected getLinkSuggestions(query: string): LinkSuggestion[];
190
+ /**
191
+ * Gets the suggestions for the trigger before the caret. The query Obsidian passes is the whole value, so it is
192
+ * ignored.
193
+ *
194
+ * @returns The suggestions.
195
+ */
196
+ protected getSuggestions(): LinkAndTagSuggestion[];
197
+ /**
198
+ * Gets the tag suggestions for a query, from the tags of every note.
199
+ *
200
+ * @param query - The text typed after `#`.
201
+ * @returns The suggestions, best match first, then the most used.
202
+ */
203
+ protected getTagSuggestions(query: string): TagSuggestion[];
204
+ /**
205
+ * Gets the enabled trigger before the caret.
206
+ *
207
+ * @returns The trigger, or `null`.
208
+ */
209
+ protected getTrigger(): LinkAndTagCompletionTrigger | null;
210
+ }
211
+ /**
212
+ * Finds the `[[` link or `#` tag being typed before the caret.
213
+ *
214
+ * A link trigger is an unclosed `[[` on the caret's line with no `|` after it, so an alias being typed is left alone. A
215
+ * tag trigger is a `#` at the start of the text or after whitespace, followed only by tag characters.
216
+ *
217
+ * @param text - The text of the element.
218
+ * @param caret - The offset of the caret.
219
+ * @returns The trigger, or `null` when the caret is not in one.
220
+ */
221
+ export declare function getLinkAndTagCompletionTrigger(text: string, caret: number): LinkAndTagCompletionTrigger | null;
222
+ /**
223
+ * Gets the tags of every note matching a query, as {@link LinkAndTagInputSuggest} and {@link TagListComponent}
224
+ * suggest them.
225
+ *
226
+ * @param params - The parameters.
227
+ * @returns The suggestions, best match first, then the most used.
228
+ */
229
+ export declare function getVaultTagSuggestions(params: GetVaultTagSuggestionsParams): TagSuggestion[];