@adonis-agora/payments 0.2.0 → 0.3.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/CHANGELOG.md +2347 -0
- package/dist/assets/spa/assets/index-CT5Zon6P.css +1 -0
- package/dist/assets/spa/assets/index-CvEbJEnq.js +41 -0
- package/dist/assets/spa/assets/index-CvEbJEnq.js.map +1 -0
- package/dist/assets/spa/index.html +20 -0
- package/dist/commands/main.d.ts +4 -3
- package/dist/commands/main.d.ts.map +1 -1
- package/dist/commands/main.js +9 -2
- package/dist/commands/main.js.map +1 -1
- package/dist/commands/payments_health.d.ts +31 -0
- package/dist/commands/payments_health.d.ts.map +1 -0
- package/dist/commands/payments_health.js +113 -0
- package/dist/commands/payments_health.js.map +1 -0
- package/dist/commands/payments_sync.d.ts +18 -4
- package/dist/commands/payments_sync.d.ts.map +1 -1
- package/dist/commands/payments_sync.js +136 -40
- package/dist/commands/payments_sync.js.map +1 -1
- package/dist/configure.d.ts +12 -5
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +18 -5
- package/dist/configure.js.map +1 -1
- package/dist/providers/dashboard_provider.d.ts +97 -0
- package/dist/providers/dashboard_provider.d.ts.map +1 -0
- package/dist/providers/dashboard_provider.js +430 -0
- package/dist/providers/dashboard_provider.js.map +1 -0
- package/dist/providers/payments_client_provider.d.ts +41 -0
- package/dist/providers/payments_client_provider.d.ts.map +1 -0
- package/dist/providers/payments_client_provider.js +95 -0
- package/dist/providers/payments_client_provider.js.map +1 -0
- package/dist/providers/payments_provider.d.ts +35 -0
- package/dist/providers/payments_provider.d.ts.map +1 -1
- package/dist/providers/payments_provider.js +250 -36
- package/dist/providers/payments_provider.js.map +1 -1
- package/dist/src/billing/billing_health.d.ts +85 -0
- package/dist/src/billing/billing_health.d.ts.map +1 -0
- package/dist/src/billing/billing_health.js +155 -0
- package/dist/src/billing/billing_health.js.map +1 -0
- package/dist/src/billing/billing_overview.d.ts +4 -3
- package/dist/src/billing/billing_overview.d.ts.map +1 -1
- package/dist/src/billing/billing_overview.js +14 -5
- package/dist/src/billing/billing_overview.js.map +1 -1
- package/dist/src/billing/billing_store.d.ts +634 -5
- package/dist/src/billing/billing_store.d.ts.map +1 -1
- package/dist/src/billing/billing_store.js +18 -1
- package/dist/src/billing/billing_store.js.map +1 -1
- package/dist/src/billing/index.d.ts +2 -1
- package/dist/src/billing/index.d.ts.map +1 -1
- package/dist/src/billing/index.js +1 -0
- package/dist/src/billing/index.js.map +1 -1
- package/dist/src/billing/list_query.d.ts +16 -0
- package/dist/src/billing/list_query.d.ts.map +1 -0
- package/dist/src/billing/list_query.js +28 -0
- package/dist/src/billing/list_query.js.map +1 -0
- package/dist/src/billing/lucid_billing_store.d.ts +122 -4
- package/dist/src/billing/lucid_billing_store.d.ts.map +1 -1
- package/dist/src/billing/lucid_billing_store.js +811 -13
- package/dist/src/billing/lucid_billing_store.js.map +1 -1
- package/dist/src/billing/mixins/index.d.ts +3 -0
- package/dist/src/billing/mixins/index.d.ts.map +1 -1
- package/dist/src/billing/mixins/index.js +3 -0
- package/dist/src/billing/mixins/index.js.map +1 -1
- package/dist/src/billing/mixins/with_audit_event.d.ts +48 -0
- package/dist/src/billing/mixins/with_audit_event.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_audit_event.js +77 -0
- package/dist/src/billing/mixins/with_audit_event.js.map +1 -0
- package/dist/src/billing/mixins/with_customer.d.ts +39 -0
- package/dist/src/billing/mixins/with_customer.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_customer.js +68 -0
- package/dist/src/billing/mixins/with_customer.js.map +1 -0
- package/dist/src/billing/mixins/with_dispute.d.ts +68 -0
- package/dist/src/billing/mixins/with_dispute.d.ts.map +1 -0
- package/dist/src/billing/mixins/with_dispute.js +83 -0
- package/dist/src/billing/mixins/with_dispute.js.map +1 -0
- package/dist/src/billing/mixins/with_payment.d.ts +42 -0
- package/dist/src/billing/mixins/with_payment.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_payment.js +29 -3
- package/dist/src/billing/mixins/with_payment.js.map +1 -1
- package/dist/src/billing/mixins/with_subscription.d.ts +7 -0
- package/dist/src/billing/mixins/with_subscription.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_subscription.js +15 -1
- package/dist/src/billing/mixins/with_subscription.js.map +1 -1
- package/dist/src/billing/mixins/with_usage_event.d.ts +7 -0
- package/dist/src/billing/mixins/with_usage_event.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_usage_event.js +15 -1
- package/dist/src/billing/mixins/with_usage_event.js.map +1 -1
- package/dist/src/billing/mixins/with_webhook_event.d.ts +18 -0
- package/dist/src/billing/mixins/with_webhook_event.d.ts.map +1 -1
- package/dist/src/billing/mixins/with_webhook_event.js +18 -1
- package/dist/src/billing/mixins/with_webhook_event.js.map +1 -1
- package/dist/src/billing/resolve_dispatch.d.ts +22 -0
- package/dist/src/billing/resolve_dispatch.d.ts.map +1 -0
- package/dist/src/billing/resolve_dispatch.js +44 -0
- package/dist/src/billing/resolve_dispatch.js.map +1 -0
- package/dist/src/billing/resolve_store.d.ts +18 -0
- package/dist/src/billing/resolve_store.d.ts.map +1 -0
- package/dist/src/billing/resolve_store.js +35 -0
- package/dist/src/billing/resolve_store.js.map +1 -0
- package/dist/src/billing/schema.d.ts +108 -0
- package/dist/src/billing/schema.d.ts.map +1 -0
- package/dist/src/billing/schema.js +350 -0
- package/dist/src/billing/schema.js.map +1 -0
- package/dist/src/billing/webhook_dispatcher.d.ts +95 -16
- package/dist/src/billing/webhook_dispatcher.d.ts.map +1 -1
- package/dist/src/billing/webhook_dispatcher.js +186 -33
- package/dist/src/billing/webhook_dispatcher.js.map +1 -1
- package/dist/src/billing/webhook_events.d.ts +67 -1
- package/dist/src/billing/webhook_events.d.ts.map +1 -1
- package/dist/src/billing/webhook_events.js +15 -0
- package/dist/src/billing/webhook_events.js.map +1 -1
- package/dist/src/billing/webhook_processor.d.ts.map +1 -1
- package/dist/src/billing/webhook_processor.js +325 -5
- package/dist/src/billing/webhook_processor.js.map +1 -1
- package/dist/src/client/define_config.d.ts +150 -0
- package/dist/src/client/define_config.d.ts.map +1 -0
- package/dist/src/client/define_config.js +98 -0
- package/dist/src/client/define_config.js.map +1 -0
- package/dist/src/client/handlers.d.ts +71 -0
- package/dist/src/client/handlers.d.ts.map +1 -0
- package/dist/src/client/handlers.js +119 -0
- package/dist/src/client/handlers.js.map +1 -0
- package/dist/src/client/index.d.ts +16 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +13 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/client/statuses.d.ts +38 -0
- package/dist/src/client/statuses.d.ts.map +1 -0
- package/dist/src/client/statuses.js +42 -0
- package/dist/src/client/statuses.js.map +1 -0
- package/dist/src/dashboard/actions.d.ts +143 -0
- package/dist/src/dashboard/actions.d.ts.map +1 -0
- package/dist/src/dashboard/actions.js +112 -0
- package/dist/src/dashboard/actions.js.map +1 -0
- package/dist/src/dashboard/auth.d.ts +136 -0
- package/dist/src/dashboard/auth.d.ts.map +1 -0
- package/dist/src/dashboard/auth.js +152 -0
- package/dist/src/dashboard/auth.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +80 -0
- package/dist/src/dashboard/define_config.d.ts.map +1 -0
- package/dist/src/dashboard/define_config.js +83 -0
- package/dist/src/dashboard/define_config.js.map +1 -0
- package/dist/src/dashboard/handlers.d.ts +281 -0
- package/dist/src/dashboard/handlers.d.ts.map +1 -0
- package/dist/src/dashboard/handlers.js +960 -0
- package/dist/src/dashboard/handlers.js.map +1 -0
- package/dist/src/dashboard/index.d.ts +18 -0
- package/dist/src/dashboard/index.d.ts.map +1 -0
- package/dist/src/dashboard/index.js +14 -0
- package/dist/src/dashboard/index.js.map +1 -0
- package/dist/src/dashboard/login_page.d.ts +23 -0
- package/dist/src/dashboard/login_page.d.ts.map +1 -0
- package/dist/src/dashboard/login_page.js +170 -0
- package/dist/src/dashboard/login_page.js.map +1 -0
- package/dist/src/dashboard/period.d.ts +31 -0
- package/dist/src/dashboard/period.d.ts.map +1 -0
- package/dist/src/dashboard/period.js +44 -0
- package/dist/src/dashboard/period.js.map +1 -0
- package/dist/src/dashboard/session_cookie.d.ts +42 -0
- package/dist/src/dashboard/session_cookie.d.ts.map +1 -0
- package/dist/src/dashboard/session_cookie.js +97 -0
- package/dist/src/dashboard/session_cookie.js.map +1 -0
- package/dist/src/dashboard/spa.d.ts +24 -0
- package/dist/src/dashboard/spa.d.ts.map +1 -0
- package/dist/src/dashboard/spa.js +52 -0
- package/dist/src/dashboard/spa.js.map +1 -0
- package/dist/src/define_config.d.ts +244 -9
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +97 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/diagnostics.d.ts +287 -7
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js +317 -1
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/driver.d.ts +139 -5
- package/dist/src/driver.d.ts.map +1 -1
- package/dist/src/drivers/abacate.d.ts +12 -2
- package/dist/src/drivers/abacate.d.ts.map +1 -1
- package/dist/src/drivers/abacate.js +112 -19
- package/dist/src/drivers/abacate.js.map +1 -1
- package/dist/src/drivers/adyen.d.ts +164 -0
- package/dist/src/drivers/adyen.d.ts.map +1 -0
- package/dist/src/drivers/adyen.js +678 -0
- package/dist/src/drivers/adyen.js.map +1 -0
- package/dist/src/drivers/asaas.d.ts +52 -2
- package/dist/src/drivers/asaas.d.ts.map +1 -1
- package/dist/src/drivers/asaas.js +364 -29
- package/dist/src/drivers/asaas.js.map +1 -1
- package/dist/src/drivers/dodo.d.ts +135 -0
- package/dist/src/drivers/dodo.d.ts.map +1 -0
- package/dist/src/drivers/dodo.js +864 -0
- package/dist/src/drivers/dodo.js.map +1 -0
- package/dist/src/drivers/efi.d.ts +98 -0
- package/dist/src/drivers/efi.d.ts.map +1 -0
- package/dist/src/drivers/efi.js +628 -0
- package/dist/src/drivers/efi.js.map +1 -0
- package/dist/src/drivers/infinitepay.d.ts +156 -0
- package/dist/src/drivers/infinitepay.d.ts.map +1 -0
- package/dist/src/drivers/infinitepay.js +321 -0
- package/dist/src/drivers/infinitepay.js.map +1 -0
- package/dist/src/drivers/lemonsqueezy.d.ts +125 -0
- package/dist/src/drivers/lemonsqueezy.d.ts.map +1 -0
- package/dist/src/drivers/lemonsqueezy.js +632 -0
- package/dist/src/drivers/lemonsqueezy.js.map +1 -0
- package/dist/src/drivers/mercadopago.d.ts +97 -0
- package/dist/src/drivers/mercadopago.d.ts.map +1 -0
- package/dist/src/drivers/mercadopago.js +844 -0
- package/dist/src/drivers/mercadopago.js.map +1 -0
- package/dist/src/drivers/mollie.d.ts +125 -0
- package/dist/src/drivers/mollie.d.ts.map +1 -0
- package/dist/src/drivers/mollie.js +812 -0
- package/dist/src/drivers/mollie.js.map +1 -0
- package/dist/src/drivers/paddle.d.ts +148 -0
- package/dist/src/drivers/paddle.d.ts.map +1 -0
- package/dist/src/drivers/paddle.js +738 -0
- package/dist/src/drivers/paddle.js.map +1 -0
- package/dist/src/drivers/pagarme.d.ts +97 -0
- package/dist/src/drivers/pagarme.d.ts.map +1 -0
- package/dist/src/drivers/pagarme.js +829 -0
- package/dist/src/drivers/pagarme.js.map +1 -0
- package/dist/src/drivers/pagbank.d.ts +57 -0
- package/dist/src/drivers/pagbank.d.ts.map +1 -0
- package/dist/src/drivers/pagbank.js +499 -0
- package/dist/src/drivers/pagbank.js.map +1 -0
- package/dist/src/drivers/paypal.d.ts +120 -0
- package/dist/src/drivers/paypal.d.ts.map +1 -0
- package/dist/src/drivers/paypal.js +891 -0
- package/dist/src/drivers/paypal.js.map +1 -0
- package/dist/src/drivers/polar.d.ts +118 -0
- package/dist/src/drivers/polar.d.ts.map +1 -0
- package/dist/src/drivers/polar.js +604 -0
- package/dist/src/drivers/polar.js.map +1 -0
- package/dist/src/drivers/razorpay.d.ts +103 -0
- package/dist/src/drivers/razorpay.d.ts.map +1 -0
- package/dist/src/drivers/razorpay.js +867 -0
- package/dist/src/drivers/razorpay.js.map +1 -0
- package/dist/src/drivers/shared.d.ts +33 -0
- package/dist/src/drivers/shared.d.ts.map +1 -0
- package/dist/src/drivers/shared.js +37 -0
- package/dist/src/drivers/shared.js.map +1 -0
- package/dist/src/drivers/square.d.ts +133 -0
- package/dist/src/drivers/square.d.ts.map +1 -0
- package/dist/src/drivers/square.js +905 -0
- package/dist/src/drivers/square.js.map +1 -0
- package/dist/src/drivers/stripe.d.ts +40 -3
- package/dist/src/drivers/stripe.d.ts.map +1 -1
- package/dist/src/drivers/stripe.js +806 -25
- package/dist/src/drivers/stripe.js.map +1 -1
- package/dist/src/drivers/woovi.d.ts +10 -3
- package/dist/src/drivers/woovi.d.ts.map +1 -1
- package/dist/src/drivers/woovi.js +162 -29
- package/dist/src/drivers/woovi.js.map +1 -1
- package/dist/src/ensure_customer.d.ts +34 -1
- package/dist/src/ensure_customer.d.ts.map +1 -1
- package/dist/src/ensure_customer.js +29 -4
- package/dist/src/ensure_customer.js.map +1 -1
- package/dist/src/http.d.ts +37 -3
- package/dist/src/http.d.ts.map +1 -1
- package/dist/src/http.js +69 -5
- package/dist/src/http.js.map +1 -1
- package/dist/src/index.d.ts +40 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +22 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/invoice/emit_invoice.d.ts.map +1 -1
- package/dist/src/invoice/emit_invoice.js +31 -11
- package/dist/src/invoice/emit_invoice.js.map +1 -1
- package/dist/src/money.d.ts +23 -5
- package/dist/src/money.d.ts.map +1 -1
- package/dist/src/money.js +72 -7
- package/dist/src/money.js.map +1 -1
- package/dist/src/payments_manager.d.ts +8 -1
- package/dist/src/payments_manager.d.ts.map +1 -1
- package/dist/src/payments_manager.js +168 -6
- package/dist/src/payments_manager.js.map +1 -1
- package/dist/src/services/main.d.ts +38 -0
- package/dist/src/services/main.d.ts.map +1 -1
- package/dist/src/services/main.js +130 -0
- package/dist/src/services/main.js.map +1 -1
- package/dist/src/telescope/index.d.ts +2 -0
- package/dist/src/telescope/index.d.ts.map +1 -1
- package/dist/src/telescope/index.js +1 -0
- package/dist/src/telescope/index.js.map +1 -1
- package/dist/src/telescope/payments_watcher.d.ts +10 -4
- package/dist/src/telescope/payments_watcher.d.ts.map +1 -1
- package/dist/src/telescope/payments_watcher.js +65 -13
- package/dist/src/telescope/payments_watcher.js.map +1 -1
- package/dist/src/telescope/register.d.ts +62 -0
- package/dist/src/telescope/register.d.ts.map +1 -0
- package/dist/src/telescope/register.js +48 -0
- package/dist/src/telescope/register.js.map +1 -0
- package/dist/src/testing/fake_payments.d.ts +62 -0
- package/dist/src/testing/fake_payments.d.ts.map +1 -0
- package/dist/src/testing/fake_payments.js +82 -0
- package/dist/src/testing/fake_payments.js.map +1 -0
- package/dist/src/testing/in_memory_billing_store.d.ts +151 -2
- package/dist/src/testing/in_memory_billing_store.d.ts.map +1 -1
- package/dist/src/testing/in_memory_billing_store.js +517 -4
- package/dist/src/testing/in_memory_billing_store.js.map +1 -1
- package/dist/src/testing/index.d.ts +2 -1
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +1 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/types.d.ts +161 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +30 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/webhook_handlers.d.ts +96 -2
- package/dist/src/webhook_handlers.d.ts.map +1 -1
- package/dist/src/webhook_handlers.js +91 -10
- package/dist/src/webhook_handlers.js.map +1 -1
- package/dist/src/webhook_security.d.ts +94 -3
- package/dist/src/webhook_security.d.ts.map +1 -1
- package/dist/src/webhook_security.js +173 -9
- package/dist/src/webhook_security.js.map +1 -1
- package/dist/stubs/config/payments.stub +13 -0
- package/dist/stubs/config/payments_client.stub +42 -0
- package/dist/stubs/config/payments_dashboard.stub +38 -0
- package/dist/stubs/database/migrations/create_billing_tables.stub +35 -77
- package/dist/stubs/make/webhook_handler/main.stub +29 -11
- package/package.json +60 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EACV,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { FakePaymentsDriver } from './fake_payments_driver.js';
|
|
2
2
|
export { InMemoryBillingStore } from './in_memory_billing_store.js';
|
|
3
3
|
export { MutableClock } from './mutable_clock.js';
|
|
4
|
+
export { fakePayments, swapPayments, swapBillingStore, flushWebhooks, } from './fake_payments.js';
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AASpE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -9,18 +9,149 @@
|
|
|
9
9
|
export type Money = number;
|
|
10
10
|
/** ISO 4217 currency code, lowercase (e.g. `'brl'`, `'usd'`). */
|
|
11
11
|
export type Currency = string;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Where a payment stands.
|
|
14
|
+
*
|
|
15
|
+
* `authorized` is NOT `paid`: the funds are held on the customer's card and nothing has
|
|
16
|
+
* moved until a capture. Card gateways that separate the two (Razorpay, Square, Adyen,
|
|
17
|
+
* PayPal) had no name for it, so it collapsed into `pending` — which understates it — or
|
|
18
|
+
* `paid`, which grants access against money that can still evaporate.
|
|
19
|
+
*/
|
|
20
|
+
export type BillingStatus = 'pending' | 'authorized' | 'paid' | 'failed' | 'refunded' | 'canceled' | 'disputed';
|
|
21
|
+
/**
|
|
22
|
+
* `paused` is a real state, not a flavour of `active`: the subscription exists, will bill
|
|
23
|
+
* again, and must NOT entitle the subscriber right now. Mapping it to `active` — which
|
|
24
|
+
* several gateways forced — grants access to someone who is not paying.
|
|
25
|
+
*/
|
|
26
|
+
export type SubscriptionStatus = 'trialing' | 'active' | 'paused' | 'past_due' | 'incomplete' | 'canceled' | 'ended';
|
|
27
|
+
/** How a payment was actually paid, as reported back on a {@link Payment}. */
|
|
28
|
+
export type PaymentMethodType = 'card' | 'pix' | 'boleto' | 'debit_card' | 'wallet' | 'bank_transfer' | 'bank_debit' | 'upi' | 'bnpl' | 'voucher' | 'unknown';
|
|
15
29
|
/**
|
|
16
30
|
* Canonical payment method names used to route charges to a provider (`config.methods`).
|
|
17
31
|
* `undefined` means "let the customer choose at checkout" (gateway's `UNDEFINED`).
|
|
32
|
+
*
|
|
33
|
+
* These are CATEGORIES, not brands, and deliberately so. Enumerating every local method a
|
|
34
|
+
* gateway offers — iDEAL, Bancontact, EPS, Przelewy24, BLIK, TWINT, MB Way, Multibanco,
|
|
35
|
+
* Klarna, paysafecard, and a new one every quarter — is a union that never closes, and a
|
|
36
|
+
* union that never closes cannot make routing a typo fail at the manager, which is the only
|
|
37
|
+
* reason this type is closed at all.
|
|
38
|
+
*
|
|
39
|
+
* So route by category and name the brand where it belongs: the gateway's own field, via
|
|
40
|
+
* `metadata`. `bank_transfer` covers the push-from-your-bank methods (iDEAL, Bancontact,
|
|
41
|
+
* Multibanco, Trustly); `bank_debit` the pull-from-your-account ones (SEPA Direct Debit,
|
|
42
|
+
* ACH); `wallet` the stored-balance and device wallets (PayPal, Apple Pay, Google Pay);
|
|
43
|
+
* `bnpl` the buy-now-pay-later ones; `upi` is named outright because in India it is the
|
|
44
|
+
* default way people pay, not a local alternative.
|
|
18
45
|
*/
|
|
19
|
-
export
|
|
46
|
+
export declare const PAYMENT_METHOD_NAMES: readonly ["pix", "credit_card", "debit_card", "boleto", "wallet", "bank_transfer", "bank_debit", "upi", "bnpl", "voucher", "undefined"];
|
|
47
|
+
/**
|
|
48
|
+
* The union, derived from the list above rather than written twice.
|
|
49
|
+
*
|
|
50
|
+
* The list exists because the routing error message used to spell the members out by hand,
|
|
51
|
+
* and said "pix, credit_card, debit_card, boleto, undefined" long after six more were added
|
|
52
|
+
* — so a reader routing `wallet` was told, by the library, that it was not a known method.
|
|
53
|
+
*/
|
|
54
|
+
export type PaymentMethodName = (typeof PAYMENT_METHOD_NAMES)[number];
|
|
20
55
|
export interface MoneyAmount {
|
|
21
56
|
amount: Money;
|
|
22
57
|
currency: Currency;
|
|
23
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Where a dispute stands. A chargeback is the only thing in this library that takes money
|
|
61
|
+
* back AFTER it settled, and the window to answer is measured in days.
|
|
62
|
+
*
|
|
63
|
+
* `warning` is not a dispute yet — it is the pre-chargeback alert the card networks relay
|
|
64
|
+
* (Stripe's Early Fraud Warning, Adyen's `NOTIFICATION_OF_FRAUD`), where refunding inside
|
|
65
|
+
* the window stops the chargeback from ever being filed. That matters beyond the one sale:
|
|
66
|
+
* a chargeback counts against the ratio that puts a merchant into a card network's
|
|
67
|
+
* monitoring programme, so it can be worth refunding a dispute you would have won.
|
|
68
|
+
*/
|
|
69
|
+
export type DisputeStatus = 'warning' | 'open' | 'under_review' | 'won' | 'lost' | 'canceled' | 'expired';
|
|
70
|
+
/** A chargeback or pre-chargeback alert, normalized across gateways. */
|
|
71
|
+
export interface Dispute {
|
|
72
|
+
/** The gateway's id for the dispute itself — NOT the payment's. */
|
|
73
|
+
id: string;
|
|
74
|
+
provider: string;
|
|
75
|
+
/** The disputed payment's gateway id. */
|
|
76
|
+
paymentGatewayId: string;
|
|
77
|
+
status: DisputeStatus;
|
|
78
|
+
/**
|
|
79
|
+
* How much is being disputed, in the currency's smallest unit. Not always the whole
|
|
80
|
+
* payment: a partial chargeback is normal.
|
|
81
|
+
*/
|
|
82
|
+
amount?: MoneyAmount;
|
|
83
|
+
/** The gateway's own reason code, verbatim — the vocabulary is per-network. */
|
|
84
|
+
reason?: string;
|
|
85
|
+
/**
|
|
86
|
+
* When evidence must be submitted by. The single most operationally important field
|
|
87
|
+
* here: past it, the dispute is lost by default and nothing can be done.
|
|
88
|
+
*/
|
|
89
|
+
evidenceDueBy?: string;
|
|
90
|
+
/** Whether this gateway will still accept evidence — most accept it ONCE. */
|
|
91
|
+
canSubmitEvidence?: boolean;
|
|
92
|
+
createdAt?: string;
|
|
93
|
+
payload: Record<string, unknown>;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Evidence for a representment.
|
|
97
|
+
*
|
|
98
|
+
* Every field is optional because no gateway wants all of them and no app has all of them,
|
|
99
|
+
* but the shape is deliberately concrete rather than a bag: a driver has to map onto the
|
|
100
|
+
* gateway's own field names, and it cannot map what it cannot recognize.
|
|
101
|
+
*/
|
|
102
|
+
export interface DisputeEvidence {
|
|
103
|
+
/** Free-text explanation. Most gateways weigh this heavily. */
|
|
104
|
+
explanation?: string;
|
|
105
|
+
shippingCarrier?: string;
|
|
106
|
+
shippingTrackingNumber?: string;
|
|
107
|
+
shippingDate?: string;
|
|
108
|
+
serviceDate?: string;
|
|
109
|
+
/** When the customer accepted the terms. The terms themselves are a {@link DisputeDocument}. */
|
|
110
|
+
termsAcceptedAt?: string;
|
|
111
|
+
customerName?: string;
|
|
112
|
+
customerEmail?: string;
|
|
113
|
+
customerIpAddress?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Prior charges to the same customer that were never disputed — the strongest signal the
|
|
116
|
+
* card networks accept, and the reason this is a list of transactions rather than a count.
|
|
117
|
+
* Visa's Compelling Evidence 3.0 wants the charges themselves, each with the account, device
|
|
118
|
+
* and IP it was made from; a number is not evidence of anything.
|
|
119
|
+
*/
|
|
120
|
+
priorUndisputedPayments?: PriorUndisputedPayment[];
|
|
121
|
+
/** Documents already uploaded to the gateway, each addressed by what it proves. */
|
|
122
|
+
documents?: DisputeDocument[];
|
|
123
|
+
/** Anything gateway-specific the shape above has no name for. */
|
|
124
|
+
metadata?: Record<string, unknown>;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* What a piece of evidence proves, which is what every gateway files it by.
|
|
128
|
+
*
|
|
129
|
+
* Not a free-form label: a bare list of upload ids cannot be submitted anywhere, because
|
|
130
|
+
* the gateway needs to know which id is the receipt and which is the shipping proof. Stripe
|
|
131
|
+
* has nine separate file fields, Adyen has a `defenseDocumentTypeCode`, and neither can be
|
|
132
|
+
* reached with "here are some files".
|
|
133
|
+
*/
|
|
134
|
+
export type DisputeDocumentKind = 'receipt' | 'invoice' | 'customer_communication' | 'customer_signature' | 'shipping' | 'service' | 'refund_policy' | 'cancellation_policy' | 'terms' | 'duplicate_charge' | 'other';
|
|
135
|
+
/**
|
|
136
|
+
* A document already uploaded to the gateway, by its own file id.
|
|
137
|
+
*
|
|
138
|
+
* A file id, never a URL. The banks reviewing a dispute do not follow links, and no gateway
|
|
139
|
+
* in this package accepts one — the evidence has to be bytes the gateway already holds.
|
|
140
|
+
*/
|
|
141
|
+
export interface DisputeDocument {
|
|
142
|
+
kind: DisputeDocumentKind;
|
|
143
|
+
/** The gateway's own id for the uploaded file. */
|
|
144
|
+
id: string;
|
|
145
|
+
}
|
|
146
|
+
/** A prior charge to the same customer that was never disputed. */
|
|
147
|
+
export interface PriorUndisputedPayment {
|
|
148
|
+
/** The gateway's id for that charge. */
|
|
149
|
+
paymentGatewayId: string;
|
|
150
|
+
/** The account the customer was signed into, if the gateway asks for one. */
|
|
151
|
+
customerAccountId?: string;
|
|
152
|
+
customerIpAddress?: string;
|
|
153
|
+
customerDeviceId?: string;
|
|
154
|
+
}
|
|
24
155
|
/** A customer as seen by the gateway. */
|
|
25
156
|
export interface Customer {
|
|
26
157
|
id: string;
|
|
@@ -46,8 +177,26 @@ export interface Payment {
|
|
|
46
177
|
payload: Record<string, unknown>;
|
|
47
178
|
createdAt: string;
|
|
48
179
|
paidAt?: string;
|
|
49
|
-
/**
|
|
180
|
+
/**
|
|
181
|
+
* Base64-encoded PNG of the Pix QR code, when the gateway returns one.
|
|
182
|
+
* Render it directly (`data:image/png;base64,${pixQrCodeImage}`) — it is an image,
|
|
183
|
+
* not something the customer can copy.
|
|
184
|
+
*/
|
|
185
|
+
pixQrCodeImage?: string;
|
|
186
|
+
/**
|
|
187
|
+
* The Pix BR Code (EMV payload) — the plain-text string behind the QR code, and the
|
|
188
|
+
* one the customer copies and pastes into their bank app ("Pix copia e cola").
|
|
189
|
+
*/
|
|
190
|
+
pixCode?: string;
|
|
191
|
+
/**
|
|
192
|
+
* @deprecated Misleading name — it holds the QR **image**, not a code. Use {@link Payment.pixQrCodeImage}.
|
|
193
|
+
* Still populated with the same value for backward compatibility.
|
|
194
|
+
*/
|
|
50
195
|
pixQrCode?: string;
|
|
196
|
+
/**
|
|
197
|
+
* @deprecated Portuguese name for the BR Code payload. Use {@link Payment.pixCode}.
|
|
198
|
+
* Still populated with the same value for backward compatibility.
|
|
199
|
+
*/
|
|
51
200
|
pixCopiaECola?: string;
|
|
52
201
|
/** URL to a hosted checkout/charge page when the gateway provides one. */
|
|
53
202
|
hostedUrl?: string;
|
|
@@ -70,6 +219,13 @@ export interface CheckoutSession {
|
|
|
70
219
|
provider: string;
|
|
71
220
|
/** URL to redirect the customer to (hosted checkout). */
|
|
72
221
|
url: string;
|
|
222
|
+
/**
|
|
223
|
+
* Pix BR Code (EMV payload) for a checkout the gateway settles over Pix — the
|
|
224
|
+
* string the payer copies. Same field as {@link Payment.pixCode}.
|
|
225
|
+
*/
|
|
226
|
+
pixCode?: string;
|
|
227
|
+
/** @deprecated Renamed to {@link CheckoutSession.pixCode}. Still populated. */
|
|
228
|
+
pixCopiaECola?: string;
|
|
73
229
|
status: 'open' | 'complete' | 'expired';
|
|
74
230
|
amount?: MoneyAmount;
|
|
75
231
|
/** The subscription created by this checkout, when it was a subscription checkout. */
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,kFAAkF;AAClF,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,iEAAiE;AACjE,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.js
CHANGED
|
@@ -5,5 +5,34 @@
|
|
|
5
5
|
* (Stripe, AbacatePay, Asaas, Woovi) maps its own API response onto these types, so the
|
|
6
6
|
* billing layer and application code never touch gateway-specific payloads.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Canonical payment method names used to route charges to a provider (`config.methods`).
|
|
10
|
+
* `undefined` means "let the customer choose at checkout" (gateway's `UNDEFINED`).
|
|
11
|
+
*
|
|
12
|
+
* These are CATEGORIES, not brands, and deliberately so. Enumerating every local method a
|
|
13
|
+
* gateway offers — iDEAL, Bancontact, EPS, Przelewy24, BLIK, TWINT, MB Way, Multibanco,
|
|
14
|
+
* Klarna, paysafecard, and a new one every quarter — is a union that never closes, and a
|
|
15
|
+
* union that never closes cannot make routing a typo fail at the manager, which is the only
|
|
16
|
+
* reason this type is closed at all.
|
|
17
|
+
*
|
|
18
|
+
* So route by category and name the brand where it belongs: the gateway's own field, via
|
|
19
|
+
* `metadata`. `bank_transfer` covers the push-from-your-bank methods (iDEAL, Bancontact,
|
|
20
|
+
* Multibanco, Trustly); `bank_debit` the pull-from-your-account ones (SEPA Direct Debit,
|
|
21
|
+
* ACH); `wallet` the stored-balance and device wallets (PayPal, Apple Pay, Google Pay);
|
|
22
|
+
* `bnpl` the buy-now-pay-later ones; `upi` is named outright because in India it is the
|
|
23
|
+
* default way people pay, not a local alternative.
|
|
24
|
+
*/
|
|
25
|
+
export const PAYMENT_METHOD_NAMES = [
|
|
26
|
+
'pix',
|
|
27
|
+
'credit_card',
|
|
28
|
+
'debit_card',
|
|
29
|
+
'boleto',
|
|
30
|
+
'wallet',
|
|
31
|
+
'bank_transfer',
|
|
32
|
+
'bank_debit',
|
|
33
|
+
'upi',
|
|
34
|
+
'bnpl',
|
|
35
|
+
'voucher',
|
|
36
|
+
'undefined',
|
|
37
|
+
];
|
|
9
38
|
//# sourceMappingURL=types.js.map
|
package/dist/src/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqDH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,KAAK;IACL,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,eAAe;IACf,YAAY;IACZ,KAAK;IACL,MAAM;IACN,SAAS;IACT,WAAW;CACH,CAAC"}
|
|
@@ -1,5 +1,67 @@
|
|
|
1
|
+
import type { DisputeWebhookData, PaymentWebhookData, SubscriptionWebhookData, WebhookEventType } from './billing/webhook_events.js';
|
|
1
2
|
import type { WebhookHandler } from './billing/webhook_processor.js';
|
|
2
3
|
import type { WebhookEvent } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Which normalized payload each canonical event type carries.
|
|
6
|
+
*
|
|
7
|
+
* The map exists because `WebhookEvent<T = unknown>` made every handler open with a cast —
|
|
8
|
+
* `const data = event.data as PaymentWebhookData` — and a cast is a claim nothing checks.
|
|
9
|
+
* `payment.disputed` carries a {@link DisputeWebhookData}, not a payment payload, so the
|
|
10
|
+
* copy-pasted cast was simply WRONG on that one handler: it read `amount`/`currency` as
|
|
11
|
+
* required off a shape where a Stripe early fraud warning has neither.
|
|
12
|
+
*
|
|
13
|
+
* Pair a type with its payload here once and {@link defineWebhookHandler} infers it, so the
|
|
14
|
+
* wrong pairing is a compile error instead of a runtime `undefined`.
|
|
15
|
+
*/
|
|
16
|
+
export interface WebhookEventDataMap {
|
|
17
|
+
'payment.succeeded': PaymentWebhookData;
|
|
18
|
+
'payment.failed': PaymentWebhookData;
|
|
19
|
+
'payment.refunded': PaymentWebhookData;
|
|
20
|
+
'payment.updated': PaymentWebhookData;
|
|
21
|
+
'payment.disputed': DisputeWebhookData;
|
|
22
|
+
'payment.dispute_warning': DisputeWebhookData;
|
|
23
|
+
'payment.dispute_closed': DisputeWebhookData;
|
|
24
|
+
'subscription.created': SubscriptionWebhookData;
|
|
25
|
+
'subscription.updated': SubscriptionWebhookData;
|
|
26
|
+
'subscription.canceled': SubscriptionWebhookData;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The payload a handler for `T` receives. Canonical types resolve through
|
|
30
|
+
* {@link WebhookEventDataMap}; anything else is a driver passthrough (drivers lowercase the
|
|
31
|
+
* gateway events they cannot map) whose shape this library cannot know, so it stays
|
|
32
|
+
* `unknown` — which is honest, and forces a narrowing the app can see.
|
|
33
|
+
*/
|
|
34
|
+
export type WebhookEventDataFor<T extends string> = T extends WebhookEventType ? WebhookEventDataMap[T] : unknown;
|
|
35
|
+
/** A {@link WebhookEvent} narrowed to one event type, payload included. */
|
|
36
|
+
export type WebhookEventFor<T extends string> = WebhookEvent<WebhookEventDataFor<T>> & {
|
|
37
|
+
type: T;
|
|
38
|
+
};
|
|
39
|
+
/** A handler that knows which event it is for — and therefore what `event.data` is. */
|
|
40
|
+
export type TypedWebhookHandler<T extends string> = (event: WebhookEventFor<T>) => void | Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* What {@link defineWebhookHandler} returns: callable as a plain {@link WebhookHandler} (so
|
|
43
|
+
* it drops straight into `billing.handlers`) AND carrying `type`/`handle` (so it is a valid
|
|
44
|
+
* default export for the `app/payment_handlers/` convention). One value, both wiring styles.
|
|
45
|
+
*/
|
|
46
|
+
export interface WebhookHandlerDefinition<T extends string = string> {
|
|
47
|
+
(event: WebhookEvent): void | Promise<void>;
|
|
48
|
+
readonly type: T;
|
|
49
|
+
readonly handle: WebhookHandler;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Declare a webhook handler for ONE event type, with `event.data` inferred from the type.
|
|
53
|
+
*
|
|
54
|
+
* ```ts
|
|
55
|
+
* export default defineWebhookHandler('payment.disputed', async (event) => {
|
|
56
|
+
* event.data.actionableUntil // DisputeWebhookData — no cast
|
|
57
|
+
* event.data.paidAt // compile error: that is a payment payload
|
|
58
|
+
* })
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* A passthrough type the driver did not map is accepted (it is a real thing a gateway
|
|
62
|
+
* sends), and its `data` is `unknown` because nothing normalized it.
|
|
63
|
+
*/
|
|
64
|
+
export declare function defineWebhookHandler<T extends WebhookEventType | (string & {})>(type: T, handle: TypedWebhookHandler<T>): WebhookHandlerDefinition<T>;
|
|
3
65
|
/**
|
|
4
66
|
* A webhook-handler service constructor: the lib resolves it from the Adonis container
|
|
5
67
|
* (DI works) and calls `handle(event)` for each event of the registered type. A class
|
|
@@ -34,6 +96,13 @@ export declare function resolveWebhookHandler(entry: WebhookHandler | WebhookHan
|
|
|
34
96
|
export interface DiscoveredWebhookHandler {
|
|
35
97
|
type: string;
|
|
36
98
|
entry: WebhookHandler | WebhookHandlerService;
|
|
99
|
+
/**
|
|
100
|
+
* Where it came from — the module path for a scan, the barrel key for a build-time
|
|
101
|
+
* barrel, `config.billing.handlers` for a configured one. Only ever used in messages, and
|
|
102
|
+
* that is the point: "two handlers claim payment.succeeded" is not actionable without the
|
|
103
|
+
* two file names.
|
|
104
|
+
*/
|
|
105
|
+
source?: string;
|
|
37
106
|
}
|
|
38
107
|
/** Shape each file in the conventions folder must default-export. */
|
|
39
108
|
export interface WebhookHandlerModule {
|
|
@@ -41,14 +110,39 @@ export interface WebhookHandlerModule {
|
|
|
41
110
|
* Normalized event type this handler listens to (e.g. `'payment.succeeded'`). A service
|
|
42
111
|
* class declares it as `static eventType` instead.
|
|
43
112
|
*/
|
|
44
|
-
type?: string;
|
|
113
|
+
type?: WebhookEventType | (string & {});
|
|
45
114
|
/** Event-type static on a service class form. */
|
|
46
|
-
eventType?: string;
|
|
115
|
+
eventType?: WebhookEventType | (string & {});
|
|
47
116
|
/** The handler function (object form). */
|
|
48
117
|
handle?: WebhookHandler;
|
|
49
118
|
}
|
|
50
119
|
/** Normalize a module's default export into a {@link DiscoveredWebhookHandler}, or null. */
|
|
51
120
|
export declare function normalizeWebhookHandlerModule(mod: unknown): DiscoveredWebhookHandler | null;
|
|
121
|
+
/**
|
|
122
|
+
* One handler registration, as the boot-time check sees it: which type it claims and where
|
|
123
|
+
* it came from.
|
|
124
|
+
*/
|
|
125
|
+
export interface WebhookHandlerRegistration {
|
|
126
|
+
type: string;
|
|
127
|
+
source: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Refuse, at boot, a handler registered for an event type nothing will ever deliver.
|
|
131
|
+
*
|
|
132
|
+
* The failure this closes is silent end to end: `normalizeWebhookHandlerModule` accepted any
|
|
133
|
+
* string, the provider did `handlers[type] = ...`, and the processor looked up
|
|
134
|
+
* `#handlers[event.type]` and skipped a miss. So `'payment.suceeded'` registered a handler
|
|
135
|
+
* nothing called, the ledger still marked the delivery `processed`, and the grant simply
|
|
136
|
+
* never happened — with a 200 to the gateway promising it never has to send that event
|
|
137
|
+
* again.
|
|
138
|
+
*
|
|
139
|
+
* Two registrations of the SAME type are refused for the same reason: `handlers[type] = ...`
|
|
140
|
+
* overwrites, so the second file silently replaced the first and one of the two handlers
|
|
141
|
+
* never ran again.
|
|
142
|
+
*/
|
|
143
|
+
export declare function assertWebhookHandlerTypes(registrations: readonly WebhookHandlerRegistration[], options?: {
|
|
144
|
+
passthroughEvents?: readonly string[];
|
|
145
|
+
}): void;
|
|
52
146
|
/** The build-time barrel the Assembler `init` hook generates — a map of key → lazy import. */
|
|
53
147
|
export type WebhookHandlersBarrel = Record<string, () => Promise<Record<string, unknown>>>;
|
|
54
148
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook_handlers.d.ts","sourceRoot":"","sources":["../../src/webhook_handlers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG;QAAE,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;CAC/E;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAKtF;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,cAAc,GAAG,qBAAqB,EAC7C,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,cAAc,CAAC,CAMzB;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook_handlers.d.ts","sourceRoot":"","sources":["../../src/webhook_handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { readdir } from 'node:fs/promises';
|
|
2
2
|
import { extname, join } from 'node:path';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { WEBHOOK_EVENT_TYPES } from './billing/webhook_events.js';
|
|
5
|
+
/**
|
|
6
|
+
* Declare a webhook handler for ONE event type, with `event.data` inferred from the type.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* export default defineWebhookHandler('payment.disputed', async (event) => {
|
|
10
|
+
* event.data.actionableUntil // DisputeWebhookData — no cast
|
|
11
|
+
* event.data.paidAt // compile error: that is a payment payload
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* A passthrough type the driver did not map is accepted (it is a real thing a gateway
|
|
16
|
+
* sends), and its `data` is `unknown` because nothing normalized it.
|
|
17
|
+
*/
|
|
18
|
+
export function defineWebhookHandler(type, handle) {
|
|
19
|
+
// The ONE cast, here, instead of one in every application handler. It is sound in exactly
|
|
20
|
+
// the way the app-side cast was not: the type is checked against the same map the payload
|
|
21
|
+
// came from, and validated at boot by `assertWebhookHandlerTypes`.
|
|
22
|
+
const wrapped = (event) => handle(event);
|
|
23
|
+
return Object.assign(wrapped, {
|
|
24
|
+
type,
|
|
25
|
+
handle: wrapped,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
4
28
|
/**
|
|
5
29
|
* Detect a {@link WebhookHandlerService} (a class with a `handle` method) vs a plain
|
|
6
30
|
* handler function. Arrow functions have no prototype; named functions have one without
|
|
@@ -31,17 +55,74 @@ export function normalizeWebhookHandlerModule(mod) {
|
|
|
31
55
|
const type = candidate.type ?? candidate.eventType;
|
|
32
56
|
if (typeof type !== 'string')
|
|
33
57
|
return null;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// Object form: `{ type, handle }`.
|
|
58
|
+
// Service class form: `static eventType` + instance `handle` (on the prototype, so the
|
|
59
|
+
// class itself has no own `handle` and never reaches the branch below).
|
|
60
|
+
if (typeof mod === 'function' && isWebhookHandlerService(mod))
|
|
61
|
+
return { type, entry: mod };
|
|
62
|
+
// Object form `{ type, handle }` — and the function form {@link defineWebhookHandler}
|
|
63
|
+
// returns, which is a callable carrying the same two members.
|
|
41
64
|
if (typeof candidate.handle !== 'function')
|
|
42
65
|
return null;
|
|
43
66
|
return { type, entry: candidate.handle };
|
|
44
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* A type that LOOKS canonical: same namespace as the library's own types, so a typo lands
|
|
70
|
+
* here rather than being waved through as a gateway passthrough.
|
|
71
|
+
*
|
|
72
|
+
* This is the whole honest rule. A driver that cannot map a gateway event passes it through
|
|
73
|
+
* lowercased — Asaas turns `PAYMENT_ANTICIPATED` into `payment_anticipated`, Adyen turns
|
|
74
|
+
* `REPORT_AVAILABLE` into `report_available` — and a library cannot enumerate every event
|
|
75
|
+
* eighteen gateways can send. What it CAN say is that `payment.` and `subscription.`
|
|
76
|
+
* followed by a dot are ITS namespace: every member of {@link WEBHOOK_EVENT_TYPES} is in it,
|
|
77
|
+
* a passthrough of an unmapped event is not (`payment_anticipated` has no dot), and
|
|
78
|
+
* `payment.suceeded` is a misspelling of something the library owns.
|
|
79
|
+
*/
|
|
80
|
+
function isCanonicalNamespace(type) {
|
|
81
|
+
return /^(payment|subscription)\.[a-z_]+$/.test(type);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Refuse, at boot, a handler registered for an event type nothing will ever deliver.
|
|
85
|
+
*
|
|
86
|
+
* The failure this closes is silent end to end: `normalizeWebhookHandlerModule` accepted any
|
|
87
|
+
* string, the provider did `handlers[type] = ...`, and the processor looked up
|
|
88
|
+
* `#handlers[event.type]` and skipped a miss. So `'payment.suceeded'` registered a handler
|
|
89
|
+
* nothing called, the ledger still marked the delivery `processed`, and the grant simply
|
|
90
|
+
* never happened — with a 200 to the gateway promising it never has to send that event
|
|
91
|
+
* again.
|
|
92
|
+
*
|
|
93
|
+
* Two registrations of the SAME type are refused for the same reason: `handlers[type] = ...`
|
|
94
|
+
* overwrites, so the second file silently replaced the first and one of the two handlers
|
|
95
|
+
* never ran again.
|
|
96
|
+
*/
|
|
97
|
+
export function assertWebhookHandlerTypes(registrations, options = {}) {
|
|
98
|
+
const allowed = new Set(options.passthroughEvents ?? []);
|
|
99
|
+
const seen = new Map();
|
|
100
|
+
for (const { type, source } of registrations) {
|
|
101
|
+
const known = WEBHOOK_EVENT_TYPES.includes(type);
|
|
102
|
+
if (!known && !allowed.has(type) && isCanonicalNamespace(type)) {
|
|
103
|
+
throw new Error([
|
|
104
|
+
`[payments] Webhook handler (${source}) is registered for "${type}", which is not a`,
|
|
105
|
+
'normalized event type — nothing will ever call it, and the delivery will still be',
|
|
106
|
+
`recorded as processed. Normalized types: ${WEBHOOK_EVENT_TYPES.join(', ')}.`,
|
|
107
|
+
'A type in the `payment.*`/`subscription.*` namespace must be one of those, because',
|
|
108
|
+
"that namespace is the library's own. A gateway type the driver could not map arrives",
|
|
109
|
+
'lowercased as the gateway spells it (Asaas `PAYMENT_ANTICIPATED` →',
|
|
110
|
+
'"payment_anticipated"), which is accepted as-is; if your gateway really does spell one',
|
|
111
|
+
'with a dot in this namespace, list it in `billing.passthroughEvents`.',
|
|
112
|
+
].join(' '));
|
|
113
|
+
}
|
|
114
|
+
const previous = seen.get(type);
|
|
115
|
+
if (previous !== undefined) {
|
|
116
|
+
throw new Error([
|
|
117
|
+
`[payments] Two webhook handlers claim "${type}": ${previous} and ${source}.`,
|
|
118
|
+
'Registration is a map keyed by event type, so the second silently replaced the first',
|
|
119
|
+
'and one of them would never run. Keep one handler per type (call the other from it)',
|
|
120
|
+
'or give them different types.',
|
|
121
|
+
].join(' '));
|
|
122
|
+
}
|
|
123
|
+
seen.set(type, source);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
45
126
|
/**
|
|
46
127
|
* Load the generated barrel (`.adonisjs/payments/webhook_handlers.js`) — the build-time
|
|
47
128
|
* equivalent of a directory scan, with no runtime `readdir`. Each module's default export
|
|
@@ -50,7 +131,7 @@ export function normalizeWebhookHandlerModule(mod) {
|
|
|
50
131
|
export async function loadWebhookHandlersFromBarrel(barrel) {
|
|
51
132
|
const found = [];
|
|
52
133
|
const seen = new Set();
|
|
53
|
-
for (const load of Object.
|
|
134
|
+
for (const [key, load] of Object.entries(barrel)) {
|
|
54
135
|
const mod = await load();
|
|
55
136
|
for (const exported of Object.values(mod)) {
|
|
56
137
|
if (seen.has(exported))
|
|
@@ -59,7 +140,7 @@ export async function loadWebhookHandlersFromBarrel(barrel) {
|
|
|
59
140
|
if (!normalized)
|
|
60
141
|
continue;
|
|
61
142
|
seen.add(exported);
|
|
62
|
-
found.push(normalized);
|
|
143
|
+
found.push({ ...normalized, source: key });
|
|
63
144
|
}
|
|
64
145
|
}
|
|
65
146
|
return found;
|
|
@@ -121,7 +202,7 @@ export async function discoverWebhookHandlers(dir) {
|
|
|
121
202
|
if (seen.has(normalized.entry))
|
|
122
203
|
continue;
|
|
123
204
|
seen.add(normalized.entry);
|
|
124
|
-
found.push(normalized);
|
|
205
|
+
found.push({ ...normalized, source: join(dir, entry) });
|
|
125
206
|
}
|
|
126
207
|
return found;
|
|
127
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook_handlers.js","sourceRoot":"","sources":["../../src/webhook_handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook_handlers.js","sourceRoot":"","sources":["../../src/webhook_handlers.ts"],"names":[],"mappings":"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"}
|