@namera-ai/cli 0.1.3 → 0.1.5
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/commands/index.mjs +21 -0
- package/dist/commands/index.mjs.map +1 -0
- package/dist/commands/keystore/create.mjs +74 -0
- package/dist/commands/keystore/create.mjs.map +1 -0
- package/dist/commands/keystore/decrypt.mjs +71 -0
- package/dist/commands/keystore/decrypt.mjs.map +1 -0
- package/dist/commands/keystore/import.mjs +84 -0
- package/dist/commands/keystore/import.mjs.map +1 -0
- package/dist/commands/keystore/index.mjs +28 -0
- package/dist/commands/keystore/index.mjs.map +1 -0
- package/dist/commands/keystore/info.mjs +62 -0
- package/dist/commands/keystore/info.mjs.map +1 -0
- package/dist/commands/keystore/list.mjs +46 -0
- package/dist/commands/keystore/list.mjs.map +1 -0
- package/dist/commands/keystore/remove.mjs +51 -0
- package/dist/commands/keystore/remove.mjs.map +1 -0
- package/dist/commands/mcp/index.mjs +13 -0
- package/dist/commands/mcp/index.mjs.map +1 -0
- package/dist/commands/mcp/start.mjs +82 -0
- package/dist/commands/mcp/start.mjs.map +1 -0
- package/dist/commands/schema/index.mjs +55 -0
- package/dist/commands/schema/index.mjs.map +1 -0
- package/dist/commands/session-key/create/index.mjs +87 -0
- package/dist/commands/session-key/create/index.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/base.mjs +52 -0
- package/dist/commands/session-key/create/prompts/base.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/call.mjs +85 -0
- package/dist/commands/session-key/create/prompts/call.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/common.mjs +27 -0
- package/dist/commands/session-key/create/prompts/common.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/gas.mjs +19 -0
- package/dist/commands/session-key/create/prompts/gas.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/index.mjs +44 -0
- package/dist/commands/session-key/create/prompts/index.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/rate-limit.mjs +40 -0
- package/dist/commands/session-key/create/prompts/rate-limit.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/signature-caller.mjs +26 -0
- package/dist/commands/session-key/create/prompts/signature-caller.mjs.map +1 -0
- package/dist/commands/session-key/create/prompts/timestamp.mjs +32 -0
- package/dist/commands/session-key/create/prompts/timestamp.mjs.map +1 -0
- package/dist/commands/session-key/index.mjs +26 -0
- package/dist/commands/session-key/index.mjs.map +1 -0
- package/dist/commands/session-key/info.mjs +64 -0
- package/dist/commands/session-key/info.mjs.map +1 -0
- package/dist/commands/session-key/list.mjs +54 -0
- package/dist/commands/session-key/list.mjs.map +1 -0
- package/dist/commands/session-key/remove.mjs +51 -0
- package/dist/commands/session-key/remove.mjs.map +1 -0
- package/dist/commands/session-key/status.mjs +64 -0
- package/dist/commands/session-key/status.mjs.map +1 -0
- package/dist/commands/smart-account/create.mjs +94 -0
- package/dist/commands/smart-account/create.mjs.map +1 -0
- package/dist/commands/smart-account/import.mjs +45 -0
- package/dist/commands/smart-account/import.mjs.map +1 -0
- package/dist/commands/smart-account/index.mjs +30 -0
- package/dist/commands/smart-account/index.mjs.map +1 -0
- package/dist/commands/smart-account/info.mjs +66 -0
- package/dist/commands/smart-account/info.mjs.map +1 -0
- package/dist/commands/smart-account/list.mjs +48 -0
- package/dist/commands/smart-account/list.mjs.map +1 -0
- package/dist/commands/smart-account/remove.mjs +54 -0
- package/dist/commands/smart-account/remove.mjs.map +1 -0
- package/dist/commands/smart-account/status.mjs +63 -0
- package/dist/commands/smart-account/status.mjs.map +1 -0
- package/dist/dto/index.mjs +6 -0
- package/dist/dto/keystore.mjs +44 -0
- package/dist/dto/keystore.mjs.map +1 -0
- package/dist/dto/mcp.mjs +13 -0
- package/dist/dto/mcp.mjs.map +1 -0
- package/dist/dto/session-key.mjs +54 -0
- package/dist/dto/session-key.mjs.map +1 -0
- package/dist/dto/smart-account.mjs +45 -0
- package/dist/dto/smart-account.mjs.map +1 -0
- package/dist/flags/global.mjs +29 -0
- package/dist/flags/global.mjs.map +1 -0
- package/dist/flags/shared.mjs +11 -0
- package/dist/flags/shared.mjs.map +1 -0
- package/dist/helpers/humanize.mjs +153 -0
- package/dist/helpers/humanize.mjs.map +1 -0
- package/dist/helpers/paths.mjs +31 -0
- package/dist/helpers/paths.mjs.map +1 -0
- package/dist/helpers/policy.mjs +89 -0
- package/dist/helpers/policy.mjs.map +1 -0
- package/dist/helpers/pretty.mjs +71 -0
- package/dist/helpers/pretty.mjs.map +1 -0
- package/dist/index.mjs +18 -3266
- package/dist/index.mjs.map +1 -1
- package/dist/layers/config.mjs +124 -0
- package/dist/layers/config.mjs.map +1 -0
- package/dist/layers/index.mjs +11 -0
- package/dist/layers/keystore.mjs +225 -0
- package/dist/layers/keystore.mjs.map +1 -0
- package/dist/layers/mcp-context.mjs +8 -0
- package/dist/layers/mcp-context.mjs.map +1 -0
- package/dist/layers/mcp.mjs +31 -0
- package/dist/layers/mcp.mjs.map +1 -0
- package/dist/layers/output.mjs +21 -0
- package/dist/layers/output.mjs.map +1 -0
- package/dist/layers/prompt.mjs +78 -0
- package/dist/layers/prompt.mjs.map +1 -0
- package/dist/layers/session-key.mjs +218 -0
- package/dist/layers/session-key.mjs.map +1 -0
- package/dist/layers/smart-account.mjs +172 -0
- package/dist/layers/smart-account.mjs.map +1 -0
- package/dist/layers/web3.mjs +83 -0
- package/dist/layers/web3.mjs.map +1 -0
- package/dist/mcp/helpers/common.mjs +9 -0
- package/dist/mcp/helpers/common.mjs.map +1 -0
- package/dist/mcp/helpers/index.mjs +4 -0
- package/dist/mcp/helpers/session-key.mjs +129 -0
- package/dist/mcp/helpers/session-key.mjs.map +1 -0
- package/dist/mcp/index.mjs +60 -0
- package/dist/mcp/index.mjs.map +1 -0
- package/dist/mcp/mcp.mjs +15 -0
- package/dist/mcp/mcp.mjs.map +1 -0
- package/dist/mcp/tools/account/address.mjs +20 -0
- package/dist/mcp/tools/account/address.mjs.map +1 -0
- package/dist/mcp/tools/account/get-balance.mjs +54 -0
- package/dist/mcp/tools/account/get-balance.mjs.map +1 -0
- package/dist/mcp/tools/account/index.mjs +15 -0
- package/dist/mcp/tools/account/index.mjs.map +1 -0
- package/dist/mcp/tools/read/index.mjs +11 -0
- package/dist/mcp/tools/read/index.mjs.map +1 -0
- package/dist/mcp/tools/read/read-contract.mjs +49 -0
- package/dist/mcp/tools/read/read-contract.mjs.map +1 -0
- package/dist/mcp/tools/transaction/execute-transaction.mjs +38 -0
- package/dist/mcp/tools/transaction/execute-transaction.mjs.map +1 -0
- package/dist/mcp/tools/transaction/index.mjs +15 -0
- package/dist/mcp/tools/transaction/index.mjs.map +1 -0
- package/dist/mcp/tools/transaction/native-transfer.mjs +59 -0
- package/dist/mcp/tools/transaction/native-transfer.mjs.map +1 -0
- package/dist/schema/chain.mjs +124 -0
- package/dist/schema/chain.mjs.map +1 -0
- package/dist/schema/common.mjs +29 -0
- package/dist/schema/common.mjs.map +1 -0
- package/dist/schema/index.mjs +5 -0
- package/dist/schema/policy.mjs +114 -0
- package/dist/schema/policy.mjs.map +1 -0
- package/dist/schema/tx.mjs +19 -0
- package/dist/schema/tx.mjs.map +1 -0
- package/dist/types/index.mjs +11 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +11 -12
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { CallPolicyVersion, CallType, ParamCondition, toCallPolicy, toGasPolicy, toRateLimitPolicy, toSignatureCallerPolicy, toSudoPolicy, toTimestampPolicy } from "@namera-ai/sdk/policy";
|
|
3
|
+
//#region src/helpers/policy.ts
|
|
4
|
+
/** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: safe */
|
|
5
|
+
const toCallPolicyVersion = (version) => {
|
|
6
|
+
switch (version) {
|
|
7
|
+
case "0.0.1": return CallPolicyVersion.V0_0_1;
|
|
8
|
+
case "0.0.2": return CallPolicyVersion.V0_0_2;
|
|
9
|
+
case "0.0.3": return CallPolicyVersion.V0_0_3;
|
|
10
|
+
case "0.0.4": return CallPolicyVersion.V0_0_4;
|
|
11
|
+
case "0.0.5": return CallPolicyVersion.V0_0_5;
|
|
12
|
+
default: throw new Error("Invalid call policy version");
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const conditionToParamCondition = (condition) => {
|
|
16
|
+
if (condition === "EQUAL") return ParamCondition.EQUAL;
|
|
17
|
+
if (condition === "GREATER_THAN") return ParamCondition.GREATER_THAN;
|
|
18
|
+
if (condition === "LESS_THAN") return ParamCondition.LESS_THAN;
|
|
19
|
+
if (condition === "GREATER_THAN_OR_EQUAL") return ParamCondition.GREATER_THAN_OR_EQUAL;
|
|
20
|
+
if (condition === "LESS_THAN_OR_EQUAL") return ParamCondition.LESS_THAN_OR_EQUAL;
|
|
21
|
+
if (condition === "NOT_EQUAL") return ParamCondition.NOT_EQUAL;
|
|
22
|
+
if (condition === "ONE_OF") return ParamCondition.ONE_OF;
|
|
23
|
+
if (condition === "SLICE_EQUAL") return ParamCondition.SLICE_EQUAL;
|
|
24
|
+
return ParamCondition.EQUAL;
|
|
25
|
+
};
|
|
26
|
+
const policyParamsToPolicies = (params) => {
|
|
27
|
+
const policies = [];
|
|
28
|
+
for (const param of params) if (param.type === "sudo") policies.push(toSudoPolicy({}));
|
|
29
|
+
else if (param.type === "timestamp") policies.push(toTimestampPolicy(param));
|
|
30
|
+
else if (param.type === "gas") policies.push(toGasPolicy(param));
|
|
31
|
+
else if (param.type === "rate-limit") policies.push(toRateLimitPolicy(param));
|
|
32
|
+
else if (param.type === "signature-caller") policies.push(toSignatureCallerPolicy(param));
|
|
33
|
+
else if (param.type === "call") policies.push(toCallPolicy({
|
|
34
|
+
policyVersion: toCallPolicyVersion(param.policyVersion),
|
|
35
|
+
permissions: !param.permissions ? void 0 : param.permissions.map((p) => {
|
|
36
|
+
const callType = (() => {
|
|
37
|
+
if (!p.callType) return CallType.CALL;
|
|
38
|
+
if (p.callType === "call") return CallType.CALL;
|
|
39
|
+
if (p.callType === "delegatecall") return CallType.DELEGATE_CALL;
|
|
40
|
+
return CallType.BATCH_CALL;
|
|
41
|
+
})();
|
|
42
|
+
if ("abi" in p) return {
|
|
43
|
+
callType,
|
|
44
|
+
target: p.target,
|
|
45
|
+
valueLimit: p.valueLimit,
|
|
46
|
+
abi: p.abi,
|
|
47
|
+
functionName: p.functionName,
|
|
48
|
+
selector: p.selector,
|
|
49
|
+
args: !p.args ? void 0 : p.args.map((a) => {
|
|
50
|
+
if (a === null) return null;
|
|
51
|
+
const c = a.condition;
|
|
52
|
+
if (c === "ONE_OF") return {
|
|
53
|
+
condition: ParamCondition.ONE_OF,
|
|
54
|
+
value: a.value
|
|
55
|
+
};
|
|
56
|
+
if (c === "SLICE_EQUAL" && "start" in a) return {
|
|
57
|
+
condition: ParamCondition.SLICE_EQUAL,
|
|
58
|
+
value: a.value,
|
|
59
|
+
start: a.start,
|
|
60
|
+
length: a.length
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
condition: conditionToParamCondition(c),
|
|
64
|
+
value: a.value
|
|
65
|
+
};
|
|
66
|
+
})
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
callType,
|
|
70
|
+
target: p.target,
|
|
71
|
+
selector: p.selector,
|
|
72
|
+
valueLimit: p.valueLimit,
|
|
73
|
+
rules: p.rules ? p.rules.map((r) => {
|
|
74
|
+
return {
|
|
75
|
+
offset: r.offset,
|
|
76
|
+
params: r.params,
|
|
77
|
+
condition: conditionToParamCondition(r.condition)
|
|
78
|
+
};
|
|
79
|
+
}) : void 0
|
|
80
|
+
};
|
|
81
|
+
})
|
|
82
|
+
}));
|
|
83
|
+
else throw new Error("Invalid policy type");
|
|
84
|
+
return policies;
|
|
85
|
+
};
|
|
86
|
+
//#endregion
|
|
87
|
+
export { policyParamsToPolicies };
|
|
88
|
+
|
|
89
|
+
//# sourceMappingURL=policy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.mjs","names":["ParamConditionCore"],"sources":["../../src/helpers/policy.ts"],"sourcesContent":["/** biome-ignore-all lint/complexity/noExcessiveCognitiveComplexity: safe */\nimport {\n CallPolicyVersion,\n CallType,\n ParamCondition as ParamConditionCore,\n type Policy,\n toCallPolicy,\n toGasPolicy,\n toRateLimitPolicy,\n toSignatureCallerPolicy,\n toSudoPolicy,\n toTimestampPolicy,\n} from \"@namera-ai/sdk/policy\";\n\nimport type { CallPolicyParams, PolicyParams } from \"@/schema\";\nimport type { ParamCondition } from \"@/schema/policy\";\n\nconst toCallPolicyVersion = (\n version: CallPolicyParams[\"policyVersion\"],\n): CallPolicyVersion => {\n switch (version) {\n case \"0.0.1\":\n return CallPolicyVersion.V0_0_1;\n case \"0.0.2\":\n return CallPolicyVersion.V0_0_2;\n case \"0.0.3\":\n return CallPolicyVersion.V0_0_3;\n case \"0.0.4\":\n return CallPolicyVersion.V0_0_4;\n case \"0.0.5\":\n return CallPolicyVersion.V0_0_5;\n default:\n throw new Error(\"Invalid call policy version\");\n }\n};\n\nconst conditionToParamCondition = (\n condition: ParamCondition,\n): ParamConditionCore => {\n if (condition === \"EQUAL\") return ParamConditionCore.EQUAL;\n if (condition === \"GREATER_THAN\") return ParamConditionCore.GREATER_THAN;\n if (condition === \"LESS_THAN\") return ParamConditionCore.LESS_THAN;\n if (condition === \"GREATER_THAN_OR_EQUAL\")\n return ParamConditionCore.GREATER_THAN_OR_EQUAL;\n if (condition === \"LESS_THAN_OR_EQUAL\")\n return ParamConditionCore.LESS_THAN_OR_EQUAL;\n if (condition === \"NOT_EQUAL\") return ParamConditionCore.NOT_EQUAL;\n if (condition === \"ONE_OF\") return ParamConditionCore.ONE_OF;\n if (condition === \"SLICE_EQUAL\") return ParamConditionCore.SLICE_EQUAL;\n return ParamConditionCore.EQUAL;\n};\n\nexport const policyParamsToPolicies = (params: PolicyParams[]) => {\n const policies: Policy[] = [];\n\n for (const param of params) {\n if (param.type === \"sudo\") {\n policies.push(toSudoPolicy({}));\n } else if (param.type === \"timestamp\") {\n policies.push(toTimestampPolicy(param));\n } else if (param.type === \"gas\") {\n policies.push(toGasPolicy(param));\n } else if (param.type === \"rate-limit\") {\n policies.push(toRateLimitPolicy(param));\n } else if (param.type === \"signature-caller\") {\n policies.push(toSignatureCallerPolicy(param));\n } else if (param.type === \"call\") {\n policies.push(\n toCallPolicy({\n policyVersion: toCallPolicyVersion(param.policyVersion),\n permissions: !param.permissions\n ? undefined\n : param.permissions.map((p) => {\n const callType = (() => {\n if (!p.callType) return CallType.CALL;\n if (p.callType === \"call\") return CallType.CALL;\n if (p.callType === \"delegatecall\")\n return CallType.DELEGATE_CALL;\n return CallType.BATCH_CALL;\n })();\n\n if (\"abi\" in p) {\n return {\n callType,\n target: p.target,\n valueLimit: p.valueLimit,\n abi: p.abi,\n functionName: p.functionName,\n selector: p.selector,\n args: !p.args\n ? undefined\n : p.args.map((a) => {\n if (a === null) return null;\n const c = a.condition;\n if (c === \"ONE_OF\") {\n return {\n condition: ParamConditionCore.ONE_OF,\n value: a.value,\n };\n }\n\n if (c === \"SLICE_EQUAL\" && \"start\" in a) {\n return {\n condition: ParamConditionCore.SLICE_EQUAL,\n value: a.value,\n start: a.start,\n length: a.length,\n };\n }\n\n return {\n condition: conditionToParamCondition(c) as Exclude<\n ParamConditionCore,\n ParamConditionCore.ONE_OF\n >,\n value: a.value,\n };\n }),\n };\n }\n\n return {\n callType,\n target: p.target,\n selector: p.selector,\n valueLimit: p.valueLimit,\n rules: p.rules\n ? p.rules.map((r) => {\n return {\n offset: r.offset,\n params: r.params,\n condition: conditionToParamCondition(r.condition),\n };\n })\n : undefined,\n };\n }),\n }),\n );\n } else {\n throw new Error(\"Invalid policy type\");\n }\n }\n\n return policies;\n};\n"],"mappings":";;;;AAiBA,MAAM,uBACJ,YACsB;AACtB,SAAQ,SAAR;EACE,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,KAAK,QACH,QAAO,kBAAkB;EAC3B,QACE,OAAM,IAAI,MAAM,8BAA8B;;;AAIpD,MAAM,6BACJ,cACuB;AACvB,KAAI,cAAc,QAAS,QAAOA,eAAmB;AACrD,KAAI,cAAc,eAAgB,QAAOA,eAAmB;AAC5D,KAAI,cAAc,YAAa,QAAOA,eAAmB;AACzD,KAAI,cAAc,wBAChB,QAAOA,eAAmB;AAC5B,KAAI,cAAc,qBAChB,QAAOA,eAAmB;AAC5B,KAAI,cAAc,YAAa,QAAOA,eAAmB;AACzD,KAAI,cAAc,SAAU,QAAOA,eAAmB;AACtD,KAAI,cAAc,cAAe,QAAOA,eAAmB;AAC3D,QAAOA,eAAmB;;AAG5B,MAAa,0BAA0B,WAA2B;CAChE,MAAM,WAAqB,EAAE;AAE7B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,SAAS,OACjB,UAAS,KAAK,aAAa,EAAE,CAAC,CAAC;UACtB,MAAM,SAAS,YACxB,UAAS,KAAK,kBAAkB,MAAM,CAAC;UAC9B,MAAM,SAAS,MACxB,UAAS,KAAK,YAAY,MAAM,CAAC;UACxB,MAAM,SAAS,aACxB,UAAS,KAAK,kBAAkB,MAAM,CAAC;UAC9B,MAAM,SAAS,mBACxB,UAAS,KAAK,wBAAwB,MAAM,CAAC;UACpC,MAAM,SAAS,OACxB,UAAS,KACP,aAAa;EACX,eAAe,oBAAoB,MAAM,cAAc;EACvD,aAAa,CAAC,MAAM,cAChB,SACA,MAAM,YAAY,KAAK,MAAM;GAC3B,MAAM,kBAAkB;AACtB,QAAI,CAAC,EAAE,SAAU,QAAO,SAAS;AACjC,QAAI,EAAE,aAAa,OAAQ,QAAO,SAAS;AAC3C,QAAI,EAAE,aAAa,eACjB,QAAO,SAAS;AAClB,WAAO,SAAS;OACd;AAEJ,OAAI,SAAS,EACX,QAAO;IACL;IACA,QAAQ,EAAE;IACV,YAAY,EAAE;IACd,KAAK,EAAE;IACP,cAAc,EAAE;IAChB,UAAU,EAAE;IACZ,MAAM,CAAC,EAAE,OACL,SACA,EAAE,KAAK,KAAK,MAAM;AAChB,SAAI,MAAM,KAAM,QAAO;KACvB,MAAM,IAAI,EAAE;AACZ,SAAI,MAAM,SACR,QAAO;MACL,WAAWA,eAAmB;MAC9B,OAAO,EAAE;MACV;AAGH,SAAI,MAAM,iBAAiB,WAAW,EACpC,QAAO;MACL,WAAWA,eAAmB;MAC9B,OAAO,EAAE;MACT,OAAO,EAAE;MACT,QAAQ,EAAE;MACX;AAGH,YAAO;MACL,WAAW,0BAA0B,EAAE;MAIvC,OAAO,EAAE;MACV;MACD;IACP;AAGH,UAAO;IACL;IACA,QAAQ,EAAE;IACV,UAAU,EAAE;IACZ,YAAY,EAAE;IACd,OAAO,EAAE,QACL,EAAE,MAAM,KAAK,MAAM;AACjB,YAAO;MACL,QAAQ,EAAE;MACV,QAAQ,EAAE;MACV,WAAW,0BAA0B,EAAE,UAAU;MAClD;MACD,GACF;IACL;IACD;EACP,CAAC,CACH;KAED,OAAM,IAAI,MAAM,sBAAsB;AAI1C,QAAO"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
//#region src/helpers/pretty.ts
|
|
3
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: safe */
|
|
4
|
+
const keyColors = [
|
|
5
|
+
"\x1B[36m",
|
|
6
|
+
"\x1B[35m",
|
|
7
|
+
"\x1B[34m",
|
|
8
|
+
"\x1B[32m",
|
|
9
|
+
"\x1B[33m"
|
|
10
|
+
];
|
|
11
|
+
const reset = "\x1B[0m";
|
|
12
|
+
const bold = "\x1B[1m";
|
|
13
|
+
/**
|
|
14
|
+
* Returns a shallow copy of an object with humanized key names.
|
|
15
|
+
*/
|
|
16
|
+
const transformKeys = (obj) => {
|
|
17
|
+
return Object.fromEntries(Object.entries(obj).map(([k, v]) => [formatKey(k), v]));
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Humanizes a key by spacing words and title-casing tokens.
|
|
21
|
+
*/
|
|
22
|
+
const formatKey = (key) => key.replace(/[_-]/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
23
|
+
/**
|
|
24
|
+
* Formats a primitive-like value for display.
|
|
25
|
+
*/
|
|
26
|
+
const formatValue = (value) => {
|
|
27
|
+
if (value === null) return "null";
|
|
28
|
+
if (typeof value === "bigint") return `${value}n`;
|
|
29
|
+
if (value instanceof Date) return value.toISOString();
|
|
30
|
+
if (typeof value === "string") return value;
|
|
31
|
+
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
32
|
+
return String(value);
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Returns true when a value is a display-friendly primitive.
|
|
36
|
+
*/
|
|
37
|
+
const isPrimitive = (v) => v === null || typeof v !== "object" || v instanceof Date;
|
|
38
|
+
/**
|
|
39
|
+
* Determines whether an array contains only flat objects of primitives.
|
|
40
|
+
*/
|
|
41
|
+
const isFlatObjectArray = (arr) => arr.length > 0 && arr.every((item) => item && typeof item === "object" && !Array.isArray(item) && Object.values(item).every(isPrimitive));
|
|
42
|
+
/**
|
|
43
|
+
* Formats objects or arrays into a human-friendly CLI display string.
|
|
44
|
+
*
|
|
45
|
+
* Uses colorized keys when printing objects, and falls back to tabular
|
|
46
|
+
* output for flat object arrays at the root level.
|
|
47
|
+
*/
|
|
48
|
+
const prettyFormat = (input, depth = 0, isRoot = true) => {
|
|
49
|
+
const indent = 2;
|
|
50
|
+
const maxDepth = 6;
|
|
51
|
+
const space = " ".repeat(indent * depth);
|
|
52
|
+
if (depth > maxDepth) return `${space}…`;
|
|
53
|
+
if (isRoot && Array.isArray(input) && isFlatObjectArray(input)) {
|
|
54
|
+
const transformed = input.map(transformKeys);
|
|
55
|
+
console.table(transformed);
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(input)) return input.map((item, i) => {
|
|
59
|
+
if (isPrimitive(item)) return `${space}${formatValue(item)}`;
|
|
60
|
+
return `${space}[${i}]\n${prettyFormat(item, depth + 1, false)}`;
|
|
61
|
+
}).join("\n");
|
|
62
|
+
return Object.entries(input).map(([key, value]) => {
|
|
63
|
+
const k = `${bold}${keyColors[depth % keyColors.length]}${formatKey(key)}${reset}`;
|
|
64
|
+
if (isPrimitive(value)) return `${space}${k}: ${formatValue(value)}`;
|
|
65
|
+
return `${space}${k}:\n${prettyFormat(value, depth + 1, false)}`;
|
|
66
|
+
}).join("\n");
|
|
67
|
+
};
|
|
68
|
+
//#endregion
|
|
69
|
+
export { prettyFormat };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=pretty.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretty.mjs","names":[],"sources":["../../src/helpers/pretty.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nconst keyColors = [\n \"\\x1b[36m\", // cyan\n \"\\x1b[35m\", // magenta\n \"\\x1b[34m\", // blue\n \"\\x1b[32m\", // green\n \"\\x1b[33m\", // yellow\n];\n\nconst reset = \"\\x1b[0m\";\nconst bold = \"\\x1b[1m\";\n\n/**\n * Returns a shallow copy of an object with humanized key names.\n */\nconst transformKeys = (obj: Record<string, any>) => {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [formatKey(k), v]),\n );\n};\n\n/**\n * Humanizes a key by spacing words and title-casing tokens.\n */\nconst formatKey = (key: string) =>\n key\n .replace(/[_-]/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\n/**\n * Formats a primitive-like value for display.\n */\nconst formatValue = (value: any): string => {\n if (value === null) return \"null\";\n\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return String(value);\n};\n\n/**\n * Returns true when a value is a display-friendly primitive.\n */\nconst isPrimitive = (v: any) =>\n v === null || typeof v !== \"object\" || v instanceof Date;\n\n/**\n * Determines whether an array contains only flat objects of primitives.\n */\nconst isFlatObjectArray = (arr: Record<string, any>[]) =>\n arr.length > 0 &&\n arr.every(\n (item) =>\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n Object.values(item).every(isPrimitive),\n );\n\n/**\n * Formats objects or arrays into a human-friendly CLI display string.\n *\n * Uses colorized keys when printing objects, and falls back to tabular\n * output for flat object arrays at the root level.\n */\nexport const prettyFormat = (\n input: Record<string, any> | Record<string, any>[],\n depth = 0,\n isRoot = true,\n): string => {\n const colors = true;\n const indent = 2;\n const maxDepth = 6;\n const space = \" \".repeat(indent * depth);\n\n if (depth > maxDepth) return `${space}…`;\n\n if (isRoot && Array.isArray(input) && isFlatObjectArray(input)) {\n const transformed = input.map(transformKeys);\n console.table(transformed);\n return \"\";\n }\n\n // Array\n if (Array.isArray(input)) {\n return input\n .map((item, i) => {\n if (isPrimitive(item)) {\n return `${space}${formatValue(item)}`;\n }\n\n return `${space}[${i}]\\n${prettyFormat(item, depth + 1, false)}`;\n })\n .join(\"\\n\");\n }\n\n // Object\n return Object.entries(input)\n .map(([key, value]) => {\n const color = keyColors[depth % keyColors.length];\n const k = colors\n ? `${bold}${color}${formatKey(key)}${reset}`\n : formatKey(key);\n\n if (isPrimitive(value)) {\n return `${space}${k}: ${formatValue(value)}`;\n }\n\n return `${space}${k}:\\n${prettyFormat(value, depth + 1, false)}`;\n })\n .join(\"\\n\");\n};\n"],"mappings":";;;AACA,MAAM,YAAY;CAChB;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,QAAQ;AACd,MAAM,OAAO;;;;AAKb,MAAM,iBAAiB,QAA6B;AAClD,QAAO,OAAO,YACZ,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CACvD;;;;;AAMH,MAAM,aAAa,QACjB,IACG,QAAQ,SAAS,IAAI,CACrB,QAAQ,mBAAmB,QAAQ,CACnC,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC;;;;AAK7C,MAAM,eAAe,UAAuB;AAC1C,KAAI,UAAU,KAAM,QAAO;AAE3B,KAAI,OAAO,UAAU,SACnB,QAAO,GAAG,MAAM;AAGlB,KAAI,iBAAiB,KACnB,QAAO,MAAM,aAAa;AAG5B,KAAI,OAAO,UAAU,SACnB,QAAO;AAGT,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,QAAO,OAAO,MAAM;AAGtB,QAAO,OAAO,MAAM;;;;;AAMtB,MAAM,eAAe,MACnB,MAAM,QAAQ,OAAO,MAAM,YAAY,aAAa;;;;AAKtD,MAAM,qBAAqB,QACzB,IAAI,SAAS,KACb,IAAI,OACD,SACC,QACA,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,KAAK,IACpB,OAAO,OAAO,KAAK,CAAC,MAAM,YAAY,CACzC;;;;;;;AAQH,MAAa,gBACX,OACA,QAAQ,GACR,SAAS,SACE;CAEX,MAAM,SAAS;CACf,MAAM,WAAW;CACjB,MAAM,QAAQ,IAAI,OAAO,SAAS,MAAM;AAExC,KAAI,QAAQ,SAAU,QAAO,GAAG,MAAM;AAEtC,KAAI,UAAU,MAAM,QAAQ,MAAM,IAAI,kBAAkB,MAAM,EAAE;EAC9D,MAAM,cAAc,MAAM,IAAI,cAAc;AAC5C,UAAQ,MAAM,YAAY;AAC1B,SAAO;;AAIT,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MACJ,KAAK,MAAM,MAAM;AAChB,MAAI,YAAY,KAAK,CACnB,QAAO,GAAG,QAAQ,YAAY,KAAK;AAGrC,SAAO,GAAG,MAAM,GAAG,EAAE,KAAK,aAAa,MAAM,QAAQ,GAAG,MAAM;GAC9D,CACD,KAAK,KAAK;AAIf,QAAO,OAAO,QAAQ,MAAM,CACzB,KAAK,CAAC,KAAK,WAAW;EAErB,MAAM,IACF,GAAG,OAFO,UAAU,QAAQ,UAAU,UAEpB,UAAU,IAAI,GAAG;AAGvC,MAAI,YAAY,MAAM,CACpB,QAAO,GAAG,QAAQ,EAAE,IAAI,YAAY,MAAM;AAG5C,SAAO,GAAG,QAAQ,EAAE,KAAK,aAAa,OAAO,QAAQ,GAAG,MAAM;GAC9D,CACD,KAAK,KAAK"}
|