@vonpay/checkout-cli 0.6.3 → 0.7.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 CHANGED
@@ -42,7 +42,7 @@ All commands are namespaced under `vonpay checkout`:
42
42
  | `vonpay checkout payment-intents create` | Create a discrete-lifecycle payment intent (server-driven flows, MIT) |
43
43
  | `vonpay checkout payment-intents capture <id>` | Capture an authorized intent (full or partial) |
44
44
  | `vonpay checkout payment-intents void <id>` | Void an authorized intent before capture |
45
- | `vonpay checkout refunds create` | Refund a captured intent (full or partial) |
45
+ | `vonpay checkout refunds create` | Refund a captured intent (`--payment-intent`) or a settled transaction (`--transaction`), full or partial — pass exactly one |
46
46
  | `vonpay checkout tokens create` | Create a payment-method token for saved-card / MIT flows |
47
47
  | `vonpay checkout capabilities` | Show what this merchant's binder supports |
48
48
  | `vonpay checkout trigger <event>` | Trigger a synthetic webhook event against your local endpoint (`session.succeeded`, `session.failed`, `payment_intent.*`, `charge.refunded`) |
@@ -82,6 +82,14 @@ vonpay checkout payment-intents void vpi_test_abc123
82
82
  # Refund a succeeded intent
83
83
  vonpay checkout refunds create --payment-intent vpi_test_abc123 --amount 500 --reason duplicate
84
84
 
85
+ # Refund a transaction directly (a payment with no payment intent, or the
86
+ # transaction a refund_target_is_duplicate error tells you to refund instead).
87
+ #
88
+ # Neither a payment intent id nor a transaction id is proof a refund is wanted:
89
+ # both are visible to the shopper's browser. Only refund an id you looked up
90
+ # from your own order records and confirmed belongs to the order being refunded.
91
+ vonpay checkout refunds create --transaction vp_tx_test_abc123
92
+
85
93
  # What does my binder support?
86
94
  vonpay checkout capabilities
87
95
 
@@ -1,3 +1,40 @@
1
1
  import { Command } from "commander";
2
+ import type { CreateRefundParams, Refund, TransactionRefund } from "@vonpay/checkout-node";
3
+ interface RefundCreateOpts {
4
+ paymentIntent?: string;
5
+ transaction?: string;
6
+ amount?: number;
7
+ currency?: string;
8
+ reason?: string;
9
+ metadata?: string[];
10
+ idempotencyKey?: string;
11
+ confirmLive?: boolean;
12
+ json?: boolean;
13
+ }
14
+ /**
15
+ * A refund names exactly one target. Refuse both / neither here, before the
16
+ * live-key gate and before any request, with a message that names the flags.
17
+ */
18
+ /** Help text, exported for the doc guard test. */
19
+ declare function helpFor(flag: "--payment-intent" | "--transaction"): string;
20
+ declare function resolveRefundTarget(opts: Pick<RefundCreateOpts, "paymentIntent" | "transaction">): {
21
+ paymentIntent: string;
22
+ } | {
23
+ transaction: string;
24
+ };
25
+ /**
26
+ * The params sent to `refunds.create()`. Typed as the whole union: the target
27
+ * is chosen at runtime, so the SDK's return type is `Refund | TransactionRefund`
28
+ * and `printRefund` takes both.
29
+ */
30
+ declare function buildRefundParams(opts: RefundCreateOpts, metadata: Record<string, string> | undefined): CreateRefundParams;
31
+ declare function printRefund(refund: Refund | TransactionRefund): void;
2
32
  export declare function refundsCommand(): Command;
33
+ export declare const __testing__: {
34
+ helpFor: typeof helpFor;
35
+ resolveRefundTarget: typeof resolveRefundTarget;
36
+ buildRefundParams: typeof buildRefundParams;
37
+ printRefund: typeof printRefund;
38
+ };
39
+ export {};
3
40
  //# sourceMappingURL=refunds.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"refunds.d.ts","sourceRoot":"","sources":["../../src/commands/refunds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,KAAK,EACV,kBAAkB,EAClB,MAAM,EACN,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAQ/B,UAAU,gBAAgB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAOD;;;GAGG;AACH,kDAAkD;AAClD,iBAAS,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,eAAe,GAAG,MAAM,CAKnE;AAED,iBAAS,mBAAmB,CAC1B,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,GAAG,aAAa,CAAC,GAC5D;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAarD;AAED;;;;GAIG;AACH,iBAAS,iBAAiB,CACxB,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC3C,kBAAkB,CASpB;AAED,iBAAS,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAyB7D;AAED,wBAAgB,cAAc,IAAI,OAAO,CA8ExC;AAED,eAAO,MAAM,WAAW;;;;;CAKvB,CAAC"}
@@ -7,6 +7,51 @@ import { parseMetadata } from "../utils/metadata.js";
7
7
  import { handleError } from "../utils/errors.js";
8
8
  import { requireLiveConfirmation } from "../utils/live-key.js";
9
9
  import { safeDisplay } from "../utils/sanitize.js";
10
+ /** Empty / whitespace-only flag values count as not provided. */
11
+ function present(v) {
12
+ return v !== undefined && v.trim() !== "";
13
+ }
14
+ /**
15
+ * A refund names exactly one target. Refuse both / neither here, before the
16
+ * live-key gate and before any request, with a message that names the flags.
17
+ */
18
+ /** Help text, exported for the doc guard test. */
19
+ function helpFor(flag) {
20
+ const opt = refundsCommand()
21
+ .commands.find((c) => c.name() === "create")
22
+ .options.find((o) => o.long === flag);
23
+ return opt.description;
24
+ }
25
+ function resolveRefundTarget(opts) {
26
+ const hasPi = present(opts.paymentIntent);
27
+ const hasTx = present(opts.transaction);
28
+ if (hasPi && hasTx) {
29
+ throw new Error("Pass exactly one of --payment-intent or --transaction, not both. A refund is issued against one target.");
30
+ }
31
+ if (hasPi)
32
+ return { paymentIntent: opts.paymentIntent.trim() };
33
+ if (hasTx)
34
+ return { transaction: opts.transaction.trim() };
35
+ throw new Error("A refund target is required: pass --payment-intent <vpi_*> or --transaction <vp_tx_*>.");
36
+ }
37
+ /**
38
+ * The params sent to `refunds.create()`. Typed as the whole union: the target
39
+ * is chosen at runtime, so the SDK's return type is `Refund | TransactionRefund`
40
+ * and `printRefund` takes both.
41
+ */
42
+ function buildRefundParams(opts, metadata) {
43
+ const params = { ...resolveRefundTarget(opts) };
44
+ if (opts.amount !== undefined)
45
+ params.amount = opts.amount;
46
+ if (opts.currency !== undefined) {
47
+ params.currency = opts.currency.toUpperCase();
48
+ }
49
+ if (opts.reason !== undefined)
50
+ params.reason = opts.reason;
51
+ if (metadata !== undefined)
52
+ params.metadata = metadata;
53
+ return params;
54
+ }
10
55
  function printRefund(refund) {
11
56
  const statusColor = refund.status === "succeeded"
12
57
  ? chalk.green
@@ -14,7 +59,13 @@ function printRefund(refund) {
14
59
  ? chalk.red
15
60
  : chalk.yellow;
16
61
  console.log(` ID: ${refund.id}`);
17
- console.log(` Payment intent: ${refund.paymentIntent}`);
62
+ // Exactly one target is set; print whichever it is.
63
+ if (refund.transaction !== null) {
64
+ console.log(` Transaction: ${refund.transaction}`);
65
+ }
66
+ else {
67
+ console.log(` Payment intent: ${refund.paymentIntent}`);
68
+ }
18
69
  console.log(` Status: ${statusColor(refund.status)}`);
19
70
  console.log(` Amount: ${(refund.amount / 100).toFixed(2)} ${refund.currency}`);
20
71
  if (refund.reason) {
@@ -25,11 +76,17 @@ function printRefund(refund) {
25
76
  }
26
77
  }
27
78
  export function refundsCommand() {
28
- const refunds = new Command("refunds").description("Refund a captured payment intent");
79
+ const refunds = new Command("refunds").description("Refund a captured payment intent or a settled transaction");
29
80
  refunds
30
81
  .command("create")
31
- .description("Create a refund against a payment intent")
32
- .requiredOption("--payment-intent <id>", "Payment intent ID to refund (vpi_*)")
82
+ .description("Create a refund against a payment intent (--payment-intent) or a transaction (--transaction) — exactly one")
83
+ .option("--payment-intent <id>", "Payment intent ID to refund (vpi_*). Use this OR --transaction. A payment intent id is also " +
84
+ "visible to the shopper's browser — it is not proof a refund is wanted; only refund one you " +
85
+ "looked up from your own order records")
86
+ .option("--transaction <id>", "Transaction ID to refund (vp_tx_*), instead of --payment-intent. Use it for a payment " +
87
+ "that has no payment intent, or to follow the transaction a refund_target_is_duplicate " +
88
+ "error names. A transaction id is also visible to the shopper's browser — only refund " +
89
+ "one you looked up from your own order records")
33
90
  .option("--amount <cents>", "Refund amount in minor units (omit for full remaining balance)", (v) => parseInt(v, 10))
34
91
  .option("--currency <code>", "ISO 4217 currency code")
35
92
  .option("--reason <text>", "Free-form reason (mirrored back on the record)")
@@ -38,24 +95,21 @@ export function refundsCommand() {
38
95
  .option("--confirm-live", "Required to proceed when the loaded key is vp_sk_live_* (this operation is irreversible)")
39
96
  .option("--json", "Output raw JSON")
40
97
  .action(async (opts) => {
98
+ // Target check first: a usage error needs no key and sends nothing.
99
+ try {
100
+ resolveRefundTarget(opts);
101
+ }
102
+ catch (err) {
103
+ console.error(chalk.red(`Error: ${err.message}`));
104
+ process.exit(1);
105
+ }
41
106
  const apiKey = requireApiKey();
42
107
  requireLiveConfirmation(apiKey, opts, "create a refund");
43
108
  const client = makeCheckoutClient();
44
109
  const spinner = ora("Creating refund...").start();
45
110
  try {
46
111
  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;
112
+ const params = buildRefundParams(opts, metadata);
59
113
  const refund = await client.refunds.create(params, opts.idempotencyKey
60
114
  ? { idempotencyKey: opts.idempotencyKey }
61
115
  : undefined);
@@ -75,4 +129,10 @@ export function refundsCommand() {
75
129
  });
76
130
  return refunds;
77
131
  }
132
+ export const __testing__ = {
133
+ helpFor,
134
+ resolveRefundTarget,
135
+ buildRefundParams,
136
+ printRefund,
137
+ };
78
138
  //# sourceMappingURL=refunds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"refunds.js","sourceRoot":"","sources":["../../src/commands/refunds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"refunds.js","sourceRoot":"","sources":["../../src/commands/refunds.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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,CAsB/C;AAED,eAAO,MAAM,WAAW;;CAEvB,CAAC"}
@@ -9,6 +9,11 @@ export function handleError(err) {
9
9
  console.error(chalk.red(`Error: ${err.message}`));
10
10
  console.error(chalk.dim(` Code: ${err.code}`));
11
11
  console.error(chalk.dim(` Fix: ${err.fix}`));
12
+ if (err.refundInstead) {
13
+ // refund_target_is_duplicate: the SDK has already checked this is a
14
+ // transaction id (vp_tx_*), so it is safe to echo as a command.
15
+ console.error(chalk.dim(` Refund instead: vonpay checkout refunds create --transaction ${err.refundInstead}`));
16
+ }
12
17
  if (err.requestId) {
13
18
  console.error(chalk.dim(` Request ID: ${err.requestId}`));
14
19
  }
@@ -1 +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"}
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,aAAa,EAAE,CAAC;YACtB,oEAAoE;YACpE,gEAAgE;YAChE,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,kEAAkE,GAAG,CAAC,aAAa,EAAE,CACtF,CACF,CAAC;QACJ,CAAC;QACD,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vonpay/checkout-cli",
3
- "version": "0.6.3",
3
+ "version": "0.7.0",
4
4
  "description": "Von Payments CLI — developer tools for checkout integration",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -18,7 +18,7 @@
18
18
  "commander": "^13.0.0",
19
19
  "chalk": "^5.4.0",
20
20
  "ora": "^8.2.0",
21
- "@vonpay/checkout-node": "2.8.0"
21
+ "@vonpay/checkout-node": "2.10.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "typescript": "^5.7.0",