tryharder 0.1.2 → 0.2.1
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/README.md +63 -55
- package/dist/errors.d.ts +6 -1
- package/dist/errors.js +14 -4
- package/dist/index.d.ts +82 -10
- package/dist/index.js +144 -206
- package/dist/shared/chunk-nw88v1ee.js +123 -0
- package/dist/types.d.ts +12 -3
- package/package.json +12 -12
- package/dist/shared/chunk-f024nrjy.js +0 -108
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
var __dispose = Symbol.dispose || /* @__PURE__ */ Symbol.for("Symbol.dispose");
|
|
2
|
+
var __asyncDispose = Symbol.asyncDispose || /* @__PURE__ */ Symbol.for("Symbol.asyncDispose");
|
|
3
|
+
var __using = (stack, value, async) => {
|
|
4
|
+
if (value != null) {
|
|
5
|
+
if (typeof value !== "object" && typeof value !== "function")
|
|
6
|
+
throw TypeError('Object expected to be assigned to "using" declaration');
|
|
7
|
+
var dispose;
|
|
8
|
+
if (async)
|
|
9
|
+
dispose = value[__asyncDispose];
|
|
10
|
+
if (dispose === undefined)
|
|
11
|
+
dispose = value[__dispose];
|
|
12
|
+
if (typeof dispose !== "function")
|
|
13
|
+
throw TypeError("Object not disposable");
|
|
14
|
+
stack.push([async, dispose, value]);
|
|
15
|
+
} else if (async) {
|
|
16
|
+
stack.push([async]);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
var __callDispose = (stack, error, hasError) => {
|
|
21
|
+
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
22
|
+
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
23
|
+
}, fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e), next = (it) => {
|
|
24
|
+
while (it = stack.pop()) {
|
|
25
|
+
try {
|
|
26
|
+
var result = it[1] && it[1].call(it[2]);
|
|
27
|
+
if (it[0])
|
|
28
|
+
return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
29
|
+
} catch (e) {
|
|
30
|
+
fail(e);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (hasError)
|
|
34
|
+
throw error;
|
|
35
|
+
};
|
|
36
|
+
return next();
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/lib/errors.ts
|
|
40
|
+
var PanicMessages = {
|
|
41
|
+
ALL_CATCH_HANDLER_REJECT: "Panic: all() catch handler rejected",
|
|
42
|
+
ALL_CATCH_HANDLER_THROW: "Panic: all() catch handler threw",
|
|
43
|
+
FLOW_NO_EXIT: "flow() requires at least one task to call $exit().",
|
|
44
|
+
ORCHESTRATION_UNSUPPORTED_POLICY: "Orchestration does not support retry() or timeout() policies.",
|
|
45
|
+
RETRY_INVALID_LIMIT: "retry() requires a positive integer retry limit.",
|
|
46
|
+
RUN_CATCH_HANDLER_REJECT: "Panic: run() catch handler rejected",
|
|
47
|
+
RUN_CATCH_HANDLER_THROW: "Panic: run() catch handler threw",
|
|
48
|
+
RUN_SYNC_ASYNC_RETRY_POLICY: "This retry policy may run asynchronously. Use run() instead.",
|
|
49
|
+
RUN_SYNC_CATCH_HANDLER_THROW: "Panic: runSync() catch handler threw",
|
|
50
|
+
RUN_SYNC_CATCH_PROMISE: "runSync() catch cannot return a Promise. Use run() instead.",
|
|
51
|
+
RUN_SYNC_TRY_PROMISE: "runSync() cannot handle Promise values. Use run() instead.",
|
|
52
|
+
RUN_SYNC_WRAPPED_RESULT_PROMISE: "Wrapped runSync() execution returned a Promise. Use run() instead.",
|
|
53
|
+
TASK_INVALID_HANDLER: "Task runner expected a function handler.",
|
|
54
|
+
TASK_SELF_REFERENCE: "Task cannot await its own result.",
|
|
55
|
+
TASK_UNKNOWN_REFERENCE: "Task attempted to read an unknown task result.",
|
|
56
|
+
TIMEOUT_INVALID_MS: "timeout() requires a non-negative finite millisecond value.",
|
|
57
|
+
UNREACHABLE_RETRY_POLICY_BACKOFF: "Panic: unreachable retry policy backoff"
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
class ControlError extends Error {
|
|
61
|
+
constructor(message, options) {
|
|
62
|
+
super(message, options);
|
|
63
|
+
this.name = "ControlError";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
class CancellationError extends ControlError {
|
|
68
|
+
constructor(message = "Execution was cancelled", options) {
|
|
69
|
+
super(message, options);
|
|
70
|
+
this.name = "CancellationError";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
class TimeoutError extends ControlError {
|
|
75
|
+
constructor(message = "Execution timed out", options) {
|
|
76
|
+
super(message, options);
|
|
77
|
+
this.name = "TimeoutError";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
class RetryExhaustedError extends Error {
|
|
82
|
+
constructor(message = "Retry attempts exhausted", options) {
|
|
83
|
+
super(message, options);
|
|
84
|
+
this.name = "RetryExhaustedError";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
class UnhandledException extends Error {
|
|
89
|
+
constructor(message = "Unhandled exception", options) {
|
|
90
|
+
super(message, options);
|
|
91
|
+
this.name = "UnhandledException";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
class Panic extends Error {
|
|
96
|
+
code;
|
|
97
|
+
constructor(code, options = {}) {
|
|
98
|
+
const { message, ...errorOptions } = options;
|
|
99
|
+
super(message ?? PanicMessages[code], errorOptions);
|
|
100
|
+
this.code = code;
|
|
101
|
+
this.name = "Panic";
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function isCancellationError(error) {
|
|
105
|
+
return error instanceof CancellationError || Error.isError(error) && error.name === "CancellationError";
|
|
106
|
+
}
|
|
107
|
+
function isTimeoutError(error) {
|
|
108
|
+
return error instanceof TimeoutError || Error.isError(error) && error.name === "TimeoutError";
|
|
109
|
+
}
|
|
110
|
+
function isRetryExhaustedError(error) {
|
|
111
|
+
return error instanceof RetryExhaustedError || Error.isError(error) && error.name === "RetryExhaustedError";
|
|
112
|
+
}
|
|
113
|
+
function isUnhandledException(error) {
|
|
114
|
+
return error instanceof UnhandledException || Error.isError(error) && error.name === "UnhandledException";
|
|
115
|
+
}
|
|
116
|
+
function isPanic(error) {
|
|
117
|
+
return error instanceof Panic || Error.isError(error) && error.name === "Panic" && "code" in error && typeof error.code === "string";
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { __using, __callDispose, ControlError, CancellationError, TimeoutError, RetryExhaustedError, UnhandledException, Panic, isCancellationError, isTimeoutError, isRetryExhaustedError, isUnhandledException, isPanic };
|
|
121
|
+
|
|
122
|
+
//# debugId=D2D093C868939DB764756E2164756E21
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2xpYi9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgUGFuaWNDb2RlID1cbiAgfCBcIkFMTF9DQVRDSF9IQU5ETEVSX1JFSkVDVFwiXG4gIHwgXCJBTExfQ0FUQ0hfSEFORExFUl9USFJPV1wiXG4gIHwgXCJGTE9XX05PX0VYSVRcIlxuICB8IFwiT1JDSEVTVFJBVElPTl9VTlNVUFBPUlRFRF9QT0xJQ1lcIlxuICB8IFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiXG4gIHwgXCJSVU5fQ0FUQ0hfSEFORExFUl9SRUpFQ1RcIlxuICB8IFwiUlVOX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQVNZTkNfUkVUUllfUE9MSUNZXCJcbiAgfCBcIlJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQ0FUQ0hfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19UUllfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFXCJcbiAgfCBcIlRBU0tfSU5WQUxJRF9IQU5ETEVSXCJcbiAgfCBcIlRBU0tfU0VMRl9SRUZFUkVOQ0VcIlxuICB8IFwiVElNRU9VVF9JTlZBTElEX01TXCJcbiAgfCBcIlRBU0tfVU5LTk9XTl9SRUZFUkVOQ0VcIlxuICB8IFwiVU5SRUFDSEFCTEVfUkVUUllfUE9MSUNZX0JBQ0tPRkZcIlxuXG5leHBvcnQgY29uc3QgUGFuaWNNZXNzYWdlcyA9IHtcbiAgQUxMX0NBVENIX0hBTkRMRVJfUkVKRUNUOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHJlamVjdGVkXCIsXG4gIEFMTF9DQVRDSF9IQU5ETEVSX1RIUk9XOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIEZMT1dfTk9fRVhJVDogXCJmbG93KCkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHRhc2sgdG8gY2FsbCAkZXhpdCgpLlwiLFxuICBPUkNIRVNUUkFUSU9OX1VOU1VQUE9SVEVEX1BPTElDWTogXCJPcmNoZXN0cmF0aW9uIGRvZXMgbm90IHN1cHBvcnQgcmV0cnkoKSBvciB0aW1lb3V0KCkgcG9saWNpZXMuXCIsXG4gIFJFVFJZX0lOVkFMSURfTElNSVQ6IFwicmV0cnkoKSByZXF1aXJlcyBhIHBvc2l0aXZlIGludGVnZXIgcmV0cnkgbGltaXQuXCIsXG4gIFJVTl9DQVRDSF9IQU5ETEVSX1JFSkVDVDogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciByZWplY3RlZFwiLFxuICBSVU5fQ0FUQ0hfSEFORExFUl9USFJPVzogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciB0aHJld1wiLFxuICBSVU5fU1lOQ19BU1lOQ19SRVRSWV9QT0xJQ1k6IFwiVGhpcyByZXRyeSBwb2xpY3kgbWF5IHJ1biBhc3luY2hyb25vdXNseS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1c6IFwiUGFuaWM6IHJ1blN5bmMoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIFJVTl9TWU5DX0NBVENIX1BST01JU0U6IFwicnVuU3luYygpIGNhdGNoIGNhbm5vdCByZXR1cm4gYSBQcm9taXNlLiBVc2UgcnVuKCkgaW5zdGVhZC5cIixcbiAgUlVOX1NZTkNfVFJZX1BST01JU0U6IFwicnVuU3luYygpIGNhbm5vdCBoYW5kbGUgUHJvbWlzZSB2YWx1ZXMuIFVzZSBydW4oKSBpbnN0ZWFkLlwiLFxuICBSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFOlxuICAgIFwiV3JhcHBlZCBydW5TeW5jKCkgZXhlY3V0aW9uIHJldHVybmVkIGEgUHJvbWlzZS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFRBU0tfSU5WQUxJRF9IQU5ETEVSOiBcIlRhc2sgcnVubmVyIGV4cGVjdGVkIGEgZnVuY3Rpb24gaGFuZGxlci5cIixcbiAgVEFTS19TRUxGX1JFRkVSRU5DRTogXCJUYXNrIGNhbm5vdCBhd2FpdCBpdHMgb3duIHJlc3VsdC5cIixcbiAgVEFTS19VTktOT1dOX1JFRkVSRU5DRTogXCJUYXNrIGF0dGVtcHRlZCB0byByZWFkIGFuIHVua25vd24gdGFzayByZXN1bHQuXCIsXG4gIFRJTUVPVVRfSU5WQUxJRF9NUzogXCJ0aW1lb3V0KCkgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIG1pbGxpc2Vjb25kIHZhbHVlLlwiLFxuICBVTlJFQUNIQUJMRV9SRVRSWV9QT0xJQ1lfQkFDS09GRjogXCJQYW5pYzogdW5yZWFjaGFibGUgcmV0cnkgcG9saWN5IGJhY2tvZmZcIixcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxQYW5pY0NvZGUsIHN0cmluZz5cbmV4cG9ydCB0eXBlIFBhbmljTWVzc2FnZXMgPSB0eXBlb2YgUGFuaWNNZXNzYWdlc1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucylcbiAgICB0aGlzLm5hbWUgPSBcIkNvbnRyb2xFcnJvclwiXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvbkVycm9yIGV4dGVuZHMgQ29udHJvbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiRXhlY3V0aW9uIHdhcyBjYW5jZWxsZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsYXRpb25FcnJvclwiXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIENvbnRyb2xFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIkV4ZWN1dGlvbiB0aW1lZCBvdXRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJUaW1lb3V0RXJyb3JcIlxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXRyeUV4aGF1c3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJSZXRyeSBhdHRlbXB0cyBleGhhdXN0ZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJSZXRyeUV4aGF1c3RlZEVycm9yXCJcbiAgfVxufVxuXG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jdXN0b20tZXJyb3ItZGVmaW5pdGlvbiAtLSBQdWJsaWMgZXJyb3IgbmFtZSBpcyBpbnRlbnRpb25hbC5cbmV4cG9ydCBjbGFzcyBVbmhhbmRsZWRFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIlVuaGFuZGxlZCBleGNlcHRpb25cIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJVbmhhbmRsZWRFeGNlcHRpb25cIlxuICB9XG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2N1c3RvbS1lcnJvci1kZWZpbml0aW9uIC0tIFB1YmxpYyBlcnJvciBuYW1lIGlzIGludGVudGlvbmFsLlxuZXhwb3J0IGNsYXNzIFBhbmljIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlOiBQYW5pY0NvZGVcblxuICBjb25zdHJ1Y3Rvcihjb2RlOiBQYW5pY0NvZGUsIG9wdGlvbnM6IEVycm9yT3B0aW9ucyAmIHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmVycm9yT3B0aW9ucyB9ID0gb3B0aW9uc1xuXG4gICAgc3VwZXIobWVzc2FnZSA/PyBQYW5pY01lc3NhZ2VzW2NvZGVdLCBlcnJvck9wdGlvbnMpXG4gICAgdGhpcy5jb2RlID0gY29kZVxuICAgIHRoaXMubmFtZSA9IFwiUGFuaWNcIlxuICB9XG59XG5cbi8vIFR5cGUgZ3VhcmRzIGJlbG93IG1hdGNoIGJ5IGBlcnJvci5uYW1lYCBpbiBhZGRpdGlvbiB0byBpbnN0YW5jZW9mLCBzbyB0aGV5XG4vLyBrZWVwIHdvcmtpbmcgd2hlbiB0d28gY29waWVzIG9mIHRyeWhhcmRlciBlbmQgdXAgaW4gb25lIGRlcGVuZGVuY3kgZ3JhcGhcbi8vIChvciBhY3Jvc3MgcmVhbG1zKSwgd2hlcmUgaW5zdGFuY2VvZiBzaWxlbnRseSBmYWlscy4gVGhleSBhcmUgdGhlXG4vLyByZWNvbW1lbmRlZCB3YXkgdG8gaWRlbnRpZnkgdHJ5aGFyZGVyIGVycm9ycy5cbi8vXG4vLyBDYXZlYXQ6IG5hbWUgbWF0Y2hpbmcgbWVhbnMgYSBmb3JlaWduIEVycm9yIHRoYXQgaGFwcGVucyB0byB1c2UgdGhlIHNhbWVcbi8vIGBuYW1lYCBhbHNvIHBhc3Nlcy4gV2l0aGluIHRoZSB1bmlvbnMgcmV0dXJuZWQgYnkgdHJ5aGFyZGVyIEFQSXMgdGhpcyBjYW5ub3Rcbi8vIG9jY3VyLlxuXG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb25FcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIENhbmNlbGxhdGlvbkVycm9yIHtcbiAgcmV0dXJuIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIENhbmNlbGxhdGlvbkVycm9yIHx8XG4gICAgKEVycm9yLmlzRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09IFwiQ2FuY2VsbGF0aW9uRXJyb3JcIilcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lb3V0RXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBUaW1lb3V0RXJyb3Ige1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IgfHwgKEVycm9yLmlzRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldHJ5RXhoYXVzdGVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBSZXRyeUV4aGF1c3RlZEVycm9yIHtcbiAgcmV0dXJuIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIFJldHJ5RXhoYXVzdGVkRXJyb3IgfHxcbiAgICAoRXJyb3IuaXNFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gXCJSZXRyeUV4aGF1c3RlZEVycm9yXCIpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5oYW5kbGVkRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgVW5oYW5kbGVkRXhjZXB0aW9uIHtcbiAgcmV0dXJuIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIFVuaGFuZGxlZEV4Y2VwdGlvbiB8fFxuICAgIChFcnJvci5pc0Vycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSBcIlVuaGFuZGxlZEV4Y2VwdGlvblwiKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmljKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgUGFuaWMge1xuICByZXR1cm4gKFxuICAgIGVycm9yIGluc3RhbmNlb2YgUGFuaWMgfHxcbiAgICAoRXJyb3IuaXNFcnJvcihlcnJvcikgJiZcbiAgICAgIGVycm9yLm5hbWUgPT09IFwiUGFuaWNcIiAmJlxuICAgICAgXCJjb2RlXCIgaW4gZXJyb3IgJiZcbiAgICAgIHR5cGVvZiBlcnJvci5jb2RlID09PSBcInN0cmluZ1wiKVxuICApXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQk8sSUFBTSxnQkFBZ0I7QUFBQSxFQUMzQiwwQkFBMEI7QUFBQSxFQUMxQix5QkFBeUI7QUFBQSxFQUN6QixjQUFjO0FBQUEsRUFDZCxrQ0FBa0M7QUFBQSxFQUNsQyxxQkFBcUI7QUFBQSxFQUNyQiwwQkFBMEI7QUFBQSxFQUMxQix5QkFBeUI7QUFBQSxFQUN6Qiw2QkFBNkI7QUFBQSxFQUM3Qiw4QkFBOEI7QUFBQSxFQUM5Qix3QkFBd0I7QUFBQSxFQUN4QixzQkFBc0I7QUFBQSxFQUN0QixpQ0FDRTtBQUFBLEVBQ0Ysc0JBQXNCO0FBQUEsRUFDdEIscUJBQXFCO0FBQUEsRUFDckIsd0JBQXdCO0FBQUEsRUFDeEIsb0JBQW9CO0FBQUEsRUFDcEIsa0NBQWtDO0FBQ3BDO0FBQUE7QUFNTyxNQUFNLHFCQUFxQixNQUFNO0FBQUEsRUFDdEMsV0FBVyxDQUFDLFNBQWtCLFNBQXdCO0FBQUEsSUFDcEQsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQUFBO0FBRU8sTUFBTSwwQkFBMEIsYUFBYTtBQUFBLEVBQ2xELFdBQVcsQ0FBQyxVQUFVLDJCQUEyQixTQUF3QjtBQUFBLElBQ3ZFLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUE7QUFFaEI7QUFBQTtBQUVPLE1BQU0scUJBQXFCLGFBQWE7QUFBQSxFQUM3QyxXQUFXLENBQUMsVUFBVSx1QkFBdUIsU0FBd0I7QUFBQSxJQUNuRSxNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLEtBQUssT0FBTztBQUFBO0FBRWhCO0FBQUE7QUFFTyxNQUFNLDRCQUE0QixNQUFNO0FBQUEsRUFDN0MsV0FBVyxDQUFDLFVBQVUsNEJBQTRCLFNBQXdCO0FBQUEsSUFDeEUsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQUFBO0FBR08sTUFBTSwyQkFBMkIsTUFBTTtBQUFBLEVBQzVDLFdBQVcsQ0FBQyxVQUFVLHVCQUF1QixTQUF3QjtBQUFBLElBQ25FLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUE7QUFFaEI7QUFBQTtBQUdPLE1BQU0sY0FBYyxNQUFNO0FBQUEsRUFDdEI7QUFBQSxFQUVULFdBQVcsQ0FBQyxNQUFpQixVQUErQyxDQUFDLEdBQUc7QUFBQSxJQUM5RSxRQUFRLFlBQVksaUJBQWlCO0FBQUEsSUFFckMsTUFBTSxXQUFXLGNBQWMsT0FBTyxZQUFZO0FBQUEsSUFDbEQsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQVdPLFNBQVMsbUJBQW1CLENBQUMsT0FBNEM7QUFBQSxFQUM5RSxPQUNFLGlCQUFpQixxQkFDaEIsTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLFNBQVM7QUFBQTtBQUlyQyxTQUFTLGNBQWMsQ0FBQyxPQUF1QztBQUFBLEVBQ3BFLE9BQU8saUJBQWlCLGdCQUFpQixNQUFNLFFBQVEsS0FBSyxLQUFLLE1BQU0sU0FBUztBQUFBO0FBRzNFLFNBQVMscUJBQXFCLENBQUMsT0FBOEM7QUFBQSxFQUNsRixPQUNFLGlCQUFpQix1QkFDaEIsTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLFNBQVM7QUFBQTtBQUlyQyxTQUFTLG9CQUFvQixDQUFDLE9BQTZDO0FBQUEsRUFDaEYsT0FDRSxpQkFBaUIsc0JBQ2hCLE1BQU0sUUFBUSxLQUFLLEtBQUssTUFBTSxTQUFTO0FBQUE7QUFJckMsU0FBUyxPQUFPLENBQUMsT0FBZ0M7QUFBQSxFQUN0RCxPQUNFLGlCQUFpQixTQUNoQixNQUFNLFFBQVEsS0FBSyxLQUNsQixNQUFNLFNBQVMsV0FDZixVQUFVLFNBQ1YsT0FBTyxNQUFNLFNBQVM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkQyRDA5M0M4Njg5MzlEQjc2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
package/dist/types.d.ts
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
interface AsyncDisposer extends AsyncDisposable {
|
|
2
|
-
|
|
3
|
-
cleanup()
|
|
2
|
+
/**
|
|
3
|
+
* Registers a cleanup callback. Callbacks run in reverse registration order (LIFO) when the
|
|
4
|
+
* disposer is disposed.
|
|
5
|
+
*/
|
|
4
6
|
defer(fn: () => void | PromiseLike<void>): void;
|
|
7
|
+
/**
|
|
8
|
+
* Tracks a disposable resource and returns it.
|
|
9
|
+
*/
|
|
5
10
|
use<T extends AsyncDisposable | Disposable | null | undefined>(value: T): T;
|
|
6
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Runs all registered teardown in reverse registration order. Equivalent to leaving an `await
|
|
13
|
+
* using` scope.
|
|
14
|
+
*/
|
|
15
|
+
dispose(): Promise<void>;
|
|
7
16
|
}
|
|
8
17
|
declare const FLOW_EXIT_BRAND: unique symbol;
|
|
9
18
|
type FlowExit<T> = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tryharder",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "A better try/catch for TypeScript",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"abort-signal",
|
|
@@ -57,17 +57,17 @@
|
|
|
57
57
|
"version": "changeset version && bun run format"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@changesets/cli": "2.
|
|
61
|
-
"@clack/prompts": "1.0
|
|
62
|
-
"@types/bun": "1.3.
|
|
63
|
-
"adamantite": "0.
|
|
64
|
-
"bunup": "0.16.
|
|
65
|
-
"knip": "6.
|
|
60
|
+
"@changesets/cli": "2.31.1",
|
|
61
|
+
"@clack/prompts": "1.7.0",
|
|
62
|
+
"@types/bun": "1.3.14",
|
|
63
|
+
"adamantite": "^0.33.0",
|
|
64
|
+
"bunup": "0.16.32",
|
|
65
|
+
"knip": "6.29.0",
|
|
66
66
|
"mitata": "^1.0.34",
|
|
67
|
-
"oxfmt": "0.
|
|
68
|
-
"oxlint": "1.
|
|
69
|
-
"oxlint-tsgolint": "0.
|
|
70
|
-
"typescript": "
|
|
67
|
+
"oxfmt": "0.60.0",
|
|
68
|
+
"oxlint": "1.75.0",
|
|
69
|
+
"oxlint-tsgolint": "7.0.2001",
|
|
70
|
+
"typescript": "7.0.2"
|
|
71
71
|
},
|
|
72
|
-
"packageManager": "bun@1.3.
|
|
72
|
+
"packageManager": "bun@1.3.14"
|
|
73
73
|
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
var __dispose = Symbol.dispose || /* @__PURE__ */ Symbol.for("Symbol.dispose");
|
|
2
|
-
var __asyncDispose = Symbol.asyncDispose || /* @__PURE__ */ Symbol.for("Symbol.asyncDispose");
|
|
3
|
-
var __using = (stack, value, async) => {
|
|
4
|
-
if (value != null) {
|
|
5
|
-
if (typeof value !== "object" && typeof value !== "function")
|
|
6
|
-
throw TypeError('Object expected to be assigned to "using" declaration');
|
|
7
|
-
var dispose;
|
|
8
|
-
if (async)
|
|
9
|
-
dispose = value[__asyncDispose];
|
|
10
|
-
if (dispose === undefined)
|
|
11
|
-
dispose = value[__dispose];
|
|
12
|
-
if (typeof dispose !== "function")
|
|
13
|
-
throw TypeError("Object not disposable");
|
|
14
|
-
stack.push([async, dispose, value]);
|
|
15
|
-
} else if (async) {
|
|
16
|
-
stack.push([async]);
|
|
17
|
-
}
|
|
18
|
-
return value;
|
|
19
|
-
};
|
|
20
|
-
var __callDispose = (stack, error, hasError) => {
|
|
21
|
-
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
22
|
-
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
23
|
-
}, fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e), next = (it) => {
|
|
24
|
-
while (it = stack.pop()) {
|
|
25
|
-
try {
|
|
26
|
-
var result = it[1] && it[1].call(it[2]);
|
|
27
|
-
if (it[0])
|
|
28
|
-
return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
29
|
-
} catch (e) {
|
|
30
|
-
fail(e);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (hasError)
|
|
34
|
-
throw error;
|
|
35
|
-
};
|
|
36
|
-
return next();
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// src/lib/errors.ts
|
|
40
|
-
var PanicMessages = {
|
|
41
|
-
ALL_CATCH_HANDLER_REJECT: "Panic: all() catch handler rejected",
|
|
42
|
-
ALL_CATCH_HANDLER_THROW: "Panic: all() catch handler threw",
|
|
43
|
-
FLOW_NO_EXIT: "flow() requires at least one task to call $exit().",
|
|
44
|
-
ORCHESTRATION_UNSUPPORTED_POLICY: "Orchestration does not support retry() or timeout() policies.",
|
|
45
|
-
RETRY_INVALID_LIMIT: "retry() requires a non-negative finite retry limit.",
|
|
46
|
-
RUN_CATCH_HANDLER_REJECT: "Panic: run() catch handler rejected",
|
|
47
|
-
RUN_CATCH_HANDLER_THROW: "Panic: run() catch handler threw",
|
|
48
|
-
RUN_SYNC_ASYNC_RETRY_POLICY: "This retry policy may run asynchronously. Use run() instead.",
|
|
49
|
-
RUN_SYNC_CATCH_HANDLER_THROW: "Panic: runSync() catch handler threw",
|
|
50
|
-
RUN_SYNC_CATCH_PROMISE: "runSync() catch cannot return a Promise. Use run() instead.",
|
|
51
|
-
RUN_SYNC_TRY_PROMISE: "runSync() cannot handle Promise values. Use run() instead.",
|
|
52
|
-
RUN_SYNC_WRAPPED_RESULT_PROMISE: "Wrapped runSync() execution returned a Promise. Use run() instead.",
|
|
53
|
-
TASK_INVALID_HANDLER: "Task runner expected a function handler.",
|
|
54
|
-
TASK_SELF_REFERENCE: "Task cannot await its own result.",
|
|
55
|
-
TASK_UNKNOWN_REFERENCE: "Task attempted to read an unknown task result.",
|
|
56
|
-
TIMEOUT_INVALID_MS: "timeout() requires a non-negative finite millisecond value.",
|
|
57
|
-
UNREACHABLE_RETRY_POLICY_BACKOFF: "Panic: unreachable retry policy backoff"
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
class ControlError extends Error {
|
|
61
|
-
constructor(message, options) {
|
|
62
|
-
super(message, options);
|
|
63
|
-
this.name = "ControlError";
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
class CancellationError extends ControlError {
|
|
68
|
-
constructor(message = "Execution was cancelled", options) {
|
|
69
|
-
super(message, options);
|
|
70
|
-
this.name = "CancellationError";
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
class TimeoutError extends ControlError {
|
|
75
|
-
constructor(message = "Execution timed out", options) {
|
|
76
|
-
super(message, options);
|
|
77
|
-
this.name = "TimeoutError";
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
class RetryExhaustedError extends Error {
|
|
82
|
-
constructor(message = "Retry attempts exhausted", options) {
|
|
83
|
-
super(message, options);
|
|
84
|
-
this.name = "RetryExhaustedError";
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
class UnhandledException extends Error {
|
|
89
|
-
constructor(message = "Unhandled exception", options) {
|
|
90
|
-
super(message, options);
|
|
91
|
-
this.name = "UnhandledException";
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
class Panic extends Error {
|
|
96
|
-
code;
|
|
97
|
-
constructor(code, options = {}) {
|
|
98
|
-
const { message, ...errorOptions } = options;
|
|
99
|
-
super(message ?? PanicMessages[code], errorOptions);
|
|
100
|
-
this.code = code;
|
|
101
|
-
this.name = "Panic";
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export { __using, __callDispose, ControlError, CancellationError, TimeoutError, RetryExhaustedError, UnhandledException, Panic };
|
|
106
|
-
|
|
107
|
-
//# debugId=B1559E370003654764756E2164756E21
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2xpYi9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgUGFuaWNDb2RlID1cbiAgfCBcIkFMTF9DQVRDSF9IQU5ETEVSX1JFSkVDVFwiXG4gIHwgXCJBTExfQ0FUQ0hfSEFORExFUl9USFJPV1wiXG4gIHwgXCJGTE9XX05PX0VYSVRcIlxuICB8IFwiT1JDSEVTVFJBVElPTl9VTlNVUFBPUlRFRF9QT0xJQ1lcIlxuICB8IFwiUkVUUllfSU5WQUxJRF9MSU1JVFwiXG4gIHwgXCJSVU5fQ0FUQ0hfSEFORExFUl9SRUpFQ1RcIlxuICB8IFwiUlVOX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQVNZTkNfUkVUUllfUE9MSUNZXCJcbiAgfCBcIlJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1dcIlxuICB8IFwiUlVOX1NZTkNfQ0FUQ0hfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19UUllfUFJPTUlTRVwiXG4gIHwgXCJSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFXCJcbiAgfCBcIlRBU0tfSU5WQUxJRF9IQU5ETEVSXCJcbiAgfCBcIlRBU0tfU0VMRl9SRUZFUkVOQ0VcIlxuICB8IFwiVElNRU9VVF9JTlZBTElEX01TXCJcbiAgfCBcIlRBU0tfVU5LTk9XTl9SRUZFUkVOQ0VcIlxuICB8IFwiVU5SRUFDSEFCTEVfUkVUUllfUE9MSUNZX0JBQ0tPRkZcIlxuXG5leHBvcnQgY29uc3QgUGFuaWNNZXNzYWdlcyA9IHtcbiAgQUxMX0NBVENIX0hBTkRMRVJfUkVKRUNUOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHJlamVjdGVkXCIsXG4gIEFMTF9DQVRDSF9IQU5ETEVSX1RIUk9XOiBcIlBhbmljOiBhbGwoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIEZMT1dfTk9fRVhJVDogXCJmbG93KCkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHRhc2sgdG8gY2FsbCAkZXhpdCgpLlwiLFxuICBPUkNIRVNUUkFUSU9OX1VOU1VQUE9SVEVEX1BPTElDWTogXCJPcmNoZXN0cmF0aW9uIGRvZXMgbm90IHN1cHBvcnQgcmV0cnkoKSBvciB0aW1lb3V0KCkgcG9saWNpZXMuXCIsXG4gIFJFVFJZX0lOVkFMSURfTElNSVQ6IFwicmV0cnkoKSByZXF1aXJlcyBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgcmV0cnkgbGltaXQuXCIsXG4gIFJVTl9DQVRDSF9IQU5ETEVSX1JFSkVDVDogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciByZWplY3RlZFwiLFxuICBSVU5fQ0FUQ0hfSEFORExFUl9USFJPVzogXCJQYW5pYzogcnVuKCkgY2F0Y2ggaGFuZGxlciB0aHJld1wiLFxuICBSVU5fU1lOQ19BU1lOQ19SRVRSWV9QT0xJQ1k6IFwiVGhpcyByZXRyeSBwb2xpY3kgbWF5IHJ1biBhc3luY2hyb25vdXNseS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFJVTl9TWU5DX0NBVENIX0hBTkRMRVJfVEhST1c6IFwiUGFuaWM6IHJ1blN5bmMoKSBjYXRjaCBoYW5kbGVyIHRocmV3XCIsXG4gIFJVTl9TWU5DX0NBVENIX1BST01JU0U6IFwicnVuU3luYygpIGNhdGNoIGNhbm5vdCByZXR1cm4gYSBQcm9taXNlLiBVc2UgcnVuKCkgaW5zdGVhZC5cIixcbiAgUlVOX1NZTkNfVFJZX1BST01JU0U6IFwicnVuU3luYygpIGNhbm5vdCBoYW5kbGUgUHJvbWlzZSB2YWx1ZXMuIFVzZSBydW4oKSBpbnN0ZWFkLlwiLFxuICBSVU5fU1lOQ19XUkFQUEVEX1JFU1VMVF9QUk9NSVNFOlxuICAgIFwiV3JhcHBlZCBydW5TeW5jKCkgZXhlY3V0aW9uIHJldHVybmVkIGEgUHJvbWlzZS4gVXNlIHJ1bigpIGluc3RlYWQuXCIsXG4gIFRBU0tfSU5WQUxJRF9IQU5ETEVSOiBcIlRhc2sgcnVubmVyIGV4cGVjdGVkIGEgZnVuY3Rpb24gaGFuZGxlci5cIixcbiAgVEFTS19TRUxGX1JFRkVSRU5DRTogXCJUYXNrIGNhbm5vdCBhd2FpdCBpdHMgb3duIHJlc3VsdC5cIixcbiAgVEFTS19VTktOT1dOX1JFRkVSRU5DRTogXCJUYXNrIGF0dGVtcHRlZCB0byByZWFkIGFuIHVua25vd24gdGFzayByZXN1bHQuXCIsXG4gIFRJTUVPVVRfSU5WQUxJRF9NUzogXCJ0aW1lb3V0KCkgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgZmluaXRlIG1pbGxpc2Vjb25kIHZhbHVlLlwiLFxuICBVTlJFQUNIQUJMRV9SRVRSWV9QT0xJQ1lfQkFDS09GRjogXCJQYW5pYzogdW5yZWFjaGFibGUgcmV0cnkgcG9saWN5IGJhY2tvZmZcIixcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxQYW5pY0NvZGUsIHN0cmluZz5cbmV4cG9ydCB0eXBlIFBhbmljTWVzc2FnZXMgPSB0eXBlb2YgUGFuaWNNZXNzYWdlc1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogRXJyb3JPcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucylcbiAgICB0aGlzLm5hbWUgPSBcIkNvbnRyb2xFcnJvclwiXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvbkVycm9yIGV4dGVuZHMgQ29udHJvbEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiRXhlY3V0aW9uIHdhcyBjYW5jZWxsZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJDYW5jZWxsYXRpb25FcnJvclwiXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIENvbnRyb2xFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIkV4ZWN1dGlvbiB0aW1lZCBvdXRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJUaW1lb3V0RXJyb3JcIlxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXRyeUV4aGF1c3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJSZXRyeSBhdHRlbXB0cyBleGhhdXN0ZWRcIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJSZXRyeUV4aGF1c3RlZEVycm9yXCJcbiAgfVxufVxuXG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jdXN0b20tZXJyb3ItZGVmaW5pdGlvbiAtLSBQdWJsaWMgZXJyb3IgbmFtZSBpcyBpbnRlbnRpb25hbC5cbmV4cG9ydCBjbGFzcyBVbmhhbmRsZWRFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIlVuaGFuZGxlZCBleGNlcHRpb25cIiwgb3B0aW9ucz86IEVycm9yT3B0aW9ucykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgdGhpcy5uYW1lID0gXCJVbmhhbmRsZWRFeGNlcHRpb25cIlxuICB9XG59XG5cbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2N1c3RvbS1lcnJvci1kZWZpbml0aW9uIC0tIFB1YmxpYyBlcnJvciBuYW1lIGlzIGludGVudGlvbmFsLlxuZXhwb3J0IGNsYXNzIFBhbmljIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlOiBQYW5pY0NvZGVcblxuICBjb25zdHJ1Y3Rvcihjb2RlOiBQYW5pY0NvZGUsIG9wdGlvbnM6IEVycm9yT3B0aW9ucyAmIHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmVycm9yT3B0aW9ucyB9ID0gb3B0aW9uc1xuXG4gICAgc3VwZXIobWVzc2FnZSA/PyBQYW5pY01lc3NhZ2VzW2NvZGVdLCBlcnJvck9wdGlvbnMpXG4gICAgdGhpcy5jb2RlID0gY29kZVxuICAgIHRoaXMubmFtZSA9IFwiUGFuaWNcIlxuICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQk8sSUFBTSxnQkFBZ0I7QUFBQSxFQUMzQiwwQkFBMEI7QUFBQSxFQUMxQix5QkFBeUI7QUFBQSxFQUN6QixjQUFjO0FBQUEsRUFDZCxrQ0FBa0M7QUFBQSxFQUNsQyxxQkFBcUI7QUFBQSxFQUNyQiwwQkFBMEI7QUFBQSxFQUMxQix5QkFBeUI7QUFBQSxFQUN6Qiw2QkFBNkI7QUFBQSxFQUM3Qiw4QkFBOEI7QUFBQSxFQUM5Qix3QkFBd0I7QUFBQSxFQUN4QixzQkFBc0I7QUFBQSxFQUN0QixpQ0FDRTtBQUFBLEVBQ0Ysc0JBQXNCO0FBQUEsRUFDdEIscUJBQXFCO0FBQUEsRUFDckIsd0JBQXdCO0FBQUEsRUFDeEIsb0JBQW9CO0FBQUEsRUFDcEIsa0NBQWtDO0FBQ3BDO0FBQUE7QUFNTyxNQUFNLHFCQUFxQixNQUFNO0FBQUEsRUFDdEMsV0FBVyxDQUFDLFNBQWtCLFNBQXdCO0FBQUEsSUFDcEQsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQUFBO0FBRU8sTUFBTSwwQkFBMEIsYUFBYTtBQUFBLEVBQ2xELFdBQVcsQ0FBQyxVQUFVLDJCQUEyQixTQUF3QjtBQUFBLElBQ3ZFLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUE7QUFFaEI7QUFBQTtBQUVPLE1BQU0scUJBQXFCLGFBQWE7QUFBQSxFQUM3QyxXQUFXLENBQUMsVUFBVSx1QkFBdUIsU0FBd0I7QUFBQSxJQUNuRSxNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLEtBQUssT0FBTztBQUFBO0FBRWhCO0FBQUE7QUFFTyxNQUFNLDRCQUE0QixNQUFNO0FBQUEsRUFDN0MsV0FBVyxDQUFDLFVBQVUsNEJBQTRCLFNBQXdCO0FBQUEsSUFDeEUsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixLQUFLLE9BQU87QUFBQTtBQUVoQjtBQUFBO0FBR08sTUFBTSwyQkFBMkIsTUFBTTtBQUFBLEVBQzVDLFdBQVcsQ0FBQyxVQUFVLHVCQUF1QixTQUF3QjtBQUFBLElBQ25FLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUE7QUFFaEI7QUFBQTtBQUdPLE1BQU0sY0FBYyxNQUFNO0FBQUEsRUFDdEI7QUFBQSxFQUVULFdBQVcsQ0FBQyxNQUFpQixVQUErQyxDQUFDLEdBQUc7QUFBQSxJQUM5RSxRQUFRLFlBQVksaUJBQWlCO0FBQUEsSUFFckMsTUFBTSxXQUFXLGNBQWMsT0FBTyxZQUFZO0FBQUEsSUFDbEQsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLE9BQU87QUFBQTtBQUVoQjsiLAogICJkZWJ1Z0lkIjogIkIxNTU5RTM3MDAwMzY1NDc2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|