@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.
- package/README.md +254 -0
- package/dist/account.d.ts +8 -0
- package/dist/account.d.ts.map +1 -0
- package/dist/account.js +13 -0
- package/dist/account.js.map +1 -0
- package/dist/charges.d.ts +4 -0
- package/dist/charges.d.ts.map +1 -0
- package/dist/charges.js +89 -0
- package/dist/charges.js.map +1 -0
- package/dist/checkout-sessions.d.ts +5 -0
- package/dist/checkout-sessions.d.ts.map +1 -0
- package/dist/checkout-sessions.js +303 -0
- package/dist/checkout-sessions.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/coupons.d.ts +4 -0
- package/dist/coupons.d.ts.map +1 -0
- package/dist/coupons.js +158 -0
- package/dist/coupons.js.map +1 -0
- package/dist/customers.d.ts +4 -0
- package/dist/customers.d.ts.map +1 -0
- package/dist/customers.js +218 -0
- package/dist/customers.js.map +1 -0
- package/dist/disputes.d.ts +4 -0
- package/dist/disputes.d.ts.map +1 -0
- package/dist/disputes.js +36 -0
- package/dist/disputes.js.map +1 -0
- package/dist/errors.d.ts +29 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +74 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +4 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +76 -0
- package/dist/events.js.map +1 -0
- package/dist/expand.d.ts +11 -0
- package/dist/expand.d.ts.map +1 -0
- package/dist/expand.js +45 -0
- package/dist/expand.js.map +1 -0
- package/dist/fields.d.ts +25 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +117 -0
- package/dist/fields.js.map +1 -0
- package/dist/generated/openapi.d.ts +7 -0
- package/dist/generated/openapi.d.ts.map +1 -0
- package/dist/generated/openapi.js +5 -0
- package/dist/generated/openapi.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +172 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +134 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +460 -0
- package/dist/internal.js.map +1 -0
- package/dist/invoice-items.d.ts +4 -0
- package/dist/invoice-items.d.ts.map +1 -0
- package/dist/invoice-items.js +179 -0
- package/dist/invoice-items.js.map +1 -0
- package/dist/invoices.d.ts +4 -0
- package/dist/invoices.d.ts.map +1 -0
- package/dist/invoices.js +312 -0
- package/dist/invoices.js.map +1 -0
- package/dist/list.d.ts +24 -0
- package/dist/list.d.ts.map +1 -0
- package/dist/list.js +68 -0
- package/dist/list.js.map +1 -0
- package/dist/params.d.ts +29 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +165 -0
- package/dist/params.js.map +1 -0
- package/dist/payment-intents.d.ts +4 -0
- package/dist/payment-intents.d.ts.map +1 -0
- package/dist/payment-intents.js +232 -0
- package/dist/payment-intents.js.map +1 -0
- package/dist/payment-methods.d.ts +4 -0
- package/dist/payment-methods.d.ts.map +1 -0
- package/dist/payment-methods.js +99 -0
- package/dist/payment-methods.js.map +1 -0
- package/dist/prices.d.ts +4 -0
- package/dist/prices.d.ts.map +1 -0
- package/dist/prices.js +176 -0
- package/dist/prices.js.map +1 -0
- package/dist/products.d.ts +6 -0
- package/dist/products.d.ts.map +1 -0
- package/dist/products.js +202 -0
- package/dist/products.js.map +1 -0
- package/dist/promotion-codes.d.ts +4 -0
- package/dist/promotion-codes.d.ts.map +1 -0
- package/dist/promotion-codes.js +193 -0
- package/dist/promotion-codes.js.map +1 -0
- package/dist/qa-corpus.d.ts +26 -0
- package/dist/qa-corpus.d.ts.map +1 -0
- package/dist/qa-corpus.js +42 -0
- package/dist/qa-corpus.js.map +1 -0
- package/dist/refunds.d.ts +4 -0
- package/dist/refunds.d.ts.map +1 -0
- package/dist/refunds.js +125 -0
- package/dist/refunds.js.map +1 -0
- package/dist/render.d.ts +60 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +426 -0
- package/dist/render.js.map +1 -0
- package/dist/reshape-qa.d.ts +8 -0
- package/dist/reshape-qa.d.ts.map +1 -0
- package/dist/reshape-qa.js +102 -0
- package/dist/reshape-qa.js.map +1 -0
- package/dist/search.d.ts +32 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +64 -0
- package/dist/search.js.map +1 -0
- package/dist/setup-intents.d.ts +4 -0
- package/dist/setup-intents.d.ts.map +1 -0
- package/dist/setup-intents.js +129 -0
- package/dist/setup-intents.js.map +1 -0
- package/dist/state.d.ts +485 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +143 -0
- package/dist/state.js.map +1 -0
- package/dist/subscription-schedules.d.ts +4 -0
- package/dist/subscription-schedules.d.ts.map +1 -0
- package/dist/subscription-schedules.js +122 -0
- package/dist/subscription-schedules.js.map +1 -0
- package/dist/subscriptions.d.ts +23 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +260 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/test-tokens.d.ts +27 -0
- package/dist/test-tokens.d.ts.map +1 -0
- package/dist/test-tokens.js +61 -0
- package/dist/test-tokens.js.map +1 -0
- package/dist/url.d.ts +6 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +38 -0
- package/dist/url.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/generated/openapi.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { FetchAPI } from "@crvouga/mockingbird-core";
|
|
2
|
+
import { type APIOptions } from "@crvouga/mockingbird-service";
|
|
3
|
+
import type { SqliteClient } from "@crvouga/mockingbird-sqlite";
|
|
4
|
+
import type { Hono } from "hono";
|
|
5
|
+
import type { StripeWebhookEvent, WebhookPublisher } from "./internal.js";
|
|
6
|
+
export { accountOf, accountOfKey } from "./account.js";
|
|
7
|
+
export { STRIPE_NAMESPACE } from "./constants.js";
|
|
8
|
+
export type { OperationId, SupportedOperationId } from "./generated/openapi.js";
|
|
9
|
+
export { document, operationIds, supportedOperationIds } from "./generated/openapi.js";
|
|
10
|
+
export type { StripeWebhookEvent, WebhookPublisher } from "./internal.js";
|
|
11
|
+
export { QA_AMOUNTS, QA_COUPON_CODES, QA_CUSTOMER, QA_METADATA, QA_SEARCH_QUERIES, QA_SURFACE_OPS, QA_TEST_CARD_TOKENS, QA_TEST_PAYMENT_METHODS, } from "./qa-corpus.js";
|
|
12
|
+
export { reshapeQaCommand } from "./reshape-qa.js";
|
|
13
|
+
export type StripeAPIOptions = APIOptions & {
|
|
14
|
+
/** Called with every event the mock records, so a server can deliver it. */
|
|
15
|
+
onWebhook?: WebhookPublisher;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Stateful mock of the Stripe API. State lives in SQLite, partitioned per test API key so two keys
|
|
19
|
+
* behave like two accounts. Pass `sqlite` to share a client across services; omit it to get a
|
|
20
|
+
* fresh `@crvouga/mockingbird-service-sqlite` database.
|
|
21
|
+
*/
|
|
22
|
+
export declare class StripeAPI implements FetchAPI {
|
|
23
|
+
readonly app: Hono;
|
|
24
|
+
readonly sqlite: SqliteClient;
|
|
25
|
+
private readonly service;
|
|
26
|
+
private readonly state;
|
|
27
|
+
private readonly idempotency;
|
|
28
|
+
constructor(options?: StripeAPIOptions);
|
|
29
|
+
fetch(request: Request): Promise<Response>;
|
|
30
|
+
/**
|
|
31
|
+
* Adopt another instance's state, so a lockstep walk can start from the state a warmup phase
|
|
32
|
+
* produced elsewhere (see `seedParity`'s `seedMock`).
|
|
33
|
+
*/
|
|
34
|
+
importStateFrom(source: StripeAPI): void;
|
|
35
|
+
/**
|
|
36
|
+
* Events this instance recorded, oldest first. `account` narrows to one API key's partition
|
|
37
|
+
* (`accountOfKey("sk_test_…")`); omit it for every partition the instance has seen.
|
|
38
|
+
*/
|
|
39
|
+
webhookEvents(account?: string): StripeWebhookEvent[];
|
|
40
|
+
webhookDeliveryAttempts(account?: string): import("./state.js").WebhookDeliveryAttemptRecord[];
|
|
41
|
+
reset(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EACL,KAAK,UAAU,EAOhB,MAAM,8BAA8B,CAAA;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAUhC,OAAO,KAAK,EAAY,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAenF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACtF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACzE,OAAO,EACL,UAAU,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAOlD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG;IAC1C,4EAA4E;IAC5E,SAAS,CAAC,EAAE,gBAAgB,CAAA;CAC7B,CAAA;AAwBD;;;;GAIG;AACH,qBAAa,SAAU,YAAW,QAAQ;IACxC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;IAClB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;gBAEpD,OAAO,GAAE,gBAAqB;IAmDpC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuDhD;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIxC;;;OAGG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAUrD,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM;IAQlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { bootSqlite, createService, defineOperations, jsonResponse, } from "@crvouga/mockingbird-service";
|
|
2
|
+
import { chargeHandlers } from "./charges.js";
|
|
3
|
+
import { checkoutSessionHandlers } from "./checkout-sessions.js";
|
|
4
|
+
import { STRIPE_NAMESPACE } from "./constants.js";
|
|
5
|
+
import { couponHandlers } from "./coupons.js";
|
|
6
|
+
import { customerHandlers } from "./customers.js";
|
|
7
|
+
import { disputeHandlers } from "./disputes.js";
|
|
8
|
+
import { StripeError, stripeErrorBody } from "./errors.js";
|
|
9
|
+
import { eventHandlers } from "./events.js";
|
|
10
|
+
import { document } from "./generated/openapi.js";
|
|
11
|
+
import { invoiceItemHandlers } from "./invoice-items.js";
|
|
12
|
+
import { invoiceHandlers } from "./invoices.js";
|
|
13
|
+
import { paymentIntentHandlers } from "./payment-intents.js";
|
|
14
|
+
import { paymentMethodHandlers } from "./payment-methods.js";
|
|
15
|
+
import { priceHandlers } from "./prices.js";
|
|
16
|
+
import { productHandlers } from "./products.js";
|
|
17
|
+
import { promotionCodeHandlers } from "./promotion-codes.js";
|
|
18
|
+
import { refundHandlers } from "./refunds.js";
|
|
19
|
+
import { setupIntentHandlers } from "./setup-intents.js";
|
|
20
|
+
import { StripeState } from "./state.js";
|
|
21
|
+
import { subscriptionScheduleHandlers } from "./subscription-schedules.js";
|
|
22
|
+
import { subscriptionHandlers } from "./subscriptions.js";
|
|
23
|
+
import { STRIPE_API_VERSION } from "./version.js";
|
|
24
|
+
export { accountOf, accountOfKey } from "./account.js";
|
|
25
|
+
export { STRIPE_NAMESPACE } from "./constants.js";
|
|
26
|
+
export { document, operationIds, supportedOperationIds } from "./generated/openapi.js";
|
|
27
|
+
export { QA_AMOUNTS, QA_COUPON_CODES, QA_CUSTOMER, QA_METADATA, QA_SEARCH_QUERIES, QA_SURFACE_OPS, QA_TEST_CARD_TOKENS, QA_TEST_PAYMENT_METHODS, } from "./qa-corpus.js";
|
|
28
|
+
export { reshapeQaCommand } from "./reshape-qa.js";
|
|
29
|
+
const MISSING_API_KEY = "You did not provide an API key. You need to provide your API key in the Authorization header, using Bearer auth (e.g. 'Authorization: Bearer YOUR_SECRET_KEY'). See https://stripe.com/docs/api#authentication for details, or we can help at https://support.stripe.com/.";
|
|
30
|
+
const INVALID_API_KEY = "Invalid API Key provided: This key is not valid.";
|
|
31
|
+
const INVALID_IDEMPOTENCY_KEY = "Idempotency Key must be a non-empty string.";
|
|
32
|
+
const responseWithHeaders = (response, requestId) => {
|
|
33
|
+
const headers = new Headers(response.headers);
|
|
34
|
+
headers.set("request-id", requestId);
|
|
35
|
+
headers.set("stripe-version", STRIPE_API_VERSION);
|
|
36
|
+
return new Response(response.body, { status: response.status, headers });
|
|
37
|
+
};
|
|
38
|
+
const unrecognizedUrl = (request) => {
|
|
39
|
+
const url = new URL(request.url);
|
|
40
|
+
return `Unrecognized request URL (${request.method}: ${url.pathname}). If you are trying to list objects, remove the trailing slash. If you are trying to retrieve an object, make sure you passed a valid (non-empty) identifier in your code. Please see https://stripe.com/docs or we can help at https://support.stripe.com/.`;
|
|
41
|
+
};
|
|
42
|
+
const isTestKey = (key) => key !== undefined && /^(?:sk|rk)_test_[A-Za-z0-9]+$/.test(key);
|
|
43
|
+
/**
|
|
44
|
+
* Stateful mock of the Stripe API. State lives in SQLite, partitioned per test API key so two keys
|
|
45
|
+
* behave like two accounts. Pass `sqlite` to share a client across services; omit it to get a
|
|
46
|
+
* fresh `@crvouga/mockingbird-service-sqlite` database.
|
|
47
|
+
*/
|
|
48
|
+
export class StripeAPI {
|
|
49
|
+
app;
|
|
50
|
+
sqlite;
|
|
51
|
+
service;
|
|
52
|
+
state;
|
|
53
|
+
idempotency = new Map();
|
|
54
|
+
constructor(options = {}) {
|
|
55
|
+
const sqlite = bootSqlite(options.sqlite);
|
|
56
|
+
const state = new StripeState(sqlite, STRIPE_NAMESPACE);
|
|
57
|
+
this.state = state;
|
|
58
|
+
const services = { state, publish: options.onWebhook };
|
|
59
|
+
const handlers = {
|
|
60
|
+
...customerHandlers(services),
|
|
61
|
+
...paymentMethodHandlers(services),
|
|
62
|
+
...paymentIntentHandlers(services),
|
|
63
|
+
...setupIntentHandlers(services),
|
|
64
|
+
...chargeHandlers(services),
|
|
65
|
+
...refundHandlers(services),
|
|
66
|
+
...disputeHandlers(services),
|
|
67
|
+
...checkoutSessionHandlers(services),
|
|
68
|
+
...invoiceHandlers(services),
|
|
69
|
+
...invoiceItemHandlers(services),
|
|
70
|
+
...subscriptionHandlers(services),
|
|
71
|
+
...subscriptionScheduleHandlers(services),
|
|
72
|
+
...couponHandlers(services),
|
|
73
|
+
...promotionCodeHandlers(services),
|
|
74
|
+
...productHandlers(services),
|
|
75
|
+
...priceHandlers(services),
|
|
76
|
+
...eventHandlers(services),
|
|
77
|
+
};
|
|
78
|
+
const errorResponse = async (init) => jsonResponse(init.status, stripeErrorBody(init, await state.requestLogUrl()));
|
|
79
|
+
this.service = createService({
|
|
80
|
+
document,
|
|
81
|
+
handlers: defineOperations(handlers),
|
|
82
|
+
sqlite,
|
|
83
|
+
namespace: STRIPE_NAMESPACE,
|
|
84
|
+
now: options.now,
|
|
85
|
+
notFound: (request) => errorResponse({ status: 404, message: unrecognizedUrl(request) }),
|
|
86
|
+
onError: (error) => {
|
|
87
|
+
if (error instanceof StripeError)
|
|
88
|
+
return errorResponse(error.init);
|
|
89
|
+
throw error;
|
|
90
|
+
},
|
|
91
|
+
before: (context) => {
|
|
92
|
+
const authorization = context.request.headers.get("authorization");
|
|
93
|
+
if (!authorization)
|
|
94
|
+
return errorResponse({ status: 401, message: MISSING_API_KEY });
|
|
95
|
+
const match = /^Bearer\s+(\S+)$/.exec(authorization);
|
|
96
|
+
const key = match?.[1];
|
|
97
|
+
if (!isTestKey(key))
|
|
98
|
+
return errorResponse({ status: 401, message: INVALID_API_KEY, code: "invalid_api_key" });
|
|
99
|
+
return undefined;
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
this.app = this.service.app;
|
|
103
|
+
this.sqlite = this.service.sqlite;
|
|
104
|
+
}
|
|
105
|
+
async fetch(request) {
|
|
106
|
+
const idempotencyKey = request.method === "POST" ? request.headers.get("idempotency-key") : null;
|
|
107
|
+
if (idempotencyKey !== null && (idempotencyKey.length === 0 || idempotencyKey.length > 255)) {
|
|
108
|
+
const response = await jsonResponse(400, stripeErrorBody({ status: 400, message: INVALID_IDEMPOTENCY_KEY }, await this.state.requestLogUrl()));
|
|
109
|
+
return responseWithHeaders(response, await this.state.ids.next("req_"));
|
|
110
|
+
}
|
|
111
|
+
const body = request.method === "POST" ? await request.clone().arrayBuffer() : new ArrayBuffer(0);
|
|
112
|
+
const url = new URL(request.url);
|
|
113
|
+
const fingerprint = `${request.method} ${url.pathname}?${url.search} ${new TextDecoder().decode(body)}`;
|
|
114
|
+
const cacheKey = idempotencyKey === null ? null : `${request.headers.get("authorization")}\n${idempotencyKey}`;
|
|
115
|
+
if (cacheKey !== null) {
|
|
116
|
+
const cached = this.idempotency.get(cacheKey);
|
|
117
|
+
if (cached) {
|
|
118
|
+
if (cached.fingerprint !== fingerprint) {
|
|
119
|
+
const response = await jsonResponse(400, stripeErrorBody({
|
|
120
|
+
status: 400,
|
|
121
|
+
message: "Keys for idempotent requests must have the same parameters as the original request.",
|
|
122
|
+
}, await this.state.requestLogUrl()));
|
|
123
|
+
return responseWithHeaders(response, await this.state.ids.next("req_"));
|
|
124
|
+
}
|
|
125
|
+
return new Response(cached.body.slice(0), {
|
|
126
|
+
status: cached.status,
|
|
127
|
+
headers: cached.headers,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const response = await this.service.fetch(request);
|
|
132
|
+
const requestId = await this.state.ids.next("req_");
|
|
133
|
+
const decorated = responseWithHeaders(response, requestId);
|
|
134
|
+
if (cacheKey !== null && decorated.status < 500) {
|
|
135
|
+
this.idempotency.set(cacheKey, {
|
|
136
|
+
fingerprint,
|
|
137
|
+
status: decorated.status,
|
|
138
|
+
headers: [...decorated.headers.entries()],
|
|
139
|
+
body: await decorated.clone().arrayBuffer(),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return decorated;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Adopt another instance's state, so a lockstep walk can start from the state a warmup phase
|
|
146
|
+
* produced elsewhere (see `seedParity`'s `seedMock`).
|
|
147
|
+
*/
|
|
148
|
+
importStateFrom(source) {
|
|
149
|
+
this.state.importFrom(source.state);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Events this instance recorded, oldest first. `account` narrows to one API key's partition
|
|
153
|
+
* (`accountOfKey("sk_test_…")`); omit it for every partition the instance has seen.
|
|
154
|
+
*/
|
|
155
|
+
webhookEvents(account) {
|
|
156
|
+
return this.state.accounts(account).flatMap((scope) => scope.events.list({ order: "oldest" }).map((entry) => ({
|
|
157
|
+
type: entry.value.type,
|
|
158
|
+
account: entry.value.account,
|
|
159
|
+
body: entry.value.body,
|
|
160
|
+
})));
|
|
161
|
+
}
|
|
162
|
+
webhookDeliveryAttempts(account) {
|
|
163
|
+
return this.state
|
|
164
|
+
.accounts(account)
|
|
165
|
+
.flatMap((scope) => scope.webhookDeliveryAttempts.list({ order: "oldest" }).map((entry) => entry.value));
|
|
166
|
+
}
|
|
167
|
+
async reset() {
|
|
168
|
+
this.idempotency.clear();
|
|
169
|
+
await this.service.reset();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { type OperationContext } from "@crvouga/mockingbird-service";
|
|
2
|
+
import { type AccountState, type ChargeRecord, type CustomerRecord, type DiscountRecord, type InvoiceLineRecord, type InvoiceRecord, type Metadata, type PaymentIntentRecord, type PaymentMethodRecord, type PriceRecord, type StripeState } from "./state.js";
|
|
3
|
+
import { type CardDetails } from "./test-tokens.js";
|
|
4
|
+
type RecordValue = Record<string, unknown>;
|
|
5
|
+
/** What the server publishes when the mock records an event. */
|
|
6
|
+
export type StripeWebhookEvent = {
|
|
7
|
+
type: string;
|
|
8
|
+
account: string;
|
|
9
|
+
body: string;
|
|
10
|
+
};
|
|
11
|
+
export type WebhookPublisher = (event: StripeWebhookEvent) => void;
|
|
12
|
+
/** Everything a handler needs, resolved once per request from the bearer key. */
|
|
13
|
+
export type RequestScope = {
|
|
14
|
+
account: AccountState;
|
|
15
|
+
ids: StripeState["ids"];
|
|
16
|
+
now: () => number;
|
|
17
|
+
emit: (type: string, object: RecordValue, previous?: RecordValue) => string;
|
|
18
|
+
};
|
|
19
|
+
export type Services = {
|
|
20
|
+
state: StripeState;
|
|
21
|
+
publish: WebhookPublisher | undefined;
|
|
22
|
+
};
|
|
23
|
+
export declare const requestScope: (services: Services, context: OperationContext) => RequestScope;
|
|
24
|
+
/** Every field that changed, in the shape Stripe sends as `data.previous_attributes`. */
|
|
25
|
+
export declare const changedFields: (previous: RecordValue, next: RecordValue) => RecordValue | undefined;
|
|
26
|
+
export declare const requireLiveCustomer: (scope: RequestScope, id: string, param?: string) => CustomerRecord;
|
|
27
|
+
export declare const findCustomer: (scope: RequestScope, id: string) => CustomerRecord | undefined;
|
|
28
|
+
export declare const customerEmail: (scope: RequestScope, id: string | null) => string | null;
|
|
29
|
+
export declare const customerName: (scope: RequestScope, id: string | null) => string | null;
|
|
30
|
+
export declare const requirePrice: (scope: RequestScope, id: string, param?: string) => PriceRecord;
|
|
31
|
+
/** The amount a price charges for `quantity` units, in cents. */
|
|
32
|
+
export declare const priceAmount: (price: PriceRecord, quantity: number) => number;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve a payment method id, materialising Stripe's documented test payment methods
|
|
35
|
+
* (`pm_card_visa` and friends) the first time they are used.
|
|
36
|
+
*/
|
|
37
|
+
export declare const resolvePaymentMethod: (scope: RequestScope, id: string) => PaymentMethodRecord;
|
|
38
|
+
export declare const cardPayload: (details: CardDetails) => RecordValue;
|
|
39
|
+
export declare const paymentMethodFromToken: (scope: RequestScope, token: string) => {
|
|
40
|
+
record: PaymentMethodRecord;
|
|
41
|
+
details: CardDetails;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Charge a payment intent. Success marks the intent succeeded and records a charge; a declining
|
|
45
|
+
* test token raises the matching `card_error` instead, exactly as Stripe does at confirmation time.
|
|
46
|
+
*/
|
|
47
|
+
export declare const confirmPaymentIntent: (scope: RequestScope, intent: PaymentIntentRecord, paymentMethodId: string | null) => PaymentIntentRecord;
|
|
48
|
+
export declare const createCharge: (scope: RequestScope, input: {
|
|
49
|
+
amount: number;
|
|
50
|
+
currency: string;
|
|
51
|
+
customer: string | null;
|
|
52
|
+
payment_intent: string | null;
|
|
53
|
+
payment_method: string | null;
|
|
54
|
+
captured?: boolean;
|
|
55
|
+
invoice?: string | null;
|
|
56
|
+
metadata?: Metadata;
|
|
57
|
+
}) => ChargeRecord;
|
|
58
|
+
/** `<pi>_secret_<opaque>`: callers recover the intent id by splitting on `_secret_`. */
|
|
59
|
+
export declare const clientSecretFor: (id: string) => string;
|
|
60
|
+
/**
|
|
61
|
+
* A checkout session completes when its payment intent (or setup intent) succeeds: the session
|
|
62
|
+
* flips to `complete` with the matching payment status and Stripe emits
|
|
63
|
+
* `checkout.session.completed`.
|
|
64
|
+
*/
|
|
65
|
+
export declare const completeSessionsForIntent: (scope: RequestScope, intent: {
|
|
66
|
+
paymentIntent?: string;
|
|
67
|
+
setupIntent?: string;
|
|
68
|
+
}) => void;
|
|
69
|
+
/**
|
|
70
|
+
* Open an invoice for the given lines: Stripe's `subscription_create` / `manual` invoices start
|
|
71
|
+
* open with `amount_due` equal to the summed lines, and emit `invoice.created`.
|
|
72
|
+
*/
|
|
73
|
+
export declare const openInvoice: (scope: RequestScope, input: {
|
|
74
|
+
customer: string | null;
|
|
75
|
+
subscription: string | null;
|
|
76
|
+
lines: InvoiceLineRecord[];
|
|
77
|
+
billingReason: string;
|
|
78
|
+
metadata?: Metadata;
|
|
79
|
+
period?: {
|
|
80
|
+
start: number;
|
|
81
|
+
end: number;
|
|
82
|
+
};
|
|
83
|
+
}) => InvoiceRecord;
|
|
84
|
+
export declare const requireIntent: (scope: RequestScope, id: string, param?: string) => PaymentIntentRecord;
|
|
85
|
+
export declare const requireCharge: (scope: RequestScope, id: string, param?: string) => ChargeRecord;
|
|
86
|
+
export declare const requireInvoice: (scope: RequestScope, id: string, param?: string) => InvoiceRecord;
|
|
87
|
+
export declare const requireSubscription: (scope: RequestScope, id: string, param?: string) => import("./state.js").SubscriptionRecord;
|
|
88
|
+
export declare const requireSession: (scope: RequestScope, id: string, param?: string) => import("./state.js").CheckoutSessionRecord;
|
|
89
|
+
export declare const requireCoupon: (scope: RequestScope, id: string, param?: string) => import("./state.js").CouponRecord;
|
|
90
|
+
/** Apply a customer's balance delta and record the matching balance transaction. */
|
|
91
|
+
export declare const applyBalanceTransaction: (scope: RequestScope, input: {
|
|
92
|
+
customer: CustomerRecord;
|
|
93
|
+
amount: number;
|
|
94
|
+
currency: string;
|
|
95
|
+
description: string | null;
|
|
96
|
+
metadata: Metadata;
|
|
97
|
+
type: string;
|
|
98
|
+
invoice?: string | null;
|
|
99
|
+
}) => {
|
|
100
|
+
id: string;
|
|
101
|
+
ending_balance: number;
|
|
102
|
+
};
|
|
103
|
+
/** Metadata merge with Stripe's `""`-clears semantics. */
|
|
104
|
+
export declare const mergeRecordMetadata: (current: Metadata, incoming: unknown) => Metadata;
|
|
105
|
+
export declare const adjustmentsByReason: (reason: string | null) => RecordValue[];
|
|
106
|
+
/** A draft invoice's money fields are derived from its lines. */
|
|
107
|
+
export declare const recomputeInvoice: (invoice: InvoiceRecord) => InvoiceRecord;
|
|
108
|
+
export declare const invoiceLineFromItem: (scope: RequestScope, item: {
|
|
109
|
+
id: string;
|
|
110
|
+
amount: number;
|
|
111
|
+
currency: string;
|
|
112
|
+
description: string | null;
|
|
113
|
+
quantity: number;
|
|
114
|
+
metadata: Metadata;
|
|
115
|
+
price: string | null;
|
|
116
|
+
}) => InvoiceLineRecord;
|
|
117
|
+
export declare const invoiceLineFromPrice: (scope: RequestScope, price: PriceRecord, quantity: number) => InvoiceLineRecord;
|
|
118
|
+
export declare const createDiscount: (scope: RequestScope, input: {
|
|
119
|
+
coupon: string;
|
|
120
|
+
promotion_code?: string | null;
|
|
121
|
+
customer?: string | null;
|
|
122
|
+
subscription?: string | null;
|
|
123
|
+
end?: number | null;
|
|
124
|
+
}) => DiscountRecord;
|
|
125
|
+
export declare const subscriptionPeriod: (now: () => number, interval: "day" | "week" | "month" | "year", count: number) => {
|
|
126
|
+
start: number;
|
|
127
|
+
end: number;
|
|
128
|
+
};
|
|
129
|
+
export declare const requireParam: (params: RecordValue, key: string) => string;
|
|
130
|
+
export declare const renderIntentForEvent: (intent: PaymentIntentRecord) => {
|
|
131
|
+
[x: string]: unknown;
|
|
132
|
+
};
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"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"}
|