@partylayer/conformance-runner 0.2.8 → 0.2.9

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.
@@ -1,3 +1,5 @@
1
+ import { CIP0103Provider } from '@partylayer/core';
2
+
1
3
  /**
2
4
  * CIP-0103 Conformance Test Suite
3
5
  *
@@ -12,20 +14,21 @@
12
14
  * - createProviderBridge() (bridge path)
13
15
  * - Any third-party CIP-0103 Provider
14
16
  */
15
- import type { CIP0103Provider } from '@partylayer/core';
16
- export interface CIP0103TestResult {
17
+
18
+ interface CIP0103TestResult {
17
19
  name: string;
18
20
  category: 'interface' | 'method' | 'event' | 'error' | 'lifecycle';
19
21
  passed: boolean;
20
22
  error?: string;
21
23
  details?: Record<string, unknown>;
22
24
  }
23
- export interface CIP0103ConformanceReport {
25
+ interface CIP0103ConformanceReport {
24
26
  total: number;
25
27
  passed: number;
26
28
  failed: number;
27
29
  results: CIP0103TestResult[];
28
30
  }
29
- export declare function runCIP0103ConformanceTests(provider: CIP0103Provider): Promise<CIP0103ConformanceReport>;
30
- export declare function formatCIP0103Report(report: CIP0103ConformanceReport): string;
31
- //# sourceMappingURL=cip0103-tests.d.ts.map
31
+ declare function runCIP0103ConformanceTests(provider: CIP0103Provider): Promise<CIP0103ConformanceReport>;
32
+ declare function formatCIP0103Report(report: CIP0103ConformanceReport): string;
33
+
34
+ export { type CIP0103ConformanceReport, type CIP0103TestResult, formatCIP0103Report, runCIP0103ConformanceTests };
@@ -1,279 +1,232 @@
1
- /**
2
- * CIP-0103 Conformance Test Suite
3
- *
4
- * Validates that a Provider implementation conforms to CIP-0103:
5
- * - Interface shape (request, on, emit, removeListener)
6
- * - All 10 mandatory methods are handled
7
- * - Event subscription returns Provider for chaining
8
- * - Error responses use ProviderRpcError with numeric codes
9
- *
10
- * This suite can be run against:
11
- * - PartyLayerProvider (native path)
12
- * - createProviderBridge() (bridge path)
13
- * - Any third-party CIP-0103 Provider
14
- */
15
1
  import { CIP0103_MANDATORY_METHODS, CIP0103_EVENTS } from '@partylayer/core';
16
- // ─── Runner ─────────────────────────────────────────────────────────────────
17
- export async function runCIP0103ConformanceTests(provider) {
18
- const results = [];
19
- // ── Interface shape tests ─────────────────────────────────────────────
20
- results.push({
21
- name: 'Provider has request() method',
22
- category: 'interface',
23
- passed: typeof provider.request === 'function',
24
- });
25
- results.push({
26
- name: 'Provider has on() method',
27
- category: 'interface',
28
- passed: typeof provider.on === 'function',
29
- });
30
- results.push({
31
- name: 'Provider has emit() method',
32
- category: 'interface',
33
- passed: typeof provider.emit === 'function',
34
- });
35
- results.push({
36
- name: 'Provider has removeListener() method',
37
- category: 'interface',
38
- passed: typeof provider.removeListener === 'function',
39
- });
40
- // ── Method presence tests ─────────────────────────────────────────────
41
- for (const method of CIP0103_MANDATORY_METHODS) {
42
- try {
43
- await provider.request({ method, params: {} });
44
- results.push({
45
- name: `Method "${method}" is handled`,
46
- category: 'method',
47
- passed: true,
48
- });
49
- }
50
- catch (err) {
51
- // A valid ProviderRpcError means the method IS handled
52
- // (it just may not be authorized / connected yet)
53
- const isValidError = isNumericCodeError(err);
54
- results.push({
55
- name: `Method "${method}" is handled`,
56
- category: 'method',
57
- passed: isValidError,
58
- error: isValidError
59
- ? undefined
60
- : `Expected ProviderRpcError with numeric code, got: ${String(err)}`,
61
- details: isValidError
62
- ? { code: err.code }
63
- : undefined,
64
- });
65
- }
2
+
3
+ // src/cip0103-tests.ts
4
+ async function runCIP0103ConformanceTests(provider) {
5
+ const results = [];
6
+ results.push({
7
+ name: "Provider has request() method",
8
+ category: "interface",
9
+ passed: typeof provider.request === "function"
10
+ });
11
+ results.push({
12
+ name: "Provider has on() method",
13
+ category: "interface",
14
+ passed: typeof provider.on === "function"
15
+ });
16
+ results.push({
17
+ name: "Provider has emit() method",
18
+ category: "interface",
19
+ passed: typeof provider.emit === "function"
20
+ });
21
+ results.push({
22
+ name: "Provider has removeListener() method",
23
+ category: "interface",
24
+ passed: typeof provider.removeListener === "function"
25
+ });
26
+ for (const method of CIP0103_MANDATORY_METHODS) {
27
+ try {
28
+ await provider.request({ method, params: {} });
29
+ results.push({
30
+ name: `Method "${method}" is handled`,
31
+ category: "method",
32
+ passed: true
33
+ });
34
+ } catch (err) {
35
+ const isValidError = isNumericCodeError(err);
36
+ results.push({
37
+ name: `Method "${method}" is handled`,
38
+ category: "method",
39
+ passed: isValidError,
40
+ error: isValidError ? void 0 : `Expected ProviderRpcError with numeric code, got: ${String(err)}`,
41
+ details: isValidError ? { code: err.code } : void 0
42
+ });
66
43
  }
67
- // ── Event chaining tests ──────────────────────────────────────────────
68
- const noopHandler = () => { };
69
- const onResult = provider.on('statusChanged', noopHandler);
44
+ }
45
+ const noopHandler = () => {
46
+ };
47
+ const onResult = provider.on("statusChanged", noopHandler);
48
+ results.push({
49
+ name: "on() returns Provider for chaining",
50
+ category: "event",
51
+ passed: onResult === provider,
52
+ error: onResult === provider ? void 0 : "on() did not return the Provider instance"
53
+ });
54
+ const removeResult = provider.removeListener("statusChanged", noopHandler);
55
+ results.push({
56
+ name: "removeListener() returns Provider for chaining",
57
+ category: "event",
58
+ passed: removeResult === provider,
59
+ error: removeResult === provider ? void 0 : "removeListener() did not return the Provider instance"
60
+ });
61
+ try {
62
+ await provider.request({ method: "__cip0103_conformance_nonexistent__" });
70
63
  results.push({
71
- name: 'on() returns Provider for chaining',
72
- category: 'event',
73
- passed: onResult === provider,
74
- error: onResult === provider
75
- ? undefined
76
- : 'on() did not return the Provider instance',
64
+ name: "Unsupported method returns ProviderRpcError",
65
+ category: "error",
66
+ passed: false,
67
+ error: "Expected error for unsupported method, got success"
77
68
  });
78
- const removeResult = provider.removeListener('statusChanged', noopHandler);
69
+ } catch (err) {
70
+ const hasNumericCode = isNumericCodeError(err);
79
71
  results.push({
80
- name: 'removeListener() returns Provider for chaining',
81
- category: 'event',
82
- passed: removeResult === provider,
83
- error: removeResult === provider
84
- ? undefined
85
- : 'removeListener() did not return the Provider instance',
72
+ name: "Unsupported method returns error with numeric code",
73
+ category: "error",
74
+ passed: hasNumericCode,
75
+ error: hasNumericCode ? void 0 : `Expected numeric code, got: ${String(err)}`,
76
+ details: hasNumericCode ? { code: err.code } : void 0
86
77
  });
87
- // ── Error code validation ─────────────────────────────────────────────
78
+ if (hasNumericCode) {
79
+ const code = err.code;
80
+ const isCorrectCode = code === 4200 || code === -32601;
81
+ results.push({
82
+ name: "Unsupported method uses code 4200 or -32601",
83
+ category: "error",
84
+ passed: isCorrectCode,
85
+ error: isCorrectCode ? void 0 : `Expected code 4200 or -32601, got ${code}`,
86
+ details: { code }
87
+ });
88
+ }
89
+ }
90
+ const emitResult = provider.emit("__cip0103_conformance_test__");
91
+ results.push({
92
+ name: "emit() returns boolean",
93
+ category: "interface",
94
+ passed: typeof emitResult === "boolean",
95
+ error: typeof emitResult === "boolean" ? void 0 : `emit() returned ${typeof emitResult}`
96
+ });
97
+ {
98
+ const txEvents = [];
99
+ const txHandler = (...args) => txEvents.push(...args);
100
+ provider.on(CIP0103_EVENTS.TX_CHANGED, txHandler);
88
101
  try {
89
- await provider.request({ method: '__cip0103_conformance_nonexistent__' });
102
+ await provider.request({
103
+ method: "prepareExecute",
104
+ params: { tx: { _conformance: true } }
105
+ });
106
+ results.push({
107
+ name: 'prepareExecute emits txChanged with "pending"',
108
+ category: "lifecycle",
109
+ passed: txEvents.some(
110
+ (e) => typeof e === "object" && e !== null && e.status === "pending"
111
+ ),
112
+ error: txEvents.length === 0 ? "No txChanged events emitted" : void 0
113
+ });
114
+ const signedEvent = txEvents.find(
115
+ (e) => typeof e === "object" && e !== null && e.status === "signed"
116
+ );
117
+ results.push({
118
+ name: 'prepareExecute emits txChanged with "signed"',
119
+ category: "lifecycle",
120
+ passed: !!signedEvent
121
+ });
122
+ if (signedEvent) {
123
+ const payload = signedEvent.payload;
90
124
  results.push({
91
- name: 'Unsupported method returns ProviderRpcError',
92
- category: 'error',
93
- passed: false,
94
- error: 'Expected error for unsupported method, got success',
125
+ name: "signed event has payload.signature (string)",
126
+ category: "lifecycle",
127
+ passed: typeof payload?.signature === "string"
95
128
  });
96
- }
97
- catch (err) {
98
- const hasNumericCode = isNumericCodeError(err);
99
129
  results.push({
100
- name: 'Unsupported method returns error with numeric code',
101
- category: 'error',
102
- passed: hasNumericCode,
103
- error: hasNumericCode
104
- ? undefined
105
- : `Expected numeric code, got: ${String(err)}`,
106
- details: hasNumericCode
107
- ? { code: err.code }
108
- : undefined,
130
+ name: "signed event has payload.signedBy (string)",
131
+ category: "lifecycle",
132
+ passed: typeof payload?.signedBy === "string"
109
133
  });
110
- if (hasNumericCode) {
111
- const code = err.code;
112
- // Should be 4200 (UNSUPPORTED_METHOD) or -32601 (METHOD_NOT_FOUND)
113
- const isCorrectCode = code === 4200 || code === -32601;
114
- results.push({
115
- name: 'Unsupported method uses code 4200 or -32601',
116
- category: 'error',
117
- passed: isCorrectCode,
118
- error: isCorrectCode
119
- ? undefined
120
- : `Expected code 4200 or -32601, got ${code}`,
121
- details: { code },
122
- });
123
- }
124
- }
125
- // ── emit() returns boolean ────────────────────────────────────────────
126
- const emitResult = provider.emit('__cip0103_conformance_test__');
127
- results.push({
128
- name: 'emit() returns boolean',
129
- category: 'interface',
130
- passed: typeof emitResult === 'boolean',
131
- error: typeof emitResult === 'boolean'
132
- ? undefined
133
- : `emit() returned ${typeof emitResult}`,
134
- });
135
- // ── Transaction lifecycle tests ─────────────────────────────────────
136
- {
137
- const txEvents = [];
138
- const txHandler = (...args) => txEvents.push(...args);
139
- provider.on(CIP0103_EVENTS.TX_CHANGED, txHandler);
140
- try {
141
- await provider.request({
142
- method: 'prepareExecute',
143
- params: { tx: { _conformance: true } },
144
- });
145
- // Check that 'pending' was emitted
146
- results.push({
147
- name: 'prepareExecute emits txChanged with "pending"',
148
- category: 'lifecycle',
149
- passed: txEvents.some((e) => typeof e === 'object' && e !== null && e.status === 'pending'),
150
- error: txEvents.length === 0 ? 'No txChanged events emitted' : undefined,
151
- });
152
- // Check that 'signed' was emitted
153
- const signedEvent = txEvents.find((e) => typeof e === 'object' && e !== null && e.status === 'signed');
154
- results.push({
155
- name: 'prepareExecute emits txChanged with "signed"',
156
- category: 'lifecycle',
157
- passed: !!signedEvent,
158
- });
159
- // Validate 'signed' payload shape
160
- if (signedEvent) {
161
- const payload = signedEvent.payload;
162
- results.push({
163
- name: 'signed event has payload.signature (string)',
164
- category: 'lifecycle',
165
- passed: typeof payload?.signature === 'string',
166
- });
167
- results.push({
168
- name: 'signed event has payload.signedBy (string)',
169
- category: 'lifecycle',
170
- passed: typeof payload?.signedBy === 'string',
171
- });
172
- results.push({
173
- name: 'signed event has payload.party (string)',
174
- category: 'lifecycle',
175
- passed: typeof payload?.party === 'string',
176
- });
177
- }
178
- // Check that a terminal state was reached
179
- const hasTerminal = txEvents.some((e) => typeof e === 'object' &&
180
- e !== null &&
181
- (e.status === 'executed' ||
182
- e.status === 'failed'));
183
- results.push({
184
- name: 'prepareExecute reaches terminal tx state (executed or failed)',
185
- category: 'lifecycle',
186
- passed: hasTerminal,
187
- });
188
- // Validate 'executed' payload shape
189
- const executedEvent = txEvents.find((e) => typeof e === 'object' && e !== null && e.status === 'executed');
190
- if (executedEvent) {
191
- const payload = executedEvent.payload;
192
- results.push({
193
- name: 'executed event has payload.updateId (string)',
194
- category: 'lifecycle',
195
- passed: typeof payload?.updateId === 'string',
196
- });
197
- results.push({
198
- name: 'executed event has payload.completionOffset (number)',
199
- category: 'lifecycle',
200
- passed: typeof payload?.completionOffset === 'number',
201
- });
202
- }
203
- }
204
- catch {
205
- // prepareExecute may throw — still check if events were emitted
206
- results.push({
207
- name: 'prepareExecute emits txChanged events (despite error)',
208
- category: 'lifecycle',
209
- passed: txEvents.length > 0,
210
- error: txEvents.length === 0 ? 'No txChanged events emitted before error' : undefined,
211
- });
212
- }
213
- finally {
214
- provider.removeListener(CIP0103_EVENTS.TX_CHANGED, txHandler);
215
- }
216
- }
217
- // ── ledgerApi handling test ────────────────────────────────────────
218
- try {
219
- await provider.request({
220
- method: 'ledgerApi',
221
- params: { requestMethod: 'GET', resource: '/v1/state/acs' },
134
+ results.push({
135
+ name: "signed event has payload.party (string)",
136
+ category: "lifecycle",
137
+ passed: typeof payload?.party === "string"
222
138
  });
139
+ }
140
+ const hasTerminal = txEvents.some(
141
+ (e) => typeof e === "object" && e !== null && (e.status === "executed" || e.status === "failed")
142
+ );
143
+ results.push({
144
+ name: "prepareExecute reaches terminal tx state (executed or failed)",
145
+ category: "lifecycle",
146
+ passed: hasTerminal
147
+ });
148
+ const executedEvent = txEvents.find(
149
+ (e) => typeof e === "object" && e !== null && e.status === "executed"
150
+ );
151
+ if (executedEvent) {
152
+ const payload = executedEvent.payload;
223
153
  results.push({
224
- name: 'ledgerApi returns result (supported)',
225
- category: 'method',
226
- passed: true,
154
+ name: "executed event has payload.updateId (string)",
155
+ category: "lifecycle",
156
+ passed: typeof payload?.updateId === "string"
227
157
  });
228
- }
229
- catch (err) {
230
- // ProviderRpcError with numeric code = method is recognized
231
- const isHandled = isNumericCodeError(err);
232
158
  results.push({
233
- name: 'ledgerApi is handled (returns result or ProviderRpcError)',
234
- category: 'method',
235
- passed: isHandled,
236
- error: isHandled ? undefined : `Unexpected error type: ${String(err)}`,
159
+ name: "executed event has payload.completionOffset (number)",
160
+ category: "lifecycle",
161
+ passed: typeof payload?.completionOffset === "number"
237
162
  });
163
+ }
164
+ } catch {
165
+ results.push({
166
+ name: "prepareExecute emits txChanged events (despite error)",
167
+ category: "lifecycle",
168
+ passed: txEvents.length > 0,
169
+ error: txEvents.length === 0 ? "No txChanged events emitted before error" : void 0
170
+ });
171
+ } finally {
172
+ provider.removeListener(CIP0103_EVENTS.TX_CHANGED, txHandler);
238
173
  }
239
- // ── Summary ───────────────────────────────────────────────────────────
240
- const passed = results.filter((r) => r.passed).length;
241
- return {
242
- total: results.length,
243
- passed,
244
- failed: results.length - passed,
245
- results,
246
- };
174
+ }
175
+ try {
176
+ await provider.request({
177
+ method: "ledgerApi",
178
+ params: { requestMethod: "GET", resource: "/v1/state/acs" }
179
+ });
180
+ results.push({
181
+ name: "ledgerApi returns result (supported)",
182
+ category: "method",
183
+ passed: true
184
+ });
185
+ } catch (err) {
186
+ const isHandled = isNumericCodeError(err);
187
+ results.push({
188
+ name: "ledgerApi is handled (returns result or ProviderRpcError)",
189
+ category: "method",
190
+ passed: isHandled,
191
+ error: isHandled ? void 0 : `Unexpected error type: ${String(err)}`
192
+ });
193
+ }
194
+ const passed = results.filter((r) => r.passed).length;
195
+ return {
196
+ total: results.length,
197
+ passed,
198
+ failed: results.length - passed,
199
+ results
200
+ };
247
201
  }
248
- // ─── Helpers ────────────────────────────────────────────────────────────────
249
202
  function isNumericCodeError(err) {
250
- if (typeof err !== 'object' || err === null)
251
- return false;
252
- return typeof err.code === 'number';
203
+ if (typeof err !== "object" || err === null) return false;
204
+ return typeof err.code === "number";
253
205
  }
254
- // ─── Formatting ─────────────────────────────────────────────────────────────
255
- export function formatCIP0103Report(report) {
256
- const lines = [
257
- '═══ CIP-0103 Conformance Report ═══',
258
- '',
259
- `Total: ${report.total} Passed: ${report.passed} Failed: ${report.failed}`,
260
- '',
261
- ];
262
- const categories = ['interface', 'method', 'event', 'error', 'lifecycle'];
263
- for (const cat of categories) {
264
- const catResults = report.results.filter((r) => r.category === cat);
265
- if (catResults.length === 0)
266
- continue;
267
- lines.push(`── ${cat.toUpperCase()} ──`);
268
- for (const r of catResults) {
269
- const icon = r.passed ? '✓' : '✗';
270
- lines.push(` ${icon} ${r.name}`);
271
- if (r.error) {
272
- lines.push(` → ${r.error}`);
273
- }
274
- }
275
- lines.push('');
206
+ function formatCIP0103Report(report) {
207
+ const lines = [
208
+ "\u2550\u2550\u2550 CIP-0103 Conformance Report \u2550\u2550\u2550",
209
+ "",
210
+ `Total: ${report.total} Passed: ${report.passed} Failed: ${report.failed}`,
211
+ ""
212
+ ];
213
+ const categories = ["interface", "method", "event", "error", "lifecycle"];
214
+ for (const cat of categories) {
215
+ const catResults = report.results.filter((r) => r.category === cat);
216
+ if (catResults.length === 0) continue;
217
+ lines.push(`\u2500\u2500 ${cat.toUpperCase()} \u2500\u2500`);
218
+ for (const r of catResults) {
219
+ const icon = r.passed ? "\u2713" : "\u2717";
220
+ lines.push(` ${icon} ${r.name}`);
221
+ if (r.error) {
222
+ lines.push(` \u2192 ${r.error}`);
223
+ }
276
224
  }
277
- return lines.join('\n');
225
+ lines.push("");
226
+ }
227
+ return lines.join("\n");
278
228
  }
229
+
230
+ export { formatCIP0103Report, runCIP0103ConformanceTests };
231
+ //# sourceMappingURL=cip0103-tests.js.map
279
232
  //# sourceMappingURL=cip0103-tests.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cip0103-tests.js","sourceRoot":"","sources":["../src/cip0103-tests.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/cip0103-tests.ts"],"names":[],"mappings":"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","file":"cip0103-tests.js","sourcesContent":["/**\n * CIP-0103 Conformance Test Suite\n *\n * Validates that a Provider implementation conforms to CIP-0103:\n * - Interface shape (request, on, emit, removeListener)\n * - All 10 mandatory methods are handled\n * - Event subscription returns Provider for chaining\n * - Error responses use ProviderRpcError with numeric codes\n *\n * This suite can be run against:\n * - PartyLayerProvider (native path)\n * - createProviderBridge() (bridge path)\n * - Any third-party CIP-0103 Provider\n */\n\nimport type { CIP0103Provider } from '@partylayer/core';\nimport { CIP0103_MANDATORY_METHODS, CIP0103_EVENTS } from '@partylayer/core';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface CIP0103TestResult {\n name: string;\n category: 'interface' | 'method' | 'event' | 'error' | 'lifecycle';\n passed: boolean;\n error?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface CIP0103ConformanceReport {\n total: number;\n passed: number;\n failed: number;\n results: CIP0103TestResult[];\n}\n\n// ─── Runner ─────────────────────────────────────────────────────────────────\n\nexport async function runCIP0103ConformanceTests(\n provider: CIP0103Provider,\n): Promise<CIP0103ConformanceReport> {\n const results: CIP0103TestResult[] = [];\n\n // ── Interface shape tests ─────────────────────────────────────────────\n\n results.push({\n name: 'Provider has request() method',\n category: 'interface',\n passed: typeof provider.request === 'function',\n });\n\n results.push({\n name: 'Provider has on() method',\n category: 'interface',\n passed: typeof provider.on === 'function',\n });\n\n results.push({\n name: 'Provider has emit() method',\n category: 'interface',\n passed: typeof provider.emit === 'function',\n });\n\n results.push({\n name: 'Provider has removeListener() method',\n category: 'interface',\n passed: typeof provider.removeListener === 'function',\n });\n\n // ── Method presence tests ─────────────────────────────────────────────\n\n for (const method of CIP0103_MANDATORY_METHODS) {\n try {\n await provider.request({ method, params: {} });\n results.push({\n name: `Method \"${method}\" is handled`,\n category: 'method',\n passed: true,\n });\n } catch (err: unknown) {\n // A valid ProviderRpcError means the method IS handled\n // (it just may not be authorized / connected yet)\n const isValidError = isNumericCodeError(err);\n results.push({\n name: `Method \"${method}\" is handled`,\n category: 'method',\n passed: isValidError,\n error: isValidError\n ? undefined\n : `Expected ProviderRpcError with numeric code, got: ${String(err)}`,\n details: isValidError\n ? { code: (err as { code: number }).code }\n : undefined,\n });\n }\n }\n\n // ── Event chaining tests ──────────────────────────────────────────────\n\n const noopHandler = () => {};\n\n const onResult = provider.on('statusChanged', noopHandler);\n results.push({\n name: 'on() returns Provider for chaining',\n category: 'event',\n passed: onResult === provider,\n error:\n onResult === provider\n ? undefined\n : 'on() did not return the Provider instance',\n });\n\n const removeResult = provider.removeListener('statusChanged', noopHandler);\n results.push({\n name: 'removeListener() returns Provider for chaining',\n category: 'event',\n passed: removeResult === provider,\n error:\n removeResult === provider\n ? undefined\n : 'removeListener() did not return the Provider instance',\n });\n\n // ── Error code validation ─────────────────────────────────────────────\n\n try {\n await provider.request({ method: '__cip0103_conformance_nonexistent__' });\n results.push({\n name: 'Unsupported method returns ProviderRpcError',\n category: 'error',\n passed: false,\n error: 'Expected error for unsupported method, got success',\n });\n } catch (err: unknown) {\n const hasNumericCode = isNumericCodeError(err);\n results.push({\n name: 'Unsupported method returns error with numeric code',\n category: 'error',\n passed: hasNumericCode,\n error: hasNumericCode\n ? undefined\n : `Expected numeric code, got: ${String(err)}`,\n details: hasNumericCode\n ? { code: (err as { code: number }).code }\n : undefined,\n });\n\n if (hasNumericCode) {\n const code = (err as { code: number }).code;\n // Should be 4200 (UNSUPPORTED_METHOD) or -32601 (METHOD_NOT_FOUND)\n const isCorrectCode = code === 4200 || code === -32601;\n results.push({\n name: 'Unsupported method uses code 4200 or -32601',\n category: 'error',\n passed: isCorrectCode,\n error: isCorrectCode\n ? undefined\n : `Expected code 4200 or -32601, got ${code}`,\n details: { code },\n });\n }\n }\n\n // ── emit() returns boolean ────────────────────────────────────────────\n\n const emitResult = provider.emit('__cip0103_conformance_test__');\n results.push({\n name: 'emit() returns boolean',\n category: 'interface',\n passed: typeof emitResult === 'boolean',\n error:\n typeof emitResult === 'boolean'\n ? undefined\n : `emit() returned ${typeof emitResult}`,\n });\n\n // ── Transaction lifecycle tests ─────────────────────────────────────\n\n {\n const txEvents: unknown[] = [];\n const txHandler = (...args: unknown[]) => txEvents.push(...args);\n provider.on(CIP0103_EVENTS.TX_CHANGED, txHandler);\n\n try {\n await provider.request({\n method: 'prepareExecute',\n params: { tx: { _conformance: true } },\n });\n\n // Check that 'pending' was emitted\n results.push({\n name: 'prepareExecute emits txChanged with \"pending\"',\n category: 'lifecycle',\n passed: txEvents.some(\n (e) => typeof e === 'object' && e !== null && (e as Record<string, unknown>).status === 'pending',\n ),\n error: txEvents.length === 0 ? 'No txChanged events emitted' : undefined,\n });\n\n // Check that 'signed' was emitted\n const signedEvent = txEvents.find(\n (e) => typeof e === 'object' && e !== null && (e as Record<string, unknown>).status === 'signed',\n ) as Record<string, unknown> | undefined;\n results.push({\n name: 'prepareExecute emits txChanged with \"signed\"',\n category: 'lifecycle',\n passed: !!signedEvent,\n });\n\n // Validate 'signed' payload shape\n if (signedEvent) {\n const payload = signedEvent.payload as Record<string, unknown> | undefined;\n results.push({\n name: 'signed event has payload.signature (string)',\n category: 'lifecycle',\n passed: typeof payload?.signature === 'string',\n });\n results.push({\n name: 'signed event has payload.signedBy (string)',\n category: 'lifecycle',\n passed: typeof payload?.signedBy === 'string',\n });\n results.push({\n name: 'signed event has payload.party (string)',\n category: 'lifecycle',\n passed: typeof payload?.party === 'string',\n });\n }\n\n // Check that a terminal state was reached\n const hasTerminal = txEvents.some(\n (e) =>\n typeof e === 'object' &&\n e !== null &&\n ((e as Record<string, unknown>).status === 'executed' ||\n (e as Record<string, unknown>).status === 'failed'),\n );\n results.push({\n name: 'prepareExecute reaches terminal tx state (executed or failed)',\n category: 'lifecycle',\n passed: hasTerminal,\n });\n\n // Validate 'executed' payload shape\n const executedEvent = txEvents.find(\n (e) => typeof e === 'object' && e !== null && (e as Record<string, unknown>).status === 'executed',\n ) as Record<string, unknown> | undefined;\n if (executedEvent) {\n const payload = executedEvent.payload as Record<string, unknown> | undefined;\n results.push({\n name: 'executed event has payload.updateId (string)',\n category: 'lifecycle',\n passed: typeof payload?.updateId === 'string',\n });\n results.push({\n name: 'executed event has payload.completionOffset (number)',\n category: 'lifecycle',\n passed: typeof payload?.completionOffset === 'number',\n });\n }\n } catch {\n // prepareExecute may throw — still check if events were emitted\n results.push({\n name: 'prepareExecute emits txChanged events (despite error)',\n category: 'lifecycle',\n passed: txEvents.length > 0,\n error: txEvents.length === 0 ? 'No txChanged events emitted before error' : undefined,\n });\n } finally {\n provider.removeListener(CIP0103_EVENTS.TX_CHANGED, txHandler);\n }\n }\n\n // ── ledgerApi handling test ────────────────────────────────────────\n\n try {\n await provider.request({\n method: 'ledgerApi',\n params: { requestMethod: 'GET', resource: '/v1/state/acs' },\n });\n results.push({\n name: 'ledgerApi returns result (supported)',\n category: 'method',\n passed: true,\n });\n } catch (err: unknown) {\n // ProviderRpcError with numeric code = method is recognized\n const isHandled = isNumericCodeError(err);\n results.push({\n name: 'ledgerApi is handled (returns result or ProviderRpcError)',\n category: 'method',\n passed: isHandled,\n error: isHandled ? undefined : `Unexpected error type: ${String(err)}`,\n });\n }\n\n // ── Summary ───────────────────────────────────────────────────────────\n\n const passed = results.filter((r) => r.passed).length;\n return {\n total: results.length,\n passed,\n failed: results.length - passed,\n results,\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction isNumericCodeError(err: unknown): boolean {\n if (typeof err !== 'object' || err === null) return false;\n return typeof (err as Record<string, unknown>).code === 'number';\n}\n\n// ─── Formatting ─────────────────────────────────────────────────────────────\n\nexport function formatCIP0103Report(report: CIP0103ConformanceReport): string {\n const lines: string[] = [\n '═══ CIP-0103 Conformance Report ═══',\n '',\n `Total: ${report.total} Passed: ${report.passed} Failed: ${report.failed}`,\n '',\n ];\n\n const categories = ['interface', 'method', 'event', 'error', 'lifecycle'] as const;\n for (const cat of categories) {\n const catResults = report.results.filter((r) => r.category === cat);\n if (catResults.length === 0) continue;\n lines.push(`── ${cat.toUpperCase()} ──`);\n for (const r of catResults) {\n const icon = r.passed ? '✓' : '✗';\n lines.push(` ${icon} ${r.name}`);\n if (r.error) {\n lines.push(` → ${r.error}`);\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,8 +1 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * PartyLayer Conformance Runner CLI
4
- *
5
- * Runs adapter conformance tests and generates reports.
6
- */
7
- export {};
8
- //# sourceMappingURL=index.d.ts.map