@dbx-tools/shared-core 0.9.5 → 0.9.6

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/lib/src/error.js DELETED
@@ -1,168 +0,0 @@
1
- /**
2
- * Error normalization helpers: collapse the ubiquitous
3
- * `err instanceof Error ? err.message : String(err)` dance into a single
4
- * call, walk `cause` / `AggregateError` chains, and coerce any thrown
5
- * value into a real `Error`. Dependency-free and browser-safe.
6
- *
7
- * @module
8
- */
9
- import { tokenizeWithOptions } from "./string.js";
10
- /**
11
- * Normalize any thrown value into an `Error`. Returns `value` unchanged
12
- * when it already is an `Error`, otherwise wraps its {@link errorMessage}
13
- * in a fresh `Error`. Use when a consumer needs a real `Error` object
14
- * (React error state, `reject`, rethrow) rather than just a printable
15
- * string.
16
- */
17
- export function toError(value) {
18
- return value instanceof Error ? value : new Error(errorMessage(value));
19
- }
20
- /**
21
- * Extract a human-readable message from any thrown value. Returns
22
- * `value.message` when `value` is an `Error`, otherwise coerces via
23
- * `String(value)`. Collapses the ubiquitous
24
- *
25
- * ```ts
26
- * err instanceof Error ? err.message : String(err)
27
- * ```
28
- *
29
- * dance into a single helper, useful for log attributes and any other
30
- * "give me something printable" context.
31
- */
32
- export function errorMessage(value) {
33
- const message = errorMessages(value).next().value;
34
- return message ?? String(value);
35
- }
36
- /**
37
- * Yield `message` / `errorCode` strings from every node in the error
38
- * tree (see {@link errorNodes}). Used by {@link errorMessage} and
39
- * message predicates elsewhere.
40
- */
41
- export function* errorMessages(value) {
42
- for (const node of errorNodes(value)) {
43
- if (typeof node === "object") {
44
- for (const key of ["message", "errorCode"]) {
45
- if (key in node) {
46
- const value = node[key];
47
- if (typeof value === "string" && value) {
48
- yield value;
49
- }
50
- }
51
- }
52
- }
53
- else if (typeof node === "string" && node) {
54
- yield node;
55
- }
56
- }
57
- }
58
- /**
59
- * Depth-first walk of an error value: the root, then `errors` (e.g.
60
- * `AggregateError`) and `cause` chains. Cycle-safe via a `seen` set.
61
- */
62
- export function* errorNodes(err) {
63
- const seen = new Set();
64
- function* visit(node) {
65
- if (node === undefined || node === null)
66
- return;
67
- if (Array.isArray(node)) {
68
- for (const child of node) {
69
- yield* visit(child);
70
- }
71
- return;
72
- }
73
- if (seen.has(node))
74
- return;
75
- seen.add(node);
76
- yield node;
77
- if (typeof node === "object") {
78
- for (const key of ["errors", "cause"]) {
79
- if (key in node) {
80
- const value = node[key];
81
- yield* visit(value);
82
- }
83
- }
84
- }
85
- }
86
- yield* visit(err);
87
- }
88
- class ErrorContextImpl {
89
- err;
90
- _statusCode;
91
- _messages;
92
- _messageTokens;
93
- constructor(err) {
94
- this.err = err;
95
- }
96
- /** Last positive `statusCode` / `code` found on the error tree, else `undefined` (0 ignored). */
97
- get statusCode() {
98
- if (this._statusCode === undefined) {
99
- outer: for (const node of errorNodes(this.err)) {
100
- if (typeof node !== "object" || node === null)
101
- continue;
102
- for (const key of ["statusCode", "code"]) {
103
- if (!(key in node))
104
- continue;
105
- const value = node[key];
106
- if (typeof value === "number" && value > 99 && value < 600) {
107
- this._statusCode = value;
108
- break outer;
109
- }
110
- }
111
- }
112
- if (this._statusCode === undefined) {
113
- this._statusCode = -1;
114
- }
115
- }
116
- return this._statusCode == -1 ? undefined : this._statusCode;
117
- }
118
- /** Every `message` / `errorCode` string in the error tree. */
119
- get messages() {
120
- if (this._messages === undefined) {
121
- this._messages = [...errorMessages(this.err)];
122
- }
123
- return this._messages;
124
- }
125
- /** Lowercased tokens from {@link messages}. */
126
- get messageTokens() {
127
- if (this._messageTokens === undefined) {
128
- this._messageTokens = [...tokenizeWithOptions({ lowerCase: true }, ...this.messages)];
129
- }
130
- return this._messageTokens;
131
- }
132
- /** True for any 4xx status or message tokens `not exist` / `not found`. */
133
- get notAccessible() {
134
- if (this.hasStatusCode(4))
135
- return true;
136
- return this.hasMessage("not", "exist") || this.hasMessage("not", "found");
137
- }
138
- /**
139
- * Match HTTP status. Pass a full code (`404`) or a class (`4` for any 4xx).
140
- * Extra filters are OR'd. `false` when no status is on the error tree.
141
- */
142
- hasStatusCode(statusCodeFilter, ...statusCodeFilters) {
143
- const code = this.statusCode;
144
- if (code) {
145
- for (const filter of [statusCodeFilter, ...statusCodeFilters]) {
146
- const match = (filter < 100 ? Math.trunc(code / 100) : code) === filter;
147
- if (match)
148
- return true;
149
- }
150
- }
151
- return false;
152
- }
153
- /**
154
- * True when every token from the filter phrase(s) appears in
155
- * {@link messageTokens}. Each argument is tokenized on non-alphanumeric
156
- * boundaries (e.g. `hasMessage("not", "found")` or `hasMessage("not found")`).
157
- */
158
- hasMessage(messageFilter, ...messageFilters) {
159
- return [messageFilter, ...messageFilters]
160
- .flatMap((filter) => Array.from(tokenizeWithOptions({ lowerCase: true }, filter)))
161
- .every((filterToken) => this.messageTokens.includes(filterToken));
162
- }
163
- }
164
- /** Build an {@link ErrorContext} for status + message checks. `null` / `undefined` become `{}`. */
165
- export function errorContext(err) {
166
- return new ErrorContextImpl(err ?? {});
167
- }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEtBQWM7SUFDcEMsT0FBTyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYztJQUN6QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ2xELE9BQU8sT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQWM7SUFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sS0FBSyxHQUFJLElBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUN2QyxNQUFNLEtBQUssQ0FBQztvQkFDZCxDQUFDO2dCQUNILENBQUM7WUFDSCxD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LENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUM7Z0JBQ3hFLElBQUksS0FBSztvQkFBRSxPQUFPLElBQUksQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsYUFBcUIsRUFBRSxHQUFHLGNBQXdCO1FBQzNELE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxjQUFjLENBQUM7YUFDdEMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDakYsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7Q0FDRjtBQUVELG1HQUFtRztBQUNuRyxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVk7SUFDdkMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFcnJvciBub3JtYWxpemF0aW9uIGhlbHBlcnM6IGNvbGxhcHNlIHRoZSB1YmlxdWl0b3VzXG4gKiBgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpYCBkYW5jZSBpbnRvIGEgc2luZ2xlXG4gKiBjYWxsLCB3YWxrIGBjYXVzZWAgLyBgQWdncmVnYXRlRXJyb3JgIGNoYWlucywgYW5kIGNvZXJjZSBhbnkgdGhyb3duXG4gKiB2YWx1ZSBpbnRvIGEgcmVhbCBgRXJyb3JgLiBEZXBlbmRlbmN5LWZyZWUgYW5kIGJyb3dzZXItc2FmZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdG9rZW5pemVXaXRoT3B0aW9ucyB9IGZyb20gXCIuL3N0cmluZy50c1wiO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbnkgdGhyb3duIHZhbHVlIGludG8gYW4gYEVycm9yYC4gUmV0dXJucyBgdmFsdWVgIHVuY2hhbmdlZFxuICogd2hlbiBpdCBhbHJlYWR5IGlzIGFuIGBFcnJvcmAsIG90aGVyd2lzZSB3cmFwcyBpdHMge0BsaW5rIGVycm9yTWVzc2FnZX1cbiAqIGluIGEgZnJlc2ggYEVycm9yYC4gVXNlIHdoZW4gYSBjb25zdW1lciBuZWVkcyBhIHJlYWwgYEVycm9yYCBvYmplY3RcbiAqIChSZWFjdCBlcnJvciBzdGF0ZSwgYHJlamVjdGAsIHJldGhyb3cpIHJhdGhlciB0aGFuIGp1c3QgYSBwcmludGFibGVcbiAqIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRXJyb3IodmFsdWU6IHVua25vd24pOiBFcnJvciB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yID8gdmFsdWUgOiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKHZhbHVlKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgZnJvbSBhbnkgdGhyb3duIHZhbHVlLiBSZXR1cm5zXG4gKiBgdmFsdWUubWVzc2FnZWAgd2hlbiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIG90aGVyd2lzZSBjb2VyY2VzIHZpYVxuICogYFN0cmluZyh2YWx1ZSlgLiBDb2xsYXBzZXMgdGhlIHViaXF1aXRvdXNcbiAqXG4gKiBgYGB0c1xuICogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gKiBgYGBcbiAqXG4gKiBkYW5jZSBpbnRvIGEgc2luZ2xlIGhlbHBlciwgdXNlZnVsIGZvciBsb2cgYXR0cmlidXRlcyBhbmQgYW55IG90aGVyXG4gKiBcImdpdmUgbWUgc29tZXRoaW5nIHByaW50YWJsZVwiIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3JNZXNzYWdlcyh2YWx1ZSkubmV4dCgpLnZhbHVlO1xuICByZXR1cm4gbWVzc2FnZSA/PyBTdHJpbmcodmFsdWUpO1xufVxuXG4vKipcbiAqIFlpZWxkIGBtZXNzYWdlYCAvIGBlcnJvckNvZGVgIHN0cmluZ3MgZnJvbSBldmVyeSBub2RlIGluIHRoZSBlcnJvclxuICogdHJlZSAoc2VlIHtAbGluayBlcnJvck5vZGVzfSkuIFVzZWQgYnkge0BsaW5rIGVycm9yTWVzc2FnZX0gYW5kXG4gKiBtZXNzYWdlIHByZWRpY2F0ZXMgZWxzZXdoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGVycm9yTWVzc2FnZXModmFsdWU6IHVua25vd24pOiBHZW5lcmF0b3I8c3RyaW5nLCB2b2lkLCB1bmRlZmluZWQ+IHtcbiAgZm9yIChjb25zdCBub2RlIG9mIGVycm9yTm9kZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBbXCJtZXNzYWdlXCIsIFwiZXJyb3JDb2RlXCJdKSB7XG4gICAgICAgIGlmIChrZXkgaW4gbm9kZSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIiAmJiBub2RlKSB7XG4gICAgICB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERlcHRoLWZpcnN0IHdhbGsgb2YgYW4gZXJyb3IgdmFsdWU6IHRoZSByb290LCB0aGVuIGBlcnJvcnNgIChlLmcuXG4gKiBgQWdncmVnYXRlRXJyb3JgKSBhbmQgYGNhdXNlYCBjaGFpbnMuIEN5Y2xlLXNhZmUgdmlhIGEgYHNlZW5gIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiBlcnJvck5vZGVzKGVycjogdW5rbm93bik6IEdlbmVyYXRvcjxOb25OdWxsYWJsZTx1bmtub3duPiwgdm9pZCwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG5cbiAgZnVuY3Rpb24qIHZpc2l0KG5vZGU6IHVua25vd24pOiBHZW5lcmF0b3I8Tm9uTnVsbGFibGU8dW5rbm93bj4sIHZvaWQsIHVuZGVmaW5lZD4ge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUpIHtcbiAgICAgICAgeWllbGQqIHZpc2l0KGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKG5vZGUpKSByZXR1cm47XG4gICAgc2Vlbi5hZGQobm9kZSk7XG4gICAgeWllbGQgbm9kZTtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIFtcImVycm9yc1wiLCBcImNhdXNlXCJdKSB7XG4gICAgICAgIGlmIChrZXkgaW4gbm9kZSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICAgICAgeWllbGQqIHZpc2l0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB5aWVsZCogdmlzaXQoZXJyKTtcbn1cblxuLyoqXG4gKiBMYXp5IHZpZXcgb3ZlciBhIHRocm93biB2YWx1ZSBmb3IgSFRUUC1zdGF0dXMgKyBtZXNzYWdlIGNsYXNzaWZpY2F0aW9uLlxuICogU3RhdHVzIGNvbWVzIGZyb20gdGhlIGxhc3QgcG9zaXRpdmUgYHN0YXR1c0NvZGVgIC8gYGNvZGVgIG9uIHRoZSBlcnJvciB0cmVlO1xuICogbWVzc2FnZXMvdG9rZW5zIGNvbWUgZnJvbSBldmVyeSBgbWVzc2FnZWAgLyBgZXJyb3JDb2RlYCBmaWVsZCAoaW5jbHVkaW5nXG4gKiBgY2F1c2VgIGFuZCBgQWdncmVnYXRlRXJyb3IuZXJyb3JzYCkuIEJ1aWxkIHdpdGgge0BsaW5rIGVycm9yQ29udGV4dH0uXG4gKi9cbmV4cG9ydCB0eXBlIEVycm9yQ29udGV4dCA9IEVycm9yQ29udGV4dEltcGw7XG5cbmNsYXNzIEVycm9yQ29udGV4dEltcGwge1xuICBwcml2YXRlIF9zdGF0dXNDb2RlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX21lc3NhZ2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbWVzc2FnZVRva2Vuczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlcnI6IE5vbk51bGxhYmxlPHVua25vd24+KSB7fVxuXG4gIC8qKiBMYXN0IHBvc2l0aXZlIGBzdGF0dXNDb2RlYCAvIGBjb2RlYCBmb3VuZCBvbiB0aGUgZXJyb3IgdHJlZSwgZWxzZSBgdW5kZWZpbmVkYCAoMCBpZ25vcmVkKS4gKi9cbiAgZ2V0IHN0YXR1c0NvZGUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fc3RhdHVzQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvdXRlcjogZm9yIChjb25zdCBub2RlIG9mIGVycm9yTm9kZXModGhpcy5lcnIpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIiB8fCBub2RlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgW1wic3RhdHVzQ29kZVwiLCBcImNvZGVcIl0gYXMgY29uc3QpIHtcbiAgICAgICAgICBpZiAoIShrZXkgaW4gbm9kZSkpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA+IDk5ICYmIHZhbHVlIDwgNjAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNDb2RlID0gdmFsdWU7XG4gICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zdGF0dXNDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzQ29kZSA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzQ29kZSA9PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuX3N0YXR1c0NvZGU7XG4gIH1cblxuICAvKiogRXZlcnkgYG1lc3NhZ2VgIC8gYGVycm9yQ29kZWAgc3RyaW5nIGluIHRoZSBlcnJvciB0cmVlLiAqL1xuICBnZXQgbWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLl9tZXNzYWdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlcyA9IFsuLi5lcnJvck1lc3NhZ2VzKHRoaXMuZXJyKV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlcztcbiAgfVxuXG4gIC8qKiBMb3dlcmNhc2VkIHRva2VucyBmcm9tIHtAbGluayBtZXNzYWdlc30uICovXG4gIGdldCBtZXNzYWdlVG9rZW5zKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZVRva2VucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlVG9rZW5zID0gWy4uLnRva2VuaXplV2l0aE9wdGlvbnMoeyBsb3dlckNhc2U6IHRydWUgfSwgLi4udGhpcy5tZXNzYWdlcyldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZVRva2VucztcbiAgfVxuXG4gIC8qKiBUcnVlIGZvciBhbnkgNHh4IHN0YXR1cyBvciBtZXNzYWdlIHRva2VucyBgbm90IGV4aXN0YCAvIGBub3QgZm91bmRgLiAqL1xuICBnZXQgbm90QWNjZXNzaWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNTdGF0dXNDb2RlKDQpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNNZXNzYWdlKFwibm90XCIsIFwiZXhpc3RcIikgfHwgdGhpcy5oYXNNZXNzYWdlKFwibm90XCIsIFwiZm91bmRcIik7XG4gIH1cblxuICAvKipcbiAgICogTWF0Y2ggSFRUUCBzdGF0dXMuIFBhc3MgYSBmdWxsIGNvZGUgKGA0MDRgKSBvciBhIGNsYXNzIChgNGAgZm9yIGFueSA0eHgpLlxuICAgKiBFeHRyYSBmaWx0ZXJzIGFyZSBPUidkLiBgZmFsc2VgIHdoZW4gbm8gc3RhdHVzIGlzIG9uIHRoZSBlcnJvciB0cmVlLlxuICAgKi9cbiAgaGFzU3RhdHVzQ29kZShzdGF0dXNDb2RlRmlsdGVyOiBudW1iZXIsIC4uLnN0YXR1c0NvZGVGaWx0ZXJzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLnN0YXR1c0NvZGU7XG4gICAgaWYgKGNvZGUpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIFtzdGF0dXNDb2RlRmlsdGVyLCAuLi5zdGF0dXNDb2RlRmlsdGVyc10pIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAoZmlsdGVyIDwgMTAwID8gTWF0aC50cnVuYyhjb2RlIC8gMTAwKSA6IGNvZGUpID09PSBmaWx0ZXI7XG4gICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gZXZlcnkgdG9rZW4gZnJvbSB0aGUgZmlsdGVyIHBocmFzZShzKSBhcHBlYXJzIGluXG4gICAqIHtAbGluayBtZXNzYWdlVG9rZW5zfS4gRWFjaCBhcmd1bWVudCBpcyB0b2tlbml6ZWQgb24gbm9uLWFscGhhbnVtZXJpY1xuICAgKiBib3VuZGFyaWVzIChlLmcuIGBoYXNNZXNzYWdlKFwibm90XCIsIFwiZm91bmRcIilgIG9yIGBoYXNNZXNzYWdlKFwibm90IGZvdW5kXCIpYCkuXG4gICAqL1xuICBoYXNNZXNzYWdlKG1lc3NhZ2VGaWx0ZXI6IHN0cmluZywgLi4ubWVzc2FnZUZpbHRlcnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFttZXNzYWdlRmlsdGVyLCAuLi5tZXNzYWdlRmlsdGVyc11cbiAgICAgIC5mbGF0TWFwKChmaWx0ZXIpID0+IEFycmF5LmZyb20odG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSB9LCBmaWx0ZXIpKSlcbiAgICAgIC5ldmVyeSgoZmlsdGVyVG9rZW4pID0+IHRoaXMubWVzc2FnZVRva2Vucy5pbmNsdWRlcyhmaWx0ZXJUb2tlbikpO1xuICB9XG59XG5cbi8qKiBCdWlsZCBhbiB7QGxpbmsgRXJyb3JDb250ZXh0fSBmb3Igc3RhdHVzICsgbWVzc2FnZSBjaGVja3MuIGBudWxsYCAvIGB1bmRlZmluZWRgIGJlY29tZSBge31gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29udGV4dChlcnI6IHVua25vd24pOiBFcnJvckNvbnRleHQge1xuICByZXR1cm4gbmV3IEVycm9yQ29udGV4dEltcGwoZXJyID8/IHt9KTtcbn1cbiJdfQ==
@@ -1,44 +0,0 @@
1
- export function memoize(factory, options) {
2
- const ttlMs = options?.ttlMs ?? 0;
3
- let cache;
4
- return () => {
5
- if (cache === undefined || (ttlMs > 0 && Date.now() >= cache.expiresAt)) {
6
- const result = factory();
7
- if (isThenable(result)) {
8
- const pending = Promise.resolve(result);
9
- // `Infinity` keeps the entry unexpired while in flight (so a slow
10
- // request isn't refetched and concurrent callers share it); the
11
- // TTL window is stamped from resolution below.
12
- const entry = { value: pending, expiresAt: Infinity };
13
- cache = entry;
14
- void pending.then(() => {
15
- entry.expiresAt = Date.now() + ttlMs;
16
- },
17
- // Never cache a rejection: evict so a later call retries.
18
- () => {
19
- if (cache === entry)
20
- cache = undefined;
21
- });
22
- }
23
- else {
24
- cache = { value: result, expiresAt: Date.now() + ttlMs };
25
- }
26
- }
27
- return cache.value;
28
- };
29
- }
30
- /** Duck-type any value with a callable `.then` as a thenable. */
31
- function isThenable(value) {
32
- if (value !== null) {
33
- if (value instanceof Promise) {
34
- return true;
35
- }
36
- else if (typeof value === "object" &&
37
- "then" in value &&
38
- typeof value.then === "function") {
39
- return true;
40
- }
41
- }
42
- return false;
43
- }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNENBLE1BQU0sVUFBVSxPQUFPLENBQ3JCLE9BQWlDLEVBQ2pDLE9BQXdCO0lBRXhCLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2xDLElBQUksS0FBK0QsQ0FBQztJQUNwRSxPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hDLGtFQUFrRTtnQkFDbEUsZ0VBQWdFO2dCQUNoRSwrQ0FBK0M7Z0JBQy9DLE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ3RELEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2QsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUNmLEdBQUcsRUFBRTtvQkFDSCxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsMERBQTBEO2dCQUMxRCxHQUFHLEVBQUU7b0JBQ0gsSUFBSSxLQUFLLEtBQUssS0FBSzt3QkFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUN6QyxDQUFDLENBQ0YsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxTQUFTLFVBQVUsQ0FBSSxLQUF5QjtJQUM5QyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQixJQUFJLEtBQUssWUFBWSxPQUFPLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsTUFBTSxJQUFJLEtBQUs7WUFDZixPQUFRLEtBQXdCLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFDcEQsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQ2FjaGUgbGlmZXRpbWUgY29udHJvbHMgZm9yIHtAbGluayBtZW1vaXplfTsgZmFpbHVyZXMgYXJlIGFsd2F5cyBldmljdGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW1vaXplT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lLXRvLWxpdmUgaW4gbWlsbGlzZWNvbmRzLiBUaGUgY2FjaGVkIHZhbHVlIGV4cGlyZXMgYHR0bE1zYCBhZnRlclxuICAgKiBpdCB3YXMgc3RvcmVkLCBzbyB0aGUgbmV4dCBjYWxsIHBhc3QgdGhhdCByZWNvbXB1dGVzOyBhIHJlamVjdGlvbiBpc1xuICAgKiBhbHNvIGV2aWN0ZWQgc28gYSBsYXRlciBjYWxsIHJldHJpZXMgcmF0aGVyIHRoYW4gcmVwbGF5aW5nIHRoZSBlcnJvci5cbiAgICogT21pdHRlZCBvciBgPD0gMGAgbWVhbnMgYSBzdWNjZXNzZnVsIHZhbHVlIGlzIGNhY2hlZCBmb3JldmVyICh0aGUgZGVmYXVsdCkuXG4gICAqIEVycm9ycyBhcmUgbmV2ZXIgY2FjaGVkIC0gc2VlIHtAbGluayBtZW1vaXplfS5cbiAgICpcbiAgICogVXNlIGZvciBwZXJpb2RpY2FsbHktcmVmcmVzaGVkIGRhdGEgKHB1Ymxpc2hlZCBJUCByYW5nZXMsIGZlYXR1cmVcbiAgICogZmxhZ3MsIGFueXRoaW5nIGZldGNoZWQgb25jZSBhbmQgcmV1c2VkIGFjcm9zcyByZXF1ZXN0cykuXG4gICAqL1xuICB0dGxNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSdW4gYSB6ZXJvLWFyZ3VtZW50IGZhY3Rvcnkgb25jZTsgbGF0ZXIgY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC5cbiAqIFRoZSBtZW1vaXplZCBmdW5jdGlvbiBtaXJyb3JzIHRoZSBmYWN0b3J5J3Mgc3luYyAvIGFzeW5jIG5hdHVyZTogYVxuICogc3luYyBmYWN0b3J5IHlpZWxkcyBhIHN5bmMgZ2V0dGVyIChgKCkgPT4gVGApLCBhbiBhc3luYyAvIHRoZW5hYmxlXG4gKiBmYWN0b3J5IHlpZWxkcyBhIHByb21pc2UtcmV0dXJuaW5nIGdldHRlciAoYCgpID0+IFByb21pc2U8VD5gKSB3aG9zZVxuICogY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBvbmUgaW4tZmxpZ2h0IHByb21pc2UgdW50aWwgaXQgc2V0dGxlcy5cbiAqXG4gKiBFcnJvcnMgYXJlIG5ldmVyIGNhY2hlZDogYSBzeW5jIGZhY3RvcnkgdGhhdCB0aHJvd3MgcHJvcGFnYXRlcyB0aGVcbiAqIHRocm93LCBhbmQgYW4gYXN5bmMgZmFjdG9yeSB0aGF0IHJlamVjdHMgZXZpY3RzIHRoZSBjYWNoZWQgcHJvbWlzZSwgc29cbiAqIGluIGJvdGggY2FzZXMgdGhlIG5leHQgY2FsbCByZXRyaWVzLiBQYXNzIGB7IHR0bE1zIH1gIHRvIGFsc28gZXhwaXJlXG4gKiBhbmQgcmVjb21wdXRlIGEgc3VjY2Vzc2Z1bCB2YWx1ZSBhZnRlciBhIHdpbmRvdzsgd2l0aG91dCBhIFRUTCBhXG4gKiBzdWNjZXNzIGlzIGNhY2hlZCBmb3JldmVyLlxuICpcbiAqIEZvciBhbiBhc3luYyBmYWN0b3J5IHRoZSBUVEwgd2luZG93IHN0YXJ0cyB3aGVuIHRoZSBwcm9taXNlXG4gKiAqcmVzb2x2ZXMqLCBub3Qgd2hlbiBpdCB3YXMgY3JlYXRlZCAtIGEgc2xvdyBpbi1mbGlnaHQgcmVxdWVzdCBuZXZlclxuICogY291bnRzIGFzIGFscmVhZHktZXhwaXJlZCwgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBrZWVwIHNoYXJpbmcgdGhlIG9uZVxuICogcGVuZGluZyBwcm9taXNlIHVudGlsIGl0IHNldHRsZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJhbmdlcyA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoZmV0Y2hJcFJhbmdlcywgeyB0dGxNczogMjQgKiA2MCAqIDYwICogMTAwMCB9KTtcbiAqIGF3YWl0IHJhbmdlcygpOyAvLyBmZXRjaGVzXG4gKiBhd2FpdCByYW5nZXMoKTsgLy8gY2FjaGVkIHVudGlsIDI0aCBsYXRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZTxUPihcbiAgZmFjdG9yeTogKCkgPT4gUHJvbWlzZUxpa2U8VD4sXG4gIG9wdGlvbnM/OiBNZW1vaXplT3B0aW9ucyxcbik6ICgpID0+IFByb21pc2U8VD47XG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZTxUPihmYWN0b3J5OiAoKSA9PiBULCBvcHRpb25zPzogTWVtb2l6ZU9wdGlvbnMpOiAoKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZTxUPihcbiAgZmFjdG9yeTogKCkgPT4gVCB8IFByb21pc2VMaWtlPFQ+LFxuICBvcHRpb25zPzogTWVtb2l6ZU9wdGlvbnMsXG4pOiAoKSA9PiBUIHwgUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHR0bE1zID0gb3B0aW9ucz8udHRsTXMgPz8gMDtcbiAgbGV0IGNhY2hlOiB7IHZhbHVlOiBUIHwgUHJvbWlzZTxUPjsgZXhwaXJlc0F0OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoY2FjaGUgPT09IHVuZGVmaW5lZCB8fCAodHRsTXMgPiAwICYmIERhdGUubm93KCkgPj0gY2FjaGUuZXhwaXJlc0F0KSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmFjdG9yeSgpO1xuICAgICAgaWYgKGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIC8vIGBJbmZpbml0eWAga2VlcHMgdGhlIGVudHJ5IHVuZXhwaXJlZCB3aGlsZSBpbiBmbGlnaHQgKHNvIGEgc2xvd1xuICAgICAgICAvLyByZXF1ZXN0IGlzbid0IHJlZmV0Y2hlZCBhbmQgY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIGl0KTsgdGhlXG4gICAgICAgIC8vIFRUTCB3aW5kb3cgaXMgc3RhbXBlZCBmcm9tIHJlc29sdXRpb24gYmVsb3cuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZTogcGVuZGluZywgZXhwaXJlc0F0OiBJbmZpbml0eSB9O1xuICAgICAgICBjYWNoZSA9IGVudHJ5O1xuICAgICAgICB2b2lkIHBlbmRpbmcudGhlbihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBlbnRyeS5leHBpcmVzQXQgPSBEYXRlLm5vdygpICsgdHRsTXM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBOZXZlciBjYWNoZSBhIHJlamVjdGlvbjogZXZpY3Qgc28gYSBsYXRlciBjYWxsIHJldHJpZXMuXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNhY2hlID09PSBlbnRyeSkgY2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlID0geyB2YWx1ZTogcmVzdWx0LCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FjaGUudmFsdWU7XG4gIH07XG59XG5cbi8qKiBEdWNrLXR5cGUgYW55IHZhbHVlIHdpdGggYSBjYWxsYWJsZSBgLnRoZW5gIGFzIGEgdGhlbmFibGUuICovXG5mdW5jdGlvbiBpc1RoZW5hYmxlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiB2YWx1ZSBpcyBQcm9taXNlTGlrZTxUPiB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIFwidGhlblwiIGluIHZhbHVlICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFByb21pc2VMaWtlPFQ+KS50aGVuID09PSBcImZ1bmN0aW9uXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=