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,31 @@
|
|
|
1
|
+
import { PromptRuntime } from "../../prompts/core/types.cjs";
|
|
2
|
+
import { ConfirmOptions, InputOptions, MultiselectOptions, NumberOptions, PasswordOptions, PromptErrorType, SelectChoice, SelectOptions } from "../../prompts/types.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/prompts/index.d.ts
|
|
5
|
+
declare const input: (options: InputOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
6
|
+
readonly type: string;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
}, null] | readonly [null, string]>;
|
|
9
|
+
declare const password: (options: PasswordOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
10
|
+
readonly type: string;
|
|
11
|
+
readonly message: string;
|
|
12
|
+
}, null] | readonly [null, string]>;
|
|
13
|
+
declare const confirm: (options: ConfirmOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
14
|
+
readonly type: string;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
}, null] | readonly [null, boolean]>;
|
|
17
|
+
declare const number: (options: NumberOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
18
|
+
readonly type: string;
|
|
19
|
+
readonly message: string;
|
|
20
|
+
}, null] | readonly [null, number]>;
|
|
21
|
+
declare const select: <TValue extends string>(options: SelectOptions<TValue>, runtime?: PromptRuntime) => Promise<readonly [{
|
|
22
|
+
readonly type: string;
|
|
23
|
+
readonly message: string;
|
|
24
|
+
}, null] | readonly [null, TValue]>;
|
|
25
|
+
declare const multiselect: <TValue extends string>(options: MultiselectOptions<TValue>, runtime?: PromptRuntime) => Promise<readonly [{
|
|
26
|
+
readonly type: string;
|
|
27
|
+
readonly message: string;
|
|
28
|
+
}, null] | readonly [null, TValue[]]>;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { type ConfirmOptions, type InputOptions, type MultiselectOptions, type NumberOptions, type PasswordOptions, type PromptErrorType, type PromptRuntime, type SelectChoice, type SelectOptions, confirm, input, multiselect, number, password, select };
|
|
31
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/prompts/index.ts"],"mappings":";;;;cAoTa,KAAA,GAAe,OAAA,EAAS,YAAA,EAAc,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA8B7D,QAAA,GACX,OAAA,EAAS,eAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAuCZ,OAAA,GACX,OAAA,EAAS,cAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAkEZ,MAAA,GACX,OAAA,EAAS,aAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAiJZ,MAAA,0BACX,OAAA,EAAS,aAAA,CAAc,MAAA,GACvB,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA0EZ,WAAA,0BACX,OAAA,EAAS,kBAAA,CAAmB,MAAA,GAC5B,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PromptRuntime } from "../../prompts/core/types.mjs";
|
|
2
|
+
import { ConfirmOptions, InputOptions, MultiselectOptions, NumberOptions, PasswordOptions, PromptErrorType, SelectChoice, SelectOptions } from "../../prompts/types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/prompts/index.d.ts
|
|
5
|
+
declare const input: (options: InputOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
6
|
+
readonly type: string;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
}, null] | readonly [null, string]>;
|
|
9
|
+
declare const password: (options: PasswordOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
10
|
+
readonly type: string;
|
|
11
|
+
readonly message: string;
|
|
12
|
+
}, null] | readonly [null, string]>;
|
|
13
|
+
declare const confirm: (options: ConfirmOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
14
|
+
readonly type: string;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
}, null] | readonly [null, boolean]>;
|
|
17
|
+
declare const number: (options: NumberOptions, runtime?: PromptRuntime) => Promise<readonly [{
|
|
18
|
+
readonly type: string;
|
|
19
|
+
readonly message: string;
|
|
20
|
+
}, null] | readonly [null, number]>;
|
|
21
|
+
declare const select: <TValue extends string>(options: SelectOptions<TValue>, runtime?: PromptRuntime) => Promise<readonly [{
|
|
22
|
+
readonly type: string;
|
|
23
|
+
readonly message: string;
|
|
24
|
+
}, null] | readonly [null, TValue]>;
|
|
25
|
+
declare const multiselect: <TValue extends string>(options: MultiselectOptions<TValue>, runtime?: PromptRuntime) => Promise<readonly [{
|
|
26
|
+
readonly type: string;
|
|
27
|
+
readonly message: string;
|
|
28
|
+
}, null] | readonly [null, TValue[]]>;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { type ConfirmOptions, type InputOptions, type MultiselectOptions, type NumberOptions, type PasswordOptions, type PromptErrorType, type PromptRuntime, type SelectChoice, type SelectOptions, confirm, input, multiselect, number, password, select };
|
|
31
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/prompts/index.ts"],"mappings":";;;;cAoTa,KAAA,GAAe,OAAA,EAAS,YAAA,EAAc,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA8B7D,QAAA,GACX,OAAA,EAAS,eAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAuCZ,OAAA,GACX,OAAA,EAAS,cAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAkEZ,MAAA,GACX,OAAA,EAAS,aAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAiJZ,MAAA,0BACX,OAAA,EAAS,aAAA,CAAc,MAAA,GACvB,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA0EZ,WAAA,0BACX,OAAA,EAAS,kBAAA,CAAmB,MAAA,GAC5B,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA"}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { createNodePromptRuntime } from "../../prompts/core/runtime.mjs";
|
|
2
|
+
import { runPromptSession } from "../../prompts/core/session.mjs";
|
|
3
|
+
import { styleText } from "node:util";
|
|
4
|
+
//#region src/lib/prompts/index.ts
|
|
5
|
+
const pointer = (active) => {
|
|
6
|
+
return active ? paint("cyan", "❯") : " ";
|
|
7
|
+
};
|
|
8
|
+
const addErrorLine = (content, errorMessage) => {
|
|
9
|
+
if (!errorMessage) return content;
|
|
10
|
+
return `${content}\n${errorMark()} ${paint("red", errorMessage)}`;
|
|
11
|
+
};
|
|
12
|
+
const insertAt = (value, at, character) => {
|
|
13
|
+
return `${value.slice(0, at)}${character}${value.slice(at)}`;
|
|
14
|
+
};
|
|
15
|
+
const INVERSE = "\x1B[7m";
|
|
16
|
+
const RESET = "\x1B[0m";
|
|
17
|
+
const WHITESPACE = /\s/;
|
|
18
|
+
const NUMBER_CHAR = /[0-9.-]/;
|
|
19
|
+
const CURSOR_BLOCK = `${INVERSE} ${RESET}`;
|
|
20
|
+
const paint = (color, text) => {
|
|
21
|
+
return styleText(color, text, { validateStream: false });
|
|
22
|
+
};
|
|
23
|
+
const questionMark = () => paint("cyan", "?");
|
|
24
|
+
const successMark = () => paint("green", "✔");
|
|
25
|
+
const errorMark = () => paint("red", "✖");
|
|
26
|
+
const renderQuestionLine = (message, content) => {
|
|
27
|
+
return `${questionMark()} ${paint("cyan", message)} ${content}`;
|
|
28
|
+
};
|
|
29
|
+
const renderSuccessLine = (message, content) => {
|
|
30
|
+
return `${successMark()} ${message} ${content}`;
|
|
31
|
+
};
|
|
32
|
+
const createTextState = (value) => {
|
|
33
|
+
return {
|
|
34
|
+
value,
|
|
35
|
+
cursor: value.length,
|
|
36
|
+
selectionAnchor: null
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const submitTextValue = (state, options) => {
|
|
40
|
+
const value = state.value.length > 0 ? state.value : options.defaultValue ?? "";
|
|
41
|
+
if (options.required && value.trim().length === 0) return { errorMessage: options.requiredMessage ?? "A value is required" };
|
|
42
|
+
return { value };
|
|
43
|
+
};
|
|
44
|
+
const getSelectionRange = (state) => {
|
|
45
|
+
if (state.selectionAnchor === null || state.selectionAnchor === state.cursor) return null;
|
|
46
|
+
return {
|
|
47
|
+
start: Math.min(state.selectionAnchor, state.cursor),
|
|
48
|
+
end: Math.max(state.selectionAnchor, state.cursor)
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
const moveCursor = (state, cursor, keepSelection) => {
|
|
52
|
+
if (!keepSelection) return {
|
|
53
|
+
...state,
|
|
54
|
+
cursor,
|
|
55
|
+
selectionAnchor: null
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
...state,
|
|
59
|
+
cursor,
|
|
60
|
+
selectionAnchor: state.selectionAnchor ?? state.cursor
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const deleteRange = (state, start, end) => {
|
|
64
|
+
return {
|
|
65
|
+
value: `${state.value.slice(0, start)}${state.value.slice(end)}`,
|
|
66
|
+
cursor: start,
|
|
67
|
+
selectionAnchor: null
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
const deleteSelectedRange = (state) => {
|
|
71
|
+
const selection = getSelectionRange(state);
|
|
72
|
+
if (!selection) return state;
|
|
73
|
+
return deleteRange(state, selection.start, selection.end);
|
|
74
|
+
};
|
|
75
|
+
const findWordStart = (value, cursor) => {
|
|
76
|
+
let index = cursor;
|
|
77
|
+
while (index > 0 && WHITESPACE.test(value[index - 1] ?? "")) index -= 1;
|
|
78
|
+
while (index > 0 && !WHITESPACE.test(value[index - 1] ?? "")) index -= 1;
|
|
79
|
+
return index;
|
|
80
|
+
};
|
|
81
|
+
const findWordEnd = (value, cursor) => {
|
|
82
|
+
let index = cursor;
|
|
83
|
+
while (index < value.length && WHITESPACE.test(value[index] ?? "")) index += 1;
|
|
84
|
+
while (index < value.length && !WHITESPACE.test(value[index] ?? "")) index += 1;
|
|
85
|
+
return index;
|
|
86
|
+
};
|
|
87
|
+
const renderTextSelection = (state, mask) => {
|
|
88
|
+
const selection = getSelectionRange(state);
|
|
89
|
+
const content = mask ? mask.repeat(state.value.length) : state.value;
|
|
90
|
+
const boundedCursor = Math.max(0, Math.min(state.cursor, content.length));
|
|
91
|
+
if (!selection) {
|
|
92
|
+
if (content.length === 0) return CURSOR_BLOCK;
|
|
93
|
+
if (boundedCursor === content.length) return `${content}${CURSOR_BLOCK}`;
|
|
94
|
+
const focusedChar = content[boundedCursor] ?? " ";
|
|
95
|
+
return `${content.slice(0, boundedCursor)}${INVERSE}${focusedChar}${RESET}${content.slice(boundedCursor + 1)}`;
|
|
96
|
+
}
|
|
97
|
+
const selected = content.slice(selection.start, selection.end);
|
|
98
|
+
return `${content.slice(0, selection.start)}${INVERSE}${selected}${RESET}${content.slice(selection.end)}`;
|
|
99
|
+
};
|
|
100
|
+
const textOnKey = (state, key) => {
|
|
101
|
+
switch (key.name) {
|
|
102
|
+
case "ctrl_a": return {
|
|
103
|
+
...state,
|
|
104
|
+
cursor: state.value.length,
|
|
105
|
+
selectionAnchor: 0
|
|
106
|
+
};
|
|
107
|
+
case "home": return moveCursor(state, 0, false);
|
|
108
|
+
case "end": return moveCursor(state, state.value.length, false);
|
|
109
|
+
case "shift_ctrl_left": return moveCursor(state, findWordStart(state.value, state.cursor), true);
|
|
110
|
+
case "shift_ctrl_right": return moveCursor(state, findWordEnd(state.value, state.cursor), true);
|
|
111
|
+
case "left": return moveCursor(state, Math.max(state.cursor - 1, 0), false);
|
|
112
|
+
case "shift_left": return moveCursor(state, Math.max(state.cursor - 1, 0), true);
|
|
113
|
+
case "right": return moveCursor(state, Math.min(state.cursor + 1, state.value.length), false);
|
|
114
|
+
case "ctrl_left": return moveCursor(state, findWordStart(state.value, state.cursor), false);
|
|
115
|
+
case "ctrl_right": return moveCursor(state, findWordEnd(state.value, state.cursor), false);
|
|
116
|
+
case "shift_right": return moveCursor(state, Math.min(state.cursor + 1, state.value.length), true);
|
|
117
|
+
case "backspace": {
|
|
118
|
+
const selectionDeleted = deleteSelectedRange(state);
|
|
119
|
+
if (selectionDeleted !== state) return selectionDeleted;
|
|
120
|
+
if (state.cursor === 0) return state;
|
|
121
|
+
const nextCursor = state.cursor - 1;
|
|
122
|
+
return {
|
|
123
|
+
value: `${state.value.slice(0, nextCursor)}${state.value.slice(state.cursor)}`,
|
|
124
|
+
cursor: nextCursor,
|
|
125
|
+
selectionAnchor: null
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
case "ctrl_backspace": {
|
|
129
|
+
const selectionDeleted = deleteSelectedRange(state);
|
|
130
|
+
if (selectionDeleted !== state) return selectionDeleted;
|
|
131
|
+
if (state.cursor === 0) return state;
|
|
132
|
+
return deleteRange(state, findWordStart(state.value, state.cursor), state.cursor);
|
|
133
|
+
}
|
|
134
|
+
case "delete": {
|
|
135
|
+
const selectionDeleted = deleteSelectedRange(state);
|
|
136
|
+
if (selectionDeleted !== state) return selectionDeleted;
|
|
137
|
+
return {
|
|
138
|
+
...state,
|
|
139
|
+
value: `${state.value.slice(0, state.cursor)}${state.value.slice(state.cursor + 1)}`
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
case "character":
|
|
143
|
+
case "space": {
|
|
144
|
+
const collapsed = deleteSelectedRange(state);
|
|
145
|
+
const text = key.name === "space" ? " " : key.value ?? "";
|
|
146
|
+
return {
|
|
147
|
+
value: insertAt(collapsed.value, collapsed.cursor, text),
|
|
148
|
+
cursor: collapsed.cursor + 1,
|
|
149
|
+
selectionAnchor: null
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
default: return state;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const input = async (options, runtime) => {
|
|
156
|
+
return runPromptSession({
|
|
157
|
+
runtime: runtime ?? createNodePromptRuntime(),
|
|
158
|
+
options,
|
|
159
|
+
initialState: createTextState(options.defaultValue ?? ""),
|
|
160
|
+
render: ({ options: currentOptions, state, errorMessage }) => {
|
|
161
|
+
let text = renderTextSelection(state);
|
|
162
|
+
if (state.value.length === 0 && currentOptions.placeholder) text = `${CURSOR_BLOCK}${paint("dim", currentOptions.placeholder)}`;
|
|
163
|
+
return addErrorLine(renderQuestionLine(currentOptions.message, text), errorMessage);
|
|
164
|
+
},
|
|
165
|
+
complete: ({ options: currentOptions, value }) => {
|
|
166
|
+
return renderSuccessLine(currentOptions.message, value);
|
|
167
|
+
},
|
|
168
|
+
onKey: (state, key) => {
|
|
169
|
+
return textOnKey(state, key);
|
|
170
|
+
},
|
|
171
|
+
onSubmit: (state) => submitTextValue(state, options)
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
const password = async (options, runtime) => {
|
|
175
|
+
const promptRuntime = runtime ?? createNodePromptRuntime();
|
|
176
|
+
const initialValue = options.defaultValue ?? "";
|
|
177
|
+
const mask = options.mask;
|
|
178
|
+
return runPromptSession({
|
|
179
|
+
runtime: promptRuntime,
|
|
180
|
+
options,
|
|
181
|
+
initialState: createTextState(initialValue),
|
|
182
|
+
render: ({ options: currentOptions, state, errorMessage }) => {
|
|
183
|
+
let visible;
|
|
184
|
+
if (state.value.length === 0 && currentOptions.placeholder) visible = `${CURSOR_BLOCK}${paint("dim", currentOptions.placeholder)}`;
|
|
185
|
+
else if (mask !== void 0) visible = renderTextSelection(state, mask);
|
|
186
|
+
else visible = CURSOR_BLOCK;
|
|
187
|
+
return addErrorLine(renderQuestionLine(currentOptions.message, visible), errorMessage);
|
|
188
|
+
},
|
|
189
|
+
complete: ({ options: currentOptions, value }) => {
|
|
190
|
+
return renderSuccessLine(currentOptions.message, mask !== void 0 ? mask.repeat(value.length) : "");
|
|
191
|
+
},
|
|
192
|
+
onKey: (state, key) => {
|
|
193
|
+
return textOnKey(state, key);
|
|
194
|
+
},
|
|
195
|
+
onSubmit: (state) => submitTextValue(state, options)
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
const confirm = async (options, runtime) => {
|
|
199
|
+
return runPromptSession({
|
|
200
|
+
runtime: runtime ?? createNodePromptRuntime(),
|
|
201
|
+
options,
|
|
202
|
+
initialState: { value: options.defaultValue ?? false },
|
|
203
|
+
render: ({ options: currentOptions, state, errorMessage }) => {
|
|
204
|
+
const yesLabel = currentOptions.activeLabel ?? "Yes";
|
|
205
|
+
const noLabel = currentOptions.inactiveLabel ?? "No";
|
|
206
|
+
const rendered = state.value ? yesLabel : noLabel;
|
|
207
|
+
return addErrorLine([renderQuestionLine(currentOptions.message, `(${rendered})`), paint("dim", " (y/n to select, ← yes / → no, space to toggle)")].join("\n"), errorMessage);
|
|
208
|
+
},
|
|
209
|
+
complete: ({ options: currentOptions, value }) => {
|
|
210
|
+
const label = value ? currentOptions.activeLabel ?? "Yes" : currentOptions.inactiveLabel ?? "No";
|
|
211
|
+
return renderSuccessLine(currentOptions.message, label);
|
|
212
|
+
},
|
|
213
|
+
onKey: (state, key) => {
|
|
214
|
+
switch (key.name) {
|
|
215
|
+
case "left": return { value: true };
|
|
216
|
+
case "right": return { value: false };
|
|
217
|
+
case "space": return { value: !state.value };
|
|
218
|
+
case "character": {
|
|
219
|
+
const lowered = (key.value ?? "").toLowerCase();
|
|
220
|
+
if (lowered === "y") return { value: true };
|
|
221
|
+
if (lowered === "n") return { value: false };
|
|
222
|
+
return state;
|
|
223
|
+
}
|
|
224
|
+
default: return state;
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
onSubmit: (state) => {
|
|
228
|
+
return { value: state.value };
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
};
|
|
232
|
+
const number = async (options, runtime) => {
|
|
233
|
+
return runPromptSession({
|
|
234
|
+
runtime: runtime ?? createNodePromptRuntime(),
|
|
235
|
+
options,
|
|
236
|
+
initialState: createTextState(options.defaultValue === void 0 ? "" : String(options.defaultValue)),
|
|
237
|
+
render: ({ options: currentOptions, state, errorMessage }) => {
|
|
238
|
+
return addErrorLine(renderQuestionLine(currentOptions.message, renderTextSelection(state)), errorMessage);
|
|
239
|
+
},
|
|
240
|
+
complete: ({ options: currentOptions, value }) => {
|
|
241
|
+
return renderSuccessLine(currentOptions.message, String(value));
|
|
242
|
+
},
|
|
243
|
+
onKey: (state, key) => {
|
|
244
|
+
const next = textOnKey(state, key);
|
|
245
|
+
if (!(key.name === "character" || key.name === "space")) return next;
|
|
246
|
+
const value = key.name === "space" ? " " : key.value ?? "";
|
|
247
|
+
if (!NUMBER_CHAR.test(value)) return state;
|
|
248
|
+
if (value === "." || value === "-") {
|
|
249
|
+
const collapsed = deleteSelectedRange(state);
|
|
250
|
+
if (value === "." && collapsed.value.includes(".")) return state;
|
|
251
|
+
if (value === "-") {
|
|
252
|
+
if (collapsed.cursor !== 0) return state;
|
|
253
|
+
if (collapsed.value.includes("-")) return state;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return next;
|
|
257
|
+
},
|
|
258
|
+
onSubmit: (state) => {
|
|
259
|
+
const raw = state.value.trim();
|
|
260
|
+
if (raw.length === 0) return { errorMessage: options.requiredMessage ?? "A number is required" };
|
|
261
|
+
const parsed = Number(raw);
|
|
262
|
+
if (!Number.isFinite(parsed)) return { errorMessage: options.invalidMessage ?? "Please enter a valid number" };
|
|
263
|
+
if (options.min !== void 0 && parsed < options.min) return { errorMessage: options.minMessage ?? `Number must be greater than or equal to ${options.min}` };
|
|
264
|
+
if (options.max !== void 0 && parsed > options.max) return { errorMessage: options.maxMessage ?? `Number must be lower than or equal to ${options.max}` };
|
|
265
|
+
return { value: parsed };
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
};
|
|
269
|
+
const findFirstEnabledIndex = (choices) => {
|
|
270
|
+
const firstEnabledIndex = choices.findIndex((choice) => !choice.disabled);
|
|
271
|
+
if (firstEnabledIndex >= 0) return firstEnabledIndex;
|
|
272
|
+
return 0;
|
|
273
|
+
};
|
|
274
|
+
const findNextEnabledIndex = (choices, cursor, direction) => {
|
|
275
|
+
const total = choices.length;
|
|
276
|
+
let currentCursor = cursor;
|
|
277
|
+
for (let offset = 0; offset < total; offset++) {
|
|
278
|
+
const nextCursor = (currentCursor + direction + total) % total;
|
|
279
|
+
const nextChoice = choices[nextCursor];
|
|
280
|
+
if (nextChoice && !nextChoice.disabled) return nextCursor;
|
|
281
|
+
currentCursor = nextCursor;
|
|
282
|
+
}
|
|
283
|
+
return currentCursor;
|
|
284
|
+
};
|
|
285
|
+
const findDefaultIndex = (choices, defaultValue) => {
|
|
286
|
+
if (defaultValue === void 0) return findFirstEnabledIndex(choices);
|
|
287
|
+
const index = choices.findIndex((choice) => choice.value === defaultValue && !choice.disabled);
|
|
288
|
+
if (index >= 0) return index;
|
|
289
|
+
return findFirstEnabledIndex(choices);
|
|
290
|
+
};
|
|
291
|
+
const select = async (options, runtime) => {
|
|
292
|
+
return runPromptSession({
|
|
293
|
+
runtime: runtime ?? createNodePromptRuntime(),
|
|
294
|
+
options,
|
|
295
|
+
initialState: { cursor: findDefaultIndex(options.choices, options.defaultValue) },
|
|
296
|
+
render: ({ options: currentOptions, state, errorMessage }) => {
|
|
297
|
+
const lines = [renderQuestionLine(currentOptions.message, "")];
|
|
298
|
+
for (let index = 0; index < currentOptions.choices.length; index++) {
|
|
299
|
+
const choice = currentOptions.choices[index];
|
|
300
|
+
if (!choice) continue;
|
|
301
|
+
const active = state.cursor === index;
|
|
302
|
+
const label = choice.label ?? choice.value;
|
|
303
|
+
const hint = choice.hint ? paint("dim", ` (${choice.hint})`) : "";
|
|
304
|
+
const disabled = choice.disabled ? paint("yellow", " [disabled]") : "";
|
|
305
|
+
lines.push(`${pointer(active)} ${label}${hint}${disabled}`);
|
|
306
|
+
}
|
|
307
|
+
return addErrorLine(lines.join("\n"), errorMessage);
|
|
308
|
+
},
|
|
309
|
+
complete: ({ options: currentOptions, value }) => {
|
|
310
|
+
const selected = currentOptions.choices.find((choice) => choice.value === value);
|
|
311
|
+
return renderSuccessLine(currentOptions.message, selected?.label ?? value);
|
|
312
|
+
},
|
|
313
|
+
onKey: (state, key) => {
|
|
314
|
+
switch (key.name) {
|
|
315
|
+
case "up": return { cursor: findNextEnabledIndex(options.choices, state.cursor, -1) };
|
|
316
|
+
case "down": return { cursor: findNextEnabledIndex(options.choices, state.cursor, 1) };
|
|
317
|
+
default: return state;
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
onSubmit: (state) => {
|
|
321
|
+
const selectedChoice = options.choices[state.cursor];
|
|
322
|
+
if (!selectedChoice) return { errorMessage: "Please select an option" };
|
|
323
|
+
if (selectedChoice.disabled) return { errorMessage: "Selected option is disabled" };
|
|
324
|
+
return { value: selectedChoice.value };
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
};
|
|
328
|
+
const multiselect = async (options, runtime) => {
|
|
329
|
+
return runPromptSession({
|
|
330
|
+
runtime: runtime ?? createNodePromptRuntime(),
|
|
331
|
+
options,
|
|
332
|
+
initialState: {
|
|
333
|
+
cursor: findFirstEnabledIndex(options.choices),
|
|
334
|
+
selected: new Set(options.defaultValue ?? [])
|
|
335
|
+
},
|
|
336
|
+
render: ({ options: currentOptions, state, errorMessage }) => {
|
|
337
|
+
const lines = [renderQuestionLine(currentOptions.message, "")];
|
|
338
|
+
for (let index = 0; index < currentOptions.choices.length; index++) {
|
|
339
|
+
const choice = currentOptions.choices[index];
|
|
340
|
+
if (!choice) continue;
|
|
341
|
+
const active = state.cursor === index;
|
|
342
|
+
const checked = state.selected.has(choice.value) ? "◉" : "◯";
|
|
343
|
+
const disabled = choice.disabled ? paint("yellow", " [disabled]") : "";
|
|
344
|
+
const label = choice.label ?? choice.value;
|
|
345
|
+
const hint = choice.hint ? paint("dim", ` (${choice.hint})`) : "";
|
|
346
|
+
lines.push(`${pointer(active)} ${checked} ${label}${hint}${disabled}`);
|
|
347
|
+
}
|
|
348
|
+
lines.push(paint("dim", " (space to toggle, a to toggle all, enter to submit)"));
|
|
349
|
+
return addErrorLine(lines.join("\n"), errorMessage);
|
|
350
|
+
},
|
|
351
|
+
complete: ({ options: currentOptions, value }) => {
|
|
352
|
+
const labelMap = new Map(currentOptions.choices.map((choice) => [choice.value, choice.label]));
|
|
353
|
+
const labels = value.map((v) => labelMap.get(v) ?? v);
|
|
354
|
+
return renderSuccessLine(currentOptions.message, labels.join(", "));
|
|
355
|
+
},
|
|
356
|
+
onKey: (state, key) => {
|
|
357
|
+
switch (key.name) {
|
|
358
|
+
case "up": return {
|
|
359
|
+
...state,
|
|
360
|
+
cursor: findNextEnabledIndex(options.choices, state.cursor, -1)
|
|
361
|
+
};
|
|
362
|
+
case "down": return {
|
|
363
|
+
...state,
|
|
364
|
+
cursor: findNextEnabledIndex(options.choices, state.cursor, 1)
|
|
365
|
+
};
|
|
366
|
+
case "character":
|
|
367
|
+
if ((key.value ?? "").toLowerCase() === "a") {
|
|
368
|
+
const enabledValues = options.choices.filter((choice) => !choice.disabled).map((choice) => choice.value);
|
|
369
|
+
if (!(enabledValues.length > 0)) return state;
|
|
370
|
+
const areAllEnabledSelected = enabledValues.every((value) => state.selected.has(value));
|
|
371
|
+
const nextSelection = new Set(state.selected);
|
|
372
|
+
if (areAllEnabledSelected) for (const value of enabledValues) nextSelection.delete(value);
|
|
373
|
+
else for (const value of enabledValues) nextSelection.add(value);
|
|
374
|
+
return {
|
|
375
|
+
...state,
|
|
376
|
+
selected: nextSelection
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
return state;
|
|
380
|
+
case "space": {
|
|
381
|
+
const currentChoice = options.choices[state.cursor];
|
|
382
|
+
if (!currentChoice || currentChoice.disabled) return state;
|
|
383
|
+
const nextSelection = new Set(state.selected);
|
|
384
|
+
if (nextSelection.has(currentChoice.value)) nextSelection.delete(currentChoice.value);
|
|
385
|
+
else nextSelection.add(currentChoice.value);
|
|
386
|
+
return {
|
|
387
|
+
...state,
|
|
388
|
+
selected: nextSelection
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
default: return state;
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
onSubmit: (state) => {
|
|
395
|
+
const values = options.choices.filter((choice) => state.selected.has(choice.value)).map((choice) => choice.value);
|
|
396
|
+
if (options.min !== void 0 && values.length < options.min) return { errorMessage: `Please select at least ${options.min} options` };
|
|
397
|
+
if (options.max !== void 0 && values.length > options.max) return { errorMessage: `Please select at most ${options.max} options` };
|
|
398
|
+
return { value: values };
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
};
|
|
402
|
+
//#endregion
|
|
403
|
+
export { confirm, input, multiselect, number, password, select };
|
|
404
|
+
|
|
405
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/prompts/index.ts"],"sourcesContent":["import { styleText } from \"node:util\";\nimport { createNodePromptRuntime } from \"./core/runtime.js\";\nimport { runPromptSession } from \"./core/session.js\";\nimport type { PromptRuntime } from \"./core/types.js\";\nimport type {\n ConfirmOptions,\n InputOptions,\n MultiselectOptions,\n NumberOptions,\n PasswordOptions,\n SelectOptions,\n} from \"./types.js\";\n\nconst pointer = (active: boolean) => {\n return active ? paint(\"cyan\", \"❯\") : \" \";\n};\n\nconst addErrorLine = (content: string, errorMessage: string | null) => {\n if (!errorMessage) {\n return content;\n }\n\n return `${content}\\n${errorMark()} ${paint(\"red\", errorMessage)}`;\n};\n\nconst insertAt = (value: string, at: number, character: string) => {\n return `${value.slice(0, at)}${character}${value.slice(at)}`;\n};\n\nconst INVERSE = \"\\u001B[7m\";\nconst RESET = \"\\u001B[0m\";\nconst WHITESPACE = /\\s/;\nconst NUMBER_CHAR = /[0-9.-]/;\nconst CURSOR_BLOCK = `${INVERSE} ${RESET}`;\nconst paint = (\n color: \"cyan\" | \"green\" | \"red\" | \"yellow\" | \"dim\",\n text: string,\n) => {\n return styleText(color, text, { validateStream: false });\n};\n\nconst questionMark = () => paint(\"cyan\", \"?\");\nconst successMark = () => paint(\"green\", \"✔\");\nconst errorMark = () => paint(\"red\", \"✖\");\n\nconst renderQuestionLine = (message: string, content: string) => {\n return `${questionMark()} ${paint(\"cyan\", message)} ${content}`;\n};\n\nconst renderSuccessLine = (message: string, content: string) => {\n return `${successMark()} ${message} ${content}`;\n};\n\ntype TextState = {\n value: string;\n cursor: number;\n selectionAnchor: number | null;\n};\n\nconst createTextState = (value: string): TextState => {\n return {\n value,\n cursor: value.length,\n selectionAnchor: null,\n };\n};\n\nconst submitTextValue = (\n state: TextState,\n options: {\n defaultValue?: string;\n required?: boolean;\n requiredMessage?: string;\n },\n) => {\n const value =\n state.value.length > 0 ? state.value : (options.defaultValue ?? \"\");\n\n if (options.required && value.trim().length === 0) {\n return { errorMessage: options.requiredMessage ?? \"A value is required\" };\n }\n\n return { value };\n};\n\nconst getSelectionRange = (state: TextState) => {\n if (\n state.selectionAnchor === null ||\n state.selectionAnchor === state.cursor\n ) {\n return null;\n }\n\n return {\n start: Math.min(state.selectionAnchor, state.cursor),\n end: Math.max(state.selectionAnchor, state.cursor),\n };\n};\n\nconst moveCursor = (\n state: TextState,\n cursor: number,\n keepSelection: boolean,\n) => {\n if (!keepSelection) {\n return {\n ...state,\n cursor,\n selectionAnchor: null,\n };\n }\n\n return {\n ...state,\n cursor,\n selectionAnchor: state.selectionAnchor ?? state.cursor,\n };\n};\n\nconst deleteRange = (\n state: TextState,\n start: number,\n end: number,\n): TextState => {\n return {\n value: `${state.value.slice(0, start)}${state.value.slice(end)}`,\n cursor: start,\n selectionAnchor: null,\n };\n};\n\nconst deleteSelectedRange = (state: TextState) => {\n const selection = getSelectionRange(state);\n\n if (!selection) {\n return state;\n }\n\n return deleteRange(state, selection.start, selection.end);\n};\n\nconst findWordStart = (value: string, cursor: number) => {\n let index = cursor;\n\n while (index > 0 && WHITESPACE.test(value[index - 1] ?? \"\")) {\n index -= 1;\n }\n\n while (index > 0 && !WHITESPACE.test(value[index - 1] ?? \"\")) {\n index -= 1;\n }\n\n return index;\n};\n\nconst findWordEnd = (value: string, cursor: number) => {\n let index = cursor;\n\n while (index < value.length && WHITESPACE.test(value[index] ?? \"\")) {\n index += 1;\n }\n\n while (index < value.length && !WHITESPACE.test(value[index] ?? \"\")) {\n index += 1;\n }\n\n return index;\n};\n\nconst renderTextSelection = (state: TextState, mask?: string) => {\n const selection = getSelectionRange(state);\n const content = mask ? mask.repeat(state.value.length) : state.value;\n const boundedCursor = Math.max(0, Math.min(state.cursor, content.length));\n\n if (!selection) {\n if (content.length === 0) {\n return CURSOR_BLOCK;\n }\n\n if (boundedCursor === content.length) {\n return `${content}${CURSOR_BLOCK}`;\n }\n\n const focusedChar = content[boundedCursor] ?? \" \";\n\n return `${content.slice(0, boundedCursor)}${INVERSE}${focusedChar}${RESET}${content.slice(boundedCursor + 1)}`;\n }\n\n const selected = content.slice(selection.start, selection.end);\n\n return `${content.slice(0, selection.start)}${INVERSE}${selected}${RESET}${content.slice(selection.end)}`;\n};\n\nconst textOnKey = (\n state: TextState,\n key: {\n name: string;\n value?: string;\n },\n) => {\n switch (key.name) {\n case \"ctrl_a\": {\n return {\n ...state,\n cursor: state.value.length,\n selectionAnchor: 0,\n };\n }\n case \"home\": {\n return moveCursor(state, 0, false);\n }\n case \"end\": {\n return moveCursor(state, state.value.length, false);\n }\n case \"shift_ctrl_left\": {\n return moveCursor(state, findWordStart(state.value, state.cursor), true);\n }\n case \"shift_ctrl_right\": {\n return moveCursor(state, findWordEnd(state.value, state.cursor), true);\n }\n case \"left\": {\n return moveCursor(state, Math.max(state.cursor - 1, 0), false);\n }\n case \"shift_left\": {\n return moveCursor(state, Math.max(state.cursor - 1, 0), true);\n }\n case \"right\": {\n return moveCursor(\n state,\n Math.min(state.cursor + 1, state.value.length),\n false,\n );\n }\n case \"ctrl_left\": {\n return moveCursor(state, findWordStart(state.value, state.cursor), false);\n }\n case \"ctrl_right\": {\n return moveCursor(state, findWordEnd(state.value, state.cursor), false);\n }\n case \"shift_right\": {\n return moveCursor(\n state,\n Math.min(state.cursor + 1, state.value.length),\n true,\n );\n }\n case \"backspace\": {\n const selectionDeleted = deleteSelectedRange(state);\n\n if (selectionDeleted !== state) {\n return selectionDeleted;\n }\n\n if (state.cursor === 0) {\n return state;\n }\n\n const nextCursor = state.cursor - 1;\n\n return {\n value: `${state.value.slice(0, nextCursor)}${state.value.slice(state.cursor)}`,\n cursor: nextCursor,\n selectionAnchor: null,\n };\n }\n case \"ctrl_backspace\": {\n const selectionDeleted = deleteSelectedRange(state);\n\n if (selectionDeleted !== state) {\n return selectionDeleted;\n }\n\n if (state.cursor === 0) {\n return state;\n }\n\n const nextCursor = findWordStart(state.value, state.cursor);\n return deleteRange(state, nextCursor, state.cursor);\n }\n case \"delete\": {\n const selectionDeleted = deleteSelectedRange(state);\n\n if (selectionDeleted !== state) {\n return selectionDeleted;\n }\n\n return {\n ...state,\n value: `${state.value.slice(0, state.cursor)}${state.value.slice(state.cursor + 1)}`,\n };\n }\n case \"character\":\n case \"space\": {\n const collapsed = deleteSelectedRange(state);\n const text = key.name === \"space\" ? \" \" : (key.value ?? \"\");\n\n return {\n value: insertAt(collapsed.value, collapsed.cursor, text),\n cursor: collapsed.cursor + 1,\n selectionAnchor: null,\n };\n }\n default: {\n return state;\n }\n }\n};\n\nexport const input = async (options: InputOptions, runtime?: PromptRuntime) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const initialValue = options.defaultValue ?? \"\";\n\n return runPromptSession<TextState, string, InputOptions>({\n runtime: promptRuntime,\n options,\n initialState: createTextState(initialValue),\n render: ({ options: currentOptions, state, errorMessage }) => {\n let text = renderTextSelection(state);\n\n if (state.value.length === 0 && currentOptions.placeholder) {\n text = `${CURSOR_BLOCK}${paint(\"dim\", currentOptions.placeholder)}`;\n }\n\n return addErrorLine(\n renderQuestionLine(currentOptions.message, text),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n return renderSuccessLine(currentOptions.message, value);\n },\n onKey: (state, key) => {\n return textOnKey(state, key);\n },\n onSubmit: (state) => submitTextValue(state, options),\n });\n};\n\nexport const password = async (\n options: PasswordOptions,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const initialValue = options.defaultValue ?? \"\";\n const mask = options.mask;\n\n return runPromptSession<TextState, string, PasswordOptions>({\n runtime: promptRuntime,\n options,\n initialState: createTextState(initialValue),\n render: ({ options: currentOptions, state, errorMessage }) => {\n let visible: string;\n\n if (state.value.length === 0 && currentOptions.placeholder) {\n visible = `${CURSOR_BLOCK}${paint(\"dim\", currentOptions.placeholder)}`;\n } else if (mask !== undefined) {\n visible = renderTextSelection(state, mask);\n } else {\n visible = CURSOR_BLOCK;\n }\n\n return addErrorLine(\n renderQuestionLine(currentOptions.message, visible),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n return renderSuccessLine(\n currentOptions.message,\n mask !== undefined ? mask.repeat(value.length) : \"\",\n );\n },\n onKey: (state, key) => {\n return textOnKey(state, key);\n },\n onSubmit: (state) => submitTextValue(state, options),\n });\n};\n\nexport const confirm = async (\n options: ConfirmOptions,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const defaultValue = options.defaultValue ?? false;\n\n return runPromptSession<{ value: boolean }, boolean, ConfirmOptions>({\n runtime: promptRuntime,\n options,\n initialState: {\n value: defaultValue,\n },\n render: ({ options: currentOptions, state, errorMessage }) => {\n const yesLabel = currentOptions.activeLabel ?? \"Yes\";\n const noLabel = currentOptions.inactiveLabel ?? \"No\";\n const rendered = state.value ? yesLabel : noLabel;\n\n return addErrorLine(\n [\n renderQuestionLine(currentOptions.message, `(${rendered})`),\n paint(\"dim\", \" (y/n to select, ← yes / → no, space to toggle)\"),\n ].join(\"\\n\"),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n const label = value\n ? (currentOptions.activeLabel ?? \"Yes\")\n : (currentOptions.inactiveLabel ?? \"No\");\n\n return renderSuccessLine(currentOptions.message, label);\n },\n onKey: (state, key) => {\n switch (key.name) {\n case \"left\": {\n return { value: true };\n }\n case \"right\": {\n return { value: false };\n }\n case \"space\": {\n return { value: !state.value };\n }\n case \"character\": {\n const lowered = (key.value ?? \"\").toLowerCase();\n\n if (lowered === \"y\") {\n return { value: true };\n }\n\n if (lowered === \"n\") {\n return { value: false };\n }\n\n return state;\n }\n default: {\n return state;\n }\n }\n },\n onSubmit: (state) => {\n return { value: state.value };\n },\n });\n};\n\nexport const number = async (\n options: NumberOptions,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const defaultValue =\n options.defaultValue === undefined ? \"\" : String(options.defaultValue);\n\n return runPromptSession<TextState, number, NumberOptions>({\n runtime: promptRuntime,\n options,\n initialState: createTextState(defaultValue),\n render: ({ options: currentOptions, state, errorMessage }) => {\n return addErrorLine(\n renderQuestionLine(currentOptions.message, renderTextSelection(state)),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n return renderSuccessLine(currentOptions.message, String(value));\n },\n onKey: (state, key) => {\n const next = textOnKey(state, key);\n const isTextEntry = key.name === \"character\" || key.name === \"space\";\n\n if (!isTextEntry) {\n return next;\n }\n\n const value = key.name === \"space\" ? \" \" : (key.value ?? \"\");\n\n if (!NUMBER_CHAR.test(value)) {\n return state;\n }\n\n if (value === \".\" || value === \"-\") {\n const collapsed = deleteSelectedRange(state);\n\n if (value === \".\" && collapsed.value.includes(\".\")) {\n return state;\n }\n\n if (value === \"-\") {\n if (collapsed.cursor !== 0) return state;\n if (collapsed.value.includes(\"-\")) return state;\n }\n }\n\n return next;\n },\n onSubmit: (state) => {\n const raw = state.value.trim();\n\n if (raw.length === 0) {\n return {\n errorMessage: options.requiredMessage ?? \"A number is required\",\n };\n }\n\n const parsed = Number(raw);\n\n if (!Number.isFinite(parsed)) {\n return {\n errorMessage: options.invalidMessage ?? \"Please enter a valid number\",\n };\n }\n\n if (options.min !== undefined && parsed < options.min) {\n return {\n errorMessage:\n options.minMessage ??\n `Number must be greater than or equal to ${options.min}`,\n };\n }\n\n if (options.max !== undefined && parsed > options.max) {\n return {\n errorMessage:\n options.maxMessage ??\n `Number must be lower than or equal to ${options.max}`,\n };\n }\n\n return { value: parsed };\n },\n });\n};\n\nconst findFirstEnabledIndex = <TValue extends string>(\n choices: readonly {\n value: TValue;\n disabled?: boolean;\n }[],\n) => {\n const firstEnabledIndex = choices.findIndex((choice) => !choice.disabled);\n\n if (firstEnabledIndex >= 0) {\n return firstEnabledIndex;\n }\n\n return 0;\n};\n\nconst findNextEnabledIndex = <TValue extends string>(\n choices: readonly {\n value: TValue;\n disabled?: boolean;\n }[],\n cursor: number,\n direction: 1 | -1,\n) => {\n const total = choices.length;\n let currentCursor = cursor;\n\n for (let offset = 0; offset < total; offset++) {\n const nextCursor = (currentCursor + direction + total) % total;\n const nextChoice = choices[nextCursor];\n\n if (nextChoice && !nextChoice.disabled) {\n return nextCursor;\n }\n\n currentCursor = nextCursor;\n }\n\n return currentCursor;\n};\n\nconst findDefaultIndex = <TValue extends string>(\n choices: SelectOptions<TValue>[\"choices\"],\n defaultValue: TValue | undefined,\n) => {\n if (defaultValue === undefined) {\n return findFirstEnabledIndex(choices);\n }\n\n const index = choices.findIndex(\n (choice) => choice.value === defaultValue && !choice.disabled,\n );\n\n if (index >= 0) {\n return index;\n }\n\n return findFirstEnabledIndex(choices);\n};\n\nexport const select = async <TValue extends string>(\n options: SelectOptions<TValue>,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const initialCursor = findDefaultIndex(options.choices, options.defaultValue);\n\n return runPromptSession<{ cursor: number }, TValue, SelectOptions<TValue>>({\n runtime: promptRuntime,\n options,\n initialState: {\n cursor: initialCursor,\n },\n render: ({ options: currentOptions, state, errorMessage }) => {\n const lines = [renderQuestionLine(currentOptions.message, \"\")];\n\n for (let index = 0; index < currentOptions.choices.length; index++) {\n const choice = currentOptions.choices[index];\n\n if (!choice) {\n continue;\n }\n\n const active = state.cursor === index;\n const label = choice.label ?? choice.value;\n const hint = choice.hint ? paint(\"dim\", ` (${choice.hint})`) : \"\";\n const disabled = choice.disabled ? paint(\"yellow\", \" [disabled]\") : \"\";\n\n lines.push(`${pointer(active)} ${label}${hint}${disabled}`);\n }\n\n return addErrorLine(lines.join(\"\\n\"), errorMessage);\n },\n complete: ({ options: currentOptions, value }) => {\n const selected = currentOptions.choices.find(\n (choice) => choice.value === value,\n );\n\n return renderSuccessLine(\n currentOptions.message,\n selected?.label ?? value,\n );\n },\n onKey: (state, key) => {\n switch (key.name) {\n case \"up\": {\n return {\n cursor: findNextEnabledIndex(options.choices, state.cursor, -1),\n };\n }\n case \"down\": {\n return {\n cursor: findNextEnabledIndex(options.choices, state.cursor, 1),\n };\n }\n default: {\n return state;\n }\n }\n },\n onSubmit: (state) => {\n const selectedChoice = options.choices[state.cursor];\n\n if (!selectedChoice) {\n return { errorMessage: \"Please select an option\" };\n }\n\n if (selectedChoice.disabled) {\n return { errorMessage: \"Selected option is disabled\" };\n }\n\n return { value: selectedChoice.value };\n },\n });\n};\n\nexport const multiselect = async <TValue extends string>(\n options: MultiselectOptions<TValue>,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n\n return runPromptSession<\n { cursor: number; selected: Set<TValue> },\n TValue[],\n MultiselectOptions<TValue>\n >({\n runtime: promptRuntime,\n options,\n initialState: {\n cursor: findFirstEnabledIndex(options.choices),\n selected: new Set<TValue>(options.defaultValue ?? []),\n },\n render: ({ options: currentOptions, state, errorMessage }) => {\n const lines = [renderQuestionLine(currentOptions.message, \"\")];\n\n for (let index = 0; index < currentOptions.choices.length; index++) {\n const choice = currentOptions.choices[index];\n\n if (!choice) {\n continue;\n }\n\n const active = state.cursor === index;\n const checked = state.selected.has(choice.value) ? \"◉\" : \"◯\";\n const disabled = choice.disabled ? paint(\"yellow\", \" [disabled]\") : \"\";\n const label = choice.label ?? choice.value;\n const hint = choice.hint ? paint(\"dim\", ` (${choice.hint})`) : \"\";\n\n lines.push(`${pointer(active)} ${checked} ${label}${hint}${disabled}`);\n }\n\n lines.push(\n paint(\"dim\", \" (space to toggle, a to toggle all, enter to submit)\"),\n );\n\n return addErrorLine(lines.join(\"\\n\"), errorMessage);\n },\n complete: ({ options: currentOptions, value }) => {\n const labelMap = new Map(\n currentOptions.choices.map((choice) => [choice.value, choice.label]),\n );\n\n const labels = value.map((v) => labelMap.get(v) ?? v);\n\n return renderSuccessLine(currentOptions.message, labels.join(\", \"));\n },\n onKey: (state, key) => {\n switch (key.name) {\n case \"up\": {\n return {\n ...state,\n cursor: findNextEnabledIndex(options.choices, state.cursor, -1),\n };\n }\n case \"down\": {\n return {\n ...state,\n cursor: findNextEnabledIndex(options.choices, state.cursor, 1),\n };\n }\n case \"character\": {\n const lowered = (key.value ?? \"\").toLowerCase();\n\n if (lowered === \"a\") {\n const enabledValues = options.choices\n .filter((choice) => !choice.disabled)\n .map((choice) => choice.value);\n\n const hasEnabledValues = enabledValues.length > 0;\n\n if (!hasEnabledValues) {\n return state;\n }\n\n const areAllEnabledSelected = enabledValues.every((value) =>\n state.selected.has(value),\n );\n\n const nextSelection = new Set(state.selected);\n\n if (areAllEnabledSelected) {\n for (const value of enabledValues) {\n nextSelection.delete(value);\n }\n } else {\n for (const value of enabledValues) {\n nextSelection.add(value);\n }\n }\n\n return {\n ...state,\n selected: nextSelection,\n };\n }\n\n return state;\n }\n case \"space\": {\n const currentChoice = options.choices[state.cursor];\n\n if (!currentChoice || currentChoice.disabled) {\n return state;\n }\n\n const nextSelection = new Set(state.selected);\n\n if (nextSelection.has(currentChoice.value)) {\n nextSelection.delete(currentChoice.value);\n } else {\n nextSelection.add(currentChoice.value);\n }\n\n return {\n ...state,\n selected: nextSelection,\n };\n }\n default: {\n return state;\n }\n }\n },\n onSubmit: (state) => {\n const values = options.choices\n .filter((choice) => state.selected.has(choice.value))\n .map((choice) => choice.value);\n\n if (options.min !== undefined && values.length < options.min) {\n return {\n errorMessage: `Please select at least ${options.min} options`,\n };\n }\n\n if (options.max !== undefined && values.length > options.max) {\n return {\n errorMessage: `Please select at most ${options.max} options`,\n };\n }\n\n return { value: values };\n },\n });\n};\n\nexport type { PromptRuntime } from \"./core/types.js\";\nexport type {\n ConfirmOptions,\n InputOptions,\n MultiselectOptions,\n NumberOptions,\n PasswordOptions,\n PromptErrorType,\n SelectChoice,\n SelectOptions,\n} from \"./types.js\";\n"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_lib_errors_index = require("../errors/index.cjs");
|
|
3
|
+
//#region src/lib/pubsub/index.ts
|
|
4
|
+
var PubSub = class {
|
|
5
|
+
options;
|
|
6
|
+
isSubscribed = false;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
async publish(message) {
|
|
11
|
+
const [stringifyError, stringified] = require_lib_errors_index.mightThrowSync(() => JSON.stringify(message));
|
|
12
|
+
if (stringifyError || !stringified) return require_lib_errors_index.err("SerializationError", "Unable to serialize message");
|
|
13
|
+
const [publishError, count] = await require_lib_errors_index.mightThrow(this.options.publisher.publish(this.options.channel, stringified));
|
|
14
|
+
if (publishError) return require_lib_errors_index.err("PublishError", `Unable to publish to ${this.options.channel}`);
|
|
15
|
+
return require_lib_errors_index.ok(count);
|
|
16
|
+
}
|
|
17
|
+
async subscribe(handler) {
|
|
18
|
+
if (this.isActive()) return require_lib_errors_index.err("SubscribeError", "Already subscribed");
|
|
19
|
+
this.isSubscribed = true;
|
|
20
|
+
const wrappedHandler = async (message, channel) => {
|
|
21
|
+
const [parseError, parsed] = require_lib_errors_index.mightThrowSync(() => JSON.parse(message));
|
|
22
|
+
if (parseError) return;
|
|
23
|
+
if (!parsed) return;
|
|
24
|
+
await require_lib_errors_index.mightThrow(Promise.resolve(handler(parsed, channel)));
|
|
25
|
+
};
|
|
26
|
+
const [subscribeError, count] = await require_lib_errors_index.mightThrow(this.options.subscriber.subscribe(this.options.channel, wrappedHandler));
|
|
27
|
+
if (subscribeError) {
|
|
28
|
+
this.isSubscribed = false;
|
|
29
|
+
return require_lib_errors_index.err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
|
|
30
|
+
}
|
|
31
|
+
return require_lib_errors_index.ok(count);
|
|
32
|
+
}
|
|
33
|
+
async unsubscribe() {
|
|
34
|
+
if (!this.isActive()) return require_lib_errors_index.err("UnsubscribeError", "Not subscribed");
|
|
35
|
+
this.isSubscribed = false;
|
|
36
|
+
const [unsubscribeError] = await require_lib_errors_index.mightThrow(this.options.subscriber.unsubscribe(this.options.channel));
|
|
37
|
+
if (unsubscribeError) {
|
|
38
|
+
this.isSubscribed = true;
|
|
39
|
+
return require_lib_errors_index.err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
|
|
40
|
+
}
|
|
41
|
+
return require_lib_errors_index.ok(true);
|
|
42
|
+
}
|
|
43
|
+
isActive() {
|
|
44
|
+
return this.isSubscribed;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
exports.PubSub = PubSub;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MessageHandler, PubSubOptions } from "../../pubsub/types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/pubsub/index.d.ts
|
|
4
|
+
declare class PubSub<T extends Record<string, unknown>> {
|
|
5
|
+
private options;
|
|
6
|
+
private isSubscribed;
|
|
7
|
+
constructor(options: PubSubOptions);
|
|
8
|
+
publish(message: T): Promise<readonly [null, number | null] | readonly [{
|
|
9
|
+
readonly type: "SerializationError";
|
|
10
|
+
readonly message: string;
|
|
11
|
+
}, null] | readonly [{
|
|
12
|
+
readonly type: "PublishError";
|
|
13
|
+
readonly message: string;
|
|
14
|
+
}, null]>;
|
|
15
|
+
subscribe(handler: MessageHandler<T>): Promise<readonly [null, number | null] | readonly [{
|
|
16
|
+
readonly type: "SubscribeError";
|
|
17
|
+
readonly message: string;
|
|
18
|
+
}, null]>;
|
|
19
|
+
unsubscribe(): Promise<readonly [null, boolean] | readonly [{
|
|
20
|
+
readonly type: "UnsubscribeError";
|
|
21
|
+
readonly message: string;
|
|
22
|
+
}, null]>;
|
|
23
|
+
isActive(): boolean;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { PubSub };
|
|
27
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"mappings":";;;cAGa,MAAA,WAAiB,MAAA;EAAA,QACpB,OAAA;EAAA,QACA,YAAA;cAEW,OAAA,EAAS,aAAA;EAIf,OAAA,CAAQ,OAAA,EAAS,CAAA,GAAC,OAAA;IAAA;;;;;;EAuBlB,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,CAAA,IAAE,OAAA;IAAA;;;EAgCpC,WAAA,CAAA,GAAW,OAAA;IAAA;;;EAuBjB,QAAA,CAAA;AAAA"}
|