@did-btcr2/cli 0.14.0 → 0.15.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.
Files changed (52) hide show
  1. package/README.md +61 -13
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cjs/index.js +637 -54
  4. package/dist/esm/src/cli.js +23 -2
  5. package/dist/esm/src/cli.js.map +1 -1
  6. package/dist/esm/src/commands/config.js +124 -8
  7. package/dist/esm/src/commands/config.js.map +1 -1
  8. package/dist/esm/src/commands/create.js +10 -1
  9. package/dist/esm/src/commands/create.js.map +1 -1
  10. package/dist/esm/src/commands/deactivate.js +14 -2
  11. package/dist/esm/src/commands/deactivate.js.map +1 -1
  12. package/dist/esm/src/commands/profile.js +5 -3
  13. package/dist/esm/src/commands/profile.js.map +1 -1
  14. package/dist/esm/src/commands/update.js +14 -2
  15. package/dist/esm/src/commands/update.js.map +1 -1
  16. package/dist/esm/src/config-schema.js +149 -0
  17. package/dist/esm/src/config-schema.js.map +1 -0
  18. package/dist/esm/src/config.js +506 -39
  19. package/dist/esm/src/config.js.map +1 -1
  20. package/dist/esm/src/keystore/paths.js +3 -2
  21. package/dist/esm/src/keystore/paths.js.map +1 -1
  22. package/dist/esm/src/output.js +49 -0
  23. package/dist/esm/src/output.js.map +1 -1
  24. package/dist/esm/src/types.js +11 -0
  25. package/dist/esm/src/types.js.map +1 -1
  26. package/dist/types/src/cli.d.ts.map +1 -1
  27. package/dist/types/src/commands/config.d.ts.map +1 -1
  28. package/dist/types/src/commands/create.d.ts.map +1 -1
  29. package/dist/types/src/commands/deactivate.d.ts.map +1 -1
  30. package/dist/types/src/commands/profile.d.ts.map +1 -1
  31. package/dist/types/src/commands/update.d.ts.map +1 -1
  32. package/dist/types/src/config-schema.d.ts +24 -0
  33. package/dist/types/src/config-schema.d.ts.map +1 -0
  34. package/dist/types/src/config.d.ts +219 -5
  35. package/dist/types/src/config.d.ts.map +1 -1
  36. package/dist/types/src/keystore/paths.d.ts.map +1 -1
  37. package/dist/types/src/output.d.ts +22 -0
  38. package/dist/types/src/output.d.ts.map +1 -1
  39. package/dist/types/src/types.d.ts +32 -0
  40. package/dist/types/src/types.d.ts.map +1 -1
  41. package/package.json +5 -5
  42. package/src/cli.ts +25 -2
  43. package/src/commands/config.ts +135 -8
  44. package/src/commands/create.ts +13 -1
  45. package/src/commands/deactivate.ts +22 -2
  46. package/src/commands/profile.ts +5 -3
  47. package/src/commands/update.ts +22 -2
  48. package/src/config-schema.ts +178 -0
  49. package/src/config.ts +676 -43
  50. package/src/keystore/paths.ts +3 -2
  51. package/src/output.ts +53 -0
  52. package/src/types.ts +22 -0
@@ -0,0 +1,149 @@
1
+ import { CLIError } from './error.js';
2
+ import { SUPPORTED_NETWORKS } from './types.js';
3
+ /**
4
+ * Declarative schema of the known config-file paths, used by both the write-time
5
+ * validation in `config set` and the strict `config validate` check so the two
6
+ * cannot disagree. Leaves name a value kind: `'string'`, `'number'`, `'object'`
7
+ * (a free-form map, e.g. headers), or `'enum:<name>'`. The `'*'` key under
8
+ * `profiles` matches any profile name.
9
+ */
10
+ const CONFIG_SCHEMA = {
11
+ schemaVersion: 'number',
12
+ defaults: {
13
+ profile: 'string',
14
+ network: 'enum:network',
15
+ output: 'enum:output',
16
+ },
17
+ profiles: {
18
+ '*': {
19
+ network: 'enum:network',
20
+ btc: {
21
+ rest: 'string',
22
+ rpcUrl: 'string',
23
+ rpcUser: 'string',
24
+ rpcPass: 'string',
25
+ feeRate: 'number',
26
+ changeAddress: 'string',
27
+ timeoutMs: 'number',
28
+ headers: 'object',
29
+ wallet: 'string',
30
+ rpcHeaders: 'object',
31
+ },
32
+ cas: {
33
+ gateway: 'string',
34
+ rpcUrl: 'string',
35
+ timeoutMs: 'number',
36
+ },
37
+ identity: {
38
+ keystore: 'string',
39
+ default: 'string',
40
+ },
41
+ },
42
+ },
43
+ };
44
+ /**
45
+ * Resolves a dotted config path to its schema node: a leaf kind string, a nested
46
+ * {@link SchemaNode}, or `undefined` when the path is not part of the known
47
+ * schema. A segment under `profiles` matches the `'*'` template.
48
+ */
49
+ function lookupSchemaNode(dotted) {
50
+ let node = CONFIG_SCHEMA;
51
+ for (const segment of dotted.split('.')) {
52
+ if (typeof node !== 'object')
53
+ return undefined;
54
+ // Own-property checks only: `in` would match inherited Object.prototype names
55
+ // (`toString`, `constructor`, `__proto__`), treating a builtin as a known key.
56
+ if (Object.hasOwn(node, segment)) {
57
+ node = node[segment];
58
+ }
59
+ else if (Object.hasOwn(node, '*')) {
60
+ node = node['*'];
61
+ }
62
+ else {
63
+ return undefined;
64
+ }
65
+ }
66
+ return node;
67
+ }
68
+ /** Whether a dotted path is part of the known config schema (leaf or intermediate). */
69
+ export function isKnownConfigPath(dotted) {
70
+ return lookupSchemaNode(dotted) !== undefined;
71
+ }
72
+ /**
73
+ * Validates a value against a leaf kind, throwing a {@link CLIError} for a value
74
+ * that does not match: an out-of-range enum, a non-number for a `number` leaf, or
75
+ * a non-object for an `object` leaf (a map such as `headers`). A no-op for
76
+ * `string` leaves and for intermediate nodes.
77
+ */
78
+ function assertLeafValue(kind, dotted, value) {
79
+ if (kind === 'enum:network' && !SUPPORTED_NETWORKS.includes(value)) {
80
+ throw new CLIError(`Invalid value for ${dotted}: "${String(value)}". Expected one of ${SUPPORTED_NETWORKS.join(', ')}.`, 'INVALID_ARGUMENT_ERROR', { path: dotted, value });
81
+ }
82
+ if (kind === 'enum:output' && value !== 'json' && value !== 'text') {
83
+ throw new CLIError(`Invalid value for ${dotted}: "${String(value)}". Expected "json" or "text".`, 'INVALID_ARGUMENT_ERROR', { path: dotted, value });
84
+ }
85
+ if (kind === 'number' && typeof value !== 'number') {
86
+ throw new CLIError(`Invalid value for ${dotted}: expected a number, got ${typeof value}. `
87
+ + 'Pass a bare number (e.g. `config set ' + dotted + ' 5`).', 'INVALID_ARGUMENT_ERROR', { path: dotted, value });
88
+ }
89
+ if (kind === 'object' && (typeof value !== 'object' || value === null || Array.isArray(value))) {
90
+ throw new CLIError(`Invalid value for ${dotted}: expected a JSON object (e.g. \`config set ${dotted} '{"Key":"Value"}'\`).`, 'INVALID_ARGUMENT_ERROR', { path: dotted, value });
91
+ }
92
+ }
93
+ /**
94
+ * Write-time validation for `config set`. An enum, number, or object leaf whose
95
+ * value has the wrong kind is a hard rejection (throws). An unknown path is
96
+ * permitted but reported, so `config set` can warn and still write (keeping
97
+ * forward-compatible and third-party keys usable). Returns `{ unknownPath }`.
98
+ */
99
+ export function validateConfigSet(dotted, value) {
100
+ const node = lookupSchemaNode(dotted);
101
+ if (node === undefined)
102
+ return { unknownPath: true };
103
+ if (typeof node === 'string') {
104
+ assertLeafValue(node, dotted, value);
105
+ }
106
+ return { unknownPath: false };
107
+ }
108
+ /**
109
+ * Strict validation for `config validate`: walks a parsed config and collects
110
+ * every unknown key and out-of-enum value, plus a `schemaVersion` that is newer
111
+ * than this CLI supports. Never throws; returns the full list so the caller can
112
+ * report all problems at once.
113
+ */
114
+ export function findConfigIssues(config, supportedSchemaVersion) {
115
+ const issues = [];
116
+ const version = config.schemaVersion;
117
+ if (typeof version === 'number' && version > supportedSchemaVersion) {
118
+ issues.push({
119
+ path: 'schemaVersion',
120
+ issue: `newer than supported (${version} > ${supportedSchemaVersion}); upgrade the CLI to use this file`,
121
+ });
122
+ }
123
+ walk(config, [], issues);
124
+ return issues;
125
+ }
126
+ /** Recursively collects unknown-key and bad-enum issues under `prefix`. */
127
+ function walk(obj, prefix, issues) {
128
+ for (const [key, value] of Object.entries(obj)) {
129
+ const path = [...prefix, key];
130
+ const dotted = path.join('.');
131
+ const node = lookupSchemaNode(dotted);
132
+ if (node === undefined) {
133
+ issues.push({ path: dotted, issue: 'unknown key' });
134
+ continue; // Do not descend into an unknown subtree.
135
+ }
136
+ if (typeof node === 'string') {
137
+ try {
138
+ assertLeafValue(node, dotted, value);
139
+ }
140
+ catch (error) {
141
+ issues.push({ path: dotted, issue: error.message });
142
+ }
143
+ }
144
+ else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
145
+ walk(value, path, issues);
146
+ }
147
+ }
148
+ }
149
+ //# sourceMappingURL=config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../../src/config-schema.ts"],"names":[],"mappings":"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"}