@vonpay/checkout-cli 0.3.2 → 0.4.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.
- package/README.md +55 -10
- package/dist/client-factory.d.ts +10 -0
- package/dist/client-factory.d.ts.map +1 -0
- package/dist/client-factory.js +26 -0
- package/dist/client-factory.js.map +1 -0
- package/dist/commands/capabilities.d.ts +11 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +66 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/checkout.d.ts.map +1 -1
- package/dist/commands/checkout.js +10 -0
- package/dist/commands/checkout.js.map +1 -1
- package/dist/commands/doctor.d.ts +56 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +15 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/health.js +3 -3
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/listen.d.ts +19 -0
- package/dist/commands/listen.d.ts.map +1 -0
- package/dist/commands/listen.js +236 -0
- package/dist/commands/listen.js.map +1 -0
- package/dist/commands/payment-intents.d.ts +21 -0
- package/dist/commands/payment-intents.d.ts.map +1 -0
- package/dist/commands/payment-intents.js +195 -0
- package/dist/commands/payment-intents.js.map +1 -0
- package/dist/commands/refunds.d.ts +3 -0
- package/dist/commands/refunds.d.ts.map +1 -0
- package/dist/commands/refunds.js +78 -0
- package/dist/commands/refunds.js.map +1 -0
- package/dist/commands/sessions.d.ts.map +1 -1
- package/dist/commands/sessions.js +3 -18
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/tokens.d.ts +3 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +77 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/commands/trigger.d.ts +20 -0
- package/dist/commands/trigger.d.ts.map +1 -1
- package/dist/commands/trigger.js +17 -5
- package/dist/commands/trigger.js.map +1 -1
- package/dist/utils/errors.d.ts +7 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +24 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/forward-to.d.ts +34 -0
- package/dist/utils/forward-to.d.ts.map +1 -0
- package/dist/utils/forward-to.js +88 -0
- package/dist/utils/forward-to.js.map +1 -0
- package/dist/utils/listen-forward.d.ts +43 -0
- package/dist/utils/listen-forward.d.ts.map +1 -0
- package/dist/utils/listen-forward.js +106 -0
- package/dist/utils/listen-forward.js.map +1 -0
- package/dist/utils/listen-output.d.ts +52 -0
- package/dist/utils/listen-output.d.ts.map +1 -0
- package/dist/utils/listen-output.js +85 -0
- package/dist/utils/listen-output.js.map +1 -0
- package/dist/utils/live-key.d.ts +16 -0
- package/dist/utils/live-key.d.ts.map +1 -0
- package/dist/utils/live-key.js +29 -0
- package/dist/utils/live-key.js.map +1 -0
- package/dist/utils/metadata.d.ts +2 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +31 -0
- package/dist/utils/metadata.js.map +1 -0
- package/dist/utils/sanitize.d.ts +4 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +18 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/sse-consumer.d.ts +81 -0
- package/dist/utils/sse-consumer.d.ts.map +1 -0
- package/dist/utils/sse-consumer.js +172 -0
- package/dist/utils/sse-consumer.js.map +1 -0
- package/dist/utils/sse-parser.d.ts +63 -0
- package/dist/utils/sse-parser.d.ts.map +1 -0
- package/dist/utils/sse-parser.js +149 -0
- package/dist/utils/sse-parser.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { VonPayCheckout } from "@vonpay/checkout-node";
|
|
3
|
+
import { requireApiKey } from "../config.js";
|
|
4
|
+
import { getBaseUrl } from "../client-factory.js";
|
|
5
|
+
import { validateForwardTo } from "../utils/forward-to.js";
|
|
6
|
+
import { consumeSse, SseAuthError, } from "../utils/sse-consumer.js";
|
|
7
|
+
import { formatAttemptHuman, formatAttemptJson, formatLifecycleHuman, formatLifecycleJson, } from "../utils/listen-output.js";
|
|
8
|
+
import { forwardPayload } from "../utils/listen-forward.js";
|
|
9
|
+
/**
|
|
10
|
+
* `vonpay checkout listen` — long-lived SSE consumer for the merchant's
|
|
11
|
+
* webhook delivery attempts.
|
|
12
|
+
*
|
|
13
|
+
* Industry conventions followed: WHATWG SSE spec for parsing,
|
|
14
|
+
* Last-Event-ID for reconnect dedupe, exponential backoff, loopback-only
|
|
15
|
+
* forward-to (Stripe CLI posture), refuse-live gate (mirrors
|
|
16
|
+
* `vonpay checkout login --confirm-cli-exposure`), kubectl/gh-style
|
|
17
|
+
* default human output with `--json` opt-in for machine consumption.
|
|
18
|
+
*
|
|
19
|
+
* Output channels:
|
|
20
|
+
* stdout — attempt events (one per delivery), formatted per --json
|
|
21
|
+
* stderr — lifecycle (connecting, reconnecting, shutdown summary)
|
|
22
|
+
*
|
|
23
|
+
* Stdout stays parseable in JSON mode regardless of reconnects.
|
|
24
|
+
*/
|
|
25
|
+
export function listenCommand() {
|
|
26
|
+
return new Command("listen")
|
|
27
|
+
.description("Watch webhook delivery attempts in real time. Optionally re-forward each event to a local URL for development.")
|
|
28
|
+
.option("--forward-to <url>", "Local URL to receive a shadow copy of each delivered event (loopback only by default)")
|
|
29
|
+
.option("--forward-to-tunnel", "Allow non-loopback --forward-to URLs (for ngrok / Cloudflare Tunnel workflows)")
|
|
30
|
+
.option("--events <type>", "Only stream attempts for the given event type. Repeat the flag for multiple types.", (value, prev) => (prev ? [...prev, value] : [value]))
|
|
31
|
+
.option("--json", "Emit one JSON object per line on stdout instead of the colored transcript")
|
|
32
|
+
.option("--api-key <key>", "Override the API key from env / config")
|
|
33
|
+
.option("--confirm-live", "Acknowledge that the listen stream may surface production webhook attempts (required for vp_sk_live_* keys)")
|
|
34
|
+
.action(async (opts) => {
|
|
35
|
+
const apiKey = opts.apiKey ?? requireApiKey();
|
|
36
|
+
if (apiKey.startsWith("vp_sk_live_") && !opts.confirmLive) {
|
|
37
|
+
process.stderr.write(formatLifecycleHuman("Refusing to start listen with a live key (vp_sk_live_*). Re-run with --confirm-live to acknowledge that production webhook attempts will stream to this terminal.", "error") + "\n");
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
if (!apiKey.startsWith("vp_sk_test_") &&
|
|
41
|
+
!apiKey.startsWith("vp_sk_live_")) {
|
|
42
|
+
process.stderr.write(formatLifecycleHuman("Listen requires a secret key (vp_sk_*). Publishable keys are rejected by the server.", "error") + "\n");
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
let forwardUrl;
|
|
46
|
+
let forwardWarning;
|
|
47
|
+
if (opts.forwardTo) {
|
|
48
|
+
const verdict = validateForwardTo(opts.forwardTo, {
|
|
49
|
+
allowTunnel: opts.forwardToTunnel === true,
|
|
50
|
+
});
|
|
51
|
+
if (!verdict.ok) {
|
|
52
|
+
process.stderr.write(formatLifecycleHuman(verdict.reason, "error") + "\n");
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
forwardUrl = verdict.url;
|
|
56
|
+
forwardWarning = verdict.warning;
|
|
57
|
+
}
|
|
58
|
+
// Build the SSE URL from the SDK's resolved base URL — honors
|
|
59
|
+
// VONPAY_BASE_URL / config.json baseUrl overrides used by the rest
|
|
60
|
+
// of the CLI commands.
|
|
61
|
+
const baseUrl = (getBaseUrl() ?? "https://checkout.vonpay.com").replace(/\/+$/, "");
|
|
62
|
+
const sseUrl = new URL(`${baseUrl}/v1/webhook_listen`);
|
|
63
|
+
if (opts.events && opts.events.length > 0) {
|
|
64
|
+
sseUrl.searchParams.set("event_types", opts.events.join(","));
|
|
65
|
+
}
|
|
66
|
+
// SDK client for the per-attempt fetchEvent calls (only used when --forward-to is set)
|
|
67
|
+
const sdk = forwardUrl
|
|
68
|
+
? new VonPayCheckout({ apiKey, baseUrl })
|
|
69
|
+
: null;
|
|
70
|
+
const controller = new AbortController();
|
|
71
|
+
let eventCount = 0;
|
|
72
|
+
const startedAt = Date.now();
|
|
73
|
+
const mode = opts.json === true ? "json" : "human";
|
|
74
|
+
const onSignal = (sig) => {
|
|
75
|
+
const elapsedSec = Math.round((Date.now() - startedAt) / 1000);
|
|
76
|
+
if (mode === "human") {
|
|
77
|
+
process.stderr.write("\n" +
|
|
78
|
+
formatLifecycleHuman(`Shutting down (${sig}). Received ${eventCount} event${eventCount === 1 ? "" : "s"} in ${elapsedSec}s.`, "info") +
|
|
79
|
+
"\n");
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
process.stderr.write(formatLifecycleJson("shutdown", {
|
|
83
|
+
signal: sig,
|
|
84
|
+
event_count: eventCount,
|
|
85
|
+
elapsed_seconds: elapsedSec,
|
|
86
|
+
}) + "\n");
|
|
87
|
+
}
|
|
88
|
+
controller.abort();
|
|
89
|
+
};
|
|
90
|
+
process.once("SIGINT", () => onSignal("SIGINT"));
|
|
91
|
+
process.once("SIGTERM", () => onSignal("SIGTERM"));
|
|
92
|
+
const onLifecycle = (event) => {
|
|
93
|
+
if (mode === "json") {
|
|
94
|
+
process.stderr.write(formatLifecycleJson(event.kind, lifecyclePayload(event)) + "\n");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
process.stderr.write(formatLifecycleHuman(lifecycleHumanMessage(event), lifecycleSeverity(event.kind)) + "\n");
|
|
98
|
+
};
|
|
99
|
+
// Pre-stream, emitted directly rather than through onLifecycle —
|
|
100
|
+
// "warning" is not a LifecycleEvent kind (it's a one-shot forward-target
|
|
101
|
+
// caveat, not a connection-lifecycle transition), so it intentionally
|
|
102
|
+
// bypasses the onLifecycle/lifecyclePayload path.
|
|
103
|
+
if (forwardWarning) {
|
|
104
|
+
process.stderr.write(mode === "human"
|
|
105
|
+
? formatLifecycleHuman(forwardWarning, "warn") + "\n"
|
|
106
|
+
: formatLifecycleJson("warning", { message: forwardWarning }) + "\n");
|
|
107
|
+
}
|
|
108
|
+
if (mode === "human") {
|
|
109
|
+
const filterNote = opts.events?.length
|
|
110
|
+
? ` (filtered to ${opts.events.join(", ")})`
|
|
111
|
+
: "";
|
|
112
|
+
const fwdNote = forwardUrl ? ` → forwarding to ${forwardUrl.toString()}` : "";
|
|
113
|
+
process.stderr.write(formatLifecycleHuman(`Ready! Listening for webhook delivery attempts${filterNote}${fwdNote}.`, "info") + "\n");
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
process.stderr.write(formatLifecycleJson("ready", {
|
|
117
|
+
base_url: baseUrl,
|
|
118
|
+
filter: opts.events ?? null,
|
|
119
|
+
forward_to: forwardUrl?.toString() ?? null,
|
|
120
|
+
}) + "\n");
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
for await (const sseEvent of consumeSse({
|
|
124
|
+
url: sseUrl.toString(),
|
|
125
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
126
|
+
signal: controller.signal,
|
|
127
|
+
onLifecycle,
|
|
128
|
+
})) {
|
|
129
|
+
if (sseEvent.type === "timeout") {
|
|
130
|
+
// Server-ceiling. The consumer reconnects transparently —
|
|
131
|
+
// surface as a lifecycle note, not a stream event.
|
|
132
|
+
onLifecycle({
|
|
133
|
+
kind: "disconnected",
|
|
134
|
+
reason: "server-ceiling (1h cap; auto-reconnecting)",
|
|
135
|
+
willRetryInMs: 0,
|
|
136
|
+
});
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (sseEvent.type !== "webhook.attempt") {
|
|
140
|
+
// Future-compatible: skip unknown event types so an additive
|
|
141
|
+
// server-side surface doesn't break older CLI versions.
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
let payload;
|
|
145
|
+
try {
|
|
146
|
+
payload = JSON.parse(sseEvent.data);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
continue; // malformed frame; skip
|
|
150
|
+
}
|
|
151
|
+
eventCount += 1;
|
|
152
|
+
let forwardOutcome = null;
|
|
153
|
+
if (forwardUrl && sdk) {
|
|
154
|
+
try {
|
|
155
|
+
const eventRecord = await sdk.webhookEvents.retrieve(payload.event_id);
|
|
156
|
+
forwardOutcome = await forwardPayload(eventRecord.payload, {
|
|
157
|
+
url: forwardUrl,
|
|
158
|
+
signingSecret: apiKey,
|
|
159
|
+
signal: controller.signal,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
164
|
+
forwardOutcome = {
|
|
165
|
+
attempted: true,
|
|
166
|
+
status: null,
|
|
167
|
+
latencyMs: null,
|
|
168
|
+
error: `fetch-event failed: ${message.slice(0, 200)}`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (mode === "human") {
|
|
173
|
+
process.stdout.write(formatAttemptHuman(payload, forwardOutcome) + "\n");
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
process.stdout.write(formatAttemptJson(payload, forwardOutcome) + "\n");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
if (err instanceof SseAuthError) {
|
|
182
|
+
if (mode === "human") {
|
|
183
|
+
process.stderr.write(formatLifecycleHuman(`Authentication failed (HTTP ${err.status}). Run \`vonpay checkout login\` with a valid secret key.`, "error") + "\n");
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
process.stderr.write(formatLifecycleJson("auth_failed", { status: err.status }) + "\n");
|
|
187
|
+
}
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
throw err;
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function lifecyclePayload(event) {
|
|
195
|
+
switch (event.kind) {
|
|
196
|
+
case "connecting":
|
|
197
|
+
return { last_event_id: event.lastEventId ?? null };
|
|
198
|
+
case "connected":
|
|
199
|
+
return {};
|
|
200
|
+
case "disconnected":
|
|
201
|
+
return { reason: event.reason, will_retry_in_ms: event.willRetryInMs };
|
|
202
|
+
case "auth_failed":
|
|
203
|
+
return { status: event.status };
|
|
204
|
+
case "fatal":
|
|
205
|
+
return { error: event.error.message };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function lifecycleHumanMessage(event) {
|
|
209
|
+
switch (event.kind) {
|
|
210
|
+
case "connecting":
|
|
211
|
+
return event.lastEventId
|
|
212
|
+
? `Reconnecting (resume from ${event.lastEventId})`
|
|
213
|
+
: "Connecting...";
|
|
214
|
+
case "connected":
|
|
215
|
+
return "Connected.";
|
|
216
|
+
case "disconnected":
|
|
217
|
+
return `Disconnected: ${event.reason}. Retrying in ${event.willRetryInMs}ms.`;
|
|
218
|
+
case "auth_failed":
|
|
219
|
+
return `Authentication failed (HTTP ${event.status}).`;
|
|
220
|
+
case "fatal":
|
|
221
|
+
return `Fatal: ${event.error.message}`;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function lifecycleSeverity(kind) {
|
|
225
|
+
switch (kind) {
|
|
226
|
+
case "connecting":
|
|
227
|
+
case "connected":
|
|
228
|
+
return "info";
|
|
229
|
+
case "disconnected":
|
|
230
|
+
return "warn";
|
|
231
|
+
case "auth_failed":
|
|
232
|
+
case "fatal":
|
|
233
|
+
return "error";
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=listen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.js","sourceRoot":"","sources":["../../src/commands/listen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import type { MITBlock } from "@vonpay/checkout-node";
|
|
3
|
+
interface CreateOpts {
|
|
4
|
+
amount: number;
|
|
5
|
+
currency: string;
|
|
6
|
+
captureMethod?: string;
|
|
7
|
+
metadata?: string[];
|
|
8
|
+
mitInitiator?: string;
|
|
9
|
+
mitReason?: string;
|
|
10
|
+
mitOriginalTransactionId?: string;
|
|
11
|
+
idempotencyKey?: string;
|
|
12
|
+
confirmLive?: boolean;
|
|
13
|
+
json?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare function buildMITBlock(opts: CreateOpts): MITBlock | undefined;
|
|
16
|
+
export declare function paymentIntentsCommand(): Command;
|
|
17
|
+
export declare const __testing__: {
|
|
18
|
+
buildMITBlock: typeof buildMITBlock;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=payment-intents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-intents.d.ts","sourceRoot":"","sources":["../../src/commands/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,KAAK,EAEV,QAAQ,EAGT,MAAM,uBAAuB,CAAC;AAc/B,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,iBAAS,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAgC7D;AAyCD,wBAAgB,qBAAqB,IAAI,OAAO,CAoM/C;AAED,eAAO,MAAM,WAAW;;CAEvB,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { requireApiKey } from "../config.js";
|
|
5
|
+
import { makeCheckoutClient } from "../client-factory.js";
|
|
6
|
+
import { parseMetadata } from "../utils/metadata.js";
|
|
7
|
+
import { handleError } from "../utils/errors.js";
|
|
8
|
+
import { requireLiveConfirmation } from "../utils/live-key.js";
|
|
9
|
+
const MIT_INITIATORS = ["merchant", "customer"];
|
|
10
|
+
const MIT_REASONS = [
|
|
11
|
+
"recurring",
|
|
12
|
+
"unscheduled",
|
|
13
|
+
"installment",
|
|
14
|
+
];
|
|
15
|
+
function buildMITBlock(opts) {
|
|
16
|
+
// Treat empty string as not provided — `--mit-original-transaction-id ""`
|
|
17
|
+
// would otherwise build a malformed MIT block that the server may reject
|
|
18
|
+
// ambiguously.
|
|
19
|
+
const initiator = opts.mitInitiator?.trim().toLowerCase();
|
|
20
|
+
const reason = opts.mitReason?.trim().toLowerCase();
|
|
21
|
+
const originalTransactionId = opts.mitOriginalTransactionId?.trim();
|
|
22
|
+
const provided = [initiator, reason, originalTransactionId].filter((v) => v !== undefined && v !== "").length;
|
|
23
|
+
if (provided === 0)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (provided !== 3) {
|
|
26
|
+
throw new Error("MIT requires all three of --mit-initiator, --mit-reason, --mit-original-transaction-id (non-empty).");
|
|
27
|
+
}
|
|
28
|
+
if (!MIT_INITIATORS.includes(initiator)) {
|
|
29
|
+
throw new Error(`Invalid --mit-initiator "${opts.mitInitiator}". Expected: ${MIT_INITIATORS.join(", ")}`);
|
|
30
|
+
}
|
|
31
|
+
if (!MIT_REASONS.includes(reason)) {
|
|
32
|
+
throw new Error(`Invalid --mit-reason "${opts.mitReason}". Expected: ${MIT_REASONS.join(", ")}`);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
initiator: initiator,
|
|
36
|
+
reason: reason,
|
|
37
|
+
originalTransactionId: originalTransactionId,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function printPaymentIntent(intent) {
|
|
41
|
+
const statusColor = intent.status === "succeeded"
|
|
42
|
+
? chalk.green
|
|
43
|
+
: intent.status === "authorized"
|
|
44
|
+
? chalk.cyan
|
|
45
|
+
: intent.status === "requires_action"
|
|
46
|
+
? chalk.yellow
|
|
47
|
+
: intent.status === "failed" || intent.status === "canceled"
|
|
48
|
+
? chalk.red
|
|
49
|
+
: chalk.gray;
|
|
50
|
+
console.log(` ID: ${intent.id}`);
|
|
51
|
+
console.log(` Status: ${statusColor(intent.status)}`);
|
|
52
|
+
console.log(` Amount: ${(intent.amount / 100).toFixed(2)} ${intent.currency}`);
|
|
53
|
+
console.log(` Capture: ${intent.captureMethod}`);
|
|
54
|
+
if (intent.nextAction) {
|
|
55
|
+
console.log(` Next action: ${chalk.yellow(intent.nextAction)}`);
|
|
56
|
+
}
|
|
57
|
+
if (intent.declineCode) {
|
|
58
|
+
console.log(` Decline code: ${chalk.red(intent.declineCode)}`);
|
|
59
|
+
}
|
|
60
|
+
console.log(` Created: ${intent.createdAt}`);
|
|
61
|
+
}
|
|
62
|
+
const CONFIRM_LIVE_DESCRIPTION = "Required to proceed when the loaded key is vp_sk_live_* (this operation is irreversible)";
|
|
63
|
+
export function paymentIntentsCommand() {
|
|
64
|
+
const intents = new Command("payment-intents").description("Create, capture, and void payment intents (discrete lifecycle)");
|
|
65
|
+
intents
|
|
66
|
+
.command("create")
|
|
67
|
+
.description("Create a new payment intent")
|
|
68
|
+
.requiredOption("--amount <cents>", "Amount in minor units (e.g. 1499 = $14.99)", (v) => parseInt(v, 10))
|
|
69
|
+
.requiredOption("--currency <code>", "ISO 4217 currency (e.g. USD)")
|
|
70
|
+
.option("--capture-method <mode>", "automatic (default) or manual (parks at authorized)")
|
|
71
|
+
.option("--metadata <pair...>", "Metadata key=value (repeat flag for multiple pairs)")
|
|
72
|
+
.option("--mit-initiator <initiator>", `MIT initiator (${MIT_INITIATORS.join(" | ")})`)
|
|
73
|
+
.option("--mit-reason <reason>", `MIT reason (${MIT_REASONS.join(" | ")})`)
|
|
74
|
+
.option("--mit-original-transaction-id <id>", "Cardholder-initiated anchor payment intent ID (vpi_*)")
|
|
75
|
+
.option("--idempotency-key <key>", "Idempotency key for safe retries")
|
|
76
|
+
.option("--confirm-live", CONFIRM_LIVE_DESCRIPTION)
|
|
77
|
+
.option("--json", "Output raw JSON")
|
|
78
|
+
.action(async (opts) => {
|
|
79
|
+
const apiKey = requireApiKey();
|
|
80
|
+
requireLiveConfirmation(apiKey, opts, "create a payment intent");
|
|
81
|
+
const client = makeCheckoutClient();
|
|
82
|
+
const spinner = ora("Creating payment intent...").start();
|
|
83
|
+
try {
|
|
84
|
+
const captureMethod = opts.captureMethod?.toLowerCase();
|
|
85
|
+
if (captureMethod !== undefined &&
|
|
86
|
+
captureMethod !== "automatic" &&
|
|
87
|
+
captureMethod !== "manual") {
|
|
88
|
+
spinner.stop();
|
|
89
|
+
console.error(chalk.red(`Invalid --capture-method "${opts.captureMethod}". Expected automatic or manual.`));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
const metadata = parseMetadata(opts.metadata);
|
|
93
|
+
const mit = buildMITBlock(opts);
|
|
94
|
+
const params = {
|
|
95
|
+
amount: opts.amount,
|
|
96
|
+
currency: opts.currency.toUpperCase(),
|
|
97
|
+
};
|
|
98
|
+
if (captureMethod !== undefined) {
|
|
99
|
+
params.captureMethod = captureMethod;
|
|
100
|
+
}
|
|
101
|
+
if (metadata !== undefined) {
|
|
102
|
+
params.metadata = metadata;
|
|
103
|
+
}
|
|
104
|
+
if (mit !== undefined) {
|
|
105
|
+
params.mit = mit;
|
|
106
|
+
}
|
|
107
|
+
const intent = await client.paymentIntents.create(params, opts.idempotencyKey
|
|
108
|
+
? { idempotencyKey: opts.idempotencyKey }
|
|
109
|
+
: undefined);
|
|
110
|
+
spinner.stop();
|
|
111
|
+
if (opts.json) {
|
|
112
|
+
console.log(JSON.stringify(intent, null, 2));
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log(chalk.green("✓ Payment intent created"));
|
|
116
|
+
printPaymentIntent(intent);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
spinner.stop();
|
|
121
|
+
handleError(err);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
intents
|
|
125
|
+
.command("capture")
|
|
126
|
+
.description("Capture an authorized payment intent")
|
|
127
|
+
.argument("<id>", "Payment intent ID (vpi_*)")
|
|
128
|
+
.option("--amount-to-capture <cents>", "Partial capture amount in minor units (omit for full)", (v) => parseInt(v, 10))
|
|
129
|
+
.option("--idempotency-key <key>", "Idempotency key for safe retries")
|
|
130
|
+
.option("--confirm-live", CONFIRM_LIVE_DESCRIPTION)
|
|
131
|
+
.option("--json", "Output raw JSON")
|
|
132
|
+
.action(async (id, opts) => {
|
|
133
|
+
const apiKey = requireApiKey();
|
|
134
|
+
requireLiveConfirmation(apiKey, opts, "capture a payment intent");
|
|
135
|
+
const client = makeCheckoutClient();
|
|
136
|
+
const spinner = ora("Capturing payment intent...").start();
|
|
137
|
+
try {
|
|
138
|
+
const intent = await client.paymentIntents.capture(id, opts.amountToCapture !== undefined
|
|
139
|
+
? { amountToCapture: opts.amountToCapture }
|
|
140
|
+
: undefined, opts.idempotencyKey
|
|
141
|
+
? { idempotencyKey: opts.idempotencyKey }
|
|
142
|
+
: undefined);
|
|
143
|
+
spinner.stop();
|
|
144
|
+
if (opts.json) {
|
|
145
|
+
console.log(JSON.stringify(intent, null, 2));
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const captureLabel = opts.amountToCapture !== undefined
|
|
149
|
+
? ` (partial: ${(opts.amountToCapture / 100).toFixed(2)} ${intent.currency})`
|
|
150
|
+
: "";
|
|
151
|
+
console.log(chalk.green(`✓ Payment intent captured${captureLabel}`));
|
|
152
|
+
printPaymentIntent(intent);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
spinner.stop();
|
|
157
|
+
handleError(err);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
intents
|
|
161
|
+
.command("void")
|
|
162
|
+
.description("Void an authorized (uncaptured) payment intent")
|
|
163
|
+
.argument("<id>", "Payment intent ID (vpi_*)")
|
|
164
|
+
.option("--idempotency-key <key>", "Idempotency key for safe retries")
|
|
165
|
+
.option("--confirm-live", CONFIRM_LIVE_DESCRIPTION)
|
|
166
|
+
.option("--json", "Output raw JSON")
|
|
167
|
+
.action(async (id, opts) => {
|
|
168
|
+
const apiKey = requireApiKey();
|
|
169
|
+
requireLiveConfirmation(apiKey, opts, "void a payment intent");
|
|
170
|
+
const client = makeCheckoutClient();
|
|
171
|
+
const spinner = ora("Voiding payment intent...").start();
|
|
172
|
+
try {
|
|
173
|
+
const intent = await client.paymentIntents.void(id, opts.idempotencyKey
|
|
174
|
+
? { idempotencyKey: opts.idempotencyKey }
|
|
175
|
+
: undefined);
|
|
176
|
+
spinner.stop();
|
|
177
|
+
if (opts.json) {
|
|
178
|
+
console.log(JSON.stringify(intent, null, 2));
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log(chalk.green("✓ Payment intent voided"));
|
|
182
|
+
printPaymentIntent(intent);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
spinner.stop();
|
|
187
|
+
handleError(err);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
return intents;
|
|
191
|
+
}
|
|
192
|
+
export const __testing__ = {
|
|
193
|
+
buildMITBlock,
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=payment-intents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-intents.js","sourceRoot":"","sources":["../../src/commands/payment-intents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refunds.d.ts","sourceRoot":"","sources":["../../src/commands/refunds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC,wBAAgB,cAAc,IAAI,OAAO,CA+ExC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { requireApiKey } from "../config.js";
|
|
5
|
+
import { makeCheckoutClient } from "../client-factory.js";
|
|
6
|
+
import { parseMetadata } from "../utils/metadata.js";
|
|
7
|
+
import { handleError } from "../utils/errors.js";
|
|
8
|
+
import { requireLiveConfirmation } from "../utils/live-key.js";
|
|
9
|
+
import { safeDisplay } from "../utils/sanitize.js";
|
|
10
|
+
function printRefund(refund) {
|
|
11
|
+
const statusColor = refund.status === "succeeded"
|
|
12
|
+
? chalk.green
|
|
13
|
+
: refund.status === "failed"
|
|
14
|
+
? chalk.red
|
|
15
|
+
: chalk.yellow;
|
|
16
|
+
console.log(` ID: ${refund.id}`);
|
|
17
|
+
console.log(` Payment intent: ${refund.paymentIntent}`);
|
|
18
|
+
console.log(` Status: ${statusColor(refund.status)}`);
|
|
19
|
+
console.log(` Amount: ${(refund.amount / 100).toFixed(2)} ${refund.currency}`);
|
|
20
|
+
if (refund.reason) {
|
|
21
|
+
// Server echoes back the user-supplied reason; strip terminal escapes
|
|
22
|
+
// before printing so a malicious or accidentally-formatted reason can't
|
|
23
|
+
// repaint the terminal.
|
|
24
|
+
console.log(` Reason: ${safeDisplay(refund.reason)}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function refundsCommand() {
|
|
28
|
+
const refunds = new Command("refunds").description("Refund a captured payment intent");
|
|
29
|
+
refunds
|
|
30
|
+
.command("create")
|
|
31
|
+
.description("Create a refund against a payment intent")
|
|
32
|
+
.requiredOption("--payment-intent <id>", "Payment intent ID to refund (vpi_*)")
|
|
33
|
+
.option("--amount <cents>", "Refund amount in minor units (omit for full remaining balance)", (v) => parseInt(v, 10))
|
|
34
|
+
.option("--currency <code>", "ISO 4217 currency code")
|
|
35
|
+
.option("--reason <text>", "Free-form reason (mirrored back on the record)")
|
|
36
|
+
.option("--metadata <pair...>", "Metadata key=value (repeat flag for multiple pairs)")
|
|
37
|
+
.option("--idempotency-key <key>", "Idempotency key for safe retries")
|
|
38
|
+
.option("--confirm-live", "Required to proceed when the loaded key is vp_sk_live_* (this operation is irreversible)")
|
|
39
|
+
.option("--json", "Output raw JSON")
|
|
40
|
+
.action(async (opts) => {
|
|
41
|
+
const apiKey = requireApiKey();
|
|
42
|
+
requireLiveConfirmation(apiKey, opts, "create a refund");
|
|
43
|
+
const client = makeCheckoutClient();
|
|
44
|
+
const spinner = ora("Creating refund...").start();
|
|
45
|
+
try {
|
|
46
|
+
const metadata = parseMetadata(opts.metadata);
|
|
47
|
+
const params = {
|
|
48
|
+
paymentIntent: opts.paymentIntent,
|
|
49
|
+
};
|
|
50
|
+
if (opts.amount !== undefined)
|
|
51
|
+
params.amount = opts.amount;
|
|
52
|
+
if (opts.currency !== undefined) {
|
|
53
|
+
params.currency = opts.currency.toUpperCase();
|
|
54
|
+
}
|
|
55
|
+
if (opts.reason !== undefined)
|
|
56
|
+
params.reason = opts.reason;
|
|
57
|
+
if (metadata !== undefined)
|
|
58
|
+
params.metadata = metadata;
|
|
59
|
+
const refund = await client.refunds.create(params, opts.idempotencyKey
|
|
60
|
+
? { idempotencyKey: opts.idempotencyKey }
|
|
61
|
+
: undefined);
|
|
62
|
+
spinner.stop();
|
|
63
|
+
if (opts.json) {
|
|
64
|
+
console.log(JSON.stringify(refund, null, 2));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(chalk.green("✓ Refund created"));
|
|
68
|
+
printRefund(refund);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
spinner.stop();
|
|
73
|
+
handleError(err);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return refunds;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=refunds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refunds.js","sourceRoot":"","sources":["../../src/commands/refunds.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,eAAe,IAAI,OAAO,CAoHzC"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import ora from "ora";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
return new VonPayCheckout(requireApiKey());
|
|
8
|
-
}
|
|
4
|
+
import { makeCheckoutClient } from "../client-factory.js";
|
|
5
|
+
import { handleError } from "../utils/errors.js";
|
|
6
|
+
const makeClient = makeCheckoutClient;
|
|
9
7
|
export function sessionsCommand() {
|
|
10
8
|
const sessions = new Command("sessions").description("Create and manage checkout sessions");
|
|
11
9
|
sessions
|
|
@@ -110,17 +108,4 @@ export function sessionsCommand() {
|
|
|
110
108
|
});
|
|
111
109
|
return sessions;
|
|
112
110
|
}
|
|
113
|
-
function handleError(err) {
|
|
114
|
-
if (err instanceof VonPayError) {
|
|
115
|
-
console.error(chalk.red(`Error: ${err.message}`));
|
|
116
|
-
console.error(chalk.dim(` Code: ${err.code}`));
|
|
117
|
-
console.error(chalk.dim(` Fix: ${err.fix}`));
|
|
118
|
-
if (err.requestId) {
|
|
119
|
-
console.error(chalk.dim(` Request ID: ${err.requestId}`));
|
|
120
|
-
}
|
|
121
|
-
process.exit(1);
|
|
122
|
-
}
|
|
123
|
-
console.error(chalk.red(`Error: ${err instanceof Error ? err.message : err}`));
|
|
124
|
-
process.exit(1);
|
|
125
|
-
}
|
|
126
111
|
//# sourceMappingURL=sessions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
|