semola 0.5.0 → 0.5.2
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 +75 -20
- package/dist/api/core/index.cjs +206 -0
- package/dist/api/core/index.d.cts +21 -0
- package/dist/api/core/index.d.cts.map +1 -0
- package/dist/api/core/index.d.mts +21 -0
- package/dist/api/core/index.d.mts.map +1 -0
- package/dist/api/core/index.mjs +208 -0
- package/dist/api/core/index.mjs.map +1 -0
- package/dist/api/core/types.d.cts +107 -0
- package/dist/api/core/types.d.cts.map +1 -0
- package/dist/api/core/types.d.mts +107 -0
- package/dist/api/core/types.d.mts.map +1 -0
- package/dist/api/middleware/index.cjs +8 -0
- package/dist/api/middleware/index.d.cts +11 -0
- package/dist/api/middleware/index.d.cts.map +1 -0
- package/dist/api/middleware/index.d.mts +11 -0
- package/dist/api/middleware/index.d.mts.map +1 -0
- package/dist/api/middleware/index.mjs +10 -0
- package/dist/api/middleware/index.mjs.map +1 -0
- package/dist/api/middleware/types.d.cts +16 -0
- package/dist/api/middleware/types.d.cts.map +1 -0
- package/dist/api/middleware/types.d.mts +16 -0
- package/dist/api/middleware/types.d.mts.map +1 -0
- package/dist/api/openapi/index.cjs +254 -0
- package/dist/api/openapi/index.mjs +256 -0
- package/dist/api/openapi/index.mjs.map +1 -0
- package/dist/api/openapi/types.d.cts +60 -0
- package/dist/api/openapi/types.d.cts.map +1 -0
- package/dist/api/openapi/types.d.mts +60 -0
- package/dist/api/openapi/types.d.mts.map +1 -0
- package/dist/api/validation/index.cjs +64 -0
- package/dist/api/validation/index.mjs +61 -0
- package/dist/api/validation/index.mjs.map +1 -0
- package/dist/cache/types.d.cts +17 -0
- package/dist/cache/types.d.cts.map +1 -0
- package/dist/cache/types.d.mts +17 -0
- package/dist/cache/types.d.mts.map +1 -0
- package/dist/cron/scanner.cjs +237 -0
- package/dist/cron/scanner.mjs +238 -0
- package/dist/cron/scanner.mjs.map +1 -0
- package/dist/cron/types.d.cts +11 -0
- package/dist/cron/types.d.cts.map +1 -0
- package/dist/cron/types.d.mts +11 -0
- package/dist/cron/types.d.mts.map +1 -0
- package/dist/errors/types.d.cts +5 -0
- package/dist/errors/types.d.cts.map +1 -0
- package/dist/errors/types.d.mts +5 -0
- package/dist/errors/types.d.mts.map +1 -0
- package/dist/i18n/types.d.cts +13 -0
- package/dist/i18n/types.d.cts.map +1 -0
- package/dist/i18n/types.d.mts +13 -0
- package/dist/i18n/types.d.mts.map +1 -0
- package/dist/lib/api/index.cjs +5 -0
- package/dist/lib/api/index.d.cts +5 -0
- package/dist/lib/api/index.d.mts +5 -0
- package/dist/lib/api/index.mjs +3 -0
- package/dist/lib/cache/index.cjs +74 -0
- package/dist/lib/cache/index.d.cts +36 -0
- package/dist/lib/cache/index.d.cts.map +1 -0
- package/dist/lib/cache/index.d.mts +36 -0
- package/dist/lib/cache/index.d.mts.map +1 -0
- package/dist/lib/cache/index.mjs +75 -0
- package/dist/lib/cache/index.mjs.map +1 -0
- package/dist/lib/cron/index.cjs +276 -0
- package/dist/lib/cron/index.d.cts +39 -0
- package/dist/lib/cron/index.d.cts.map +1 -0
- package/dist/lib/cron/index.d.mts +39 -0
- package/dist/lib/cron/index.d.mts.map +1 -0
- package/dist/lib/cron/index.mjs +277 -0
- package/dist/lib/cron/index.mjs.map +1 -0
- package/dist/lib/errors/index.cjs +30 -0
- package/dist/lib/errors/index.d.cts +13 -0
- package/dist/lib/errors/index.d.cts.map +1 -0
- package/dist/lib/errors/index.d.mts +13 -0
- package/dist/lib/errors/index.d.mts.map +1 -0
- package/dist/lib/errors/index.mjs +28 -0
- package/dist/lib/errors/index.mjs.map +1 -0
- package/dist/lib/i18n/index.cjs +37 -0
- package/dist/lib/i18n/index.d.cts +20 -0
- package/dist/lib/i18n/index.d.cts.map +1 -0
- package/dist/lib/i18n/index.d.mts +20 -0
- package/dist/lib/i18n/index.d.mts.map +1 -0
- package/dist/lib/i18n/index.mjs +38 -0
- package/dist/lib/i18n/index.mjs.map +1 -0
- package/dist/lib/policy/index.cjs +99 -0
- package/dist/lib/policy/index.d.cts +21 -0
- package/dist/lib/policy/index.d.cts.map +1 -0
- package/dist/lib/policy/index.d.mts +21 -0
- package/dist/lib/policy/index.d.mts.map +1 -0
- package/dist/lib/policy/index.mjs +81 -0
- package/dist/lib/policy/index.mjs.map +1 -0
- package/dist/lib/prompts/index.cjs +409 -0
- package/dist/lib/prompts/index.d.cts +31 -0
- package/dist/lib/prompts/index.d.cts.map +1 -0
- package/dist/lib/prompts/index.d.mts +31 -0
- package/dist/lib/prompts/index.d.mts.map +1 -0
- package/dist/lib/prompts/index.mjs +405 -0
- package/dist/lib/prompts/index.mjs.map +1 -0
- package/dist/lib/pubsub/index.cjs +48 -0
- package/dist/lib/pubsub/index.d.cts +27 -0
- package/dist/lib/pubsub/index.d.cts.map +1 -0
- package/dist/lib/pubsub/index.d.mts +27 -0
- package/dist/lib/pubsub/index.d.mts.map +1 -0
- package/dist/lib/pubsub/index.mjs +49 -0
- package/dist/lib/pubsub/index.mjs.map +1 -0
- package/dist/lib/queue/index.cjs +182 -0
- package/dist/lib/queue/index.d.cts +32 -0
- package/dist/lib/queue/index.d.cts.map +1 -0
- package/dist/lib/queue/index.d.mts +32 -0
- package/dist/lib/queue/index.d.mts.map +1 -0
- package/dist/lib/queue/index.mjs +183 -0
- package/dist/lib/queue/index.mjs.map +1 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts +80 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.cts.map +1 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +80 -0
- package/dist/node_modules/@standard-schema/spec/dist/index.d.mts.map +1 -0
- package/dist/policy/helpers.cjs +206 -0
- package/dist/policy/helpers.d.cts +50 -0
- package/dist/policy/helpers.d.cts.map +1 -0
- package/dist/policy/helpers.d.mts +50 -0
- package/dist/policy/helpers.d.mts.map +1 -0
- package/dist/policy/helpers.mjs +190 -0
- package/dist/policy/helpers.mjs.map +1 -0
- package/dist/policy/types.d.cts +16 -0
- package/dist/policy/types.d.cts.map +1 -0
- package/dist/policy/types.d.mts +16 -0
- package/dist/policy/types.d.mts.map +1 -0
- package/dist/prompts/core/keys.cjs +165 -0
- package/dist/prompts/core/keys.mjs +167 -0
- package/dist/prompts/core/keys.mjs.map +1 -0
- package/dist/prompts/core/runtime.cjs +104 -0
- package/dist/prompts/core/runtime.mjs +106 -0
- package/dist/prompts/core/runtime.mjs.map +1 -0
- package/dist/prompts/core/session.cjs +98 -0
- package/dist/prompts/core/session.mjs +100 -0
- package/dist/prompts/core/session.mjs.map +1 -0
- package/dist/prompts/core/types.d.cts +21 -0
- package/dist/prompts/core/types.d.cts.map +1 -0
- package/dist/prompts/core/types.d.mts +21 -0
- package/dist/prompts/core/types.d.mts.map +1 -0
- package/dist/prompts/types.d.cts +52 -0
- package/dist/prompts/types.d.cts.map +1 -0
- package/dist/prompts/types.d.mts +52 -0
- package/dist/prompts/types.d.mts.map +1 -0
- package/dist/pubsub/types.d.cts +10 -0
- package/dist/pubsub/types.d.cts.map +1 -0
- package/dist/pubsub/types.d.mts +10 -0
- package/dist/pubsub/types.d.mts.map +1 -0
- package/dist/queue/types.d.cts +47 -0
- package/dist/queue/types.d.cts.map +1 -0
- package/dist/queue/types.d.mts +47 -0
- package/dist/queue/types.d.mts.map +1 -0
- package/package.json +86 -16
- package/dist/lib/api/core/index.d.ts +0 -15
- package/dist/lib/api/core/index.d.ts.map +0 -1
- package/dist/lib/api/core/index.js +0 -166
- package/dist/lib/api/core/index.js.map +0 -1
- package/dist/lib/api/core/index.test.d.ts +0 -2
- package/dist/lib/api/core/index.test.d.ts.map +0 -1
- package/dist/lib/api/core/index.test.js +0 -219
- package/dist/lib/api/core/index.test.js.map +0 -1
- package/dist/lib/api/core/types.d.ts +0 -102
- package/dist/lib/api/core/types.d.ts.map +0 -1
- package/dist/lib/api/core/types.js +0 -2
- package/dist/lib/api/core/types.js.map +0 -1
- package/dist/lib/api/index.d.ts +0 -5
- package/dist/lib/api/index.d.ts.map +0 -1
- package/dist/lib/api/index.js +0 -3
- package/dist/lib/api/index.js.map +0 -1
- package/dist/lib/api/middleware/index.d.ts +0 -7
- package/dist/lib/api/middleware/index.d.ts.map +0 -1
- package/dist/lib/api/middleware/index.js +0 -7
- package/dist/lib/api/middleware/index.js.map +0 -1
- package/dist/lib/api/middleware/index.test.d.ts +0 -2
- package/dist/lib/api/middleware/index.test.d.ts.map +0 -1
- package/dist/lib/api/middleware/index.test.js +0 -67
- package/dist/lib/api/middleware/index.test.js.map +0 -1
- package/dist/lib/api/middleware/types.d.ts +0 -12
- package/dist/lib/api/middleware/types.d.ts.map +0 -1
- package/dist/lib/api/middleware/types.js +0 -2
- package/dist/lib/api/middleware/types.js.map +0 -1
- package/dist/lib/api/openapi/index.d.ts +0 -31
- package/dist/lib/api/openapi/index.d.ts.map +0 -1
- package/dist/lib/api/openapi/index.js +0 -328
- package/dist/lib/api/openapi/index.js.map +0 -1
- package/dist/lib/api/openapi/index.test.d.ts +0 -2
- package/dist/lib/api/openapi/index.test.d.ts.map +0 -1
- package/dist/lib/api/openapi/index.test.js +0 -359
- package/dist/lib/api/openapi/index.test.js.map +0 -1
- package/dist/lib/api/openapi/types.d.ts +0 -57
- package/dist/lib/api/openapi/types.d.ts.map +0 -1
- package/dist/lib/api/openapi/types.js +0 -5
- package/dist/lib/api/openapi/types.js.map +0 -1
- package/dist/lib/api/validation/index.d.ts +0 -33
- package/dist/lib/api/validation/index.d.ts.map +0 -1
- package/dist/lib/api/validation/index.js +0 -81
- package/dist/lib/api/validation/index.js.map +0 -1
- package/dist/lib/api/validation/index.test.d.ts +0 -2
- package/dist/lib/api/validation/index.test.d.ts.map +0 -1
- package/dist/lib/api/validation/index.test.js +0 -135
- package/dist/lib/api/validation/index.test.js.map +0 -1
- package/dist/lib/cache/index.d.ts +0 -25
- package/dist/lib/cache/index.d.ts.map +0 -1
- package/dist/lib/cache/index.js +0 -62
- package/dist/lib/cache/index.js.map +0 -1
- package/dist/lib/cache/index.test.d.ts +0 -2
- package/dist/lib/cache/index.test.d.ts.map +0 -1
- package/dist/lib/cache/index.test.js +0 -314
- package/dist/lib/cache/index.test.js.map +0 -1
- package/dist/lib/cache/types.d.ts +0 -5
- package/dist/lib/cache/types.d.ts.map +0 -1
- package/dist/lib/cache/types.js +0 -2
- package/dist/lib/cache/types.js.map +0 -1
- package/dist/lib/errors/index.d.ts +0 -9
- package/dist/lib/errors/index.d.ts.map +0 -1
- package/dist/lib/errors/index.js +0 -25
- package/dist/lib/errors/index.js.map +0 -1
- package/dist/lib/errors/index.test.d.ts +0 -2
- package/dist/lib/errors/index.test.d.ts.map +0 -1
- package/dist/lib/errors/index.test.js +0 -197
- package/dist/lib/errors/index.test.js.map +0 -1
- package/dist/lib/errors/types.d.ts +0 -2
- package/dist/lib/errors/types.d.ts.map +0 -1
- package/dist/lib/errors/types.js +0 -2
- package/dist/lib/errors/types.js.map +0 -1
- package/dist/lib/i18n/index.d.ts +0 -18
- package/dist/lib/i18n/index.d.ts.map +0 -1
- package/dist/lib/i18n/index.js +0 -38
- package/dist/lib/i18n/index.js.map +0 -1
- package/dist/lib/i18n/index.test.d.ts +0 -2
- package/dist/lib/i18n/index.test.d.ts.map +0 -1
- package/dist/lib/i18n/index.test.js +0 -402
- package/dist/lib/i18n/index.test.js.map +0 -1
- package/dist/lib/i18n/types.d.ts +0 -15
- package/dist/lib/i18n/types.d.ts.map +0 -1
- package/dist/lib/i18n/types.js +0 -2
- package/dist/lib/i18n/types.js.map +0 -1
- package/dist/lib/policy/index.d.ts +0 -9
- package/dist/lib/policy/index.d.ts.map +0 -1
- package/dist/lib/policy/index.js +0 -51
- package/dist/lib/policy/index.js.map +0 -1
- package/dist/lib/policy/index.test.d.ts +0 -2
- package/dist/lib/policy/index.test.d.ts.map +0 -1
- package/dist/lib/policy/index.test.js +0 -328
- package/dist/lib/policy/index.test.js.map +0 -1
- package/dist/lib/policy/types.d.ts +0 -27
- package/dist/lib/policy/types.d.ts.map +0 -1
- package/dist/lib/policy/types.js +0 -2
- package/dist/lib/policy/types.js.map +0 -1
- package/dist/lib/pubsub/index.d.ts +0 -23
- package/dist/lib/pubsub/index.d.ts.map +0 -1
- package/dist/lib/pubsub/index.js +0 -55
- package/dist/lib/pubsub/index.js.map +0 -1
- package/dist/lib/pubsub/index.test.d.ts +0 -2
- package/dist/lib/pubsub/index.test.d.ts.map +0 -1
- package/dist/lib/pubsub/index.test.js +0 -550
- package/dist/lib/pubsub/index.test.js.map +0 -1
- package/dist/lib/pubsub/types.d.ts +0 -7
- package/dist/lib/pubsub/types.d.ts.map +0 -1
- package/dist/lib/pubsub/types.js +0 -2
- package/dist/lib/pubsub/types.js.map +0 -1
- package/dist/lib/queue/index.d.ts +0 -28
- package/dist/lib/queue/index.d.ts.map +0 -1
- package/dist/lib/queue/index.js +0 -211
- package/dist/lib/queue/index.js.map +0 -1
- package/dist/lib/queue/index.test.d.ts +0 -2
- package/dist/lib/queue/index.test.d.ts.map +0 -1
- package/dist/lib/queue/index.test.js +0 -740
- package/dist/lib/queue/index.test.js.map +0 -1
- package/dist/lib/queue/types.d.ts +0 -52
- package/dist/lib/queue/types.d.ts.map +0 -1
- package/dist/lib/queue/types.js +0 -2
- package/dist/lib/queue/types.js.map +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { err, mightThrow, ok } from "../../lib/errors/index.mjs";
|
|
2
|
+
//#region src/lib/prompts/core/session.ts
|
|
3
|
+
const CANCEL_MESSAGE = "Interrupted, bye!";
|
|
4
|
+
const resolveOutput = async (options, value) => {
|
|
5
|
+
if (!options.transform) return ok(value);
|
|
6
|
+
const [transformError, transformed] = await mightThrow(Promise.resolve().then(() => options.transform?.(value)));
|
|
7
|
+
if (transformError || transformed === null || transformed === void 0) return err("PromptIOError", "Prompt transform callback failed unexpectedly");
|
|
8
|
+
return ok(transformed);
|
|
9
|
+
};
|
|
10
|
+
const runValidation = async (options, value) => {
|
|
11
|
+
if (!options.validate) return ok(null);
|
|
12
|
+
const [validationError, validationMessage] = await mightThrow(Promise.resolve().then(() => options.validate?.(value)));
|
|
13
|
+
if (validationError) return err("PromptIOError", "Prompt validate callback failed unexpectedly");
|
|
14
|
+
if (typeof validationMessage === "string" && validationMessage.length > 0) return ok(validationMessage);
|
|
15
|
+
return ok(null);
|
|
16
|
+
};
|
|
17
|
+
const isCancelKey = (key) => {
|
|
18
|
+
if (key.name === "ctrl_c") return true;
|
|
19
|
+
if (key.name === "escape") return true;
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
22
|
+
const runPromptSession = async (params) => {
|
|
23
|
+
const [initError] = params.runtime.init();
|
|
24
|
+
if (initError) return err(initError.type, initError.message);
|
|
25
|
+
let state = params.initialState;
|
|
26
|
+
let errorMessage = null;
|
|
27
|
+
const closeAndDone = (message) => {
|
|
28
|
+
const [closeErr] = params.runtime.close();
|
|
29
|
+
if (closeErr) return err(closeErr.type, closeErr.message);
|
|
30
|
+
const [doneErr] = params.runtime.done(message);
|
|
31
|
+
if (doneErr) return err(doneErr.type, doneErr.message);
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
while (true) {
|
|
35
|
+
const [renderError] = params.runtime.render(params.render({
|
|
36
|
+
options: params.options,
|
|
37
|
+
state,
|
|
38
|
+
errorMessage
|
|
39
|
+
}));
|
|
40
|
+
if (renderError) {
|
|
41
|
+
params.runtime.close();
|
|
42
|
+
return err(renderError.type, renderError.message);
|
|
43
|
+
}
|
|
44
|
+
const [readError, key] = await params.runtime.readKey();
|
|
45
|
+
if (readError || !key) {
|
|
46
|
+
params.runtime.close();
|
|
47
|
+
return err(readError?.type ?? "PromptIOError", readError?.message ?? "Unable to read prompt input");
|
|
48
|
+
}
|
|
49
|
+
if (isCancelKey(key)) {
|
|
50
|
+
const [closeError] = params.runtime.close();
|
|
51
|
+
if (closeError) return err(closeError.type, closeError.message);
|
|
52
|
+
const [doneError] = params.runtime.done(`✖ ${CANCEL_MESSAGE}`);
|
|
53
|
+
if (doneError) return err(doneError.type, doneError.message);
|
|
54
|
+
if (params.runtime.interrupt) {
|
|
55
|
+
const [interruptError] = params.runtime.interrupt(CANCEL_MESSAGE);
|
|
56
|
+
if (interruptError) return err(interruptError.type, interruptError.message);
|
|
57
|
+
}
|
|
58
|
+
return err("PromptCancelledError", CANCEL_MESSAGE);
|
|
59
|
+
}
|
|
60
|
+
if (key.name !== "enter") {
|
|
61
|
+
state = params.onKey(state, key);
|
|
62
|
+
errorMessage = null;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const submitResult = params.onSubmit(state);
|
|
66
|
+
if ("errorMessage" in submitResult) {
|
|
67
|
+
errorMessage = submitResult.errorMessage;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const rawValue = submitResult.value;
|
|
71
|
+
const [validationRunError, validationErrorMessage] = await runValidation(params.options, rawValue);
|
|
72
|
+
if (validationRunError) {
|
|
73
|
+
const closeDoneErr = closeAndDone(`✖ ${params.options.message}`);
|
|
74
|
+
if (closeDoneErr) return closeDoneErr;
|
|
75
|
+
return err(validationRunError.type, validationRunError.message);
|
|
76
|
+
}
|
|
77
|
+
if (validationErrorMessage) {
|
|
78
|
+
errorMessage = validationErrorMessage;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const [transformError, finalValue] = await resolveOutput(params.options, rawValue);
|
|
82
|
+
if (transformError) {
|
|
83
|
+
const closeDoneErr = closeAndDone(`✖ ${params.options.message}`);
|
|
84
|
+
if (closeDoneErr) return closeDoneErr;
|
|
85
|
+
return err(transformError.type, transformError.message);
|
|
86
|
+
}
|
|
87
|
+
if (finalValue === null) return err("PromptIOError", "Unable to transform prompt value");
|
|
88
|
+
const closeDoneErr = closeAndDone(params.complete({
|
|
89
|
+
options: params.options,
|
|
90
|
+
state,
|
|
91
|
+
value: finalValue
|
|
92
|
+
}));
|
|
93
|
+
if (closeDoneErr) return closeDoneErr;
|
|
94
|
+
return ok(finalValue);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
//#endregion
|
|
98
|
+
export { runPromptSession };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=session.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.mjs","names":[],"sources":["../../../src/lib/prompts/core/session.ts"],"sourcesContent":["import { err, mightThrow, ok } from \"../../errors/index.js\";\nimport type { BasePromptOptions } from \"../types.js\";\nimport type { Key, PromptRuntime } from \"./types.js\";\n\ntype SubmitResult<TValue> =\n | {\n value: TValue;\n }\n | {\n errorMessage: string;\n };\n\ntype SessionOptions<\n TState,\n TValue,\n TOptions extends BasePromptOptions<TValue>,\n> = {\n runtime: PromptRuntime;\n options: TOptions;\n initialState: TState;\n render: (params: {\n options: TOptions;\n state: TState;\n errorMessage: string | null;\n }) => string;\n complete: (params: {\n options: TOptions;\n state: TState;\n value: TValue;\n }) => string;\n onKey: (state: TState, key: Key) => TState;\n onSubmit: (state: TState) => SubmitResult<TValue>;\n};\n\nconst CANCEL_MESSAGE = \"Interrupted, bye!\";\n\nconst resolveOutput = async <TValue>(\n options: BasePromptOptions<TValue>,\n value: TValue,\n) => {\n if (!options.transform) {\n return ok(value);\n }\n\n const [transformError, transformed] = await mightThrow(\n Promise.resolve().then(() => options.transform?.(value)),\n );\n\n if (transformError || transformed === null || transformed === undefined) {\n return err(\n \"PromptIOError\",\n \"Prompt transform callback failed unexpectedly\",\n );\n }\n\n return ok(transformed);\n};\n\nconst runValidation = async <TValue>(\n options: BasePromptOptions<TValue>,\n value: TValue,\n) => {\n if (!options.validate) {\n return ok(null);\n }\n\n const [validationError, validationMessage] = await mightThrow(\n Promise.resolve().then(() => options.validate?.(value)),\n );\n\n if (validationError) {\n return err(\"PromptIOError\", \"Prompt validate callback failed unexpectedly\");\n }\n\n if (typeof validationMessage === \"string\" && validationMessage.length > 0) {\n return ok(validationMessage);\n }\n\n return ok(null);\n};\n\nconst isCancelKey = (key: Key) => {\n if (key.name === \"ctrl_c\") return true;\n if (key.name === \"escape\") return true;\n\n return false;\n};\n\nexport const runPromptSession = async <\n TState,\n TValue,\n TOptions extends BasePromptOptions<TValue>,\n>(\n params: SessionOptions<TState, TValue, TOptions>,\n) => {\n const [initError] = params.runtime.init();\n\n if (initError) {\n return err(initError.type, initError.message);\n }\n\n let state = params.initialState;\n let errorMessage: string | null = null;\n\n const closeAndDone = (message: string) => {\n const [closeErr] = params.runtime.close();\n\n if (closeErr) {\n return err(closeErr.type, closeErr.message);\n }\n\n const [doneErr] = params.runtime.done(message);\n\n if (doneErr) {\n return err(doneErr.type, doneErr.message);\n }\n\n return null;\n };\n\n while (true) {\n const [renderError] = params.runtime.render(\n params.render({\n options: params.options,\n state,\n errorMessage,\n }),\n );\n\n if (renderError) {\n params.runtime.close();\n return err(renderError.type, renderError.message);\n }\n\n const [readError, key] = await params.runtime.readKey();\n\n if (readError || !key) {\n params.runtime.close();\n return err(\n readError?.type ?? \"PromptIOError\",\n readError?.message ?? \"Unable to read prompt input\",\n );\n }\n\n if (isCancelKey(key)) {\n const [closeError] = params.runtime.close();\n\n if (closeError) {\n return err(closeError.type, closeError.message);\n }\n\n const [doneError] = params.runtime.done(`✖ ${CANCEL_MESSAGE}`);\n\n if (doneError) {\n return err(doneError.type, doneError.message);\n }\n\n if (params.runtime.interrupt) {\n const [interruptError] = params.runtime.interrupt(CANCEL_MESSAGE);\n\n if (interruptError) {\n return err(interruptError.type, interruptError.message);\n }\n }\n\n return err(\"PromptCancelledError\", CANCEL_MESSAGE);\n }\n\n if (key.name !== \"enter\") {\n state = params.onKey(state, key);\n errorMessage = null;\n continue;\n }\n\n const submitResult = params.onSubmit(state);\n\n if (\"errorMessage\" in submitResult) {\n errorMessage = submitResult.errorMessage;\n continue;\n }\n\n const rawValue = submitResult.value;\n\n const [validationRunError, validationErrorMessage] = await runValidation(\n params.options,\n rawValue,\n );\n\n if (validationRunError) {\n const closeDoneErr = closeAndDone(`✖ ${params.options.message}`);\n\n if (closeDoneErr) {\n return closeDoneErr;\n }\n\n return err(validationRunError.type, validationRunError.message);\n }\n\n if (validationErrorMessage) {\n errorMessage = validationErrorMessage;\n continue;\n }\n\n const [transformError, finalValue] = await resolveOutput(\n params.options,\n rawValue,\n );\n\n if (transformError) {\n const closeDoneErr = closeAndDone(`✖ ${params.options.message}`);\n\n if (closeDoneErr) {\n return closeDoneErr;\n }\n\n return err(transformError.type, transformError.message);\n }\n\n if (finalValue === null) {\n return err(\"PromptIOError\", \"Unable to transform prompt value\");\n }\n\n const closeDoneErr = closeAndDone(\n params.complete({\n options: params.options,\n state,\n value: finalValue,\n }),\n );\n\n if (closeDoneErr) {\n return closeDoneErr;\n }\n\n return ok(finalValue);\n }\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { err, ok } from "../../lib/errors/index.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/prompts/core/types.d.ts
|
|
4
|
+
type PromptResultLike<T> = ReturnType<typeof err<string>> | ReturnType<typeof ok<T>>;
|
|
5
|
+
type KeyName = "character" | "enter" | "backspace" | "delete" | "up" | "down" | "left" | "right" | "ctrl_left" | "ctrl_right" | "shift_left" | "shift_right" | "space" | "escape" | "ctrl_c" | "ctrl_backspace" | "ctrl_a" | "home" | "end" | "shift_ctrl_left" | "shift_ctrl_right" | "tab";
|
|
6
|
+
type Key = {
|
|
7
|
+
name: KeyName;
|
|
8
|
+
value?: string;
|
|
9
|
+
};
|
|
10
|
+
type PromptRuntime = {
|
|
11
|
+
isInteractive: () => boolean;
|
|
12
|
+
init: () => PromptResultLike<void>;
|
|
13
|
+
readKey: () => Promise<PromptResultLike<Key>>;
|
|
14
|
+
render: (frame: string) => PromptResultLike<void>;
|
|
15
|
+
done: (frame: string) => PromptResultLike<void>;
|
|
16
|
+
close: () => PromptResultLike<void>;
|
|
17
|
+
interrupt?: (message: string) => PromptResultLike<undefined>;
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { PromptRuntime };
|
|
21
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/lib/prompts/core/types.ts"],"mappings":";;;KAEY,gBAAA,MACR,UAAA,QAAkB,GAAA,YAClB,UAAA,QAAkB,EAAA,CAAG,CAAA;AAAA,KAEb,OAAA;AAAA,KAwBA,GAAA;EACV,IAAA,EAAM,OAAA;EACN,KAAA;AAAA;AAAA,KAGU,aAAA;EACV,aAAA;EACA,IAAA,QAAY,gBAAA;EACZ,OAAA,QAAe,OAAA,CAAQ,gBAAA,CAAiB,GAAA;EACxC,MAAA,GAAS,KAAA,aAAkB,gBAAA;EAC3B,IAAA,GAAO,KAAA,aAAkB,gBAAA;EACzB,KAAA,QAAa,gBAAA;EACb,SAAA,IAAa,OAAA,aAAoB,gBAAA;AAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { err, ok } from "../../lib/errors/index.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/prompts/core/types.d.ts
|
|
4
|
+
type PromptResultLike<T> = ReturnType<typeof err<string>> | ReturnType<typeof ok<T>>;
|
|
5
|
+
type KeyName = "character" | "enter" | "backspace" | "delete" | "up" | "down" | "left" | "right" | "ctrl_left" | "ctrl_right" | "shift_left" | "shift_right" | "space" | "escape" | "ctrl_c" | "ctrl_backspace" | "ctrl_a" | "home" | "end" | "shift_ctrl_left" | "shift_ctrl_right" | "tab";
|
|
6
|
+
type Key = {
|
|
7
|
+
name: KeyName;
|
|
8
|
+
value?: string;
|
|
9
|
+
};
|
|
10
|
+
type PromptRuntime = {
|
|
11
|
+
isInteractive: () => boolean;
|
|
12
|
+
init: () => PromptResultLike<void>;
|
|
13
|
+
readKey: () => Promise<PromptResultLike<Key>>;
|
|
14
|
+
render: (frame: string) => PromptResultLike<void>;
|
|
15
|
+
done: (frame: string) => PromptResultLike<void>;
|
|
16
|
+
close: () => PromptResultLike<void>;
|
|
17
|
+
interrupt?: (message: string) => PromptResultLike<undefined>;
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { PromptRuntime };
|
|
21
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/lib/prompts/core/types.ts"],"mappings":";;;KAEY,gBAAA,MACR,UAAA,QAAkB,GAAA,YAClB,UAAA,QAAkB,EAAA,CAAG,CAAA;AAAA,KAEb,OAAA;AAAA,KAwBA,GAAA;EACV,IAAA,EAAM,OAAA;EACN,KAAA;AAAA;AAAA,KAGU,aAAA;EACV,aAAA;EACA,IAAA,QAAY,gBAAA;EACZ,OAAA,QAAe,OAAA,CAAQ,gBAAA,CAAiB,GAAA;EACxC,MAAA,GAAS,KAAA,aAAkB,gBAAA;EAC3B,IAAA,GAAO,KAAA,aAAkB,gBAAA;EACzB,KAAA,QAAa,gBAAA;EACb,SAAA,IAAa,OAAA,aAAoB,gBAAA;AAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//#region src/lib/prompts/types.d.ts
|
|
2
|
+
type PromptErrorType = "PromptEnvironmentError" | "PromptValidationError" | "PromptCancelledError" | "PromptIOError" | (string & {});
|
|
3
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
4
|
+
type Validate<TValue> = ((value: TValue) => MaybePromise<string | null | undefined>) | undefined;
|
|
5
|
+
type Transform<TValue> = ((value: TValue) => MaybePromise<TValue>) | undefined;
|
|
6
|
+
type BasePromptOptions<TValue> = {
|
|
7
|
+
message: string;
|
|
8
|
+
validate?: Validate<TValue>;
|
|
9
|
+
transform?: Transform<TValue>;
|
|
10
|
+
};
|
|
11
|
+
type InputOptions = BasePromptOptions<string> & {
|
|
12
|
+
defaultValue?: string;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
requiredMessage?: string;
|
|
16
|
+
};
|
|
17
|
+
type PasswordOptions = InputOptions & {
|
|
18
|
+
mask?: string;
|
|
19
|
+
};
|
|
20
|
+
type ConfirmOptions = BasePromptOptions<boolean> & {
|
|
21
|
+
defaultValue?: boolean;
|
|
22
|
+
activeLabel?: string;
|
|
23
|
+
inactiveLabel?: string;
|
|
24
|
+
};
|
|
25
|
+
type NumberOptions = BasePromptOptions<number> & {
|
|
26
|
+
defaultValue?: number;
|
|
27
|
+
min?: number;
|
|
28
|
+
max?: number;
|
|
29
|
+
requiredMessage?: string;
|
|
30
|
+
invalidMessage?: string;
|
|
31
|
+
minMessage?: string;
|
|
32
|
+
maxMessage?: string;
|
|
33
|
+
};
|
|
34
|
+
type SelectChoice<TValue extends string> = {
|
|
35
|
+
value: TValue;
|
|
36
|
+
label?: string;
|
|
37
|
+
hint?: string;
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
};
|
|
40
|
+
type SelectOptions<TValue extends string> = BasePromptOptions<TValue> & {
|
|
41
|
+
choices: readonly [SelectChoice<TValue>, ...SelectChoice<TValue>[]];
|
|
42
|
+
defaultValue?: TValue;
|
|
43
|
+
};
|
|
44
|
+
type MultiselectOptions<TValue extends string> = BasePromptOptions<TValue[]> & {
|
|
45
|
+
choices: readonly [SelectChoice<TValue>, ...SelectChoice<TValue>[]];
|
|
46
|
+
defaultValue?: readonly TValue[];
|
|
47
|
+
min?: number;
|
|
48
|
+
max?: number;
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
export { ConfirmOptions, InputOptions, MultiselectOptions, NumberOptions, PasswordOptions, PromptErrorType, SelectChoice, SelectOptions };
|
|
52
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/lib/prompts/types.ts"],"mappings":";KAAY,eAAA;AAAA,KAOA,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAE9B,QAAA,aACN,KAAA,EAAO,MAAA,KAAW,YAAA;AAAA,KAGZ,SAAA,aACN,KAAA,EAAO,MAAA,KAAW,YAAA,CAAa,MAAA;AAAA,KAGzB,iBAAA;EACV,OAAA;EACA,QAAA,GAAW,QAAA,CAAS,MAAA;EACpB,SAAA,GAAY,SAAA,CAAU,MAAA;AAAA;AAAA,KAGZ,YAAA,GAAe,iBAAA;EACzB,YAAA;EACA,WAAA;EACA,QAAA;EACA,eAAA;AAAA;AAAA,KAGU,eAAA,GAAkB,YAAA;EAC5B,IAAA;AAAA;AAAA,KAGU,cAAA,GAAiB,iBAAA;EAC3B,YAAA;EACA,WAAA;EACA,aAAA;AAAA;AAAA,KAGU,aAAA,GAAgB,iBAAA;EAC1B,YAAA;EACA,GAAA;EACA,GAAA;EACA,eAAA;EACA,cAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,KAGU,YAAA;EACV,KAAA,EAAO,MAAA;EACP,KAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,aAAA,0BAAuC,iBAAA,CAAkB,MAAA;EACnE,OAAA,YAAmB,YAAA,CAAa,MAAA,MAAY,YAAA,CAAa,MAAA;EACzD,YAAA,GAAe,MAAA;AAAA;AAAA,KAGL,kBAAA,0BAA4C,iBAAA,CACtD,MAAA;EAEA,OAAA,YAAmB,YAAA,CAAa,MAAA,MAAY,YAAA,CAAa,MAAA;EACzD,YAAA,YAAwB,MAAA;EACxB,GAAA;EACA,GAAA;AAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//#region src/lib/prompts/types.d.ts
|
|
2
|
+
type PromptErrorType = "PromptEnvironmentError" | "PromptValidationError" | "PromptCancelledError" | "PromptIOError" | (string & {});
|
|
3
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
4
|
+
type Validate<TValue> = ((value: TValue) => MaybePromise<string | null | undefined>) | undefined;
|
|
5
|
+
type Transform<TValue> = ((value: TValue) => MaybePromise<TValue>) | undefined;
|
|
6
|
+
type BasePromptOptions<TValue> = {
|
|
7
|
+
message: string;
|
|
8
|
+
validate?: Validate<TValue>;
|
|
9
|
+
transform?: Transform<TValue>;
|
|
10
|
+
};
|
|
11
|
+
type InputOptions = BasePromptOptions<string> & {
|
|
12
|
+
defaultValue?: string;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
requiredMessage?: string;
|
|
16
|
+
};
|
|
17
|
+
type PasswordOptions = InputOptions & {
|
|
18
|
+
mask?: string;
|
|
19
|
+
};
|
|
20
|
+
type ConfirmOptions = BasePromptOptions<boolean> & {
|
|
21
|
+
defaultValue?: boolean;
|
|
22
|
+
activeLabel?: string;
|
|
23
|
+
inactiveLabel?: string;
|
|
24
|
+
};
|
|
25
|
+
type NumberOptions = BasePromptOptions<number> & {
|
|
26
|
+
defaultValue?: number;
|
|
27
|
+
min?: number;
|
|
28
|
+
max?: number;
|
|
29
|
+
requiredMessage?: string;
|
|
30
|
+
invalidMessage?: string;
|
|
31
|
+
minMessage?: string;
|
|
32
|
+
maxMessage?: string;
|
|
33
|
+
};
|
|
34
|
+
type SelectChoice<TValue extends string> = {
|
|
35
|
+
value: TValue;
|
|
36
|
+
label?: string;
|
|
37
|
+
hint?: string;
|
|
38
|
+
disabled?: boolean;
|
|
39
|
+
};
|
|
40
|
+
type SelectOptions<TValue extends string> = BasePromptOptions<TValue> & {
|
|
41
|
+
choices: readonly [SelectChoice<TValue>, ...SelectChoice<TValue>[]];
|
|
42
|
+
defaultValue?: TValue;
|
|
43
|
+
};
|
|
44
|
+
type MultiselectOptions<TValue extends string> = BasePromptOptions<TValue[]> & {
|
|
45
|
+
choices: readonly [SelectChoice<TValue>, ...SelectChoice<TValue>[]];
|
|
46
|
+
defaultValue?: readonly TValue[];
|
|
47
|
+
min?: number;
|
|
48
|
+
max?: number;
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
export { ConfirmOptions, InputOptions, MultiselectOptions, NumberOptions, PasswordOptions, PromptErrorType, SelectChoice, SelectOptions };
|
|
52
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/prompts/types.ts"],"mappings":";KAAY,eAAA;AAAA,KAOA,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAE9B,QAAA,aACN,KAAA,EAAO,MAAA,KAAW,YAAA;AAAA,KAGZ,SAAA,aACN,KAAA,EAAO,MAAA,KAAW,YAAA,CAAa,MAAA;AAAA,KAGzB,iBAAA;EACV,OAAA;EACA,QAAA,GAAW,QAAA,CAAS,MAAA;EACpB,SAAA,GAAY,SAAA,CAAU,MAAA;AAAA;AAAA,KAGZ,YAAA,GAAe,iBAAA;EACzB,YAAA;EACA,WAAA;EACA,QAAA;EACA,eAAA;AAAA;AAAA,KAGU,eAAA,GAAkB,YAAA;EAC5B,IAAA;AAAA;AAAA,KAGU,cAAA,GAAiB,iBAAA;EAC3B,YAAA;EACA,WAAA;EACA,aAAA;AAAA;AAAA,KAGU,aAAA,GAAgB,iBAAA;EAC1B,YAAA;EACA,GAAA;EACA,GAAA;EACA,eAAA;EACA,cAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,KAGU,YAAA;EACV,KAAA,EAAO,MAAA;EACP,KAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,aAAA,0BAAuC,iBAAA,CAAkB,MAAA;EACnE,OAAA,YAAmB,YAAA,CAAa,MAAA,MAAY,YAAA,CAAa,MAAA;EACzD,YAAA,GAAe,MAAA;AAAA;AAAA,KAGL,kBAAA,0BAA4C,iBAAA,CACtD,MAAA;EAEA,OAAA,YAAmB,YAAA,CAAa,MAAA,MAAY,YAAA,CAAa,MAAA;EACzD,YAAA,YAAwB,MAAA;EACxB,GAAA;EACA,GAAA;AAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/lib/pubsub/types.d.ts
|
|
2
|
+
type PubSubOptions = {
|
|
3
|
+
subscriber: Bun.RedisClient;
|
|
4
|
+
publisher: Bun.RedisClient;
|
|
5
|
+
channel: string;
|
|
6
|
+
};
|
|
7
|
+
type MessageHandler<T> = (message: T, channel: string) => void | Promise<void>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { MessageHandler, PubSubOptions };
|
|
10
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/lib/pubsub/types.ts"],"mappings":";KAAY,aAAA;EACV,UAAA,EAAY,GAAA,CAAI,WAAA;EAChB,SAAA,EAAW,GAAA,CAAI,WAAA;EACf,OAAA;AAAA;AAAA,KAGU,cAAA,OACV,OAAA,EAAS,CAAA,EACT,OAAA,oBACU,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/lib/pubsub/types.d.ts
|
|
2
|
+
type PubSubOptions = {
|
|
3
|
+
subscriber: Bun.RedisClient;
|
|
4
|
+
publisher: Bun.RedisClient;
|
|
5
|
+
channel: string;
|
|
6
|
+
};
|
|
7
|
+
type MessageHandler<T> = (message: T, channel: string) => void | Promise<void>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { MessageHandler, PubSubOptions };
|
|
10
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/pubsub/types.ts"],"mappings":";KAAY,aAAA;EACV,UAAA,EAAY,GAAA,CAAI,WAAA;EAChB,SAAA,EAAW,GAAA,CAAI,WAAA;EACf,OAAA;AAAA;AAAA,KAGU,cAAA,OACV,OAAA,EAAS,CAAA,EACT,OAAA,oBACU,OAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//#region src/lib/queue/types.d.ts
|
|
2
|
+
type Job<T> = {
|
|
3
|
+
id: string;
|
|
4
|
+
data: T;
|
|
5
|
+
attempts: number;
|
|
6
|
+
maxRetries: number;
|
|
7
|
+
createdAt: number;
|
|
8
|
+
};
|
|
9
|
+
type RetryContext<T> = {
|
|
10
|
+
job: Job<T>;
|
|
11
|
+
error: string;
|
|
12
|
+
nextRetryDelayMs: number;
|
|
13
|
+
retriesRemaining: number;
|
|
14
|
+
backoffMultiplier: number;
|
|
15
|
+
};
|
|
16
|
+
type ErrorContext<T> = {
|
|
17
|
+
job: Job<T>;
|
|
18
|
+
lastError: string;
|
|
19
|
+
totalDurationMs: number;
|
|
20
|
+
totalAttempts: number;
|
|
21
|
+
errorHistory: Array<{
|
|
22
|
+
attempt: number;
|
|
23
|
+
error: string;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
27
|
+
type ParseErrorContext = {
|
|
28
|
+
rawJobData: string;
|
|
29
|
+
parseError: string;
|
|
30
|
+
timestamp: number;
|
|
31
|
+
};
|
|
32
|
+
type QueueOptions<T> = {
|
|
33
|
+
name: string;
|
|
34
|
+
redis: Bun.RedisClient;
|
|
35
|
+
handler: (data: T, signal?: AbortSignal) => void | Promise<void>;
|
|
36
|
+
onSuccess?: (job: Job<T>) => void | Promise<void>;
|
|
37
|
+
onRetry?: (context: RetryContext<T>) => void | Promise<void>;
|
|
38
|
+
onError?: (context: ErrorContext<T>) => void | Promise<void>;
|
|
39
|
+
onParseError?: (context: ParseErrorContext) => void | Promise<void>;
|
|
40
|
+
retries?: number;
|
|
41
|
+
timeout?: number;
|
|
42
|
+
concurrency?: number;
|
|
43
|
+
pollInterval?: number;
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
export { QueueOptions };
|
|
47
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/lib/queue/types.ts"],"mappings":";KAAY,GAAA;EACV,EAAA;EACA,IAAA,EAAM,CAAA;EACN,QAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAYU,YAAA;EACV,GAAA,EAAK,GAAA,CAAI,CAAA;EACT,KAAA;EACA,gBAAA;EACA,gBAAA;EACA,iBAAA;AAAA;AAAA,KAGU,YAAA;EACV,GAAA,EAAK,GAAA,CAAI,CAAA;EACT,SAAA;EACA,eAAA;EACA,aAAA;EACA,YAAA,EAAc,KAAA;IACZ,OAAA;IACA,KAAA;IACA,SAAA;EAAA;AAAA;AAAA,KAIQ,iBAAA;EACV,UAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAGU,YAAA;EACV,IAAA;EACA,KAAA,EAAO,GAAA,CAAI,WAAA;EACX,OAAA,GAAU,IAAA,EAAM,CAAA,EAAG,MAAA,GAAS,WAAA,YAAuB,OAAA;EACnD,SAAA,IAAa,GAAA,EAAK,GAAA,CAAI,CAAA,aAAc,OAAA;EACpC,OAAA,IAAW,OAAA,EAAS,YAAA,CAAa,CAAA,aAAc,OAAA;EAC/C,OAAA,IAAW,OAAA,EAAS,YAAA,CAAa,CAAA,aAAc,OAAA;EAC/C,YAAA,IAAgB,OAAA,EAAS,iBAAA,YAA6B,OAAA;EACtD,OAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;AAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//#region src/lib/queue/types.d.ts
|
|
2
|
+
type Job<T> = {
|
|
3
|
+
id: string;
|
|
4
|
+
data: T;
|
|
5
|
+
attempts: number;
|
|
6
|
+
maxRetries: number;
|
|
7
|
+
createdAt: number;
|
|
8
|
+
};
|
|
9
|
+
type RetryContext<T> = {
|
|
10
|
+
job: Job<T>;
|
|
11
|
+
error: string;
|
|
12
|
+
nextRetryDelayMs: number;
|
|
13
|
+
retriesRemaining: number;
|
|
14
|
+
backoffMultiplier: number;
|
|
15
|
+
};
|
|
16
|
+
type ErrorContext<T> = {
|
|
17
|
+
job: Job<T>;
|
|
18
|
+
lastError: string;
|
|
19
|
+
totalDurationMs: number;
|
|
20
|
+
totalAttempts: number;
|
|
21
|
+
errorHistory: Array<{
|
|
22
|
+
attempt: number;
|
|
23
|
+
error: string;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
27
|
+
type ParseErrorContext = {
|
|
28
|
+
rawJobData: string;
|
|
29
|
+
parseError: string;
|
|
30
|
+
timestamp: number;
|
|
31
|
+
};
|
|
32
|
+
type QueueOptions<T> = {
|
|
33
|
+
name: string;
|
|
34
|
+
redis: Bun.RedisClient;
|
|
35
|
+
handler: (data: T, signal?: AbortSignal) => void | Promise<void>;
|
|
36
|
+
onSuccess?: (job: Job<T>) => void | Promise<void>;
|
|
37
|
+
onRetry?: (context: RetryContext<T>) => void | Promise<void>;
|
|
38
|
+
onError?: (context: ErrorContext<T>) => void | Promise<void>;
|
|
39
|
+
onParseError?: (context: ParseErrorContext) => void | Promise<void>;
|
|
40
|
+
retries?: number;
|
|
41
|
+
timeout?: number;
|
|
42
|
+
concurrency?: number;
|
|
43
|
+
pollInterval?: number;
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
export { QueueOptions };
|
|
47
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/lib/queue/types.ts"],"mappings":";KAAY,GAAA;EACV,EAAA;EACA,IAAA,EAAM,CAAA;EACN,QAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAYU,YAAA;EACV,GAAA,EAAK,GAAA,CAAI,CAAA;EACT,KAAA;EACA,gBAAA;EACA,gBAAA;EACA,iBAAA;AAAA;AAAA,KAGU,YAAA;EACV,GAAA,EAAK,GAAA,CAAI,CAAA;EACT,SAAA;EACA,eAAA;EACA,aAAA;EACA,YAAA,EAAc,KAAA;IACZ,OAAA;IACA,KAAA;IACA,SAAA;EAAA;AAAA;AAAA,KAIQ,iBAAA;EACV,UAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAGU,YAAA;EACV,IAAA;EACA,KAAA,EAAO,GAAA,CAAI,WAAA;EACX,OAAA,GAAU,IAAA,EAAM,CAAA,EAAG,MAAA,GAAS,WAAA,YAAuB,OAAA;EACnD,SAAA,IAAa,GAAA,EAAK,GAAA,CAAI,CAAA,aAAc,OAAA;EACpC,OAAA,IAAW,OAAA,EAAS,YAAA,CAAa,CAAA,aAAc,OAAA;EAC/C,OAAA,IAAW,OAAA,EAAS,YAAA,CAAa,CAAA,aAAc,OAAA;EAC/C,YAAA,IAAgB,OAAA,EAAS,iBAAA,YAA6B,OAAA;EACtD,OAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,36 +1,102 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "semola",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Zero-dependency TypeScript utilities for Bun. Type-safe APIs, Redis queues, pub/sub, i18n, caching & auth with tree-shakeable imports.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
"./errors": {
|
|
8
|
-
"import":
|
|
9
|
-
|
|
8
|
+
"import": {
|
|
9
|
+
"types": "./dist/lib/errors/index.d.mts",
|
|
10
|
+
"default": "./dist/lib/errors/index.mjs"
|
|
11
|
+
},
|
|
12
|
+
"require": {
|
|
13
|
+
"types": "./dist/lib/errors/index.d.cts",
|
|
14
|
+
"default": "./dist/lib/errors/index.cjs"
|
|
15
|
+
}
|
|
10
16
|
},
|
|
11
17
|
"./cache": {
|
|
12
|
-
"import":
|
|
13
|
-
|
|
18
|
+
"import": {
|
|
19
|
+
"types": "./dist/lib/cache/index.d.mts",
|
|
20
|
+
"default": "./dist/lib/cache/index.mjs"
|
|
21
|
+
},
|
|
22
|
+
"require": {
|
|
23
|
+
"types": "./dist/lib/cache/index.d.cts",
|
|
24
|
+
"default": "./dist/lib/cache/index.cjs"
|
|
25
|
+
}
|
|
14
26
|
},
|
|
15
27
|
"./i18n": {
|
|
16
|
-
"import":
|
|
17
|
-
|
|
28
|
+
"import": {
|
|
29
|
+
"types": "./dist/lib/i18n/index.d.mts",
|
|
30
|
+
"default": "./dist/lib/i18n/index.mjs"
|
|
31
|
+
},
|
|
32
|
+
"require": {
|
|
33
|
+
"types": "./dist/lib/i18n/index.d.cts",
|
|
34
|
+
"default": "./dist/lib/i18n/index.cjs"
|
|
35
|
+
}
|
|
18
36
|
},
|
|
19
37
|
"./policy": {
|
|
20
|
-
"import":
|
|
21
|
-
|
|
38
|
+
"import": {
|
|
39
|
+
"types": "./dist/lib/policy/index.d.mts",
|
|
40
|
+
"default": "./dist/lib/policy/index.mjs"
|
|
41
|
+
},
|
|
42
|
+
"require": {
|
|
43
|
+
"types": "./dist/lib/policy/index.d.cts",
|
|
44
|
+
"default": "./dist/lib/policy/index.cjs"
|
|
45
|
+
}
|
|
22
46
|
},
|
|
23
47
|
"./api": {
|
|
24
|
-
"import":
|
|
25
|
-
|
|
48
|
+
"import": {
|
|
49
|
+
"types": "./dist/lib/api/index.d.mts",
|
|
50
|
+
"default": "./dist/lib/api/index.mjs"
|
|
51
|
+
},
|
|
52
|
+
"require": {
|
|
53
|
+
"types": "./dist/lib/api/index.d.cts",
|
|
54
|
+
"default": "./dist/lib/api/index.cjs"
|
|
55
|
+
}
|
|
26
56
|
},
|
|
27
57
|
"./queue": {
|
|
28
|
-
"import":
|
|
29
|
-
|
|
58
|
+
"import": {
|
|
59
|
+
"types": "./dist/lib/queue/index.d.mts",
|
|
60
|
+
"default": "./dist/lib/queue/index.mjs"
|
|
61
|
+
},
|
|
62
|
+
"require": {
|
|
63
|
+
"types": "./dist/lib/queue/index.d.cts",
|
|
64
|
+
"default": "./dist/lib/queue/index.cjs"
|
|
65
|
+
}
|
|
30
66
|
},
|
|
31
67
|
"./pubsub": {
|
|
32
|
-
"import":
|
|
33
|
-
|
|
68
|
+
"import": {
|
|
69
|
+
"types": "./dist/lib/pubsub/index.d.mts",
|
|
70
|
+
"default": "./dist/lib/pubsub/index.mjs"
|
|
71
|
+
},
|
|
72
|
+
"require": {
|
|
73
|
+
"types": "./dist/lib/pubsub/index.d.cts",
|
|
74
|
+
"default": "./dist/lib/pubsub/index.cjs"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"./cron": {
|
|
78
|
+
"import": {
|
|
79
|
+
"types": "./dist/lib/cron/index.d.mts",
|
|
80
|
+
"default": "./dist/lib/cron/index.mjs"
|
|
81
|
+
},
|
|
82
|
+
"require": {
|
|
83
|
+
"types": "./dist/lib/cron/index.d.cts",
|
|
84
|
+
"default": "./dist/lib/cron/index.cjs"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"./logging": {
|
|
88
|
+
"import": "./dist/lib/logging/index.js",
|
|
89
|
+
"types": "./dist/lib/logging/index.d.ts"
|
|
90
|
+
},
|
|
91
|
+
"./prompts": {
|
|
92
|
+
"import": {
|
|
93
|
+
"types": "./dist/lib/prompts/index.d.mts",
|
|
94
|
+
"default": "./dist/lib/prompts/index.mjs"
|
|
95
|
+
},
|
|
96
|
+
"require": {
|
|
97
|
+
"types": "./dist/lib/prompts/index.d.cts",
|
|
98
|
+
"default": "./dist/lib/prompts/index.cjs"
|
|
99
|
+
}
|
|
34
100
|
}
|
|
35
101
|
},
|
|
36
102
|
"files": [
|
|
@@ -38,7 +104,7 @@
|
|
|
38
104
|
"README.md"
|
|
39
105
|
],
|
|
40
106
|
"scripts": {
|
|
41
|
-
"build": "
|
|
107
|
+
"build": "tsdown",
|
|
42
108
|
"check": "biome check --write . && tsc --noEmit",
|
|
43
109
|
"test": "bun test",
|
|
44
110
|
"prepublishOnly": "bun run build"
|
|
@@ -55,6 +121,9 @@
|
|
|
55
121
|
"redis",
|
|
56
122
|
"pubsub",
|
|
57
123
|
"caching",
|
|
124
|
+
"cron",
|
|
125
|
+
"scheduler",
|
|
126
|
+
"job-scheduler",
|
|
58
127
|
"i18n",
|
|
59
128
|
"internationalization",
|
|
60
129
|
"authorization",
|
|
@@ -76,6 +145,7 @@
|
|
|
76
145
|
"@standard-schema/spec": "^1.1.0",
|
|
77
146
|
"@types/bun": "latest",
|
|
78
147
|
"openapi-types": "^12.1.3",
|
|
148
|
+
"tsdown": "^0.21.7",
|
|
79
149
|
"zod": "^4.3.6"
|
|
80
150
|
},
|
|
81
151
|
"peerDependencies": {
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Middleware } from "../middleware/index.js";
|
|
2
|
-
import type { ApiOptions, RequestSchema, ResponseSchema, RouteConfig } from "./types.js";
|
|
3
|
-
export declare class Api<TMiddlewares extends readonly Middleware[] = readonly []> {
|
|
4
|
-
private options;
|
|
5
|
-
private routes;
|
|
6
|
-
constructor(options?: ApiOptions<TMiddlewares>);
|
|
7
|
-
private getFullPath;
|
|
8
|
-
private validateRequest;
|
|
9
|
-
private createContext;
|
|
10
|
-
private buildBunRoutes;
|
|
11
|
-
defineRoute<TReq extends RequestSchema = RequestSchema, TRes extends ResponseSchema = ResponseSchema, TRouteMiddlewares extends readonly Middleware[] = readonly []>(config: RouteConfig<TReq, TRes, TMiddlewares, TRouteMiddlewares>): void;
|
|
12
|
-
getOpenApiSpec(): Promise<import("../openapi/types.js").OpenApiSpec>;
|
|
13
|
-
serve(port: number, callback?: (server: Bun.Server<unknown>) => void): void;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/core/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD,OAAO,KAAK,EACV,UAAU,EAIV,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,GAAG,CAAC,YAAY,SAAS,SAAS,UAAU,EAAE,GAAG,SAAS,EAAE;IACvE,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAKL;gBAEU,OAAO,GAAE,UAAU,CAAC,YAAY,CAAM;IAIzD,OAAO,CAAC,WAAW;YA4BL,eAAe;IA4B7B,OAAO,CAAC,aAAa;IA4CrB,OAAO,CAAC,cAAc;IA0Gf,WAAW,CAChB,IAAI,SAAS,aAAa,GAAG,aAAa,EAC1C,IAAI,SAAS,cAAc,GAAG,cAAc,EAC5C,iBAAiB,SAAS,SAAS,UAAU,EAAE,GAAG,SAAS,EAAE,EAC7D,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,iBAAiB,CAAC;IAW3D,cAAc;IAad,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI;CAa5E"}
|