mppx 0.8.2 → 0.8.4

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 (72) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cli/cli.d.ts.map +1 -1
  3. package/dist/cli/cli.js +2 -0
  4. package/dist/cli/cli.js.map +1 -1
  5. package/dist/cli/plugins/stripe.d.ts.map +1 -1
  6. package/dist/cli/plugins/stripe.js +32 -12
  7. package/dist/cli/plugins/stripe.js.map +1 -1
  8. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  9. package/dist/cli/plugins/tempo.js +1 -0
  10. package/dist/cli/plugins/tempo.js.map +1 -1
  11. package/dist/cli/utils.d.ts +2 -2
  12. package/dist/cli/utils.d.ts.map +1 -1
  13. package/dist/cli/utils.js +8 -2
  14. package/dist/cli/utils.js.map +1 -1
  15. package/dist/cli/validate/challenge.d.ts +14 -0
  16. package/dist/cli/validate/challenge.d.ts.map +1 -0
  17. package/dist/cli/validate/challenge.js +211 -0
  18. package/dist/cli/validate/challenge.js.map +1 -0
  19. package/dist/cli/validate/discovery.d.ts +10 -0
  20. package/dist/cli/validate/discovery.d.ts.map +1 -0
  21. package/dist/cli/validate/discovery.js +128 -0
  22. package/dist/cli/validate/discovery.js.map +1 -0
  23. package/dist/cli/validate/helpers.d.ts +33 -0
  24. package/dist/cli/validate/helpers.d.ts.map +1 -0
  25. package/dist/cli/validate/helpers.js +136 -0
  26. package/dist/cli/validate/helpers.js.map +1 -0
  27. package/dist/cli/validate/index.d.ts +17 -0
  28. package/dist/cli/validate/index.d.ts.map +1 -0
  29. package/dist/cli/validate/index.js +224 -0
  30. package/dist/cli/validate/index.js.map +1 -0
  31. package/dist/cli/validate/payment.d.ts +7 -0
  32. package/dist/cli/validate/payment.d.ts.map +1 -0
  33. package/dist/cli/validate/payment.js +381 -0
  34. package/dist/cli/validate/payment.js.map +1 -0
  35. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  36. package/dist/stripe/server/internal/html.gen.js +1 -1
  37. package/dist/tempo/client/Charge.d.ts.map +1 -1
  38. package/dist/tempo/client/Charge.js +7 -1
  39. package/dist/tempo/client/Charge.js.map +1 -1
  40. package/dist/tempo/internal/auto-swap.d.ts.map +1 -1
  41. package/dist/tempo/internal/auto-swap.js +21 -6
  42. package/dist/tempo/internal/auto-swap.js.map +1 -1
  43. package/dist/tempo/internal/fee-token.js +1 -1
  44. package/dist/tempo/internal/fee-token.js.map +1 -1
  45. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  46. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  47. package/dist/tempo/server/internal/html.gen.js +1 -1
  48. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  49. package/package.json +2 -2
  50. package/src/cli/cli.test.ts +134 -29
  51. package/src/cli/cli.ts +2 -0
  52. package/src/cli/mcp.test.ts +1 -0
  53. package/src/cli/plugins/stripe.ts +31 -12
  54. package/src/cli/plugins/tempo.ts +1 -0
  55. package/src/cli/utils.test.ts +36 -2
  56. package/src/cli/utils.ts +16 -3
  57. package/src/cli/validate/challenge.ts +335 -0
  58. package/src/cli/validate/discovery.ts +120 -0
  59. package/src/cli/validate/helpers.ts +154 -0
  60. package/src/cli/validate/index.ts +348 -0
  61. package/src/cli/validate/payment.ts +488 -0
  62. package/src/cli/validate.test.ts +539 -0
  63. package/src/mcp/client/McpClient.integration.test.ts +12 -1
  64. package/src/stripe/server/internal/html.gen.ts +1 -1
  65. package/src/tempo/client/Charge.test.ts +56 -0
  66. package/src/tempo/client/Charge.ts +20 -2
  67. package/src/tempo/internal/auto-swap.test.ts +85 -1
  68. package/src/tempo/internal/auto-swap.ts +52 -6
  69. package/src/tempo/internal/fee-token.ts +1 -1
  70. package/src/tempo/server/Charge.test.ts +31 -16
  71. package/src/tempo/server/internal/html/package.json +1 -1
  72. package/src/tempo/server/internal/html.gen.ts +1 -1
@@ -0,0 +1,128 @@
1
+ import { fetchWithTimeout, HTTP_METHODS } from './helpers.js';
2
+ export async function fetchDiscoveryDoc(baseUrl) {
3
+ const url = new URL('/openapi.json', baseUrl).href;
4
+ try {
5
+ const response = await fetchWithTimeout(url, {});
6
+ if (!response.ok)
7
+ return { error: `HTTP ${response.status}` };
8
+ const raw = await response.text();
9
+ const doc = JSON.parse(raw);
10
+ return { doc, raw };
11
+ }
12
+ catch (error) {
13
+ if (error instanceof DOMException && error.name === 'AbortError')
14
+ return { error: 'Request timed out after 15s' };
15
+ if (error instanceof SyntaxError)
16
+ return { error: 'Invalid JSON' };
17
+ return { error: error.message };
18
+ }
19
+ }
20
+ // Extracts testable endpoints from an OpenAPI doc. Prefers endpoints with
21
+ // explicit x-payment-info (the server declares them as paid). Falls back to
22
+ // endpoints that list a 402 response (weaker signal, but still worth testing).
23
+ export function extractEndpointsFromDiscovery(doc) {
24
+ const withPaymentInfo = [];
25
+ const with402Response = [];
26
+ const paths = doc.paths;
27
+ if (!paths)
28
+ return [];
29
+ for (const [pathKey, pathItem] of Object.entries(paths)) {
30
+ for (const [method, operation] of Object.entries(pathItem)) {
31
+ if (!HTTP_METHODS.has(method))
32
+ continue;
33
+ if (!operation || typeof operation !== 'object' || Array.isArray(operation))
34
+ continue;
35
+ const op = operation;
36
+ if (op['x-payment-info']) {
37
+ const payInfo = op['x-payment-info'];
38
+ withPaymentInfo.push({
39
+ method: method.toUpperCase(),
40
+ path: pathKey,
41
+ amount: payInfo.amount,
42
+ });
43
+ }
44
+ else {
45
+ const responses = op.responses;
46
+ if (responses && '402' in responses) {
47
+ with402Response.push({ method: method.toUpperCase(), path: pathKey });
48
+ }
49
+ }
50
+ }
51
+ }
52
+ return withPaymentInfo.length > 0 ? withPaymentInfo : with402Response;
53
+ }
54
+ // Recursively generates a minimal valid value from a JSON Schema definition.
55
+ // Fills only required fields, preferring const > example > default > synthetic.
56
+ function generateValueFromSchema(schema) {
57
+ if (schema.const !== undefined)
58
+ return schema.const;
59
+ if (schema.example !== undefined)
60
+ return schema.example;
61
+ if (schema.default !== undefined)
62
+ return schema.default;
63
+ switch (schema.type) {
64
+ case 'string': {
65
+ if (schema.format === 'email')
66
+ return 'test@example.com';
67
+ if (schema.format === 'uuid')
68
+ return '00000000-0000-0000-0000-000000000000';
69
+ if (schema.format === 'uri' || schema.format === 'url')
70
+ return 'https://example.com';
71
+ if (schema.enum && Array.isArray(schema.enum))
72
+ return schema.enum[0];
73
+ return 'test';
74
+ }
75
+ case 'number':
76
+ case 'integer':
77
+ return schema.minimum ?? 1;
78
+ case 'boolean':
79
+ return true;
80
+ case 'array':
81
+ return [];
82
+ case 'object': {
83
+ const properties = schema.properties;
84
+ if (!properties)
85
+ return {};
86
+ const required = schema.required || [];
87
+ const obj = {};
88
+ for (const key of required) {
89
+ const prop = properties[key];
90
+ if (prop)
91
+ obj[key] = generateValueFromSchema(prop);
92
+ }
93
+ return obj;
94
+ }
95
+ default:
96
+ return null;
97
+ }
98
+ }
99
+ // Looks up the requestBody schema for an endpoint in the OpenAPI doc and
100
+ // returns a JSON string suitable for the request. Uses the doc's example
101
+ // if one exists, otherwise generates a minimal body from the schema.
102
+ export function extractRequestBodyFromDiscovery(doc, endpoint) {
103
+ const paths = doc.paths;
104
+ if (!paths)
105
+ return undefined;
106
+ const pathItem = paths[endpoint.path];
107
+ if (!pathItem)
108
+ return undefined;
109
+ const op = pathItem[endpoint.method.toLowerCase()];
110
+ if (!op?.requestBody)
111
+ return undefined;
112
+ const rb = op.requestBody;
113
+ const content = rb.content;
114
+ const jsonContent = content?.['application/json'];
115
+ if (!jsonContent)
116
+ return undefined;
117
+ if (jsonContent.example)
118
+ return JSON.stringify(jsonContent.example);
119
+ const schema = jsonContent.schema;
120
+ if (!schema || schema.type !== 'object')
121
+ return undefined;
122
+ const result = generateValueFromSchema(schema);
123
+ if (result && typeof result === 'object' && Object.keys(result).length > 0) {
124
+ return JSON.stringify(result);
125
+ }
126
+ return undefined;
127
+ }
128
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/cli/validate/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type CheckResult = {
2
+ label: string;
3
+ detail?: string | undefined;
4
+ hint?: string | undefined;
5
+ severity: 'pass' | 'fail' | 'warn' | 'skip';
6
+ };
7
+ export type EndpointSpec = {
8
+ method: string;
9
+ path: string;
10
+ amount?: string | undefined;
11
+ };
12
+ export declare function check(label: string, detail?: string): CheckResult;
13
+ export declare function fail(label: string, detail?: string, hint?: string): CheckResult;
14
+ export declare function warn(label: string, detail?: string, hint?: string): CheckResult;
15
+ export declare function skip(label: string, detail?: string, hint?: string): CheckResult;
16
+ export declare function printCheck(result: CheckResult): void;
17
+ export declare function printSection(title: string): void;
18
+ export type Counts = {
19
+ passed: number;
20
+ failed: number;
21
+ warnings: number;
22
+ skipped: number;
23
+ };
24
+ export declare function printResults(results: CheckResult[], counts: Counts): void;
25
+ export declare function fetchWithTimeout(url: string, init: RequestInit, timeoutMs?: number): Promise<Response>;
26
+ export declare function buildUrl(baseUrl: string, endpoint: EndpointSpec, query?: string[]): string;
27
+ export declare function formatBytes(bytes: number): string;
28
+ export declare const HTTP_METHODS: Set<string>;
29
+ export declare function isValidAddress(addr: unknown): boolean;
30
+ export declare function isValidIntegerAmount(amount: unknown): boolean;
31
+ export declare function parseEndpointArg(input: string): EndpointSpec | null;
32
+ export declare function resolveBodyForEndpoint(rawBody: string | undefined, endpointPath: string): string | undefined;
33
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B,CAAA;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAEjE;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAK/E;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAK/E;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAI/E;AASD,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,QAO7C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QAEzC;AAED,MAAM,MAAM,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1F,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,QAQlE;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,SAAS,SAAS,GACjB,OAAO,CAAC,QAAQ,CAAC,CAQnB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAW1F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,eAAO,MAAM,YAAY,aASvB,CAAA;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAErD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CASnE;AAID,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAcpB"}
@@ -0,0 +1,136 @@
1
+ import { pc } from '../utils.js';
2
+ export function check(label, detail) {
3
+ return detail ? { label, detail, severity: 'pass' } : { label, severity: 'pass' };
4
+ }
5
+ export function fail(label, detail, hint) {
6
+ const r = { label, severity: 'fail' };
7
+ if (detail)
8
+ r.detail = detail;
9
+ if (hint)
10
+ r.hint = hint;
11
+ return r;
12
+ }
13
+ export function warn(label, detail, hint) {
14
+ const r = { label, severity: 'warn' };
15
+ if (detail)
16
+ r.detail = detail;
17
+ if (hint)
18
+ r.hint = hint;
19
+ return r;
20
+ }
21
+ export function skip(label, detail, hint) {
22
+ const r = detail ? { label, detail, severity: 'skip' } : { label, severity: 'skip' };
23
+ if (hint)
24
+ r.hint = hint;
25
+ return r;
26
+ }
27
+ const SEVERITY_ICONS = {
28
+ pass: pc.green('✓'),
29
+ fail: pc.red('✗'),
30
+ warn: pc.yellow('⚠'),
31
+ skip: pc.dim('○'),
32
+ };
33
+ export function printCheck(result) {
34
+ const icon = SEVERITY_ICONS[result.severity];
35
+ const text = result.detail ? `${result.label} (${result.detail})` : result.label;
36
+ console.log(` ${icon} ${text}`);
37
+ if (result.hint && result.severity !== 'pass') {
38
+ console.log(pc.dim(` → ${result.hint}`));
39
+ }
40
+ }
41
+ export function printSection(title) {
42
+ console.log(`\n${pc.bold(title)}`);
43
+ }
44
+ export function printResults(results, counts) {
45
+ for (const result of results) {
46
+ printCheck(result);
47
+ if (result.severity === 'pass')
48
+ counts.passed++;
49
+ else if (result.severity === 'fail')
50
+ counts.failed++;
51
+ else if (result.severity === 'warn')
52
+ counts.warnings++;
53
+ else if (result.severity === 'skip')
54
+ counts.skipped++;
55
+ }
56
+ }
57
+ export async function fetchWithTimeout(url, init, timeoutMs = 15_000) {
58
+ const controller = new AbortController();
59
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
60
+ try {
61
+ return await fetch(url, { ...init, signal: controller.signal });
62
+ }
63
+ finally {
64
+ clearTimeout(timeout);
65
+ }
66
+ }
67
+ export function buildUrl(baseUrl, endpoint, query) {
68
+ let url = new URL(endpoint.path, baseUrl).href;
69
+ if (query) {
70
+ const u = new URL(url);
71
+ for (const q of query) {
72
+ const [key, ...rest] = q.split('=');
73
+ if (key)
74
+ u.searchParams.set(key, rest.join('='));
75
+ }
76
+ url = u.href;
77
+ }
78
+ return url;
79
+ }
80
+ export function formatBytes(bytes) {
81
+ if (bytes < 1024)
82
+ return `${bytes}B`;
83
+ if (bytes < 1024 * 1024)
84
+ return `${(bytes / 1024).toFixed(1)}KB`;
85
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
86
+ }
87
+ export const HTTP_METHODS = new Set([
88
+ 'get',
89
+ 'post',
90
+ 'put',
91
+ 'patch',
92
+ 'delete',
93
+ 'head',
94
+ 'options',
95
+ 'trace',
96
+ ]);
97
+ export function isValidAddress(addr) {
98
+ return typeof addr === 'string' && /^0x[0-9a-fA-F]{40}$/.test(addr);
99
+ }
100
+ export function isValidIntegerAmount(amount) {
101
+ return typeof amount === 'string' && /^(0|[1-9][0-9]*)$/.test(amount);
102
+ }
103
+ export function parseEndpointArg(input) {
104
+ const sep = input.indexOf(':');
105
+ if (sep < 1)
106
+ return null;
107
+ const method = input.slice(0, sep).toLowerCase();
108
+ if (!HTTP_METHODS.has(method))
109
+ return null;
110
+ const path = input.slice(sep + 1);
111
+ if (!path)
112
+ return null;
113
+ const normalizedPath = path.startsWith('/') ? path : '/' + path;
114
+ return { method: method.toUpperCase(), path: normalizedPath };
115
+ }
116
+ // Resolves --body input: if JSON with all keys starting with /, it's a
117
+ // per-path mapping. Otherwise it's a global body for all endpoints.
118
+ export function resolveBodyForEndpoint(rawBody, endpointPath) {
119
+ if (!rawBody)
120
+ return undefined;
121
+ try {
122
+ const parsed = JSON.parse(rawBody);
123
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
124
+ const keys = Object.keys(parsed);
125
+ if (keys.length > 0 && keys.every((k) => k.startsWith('/'))) {
126
+ const value = parsed[endpointPath];
127
+ if (value === undefined)
128
+ return undefined;
129
+ return typeof value === 'string' ? value : JSON.stringify(value);
130
+ }
131
+ }
132
+ }
133
+ catch { }
134
+ return rawBody;
135
+ }
136
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/cli/validate/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Cli } from 'incur';
2
+ declare const validate: Cli.Cli<{
3
+ [x: string]: {
4
+ args: {
5
+ url: string;
6
+ };
7
+ options: {
8
+ verbose: number;
9
+ yes: boolean;
10
+ endpoint?: string | undefined;
11
+ body?: string | undefined;
12
+ query?: string[] | undefined;
13
+ };
14
+ };
15
+ }, undefined, undefined, undefined>;
16
+ export default validate;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAK,MAAM,OAAO,CAAA;AAuB9B,QAAA,MAAM,QAAQ;;;;;;;;;;;;;mCA4CZ,CAAA;AAEF,eAAe,QAAQ,CAAA"}
@@ -0,0 +1,224 @@
1
+ import { Cli, z } from 'incur';
2
+ import { validate as validateDiscovery } from '../../discovery/Validate.js';
3
+ import { pc } from '../utils.js';
4
+ import { validateChallenge, validateErrorHandling } from './challenge.js';
5
+ import { extractEndpointsFromDiscovery, extractRequestBodyFromDiscovery, fetchDiscoveryDoc, } from './discovery.js';
6
+ import { check, fail, parseEndpointArg, printCheck, printResults, printSection, resolveBodyForEndpoint, warn, } from './helpers.js';
7
+ import { validatePaymentFlow } from './payment.js';
8
+ const validate = Cli.create('validate', {
9
+ description: 'Validate an MPP server implementation end-to-end',
10
+ args: z.object({
11
+ url: z.string().describe('Base URL of the MPP server to validate'),
12
+ }),
13
+ options: z.object({
14
+ endpoint: z.string().optional().describe('Endpoint to test (METHOD:path). Skips discovery.'),
15
+ body: z
16
+ .string()
17
+ .optional()
18
+ .describe('Request body. With --endpoint, used directly. In discovery mode, JSON with / keys is a per-path mapping.'),
19
+ query: z.array(z.string()).optional().describe('Query parameter (key=value, repeatable)'),
20
+ verbose: z.number().default(0).meta({ count: true }).describe('Verbosity level'),
21
+ yes: z.boolean().default(false).describe('Auto-approve mainnet payments'),
22
+ }),
23
+ alias: {
24
+ endpoint: 'e',
25
+ verbose: 'v',
26
+ yes: 'y',
27
+ },
28
+ async run(c) {
29
+ const baseUrl = c.args.url.replace(/\/$/, '').replace(/\/openapi\.json$/i, '');
30
+ const verbose = c.options.verbose > 0;
31
+ const counts = { passed: 0, failed: 0, warnings: 0, skipped: 0 };
32
+ console.log(`\n${pc.bold('mppx validate')} ${pc.dim(baseUrl)}\n`);
33
+ const { endpoints, discoveryDoc, shouldExit } = await discoverEndpoints(baseUrl, c.options, counts);
34
+ if (shouldExit)
35
+ process.exit(1);
36
+ const flags = await validateEndpoints(baseUrl, endpoints, discoveryDoc, counts, {
37
+ verbose,
38
+ endpoint: c.options.endpoint,
39
+ body: c.options.body,
40
+ query: c.options.query,
41
+ yes: c.options.yes,
42
+ });
43
+ printSummary(counts, flags, endpoints.length);
44
+ },
45
+ });
46
+ export default validate;
47
+ // Each stage of validation is defined in its own function below.
48
+ async function discoverEndpoints(baseUrl, options, counts) {
49
+ let endpoints = [];
50
+ let discoveryDoc = null;
51
+ printSection('Discovery (/openapi.json)');
52
+ const discoveryResult = await fetchDiscoveryDoc(baseUrl);
53
+ if ('error' in discoveryResult) {
54
+ printCheck(fail('Document found', discoveryResult.error, 'MPP servers must serve an OpenAPI document at /openapi.json with x-payment-info extensions.'));
55
+ counts.failed++;
56
+ if (!options.endpoint) {
57
+ console.log('');
58
+ console.log(pc.yellow(' No discovery document found.'));
59
+ console.log(pc.dim(' MPP servers must serve an OpenAPI document at /openapi.json with x-payment-info extensions.'));
60
+ console.log(pc.dim(' To test a specific endpoint: mppx validate <url> --endpoint POST:/your/path'));
61
+ console.log('');
62
+ return { endpoints, discoveryDoc, shouldExit: true };
63
+ }
64
+ }
65
+ else {
66
+ printCheck(check('Document found and parseable'));
67
+ counts.passed++;
68
+ const issues = validateDiscovery(discoveryResult.doc);
69
+ const errors = issues.filter((i) => i.severity === 'error');
70
+ const warnings = issues.filter((i) => i.severity === 'warning');
71
+ if (errors.length > 0) {
72
+ printCheck(fail('Valid OpenAPI structure', `${errors.length} error(s)`));
73
+ counts.failed++;
74
+ for (const issue of errors) {
75
+ console.log(pc.dim(` ${issue.path}: ${issue.message}`));
76
+ }
77
+ }
78
+ else {
79
+ printCheck(check('Valid OpenAPI structure'));
80
+ counts.passed++;
81
+ }
82
+ for (const w of warnings) {
83
+ printCheck(warn(w.message, w.path));
84
+ counts.warnings++;
85
+ }
86
+ discoveryDoc = discoveryResult.doc;
87
+ }
88
+ // Resolve endpoints: --endpoint overrides discovery
89
+ if (options.endpoint) {
90
+ const parsed = parseEndpointArg(options.endpoint);
91
+ if (!parsed) {
92
+ console.log(pc.red(`Invalid endpoint format: "${options.endpoint}". Use METHOD:path (e.g. GET:/api/data)`));
93
+ return { endpoints, discoveryDoc, shouldExit: true };
94
+ }
95
+ endpoints.push(parsed);
96
+ }
97
+ else if (discoveryDoc) {
98
+ endpoints = extractEndpointsFromDiscovery(discoveryDoc);
99
+ const NO_AMOUNT = BigInt('999999999999999999');
100
+ endpoints.sort((a, b) => {
101
+ const aAmt = a.amount ? BigInt(a.amount) : NO_AMOUNT;
102
+ const bAmt = b.amount ? BigInt(b.amount) : NO_AMOUNT;
103
+ return aAmt < bAmt ? -1 : aAmt > bAmt ? 1 : 0;
104
+ });
105
+ if (endpoints.length === 0) {
106
+ printCheck(warn('Paid endpoints found', 'No endpoints with x-payment-info'));
107
+ counts.warnings++;
108
+ console.log(pc.dim(' Use --endpoint to specify endpoints manually.'));
109
+ return { endpoints, discoveryDoc, shouldExit: true };
110
+ }
111
+ printCheck(check('Paid endpoints found', `${endpoints.length} endpoint(s)`));
112
+ counts.passed++;
113
+ }
114
+ return { endpoints, discoveryDoc };
115
+ }
116
+ async function validateEndpoints(baseUrl, endpoints, discoveryDoc, counts, options) {
117
+ let sawTestnet = false;
118
+ let sawMainnet = false;
119
+ let paymentSucceeded = false;
120
+ let sawMppEndpoint = false;
121
+ let sawNonMppPaymentEndpoint = false;
122
+ for (const endpoint of endpoints) {
123
+ printSection(`${endpoint.method} ${endpoint.path}`);
124
+ // With --endpoint, --body is used directly. In discovery mode, resolve per-path or auto-generate.
125
+ let body;
126
+ if (options.endpoint) {
127
+ body = options.body;
128
+ }
129
+ else {
130
+ body = resolveBodyForEndpoint(options.body, endpoint.path);
131
+ if (!body && discoveryDoc) {
132
+ body = extractRequestBodyFromDiscovery(discoveryDoc, endpoint);
133
+ if (body && options.verbose) {
134
+ console.log(pc.dim(` Auto-generated body: ${body}`));
135
+ }
136
+ }
137
+ }
138
+ // Challenge
139
+ console.log(pc.dim(' Challenge'));
140
+ const { results: challengeResults, resolvedBody } = await validateChallenge(baseUrl, endpoint, options.verbose, {
141
+ body,
142
+ query: options.query,
143
+ discoveryDoc: discoveryDoc ?? undefined,
144
+ });
145
+ const effectiveBody = resolvedBody ?? body;
146
+ printResults(challengeResults, counts);
147
+ const isMppEndpoint = challengeResults.some((r) => r.severity === 'pass' && r.label === 'Challenge parseable');
148
+ if (!isMppEndpoint) {
149
+ if (challengeResults.some((r) => r.label === 'Not an MPP endpoint'))
150
+ sawNonMppPaymentEndpoint = true;
151
+ continue;
152
+ }
153
+ sawMppEndpoint = true;
154
+ const isTestnetEndpoint = challengeResults.some((r) => r.severity === 'pass' && r.label === 'Valid currency address' && r.detail === 'testnet');
155
+ if (isTestnetEndpoint)
156
+ sawTestnet = true;
157
+ else
158
+ sawMainnet = true;
159
+ // Error Handling
160
+ console.log(pc.dim(' Error Handling'));
161
+ const errorResults = await validateErrorHandling(baseUrl, endpoint, {
162
+ body: effectiveBody,
163
+ query: options.query,
164
+ });
165
+ printResults(errorResults, counts);
166
+ // Payment
167
+ console.log(pc.dim(' Payment'));
168
+ const paymentResults = await validatePaymentFlow(baseUrl, endpoint, options.verbose, {
169
+ body: effectiveBody,
170
+ query: options.query,
171
+ yes: options.yes,
172
+ });
173
+ printResults(paymentResults, counts);
174
+ if (paymentResults.some((r) => r.severity === 'pass' && r.label === 'Payment: successful')) {
175
+ paymentSucceeded = true;
176
+ }
177
+ }
178
+ return { sawMppEndpoint, sawNonMppPaymentEndpoint, sawTestnet, sawMainnet, paymentSucceeded };
179
+ }
180
+ function printSummary(counts, flags, endpointsLength) {
181
+ // No MPP endpoints found
182
+ if (!flags.sawMppEndpoint && endpointsLength > 0) {
183
+ console.log('');
184
+ if (flags.sawNonMppPaymentEndpoint) {
185
+ console.log(pc.yellow(` No MPP endpoints found. Tested ${endpointsLength} endpoint(s) but none use WWW-Authenticate: Payment.`));
186
+ console.log(pc.dim(' This server may use x402 or another payment protocol.'));
187
+ }
188
+ else if (counts.skipped > 0 && counts.failed === 0) {
189
+ console.log(pc.yellow(` Could not reach payment gate on any endpoint (all returned 401/403/200).`));
190
+ console.log(pc.dim(' The server may require authentication before payment. Try providing auth or use --endpoint with a public path.'));
191
+ }
192
+ else {
193
+ console.log(pc.yellow(` No MPP endpoints found. Tested ${endpointsLength} endpoint(s) but none use WWW-Authenticate: Payment.`));
194
+ console.log(pc.dim(' This server may use x402 or another payment protocol.'));
195
+ }
196
+ console.log('');
197
+ process.exit(1);
198
+ }
199
+ // Summary
200
+ console.log('');
201
+ const parts = [];
202
+ if (counts.passed > 0)
203
+ parts.push(pc.green(`${counts.passed} passed`));
204
+ if (counts.failed > 0)
205
+ parts.push(pc.red(`${counts.failed} failed`));
206
+ if (counts.warnings > 0)
207
+ parts.push(pc.yellow(`${counts.warnings} warning(s)`));
208
+ if (counts.skipped > 0)
209
+ parts.push(pc.yellow(`${counts.skipped} skipped`));
210
+ console.log(`${pc.bold('Summary:')} ${parts.join(', ')}`);
211
+ // Cross-promotion
212
+ if (flags.paymentSucceeded && flags.sawTestnet && !flags.sawMainnet) {
213
+ console.log('');
214
+ console.log(pc.dim(' Tip: validate your mainnet server too to confirm real payments work end-to-end.'));
215
+ }
216
+ else if (flags.sawMainnet && !flags.sawTestnet) {
217
+ console.log('');
218
+ console.log(pc.dim(' Tip: validate a testnet server too for free. This CLI automatically provisions and funds a testnet wallet for testing.'));
219
+ }
220
+ console.log('');
221
+ if (counts.failed > 0)
222
+ process.exit(1);
223
+ }
224
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/validate/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CheckResult, EndpointSpec } from './helpers.js';
2
+ export declare function validatePaymentFlow(baseUrl: string, endpoint: EndpointSpec, verbose: boolean, options?: {
3
+ body?: string | undefined;
4
+ query?: string[] | undefined;
5
+ yes?: boolean | undefined;
6
+ }): Promise<CheckResult[]>;
7
+ //# sourceMappingURL=payment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../../src/cli/validate/payment.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAyC7D,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAC/F,OAAO,CAAC,WAAW,EAAE,CAAC,CAwPxB"}