@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.
- package/codemirror/inline-token-widgets/package.json +6 -0
- package/codemirror/settings-facet/package.json +6 -0
- package/command-handlers/open-discussion-command-handler/package.json +6 -0
- package/command-handlers/open-feature-request-command-handler/package.json +6 -0
- package/command-handlers/open-git-hub-command-handler/package.json +6 -0
- package/components/settings-facet-component/package.json +6 -0
- package/components/style-sheet-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +137 -1
- package/dist/lib/cjs/__merged.d.cts +26 -0
- package/dist/lib/cjs/anchored-suggest.cjs +232 -0
- package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
- package/dist/lib/cjs/broken-link-candidates.cjs +366 -0
- package/dist/lib/cjs/broken-link-candidates.d.cts +181 -0
- package/dist/lib/cjs/bug-report.cjs +4 -2
- package/dist/lib/cjs/bug-report.d.cts +1 -1
- package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
- package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
- package/dist/lib/cjs/codemirror/index.cjs +7 -1
- package/dist/lib/cjs/codemirror/index.d.cts +2 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
- package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
- package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
- package/dist/lib/cjs/command-handlers/index.cjs +10 -1
- package/dist/lib/cjs/command-handlers/index.d.cts +3 -0
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +9 -12
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +6 -8
- package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +127 -0
- package/dist/lib/cjs/command-handlers/open-discussion-command-handler.d.cts +45 -0
- package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +119 -0
- package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.d.cts +33 -0
- package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +121 -0
- package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.d.cts +43 -0
- package/dist/lib/cjs/components/index.cjs +7 -1
- package/dist/lib/cjs/components/index.d.cts +2 -0
- package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
- package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
- package/dist/lib/cjs/components/style-sheet-component.cjs +198 -0
- package/dist/lib/cjs/components/style-sheet-component.d.cts +79 -0
- package/dist/lib/cjs/css-class.cjs +8 -1
- package/dist/lib/cjs/css-class.d.cts +28 -0
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +7 -4
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +1 -1
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +1 -1
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +1 -1
- package/dist/lib/cjs/desktop-git-runner.cjs +117 -0
- package/dist/lib/cjs/desktop-git-runner.d.cts +17 -0
- package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
- package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
- package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
- package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
- package/dist/lib/cjs/editor-suggest.cjs +197 -0
- package/dist/lib/cjs/editor-suggest.d.cts +103 -0
- package/dist/lib/cjs/feature-request.cjs +115 -0
- package/dist/lib/cjs/feature-request.d.cts +54 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/git-hub-discussion.cjs +101 -0
- package/dist/lib/cjs/git-hub-discussion.d.cts +28 -0
- package/dist/lib/cjs/git-rename-history.cjs +148 -0
- package/dist/lib/cjs/git-rename-history.d.cts +43 -0
- package/dist/lib/cjs/hotkey.cjs +185 -0
- package/dist/lib/cjs/hotkey.d.cts +59 -0
- package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
- package/dist/lib/cjs/index.cjs +46 -1
- package/dist/lib/cjs/index.d.cts +15 -0
- package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
- package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
- package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
- package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
- package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
- package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
- package/dist/lib/cjs/markdown.cjs +6 -1
- package/dist/lib/cjs/markdown.d.cts +10 -1
- package/dist/lib/cjs/rendered-markdown.cjs +306 -0
- package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
- package/dist/lib/cjs/request-url.cjs +523 -0
- package/dist/lib/cjs/request-url.d.cts +233 -0
- package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
- package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
- package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
- package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
- package/dist/lib/cjs/setting-components/index.cjs +13 -1
- package/dist/lib/cjs/setting-components/index.d.cts +4 -0
- package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
- package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
- package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
- package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
- package/dist/lib/cjs/setting-ex.cjs +51 -1
- package/dist/lib/cjs/setting-ex.d.cts +35 -1
- package/dist/lib/cjs/settings-tabs.cjs +258 -0
- package/dist/lib/cjs/settings-tabs.d.cts +101 -0
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/cjs/vault.d.cts +3 -1
- package/dist/lib/esm/__merged.d.mts +26 -0
- package/dist/lib/esm/__merged.mjs +139 -1
- package/dist/lib/esm/anchored-suggest.d.mts +116 -0
- package/dist/lib/esm/anchored-suggest.mjs +144 -0
- package/dist/lib/esm/broken-link-candidates.d.mts +181 -0
- package/dist/lib/esm/broken-link-candidates.mjs +275 -0
- package/dist/lib/esm/bug-report.d.mts +1 -1
- package/dist/lib/esm/bug-report.mjs +4 -2
- package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
- package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
- package/dist/lib/esm/codemirror/index.d.mts +2 -0
- package/dist/lib/esm/codemirror/index.mjs +5 -1
- package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
- package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
- package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
- package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
- package/dist/lib/esm/command-handlers/index.d.mts +3 -0
- package/dist/lib/esm/command-handlers/index.mjs +7 -1
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +6 -8
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +9 -12
- package/dist/lib/esm/command-handlers/open-discussion-command-handler.d.mts +45 -0
- package/dist/lib/esm/command-handlers/open-discussion-command-handler.mjs +39 -0
- package/dist/lib/esm/command-handlers/open-feature-request-command-handler.d.mts +33 -0
- package/dist/lib/esm/command-handlers/open-feature-request-command-handler.mjs +31 -0
- package/dist/lib/esm/command-handlers/open-git-hub-command-handler.d.mts +43 -0
- package/dist/lib/esm/command-handlers/open-git-hub-command-handler.mjs +33 -0
- package/dist/lib/esm/components/index.d.mts +2 -0
- package/dist/lib/esm/components/index.mjs +5 -1
- package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
- package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
- package/dist/lib/esm/components/style-sheet-component.d.mts +79 -0
- package/dist/lib/esm/components/style-sheet-component.mjs +109 -0
- package/dist/lib/esm/css-class.d.mts +28 -0
- package/dist/lib/esm/css-class.mjs +8 -1
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +1 -1
- package/dist/lib/esm/data-stores/data-store-transport.mjs +7 -4
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +1 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +1 -1
- package/dist/lib/esm/desktop-git-runner.d.mts +17 -0
- package/dist/lib/esm/desktop-git-runner.mjs +19 -0
- package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
- package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
- package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
- package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
- package/dist/lib/esm/editor-suggest.d.mts +103 -0
- package/dist/lib/esm/editor-suggest.mjs +108 -0
- package/dist/lib/esm/feature-request.d.mts +54 -0
- package/dist/lib/esm/feature-request.mjs +25 -0
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/git-hub-discussion.d.mts +28 -0
- package/dist/lib/esm/git-hub-discussion.mjs +13 -0
- package/dist/lib/esm/git-rename-history.d.mts +43 -0
- package/dist/lib/esm/git-rename-history.mjs +59 -0
- package/dist/lib/esm/hotkey.d.mts +59 -0
- package/dist/lib/esm/hotkey.mjs +95 -0
- package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
- package/dist/lib/esm/i18n/locales/en.mjs +13 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
- package/dist/lib/esm/index.d.mts +15 -0
- package/dist/lib/esm/index.mjs +31 -1
- package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
- package/dist/lib/esm/inline-token-renderer.mjs +59 -0
- package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
- package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
- package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
- package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
- package/dist/lib/esm/markdown.d.mts +10 -1
- package/dist/lib/esm/markdown.mjs +9 -1
- package/dist/lib/esm/rendered-markdown.d.mts +77 -0
- package/dist/lib/esm/rendered-markdown.mjs +219 -0
- package/dist/lib/esm/request-url.d.mts +233 -0
- package/dist/lib/esm/request-url.mjs +428 -0
- package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
- package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
- package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
- package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
- package/dist/lib/esm/setting-components/index.d.mts +4 -0
- package/dist/lib/esm/setting-components/index.mjs +9 -1
- package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
- package/dist/lib/esm/setting-components/list-component.mjs +206 -0
- package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
- package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
- package/dist/lib/esm/setting-ex.d.mts +35 -1
- package/dist/lib/esm/setting-ex.mjs +51 -1
- package/dist/lib/esm/settings-tabs.d.mts +101 -0
- package/dist/lib/esm/settings-tabs.mjs +170 -0
- package/dist/lib/esm/vault.d.mts +3 -1
- package/dist/lib/esm/vault.mjs +2 -2
- package/dist/styles.css +83 -1
- package/package.json +2 -2
- package/setting-components/folder-list-component/package.json +6 -0
- package/setting-components/hotkey-component/package.json +6 -0
- package/setting-components/list-component/package.json +6 -0
- package/setting-components/tag-list-component/package.json +6 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
/**
|
|
4
|
+
* @file
|
|
5
|
+
*
|
|
6
|
+
* A suggest popover opened at an element or a rectangle, with no input behind it.
|
|
7
|
+
*/
|
|
8
|
+
import type { App, Scope } from 'obsidian';
|
|
9
|
+
import { PopoverSuggest } from 'obsidian';
|
|
10
|
+
/**
|
|
11
|
+
* Parameters for {@link AnchoredSuggest.openAt}.
|
|
12
|
+
*/
|
|
13
|
+
export interface AnchoredSuggestOpenAtParams {
|
|
14
|
+
/**
|
|
15
|
+
* The element or the viewport rectangle the popover is placed against. When an element is given, the popover closes
|
|
16
|
+
* once the element leaves the DOM, and a pointer-down on it does not count as an outside click.
|
|
17
|
+
*/
|
|
18
|
+
readonly anchor: DOMRectReadOnly | HTMLElement;
|
|
19
|
+
/**
|
|
20
|
+
* The query handed to {@link AnchoredSuggest.getSuggestions}. Defaults to `''`.
|
|
21
|
+
*/
|
|
22
|
+
readonly query?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A suggest popover opened at an anchor, for a picker that has no text input: a toolbar button, a context-menu action,
|
|
26
|
+
* a decoration in the editor.
|
|
27
|
+
*
|
|
28
|
+
* Obsidian's `AbstractInputSuggest` opens only from an input and `EditorSuggest` only from the editor. This one is
|
|
29
|
+
* opened by {@link AnchoredSuggest.openAt} and closes on Escape, on a pointer-down outside it, and when its anchor
|
|
30
|
+
* element leaves the DOM. The keyboard works as in Obsidian's own popovers: arrows move, Enter picks.
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* class ColorSuggest extends AnchoredSuggest<string> {
|
|
34
|
+
* protected getSuggestions(): string[] {
|
|
35
|
+
* return ['red', 'green', 'blue'];
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* public renderSuggestion(color: string, el: HTMLElement): void {
|
|
39
|
+
* el.setText(color);
|
|
40
|
+
* }
|
|
41
|
+
*
|
|
42
|
+
* protected onChooseSuggestion(color: string): void {
|
|
43
|
+
* console.log(color);
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* await new ColorSuggest(this.app).openAt({ anchor: buttonEl });
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* It relies on `PopoverSuggest` members that `obsidian.d.ts` does not declare (`suggestions`, `reposition`,
|
|
51
|
+
* `setAutoDestroy`, `suggestEl`), read from Obsidian `1.15.0`.
|
|
52
|
+
*
|
|
53
|
+
* @typeParam T - The type of a suggestion.
|
|
54
|
+
*/
|
|
55
|
+
export declare abstract class AnchoredSuggest<T> extends PopoverSuggest<T> {
|
|
56
|
+
/**
|
|
57
|
+
* The maximum number of suggestions shown. `0` disables the limit. Defaults to `100`.
|
|
58
|
+
*/
|
|
59
|
+
limit: number;
|
|
60
|
+
private anchorEl;
|
|
61
|
+
private anchorRect;
|
|
62
|
+
private outsidePointerDownDocument;
|
|
63
|
+
private readonly outsidePointerDownHandler;
|
|
64
|
+
private requestCount;
|
|
65
|
+
/**
|
|
66
|
+
* Creates a new anchored suggest.
|
|
67
|
+
*
|
|
68
|
+
* @param app - The Obsidian app.
|
|
69
|
+
* @param scope - The parent keymap scope.
|
|
70
|
+
*/
|
|
71
|
+
constructor(app: App, scope?: Scope);
|
|
72
|
+
/**
|
|
73
|
+
* Closes the popover.
|
|
74
|
+
*/
|
|
75
|
+
close(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Opens the popover at an anchor, or moves it there when it is already open.
|
|
78
|
+
*
|
|
79
|
+
* @param params - The parameters.
|
|
80
|
+
* @returns Whether the popover is open: `false` when there is nothing to suggest, or when it was closed or reopened
|
|
81
|
+
* while the suggestions were computed.
|
|
82
|
+
*/
|
|
83
|
+
openAt(params: AnchoredSuggestOpenAtParams): Promise<boolean>;
|
|
84
|
+
/**
|
|
85
|
+
* Picks a suggestion: closes the popover, then hands the suggestion to {@link AnchoredSuggest.onChooseSuggestion}.
|
|
86
|
+
*
|
|
87
|
+
* @param value - The suggestion.
|
|
88
|
+
* @param $event - The event that picked it.
|
|
89
|
+
*/
|
|
90
|
+
selectSuggestion(value: T, $event: KeyboardEvent | MouseEvent): void;
|
|
91
|
+
/**
|
|
92
|
+
* Recomputes the suggestions for a new query at the current anchor.
|
|
93
|
+
*
|
|
94
|
+
* @param query - The query.
|
|
95
|
+
* @returns Whether the popover is open afterwards.
|
|
96
|
+
*/
|
|
97
|
+
setQuery(query: string): Promise<boolean>;
|
|
98
|
+
/**
|
|
99
|
+
* Gets the suggestions for a query.
|
|
100
|
+
*
|
|
101
|
+
* @param query - The query passed to {@link AnchoredSuggest.openAt} or {@link AnchoredSuggest.setQuery}.
|
|
102
|
+
* @returns The suggestions, directly or as a promise.
|
|
103
|
+
*/
|
|
104
|
+
protected abstract getSuggestions(query: string): Promise<T[]> | T[];
|
|
105
|
+
/**
|
|
106
|
+
* Called with the suggestion the user picked, after the popover closed.
|
|
107
|
+
*
|
|
108
|
+
* @param value - The suggestion.
|
|
109
|
+
* @param $event - The event that picked it.
|
|
110
|
+
*/
|
|
111
|
+
protected abstract onChooseSuggestion(value: T, $event: KeyboardEvent | MouseEvent): void;
|
|
112
|
+
private addOutsidePointerDownHandler;
|
|
113
|
+
private onOutsidePointerDown;
|
|
114
|
+
private refresh;
|
|
115
|
+
private removeOutsidePointerDownHandler;
|
|
116
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
|
|
33
|
+
import { PopoverSuggest } from "obsidian";
|
|
34
|
+
const DEFAULT_LIMIT = 100;
|
|
35
|
+
class AnchoredSuggest extends PopoverSuggest {
|
|
36
|
+
/**
|
|
37
|
+
* The maximum number of suggestions shown. `0` disables the limit. Defaults to `100`.
|
|
38
|
+
*/
|
|
39
|
+
limit = DEFAULT_LIMIT;
|
|
40
|
+
anchorEl = null;
|
|
41
|
+
anchorRect = null;
|
|
42
|
+
outsidePointerDownDocument = null;
|
|
43
|
+
outsidePointerDownHandler = this.onOutsidePointerDown.bind(this);
|
|
44
|
+
requestCount = 0;
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new anchored suggest.
|
|
47
|
+
*
|
|
48
|
+
* @param app - The Obsidian app.
|
|
49
|
+
* @param scope - The parent keymap scope.
|
|
50
|
+
*/
|
|
51
|
+
constructor(app, scope) {
|
|
52
|
+
super(app, scope);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Closes the popover.
|
|
56
|
+
*/
|
|
57
|
+
close() {
|
|
58
|
+
this.requestCount++;
|
|
59
|
+
this.removeOutsidePointerDownHandler();
|
|
60
|
+
super.close();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Opens the popover at an anchor, or moves it there when it is already open.
|
|
64
|
+
*
|
|
65
|
+
* @param params - The parameters.
|
|
66
|
+
* @returns Whether the popover is open: `false` when there is nothing to suggest, or when it was closed or reopened
|
|
67
|
+
* while the suggestions were computed.
|
|
68
|
+
*/
|
|
69
|
+
async openAt(params) {
|
|
70
|
+
const { anchor } = params;
|
|
71
|
+
if (isElement(anchor)) {
|
|
72
|
+
this.anchorEl = anchor;
|
|
73
|
+
this.anchorRect = anchor.getBoundingClientRect();
|
|
74
|
+
} else {
|
|
75
|
+
this.anchorEl = null;
|
|
76
|
+
this.anchorRect = anchor;
|
|
77
|
+
}
|
|
78
|
+
return await this.refresh(params.query ?? "", this.anchorRect);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Picks a suggestion: closes the popover, then hands the suggestion to {@link AnchoredSuggest.onChooseSuggestion}.
|
|
82
|
+
*
|
|
83
|
+
* @param value - The suggestion.
|
|
84
|
+
* @param $event - The event that picked it.
|
|
85
|
+
*/
|
|
86
|
+
selectSuggestion(value, $event) {
|
|
87
|
+
this.close();
|
|
88
|
+
this.onChooseSuggestion(value, $event);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Recomputes the suggestions for a new query at the current anchor.
|
|
92
|
+
*
|
|
93
|
+
* @param query - The query.
|
|
94
|
+
* @returns Whether the popover is open afterwards.
|
|
95
|
+
*/
|
|
96
|
+
async setQuery(query) {
|
|
97
|
+
return this.anchorRect ? await this.refresh(query, this.anchorRect) : false;
|
|
98
|
+
}
|
|
99
|
+
addOutsidePointerDownHandler() {
|
|
100
|
+
this.removeOutsidePointerDownHandler();
|
|
101
|
+
this.outsidePointerDownDocument = this.suggestEl.ownerDocument;
|
|
102
|
+
this.outsidePointerDownDocument.addEventListener("pointerdown", this.outsidePointerDownHandler, { capture: true });
|
|
103
|
+
}
|
|
104
|
+
onOutsidePointerDown(event_) {
|
|
105
|
+
const path = event_.composedPath();
|
|
106
|
+
if (path.includes(this.suggestEl) || this.anchorEl && path.includes(this.anchorEl)) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.close();
|
|
110
|
+
}
|
|
111
|
+
async refresh(query, anchorRect) {
|
|
112
|
+
const requestId = ++this.requestCount;
|
|
113
|
+
let suggestions = await this.getSuggestions(query);
|
|
114
|
+
if (requestId !== this.requestCount) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
if (suggestions.length === 0) {
|
|
118
|
+
this.close();
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
if (this.limit > 0) {
|
|
122
|
+
suggestions = suggestions.slice(0, this.limit);
|
|
123
|
+
}
|
|
124
|
+
this.suggestions.setSuggestions(suggestions);
|
|
125
|
+
this.open();
|
|
126
|
+
this.reposition(DOMRect.fromRect(anchorRect));
|
|
127
|
+
if (this.anchorEl) {
|
|
128
|
+
this.setAutoDestroy(this.anchorEl);
|
|
129
|
+
}
|
|
130
|
+
this.addOutsidePointerDownHandler();
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
removeOutsidePointerDownHandler() {
|
|
134
|
+
this.outsidePointerDownDocument?.removeEventListener("pointerdown", this.outsidePointerDownHandler, { capture: true });
|
|
135
|
+
this.outsidePointerDownDocument = null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function isElement(anchor) {
|
|
139
|
+
return "getBoundingClientRect" in anchor;
|
|
140
|
+
}
|
|
141
|
+
export {
|
|
142
|
+
AnchoredSuggest
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmNob3JlZC1zdWdnZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHN1Z2dlc3QgcG9wb3ZlciBvcGVuZWQgYXQgYW4gZWxlbWVudCBvciBhIHJlY3RhbmdsZSwgd2l0aCBubyBpbnB1dCBiZWhpbmQgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFNjb3BlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgUG9wb3ZlclN1Z2dlc3QgfSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IERFRkFVTFRfTElNSVQgPSAxMDA7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5vcGVuQXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuY2hvcmVkU3VnZ2VzdE9wZW5BdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBvciB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIHRoZSBwb3BvdmVyIGlzIHBsYWNlZCBhZ2FpbnN0LiBXaGVuIGFuIGVsZW1lbnQgaXMgZ2l2ZW4sIHRoZSBwb3BvdmVyIGNsb3Nlc1xuICAgKiBvbmNlIHRoZSBlbGVtZW50IGxlYXZlcyB0aGUgRE9NLCBhbmQgYSBwb2ludGVyLWRvd24gb24gaXQgZG9lcyBub3QgY291bnQgYXMgYW4gb3V0c2lkZSBjbGljay5cbiAgICovXG4gIHJlYWRvbmx5IGFuY2hvcjogRE9NUmVjdFJlYWRPbmx5IHwgSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBoYW5kZWQgdG8ge0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5nZXRTdWdnZXN0aW9uc30uIERlZmF1bHRzIHRvIGAnJ2AuXG4gICAqL1xuICByZWFkb25seSBxdWVyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHN1Z2dlc3QgcG9wb3ZlciBvcGVuZWQgYXQgYW4gYW5jaG9yLCBmb3IgYSBwaWNrZXIgdGhhdCBoYXMgbm8gdGV4dCBpbnB1dDogYSB0b29sYmFyIGJ1dHRvbiwgYSBjb250ZXh0LW1lbnUgYWN0aW9uLFxuICogYSBkZWNvcmF0aW9uIGluIHRoZSBlZGl0b3IuXG4gKlxuICogT2JzaWRpYW4ncyBgQWJzdHJhY3RJbnB1dFN1Z2dlc3RgIG9wZW5zIG9ubHkgZnJvbSBhbiBpbnB1dCBhbmQgYEVkaXRvclN1Z2dlc3RgIG9ubHkgZnJvbSB0aGUgZWRpdG9yLiBUaGlzIG9uZSBpc1xuICogb3BlbmVkIGJ5IHtAbGluayBBbmNob3JlZFN1Z2dlc3Qub3BlbkF0fSBhbmQgY2xvc2VzIG9uIEVzY2FwZSwgb24gYSBwb2ludGVyLWRvd24gb3V0c2lkZSBpdCwgYW5kIHdoZW4gaXRzIGFuY2hvclxuICogZWxlbWVudCBsZWF2ZXMgdGhlIERPTS4gVGhlIGtleWJvYXJkIHdvcmtzIGFzIGluIE9ic2lkaWFuJ3Mgb3duIHBvcG92ZXJzOiBhcnJvd3MgbW92ZSwgRW50ZXIgcGlja3MuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIENvbG9yU3VnZ2VzdCBleHRlbmRzIEFuY2hvcmVkU3VnZ2VzdDxzdHJpbmc+IHtcbiAqICAgcHJvdGVjdGVkIGdldFN1Z2dlc3Rpb25zKCk6IHN0cmluZ1tdIHtcbiAqICAgICByZXR1cm4gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgcmVuZGVyU3VnZ2VzdGlvbihjb2xvcjogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAqICAgICBlbC5zZXRUZXh0KGNvbG9yKTtcbiAqICAgfVxuICpcbiAqICAgcHJvdGVjdGVkIG9uQ2hvb3NlU3VnZ2VzdGlvbihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gKiAgICAgY29uc29sZS5sb2coY29sb3IpO1xuICogICB9XG4gKiB9XG4gKlxuICogYXdhaXQgbmV3IENvbG9yU3VnZ2VzdCh0aGlzLmFwcCkub3BlbkF0KHsgYW5jaG9yOiBidXR0b25FbCB9KTtcbiAqIGBgYFxuICpcbiAqIEl0IHJlbGllcyBvbiBgUG9wb3ZlclN1Z2dlc3RgIG1lbWJlcnMgdGhhdCBgb2JzaWRpYW4uZC50c2AgZG9lcyBub3QgZGVjbGFyZSAoYHN1Z2dlc3Rpb25zYCwgYHJlcG9zaXRpb25gLFxuICogYHNldEF1dG9EZXN0cm95YCwgYHN1Z2dlc3RFbGApLCByZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYSBzdWdnZXN0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQW5jaG9yZWRTdWdnZXN0PFQ+IGV4dGVuZHMgUG9wb3ZlclN1Z2dlc3Q8VD4ge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHNob3duLiBgMGAgZGlzYWJsZXMgdGhlIGxpbWl0LiBEZWZhdWx0cyB0byBgMTAwYC5cbiAgICovXG4gIHB1YmxpYyBsaW1pdCA9IERFRkFVTFRfTElNSVQ7XG5cbiAgcHJpdmF0ZSBhbmNob3JFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhbmNob3JSZWN0OiBET01SZWN0UmVhZE9ubHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudDogRG9jdW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyID0gdGhpcy5vbk91dHNpZGVQb2ludGVyRG93bi5iaW5kKHRoaXMpO1xuICBwcml2YXRlIHJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYW5jaG9yZWQgc3VnZ2VzdC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAuXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBwYXJlbnQga2V5bWFwIHNjb3BlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBzY29wZT86IFNjb3BlKSB7XG4gICAgc3VwZXIoYXBwLCBzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdENvdW50Kys7XG4gICAgdGhpcy5yZW1vdmVPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgc3VwZXIuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgcG9wb3ZlciBhdCBhbiBhbmNob3IsIG9yIG1vdmVzIGl0IHRoZXJlIHdoZW4gaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgb3BlbjogYGZhbHNlYCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gc3VnZ2VzdCwgb3Igd2hlbiBpdCB3YXMgY2xvc2VkIG9yIHJlb3BlbmVkXG4gICAqICAgd2hpbGUgdGhlIHN1Z2dlc3Rpb25zIHdlcmUgY29tcHV0ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb3BlbkF0KHBhcmFtczogQW5jaG9yZWRTdWdnZXN0T3BlbkF0UGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhbmNob3IgfSA9IHBhcmFtcztcbiAgICBpZiAoaXNFbGVtZW50KGFuY2hvcikpIHtcbiAgICAgIHRoaXMuYW5jaG9yRWwgPSBhbmNob3I7XG4gICAgICB0aGlzLmFuY2hvclJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYW5jaG9yRWwgPSBudWxsO1xuICAgICAgdGhpcy5hbmNob3JSZWN0ID0gYW5jaG9yO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoKHBhcmFtcy5xdWVyeSA/PyAnJywgdGhpcy5hbmNob3JSZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyBhIHN1Z2dlc3Rpb246IGNsb3NlcyB0aGUgcG9wb3ZlciwgdGhlbiBoYW5kcyB0aGUgc3VnZ2VzdGlvbiB0byB7QGxpbmsgQW5jaG9yZWRTdWdnZXN0Lm9uQ2hvb3NlU3VnZ2VzdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzdWdnZXN0aW9uLlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgcGlja2VkIGl0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNlbGVjdFN1Z2dlc3Rpb24odmFsdWU6IFQsICRldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy5vbkNob29zZVN1Z2dlc3Rpb24odmFsdWUsICRldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb21wdXRlcyB0aGUgc3VnZ2VzdGlvbnMgZm9yIGEgbmV3IHF1ZXJ5IGF0IHRoZSBjdXJyZW50IGFuY2hvci5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIG9wZW4gYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRRdWVyeShxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYW5jaG9yUmVjdCA/IChhd2FpdCB0aGlzLnJlZnJlc2gocXVlcnksIHRoaXMuYW5jaG9yUmVjdCkpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3VnZ2VzdGlvbnMgZm9yIGEgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeSAtIFRoZSBxdWVyeSBwYXNzZWQgdG8ge0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5vcGVuQXR9IG9yIHtAbGluayBBbmNob3JlZFN1Z2dlc3Quc2V0UXVlcnl9LlxuICAgKiBAcmV0dXJucyBUaGUgc3VnZ2VzdGlvbnMsIGRpcmVjdGx5IG9yIGFzIGEgcHJvbWlzZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTdWdnZXN0aW9ucyhxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxUW10+IHwgVFtdO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2l0aCB0aGUgc3VnZ2VzdGlvbiB0aGUgdXNlciBwaWNrZWQsIGFmdGVyIHRoZSBwb3BvdmVyIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN1Z2dlc3Rpb24uXG4gICAqIEBwYXJhbSAkZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCBwaWNrZWQgaXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25DaG9vc2VTdWdnZXN0aW9uKHZhbHVlOiBULCAkZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZDtcblxuICBwcml2YXRlIGFkZE91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudCA9IHRoaXMuc3VnZ2VzdEVsLm93bmVyRG9jdW1lbnQ7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub3V0c2lkZVBvaW50ZXJEb3duSGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk91dHNpZGVQb2ludGVyRG93bihldmVudF86IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBldmVudF8uY29tcG9zZWRQYXRoKCk7XG4gICAgaWYgKHBhdGguaW5jbHVkZXModGhpcy5zdWdnZXN0RWwpIHx8ICh0aGlzLmFuY2hvckVsICYmIHBhdGguaW5jbHVkZXModGhpcy5hbmNob3JFbCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaChxdWVyeTogc3RyaW5nLCBhbmNob3JSZWN0OiBET01SZWN0UmVhZE9ubHkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSArK3RoaXMucmVxdWVzdENvdW50O1xuICAgIGxldCBzdWdnZXN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0U3VnZ2VzdGlvbnMocXVlcnkpO1xuICAgIGlmIChyZXF1ZXN0SWQgIT09IHRoaXMucmVxdWVzdENvdW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGltaXQgPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuICAgIH1cblxuICAgIHRoaXMuc3VnZ2VzdGlvbnMuc2V0U3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnMpO1xuICAgIHRoaXMub3BlbigpO1xuICAgIHRoaXMucmVwb3NpdGlvbihET01SZWN0LmZyb21SZWN0KGFuY2hvclJlY3QpKTtcbiAgICBpZiAodGhpcy5hbmNob3JFbCkge1xuICAgICAgdGhpcy5zZXRBdXRvRGVzdHJveSh0aGlzLmFuY2hvckVsKTtcbiAgICB9XG4gICAgdGhpcy5hZGRPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB0aGlzLm91dHNpZGVQb2ludGVyRG93bkRvY3VtZW50ID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoYW5jaG9yOiBET01SZWN0UmVhZE9ubHkgfCBIVE1MRWxlbWVudCk6IGFuY2hvciBpcyBIVE1MRWxlbWVudCB7XG4gIHJldHVybiAnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JyBpbiBhbmNob3I7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0EsU0FBUyxzQkFBc0I7QUFFL0IsTUFBTSxnQkFBZ0I7QUFpRGYsTUFBZSx3QkFBMkIsZUFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkxRCxRQUFRO0FBQUEsRUFFUCxXQUErQjtBQUFBLEVBQy9CLGFBQXFDO0FBQUEsRUFDckMsNkJBQThDO0FBQUEsRUFDckMsNEJBQTRCLEtBQUsscUJBQXFCLEtBQUssSUFBSTtBQUFBLEVBQ3hFLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFoQixZQUFZLEtBQVUsT0FBZTtBQUMxQyxVQUFNLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsUUFBYztBQUM1QixTQUFLO0FBQ0wsU0FBSyxnQ0FBZ0M7QUFDckMsVUFBTSxNQUFNO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxNQUFhLE9BQU8sUUFBdUQ7QUFDekUsVUFBTSxFQUFFLE9BQU8sSUFBSTtBQUNuQixRQUFJLFVBQVUsTUFBTSxHQUFHO0FBQ3JCLFdBQUssV0FBVztBQUNoQixXQUFLLGFBQWEsT0FBTyxzQkFBc0I7QUFBQSxJQUNqRCxPQUFPO0FBQ0wsV0FBSyxXQUFXO0FBQ2hCLFdBQUssYUFBYTtBQUFBLElBQ3BCO0FBQ0EsV0FBTyxNQUFNLEtBQUssUUFBUSxPQUFPLFNBQVMsSUFBSSxLQUFLLFVBQVU7QUFBQSxFQUMvRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWdCLGlCQUFpQixPQUFVLFFBQTBDO0FBQ25GLFNBQUssTUFBTTtBQUNYLFNBQUssbUJBQW1CLE9BQU8sTUFBTTtBQUFBLEVBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLFNBQVMsT0FBaUM7QUFDckQsV0FBTyxLQUFLLGFBQWMsTUFBTSxLQUFLLFFBQVEsT0FBTyxLQUFLLFVBQVUsSUFBSztBQUFBLEVBQzFFO0FBQUEsRUFrQlEsK0JBQXFDO0FBQzNDLFNBQUssZ0NBQWdDO0FBQ3JDLFNBQUssNkJBQTZCLEtBQUssVUFBVTtBQUNqRCxTQUFLLDJCQUEyQixpQkFBaUIsZUFBZSxLQUFLLDJCQUEyQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsRUFDbkg7QUFBQSxFQUVRLHFCQUFxQixRQUE0QjtBQUN2RCxVQUFNLE9BQU8sT0FBTyxhQUFhO0FBQ2pDLFFBQUksS0FBSyxTQUFTLEtBQUssU0FBUyxLQUFNLEtBQUssWUFBWSxLQUFLLFNBQVMsS0FBSyxRQUFRLEdBQUk7QUFDcEY7QUFBQSxJQUNGO0FBQ0EsU0FBSyxNQUFNO0FBQUEsRUFDYjtBQUFBLEVBRUEsTUFBYyxRQUFRLE9BQWUsWUFBK0M7QUFDbEYsVUFBTSxZQUFZLEVBQUUsS0FBSztBQUN6QixRQUFJLGNBQWMsTUFBTSxLQUFLLGVBQWUsS0FBSztBQUNqRCxRQUFJLGNBQWMsS0FBSyxjQUFjO0FBQ25DLGFBQU87QUFBQSxJQUNUO0FBQ0EsUUFBSSxZQUFZLFdBQVcsR0FBRztBQUM1QixXQUFLLE1BQU07QUFDWCxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksS0FBSyxRQUFRLEdBQUc7QUFDbEIsb0JBQWMsWUFBWSxNQUFNLEdBQUcsS0FBSyxLQUFLO0FBQUEsSUFDL0M7QUFFQSxTQUFLLFlBQVksZUFBZSxXQUFXO0FBQzNDLFNBQUssS0FBSztBQUNWLFNBQUssV0FBVyxRQUFRLFNBQVMsVUFBVSxDQUFDO0FBQzVDLFFBQUksS0FBSyxVQUFVO0FBQ2pCLFdBQUssZUFBZSxLQUFLLFFBQVE7QUFBQSxJQUNuQztBQUNBLFNBQUssNkJBQTZCO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSxrQ0FBd0M7QUFDOUMsU0FBSyw0QkFBNEIsb0JBQW9CLGVBQWUsS0FBSywyQkFBMkIsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNySCxTQUFLLDZCQUE2QjtBQUFBLEVBQ3BDO0FBQ0Y7QUFFQSxTQUFTLFVBQVUsUUFBOEQ7QUFDL0UsU0FBTywyQkFBMkI7QUFDcEM7IiwibmFtZXMiOltdfQ==
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Where did a missing link target go? Pure, no `App`: every question about which file a broken link most likely
|
|
6
|
+
* meant is answerable from a list of paths, the notes' aliases and titles, and the vault's git renames.
|
|
7
|
+
*
|
|
8
|
+
* A rename is not recoverable from the link alone: a link to `alpha/bravo/charlie/!.md` says nothing about
|
|
9
|
+
* `charlie` having become `delta`. So every candidate carries the evidence that produced it, from outside the
|
|
10
|
+
* link, and the finder never picks one of several: a caller offers a one-click fix only when exactly one
|
|
11
|
+
* candidate exists.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* The kind of evidence that makes a file a candidate for a missing link target.
|
|
15
|
+
*
|
|
16
|
+
* Candidates list evidence strongest first, in EVIDENCE_KIND_ORDER below.
|
|
17
|
+
*/
|
|
18
|
+
export declare enum BrokenLinkEvidenceKind {
|
|
19
|
+
/**
|
|
20
|
+
* The candidate's `aliases` hold the missing target's old name.
|
|
21
|
+
*/
|
|
22
|
+
Alias = "Alias",
|
|
23
|
+
/**
|
|
24
|
+
* The candidate's path differs from the missing one only in letter case.
|
|
25
|
+
*/
|
|
26
|
+
CaseChange = "CaseChange",
|
|
27
|
+
/**
|
|
28
|
+
* The vault's git history records the missing path being renamed to the candidate.
|
|
29
|
+
*/
|
|
30
|
+
GitRename = "GitRename",
|
|
31
|
+
/**
|
|
32
|
+
* The missing target's folder is gone, and a sibling folder holds every missing target that was under it.
|
|
33
|
+
*/
|
|
34
|
+
RenamedFolder = "RenamedFolder",
|
|
35
|
+
/**
|
|
36
|
+
* A file with the same name, and the longest run of the same parent folders, sits elsewhere.
|
|
37
|
+
*/
|
|
38
|
+
SameName = "SameName",
|
|
39
|
+
/**
|
|
40
|
+
* The candidate's `title` is the missing target's old name.
|
|
41
|
+
*/
|
|
42
|
+
Title = "Title"
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* One file that a missing link target may have become, and why.
|
|
46
|
+
*/
|
|
47
|
+
export interface BrokenLinkCandidate {
|
|
48
|
+
/**
|
|
49
|
+
* Every reason this file is a candidate, strongest first.
|
|
50
|
+
*/
|
|
51
|
+
readonly evidence: readonly BrokenLinkEvidence[];
|
|
52
|
+
/**
|
|
53
|
+
* The candidate's vault path.
|
|
54
|
+
*/
|
|
55
|
+
readonly path: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The parameters for {@link BrokenLinkCandidateFinder}.
|
|
59
|
+
*/
|
|
60
|
+
export interface BrokenLinkCandidateFinderConstructorParams {
|
|
61
|
+
/**
|
|
62
|
+
* Each note's `aliases`, by note path.
|
|
63
|
+
*/
|
|
64
|
+
readonly aliasesByPath: ReadonlyMap<string, readonly string[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Every file in the vault.
|
|
67
|
+
*/
|
|
68
|
+
readonly filePaths: readonly string[];
|
|
69
|
+
/**
|
|
70
|
+
* The file names a folder note is stored under, such as `index.md`. Such a name says nothing about which
|
|
71
|
+
* note it is, so a same-name candidate must share its folder's name too, and the old name an alias is
|
|
72
|
+
* matched against is the folder's.
|
|
73
|
+
*/
|
|
74
|
+
readonly folderNoteFileNames: readonly string[];
|
|
75
|
+
/**
|
|
76
|
+
* The vault's git renames: each old vault path to the path it was renamed to, chains already followed.
|
|
77
|
+
*/
|
|
78
|
+
readonly gitRenames: ReadonlyMap<string, GitRename>;
|
|
79
|
+
/**
|
|
80
|
+
* Each note's `title`, by note path.
|
|
81
|
+
*/
|
|
82
|
+
readonly titlesByPath: ReadonlyMap<string, string>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* One reason a file is a candidate for a missing link target.
|
|
86
|
+
*/
|
|
87
|
+
export interface BrokenLinkEvidence {
|
|
88
|
+
/**
|
|
89
|
+
* A sentence naming the evidence, for the user to judge it by.
|
|
90
|
+
*/
|
|
91
|
+
readonly description: string;
|
|
92
|
+
/**
|
|
93
|
+
* The kind of evidence.
|
|
94
|
+
*/
|
|
95
|
+
readonly kind: BrokenLinkEvidenceKind;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A rename recorded in the vault's git history.
|
|
99
|
+
*/
|
|
100
|
+
export interface GitRename {
|
|
101
|
+
/**
|
|
102
|
+
* The abbreviated hash of the commit that made the last rename of the chain.
|
|
103
|
+
*/
|
|
104
|
+
readonly commit: string;
|
|
105
|
+
/**
|
|
106
|
+
* The vault path the file was last renamed to.
|
|
107
|
+
*/
|
|
108
|
+
readonly newPath: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The part of a missing path that a candidate replaced: what a "fix all like this" applies to every other link.
|
|
112
|
+
*/
|
|
113
|
+
export interface PathMapping {
|
|
114
|
+
/**
|
|
115
|
+
* The part of the candidate path that replaced {@link oldPrefix}; `''` for the vault root.
|
|
116
|
+
*/
|
|
117
|
+
readonly newPrefix: string;
|
|
118
|
+
/**
|
|
119
|
+
* The leading part of the missing path that no longer exists; `''` for the vault root.
|
|
120
|
+
*/
|
|
121
|
+
readonly oldPrefix: string;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Finds the candidates for missing link targets, from one snapshot of the vault.
|
|
125
|
+
*/
|
|
126
|
+
export declare class BrokenLinkCandidateFinder {
|
|
127
|
+
private readonly aliasesByPath;
|
|
128
|
+
private readonly childFoldersByFolder;
|
|
129
|
+
private readonly filePathSet;
|
|
130
|
+
private readonly filesByLowerCasePath;
|
|
131
|
+
private readonly filesByName;
|
|
132
|
+
private readonly folderNoteFileNames;
|
|
133
|
+
private readonly folderPaths;
|
|
134
|
+
private readonly gitRenames;
|
|
135
|
+
private readonly titlesByPath;
|
|
136
|
+
/**
|
|
137
|
+
* Indexes the vault snapshot.
|
|
138
|
+
*
|
|
139
|
+
* @param params - The snapshot.
|
|
140
|
+
*/
|
|
141
|
+
constructor(params: BrokenLinkCandidateFinderConstructorParams);
|
|
142
|
+
/**
|
|
143
|
+
* Finds the candidates for every missing path at once.
|
|
144
|
+
*
|
|
145
|
+
* All at once because one kind of evidence is collective: a renamed folder is recognized by every missing
|
|
146
|
+
* target that was under it turning up together under one sibling folder.
|
|
147
|
+
*
|
|
148
|
+
* @param missingPaths - The vault paths that links lead to and no file holds.
|
|
149
|
+
* @returns The candidates for each missing path, strongest first; an empty list when nothing is known.
|
|
150
|
+
*/
|
|
151
|
+
findAll(missingPaths: Iterable<string>): Map<string, BrokenLinkCandidate[]>;
|
|
152
|
+
private addAliasAndTitleCandidates;
|
|
153
|
+
private addCaseChangeCandidates;
|
|
154
|
+
private addGitRenameCandidate;
|
|
155
|
+
private addRenamedFolderCandidates;
|
|
156
|
+
private addSameNameCandidates;
|
|
157
|
+
/**
|
|
158
|
+
* Groups the missing paths by the highest missing folder above each, the root of a subtree that may have been
|
|
159
|
+
* renamed as a whole.
|
|
160
|
+
*
|
|
161
|
+
* @param missingPaths - The missing paths.
|
|
162
|
+
* @returns Each missing path's subtree; a path whose own folder exists has none.
|
|
163
|
+
*/
|
|
164
|
+
private getMissingSubtrees;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* The parent folder of a vault path.
|
|
168
|
+
*
|
|
169
|
+
* @param path - The path.
|
|
170
|
+
* @returns The parent folder; `''` for the vault root.
|
|
171
|
+
*/
|
|
172
|
+
export declare function getParentPath(path: string): string;
|
|
173
|
+
/**
|
|
174
|
+
* The part of a missing path that a candidate path replaced, found by dropping the path segments they end with
|
|
175
|
+
* in common.
|
|
176
|
+
*
|
|
177
|
+
* @param oldPath - The missing path.
|
|
178
|
+
* @param newPath - The candidate path.
|
|
179
|
+
* @returns The prefixes that differ.
|
|
180
|
+
*/
|
|
181
|
+
export declare function getPathMapping(oldPath: string, newPath: string): PathMapping;
|