@crvouga/mockingbird-service-stripe 0.1.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.
Files changed (142) hide show
  1. package/README.md +254 -0
  2. package/dist/account.d.ts +8 -0
  3. package/dist/account.d.ts.map +1 -0
  4. package/dist/account.js +13 -0
  5. package/dist/account.js.map +1 -0
  6. package/dist/charges.d.ts +4 -0
  7. package/dist/charges.d.ts.map +1 -0
  8. package/dist/charges.js +89 -0
  9. package/dist/charges.js.map +1 -0
  10. package/dist/checkout-sessions.d.ts +5 -0
  11. package/dist/checkout-sessions.d.ts.map +1 -0
  12. package/dist/checkout-sessions.js +303 -0
  13. package/dist/checkout-sessions.js.map +1 -0
  14. package/dist/constants.d.ts +3 -0
  15. package/dist/constants.d.ts.map +1 -0
  16. package/dist/constants.js +3 -0
  17. package/dist/constants.js.map +1 -0
  18. package/dist/coupons.d.ts +4 -0
  19. package/dist/coupons.d.ts.map +1 -0
  20. package/dist/coupons.js +158 -0
  21. package/dist/coupons.js.map +1 -0
  22. package/dist/customers.d.ts +4 -0
  23. package/dist/customers.d.ts.map +1 -0
  24. package/dist/customers.js +218 -0
  25. package/dist/customers.js.map +1 -0
  26. package/dist/disputes.d.ts +4 -0
  27. package/dist/disputes.d.ts.map +1 -0
  28. package/dist/disputes.js +36 -0
  29. package/dist/disputes.js.map +1 -0
  30. package/dist/errors.d.ts +29 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +74 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/events.d.ts +4 -0
  35. package/dist/events.d.ts.map +1 -0
  36. package/dist/events.js +76 -0
  37. package/dist/events.js.map +1 -0
  38. package/dist/expand.d.ts +11 -0
  39. package/dist/expand.d.ts.map +1 -0
  40. package/dist/expand.js +45 -0
  41. package/dist/expand.js.map +1 -0
  42. package/dist/fields.d.ts +25 -0
  43. package/dist/fields.d.ts.map +1 -0
  44. package/dist/fields.js +117 -0
  45. package/dist/fields.js.map +1 -0
  46. package/dist/generated/openapi.d.ts +7 -0
  47. package/dist/generated/openapi.d.ts.map +1 -0
  48. package/dist/generated/openapi.js +5 -0
  49. package/dist/generated/openapi.js.map +1 -0
  50. package/dist/index.d.ts +43 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +172 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/internal.d.ts +134 -0
  55. package/dist/internal.d.ts.map +1 -0
  56. package/dist/internal.js +460 -0
  57. package/dist/internal.js.map +1 -0
  58. package/dist/invoice-items.d.ts +4 -0
  59. package/dist/invoice-items.d.ts.map +1 -0
  60. package/dist/invoice-items.js +179 -0
  61. package/dist/invoice-items.js.map +1 -0
  62. package/dist/invoices.d.ts +4 -0
  63. package/dist/invoices.d.ts.map +1 -0
  64. package/dist/invoices.js +312 -0
  65. package/dist/invoices.js.map +1 -0
  66. package/dist/list.d.ts +24 -0
  67. package/dist/list.d.ts.map +1 -0
  68. package/dist/list.js +68 -0
  69. package/dist/list.js.map +1 -0
  70. package/dist/params.d.ts +29 -0
  71. package/dist/params.d.ts.map +1 -0
  72. package/dist/params.js +165 -0
  73. package/dist/params.js.map +1 -0
  74. package/dist/payment-intents.d.ts +4 -0
  75. package/dist/payment-intents.d.ts.map +1 -0
  76. package/dist/payment-intents.js +232 -0
  77. package/dist/payment-intents.js.map +1 -0
  78. package/dist/payment-methods.d.ts +4 -0
  79. package/dist/payment-methods.d.ts.map +1 -0
  80. package/dist/payment-methods.js +99 -0
  81. package/dist/payment-methods.js.map +1 -0
  82. package/dist/prices.d.ts +4 -0
  83. package/dist/prices.d.ts.map +1 -0
  84. package/dist/prices.js +176 -0
  85. package/dist/prices.js.map +1 -0
  86. package/dist/products.d.ts +6 -0
  87. package/dist/products.d.ts.map +1 -0
  88. package/dist/products.js +202 -0
  89. package/dist/products.js.map +1 -0
  90. package/dist/promotion-codes.d.ts +4 -0
  91. package/dist/promotion-codes.d.ts.map +1 -0
  92. package/dist/promotion-codes.js +193 -0
  93. package/dist/promotion-codes.js.map +1 -0
  94. package/dist/qa-corpus.d.ts +26 -0
  95. package/dist/qa-corpus.d.ts.map +1 -0
  96. package/dist/qa-corpus.js +42 -0
  97. package/dist/qa-corpus.js.map +1 -0
  98. package/dist/refunds.d.ts +4 -0
  99. package/dist/refunds.d.ts.map +1 -0
  100. package/dist/refunds.js +125 -0
  101. package/dist/refunds.js.map +1 -0
  102. package/dist/render.d.ts +60 -0
  103. package/dist/render.d.ts.map +1 -0
  104. package/dist/render.js +426 -0
  105. package/dist/render.js.map +1 -0
  106. package/dist/reshape-qa.d.ts +8 -0
  107. package/dist/reshape-qa.d.ts.map +1 -0
  108. package/dist/reshape-qa.js +102 -0
  109. package/dist/reshape-qa.js.map +1 -0
  110. package/dist/search.d.ts +32 -0
  111. package/dist/search.d.ts.map +1 -0
  112. package/dist/search.js +64 -0
  113. package/dist/search.js.map +1 -0
  114. package/dist/setup-intents.d.ts +4 -0
  115. package/dist/setup-intents.d.ts.map +1 -0
  116. package/dist/setup-intents.js +129 -0
  117. package/dist/setup-intents.js.map +1 -0
  118. package/dist/state.d.ts +485 -0
  119. package/dist/state.d.ts.map +1 -0
  120. package/dist/state.js +143 -0
  121. package/dist/state.js.map +1 -0
  122. package/dist/subscription-schedules.d.ts +4 -0
  123. package/dist/subscription-schedules.d.ts.map +1 -0
  124. package/dist/subscription-schedules.js +122 -0
  125. package/dist/subscription-schedules.js.map +1 -0
  126. package/dist/subscriptions.d.ts +23 -0
  127. package/dist/subscriptions.d.ts.map +1 -0
  128. package/dist/subscriptions.js +260 -0
  129. package/dist/subscriptions.js.map +1 -0
  130. package/dist/test-tokens.d.ts +27 -0
  131. package/dist/test-tokens.d.ts.map +1 -0
  132. package/dist/test-tokens.js +61 -0
  133. package/dist/test-tokens.js.map +1 -0
  134. package/dist/url.d.ts +6 -0
  135. package/dist/url.d.ts.map +1 -0
  136. package/dist/url.js +38 -0
  137. package/dist/url.js.map +1 -0
  138. package/dist/version.d.ts +3 -0
  139. package/dist/version.d.ts.map +1 -0
  140. package/dist/version.js +3 -0
  141. package/dist/version.js.map +1 -0
  142. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { FormValue } from "@crvouga/mockingbird-http-codec";
2
+ import type { SchemaObject } from "@crvouga/mockingbird-openapi";
3
+ import { type FormIssue, type OperationContext } from "@crvouga/mockingbird-service";
4
+ import { StripeError } from "./errors.js";
5
+ export declare const issueToError: (issue: FormIssue) => StripeError;
6
+ /** The list Stripe prints when a currency is unknown, in its (non-alphabetical) order. */
7
+ export declare const SUPPORTED_CURRENCIES: string[];
8
+ export type Params = Record<string, unknown>;
9
+ /**
10
+ * Per-operation validation order. Stripe validates parameters one at a time in its own
11
+ * declaration order (unknown parameters always first), so when several are wrong the reported
12
+ * one depends on this order. Keys not listed fall back to schema (alphabetical) order.
13
+ */
14
+ export type ParamOptions = {
15
+ order?: readonly string[];
16
+ /** Semantic checks that run in the same per-parameter slot as schema issues for that key. */
17
+ validate?: Record<string, (params: Params) => void>;
18
+ /** Checks Stripe defers until every parameter has been accepted. */
19
+ after?: (params: Params) => void;
20
+ };
21
+ /** Parse a raw form object against a schema, throwing Stripe's first complaint. */
22
+ export declare const parseParams: (schema: SchemaObject, raw: FormValue | undefined, options?: ParamOptions) => Params;
23
+ /** Body parameters for POST operations. Stripe treats a missing/empty body as no parameters. */
24
+ export declare const bodyParams: (context: OperationContext, options?: ParamOptions) => Params;
25
+ export declare const queryParams: (context: OperationContext, options?: ParamOptions) => Params;
26
+ /** Stripe reads `""` as "unset" for optional scalars. */
27
+ export declare const unsetToNull: <T>(value: T | "" | undefined) => T | null | undefined;
28
+ export declare const isSet: (value: unknown) => value is string | number | boolean | object;
29
+ //# sourceMappingURL=params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAa,MAAM,8BAA8B,CAAA;AAC/F,OAAO,EAOL,WAAW,EACZ,MAAM,aAAa,CAAA;AAgCpB,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,KAAG,WA6E/C,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,oBAAoB,UAG9B,CAAA;AAEH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE5C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,CAAA;IACnD,oEAAoE;IACpE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC,CAAA;AAOD,mFAAmF;AACnF,eAAO,MAAM,WAAW,GACtB,QAAQ,YAAY,EACpB,KAAK,SAAS,GAAG,SAAS,EAC1B,UAAS,YAAiB,KACzB,MA2BF,CAAA;AAoCD,gGAAgG;AAChG,eAAO,MAAM,UAAU,GAAI,SAAS,gBAAgB,EAAE,UAAS,YAAiB,KAAG,MAWlF,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,SAAS,gBAAgB,EAAE,UAAS,YAAiB,KAAG,MACT,CAAA;AAE3E,yDAAyD;AACzD,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,SAAS,KAAG,CAAC,GAAG,IAAI,GAAG,SACzC,CAAA;AAE7B,eAAO,MAAM,KAAK,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MACvC,CAAA"}
package/dist/params.js ADDED
@@ -0,0 +1,165 @@
1
+ import { parseForm } from "@crvouga/mockingbird-service";
2
+ import { humanList, invalidRequest, parameterInvalidEmpty, parameterInvalidInteger, parameterMissing, parameterUnknown, StripeError, } from "./errors.js";
3
+ import { document } from "./generated/openapi.js";
4
+ /** Stripe words enum alternatives in its own order, not the spec's alphabetical one. */
5
+ const ENUM_ORDER = {
6
+ tax_exempt: ["none", "reverse", "exempt"],
7
+ interval: ["month", "year", "week", "day"],
8
+ usage_type: ["metered", "licensed"],
9
+ tax_behavior: ["inclusive", "exclusive", "unspecified"],
10
+ type: ["one_time", "recurring"],
11
+ };
12
+ /** Fields whose length error uses the terse "Invalid string length" wording. */
13
+ const TERSE_LENGTH_FIELDS = new Set(["phone", "unit_label"]);
14
+ const leafName = (path) => {
15
+ const match = /\[([^\]]+)\]$/.exec(path);
16
+ return match?.[1] ?? path;
17
+ };
18
+ const truncate = (value) => {
19
+ const chars = [...value];
20
+ return chars.length <= 8 ? value : `${chars.slice(0, 4).join("")}...${chars.slice(-4).join("")}`;
21
+ };
22
+ const orderedAlternatives = (path, allowed) => {
23
+ const preferred = ENUM_ORDER[leafName(path)];
24
+ if (!preferred)
25
+ return allowed;
26
+ const known = preferred.filter((item) => allowed.includes(item));
27
+ return [...known, ...allowed.filter((item) => !known.includes(item))];
28
+ };
29
+ export const issueToError = (issue) => {
30
+ switch (issue.kind) {
31
+ case "unknown":
32
+ return parameterUnknown(issue.path);
33
+ case "missing":
34
+ return parameterMissing(issue.path);
35
+ case "empty":
36
+ return parameterInvalidEmpty(issue.path);
37
+ case "invalid-integer":
38
+ return parameterInvalidInteger(issue.path, issue.raw);
39
+ case "invalid-number":
40
+ return invalidRequest(`Invalid decimal: ${issue.raw}`, issue.path);
41
+ case "invalid-boolean":
42
+ return invalidRequest(`Invalid boolean: ${issue.raw}`, issue.path);
43
+ case "invalid-object":
44
+ return invalidRequest("Invalid object", issue.path);
45
+ case "invalid-array":
46
+ return invalidRequest("Invalid array", issue.path);
47
+ case "invalid-enum": {
48
+ const leaf = leafName(issue.path);
49
+ if (leaf === "currency")
50
+ return invalidRequest(`Invalid currency: ${issue.raw}. Stripe currently supports these currencies: ${SUPPORTED_CURRENCIES.join(", ")}`, issue.path);
51
+ if (/^preferred_locales\[\d+\]$/.test(issue.path))
52
+ return invalidRequest("Not a valid language, try using an IETF language tag, such as 'en-US'. For more information, check https://tools.ietf.org/html/rfc5646", issue.path);
53
+ return invalidRequest(`Invalid ${issue.path}: must be one of ${humanList(orderedAlternatives(issue.path, issue.allowed))}`, issue.path);
54
+ }
55
+ case "too-long": {
56
+ const leaf = leafName(issue.path);
57
+ if (leaf === "statement_descriptor")
58
+ return invalidRequest(`The statement descriptor must be at most ${issue.limit} characters. ${issue.raw} is ${[...issue.raw].length} characters long.`, issue.path);
59
+ if (/^images\[\d+\]$/.test(issue.path))
60
+ return invalidRequest(`Invalid URL: URL must be ${issue.limit} characters or less.`, issue.path);
61
+ if (TERSE_LENGTH_FIELDS.has(leaf))
62
+ return invalidRequest(`Invalid string length: ${issue.raw} must be at most ${issue.limit} characters`, issue.path);
63
+ return invalidRequest(`Invalid string: ${truncate(issue.raw)}; must be at most ${issue.limit} characters`, issue.path);
64
+ }
65
+ case "too-many-items":
66
+ return invalidRequest(`Array ${issue.path} exceeded maximum ${issue.limit} allowed elements.`, issue.path);
67
+ case "below-minimum":
68
+ return new StripeError({
69
+ status: 400,
70
+ code: "parameter_invalid_integer",
71
+ message: `This value must be greater than or equal to ${issue.limit}.`,
72
+ param: issue.path,
73
+ });
74
+ case "above-maximum":
75
+ return new StripeError({
76
+ status: 400,
77
+ code: "parameter_invalid_integer",
78
+ message: `This value must be less than or equal to ${issue.limit}.`,
79
+ param: issue.path,
80
+ });
81
+ }
82
+ };
83
+ /** The list Stripe prints when a currency is unknown, in its (non-alphabetical) order. */
84
+ export const SUPPORTED_CURRENCIES = "usd, aed, afn, all, amd, ang, aoa, ars, aud, awg, azn, bam, bbd, bdt, bgn, bhd, bif, bmd, bnd, bob, brl, bsd, bwp, byn, bzd, cad, cdf, chf, clp, cny, cop, crc, cve, czk, djf, dkk, dop, dzd, egp, etb, eur, fjd, fkp, gbp, gel, gip, gmd, gnf, gtq, gyd, hkd, hnl, hrk, htg, huf, idr, ils, inr, isk, jmd, jod, jpy, kes, kgs, khr, kmf, krw, kwd, kyd, kzt, lak, lbp, lkr, lrd, lsl, mad, mdl, mga, mkd, mmk, mnt, mop, mur, mvr, mwk, mxn, myr, mzn, nad, ngn, nio, nok, npr, nzd, omr, pab, pen, pgk, php, pkr, pln, pyg, qar, ron, rsd, rub, rwf, sar, sbd, scr, sek, sgd, shp, sle, sos, srd, std, szl, thb, tjs, tnd, top, try, ttd, twd, tzs, uah, ugx, uyu, uzs, vnd, vuv, wst, xaf, xcd, xcg, xof, xpf, yer, zar, zmw, usdc, btn, ghs, eek, lvl, svc, vef, ltl, sll, mro".split(", ");
85
+ const topLevelKey = (path) => {
86
+ const bracket = path.indexOf("[");
87
+ return bracket === -1 ? path : path.slice(0, bracket);
88
+ };
89
+ /** Parse a raw form object against a schema, throwing Stripe's first complaint. */
90
+ export const parseParams = (schema, raw, options = {}) => {
91
+ const parsed = parseForm(document, schema, raw ?? {});
92
+ const unknown = parsed.issues.find((issue) => issue.kind === "unknown");
93
+ if (unknown)
94
+ throw issueToError(unknown);
95
+ const params = (parsed.value ?? {});
96
+ if (Array.isArray(params.preferred_locales) && params.preferred_locales.length === 0)
97
+ delete params.preferred_locales;
98
+ const declared = Object.keys(schema.properties ?? {});
99
+ const order = [
100
+ ...(options.order ?? []),
101
+ ...declared.filter((key) => !(options.order ?? []).includes(key)),
102
+ ];
103
+ for (const key of order) {
104
+ const issues = parsed.issues.filter((item) => topLevelKey(item.path) === key);
105
+ const issue = key === "package_dimensions"
106
+ ? (["width", "height", "length", "weight"]
107
+ .map((field) => issues.find((item) => item.path === `package_dimensions[${field}]`))
108
+ .find((item) => item !== undefined) ?? issues[0])
109
+ : issues[0];
110
+ if (issue)
111
+ throw issueToError(issue);
112
+ options.validate?.[key]?.(params);
113
+ }
114
+ const stray = parsed.issues[0];
115
+ if (stray)
116
+ throw issueToError(stray);
117
+ options.after?.(params);
118
+ return params;
119
+ };
120
+ const formBodySchema = (context) => {
121
+ const body = context.operation.requestBody;
122
+ const media = body?.content["application/x-www-form-urlencoded"];
123
+ return media?.schema ?? { type: "object", properties: {} };
124
+ };
125
+ const querySchema = (context) => {
126
+ const properties = {};
127
+ for (const parameter of context.operation.parameters) {
128
+ if (parameter.in === "query" && parameter.schema)
129
+ properties[parameter.name] = parameter.schema;
130
+ }
131
+ return { type: "object", properties };
132
+ };
133
+ /**
134
+ * Stripe metadata is a string→string map. The vendored contract models that, but the form codec
135
+ * tolerates nested values inside open objects, so anything a handler would store as metadata is
136
+ * reduced to its string entries here: a non-string value is refused the way Stripe refuses it.
137
+ */
138
+ const stringMetadata = (params) => {
139
+ const metadata = params.metadata;
140
+ if (metadata === null || typeof metadata !== "object" || Array.isArray(metadata))
141
+ return params;
142
+ const kept = {};
143
+ for (const [key, value] of Object.entries(metadata)) {
144
+ if (typeof value !== "string")
145
+ throw invalidRequest(`Invalid metadata value for key '${key}': metadata values must be strings.`, "metadata");
146
+ kept[key] = value;
147
+ }
148
+ return { ...params, metadata: kept };
149
+ };
150
+ /** Body parameters for POST operations. Stripe treats a missing/empty body as no parameters. */
151
+ export const bodyParams = (context, options = {}) => {
152
+ const body = context.body;
153
+ const raw = body.kind === "form" ? body.value : {};
154
+ if (typeof raw === "object" &&
155
+ raw !== null &&
156
+ !Array.isArray(raw) &&
157
+ raw.preferred_locales === "")
158
+ delete raw.preferred_locales;
159
+ return stringMetadata(parseParams(formBodySchema(context), raw, options));
160
+ };
161
+ export const queryParams = (context, options = {}) => stringMetadata(parseParams(querySchema(context), context.query, options));
162
+ /** Stripe reads `""` as "unset" for optional scalars. */
163
+ export const unsetToNull = (value) => value === "" ? null : value;
164
+ export const isSet = (value) => value !== undefined && value !== "";
165
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type OperationHandler } from "@crvouga/mockingbird-service";
2
+ import { type Services } from "./internal.js";
3
+ export declare const paymentIntentHandlers: (services: Services) => Record<string, OperationHandler>;
4
+ //# sourceMappingURL=payment-intents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-intents.d.ts","sourceRoot":"","sources":["../src/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAGlF,OAAO,EAWL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAA;AAyDtB,eAAO,MAAM,qBAAqB,GAAI,UAAU,QAAQ,KAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAwNzF,CAAA"}
@@ -0,0 +1,232 @@
1
+ import { jsonResponse } from "@crvouga/mockingbird-service";
2
+ import { invalidRequest, parameterMissing } from "./errors.js";
3
+ import { applyExpand } from "./expand.js";
4
+ import { clientSecretFor, completeSessionsForIntent, confirmPaymentIntent, customerEmail, mergeRecordMetadata, requestScope, requireIntent, requireLiveCustomer, resolvePaymentMethod, } from "./internal.js";
5
+ import { matchesCreated, paginate } from "./list.js";
6
+ import { bodyParams, queryParams } from "./params.js";
7
+ import { renderCharge, renderCustomer, renderInvoice, renderPaymentIntent, renderPaymentMethod, } from "./render.js";
8
+ import { searchRecords } from "./search.js";
9
+ import { seconds } from "./state.js";
10
+ const DEFAULT_PAYMENT_METHOD_TYPES = ["card", "link"];
11
+ const expanders = (scope) => ({
12
+ latest_charge: (id) => {
13
+ const charge = scope.account.charges.get(id);
14
+ return charge ? renderCharge(charge) : undefined;
15
+ },
16
+ payment_method: (id) => {
17
+ const method = scope.account.paymentMethods.get(id);
18
+ return method ? renderPaymentMethod(method) : undefined;
19
+ },
20
+ invoice: (id) => {
21
+ const invoice = scope.account.invoices.get(id);
22
+ return invoice ? renderInvoice(invoice, scope.account) : undefined;
23
+ },
24
+ customer: (id) => {
25
+ const entry = scope.account.customers.get(id);
26
+ return entry?.kind === "live" ? renderCustomer(entry.customer) : undefined;
27
+ },
28
+ });
29
+ const amountOf = (params, key) => {
30
+ const value = params[key];
31
+ if (value === undefined || value === "")
32
+ return undefined;
33
+ const parsed = Number(value);
34
+ return Number.isFinite(parsed) ? Math.trunc(parsed) : undefined;
35
+ };
36
+ const stringOf = (params, key) => {
37
+ const value = params[key];
38
+ return typeof value === "string" && value !== "" ? value : null;
39
+ };
40
+ const booleanOf = (params, key) => params[key] === true || params[key] === "true";
41
+ const stringListOf = (params, key) => {
42
+ const value = params[key];
43
+ if (Array.isArray(value))
44
+ return value.filter((entry) => typeof entry === "string" && entry !== "");
45
+ if (typeof value === "string" && value !== "")
46
+ return value.split(",");
47
+ return DEFAULT_PAYMENT_METHOD_TYPES;
48
+ };
49
+ export const paymentIntentHandlers = (services) => {
50
+ const render = (scope, record, params) => applyExpand(renderPaymentIntent(record), params.expand, expanders(scope));
51
+ /**
52
+ * Confirm and, when the intent succeeds, emit `payment_intent.succeeded` (and complete any
53
+ * checkout session waiting on it). A declined card records `payment_intent.payment_failed`
54
+ * before the 402 travels back to the caller.
55
+ */
56
+ const confirmOrDecline = (scope, record, paymentMethod) => {
57
+ try {
58
+ const confirmed = confirmPaymentIntent(scope, record, paymentMethod);
59
+ if (confirmed.status === "succeeded") {
60
+ scope.emit("payment_intent.succeeded", renderPaymentIntent(confirmed));
61
+ completeSessionsForIntent(scope, { paymentIntent: confirmed.id });
62
+ }
63
+ return confirmed;
64
+ }
65
+ catch (error) {
66
+ const failed = scope.account.paymentIntents.get(record.id) ?? record;
67
+ scope.emit("payment_intent.payment_failed", renderPaymentIntent(failed));
68
+ throw error;
69
+ }
70
+ };
71
+ return {
72
+ GetPaymentIntents: async (context) => {
73
+ const scope = requestScope(services, context);
74
+ const params = queryParams(context);
75
+ const customer = stringOf(params, "customer");
76
+ const page = await paginate(scope.account.paymentIntents, params, {
77
+ url: "/v1/payment_intents",
78
+ kind: "payment_intent",
79
+ where: (record) => matchesCreated(record.created, params.created) &&
80
+ (customer === null || record.customer === customer),
81
+ render: (record) => render(scope, record, params),
82
+ });
83
+ return jsonResponse(200, page);
84
+ },
85
+ PostPaymentIntents: async (context) => {
86
+ const scope = requestScope(services, context);
87
+ const params = bodyParams(context);
88
+ const amount = amountOf(params, "amount");
89
+ if (amount === undefined)
90
+ throw parameterMissing("amount");
91
+ const currency = stringOf(params, "currency");
92
+ if (currency === null)
93
+ throw parameterMissing("currency");
94
+ const customer = stringOf(params, "customer");
95
+ if (customer !== null)
96
+ requireLiveCustomer(scope, customer);
97
+ const requestedMethod = stringOf(params, "payment_method");
98
+ const paymentMethod = requestedMethod === null ? null : resolvePaymentMethod(scope, requestedMethod).id;
99
+ const id = scope.ids.next("pi_");
100
+ const record = {
101
+ id,
102
+ amount,
103
+ amount_capturable: 0,
104
+ amount_received: 0,
105
+ capture_method: stringOf(params, "capture_method") === "manual" ? "manual" : "automatic",
106
+ client_secret: clientSecretFor(id),
107
+ confirmation_method: "automatic",
108
+ created: seconds(scope.now),
109
+ currency,
110
+ customer,
111
+ description: stringOf(params, "description"),
112
+ invoice: null,
113
+ last_payment_error: null,
114
+ latest_charge: null,
115
+ metadata: params.metadata ?? {},
116
+ payment_method: paymentMethod,
117
+ payment_method_types: stringListOf(params, "payment_method_types"),
118
+ receipt_email: stringOf(params, "receipt_email") ?? customerEmail(scope, customer),
119
+ setup_future_usage: stringOf(params, "setup_future_usage"),
120
+ status: "requires_payment_method",
121
+ canceled_at: null,
122
+ cancellation_reason: null,
123
+ charge_ids: [],
124
+ };
125
+ scope.account.paymentIntents.insert(id, record);
126
+ if (booleanOf(params, "confirm")) {
127
+ return jsonResponse(200, render(scope, confirmOrDecline(scope, record, paymentMethod), params));
128
+ }
129
+ return jsonResponse(200, render(scope, record, params));
130
+ },
131
+ GetPaymentIntentsSearch: async (context) => {
132
+ const scope = requestScope(services, context);
133
+ const params = queryParams(context);
134
+ const records = scope.account.paymentIntents.list({ order: "newest" }).map((e) => e.value);
135
+ return jsonResponse(200, searchRecords(records, params, {
136
+ url: "/v1/payment_intents/search",
137
+ render: (record) => render(scope, record, params),
138
+ }));
139
+ },
140
+ GetPaymentIntentsIntent: async (context) => {
141
+ const scope = requestScope(services, context);
142
+ const params = queryParams(context);
143
+ return jsonResponse(200, render(scope, requireIntent(scope, context.params.intent ?? ""), params));
144
+ },
145
+ PostPaymentIntentsIntent: async (context) => {
146
+ const scope = requestScope(services, context);
147
+ const params = bodyParams(context);
148
+ const current = requireIntent(scope, context.params.intent ?? "");
149
+ const amount = amountOf(params, "amount");
150
+ const customer = stringOf(params, "customer");
151
+ if (customer !== null)
152
+ requireLiveCustomer(scope, customer);
153
+ const requestedMethod = stringOf(params, "payment_method");
154
+ const next = {
155
+ ...current,
156
+ amount: amount ?? current.amount,
157
+ customer: customer ?? current.customer,
158
+ description: stringOf(params, "description") ?? current.description,
159
+ metadata: mergeRecordMetadata(current.metadata, params.metadata),
160
+ payment_method: requestedMethod === null
161
+ ? current.payment_method
162
+ : resolvePaymentMethod(scope, requestedMethod).id,
163
+ receipt_email: stringOf(params, "receipt_email") ?? current.receipt_email,
164
+ setup_future_usage: stringOf(params, "setup_future_usage") ?? current.setup_future_usage,
165
+ };
166
+ scope.account.paymentIntents.update(next.id, next);
167
+ return jsonResponse(200, render(scope, next, params));
168
+ },
169
+ PostPaymentIntentsIntentConfirm: async (context) => {
170
+ const scope = requestScope(services, context);
171
+ const params = bodyParams(context);
172
+ const current = requireIntent(scope, context.params.intent ?? "");
173
+ if (current.status === "canceled")
174
+ throw invalidRequest("The PaymentIntent has a status of canceled, so it cannot be confirmed.", undefined, "payment_intent_unexpected_state");
175
+ if (current.status === "succeeded")
176
+ throw invalidRequest("This PaymentIntent is already succeeded and cannot be confirmed again.", undefined, "payment_intent_unexpected_state");
177
+ const requestedMethod = stringOf(params, "payment_method");
178
+ const method = requestedMethod === null
179
+ ? current.payment_method
180
+ : resolvePaymentMethod(scope, requestedMethod).id;
181
+ if (method === null)
182
+ throw invalidRequest("You cannot confirm this PaymentIntent because it has no payment method attached to it.", "payment_method");
183
+ return jsonResponse(200, render(scope, confirmOrDecline(scope, current, method), params));
184
+ },
185
+ PostPaymentIntentsIntentCancel: async (context) => {
186
+ const scope = requestScope(services, context);
187
+ const params = bodyParams(context);
188
+ const current = requireIntent(scope, context.params.intent ?? "");
189
+ if (current.status === "succeeded")
190
+ throw invalidRequest("The PaymentIntent has a status of succeeded, so it cannot be canceled.", undefined, "payment_intent_unexpected_state");
191
+ const next = {
192
+ ...current,
193
+ amount_capturable: 0,
194
+ canceled_at: seconds(scope.now),
195
+ cancellation_reason: stringOf(params, "cancellation_reason"),
196
+ status: "canceled",
197
+ };
198
+ scope.account.paymentIntents.update(next.id, next);
199
+ scope.emit("payment_intent.canceled", renderPaymentIntent(next));
200
+ return jsonResponse(200, render(scope, next, params));
201
+ },
202
+ PostPaymentIntentsIntentCapture: async (context) => {
203
+ const scope = requestScope(services, context);
204
+ const params = bodyParams(context);
205
+ const current = requireIntent(scope, context.params.intent ?? "");
206
+ if (current.status !== "requires_capture")
207
+ throw invalidRequest(`This PaymentIntent could not be captured because it has a status of ${current.status}. Only a PaymentIntent with a status of requires_capture may be captured.`, undefined, "payment_intent_unexpected_state");
208
+ const capturedAmount = amountOf(params, "amount_to_capture") ?? current.amount;
209
+ if (current.latest_charge !== null) {
210
+ const charge = scope.account.charges.get(current.latest_charge);
211
+ if (charge) {
212
+ scope.account.charges.update(charge.id, {
213
+ ...charge,
214
+ amount_captured: capturedAmount,
215
+ captured: true,
216
+ });
217
+ }
218
+ }
219
+ const next = {
220
+ ...current,
221
+ amount_capturable: 0,
222
+ amount_received: capturedAmount,
223
+ status: "succeeded",
224
+ };
225
+ scope.account.paymentIntents.update(next.id, next);
226
+ scope.emit("payment_intent.succeeded", renderPaymentIntent(next));
227
+ completeSessionsForIntent(scope, { paymentIntent: next.id });
228
+ return jsonResponse(200, render(scope, next, params));
229
+ },
230
+ };
231
+ };
232
+ //# sourceMappingURL=payment-intents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-intents.js","sourceRoot":"","sources":["../src/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAA;AAC/D,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EAEnB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,EAAE,UAAU,EAAe,WAAW,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAA4B,OAAO,EAAE,MAAM,YAAY,CAAA;AAE9D,MAAM,4BAA4B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAErD,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAmB,EAAE,CAAC,CAAC;IAC3D,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5C,OAAO,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAClD,CAAC;IACD,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACnD,OAAO,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACzD,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC9C,OAAO,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACpE,CAAC;IACD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7C,OAAO,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5E,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,GAAW,EAAsB,EAAE;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,GAAW,EAAiB,EAAE;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,GAAW,EAAW,EAAE,CACzD,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAA;AAEhD,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,GAAW,EAAY,EAAE;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACtB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAA;IAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACtE,OAAO,4BAA4B,CAAA;AACrC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAkB,EAAoC,EAAE;IAC5F,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAE,MAA2B,EAAE,MAAc,EAAE,EAAE,CAClF,WAAW,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAE3E;;;;OAIG;IACH,MAAM,gBAAgB,GAAG,CACvB,KAAmB,EACnB,MAA2B,EAC3B,aAA4B,EACP,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;YACpE,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAA;gBACtE,yBAAyB,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAA;YACnE,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAA;YACpE,KAAK,CAAC,IAAI,CAAC,+BAA+B,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAA;YACxE,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC,CAAA;IAED,OAAO;QACL,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;YACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YAC7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAsB,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE;gBACrF,GAAG,EAAE,qBAAqB;gBAC1B,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAChB,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;oBAC9C,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;gBACrD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;aAClD,CAAC,CAAA;YACF,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YACzC,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YAC7C,IAAI,QAAQ,KAAK,IAAI;gBAAE,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;YACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YAC7C,IAAI,QAAQ,KAAK,IAAI;gBAAE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC3D,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;YAC1D,MAAM,aAAa,GACjB,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,CAAA;YACnF,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,MAAM,MAAM,GAAwB;gBAClC,EAAE;gBACF,MAAM;gBACN,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;gBACxF,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC;gBAClC,mBAAmB,EAAE,WAAW;gBAChC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC3B,QAAQ;gBACR,QAAQ;gBACR,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;gBAC5C,OAAO,EAAE,IAAI;gBACb,kBAAkB,EAAE,IAAI;gBACxB,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAG,MAAM,CAAC,QAA+C,IAAI,EAAE;gBACvE,cAAc,EAAE,aAAa;gBAC7B,oBAAoB,EAAE,YAAY,CAAC,MAAM,EAAE,sBAAsB,CAAC;gBAClE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAClF,kBAAkB,EAAE,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;gBAC1D,MAAM,EAAE,yBAAyB;gBACjC,WAAW,EAAE,IAAI;gBACjB,mBAAmB,EAAE,IAAI;gBACzB,UAAU,EAAE,EAAE;aACf,CAAA;YACD,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YAC/C,IAAI,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;gBACjC,OAAO,YAAY,CACjB,GAAG,EACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CACtE,CAAA;YACH,CAAC;YACD,OAAO,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QACzD,CAAC;QACD,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAC1F,OAAO,YAAY,CACjB,GAAG,EACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE;gBAC7B,GAAG,EAAE,4BAA4B;gBACjC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;aAClD,CAAC,CACH,CAAA;QACH,CAAC;QACD,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;YACnC,OAAO,YAAY,CACjB,GAAG,EACH,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CACzE,CAAA;QACH,CAAC;QACD,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YAC7C,IAAI,QAAQ,KAAK,IAAI;gBAAE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC3D,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;YAC1D,MAAM,IAAI,GAAwB;gBAChC,GAAG,OAAO;gBACV,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM;gBAChC,QAAQ,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ;gBACtC,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,OAAO,CAAC,WAAW;gBACnE,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAChE,cAAc,EACZ,eAAe,KAAK,IAAI;oBACtB,CAAC,CAAC,OAAO,CAAC,cAAc;oBACxB,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE;gBACrD,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,OAAO,CAAC,aAAa;gBACzE,kBAAkB,EAAE,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,OAAO,CAAC,kBAAkB;aACzF,CAAA;YACD,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAClD,OAAO,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QACvD,CAAC;QACD,+BAA+B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YACjE,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU;gBAC/B,MAAM,cAAc,CAClB,wEAAwE,EACxE,SAAS,EACT,iCAAiC,CAClC,CAAA;YACH,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;gBAChC,MAAM,cAAc,CAClB,wEAAwE,EACxE,SAAS,EACT,iCAAiC,CAClC,CAAA;YACH,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;YAC1D,MAAM,MAAM,GACV,eAAe,KAAK,IAAI;gBACtB,CAAC,CAAC,OAAO,CAAC,cAAc;gBACxB,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,CAAA;YACrD,IAAI,MAAM,KAAK,IAAI;gBACjB,MAAM,cAAc,CAClB,wFAAwF,EACxF,gBAAgB,CACjB,CAAA;YACH,OAAO,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3F,CAAC;QACD,8BAA8B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YACjE,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;gBAChC,MAAM,cAAc,CAClB,wEAAwE,EACxE,SAAS,EACT,iCAAiC,CAClC,CAAA;YACH,MAAM,IAAI,GAAwB;gBAChC,GAAG,OAAO;gBACV,iBAAiB,EAAE,CAAC;gBACpB,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC/B,mBAAmB,EAAE,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;gBAC5D,MAAM,EAAE,UAAU;aACnB,CAAA;YACD,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAClD,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;YAChE,OAAO,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QACvD,CAAC;QACD,+BAA+B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAClC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YACjE,IAAI,OAAO,CAAC,MAAM,KAAK,kBAAkB;gBACvC,MAAM,cAAc,CAClB,uEAAuE,OAAO,CAAC,MAAM,2EAA2E,EAChK,SAAS,EACT,iCAAiC,CAClC,CAAA;YACH,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,OAAO,CAAC,MAAM,CAAA;YAC9E,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;gBAC/D,IAAI,MAAM,EAAE,CAAC;oBACX,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE;wBACtC,GAAG,MAAM;wBACT,eAAe,EAAE,cAAc;wBAC/B,QAAQ,EAAE,IAAI;qBACf,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAwB;gBAChC,GAAG,OAAO;gBACV,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,cAAc;gBAC/B,MAAM,EAAE,WAAW;aACpB,CAAA;YACD,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAClD,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;YACjE,yBAAyB,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YAC5D,OAAO,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QACvD,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type OperationHandler } from "@crvouga/mockingbird-service";
2
+ import { type Services } from "./internal.js";
3
+ export declare const paymentMethodHandlers: (services: Services) => Record<string, OperationHandler>;
4
+ //# sourceMappingURL=payment-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-methods.d.ts","sourceRoot":"","sources":["../src/payment-methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAGlF,OAAO,EAQL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAA;AA6BtB,eAAO,MAAM,qBAAqB,GAAI,UAAU,QAAQ,KAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA8ExF,CAAA"}
@@ -0,0 +1,99 @@
1
+ import { jsonResponse } from "@crvouga/mockingbird-service";
2
+ import { invalidRequest, parameterMissing } from "./errors.js";
3
+ import { applyExpand } from "./expand.js";
4
+ import { mergeRecordMetadata, paymentMethodFromToken, requestScope, requireLiveCustomer, requireParam, resolvePaymentMethod, } from "./internal.js";
5
+ import { paginate } from "./list.js";
6
+ import { bodyParams, queryParams } from "./params.js";
7
+ import { renderCustomer, renderPaymentMethod } from "./render.js";
8
+ const recordOf = (value) => typeof value === "object" && value !== null && !Array.isArray(value)
9
+ ? value
10
+ : undefined;
11
+ const stringOf = (params, key) => {
12
+ const value = params[key];
13
+ return typeof value === "string" && value !== "" ? value : null;
14
+ };
15
+ const expanders = (scope) => {
16
+ const customer = (id) => {
17
+ const entry = scope.account.customers.get(id);
18
+ return entry?.kind === "live" ? renderCustomer(entry.customer) : undefined;
19
+ };
20
+ return { customer, "data.customer": customer };
21
+ };
22
+ const render = (scope, method, expand) => applyExpand(renderPaymentMethod(method), expand, expanders(scope));
23
+ export const paymentMethodHandlers = (services) => ({
24
+ GetPaymentMethods: async (context) => {
25
+ const scope = requestScope(services, context);
26
+ const params = queryParams(context);
27
+ const customer = stringOf(params, "customer");
28
+ const type = stringOf(params, "type");
29
+ const page = await paginate(scope.account.paymentMethods, params, {
30
+ url: "/v1/payment_methods",
31
+ kind: "payment_method",
32
+ where: (record) => (customer === null || record.customer === customer) &&
33
+ (type === null || record.type === type),
34
+ render: renderPaymentMethod,
35
+ });
36
+ return jsonResponse(200, applyExpand(page, params.expand, expanders(scope)));
37
+ },
38
+ PostPaymentMethods: async (context) => {
39
+ const scope = requestScope(services, context);
40
+ const params = bodyParams(context);
41
+ if (params.type !== "card")
42
+ throw parameterMissing("type");
43
+ const card = recordOf(params.card);
44
+ const token = card === undefined || typeof card.token !== "string" || card.token === "" ? null : card.token;
45
+ if (token === null)
46
+ throw parameterMissing("card[token]");
47
+ const { record } = paymentMethodFromToken(scope, token);
48
+ const method = {
49
+ ...record,
50
+ billing_details: recordOf(params.billing_details) ?? {},
51
+ metadata: mergeRecordMetadata({}, params.metadata),
52
+ };
53
+ scope.account.paymentMethods.update(method.id, method);
54
+ return jsonResponse(200, render(scope, method, params.expand));
55
+ },
56
+ GetPaymentMethodsPaymentMethod: async (context) => {
57
+ const scope = requestScope(services, context);
58
+ const params = queryParams(context);
59
+ const method = resolvePaymentMethod(scope, context.params.payment_method ?? "");
60
+ return jsonResponse(200, render(scope, method, params.expand));
61
+ },
62
+ PostPaymentMethodsPaymentMethod: async (context) => {
63
+ const scope = requestScope(services, context);
64
+ const params = bodyParams(context);
65
+ const current = resolvePaymentMethod(scope, context.params.payment_method ?? "");
66
+ const method = {
67
+ ...current,
68
+ billing_details: recordOf(params.billing_details) ?? current.billing_details,
69
+ metadata: mergeRecordMetadata(current.metadata, params.metadata),
70
+ };
71
+ scope.account.paymentMethods.update(method.id, method);
72
+ return jsonResponse(200, render(scope, method, params.expand));
73
+ },
74
+ PostPaymentMethodsPaymentMethodAttach: async (context) => {
75
+ const scope = requestScope(services, context);
76
+ const params = bodyParams(context);
77
+ const current = resolvePaymentMethod(scope, context.params.payment_method ?? "");
78
+ const customer = requireParam(params, "customer");
79
+ requireLiveCustomer(scope, customer);
80
+ if (current.customer !== null && current.customer !== customer)
81
+ throw invalidRequest(`The payment method ${current.id} is already attached to a customer.`, "payment_method");
82
+ const method = {
83
+ ...current,
84
+ customer,
85
+ billing_details: recordOf(params.billing_details) ?? current.billing_details,
86
+ };
87
+ scope.account.paymentMethods.update(method.id, method);
88
+ return jsonResponse(200, render(scope, method, params.expand));
89
+ },
90
+ PostPaymentMethodsPaymentMethodDetach: async (context) => {
91
+ const scope = requestScope(services, context);
92
+ const params = bodyParams(context);
93
+ const current = resolvePaymentMethod(scope, context.params.payment_method ?? "");
94
+ const method = { ...current, customer: null };
95
+ scope.account.paymentMethods.update(method.id, method);
96
+ return jsonResponse(200, render(scope, method, params.expand));
97
+ },
98
+ });
99
+ //# sourceMappingURL=payment-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-methods.js","sourceRoot":"","sources":["../src/payment-methods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type OperationHandler } from "@crvouga/mockingbird-service";
2
+ import { type Services } from "./internal.js";
3
+ export declare const priceHandlers: (services: Services) => Record<string, OperationHandler>;
4
+ //# sourceMappingURL=prices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prices.d.ts","sourceRoot":"","sources":["../src/prices.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAA;AAIrC,OAAO,EAAmC,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAwF9E,eAAO,MAAM,aAAa,GAAI,UAAU,QAAQ,KAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAyHjF,CAAA"}