@vonpay/checkout-cli 0.3.1 → 0.3.3
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 +52 -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 +8 -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 +39 -21
- 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/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/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/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/package.json +2 -2
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,wBAAgB,aAAa,IAAI,OAAO,CAsFvC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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 { isLiveKey, warnLiveSecretFlag } from "../utils/live-key.js";
|
|
9
|
+
function printToken(token) {
|
|
10
|
+
const statusColor = token.status === "active"
|
|
11
|
+
? chalk.green
|
|
12
|
+
: token.status === "expired"
|
|
13
|
+
? chalk.yellow
|
|
14
|
+
: chalk.red;
|
|
15
|
+
console.log(` ID: ${token.id}`);
|
|
16
|
+
console.log(` Status: ${statusColor(token.status)}`);
|
|
17
|
+
console.log(` Card: ${token.card.brand} •••• ${token.card.last4}`);
|
|
18
|
+
console.log(` Expires: ${String(token.card.expMonth).padStart(2, "0")}/${token.card.expYear}`);
|
|
19
|
+
}
|
|
20
|
+
export function tokensCommand() {
|
|
21
|
+
const tokens = new Command("tokens").description("Create payment-method tokens for saved-card / MIT flows");
|
|
22
|
+
tokens
|
|
23
|
+
.command("create")
|
|
24
|
+
.description("Create a payment-method token")
|
|
25
|
+
.option("--buyer-id <id>", "Buyer ID to attach the token to")
|
|
26
|
+
.option("--provider-reference <ref>", "Provider tokenization handle (required for live keys with iframe-vault providers)")
|
|
27
|
+
.option("--metadata <pair...>", "Metadata key=value (repeat flag for multiple pairs)")
|
|
28
|
+
.option("--idempotency-key <key>", "Idempotency key for safe retries")
|
|
29
|
+
.option("--json", "Output raw JSON")
|
|
30
|
+
.action(async (opts) => {
|
|
31
|
+
const apiKey = requireApiKey();
|
|
32
|
+
// Sandbox keys auto-mint a mock card when no provider reference is
|
|
33
|
+
// supplied. Live keys with iframe-vault providers require a
|
|
34
|
+
// browser-minted vault token; the server returns 422 otherwise.
|
|
35
|
+
if (!opts.buyerId && !opts.providerReference) {
|
|
36
|
+
if (isLiveKey(apiKey)) {
|
|
37
|
+
console.warn(chalk.yellow("Warning: no --buyer-id or --provider-reference supplied. Live keys with iframe-vault providers will fail with a 422 validation_error."));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.log(chalk.dim("No --provider-reference supplied; sandbox will auto-mint a mock card token."));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (opts.providerReference !== undefined) {
|
|
44
|
+
warnLiveSecretFlag(apiKey, "--provider-reference");
|
|
45
|
+
}
|
|
46
|
+
const client = makeCheckoutClient();
|
|
47
|
+
const spinner = ora("Creating token...").start();
|
|
48
|
+
try {
|
|
49
|
+
const metadata = parseMetadata(opts.metadata);
|
|
50
|
+
const params = {};
|
|
51
|
+
if (opts.buyerId !== undefined)
|
|
52
|
+
params.buyerId = opts.buyerId;
|
|
53
|
+
if (opts.providerReference !== undefined) {
|
|
54
|
+
params.providerReference = opts.providerReference;
|
|
55
|
+
}
|
|
56
|
+
if (metadata !== undefined)
|
|
57
|
+
params.metadata = metadata;
|
|
58
|
+
const token = await client.tokens.create(params, opts.idempotencyKey
|
|
59
|
+
? { idempotencyKey: opts.idempotencyKey }
|
|
60
|
+
: undefined);
|
|
61
|
+
spinner.stop();
|
|
62
|
+
if (opts.json) {
|
|
63
|
+
console.log(JSON.stringify(token, null, 2));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(chalk.green("✓ Token created"));
|
|
67
|
+
printToken(token);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
spinner.stop();
|
|
72
|
+
handleError(err);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return tokens;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAKA,iBAAS,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAa/C;AAED,eAAO,MAAM,WAAW;;CAEvB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { VonPayError } from "@vonpay/checkout-node";
|
|
3
|
+
const SECRET_KEY_PATTERN = /vp_sk_(test|live)_[A-Za-z0-9_-]+/g;
|
|
4
|
+
function scrubSecrets(s) {
|
|
5
|
+
return s.replace(SECRET_KEY_PATTERN, "vp_sk_***");
|
|
6
|
+
}
|
|
7
|
+
export function handleError(err) {
|
|
8
|
+
if (err instanceof VonPayError) {
|
|
9
|
+
console.error(chalk.red(`Error: ${err.message}`));
|
|
10
|
+
console.error(chalk.dim(` Code: ${err.code}`));
|
|
11
|
+
console.error(chalk.dim(` Fix: ${err.fix}`));
|
|
12
|
+
if (err.requestId) {
|
|
13
|
+
console.error(chalk.dim(` Request ID: ${err.requestId}`));
|
|
14
|
+
}
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
18
|
+
console.error(chalk.red(`Error: ${scrubSecrets(message)}`));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
export const __testing__ = {
|
|
22
|
+
scrubSecrets,
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,kBAAkB,GAAG,mCAAmC,CAAC;AAE/D,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY;CACb,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function isLiveKey(key: string): boolean;
|
|
2
|
+
export interface LiveGateOpts {
|
|
3
|
+
confirmLive?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Refuse to run a destructive/irreversible operation on a live key unless the
|
|
7
|
+
* caller explicitly passes --confirm-live. Pattern mirrors --confirm-cli-exposure
|
|
8
|
+
* in `login.ts` — a deliberate friction step, not a TTY check (CI pseudo-TTYs
|
|
9
|
+
* are unreliable signals).
|
|
10
|
+
*
|
|
11
|
+
* Exits the process with code 1 on refusal so callers can `requireLiveConfirmation(...)`
|
|
12
|
+
* as an early guard at the top of an action handler.
|
|
13
|
+
*/
|
|
14
|
+
export declare function requireLiveConfirmation(key: string, opts: LiveGateOpts, operation: string): void;
|
|
15
|
+
export declare function warnLiveSecretFlag(key: string, flag: string): void;
|
|
16
|
+
//# sourceMappingURL=live-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-key.d.ts","sourceRoot":"","sources":["../../src/utils/live-key.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,GAChB,IAAI,CAgBN;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAOlE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export function isLiveKey(key) {
|
|
3
|
+
return key.startsWith("vp_sk_live_");
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Refuse to run a destructive/irreversible operation on a live key unless the
|
|
7
|
+
* caller explicitly passes --confirm-live. Pattern mirrors --confirm-cli-exposure
|
|
8
|
+
* in `login.ts` — a deliberate friction step, not a TTY check (CI pseudo-TTYs
|
|
9
|
+
* are unreliable signals).
|
|
10
|
+
*
|
|
11
|
+
* Exits the process with code 1 on refusal so callers can `requireLiveConfirmation(...)`
|
|
12
|
+
* as an early guard at the top of an action handler.
|
|
13
|
+
*/
|
|
14
|
+
export function requireLiveConfirmation(key, opts, operation) {
|
|
15
|
+
if (!isLiveKey(key))
|
|
16
|
+
return;
|
|
17
|
+
if (opts.confirmLive) {
|
|
18
|
+
console.warn(chalk.yellow(`Live key in use — ${operation} is irreversible. Proceeding because --confirm-live was passed.`));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.error(chalk.red(`Refusing to ${operation} with a live key. Pass --confirm-live to acknowledge this is intentional.`));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
export function warnLiveSecretFlag(key, flag) {
|
|
25
|
+
if (!isLiveKey(key))
|
|
26
|
+
return;
|
|
27
|
+
console.warn(chalk.yellow(`Warning: passing ${flag} as a command argument with a live key exposes it to shell history and process-list (\`ps\`). Consider piping or env-injecting the value instead.`));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=live-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-key.js","sourceRoot":"","sources":["../../src/utils/live-key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC;AAMD;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAAW,EACX,IAAkB,EAClB,SAAiB;IAEjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO;IAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,qBAAqB,SAAS,iEAAiE,CAChG,CACF,CAAC;QACF,OAAO;IACT,CAAC;IACD,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,eAAe,SAAS,2EAA2E,CACpG,CACF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,IAAY;IAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO;IAC5B,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,oBAAoB,IAAI,mJAAmJ,CAC5K,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAmCpC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const MAX_LEN = 256;
|
|
2
|
+
// Allow tab and newline in values (rare but valid); reject all other C0 controls + DEL.
|
|
3
|
+
const CONTROL_CHARS = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/;
|
|
4
|
+
export function parseMetadata(pairs) {
|
|
5
|
+
if (!pairs || pairs.length === 0)
|
|
6
|
+
return undefined;
|
|
7
|
+
const out = {};
|
|
8
|
+
for (const pair of pairs) {
|
|
9
|
+
const idx = pair.indexOf("=");
|
|
10
|
+
if (idx === -1) {
|
|
11
|
+
throw new Error(`Invalid --metadata value "${pair}". Expected key=value (use multiple --metadata flags for multiple pairs).`);
|
|
12
|
+
}
|
|
13
|
+
const key = pair.slice(0, idx);
|
|
14
|
+
const value = pair.slice(idx + 1);
|
|
15
|
+
if (key.length === 0) {
|
|
16
|
+
throw new Error(`Invalid --metadata value "${pair}": key is empty. Expected key=value with a non-empty key.`);
|
|
17
|
+
}
|
|
18
|
+
if (key.length > MAX_LEN) {
|
|
19
|
+
throw new Error(`--metadata key too long (${key.length} > ${MAX_LEN}).`);
|
|
20
|
+
}
|
|
21
|
+
if (value.length > MAX_LEN) {
|
|
22
|
+
throw new Error(`--metadata value too long (${value.length} > ${MAX_LEN}).`);
|
|
23
|
+
}
|
|
24
|
+
if (CONTROL_CHARS.test(key) || CONTROL_CHARS.test(value)) {
|
|
25
|
+
throw new Error(`--metadata "${key}" contains control characters; metadata must be printable text.`);
|
|
26
|
+
}
|
|
27
|
+
out[key] = value;
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,wFAAwF;AACxF,MAAM,aAAa,GAAG,kCAAkC,CAAC;AAEzD,MAAM,UAAU,aAAa,CAC3B,KAA2B;IAE3B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,2EAA2E,CAC7G,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAClC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,2DAA2D,CAC7F,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,CAAC,MAAM,MAAM,OAAO,IAAI,CACxD,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,8BAA8B,KAAK,CAAC,MAAM,MAAM,OAAO,IAAI,CAC5D,CAAC;QACJ,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,eAAe,GAAG,iEAAiE,CACpF,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAOA,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,MAAM,CAExD"}
|