@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
package/dist/search.js ADDED
@@ -0,0 +1,64 @@
1
+ import { invalidRequest } from "./errors.js";
2
+ import { clampLimit } from "./list.js";
3
+ const METADATA = /^metadata(?:\[['"]([^'"]+)['"]\])?$/;
4
+ const TOKEN = /(-)?(metadata\[['"][^'"]+['"]\]|[A-Za-z_][A-Za-z0-9_.]*)[:]\s*(?:'([^']*)'|"([^"]*)"|(\S+))/g;
5
+ /**
6
+ * Stripe's documented search subset: `field:'value'`, `metadata['key']:'value'`, `-` negates, and
7
+ * terms are combined with implicit AND. Anything the parser cannot consume is a 400, matching how
8
+ * Stripe refuses a malformed query instead of silently ignoring it.
9
+ */
10
+ export const parseSearchQuery = (query) => {
11
+ const text = query.trim();
12
+ const filters = [];
13
+ for (const match of text.matchAll(TOKEN)) {
14
+ const [whole, negated, field, single, double, bare] = match;
15
+ if (field === undefined)
16
+ continue;
17
+ const metadata = METADATA.exec(field);
18
+ filters.push({
19
+ field: metadata === null ? field : "metadata",
20
+ metadataKey: metadata?.[1] ?? null,
21
+ value: single ?? double ?? bare ?? "",
22
+ negated: negated === "-",
23
+ });
24
+ void whole;
25
+ }
26
+ if (filters.length === 0 ||
27
+ text
28
+ .replace(TOKEN, "")
29
+ .replace(/\b(?:AND|and|OR|or)\b/g, "")
30
+ .trim() !== "")
31
+ throw invalidRequest("Invalid search query: unable to parse the query.", "query");
32
+ return filters;
33
+ };
34
+ /**
35
+ * Search page newest-first. `limit` clamps into 1..100 (default 10) exactly like a list; cursor
36
+ * pagination is not exercised by the e2e path, so `next_page` is always null.
37
+ */
38
+ export const searchRecords = (records, params, options) => {
39
+ const { query } = params;
40
+ if (typeof query !== "string" || query.trim() === "")
41
+ throw invalidRequest("Missing required param: query.", "query", "parameter_missing");
42
+ const filters = parseSearchQuery(query);
43
+ const matched = records.filter((record) => filters.every((filter) => {
44
+ const actual = filter.field === "metadata"
45
+ ? filter.metadataKey === null ||
46
+ record.metadata === null ||
47
+ typeof record.metadata !== "object"
48
+ ? undefined
49
+ : record.metadata[filter.metadataKey]
50
+ : record[filter.field];
51
+ const hit = String(actual ?? "") === filter.value;
52
+ return filter.negated ? !hit : hit;
53
+ }));
54
+ const limit = clampLimit(params.limit !== undefined ? Number(params.limit) : 10);
55
+ return {
56
+ object: "search_result",
57
+ data: matched.slice(0, limit).map(options.render),
58
+ has_more: matched.length > limit,
59
+ next_page: null,
60
+ total_count: matched.length,
61
+ url: options.url,
62
+ };
63
+ };
64
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.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 setupIntentHandlers: (services: Services) => Record<string, OperationHandler>;
4
+ //# sourceMappingURL=setup-intents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-intents.d.ts","sourceRoot":"","sources":["../src/setup-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAGlF,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAA;AAsBtB,eAAO,MAAM,mBAAmB,GAAI,UAAU,QAAQ,KAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAyHvF,CAAA"}
@@ -0,0 +1,129 @@
1
+ import { jsonResponse } from "@crvouga/mockingbird-service";
2
+ import { invalidRequest } from "./errors.js";
3
+ import { applyExpand } from "./expand.js";
4
+ import { clientSecretFor, completeSessionsForIntent, mergeRecordMetadata, requestScope, resolvePaymentMethod, } from "./internal.js";
5
+ import { matchesCreated, paginate } from "./list.js";
6
+ import { bodyParams, queryParams } from "./params.js";
7
+ import { renderCustomer, renderPaymentMethod, renderSetupIntent } from "./render.js";
8
+ import { seconds } from "./state.js";
9
+ const expanders = (scope) => ({
10
+ payment_method: (id) => {
11
+ const method = scope.account.paymentMethods.get(id);
12
+ return method ? renderPaymentMethod(method) : undefined;
13
+ },
14
+ customer: (id) => {
15
+ const entry = scope.account.customers.get(id);
16
+ return entry?.kind === "live" ? renderCustomer(entry.customer) : undefined;
17
+ },
18
+ });
19
+ const stringOf = (params, key) => {
20
+ const value = params[key];
21
+ return typeof value === "string" && value !== "" ? value : null;
22
+ };
23
+ export const setupIntentHandlers = (services) => {
24
+ const render = (scope, record, params) => applyExpand(renderSetupIntent(record), params.expand, expanders(scope));
25
+ const requireSetupIntent = (scope, id) => {
26
+ const intent = scope.account.setupIntents.get(id);
27
+ if (!intent)
28
+ throw invalidRequest(`No such setup_intent: '${id}'`, "intent", "resource_missing");
29
+ return intent;
30
+ };
31
+ return {
32
+ GetSetupIntents: async (context) => {
33
+ const scope = requestScope(services, context);
34
+ const params = queryParams(context);
35
+ const customer = stringOf(params, "customer");
36
+ return jsonResponse(200, await paginate(scope.account.setupIntents, params, {
37
+ url: "/v1/setup_intents",
38
+ kind: "setup_intent",
39
+ where: (record) => matchesCreated(record.created, params.created) &&
40
+ (customer === null || record.customer === customer),
41
+ render: (record) => render(scope, record, params),
42
+ }));
43
+ },
44
+ PostSetupIntents: async (context) => {
45
+ const scope = requestScope(services, context);
46
+ const params = bodyParams(context);
47
+ const customer = stringOf(params, "customer");
48
+ if (customer !== null) {
49
+ const entry = scope.account.customers.get(customer);
50
+ if (!entry || entry.kind === "deleted")
51
+ throw invalidRequest(`No such customer: '${customer}'`, "customer", "resource_missing");
52
+ }
53
+ const requestedMethod = stringOf(params, "payment_method");
54
+ const id = scope.ids.next("seti_");
55
+ const record = {
56
+ id,
57
+ client_secret: clientSecretFor(id),
58
+ created: seconds(scope.now),
59
+ customer,
60
+ description: stringOf(params, "description"),
61
+ metadata: params.metadata ?? {},
62
+ payment_method: requestedMethod === null ? null : resolvePaymentMethod(scope, requestedMethod).id,
63
+ payment_method_types: ["card"],
64
+ status: "requires_payment_method",
65
+ usage: stringOf(params, "usage") ?? "off_session",
66
+ last_setup_error: null,
67
+ cancellation_reason: null,
68
+ canceled_at: null,
69
+ };
70
+ scope.account.setupIntents.insert(id, record);
71
+ return jsonResponse(200, render(scope, record, params));
72
+ },
73
+ GetSetupIntentsIntent: async (context) => {
74
+ const scope = requestScope(services, context);
75
+ const params = queryParams(context);
76
+ return jsonResponse(200, render(scope, requireSetupIntent(scope, context.params.intent ?? ""), params));
77
+ },
78
+ PostSetupIntentsIntent: async (context) => {
79
+ const scope = requestScope(services, context);
80
+ const params = bodyParams(context);
81
+ const current = requireSetupIntent(scope, context.params.intent ?? "");
82
+ const requestedMethod = stringOf(params, "payment_method");
83
+ const next = {
84
+ ...current,
85
+ customer: stringOf(params, "customer") ?? current.customer,
86
+ description: stringOf(params, "description") ?? current.description,
87
+ metadata: mergeRecordMetadata(current.metadata, params.metadata),
88
+ payment_method: requestedMethod === null
89
+ ? current.payment_method
90
+ : resolvePaymentMethod(scope, requestedMethod).id,
91
+ };
92
+ scope.account.setupIntents.update(next.id, next);
93
+ return jsonResponse(200, render(scope, next, params));
94
+ },
95
+ PostSetupIntentsIntentConfirm: async (context) => {
96
+ const scope = requestScope(services, context);
97
+ const params = bodyParams(context);
98
+ const current = requireSetupIntent(scope, context.params.intent ?? "");
99
+ if (current.status === "canceled")
100
+ throw invalidRequest("The SetupIntent has a status of canceled, so it cannot be confirmed.", undefined, "setup_intent_unexpected_state");
101
+ const requestedMethod = stringOf(params, "payment_method");
102
+ const next = {
103
+ ...current,
104
+ payment_method: requestedMethod === null
105
+ ? current.payment_method
106
+ : resolvePaymentMethod(scope, requestedMethod).id,
107
+ status: "succeeded",
108
+ };
109
+ scope.account.setupIntents.update(next.id, next);
110
+ scope.emit("setup_intent.succeeded", renderSetupIntent(next));
111
+ completeSessionsForIntent(scope, { setupIntent: next.id });
112
+ return jsonResponse(200, render(scope, next, params));
113
+ },
114
+ PostSetupIntentsIntentCancel: async (context) => {
115
+ const scope = requestScope(services, context);
116
+ const params = bodyParams(context);
117
+ const current = requireSetupIntent(scope, context.params.intent ?? "");
118
+ const next = {
119
+ ...current,
120
+ canceled_at: seconds(scope.now),
121
+ cancellation_reason: stringOf(params, "cancellation_reason"),
122
+ status: "canceled",
123
+ };
124
+ scope.account.setupIntents.update(next.id, next);
125
+ return jsonResponse(200, render(scope, next, params));
126
+ },
127
+ };
128
+ };
129
+ //# sourceMappingURL=setup-intents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-intents.js","sourceRoot":"","sources":["../src/setup-intents.ts"],"names":[],"mappings":"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"}