@mnaoumov/obsidian-lib 10.5.1 → 10.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/codemirror/inline-token-widgets/package.json +6 -0
  2. package/codemirror/settings-facet/package.json +6 -0
  3. package/command-handlers/open-discussion-command-handler/package.json +6 -0
  4. package/command-handlers/open-feature-request-command-handler/package.json +6 -0
  5. package/command-handlers/open-git-hub-command-handler/package.json +6 -0
  6. package/components/settings-facet-component/package.json +6 -0
  7. package/components/style-sheet-component/package.json +6 -0
  8. package/dist/lib/cjs/__merged.cjs +137 -1
  9. package/dist/lib/cjs/__merged.d.cts +26 -0
  10. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  11. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  12. package/dist/lib/cjs/broken-link-candidates.cjs +366 -0
  13. package/dist/lib/cjs/broken-link-candidates.d.cts +181 -0
  14. package/dist/lib/cjs/bug-report.cjs +4 -2
  15. package/dist/lib/cjs/bug-report.d.cts +1 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/command-handlers/index.cjs +10 -1
  25. package/dist/lib/cjs/command-handlers/index.d.cts +3 -0
  26. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +9 -12
  27. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +6 -8
  28. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +127 -0
  29. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.d.cts +45 -0
  30. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +119 -0
  31. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.d.cts +33 -0
  32. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +121 -0
  33. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.d.cts +43 -0
  34. package/dist/lib/cjs/components/index.cjs +7 -1
  35. package/dist/lib/cjs/components/index.d.cts +2 -0
  36. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  37. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  38. package/dist/lib/cjs/components/style-sheet-component.cjs +198 -0
  39. package/dist/lib/cjs/components/style-sheet-component.d.cts +79 -0
  40. package/dist/lib/cjs/css-class.cjs +8 -1
  41. package/dist/lib/cjs/css-class.d.cts +28 -0
  42. package/dist/lib/cjs/data-stores/data-store-transport.cjs +7 -4
  43. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +1 -1
  44. package/dist/lib/cjs/data-stores/shared-data-store.cjs +1 -1
  45. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +1 -1
  46. package/dist/lib/cjs/desktop-git-runner.cjs +117 -0
  47. package/dist/lib/cjs/desktop-git-runner.d.cts +17 -0
  48. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  49. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  50. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  51. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  52. package/dist/lib/cjs/editor-suggest.cjs +197 -0
  53. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  54. package/dist/lib/cjs/feature-request.cjs +115 -0
  55. package/dist/lib/cjs/feature-request.d.cts +54 -0
  56. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  57. package/dist/lib/cjs/git-hub-discussion.cjs +101 -0
  58. package/dist/lib/cjs/git-hub-discussion.d.cts +28 -0
  59. package/dist/lib/cjs/git-rename-history.cjs +148 -0
  60. package/dist/lib/cjs/git-rename-history.d.cts +43 -0
  61. package/dist/lib/cjs/hotkey.cjs +185 -0
  62. package/dist/lib/cjs/hotkey.d.cts +59 -0
  63. package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
  64. package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
  65. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
  66. package/dist/lib/cjs/index.cjs +46 -1
  67. package/dist/lib/cjs/index.d.cts +15 -0
  68. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  69. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  70. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  71. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  72. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  73. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  74. package/dist/lib/cjs/markdown.cjs +6 -1
  75. package/dist/lib/cjs/markdown.d.cts +10 -1
  76. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  77. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  78. package/dist/lib/cjs/request-url.cjs +523 -0
  79. package/dist/lib/cjs/request-url.d.cts +233 -0
  80. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  81. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  82. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  83. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  84. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  85. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  86. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  87. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  88. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  89. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  90. package/dist/lib/cjs/setting-ex.cjs +51 -1
  91. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  92. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  93. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  94. package/dist/lib/cjs/vault.cjs +2 -2
  95. package/dist/lib/cjs/vault.d.cts +3 -1
  96. package/dist/lib/esm/__merged.d.mts +26 -0
  97. package/dist/lib/esm/__merged.mjs +139 -1
  98. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  99. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  100. package/dist/lib/esm/broken-link-candidates.d.mts +181 -0
  101. package/dist/lib/esm/broken-link-candidates.mjs +275 -0
  102. package/dist/lib/esm/bug-report.d.mts +1 -1
  103. package/dist/lib/esm/bug-report.mjs +4 -2
  104. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  105. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  106. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  107. package/dist/lib/esm/codemirror/index.mjs +5 -1
  108. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  109. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  110. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  111. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  112. package/dist/lib/esm/command-handlers/index.d.mts +3 -0
  113. package/dist/lib/esm/command-handlers/index.mjs +7 -1
  114. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +6 -8
  115. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +9 -12
  116. package/dist/lib/esm/command-handlers/open-discussion-command-handler.d.mts +45 -0
  117. package/dist/lib/esm/command-handlers/open-discussion-command-handler.mjs +39 -0
  118. package/dist/lib/esm/command-handlers/open-feature-request-command-handler.d.mts +33 -0
  119. package/dist/lib/esm/command-handlers/open-feature-request-command-handler.mjs +31 -0
  120. package/dist/lib/esm/command-handlers/open-git-hub-command-handler.d.mts +43 -0
  121. package/dist/lib/esm/command-handlers/open-git-hub-command-handler.mjs +33 -0
  122. package/dist/lib/esm/components/index.d.mts +2 -0
  123. package/dist/lib/esm/components/index.mjs +5 -1
  124. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  125. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  126. package/dist/lib/esm/components/style-sheet-component.d.mts +79 -0
  127. package/dist/lib/esm/components/style-sheet-component.mjs +109 -0
  128. package/dist/lib/esm/css-class.d.mts +28 -0
  129. package/dist/lib/esm/css-class.mjs +8 -1
  130. package/dist/lib/esm/data-stores/data-store-transport.d.mts +1 -1
  131. package/dist/lib/esm/data-stores/data-store-transport.mjs +7 -4
  132. package/dist/lib/esm/data-stores/shared-data-store.d.mts +1 -1
  133. package/dist/lib/esm/data-stores/shared-data-store.mjs +1 -1
  134. package/dist/lib/esm/desktop-git-runner.d.mts +17 -0
  135. package/dist/lib/esm/desktop-git-runner.mjs +19 -0
  136. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  137. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  138. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  139. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  140. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  141. package/dist/lib/esm/editor-suggest.mjs +108 -0
  142. package/dist/lib/esm/feature-request.d.mts +54 -0
  143. package/dist/lib/esm/feature-request.mjs +25 -0
  144. package/dist/lib/esm/generated-during-build.mjs +2 -2
  145. package/dist/lib/esm/git-hub-discussion.d.mts +28 -0
  146. package/dist/lib/esm/git-hub-discussion.mjs +13 -0
  147. package/dist/lib/esm/git-rename-history.d.mts +43 -0
  148. package/dist/lib/esm/git-rename-history.mjs +59 -0
  149. package/dist/lib/esm/hotkey.d.mts +59 -0
  150. package/dist/lib/esm/hotkey.mjs +95 -0
  151. package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
  152. package/dist/lib/esm/i18n/locales/en.mjs +13 -1
  153. package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
  154. package/dist/lib/esm/index.d.mts +15 -0
  155. package/dist/lib/esm/index.mjs +31 -1
  156. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  157. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  158. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  159. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  160. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  161. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  162. package/dist/lib/esm/markdown.d.mts +10 -1
  163. package/dist/lib/esm/markdown.mjs +9 -1
  164. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  165. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  166. package/dist/lib/esm/request-url.d.mts +233 -0
  167. package/dist/lib/esm/request-url.mjs +428 -0
  168. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  169. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  170. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  171. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  172. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  173. package/dist/lib/esm/setting-components/index.mjs +9 -1
  174. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  175. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  176. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  177. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  178. package/dist/lib/esm/setting-ex.d.mts +35 -1
  179. package/dist/lib/esm/setting-ex.mjs +51 -1
  180. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  181. package/dist/lib/esm/settings-tabs.mjs +170 -0
  182. package/dist/lib/esm/vault.d.mts +3 -1
  183. package/dist/lib/esm/vault.mjs +2 -2
  184. package/dist/styles.css +83 -1
  185. package/package.json +2 -2
  186. package/setting-components/folder-list-component/package.json +6 -0
  187. package/setting-components/hotkey-component/package.json +6 -0
  188. package/setting-components/list-component/package.json +6 -0
  189. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,428 @@
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 ensureDisposeSymbols(symbolConstructor = Symbol) {
7
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
8
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
9
+ }
10
+
11
+ function ensureBrowserProcess() {
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return "/";
16
+ },
17
+ env: {},
18
+ platform: "android"
19
+ };
20
+ const existingProcess = globalThis.process;
21
+ if (!existingProcess) {
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+ if (existingProcess.versions?.node) {
26
+ return;
27
+ }
28
+ const existingProcessRecord = existingProcess;
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+ existingProcessRecord["browser"] = true;
33
+ }
34
+
35
+ ensureDisposeSymbols();
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
40
+ var __typeError = (msg) => {
41
+ throw TypeError(msg);
42
+ };
43
+ var __using = (stack, value, async) => {
44
+ if (value != null) {
45
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
46
+ var dispose, inner;
47
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
48
+ if (dispose === void 0) {
49
+ dispose = value[__knownSymbol("dispose")];
50
+ if (async) inner = dispose;
51
+ }
52
+ if (typeof dispose !== "function") __typeError("Object not disposable");
53
+ if (inner) dispose = function() {
54
+ try {
55
+ inner.call(this);
56
+ } catch (e) {
57
+ return Promise.reject(e);
58
+ }
59
+ };
60
+ stack.push([async, dispose, value]);
61
+ } else if (async) {
62
+ stack.push([async]);
63
+ }
64
+ return value;
65
+ };
66
+ var __callDispose = (stack, error, hasError) => {
67
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
68
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
69
+ };
70
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
71
+ var next = (it) => {
72
+ while (it = stack.pop()) {
73
+ try {
74
+ var result = it[1] && it[1].call(it[2]);
75
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
76
+ } catch (e) {
77
+ fail(e);
78
+ }
79
+ }
80
+ if (hasError) throw error;
81
+ };
82
+ return next();
83
+ };
84
+ import {
85
+ abortSignalAny,
86
+ abortSignalTimeout,
87
+ onAbort
88
+ } from "@mnaoumov/typescript-lib/abort-controller";
89
+ import { noop } from "@mnaoumov/typescript-lib/function";
90
+ import { normalizeOptionalProperties } from "@mnaoumov/typescript-lib/object-utils";
91
+ import {
92
+ Platform,
93
+ requestUrl
94
+ } from "obsidian";
95
+ const HTTP_ERROR_STATUS_MIN = 400;
96
+ const ERROR_MESSAGE_BODY_LENGTH = 200;
97
+ const HTTP_SWITCHING_PROTOCOLS_STATUS = 101;
98
+ const HTTP_EARLY_HINTS_STATUS = 103;
99
+ const HTTP_NO_CONTENT_STATUS = 204;
100
+ const HTTP_RESET_CONTENT_STATUS = 205;
101
+ const HTTP_NOT_MODIFIED_STATUS = 304;
102
+ const NULL_BODY_STATUSES = /* @__PURE__ */ new Set([
103
+ HTTP_EARLY_HINTS_STATUS,
104
+ HTTP_NO_CONTENT_STATUS,
105
+ HTTP_NOT_MODIFIED_STATUS,
106
+ HTTP_RESET_CONTENT_STATUS,
107
+ HTTP_SWITCHING_PROTOCOLS_STATUS
108
+ ]);
109
+ const SUPPORTED_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:"]);
110
+ const CONTENT_TYPE_HEADER = "content-type";
111
+ const HEX_RADIX = 16;
112
+ const BOUNDARY_RANDOM_PART_COUNT = 2;
113
+ const RANDOM_PART_START = 2;
114
+ class RequestUrlError extends Error {
115
+ /**
116
+ * The response headers.
117
+ */
118
+ headers;
119
+ /**
120
+ * The HTTP method.
121
+ */
122
+ method;
123
+ /**
124
+ * The status code.
125
+ */
126
+ status;
127
+ /**
128
+ * The response body as text.
129
+ */
130
+ text;
131
+ /**
132
+ * The URL.
133
+ */
134
+ url;
135
+ /**
136
+ * Creates a {@link RequestUrlError}.
137
+ *
138
+ * @param params - The failed request and its response.
139
+ */
140
+ constructor(params) {
141
+ const bodyExcerpt = params.text.length > ERROR_MESSAGE_BODY_LENGTH ? `${params.text.slice(0, ERROR_MESSAGE_BODY_LENGTH)}\u2026` : params.text;
142
+ super(`${params.method} ${params.url} failed with status ${String(params.status)}${bodyExcerpt ? `: ${bodyExcerpt}` : ""}`);
143
+ this.name = "RequestUrlError";
144
+ this.headers = params.headers;
145
+ this.method = params.method;
146
+ this.status = params.status;
147
+ this.text = params.text;
148
+ this.url = params.url;
149
+ }
150
+ /**
151
+ * Parses the response body as JSON.
152
+ *
153
+ * @returns The parsed body.
154
+ */
155
+ json() {
156
+ return JSON.parse(this.text);
157
+ }
158
+ }
159
+ function createRequestUrlFetch(options = {}) {
160
+ return async (input, init = {}) => {
161
+ let request = null;
162
+ let url;
163
+ if (typeof input === "string") {
164
+ url = input;
165
+ } else if ("method" in input) {
166
+ request = input;
167
+ url = input.url;
168
+ } else {
169
+ url = input.href;
170
+ }
171
+ const method = (init.method ?? request?.method ?? "GET").toUpperCase();
172
+ const headers = toHeaderRecord(request?.headers, init.headers);
173
+ let body = init.body ?? void 0;
174
+ if (body === void 0 && request && method !== "GET" && method !== "HEAD") {
175
+ body = await request.arrayBuffer();
176
+ }
177
+ const params = {
178
+ abortSignal: init.signal ?? request?.signal ?? void 0,
179
+ body,
180
+ headers,
181
+ method,
182
+ shouldThrowOnHttpError: false,
183
+ timeoutInMilliseconds: options.timeoutInMilliseconds,
184
+ url
185
+ };
186
+ if (options.shouldStream) {
187
+ const streamResponse = await requestUrlStream(params);
188
+ return createResponse(streamResponse.status, streamResponse.headers, streamResponse.body, streamResponse.url);
189
+ }
190
+ const response = await requestUrlEx(params);
191
+ return createResponse(response.status, response.headers, response.arrayBuffer, url);
192
+ };
193
+ }
194
+ async function encodeRequestUrlRequest(params) {
195
+ const url = assertHttpUrl(params.url);
196
+ const abortSignal = abortSignalAny(
197
+ params.abortSignal,
198
+ params.timeoutInMilliseconds === void 0 ? void 0 : abortSignalTimeout(params.timeoutInMilliseconds)
199
+ );
200
+ abortSignal.throwIfAborted();
201
+ const encodedBody = await encodeBody(params.body);
202
+ abortSignal.throwIfAborted();
203
+ const headers = { ...params.headers };
204
+ const hasContentTypeHeader = Object.keys(headers).some((name) => name.toLowerCase() === CONTENT_TYPE_HEADER);
205
+ const contentType = params.contentType ?? (hasContentTypeHeader ? void 0 : encodedBody.contentType);
206
+ if (contentType !== void 0) {
207
+ for (const name of Object.keys(headers)) {
208
+ if (name.toLowerCase() === CONTENT_TYPE_HEADER) {
209
+ delete headers[name];
210
+ }
211
+ }
212
+ headers["Content-Type"] = contentType;
213
+ }
214
+ return normalizeOptionalProperties({
215
+ abortSignal,
216
+ body: encodedBody.body,
217
+ headers,
218
+ method: (params.method ?? "GET").toUpperCase(),
219
+ url
220
+ });
221
+ }
222
+ async function requestUrlEx(params) {
223
+ const request = await encodeRequestUrlRequest(params);
224
+ const obsidianRequest = normalizeOptionalProperties({
225
+ body: request.body,
226
+ headers: { ...request.headers },
227
+ method: request.method,
228
+ throw: false,
229
+ url: request.url
230
+ });
231
+ const response = await raceWithAbort(Promise.resolve(requestUrl(obsidianRequest)), request.abortSignal);
232
+ if ((params.shouldThrowOnHttpError ?? true) && response.status >= HTTP_ERROR_STATUS_MIN) {
233
+ throw new RequestUrlError({
234
+ headers: response.headers,
235
+ method: request.method,
236
+ status: response.status,
237
+ text: response.text,
238
+ url: request.url
239
+ });
240
+ }
241
+ return response;
242
+ }
243
+ async function requestUrlStream(params) {
244
+ const request = await encodeRequestUrlRequest(params);
245
+ let response;
246
+ if (Platform.isDesktopApp) {
247
+ const { openDesktopRequestUrlStream } = await import("./desktop-request-url-stream.mjs");
248
+ response = await openDesktopRequestUrlStream(request);
249
+ } else {
250
+ const bufferedResponse = await requestUrlEx({
251
+ abortSignal: request.abortSignal,
252
+ body: request.body,
253
+ headers: request.headers,
254
+ method: request.method,
255
+ shouldThrowOnHttpError: false,
256
+ url: request.url
257
+ });
258
+ response = {
259
+ body: createSingleChunkStream(bufferedResponse.arrayBuffer),
260
+ headers: bufferedResponse.headers,
261
+ status: bufferedResponse.status,
262
+ url: request.url
263
+ };
264
+ }
265
+ if ((params.shouldThrowOnHttpError ?? true) && response.status >= HTTP_ERROR_STATUS_MIN) {
266
+ const text = new TextDecoder().decode(await readStream(response.body));
267
+ throw new RequestUrlError({
268
+ headers: response.headers,
269
+ method: request.method,
270
+ status: response.status,
271
+ text,
272
+ url: response.url
273
+ });
274
+ }
275
+ return response;
276
+ }
277
+ function assertHttpUrl(url) {
278
+ let parsedUrl;
279
+ try {
280
+ parsedUrl = new URL(url);
281
+ } catch {
282
+ throw new TypeError(`Invalid URL: ${url}`);
283
+ }
284
+ if (!SUPPORTED_PROTOCOLS.has(parsedUrl.protocol)) {
285
+ throw new TypeError(`Unsupported protocol ${parsedUrl.protocol} in ${url}: only http: and https: URLs can be requested`);
286
+ }
287
+ return url;
288
+ }
289
+ function concatBytes(chunks) {
290
+ const length = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
291
+ const bytes = new Uint8Array(length);
292
+ let offset = 0;
293
+ for (const chunk of chunks) {
294
+ bytes.set(chunk, offset);
295
+ offset += chunk.byteLength;
296
+ }
297
+ return bytes.buffer;
298
+ }
299
+ function createResponse(status, headers, body, url) {
300
+ const response = new Response(NULL_BODY_STATUSES.has(status) ? null : body, {
301
+ headers: new Headers({ ...headers }),
302
+ status
303
+ });
304
+ Object.defineProperty(response, "url", { value: url });
305
+ return response;
306
+ }
307
+ function createSingleChunkStream(arrayBuffer) {
308
+ return new ReadableStream({
309
+ start(controller) {
310
+ if (arrayBuffer.byteLength > 0) {
311
+ controller.enqueue(new Uint8Array(arrayBuffer));
312
+ }
313
+ controller.close();
314
+ }
315
+ });
316
+ }
317
+ async function encodeBody(body) {
318
+ if (body === void 0 || typeof body === "string") {
319
+ return normalizeOptionalProperties({ body });
320
+ }
321
+ switch (Object.prototype.toString.call(body)) {
322
+ case "[object ArrayBuffer]": {
323
+ return { body };
324
+ }
325
+ case "[object Blob]":
326
+ case "[object File]": {
327
+ const blob = body;
328
+ return normalizeOptionalProperties({ body: await blob.arrayBuffer(), contentType: blob.type || void 0 });
329
+ }
330
+ case "[object FormData]": {
331
+ return await encodeFormData(body);
332
+ }
333
+ case "[object ReadableStream]": {
334
+ return { body: await readStream(body) };
335
+ }
336
+ case "[object URLSearchParams]": {
337
+ return { body: body.toString(), contentType: "application/x-www-form-urlencoded;charset=UTF-8" };
338
+ }
339
+ default: {
340
+ if (ArrayBuffer.isView(body)) {
341
+ return { body: new Uint8Array(body.buffer, body.byteOffset, body.byteLength).slice().buffer };
342
+ }
343
+ throw new TypeError(`Unsupported request body: ${Object.prototype.toString.call(body)}`);
344
+ }
345
+ }
346
+ }
347
+ async function encodeFormData(formData) {
348
+ const boundary = `----ObsidianLibFormBoundary${generateRandomHex()}`;
349
+ const textEncoder = new TextEncoder();
350
+ const chunks = [];
351
+ const entries = [];
352
+ formData.forEach((value, name) => {
353
+ entries.push([name, value]);
354
+ });
355
+ for (const [name, value] of entries) {
356
+ let header = `--${boundary}\r
357
+ Content-Disposition: form-data; name="${escapeMultipartName(name)}"`;
358
+ if (typeof value === "string") {
359
+ chunks.push(textEncoder.encode(`${header}\r
360
+ \r
361
+ ${value}\r
362
+ `));
363
+ continue;
364
+ }
365
+ header += `; filename="${escapeMultipartName(value.name)}"\r
366
+ Content-Type: ${value.type || "application/octet-stream"}\r
367
+ \r
368
+ `;
369
+ chunks.push(textEncoder.encode(header), new Uint8Array(await value.arrayBuffer()), textEncoder.encode("\r\n"));
370
+ }
371
+ chunks.push(textEncoder.encode(`--${boundary}--\r
372
+ `));
373
+ return { body: concatBytes(chunks), contentType: `multipart/form-data; boundary=${boundary}` };
374
+ }
375
+ function escapeMultipartName(name) {
376
+ return name.replaceAll('"', "%22").replaceAll("\r", "%0D").replaceAll("\n", "%0A");
377
+ }
378
+ function generateRandomHex() {
379
+ return Array.from({ length: BOUNDARY_RANDOM_PART_COUNT }, () => Math.random().toString(HEX_RADIX).slice(RANDOM_PART_START)).join("");
380
+ }
381
+ async function raceWithAbort(promise, abortSignal) {
382
+ var _stack = [];
383
+ try {
384
+ let rejectOnAbort = noop;
385
+ const abortPromise = new Promise((_resolve, reject) => {
386
+ rejectOnAbort = reject;
387
+ });
388
+ const _abortListener = __using(_stack, onAbort(abortSignal, () => {
389
+ rejectOnAbort(abortSignal.reason);
390
+ }));
391
+ return await Promise.race([promise, abortPromise]);
392
+ } catch (_) {
393
+ var _error = _, _hasError = true;
394
+ } finally {
395
+ __callDispose(_stack, _error, _hasError);
396
+ }
397
+ }
398
+ async function readStream(stream) {
399
+ const reader = stream.getReader();
400
+ const chunks = [];
401
+ for (; ; ) {
402
+ const result = await reader.read();
403
+ if (result.done) {
404
+ break;
405
+ }
406
+ chunks.push(result.value);
407
+ }
408
+ return concatBytes(chunks);
409
+ }
410
+ function toHeaderRecord(requestHeaders, initHeaders) {
411
+ const headers = new Headers(requestHeaders);
412
+ new Headers(initHeaders).forEach((value, name) => {
413
+ headers.set(name, value);
414
+ });
415
+ const record = {};
416
+ headers.forEach((value, name) => {
417
+ record[name] = value;
418
+ });
419
+ return record;
420
+ }
421
+ export {
422
+ RequestUrlError,
423
+ createRequestUrlFetch,
424
+ encodeRequestUrlRequest,
425
+ requestUrlEx,
426
+ requestUrlStream
427
+ };
428
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXF1ZXN0LXVybC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHdyYXBwZXIgb3ZlciBPYnNpZGlhbidzIHtAbGluayByZXF1ZXN0VXJsfSB0aGF0IGZpbGxzIHRoZSBnYXBzIHBsdWdpbnMga2VlcCBoYW5kLXJvbGxpbmc6IGFuIGFib3J0IHNpZ25hbCBhbmQgYVxuICogdGltZW91dCwgcmVxdWVzdCBib2RpZXMgYmV5b25kIGBzdHJpbmcgfCBBcnJheUJ1ZmZlcmAgKGBGb3JtRGF0YWAsIGBVUkxTZWFyY2hQYXJhbXNgLCBgQmxvYmAsIHR5cGVkIGFycmF5cyBhbmRcbiAqIHN0cmVhbXMpLCBhbiBlcnJvciB0aGF0IGNhcnJpZXMgdGhlIHN0YXR1cyBhbmQgdGhlIGJvZHksIGFuIHVwLWZyb250IHByb3RvY29sIGNoZWNrLCBhIHN0cmVhbWVkIHJlc3BvbnNlIGJvZHksIGFuZFxuICogYSBgZmV0Y2hgLWNvbXBhdGlibGUgYWRhcHRlciB0aGF0IHRoaXJkLXBhcnR5IFNES3MgY2FuIHRha2UuXG4gKlxuICogYHJlcXVlc3RVcmxgIGl0c2VsZiBjYW5ub3QgYmUgY2FuY2VsbGVkOiBhbiBhYm9ydCBvciBhIHRpbWVvdXQgc2V0dGxlcyB0aGUgcmV0dXJuZWQgcHJvbWlzZSBhdCBvbmNlLCB3aGlsZSB0aGVcbiAqIHVuZGVybHlpbmcgcmVxdWVzdCBydW5zIHRvIGNvbXBsZXRpb24gYW5kIGl0cyByZXN1bHQgaXMgZHJvcHBlZC4gVGhlIHN0cmVhbWVkIHZhcmlhbnQgcmVhbGx5IGNhbmNlbHMgb24gZGVza3RvcCxcbiAqIHdoZXJlIGl0IGdvZXMgdGhyb3VnaCBgbm9kZTpodHRwYCAvIGBub2RlOmh0dHBzYDsgdGhhdCBtb2R1bGUgaXMgaW1wb3J0ZWQgZHluYW1pY2FsbHksIHNvIHRoaXMgb25lIHN0YXlzXG4gKiBjcm9zcy1wbGF0Zm9ybS1sb2FkYWJsZS4gT24gbW9iaWxlIHRoZSBzdHJlYW1lZCB2YXJpYW50IGZhbGxzIGJhY2sgdG8gYHJlcXVlc3RVcmxgIGFuZCBkZWxpdmVycyB0aGUgd2hvbGUgYm9keSBhcyBhXG4gKiBzaW5nbGUgY2h1bmsuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBSZXF1ZXN0VXJsUGFyYW0sXG4gIFJlcXVlc3RVcmxSZXNwb25zZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGFib3J0U2lnbmFsQW55LFxuICBhYm9ydFNpZ25hbFRpbWVvdXQsXG4gIG9uQWJvcnRcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Fib3J0LWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIFBsYXRmb3JtLFxuICByZXF1ZXN0VXJsXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlUmVxdWVzdFVybEZldGNofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSZXF1ZXN0VXJsRmV0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RyZWFtIHRoZSByZXNwb25zZSBib2R5IHRocm91Z2gge0BsaW5rIHJlcXVlc3RVcmxTdHJlYW19IHJhdGhlciB0aGFuIGJ1ZmZlciBpdC4gU3RyZWFtaW5nIGlzIHJlYWwgb25cbiAgICogZGVza3RvcCBvbmx5OyBvbiBtb2JpbGUgdGhlIGJvZHkgc3RpbGwgYXJyaXZlcyBhcyBvbmUgY2h1bmsuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTdHJlYW0/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgYXBwbGllZCB0byBldmVyeSByZXF1ZXN0LCBvbiB0b3Agb2YgdGhlIHJlcXVlc3QncyBvd24gYHNpZ25hbGAuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgaW4gdGhlIGZvcm0gdGhlIHRyYW5zcG9ydHMgdGFrZTogdmFsaWRhdGVkLCB3aXRoIHRoZSBib2R5IGVuY29kZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2RlZFJlcXVlc3RVcmxSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIEFib3J0cyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIGVuY29kZWQgYm9keS5cbiAgICovXG4gIHJlYWRvbmx5IGJvZHk/OiBBcnJheUJ1ZmZlciB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgaGVhZGVycywgaW5jbHVkaW5nIHRoZSBjb250ZW50IHR5cGUuXG4gICAqL1xuICByZWFkb25seSBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kLCB1cHBlcmNhc2UuXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbmNvZGVSZXF1ZXN0VXJsUmVxdWVzdH0uXG4gKi9cbmV4cG9ydCB0eXBlIEVuY29kZVJlcXVlc3RVcmxSZXF1ZXN0UGFyYW1zID0gUmVxdWVzdFVybEV4UGFyYW1zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUmVxdWVzdFVybEVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0VXJsRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgaGVhZGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgSFRUUCBtZXRob2QuXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNwb25zZSBib2R5IGFzIHRleHQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlcXVlc3QgYm9keSB7QGxpbmsgcmVxdWVzdFVybEV4fSBhY2NlcHRzOiBldmVyeXRoaW5nIGBmZXRjaGAgYWNjZXB0cy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVxdWVzdFVybEV4Qm9keSA9IEFycmF5QnVmZmVyIHwgQXJyYXlCdWZmZXJWaWV3IHwgQmxvYiB8IEZvcm1EYXRhIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCBzdHJpbmcgfCBVUkxTZWFyY2hQYXJhbXM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlcXVlc3RVcmxFeH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdFVybEV4UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFib3J0cyB0aGUgcmVxdWVzdC4gVGhlIHByb21pc2UgcmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBib2R5LlxuICAgKi9cbiAgcmVhZG9ubHkgYm9keT86IFJlcXVlc3RVcmxFeEJvZHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHR5cGUuIFdoZW4gb21pdHRlZCwgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBib2R5OiBhIGBGb3JtRGF0YWAgYm9keSBnZXRzIGBtdWx0aXBhcnQvZm9ybS1kYXRhYCB3aXRoIGl0c1xuICAgKiBib3VuZGFyeSwgYSBgVVJMU2VhcmNoUGFyYW1zYCBib2R5IGBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIGFuZCBhIGBCbG9iYCBib2R5IGl0cyBvd24gdHlwZSDigJQgdW5sZXNzXG4gICAqIHtAbGluayBSZXF1ZXN0VXJsRXhQYXJhbXMuaGVhZGVyc30gYWxyZWFkeSBjYXJyaWVzIGEgYENvbnRlbnQtVHlwZWAuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50VHlwZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgaGVhZGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcnM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kLiBEZWZhdWx0cyB0byBgR0VUYC5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byB0aHJvdyBhIHtAbGluayBSZXF1ZXN0VXJsRXJyb3J9IHdoZW4gdGhlIHN0YXR1cyBjb2RlIGlzIDQwMCBvciBoaWdoZXIuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25IdHRwRXJyb3I/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIFRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhIGBUaW1lb3V0RXJyb3JgIHtAbGluayBET01FeGNlcHRpb259IG9uY2UgaXQgZWxhcHNlcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIFVSTC4gT25seSBgaHR0cDpgIGFuZCBgaHR0cHM6YCBVUkxzIGFyZSBhY2NlcHRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYGZldGNoYC1jb21wYXRpYmxlIGZ1bmN0aW9uIGJ1aWx0IG9uIHtAbGluayByZXF1ZXN0VXJsfS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVxdWVzdFVybEZldGNoID0gKGlucHV0OiBSZXF1ZXN0IHwgc3RyaW5nIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXF1ZXN0VXJsU3RyZWFtfS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVxdWVzdFVybFN0cmVhbVBhcmFtcyA9IFJlcXVlc3RVcmxFeFBhcmFtcztcblxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugb2Yge0BsaW5rIHJlcXVlc3RVcmxTdHJlYW19LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RVcmxTdHJlYW1SZXNwb25zZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgYm9keS5cbiAgICovXG4gIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgaGVhZGVycywgd2l0aCBsb3dlcmNhc2UgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmaW5hbCBVUkwsIGFmdGVyIGFueSByZWRpcmVjdHMuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEVuY29kZWRCb2R5IHtcbiAgcmVhZG9ubHkgYm9keT86IEFycmF5QnVmZmVyIHwgc3RyaW5nO1xuICByZWFkb25seSBjb250ZW50VHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgSFRUUF9FUlJPUl9TVEFUVVNfTUlOID0gNDAwO1xuY29uc3QgRVJST1JfTUVTU0FHRV9CT0RZX0xFTkdUSCA9IDIwMDtcbmNvbnN0IEhUVFBfU1dJVENISU5HX1BST1RPQ09MU19TVEFUVVMgPSAxMDE7XG5jb25zdCBIVFRQX0VBUkxZX0hJTlRTX1NUQVRVUyA9IDEwMztcbmNvbnN0IEhUVFBfTk9fQ09OVEVOVF9TVEFUVVMgPSAyMDQ7XG5jb25zdCBIVFRQX1JFU0VUX0NPTlRFTlRfU1RBVFVTID0gMjA1O1xuY29uc3QgSFRUUF9OT1RfTU9ESUZJRURfU1RBVFVTID0gMzA0O1xuLy8gVGhlIHN0YXR1c2VzIGEgUmVzcG9uc2UgcmVmdXNlcyBhIGJvZHkgZm9yLlxuY29uc3QgTlVMTF9CT0RZX1NUQVRVU0VTID0gbmV3IFNldChbXG4gIEhUVFBfRUFSTFlfSElOVFNfU1RBVFVTLFxuICBIVFRQX05PX0NPTlRFTlRfU1RBVFVTLFxuICBIVFRQX05PVF9NT0RJRklFRF9TVEFUVVMsXG4gIEhUVFBfUkVTRVRfQ09OVEVOVF9TVEFUVVMsXG4gIEhUVFBfU1dJVENISU5HX1BST1RPQ09MU19TVEFUVVNcbl0pO1xuY29uc3QgU1VQUE9SVEVEX1BST1RPQ09MUyA9IG5ldyBTZXQoWydodHRwOicsICdodHRwczonXSk7XG5jb25zdCBDT05URU5UX1RZUEVfSEVBREVSID0gJ2NvbnRlbnQtdHlwZSc7XG5jb25zdCBIRVhfUkFESVggPSAxNjtcbmNvbnN0IEJPVU5EQVJZX1JBTkRPTV9QQVJUX0NPVU5UID0gMjtcbmNvbnN0IFJBTkRPTV9QQVJUX1NUQVJUID0gMjtcblxuLyoqXG4gKiBUaGUgZXJyb3Ige0BsaW5rIHJlcXVlc3RVcmxFeH0gYW5kIHtAbGluayByZXF1ZXN0VXJsU3RyZWFtfSB0aHJvdyBmb3IgYSBzdGF0dXMgY29kZSBvZiA0MDAgb3IgaGlnaGVyLlxuICovXG5leHBvcnQgY2xhc3MgUmVxdWVzdFVybEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHJlc3BvbnNlIGhlYWRlcnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIG1ldGhvZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRob2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgYm9keSBhcyB0ZXh0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBSZXF1ZXN0VXJsRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZhaWxlZCByZXF1ZXN0IGFuZCBpdHMgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXF1ZXN0VXJsRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IGJvZHlFeGNlcnB0ID0gcGFyYW1zLnRleHQubGVuZ3RoID4gRVJST1JfTUVTU0FHRV9CT0RZX0xFTkdUSCA/IGAke3BhcmFtcy50ZXh0LnNsaWNlKDAsIEVSUk9SX01FU1NBR0VfQk9EWV9MRU5HVEgpfeKApmAgOiBwYXJhbXMudGV4dDtcbiAgICBzdXBlcihgJHtwYXJhbXMubWV0aG9kfSAke3BhcmFtcy51cmx9IGZhaWxlZCB3aXRoIHN0YXR1cyAke1N0cmluZyhwYXJhbXMuc3RhdHVzKX0ke2JvZHlFeGNlcnB0ID8gYDogJHtib2R5RXhjZXJwdH1gIDogJyd9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1JlcXVlc3RVcmxFcnJvcic7XG4gICAgdGhpcy5oZWFkZXJzID0gcGFyYW1zLmhlYWRlcnM7XG4gICAgdGhpcy5tZXRob2QgPSBwYXJhbXMubWV0aG9kO1xuICAgIHRoaXMuc3RhdHVzID0gcGFyYW1zLnN0YXR1cztcbiAgICB0aGlzLnRleHQgPSBwYXJhbXMudGV4dDtcbiAgICB0aGlzLnVybCA9IHBhcmFtcy51cmw7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSByZXNwb25zZSBib2R5IGFzIEpTT04uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBwYXJzZWQgYm9keS5cbiAgICovXG4gIHB1YmxpYyBqc29uKCk6IHVua25vd24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMudGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYGZldGNoYC1jb21wYXRpYmxlIGZ1bmN0aW9uIGJ1aWx0IG9uIHtAbGluayByZXF1ZXN0VXJsfSwgZm9yIFNES3MgdGhhdCB0YWtlIGEgY3VzdG9tIGBmZXRjaGAgKE9wZW5BSSxcbiAqIExhbmdDaGFpbiwgT0F1dGggY2xpZW50cykgYW5kIHdvdWxkIG90aGVyd2lzZSBoaXQgQ09SUy5cbiAqXG4gKiBVbmxpa2UgYGZldGNoYCwgaXQgbmV2ZXIgcmVqZWN0cyBvbiBhbiBIVFRQIGVycm9yIHN0YXR1czogaXQgcmVzb2x2ZXMgd2l0aCBhIHtAbGluayBSZXNwb25zZX0gY2FycnlpbmcgdGhhdCBzdGF0dXMsXG4gKiBleGFjdGx5IGFzIGBmZXRjaGAgZG9lcy4gSXQgcmVqZWN0cyB3aXRoIGEgYFR5cGVFcnJvcmAgZm9yIGEgVVJMIHRoYXQgaXMgbm90IGBodHRwOmAgb3IgYGh0dHBzOmAuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBgZmV0Y2hgLWNvbXBhdGlibGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0VXJsRmV0Y2gob3B0aW9uczogQ3JlYXRlUmVxdWVzdFVybEZldGNoT3B0aW9ucyA9IHt9KTogUmVxdWVzdFVybEZldGNoIHtcbiAgcmV0dXJuIGFzeW5jIChpbnB1dCwgaW5pdCA9IHt9KSA9PiB7XG4gICAgbGV0IHJlcXVlc3Q6IG51bGwgfCBSZXF1ZXN0ID0gbnVsbDtcbiAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHVybCA9IGlucHV0O1xuICAgIH0gZWxzZSBpZiAoJ21ldGhvZCcgaW4gaW5wdXQpIHtcbiAgICAgIC8vIEEgYFVSTGAgaGFzIG5vIGBtZXRob2RgOyBgaW5zdGFuY2VvZmAgd291bGQgZmFpbCBhY3Jvc3Mgd2luZG93cy5cbiAgICAgIHJlcXVlc3QgPSBpbnB1dDtcbiAgICAgIHVybCA9IGlucHV0LnVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsID0gaW5wdXQuaHJlZjtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gKGluaXQubWV0aG9kID8/IHJlcXVlc3Q/Lm1ldGhvZCA/PyAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBoZWFkZXJzID0gdG9IZWFkZXJSZWNvcmQocmVxdWVzdD8uaGVhZGVycywgaW5pdC5oZWFkZXJzKTtcbiAgICBsZXQgYm9keTogUmVxdWVzdFVybEV4Qm9keSB8IHVuZGVmaW5lZCA9IGluaXQuYm9keSA/PyB1bmRlZmluZWQ7XG4gICAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0ICYmIG1ldGhvZCAhPT0gJ0dFVCcgJiYgbWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0LmFycmF5QnVmZmVyKCk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtczogUmVxdWVzdFVybEV4UGFyYW1zID0ge1xuICAgICAgYWJvcnRTaWduYWw6IGluaXQuc2lnbmFsID8/IHJlcXVlc3Q/LnNpZ25hbCA/PyB1bmRlZmluZWQsXG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHNob3VsZFRocm93T25IdHRwRXJyb3I6IGZhbHNlLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHVybFxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRTdHJlYW0pIHtcbiAgICAgIGNvbnN0IHN0cmVhbVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybFN0cmVhbShwYXJhbXMpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlKHN0cmVhbVJlc3BvbnNlLnN0YXR1cywgc3RyZWFtUmVzcG9uc2UuaGVhZGVycywgc3RyZWFtUmVzcG9uc2UuYm9keSwgc3RyZWFtUmVzcG9uc2UudXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmxFeChwYXJhbXMpO1xuICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLmFycmF5QnVmZmVyLCB1cmwpO1xuICB9O1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSByZXF1ZXN0IGZvciBhIHRyYW5zcG9ydDogdmFsaWRhdGVzIHRoZSBVUkwsIGNvbWJpbmVzIHRoZSBhYm9ydCBzaWduYWwgd2l0aCB0aGUgdGltZW91dCwgZW5jb2RlcyB0aGUgYm9keVxuICogYW5kIHNldHRsZXMgdGhlIGNvbnRlbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgZW5jb2RlZCByZXF1ZXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlUmVxdWVzdFVybFJlcXVlc3QocGFyYW1zOiBFbmNvZGVSZXF1ZXN0VXJsUmVxdWVzdFBhcmFtcyk6IFByb21pc2U8RW5jb2RlZFJlcXVlc3RVcmxSZXF1ZXN0PiB7XG4gIGNvbnN0IHVybCA9IGFzc2VydEh0dHBVcmwocGFyYW1zLnVybCk7XG4gIGNvbnN0IGFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoXG4gICAgcGFyYW1zLmFib3J0U2lnbmFsLFxuICAgIHBhcmFtcy50aW1lb3V0SW5NaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFib3J0U2lnbmFsVGltZW91dChwYXJhbXMudGltZW91dEluTWlsbGlzZWNvbmRzKVxuICApO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGNvbnN0IGVuY29kZWRCb2R5ID0gYXdhaXQgZW5jb2RlQm9keShwYXJhbXMuYm9keSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgLi4ucGFyYW1zLmhlYWRlcnMgfTtcbiAgY29uc3QgaGFzQ29udGVudFR5cGVIZWFkZXIgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5zb21lKChuYW1lKSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IENPTlRFTlRfVFlQRV9IRUFERVIpO1xuICBjb25zdCBjb250ZW50VHlwZSA9IHBhcmFtcy5jb250ZW50VHlwZSA/PyAoaGFzQ29udGVudFR5cGVIZWFkZXIgPyB1bmRlZmluZWQgOiBlbmNvZGVkQm9keS5jb250ZW50VHlwZSk7XG4gIGlmIChjb250ZW50VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpID09PSBDT05URU5UX1RZUEVfSEVBREVSKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gQSBoZWFkZXIgcmVjb3JkIGlzIGtleWVkIGJ5IG5hbWUuXG4gICAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRUeXBlO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFbmNvZGVkUmVxdWVzdFVybFJlcXVlc3Q+KHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBib2R5OiBlbmNvZGVkQm9keS5ib2R5LFxuICAgIGhlYWRlcnMsXG4gICAgbWV0aG9kOiAocGFyYW1zLm1ldGhvZCA/PyAnR0VUJykudG9VcHBlckNhc2UoKSxcbiAgICB1cmxcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYSBVUkwgdGhyb3VnaCB7QGxpbmsgcmVxdWVzdFVybH0sIHdpdGggYW4gYWJvcnQgc2lnbmFsLCBhIHRpbWVvdXQsIHJpY2hlciBib2RpZXMsIGEgcHJvdG9jb2wgY2hlY2sgYW5kIGFcbiAqIHtAbGluayBSZXF1ZXN0VXJsRXJyb3J9IGZvciBhbiBIVFRQIGVycm9yIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0VXJsRXgocGFyYW1zOiBSZXF1ZXN0VXJsRXhQYXJhbXMpOiBQcm9taXNlPFJlcXVlc3RVcmxSZXNwb25zZT4ge1xuICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgZW5jb2RlUmVxdWVzdFVybFJlcXVlc3QocGFyYW1zKTtcbiAgY29uc3Qgb2JzaWRpYW5SZXF1ZXN0OiBSZXF1ZXN0VXJsUGFyYW0gPSBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UmVxdWVzdFVybFBhcmFtPih7XG4gICAgYm9keTogcmVxdWVzdC5ib2R5LFxuICAgIGhlYWRlcnM6IHsgLi4ucmVxdWVzdC5oZWFkZXJzIH0sXG4gICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICB0aHJvdzogZmFsc2UsXG4gICAgdXJsOiByZXF1ZXN0LnVybFxuICB9KTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByYWNlV2l0aEFib3J0KFByb21pc2UucmVzb2x2ZShyZXF1ZXN0VXJsKG9ic2lkaWFuUmVxdWVzdCkpLCByZXF1ZXN0LmFib3J0U2lnbmFsKTtcbiAgaWYgKChwYXJhbXMuc2hvdWxkVGhyb3dPbkh0dHBFcnJvciA/PyB0cnVlKSAmJiByZXNwb25zZS5zdGF0dXMgPj0gSFRUUF9FUlJPUl9TVEFUVVNfTUlOKSB7XG4gICAgdGhyb3cgbmV3IFJlcXVlc3RVcmxFcnJvcih7XG4gICAgICBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdGV4dDogcmVzcG9uc2UudGV4dCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYSBVUkwgYW5kIHJldHVybnMgaXRzIGJvZHkgYXMgYSBzdHJlYW0uXG4gKlxuICogT24gZGVza3RvcCB0aGUgcmVxdWVzdCBnb2VzIHRocm91Z2ggYG5vZGU6aHR0cGAgLyBgbm9kZTpodHRwc2AsIHNvIHRoZSBib2R5IHN0cmVhbXMgYXMgaXQgYXJyaXZlcywgYW4gYWJvcnQgcmVhbGx5XG4gKiBjYW5jZWxzIHRoZSByZXF1ZXN0LCBhbmQgcmVkaXJlY3RzIGFyZSBmb2xsb3dlZC4gT24gbW9iaWxlIGl0IGZhbGxzIGJhY2sgdG8ge0BsaW5rIHJlcXVlc3RVcmx9LCBhbmQgdGhlIHdob2xlIGJvZHlcbiAqIGFycml2ZXMgYXMgYSBzaW5nbGUgY2h1bmsuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSByZXF1ZXN0LlxuICogQHJldHVybnMgVGhlIHJlc3BvbnNlLCB3aXRoIGEgc3RyZWFtZWQgYm9keS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RVcmxTdHJlYW0ocGFyYW1zOiBSZXF1ZXN0VXJsU3RyZWFtUGFyYW1zKTogUHJvbWlzZTxSZXF1ZXN0VXJsU3RyZWFtUmVzcG9uc2U+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IGVuY29kZVJlcXVlc3RVcmxSZXF1ZXN0KHBhcmFtcyk7XG4gIGxldCByZXNwb25zZTogUmVxdWVzdFVybFN0cmVhbVJlc3BvbnNlO1xuICBpZiAoUGxhdGZvcm0uaXNEZXNrdG9wQXBwKSB7XG4gICAgY29uc3QgeyBvcGVuRGVza3RvcFJlcXVlc3RVcmxTdHJlYW0gfSA9IGF3YWl0IGltcG9ydCgnLi9kZXNrdG9wLXJlcXVlc3QtdXJsLXN0cmVhbS50cycpO1xuICAgIHJlc3BvbnNlID0gYXdhaXQgb3BlbkRlc2t0b3BSZXF1ZXN0VXJsU3RyZWFtKHJlcXVlc3QpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ1ZmZlcmVkUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsRXgoe1xuICAgICAgYWJvcnRTaWduYWw6IHJlcXVlc3QuYWJvcnRTaWduYWwsXG4gICAgICBib2R5OiByZXF1ZXN0LmJvZHksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgc2hvdWxkVGhyb3dPbkh0dHBFcnJvcjogZmFsc2UsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSk7XG4gICAgcmVzcG9uc2UgPSB7XG4gICAgICBib2R5OiBjcmVhdGVTaW5nbGVDaHVua1N0cmVhbShidWZmZXJlZFJlc3BvbnNlLmFycmF5QnVmZmVyKSxcbiAgICAgIGhlYWRlcnM6IGJ1ZmZlcmVkUmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIHN0YXR1czogYnVmZmVyZWRSZXNwb25zZS5zdGF0dXMsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfTtcbiAgfVxuXG4gIGlmICgocGFyYW1zLnNob3VsZFRocm93T25IdHRwRXJyb3IgPz8gdHJ1ZSkgJiYgcmVzcG9uc2Uuc3RhdHVzID49IEhUVFBfRVJST1JfU1RBVFVTX01JTikge1xuICAgIGNvbnN0IHRleHQgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYXdhaXQgcmVhZFN0cmVhbShyZXNwb25zZS5ib2R5KSk7XG4gICAgdGhyb3cgbmV3IFJlcXVlc3RVcmxFcnJvcih7XG4gICAgICBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdGV4dCxcbiAgICAgIHVybDogcmVzcG9uc2UudXJsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRIdHRwVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHBhcnNlZFVybDogVVJMO1xuICB0cnkge1xuICAgIHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBVUkw6ICR7dXJsfWApO1xuICB9XG4gIGlmICghU1VQUE9SVEVEX1BST1RPQ09MUy5oYXMocGFyc2VkVXJsLnByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sICR7cGFyc2VkVXJsLnByb3RvY29sfSBpbiAke3VybH06IG9ubHkgaHR0cDogYW5kIGh0dHBzOiBVUkxzIGNhbiBiZSByZXF1ZXN0ZWRgKTtcbiAgfVxuICByZXR1cm4gdXJsO1xufVxuXG5mdW5jdGlvbiBjb25jYXRCeXRlcyhjaHVua3M6IHJlYWRvbmx5IFVpbnQ4QXJyYXlbXSk6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgbGVuZ3RoID0gY2h1bmtzLnJlZHVjZSgoc3VtLCBjaHVuaykgPT4gc3VtICsgY2h1bmsuYnl0ZUxlbmd0aCwgMCk7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgYnl0ZXMuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICB9XG4gIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlKHN0YXR1czogbnVtYmVyLCBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiwgYm9keTogQXJyYXlCdWZmZXIgfCBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiwgdXJsOiBzdHJpbmcpOiBSZXNwb25zZSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKE5VTExfQk9EWV9TVEFUVVNFUy5oYXMoc3RhdHVzKSA/IG51bGwgOiBib2R5LCB7XG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnMoeyAuLi5oZWFkZXJzIH0pLFxuICAgIHN0YXR1c1xuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3BvbnNlLCAndXJsJywgeyB2YWx1ZTogdXJsIH0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZUNodW5rU3RyZWFtKGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgc3RhcnQoY29udHJvbGxlcik6IHZvaWQge1xuICAgICAgaWYgKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgfVxuICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVuY29kZUJvZHkoYm9keTogUmVxdWVzdFVybEV4Qm9keSB8IHVuZGVmaW5lZCk6IFByb21pc2U8RW5jb2RlZEJvZHk+IHtcbiAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVuY29kZWRCb2R5Pih7IGJvZHkgfSk7XG4gIH1cblxuICAvLyBgaW5zdGFuY2VvZmAgZmFpbHMgYWNyb3NzIHdpbmRvd3MsIHNvIHRoZSBib2R5IGtpbmRzIGFyZSB0b2xkIGFwYXJ0IGJ5IHRoZWlyIGJ1aWx0LWluIHRhZ3MuXG4gIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpKSB7XG4gICAgY2FzZSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nOiB7XG4gICAgICByZXR1cm4geyBib2R5OiBib2R5IGFzIEFycmF5QnVmZmVyIH07XG4gICAgfVxuICAgIGNhc2UgJ1tvYmplY3QgQmxvYl0nOlxuICAgIGNhc2UgJ1tvYmplY3QgRmlsZV0nOiB7XG4gICAgICBjb25zdCBibG9iID0gYm9keSBhcyBCbG9iO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFbmNvZGVkQm9keT4oeyBib2R5OiBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCksIGNvbnRlbnRUeXBlOiBibG9iLnR5cGUgfHwgdW5kZWZpbmVkIH0pO1xuICAgIH1cbiAgICBjYXNlICdbb2JqZWN0IEZvcm1EYXRhXSc6IHtcbiAgICAgIHJldHVybiBhd2FpdCBlbmNvZGVGb3JtRGF0YShib2R5IGFzIEZvcm1EYXRhKTtcbiAgICB9XG4gICAgY2FzZSAnW29iamVjdCBSZWFkYWJsZVN0cmVhbV0nOiB7XG4gICAgICByZXR1cm4geyBib2R5OiBhd2FpdCByZWFkU3RyZWFtKGJvZHkgYXMgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4pIH07XG4gICAgfVxuICAgIGNhc2UgJ1tvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSc6IHtcbiAgICAgIHJldHVybiB7IGJvZHk6IChib2R5IGFzIFVSTFNlYXJjaFBhcmFtcykudG9TdHJpbmcoKSwgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcgfTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSkge1xuICAgICAgICByZXR1cm4geyBib2R5OiBuZXcgVWludDhBcnJheShib2R5LmJ1ZmZlciwgYm9keS5ieXRlT2Zmc2V0LCBib2R5LmJ5dGVMZW5ndGgpLnNsaWNlKCkuYnVmZmVyIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCByZXF1ZXN0IGJvZHk6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpfWApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbmNvZGVGb3JtRGF0YShmb3JtRGF0YTogRm9ybURhdGEpOiBQcm9taXNlPEVuY29kZWRCb2R5PiB7XG4gIGNvbnN0IGJvdW5kYXJ5ID0gYC0tLS1PYnNpZGlhbkxpYkZvcm1Cb3VuZGFyeSR7Z2VuZXJhdGVSYW5kb21IZXgoKX1gO1xuICBjb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBGb3JtRGF0YUVudHJ5VmFsdWVdW10gPSBbXTtcbiAgZm9ybURhdGEuZm9yRWFjaCgodmFsdWUsIG5hbWUpID0+IHtcbiAgICBlbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgbGV0IGhlYWRlciA9IGAtLSR7Ym91bmRhcnl9XFxyXFxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiJHtlc2NhcGVNdWx0aXBhcnROYW1lKG5hbWUpfVwiYDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY2h1bmtzLnB1c2godGV4dEVuY29kZXIuZW5jb2RlKGAke2hlYWRlcn1cXHJcXG5cXHJcXG4ke3ZhbHVlfVxcclxcbmApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBoZWFkZXIgKz0gYDsgZmlsZW5hbWU9XCIke2VzY2FwZU11bHRpcGFydE5hbWUodmFsdWUubmFtZSl9XCJcXHJcXG5Db250ZW50LVR5cGU6ICR7dmFsdWUudHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ31cXHJcXG5cXHJcXG5gO1xuICAgIGNodW5rcy5wdXNoKHRleHRFbmNvZGVyLmVuY29kZShoZWFkZXIpLCBuZXcgVWludDhBcnJheShhd2FpdCB2YWx1ZS5hcnJheUJ1ZmZlcigpKSwgdGV4dEVuY29kZXIuZW5jb2RlKCdcXHJcXG4nKSk7XG4gIH1cblxuICBjaHVua3MucHVzaCh0ZXh0RW5jb2Rlci5lbmNvZGUoYC0tJHtib3VuZGFyeX0tLVxcclxcbmApKTtcbiAgcmV0dXJuIHsgYm9keTogY29uY2F0Qnl0ZXMoY2h1bmtzKSwgY29udGVudFR5cGU6IGBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0ke2JvdW5kYXJ5fWAgfTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlTXVsdGlwYXJ0TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBUaGUgZXNjYXBpbmcgdGhlIEhUTUwgc3RhbmRhcmQgcHJlc2NyaWJlcyBmb3IgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBuYW1lcyBhbmQgZmlsZSBuYW1lcy5cbiAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnXCInLCAnJTIyJykucmVwbGFjZUFsbCgnXFxyJywgJyUwRCcpLnJlcGxhY2VBbGwoJ1xcbicsICclMEEnKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21IZXgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IEJPVU5EQVJZX1JBTkRPTV9QQVJUX0NPVU5UIH0sICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoSEVYX1JBRElYKS5zbGljZShSQU5ET01fUEFSVF9TVEFSVCkpLmpvaW4oJycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByYWNlV2l0aEFib3J0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VD4ge1xuICBsZXQgcmVqZWN0T25BYm9ydDogKHJlYXNvbjogRXJyb3IpID0+IHZvaWQgPSBub29wO1xuICBjb25zdCBhYm9ydFByb21pc2UgPSBuZXcgUHJvbWlzZTxuZXZlcj4oKF9yZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZWplY3RPbkFib3J0ID0gcmVqZWN0O1xuICB9KTtcbiAgdXNpbmcgX2Fib3J0TGlzdGVuZXIgPSBvbkFib3J0KGFib3J0U2lnbmFsLCAoKSA9PiB7XG4gICAgLy8gVGhlIHJlYXNvbiBpcyB3aGF0ZXZlciB0aGUgY2FsbGVyIGFib3J0ZWQgd2l0aCwgYW4gYEFib3J0RXJyb3JgIG9yIGBUaW1lb3V0RXJyb3JgIGJ5IGRlZmF1bHQuXG4gICAgcmVqZWN0T25BYm9ydChhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICB9KTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbcHJvbWlzZSwgYWJvcnRQcm9taXNlXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjaHVua3MucHVzaChyZXN1bHQudmFsdWUpO1xuICB9XG4gIHJldHVybiBjb25jYXRCeXRlcyhjaHVua3MpO1xufVxuXG5mdW5jdGlvbiB0b0hlYWRlclJlY29yZChyZXF1ZXN0SGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZCwgaW5pdEhlYWRlcnM6IEhlYWRlcnNJbml0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0SGVhZGVycyk7XG4gIG5ldyBIZWFkZXJzKGluaXRIZWFkZXJzKS5mb3JFYWNoKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfSk7XG4gIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBoZWFkZXJzLmZvckVhY2goKHZhbHVlLCBuYW1lKSA9PiB7XG4gICAgcmVjb3JkW25hbWVdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVjb3JkO1xufVxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkE7QUFB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
@@ -0,0 +1,73 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Contains a component that edits a reorderable list of folders, with a folder suggest.
7
+ */
8
+ import type { App, TFolder } from 'obsidian';
9
+ import { AbstractInputSuggest } from 'obsidian';
10
+ import { ListComponent } from './list-component.mjs';
11
+ /**
12
+ * Suggests the vault's folders, the root included, in an `<input>`, matching the typed text against the folder path.
13
+ */
14
+ export declare class FolderInputSuggest extends AbstractInputSuggest<TFolder> {
15
+ /**
16
+ * The input the suggest completes.
17
+ */
18
+ protected readonly inputEl: HTMLInputElement;
19
+ /**
20
+ * Creates a new folder suggest.
21
+ *
22
+ * @param app - The Obsidian app.
23
+ * @param inputEl - The input.
24
+ */
25
+ constructor(app: App, inputEl: HTMLInputElement);
26
+ /**
27
+ * Renders a folder.
28
+ *
29
+ * @param folder - The folder.
30
+ * @param el - The element to render into.
31
+ */
32
+ renderSuggestion(folder: TFolder, el: HTMLElement): void;
33
+ /**
34
+ * Puts the folder path into the input, dispatches an `input` event, then calls the `onSelect` callback.
35
+ *
36
+ * @param folder - The folder.
37
+ * @param $event - The event that picked it.
38
+ */
39
+ selectSuggestion(folder: TFolder, $event: KeyboardEvent | MouseEvent): void;
40
+ /**
41
+ * Gets the folders matching the typed text.
42
+ *
43
+ * @param query - The typed text.
44
+ * @returns The folders, best match first.
45
+ */
46
+ protected getSuggestions(query: string): TFolder[];
47
+ }
48
+ /**
49
+ * A {@link ListComponent} of vault folder paths: the add row suggests the vault's folders, and a typed path is
50
+ * normalized with Obsidian's `normalizePath`, so the root reads as `/`. A path need not exist yet.
51
+ *
52
+ * You can add this component using {@link SettingEx.addFolderList}.
53
+ */
54
+ export declare class FolderListComponent extends ListComponent {
55
+ /**
56
+ * The folder suggest attached to {@link ListComponent.newItemInputEl}.
57
+ */
58
+ readonly suggest: FolderInputSuggest;
59
+ /**
60
+ * Creates a new folder list component.
61
+ *
62
+ * @param containerEl - The container element.
63
+ * @param app - The Obsidian app.
64
+ */
65
+ constructor(containerEl: HTMLElement, app: App);
66
+ /**
67
+ * Normalizes a typed folder path.
68
+ *
69
+ * @param text - The typed text.
70
+ * @returns The normalized path, or `null` for empty text.
71
+ */
72
+ protected normalizeItem(text: string): null | string;
73
+ }