@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,275 @@
|
|
|
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 { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
|
|
34
|
+
var BrokenLinkEvidenceKind = /* @__PURE__ */ ((BrokenLinkEvidenceKind2) => {
|
|
35
|
+
BrokenLinkEvidenceKind2["Alias"] = "Alias";
|
|
36
|
+
BrokenLinkEvidenceKind2["CaseChange"] = "CaseChange";
|
|
37
|
+
BrokenLinkEvidenceKind2["GitRename"] = "GitRename";
|
|
38
|
+
BrokenLinkEvidenceKind2["RenamedFolder"] = "RenamedFolder";
|
|
39
|
+
BrokenLinkEvidenceKind2["SameName"] = "SameName";
|
|
40
|
+
BrokenLinkEvidenceKind2["Title"] = "Title";
|
|
41
|
+
return BrokenLinkEvidenceKind2;
|
|
42
|
+
})(BrokenLinkEvidenceKind || {});
|
|
43
|
+
const FOLDER_NOTE_MIN_SUFFIX_LENGTH = 2;
|
|
44
|
+
const EVIDENCE_KIND_ORDER = [
|
|
45
|
+
"GitRename" /* GitRename */,
|
|
46
|
+
"CaseChange" /* CaseChange */,
|
|
47
|
+
"Alias" /* Alias */,
|
|
48
|
+
"Title" /* Title */,
|
|
49
|
+
"RenamedFolder" /* RenamedFolder */,
|
|
50
|
+
"SameName" /* SameName */
|
|
51
|
+
];
|
|
52
|
+
class BrokenLinkCandidateFinder {
|
|
53
|
+
aliasesByPath;
|
|
54
|
+
childFoldersByFolder = /* @__PURE__ */ new Map();
|
|
55
|
+
filePathSet;
|
|
56
|
+
filesByLowerCasePath = /* @__PURE__ */ new Map();
|
|
57
|
+
filesByName = /* @__PURE__ */ new Map();
|
|
58
|
+
folderNoteFileNames;
|
|
59
|
+
folderPaths = /* @__PURE__ */ new Set([""]);
|
|
60
|
+
gitRenames;
|
|
61
|
+
titlesByPath;
|
|
62
|
+
/**
|
|
63
|
+
* Indexes the vault snapshot.
|
|
64
|
+
*
|
|
65
|
+
* @param params - The snapshot.
|
|
66
|
+
*/
|
|
67
|
+
constructor(params) {
|
|
68
|
+
this.aliasesByPath = params.aliasesByPath;
|
|
69
|
+
this.filePathSet = new Set(params.filePaths);
|
|
70
|
+
this.folderNoteFileNames = new Set(params.folderNoteFileNames);
|
|
71
|
+
this.gitRenames = params.gitRenames;
|
|
72
|
+
this.titlesByPath = params.titlesByPath;
|
|
73
|
+
for (const filePath of params.filePaths) {
|
|
74
|
+
addToMultiMap(this.filesByName, getName(filePath), filePath);
|
|
75
|
+
addToMultiMap(this.filesByLowerCasePath, filePath.toLowerCase(), filePath);
|
|
76
|
+
let folder = getParentPath(filePath);
|
|
77
|
+
while (!this.folderPaths.has(folder)) {
|
|
78
|
+
this.folderPaths.add(folder);
|
|
79
|
+
addToMultiMap(this.childFoldersByFolder, getParentPath(folder), folder);
|
|
80
|
+
folder = getParentPath(folder);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Finds the candidates for every missing path at once.
|
|
86
|
+
*
|
|
87
|
+
* All at once because one kind of evidence is collective: a renamed folder is recognized by every missing
|
|
88
|
+
* target that was under it turning up together under one sibling folder.
|
|
89
|
+
*
|
|
90
|
+
* @param missingPaths - The vault paths that links lead to and no file holds.
|
|
91
|
+
* @returns The candidates for each missing path, strongest first; an empty list when nothing is known.
|
|
92
|
+
*/
|
|
93
|
+
findAll(missingPaths) {
|
|
94
|
+
const uniqueMissingPaths = new Set(missingPaths);
|
|
95
|
+
const missingSubtrees = this.getMissingSubtrees(uniqueMissingPaths);
|
|
96
|
+
const result = /* @__PURE__ */ new Map();
|
|
97
|
+
for (const missingPath of uniqueMissingPaths) {
|
|
98
|
+
let add2 = function(path, kind, description) {
|
|
99
|
+
addToMultiMap(evidenceByPath, path, { description, kind });
|
|
100
|
+
};
|
|
101
|
+
var add = add2;
|
|
102
|
+
const evidenceByPath = /* @__PURE__ */ new Map();
|
|
103
|
+
this.addGitRenameCandidate(missingPath, add2);
|
|
104
|
+
this.addCaseChangeCandidates(missingPath, add2);
|
|
105
|
+
this.addAliasAndTitleCandidates(missingPath, add2);
|
|
106
|
+
this.addRenamedFolderCandidates(missingPath, missingSubtrees, add2);
|
|
107
|
+
this.addSameNameCandidates(missingPath, add2);
|
|
108
|
+
result.set(missingPath, sortCandidates(evidenceByPath));
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
addAliasAndTitleCandidates(missingPath, add) {
|
|
113
|
+
const name = getName(missingPath);
|
|
114
|
+
const isFolderNote = this.folderNoteFileNames.has(name);
|
|
115
|
+
let oldName;
|
|
116
|
+
if (isFolderNote) {
|
|
117
|
+
oldName = getName(getParentPath(missingPath));
|
|
118
|
+
if (!oldName) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
} else if (name.toLowerCase().endsWith(".md")) {
|
|
122
|
+
oldName = name.slice(0, -".md".length);
|
|
123
|
+
} else {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const lowerCaseOldName = oldName.toLowerCase();
|
|
127
|
+
const isEligible = (path) => this.filePathSet.has(path) && (!isFolderNote || getName(path) === name);
|
|
128
|
+
for (const [path, aliases] of this.aliasesByPath) {
|
|
129
|
+
if (isEligible(path) && aliases.some((alias) => alias.toLowerCase() === lowerCaseOldName)) {
|
|
130
|
+
add(path, "Alias" /* Alias */, `Its aliases hold the old name "${oldName}".`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (const [path, title] of this.titlesByPath) {
|
|
134
|
+
if (isEligible(path) && title.toLowerCase() === lowerCaseOldName) {
|
|
135
|
+
add(path, "Title" /* Title */, `Its title is the old name "${oldName}".`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
addCaseChangeCandidates(missingPath, add) {
|
|
140
|
+
for (const path of this.filesByLowerCasePath.get(missingPath.toLowerCase()) ?? []) {
|
|
141
|
+
add(path, "CaseChange" /* CaseChange */, "Only the letter case of its path differs.");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
addGitRenameCandidate(missingPath, add) {
|
|
145
|
+
const gitRename = this.gitRenames.get(missingPath);
|
|
146
|
+
if (gitRename && this.filePathSet.has(gitRename.newPath)) {
|
|
147
|
+
add(gitRename.newPath, "GitRename" /* GitRename */, `Git history records the rename, in commit ${gitRename.commit}.`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
addRenamedFolderCandidates(missingPath, missingSubtrees, add) {
|
|
151
|
+
const missingSubtree = missingSubtrees.get(missingPath);
|
|
152
|
+
if (!missingSubtree) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const parentPath = getParentPath(missingSubtree.root);
|
|
156
|
+
const remainder = getRelativePath(missingSubtree.root, missingPath);
|
|
157
|
+
for (const siblingFolder of this.childFoldersByFolder.get(parentPath) ?? []) {
|
|
158
|
+
const isSubtreeIntact = [...missingSubtree.remainders].every((path) => this.filePathSet.has(joinPath(siblingFolder, path)));
|
|
159
|
+
if (!isSubtreeIntact) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const fileCount = missingSubtree.remainders.size;
|
|
163
|
+
add(
|
|
164
|
+
joinPath(siblingFolder, remainder),
|
|
165
|
+
"RenamedFolder" /* RenamedFolder */,
|
|
166
|
+
`The folder "${missingSubtree.root}" is gone, and its sibling "${siblingFolder}" holds ${fileCount === 1 ? "the missing file that was" : `all ${String(fileCount)} missing files that were`} under it.`
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
addSameNameCandidates(missingPath, add) {
|
|
171
|
+
const name = getName(missingPath);
|
|
172
|
+
const minSuffixLength = this.folderNoteFileNames.has(name) ? FOLDER_NOTE_MIN_SUFFIX_LENGTH : 1;
|
|
173
|
+
const missingSegments = missingPath.split("/");
|
|
174
|
+
let bestSuffixLength = minSuffixLength;
|
|
175
|
+
let bestPaths = [];
|
|
176
|
+
for (const path of this.filesByName.get(name) ?? []) {
|
|
177
|
+
const suffixLength = getCommonSuffixLength(missingSegments, path.split("/"));
|
|
178
|
+
if (suffixLength > bestSuffixLength) {
|
|
179
|
+
bestSuffixLength = suffixLength;
|
|
180
|
+
bestPaths = [path];
|
|
181
|
+
} else if (suffixLength === bestSuffixLength) {
|
|
182
|
+
bestPaths.push(path);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const suffix = missingSegments.slice(-bestSuffixLength).join("/");
|
|
186
|
+
for (const path of bestPaths) {
|
|
187
|
+
add(path, "SameName" /* SameName */, `It has the same name, "${suffix}", in another folder.`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Groups the missing paths by the highest missing folder above each, the root of a subtree that may have been
|
|
192
|
+
* renamed as a whole.
|
|
193
|
+
*
|
|
194
|
+
* @param missingPaths - The missing paths.
|
|
195
|
+
* @returns Each missing path's subtree; a path whose own folder exists has none.
|
|
196
|
+
*/
|
|
197
|
+
getMissingSubtrees(missingPaths) {
|
|
198
|
+
const subtreesByRoot = /* @__PURE__ */ new Map();
|
|
199
|
+
const result = /* @__PURE__ */ new Map();
|
|
200
|
+
for (const missingPath of missingPaths) {
|
|
201
|
+
let root = getParentPath(missingPath);
|
|
202
|
+
if (this.folderPaths.has(root)) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
while (!this.folderPaths.has(getParentPath(root))) {
|
|
206
|
+
root = getParentPath(root);
|
|
207
|
+
}
|
|
208
|
+
let missingSubtree = subtreesByRoot.get(root);
|
|
209
|
+
if (!missingSubtree) {
|
|
210
|
+
missingSubtree = { remainders: /* @__PURE__ */ new Set(), root };
|
|
211
|
+
subtreesByRoot.set(root, missingSubtree);
|
|
212
|
+
}
|
|
213
|
+
missingSubtree.remainders.add(getRelativePath(root, missingPath));
|
|
214
|
+
result.set(missingPath, missingSubtree);
|
|
215
|
+
}
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function getParentPath(path) {
|
|
220
|
+
const index = path.lastIndexOf("/");
|
|
221
|
+
return index === -1 ? "" : path.slice(0, index);
|
|
222
|
+
}
|
|
223
|
+
function getPathMapping(oldPath, newPath) {
|
|
224
|
+
const oldSegments = oldPath.split("/");
|
|
225
|
+
const newSegments = newPath.split("/");
|
|
226
|
+
const suffixLength = getCommonSuffixLength(oldSegments, newSegments);
|
|
227
|
+
return {
|
|
228
|
+
newPrefix: newSegments.slice(0, newSegments.length - suffixLength).join("/"),
|
|
229
|
+
oldPrefix: oldSegments.slice(0, oldSegments.length - suffixLength).join("/")
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
function addToMultiMap(map, key, value) {
|
|
233
|
+
let values = map.get(key);
|
|
234
|
+
if (!values) {
|
|
235
|
+
values = [];
|
|
236
|
+
map.set(key, values);
|
|
237
|
+
}
|
|
238
|
+
values.push(value);
|
|
239
|
+
}
|
|
240
|
+
function getCommonSuffixLength(segments1, segments2) {
|
|
241
|
+
let length = 0;
|
|
242
|
+
while (length < segments1.length && length < segments2.length && segments1.at(-length - 1) === segments2.at(-length - 1)) {
|
|
243
|
+
length++;
|
|
244
|
+
}
|
|
245
|
+
return length;
|
|
246
|
+
}
|
|
247
|
+
function getEvidenceRank(evidence) {
|
|
248
|
+
return EVIDENCE_KIND_ORDER.indexOf(evidence.kind);
|
|
249
|
+
}
|
|
250
|
+
function getName(path) {
|
|
251
|
+
return path.slice(path.lastIndexOf("/") + 1);
|
|
252
|
+
}
|
|
253
|
+
function getRelativePath(folder, path) {
|
|
254
|
+
return path.slice(folder.length + 1);
|
|
255
|
+
}
|
|
256
|
+
function joinPath(folder, path) {
|
|
257
|
+
return `${folder}/${path}`;
|
|
258
|
+
}
|
|
259
|
+
function sortCandidates(evidenceByPath) {
|
|
260
|
+
const candidates = [...evidenceByPath].map(([path, evidence]) => ({
|
|
261
|
+
evidence: evidence.sort((evidence1, evidence2) => getEvidenceRank(evidence1) - getEvidenceRank(evidence2)),
|
|
262
|
+
path
|
|
263
|
+
}));
|
|
264
|
+
return candidates.sort((candidate1, candidate2) => {
|
|
265
|
+
const rankDifference = getEvidenceRank(ensureNonNullable(candidate1.evidence[0])) - getEvidenceRank(ensureNonNullable(candidate2.evidence[0]));
|
|
266
|
+
return rankDifference || candidate1.path.localeCompare(candidate2.path);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
export {
|
|
270
|
+
BrokenLinkCandidateFinder,
|
|
271
|
+
BrokenLinkEvidenceKind,
|
|
272
|
+
getParentPath,
|
|
273
|
+
getPathMapping
|
|
274
|
+
};
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9icm9rZW4tbGluay1jYW5kaWRhdGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBXaGVyZSBkaWQgYSBtaXNzaW5nIGxpbmsgdGFyZ2V0IGdvPyBQdXJlLCBubyBgQXBwYDogZXZlcnkgcXVlc3Rpb24gYWJvdXQgd2hpY2ggZmlsZSBhIGJyb2tlbiBsaW5rIG1vc3QgbGlrZWx5XG4gKiBtZWFudCBpcyBhbnN3ZXJhYmxlIGZyb20gYSBsaXN0IG9mIHBhdGhzLCB0aGUgbm90ZXMnIGFsaWFzZXMgYW5kIHRpdGxlcywgYW5kIHRoZSB2YXVsdCdzIGdpdCByZW5hbWVzLlxuICpcbiAqIEEgcmVuYW1lIGlzIG5vdCByZWNvdmVyYWJsZSBmcm9tIHRoZSBsaW5rIGFsb25lOiBhIGxpbmsgdG8gYGFscGhhL2JyYXZvL2NoYXJsaWUvIS5tZGAgc2F5cyBub3RoaW5nIGFib3V0XG4gKiBgY2hhcmxpZWAgaGF2aW5nIGJlY29tZSBgZGVsdGFgLiBTbyBldmVyeSBjYW5kaWRhdGUgY2FycmllcyB0aGUgZXZpZGVuY2UgdGhhdCBwcm9kdWNlZCBpdCwgZnJvbSBvdXRzaWRlIHRoZVxuICogbGluaywgYW5kIHRoZSBmaW5kZXIgbmV2ZXIgcGlja3Mgb25lIG9mIHNldmVyYWw6IGEgY2FsbGVyIG9mZmVycyBhIG9uZS1jbGljayBmaXggb25seSB3aGVuIGV4YWN0bHkgb25lXG4gKiBjYW5kaWRhdGUgZXhpc3RzLlxuICovXG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuLyoqXG4gKiBUaGUga2luZCBvZiBldmlkZW5jZSB0aGF0IG1ha2VzIGEgZmlsZSBhIGNhbmRpZGF0ZSBmb3IgYSBtaXNzaW5nIGxpbmsgdGFyZ2V0LlxuICpcbiAqIENhbmRpZGF0ZXMgbGlzdCBldmlkZW5jZSBzdHJvbmdlc3QgZmlyc3QsIGluIEVWSURFTkNFX0tJTkRfT1JERVIgYmVsb3cuXG4gKi9cbmV4cG9ydCBlbnVtIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQge1xuICAvKipcbiAgICogVGhlIGNhbmRpZGF0ZSdzIGBhbGlhc2VzYCBob2xkIHRoZSBtaXNzaW5nIHRhcmdldCdzIG9sZCBuYW1lLlxuICAgKi9cbiAgQWxpYXMgPSAnQWxpYXMnLFxuXG4gIC8qKlxuICAgKiBUaGUgY2FuZGlkYXRlJ3MgcGF0aCBkaWZmZXJzIGZyb20gdGhlIG1pc3Npbmcgb25lIG9ubHkgaW4gbGV0dGVyIGNhc2UuXG4gICAqL1xuICBDYXNlQ2hhbmdlID0gJ0Nhc2VDaGFuZ2UnLFxuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyBnaXQgaGlzdG9yeSByZWNvcmRzIHRoZSBtaXNzaW5nIHBhdGggYmVpbmcgcmVuYW1lZCB0byB0aGUgY2FuZGlkYXRlLlxuICAgKi9cbiAgR2l0UmVuYW1lID0gJ0dpdFJlbmFtZScsXG5cbiAgLyoqXG4gICAqIFRoZSBtaXNzaW5nIHRhcmdldCdzIGZvbGRlciBpcyBnb25lLCBhbmQgYSBzaWJsaW5nIGZvbGRlciBob2xkcyBldmVyeSBtaXNzaW5nIHRhcmdldCB0aGF0IHdhcyB1bmRlciBpdC5cbiAgICovXG4gIFJlbmFtZWRGb2xkZXIgPSAnUmVuYW1lZEZvbGRlcicsXG5cbiAgLyoqXG4gICAqIEEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUsIGFuZCB0aGUgbG9uZ2VzdCBydW4gb2YgdGhlIHNhbWUgcGFyZW50IGZvbGRlcnMsIHNpdHMgZWxzZXdoZXJlLlxuICAgKi9cbiAgU2FtZU5hbWUgPSAnU2FtZU5hbWUnLFxuXG4gIC8qKlxuICAgKiBUaGUgY2FuZGlkYXRlJ3MgYHRpdGxlYCBpcyB0aGUgbWlzc2luZyB0YXJnZXQncyBvbGQgbmFtZS5cbiAgICovXG4gIFRpdGxlID0gJ1RpdGxlJ1xufVxuXG4vKipcbiAqIEEgZm9sZGVyIG5vdGUncyBvd24gbmFtZSBpZGVudGlmaWVzIG5vdGhpbmcsIHNvIGEgc2FtZS1uYW1lIGNhbmRpZGF0ZSBtdXN0IHNoYXJlIGl0cyBmb2xkZXIncyBuYW1lIHRvby5cbiAqL1xuY29uc3QgRk9MREVSX05PVEVfTUlOX1NVRkZJWF9MRU5HVEggPSAyO1xuXG5jb25zdCBFVklERU5DRV9LSU5EX09SREVSOiByZWFkb25seSBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kW10gPSBbXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuR2l0UmVuYW1lLFxuICBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLkNhc2VDaGFuZ2UsXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuQWxpYXMsXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuVGl0bGUsXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuUmVuYW1lZEZvbGRlcixcbiAgQnJva2VuTGlua0V2aWRlbmNlS2luZC5TYW1lTmFtZVxuXTtcblxuLyoqXG4gKiBPbmUgZmlsZSB0aGF0IGEgbWlzc2luZyBsaW5rIHRhcmdldCBtYXkgaGF2ZSBiZWNvbWUsIGFuZCB3aHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJva2VuTGlua0NhbmRpZGF0ZSB7XG4gIC8qKlxuICAgKiBFdmVyeSByZWFzb24gdGhpcyBmaWxlIGlzIGEgY2FuZGlkYXRlLCBzdHJvbmdlc3QgZmlyc3QuXG4gICAqL1xuICByZWFkb25seSBldmlkZW5jZTogcmVhZG9ubHkgQnJva2VuTGlua0V2aWRlbmNlW107XG5cbiAgLyoqXG4gICAqIFRoZSBjYW5kaWRhdGUncyB2YXVsdCBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnJva2VuTGlua0NhbmRpZGF0ZUZpbmRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJva2VuTGlua0NhbmRpZGF0ZUZpbmRlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIEVhY2ggbm90ZSdzIGBhbGlhc2VzYCwgYnkgbm90ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNlc0J5UGF0aDogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT47XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGZpbGUgaW4gdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGhzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgbmFtZXMgYSBmb2xkZXIgbm90ZSBpcyBzdG9yZWQgdW5kZXIsIHN1Y2ggYXMgYGluZGV4Lm1kYC4gU3VjaCBhIG5hbWUgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoXG4gICAqIG5vdGUgaXQgaXMsIHNvIGEgc2FtZS1uYW1lIGNhbmRpZGF0ZSBtdXN0IHNoYXJlIGl0cyBmb2xkZXIncyBuYW1lIHRvbywgYW5kIHRoZSBvbGQgbmFtZSBhbiBhbGlhcyBpc1xuICAgKiBtYXRjaGVkIGFnYWluc3QgaXMgdGhlIGZvbGRlcidzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyTm90ZUZpbGVOYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCdzIGdpdCByZW5hbWVzOiBlYWNoIG9sZCB2YXVsdCBwYXRoIHRvIHRoZSBwYXRoIGl0IHdhcyByZW5hbWVkIHRvLCBjaGFpbnMgYWxyZWFkeSBmb2xsb3dlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdFJlbmFtZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgR2l0UmVuYW1lPjtcblxuICAvKipcbiAgICogRWFjaCBub3RlJ3MgYHRpdGxlYCwgYnkgbm90ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGVzQnlQYXRoOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogT25lIHJlYXNvbiBhIGZpbGUgaXMgYSBjYW5kaWRhdGUgZm9yIGEgbWlzc2luZyBsaW5rIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcm9rZW5MaW5rRXZpZGVuY2Uge1xuICAvKipcbiAgICogQSBzZW50ZW5jZSBuYW1pbmcgdGhlIGV2aWRlbmNlLCBmb3IgdGhlIHVzZXIgdG8ganVkZ2UgaXQgYnkuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiBldmlkZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQ7XG59XG5cbi8qKlxuICogQSByZW5hbWUgcmVjb3JkZWQgaW4gdGhlIHZhdWx0J3MgZ2l0IGhpc3RvcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmVuYW1lIHtcbiAgLyoqXG4gICAqIFRoZSBhYmJyZXZpYXRlZCBoYXNoIG9mIHRoZSBjb21taXQgdGhhdCBtYWRlIHRoZSBsYXN0IHJlbmFtZSBvZiB0aGUgY2hhaW4uXG4gICAqL1xuICByZWFkb25seSBjb21taXQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggdGhlIGZpbGUgd2FzIGxhc3QgcmVuYW1lZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBhIG1pc3NpbmcgcGF0aCB0aGF0IGEgY2FuZGlkYXRlIHJlcGxhY2VkOiB3aGF0IGEgXCJmaXggYWxsIGxpa2UgdGhpc1wiIGFwcGxpZXMgdG8gZXZlcnkgb3RoZXIgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRoTWFwcGluZyB7XG4gIC8qKlxuICAgKiBUaGUgcGFydCBvZiB0aGUgY2FuZGlkYXRlIHBhdGggdGhhdCByZXBsYWNlZCB7QGxpbmsgb2xkUHJlZml4fTsgYCcnYCBmb3IgdGhlIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBuZXdQcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxlYWRpbmcgcGFydCBvZiB0aGUgbWlzc2luZyBwYXRoIHRoYXQgbm8gbG9uZ2VyIGV4aXN0czsgYCcnYCBmb3IgdGhlIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBvbGRQcmVmaXg6IHN0cmluZztcbn1cblxudHlwZSBFdmlkZW5jZUFkZGVyID0gKHBhdGg6IHN0cmluZywga2luZDogQnJva2VuTGlua0V2aWRlbmNlS2luZCwgZGVzY3JpcHRpb246IHN0cmluZykgPT4gdm9pZDtcblxuaW50ZXJmYWNlIE1pc3NpbmdTdWJ0cmVlIHtcbiAgLyoqXG4gICAqIEVhY2ggbWlzc2luZyBwYXRoIHVuZGVyIHRoZSBzdWJ0cmVlJ3Mgcm9vdCwgcmVsYXRpdmUgdG8gaXQuXG4gICAqL1xuICByZWFkb25seSByZW1haW5kZXJzOiBTZXQ8c3RyaW5nPjtcblxuICByZWFkb25seSByb290OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNhbmRpZGF0ZXMgZm9yIG1pc3NpbmcgbGluayB0YXJnZXRzLCBmcm9tIG9uZSBzbmFwc2hvdCBvZiB0aGUgdmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBCcm9rZW5MaW5rQ2FuZGlkYXRlRmluZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGlhc2VzQnlQYXRoOiBSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZEZvbGRlcnNCeUZvbGRlciA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlUGF0aFNldDogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlc0J5TG93ZXJDYXNlUGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb2xkZXJOb3RlRmlsZU5hbWVzOiBSZWFkb25seVNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFsnJ10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGdpdFJlbmFtZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgR2l0UmVuYW1lPjtcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZXNCeVBhdGg6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogSW5kZXhlcyB0aGUgdmF1bHQgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc25hcHNob3QuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCcm9rZW5MaW5rQ2FuZGlkYXRlRmluZGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFsaWFzZXNCeVBhdGggPSBwYXJhbXMuYWxpYXNlc0J5UGF0aDtcbiAgICB0aGlzLmZpbGVQYXRoU2V0ID0gbmV3IFNldChwYXJhbXMuZmlsZVBhdGhzKTtcbiAgICB0aGlzLmZvbGRlck5vdGVGaWxlTmFtZXMgPSBuZXcgU2V0KHBhcmFtcy5mb2xkZXJOb3RlRmlsZU5hbWVzKTtcbiAgICB0aGlzLmdpdFJlbmFtZXMgPSBwYXJhbXMuZ2l0UmVuYW1lcztcbiAgICB0aGlzLnRpdGxlc0J5UGF0aCA9IHBhcmFtcy50aXRsZXNCeVBhdGg7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHBhcmFtcy5maWxlUGF0aHMpIHtcbiAgICAgIGFkZFRvTXVsdGlNYXAodGhpcy5maWxlc0J5TmFtZSwgZ2V0TmFtZShmaWxlUGF0aCksIGZpbGVQYXRoKTtcbiAgICAgIGFkZFRvTXVsdGlNYXAodGhpcy5maWxlc0J5TG93ZXJDYXNlUGF0aCwgZmlsZVBhdGgudG9Mb3dlckNhc2UoKSwgZmlsZVBhdGgpO1xuXG4gICAgICBsZXQgZm9sZGVyID0gZ2V0UGFyZW50UGF0aChmaWxlUGF0aCk7XG4gICAgICB3aGlsZSAoIXRoaXMuZm9sZGVyUGF0aHMuaGFzKGZvbGRlcikpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJQYXRocy5hZGQoZm9sZGVyKTtcbiAgICAgICAgYWRkVG9NdWx0aU1hcCh0aGlzLmNoaWxkRm9sZGVyc0J5Rm9sZGVyLCBnZXRQYXJlbnRQYXRoKGZvbGRlciksIGZvbGRlcik7XG4gICAgICAgIGZvbGRlciA9IGdldFBhcmVudFBhdGgoZm9sZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNhbmRpZGF0ZXMgZm9yIGV2ZXJ5IG1pc3NpbmcgcGF0aCBhdCBvbmNlLlxuICAgKlxuICAgKiBBbGwgYXQgb25jZSBiZWNhdXNlIG9uZSBraW5kIG9mIGV2aWRlbmNlIGlzIGNvbGxlY3RpdmU6IGEgcmVuYW1lZCBmb2xkZXIgaXMgcmVjb2duaXplZCBieSBldmVyeSBtaXNzaW5nXG4gICAqIHRhcmdldCB0aGF0IHdhcyB1bmRlciBpdCB0dXJuaW5nIHVwIHRvZ2V0aGVyIHVuZGVyIG9uZSBzaWJsaW5nIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIG1pc3NpbmdQYXRocyAtIFRoZSB2YXVsdCBwYXRocyB0aGF0IGxpbmtzIGxlYWQgdG8gYW5kIG5vIGZpbGUgaG9sZHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYW5kaWRhdGVzIGZvciBlYWNoIG1pc3NpbmcgcGF0aCwgc3Ryb25nZXN0IGZpcnN0OyBhbiBlbXB0eSBsaXN0IHdoZW4gbm90aGluZyBpcyBrbm93bi5cbiAgICovXG4gIHB1YmxpYyBmaW5kQWxsKG1pc3NpbmdQYXRoczogSXRlcmFibGU8c3RyaW5nPik6IE1hcDxzdHJpbmcsIEJyb2tlbkxpbmtDYW5kaWRhdGVbXT4ge1xuICAgIGNvbnN0IHVuaXF1ZU1pc3NpbmdQYXRocyA9IG5ldyBTZXQobWlzc2luZ1BhdGhzKTtcbiAgICBjb25zdCBtaXNzaW5nU3VidHJlZXMgPSB0aGlzLmdldE1pc3NpbmdTdWJ0cmVlcyh1bmlxdWVNaXNzaW5nUGF0aHMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBCcm9rZW5MaW5rQ2FuZGlkYXRlW10+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1pc3NpbmdQYXRoIG9mIHVuaXF1ZU1pc3NpbmdQYXRocykge1xuICAgICAgY29uc3QgZXZpZGVuY2VCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgQnJva2VuTGlua0V2aWRlbmNlW10+KCk7XG4gICAgICBmdW5jdGlvbiBhZGQocGF0aDogc3RyaW5nLCBraW5kOiBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGFkZFRvTXVsdGlNYXAoZXZpZGVuY2VCeVBhdGgsIHBhdGgsIHsgZGVzY3JpcHRpb24sIGtpbmQgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkR2l0UmVuYW1lQ2FuZGlkYXRlKG1pc3NpbmdQYXRoLCBhZGQpO1xuICAgICAgdGhpcy5hZGRDYXNlQ2hhbmdlQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aCwgYWRkKTtcbiAgICAgIHRoaXMuYWRkQWxpYXNBbmRUaXRsZUNhbmRpZGF0ZXMobWlzc2luZ1BhdGgsIGFkZCk7XG4gICAgICB0aGlzLmFkZFJlbmFtZWRGb2xkZXJDYW5kaWRhdGVzKG1pc3NpbmdQYXRoLCBtaXNzaW5nU3VidHJlZXMsIGFkZCk7XG4gICAgICB0aGlzLmFkZFNhbWVOYW1lQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aCwgYWRkKTtcblxuICAgICAgcmVzdWx0LnNldChtaXNzaW5nUGF0aCwgc29ydENhbmRpZGF0ZXMoZXZpZGVuY2VCeVBhdGgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBbGlhc0FuZFRpdGxlQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aDogc3RyaW5nLCBhZGQ6IEV2aWRlbmNlQWRkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0TmFtZShtaXNzaW5nUGF0aCk7XG4gICAgY29uc3QgaXNGb2xkZXJOb3RlID0gdGhpcy5mb2xkZXJOb3RlRmlsZU5hbWVzLmhhcyhuYW1lKTtcbiAgICBsZXQgb2xkTmFtZTogc3RyaW5nO1xuXG4gICAgaWYgKGlzRm9sZGVyTm90ZSkge1xuICAgICAgb2xkTmFtZSA9IGdldE5hbWUoZ2V0UGFyZW50UGF0aChtaXNzaW5nUGF0aCkpO1xuICAgICAgaWYgKCFvbGROYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgIG9sZE5hbWUgPSBuYW1lLnNsaWNlKDAsIC0nLm1kJy5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbG93ZXJDYXNlT2xkTmFtZSA9IG9sZE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBpc0VsaWdpYmxlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gdGhpcy5maWxlUGF0aFNldC5oYXMocGF0aCkgJiYgKCFpc0ZvbGRlck5vdGUgfHwgZ2V0TmFtZShwYXRoKSA9PT0gbmFtZSk7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBhbGlhc2VzXSBvZiB0aGlzLmFsaWFzZXNCeVBhdGgpIHtcbiAgICAgIGlmIChpc0VsaWdpYmxlKHBhdGgpICYmIGFsaWFzZXMuc29tZSgoYWxpYXMpID0+IGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyQ2FzZU9sZE5hbWUpKSB7XG4gICAgICAgIGFkZChwYXRoLCBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLkFsaWFzLCBgSXRzIGFsaWFzZXMgaG9sZCB0aGUgb2xkIG5hbWUgXCIke29sZE5hbWV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgdGl0bGVdIG9mIHRoaXMudGl0bGVzQnlQYXRoKSB7XG4gICAgICBpZiAoaXNFbGlnaWJsZShwYXRoKSAmJiB0aXRsZS50b0xvd2VyQ2FzZSgpID09PSBsb3dlckNhc2VPbGROYW1lKSB7XG4gICAgICAgIGFkZChwYXRoLCBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLlRpdGxlLCBgSXRzIHRpdGxlIGlzIHRoZSBvbGQgbmFtZSBcIiR7b2xkTmFtZX1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZENhc2VDaGFuZ2VDYW5kaWRhdGVzKG1pc3NpbmdQYXRoOiBzdHJpbmcsIGFkZDogRXZpZGVuY2VBZGRlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLmZpbGVzQnlMb3dlckNhc2VQYXRoLmdldChtaXNzaW5nUGF0aC50b0xvd2VyQ2FzZSgpKSA/PyBbXSkge1xuICAgICAgYWRkKHBhdGgsIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuQ2FzZUNoYW5nZSwgJ09ubHkgdGhlIGxldHRlciBjYXNlIG9mIGl0cyBwYXRoIGRpZmZlcnMuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRHaXRSZW5hbWVDYW5kaWRhdGUobWlzc2luZ1BhdGg6IHN0cmluZywgYWRkOiBFdmlkZW5jZUFkZGVyKTogdm9pZCB7XG4gICAgY29uc3QgZ2l0UmVuYW1lID0gdGhpcy5naXRSZW5hbWVzLmdldChtaXNzaW5nUGF0aCk7XG4gICAgaWYgKGdpdFJlbmFtZSAmJiB0aGlzLmZpbGVQYXRoU2V0LmhhcyhnaXRSZW5hbWUubmV3UGF0aCkpIHtcbiAgICAgIGFkZChnaXRSZW5hbWUubmV3UGF0aCwgQnJva2VuTGlua0V2aWRlbmNlS2luZC5HaXRSZW5hbWUsIGBHaXQgaGlzdG9yeSByZWNvcmRzIHRoZSByZW5hbWUsIGluIGNvbW1pdCAke2dpdFJlbmFtZS5jb21taXR9LmApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVuYW1lZEZvbGRlckNhbmRpZGF0ZXMobWlzc2luZ1BhdGg6IHN0cmluZywgbWlzc2luZ1N1YnRyZWVzOiBSZWFkb25seU1hcDxzdHJpbmcsIE1pc3NpbmdTdWJ0cmVlPiwgYWRkOiBFdmlkZW5jZUFkZGVyKTogdm9pZCB7XG4gICAgY29uc3QgbWlzc2luZ1N1YnRyZWUgPSBtaXNzaW5nU3VidHJlZXMuZ2V0KG1pc3NpbmdQYXRoKTtcbiAgICBpZiAoIW1pc3NpbmdTdWJ0cmVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IGdldFBhcmVudFBhdGgobWlzc2luZ1N1YnRyZWUucm9vdCk7XG4gICAgY29uc3QgcmVtYWluZGVyID0gZ2V0UmVsYXRpdmVQYXRoKG1pc3NpbmdTdWJ0cmVlLnJvb3QsIG1pc3NpbmdQYXRoKTtcblxuICAgIGZvciAoY29uc3Qgc2libGluZ0ZvbGRlciBvZiB0aGlzLmNoaWxkRm9sZGVyc0J5Rm9sZGVyLmdldChwYXJlbnRQYXRoKSA/PyBbXSkge1xuICAgICAgY29uc3QgaXNTdWJ0cmVlSW50YWN0ID0gWy4uLm1pc3NpbmdTdWJ0cmVlLnJlbWFpbmRlcnNdLmV2ZXJ5KChwYXRoKSA9PiB0aGlzLmZpbGVQYXRoU2V0Lmhhcyhqb2luUGF0aChzaWJsaW5nRm9sZGVyLCBwYXRoKSkpO1xuICAgICAgaWYgKCFpc1N1YnRyZWVJbnRhY3QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVDb3VudCA9IG1pc3NpbmdTdWJ0cmVlLnJlbWFpbmRlcnMuc2l6ZTtcbiAgICAgIGFkZChcbiAgICAgICAgam9pblBhdGgoc2libGluZ0ZvbGRlciwgcmVtYWluZGVyKSxcbiAgICAgICAgQnJva2VuTGlua0V2aWRlbmNlS2luZC5SZW5hbWVkRm9sZGVyLFxuICAgICAgICBgVGhlIGZvbGRlciBcIiR7bWlzc2luZ1N1YnRyZWUucm9vdH1cIiBpcyBnb25lLCBhbmQgaXRzIHNpYmxpbmcgXCIke3NpYmxpbmdGb2xkZXJ9XCIgaG9sZHMgJHtmaWxlQ291bnQgPT09IDEgPyAndGhlIG1pc3NpbmcgZmlsZSB0aGF0IHdhcycgOiBgYWxsICR7U3RyaW5nKGZpbGVDb3VudCl9IG1pc3NpbmcgZmlsZXMgdGhhdCB3ZXJlYH0gdW5kZXIgaXQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNhbWVOYW1lQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aDogc3RyaW5nLCBhZGQ6IEV2aWRlbmNlQWRkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0TmFtZShtaXNzaW5nUGF0aCk7XG4gICAgY29uc3QgbWluU3VmZml4TGVuZ3RoID0gdGhpcy5mb2xkZXJOb3RlRmlsZU5hbWVzLmhhcyhuYW1lKSA/IEZPTERFUl9OT1RFX01JTl9TVUZGSVhfTEVOR1RIIDogMTtcbiAgICBjb25zdCBtaXNzaW5nU2VnbWVudHMgPSBtaXNzaW5nUGF0aC5zcGxpdCgnLycpO1xuICAgIGxldCBiZXN0U3VmZml4TGVuZ3RoID0gbWluU3VmZml4TGVuZ3RoO1xuICAgIGxldCBiZXN0UGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5maWxlc0J5TmFtZS5nZXQobmFtZSkgPz8gW10pIHtcbiAgICAgIGNvbnN0IHN1ZmZpeExlbmd0aCA9IGdldENvbW1vblN1ZmZpeExlbmd0aChtaXNzaW5nU2VnbWVudHMsIHBhdGguc3BsaXQoJy8nKSk7XG4gICAgICBpZiAoc3VmZml4TGVuZ3RoID4gYmVzdFN1ZmZpeExlbmd0aCkge1xuICAgICAgICBiZXN0U3VmZml4TGVuZ3RoID0gc3VmZml4TGVuZ3RoO1xuICAgICAgICBiZXN0UGF0aHMgPSBbcGF0aF07XG4gICAgICB9IGVsc2UgaWYgKHN1ZmZpeExlbmd0aCA9PT0gYmVzdFN1ZmZpeExlbmd0aCkge1xuICAgICAgICBiZXN0UGF0aHMucHVzaChwYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWZmaXggPSBtaXNzaW5nU2VnbWVudHMuc2xpY2UoLWJlc3RTdWZmaXhMZW5ndGgpLmpvaW4oJy8nKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgYmVzdFBhdGhzKSB7XG4gICAgICBhZGQocGF0aCwgQnJva2VuTGlua0V2aWRlbmNlS2luZC5TYW1lTmFtZSwgYEl0IGhhcyB0aGUgc2FtZSBuYW1lLCBcIiR7c3VmZml4fVwiLCBpbiBhbm90aGVyIGZvbGRlci5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR3JvdXBzIHRoZSBtaXNzaW5nIHBhdGhzIGJ5IHRoZSBoaWdoZXN0IG1pc3NpbmcgZm9sZGVyIGFib3ZlIGVhY2gsIHRoZSByb290IG9mIGEgc3VidHJlZSB0aGF0IG1heSBoYXZlIGJlZW5cbiAgICogcmVuYW1lZCBhcyBhIHdob2xlLlxuICAgKlxuICAgKiBAcGFyYW0gbWlzc2luZ1BhdGhzIC0gVGhlIG1pc3NpbmcgcGF0aHMuXG4gICAqIEByZXR1cm5zIEVhY2ggbWlzc2luZyBwYXRoJ3Mgc3VidHJlZTsgYSBwYXRoIHdob3NlIG93biBmb2xkZXIgZXhpc3RzIGhhcyBub25lLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNaXNzaW5nU3VidHJlZXMobWlzc2luZ1BhdGhzOiBSZWFkb25seVNldDxzdHJpbmc+KTogTWFwPHN0cmluZywgTWlzc2luZ1N1YnRyZWU+IHtcbiAgICBjb25zdCBzdWJ0cmVlc0J5Um9vdCA9IG5ldyBNYXA8c3RyaW5nLCBNaXNzaW5nU3VidHJlZT4oKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgTWlzc2luZ1N1YnRyZWU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1pc3NpbmdQYXRoIG9mIG1pc3NpbmdQYXRocykge1xuICAgICAgbGV0IHJvb3QgPSBnZXRQYXJlbnRQYXRoKG1pc3NpbmdQYXRoKTtcbiAgICAgIGlmICh0aGlzLmZvbGRlclBhdGhzLmhhcyhyb290KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCF0aGlzLmZvbGRlclBhdGhzLmhhcyhnZXRQYXJlbnRQYXRoKHJvb3QpKSkge1xuICAgICAgICByb290ID0gZ2V0UGFyZW50UGF0aChyb290KTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1pc3NpbmdTdWJ0cmVlID0gc3VidHJlZXNCeVJvb3QuZ2V0KHJvb3QpO1xuICAgICAgaWYgKCFtaXNzaW5nU3VidHJlZSkge1xuICAgICAgICBtaXNzaW5nU3VidHJlZSA9IHsgcmVtYWluZGVyczogbmV3IFNldCgpLCByb290IH07XG4gICAgICAgIHN1YnRyZWVzQnlSb290LnNldChyb290LCBtaXNzaW5nU3VidHJlZSk7XG4gICAgICB9XG5cbiAgICAgIG1pc3NpbmdTdWJ0cmVlLnJlbWFpbmRlcnMuYWRkKGdldFJlbGF0aXZlUGF0aChyb290LCBtaXNzaW5nUGF0aCkpO1xuICAgICAgcmVzdWx0LnNldChtaXNzaW5nUGF0aCwgbWlzc2luZ1N1YnRyZWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcGFyZW50IGZvbGRlciBvZiBhIHZhdWx0IHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBwYXJlbnQgZm9sZGVyOyBgJydgIGZvciB0aGUgdmF1bHQgcm9vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyAnJyA6IHBhdGguc2xpY2UoMCwgaW5kZXgpO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGEgbWlzc2luZyBwYXRoIHRoYXQgYSBjYW5kaWRhdGUgcGF0aCByZXBsYWNlZCwgZm91bmQgYnkgZHJvcHBpbmcgdGhlIHBhdGggc2VnbWVudHMgdGhleSBlbmQgd2l0aFxuICogaW4gY29tbW9uLlxuICpcbiAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIG1pc3NpbmcgcGF0aC5cbiAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIGNhbmRpZGF0ZSBwYXRoLlxuICogQHJldHVybnMgVGhlIHByZWZpeGVzIHRoYXQgZGlmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aE1hcHBpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQYXRoTWFwcGluZyB7XG4gIGNvbnN0IG9sZFNlZ21lbnRzID0gb2xkUGF0aC5zcGxpdCgnLycpO1xuICBjb25zdCBuZXdTZWdtZW50cyA9IG5ld1BhdGguc3BsaXQoJy8nKTtcbiAgY29uc3Qgc3VmZml4TGVuZ3RoID0gZ2V0Q29tbW9uU3VmZml4TGVuZ3RoKG9sZFNlZ21lbnRzLCBuZXdTZWdtZW50cyk7XG4gIHJldHVybiB7XG4gICAgbmV3UHJlZml4OiBuZXdTZWdtZW50cy5zbGljZSgwLCBuZXdTZWdtZW50cy5sZW5ndGggLSBzdWZmaXhMZW5ndGgpLmpvaW4oJy8nKSxcbiAgICBvbGRQcmVmaXg6IG9sZFNlZ21lbnRzLnNsaWNlKDAsIG9sZFNlZ21lbnRzLmxlbmd0aCAtIHN1ZmZpeExlbmd0aCkuam9pbignLycpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZFRvTXVsdGlNYXA8S2V5LCBWYWx1ZT4obWFwOiBNYXA8S2V5LCBWYWx1ZVtdPiwga2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IHZvaWQge1xuICBsZXQgdmFsdWVzID0gbWFwLmdldChrZXkpO1xuICBpZiAoIXZhbHVlcykge1xuICAgIHZhbHVlcyA9IFtdO1xuICAgIG1hcC5zZXQoa2V5LCB2YWx1ZXMpO1xuICB9XG4gIHZhbHVlcy5wdXNoKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tbW9uU3VmZml4TGVuZ3RoKHNlZ21lbnRzMTogcmVhZG9ubHkgc3RyaW5nW10sIHNlZ21lbnRzMjogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgd2hpbGUgKGxlbmd0aCA8IHNlZ21lbnRzMS5sZW5ndGggJiYgbGVuZ3RoIDwgc2VnbWVudHMyLmxlbmd0aCAmJiBzZWdtZW50czEuYXQoLWxlbmd0aCAtIDEpID09PSBzZWdtZW50czIuYXQoLWxlbmd0aCAtIDEpKSB7XG4gICAgbGVuZ3RoKys7XG4gIH1cbiAgcmV0dXJuIGxlbmd0aDtcbn1cblxuZnVuY3Rpb24gZ2V0RXZpZGVuY2VSYW5rKGV2aWRlbmNlOiBCcm9rZW5MaW5rRXZpZGVuY2UpOiBudW1iZXIge1xuICByZXR1cm4gRVZJREVOQ0VfS0lORF9PUkRFUi5pbmRleE9mKGV2aWRlbmNlLmtpbmQpO1xufVxuXG5mdW5jdGlvbiBnZXROYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xufVxuXG4vLyBUaGUgZm9sZGVyIGlzIG5ldmVyIHRoZSB2YXVsdCByb290IGhlcmU6IGEgbWlzc2luZyBzdWJ0cmVlJ3Mgcm9vdCBpcyBhIG1pc3NpbmcgZm9sZGVyLCBhbmQgaXRzIHNpYmxpbmdzIGFyZVxuLy8gZm9sZGVycyB0b28uXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVBhdGgoZm9sZGVyOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNsaWNlKGZvbGRlci5sZW5ndGggKyAxKTtcbn1cblxuZnVuY3Rpb24gam9pblBhdGgoZm9sZGVyOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtmb2xkZXJ9LyR7cGF0aH1gO1xufVxuXG5mdW5jdGlvbiBzb3J0Q2FuZGlkYXRlcyhldmlkZW5jZUJ5UGF0aDogUmVhZG9ubHlNYXA8c3RyaW5nLCBCcm9rZW5MaW5rRXZpZGVuY2VbXT4pOiBCcm9rZW5MaW5rQ2FuZGlkYXRlW10ge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLmV2aWRlbmNlQnlQYXRoXS5tYXAoKFtwYXRoLCBldmlkZW5jZV0pID0+ICh7XG4gICAgZXZpZGVuY2U6IGV2aWRlbmNlLnNvcnQoKGV2aWRlbmNlMSwgZXZpZGVuY2UyKSA9PiBnZXRFdmlkZW5jZVJhbmsoZXZpZGVuY2UxKSAtIGdldEV2aWRlbmNlUmFuayhldmlkZW5jZTIpKSxcbiAgICBwYXRoXG4gIH0pKTtcblxuICByZXR1cm4gY2FuZGlkYXRlcy5zb3J0KChjYW5kaWRhdGUxLCBjYW5kaWRhdGUyKSA9PiB7XG4gICAgY29uc3QgcmFua0RpZmZlcmVuY2UgPSBnZXRFdmlkZW5jZVJhbmsoZW5zdXJlTm9uTnVsbGFibGUoY2FuZGlkYXRlMS5ldmlkZW5jZVswXSkpIC0gZ2V0RXZpZGVuY2VSYW5rKGVuc3VyZU5vbk51bGxhYmxlKGNhbmRpZGF0ZTIuZXZpZGVuY2VbMF0pKTtcbiAgICByZXR1cm4gcmFua0RpZmZlcmVuY2UgfHwgY2FuZGlkYXRlMS5wYXRoLmxvY2FsZUNvbXBhcmUoY2FuZGlkYXRlMi5wYXRoKTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyx5QkFBeUI7QUFPM0IsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFJTCxFQUFBQSx3QkFBQSxXQUFRO0FBS1IsRUFBQUEsd0JBQUEsZ0JBQWE7QUFLYixFQUFBQSx3QkFBQSxlQUFZO0FBS1osRUFBQUEsd0JBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLHdCQUFBLGNBQVc7QUFLWCxFQUFBQSx3QkFBQSxXQUFRO0FBN0JFLFNBQUFBO0FBQUEsR0FBQTtBQW1DWixNQUFNLGdDQUFnQztBQUV0QyxNQUFNLHNCQUF5RDtBQUFBLEVBQzdEO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQTRHTyxNQUFNLDBCQUEwQjtBQUFBLEVBQ3BCO0FBQUEsRUFDQSx1QkFBdUIsb0JBQUksSUFBc0I7QUFBQSxFQUNqRDtBQUFBLEVBQ0EsdUJBQXVCLG9CQUFJLElBQXNCO0FBQUEsRUFDakQsY0FBYyxvQkFBSSxJQUFzQjtBQUFBLEVBQ3hDO0FBQUEsRUFDQSxjQUFjLG9CQUFJLElBQVksQ0FBQyxFQUFFLENBQUM7QUFBQSxFQUNsQztBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQW9EO0FBQ3JFLFNBQUssZ0JBQWdCLE9BQU87QUFDNUIsU0FBSyxjQUFjLElBQUksSUFBSSxPQUFPLFNBQVM7QUFDM0MsU0FBSyxzQkFBc0IsSUFBSSxJ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
|
|
@@ -45,7 +45,7 @@ export declare const BUG_REPORT_ISSUE_FORM_TEMPLATE = "bug_report.yml";
|
|
|
45
45
|
*/
|
|
46
46
|
export interface BugReportEnvironment {
|
|
47
47
|
/**
|
|
48
|
-
* The other
|
|
48
|
+
* The other loaded plugins, sorted by id.
|
|
49
49
|
*/
|
|
50
50
|
readonly enabledPlugins: readonly BugReportPluginInfo[];
|
|
51
51
|
/**
|
|
@@ -56,7 +56,9 @@ async function getBugReportEnvironment(params) {
|
|
|
56
56
|
const { app, pluginId } = params;
|
|
57
57
|
const { installerVersion, operatingSystem } = await getAppAndOperatingSystem();
|
|
58
58
|
return {
|
|
59
|
-
|
|
59
|
+
// The loaded plugins, as Obsidian's Show debug info lists them: `enabledPlugins` also holds an id
|
|
60
|
+
// whose folder was deleted, or whose load failed.
|
|
61
|
+
enabledPlugins: Object.keys(app.plugins.plugins).filter((id) => id !== pluginId).sort().map((id) => getPluginInfo(app, id)),
|
|
60
62
|
installerVersion,
|
|
61
63
|
obsidianVersion: apiVersion,
|
|
62
64
|
operatingSystem,
|
|
@@ -138,4 +140,4 @@ export {
|
|
|
138
140
|
getBugReportIssueFormUrl,
|
|
139
141
|
getGitHubIssueFormUrl
|
|
140
142
|
};
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWctcmVwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciBhIHBsdWdpbidzIGJ1ZyByZXBvcnRzOiB0aGUgZW52aXJvbm1lbnQgYSByZXBvcnQgbmVlZHMsIGFuZCBhIGxpbmsgdG8gYSBHaXRIdWIgaXNzdWUgZm9ybVxuICogcHJlZmlsbGVkIHdpdGggaXQuXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0tbG9hZGFibGU6IHRoZSBkZXNrdG9wIG9wZXJhdGluZy1zeXN0ZW0gbG9va3VwIHJlYWRzIGBub2RlOm9zYCwgc28gaXQgaXMgaW1wb3J0ZWRcbiAqIGR5bmFtaWNhbGx5LCBvbiBkZXNrdG9wIG9ubHkuXG4gKlxuICogVGhlIGRlc2t0b3AgaW5zdGFsbGVyIHZlcnNpb24gaXMgYFBsYXRmb3JtLmJ1aWxkYCwgd2hpY2ggbm8gcHVibGljIHR5cGluZyBkZWNsYXJlczogT2JzaWRpYW4ncyBkZXNrdG9wXG4gKiBzdGFydHVwIHNldHMgaXQgZnJvbSBFbGVjdHJvbidzIGBhcHAuZ2V0VmVyc2lvbigpYCAocmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgKSwgc28gaXQgaXMgcmVhZFxuICogc3RydWN0dXJhbGx5IGhlcmUsIGFuZCByZWFkcyBhcyBgdW5rbm93bmAgaWYgYSBsYXRlciB2ZXJzaW9uIGRyb3BzIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBhcGlWZXJzaW9uLFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE1vYmlsZUFwcEluZm8gfSBmcm9tICcuL21vYmlsZS1hcHAtaW5mby50cyc7XG5cbi8qKlxuICogVGhlIGlkcyBvZiB0aGUgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtJ3MgZmllbGRzIHRoYXQge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gcHJlZmlsbHMuIEdpdEh1YlxuICogcHJlZmlsbHMgYSBmaWVsZCBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyIG5hbWVkIGFmdGVyIHRoZSBmaWVsZCdzIGBpZGAsIHNvIGEgZm9ybSBtdXN0IGdpdmUgaXRzIGZpZWxkc1xuICogdGhlc2UgaWRzIGZvciB0aGVtIHRvIGJlIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGVudW0gQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgZW52aXJvbm1lbnQsIGFzIHtAbGluayBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudH0gcmVuZGVycyBpdC5cbiAgICovXG4gIEVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyxcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICBPYnNpZGlhblZlcnNpb24gPSAnb2JzaWRpYW4tdmVyc2lvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKi9cbiAgT3BlcmF0aW5nU3lzdGVtID0gJ29wZXJhdGluZy1zeXN0ZW0nLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbidzIHZlcnNpb24uXG4gICAqL1xuICBQbHVnaW5WZXJzaW9uID0gJ3BsdWdpbi12ZXJzaW9uJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICovXG5leHBvcnQgY29uc3QgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFID0gJ2J1Z19yZXBvcnQueW1sJztcblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBvdGhlciBlbmFibGVkIHBsdWdpbnMsIHNvcnRlZCBieSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWRQbHVnaW5zOiByZWFkb25seSBCdWdSZXBvcnRQbHVnaW5JbmZvW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgYXBwJ3MgdmVyc2lvbiwgd2hpY2ggY2FuIGxhZyBiZWhpbmQge0BsaW5rIG9ic2lkaWFuVmVyc2lvbn0uXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmFtZSBhbmQgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm06IGBBbmRyb2lkYCwgYGlPU2AsIGBtYWNPU2AsIGBXaW5kb3dzYCwgYExpbnV4YCBvciBgdW5rbm93bmAuXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogQnVnUmVwb3J0UGx1Z2luSW5mbztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiwgYXMgYSBidWcgcmVwb3J0IG5hbWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydFBsdWdpbkluZm8ge1xuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGluc3RhbGxlZCB2ZXJzaW9uLCBvciBgbnVsbGAgd2hlbiBpdHMgbWFuaWZlc3QgaXMgbm90IGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogbnVsbCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Z1JlcG9ydEVudmlyb25tZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCdWdSZXBvcnRJc3N1ZUZvcm1VcmxQYXJhbXMgZXh0ZW5kcyBHZXRCdWdSZXBvcnRFbnZpcm9ubWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgR2l0SHViIHJlcG9zaXRvcnksIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdEh1YlJlcG86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0R2l0SHViSXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRHaXRIdWJJc3N1ZUZvcm1VcmxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyB0byBwcmVmaWxsLCBrZXllZCBieSBmaWVsZCBgaWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SHViUmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSdzIGZpbGUgbmFtZSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFwcEFuZE9wZXJhdGluZ1N5c3RlbSB7XG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQbGF0Zm9ybVdpdGhCdWlsZCB7XG4gIHJlYWRvbmx5IGJ1aWxkPzogdW5rbm93bjtcbn1cblxuY29uc3QgVU5LTk9XTiA9ICd1bmtub3duJztcblxuLyoqXG4gKiBSZW5kZXJzIGEgYnVnIHJlcG9ydCdzIGVudmlyb25tZW50IGFzIGEgTWFya2Rvd24gbGlzdC5cbiAqXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgLSBUaGUgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgTWFya2Rvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudDogQnVnUmVwb3J0RW52aXJvbm1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBlbmFibGVkUGx1Z2lucyA9IGVudmlyb25tZW50LmVuYWJsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMFxuICAgID8gJ25vbmUnXG4gICAgOiBlbnZpcm9ubWVudC5lbmFibGVkUGx1Z2lucy5tYXAoKHBsdWdpbkluZm8pID0+IGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbykpLmpvaW4oJywgJyk7XG5cbiAgcmV0dXJuIGAtIFBsdWdpbjogJHtmb3JtYXRQbHVnaW5JbmZvKGVudmlyb25tZW50LnBsdWdpbil9XFxuYFxuICAgICsgYC0gT2JzaWRpYW46ICR7ZW52aXJvbm1lbnQub2JzaWRpYW5WZXJzaW9ufSAoaW5zdGFsbGVyICR7ZW52aXJvbm1lbnQuaW5zdGFsbGVyVmVyc2lvbn0pXFxuYFxuICAgICsgYC0gUGxhdGZvcm06ICR7ZW52aXJvbm1lbnQucGxhdGZvcm19XFxuYFxuICAgICsgYC0gT3BlcmF0aW5nIHN5c3RlbTogJHtlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW19XFxuYFxuICAgICsgYC0gT3RoZXIgZW5hYmxlZCBwbHVnaW5zOiAke2VuYWJsZWRQbHVnaW5zfWA7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzOiB0aGUgcGx1Z2luJ3MgdmVyc2lvbiwgdGhlIG90aGVyIGVuYWJsZWQgcGx1Z2lucywgdGhlXG4gKiBPYnNpZGlhbiBhbmQgaW5zdGFsbGVyIHZlcnNpb25zLCB0aGUgcGxhdGZvcm0gYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Z1JlcG9ydEVudmlyb25tZW50KHBhcmFtczogR2V0QnVnUmVwb3J0RW52aXJvbm1lbnRQYXJhbXMpOiBQcm9taXNlPEJ1Z1JlcG9ydEVudmlyb25tZW50PiB7XG4gIGNvbnN0IHsgYXBwLCBwbHVnaW5JZCB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGluc3RhbGxlclZlcnNpb24sIG9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgZ2V0QXBwQW5kT3BlcmF0aW5nU3lzdGVtKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkUGx1Z2luczogWy4uLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zXVxuICAgICAgLmZpbHRlcigoaWQpID0+IGlkICE9PSBwbHVnaW5JZClcbiAgICAgIC5zb3J0KClcbiAgICAgIC5tYXAoKGlkKSA9PiBnZXRQbHVnaW5JbmZvKGFwcCwgaWQpKSxcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG9ic2lkaWFuVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICBvcGVyYXRpbmdTeXN0ZW0sXG4gICAgcGxhdGZvcm06IGdldFBsYXRmb3JtTmFtZSgpLFxuICAgIHBsdWdpbjogZ2V0UGx1Z2luSW5mbyhhcHAsIHBsdWdpbklkKVxuICB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBsaW5rIHRvIGEgcGx1Z2luJ3MgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtICh7QGxpbmsgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFfSksIHByZWZpbGxlZCB3aXRoXG4gKiB0aGUgZW52aXJvbm1lbnQsIGluIHRoZSBmaWVsZHMge0BsaW5rIEJ1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWR9IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsKHBhcmFtczogR2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBhd2FpdCBnZXRCdWdSZXBvcnRFbnZpcm9ubWVudChwYXJhbXMpO1xuXG4gIHJldHVybiBnZXRHaXRIdWJJc3N1ZUZvcm1Vcmwoe1xuICAgIGZpZWxkczoge1xuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuRW52aXJvbm1lbnRdOiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudCksXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PYnNpZGlhblZlcnNpb25dOiBlbnZpcm9ubWVudC5vYnNpZGlhblZlcnNpb24sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PcGVyYXRpbmdTeXN0ZW1dOiBlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW0sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5QbHVnaW5WZXJzaW9uXTogZW52aXJvbm1lbnQucGx1Z2luLnZlcnNpb24gPz8gVU5LTk9XTlxuICAgIH0sXG4gICAgZ2l0SHViUmVwbzogcGFyYW1zLmdpdEh1YlJlcG8sXG4gICAgdGVtcGxhdGU6IEJVR19SRVBPUlRfSVNTVUVfRk9STV9URU1QTEFURSxcbiAgICAuLi5wYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCAmJiB7IHRpdGxlOiBwYXJhbXMudGl0bGUgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGluayB0aGF0IG9wZW5zIGEgR2l0SHViIGlzc3VlIGZvcm0gd2l0aCBmaWVsZHMgcHJlZmlsbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2l0SHViSXNzdWVGb3JtVXJsKHBhcmFtczogR2V0R2l0SHViSXNzdWVGb3JtVXJsUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHRlbXBsYXRlOiBwYXJhbXMudGVtcGxhdGUgfSk7XG4gIGlmIChwYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoJ3RpdGxlJywgcGFyYW1zLnRpdGxlKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2ZpZWxkSWQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMuZmllbGRzID8/IHt9KSkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoZmllbGRJZCwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtwYXJhbXMuZ2l0SHViUmVwb30vaXNzdWVzL25ldz8ke3NlYXJjaFBhcmFtcy50b1N0cmluZygpfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbzogQnVnUmVwb3J0UGx1Z2luSW5mbyk6IHN0cmluZyB7XG4gIHJldHVybiBgXFxgJHtwbHVnaW5JbmZvLmlkfVxcYCAke3BsdWdpbkluZm8udmVyc2lvbiA/PyBVTktOT1dOfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwcEFuZE9wZXJhdGluZ1N5c3RlbSgpOiBQcm9taXNlPEFwcEFuZE9wZXJhdGluZ1N5c3RlbT4ge1xuICBpZiAoUGxhdGZvcm0uaXNNb2JpbGVBcHApIHtcbiAgICBjb25zdCBtb2JpbGVBcHBJbmZvID0gYXdhaXQgZ2V0TW9iaWxlQXBwSW5mbygpO1xuICAgIHJldHVybiB7XG4gICAgICBpbnN0YWxsZXJWZXJzaW9uOiBtb2JpbGVBcHBJbmZvPy5pbnN0YWxsZXJWZXJzaW9uID8/IFVOS05PV04sXG4gICAgICBvcGVyYXRpbmdTeXN0ZW06IG1vYmlsZUFwcEluZm8/Lm9wZXJhdGluZ1N5c3RlbSA/PyBVTktOT1dOXG4gICAgfTtcbiAgfVxuXG4gIGlmICghUGxhdGZvcm0uaXNEZXNrdG9wQXBwKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVyVmVyc2lvbjogVU5LTk9XTiwgb3BlcmF0aW5nU3lzdGVtOiBVTktOT1dOIH07XG4gIH1cblxuICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBsb29rdXAsIHdoaWNoIHJlYWRzIGBub2RlOm9zYDsgdGhpcyBicmFuY2ggcnVucyBvbmx5IG9uIGRlc2t0b3AuXG4gIGNvbnN0IHsgZ2V0RGVza3RvcE9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgaW1wb3J0KCcuL2Rlc2t0b3Atb3BlcmF0aW5nLXN5c3RlbS50cycpO1xuICBjb25zdCBidWlsZCA9IChQbGF0Zm9ybSBhcyBQbGF0Zm9ybVdpdGhCdWlsZCkuYnVpbGQ7XG4gIHJldHVybiB7XG4gICAgaW5zdGFsbGVyVmVyc2lvbjogdHlwZW9mIGJ1aWxkID09PSAnc3RyaW5nJyA/IGJ1aWxkIDogVU5LTk9XTixcbiAgICBvcGVyYXRpbmdTeXN0ZW06IGdldERlc2t0b3BPcGVyYXRpbmdTeXN0ZW0oKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQbGF0Zm9ybU5hbWUoKTogc3RyaW5nIHtcbiAgaWYgKFBsYXRmb3JtLmlzQW5kcm9pZEFwcCkge1xuICAgIHJldHVybiAnQW5kcm9pZCc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzSW9zQXBwKSB7XG4gICAgcmV0dXJuICdpT1MnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc01hY09TKSB7XG4gICAgcmV0dXJuICdtYWNPUyc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzV2luKSB7XG4gICAgcmV0dXJuICdXaW5kb3dzJztcbiAgfVxuICByZXR1cm4gUGxhdGZvcm0uaXNMaW51eCA/ICdMaW51eCcgOiBVTktOT1dOO1xufVxuXG5mdW5jdGlvbiBnZXRQbHVnaW5JbmZvKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogQnVnUmVwb3J0UGx1Z2luSW5mbyB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHBsdWdpbklkLFxuICAgIHZlcnNpb246IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb24gPz8gbnVsbFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsd0JBQXdCO0FBTzFCLElBQUssNEJBQUwsa0JBQUtBLCtCQUFMO0FBSUwsRUFBQUEsMkJBQUEsaUJBQWM7QUFLZCxFQUFBQSwyQkFBQSxxQkFBa0I7QUFLbEIsRUFBQUEsMkJBQUEscUJBQWtCO0FBS2xCLEVBQUFBLDJCQUFBLG1CQUFnQjtBQW5CTixTQUFBQTtBQUFBLEdBQUE7QUF5QkwsTUFBTSxpQ0FBaUM7QUFvSDlDLE1BQU0sVUFBVTtBQVFULFNBQVMsMkJBQTJCLGFBQTJDO0FBQ3BGLFFBQU0saUJBQWlCLFlBQVksZUFBZSxXQUFXLElBQ3pELFNBQ0EsWUFBWSxlQUFlLElBQUksQ0FBQyxlQUFlLGlCQUFpQixVQUFVLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFMUYsU0FBTyxhQUFhLGlCQUFpQixZQUFZLE1BQU0sQ0FBQztBQUFBLGNBQ3JDLFlBQVksZUFBZSxlQUFlLFlBQVksZ0JBQWdCO0FBQUEsY0FDdEUsWUFBWSxRQUFRO0FBQUEsc0JBQ1osWUFBWSxlQUFlO0FBQUEsMkJBQ3RCLGNBQWM7QUFDaEQ7QUFTQSxlQUFzQix3QkFBd0IsUUFBc0U7QUFDbEgsUUFBTSxFQUFFLEtBQUssU0FBUyxJQUFJO0FBQzFCLFFBQU0sRUFBRSxrQkFBa0IsZ0JBQWdCLElBQUksTUFBTSx5QkFBeUI7QUFFN0UsU0FBTztBQUFBLElBQ0wsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLFFBQVEsY0FBYyxFQUMzQyxPQUFPLENBQUMsT0FBTyxPQUFPLFFBQVEsRUFDOUIsS0FBSyxFQUNMLElBQUksQ0FBQyxPQUFPLGNBQWMsS0FBSyxFQUFFLENBQUM7QUFBQSxJQUNyQztBQUFBLElBQ0EsaUJBQWlCO0FBQUEsSUFDakI7QUFBQSxJQUNBLFVBQVUsZ0JBQWdCO0FBQUEsSUFDMUIsUUFBUSxjQUFjLEtBQUssUUFBUTtBQUFBLEVBQ3JDO0FBQ0Y7QUFTQSxlQUFzQix5QkFBeUIsUUFBeUQ7QUFDdEcsUUFBTSxjQUFjLE1BQU0sd0JBQXdCLE1BQU07QUFFeEQsU0FBTyxzQkFBc0I7QUFBQSxJQUMzQixRQUFRO0FBQUEsTUFDTixDQUFDLCtCQUFxQyxHQUFHLDJCQUEyQixXQUFXO0FBQUEsTUFDL0UsQ0FBQyx3Q0FBeUMsR0FBRyxZQUFZO0FBQUEsTUFDekQsQ0FBQyx3Q0FBeUMsR0FBRyxZQUFZO0FBQUEsTUFDekQsQ0FBQyxvQ0FBdUMsR0FBRyxZQUFZLE9BQU8sV0FBVztBQUFBLElBQzNFO0FBQUEsSUFDQSxZQUFZLE9BQU87QUFBQSxJQUNuQixVQUFVO0FBQUEsSUFDVixHQUFHLE9BQU8sVUFBVSxVQUFhLEVBQUUsT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6RCxDQUFDO0FBQ0g7QUFRTyxTQUFTLHNCQUFzQixRQUE2QztBQUNqRixRQUFNLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxVQUFVLE9BQU8sU0FBUyxDQUFDO0FBQ3RFLE1BQUksT0FBTyxVQUFVLFFBQVc7QUFDOUIsaUJBQWEsSUFBSSxTQUFTLE9BQU8sS0FBSztBQUFBLEVBQ3hDO0FBRUEsYUFBVyxDQUFDLFNBQVMsS0FBSyxLQUFLLE9BQU8sUUFBUSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEdBQUc7QUFDbEUsaUJBQWEsSUFBSSxTQUFTLEtBQUs7QUFBQSxFQUNqQztBQUVBLFNBQU8sc0JBQXNCLE9BQU8sVUFBVSxlQUFlLGFBQWEsU0FBUyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxpQkFBaUIsWUFBeUM7QUFDakUsU0FBTyxLQUFLLFdBQVcsRUFBRSxNQUFNLFdBQVcsV0FBVyxPQUFPO0FBQzlEO0FBRUEsZUFBZSwyQkFBMkQ7QUFDeEUsTUFBSSxTQUFTLGFBQWE7QUFDeEIsVUFBTSxnQkFBZ0IsTUFBTSxpQkFBaUI7QUFDN0MsV0FBTztBQUFBLE1BQ0wsa0JBQWtCLGVBQWUsb0JBQW9CO0FBQUEsTUFDckQsaUJBQWlCLGVBQWUsbUJBQW1CO0FBQUEsSUFDckQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLFNBQVMsY0FBYztBQUMxQixXQUFPLEVBQUUsa0JBQWtCLFNBQVMsaUJBQWlCLFFBQVE7QUFBQSxFQUMvRDtBQUdBLFFBQU0sRUFBRSwwQkFBMEIsSUFBSSxNQUFNLE9BQU8sK0JBQStCO0FBQ2xGLFFBQU0sUUFBUyxTQUErQjtBQUM5QyxTQUFPO0FBQUEsSUFDTCxrQkFBa0IsT0FBTyxVQUFVLFdBQVcsUUFBUTtBQUFBLElBQ3RELGlCQUFpQiwwQkFBMEI7QUFBQSxFQUM3QztBQUNGO0FBRUEsU0FBUyxrQkFBMEI7QUFDakMsTUFBSSxTQUFTLGNBQWM7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFNBQVMsVUFBVTtBQUNyQixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksU0FBUyxTQUFTO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLE9BQU87QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLFNBQVMsVUFBVSxVQUFVO0FBQ3RDO0FBRUEsU0FBUyxjQUFjLEtBQVUsVUFBdUM7QUFDdEUsU0FBTztBQUFBLElBQ0wsSUFBSTtBQUFBLElBQ0osU0FBUyxJQUFJLFFBQVEsVUFBVSxRQUFRLEdBQUcsV0FBVztBQUFBLEVBQ3ZEO0FBQ0Y7IiwibmFtZXMiOlsiQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCJdfQ==
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWctcmVwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciBhIHBsdWdpbidzIGJ1ZyByZXBvcnRzOiB0aGUgZW52aXJvbm1lbnQgYSByZXBvcnQgbmVlZHMsIGFuZCBhIGxpbmsgdG8gYSBHaXRIdWIgaXNzdWUgZm9ybVxuICogcHJlZmlsbGVkIHdpdGggaXQuXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0tbG9hZGFibGU6IHRoZSBkZXNrdG9wIG9wZXJhdGluZy1zeXN0ZW0gbG9va3VwIHJlYWRzIGBub2RlOm9zYCwgc28gaXQgaXMgaW1wb3J0ZWRcbiAqIGR5bmFtaWNhbGx5LCBvbiBkZXNrdG9wIG9ubHkuXG4gKlxuICogVGhlIGRlc2t0b3AgaW5zdGFsbGVyIHZlcnNpb24gaXMgYFBsYXRmb3JtLmJ1aWxkYCwgd2hpY2ggbm8gcHVibGljIHR5cGluZyBkZWNsYXJlczogT2JzaWRpYW4ncyBkZXNrdG9wXG4gKiBzdGFydHVwIHNldHMgaXQgZnJvbSBFbGVjdHJvbidzIGBhcHAuZ2V0VmVyc2lvbigpYCAocmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgKSwgc28gaXQgaXMgcmVhZFxuICogc3RydWN0dXJhbGx5IGhlcmUsIGFuZCByZWFkcyBhcyBgdW5rbm93bmAgaWYgYSBsYXRlciB2ZXJzaW9uIGRyb3BzIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBhcGlWZXJzaW9uLFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE1vYmlsZUFwcEluZm8gfSBmcm9tICcuL21vYmlsZS1hcHAtaW5mby50cyc7XG5cbi8qKlxuICogVGhlIGlkcyBvZiB0aGUgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtJ3MgZmllbGRzIHRoYXQge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gcHJlZmlsbHMuIEdpdEh1YlxuICogcHJlZmlsbHMgYSBmaWVsZCBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyIG5hbWVkIGFmdGVyIHRoZSBmaWVsZCdzIGBpZGAsIHNvIGEgZm9ybSBtdXN0IGdpdmUgaXRzIGZpZWxkc1xuICogdGhlc2UgaWRzIGZvciB0aGVtIHRvIGJlIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGVudW0gQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgZW52aXJvbm1lbnQsIGFzIHtAbGluayBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudH0gcmVuZGVycyBpdC5cbiAgICovXG4gIEVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyxcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICBPYnNpZGlhblZlcnNpb24gPSAnb2JzaWRpYW4tdmVyc2lvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKi9cbiAgT3BlcmF0aW5nU3lzdGVtID0gJ29wZXJhdGluZy1zeXN0ZW0nLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbidzIHZlcnNpb24uXG4gICAqL1xuICBQbHVnaW5WZXJzaW9uID0gJ3BsdWdpbi12ZXJzaW9uJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICovXG5leHBvcnQgY29uc3QgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFID0gJ2J1Z19yZXBvcnQueW1sJztcblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBvdGhlciBsb2FkZWQgcGx1Z2lucywgc29ydGVkIGJ5IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZFBsdWdpbnM6IHJlYWRvbmx5IEJ1Z1JlcG9ydFBsdWdpbkluZm9bXTtcblxuICAvKipcbiAgICogVGhlIGluc3RhbGxlZCBhcHAncyB2ZXJzaW9uLCB3aGljaCBjYW4gbGFnIGJlaGluZCB7QGxpbmsgb2JzaWRpYW5WZXJzaW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBuYW1lIGFuZCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF0Zm9ybTogYEFuZHJvaWRgLCBgaU9TYCwgYG1hY09TYCwgYFdpbmRvd3NgLCBgTGludXhgIG9yIGB1bmtub3duYC5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBCdWdSZXBvcnRQbHVnaW5JbmZvO1xufVxuXG4vKipcbiAqIEEgcGx1Z2luLCBhcyBhIGJ1ZyByZXBvcnQgbmFtZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVnUmVwb3J0UGx1Z2luSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgaW5zdGFsbGVkIHZlcnNpb24sIG9yIGBudWxsYCB3aGVuIGl0cyBtYW5pZmVzdCBpcyBub3Qga25vd24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCdWdSZXBvcnRFbnZpcm9ubWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QnVnUmVwb3J0RW52aXJvbm1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHJlcG9ydGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCdWdSZXBvcnRJc3N1ZUZvcm1Vcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybFBhcmFtcyBleHRlbmRzIEdldEJ1Z1JlcG9ydEVudmlyb25tZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4ncyBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SHViUmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaXNzdWUncyB0aXRsZS4gTGVhdmUgaXQgb3V0IHRvIGtlZXAgdGhlIGZvcm0ncyBvd24gZGVmYXVsdCB0aXRsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRHaXRIdWJJc3N1ZUZvcm1Vcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEdpdEh1Yklzc3VlRm9ybVVybFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWVzIHRvIHByZWZpbGwsIGtleWVkIGJ5IGZpZWxkIGBpZGAuXG4gICAqL1xuICByZWFkb25seSBmaWVsZHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiByZXBvc2l0b3J5LCBhcyBgb3duZXIvbmFtZWAuXG4gICAqL1xuICByZWFkb25seSBnaXRIdWJSZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtJ3MgZmlsZSBuYW1lLCB1bmRlciBgLmdpdGh1Yi9JU1NVRV9URU1QTEFURWAuXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaXNzdWUncyB0aXRsZS4gTGVhdmUgaXQgb3V0IHRvIGtlZXAgdGhlIGZvcm0ncyBvd24gZGVmYXVsdCB0aXRsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwQW5kT3BlcmF0aW5nU3lzdGVtIHtcbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBvcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsYXRmb3JtV2l0aEJ1aWxkIHtcbiAgcmVhZG9ubHkgYnVpbGQ/OiB1bmtub3duO1xufVxuXG5jb25zdCBVTktOT1dOID0gJ3Vua25vd24nO1xuXG4vKipcbiAqIFJlbmRlcnMgYSBidWcgcmVwb3J0J3MgZW52aXJvbm1lbnQgYXMgYSBNYXJrZG93biBsaXN0LlxuICpcbiAqIEBwYXJhbSBlbnZpcm9ubWVudCAtIFRoZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIFRoZSBNYXJrZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ1Z1JlcG9ydEVudmlyb25tZW50KGVudmlyb25tZW50OiBCdWdSZXBvcnRFbnZpcm9ubWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IGVuYWJsZWRQbHVnaW5zID0gZW52aXJvbm1lbnQuZW5hYmxlZFBsdWdpbnMubGVuZ3RoID09PSAwXG4gICAgPyAnbm9uZSdcbiAgICA6IGVudmlyb25tZW50LmVuYWJsZWRQbHVnaW5zLm1hcCgocGx1Z2luSW5mbykgPT4gZm9ybWF0UGx1Z2luSW5mbyhwbHVnaW5JbmZvKSkuam9pbignLCAnKTtcblxuICByZXR1cm4gYC0gUGx1Z2luOiAke2Zvcm1hdFBsdWdpbkluZm8oZW52aXJvbm1lbnQucGx1Z2luKX1cXG5gXG4gICAgKyBgLSBPYnNpZGlhbjogJHtlbnZpcm9ubWVudC5vYnNpZGlhblZlcnNpb259IChpbnN0YWxsZXIgJHtlbnZpcm9ubWVudC5pbnN0YWxsZXJWZXJzaW9ufSlcXG5gXG4gICAgKyBgLSBQbGF0Zm9ybTogJHtlbnZpcm9ubWVudC5wbGF0Zm9ybX1cXG5gXG4gICAgKyBgLSBPcGVyYXRpbmcgc3lzdGVtOiAke2Vudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbX1cXG5gXG4gICAgKyBgLSBPdGhlciBlbmFibGVkIHBsdWdpbnM6ICR7ZW5hYmxlZFBsdWdpbnN9YDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBlbnZpcm9ubWVudCBhIGJ1ZyByZXBvcnQgbmVlZHM6IHRoZSBwbHVnaW4ncyB2ZXJzaW9uLCB0aGUgb3RoZXIgZW5hYmxlZCBwbHVnaW5zLCB0aGVcbiAqIE9ic2lkaWFuIGFuZCBpbnN0YWxsZXIgdmVyc2lvbnMsIHRoZSBwbGF0Zm9ybSBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnQocGFyYW1zOiBHZXRCdWdSZXBvcnRFbnZpcm9ubWVudFBhcmFtcyk6IFByb21pc2U8QnVnUmVwb3J0RW52aXJvbm1lbnQ+IHtcbiAgY29uc3QgeyBhcHAsIHBsdWdpbklkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgaW5zdGFsbGVyVmVyc2lvbiwgb3BlcmF0aW5nU3lzdGVtIH0gPSBhd2FpdCBnZXRBcHBBbmRPcGVyYXRpbmdTeXN0ZW0oKTtcblxuICByZXR1cm4ge1xuICAgIC8vIFRoZSBsb2FkZWQgcGx1Z2lucywgYXMgT2JzaWRpYW4ncyBTaG93IGRlYnVnIGluZm8gbGlzdHMgdGhlbTogYGVuYWJsZWRQbHVnaW5zYCBhbHNvIGhvbGRzIGFuIGlkXG4gICAgLy8gd2hvc2UgZm9sZGVyIHdhcyBkZWxldGVkLCBvciB3aG9zZSBsb2FkIGZhaWxlZC5cbiAgICBlbmFibGVkUGx1Z2luczogT2JqZWN0LmtleXMoYXBwLnBsdWdpbnMucGx1Z2lucylcbiAgICAgIC5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gcGx1Z2luSWQpXG4gICAgICAuc29ydCgpXG4gICAgICAubWFwKChpZCkgPT4gZ2V0UGx1Z2luSW5mbyhhcHAsIGlkKSksXG4gICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICBvYnNpZGlhblZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgb3BlcmF0aW5nU3lzdGVtLFxuICAgIHBsYXRmb3JtOiBnZXRQbGF0Zm9ybU5hbWUoKSxcbiAgICBwbHVnaW46IGdldFBsdWdpbkluZm8oYXBwLCBwbHVnaW5JZClcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGluayB0byBhIHBsdWdpbidzIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSAoe0BsaW5rIEJVR19SRVBPUlRfSVNTVUVfRk9STV9URU1QTEFURX0pLCBwcmVmaWxsZWQgd2l0aFxuICogdGhlIGVudmlyb25tZW50LCBpbiB0aGUgZmllbGRzIHtAbGluayBCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkfSBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgbGluay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybChwYXJhbXM6IEdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gYXdhaXQgZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnQocGFyYW1zKTtcblxuICByZXR1cm4gZ2V0R2l0SHViSXNzdWVGb3JtVXJsKHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIFtCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkLkVudmlyb25tZW50XTogZm9ybWF0QnVnUmVwb3J0RW52aXJvbm1lbnQoZW52aXJvbm1lbnQpLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuT2JzaWRpYW5WZXJzaW9uXTogZW52aXJvbm1lbnQub2JzaWRpYW5WZXJzaW9uLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuT3BlcmF0aW5nU3lzdGVtXTogZW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuUGx1Z2luVmVyc2lvbl06IGVudmlyb25tZW50LnBsdWdpbi52ZXJzaW9uID8/IFVOS05PV05cbiAgICB9LFxuICAgIGdpdEh1YlJlcG86IHBhcmFtcy5naXRIdWJSZXBvLFxuICAgIHRlbXBsYXRlOiBCVUdfUkVQT1JUX0lTU1VFX0ZPUk1fVEVNUExBVEUsXG4gICAgLi4ucGFyYW1zLnRpdGxlICE9PSB1bmRlZmluZWQgJiYgeyB0aXRsZTogcGFyYW1zLnRpdGxlIH1cbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyBhIGxpbmsgdGhhdCBvcGVucyBhIEdpdEh1YiBpc3N1ZSBmb3JtIHdpdGggZmllbGRzIHByZWZpbGxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdpdEh1Yklzc3VlRm9ybVVybChwYXJhbXM6IEdldEdpdEh1Yklzc3VlRm9ybVVybFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB0ZW1wbGF0ZTogcGFyYW1zLnRlbXBsYXRlIH0pO1xuICBpZiAocGFyYW1zLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZWFyY2hQYXJhbXMuc2V0KCd0aXRsZScsIHBhcmFtcy50aXRsZSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtmaWVsZElkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zLmZpZWxkcyA/PyB7fSkpIHtcbiAgICBzZWFyY2hQYXJhbXMuc2V0KGZpZWxkSWQsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tLyR7cGFyYW1zLmdpdEh1YlJlcG99L2lzc3Vlcy9uZXc/JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQbHVnaW5JbmZvKHBsdWdpbkluZm86IEJ1Z1JlcG9ydFBsdWdpbkluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYFxcYCR7cGx1Z2luSW5mby5pZH1cXGAgJHtwbHVnaW5JbmZvLnZlcnNpb24gPz8gVU5LTk9XTn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBBbmRPcGVyYXRpbmdTeXN0ZW0oKTogUHJvbWlzZTxBcHBBbmRPcGVyYXRpbmdTeXN0ZW0+IHtcbiAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlQXBwKSB7XG4gICAgY29uc3QgbW9iaWxlQXBwSW5mbyA9IGF3YWl0IGdldE1vYmlsZUFwcEluZm8oKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogbW9iaWxlQXBwSW5mbz8uaW5zdGFsbGVyVmVyc2lvbiA/PyBVTktOT1dOLFxuICAgICAgb3BlcmF0aW5nU3lzdGVtOiBtb2JpbGVBcHBJbmZvPy5vcGVyYXRpbmdTeXN0ZW0gPz8gVU5LTk9XTlxuICAgIH07XG4gIH1cblxuICBpZiAoIVBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgIHJldHVybiB7IGluc3RhbGxlclZlcnNpb246IFVOS05PV04sIG9wZXJhdGluZ1N5c3RlbTogVU5LTk9XTiB9O1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uYWwgaW1wb3J0IG9mIHRoZSBkZXNrdG9wLW9ubHkgbG9va3VwLCB3aGljaCByZWFkcyBgbm9kZTpvc2A7IHRoaXMgYnJhbmNoIHJ1bnMgb25seSBvbiBkZXNrdG9wLlxuICBjb25zdCB7IGdldERlc2t0b3BPcGVyYXRpbmdTeXN0ZW0gfSA9IGF3YWl0IGltcG9ydCgnLi9kZXNrdG9wLW9wZXJhdGluZy1zeXN0ZW0udHMnKTtcbiAgY29uc3QgYnVpbGQgPSAoUGxhdGZvcm0gYXMgUGxhdGZvcm1XaXRoQnVpbGQpLmJ1aWxkO1xuICByZXR1cm4ge1xuICAgIGluc3RhbGxlclZlcnNpb246IHR5cGVvZiBidWlsZCA9PT0gJ3N0cmluZycgPyBidWlsZCA6IFVOS05PV04sXG4gICAgb3BlcmF0aW5nU3lzdGVtOiBnZXREZXNrdG9wT3BlcmF0aW5nU3lzdGVtKClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UGxhdGZvcm1OYW1lKCk6IHN0cmluZyB7XG4gIGlmIChQbGF0Zm9ybS5pc0FuZHJvaWRBcHApIHtcbiAgICByZXR1cm4gJ0FuZHJvaWQnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc0lvc0FwcCkge1xuICAgIHJldHVybiAnaU9TJztcbiAgfVxuICBpZiAoUGxhdGZvcm0uaXNNYWNPUykge1xuICAgIHJldHVybiAnbWFjT1MnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc1dpbikge1xuICAgIHJldHVybiAnV2luZG93cyc7XG4gIH1cbiAgcmV0dXJuIFBsYXRmb3JtLmlzTGludXggPyAnTGludXgnIDogVU5LTk9XTjtcbn1cblxuZnVuY3Rpb24gZ2V0UGx1Z2luSW5mbyhhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyk6IEJ1Z1JlcG9ydFBsdWdpbkluZm8ge1xuICByZXR1cm4ge1xuICAgIGlkOiBwbHVnaW5JZCxcbiAgICB2ZXJzaW9uOiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy52ZXJzaW9uID8/IG51bGxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHdCQUF3QjtBQU8xQixJQUFLLDRCQUFMLGtCQUFL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UUFBTSxRQUFTLFNBQStCO0FBQzlDLFNBQU87QUFBQSxJQUNMLGtCQUFrQixPQUFPLFVBQVUsV0FBVyxRQUFRO0FBQUEsSUFDdEQsaUJBQWlCLDBCQUEwQjtBQUFBLEVBQzdDO0FBQ0Y7QUFFQSxTQUFTLGtCQUEwQjtBQUNqQyxNQUFJLFNBQVMsY0FBYztBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksU0FBUyxVQUFVO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLFNBQVM7QUFDcEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFNBQVMsT0FBTztBQUNsQixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sU0FBUyxVQUFVLFVBQVU7QUFDdEM7QUFFQSxTQUFTLGNBQWMsS0FBVSxVQUF1QztBQUN0RSxTQUFPO0FBQUEsSUFDTCxJQUFJO0FBQUEsSUFDSixTQUFTLElBQUksUUFBUSxVQUFVLFFBQVEsR0FBRyxXQUFXO0FBQUEsRUFDdkQ7QUFDRjsiLCJuYW1lcyI6WyJCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkIl19
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
/**
|
|
4
|
+
* @file
|
|
5
|
+
*
|
|
6
|
+
* Carries focus and plugin state from a code block to its next render.
|
|
7
|
+
*
|
|
8
|
+
* Obsidian renders a code block again whenever its source text changes: Reading view re-renders the section and Live
|
|
9
|
+
* Preview replaces the widget. So a block that edits its own source (a counter, a checkbox, a settings form) loses the
|
|
10
|
+
* element the user was interacting with, its focus and whatever the plugin kept on it. The element itself cannot be
|
|
11
|
+
* kept without patching Obsidian's renderers, so the write records a handoff instead, and the processor rendering the
|
|
12
|
+
* new source claims it: it gets back the state the write passed and can put the focus back on the same element.
|
|
13
|
+
*
|
|
14
|
+
* The handoff is matched by source path, language and the new block content, and it lives for
|
|
15
|
+
* {@link CODE_BLOCK_RENDER_HANDOFF_LIFETIME_IN_MILLISECONDS}. The first render to claim it consumes it, so when the
|
|
16
|
+
* note is open in two panes only one of the new renders gets it.
|
|
17
|
+
*/
|
|
18
|
+
import type { MarkdownPostProcessorContext } from 'obsidian';
|
|
19
|
+
/**
|
|
20
|
+
* How long a recorded handoff waits for the render that claims it.
|
|
21
|
+
*/
|
|
22
|
+
export declare const CODE_BLOCK_RENDER_HANDOFF_LIFETIME_IN_MILLISECONDS = 10000;
|
|
23
|
+
/**
|
|
24
|
+
* Options for {@link claimCodeBlockRenderHandoff}.
|
|
25
|
+
*/
|
|
26
|
+
export interface ClaimCodeBlockRenderHandoffParams {
|
|
27
|
+
/**
|
|
28
|
+
* The {@link MarkdownPostProcessorContext} the processor received.
|
|
29
|
+
*/
|
|
30
|
+
readonly context: MarkdownPostProcessorContext;
|
|
31
|
+
/**
|
|
32
|
+
* The element the processor renders into.
|
|
33
|
+
*/
|
|
34
|
+
readonly el: HTMLElement;
|
|
35
|
+
/**
|
|
36
|
+
* The source the processor received.
|
|
37
|
+
*/
|
|
38
|
+
readonly source: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Where the focus was inside a rendered code block.
|
|
42
|
+
*/
|
|
43
|
+
export interface CodeBlockFocusSnapshot {
|
|
44
|
+
/**
|
|
45
|
+
* The child indices leading from the code block element to the focused element.
|
|
46
|
+
*/
|
|
47
|
+
readonly childIndexPath: readonly number[];
|
|
48
|
+
/**
|
|
49
|
+
* The text selection of a focused input or text area.
|
|
50
|
+
*/
|
|
51
|
+
readonly selection: null | TextSelection;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A handoff claimed by the render of a code block whose source a write just changed.
|
|
55
|
+
*/
|
|
56
|
+
export interface CodeBlockRenderHandoff {
|
|
57
|
+
/**
|
|
58
|
+
* Whether the write recorded a focused element to restore.
|
|
59
|
+
*/
|
|
60
|
+
readonly hasFocus: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Puts the focus back on the element at the same position inside the new render, with the same text selection.
|
|
63
|
+
*
|
|
64
|
+
* Call it once the processor has rendered the block. It waits for the element to be attached to a document.
|
|
65
|
+
*
|
|
66
|
+
* @returns Whether an element was focused.
|
|
67
|
+
*/
|
|
68
|
+
readonly restoreFocus: () => Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* The state passed to the write, or `undefined` when none was.
|
|
71
|
+
*/
|
|
72
|
+
readonly state: unknown;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Options for {@link recordCodeBlockRenderHandoff}.
|
|
76
|
+
*/
|
|
77
|
+
export interface RecordCodeBlockRenderHandoffParams {
|
|
78
|
+
/**
|
|
79
|
+
* The focus captured from the old render with {@link captureCodeBlockFocus}.
|
|
80
|
+
*/
|
|
81
|
+
readonly focus: CodeBlockFocusSnapshot | null;
|
|
82
|
+
/**
|
|
83
|
+
* The code block written to the note, fences included.
|
|
84
|
+
*/
|
|
85
|
+
readonly newCodeBlock: string;
|
|
86
|
+
/**
|
|
87
|
+
* The path of the note the code block is in.
|
|
88
|
+
*/
|
|
89
|
+
readonly sourcePath: string;
|
|
90
|
+
/**
|
|
91
|
+
* The state to pass to the next render.
|
|
92
|
+
*/
|
|
93
|
+
readonly state: unknown;
|
|
94
|
+
}
|
|
95
|
+
interface TextSelection {
|
|
96
|
+
readonly direction: 'backward' | 'forward' | 'none';
|
|
97
|
+
readonly end: number;
|
|
98
|
+
readonly start: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Captures where the focus is inside a rendered code block.
|
|
102
|
+
*
|
|
103
|
+
* @param el - The code block element.
|
|
104
|
+
* @returns The snapshot, or `null` when the focus is not inside the element.
|
|
105
|
+
*/
|
|
106
|
+
export declare function captureCodeBlockFocus(el: HTMLElement): CodeBlockFocusSnapshot | null;
|
|
107
|
+
/**
|
|
108
|
+
* Claims the handoff a write recorded for the code block being rendered.
|
|
109
|
+
*
|
|
110
|
+
* Call it from a code block processor. It returns `null` when no write is waiting for this render.
|
|
111
|
+
*
|
|
112
|
+
* @param params - The parameters for the function.
|
|
113
|
+
* @returns The handoff, or `null`.
|
|
114
|
+
*/
|
|
115
|
+
export declare function claimCodeBlockRenderHandoff(params: ClaimCodeBlockRenderHandoffParams): CodeBlockRenderHandoff | null;
|
|
116
|
+
/**
|
|
117
|
+
* Records a handoff for the next render of a code block a write is about to change.
|
|
118
|
+
*
|
|
119
|
+
* @param params - The parameters for the function.
|
|
120
|
+
* @returns Whether a handoff was recorded: `false` when the new text is not exactly one code block.
|
|
121
|
+
*/
|
|
122
|
+
export declare function recordCodeBlockRenderHandoff(params: RecordCodeBlockRenderHandoffParams): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Puts the focus back on the element a {@link CodeBlockFocusSnapshot} describes.
|
|
125
|
+
*
|
|
126
|
+
* @param el - The new code block element.
|
|
127
|
+
* @param focus - The snapshot captured from the old render.
|
|
128
|
+
* @returns Whether an element was focused.
|
|
129
|
+
*/
|
|
130
|
+
export declare function restoreCodeBlockFocus(el: HTMLElement, focus: CodeBlockFocusSnapshot): Promise<boolean>;
|
|
131
|
+
export {};
|