@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.
- package/codemirror/inline-token-widgets/package.json +6 -0
- package/codemirror/settings-facet/package.json +6 -0
- package/components/settings-facet-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +96 -1
- package/dist/lib/cjs/__merged.d.cts +17 -0
- package/dist/lib/cjs/anchored-suggest.cjs +232 -0
- package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
- package/dist/lib/cjs/bug-report.cjs +4 -2
- package/dist/lib/cjs/bug-report.d.cts +1 -1
- package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
- package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
- package/dist/lib/cjs/codemirror/index.cjs +7 -1
- package/dist/lib/cjs/codemirror/index.d.cts +2 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
- package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
- package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
- package/dist/lib/cjs/components/index.cjs +4 -1
- package/dist/lib/cjs/components/index.d.cts +1 -0
- package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
- package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
- package/dist/lib/cjs/css-class.cjs +8 -1
- package/dist/lib/cjs/css-class.d.cts +28 -0
- package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
- package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
- package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
- package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
- package/dist/lib/cjs/editor-suggest.cjs +198 -0
- package/dist/lib/cjs/editor-suggest.d.cts +103 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/hotkey.cjs +185 -0
- package/dist/lib/cjs/hotkey.d.cts +59 -0
- package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
- package/dist/lib/cjs/index.cjs +31 -1
- package/dist/lib/cjs/index.d.cts +10 -0
- package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
- package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
- package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
- package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
- package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
- package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
- package/dist/lib/cjs/markdown.cjs +6 -1
- package/dist/lib/cjs/markdown.d.cts +10 -1
- package/dist/lib/cjs/rendered-markdown.cjs +306 -0
- package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
- package/dist/lib/cjs/request-url.cjs +523 -0
- package/dist/lib/cjs/request-url.d.cts +233 -0
- package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
- package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
- package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
- package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
- package/dist/lib/cjs/setting-components/index.cjs +13 -1
- package/dist/lib/cjs/setting-components/index.d.cts +4 -0
- package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
- package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
- package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
- package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
- package/dist/lib/cjs/setting-ex.cjs +51 -1
- package/dist/lib/cjs/setting-ex.d.cts +35 -1
- package/dist/lib/cjs/settings-tabs.cjs +258 -0
- package/dist/lib/cjs/settings-tabs.d.cts +101 -0
- package/dist/lib/esm/__merged.d.mts +17 -0
- package/dist/lib/esm/__merged.mjs +99 -1
- package/dist/lib/esm/anchored-suggest.d.mts +116 -0
- package/dist/lib/esm/anchored-suggest.mjs +144 -0
- package/dist/lib/esm/bug-report.d.mts +1 -1
- package/dist/lib/esm/bug-report.mjs +4 -2
- package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
- package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
- package/dist/lib/esm/codemirror/index.d.mts +2 -0
- package/dist/lib/esm/codemirror/index.mjs +5 -1
- package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
- package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
- package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
- package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
- package/dist/lib/esm/components/index.d.mts +1 -0
- package/dist/lib/esm/components/index.mjs +3 -1
- package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
- package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
- package/dist/lib/esm/css-class.d.mts +28 -0
- package/dist/lib/esm/css-class.mjs +8 -1
- package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
- package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
- package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
- package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
- package/dist/lib/esm/editor-suggest.d.mts +103 -0
- package/dist/lib/esm/editor-suggest.mjs +109 -0
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/hotkey.d.mts +59 -0
- package/dist/lib/esm/hotkey.mjs +95 -0
- package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
- package/dist/lib/esm/i18n/locales/en.mjs +13 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
- package/dist/lib/esm/index.d.mts +10 -0
- package/dist/lib/esm/index.mjs +21 -1
- package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
- package/dist/lib/esm/inline-token-renderer.mjs +59 -0
- package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
- package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
- package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
- package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
- package/dist/lib/esm/markdown.d.mts +10 -1
- package/dist/lib/esm/markdown.mjs +9 -1
- package/dist/lib/esm/rendered-markdown.d.mts +77 -0
- package/dist/lib/esm/rendered-markdown.mjs +219 -0
- package/dist/lib/esm/request-url.d.mts +233 -0
- package/dist/lib/esm/request-url.mjs +428 -0
- package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
- package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
- package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
- package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
- package/dist/lib/esm/setting-components/index.d.mts +4 -0
- package/dist/lib/esm/setting-components/index.mjs +9 -1
- package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
- package/dist/lib/esm/setting-components/list-component.mjs +206 -0
- package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
- package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
- package/dist/lib/esm/setting-ex.d.mts +35 -1
- package/dist/lib/esm/setting-ex.mjs +51 -1
- package/dist/lib/esm/settings-tabs.d.mts +101 -0
- package/dist/lib/esm/settings-tabs.mjs +170 -0
- package/dist/styles.css +83 -1
- package/package.json +1 -1
- package/setting-components/folder-list-component/package.json +6 -0
- package/setting-components/hotkey-component/package.json +6 -0
- package/setting-components/list-component/package.json +6 -0
- package/setting-components/tag-list-component/package.json +6 -0
|
@@ -0,0 +1,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
|
+
}
|