@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.
Files changed (143) hide show
  1. package/dist/commands/index.mjs +21 -0
  2. package/dist/commands/index.mjs.map +1 -0
  3. package/dist/commands/keystore/create.mjs +74 -0
  4. package/dist/commands/keystore/create.mjs.map +1 -0
  5. package/dist/commands/keystore/decrypt.mjs +71 -0
  6. package/dist/commands/keystore/decrypt.mjs.map +1 -0
  7. package/dist/commands/keystore/import.mjs +84 -0
  8. package/dist/commands/keystore/import.mjs.map +1 -0
  9. package/dist/commands/keystore/index.mjs +28 -0
  10. package/dist/commands/keystore/index.mjs.map +1 -0
  11. package/dist/commands/keystore/info.mjs +62 -0
  12. package/dist/commands/keystore/info.mjs.map +1 -0
  13. package/dist/commands/keystore/list.mjs +46 -0
  14. package/dist/commands/keystore/list.mjs.map +1 -0
  15. package/dist/commands/keystore/remove.mjs +51 -0
  16. package/dist/commands/keystore/remove.mjs.map +1 -0
  17. package/dist/commands/mcp/index.mjs +13 -0
  18. package/dist/commands/mcp/index.mjs.map +1 -0
  19. package/dist/commands/mcp/start.mjs +82 -0
  20. package/dist/commands/mcp/start.mjs.map +1 -0
  21. package/dist/commands/schema/index.mjs +55 -0
  22. package/dist/commands/schema/index.mjs.map +1 -0
  23. package/dist/commands/session-key/create/index.mjs +87 -0
  24. package/dist/commands/session-key/create/index.mjs.map +1 -0
  25. package/dist/commands/session-key/create/prompts/base.mjs +52 -0
  26. package/dist/commands/session-key/create/prompts/base.mjs.map +1 -0
  27. package/dist/commands/session-key/create/prompts/call.mjs +85 -0
  28. package/dist/commands/session-key/create/prompts/call.mjs.map +1 -0
  29. package/dist/commands/session-key/create/prompts/common.mjs +27 -0
  30. package/dist/commands/session-key/create/prompts/common.mjs.map +1 -0
  31. package/dist/commands/session-key/create/prompts/gas.mjs +19 -0
  32. package/dist/commands/session-key/create/prompts/gas.mjs.map +1 -0
  33. package/dist/commands/session-key/create/prompts/index.mjs +44 -0
  34. package/dist/commands/session-key/create/prompts/index.mjs.map +1 -0
  35. package/dist/commands/session-key/create/prompts/rate-limit.mjs +40 -0
  36. package/dist/commands/session-key/create/prompts/rate-limit.mjs.map +1 -0
  37. package/dist/commands/session-key/create/prompts/signature-caller.mjs +26 -0
  38. package/dist/commands/session-key/create/prompts/signature-caller.mjs.map +1 -0
  39. package/dist/commands/session-key/create/prompts/timestamp.mjs +32 -0
  40. package/dist/commands/session-key/create/prompts/timestamp.mjs.map +1 -0
  41. package/dist/commands/session-key/index.mjs +26 -0
  42. package/dist/commands/session-key/index.mjs.map +1 -0
  43. package/dist/commands/session-key/info.mjs +64 -0
  44. package/dist/commands/session-key/info.mjs.map +1 -0
  45. package/dist/commands/session-key/list.mjs +54 -0
  46. package/dist/commands/session-key/list.mjs.map +1 -0
  47. package/dist/commands/session-key/remove.mjs +51 -0
  48. package/dist/commands/session-key/remove.mjs.map +1 -0
  49. package/dist/commands/session-key/status.mjs +64 -0
  50. package/dist/commands/session-key/status.mjs.map +1 -0
  51. package/dist/commands/smart-account/create.mjs +94 -0
  52. package/dist/commands/smart-account/create.mjs.map +1 -0
  53. package/dist/commands/smart-account/import.mjs +45 -0
  54. package/dist/commands/smart-account/import.mjs.map +1 -0
  55. package/dist/commands/smart-account/index.mjs +30 -0
  56. package/dist/commands/smart-account/index.mjs.map +1 -0
  57. package/dist/commands/smart-account/info.mjs +66 -0
  58. package/dist/commands/smart-account/info.mjs.map +1 -0
  59. package/dist/commands/smart-account/list.mjs +48 -0
  60. package/dist/commands/smart-account/list.mjs.map +1 -0
  61. package/dist/commands/smart-account/remove.mjs +54 -0
  62. package/dist/commands/smart-account/remove.mjs.map +1 -0
  63. package/dist/commands/smart-account/status.mjs +63 -0
  64. package/dist/commands/smart-account/status.mjs.map +1 -0
  65. package/dist/dto/index.mjs +6 -0
  66. package/dist/dto/keystore.mjs +44 -0
  67. package/dist/dto/keystore.mjs.map +1 -0
  68. package/dist/dto/mcp.mjs +13 -0
  69. package/dist/dto/mcp.mjs.map +1 -0
  70. package/dist/dto/session-key.mjs +54 -0
  71. package/dist/dto/session-key.mjs.map +1 -0
  72. package/dist/dto/smart-account.mjs +45 -0
  73. package/dist/dto/smart-account.mjs.map +1 -0
  74. package/dist/flags/global.mjs +29 -0
  75. package/dist/flags/global.mjs.map +1 -0
  76. package/dist/flags/shared.mjs +11 -0
  77. package/dist/flags/shared.mjs.map +1 -0
  78. package/dist/helpers/humanize.mjs +153 -0
  79. package/dist/helpers/humanize.mjs.map +1 -0
  80. package/dist/helpers/paths.mjs +31 -0
  81. package/dist/helpers/paths.mjs.map +1 -0
  82. package/dist/helpers/policy.mjs +89 -0
  83. package/dist/helpers/policy.mjs.map +1 -0
  84. package/dist/helpers/pretty.mjs +71 -0
  85. package/dist/helpers/pretty.mjs.map +1 -0
  86. package/dist/index.mjs +18 -3266
  87. package/dist/index.mjs.map +1 -1
  88. package/dist/layers/config.mjs +124 -0
  89. package/dist/layers/config.mjs.map +1 -0
  90. package/dist/layers/index.mjs +11 -0
  91. package/dist/layers/keystore.mjs +225 -0
  92. package/dist/layers/keystore.mjs.map +1 -0
  93. package/dist/layers/mcp-context.mjs +8 -0
  94. package/dist/layers/mcp-context.mjs.map +1 -0
  95. package/dist/layers/mcp.mjs +31 -0
  96. package/dist/layers/mcp.mjs.map +1 -0
  97. package/dist/layers/output.mjs +21 -0
  98. package/dist/layers/output.mjs.map +1 -0
  99. package/dist/layers/prompt.mjs +78 -0
  100. package/dist/layers/prompt.mjs.map +1 -0
  101. package/dist/layers/session-key.mjs +218 -0
  102. package/dist/layers/session-key.mjs.map +1 -0
  103. package/dist/layers/smart-account.mjs +172 -0
  104. package/dist/layers/smart-account.mjs.map +1 -0
  105. package/dist/layers/web3.mjs +83 -0
  106. package/dist/layers/web3.mjs.map +1 -0
  107. package/dist/mcp/helpers/common.mjs +9 -0
  108. package/dist/mcp/helpers/common.mjs.map +1 -0
  109. package/dist/mcp/helpers/index.mjs +4 -0
  110. package/dist/mcp/helpers/session-key.mjs +129 -0
  111. package/dist/mcp/helpers/session-key.mjs.map +1 -0
  112. package/dist/mcp/index.mjs +60 -0
  113. package/dist/mcp/index.mjs.map +1 -0
  114. package/dist/mcp/mcp.mjs +15 -0
  115. package/dist/mcp/mcp.mjs.map +1 -0
  116. package/dist/mcp/tools/account/address.mjs +20 -0
  117. package/dist/mcp/tools/account/address.mjs.map +1 -0
  118. package/dist/mcp/tools/account/get-balance.mjs +54 -0
  119. package/dist/mcp/tools/account/get-balance.mjs.map +1 -0
  120. package/dist/mcp/tools/account/index.mjs +15 -0
  121. package/dist/mcp/tools/account/index.mjs.map +1 -0
  122. package/dist/mcp/tools/read/index.mjs +11 -0
  123. package/dist/mcp/tools/read/index.mjs.map +1 -0
  124. package/dist/mcp/tools/read/read-contract.mjs +49 -0
  125. package/dist/mcp/tools/read/read-contract.mjs.map +1 -0
  126. package/dist/mcp/tools/transaction/execute-transaction.mjs +38 -0
  127. package/dist/mcp/tools/transaction/execute-transaction.mjs.map +1 -0
  128. package/dist/mcp/tools/transaction/index.mjs +15 -0
  129. package/dist/mcp/tools/transaction/index.mjs.map +1 -0
  130. package/dist/mcp/tools/transaction/native-transfer.mjs +59 -0
  131. package/dist/mcp/tools/transaction/native-transfer.mjs.map +1 -0
  132. package/dist/schema/chain.mjs +124 -0
  133. package/dist/schema/chain.mjs.map +1 -0
  134. package/dist/schema/common.mjs +29 -0
  135. package/dist/schema/common.mjs.map +1 -0
  136. package/dist/schema/index.mjs +5 -0
  137. package/dist/schema/policy.mjs +114 -0
  138. package/dist/schema/policy.mjs.map +1 -0
  139. package/dist/schema/tx.mjs +19 -0
  140. package/dist/schema/tx.mjs.map +1 -0
  141. package/dist/types/index.mjs +11 -0
  142. package/dist/types/index.mjs.map +1 -0
  143. 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"}