@mnaoumov/obsidian-lib 10.5.1 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/codemirror/inline-token-widgets/package.json +6 -0
  2. package/codemirror/settings-facet/package.json +6 -0
  3. package/components/settings-facet-component/package.json +6 -0
  4. package/dist/lib/cjs/__merged.cjs +96 -1
  5. package/dist/lib/cjs/__merged.d.cts +17 -0
  6. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  7. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  8. package/dist/lib/cjs/bug-report.cjs +4 -2
  9. package/dist/lib/cjs/bug-report.d.cts +1 -1
  10. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  11. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  12. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  13. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  14. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  15. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  16. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  17. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  18. package/dist/lib/cjs/components/index.cjs +4 -1
  19. package/dist/lib/cjs/components/index.d.cts +1 -0
  20. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  21. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  22. package/dist/lib/cjs/css-class.cjs +8 -1
  23. package/dist/lib/cjs/css-class.d.cts +28 -0
  24. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  25. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  26. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  27. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  28. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  29. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  30. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  31. package/dist/lib/cjs/hotkey.cjs +185 -0
  32. package/dist/lib/cjs/hotkey.d.cts +59 -0
  33. package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
  34. package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
  35. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
  36. package/dist/lib/cjs/index.cjs +31 -1
  37. package/dist/lib/cjs/index.d.cts +10 -0
  38. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  39. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  40. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  41. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  42. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  43. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  44. package/dist/lib/cjs/markdown.cjs +6 -1
  45. package/dist/lib/cjs/markdown.d.cts +10 -1
  46. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  47. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  48. package/dist/lib/cjs/request-url.cjs +523 -0
  49. package/dist/lib/cjs/request-url.d.cts +233 -0
  50. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  51. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  52. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  53. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  54. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  55. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  56. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  57. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  58. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  59. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  60. package/dist/lib/cjs/setting-ex.cjs +51 -1
  61. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  62. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  63. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  64. package/dist/lib/esm/__merged.d.mts +17 -0
  65. package/dist/lib/esm/__merged.mjs +99 -1
  66. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  67. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  68. package/dist/lib/esm/bug-report.d.mts +1 -1
  69. package/dist/lib/esm/bug-report.mjs +4 -2
  70. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  71. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  72. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  73. package/dist/lib/esm/codemirror/index.mjs +5 -1
  74. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  75. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  76. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  77. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  78. package/dist/lib/esm/components/index.d.mts +1 -0
  79. package/dist/lib/esm/components/index.mjs +3 -1
  80. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  81. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  82. package/dist/lib/esm/css-class.d.mts +28 -0
  83. package/dist/lib/esm/css-class.mjs +8 -1
  84. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  85. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  86. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  87. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  88. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  89. package/dist/lib/esm/editor-suggest.mjs +109 -0
  90. package/dist/lib/esm/generated-during-build.mjs +2 -2
  91. package/dist/lib/esm/hotkey.d.mts +59 -0
  92. package/dist/lib/esm/hotkey.mjs +95 -0
  93. package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
  94. package/dist/lib/esm/i18n/locales/en.mjs +13 -1
  95. package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
  96. package/dist/lib/esm/index.d.mts +10 -0
  97. package/dist/lib/esm/index.mjs +21 -1
  98. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  99. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  100. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  101. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  102. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  103. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  104. package/dist/lib/esm/markdown.d.mts +10 -1
  105. package/dist/lib/esm/markdown.mjs +9 -1
  106. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  107. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  108. package/dist/lib/esm/request-url.d.mts +233 -0
  109. package/dist/lib/esm/request-url.mjs +428 -0
  110. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  111. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  112. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  113. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  114. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  115. package/dist/lib/esm/setting-components/index.mjs +9 -1
  116. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  117. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  118. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  119. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  120. package/dist/lib/esm/setting-ex.d.mts +35 -1
  121. package/dist/lib/esm/setting-ex.mjs +51 -1
  122. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  123. package/dist/lib/esm/settings-tabs.mjs +170 -0
  124. package/dist/styles.css +83 -1
  125. package/package.json +1 -1
  126. package/setting-components/folder-list-component/package.json +6 -0
  127. package/setting-components/hotkey-component/package.json +6 -0
  128. package/setting-components/list-component/package.json +6 -0
  129. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,219 @@
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 {
34
+ invokeAsyncSafely,
35
+ sleep
36
+ } from "@mnaoumov/typescript-lib/async";
37
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
38
+ import { setIcon } from "obsidian";
39
+ import { CssClass } from "./css-class.mjs";
40
+ const FLASH_DURATION_IN_MILLISECONDS = 3e3;
41
+ const FOLD_ICON = "right-triangle";
42
+ const HEADING_TAG_NAMES = /* @__PURE__ */ new Set(["H1", "H2", "H3", "H4", "H5", "H6"]);
43
+ function isOwnedByRenderedMarkdown(element, rootEl) {
44
+ let current = element;
45
+ while (current) {
46
+ if (current === rootEl) {
47
+ return true;
48
+ }
49
+ if (current.hasClass("markdown-preview-view") || current.hasClass("bases-view")) {
50
+ return false;
51
+ }
52
+ current = current.parentElement;
53
+ }
54
+ return false;
55
+ }
56
+ function registerFoldHandlers(params) {
57
+ const {
58
+ el,
59
+ shouldFoldHeadings = true,
60
+ shouldFoldLists = true
61
+ } = params;
62
+ el.addClass(CssClass.LibraryName, CssClass.FoldableMarkdown);
63
+ if (shouldFoldHeadings) {
64
+ for (const block of getBlocks(el)) {
65
+ const headingEl = getBlockHeading(block);
66
+ if (headingEl && !headingEl.querySelector(":scope > .heading-collapse-indicator")) {
67
+ addIndicator(headingEl, "heading-collapse-indicator");
68
+ }
69
+ }
70
+ }
71
+ if (shouldFoldLists) {
72
+ for (const listItemEl of el.findAll("li")) {
73
+ if (isOwnedByRenderedMarkdown(listItemEl, el) && listItemEl.querySelector(":scope > ul, :scope > ol") && !listItemEl.querySelector(":scope > .list-collapse-indicator")) {
74
+ addIndicator(listItemEl, "list-collapse-indicator");
75
+ }
76
+ }
77
+ }
78
+ if (registeredFoldEls.has(el)) {
79
+ return;
80
+ }
81
+ registeredFoldEls.add(el);
82
+ el.on("click", ".heading-collapse-indicator", (clickEvent, indicatorEl) => {
83
+ handleIndicatorClick(clickEvent, indicatorEl, el, (headingEl) => {
84
+ if (!isHeading(headingEl)) {
85
+ return;
86
+ }
87
+ toggleCollapsed(headingEl, !headingEl.hasClass("is-collapsed"));
88
+ updateFoldedBlocks(el);
89
+ el.win.getSelection()?.removeAllRanges();
90
+ });
91
+ });
92
+ el.on("click", "li > .list-collapse-indicator", (clickEvent, indicatorEl) => {
93
+ handleIndicatorClick(clickEvent, indicatorEl, el, (listItemEl) => {
94
+ toggleCollapsed(listItemEl, !listItemEl.hasClass("is-collapsed"));
95
+ });
96
+ });
97
+ }
98
+ function registerFootnoteLinkHandler(params) {
99
+ const { el } = params;
100
+ el.on("click", "a.footnote-link", (clickEvent, linkEl) => {
101
+ if (clickEvent.button !== 0 || !isOwnedByRenderedMarkdown(linkEl, el)) {
102
+ return;
103
+ }
104
+ clickEvent.preventDefault();
105
+ const href = linkEl.getAttr("href");
106
+ if (!href?.startsWith("#")) {
107
+ return;
108
+ }
109
+ const footnoteId = href.slice(1);
110
+ const targetEl = el.findAll("[data-footnote-id]").find((candidateEl) => candidateEl.getAttr("data-footnote-id") === footnoteId);
111
+ if (!targetEl) {
112
+ return;
113
+ }
114
+ unfoldAncestors(targetEl, el);
115
+ targetEl.scrollIntoView({ block: "center" });
116
+ flash(targetEl, el);
117
+ });
118
+ }
119
+ const registeredFoldEls = /* @__PURE__ */ new WeakSet();
120
+ function addIndicator(parentEl, cls) {
121
+ const indicatorEl = parentEl.createSpan({
122
+ cls: [cls, "collapse-indicator", "collapse-icon"],
123
+ prepend: true
124
+ });
125
+ setIcon(indicatorEl, FOLD_ICON);
126
+ }
127
+ function flash(targetEl, rootEl) {
128
+ for (const flashingEl of rootEl.findAll(".is-flashing")) {
129
+ flashingEl.removeClass("is-flashing");
130
+ }
131
+ targetEl.addClass("is-flashing");
132
+ invokeAsyncSafely(async () => {
133
+ await sleep({ milliseconds: FLASH_DURATION_IN_MILLISECONDS });
134
+ targetEl.removeClass("is-flashing");
135
+ });
136
+ }
137
+ function getBlockHeading(block) {
138
+ if (isHeading(block)) {
139
+ return block;
140
+ }
141
+ const firstChild = block.firstElementChild;
142
+ return firstChild && isHeading(firstChild) ? firstChild : null;
143
+ }
144
+ function getBlockHeadingLevel(block) {
145
+ const headingEl = getBlockHeading(block);
146
+ return headingEl ? getHeadingLevel(headingEl) : null;
147
+ }
148
+ function getBlocks(rootEl) {
149
+ return rootEl.findAll(":scope > *");
150
+ }
151
+ function getHeadingLevel(headingEl) {
152
+ return Number(headingEl.tagName.slice(1));
153
+ }
154
+ function handleIndicatorClick(clickEvent, indicatorEl, rootEl, toggle) {
155
+ if (clickEvent.button !== 0 || clickEvent.defaultPrevented || !isOwnedByRenderedMarkdown(indicatorEl, rootEl)) {
156
+ return;
157
+ }
158
+ clickEvent.preventDefault();
159
+ toggle(ensureNonNullable(indicatorEl.parentElement));
160
+ }
161
+ function isHeading(element) {
162
+ return HEADING_TAG_NAMES.has(element.tagName);
163
+ }
164
+ function toggleCollapsed(parentEl, isCollapsed) {
165
+ parentEl.toggleClass("is-collapsed", isCollapsed);
166
+ parentEl.querySelector(":scope > .collapse-icon")?.toggleClass("is-collapsed", isCollapsed);
167
+ }
168
+ function unfoldAncestors(targetEl, rootEl) {
169
+ let targetBlock = targetEl;
170
+ for (; ; ) {
171
+ if (targetBlock.tagName === "LI" && targetBlock.hasClass("is-collapsed")) {
172
+ toggleCollapsed(targetBlock, false);
173
+ }
174
+ const parentEl = ensureNonNullable(targetBlock.parentElement);
175
+ if (parentEl === rootEl) {
176
+ break;
177
+ }
178
+ targetBlock = parentEl;
179
+ }
180
+ const blocks = getBlocks(rootEl);
181
+ let level = getBlockHeadingLevel(targetBlock) ?? Infinity;
182
+ let hasUnfolded = false;
183
+ for (let index = blocks.indexOf(targetBlock) - 1; index >= 0; index--) {
184
+ const headingEl = getBlockHeading(ensureNonNullable(blocks[index]));
185
+ if (!headingEl || getHeadingLevel(headingEl) >= level) {
186
+ continue;
187
+ }
188
+ level = getHeadingLevel(headingEl);
189
+ if (!headingEl.hasClass("is-collapsed")) {
190
+ continue;
191
+ }
192
+ toggleCollapsed(headingEl, false);
193
+ hasUnfolded = true;
194
+ }
195
+ if (hasUnfolded) {
196
+ updateFoldedBlocks(rootEl);
197
+ }
198
+ }
199
+ function updateFoldedBlocks(rootEl) {
200
+ let foldedLevel = null;
201
+ for (const block of getBlocks(rootEl)) {
202
+ const headingEl = getBlockHeading(block);
203
+ const headingLevel = headingEl ? getHeadingLevel(headingEl) : null;
204
+ if (foldedLevel !== null && headingLevel !== null && headingLevel <= foldedLevel) {
205
+ foldedLevel = null;
206
+ }
207
+ const isShown = foldedLevel === null;
208
+ block.toggle(isShown);
209
+ if (isShown && headingEl?.hasClass("is-collapsed")) {
210
+ foldedLevel = headingLevel;
211
+ }
212
+ }
213
+ }
214
+ export {
215
+ isOwnedByRenderedMarkdown,
216
+ registerFoldHandlers,
217
+ registerFootnoteLinkHandler
218
+ };
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZW5kZXJlZC1tYXJrZG93bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBhcnRzIG9mIGEgUmVhZGluZyB2aWV3J3MgYmVoYXZpb3IgdGhhdCBPYnNpZGlhbiBrZWVwcyBpbnNpZGUgaXRzIHByZXZpZXcgcmVuZGVyZXIsIHBvcnRlZCBmb3JcbiAqIG1hcmtkb3duIHJlbmRlcmVkIGFueXdoZXJlIGVsc2Ugd2l0aCBgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJgLlxuICpcbiAqIGBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c2AgY292ZXJzIGludGVybmFsIGFuZCBleHRlcm5hbCBsaW5rcywgdGFncywgZHJhZ3MsIGNvbnRleHRcbiAqIG1lbnVzIGFuZCB0aGUgZm9vdG5vdGUgSE9WRVIuIFRocmVlIHRoaW5ncyBpdCBkb2VzIG5vdCBjb3ZlciwgcmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgOiB0aGUgZm9vdG5vdGVcbiAqIENMSUNLIChgb25Gb290bm90ZUxpbmtDbGlja2ApLCBhbmQgdGhlIGhlYWRpbmcgYW5kIGxpc3QgRk9MRElORywgd2hvc2UgaW5kaWNhdG9ycyB0aGUgcmVuZGVyZXIgb25seSBhZGRzXG4gKiBpbiBpdHMgb3duIGBvblJlbmRlcmAgYW5kIHdob3NlIGNsaWNrcyBvbmx5IGl0IGhhbmRsZXMuIFdpdGhvdXQgdGhlc2UsIGEgZm9vdG5vdGUgY2xpY2sgaW4gc3RhbmRhbG9uZVxuICogcmVuZGVyZWQgbWFya2Rvd24gZmFsbHMgdGhyb3VnaCB0byB0aGUgYnJvd3NlcidzIGhhc2ggbmF2aWdhdGlvbiwgYW5kIG5vdGhpbmcgY2FuIGJlIGZvbGRlZC5cbiAqL1xuXG5pbXBvcnQge1xuICBpbnZva2VBc3luY1NhZmVseSxcbiAgc2xlZXBcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHNldEljb24gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi9jc3MtY2xhc3MudHMnO1xuXG4vKipcbiAqIEhvdyBsb25nIGEgZm9vdG5vdGUncyB0YXJnZXQgc3RheXMgaGlnaGxpZ2h0ZWQgYWZ0ZXIgYSBjbGljayB0b29rIGl0IHRoZXJlLCBhcyBpbiBPYnNpZGlhbidzIG93blxuICogYGhpZ2hsaWdodEVsYC5cbiAqL1xuY29uc3QgRkxBU0hfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gMzAwMDtcblxuY29uc3QgRk9MRF9JQ09OID0gJ3JpZ2h0LXRyaWFuZ2xlJztcblxuY29uc3QgSEVBRElOR19UQUdfTkFNRVMgPSBuZXcgU2V0KFsnSDEnLCAnSDInLCAnSDMnLCAnSDQnLCAnSDUnLCAnSDYnXSk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRm9sZEhhbmRsZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZvbGRIYW5kbGVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBtYXJrZG93biB3YXMgcmVuZGVyZWQgaW50bywgdGhlIG9uZSBgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJgIHdhcyBoYW5kZWQuIEl0cyBkaXJlY3RcbiAgICogY2hpbGRyZW4gYXJlIHRoZSByZW5kZXJlZCBibG9ja3MgYSBmb2xkZWQgaGVhZGluZyBoaWRlcy5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogV2hldGhlciBoZWFkaW5ncyBjYW4gYmUgZm9sZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvbGRIZWFkaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgbGlzdCBpdGVtcyB3aXRoIGEgbmVzdGVkIGxpc3QgY2FuIGJlIGZvbGRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb2xkTGlzdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlckZvb3Rub3RlTGlua0hhbmRsZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyRm9vdG5vdGVMaW5rSGFuZGxlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBtYXJrZG93biB3YXMgcmVuZGVyZWQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGVsZW1lbnQgYmVsb25ncyB0byB0aGUgbWFya2Rvd24gcmVuZGVyZWQgaW50byBgcm9vdEVsYCwgcmF0aGVyIHRoYW4gdG8gYSBSZWFkaW5nIHZpZXcgb3IgYVxuICogQmFzZXMgdmlldyBuZXN0ZWQgaW5zaWRlIGl0IChhbiBlbWJlZCksIHdoaWNoIGhhbmRsZXMgaXRzIG93biBldmVudHMuIEEgcG9ydCBvZiBPYnNpZGlhbidzIHN0YXRpY1xuICogYE1hcmtkb3duUHJldmlld1JlbmRlcmVyLmJlbG9uZ3NUb01lYCwgd2hpY2ggYG9ic2lkaWFuLXR5cGluZ3NgIGRvZXMgbm90IGRlY2xhcmUuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCBhbiBldmVudCBsYW5kZWQgb24uXG4gKiBAcGFyYW0gcm9vdEVsIC0gVGhlIGVsZW1lbnQgbWFya2Rvd24gd2FzIHJlbmRlcmVkIGludG8uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGByb290RWxgIGl0c2VsZiBvciBzaXRzIGluc2lkZSBpdCB3aXRoIG5vIG5lc3RlZCB2aWV3IGluIGJldHdlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc093bmVkQnlSZW5kZXJlZE1hcmtkb3duKGVsZW1lbnQ6IEVsZW1lbnQsIHJvb3RFbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgbGV0IGN1cnJlbnQ6IEVsZW1lbnQgfCBudWxsID0gZWxlbWVudDtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gcm9vdEVsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQuaGFzQ2xhc3MoJ21hcmtkb3duLXByZXZpZXctdmlldycpIHx8IGN1cnJlbnQuaGFzQ2xhc3MoJ2Jhc2VzLXZpZXcnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNYWtlcyB0aGUgaGVhZGluZ3MgYW5kIHRoZSBuZXN0ZWQgbGlzdHMgb2YgcmVuZGVyZWQgbWFya2Rvd24gZm9sZGFibGUsIHRoZSB3YXkgdGhleSBhcmUgaW4gYSBSZWFkaW5nXG4gKiB2aWV3OiBpdCBhZGRzIE9ic2lkaWFuJ3Mgb3duIGNvbGxhcHNlIGluZGljYXRvcnMgYW5kIGhhbmRsZXMgdGhlaXIgY2xpY2tzLlxuICpcbiAqIEEgZm9sZGVkIGhlYWRpbmcgaGlkZXMgZXZlcnkgYmxvY2sgYWZ0ZXIgaXQgdXAgdG8gdGhlIG5leHQgaGVhZGluZyBvZiB0aGUgc2FtZSBvciBhIGhpZ2hlciBsZXZlbDtcbiAqIHVuZm9sZGluZyBpdCBzaG93cyB0aGVtIGFnYWluLCBleGNlcHQgdGhvc2UgYSBmb2xkZWQgaGVhZGluZyBhbW9uZyB0aGVtIHN0aWxsIGhpZGVzLiBBIGZvbGRlZCBsaXN0XG4gKiBpdGVtIGhpZGVzIGl0cyBuZXN0ZWQgbGlzdHMuIENhbGwgaXQgYWdhaW4gYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgcmUtcmVuZGVyZWQ6IGJsb2NrcyB0aGF0IGFscmVhZHkgaGF2ZVxuICogYW4gaW5kaWNhdG9yIGFyZSBsZWZ0IGFsb25lLCBhbmQgdGhlIGNsaWNrIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBvbmx5IG9uY2UgcGVyIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJGb2xkSGFuZGxlcnMocGFyYW1zOiBSZWdpc3RlckZvbGRIYW5kbGVyc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgZWwsXG4gICAgc2hvdWxkRm9sZEhlYWRpbmdzID0gdHJ1ZSxcbiAgICBzaG91bGRGb2xkTGlzdHMgPSB0cnVlXG4gIH0gPSBwYXJhbXM7XG5cbiAgZWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLkZvbGRhYmxlTWFya2Rvd24pO1xuXG4gIGlmIChzaG91bGRGb2xkSGVhZGluZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGdldEJsb2NrcyhlbCkpIHtcbiAgICAgIGNvbnN0IGhlYWRpbmdFbCA9IGdldEJsb2NrSGVhZGluZyhibG9jayk7XG4gICAgICBpZiAoaGVhZGluZ0VsICYmICFoZWFkaW5nRWwucXVlcnlTZWxlY3RvcignOnNjb3BlID4gLmhlYWRpbmctY29sbGFwc2UtaW5kaWNhdG9yJykpIHtcbiAgICAgICAgYWRkSW5kaWNhdG9yKGhlYWRpbmdFbCwgJ2hlYWRpbmctY29sbGFwc2UtaW5kaWNhdG9yJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZEZvbGRMaXN0cykge1xuICAgIGZvciAoY29uc3QgbGlzdEl0ZW1FbCBvZiBlbC5maW5kQWxsKCdsaScpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzT3duZWRCeVJlbmRlcmVkTWFya2Rvd24obGlzdEl0ZW1FbCwgZWwpXG4gICAgICAgICYmIGxpc3RJdGVtRWwucXVlcnlTZWxlY3RvcignOnNjb3BlID4gdWwsIDpzY29wZSA+IG9sJylcbiAgICAgICAgJiYgIWxpc3RJdGVtRWwucXVlcnlTZWxlY3RvcignOnNjb3BlID4gLmxpc3QtY29sbGFwc2UtaW5kaWNhdG9yJylcbiAgICAgICkge1xuICAgICAgICBhZGRJbmRpY2F0b3IobGlzdEl0ZW1FbCwgJ2xpc3QtY29sbGFwc2UtaW5kaWNhdG9yJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlZ2lzdGVyZWRGb2xkRWxzLmhhcyhlbCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVnaXN0ZXJlZEZvbGRFbHMuYWRkKGVsKTtcblxuICBlbC5vbignY2xpY2snLCAnLmhlYWRpbmctY29sbGFwc2UtaW5kaWNhdG9yJywgKGNsaWNrRXZlbnQsIGluZGljYXRvckVsKSA9PiB7XG4gICAgaGFuZGxlSW5kaWNhdG9yQ2xpY2soY2xpY2tFdmVudCwgaW5kaWNhdG9yRWwsIGVsLCAoaGVhZGluZ0VsKSA9PiB7XG4gICAgICBpZiAoIWlzSGVhZGluZyhoZWFkaW5nRWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRvZ2dsZUNvbGxhcHNlZChoZWFkaW5nRWwsICFoZWFkaW5nRWwuaGFzQ2xhc3MoJ2lzLWNvbGxhcHNlZCcpKTtcbiAgICAgIHVwZGF0ZUZvbGRlZEJsb2NrcyhlbCk7XG4gICAgICBlbC53aW4uZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH0pO1xuICB9KTtcblxuICBlbC5vbignY2xpY2snLCAnbGkgPiAubGlzdC1jb2xsYXBzZS1pbmRpY2F0b3InLCAoY2xpY2tFdmVudCwgaW5kaWNhdG9yRWwpID0+IHtcbiAgICBoYW5kbGVJbmRpY2F0b3JDbGljayhjbGlja0V2ZW50LCBpbmRpY2F0b3JFbCwgZWwsIChsaXN0SXRlbUVsKSA9PiB7XG4gICAgICB0b2dnbGVDb2xsYXBzZWQobGlzdEl0ZW1FbCwgIWxpc3RJdGVtRWwuaGFzQ2xhc3MoJ2lzLWNvbGxhcHNlZCcpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogTWFrZXMgYSBmb290bm90ZSBsaW5rIGluIHJlbmRlcmVkIG1hcmtkb3duIGFjdCBhcyBpdCBkb2VzIGluIGEgUmVhZGluZyB2aWV3OiBhIGNsaWNrIHNjcm9sbHMgdG8gdGhlXG4gKiBmb290bm90ZSwgb3IgYmFjayB0byBpdHMgcmVmZXJlbmNlLCBhbmQgZmxhc2hlcyBpdCwgaW5zdGVhZCBvZiBuYXZpZ2F0aW5nIHRvIHRoZSBsaW5rJ3MgYCNgIGhhc2guXG4gKlxuICogUmVnaXN0ZXJlZCBieSBgcmVnaXN0ZXJMaW5rSGFuZGxlcnNgLCB3aGljaCBpcyB0aGUgdXN1YWwgd2F5IGluOyBjYWxsIGl0IGRpcmVjdGx5IG9ubHkgZm9yIGFuIGVsZW1lbnRcbiAqIHdob3NlIG90aGVyIGxpbmtzIGFyZSBoYW5kbGVkIHNvbWUgb3RoZXIgd2F5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRm9vdG5vdGVMaW5rSGFuZGxlcihwYXJhbXM6IFJlZ2lzdGVyRm9vdG5vdGVMaW5rSGFuZGxlclBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGVsIH0gPSBwYXJhbXM7XG4gIGVsLm9uKCdjbGljaycsICdhLmZvb3Rub3RlLWxpbmsnLCAoY2xpY2tFdmVudCwgbGlua0VsKSA9PiB7XG4gICAgaWYgKGNsaWNrRXZlbnQuYnV0dG9uICE9PSAwIHx8ICFpc093bmVkQnlSZW5kZXJlZE1hcmtkb3duKGxpbmtFbCwgZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNsaWNrRXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGhyZWYgPSBsaW5rRWwuZ2V0QXR0cignaHJlZicpO1xuICAgIGlmICghaHJlZj8uc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZvb3Rub3RlSWQgPSBocmVmLnNsaWNlKDEpO1xuICAgIGNvbnN0IHRhcmdldEVsID0gZWwuZmluZEFsbCgnW2RhdGEtZm9vdG5vdGUtaWRdJykuZmluZCgoY2FuZGlkYXRlRWwpID0+IGNhbmRpZGF0ZUVsLmdldEF0dHIoJ2RhdGEtZm9vdG5vdGUtaWQnKSA9PT0gZm9vdG5vdGVJZCk7XG4gICAgaWYgKCF0YXJnZXRFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVuZm9sZEFuY2VzdG9ycyh0YXJnZXRFbCwgZWwpO1xuICAgIHRhcmdldEVsLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgIGZsYXNoKHRhcmdldEVsLCBlbCk7XG4gIH0pO1xufVxuXG5jb25zdCByZWdpc3RlcmVkRm9sZEVscyA9IG5ldyBXZWFrU2V0PEhUTUxFbGVtZW50PigpO1xuXG5mdW5jdGlvbiBhZGRJbmRpY2F0b3IocGFyZW50RWw6IEhUTUxFbGVtZW50LCBjbHM6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBpbmRpY2F0b3JFbCA9IHBhcmVudEVsLmNyZWF0ZVNwYW4oe1xuICAgIGNsczogW2NscywgJ2NvbGxhcHNlLWluZGljYXRvcicsICdjb2xsYXBzZS1pY29uJ10sXG4gICAgcHJlcGVuZDogdHJ1ZVxuICB9KTtcbiAgc2V0SWNvbihpbmRpY2F0b3JFbCwgRk9MRF9JQ09OKTtcbn1cblxuZnVuY3Rpb24gZmxhc2godGFyZ2V0RWw6IEhUTUxFbGVtZW50LCByb290RWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gIGZvciAoY29uc3QgZmxhc2hpbmdFbCBvZiByb290RWwuZmluZEFsbCgnLmlzLWZsYXNoaW5nJykpIHtcbiAgICBmbGFzaGluZ0VsLnJlbW92ZUNsYXNzKCdpcy1mbGFzaGluZycpO1xuICB9XG4gIHRhcmdldEVsLmFkZENsYXNzKCdpcy1mbGFzaGluZycpO1xuICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2xlZXAoeyBtaWxsaXNlY29uZHM6IEZMQVNIX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICB0YXJnZXRFbC5yZW1vdmVDbGFzcygnaXMtZmxhc2hpbmcnKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEJsb2NrSGVhZGluZyhibG9jazogRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gIGlmIChpc0hlYWRpbmcoYmxvY2spKSB7XG4gICAgcmV0dXJuIGJsb2NrO1xuICB9XG4gIGNvbnN0IGZpcnN0Q2hpbGQgPSBibG9jay5maXJzdEVsZW1lbnRDaGlsZDtcbiAgcmV0dXJuIGZpcnN0Q2hpbGQgJiYgaXNIZWFkaW5nKGZpcnN0Q2hpbGQpID8gZmlyc3RDaGlsZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEJsb2NrSGVhZGluZ0xldmVsKGJsb2NrOiBFbGVtZW50KTogbnVsbCB8IG51bWJlciB7XG4gIGNvbnN0IGhlYWRpbmdFbCA9IGdldEJsb2NrSGVhZGluZyhibG9jayk7XG4gIHJldHVybiBoZWFkaW5nRWwgPyBnZXRIZWFkaW5nTGV2ZWwoaGVhZGluZ0VsKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEJsb2Nrcyhyb290RWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRbXSB7XG4gIHJldHVybiByb290RWwuZmluZEFsbCgnOnNjb3BlID4gKicpO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkaW5nTGV2ZWwoaGVhZGluZ0VsOiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIoaGVhZGluZ0VsLnRhZ05hbWUuc2xpY2UoMSkpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVJbmRpY2F0b3JDbGljayhcbiAgY2xpY2tFdmVudDogTW91c2VFdmVudCxcbiAgaW5kaWNhdG9yRWw6IEhUTUxFbGVtZW50LFxuICByb290RWw6IEhUTUxFbGVtZW50LFxuICB0b2dnbGU6IChwYXJlbnRFbDogRWxlbWVudCkgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGlmIChjbGlja0V2ZW50LmJ1dHRvbiAhPT0gMCB8fCBjbGlja0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWlzT3duZWRCeVJlbmRlcmVkTWFya2Rvd24oaW5kaWNhdG9yRWwsIHJvb3RFbCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY2xpY2tFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBUaGUgZGVsZWdhdGVkIGNsaWNrIG1hdGNoZWQgdGhlIGluZGljYXRvciBpbnNpZGUgYHJvb3RFbGAsIHNvIGl0IGhhcyBhIHBhcmVudC5cbiAgdG9nZ2xlKGVuc3VyZU5vbk51bGxhYmxlKGluZGljYXRvckVsLnBhcmVudEVsZW1lbnQpKTtcbn1cblxuZnVuY3Rpb24gaXNIZWFkaW5nKGVsZW1lbnQ6IEVsZW1lbnQpOiBlbGVtZW50IGlzIEhUTUxFbGVtZW50IHtcbiAgcmV0dXJuIEhFQURJTkdfVEFHX05BTUVTLmhhcyhlbGVtZW50LnRhZ05hbWUpO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVDb2xsYXBzZWQocGFyZW50RWw6IEVsZW1lbnQsIGlzQ29sbGFwc2VkOiBib29sZWFuKTogdm9pZCB7XG4gIHBhcmVudEVsLnRvZ2dsZUNsYXNzKCdpcy1jb2xsYXBzZWQnLCBpc0NvbGxhcHNlZCk7XG4gIHBhcmVudEVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgPiAuY29sbGFwc2UtaWNvbicpPy50b2dnbGVDbGFzcygnaXMtY29sbGFwc2VkJywgaXNDb2xsYXBzZWQpO1xufVxuXG4vKipcbiAqIFVuZm9sZHMgd2hhdGV2ZXIgaGlkZXMgYHRhcmdldEVsYDogZXZlcnkgZm9sZGVkIGxpc3QgaXRlbSBhcm91bmQgaXQsIGFuZCBldmVyeSBmb2xkZWQgaGVhZGluZyBpdCBzaXRzXG4gKiB1bmRlciwgc28gYSBmb290bm90ZSBjbGljayBuZXZlciBzY3JvbGxzIHRvIGFuIGVsZW1lbnQgbm9ib2R5IGNhbiBzZWUuXG4gKlxuICogQHBhcmFtIHRhcmdldEVsIC0gVGhlIGVsZW1lbnQgdG8gcmV2ZWFsLlxuICogQHBhcmFtIHJvb3RFbCAtIFRoZSBlbGVtZW50IG1hcmtkb3duIHdhcyByZW5kZXJlZCBpbnRvLlxuICovXG5mdW5jdGlvbiB1bmZvbGRBbmNlc3RvcnModGFyZ2V0RWw6IEhUTUxFbGVtZW50LCByb290RWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gIGxldCB0YXJnZXRCbG9jazogRWxlbWVudCA9IHRhcmdldEVsO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKHRhcmdldEJsb2NrLnRhZ05hbWUgPT09ICdMSScgJiYgdGFyZ2V0QmxvY2suaGFzQ2xhc3MoJ2lzLWNvbGxhcHNlZCcpKSB7XG4gICAgICB0b2dnbGVDb2xsYXBzZWQodGFyZ2V0QmxvY2ssIGZhbHNlKTtcbiAgICB9XG4gICAgLy8gYHRhcmdldEVsYCB3YXMgZm91bmQgaW5zaWRlIGByb290RWxgLCBzbyB0aGUgd2FsayByZWFjaGVzIGl0IGJlZm9yZSBydW5uaW5nIG91dCBvZiBwYXJlbnRzLlxuICAgIGNvbnN0IHBhcmVudEVsID0gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0QmxvY2sucGFyZW50RWxlbWVudCk7XG4gICAgaWYgKHBhcmVudEVsID09PSByb290RWwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0YXJnZXRCbG9jayA9IHBhcmVudEVsO1xuICB9XG5cbiAgLy8gVGhlIGhlYWRpbmdzIGEgYmxvY2sgc2l0cyB1bmRlciBhcmUgdGhlIG5lYXJlc3QgZWFybGllciBoZWFkaW5nIG9mIGVhY2ggc3RyaWN0bHkgbG93ZXIgbGV2ZWwuXG4gIGNvbnN0IGJsb2NrczogRWxlbWVudFtdID0gZ2V0QmxvY2tzKHJvb3RFbCk7XG4gIGxldCBsZXZlbCA9IGdldEJsb2NrSGVhZGluZ0xldmVsKHRhcmdldEJsb2NrKSA/PyBJbmZpbml0eTtcbiAgbGV0IGhhc1VuZm9sZGVkID0gZmFsc2U7XG4gIGZvciAobGV0IGluZGV4ID0gYmxvY2tzLmluZGV4T2YodGFyZ2V0QmxvY2spIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgIGNvbnN0IGhlYWRpbmdFbCA9IGdldEJsb2NrSGVhZGluZyhlbnN1cmVOb25OdWxsYWJsZShibG9ja3NbaW5kZXhdKSk7XG4gICAgaWYgKCFoZWFkaW5nRWwgfHwgZ2V0SGVhZGluZ0xldmVsKGhlYWRpbmdFbCkgPj0gbGV2ZWwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXZlbCA9IGdldEhlYWRpbmdMZXZlbChoZWFkaW5nRWwpO1xuICAgIGlmICghaGVhZGluZ0VsLmhhc0NsYXNzKCdpcy1jb2xsYXBzZWQnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdG9nZ2xlQ29sbGFwc2VkKGhlYWRpbmdFbCwgZmFsc2UpO1xuICAgIGhhc1VuZm9sZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChoYXNVbmZvbGRlZCkge1xuICAgIHVwZGF0ZUZvbGRlZEJsb2Nrcyhyb290RWwpO1xuICB9XG59XG5cbi8qKlxuICogU2hvd3Mgb3IgaGlkZXMgZXZlcnkgYmxvY2sgb2YgYHJvb3RFbGAgYWZ0ZXIgdGhlIGZvbGRlZCBoZWFkaW5ncywgc28gYSBibG9jayBpcyBoaWRkZW4gZXhhY3RseSB3aGVuIGFcbiAqIGZvbGRlZCBoZWFkaW5nIGFib3ZlIGl0IGhhcyBubyBoZWFkaW5nIG9mIHRoZSBzYW1lIG9yIGEgaGlnaGVyIGxldmVsIGluIGJldHdlZW4uXG4gKlxuICogQHBhcmFtIHJvb3RFbCAtIFRoZSBlbGVtZW50IG1hcmtkb3duIHdhcyByZW5kZXJlZCBpbnRvLlxuICovXG5mdW5jdGlvbiB1cGRhdGVGb2xkZWRCbG9ja3Mocm9vdEVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBsZXQgZm9sZGVkTGV2ZWw6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBmb3IgKGNvbnN0IGJsb2NrIG9mIGdldEJsb2Nrcyhyb290RWwpKSB7XG4gICAgY29uc3QgaGVhZGluZ0VsID0gZ2V0QmxvY2tIZWFkaW5nKGJsb2NrKTtcbiAgICBjb25zdCBoZWFkaW5nTGV2ZWwgPSBoZWFkaW5nRWwgPyBnZXRIZWFkaW5nTGV2ZWwoaGVhZGluZ0VsKSA6IG51bGw7XG4gICAgaWYgKGZvbGRlZExldmVsICE9PSBudWxsICYmIGhlYWRpbmdMZXZlbCAhPT0gbnVsbCAmJiBoZWFkaW5nTGV2ZWwgPD0gZm9sZGVkTGV2ZWwpIHtcbiAgICAgIGZvbGRlZExldmVsID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgaXNTaG93biA9IGZvbGRlZExldmVsID09PSBudWxsO1xuICAgIGJsb2NrLnRvZ2dsZShpc1Nob3duKTtcbiAgICBpZiAoaXNTaG93biAmJiBoZWFkaW5nRWw/Lmhhc0NsYXNzKCdpcy1jb2xsYXBzZWQnKSkge1xuICAgICAgZm9sZGVkTGV2ZWwgPSBoZWFkaW5nTGV2ZWw7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGVBQWU7QUFFeEIsU0FBUyxnQkFBZ0I7QUFNekIsTUFBTSxpQ0FBaUM7QUFFdkMsTUFBTSxZQUFZO0FBRWxCLE1BQU0sb0JBQW9CLG9CQUFJLElBQUksQ0FBQyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sSUFBSSxDQUFDO0FBOEMvRCxTQUFTLDBCQUEwQixTQUFrQixRQUE4QjtBQUN4RixNQUFJLFVBQTBCO0FBQzlCLFNBQU8sU0FBUztBQUNkLFFBQUksWUFBWSxRQUFRO0FBQ3RCLGFBQU87QUFBQSxJQUNUO0FBQ0EsUUFBSSxRQUFRLFNBQVMsdUJBQXVCLEtBQUssUUFBUSxTQUFTLFlBQVksR0FBRztBQUMvRSxhQUFPO0FBQUEsSUFDVDtBQUNBLGNBQVUsUUFBUTtBQUFBLEVBQ3BCO0FBQ0EsU0FBTztBQUNUO0FBYU8sU0FBUyxxQkFBcUIsUUFBMEM7QUFDN0UsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBLHFCQUFxQjtBQUFBLElBQ3JCLGtCQUFrQjtBQUFBLEVBQ3BCLElBQUk7QUFFSixLQUFHLFNBQVMsU0FBUyxhQUFhLFNBQVMsZ0JBQWdCO0FBRTNELE1BQUksb0JBQW9CO0FBQ3RCLGVBQVcsU0FBUyxVQUFVLEVBQUUsR0FBRztBQUNqQyxZQUFNLFlBQVksZ0JBQWdCLEtBQUs7QUFDdkMsVUFBSSxhQUFh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
@@ -0,0 +1,233 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /// <reference lib="dom.iterable" />
4
+ /**
5
+ * @file
6
+ *
7
+ * A wrapper over Obsidian's {@link requestUrl} that fills the gaps plugins keep hand-rolling: an abort signal and a
8
+ * timeout, request bodies beyond `string | ArrayBuffer` (`FormData`, `URLSearchParams`, `Blob`, typed arrays and
9
+ * streams), an error that carries the status and the body, an up-front protocol check, a streamed response body, and
10
+ * a `fetch`-compatible adapter that third-party SDKs can take.
11
+ *
12
+ * `requestUrl` itself cannot be cancelled: an abort or a timeout settles the returned promise at once, while the
13
+ * underlying request runs to completion and its result is dropped. The streamed variant really cancels on desktop,
14
+ * where it goes through `node:http` / `node:https`; that module is imported dynamically, so this one stays
15
+ * cross-platform-loadable. On mobile the streamed variant falls back to `requestUrl` and delivers the whole body as a
16
+ * single chunk.
17
+ */
18
+ import type { RequestUrlResponse } from 'obsidian';
19
+ /**
20
+ * Options for {@link createRequestUrlFetch}.
21
+ */
22
+ export interface CreateRequestUrlFetchOptions {
23
+ /**
24
+ * Whether to stream the response body through {@link requestUrlStream} rather than buffer it. Streaming is real on
25
+ * desktop only; on mobile the body still arrives as one chunk. Defaults to `false`.
26
+ */
27
+ readonly shouldStream?: boolean;
28
+ /**
29
+ * The timeout in milliseconds applied to every request, on top of the request's own `signal`.
30
+ */
31
+ readonly timeoutInMilliseconds?: number;
32
+ }
33
+ /**
34
+ * The request in the form the transports take: validated, with the body encoded.
35
+ */
36
+ export interface EncodedRequestUrlRequest {
37
+ /**
38
+ * Aborts the request.
39
+ */
40
+ readonly abortSignal: AbortSignal;
41
+ /**
42
+ * The encoded body.
43
+ */
44
+ readonly body?: ArrayBuffer | string;
45
+ /**
46
+ * The request headers, including the content type.
47
+ */
48
+ readonly headers: Readonly<Record<string, string>>;
49
+ /**
50
+ * The HTTP method, uppercase.
51
+ */
52
+ readonly method: string;
53
+ /**
54
+ * The URL.
55
+ */
56
+ readonly url: string;
57
+ }
58
+ /**
59
+ * Parameters for {@link encodeRequestUrlRequest}.
60
+ */
61
+ export type EncodeRequestUrlRequestParams = RequestUrlExParams;
62
+ /**
63
+ * Parameters for the {@link RequestUrlError} constructor.
64
+ */
65
+ export interface RequestUrlErrorConstructorParams {
66
+ /**
67
+ * The response headers.
68
+ */
69
+ readonly headers: Readonly<Record<string, string>>;
70
+ /**
71
+ * The HTTP method.
72
+ */
73
+ readonly method: string;
74
+ /**
75
+ * The status code.
76
+ */
77
+ readonly status: number;
78
+ /**
79
+ * The response body as text.
80
+ */
81
+ readonly text: string;
82
+ /**
83
+ * The URL.
84
+ */
85
+ readonly url: string;
86
+ }
87
+ /**
88
+ * A request body {@link requestUrlEx} accepts: everything `fetch` accepts.
89
+ */
90
+ export type RequestUrlExBody = ArrayBuffer | ArrayBufferView | Blob | FormData | ReadableStream<Uint8Array> | string | URLSearchParams;
91
+ /**
92
+ * Parameters for {@link requestUrlEx}.
93
+ */
94
+ export interface RequestUrlExParams {
95
+ /**
96
+ * Aborts the request. The promise rejects with the signal's reason.
97
+ */
98
+ readonly abortSignal?: AbortSignal | undefined;
99
+ /**
100
+ * The request body.
101
+ */
102
+ readonly body?: RequestUrlExBody | undefined;
103
+ /**
104
+ * The content type. When omitted, it is derived from the body: a `FormData` body gets `multipart/form-data` with its
105
+ * boundary, a `URLSearchParams` body `application/x-www-form-urlencoded` and a `Blob` body its own type — unless
106
+ * {@link RequestUrlExParams.headers} already carries a `Content-Type`.
107
+ */
108
+ readonly contentType?: string | undefined;
109
+ /**
110
+ * The request headers.
111
+ */
112
+ readonly headers?: Readonly<Record<string, string>> | undefined;
113
+ /**
114
+ * The HTTP method. Defaults to `GET`.
115
+ */
116
+ readonly method?: string | undefined;
117
+ /**
118
+ * Whether to throw a {@link RequestUrlError} when the status code is 400 or higher. Defaults to `true`.
119
+ */
120
+ readonly shouldThrowOnHttpError?: boolean | undefined;
121
+ /**
122
+ * The timeout in milliseconds. The promise rejects with a `TimeoutError` {@link DOMException} once it elapses.
123
+ */
124
+ readonly timeoutInMilliseconds?: number | undefined;
125
+ /**
126
+ * The URL. Only `http:` and `https:` URLs are accepted.
127
+ */
128
+ readonly url: string;
129
+ }
130
+ /**
131
+ * A `fetch`-compatible function built on {@link requestUrl}.
132
+ */
133
+ export type RequestUrlFetch = (input: Request | string | URL, init?: RequestInit) => Promise<Response>;
134
+ /**
135
+ * Parameters for {@link requestUrlStream}.
136
+ */
137
+ export type RequestUrlStreamParams = RequestUrlExParams;
138
+ /**
139
+ * The response of {@link requestUrlStream}.
140
+ */
141
+ export interface RequestUrlStreamResponse {
142
+ /**
143
+ * The response body.
144
+ */
145
+ readonly body: ReadableStream<Uint8Array>;
146
+ /**
147
+ * The response headers, with lowercase names.
148
+ */
149
+ readonly headers: Readonly<Record<string, string>>;
150
+ /**
151
+ * The status code.
152
+ */
153
+ readonly status: number;
154
+ /**
155
+ * The final URL, after any redirects.
156
+ */
157
+ readonly url: string;
158
+ }
159
+ /**
160
+ * The error {@link requestUrlEx} and {@link requestUrlStream} throw for a status code of 400 or higher.
161
+ */
162
+ export declare class RequestUrlError extends Error {
163
+ /**
164
+ * The response headers.
165
+ */
166
+ readonly headers: Readonly<Record<string, string>>;
167
+ /**
168
+ * The HTTP method.
169
+ */
170
+ readonly method: string;
171
+ /**
172
+ * The status code.
173
+ */
174
+ readonly status: number;
175
+ /**
176
+ * The response body as text.
177
+ */
178
+ readonly text: string;
179
+ /**
180
+ * The URL.
181
+ */
182
+ readonly url: string;
183
+ /**
184
+ * Creates a {@link RequestUrlError}.
185
+ *
186
+ * @param params - The failed request and its response.
187
+ */
188
+ constructor(params: RequestUrlErrorConstructorParams);
189
+ /**
190
+ * Parses the response body as JSON.
191
+ *
192
+ * @returns The parsed body.
193
+ */
194
+ json(): unknown;
195
+ }
196
+ /**
197
+ * Creates a `fetch`-compatible function built on {@link requestUrl}, for SDKs that take a custom `fetch` (OpenAI,
198
+ * LangChain, OAuth clients) and would otherwise hit CORS.
199
+ *
200
+ * Unlike `fetch`, it never rejects on an HTTP error status: it resolves with a {@link Response} carrying that status,
201
+ * exactly as `fetch` does. It rejects with a `TypeError` for a URL that is not `http:` or `https:`.
202
+ *
203
+ * @param options - The options.
204
+ * @returns The `fetch`-compatible function.
205
+ */
206
+ export declare function createRequestUrlFetch(options?: CreateRequestUrlFetchOptions): RequestUrlFetch;
207
+ /**
208
+ * Encodes a request for a transport: validates the URL, combines the abort signal with the timeout, encodes the body
209
+ * and settles the content type.
210
+ *
211
+ * @param params - The request.
212
+ * @returns The encoded request.
213
+ */
214
+ export declare function encodeRequestUrlRequest(params: EncodeRequestUrlRequestParams): Promise<EncodedRequestUrlRequest>;
215
+ /**
216
+ * Requests a URL through {@link requestUrl}, with an abort signal, a timeout, richer bodies, a protocol check and a
217
+ * {@link RequestUrlError} for an HTTP error status.
218
+ *
219
+ * @param params - The request.
220
+ * @returns The response.
221
+ */
222
+ export declare function requestUrlEx(params: RequestUrlExParams): Promise<RequestUrlResponse>;
223
+ /**
224
+ * Requests a URL and returns its body as a stream.
225
+ *
226
+ * On desktop the request goes through `node:http` / `node:https`, so the body streams as it arrives, an abort really
227
+ * cancels the request, and redirects are followed. On mobile it falls back to {@link requestUrl}, and the whole body
228
+ * arrives as a single chunk.
229
+ *
230
+ * @param params - The request.
231
+ * @returns The response, with a streamed body.
232
+ */
233
+ export declare function requestUrlStream(params: RequestUrlStreamParams): Promise<RequestUrlStreamResponse>;