@kidd-cli/core 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{config-BvGapuFJ.js → config-D8e5qxLp.js} +63 -80
- package/dist/config-D8e5qxLp.js.map +1 -0
- package/dist/{create-store-BQUX0tAn.js → create-store-OHdkm_Yt.js} +33 -6
- package/dist/create-store-OHdkm_Yt.js.map +1 -0
- package/dist/index.d.ts +50 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -54
- package/dist/index.js.map +1 -1
- package/dist/lib/config.js +3 -4
- package/dist/lib/logger.d.ts +1 -1
- package/dist/lib/logger.js +1 -2
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/project.d.ts +1 -1
- package/dist/lib/project.d.ts.map +1 -1
- package/dist/lib/project.js +2 -3
- package/dist/lib/store.d.ts +2 -1
- package/dist/lib/store.d.ts.map +1 -1
- package/dist/lib/store.js +3 -4
- package/dist/{logger-BkQQej8h.d.ts → logger-9j49T5da.d.ts} +1 -1
- package/dist/{logger-BkQQej8h.d.ts.map → logger-9j49T5da.d.ts.map} +1 -1
- package/dist/middleware/auth.d.ts +250 -13
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +1008 -428
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/http.d.ts +10 -16
- package/dist/middleware/http.d.ts.map +1 -1
- package/dist/middleware/http.js +53 -94
- package/dist/middleware/http.js.map +1 -1
- package/dist/{middleware-D3psyhYo.js → middleware-BWnPSRWR.js} +14 -5
- package/dist/{middleware-D3psyhYo.js.map → middleware-BWnPSRWR.js.map} +1 -1
- package/dist/{project-NPtYX2ZX.js → project-D0g84bZY.js} +22 -23
- package/dist/project-D0g84bZY.js.map +1 -0
- package/dist/{types-kjpRau0U.d.ts → types-CTvrsrnD.d.ts} +79 -14
- package/dist/types-CTvrsrnD.d.ts.map +1 -0
- package/dist/{types-Cz9h927W.d.ts → types-D-BxshYM.d.ts} +1 -1
- package/dist/{types-Cz9h927W.d.ts.map → types-D-BxshYM.d.ts.map} +1 -1
- package/package.json +9 -16
- package/dist/config-BvGapuFJ.js.map +0 -1
- package/dist/create-store-BQUX0tAn.js.map +0 -1
- package/dist/lib/output.d.ts +0 -62
- package/dist/lib/output.d.ts.map +0 -1
- package/dist/lib/output.js +0 -276
- package/dist/lib/output.js.map +0 -1
- package/dist/lib/prompts.d.ts +0 -24
- package/dist/lib/prompts.d.ts.map +0 -1
- package/dist/lib/prompts.js +0 -3
- package/dist/project-NPtYX2ZX.js.map +0 -1
- package/dist/prompts-lLfUSgd6.js +0 -63
- package/dist/prompts-lLfUSgd6.js.map +0 -1
- package/dist/types-CqKJhsYk.d.ts +0 -135
- package/dist/types-CqKJhsYk.d.ts.map +0 -1
- package/dist/types-DFtYg5uZ.d.ts +0 -26
- package/dist/types-DFtYg5uZ.d.ts.map +0 -1
- package/dist/types-kjpRau0U.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import { createCliLogger } from "./lib/logger.js";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import "./project-NPtYX2ZX.js";
|
|
2
|
+
import { n as decorateContext, t as middleware } from "./middleware-BWnPSRWR.js";
|
|
3
|
+
import "./project-D0g84bZY.js";
|
|
4
|
+
import { t as createConfigClient } from "./config-D8e5qxLp.js";
|
|
6
5
|
import { basename, extname, join, resolve } from "node:path";
|
|
7
6
|
import { loadConfig } from "@kidd-cli/config/loader";
|
|
8
|
-
import { attemptAsync, err, isPlainObject, isString, ok } from "@kidd-cli/utils/fp";
|
|
7
|
+
import { P, attemptAsync, err, isPlainObject, isString, match, ok } from "@kidd-cli/utils/fp";
|
|
9
8
|
import yargs from "yargs";
|
|
9
|
+
import * as clack from "@clack/prompts";
|
|
10
10
|
import { TAG, hasTag, withTag } from "@kidd-cli/utils/tag";
|
|
11
11
|
import { jsonStringify } from "@kidd-cli/utils/json";
|
|
12
12
|
import { readdir } from "node:fs/promises";
|
|
13
13
|
import { formatZodIssues } from "@kidd-cli/utils/validate";
|
|
14
14
|
import { match as match$1 } from "ts-pattern";
|
|
15
15
|
import { defineConfig } from "@kidd-cli/config";
|
|
16
|
-
|
|
17
16
|
//#region src/context/error.ts
|
|
18
17
|
/**
|
|
19
18
|
* Create a ContextError with an exit code and optional error code.
|
|
@@ -63,7 +62,7 @@ function isContextError(error) {
|
|
|
63
62
|
}
|
|
64
63
|
function resolveExitCode(options) {
|
|
65
64
|
if (options && options.exitCode !== void 0) return options.exitCode;
|
|
66
|
-
return
|
|
65
|
+
return 1;
|
|
67
66
|
}
|
|
68
67
|
function resolveCode(options) {
|
|
69
68
|
if (options && options.code !== void 0) return options.code;
|
|
@@ -75,7 +74,6 @@ function createContextErrorData(message, options) {
|
|
|
75
74
|
message
|
|
76
75
|
}, "ContextError");
|
|
77
76
|
}
|
|
78
|
-
|
|
79
77
|
//#endregion
|
|
80
78
|
//#region src/context/output.ts
|
|
81
79
|
/**
|
|
@@ -192,32 +190,29 @@ function writeTableToStream(stream, rows, keys) {
|
|
|
192
190
|
].join("\n");
|
|
193
191
|
stream.write(`${content}\n`);
|
|
194
192
|
}
|
|
195
|
-
|
|
196
193
|
//#endregion
|
|
197
194
|
//#region src/context/prompts.ts
|
|
198
195
|
/**
|
|
199
196
|
* Create the interactive prompt methods for a context.
|
|
200
197
|
*
|
|
201
|
-
* @private
|
|
202
198
|
* @returns A Prompts instance backed by clack.
|
|
203
199
|
*/
|
|
204
200
|
function createContextPrompts() {
|
|
205
|
-
const utils = createPromptUtils();
|
|
206
201
|
return {
|
|
207
202
|
async confirm(opts) {
|
|
208
|
-
return unwrapCancelSignal(
|
|
203
|
+
return unwrapCancelSignal(await clack.confirm(opts));
|
|
209
204
|
},
|
|
210
205
|
async multiselect(opts) {
|
|
211
|
-
return unwrapCancelSignal(
|
|
206
|
+
return unwrapCancelSignal(await clack.multiselect(opts));
|
|
212
207
|
},
|
|
213
208
|
async password(opts) {
|
|
214
|
-
return unwrapCancelSignal(
|
|
209
|
+
return unwrapCancelSignal(await clack.password(opts));
|
|
215
210
|
},
|
|
216
211
|
async select(opts) {
|
|
217
|
-
return unwrapCancelSignal(
|
|
212
|
+
return unwrapCancelSignal(await clack.select(opts));
|
|
218
213
|
},
|
|
219
214
|
async text(opts) {
|
|
220
|
-
return unwrapCancelSignal(
|
|
215
|
+
return unwrapCancelSignal(await clack.text(opts));
|
|
221
216
|
}
|
|
222
217
|
};
|
|
223
218
|
}
|
|
@@ -228,21 +223,19 @@ function createContextPrompts() {
|
|
|
228
223
|
* the typed result value.
|
|
229
224
|
*
|
|
230
225
|
* @private
|
|
231
|
-
* @param utils - The prompt utils instance (for isCancel and cancel).
|
|
232
226
|
* @param result - The raw prompt result (value or cancel symbol).
|
|
233
227
|
* @returns The unwrapped typed value.
|
|
234
228
|
*/
|
|
235
|
-
function unwrapCancelSignal(
|
|
236
|
-
if (
|
|
237
|
-
|
|
229
|
+
function unwrapCancelSignal(result) {
|
|
230
|
+
if (clack.isCancel(result)) {
|
|
231
|
+
clack.cancel("Operation cancelled.");
|
|
238
232
|
throw createContextError("Prompt cancelled by user", {
|
|
239
233
|
code: "PROMPT_CANCELLED",
|
|
240
|
-
exitCode:
|
|
234
|
+
exitCode: 1
|
|
241
235
|
});
|
|
242
236
|
}
|
|
243
237
|
return result;
|
|
244
238
|
}
|
|
245
|
-
|
|
246
239
|
//#endregion
|
|
247
240
|
//#region src/context/store.ts
|
|
248
241
|
/**
|
|
@@ -271,7 +264,6 @@ function createMemoryStore() {
|
|
|
271
264
|
}
|
|
272
265
|
};
|
|
273
266
|
}
|
|
274
|
-
|
|
275
267
|
//#endregion
|
|
276
268
|
//#region src/context/create-context.ts
|
|
277
269
|
/**
|
|
@@ -286,7 +278,7 @@ function createMemoryStore() {
|
|
|
286
278
|
*/
|
|
287
279
|
function createContext(options) {
|
|
288
280
|
const ctxLogger = options.logger ?? createCliLogger();
|
|
289
|
-
const ctxSpinner =
|
|
281
|
+
const ctxSpinner = clack.spinner();
|
|
290
282
|
const ctxOutput = createContextOutput(options.output ?? process.stdout);
|
|
291
283
|
const ctxStore = createMemoryStore();
|
|
292
284
|
const ctxPrompts = createContextPrompts();
|
|
@@ -309,7 +301,6 @@ function createContext(options) {
|
|
|
309
301
|
store: ctxStore
|
|
310
302
|
};
|
|
311
303
|
}
|
|
312
|
-
|
|
313
304
|
//#endregion
|
|
314
305
|
//#region src/autoloader.ts
|
|
315
306
|
const VALID_EXTENSIONS = new Set([
|
|
@@ -429,7 +420,8 @@ async function importCommand(filePath) {
|
|
|
429
420
|
*/
|
|
430
421
|
function isCommandExport(mod) {
|
|
431
422
|
if (typeof mod !== "object" || mod === null) return false;
|
|
432
|
-
|
|
423
|
+
if (!("default" in mod)) return false;
|
|
424
|
+
const def = mod.default;
|
|
433
425
|
if (!isPlainObject(def)) return false;
|
|
434
426
|
return hasTag(def, "Command");
|
|
435
427
|
}
|
|
@@ -467,7 +459,6 @@ function isCommandDir(entry) {
|
|
|
467
459
|
if (!entry.isDirectory()) return false;
|
|
468
460
|
return !entry.name.startsWith("_") && !entry.name.startsWith(".");
|
|
469
461
|
}
|
|
470
|
-
|
|
471
462
|
//#endregion
|
|
472
463
|
//#region src/runtime/args/zod.ts
|
|
473
464
|
/**
|
|
@@ -627,7 +618,6 @@ function getZodTypeOption(schema) {
|
|
|
627
618
|
};
|
|
628
619
|
return base;
|
|
629
620
|
}
|
|
630
|
-
|
|
631
621
|
//#endregion
|
|
632
622
|
//#region src/runtime/args/parser.ts
|
|
633
623
|
/**
|
|
@@ -674,7 +664,6 @@ function validateArgs(argsDef, parsedArgs) {
|
|
|
674
664
|
if (!result.success) return err(/* @__PURE__ */ new Error(`Invalid arguments:\n ${formatZodIssues(result.error.issues).message}`));
|
|
675
665
|
return ok(result.data);
|
|
676
666
|
}
|
|
677
|
-
|
|
678
667
|
//#endregion
|
|
679
668
|
//#region src/runtime/args/register.ts
|
|
680
669
|
/**
|
|
@@ -691,10 +680,7 @@ function registerCommandArgs(builder, args) {
|
|
|
691
680
|
if (isZodSchema(args)) {
|
|
692
681
|
const options = zodSchemaToYargsOptions(args);
|
|
693
682
|
for (const [key, opt] of Object.entries(options)) builder.option(key, opt);
|
|
694
|
-
} else
|
|
695
|
-
const argsDef = args;
|
|
696
|
-
for (const [key, def] of Object.entries(argsDef)) builder.option(key, yargsArgDefToOption(def));
|
|
697
|
-
}
|
|
683
|
+
} else for (const [key, def] of Object.entries(args)) builder.option(key, yargsArgDefToOption(def));
|
|
698
684
|
}
|
|
699
685
|
/**
|
|
700
686
|
* Convert a yargs-native arg definition into a yargs option object.
|
|
@@ -713,7 +699,6 @@ function yargsArgDefToOption(def) {
|
|
|
713
699
|
type: def.type
|
|
714
700
|
};
|
|
715
701
|
}
|
|
716
|
-
|
|
717
702
|
//#endregion
|
|
718
703
|
//#region src/runtime/register.ts
|
|
719
704
|
/**
|
|
@@ -736,7 +721,7 @@ function isCommand(value) {
|
|
|
736
721
|
*/
|
|
737
722
|
function registerCommands(options) {
|
|
738
723
|
const { instance, commands, resolved, parentPath } = options;
|
|
739
|
-
const commandEntries = Object.entries(commands).filter((
|
|
724
|
+
const commandEntries = Object.entries(commands).filter((pair) => isCommand(pair[1]));
|
|
740
725
|
for (const [name, entry] of commandEntries) registerResolvedCommand({
|
|
741
726
|
builder: instance,
|
|
742
727
|
cmd: entry,
|
|
@@ -762,7 +747,7 @@ function registerResolvedCommand(options) {
|
|
|
762
747
|
instance.command(name, description, (builder) => {
|
|
763
748
|
registerCommandArgs(builder, cmd.args);
|
|
764
749
|
if (cmd.commands) {
|
|
765
|
-
const subCommands = Object.entries(cmd.commands).filter((
|
|
750
|
+
const subCommands = Object.entries(cmd.commands).filter((pair) => isCommand(pair[1]));
|
|
766
751
|
for (const [subName, subEntry] of subCommands) registerResolvedCommand({
|
|
767
752
|
builder,
|
|
768
753
|
cmd: subEntry,
|
|
@@ -784,7 +769,6 @@ function registerResolvedCommand(options) {
|
|
|
784
769
|
};
|
|
785
770
|
});
|
|
786
771
|
}
|
|
787
|
-
|
|
788
772
|
//#endregion
|
|
789
773
|
//#region src/runtime/runner.ts
|
|
790
774
|
/**
|
|
@@ -835,7 +819,6 @@ async function runMiddlewareChain(middlewares, ctx, finalHandler) {
|
|
|
835
819
|
}
|
|
836
820
|
await executeChain(0);
|
|
837
821
|
}
|
|
838
|
-
|
|
839
822
|
//#endregion
|
|
840
823
|
//#region src/runtime/runtime.ts
|
|
841
824
|
/**
|
|
@@ -858,7 +841,7 @@ async function createRuntime(options) {
|
|
|
858
841
|
args: validatedArgs,
|
|
859
842
|
config,
|
|
860
843
|
meta: {
|
|
861
|
-
command: command.commandPath,
|
|
844
|
+
command: [...command.commandPath],
|
|
862
845
|
name: options.name,
|
|
863
846
|
version: options.version
|
|
864
847
|
}
|
|
@@ -893,7 +876,6 @@ async function resolveConfig(configOptions, defaultName) {
|
|
|
893
876
|
if (configError || !configResult) return {};
|
|
894
877
|
return configResult.config;
|
|
895
878
|
}
|
|
896
|
-
|
|
897
879
|
//#endregion
|
|
898
880
|
//#region src/cli.ts
|
|
899
881
|
const ARGV_SLICE_START = 2;
|
|
@@ -1005,30 +987,84 @@ function applyCwd(argv) {
|
|
|
1005
987
|
* @param logger - Logger with an error method for output.
|
|
1006
988
|
*/
|
|
1007
989
|
function exitOnError(error, logger) {
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
}
|
|
990
|
+
const info = match(error).when(isContextError, (e) => ({
|
|
991
|
+
exitCode: e.exitCode,
|
|
992
|
+
message: e.message
|
|
993
|
+
})).with(P.instanceOf(Error), (e) => ({
|
|
994
|
+
exitCode: 1,
|
|
995
|
+
message: e.message
|
|
996
|
+
})).otherwise((e) => ({
|
|
997
|
+
exitCode: 1,
|
|
998
|
+
message: String(e)
|
|
999
|
+
}));
|
|
1000
|
+
logger.error(info.message);
|
|
1001
|
+
process.exit(info.exitCode);
|
|
1018
1002
|
}
|
|
1019
|
-
|
|
1020
1003
|
//#endregion
|
|
1021
1004
|
//#region src/command.ts
|
|
1022
1005
|
/**
|
|
1023
1006
|
* Define a CLI command with typed args, config, and handler.
|
|
1024
1007
|
*
|
|
1025
|
-
*
|
|
1008
|
+
* The `const TMiddleware` generic preserves the middleware tuple as a literal type,
|
|
1009
|
+
* enabling TypeScript to extract and intersect `Variables` from each middleware
|
|
1010
|
+
* element onto the handler's `ctx` type.
|
|
1011
|
+
*
|
|
1012
|
+
* @param def - Command definition including description, args schema, middleware, and handler.
|
|
1026
1013
|
* @returns A resolved Command object for registration in the command map.
|
|
1027
1014
|
*/
|
|
1028
1015
|
function command(def) {
|
|
1029
1016
|
return withTag({ ...def }, "Command");
|
|
1030
1017
|
}
|
|
1031
|
-
|
|
1032
1018
|
//#endregion
|
|
1033
|
-
|
|
1019
|
+
//#region src/compose.ts
|
|
1020
|
+
/**
|
|
1021
|
+
* Middleware combinator that merges multiple middleware into one.
|
|
1022
|
+
*
|
|
1023
|
+
* @module
|
|
1024
|
+
*/
|
|
1025
|
+
/**
|
|
1026
|
+
* Compose multiple middleware into a single middleware.
|
|
1027
|
+
*
|
|
1028
|
+
* Executes each middleware in order, threading `next()` through the chain.
|
|
1029
|
+
* The final `next()` call from the last composed middleware continues to
|
|
1030
|
+
* the downstream middleware or command handler.
|
|
1031
|
+
*
|
|
1032
|
+
* The returned middleware's type merges all `Variables` from the input tuple,
|
|
1033
|
+
* so downstream handlers see the combined context.
|
|
1034
|
+
*
|
|
1035
|
+
* @param middlewares - An ordered tuple of middleware to compose.
|
|
1036
|
+
* @returns A single Middleware whose Variables is the intersection of all input Variables.
|
|
1037
|
+
*
|
|
1038
|
+
* @example
|
|
1039
|
+
* ```ts
|
|
1040
|
+
* const combined = compose([auth({ strategies: [auth.env()] }), auth.require()])
|
|
1041
|
+
* ```
|
|
1042
|
+
*/
|
|
1043
|
+
function compose(middlewares) {
|
|
1044
|
+
return middleware((ctx, next) => executeChain(middlewares, 0, ctx, next));
|
|
1045
|
+
}
|
|
1046
|
+
/**
|
|
1047
|
+
* Recursively execute middleware in order, calling next() after the last one.
|
|
1048
|
+
*
|
|
1049
|
+
* @private
|
|
1050
|
+
* @param middlewares - The middleware array.
|
|
1051
|
+
* @param index - Current position in the array.
|
|
1052
|
+
* @param ctx - The context object.
|
|
1053
|
+
* @param next - The downstream next function.
|
|
1054
|
+
*/
|
|
1055
|
+
async function executeChain(middlewares, index, ctx, next) {
|
|
1056
|
+
if (index >= middlewares.length) {
|
|
1057
|
+
await next();
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1060
|
+
const mw = middlewares[index];
|
|
1061
|
+
if (mw === void 0) {
|
|
1062
|
+
await next();
|
|
1063
|
+
return;
|
|
1064
|
+
}
|
|
1065
|
+
await mw.handler(ctx, () => executeChain(middlewares, index + 1, ctx, next));
|
|
1066
|
+
}
|
|
1067
|
+
//#endregion
|
|
1068
|
+
export { autoload, cli, command, compose, decorateContext, defineConfig, middleware };
|
|
1069
|
+
|
|
1034
1070
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["match"],"sources":["../src/context/error.ts","../src/context/output.ts","../src/context/prompts.ts","../src/context/store.ts","../src/context/create-context.ts","../src/autoloader.ts","../src/runtime/args/zod.ts","../src/runtime/args/parser.ts","../src/runtime/args/register.ts","../src/runtime/register.ts","../src/runtime/runner.ts","../src/runtime/runtime.ts","../src/cli.ts","../src/command.ts"],"sourcesContent":["import type { Tagged } from '@kidd-cli/utils/tag'\nimport { TAG, hasTag, withTag } from '@kidd-cli/utils/tag'\n\nimport { DEFAULT_EXIT_CODE } from '@/utils/constants.js'\n\nexport { DEFAULT_EXIT_CODE }\n\n/**\n * Plain data representation of a ContextError (no Error prototype).\n *\n * Useful for serializing error data without carrying the Error prototype chain,\n * for example when logging or forwarding errors across process boundaries.\n */\nexport type ContextErrorData = Tagged<\n {\n readonly code: string | undefined\n readonly exitCode: number\n readonly message: string\n },\n 'ContextError'\n>\n\n/**\n * An Error subtype carrying an exit code and optional error code.\n *\n * Created by {@link createContextError} and thrown by `ctx.fail()`.\n * The CLI boundary catches these to produce clean, user-facing error output\n * with the correct process exit code.\n */\nexport type ContextError = Error &\n Tagged<\n {\n readonly code: string | undefined\n readonly exitCode: number\n },\n 'ContextError'\n >\n\n/**\n * Create a ContextError with an exit code and optional error code.\n *\n * Used to surface user-facing CLI errors with clean messages.\n * The error carries a Symbol-based tag for reliable type-narrowing\n * via {@link isContextError}.\n *\n * @param message - Human-readable error message.\n * @param options - Optional error code and exit code overrides.\n * @returns A ContextError instance.\n */\nexport function createContextError(\n message: string,\n options?: { code?: string; exitCode?: number }\n): ContextError {\n const data = createContextErrorData(message, options)\n const error = new Error(data.message) as ContextError\n error.name = 'ContextError'\n Object.defineProperty(error, TAG, { enumerable: false, value: 'ContextError', writable: false })\n Object.defineProperty(error, 'code', { enumerable: true, value: data.code, writable: false })\n Object.defineProperty(error, 'exitCode', {\n enumerable: true,\n value: data.exitCode,\n writable: false,\n })\n return error\n}\n\n/**\n * Type guard that narrows an unknown value to {@link ContextError}.\n *\n * Checks that the value is an Error instance whose `[TAG]` property\n * equals `'ContextError'`, which distinguishes CLI-layer errors from\n * unexpected exceptions.\n *\n * @param error - The value to check.\n * @returns `true` when the value is a ContextError.\n */\nexport function isContextError(error: unknown): error is ContextError {\n if (error instanceof Error) {\n return hasTag(error, 'ContextError')\n }\n return false\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveExitCode(options: { code?: string; exitCode?: number } | undefined): number {\n if (options && options.exitCode !== undefined) {\n return options.exitCode\n }\n return DEFAULT_EXIT_CODE\n}\n\nfunction resolveCode(\n options: { code?: string; exitCode?: number } | undefined\n): string | undefined {\n if (options && options.code !== undefined) {\n return options.code\n }\n return undefined\n}\n\nfunction createContextErrorData(\n message: string,\n options?: { code?: string; exitCode?: number }\n): ContextErrorData {\n return withTag(\n {\n code: resolveCode(options),\n exitCode: resolveExitCode(options),\n message,\n },\n 'ContextError'\n )\n}\n","import { jsonStringify } from '@kidd-cli/utils/json'\n\nimport type { Output, OutputOptions } from './types.js'\n\n/**\n * Create the structured output methods for a context.\n *\n * @private\n * @param stream - The writable stream to write output to.\n * @returns An Output instance backed by the given stream.\n */\nexport function createContextOutput(stream: NodeJS.WriteStream): Output {\n return {\n markdown(content: string): void {\n stream.write(`${content}\\n`)\n },\n raw(content: string): void {\n stream.write(content)\n },\n table(rows: Record<string, unknown>[], options?: OutputOptions): void {\n if (options && options.json) {\n const [, json] = jsonStringify(rows, { pretty: true })\n stream.write(`${json}\\n`)\n return\n }\n if (rows.length === 0) {\n return\n }\n const [firstRow] = rows\n if (!firstRow) {\n return\n }\n writeTableToStream(stream, rows, Object.keys(firstRow))\n },\n write(data: unknown, options?: OutputOptions): void {\n if ((options && options.json) || (typeof data === 'object' && data !== null)) {\n const [, json] = jsonStringify(data, { pretty: true })\n stream.write(`${json}\\n`)\n } else {\n stream.write(`${String(data)}\\n`)\n }\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format an unknown value as a string for table cell display.\n *\n * @private\n * @param val - The value to format.\n * @returns The stringified value, or empty string for undefined.\n */\nfunction formatStringValue(val: unknown): string {\n if (val === undefined) {\n return ''\n }\n return String(val)\n}\n\n/**\n * Options for creating a table header string.\n */\ninterface TableHeaderOptions {\n keys: string[]\n widths: (number | undefined)[]\n}\n\n/**\n * Create a padded header row string from column keys and widths.\n *\n * @private\n * @param options - The keys and column widths.\n * @returns A formatted header string.\n */\nfunction createTableHeader(options: TableHeaderOptions): string {\n const { keys, widths } = options\n return keys\n .map((key, idx) => {\n const width = widths[idx]\n if (width === undefined) {\n return key\n }\n return key.padEnd(width)\n })\n .join(' ')\n}\n\n/**\n * Options for creating a table row string.\n */\ninterface TableRowOptions {\n row: Record<string, unknown>\n keys: string[]\n widths: (number | undefined)[]\n}\n\n/**\n * Create a padded row string from a data record, column keys, and widths.\n *\n * @private\n * @param options - The row data, keys, and column widths.\n * @returns A formatted row string.\n */\nfunction createTableRow(options: TableRowOptions): string {\n const { row, keys, widths } = options\n return keys\n .map((key, idx) => {\n const width = widths[idx]\n const val = formatStringValue(row[key])\n if (width === undefined) {\n return val\n }\n return val.padEnd(width)\n })\n .join(' ')\n}\n\n/**\n * Compute the maximum column width for each key across all rows.\n *\n * @private\n * @param rows - The data rows.\n * @param keys - The column keys.\n * @returns An array of column widths.\n */\nfunction computeColumnWidths(rows: Record<string, unknown>[], keys: string[]): number[] {\n return keys.map((key) => {\n const values = rows.map((row) => formatStringValue(row[key]))\n return Math.max(key.length, ...values.map((val) => val.length))\n })\n}\n\n/**\n * Write a formatted table (header, separator, rows) to a writable stream.\n *\n * @private\n * @param stream - The writable stream.\n * @param rows - The data rows.\n * @param keys - The column keys.\n */\nfunction writeTableToStream(\n stream: NodeJS.WriteStream,\n rows: Record<string, unknown>[],\n keys: string[]\n): void {\n const widths = computeColumnWidths(rows, keys)\n const header = createTableHeader({ keys, widths })\n const separator = widths.map((width) => '-'.repeat(width)).join(' ')\n const dataRows = rows.map((row) => createTableRow({ keys, row, widths }))\n const content = [header, separator, ...dataRows].join('\\n')\n stream.write(`${content}\\n`)\n}\n","import { createPromptUtils } from '@/lib/prompts/index.js'\n\nimport { DEFAULT_EXIT_CODE, createContextError } from './error.js'\nimport type { Prompts } from './types.js'\n\n/**\n * Create the interactive prompt methods for a context.\n *\n * @private\n * @returns A Prompts instance backed by clack.\n */\nexport function createContextPrompts(): Prompts {\n const utils = createPromptUtils()\n\n return {\n async confirm(opts): Promise<boolean> {\n const result = await utils.confirm(opts)\n return unwrapCancelSignal(utils, result)\n },\n async multiselect<Type>(opts: Parameters<Prompts['multiselect']>[0]): Promise<Type[]> {\n const result = await utils.multiselect<Type>(\n opts as Parameters<typeof utils.multiselect<Type>>[0]\n )\n return unwrapCancelSignal(utils, result)\n },\n async password(opts): Promise<string> {\n const result = await utils.password(opts)\n return unwrapCancelSignal(utils, result)\n },\n async select<Type>(opts: Parameters<Prompts['select']>[0]): Promise<Type> {\n const result = await utils.select<Type>(opts as Parameters<typeof utils.select<Type>>[0])\n return unwrapCancelSignal(utils, result)\n },\n async text(opts): Promise<string> {\n const result = await utils.text(opts)\n return unwrapCancelSignal(utils, result)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Unwrap a prompt result that may be a cancel symbol.\n *\n * If the user cancelled (Ctrl-C), throws a ContextError. Otherwise returns\n * the typed result value.\n *\n * @private\n * @param utils - The prompt utils instance (for isCancel and cancel).\n * @param result - The raw prompt result (value or cancel symbol).\n * @returns The unwrapped typed value.\n */\nfunction unwrapCancelSignal<Type>(\n utils: ReturnType<typeof createPromptUtils>,\n result: Type | symbol\n): Type {\n if (utils.isCancel(result)) {\n utils.cancel('Operation cancelled.')\n throw createContextError('Prompt cancelled by user', {\n code: 'PROMPT_CANCELLED',\n exitCode: DEFAULT_EXIT_CODE,\n })\n }\n return result as Type\n}\n","import type { Store } from './types.js'\n\n/**\n * Create an in-memory key-value store.\n *\n * @private\n * @returns A Store instance backed by a Map.\n */\nexport function createMemoryStore<TMap extends Record<string, unknown>>(): Store<TMap> {\n const map = new Map<string, unknown>()\n\n return {\n clear(): void {\n map.clear()\n },\n delete(key: string): boolean {\n return map.delete(key)\n },\n get<Key extends Extract<keyof TMap, string>>(key: Key): TMap[Key] | undefined {\n return map.get(key) as TMap[Key] | undefined\n },\n has(key: string): boolean {\n return map.has(key)\n },\n set<Key extends Extract<keyof TMap, string>>(key: Key, value: TMap[Key]): void {\n map.set(key, value)\n },\n }\n}\n","import { createCliLogger } from '@/lib/logger.js'\nimport type { CliLogger } from '@/lib/logger.js'\nimport { createSpinner } from '@/lib/prompts/index.js'\nimport type { AnyRecord, KiddStore, Merge } from '@/types.js'\n\nimport { createContextError } from './error.js'\nimport { createContextOutput } from './output.js'\nimport { createContextPrompts } from './prompts.js'\nimport { createMemoryStore } from './store.js'\nimport type { Context, Meta, Output, Prompts, Spinner, Store, StoreMap } from './types.js'\n\n/**\n * Options for creating a {@link Context} instance via {@link createContext}.\n *\n * Carries the parsed args, validated config, and CLI metadata needed to\n * assemble a fully-wired context. An optional `logger` override allows\n * callers to inject a custom {@link CliLogger}; when omitted a default\n * @clack/prompts-backed instance is used.\n */\nexport interface CreateContextOptions<TArgs extends AnyRecord, TConfig extends AnyRecord> {\n readonly args: TArgs\n readonly config: TConfig\n readonly meta: { readonly name: string; readonly version: string; readonly command: string[] }\n readonly logger?: CliLogger\n readonly output?: NodeJS.WriteStream\n}\n\n/**\n * Create the {@link Context} object threaded through middleware and command handlers.\n *\n * Assembles logger, spinner, output, store, prompts, and meta from\n * the provided options into a single immutable context. Each sub-system is\n * constructed via its own factory so this function remains a lean orchestrator.\n *\n * @param options - Args, config, and meta for the current invocation.\n * @returns A fully constructed Context.\n */\nexport function createContext<TArgs extends AnyRecord, TConfig extends AnyRecord>(\n options: CreateContextOptions<TArgs, TConfig>\n): Context<TArgs, TConfig> {\n const ctxLogger: CliLogger = options.logger ?? createCliLogger()\n const ctxSpinner: Spinner = createSpinner()\n const ctxOutput: Output = createContextOutput(options.output ?? process.stdout)\n const ctxStore: Store<Merge<KiddStore, StoreMap>> = createMemoryStore()\n const ctxPrompts: Prompts = createContextPrompts()\n const ctxMeta: Meta = {\n command: options.meta.command,\n name: options.meta.name,\n version: options.meta.version,\n }\n\n // Middleware-augmented properties (e.g. `auth`) are added at runtime.\n // See `decorateContext` — they are intentionally absent here.\n return {\n args: options.args as Context<TArgs, TConfig>['args'],\n config: options.config as Context<TArgs, TConfig>['config'],\n fail(message: string, failOptions?: { code?: string; exitCode?: number }): never {\n throw createContextError(message, failOptions)\n },\n logger: ctxLogger,\n meta: ctxMeta as Context<TArgs, TConfig>['meta'],\n output: ctxOutput,\n prompts: ctxPrompts,\n spinner: ctxSpinner,\n store: ctxStore,\n } as Context<TArgs, TConfig>\n}\n","import type { Dirent } from 'node:fs'\nimport { readdir } from 'node:fs/promises'\nimport { basename, extname, join, resolve } from 'node:path'\n\nimport { isPlainObject, isString } from '@kidd-cli/utils/fp'\nimport { hasTag, withTag } from '@kidd-cli/utils/tag'\n\nimport type { AutoloadOptions, Command, CommandMap } from './types.js'\n\nconst VALID_EXTENSIONS = new Set(['.ts', '.js', '.mjs'])\nconst INDEX_NAME = 'index'\n\n/**\n * Scan a directory for command files and produce a CommandMap.\n *\n * @param options - Autoload configuration (directory override, etc.).\n * @returns A promise resolving to a CommandMap built from the directory tree.\n */\nexport async function autoload(options?: AutoloadOptions): Promise<CommandMap> {\n const dir = resolveDir(options)\n const entries = await readdir(dir, { withFileTypes: true })\n\n const fileEntries = entries.filter(isCommandFile)\n const dirEntries = entries.filter(isCommandDir)\n\n const fileResults = await Promise.all(\n fileEntries.map(async (entry): Promise<[string, Command] | undefined> => {\n const cmd = await importCommand(join(dir, entry.name))\n if (!cmd) {\n return undefined\n }\n return [deriveCommandName(entry), cmd]\n })\n )\n\n const dirResults = await Promise.all(\n dirEntries.map((entry) => buildDirCommand(join(dir, entry.name)))\n )\n\n const allResults = [...fileResults, ...dirResults]\n const validPairs = allResults.filter((pair): pair is [string, Command] => pair !== undefined)\n\n return Object.fromEntries(validPairs) as CommandMap\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the target directory from autoload options.\n *\n * @private\n * @param options - Optional autoload configuration.\n * @returns The resolved absolute directory path.\n */\nfunction resolveDir(options?: AutoloadOptions): string {\n if (options && isString(options.dir)) {\n return resolve(options.dir)\n }\n return resolve('./commands')\n}\n\n/**\n * Scan a subdirectory and assemble it as a parent command with subcommands.\n *\n * If the directory contains an `index.ts`/`index.js`, that becomes the parent\n * handler. Otherwise a handler-less group command is created that demands a\n * subcommand.\n *\n * @private\n * @param dir - Absolute path to the subdirectory.\n * @returns A tuple of [name, Command] or undefined if the directory is empty.\n */\nasync function buildDirCommand(dir: string): Promise<[string, Command] | undefined> {\n const name = basename(dir)\n const dirEntries = await readdir(dir, { withFileTypes: true })\n const subCommands = await buildSubCommands(dir, dirEntries)\n const indexFile = findIndexInEntries(dirEntries)\n\n if (indexFile) {\n const parentCommand = await importCommand(join(dir, indexFile.name))\n if (parentCommand) {\n return [name, withTag({ ...parentCommand, commands: subCommands }, 'Command')]\n }\n }\n\n if (Object.keys(subCommands).length === 0) {\n return undefined\n }\n\n return [name, withTag({ commands: subCommands }, 'Command')]\n}\n\n/**\n * Build subcommands from already-read directory entries, avoiding a redundant readdir call.\n *\n * @private\n * @param dir - Absolute path to the directory.\n * @param entries - Pre-read directory entries.\n * @returns A CommandMap built from the entries.\n */\nasync function buildSubCommands(dir: string, entries: Dirent[]): Promise<CommandMap> {\n const fileEntries = entries.filter(isCommandFile)\n const dirEntries = entries.filter(isCommandDir)\n\n const fileResults = await Promise.all(\n fileEntries.map(async (entry): Promise<[string, Command] | undefined> => {\n const cmd = await importCommand(join(dir, entry.name))\n if (!cmd) {\n return undefined\n }\n return [deriveCommandName(entry), cmd]\n })\n )\n\n const dirResults = await Promise.all(\n dirEntries.map((entry) => buildDirCommand(join(dir, entry.name)))\n )\n\n const allResults = [...fileResults, ...dirResults]\n const validPairs = allResults.filter((pair): pair is [string, Command] => pair !== undefined)\n\n return Object.fromEntries(validPairs) as CommandMap\n}\n\n/**\n * Find the index file (index.ts or index.js) in pre-read directory entries.\n *\n * @private\n * @param entries - Pre-read directory entries.\n * @returns The index file's Dirent or undefined.\n */\nfunction findIndexInEntries(entries: Dirent[]): Dirent | undefined {\n return entries.find(\n (entry) =>\n entry.isFile() &&\n VALID_EXTENSIONS.has(extname(entry.name)) &&\n basename(entry.name, extname(entry.name)) === INDEX_NAME\n )\n}\n\n/**\n * Dynamically import a file and validate that its default export is a Command.\n *\n * @private\n * @param filePath - Absolute path to the file to import.\n * @returns The Command if valid, or undefined.\n */\nasync function importCommand(filePath: string): Promise<Command | undefined> {\n const mod: unknown = await import(filePath)\n if (isCommandExport(mod)) {\n return mod.default\n }\n return undefined\n}\n\n/**\n * Check whether a module's default export is a Command object.\n *\n * ES module namespace objects have a null prototype, so isPlainObject\n * rejects them. We only need to verify the namespace is a non-null\n * object with a default export that is a plain Command object.\n *\n * @private\n * @param mod - The imported module to inspect.\n * @returns True when the module has a Command as its default export.\n */\nfunction isCommandExport(mod: unknown): mod is { default: Command } {\n if (typeof mod !== 'object' || mod === null) {\n return false\n }\n const def = (mod as Record<string, unknown>)['default']\n if (!isPlainObject(def)) {\n return false\n }\n return hasTag(def, 'Command')\n}\n\n/**\n * Derive a command name from a directory entry by stripping its extension.\n *\n * @private\n * @param entry - The directory entry to derive the name from.\n * @returns The file name without its extension.\n */\nfunction deriveCommandName(entry: Dirent): string {\n return basename(entry.name, extname(entry.name))\n}\n\n/**\n * Predicate: entry is a command file (.ts/.js, not index, not _/. prefixed).\n *\n * @private\n * @param entry - The directory entry to check.\n * @returns True when the entry is a valid command file.\n */\nfunction isCommandFile(entry: Dirent): boolean {\n if (!entry.isFile()) {\n return false\n }\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) {\n return false\n }\n if (!VALID_EXTENSIONS.has(extname(entry.name))) {\n return false\n }\n return deriveCommandName(entry) !== INDEX_NAME\n}\n\n/**\n * Predicate: entry is a scannable command directory (not _/. prefixed).\n *\n * @private\n * @param entry - The directory entry to check.\n * @returns True when the entry is a valid command directory.\n */\nfunction isCommandDir(entry: Dirent): boolean {\n if (!entry.isDirectory()) {\n return false\n }\n return !entry.name.startsWith('_') && !entry.name.startsWith('.')\n}\n","import { match } from 'ts-pattern'\nimport type { Options as YargsOptions } from 'yargs'\nimport type { z } from 'zod'\n\n/**\n * Type guard that checks whether a value is a zod object schema.\n *\n * @param args - The value to check.\n * @returns True when args is a ZodObject.\n */\nexport function isZodSchema(args: unknown): args is z.ZodObject<z.ZodRawShape> {\n return (\n typeof args === 'object' &&\n args !== null &&\n '_def' in args &&\n typeof (args as { _def: unknown })._def === 'object' &&\n (args as { _def: { type?: string } })._def !== null &&\n (args as { _def: { type?: string } })._def.type === 'object'\n )\n}\n\n/**\n * Convert an entire zod object schema into a record of yargs options.\n *\n * @param schema - The zod object schema.\n * @returns A record mapping field names to yargs option definitions.\n */\nexport function zodSchemaToYargsOptions(\n schema: z.ZodObject<z.ZodRawShape>\n): Record<string, YargsOptions> {\n const shape = schema.shape as Record<string, z.ZodTypeAny>\n return Object.fromEntries(\n Object.entries(shape).map(([key, fieldSchema]): [string, YargsOptions] => [\n key,\n getZodTypeOption(fieldSchema),\n ])\n )\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\ninterface ZodDef {\n type?: string\n innerType?: z.ZodTypeAny\n defaultValue?: unknown\n}\n\ninterface ZodTypeInfo {\n defaultValue: unknown\n inner: z.ZodTypeAny\n isOptional: boolean\n}\n\ninterface UnwrapOptions {\n def: ZodDef\n current: z.ZodTypeAny\n defaultValue: unknown\n}\n\ninterface UnwrapRecursiveOptions {\n current: z.ZodTypeAny\n isOptional: boolean\n defaultValue: unknown\n}\n\n/**\n * Extract a default value from a zod definition, falling back to the provided value.\n *\n * @private\n * @param def - The zod definition to inspect.\n * @param fallback - Value to return when no default is defined.\n * @returns The resolved default value.\n */\nfunction resolveDefaultValue(def: ZodDef, fallback: unknown): unknown {\n if (def.defaultValue !== undefined) {\n return def.defaultValue\n }\n return fallback\n}\n\n/**\n * Unwrap a ZodOptional type, recursing into the inner type.\n *\n * @private\n * @param options - The unwrap options containing def, current type, and default value.\n * @returns Unwrapped type information.\n */\nfunction unwrapOptional(options: UnwrapOptions): ZodTypeInfo {\n const { def, current, defaultValue } = options\n if (def.innerType) {\n return unwrapZodTypeRecursive({ current: def.innerType, defaultValue, isOptional: true })\n }\n return { defaultValue, inner: current, isOptional: true }\n}\n\n/**\n * Unwrap a ZodDefault type, resolving its default value and recursing.\n *\n * @private\n * @param options - The unwrap options containing def, current type, and default value.\n * @returns Unwrapped type information with the resolved default.\n */\nfunction unwrapDefault(options: UnwrapOptions): ZodTypeInfo {\n const { def, current, defaultValue } = options\n const newDefault = resolveDefaultValue(def, defaultValue)\n if (def.innerType) {\n return unwrapZodTypeRecursive({\n current: def.innerType,\n defaultValue: newDefault,\n isOptional: true,\n })\n }\n return { defaultValue: newDefault, inner: current, isOptional: true }\n}\n\n/**\n * Recursively unwrap optional and default wrappers from a zod type.\n *\n * @private\n * @param options - The recursive unwrap options containing current type, optionality flag, and default value.\n * @returns The fully unwrapped type information.\n */\nfunction unwrapZodTypeRecursive(options: UnwrapRecursiveOptions): ZodTypeInfo {\n const { current, isOptional, defaultValue } = options\n const def = (current as { _def: ZodDef })._def\n if (def.type === 'optional') {\n return unwrapOptional({ current, def, defaultValue })\n }\n if (def.type === 'default') {\n return unwrapDefault({ current, def, defaultValue })\n }\n return { defaultValue, inner: current, isOptional }\n}\n\n/**\n * Unwrap a zod schema to extract its base type, optionality, and default value.\n *\n * @private\n * @param schema - The zod type to unwrap.\n * @returns The unwrapped type information.\n */\nfunction unwrapZodType(schema: z.ZodTypeAny): ZodTypeInfo {\n return unwrapZodTypeRecursive({ current: schema, defaultValue: undefined, isOptional: false })\n}\n\n/**\n * Map a zod type name to a yargs option type string.\n *\n * @private\n * @param typeName - The zod type name (e.g. 'string', 'number').\n * @returns The corresponding yargs type.\n */\nfunction resolveZodYargsType(\n typeName: string | undefined\n): 'string' | 'number' | 'boolean' | 'array' {\n return match(typeName)\n .with('string', () => 'string' as const)\n .with('number', () => 'number' as const)\n .with('boolean', () => 'boolean' as const)\n .with('array', () => 'array' as const)\n .otherwise(() => 'string' as const)\n}\n\n/**\n * Build a base yargs option from a zod schema's description and default.\n *\n * @private\n * @param inner - The unwrapped zod schema instance.\n * @param defaultValue - The resolved default value.\n * @returns A partial yargs option object.\n */\nfunction buildBaseOption(inner: z.ZodTypeAny, defaultValue: unknown): YargsOptions {\n const base: YargsOptions = {}\n const { description } = inner as { description?: string }\n if (description) {\n base.describe = description\n }\n if (defaultValue !== undefined) {\n base.default = defaultValue\n }\n return base\n}\n\n/**\n * Convert a single zod field schema into a complete yargs option definition.\n *\n * @private\n * @param schema - A single zod field type.\n * @returns A complete yargs option object.\n */\nfunction getZodTypeOption(schema: z.ZodTypeAny): YargsOptions {\n const { inner, isOptional, defaultValue } = unwrapZodType(schema)\n const innerDef = (inner as { _def: ZodDef })._def\n const base = {\n ...buildBaseOption(inner, defaultValue),\n type: resolveZodYargsType(innerDef.type),\n }\n if (!isOptional) {\n return { ...base, demandOption: true }\n }\n return base\n}\n","import { err, ok } from '@kidd-cli/utils/fp'\nimport type { Result } from '@kidd-cli/utils/fp'\nimport { formatZodIssues } from '@kidd-cli/utils/validate'\n\nimport type { Command } from '@/types.js'\n\nimport type { ArgsParser } from '../types.js'\nimport { isZodSchema } from './zod.js'\n\n/**\n * Create an args parser that cleans and validates raw parsed arguments.\n *\n * Captures the argument definition in a closure and returns an ArgsParser\n * whose `parse` method strips yargs-internal keys and validates against\n * a zod schema when one is defined.\n *\n * @param argsDef - The argument definition from the command.\n * @returns An ArgsParser with a parse method.\n */\nexport function createArgsParser(argsDef: Command['args']): ArgsParser {\n return {\n parse(rawArgs: Record<string, unknown>): Result<Record<string, unknown>, Error> {\n const cleaned = cleanParsedArgs(rawArgs)\n return validateArgs(argsDef, cleaned)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Strip yargs-internal keys (`_`, `$0`) and camelCase-duplicated hyphenated keys\n * from a parsed argv record, returning only user-defined arguments.\n *\n * @private\n * @param argv - Raw parsed argv from yargs.\n * @returns A cleaned record containing only user-defined arguments.\n */\nfunction cleanParsedArgs(argv: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(argv).filter(([key]) => key !== '_' && key !== '$0' && !key.includes('-'))\n )\n}\n\n/**\n * Validate parsed arguments against a zod schema when one is defined.\n *\n * If the command uses yargs-native args (no zod schema), the parsed args are\n * returned as-is. When a zod schema is present, validation is performed and\n * a Result error is returned on failure.\n *\n * @private\n * @param argsDef - The argument definition from the command.\n * @param parsedArgs - The cleaned parsed arguments.\n * @returns A Result containing validated arguments (zod-parsed when applicable).\n */\nfunction validateArgs(\n argsDef: Command['args'],\n parsedArgs: Record<string, unknown>\n): Result<Record<string, unknown>, Error> {\n if (!argsDef || !isZodSchema(argsDef)) {\n return ok(parsedArgs)\n }\n const result = argsDef.safeParse(parsedArgs)\n if (!result.success) {\n return err(new Error(`Invalid arguments:\\n ${formatZodIssues(result.error.issues).message}`))\n }\n return ok(result.data as Record<string, unknown>)\n}\n","import type { Argv, Options as YargsOptions } from 'yargs'\n\nimport type { Command, YargsArgDef } from '@/types.js'\n\nimport { isZodSchema, zodSchemaToYargsOptions } from './zod.js'\n\n/**\n * Register argument definitions on a yargs builder.\n *\n * Accepts either a zod object schema or a record of yargs-native arg definitions\n * and wires them as yargs options on the given builder instance.\n *\n * @param builder - The yargs Argv instance to register options on.\n * @param args - Argument definitions from a Command.\n */\nexport function registerCommandArgs(builder: Argv, args: Command['args']): void {\n if (!args) {\n return\n }\n if (isZodSchema(args)) {\n const options = zodSchemaToYargsOptions(args)\n for (const [key, opt] of Object.entries(options)) {\n builder.option(key, opt)\n }\n } else {\n const argsDef = args as Record<string, YargsArgDef>\n for (const [key, def] of Object.entries(argsDef)) {\n builder.option(key, yargsArgDefToOption(def))\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a yargs-native arg definition into a yargs option object.\n *\n * @private\n * @param def - The yargs arg definition.\n * @returns A yargs option object.\n */\nfunction yargsArgDefToOption(def: YargsArgDef): YargsOptions {\n return {\n alias: def.alias,\n choices: def.choices as string[],\n default: def.default,\n demandOption: def.required ?? false,\n describe: def.description,\n type: def.type,\n }\n}\n","import { hasTag } from '@kidd-cli/utils/tag'\nimport type { Argv } from 'yargs'\n\nimport type { Context } from '@/context/types.js'\nimport type { Command, CommandMap, Middleware } from '@/types.js'\n\nimport { registerCommandArgs } from './args/index.js'\nimport type { ResolvedCommand, ResolvedRef } from './types.js'\n\n/**\n * Type guard that checks whether a value is a Command object.\n *\n * @param value - The value to test.\n * @returns True when the value has `[TAG] === 'Command'`.\n */\nexport function isCommand(value: unknown): value is Command {\n return hasTag(value, 'Command')\n}\n\n/**\n * Register all commands from a CommandMap on a yargs instance.\n *\n * Iterates over the command map, filters for valid Command objects,\n * and recursively registers each command (including subcommands) on\n * the provided yargs Argv instance.\n *\n * @param options - Registration options including the command map, yargs instance, and resolution ref.\n */\nexport function registerCommands(options: RegisterCommandsOptions): void {\n const { instance, commands, resolved, parentPath } = options\n const commandEntries = Object.entries(commands).filter(([, entry]) => isCommand(entry))\n\n for (const [name, entry] of commandEntries) {\n registerResolvedCommand({\n builder: instance,\n cmd: entry as Command,\n instance,\n name,\n parentPath,\n resolved,\n })\n }\n}\n\nexport type { ResolvedCommand, ResolvedRef } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\ninterface RegisterResolvedCommandOptions {\n builder: Argv\n cmd: Command\n instance: Argv\n name: string\n parentPath: string[]\n resolved: ResolvedRef\n}\n\ninterface RegisterCommandsOptions {\n commands: CommandMap\n instance: Argv\n parentPath: string[]\n resolved: ResolvedRef\n}\n\n/**\n * Register a single resolved command (and its subcommands) with yargs.\n *\n * Sets up the yargs command handler, wires argument definitions, and\n * recursively registers any nested subcommands. On match, stores the\n * resolved handler and command path in the shared ref.\n *\n * @private\n * @param options - Command registration context.\n */\nfunction registerResolvedCommand(options: RegisterResolvedCommandOptions): void {\n const { instance, name, cmd, resolved, parentPath } = options\n const description = cmd.description ?? ''\n\n instance.command(\n name,\n description,\n (builder: Argv) => {\n registerCommandArgs(builder, cmd.args)\n\n if (cmd.commands) {\n const subCommands = Object.entries(cmd.commands).filter(([, entry]) => isCommand(entry))\n\n for (const [subName, subEntry] of subCommands) {\n registerResolvedCommand({\n builder,\n cmd: subEntry as Command,\n instance: builder,\n name: subName,\n parentPath: [...parentPath, name],\n resolved,\n })\n }\n\n if (cmd.handler) {\n builder.demandCommand(0)\n } else {\n builder.demandCommand(1, 'You must specify a subcommand.')\n }\n }\n\n return builder\n },\n () => {\n resolved.ref = {\n args: cmd.args,\n commandPath: [...parentPath, name],\n handler: cmd.handler as ((ctx: Context) => Promise<void> | void) | undefined,\n middleware: (cmd.middleware ?? []) as Middleware[],\n }\n }\n )\n}\n","import type { Context } from '@/context/types.js'\nimport type { Middleware } from '@/types.js'\n\nimport type { Runner } from './types.js'\n\n/**\n * Create a runner that executes root and command middleware chains.\n *\n * Root middleware wraps the command middleware chain, which in turn wraps\n * the command handler — producing a nested onion lifecycle:\n *\n * ```\n * root middleware start →\n * command middleware start →\n * handler\n * command middleware end\n * root middleware end\n * ```\n *\n * @param rootMiddleware - Root-level middleware from `cli({ middleware })`.\n * @returns A Runner with an execute method.\n */\nexport function createRunner(rootMiddleware: Middleware[]): Runner {\n return {\n async execute({ ctx, handler, middleware }): Promise<void> {\n const commandHandler = async (innerCtx: Context): Promise<void> => {\n await runMiddlewareChain(middleware, innerCtx, handler)\n }\n await runMiddlewareChain(rootMiddleware, ctx, commandHandler)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a middleware chain followed by a final handler.\n *\n * Runs each middleware in order, passing `ctx` and a `next` callback.\n * When all middleware have called `next()`, the final handler is invoked.\n * A middleware can short-circuit by not calling `next()`.\n *\n * @private\n * @param middlewares - Ordered array of middleware to execute.\n * @param ctx - The context object threaded through middleware and handler.\n * @param finalHandler - The command handler to invoke after all middleware.\n */\nasync function runMiddlewareChain(\n middlewares: Middleware[],\n ctx: Context,\n finalHandler: (ctx: Context) => Promise<void> | void\n): Promise<void> {\n async function executeChain(index: number): Promise<void> {\n if (index >= middlewares.length) {\n await finalHandler(ctx)\n return\n }\n const mw = middlewares[index]\n if (mw) {\n await mw.handler(ctx, () => executeChain(index + 1))\n }\n }\n\n await executeChain(0)\n}\n","import { attemptAsync, err, ok } from '@kidd-cli/utils/fp'\nimport type { AsyncResult } from '@kidd-cli/utils/fp'\nimport type { z } from 'zod'\n\nimport { createContext } from '@/context/index.js'\nimport type { Context } from '@/context/types.js'\nimport { createConfigClient } from '@/lib/config/index.js'\nimport type { CliConfigOptions, Middleware } from '@/types.js'\n\nimport { createArgsParser } from './args/index.js'\nimport { createRunner } from './runner.js'\nimport type { Runtime, RuntimeOptions } from './types.js'\n\n/**\n * Create a runtime that orchestrates config loading and middleware execution.\n *\n * Loads config up front, then captures it in a closure alongside a runner.\n * The returned `runtime.execute` method handles arg parsing, context creation,\n * and middleware chain execution for each command invocation.\n *\n * @param options - Runtime configuration including name, version, config, and middleware.\n * @returns An AsyncResult containing the runtime or an error.\n */\nexport async function createRuntime<TSchema extends z.ZodType>(\n options: RuntimeOptions<TSchema>\n): AsyncResult<Runtime, Error> {\n const config = await resolveConfig(options.config, options.name)\n\n const runner = createRunner((options.middleware ?? []) as Middleware[])\n\n const runtime: Runtime = {\n async execute(command): AsyncResult<void, Error> {\n const parser = createArgsParser(command.args)\n const [argsError, validatedArgs] = parser.parse(command.rawArgs)\n if (argsError) {\n return err(argsError)\n }\n\n const ctx = createContext({\n args: validatedArgs,\n config,\n meta: {\n command: command.commandPath as string[],\n name: options.name,\n version: options.version,\n },\n })\n\n const finalHandler = command.handler ?? (async () => {})\n\n const [execError] = await attemptAsync(() =>\n runner.execute({\n ctx: ctx as Context,\n handler: finalHandler as (ctx: Context) => Promise<void> | void,\n middleware: command.middleware,\n })\n )\n if (execError) {\n return err(execError)\n }\n\n return ok()\n },\n }\n\n return ok(runtime)\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Load and validate a config file via the config client.\n *\n * Returns the validated config record or an empty object when no config\n * options are provided or when loading fails.\n *\n * @private\n * @param configOptions - Config loading options with schema and optional name override.\n * @param defaultName - Fallback config file name derived from the CLI name.\n * @returns The loaded config record or an empty object.\n */\nasync function resolveConfig<TSchema extends z.ZodType>(\n configOptions: CliConfigOptions<TSchema> | undefined,\n defaultName: string\n): Promise<Record<string, unknown>> {\n if (!configOptions || !configOptions.schema) {\n return {}\n }\n const client = createConfigClient({\n name: configOptions.name ?? defaultName,\n schema: configOptions.schema,\n })\n const [configError, configResult] = await client.load()\n if (configError || !configResult) {\n return {}\n }\n return configResult.config as Record<string, unknown>\n}\n","import { resolve } from 'node:path'\n\nimport { loadConfig } from '@kidd-cli/config/loader'\nimport { attemptAsync, isPlainObject, isString } from '@kidd-cli/utils/fp'\nimport yargs from 'yargs'\nimport type { z } from 'zod'\n\nimport { DEFAULT_EXIT_CODE, isContextError } from '@/context/index.js'\nimport { createCliLogger } from '@/lib/logger.js'\nimport type { CliOptions, CommandMap } from '@/types.js'\n\nimport { autoload } from './autoloader.js'\nimport { createRuntime, registerCommands } from './runtime/index.js'\nimport type { ResolvedRef } from './runtime/index.js'\n\nconst ARGV_SLICE_START = 2\n\n/**\n * Bootstrap and run the CLI application.\n *\n * Parses argv, resolves the matched command, loads config, runs the\n * middleware chain, and invokes the command handler.\n *\n * @param options - CLI configuration including name, version, commands, and middleware.\n */\nexport async function cli<TSchema extends z.ZodType = z.ZodType>(\n options: CliOptions<TSchema>\n): Promise<void> {\n const logger = createCliLogger()\n\n const [uncaughtError, result] = await attemptAsync(async () => {\n const program = yargs(process.argv.slice(ARGV_SLICE_START))\n .scriptName(options.name)\n .version(options.version)\n .strict()\n .help()\n .option('cwd', {\n describe: 'Set the working directory',\n global: true,\n type: 'string',\n })\n\n if (options.description) {\n program.usage(options.description)\n }\n\n const resolved: ResolvedRef = { ref: undefined }\n\n const commands = await resolveCommands(options.commands)\n\n if (commands) {\n registerCommands({ commands, instance: program, parentPath: [], resolved })\n program.demandCommand(1, 'You must specify a command.')\n }\n\n const argv = await program.parseAsync()\n\n applyCwd(argv as Record<string, unknown>)\n\n if (!resolved.ref) {\n return undefined\n }\n\n const [runtimeError, runtime] = await createRuntime({\n config: options.config,\n middleware: options.middleware,\n name: options.name,\n version: options.version,\n })\n\n if (runtimeError) {\n return runtimeError\n }\n\n const [executeError] = await runtime.execute({\n args: resolved.ref.args,\n commandPath: resolved.ref.commandPath,\n handler: resolved.ref.handler,\n middleware: resolved.ref.middleware,\n rawArgs: argv as Record<string, unknown>,\n })\n\n return executeError\n })\n\n if (uncaughtError) {\n exitOnError(uncaughtError, logger)\n return\n }\n\n if (result) {\n exitOnError(result, logger)\n }\n}\n\nexport default cli\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the commands option to a CommandMap.\n *\n * Accepts a directory string (triggers autoload), a static CommandMap,\n * a Promise<CommandMap> (from autoload() called at the call site),\n * or undefined (loads `kidd.config.ts` and autoloads from its `commands` field,\n * falling back to `'./commands'`).\n *\n * @private\n * @param commands - The commands option from CliOptions.\n * @returns A CommandMap or undefined.\n */\nasync function resolveCommands(\n commands: string | CommandMap | Promise<CommandMap> | undefined\n): Promise<CommandMap | undefined> {\n if (isString(commands)) {\n return autoload({ dir: commands })\n }\n if (commands instanceof Promise) {\n return commands\n }\n if (isPlainObject(commands)) {\n return commands as CommandMap\n }\n return resolveCommandsFromConfig()\n}\n\n/**\n * Load `kidd.config.ts` and autoload commands from its `commands` field.\n *\n * Falls back to `'./commands'` when the config file is missing, fails to load,\n * or does not specify a `commands` field.\n *\n * @private\n * @returns A CommandMap autoloaded from the configured commands directory.\n */\nasync function resolveCommandsFromConfig(): Promise<CommandMap> {\n const DEFAULT_COMMANDS_DIR = './commands'\n\n const [configError, configResult] = await loadConfig()\n if (configError || !configResult) {\n return autoload({ dir: DEFAULT_COMMANDS_DIR })\n }\n\n const dir = configResult.config.commands ?? DEFAULT_COMMANDS_DIR\n return autoload({ dir })\n}\n\n/**\n * Change the process working directory when `--cwd` is provided.\n *\n * Resolves the value to an absolute path and calls `process.chdir()` so\n * that all downstream `process.cwd()` calls reflect the override.\n *\n * @private\n * @param argv - The parsed argv record from yargs.\n */\nfunction applyCwd(argv: Record<string, unknown>): void {\n if (isString(argv.cwd)) {\n process.chdir(resolve(argv.cwd))\n }\n}\n\n/**\n * Handle a CLI error by logging the message and exiting with the appropriate code.\n *\n * ContextErrors carry a custom exit code; all other errors exit with code 1.\n *\n * @private\n * @param error - The caught error value.\n * @param logger - Logger with an error method for output.\n */\nfunction exitOnError(error: unknown, logger: { error(msg: string): void }): void {\n if (isContextError(error)) {\n logger.error(error.message)\n process.exit(error.exitCode)\n } else if (error instanceof Error) {\n logger.error(error.message)\n process.exit(DEFAULT_EXIT_CODE)\n } else {\n logger.error(String(error))\n process.exit(DEFAULT_EXIT_CODE)\n }\n}\n","import { withTag } from '@kidd-cli/utils/tag'\n\nimport type { ArgsDef, CommandDef, Command as CommandType } from './types.js'\n\n/**\n * Define a CLI command with typed args, config, and handler.\n *\n * @param def - Command definition including description, args schema, and handler.\n * @returns A resolved Command object for registration in the command map.\n */\nexport function command<\n TArgsDef extends ArgsDef = ArgsDef,\n TConfig extends Record<string, unknown> = Record<string, unknown>,\n>(def: CommandDef<TArgsDef, TConfig>): CommandType {\n return withTag({ ...def }, 'Command') as CommandType\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,SAAgB,mBACd,SACA,SACc;CACd,MAAM,OAAO,uBAAuB,SAAS,QAAQ;CACrD,MAAM,QAAQ,IAAI,MAAM,KAAK,QAAQ;AACrC,OAAM,OAAO;AACb,QAAO,eAAe,OAAO,KAAK;EAAE,YAAY;EAAO,OAAO;EAAgB,UAAU;EAAO,CAAC;AAChG,QAAO,eAAe,OAAO,QAAQ;EAAE,YAAY;EAAM,OAAO,KAAK;EAAM,UAAU;EAAO,CAAC;AAC7F,QAAO,eAAe,OAAO,YAAY;EACvC,YAAY;EACZ,OAAO,KAAK;EACZ,UAAU;EACX,CAAC;AACF,QAAO;;;;;;;;;;;;AAaT,SAAgB,eAAe,OAAuC;AACpE,KAAI,iBAAiB,MACnB,QAAO,OAAO,OAAO,eAAe;AAEtC,QAAO;;AAOT,SAAS,gBAAgB,SAAmE;AAC1F,KAAI,WAAW,QAAQ,aAAa,OAClC,QAAO,QAAQ;AAEjB,QAAO;;AAGT,SAAS,YACP,SACoB;AACpB,KAAI,WAAW,QAAQ,SAAS,OAC9B,QAAO,QAAQ;;AAKnB,SAAS,uBACP,SACA,SACkB;AAClB,QAAO,QACL;EACE,MAAM,YAAY,QAAQ;EAC1B,UAAU,gBAAgB,QAAQ;EAClC;EACD,EACD,eACD;;;;;;;;;;;;ACvGH,SAAgB,oBAAoB,QAAoC;AACtE,QAAO;EACL,SAAS,SAAuB;AAC9B,UAAO,MAAM,GAAG,QAAQ,IAAI;;EAE9B,IAAI,SAAuB;AACzB,UAAO,MAAM,QAAQ;;EAEvB,MAAM,MAAiC,SAA+B;AACpE,OAAI,WAAW,QAAQ,MAAM;IAC3B,MAAM,GAAG,QAAQ,cAAc,MAAM,EAAE,QAAQ,MAAM,CAAC;AACtD,WAAO,MAAM,GAAG,KAAK,IAAI;AACzB;;AAEF,OAAI,KAAK,WAAW,EAClB;GAEF,MAAM,CAAC,YAAY;AACnB,OAAI,CAAC,SACH;AAEF,sBAAmB,QAAQ,MAAM,OAAO,KAAK,SAAS,CAAC;;EAEzD,MAAM,MAAe,SAA+B;AAClD,OAAK,WAAW,QAAQ,QAAU,OAAO,SAAS,YAAY,SAAS,MAAO;IAC5E,MAAM,GAAG,QAAQ,cAAc,MAAM,EAAE,QAAQ,MAAM,CAAC;AACtD,WAAO,MAAM,GAAG,KAAK,IAAI;SAEzB,QAAO,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI;;EAGtC;;;;;;;;;AAcH,SAAS,kBAAkB,KAAsB;AAC/C,KAAI,QAAQ,OACV,QAAO;AAET,QAAO,OAAO,IAAI;;;;;;;;;AAkBpB,SAAS,kBAAkB,SAAqC;CAC9D,MAAM,EAAE,MAAM,WAAW;AACzB,QAAO,KACJ,KAAK,KAAK,QAAQ;EACjB,MAAM,QAAQ,OAAO;AACrB,MAAI,UAAU,OACZ,QAAO;AAET,SAAO,IAAI,OAAO,MAAM;GACxB,CACD,KAAK,KAAK;;;;;;;;;AAmBf,SAAS,eAAe,SAAkC;CACxD,MAAM,EAAE,KAAK,MAAM,WAAW;AAC9B,QAAO,KACJ,KAAK,KAAK,QAAQ;EACjB,MAAM,QAAQ,OAAO;EACrB,MAAM,MAAM,kBAAkB,IAAI,KAAK;AACvC,MAAI,UAAU,OACZ,QAAO;AAET,SAAO,IAAI,OAAO,MAAM;GACxB,CACD,KAAK,KAAK;;;;;;;;;;AAWf,SAAS,oBAAoB,MAAiC,MAA0B;AACtF,QAAO,KAAK,KAAK,QAAQ;EACvB,MAAM,SAAS,KAAK,KAAK,QAAQ,kBAAkB,IAAI,KAAK,CAAC;AAC7D,SAAO,KAAK,IAAI,IAAI,QAAQ,GAAG,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC;GAC/D;;;;;;;;;;AAWJ,SAAS,mBACP,QACA,MACA,MACM;CACN,MAAM,SAAS,oBAAoB,MAAM,KAAK;CAI9C,MAAM,UAAU;EAHD,kBAAkB;GAAE;GAAM;GAAQ,CAAC;EAChC,OAAO,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;EAEjC,GADnB,KAAK,KAAK,QAAQ,eAAe;GAAE;GAAM;GAAK;GAAQ,CAAC,CAAC;EACzB,CAAC,KAAK,KAAK;AAC3D,QAAO,MAAM,GAAG,QAAQ,IAAI;;;;;;;;;;;AC/I9B,SAAgB,uBAAgC;CAC9C,MAAM,QAAQ,mBAAmB;AAEjC,QAAO;EACL,MAAM,QAAQ,MAAwB;AAEpC,UAAO,mBAAmB,OADX,MAAM,MAAM,QAAQ,KAAK,CACA;;EAE1C,MAAM,YAAkB,MAA8D;AAIpF,UAAO,mBAAmB,OAHX,MAAM,MAAM,YACzB,KACD,CACuC;;EAE1C,MAAM,SAAS,MAAuB;AAEpC,UAAO,mBAAmB,OADX,MAAM,MAAM,SAAS,KAAK,CACD;;EAE1C,MAAM,OAAa,MAAuD;AAExE,UAAO,mBAAmB,OADX,MAAM,MAAM,OAAa,KAAiD,CACjD;;EAE1C,MAAM,KAAK,MAAuB;AAEhC,UAAO,mBAAmB,OADX,MAAM,MAAM,KAAK,KAAK,CACG;;EAE3C;;;;;;;;;;;;;AAkBH,SAAS,mBACP,OACA,QACM;AACN,KAAI,MAAM,SAAS,OAAO,EAAE;AAC1B,QAAM,OAAO,uBAAuB;AACpC,QAAM,mBAAmB,4BAA4B;GACnD,MAAM;GACN,UAAU;GACX,CAAC;;AAEJ,QAAO;;;;;;;;;;;AC1DT,SAAgB,oBAAuE;CACrF,MAAM,sBAAM,IAAI,KAAsB;AAEtC,QAAO;EACL,QAAc;AACZ,OAAI,OAAO;;EAEb,OAAO,KAAsB;AAC3B,UAAO,IAAI,OAAO,IAAI;;EAExB,IAA6C,KAAiC;AAC5E,UAAO,IAAI,IAAI,IAAI;;EAErB,IAAI,KAAsB;AACxB,UAAO,IAAI,IAAI,IAAI;;EAErB,IAA6C,KAAU,OAAwB;AAC7E,OAAI,IAAI,KAAK,MAAM;;EAEtB;;;;;;;;;;;;;;;ACUH,SAAgB,cACd,SACyB;CACzB,MAAM,YAAuB,QAAQ,UAAU,iBAAiB;CAChE,MAAM,aAAsB,eAAe;CAC3C,MAAM,YAAoB,oBAAoB,QAAQ,UAAU,QAAQ,OAAO;CAC/E,MAAM,WAA8C,mBAAmB;CACvE,MAAM,aAAsB,sBAAsB;CAClD,MAAM,UAAgB;EACpB,SAAS,QAAQ,KAAK;EACtB,MAAM,QAAQ,KAAK;EACnB,SAAS,QAAQ,KAAK;EACvB;AAID,QAAO;EACL,MAAM,QAAQ;EACd,QAAQ,QAAQ;EAChB,KAAK,SAAiB,aAA2D;AAC/E,SAAM,mBAAmB,SAAS,YAAY;;EAEhD,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,SAAS;EACT,SAAS;EACT,OAAO;EACR;;;;;ACxDH,MAAM,mBAAmB,IAAI,IAAI;CAAC;CAAO;CAAO;CAAO,CAAC;AACxD,MAAM,aAAa;;;;;;;AAQnB,eAAsB,SAAS,SAAgD;CAC7E,MAAM,MAAM,WAAW,QAAQ;CAC/B,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;CAE3D,MAAM,cAAc,QAAQ,OAAO,cAAc;CACjD,MAAM,aAAa,QAAQ,OAAO,aAAa;CAE/C,MAAM,cAAc,MAAM,QAAQ,IAChC,YAAY,IAAI,OAAO,UAAkD;EACvE,MAAM,MAAM,MAAM,cAAc,KAAK,KAAK,MAAM,KAAK,CAAC;AACtD,MAAI,CAAC,IACH;AAEF,SAAO,CAAC,kBAAkB,MAAM,EAAE,IAAI;GACtC,CACH;CAED,MAAM,aAAa,MAAM,QAAQ,IAC/B,WAAW,KAAK,UAAU,gBAAgB,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CAClE;CAGD,MAAM,aADa,CAAC,GAAG,aAAa,GAAG,WAAW,CACpB,QAAQ,SAAoC,SAAS,OAAU;AAE7F,QAAO,OAAO,YAAY,WAAW;;;;;;;;;AAcvC,SAAS,WAAW,SAAmC;AACrD,KAAI,WAAW,SAAS,QAAQ,IAAI,CAClC,QAAO,QAAQ,QAAQ,IAAI;AAE7B,QAAO,QAAQ,aAAa;;;;;;;;;;;;;AAc9B,eAAe,gBAAgB,KAAqD;CAClF,MAAM,OAAO,SAAS,IAAI;CAC1B,MAAM,aAAa,MAAM,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;CAC9D,MAAM,cAAc,MAAM,iBAAiB,KAAK,WAAW;CAC3D,MAAM,YAAY,mBAAmB,WAAW;AAEhD,KAAI,WAAW;EACb,MAAM,gBAAgB,MAAM,cAAc,KAAK,KAAK,UAAU,KAAK,CAAC;AACpE,MAAI,cACF,QAAO,CAAC,MAAM,QAAQ;GAAE,GAAG;GAAe,UAAU;GAAa,EAAE,UAAU,CAAC;;AAIlF,KAAI,OAAO,KAAK,YAAY,CAAC,WAAW,EACtC;AAGF,QAAO,CAAC,MAAM,QAAQ,EAAE,UAAU,aAAa,EAAE,UAAU,CAAC;;;;;;;;;;AAW9D,eAAe,iBAAiB,KAAa,SAAwC;CACnF,MAAM,cAAc,QAAQ,OAAO,cAAc;CACjD,MAAM,aAAa,QAAQ,OAAO,aAAa;CAE/C,MAAM,cAAc,MAAM,QAAQ,IAChC,YAAY,IAAI,OAAO,UAAkD;EACvE,MAAM,MAAM,MAAM,cAAc,KAAK,KAAK,MAAM,KAAK,CAAC;AACtD,MAAI,CAAC,IACH;AAEF,SAAO,CAAC,kBAAkB,MAAM,EAAE,IAAI;GACtC,CACH;CAED,MAAM,aAAa,MAAM,QAAQ,IAC/B,WAAW,KAAK,UAAU,gBAAgB,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CAClE;CAGD,MAAM,aADa,CAAC,GAAG,aAAa,GAAG,WAAW,CACpB,QAAQ,SAAoC,SAAS,OAAU;AAE7F,QAAO,OAAO,YAAY,WAAW;;;;;;;;;AAUvC,SAAS,mBAAmB,SAAuC;AACjE,QAAO,QAAQ,MACZ,UACC,MAAM,QAAQ,IACd,iBAAiB,IAAI,QAAQ,MAAM,KAAK,CAAC,IACzC,SAAS,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC,KAAK,WACjD;;;;;;;;;AAUH,eAAe,cAAc,UAAgD;CAC3E,MAAM,MAAe,MAAM,OAAO;AAClC,KAAI,gBAAgB,IAAI,CACtB,QAAO,IAAI;;;;;;;;;;;;;AAgBf,SAAS,gBAAgB,KAA2C;AAClE,KAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,QAAO;CAET,MAAM,MAAO,IAAgC;AAC7C,KAAI,CAAC,cAAc,IAAI,CACrB,QAAO;AAET,QAAO,OAAO,KAAK,UAAU;;;;;;;;;AAU/B,SAAS,kBAAkB,OAAuB;AAChD,QAAO,SAAS,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC;;;;;;;;;AAUlD,SAAS,cAAc,OAAwB;AAC7C,KAAI,CAAC,MAAM,QAAQ,CACjB,QAAO;AAET,KAAI,MAAM,KAAK,WAAW,IAAI,IAAI,MAAM,KAAK,WAAW,IAAI,CAC1D,QAAO;AAET,KAAI,CAAC,iBAAiB,IAAI,QAAQ,MAAM,KAAK,CAAC,CAC5C,QAAO;AAET,QAAO,kBAAkB,MAAM,KAAK;;;;;;;;;AAUtC,SAAS,aAAa,OAAwB;AAC5C,KAAI,CAAC,MAAM,aAAa,CACtB,QAAO;AAET,QAAO,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI;;;;;;;;;;;ACnNnE,SAAgB,YAAY,MAAmD;AAC7E,QACE,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAQ,KAA2B,SAAS,YAC3C,KAAqC,SAAS,QAC9C,KAAqC,KAAK,SAAS;;;;;;;;AAUxD,SAAgB,wBACd,QAC8B;CAC9B,MAAM,QAAQ,OAAO;AACrB,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,KAAK,iBAAyC,CACxE,KACA,iBAAiB,YAAY,CAC9B,CAAC,CACH;;;;;;;;;;AAuCH,SAAS,oBAAoB,KAAa,UAA4B;AACpE,KAAI,IAAI,iBAAiB,OACvB,QAAO,IAAI;AAEb,QAAO;;;;;;;;;AAUT,SAAS,eAAe,SAAqC;CAC3D,MAAM,EAAE,KAAK,SAAS,iBAAiB;AACvC,KAAI,IAAI,UACN,QAAO,uBAAuB;EAAE,SAAS,IAAI;EAAW;EAAc,YAAY;EAAM,CAAC;AAE3F,QAAO;EAAE;EAAc,OAAO;EAAS,YAAY;EAAM;;;;;;;;;AAU3D,SAAS,cAAc,SAAqC;CAC1D,MAAM,EAAE,KAAK,SAAS,iBAAiB;CACvC,MAAM,aAAa,oBAAoB,KAAK,aAAa;AACzD,KAAI,IAAI,UACN,QAAO,uBAAuB;EAC5B,SAAS,IAAI;EACb,cAAc;EACd,YAAY;EACb,CAAC;AAEJ,QAAO;EAAE,cAAc;EAAY,OAAO;EAAS,YAAY;EAAM;;;;;;;;;AAUvE,SAAS,uBAAuB,SAA8C;CAC5E,MAAM,EAAE,SAAS,YAAY,iBAAiB;CAC9C,MAAM,MAAO,QAA6B;AAC1C,KAAI,IAAI,SAAS,WACf,QAAO,eAAe;EAAE;EAAS;EAAK;EAAc,CAAC;AAEvD,KAAI,IAAI,SAAS,UACf,QAAO,cAAc;EAAE;EAAS;EAAK;EAAc,CAAC;AAEtD,QAAO;EAAE;EAAc,OAAO;EAAS;EAAY;;;;;;;;;AAUrD,SAAS,cAAc,QAAmC;AACxD,QAAO,uBAAuB;EAAE,SAAS;EAAQ,cAAc;EAAW,YAAY;EAAO,CAAC;;;;;;;;;AAUhG,SAAS,oBACP,UAC2C;AAC3C,QAAOA,QAAM,SAAS,CACnB,KAAK,gBAAgB,SAAkB,CACvC,KAAK,gBAAgB,SAAkB,CACvC,KAAK,iBAAiB,UAAmB,CACzC,KAAK,eAAe,QAAiB,CACrC,gBAAgB,SAAkB;;;;;;;;;;AAWvC,SAAS,gBAAgB,OAAqB,cAAqC;CACjF,MAAM,OAAqB,EAAE;CAC7B,MAAM,EAAE,gBAAgB;AACxB,KAAI,YACF,MAAK,WAAW;AAElB,KAAI,iBAAiB,OACnB,MAAK,UAAU;AAEjB,QAAO;;;;;;;;;AAUT,SAAS,iBAAiB,QAAoC;CAC5D,MAAM,EAAE,OAAO,YAAY,iBAAiB,cAAc,OAAO;CACjE,MAAM,WAAY,MAA2B;CAC7C,MAAM,OAAO;EACX,GAAG,gBAAgB,OAAO,aAAa;EACvC,MAAM,oBAAoB,SAAS,KAAK;EACzC;AACD,KAAI,CAAC,WACH,QAAO;EAAE,GAAG;EAAM,cAAc;EAAM;AAExC,QAAO;;;;;;;;;;;;;;;ACvLT,SAAgB,iBAAiB,SAAsC;AACrE,QAAO,EACL,MAAM,SAA0E;AAE9E,SAAO,aAAa,SADJ,gBAAgB,QAAQ,CACH;IAExC;;;;;;;;;;AAeH,SAAS,gBAAgB,MAAwD;AAC/E,QAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,QAAQ,CAAC,SAAS,QAAQ,OAAO,QAAQ,QAAQ,CAAC,IAAI,SAAS,IAAI,CAAC,CAC1F;;;;;;;;;;;;;;AAeH,SAAS,aACP,SACA,YACwC;AACxC,KAAI,CAAC,WAAW,CAAC,YAAY,QAAQ,CACnC,QAAO,GAAG,WAAW;CAEvB,MAAM,SAAS,QAAQ,UAAU,WAAW;AAC5C,KAAI,CAAC,OAAO,QACV,QAAO,oBAAI,IAAI,MAAM,yBAAyB,gBAAgB,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC;AAEhG,QAAO,GAAG,OAAO,KAAgC;;;;;;;;;;;;;;ACtDnD,SAAgB,oBAAoB,SAAe,MAA6B;AAC9E,KAAI,CAAC,KACH;AAEF,KAAI,YAAY,KAAK,EAAE;EACrB,MAAM,UAAU,wBAAwB,KAAK;AAC7C,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,QAAQ,CAC9C,SAAQ,OAAO,KAAK,IAAI;QAErB;EACL,MAAM,UAAU;AAChB,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,QAAQ,CAC9C,SAAQ,OAAO,KAAK,oBAAoB,IAAI,CAAC;;;;;;;;;;AAgBnD,SAAS,oBAAoB,KAAgC;AAC3D,QAAO;EACL,OAAO,IAAI;EACX,SAAS,IAAI;EACb,SAAS,IAAI;EACb,cAAc,IAAI,YAAY;EAC9B,UAAU,IAAI;EACd,MAAM,IAAI;EACX;;;;;;;;;;;ACpCH,SAAgB,UAAU,OAAkC;AAC1D,QAAO,OAAO,OAAO,UAAU;;;;;;;;;;;AAYjC,SAAgB,iBAAiB,SAAwC;CACvE,MAAM,EAAE,UAAU,UAAU,UAAU,eAAe;CACrD,MAAM,iBAAiB,OAAO,QAAQ,SAAS,CAAC,QAAQ,GAAG,WAAW,UAAU,MAAM,CAAC;AAEvF,MAAK,MAAM,CAAC,MAAM,UAAU,eAC1B,yBAAwB;EACtB,SAAS;EACT,KAAK;EACL;EACA;EACA;EACA;EACD,CAAC;;;;;;;;;;;;AAoCN,SAAS,wBAAwB,SAA+C;CAC9E,MAAM,EAAE,UAAU,MAAM,KAAK,UAAU,eAAe;CACtD,MAAM,cAAc,IAAI,eAAe;AAEvC,UAAS,QACP,MACA,cACC,YAAkB;AACjB,sBAAoB,SAAS,IAAI,KAAK;AAEtC,MAAI,IAAI,UAAU;GAChB,MAAM,cAAc,OAAO,QAAQ,IAAI,SAAS,CAAC,QAAQ,GAAG,WAAW,UAAU,MAAM,CAAC;AAExF,QAAK,MAAM,CAAC,SAAS,aAAa,YAChC,yBAAwB;IACtB;IACA,KAAK;IACL,UAAU;IACV,MAAM;IACN,YAAY,CAAC,GAAG,YAAY,KAAK;IACjC;IACD,CAAC;AAGJ,OAAI,IAAI,QACN,SAAQ,cAAc,EAAE;OAExB,SAAQ,cAAc,GAAG,iCAAiC;;AAI9D,SAAO;UAEH;AACJ,WAAS,MAAM;GACb,MAAM,IAAI;GACV,aAAa,CAAC,GAAG,YAAY,KAAK;GAClC,SAAS,IAAI;GACb,YAAa,IAAI,cAAc,EAAE;GAClC;GAEJ;;;;;;;;;;;;;;;;;;;;;;AC/FH,SAAgB,aAAa,gBAAsC;AACjE,QAAO,EACL,MAAM,QAAQ,EAAE,KAAK,SAAS,cAA6B;EACzD,MAAM,iBAAiB,OAAO,aAAqC;AACjE,SAAM,mBAAmB,YAAY,UAAU,QAAQ;;AAEzD,QAAM,mBAAmB,gBAAgB,KAAK,eAAe;IAEhE;;;;;;;;;;;;;;AAmBH,eAAe,mBACb,aACA,KACA,cACe;CACf,eAAe,aAAa,OAA8B;AACxD,MAAI,SAAS,YAAY,QAAQ;AAC/B,SAAM,aAAa,IAAI;AACvB;;EAEF,MAAM,KAAK,YAAY;AACvB,MAAI,GACF,OAAM,GAAG,QAAQ,WAAW,aAAa,QAAQ,EAAE,CAAC;;AAIxD,OAAM,aAAa,EAAE;;;;;;;;;;;;;;;AC1CvB,eAAsB,cACpB,SAC6B;CAC7B,MAAM,SAAS,MAAM,cAAc,QAAQ,QAAQ,QAAQ,KAAK;CAEhE,MAAM,SAAS,aAAc,QAAQ,cAAc,EAAE,CAAkB;AAqCvE,QAAO,GAnCkB,EACvB,MAAM,QAAQ,SAAmC;EAE/C,MAAM,CAAC,WAAW,iBADH,iBAAiB,QAAQ,KAAK,CACH,MAAM,QAAQ,QAAQ;AAChE,MAAI,UACF,QAAO,IAAI,UAAU;EAGvB,MAAM,MAAM,cAAc;GACxB,MAAM;GACN;GACA,MAAM;IACJ,SAAS,QAAQ;IACjB,MAAM,QAAQ;IACd,SAAS,QAAQ;IAClB;GACF,CAAC;EAEF,MAAM,eAAe,QAAQ,YAAY,YAAY;EAErD,MAAM,CAAC,aAAa,MAAM,mBACxB,OAAO,QAAQ;GACR;GACL,SAAS;GACT,YAAY,QAAQ;GACrB,CAAC,CACH;AACD,MAAI,UACF,QAAO,IAAI,UAAU;AAGvB,SAAO,IAAI;IAEd,CAEiB;;;;;;;;;;;;;AAkBpB,eAAe,cACb,eACA,aACkC;AAClC,KAAI,CAAC,iBAAiB,CAAC,cAAc,OACnC,QAAO,EAAE;CAMX,MAAM,CAAC,aAAa,gBAAgB,MAJrB,mBAAmB;EAChC,MAAM,cAAc,QAAQ;EAC5B,QAAQ,cAAc;EACvB,CAAC,CAC+C,MAAM;AACvD,KAAI,eAAe,CAAC,aAClB,QAAO,EAAE;AAEX,QAAO,aAAa;;;;;ACnFtB,MAAM,mBAAmB;;;;;;;;;AAUzB,eAAsB,IACpB,SACe;CACf,MAAM,SAAS,iBAAiB;CAEhC,MAAM,CAAC,eAAe,UAAU,MAAM,aAAa,YAAY;EAC7D,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAM,iBAAiB,CAAC,CACxD,WAAW,QAAQ,KAAK,CACxB,QAAQ,QAAQ,QAAQ,CACxB,QAAQ,CACR,MAAM,CACN,OAAO,OAAO;GACb,UAAU;GACV,QAAQ;GACR,MAAM;GACP,CAAC;AAEJ,MAAI,QAAQ,YACV,SAAQ,MAAM,QAAQ,YAAY;EAGpC,MAAM,WAAwB,EAAE,KAAK,QAAW;EAEhD,MAAM,WAAW,MAAM,gBAAgB,QAAQ,SAAS;AAExD,MAAI,UAAU;AACZ,oBAAiB;IAAE;IAAU,UAAU;IAAS,YAAY,EAAE;IAAE;IAAU,CAAC;AAC3E,WAAQ,cAAc,GAAG,8BAA8B;;EAGzD,MAAM,OAAO,MAAM,QAAQ,YAAY;AAEvC,WAAS,KAAgC;AAEzC,MAAI,CAAC,SAAS,IACZ;EAGF,MAAM,CAAC,cAAc,WAAW,MAAM,cAAc;GAClD,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,MAAM,QAAQ;GACd,SAAS,QAAQ;GAClB,CAAC;AAEF,MAAI,aACF,QAAO;EAGT,MAAM,CAAC,gBAAgB,MAAM,QAAQ,QAAQ;GAC3C,MAAM,SAAS,IAAI;GACnB,aAAa,SAAS,IAAI;GAC1B,SAAS,SAAS,IAAI;GACtB,YAAY,SAAS,IAAI;GACzB,SAAS;GACV,CAAC;AAEF,SAAO;GACP;AAEF,KAAI,eAAe;AACjB,cAAY,eAAe,OAAO;AAClC;;AAGF,KAAI,OACF,aAAY,QAAQ,OAAO;;;;;;;;;;;;;;AAsB/B,eAAe,gBACb,UACiC;AACjC,KAAI,SAAS,SAAS,CACpB,QAAO,SAAS,EAAE,KAAK,UAAU,CAAC;AAEpC,KAAI,oBAAoB,QACtB,QAAO;AAET,KAAI,cAAc,SAAS,CACzB,QAAO;AAET,QAAO,2BAA2B;;;;;;;;;;;AAYpC,eAAe,4BAAiD;CAC9D,MAAM,uBAAuB;CAE7B,MAAM,CAAC,aAAa,gBAAgB,MAAM,YAAY;AACtD,KAAI,eAAe,CAAC,aAClB,QAAO,SAAS,EAAE,KAAK,sBAAsB,CAAC;AAIhD,QAAO,SAAS,EAAE,KADN,aAAa,OAAO,YAAY,sBACrB,CAAC;;;;;;;;;;;AAY1B,SAAS,SAAS,MAAqC;AACrD,KAAI,SAAS,KAAK,IAAI,CACpB,SAAQ,MAAM,QAAQ,KAAK,IAAI,CAAC;;;;;;;;;;;AAapC,SAAS,YAAY,OAAgB,QAA4C;AAC/E,KAAI,eAAe,MAAM,EAAE;AACzB,SAAO,MAAM,MAAM,QAAQ;AAC3B,UAAQ,KAAK,MAAM,SAAS;YACnB,iBAAiB,OAAO;AACjC,SAAO,MAAM,MAAM,QAAQ;AAC3B,UAAQ,KAAK,kBAAkB;QAC1B;AACL,SAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,UAAQ,KAAK,kBAAkB;;;;;;;;;;;;AC5KnC,SAAgB,QAGd,KAAiD;AACjD,QAAO,QAAQ,EAAE,GAAG,KAAK,EAAE,UAAU"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["match"],"sources":["../src/context/error.ts","../src/context/output.ts","../src/context/prompts.ts","../src/context/store.ts","../src/context/create-context.ts","../src/autoloader.ts","../src/runtime/args/zod.ts","../src/runtime/args/parser.ts","../src/runtime/args/register.ts","../src/runtime/register.ts","../src/runtime/runner.ts","../src/runtime/runtime.ts","../src/cli.ts","../src/command.ts","../src/compose.ts"],"sourcesContent":["import type { Tagged } from '@kidd-cli/utils/tag'\nimport { TAG, hasTag, withTag } from '@kidd-cli/utils/tag'\n\nimport { DEFAULT_EXIT_CODE } from '@/utils/constants.js'\n\nexport { DEFAULT_EXIT_CODE }\n\n/**\n * Plain data representation of a ContextError (no Error prototype).\n *\n * Useful for serializing error data without carrying the Error prototype chain,\n * for example when logging or forwarding errors across process boundaries.\n */\nexport type ContextErrorData = Tagged<\n {\n readonly code: string | undefined\n readonly exitCode: number\n readonly message: string\n },\n 'ContextError'\n>\n\n/**\n * An Error subtype carrying an exit code and optional error code.\n *\n * Created by {@link createContextError} and thrown by `ctx.fail()`.\n * The CLI boundary catches these to produce clean, user-facing error output\n * with the correct process exit code.\n */\nexport type ContextError = Error &\n Tagged<\n {\n readonly code: string | undefined\n readonly exitCode: number\n },\n 'ContextError'\n >\n\n/**\n * Create a ContextError with an exit code and optional error code.\n *\n * Used to surface user-facing CLI errors with clean messages.\n * The error carries a Symbol-based tag for reliable type-narrowing\n * via {@link isContextError}.\n *\n * @param message - Human-readable error message.\n * @param options - Optional error code and exit code overrides.\n * @returns A ContextError instance.\n */\nexport function createContextError(\n message: string,\n options?: { code?: string; exitCode?: number }\n): ContextError {\n const data = createContextErrorData(message, options)\n // Accepted exception: Error construction requires `new Error()` then property decoration.\n // The `as` cast and Object.defineProperty mutations are the only way to produce a\n // Tagged Error subtype without using a class.\n const error = new Error(data.message) as ContextError\n error.name = 'ContextError'\n // Intentional mutation: decorating an Error object with immutable properties.\n Object.defineProperty(error, TAG, { enumerable: false, value: 'ContextError', writable: false })\n Object.defineProperty(error, 'code', { enumerable: true, value: data.code, writable: false })\n Object.defineProperty(error, 'exitCode', {\n enumerable: true,\n value: data.exitCode,\n writable: false,\n })\n return error\n}\n\n/**\n * Type guard that narrows an unknown value to {@link ContextError}.\n *\n * Checks that the value is an Error instance whose `[TAG]` property\n * equals `'ContextError'`, which distinguishes CLI-layer errors from\n * unexpected exceptions.\n *\n * @param error - The value to check.\n * @returns `true` when the value is a ContextError.\n */\nexport function isContextError(error: unknown): error is ContextError {\n if (error instanceof Error) {\n return hasTag(error, 'ContextError')\n }\n return false\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveExitCode(options: { code?: string; exitCode?: number } | undefined): number {\n if (options && options.exitCode !== undefined) {\n return options.exitCode\n }\n return DEFAULT_EXIT_CODE\n}\n\nfunction resolveCode(\n options: { code?: string; exitCode?: number } | undefined\n): string | undefined {\n if (options && options.code !== undefined) {\n return options.code\n }\n return undefined\n}\n\nfunction createContextErrorData(\n message: string,\n options?: { code?: string; exitCode?: number }\n): ContextErrorData {\n return withTag(\n {\n code: resolveCode(options),\n exitCode: resolveExitCode(options),\n message,\n },\n 'ContextError'\n )\n}\n","import { jsonStringify } from '@kidd-cli/utils/json'\n\nimport type { Output, OutputOptions } from './types.js'\n\n/**\n * Create the structured output methods for a context.\n *\n * @private\n * @param stream - The writable stream to write output to.\n * @returns An Output instance backed by the given stream.\n */\nexport function createContextOutput(stream: NodeJS.WriteStream): Output {\n return {\n markdown(content: string): void {\n stream.write(`${content}\\n`)\n },\n raw(content: string): void {\n stream.write(content)\n },\n table(rows: Record<string, unknown>[], options?: OutputOptions): void {\n if (options && options.json) {\n const [, json] = jsonStringify(rows, { pretty: true })\n stream.write(`${json}\\n`)\n return\n }\n if (rows.length === 0) {\n return\n }\n const [firstRow] = rows\n if (!firstRow) {\n return\n }\n writeTableToStream(stream, rows, Object.keys(firstRow))\n },\n write(data: unknown, options?: OutputOptions): void {\n if ((options && options.json) || (typeof data === 'object' && data !== null)) {\n const [, json] = jsonStringify(data, { pretty: true })\n stream.write(`${json}\\n`)\n } else {\n stream.write(`${String(data)}\\n`)\n }\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format an unknown value as a string for table cell display.\n *\n * @private\n * @param val - The value to format.\n * @returns The stringified value, or empty string for undefined.\n */\nfunction formatStringValue(val: unknown): string {\n if (val === undefined) {\n return ''\n }\n return String(val)\n}\n\n/**\n * Options for creating a table header string.\n */\ninterface TableHeaderOptions {\n keys: string[]\n widths: (number | undefined)[]\n}\n\n/**\n * Create a padded header row string from column keys and widths.\n *\n * @private\n * @param options - The keys and column widths.\n * @returns A formatted header string.\n */\nfunction createTableHeader(options: TableHeaderOptions): string {\n const { keys, widths } = options\n return keys\n .map((key, idx) => {\n const width = widths[idx]\n if (width === undefined) {\n return key\n }\n return key.padEnd(width)\n })\n .join(' ')\n}\n\n/**\n * Options for creating a table row string.\n */\ninterface TableRowOptions {\n row: Record<string, unknown>\n keys: string[]\n widths: (number | undefined)[]\n}\n\n/**\n * Create a padded row string from a data record, column keys, and widths.\n *\n * @private\n * @param options - The row data, keys, and column widths.\n * @returns A formatted row string.\n */\nfunction createTableRow(options: TableRowOptions): string {\n const { row, keys, widths } = options\n return keys\n .map((key, idx) => {\n const width = widths[idx]\n const val = formatStringValue(row[key])\n if (width === undefined) {\n return val\n }\n return val.padEnd(width)\n })\n .join(' ')\n}\n\n/**\n * Compute the maximum column width for each key across all rows.\n *\n * @private\n * @param rows - The data rows.\n * @param keys - The column keys.\n * @returns An array of column widths.\n */\nfunction computeColumnWidths(rows: Record<string, unknown>[], keys: string[]): number[] {\n return keys.map((key) => {\n const values = rows.map((row) => formatStringValue(row[key]))\n return Math.max(key.length, ...values.map((val) => val.length))\n })\n}\n\n/**\n * Write a formatted table (header, separator, rows) to a writable stream.\n *\n * @private\n * @param stream - The writable stream.\n * @param rows - The data rows.\n * @param keys - The column keys.\n */\nfunction writeTableToStream(\n stream: NodeJS.WriteStream,\n rows: Record<string, unknown>[],\n keys: string[]\n): void {\n const widths = computeColumnWidths(rows, keys)\n const header = createTableHeader({ keys, widths })\n const separator = widths.map((width) => '-'.repeat(width)).join(' ')\n const dataRows = rows.map((row) => createTableRow({ keys, row, widths }))\n const content = [header, separator, ...dataRows].join('\\n')\n stream.write(`${content}\\n`)\n}\n","import * as clack from '@clack/prompts'\n\nimport { DEFAULT_EXIT_CODE, createContextError } from './error.js'\nimport type { Prompts } from './types.js'\n\n/**\n * Create the interactive prompt methods for a context.\n *\n * @returns A Prompts instance backed by clack.\n */\nexport function createContextPrompts(): Prompts {\n return {\n async confirm(opts): Promise<boolean> {\n const result = await clack.confirm(opts)\n return unwrapCancelSignal(result)\n },\n async multiselect<Type>(opts: Parameters<Prompts['multiselect']>[0]): Promise<Type[]> {\n const result = await clack.multiselect<Type>(\n opts as Parameters<typeof clack.multiselect<Type>>[0]\n )\n return unwrapCancelSignal(result)\n },\n async password(opts): Promise<string> {\n const result = await clack.password(opts)\n return unwrapCancelSignal(result)\n },\n async select<Type>(opts: Parameters<Prompts['select']>[0]): Promise<Type> {\n const result = await clack.select<Type>(opts as Parameters<typeof clack.select<Type>>[0])\n return unwrapCancelSignal(result)\n },\n async text(opts): Promise<string> {\n const result = await clack.text(opts)\n return unwrapCancelSignal(result)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Unwrap a prompt result that may be a cancel symbol.\n *\n * If the user cancelled (Ctrl-C), throws a ContextError. Otherwise returns\n * the typed result value.\n *\n * @private\n * @param result - The raw prompt result (value or cancel symbol).\n * @returns The unwrapped typed value.\n */\nfunction unwrapCancelSignal<Type>(result: Type | symbol): Type {\n if (clack.isCancel(result)) {\n clack.cancel('Operation cancelled.')\n // Accepted exception: prompt cancellation must propagate as an unwind.\n // The runner catches the thrown ContextError at the CLI boundary.\n throw createContextError('Prompt cancelled by user', {\n code: 'PROMPT_CANCELLED',\n exitCode: DEFAULT_EXIT_CODE,\n })\n }\n return result as Type\n}\n","import type { Store } from './types.js'\n\n/**\n * Create an in-memory key-value store.\n *\n * @private\n * @returns A Store instance backed by a Map.\n */\nexport function createMemoryStore<TMap extends Record<string, unknown>>(): Store<TMap> {\n const map = new Map<string, unknown>()\n\n return {\n clear(): void {\n map.clear()\n },\n delete(key: string): boolean {\n return map.delete(key)\n },\n get<Key extends Extract<keyof TMap, string>>(key: Key): TMap[Key] | undefined {\n return map.get(key) as TMap[Key] | undefined\n },\n has(key: string): boolean {\n return map.has(key)\n },\n set<Key extends Extract<keyof TMap, string>>(key: Key, value: TMap[Key]): void {\n map.set(key, value)\n },\n }\n}\n","import * as clack from '@clack/prompts'\n\nimport { createCliLogger } from '@/lib/logger.js'\nimport type { CliLogger } from '@/lib/logger.js'\nimport type { AnyRecord, KiddStore, Merge } from '@/types.js'\n\nimport { createContextError } from './error.js'\nimport { createContextOutput } from './output.js'\nimport { createContextPrompts } from './prompts.js'\nimport { createMemoryStore } from './store.js'\nimport type { Context, Meta, Output, Prompts, Spinner, Store, StoreMap } from './types.js'\n\n/**\n * Options for creating a {@link Context} instance via {@link createContext}.\n *\n * Carries the parsed args, validated config, and CLI metadata needed to\n * assemble a fully-wired context. An optional `logger` override allows\n * callers to inject a custom {@link CliLogger}; when omitted a default\n * @clack/prompts-backed instance is used.\n */\nexport interface CreateContextOptions<TArgs extends AnyRecord, TConfig extends AnyRecord> {\n readonly args: TArgs\n readonly config: TConfig\n readonly meta: { readonly name: string; readonly version: string; readonly command: string[] }\n readonly logger?: CliLogger\n readonly output?: NodeJS.WriteStream\n}\n\n/**\n * Create the {@link Context} object threaded through middleware and command handlers.\n *\n * Assembles logger, spinner, output, store, prompts, and meta from\n * the provided options into a single immutable context. Each sub-system is\n * constructed via its own factory so this function remains a lean orchestrator.\n *\n * @param options - Args, config, and meta for the current invocation.\n * @returns A fully constructed Context.\n */\nexport function createContext<TArgs extends AnyRecord, TConfig extends AnyRecord>(\n options: CreateContextOptions<TArgs, TConfig>\n): Context<TArgs, TConfig> {\n const ctxLogger: CliLogger = options.logger ?? createCliLogger()\n const ctxSpinner: Spinner = clack.spinner()\n const ctxOutput: Output = createContextOutput(options.output ?? process.stdout)\n const ctxStore: Store<Merge<KiddStore, StoreMap>> = createMemoryStore()\n const ctxPrompts: Prompts = createContextPrompts()\n const ctxMeta: Meta = {\n command: options.meta.command,\n name: options.meta.name,\n version: options.meta.version,\n }\n\n // Middleware-augmented properties (e.g. `auth`) are added at runtime.\n // See `decorateContext` — they are intentionally absent here.\n return {\n args: options.args as Context<TArgs, TConfig>['args'],\n config: options.config as Context<TArgs, TConfig>['config'],\n fail(message: string, failOptions?: { code?: string; exitCode?: number }): never {\n // Accepted exception: ctx.fail() is typed `never` and caught by the CLI boundary.\n // This is the framework's halt mechanism — the runner catches the thrown ContextError.\n throw createContextError(message, failOptions)\n },\n logger: ctxLogger,\n meta: ctxMeta as Context<TArgs, TConfig>['meta'],\n output: ctxOutput,\n prompts: ctxPrompts,\n spinner: ctxSpinner,\n store: ctxStore,\n } as Context<TArgs, TConfig>\n}\n","import type { Dirent } from 'node:fs'\nimport { readdir } from 'node:fs/promises'\nimport { basename, extname, join, resolve } from 'node:path'\n\nimport { isPlainObject, isString } from '@kidd-cli/utils/fp'\nimport { hasTag, withTag } from '@kidd-cli/utils/tag'\n\nimport type { AutoloadOptions, Command, CommandMap } from './types.js'\n\nconst VALID_EXTENSIONS = new Set(['.ts', '.js', '.mjs'])\nconst INDEX_NAME = 'index'\n\n/**\n * Scan a directory for command files and produce a CommandMap.\n *\n * @param options - Autoload configuration (directory override, etc.).\n * @returns A promise resolving to a CommandMap built from the directory tree.\n */\nexport async function autoload(options?: AutoloadOptions): Promise<CommandMap> {\n const dir = resolveDir(options)\n const entries = await readdir(dir, { withFileTypes: true })\n\n const fileEntries = entries.filter(isCommandFile)\n const dirEntries = entries.filter(isCommandDir)\n\n const fileResults = await Promise.all(\n fileEntries.map(async (entry): Promise<[string, Command] | undefined> => {\n const cmd = await importCommand(join(dir, entry.name))\n if (!cmd) {\n return undefined\n }\n return [deriveCommandName(entry), cmd]\n })\n )\n\n const dirResults = await Promise.all(\n dirEntries.map((entry) => buildDirCommand(join(dir, entry.name)))\n )\n\n const allResults = [...fileResults, ...dirResults]\n const validPairs = allResults.filter((pair): pair is [string, Command] => pair !== undefined)\n\n const commandMap: CommandMap = Object.fromEntries(validPairs)\n return commandMap\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the target directory from autoload options.\n *\n * @private\n * @param options - Optional autoload configuration.\n * @returns The resolved absolute directory path.\n */\nfunction resolveDir(options?: AutoloadOptions): string {\n if (options && isString(options.dir)) {\n return resolve(options.dir)\n }\n return resolve('./commands')\n}\n\n/**\n * Scan a subdirectory and assemble it as a parent command with subcommands.\n *\n * If the directory contains an `index.ts`/`index.js`, that becomes the parent\n * handler. Otherwise a handler-less group command is created that demands a\n * subcommand.\n *\n * @private\n * @param dir - Absolute path to the subdirectory.\n * @returns A tuple of [name, Command] or undefined if the directory is empty.\n */\nasync function buildDirCommand(dir: string): Promise<[string, Command] | undefined> {\n const name = basename(dir)\n const dirEntries = await readdir(dir, { withFileTypes: true })\n const subCommands = await buildSubCommands(dir, dirEntries)\n const indexFile = findIndexInEntries(dirEntries)\n\n if (indexFile) {\n const parentCommand = await importCommand(join(dir, indexFile.name))\n if (parentCommand) {\n return [name, withTag({ ...parentCommand, commands: subCommands }, 'Command')]\n }\n }\n\n if (Object.keys(subCommands).length === 0) {\n return undefined\n }\n\n return [name, withTag({ commands: subCommands }, 'Command')]\n}\n\n/**\n * Build subcommands from already-read directory entries, avoiding a redundant readdir call.\n *\n * @private\n * @param dir - Absolute path to the directory.\n * @param entries - Pre-read directory entries.\n * @returns A CommandMap built from the entries.\n */\nasync function buildSubCommands(dir: string, entries: Dirent[]): Promise<CommandMap> {\n const fileEntries = entries.filter(isCommandFile)\n const dirEntries = entries.filter(isCommandDir)\n\n const fileResults = await Promise.all(\n fileEntries.map(async (entry): Promise<[string, Command] | undefined> => {\n const cmd = await importCommand(join(dir, entry.name))\n if (!cmd) {\n return undefined\n }\n return [deriveCommandName(entry), cmd]\n })\n )\n\n const dirResults = await Promise.all(\n dirEntries.map((entry) => buildDirCommand(join(dir, entry.name)))\n )\n\n const allResults = [...fileResults, ...dirResults]\n const validPairs = allResults.filter((pair): pair is [string, Command] => pair !== undefined)\n\n const commandMap: CommandMap = Object.fromEntries(validPairs)\n return commandMap\n}\n\n/**\n * Find the index file (index.ts or index.js) in pre-read directory entries.\n *\n * @private\n * @param entries - Pre-read directory entries.\n * @returns The index file's Dirent or undefined.\n */\nfunction findIndexInEntries(entries: Dirent[]): Dirent | undefined {\n return entries.find(\n (entry) =>\n entry.isFile() &&\n VALID_EXTENSIONS.has(extname(entry.name)) &&\n basename(entry.name, extname(entry.name)) === INDEX_NAME\n )\n}\n\n/**\n * Dynamically import a file and validate that its default export is a Command.\n *\n * @private\n * @param filePath - Absolute path to the file to import.\n * @returns The Command if valid, or undefined.\n */\nasync function importCommand(filePath: string): Promise<Command | undefined> {\n const mod: unknown = await import(filePath)\n if (isCommandExport(mod)) {\n return mod.default\n }\n return undefined\n}\n\n/**\n * Check whether a module's default export is a Command object.\n *\n * ES module namespace objects have a null prototype, so isPlainObject\n * rejects them. We only need to verify the namespace is a non-null\n * object with a default export that is a plain Command object.\n *\n * @private\n * @param mod - The imported module to inspect.\n * @returns True when the module has a Command as its default export.\n */\nfunction isCommandExport(mod: unknown): mod is { default: Command } {\n if (typeof mod !== 'object' || mod === null) {\n return false\n }\n if (!('default' in mod)) {\n return false\n }\n const def: unknown = mod.default\n if (!isPlainObject(def)) {\n return false\n }\n return hasTag(def, 'Command')\n}\n\n/**\n * Derive a command name from a directory entry by stripping its extension.\n *\n * @private\n * @param entry - The directory entry to derive the name from.\n * @returns The file name without its extension.\n */\nfunction deriveCommandName(entry: Dirent): string {\n return basename(entry.name, extname(entry.name))\n}\n\n/**\n * Predicate: entry is a command file (.ts/.js, not index, not _/. prefixed).\n *\n * @private\n * @param entry - The directory entry to check.\n * @returns True when the entry is a valid command file.\n */\nfunction isCommandFile(entry: Dirent): boolean {\n if (!entry.isFile()) {\n return false\n }\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) {\n return false\n }\n if (!VALID_EXTENSIONS.has(extname(entry.name))) {\n return false\n }\n return deriveCommandName(entry) !== INDEX_NAME\n}\n\n/**\n * Predicate: entry is a scannable command directory (not _/. prefixed).\n *\n * @private\n * @param entry - The directory entry to check.\n * @returns True when the entry is a valid command directory.\n */\nfunction isCommandDir(entry: Dirent): boolean {\n if (!entry.isDirectory()) {\n return false\n }\n return !entry.name.startsWith('_') && !entry.name.startsWith('.')\n}\n","import { match } from 'ts-pattern'\nimport type { Options as YargsOptions } from 'yargs'\nimport type { z } from 'zod'\n\n/**\n * Type guard that checks whether a value is a zod object schema.\n *\n * @param args - The value to check.\n * @returns True when args is a ZodObject.\n */\nexport function isZodSchema(args: unknown): args is z.ZodObject<z.ZodRawShape> {\n return (\n typeof args === 'object' &&\n args !== null &&\n '_def' in args &&\n typeof (args as { _def: unknown })._def === 'object' &&\n (args as { _def: { type?: string } })._def !== null &&\n (args as { _def: { type?: string } })._def.type === 'object'\n )\n}\n\n/**\n * Convert an entire zod object schema into a record of yargs options.\n *\n * @param schema - The zod object schema.\n * @returns A record mapping field names to yargs option definitions.\n */\nexport function zodSchemaToYargsOptions(\n schema: z.ZodObject<z.ZodRawShape>\n): Record<string, YargsOptions> {\n const shape = schema.shape as Record<string, z.ZodTypeAny>\n return Object.fromEntries(\n Object.entries(shape).map(([key, fieldSchema]): [string, YargsOptions] => [\n key,\n getZodTypeOption(fieldSchema),\n ])\n )\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\ninterface ZodDef {\n type?: string\n innerType?: z.ZodTypeAny\n defaultValue?: unknown\n}\n\ninterface ZodTypeInfo {\n defaultValue: unknown\n inner: z.ZodTypeAny\n isOptional: boolean\n}\n\ninterface UnwrapOptions {\n def: ZodDef\n current: z.ZodTypeAny\n defaultValue: unknown\n}\n\ninterface UnwrapRecursiveOptions {\n current: z.ZodTypeAny\n isOptional: boolean\n defaultValue: unknown\n}\n\n/**\n * Extract a default value from a zod definition, falling back to the provided value.\n *\n * @private\n * @param def - The zod definition to inspect.\n * @param fallback - Value to return when no default is defined.\n * @returns The resolved default value.\n */\nfunction resolveDefaultValue(def: ZodDef, fallback: unknown): unknown {\n if (def.defaultValue !== undefined) {\n return def.defaultValue\n }\n return fallback\n}\n\n/**\n * Unwrap a ZodOptional type, recursing into the inner type.\n *\n * @private\n * @param options - The unwrap options containing def, current type, and default value.\n * @returns Unwrapped type information.\n */\nfunction unwrapOptional(options: UnwrapOptions): ZodTypeInfo {\n const { def, current, defaultValue } = options\n if (def.innerType) {\n return unwrapZodTypeRecursive({ current: def.innerType, defaultValue, isOptional: true })\n }\n return { defaultValue, inner: current, isOptional: true }\n}\n\n/**\n * Unwrap a ZodDefault type, resolving its default value and recursing.\n *\n * @private\n * @param options - The unwrap options containing def, current type, and default value.\n * @returns Unwrapped type information with the resolved default.\n */\nfunction unwrapDefault(options: UnwrapOptions): ZodTypeInfo {\n const { def, current, defaultValue } = options\n const newDefault = resolveDefaultValue(def, defaultValue)\n if (def.innerType) {\n return unwrapZodTypeRecursive({\n current: def.innerType,\n defaultValue: newDefault,\n isOptional: true,\n })\n }\n return { defaultValue: newDefault, inner: current, isOptional: true }\n}\n\n/**\n * Recursively unwrap optional and default wrappers from a zod type.\n *\n * @private\n * @param options - The recursive unwrap options containing current type, optionality flag, and default value.\n * @returns The fully unwrapped type information.\n */\nfunction unwrapZodTypeRecursive(options: UnwrapRecursiveOptions): ZodTypeInfo {\n const { current, isOptional, defaultValue } = options\n const def = (current as { _def: ZodDef })._def\n if (def.type === 'optional') {\n return unwrapOptional({ current, def, defaultValue })\n }\n if (def.type === 'default') {\n return unwrapDefault({ current, def, defaultValue })\n }\n return { defaultValue, inner: current, isOptional }\n}\n\n/**\n * Unwrap a zod schema to extract its base type, optionality, and default value.\n *\n * @private\n * @param schema - The zod type to unwrap.\n * @returns The unwrapped type information.\n */\nfunction unwrapZodType(schema: z.ZodTypeAny): ZodTypeInfo {\n return unwrapZodTypeRecursive({ current: schema, defaultValue: undefined, isOptional: false })\n}\n\n/**\n * Map a zod type name to a yargs option type string.\n *\n * @private\n * @param typeName - The zod type name (e.g. 'string', 'number').\n * @returns The corresponding yargs type.\n */\nfunction resolveZodYargsType(\n typeName: string | undefined\n): 'string' | 'number' | 'boolean' | 'array' {\n return match(typeName)\n .with('string', () => 'string' as const)\n .with('number', () => 'number' as const)\n .with('boolean', () => 'boolean' as const)\n .with('array', () => 'array' as const)\n .otherwise(() => 'string' as const)\n}\n\n/**\n * Build a base yargs option from a zod schema's description and default.\n *\n * @private\n * @param inner - The unwrapped zod schema instance.\n * @param defaultValue - The resolved default value.\n * @returns A partial yargs option object.\n */\nfunction buildBaseOption(inner: z.ZodTypeAny, defaultValue: unknown): YargsOptions {\n const base: YargsOptions = {}\n const { description } = inner as { description?: string }\n if (description) {\n base.describe = description\n }\n if (defaultValue !== undefined) {\n base.default = defaultValue\n }\n return base\n}\n\n/**\n * Convert a single zod field schema into a complete yargs option definition.\n *\n * @private\n * @param schema - A single zod field type.\n * @returns A complete yargs option object.\n */\nfunction getZodTypeOption(schema: z.ZodTypeAny): YargsOptions {\n const { inner, isOptional, defaultValue } = unwrapZodType(schema)\n const innerDef = (inner as { _def: ZodDef })._def\n const base = {\n ...buildBaseOption(inner, defaultValue),\n type: resolveZodYargsType(innerDef.type),\n }\n if (!isOptional) {\n return { ...base, demandOption: true }\n }\n return base\n}\n","import { err, ok } from '@kidd-cli/utils/fp'\nimport type { Result } from '@kidd-cli/utils/fp'\nimport { formatZodIssues } from '@kidd-cli/utils/validate'\n\nimport type { Command } from '@/types.js'\n\nimport type { ArgsParser } from '../types.js'\nimport { isZodSchema } from './zod.js'\n\n/**\n * Create an args parser that cleans and validates raw parsed arguments.\n *\n * Captures the argument definition in a closure and returns an ArgsParser\n * whose `parse` method strips yargs-internal keys and validates against\n * a zod schema when one is defined.\n *\n * @param argsDef - The argument definition from the command.\n * @returns An ArgsParser with a parse method.\n */\nexport function createArgsParser(argsDef: Command['args']): ArgsParser {\n return {\n parse(rawArgs: Record<string, unknown>): Result<Record<string, unknown>, Error> {\n const cleaned = cleanParsedArgs(rawArgs)\n return validateArgs(argsDef, cleaned)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Strip yargs-internal keys (`_`, `$0`) and camelCase-duplicated hyphenated keys\n * from a parsed argv record, returning only user-defined arguments.\n *\n * @private\n * @param argv - Raw parsed argv from yargs.\n * @returns A cleaned record containing only user-defined arguments.\n */\nfunction cleanParsedArgs(argv: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(argv).filter(([key]) => key !== '_' && key !== '$0' && !key.includes('-'))\n )\n}\n\n/**\n * Validate parsed arguments against a zod schema when one is defined.\n *\n * If the command uses yargs-native args (no zod schema), the parsed args are\n * returned as-is. When a zod schema is present, validation is performed and\n * a Result error is returned on failure.\n *\n * @private\n * @param argsDef - The argument definition from the command.\n * @param parsedArgs - The cleaned parsed arguments.\n * @returns A Result containing validated arguments (zod-parsed when applicable).\n */\nfunction validateArgs(\n argsDef: Command['args'],\n parsedArgs: Record<string, unknown>\n): Result<Record<string, unknown>, Error> {\n if (!argsDef || !isZodSchema(argsDef)) {\n return ok(parsedArgs)\n }\n const result = argsDef.safeParse(parsedArgs)\n if (!result.success) {\n return err(new Error(`Invalid arguments:\\n ${formatZodIssues(result.error.issues).message}`))\n }\n return ok(result.data as Record<string, unknown>)\n}\n","import type { Argv, Options as YargsOptions } from 'yargs'\n\nimport type { Command, YargsArgDef } from '@/types.js'\n\nimport { isZodSchema, zodSchemaToYargsOptions } from './zod.js'\n\n/**\n * Register argument definitions on a yargs builder.\n *\n * Accepts either a zod object schema or a record of yargs-native arg definitions\n * and wires them as yargs options on the given builder instance.\n *\n * @param builder - The yargs Argv instance to register options on.\n * @param args - Argument definitions from a Command.\n */\nexport function registerCommandArgs(builder: Argv, args: Command['args']): void {\n if (!args) {\n return\n }\n if (isZodSchema(args)) {\n const options = zodSchemaToYargsOptions(args)\n for (const [key, opt] of Object.entries(options)) {\n builder.option(key, opt)\n }\n } else {\n for (const [key, def] of Object.entries(args)) {\n builder.option(key, yargsArgDefToOption(def))\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a yargs-native arg definition into a yargs option object.\n *\n * @private\n * @param def - The yargs arg definition.\n * @returns A yargs option object.\n */\nfunction yargsArgDefToOption(def: YargsArgDef): YargsOptions {\n return {\n alias: def.alias,\n choices: def.choices,\n default: def.default,\n demandOption: def.required ?? false,\n describe: def.description,\n type: def.type,\n }\n}\n","import { hasTag } from '@kidd-cli/utils/tag'\nimport type { Argv } from 'yargs'\n\nimport type { Context } from '@/context/types.js'\nimport type { Command, CommandMap, Middleware } from '@/types.js'\n\nimport { registerCommandArgs } from './args/index.js'\nimport type { ResolvedCommand, ResolvedRef } from './types.js'\n\n/**\n * Type guard that checks whether a value is a Command object.\n *\n * @param value - The value to test.\n * @returns True when the value has `[TAG] === 'Command'`.\n */\nexport function isCommand(value: unknown): value is Command {\n return hasTag(value, 'Command')\n}\n\n/**\n * Register all commands from a CommandMap on a yargs instance.\n *\n * Iterates over the command map, filters for valid Command objects,\n * and recursively registers each command (including subcommands) on\n * the provided yargs Argv instance.\n *\n * @param options - Registration options including the command map, yargs instance, and resolution ref.\n */\nexport function registerCommands(options: RegisterCommandsOptions): void {\n const { instance, commands, resolved, parentPath } = options\n const commandEntries = Object.entries(commands).filter((pair): pair is [string, Command] =>\n isCommand(pair[1])\n )\n\n for (const [name, entry] of commandEntries) {\n registerResolvedCommand({\n builder: instance,\n cmd: entry,\n instance,\n name,\n parentPath,\n resolved,\n })\n }\n}\n\nexport type { ResolvedCommand, ResolvedRef } from './types.js'\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\ninterface RegisterResolvedCommandOptions {\n builder: Argv\n cmd: Command\n instance: Argv\n name: string\n parentPath: string[]\n resolved: ResolvedRef\n}\n\ninterface RegisterCommandsOptions {\n commands: CommandMap\n instance: Argv\n parentPath: string[]\n resolved: ResolvedRef\n}\n\n/**\n * Register a single resolved command (and its subcommands) with yargs.\n *\n * Sets up the yargs command handler, wires argument definitions, and\n * recursively registers any nested subcommands. On match, stores the\n * resolved handler and command path in the shared ref.\n *\n * @private\n * @param options - Command registration context.\n */\nfunction registerResolvedCommand(options: RegisterResolvedCommandOptions): void {\n const { instance, name, cmd, resolved, parentPath } = options\n const description = cmd.description ?? ''\n\n instance.command(\n name,\n description,\n (builder: Argv) => {\n registerCommandArgs(builder, cmd.args)\n\n if (cmd.commands) {\n const subCommands = Object.entries(cmd.commands).filter((pair): pair is [string, Command] =>\n isCommand(pair[1])\n )\n\n for (const [subName, subEntry] of subCommands) {\n registerResolvedCommand({\n builder,\n cmd: subEntry,\n instance: builder,\n name: subName,\n parentPath: [...parentPath, name],\n resolved,\n })\n }\n\n if (cmd.handler) {\n builder.demandCommand(0)\n } else {\n builder.demandCommand(1, 'You must specify a subcommand.')\n }\n }\n\n return builder\n },\n () => {\n // Intentional mutation: yargs callback model requires mutable ref capture.\n // The `as` casts are accepted exceptions — generic handler/middleware types\n // Cannot be narrowed further inside the yargs callback boundary.\n resolved.ref = {\n args: cmd.args,\n commandPath: [...parentPath, name],\n handler: cmd.handler as ((ctx: Context) => Promise<void> | void) | undefined,\n middleware: (cmd.middleware ?? []) as Middleware[],\n }\n }\n )\n}\n","import type { Context } from '@/context/types.js'\nimport type { Middleware } from '@/types.js'\n\nimport type { Runner } from './types.js'\n\n/**\n * Create a runner that executes root and command middleware chains.\n *\n * Root middleware wraps the command middleware chain, which in turn wraps\n * the command handler — producing a nested onion lifecycle:\n *\n * ```\n * root middleware start →\n * command middleware start →\n * handler\n * command middleware end\n * root middleware end\n * ```\n *\n * @param rootMiddleware - Root-level middleware from `cli({ middleware })`.\n * @returns A Runner with an execute method.\n */\nexport function createRunner(rootMiddleware: Middleware[]): Runner {\n return {\n async execute({ ctx, handler, middleware }): Promise<void> {\n const commandHandler = async (innerCtx: Context): Promise<void> => {\n await runMiddlewareChain(middleware, innerCtx, handler)\n }\n await runMiddlewareChain(rootMiddleware, ctx, commandHandler)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a middleware chain followed by a final handler.\n *\n * Runs each middleware in order, passing `ctx` and a `next` callback.\n * When all middleware have called `next()`, the final handler is invoked.\n * A middleware can short-circuit by not calling `next()`.\n *\n * @private\n * @param middlewares - Ordered array of middleware to execute.\n * @param ctx - The context object threaded through middleware and handler.\n * @param finalHandler - The command handler to invoke after all middleware.\n */\nasync function runMiddlewareChain(\n middlewares: Middleware[],\n ctx: Context,\n finalHandler: (ctx: Context) => Promise<void> | void\n): Promise<void> {\n async function executeChain(index: number): Promise<void> {\n if (index >= middlewares.length) {\n await finalHandler(ctx)\n return\n }\n const mw = middlewares[index]\n if (mw) {\n await mw.handler(ctx, () => executeChain(index + 1))\n }\n }\n\n await executeChain(0)\n}\n","import { attemptAsync, err, ok } from '@kidd-cli/utils/fp'\nimport type { AsyncResult } from '@kidd-cli/utils/fp'\nimport type { z } from 'zod'\n\nimport { createContext } from '@/context/index.js'\nimport type { Context } from '@/context/types.js'\nimport { createConfigClient } from '@/lib/config/index.js'\nimport type { CliConfigOptions, Middleware } from '@/types.js'\n\nimport { createArgsParser } from './args/index.js'\nimport { createRunner } from './runner.js'\nimport type { Runtime, RuntimeOptions } from './types.js'\n\n/**\n * Create a runtime that orchestrates config loading and middleware execution.\n *\n * Loads config up front, then captures it in a closure alongside a runner.\n * The returned `runtime.execute` method handles arg parsing, context creation,\n * and middleware chain execution for each command invocation.\n *\n * @param options - Runtime configuration including name, version, config, and middleware.\n * @returns An AsyncResult containing the runtime or an error.\n */\nexport async function createRuntime<TSchema extends z.ZodType>(\n options: RuntimeOptions<TSchema>\n): AsyncResult<Runtime, Error> {\n const config = await resolveConfig(options.config, options.name)\n\n const middleware: Middleware[] = options.middleware ?? []\n const runner = createRunner(middleware)\n\n const runtime: Runtime = {\n async execute(command): AsyncResult<void, Error> {\n const parser = createArgsParser(command.args)\n const [argsError, validatedArgs] = parser.parse(command.rawArgs)\n if (argsError) {\n return err(argsError)\n }\n\n const ctx = createContext({\n args: validatedArgs,\n config,\n meta: {\n command: [...command.commandPath],\n name: options.name,\n version: options.version,\n },\n })\n\n const finalHandler = command.handler ?? (async () => {})\n\n // Accepted exception: generic context assembly requires type assertions.\n // The generics are validated at the createContext call site.\n const [execError] = await attemptAsync(() =>\n runner.execute({\n ctx: ctx as Context,\n handler: finalHandler as (ctx: Context) => Promise<void> | void,\n middleware: command.middleware,\n })\n )\n if (execError) {\n return err(execError)\n }\n\n return ok()\n },\n }\n\n return ok(runtime)\n}\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Load and validate a config file via the config client.\n *\n * Returns the validated config record or an empty object when no config\n * options are provided or when loading fails.\n *\n * @private\n * @param configOptions - Config loading options with schema and optional name override.\n * @param defaultName - Fallback config file name derived from the CLI name.\n * @returns The loaded config record or an empty object.\n */\nasync function resolveConfig<TSchema extends z.ZodType>(\n configOptions: CliConfigOptions<TSchema> | undefined,\n defaultName: string\n): Promise<Record<string, unknown>> {\n if (!configOptions || !configOptions.schema) {\n return {}\n }\n const client = createConfigClient({\n name: configOptions.name ?? defaultName,\n schema: configOptions.schema,\n })\n const [configError, configResult] = await client.load()\n if (configError || !configResult) {\n return {}\n }\n // Accepted exception: configResult.config is generic TOutput from zod schema.\n // The cast bridges the generic boundary to the internal Record type.\n return configResult.config as Record<string, unknown>\n}\n","import { resolve } from 'node:path'\n\nimport { loadConfig } from '@kidd-cli/config/loader'\nimport { P, attemptAsync, isPlainObject, isString, match } from '@kidd-cli/utils/fp'\nimport yargs from 'yargs'\nimport type { z } from 'zod'\n\nimport { DEFAULT_EXIT_CODE, isContextError } from '@/context/index.js'\nimport { createCliLogger } from '@/lib/logger.js'\nimport type { CliOptions, CommandMap } from '@/types.js'\n\nimport { autoload } from './autoloader.js'\nimport { createRuntime, registerCommands } from './runtime/index.js'\nimport type { ResolvedRef } from './runtime/index.js'\n\nconst ARGV_SLICE_START = 2\n\n/**\n * Bootstrap and run the CLI application.\n *\n * Parses argv, resolves the matched command, loads config, runs the\n * middleware chain, and invokes the command handler.\n *\n * @param options - CLI configuration including name, version, commands, and middleware.\n */\nexport async function cli<TSchema extends z.ZodType = z.ZodType>(\n options: CliOptions<TSchema>\n): Promise<void> {\n const logger = createCliLogger()\n\n const [uncaughtError, result] = await attemptAsync(async () => {\n const program = yargs(process.argv.slice(ARGV_SLICE_START))\n .scriptName(options.name)\n .version(options.version)\n .strict()\n .help()\n .option('cwd', {\n describe: 'Set the working directory',\n global: true,\n type: 'string',\n })\n\n if (options.description) {\n program.usage(options.description)\n }\n\n const resolved: ResolvedRef = { ref: undefined }\n\n const commands = await resolveCommands(options.commands)\n\n if (commands) {\n registerCommands({ commands, instance: program, parentPath: [], resolved })\n program.demandCommand(1, 'You must specify a command.')\n }\n\n const argv: Record<string, unknown> = await program.parseAsync()\n\n applyCwd(argv)\n\n if (!resolved.ref) {\n return undefined\n }\n\n const [runtimeError, runtime] = await createRuntime({\n config: options.config,\n middleware: options.middleware,\n name: options.name,\n version: options.version,\n })\n\n if (runtimeError) {\n return runtimeError\n }\n\n const [executeError] = await runtime.execute({\n args: resolved.ref.args,\n commandPath: resolved.ref.commandPath,\n handler: resolved.ref.handler,\n middleware: resolved.ref.middleware,\n rawArgs: argv,\n })\n\n return executeError\n })\n\n if (uncaughtError) {\n exitOnError(uncaughtError, logger)\n return\n }\n\n if (result) {\n exitOnError(result, logger)\n }\n}\n\nexport default cli\n\n// ---------------------------------------------------------------------------\n// Private\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the commands option to a CommandMap.\n *\n * Accepts a directory string (triggers autoload), a static CommandMap,\n * a Promise<CommandMap> (from autoload() called at the call site),\n * or undefined (loads `kidd.config.ts` and autoloads from its `commands` field,\n * falling back to `'./commands'`).\n *\n * @private\n * @param commands - The commands option from CliOptions.\n * @returns A CommandMap or undefined.\n */\nasync function resolveCommands(\n commands: string | CommandMap | Promise<CommandMap> | undefined\n): Promise<CommandMap | undefined> {\n if (isString(commands)) {\n return autoload({ dir: commands })\n }\n if (commands instanceof Promise) {\n return commands\n }\n if (isPlainObject(commands)) {\n return commands\n }\n return resolveCommandsFromConfig()\n}\n\n/**\n * Load `kidd.config.ts` and autoload commands from its `commands` field.\n *\n * Falls back to `'./commands'` when the config file is missing, fails to load,\n * or does not specify a `commands` field.\n *\n * @private\n * @returns A CommandMap autoloaded from the configured commands directory.\n */\nasync function resolveCommandsFromConfig(): Promise<CommandMap> {\n const DEFAULT_COMMANDS_DIR = './commands'\n\n const [configError, configResult] = await loadConfig()\n if (configError || !configResult) {\n return autoload({ dir: DEFAULT_COMMANDS_DIR })\n }\n\n const dir = configResult.config.commands ?? DEFAULT_COMMANDS_DIR\n return autoload({ dir })\n}\n\n/**\n * Change the process working directory when `--cwd` is provided.\n *\n * Resolves the value to an absolute path and calls `process.chdir()` so\n * that all downstream `process.cwd()` calls reflect the override.\n *\n * @private\n * @param argv - The parsed argv record from yargs.\n */\nfunction applyCwd(argv: Record<string, unknown>): void {\n if (isString(argv.cwd)) {\n process.chdir(resolve(argv.cwd))\n }\n}\n\n/**\n * Handle a CLI error by logging the message and exiting with the appropriate code.\n *\n * ContextErrors carry a custom exit code; all other errors exit with code 1.\n *\n * @private\n * @param error - The caught error value.\n * @param logger - Logger with an error method for output.\n */\nfunction exitOnError(error: unknown, logger: { error(msg: string): void }): void {\n const info = match(error)\n .when(isContextError, (e) => ({ exitCode: e.exitCode, message: e.message }))\n .with(P.instanceOf(Error), (e) => ({ exitCode: DEFAULT_EXIT_CODE, message: e.message }))\n .otherwise((e) => ({ exitCode: DEFAULT_EXIT_CODE, message: String(e) }))\n\n logger.error(info.message)\n process.exit(info.exitCode)\n}\n","import { withTag } from '@kidd-cli/utils/tag'\n\nimport type {\n ArgsDef,\n CommandDef,\n Middleware,\n MiddlewareEnv,\n Command as CommandType,\n} from './types.js'\n\n/**\n * Define a CLI command with typed args, config, and handler.\n *\n * The `const TMiddleware` generic preserves the middleware tuple as a literal type,\n * enabling TypeScript to extract and intersect `Variables` from each middleware\n * element onto the handler's `ctx` type.\n *\n * @param def - Command definition including description, args schema, middleware, and handler.\n * @returns A resolved Command object for registration in the command map.\n */\nexport function command<\n TArgsDef extends ArgsDef = ArgsDef,\n TConfig extends Record<string, unknown> = Record<string, unknown>,\n const TMiddleware extends readonly Middleware<MiddlewareEnv>[] =\n readonly Middleware<MiddlewareEnv>[],\n>(def: CommandDef<TArgsDef, TConfig, TMiddleware>): CommandType {\n return withTag({ ...def }, 'Command') as CommandType\n}\n","/**\n * Middleware combinator that merges multiple middleware into one.\n *\n * @module\n */\n\nimport { middleware } from './middleware.js'\nimport type { InferVariables, Middleware, MiddlewareEnv } from './types.js'\n\n/**\n * The composed return environment. Uses a conditional type to normalize\n * `unknown` (produced by empty tuples) into `Record<string, unknown>`,\n * satisfying the `MiddlewareEnv` constraint.\n */\ninterface ComposedEnv<TMiddleware extends readonly Middleware<MiddlewareEnv>[]> {\n readonly Variables: InferVariables<TMiddleware> extends infer V\n ? unknown extends V\n ? Record<string, unknown>\n : V\n : never\n}\n\n/**\n * Compose multiple middleware into a single middleware.\n *\n * Executes each middleware in order, threading `next()` through the chain.\n * The final `next()` call from the last composed middleware continues to\n * the downstream middleware or command handler.\n *\n * The returned middleware's type merges all `Variables` from the input tuple,\n * so downstream handlers see the combined context.\n *\n * @param middlewares - An ordered tuple of middleware to compose.\n * @returns A single Middleware whose Variables is the intersection of all input Variables.\n *\n * @example\n * ```ts\n * const combined = compose([auth({ strategies: [auth.env()] }), auth.require()])\n * ```\n */\nexport function compose<const TMiddleware extends readonly Middleware<MiddlewareEnv>[]>(\n middlewares: TMiddleware\n): Middleware<ComposedEnv<TMiddleware>> {\n return middleware((ctx, next) => executeChain(middlewares, 0, ctx, next)) as Middleware<\n ComposedEnv<TMiddleware>\n >\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively execute middleware in order, calling next() after the last one.\n *\n * @private\n * @param middlewares - The middleware array.\n * @param index - Current position in the array.\n * @param ctx - The context object.\n * @param next - The downstream next function.\n */\nasync function executeChain(\n middlewares: readonly Middleware<MiddlewareEnv>[],\n index: number,\n ctx: Parameters<Middleware['handler']>[0],\n next: () => Promise<void>\n): Promise<void> {\n if (index >= middlewares.length) {\n await next()\n return\n }\n\n const mw = middlewares[index]\n\n if (mw === undefined) {\n await next()\n return\n }\n\n await mw.handler(ctx, () => executeChain(middlewares, index + 1, ctx, next))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,SAAgB,mBACd,SACA,SACc;CACd,MAAM,OAAO,uBAAuB,SAAS,QAAQ;CAIrD,MAAM,QAAQ,IAAI,MAAM,KAAK,QAAQ;AACrC,OAAM,OAAO;AAEb,QAAO,eAAe,OAAO,KAAK;EAAE,YAAY;EAAO,OAAO;EAAgB,UAAU;EAAO,CAAC;AAChG,QAAO,eAAe,OAAO,QAAQ;EAAE,YAAY;EAAM,OAAO,KAAK;EAAM,UAAU;EAAO,CAAC;AAC7F,QAAO,eAAe,OAAO,YAAY;EACvC,YAAY;EACZ,OAAO,KAAK;EACZ,UAAU;EACX,CAAC;AACF,QAAO;;;;;;;;;;;;AAaT,SAAgB,eAAe,OAAuC;AACpE,KAAI,iBAAiB,MACnB,QAAO,OAAO,OAAO,eAAe;AAEtC,QAAO;;AAOT,SAAS,gBAAgB,SAAmE;AAC1F,KAAI,WAAW,QAAQ,aAAa,KAAA,EAClC,QAAO,QAAQ;AAEjB,QAAA;;AAGF,SAAS,YACP,SACoB;AACpB,KAAI,WAAW,QAAQ,SAAS,KAAA,EAC9B,QAAO,QAAQ;;AAKnB,SAAS,uBACP,SACA,SACkB;AAClB,QAAO,QACL;EACE,MAAM,YAAY,QAAQ;EAC1B,UAAU,gBAAgB,QAAQ;EAClC;EACD,EACD,eACD;;;;;;;;;;;AC3GH,SAAgB,oBAAoB,QAAoC;AACtE,QAAO;EACL,SAAS,SAAuB;AAC9B,UAAO,MAAM,GAAG,QAAQ,IAAI;;EAE9B,IAAI,SAAuB;AACzB,UAAO,MAAM,QAAQ;;EAEvB,MAAM,MAAiC,SAA+B;AACpE,OAAI,WAAW,QAAQ,MAAM;IAC3B,MAAM,GAAG,QAAQ,cAAc,MAAM,EAAE,QAAQ,MAAM,CAAC;AACtD,WAAO,MAAM,GAAG,KAAK,IAAI;AACzB;;AAEF,OAAI,KAAK,WAAW,EAClB;GAEF,MAAM,CAAC,YAAY;AACnB,OAAI,CAAC,SACH;AAEF,sBAAmB,QAAQ,MAAM,OAAO,KAAK,SAAS,CAAC;;EAEzD,MAAM,MAAe,SAA+B;AAClD,OAAK,WAAW,QAAQ,QAAU,OAAO,SAAS,YAAY,SAAS,MAAO;IAC5E,MAAM,GAAG,QAAQ,cAAc,MAAM,EAAE,QAAQ,MAAM,CAAC;AACtD,WAAO,MAAM,GAAG,KAAK,IAAI;SAEzB,QAAO,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI;;EAGtC;;;;;;;;;AAcH,SAAS,kBAAkB,KAAsB;AAC/C,KAAI,QAAQ,KAAA,EACV,QAAO;AAET,QAAO,OAAO,IAAI;;;;;;;;;AAkBpB,SAAS,kBAAkB,SAAqC;CAC9D,MAAM,EAAE,MAAM,WAAW;AACzB,QAAO,KACJ,KAAK,KAAK,QAAQ;EACjB,MAAM,QAAQ,OAAO;AACrB,MAAI,UAAU,KAAA,EACZ,QAAO;AAET,SAAO,IAAI,OAAO,MAAM;GACxB,CACD,KAAK,KAAK;;;;;;;;;AAmBf,SAAS,eAAe,SAAkC;CACxD,MAAM,EAAE,KAAK,MAAM,WAAW;AAC9B,QAAO,KACJ,KAAK,KAAK,QAAQ;EACjB,MAAM,QAAQ,OAAO;EACrB,MAAM,MAAM,kBAAkB,IAAI,KAAK;AACvC,MAAI,UAAU,KAAA,EACZ,QAAO;AAET,SAAO,IAAI,OAAO,MAAM;GACxB,CACD,KAAK,KAAK;;;;;;;;;;AAWf,SAAS,oBAAoB,MAAiC,MAA0B;AACtF,QAAO,KAAK,KAAK,QAAQ;EACvB,MAAM,SAAS,KAAK,KAAK,QAAQ,kBAAkB,IAAI,KAAK,CAAC;AAC7D,SAAO,KAAK,IAAI,IAAI,QAAQ,GAAG,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC;GAC/D;;;;;;;;;;AAWJ,SAAS,mBACP,QACA,MACA,MACM;CACN,MAAM,SAAS,oBAAoB,MAAM,KAAK;CAI9C,MAAM,UAAU;EAHD,kBAAkB;GAAE;GAAM;GAAQ,CAAC;EAChC,OAAO,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,CAAC,KAAK,KAAK;EAEjC,GADnB,KAAK,KAAK,QAAQ,eAAe;GAAE;GAAM;GAAK;GAAQ,CAAC,CAAC;EACzB,CAAC,KAAK,KAAK;AAC3D,QAAO,MAAM,GAAG,QAAQ,IAAI;;;;;;;;;AChJ9B,SAAgB,uBAAgC;AAC9C,QAAO;EACL,MAAM,QAAQ,MAAwB;AAEpC,UAAO,mBADQ,MAAM,MAAM,QAAQ,KAAK,CACP;;EAEnC,MAAM,YAAkB,MAA8D;AAIpF,UAAO,mBAHQ,MAAM,MAAM,YACzB,KACD,CACgC;;EAEnC,MAAM,SAAS,MAAuB;AAEpC,UAAO,mBADQ,MAAM,MAAM,SAAS,KAAK,CACR;;EAEnC,MAAM,OAAa,MAAuD;AAExE,UAAO,mBADQ,MAAM,MAAM,OAAa,KAAiD,CACxD;;EAEnC,MAAM,KAAK,MAAuB;AAEhC,UAAO,mBADQ,MAAM,MAAM,KAAK,KAAK,CACJ;;EAEpC;;;;;;;;;;;;AAiBH,SAAS,mBAAyB,QAA6B;AAC7D,KAAI,MAAM,SAAS,OAAO,EAAE;AAC1B,QAAM,OAAO,uBAAuB;AAGpC,QAAM,mBAAmB,4BAA4B;GACnD,MAAM;GACN,UAAA;GACD,CAAC;;AAEJ,QAAO;;;;;;;;;;ACrDT,SAAgB,oBAAuE;CACrF,MAAM,sBAAM,IAAI,KAAsB;AAEtC,QAAO;EACL,QAAc;AACZ,OAAI,OAAO;;EAEb,OAAO,KAAsB;AAC3B,UAAO,IAAI,OAAO,IAAI;;EAExB,IAA6C,KAAiC;AAC5E,UAAO,IAAI,IAAI,IAAI;;EAErB,IAAI,KAAsB;AACxB,UAAO,IAAI,IAAI,IAAI;;EAErB,IAA6C,KAAU,OAAwB;AAC7E,OAAI,IAAI,KAAK,MAAM;;EAEtB;;;;;;;;;;;;;;ACWH,SAAgB,cACd,SACyB;CACzB,MAAM,YAAuB,QAAQ,UAAU,iBAAiB;CAChE,MAAM,aAAsB,MAAM,SAAS;CAC3C,MAAM,YAAoB,oBAAoB,QAAQ,UAAU,QAAQ,OAAO;CAC/E,MAAM,WAA8C,mBAAmB;CACvE,MAAM,aAAsB,sBAAsB;CAClD,MAAM,UAAgB;EACpB,SAAS,QAAQ,KAAK;EACtB,MAAM,QAAQ,KAAK;EACnB,SAAS,QAAQ,KAAK;EACvB;AAID,QAAO;EACL,MAAM,QAAQ;EACd,QAAQ,QAAQ;EAChB,KAAK,SAAiB,aAA2D;AAG/E,SAAM,mBAAmB,SAAS,YAAY;;EAEhD,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,SAAS;EACT,SAAS;EACT,OAAO;EACR;;;;AC3DH,MAAM,mBAAmB,IAAI,IAAI;CAAC;CAAO;CAAO;CAAO,CAAC;AACxD,MAAM,aAAa;;;;;;;AAQnB,eAAsB,SAAS,SAAgD;CAC7E,MAAM,MAAM,WAAW,QAAQ;CAC/B,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;CAE3D,MAAM,cAAc,QAAQ,OAAO,cAAc;CACjD,MAAM,aAAa,QAAQ,OAAO,aAAa;CAE/C,MAAM,cAAc,MAAM,QAAQ,IAChC,YAAY,IAAI,OAAO,UAAkD;EACvE,MAAM,MAAM,MAAM,cAAc,KAAK,KAAK,MAAM,KAAK,CAAC;AACtD,MAAI,CAAC,IACH;AAEF,SAAO,CAAC,kBAAkB,MAAM,EAAE,IAAI;GACtC,CACH;CAED,MAAM,aAAa,MAAM,QAAQ,IAC/B,WAAW,KAAK,UAAU,gBAAgB,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CAClE;CAGD,MAAM,aADa,CAAC,GAAG,aAAa,GAAG,WAAW,CACpB,QAAQ,SAAoC,SAAS,KAAA,EAAU;AAG7F,QAD+B,OAAO,YAAY,WAAW;;;;;;;;;AAe/D,SAAS,WAAW,SAAmC;AACrD,KAAI,WAAW,SAAS,QAAQ,IAAI,CAClC,QAAO,QAAQ,QAAQ,IAAI;AAE7B,QAAO,QAAQ,aAAa;;;;;;;;;;;;;AAc9B,eAAe,gBAAgB,KAAqD;CAClF,MAAM,OAAO,SAAS,IAAI;CAC1B,MAAM,aAAa,MAAM,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;CAC9D,MAAM,cAAc,MAAM,iBAAiB,KAAK,WAAW;CAC3D,MAAM,YAAY,mBAAmB,WAAW;AAEhD,KAAI,WAAW;EACb,MAAM,gBAAgB,MAAM,cAAc,KAAK,KAAK,UAAU,KAAK,CAAC;AACpE,MAAI,cACF,QAAO,CAAC,MAAM,QAAQ;GAAE,GAAG;GAAe,UAAU;GAAa,EAAE,UAAU,CAAC;;AAIlF,KAAI,OAAO,KAAK,YAAY,CAAC,WAAW,EACtC;AAGF,QAAO,CAAC,MAAM,QAAQ,EAAE,UAAU,aAAa,EAAE,UAAU,CAAC;;;;;;;;;;AAW9D,eAAe,iBAAiB,KAAa,SAAwC;CACnF,MAAM,cAAc,QAAQ,OAAO,cAAc;CACjD,MAAM,aAAa,QAAQ,OAAO,aAAa;CAE/C,MAAM,cAAc,MAAM,QAAQ,IAChC,YAAY,IAAI,OAAO,UAAkD;EACvE,MAAM,MAAM,MAAM,cAAc,KAAK,KAAK,MAAM,KAAK,CAAC;AACtD,MAAI,CAAC,IACH;AAEF,SAAO,CAAC,kBAAkB,MAAM,EAAE,IAAI;GACtC,CACH;CAED,MAAM,aAAa,MAAM,QAAQ,IAC/B,WAAW,KAAK,UAAU,gBAAgB,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CAClE;CAGD,MAAM,aADa,CAAC,GAAG,aAAa,GAAG,WAAW,CACpB,QAAQ,SAAoC,SAAS,KAAA,EAAU;AAG7F,QAD+B,OAAO,YAAY,WAAW;;;;;;;;;AAW/D,SAAS,mBAAmB,SAAuC;AACjE,QAAO,QAAQ,MACZ,UACC,MAAM,QAAQ,IACd,iBAAiB,IAAI,QAAQ,MAAM,KAAK,CAAC,IACzC,SAAS,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC,KAAK,WACjD;;;;;;;;;AAUH,eAAe,cAAc,UAAgD;CAC3E,MAAM,MAAe,MAAM,OAAO;AAClC,KAAI,gBAAgB,IAAI,CACtB,QAAO,IAAI;;;;;;;;;;;;;AAgBf,SAAS,gBAAgB,KAA2C;AAClE,KAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,QAAO;AAET,KAAI,EAAE,aAAa,KACjB,QAAO;CAET,MAAM,MAAe,IAAI;AACzB,KAAI,CAAC,cAAc,IAAI,CACrB,QAAO;AAET,QAAO,OAAO,KAAK,UAAU;;;;;;;;;AAU/B,SAAS,kBAAkB,OAAuB;AAChD,QAAO,SAAS,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC;;;;;;;;;AAUlD,SAAS,cAAc,OAAwB;AAC7C,KAAI,CAAC,MAAM,QAAQ,CACjB,QAAO;AAET,KAAI,MAAM,KAAK,WAAW,IAAI,IAAI,MAAM,KAAK,WAAW,IAAI,CAC1D,QAAO;AAET,KAAI,CAAC,iBAAiB,IAAI,QAAQ,MAAM,KAAK,CAAC,CAC5C,QAAO;AAET,QAAO,kBAAkB,MAAM,KAAK;;;;;;;;;AAUtC,SAAS,aAAa,OAAwB;AAC5C,KAAI,CAAC,MAAM,aAAa,CACtB,QAAO;AAET,QAAO,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI;;;;;;;;;;ACxNnE,SAAgB,YAAY,MAAmD;AAC7E,QACE,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAQ,KAA2B,SAAS,YAC3C,KAAqC,SAAS,QAC9C,KAAqC,KAAK,SAAS;;;;;;;;AAUxD,SAAgB,wBACd,QAC8B;CAC9B,MAAM,QAAQ,OAAO;AACrB,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,KAAK,iBAAyC,CACxE,KACA,iBAAiB,YAAY,CAC9B,CAAC,CACH;;;;;;;;;;AAuCH,SAAS,oBAAoB,KAAa,UAA4B;AACpE,KAAI,IAAI,iBAAiB,KAAA,EACvB,QAAO,IAAI;AAEb,QAAO;;;;;;;;;AAUT,SAAS,eAAe,SAAqC;CAC3D,MAAM,EAAE,KAAK,SAAS,iBAAiB;AACvC,KAAI,IAAI,UACN,QAAO,uBAAuB;EAAE,SAAS,IAAI;EAAW;EAAc,YAAY;EAAM,CAAC;AAE3F,QAAO;EAAE;EAAc,OAAO;EAAS,YAAY;EAAM;;;;;;;;;AAU3D,SAAS,cAAc,SAAqC;CAC1D,MAAM,EAAE,KAAK,SAAS,iBAAiB;CACvC,MAAM,aAAa,oBAAoB,KAAK,aAAa;AACzD,KAAI,IAAI,UACN,QAAO,uBAAuB;EAC5B,SAAS,IAAI;EACb,cAAc;EACd,YAAY;EACb,CAAC;AAEJ,QAAO;EAAE,cAAc;EAAY,OAAO;EAAS,YAAY;EAAM;;;;;;;;;AAUvE,SAAS,uBAAuB,SAA8C;CAC5E,MAAM,EAAE,SAAS,YAAY,iBAAiB;CAC9C,MAAM,MAAO,QAA6B;AAC1C,KAAI,IAAI,SAAS,WACf,QAAO,eAAe;EAAE;EAAS;EAAK;EAAc,CAAC;AAEvD,KAAI,IAAI,SAAS,UACf,QAAO,cAAc;EAAE;EAAS;EAAK;EAAc,CAAC;AAEtD,QAAO;EAAE;EAAc,OAAO;EAAS;EAAY;;;;;;;;;AAUrD,SAAS,cAAc,QAAmC;AACxD,QAAO,uBAAuB;EAAE,SAAS;EAAQ,cAAc,KAAA;EAAW,YAAY;EAAO,CAAC;;;;;;;;;AAUhG,SAAS,oBACP,UAC2C;AAC3C,QAAOA,QAAM,SAAS,CACnB,KAAK,gBAAgB,SAAkB,CACvC,KAAK,gBAAgB,SAAkB,CACvC,KAAK,iBAAiB,UAAmB,CACzC,KAAK,eAAe,QAAiB,CACrC,gBAAgB,SAAkB;;;;;;;;;;AAWvC,SAAS,gBAAgB,OAAqB,cAAqC;CACjF,MAAM,OAAqB,EAAE;CAC7B,MAAM,EAAE,gBAAgB;AACxB,KAAI,YACF,MAAK,WAAW;AAElB,KAAI,iBAAiB,KAAA,EACnB,MAAK,UAAU;AAEjB,QAAO;;;;;;;;;AAUT,SAAS,iBAAiB,QAAoC;CAC5D,MAAM,EAAE,OAAO,YAAY,iBAAiB,cAAc,OAAO;CACjE,MAAM,WAAY,MAA2B;CAC7C,MAAM,OAAO;EACX,GAAG,gBAAgB,OAAO,aAAa;EACvC,MAAM,oBAAoB,SAAS,KAAK;EACzC;AACD,KAAI,CAAC,WACH,QAAO;EAAE,GAAG;EAAM,cAAc;EAAM;AAExC,QAAO;;;;;;;;;;;;;;ACvLT,SAAgB,iBAAiB,SAAsC;AACrE,QAAO,EACL,MAAM,SAA0E;AAE9E,SAAO,aAAa,SADJ,gBAAgB,QAAQ,CACH;IAExC;;;;;;;;;;AAeH,SAAS,gBAAgB,MAAwD;AAC/E,QAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,QAAQ,CAAC,SAAS,QAAQ,OAAO,QAAQ,QAAQ,CAAC,IAAI,SAAS,IAAI,CAAC,CAC1F;;;;;;;;;;;;;;AAeH,SAAS,aACP,SACA,YACwC;AACxC,KAAI,CAAC,WAAW,CAAC,YAAY,QAAQ,CACnC,QAAO,GAAG,WAAW;CAEvB,MAAM,SAAS,QAAQ,UAAU,WAAW;AAC5C,KAAI,CAAC,OAAO,QACV,QAAO,oBAAI,IAAI,MAAM,yBAAyB,gBAAgB,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC;AAEhG,QAAO,GAAG,OAAO,KAAgC;;;;;;;;;;;;;ACtDnD,SAAgB,oBAAoB,SAAe,MAA6B;AAC9E,KAAI,CAAC,KACH;AAEF,KAAI,YAAY,KAAK,EAAE;EACrB,MAAM,UAAU,wBAAwB,KAAK;AAC7C,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,QAAQ,CAC9C,SAAQ,OAAO,KAAK,IAAI;OAG1B,MAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,KAAK,CAC3C,SAAQ,OAAO,KAAK,oBAAoB,IAAI,CAAC;;;;;;;;;AAgBnD,SAAS,oBAAoB,KAAgC;AAC3D,QAAO;EACL,OAAO,IAAI;EACX,SAAS,IAAI;EACb,SAAS,IAAI;EACb,cAAc,IAAI,YAAY;EAC9B,UAAU,IAAI;EACd,MAAM,IAAI;EACX;;;;;;;;;;ACnCH,SAAgB,UAAU,OAAkC;AAC1D,QAAO,OAAO,OAAO,UAAU;;;;;;;;;;;AAYjC,SAAgB,iBAAiB,SAAwC;CACvE,MAAM,EAAE,UAAU,UAAU,UAAU,eAAe;CACrD,MAAM,iBAAiB,OAAO,QAAQ,SAAS,CAAC,QAAQ,SACtD,UAAU,KAAK,GAAG,CACnB;AAED,MAAK,MAAM,CAAC,MAAM,UAAU,eAC1B,yBAAwB;EACtB,SAAS;EACT,KAAK;EACL;EACA;EACA;EACA;EACD,CAAC;;;;;;;;;;;;AAoCN,SAAS,wBAAwB,SAA+C;CAC9E,MAAM,EAAE,UAAU,MAAM,KAAK,UAAU,eAAe;CACtD,MAAM,cAAc,IAAI,eAAe;AAEvC,UAAS,QACP,MACA,cACC,YAAkB;AACjB,sBAAoB,SAAS,IAAI,KAAK;AAEtC,MAAI,IAAI,UAAU;GAChB,MAAM,cAAc,OAAO,QAAQ,IAAI,SAAS,CAAC,QAAQ,SACvD,UAAU,KAAK,GAAG,CACnB;AAED,QAAK,MAAM,CAAC,SAAS,aAAa,YAChC,yBAAwB;IACtB;IACA,KAAK;IACL,UAAU;IACV,MAAM;IACN,YAAY,CAAC,GAAG,YAAY,KAAK;IACjC;IACD,CAAC;AAGJ,OAAI,IAAI,QACN,SAAQ,cAAc,EAAE;OAExB,SAAQ,cAAc,GAAG,iCAAiC;;AAI9D,SAAO;UAEH;AAIJ,WAAS,MAAM;GACb,MAAM,IAAI;GACV,aAAa,CAAC,GAAG,YAAY,KAAK;GAClC,SAAS,IAAI;GACb,YAAa,IAAI,cAAc,EAAE;GAClC;GAEJ;;;;;;;;;;;;;;;;;;;;;ACtGH,SAAgB,aAAa,gBAAsC;AACjE,QAAO,EACL,MAAM,QAAQ,EAAE,KAAK,SAAS,cAA6B;EACzD,MAAM,iBAAiB,OAAO,aAAqC;AACjE,SAAM,mBAAmB,YAAY,UAAU,QAAQ;;AAEzD,QAAM,mBAAmB,gBAAgB,KAAK,eAAe;IAEhE;;;;;;;;;;;;;;AAmBH,eAAe,mBACb,aACA,KACA,cACe;CACf,eAAe,aAAa,OAA8B;AACxD,MAAI,SAAS,YAAY,QAAQ;AAC/B,SAAM,aAAa,IAAI;AACvB;;EAEF,MAAM,KAAK,YAAY;AACvB,MAAI,GACF,OAAM,GAAG,QAAQ,WAAW,aAAa,QAAQ,EAAE,CAAC;;AAIxD,OAAM,aAAa,EAAE;;;;;;;;;;;;;;AC1CvB,eAAsB,cACpB,SAC6B;CAC7B,MAAM,SAAS,MAAM,cAAc,QAAQ,QAAQ,QAAQ,KAAK;CAGhE,MAAM,SAAS,aADkB,QAAQ,cAAc,EAAE,CAClB;AAuCvC,QAAO,GArCkB,EACvB,MAAM,QAAQ,SAAmC;EAE/C,MAAM,CAAC,WAAW,iBADH,iBAAiB,QAAQ,KAAK,CACH,MAAM,QAAQ,QAAQ;AAChE,MAAI,UACF,QAAO,IAAI,UAAU;EAGvB,MAAM,MAAM,cAAc;GACxB,MAAM;GACN;GACA,MAAM;IACJ,SAAS,CAAC,GAAG,QAAQ,YAAY;IACjC,MAAM,QAAQ;IACd,SAAS,QAAQ;IAClB;GACF,CAAC;EAEF,MAAM,eAAe,QAAQ,YAAY,YAAY;EAIrD,MAAM,CAAC,aAAa,MAAM,mBACxB,OAAO,QAAQ;GACR;GACL,SAAS;GACT,YAAY,QAAQ;GACrB,CAAC,CACH;AACD,MAAI,UACF,QAAO,IAAI,UAAU;AAGvB,SAAO,IAAI;IAEd,CAEiB;;;;;;;;;;;;;AAkBpB,eAAe,cACb,eACA,aACkC;AAClC,KAAI,CAAC,iBAAiB,CAAC,cAAc,OACnC,QAAO,EAAE;CAMX,MAAM,CAAC,aAAa,gBAAgB,MAJrB,mBAAmB;EAChC,MAAM,cAAc,QAAQ;EAC5B,QAAQ,cAAc;EACvB,CAAC,CAC+C,MAAM;AACvD,KAAI,eAAe,CAAC,aAClB,QAAO,EAAE;AAIX,QAAO,aAAa;;;;ACxFtB,MAAM,mBAAmB;;;;;;;;;AAUzB,eAAsB,IACpB,SACe;CACf,MAAM,SAAS,iBAAiB;CAEhC,MAAM,CAAC,eAAe,UAAU,MAAM,aAAa,YAAY;EAC7D,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAM,iBAAiB,CAAC,CACxD,WAAW,QAAQ,KAAK,CACxB,QAAQ,QAAQ,QAAQ,CACxB,QAAQ,CACR,MAAM,CACN,OAAO,OAAO;GACb,UAAU;GACV,QAAQ;GACR,MAAM;GACP,CAAC;AAEJ,MAAI,QAAQ,YACV,SAAQ,MAAM,QAAQ,YAAY;EAGpC,MAAM,WAAwB,EAAE,KAAK,KAAA,GAAW;EAEhD,MAAM,WAAW,MAAM,gBAAgB,QAAQ,SAAS;AAExD,MAAI,UAAU;AACZ,oBAAiB;IAAE;IAAU,UAAU;IAAS,YAAY,EAAE;IAAE;IAAU,CAAC;AAC3E,WAAQ,cAAc,GAAG,8BAA8B;;EAGzD,MAAM,OAAgC,MAAM,QAAQ,YAAY;AAEhE,WAAS,KAAK;AAEd,MAAI,CAAC,SAAS,IACZ;EAGF,MAAM,CAAC,cAAc,WAAW,MAAM,cAAc;GAClD,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,MAAM,QAAQ;GACd,SAAS,QAAQ;GAClB,CAAC;AAEF,MAAI,aACF,QAAO;EAGT,MAAM,CAAC,gBAAgB,MAAM,QAAQ,QAAQ;GAC3C,MAAM,SAAS,IAAI;GACnB,aAAa,SAAS,IAAI;GAC1B,SAAS,SAAS,IAAI;GACtB,YAAY,SAAS,IAAI;GACzB,SAAS;GACV,CAAC;AAEF,SAAO;GACP;AAEF,KAAI,eAAe;AACjB,cAAY,eAAe,OAAO;AAClC;;AAGF,KAAI,OACF,aAAY,QAAQ,OAAO;;;;;;;;;;;;;;AAsB/B,eAAe,gBACb,UACiC;AACjC,KAAI,SAAS,SAAS,CACpB,QAAO,SAAS,EAAE,KAAK,UAAU,CAAC;AAEpC,KAAI,oBAAoB,QACtB,QAAO;AAET,KAAI,cAAc,SAAS,CACzB,QAAO;AAET,QAAO,2BAA2B;;;;;;;;;;;AAYpC,eAAe,4BAAiD;CAC9D,MAAM,uBAAuB;CAE7B,MAAM,CAAC,aAAa,gBAAgB,MAAM,YAAY;AACtD,KAAI,eAAe,CAAC,aAClB,QAAO,SAAS,EAAE,KAAK,sBAAsB,CAAC;AAIhD,QAAO,SAAS,EAAE,KADN,aAAa,OAAO,YAAY,sBACrB,CAAC;;;;;;;;;;;AAY1B,SAAS,SAAS,MAAqC;AACrD,KAAI,SAAS,KAAK,IAAI,CACpB,SAAQ,MAAM,QAAQ,KAAK,IAAI,CAAC;;;;;;;;;;;AAapC,SAAS,YAAY,OAAgB,QAA4C;CAC/E,MAAM,OAAO,MAAM,MAAM,CACtB,KAAK,iBAAiB,OAAO;EAAE,UAAU,EAAE;EAAU,SAAS,EAAE;EAAS,EAAE,CAC3E,KAAK,EAAE,WAAW,MAAM,GAAG,OAAO;EAAE,UAAA;EAA6B,SAAS,EAAE;EAAS,EAAE,CACvF,WAAW,OAAO;EAAE,UAAA;EAA6B,SAAS,OAAO,EAAE;EAAE,EAAE;AAE1E,QAAO,MAAM,KAAK,QAAQ;AAC1B,SAAQ,KAAK,KAAK,SAAS;;;;;;;;;;;;;;AChK7B,SAAgB,QAKd,KAA8D;AAC9D,QAAO,QAAQ,EAAE,GAAG,KAAK,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;ACcvC,SAAgB,QACd,aACsC;AACtC,QAAO,YAAY,KAAK,SAAS,aAAa,aAAa,GAAG,KAAK,KAAK,CAAC;;;;;;;;;;;AAkB3E,eAAe,aACb,aACA,OACA,KACA,MACe;AACf,KAAI,SAAS,YAAY,QAAQ;AAC/B,QAAM,MAAM;AACZ;;CAGF,MAAM,KAAK,YAAY;AAEvB,KAAI,OAAO,KAAA,GAAW;AACpB,QAAM,MAAM;AACZ;;AAGF,OAAM,GAAG,QAAQ,WAAW,aAAa,aAAa,QAAQ,GAAG,KAAK,KAAK,CAAC"}
|
package/dist/lib/config.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
import "../
|
|
3
|
-
|
|
4
|
-
export { createConfigClient };
|
|
1
|
+
import "../project-D0g84bZY.js";
|
|
2
|
+
import { t as createConfigClient } from "../config-D8e5qxLp.js";
|
|
3
|
+
export { createConfigClient };
|