@adonis-agora/payments 0.2.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 (222) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/commands/main.d.ts +16 -0
  3. package/dist/commands/main.d.ts.map +1 -0
  4. package/dist/commands/main.js +17 -0
  5. package/dist/commands/main.js.map +1 -0
  6. package/dist/commands/make_billable.d.ts +16 -0
  7. package/dist/commands/make_billable.d.ts.map +1 -0
  8. package/dist/commands/make_billable.js +30 -0
  9. package/dist/commands/make_billable.js.map +1 -0
  10. package/dist/commands/make_webhook_handler.d.ts +20 -0
  11. package/dist/commands/make_webhook_handler.d.ts.map +1 -0
  12. package/dist/commands/make_webhook_handler.js +34 -0
  13. package/dist/commands/make_webhook_handler.js.map +1 -0
  14. package/dist/commands/payments_sync.d.ts +20 -0
  15. package/dist/commands/payments_sync.d.ts.map +1 -0
  16. package/dist/commands/payments_sync.js +95 -0
  17. package/dist/commands/payments_sync.js.map +1 -0
  18. package/dist/commands/payments_webhook.d.ts +19 -0
  19. package/dist/commands/payments_webhook.d.ts.map +1 -0
  20. package/dist/commands/payments_webhook.js +123 -0
  21. package/dist/commands/payments_webhook.js.map +1 -0
  22. package/dist/configure.d.ts +12 -0
  23. package/dist/configure.d.ts.map +1 -0
  24. package/dist/configure.js +34 -0
  25. package/dist/configure.js.map +1 -0
  26. package/dist/providers/payments_provider.d.ts +15 -0
  27. package/dist/providers/payments_provider.d.ts.map +1 -0
  28. package/dist/providers/payments_provider.js +155 -0
  29. package/dist/providers/payments_provider.js.map +1 -0
  30. package/dist/src/billing/billing_overview.d.ts +26 -0
  31. package/dist/src/billing/billing_overview.d.ts.map +1 -0
  32. package/dist/src/billing/billing_overview.js +27 -0
  33. package/dist/src/billing/billing_overview.js.map +1 -0
  34. package/dist/src/billing/billing_store.d.ts +73 -0
  35. package/dist/src/billing/billing_store.d.ts.map +1 -0
  36. package/dist/src/billing/billing_store.js +2 -0
  37. package/dist/src/billing/billing_store.js.map +1 -0
  38. package/dist/src/billing/index.d.ts +8 -0
  39. package/dist/src/billing/index.d.ts.map +1 -0
  40. package/dist/src/billing/index.js +6 -0
  41. package/dist/src/billing/index.js.map +1 -0
  42. package/dist/src/billing/lucid_billing_store.d.ts +84 -0
  43. package/dist/src/billing/lucid_billing_store.d.ts.map +1 -0
  44. package/dist/src/billing/lucid_billing_store.js +143 -0
  45. package/dist/src/billing/lucid_billing_store.js.map +1 -0
  46. package/dist/src/billing/metered_bill.d.ts +60 -0
  47. package/dist/src/billing/metered_bill.d.ts.map +1 -0
  48. package/dist/src/billing/metered_bill.js +46 -0
  49. package/dist/src/billing/metered_bill.js.map +1 -0
  50. package/dist/src/billing/mixins/index.d.ts +6 -0
  51. package/dist/src/billing/mixins/index.d.ts.map +1 -0
  52. package/dist/src/billing/mixins/index.js +6 -0
  53. package/dist/src/billing/mixins/index.js.map +1 -0
  54. package/dist/src/billing/mixins/with_billable.d.ts +23 -0
  55. package/dist/src/billing/mixins/with_billable.d.ts.map +1 -0
  56. package/dist/src/billing/mixins/with_billable.js +33 -0
  57. package/dist/src/billing/mixins/with_billable.js.map +1 -0
  58. package/dist/src/billing/mixins/with_payment.d.ts +45 -0
  59. package/dist/src/billing/mixins/with_payment.d.ts.map +1 -0
  60. package/dist/src/billing/mixins/with_payment.js +94 -0
  61. package/dist/src/billing/mixins/with_payment.js.map +1 -0
  62. package/dist/src/billing/mixins/with_subscription.d.ts +50 -0
  63. package/dist/src/billing/mixins/with_subscription.d.ts.map +1 -0
  64. package/dist/src/billing/mixins/with_subscription.js +95 -0
  65. package/dist/src/billing/mixins/with_subscription.js.map +1 -0
  66. package/dist/src/billing/mixins/with_usage_event.d.ts +22 -0
  67. package/dist/src/billing/mixins/with_usage_event.d.ts.map +1 -0
  68. package/dist/src/billing/mixins/with_usage_event.js +39 -0
  69. package/dist/src/billing/mixins/with_usage_event.js.map +1 -0
  70. package/dist/src/billing/mixins/with_webhook_event.d.ts +21 -0
  71. package/dist/src/billing/mixins/with_webhook_event.d.ts.map +1 -0
  72. package/dist/src/billing/mixins/with_webhook_event.js +42 -0
  73. package/dist/src/billing/mixins/with_webhook_event.js.map +1 -0
  74. package/dist/src/billing/webhook_dispatcher.d.ts +79 -0
  75. package/dist/src/billing/webhook_dispatcher.d.ts.map +1 -0
  76. package/dist/src/billing/webhook_dispatcher.js +125 -0
  77. package/dist/src/billing/webhook_dispatcher.js.map +1 -0
  78. package/dist/src/billing/webhook_events.d.ts +49 -0
  79. package/dist/src/billing/webhook_events.d.ts.map +1 -0
  80. package/dist/src/billing/webhook_events.js +44 -0
  81. package/dist/src/billing/webhook_events.js.map +1 -0
  82. package/dist/src/billing/webhook_processor.d.ts +39 -0
  83. package/dist/src/billing/webhook_processor.d.ts.map +1 -0
  84. package/dist/src/billing/webhook_processor.js +209 -0
  85. package/dist/src/billing/webhook_processor.js.map +1 -0
  86. package/dist/src/define_config.d.ts +251 -0
  87. package/dist/src/define_config.d.ts.map +1 -0
  88. package/dist/src/define_config.js +67 -0
  89. package/dist/src/define_config.js.map +1 -0
  90. package/dist/src/diagnostics.d.ts +155 -0
  91. package/dist/src/diagnostics.d.ts.map +1 -0
  92. package/dist/src/diagnostics.js +153 -0
  93. package/dist/src/diagnostics.js.map +1 -0
  94. package/dist/src/driver.d.ts +222 -0
  95. package/dist/src/driver.d.ts.map +1 -0
  96. package/dist/src/driver.js +2 -0
  97. package/dist/src/driver.js.map +1 -0
  98. package/dist/src/drivers/abacate.d.ts +35 -0
  99. package/dist/src/drivers/abacate.d.ts.map +1 -0
  100. package/dist/src/drivers/abacate.js +381 -0
  101. package/dist/src/drivers/abacate.js.map +1 -0
  102. package/dist/src/drivers/asaas.d.ts +36 -0
  103. package/dist/src/drivers/asaas.d.ts.map +1 -0
  104. package/dist/src/drivers/asaas.js +455 -0
  105. package/dist/src/drivers/asaas.js.map +1 -0
  106. package/dist/src/drivers/stripe.d.ts +36 -0
  107. package/dist/src/drivers/stripe.d.ts.map +1 -0
  108. package/dist/src/drivers/stripe.js +392 -0
  109. package/dist/src/drivers/stripe.js.map +1 -0
  110. package/dist/src/drivers/woovi.d.ts +49 -0
  111. package/dist/src/drivers/woovi.d.ts.map +1 -0
  112. package/dist/src/drivers/woovi.js +339 -0
  113. package/dist/src/drivers/woovi.js.map +1 -0
  114. package/dist/src/ensure_customer.d.ts +23 -0
  115. package/dist/src/ensure_customer.d.ts.map +1 -0
  116. package/dist/src/ensure_customer.js +25 -0
  117. package/dist/src/ensure_customer.js.map +1 -0
  118. package/dist/src/hooks/webhook_handlers.d.ts +50 -0
  119. package/dist/src/hooks/webhook_handlers.d.ts.map +1 -0
  120. package/dist/src/hooks/webhook_handlers.js +53 -0
  121. package/dist/src/hooks/webhook_handlers.js.map +1 -0
  122. package/dist/src/http.d.ts +24 -0
  123. package/dist/src/http.d.ts.map +1 -0
  124. package/dist/src/http.js +52 -0
  125. package/dist/src/http.js.map +1 -0
  126. package/dist/src/index.d.ts +29 -0
  127. package/dist/src/index.d.ts.map +1 -0
  128. package/dist/src/index.js +15 -0
  129. package/dist/src/index.js.map +1 -0
  130. package/dist/src/invoice/drivers/asaas.d.ts +23 -0
  131. package/dist/src/invoice/drivers/asaas.d.ts.map +1 -0
  132. package/dist/src/invoice/drivers/asaas.js +85 -0
  133. package/dist/src/invoice/drivers/asaas.js.map +1 -0
  134. package/dist/src/invoice/drivers/enotas.d.ts +23 -0
  135. package/dist/src/invoice/drivers/enotas.d.ts.map +1 -0
  136. package/dist/src/invoice/drivers/enotas.js +83 -0
  137. package/dist/src/invoice/drivers/enotas.js.map +1 -0
  138. package/dist/src/invoice/drivers/focus.d.ts +23 -0
  139. package/dist/src/invoice/drivers/focus.d.ts.map +1 -0
  140. package/dist/src/invoice/drivers/focus.js +90 -0
  141. package/dist/src/invoice/drivers/focus.js.map +1 -0
  142. package/dist/src/invoice/drivers/plugnotas.d.ts +22 -0
  143. package/dist/src/invoice/drivers/plugnotas.d.ts.map +1 -0
  144. package/dist/src/invoice/drivers/plugnotas.js +81 -0
  145. package/dist/src/invoice/drivers/plugnotas.js.map +1 -0
  146. package/dist/src/invoice/drivers/tecnospeed.d.ts +29 -0
  147. package/dist/src/invoice/drivers/tecnospeed.d.ts.map +1 -0
  148. package/dist/src/invoice/drivers/tecnospeed.js +87 -0
  149. package/dist/src/invoice/drivers/tecnospeed.js.map +1 -0
  150. package/dist/src/invoice/emit_invoice.d.ts +45 -0
  151. package/dist/src/invoice/emit_invoice.d.ts.map +1 -0
  152. package/dist/src/invoice/emit_invoice.js +72 -0
  153. package/dist/src/invoice/emit_invoice.js.map +1 -0
  154. package/dist/src/invoice/invoice_manager.d.ts +12 -0
  155. package/dist/src/invoice/invoice_manager.d.ts.map +1 -0
  156. package/dist/src/invoice/invoice_manager.js +35 -0
  157. package/dist/src/invoice/invoice_manager.js.map +1 -0
  158. package/dist/src/invoice/invoice_provider.d.ts +48 -0
  159. package/dist/src/invoice/invoice_provider.d.ts.map +1 -0
  160. package/dist/src/invoice/invoice_provider.js +2 -0
  161. package/dist/src/invoice/invoice_provider.js.map +1 -0
  162. package/dist/src/money.d.ts +11 -0
  163. package/dist/src/money.d.ts.map +1 -0
  164. package/dist/src/money.js +14 -0
  165. package/dist/src/money.js.map +1 -0
  166. package/dist/src/payments_manager.d.ts +40 -0
  167. package/dist/src/payments_manager.d.ts.map +1 -0
  168. package/dist/src/payments_manager.js +94 -0
  169. package/dist/src/payments_manager.js.map +1 -0
  170. package/dist/src/services/main.d.ts +6 -0
  171. package/dist/src/services/main.d.ts.map +1 -0
  172. package/dist/src/services/main.js +17 -0
  173. package/dist/src/services/main.js.map +1 -0
  174. package/dist/src/telescope/index.d.ts +3 -0
  175. package/dist/src/telescope/index.d.ts.map +1 -0
  176. package/dist/src/telescope/index.js +2 -0
  177. package/dist/src/telescope/index.js.map +1 -0
  178. package/dist/src/telescope/payments_watcher.d.ts +27 -0
  179. package/dist/src/telescope/payments_watcher.d.ts.map +1 -0
  180. package/dist/src/telescope/payments_watcher.js +58 -0
  181. package/dist/src/telescope/payments_watcher.js.map +1 -0
  182. package/dist/src/telescope/telescope-sdk.d.ts +21 -0
  183. package/dist/src/telescope/telescope-sdk.d.ts.map +1 -0
  184. package/dist/src/telescope/telescope-sdk.js +11 -0
  185. package/dist/src/telescope/telescope-sdk.js.map +1 -0
  186. package/dist/src/testing/fake_payments_driver.d.ts +64 -0
  187. package/dist/src/testing/fake_payments_driver.d.ts.map +1 -0
  188. package/dist/src/testing/fake_payments_driver.js +171 -0
  189. package/dist/src/testing/fake_payments_driver.js.map +1 -0
  190. package/dist/src/testing/in_memory_billing_store.d.ts +110 -0
  191. package/dist/src/testing/in_memory_billing_store.d.ts.map +1 -0
  192. package/dist/src/testing/in_memory_billing_store.js +136 -0
  193. package/dist/src/testing/in_memory_billing_store.js.map +1 -0
  194. package/dist/src/testing/index.d.ts +6 -0
  195. package/dist/src/testing/index.d.ts.map +1 -0
  196. package/dist/src/testing/index.js +4 -0
  197. package/dist/src/testing/index.js.map +1 -0
  198. package/dist/src/testing/mutable_clock.d.ts +12 -0
  199. package/dist/src/testing/mutable_clock.d.ts.map +1 -0
  200. package/dist/src/testing/mutable_clock.js +20 -0
  201. package/dist/src/testing/mutable_clock.js.map +1 -0
  202. package/dist/src/types.d.ts +178 -0
  203. package/dist/src/types.d.ts.map +1 -0
  204. package/dist/src/types.js +9 -0
  205. package/dist/src/types.js.map +1 -0
  206. package/dist/src/webhook_handlers.d.ts +76 -0
  207. package/dist/src/webhook_handlers.d.ts.map +1 -0
  208. package/dist/src/webhook_handlers.js +128 -0
  209. package/dist/src/webhook_handlers.js.map +1 -0
  210. package/dist/src/webhook_security.d.ts +29 -0
  211. package/dist/src/webhook_security.d.ts.map +1 -0
  212. package/dist/src/webhook_security.js +53 -0
  213. package/dist/src/webhook_security.js.map +1 -0
  214. package/dist/stubs/config/payments.stub +101 -0
  215. package/dist/stubs/database/migrations/create_billing_tables.stub +90 -0
  216. package/dist/stubs/main.d.ts +9 -0
  217. package/dist/stubs/main.d.ts.map +1 -0
  218. package/dist/stubs/main.js +16 -0
  219. package/dist/stubs/main.js.map +1 -0
  220. package/dist/stubs/make/billable/main.stub +28 -0
  221. package/dist/stubs/make/webhook_handler/main.stub +29 -0
  222. package/package.json +150 -0
@@ -0,0 +1,251 @@
1
+ import type { WebhookHandler } from './billing/webhook_processor.js';
2
+ import type { PaymentsDriver } from './driver.js';
3
+ import type { InvoiceProvider } from './invoice/invoice_provider.js';
4
+ import type { InvoiceOptions, PaymentMethodName } from './types.js';
5
+ import type { WebhookHandlerService } from './webhook_handlers.js';
6
+ /**
7
+ * A lazy factory that builds a {@link PaymentsDriver}. Each driver factory imports its
8
+ * peer dependency (the Stripe SDK, etc.) lazily inside the thunk, so it only loads when
9
+ * that driver is actually selected — making every gateway SDK an optional peer.
10
+ */
11
+ export type PaymentsDriverFactory = (ctx: PaymentsContext) => Promise<PaymentsDriver>;
12
+ /** A lazy factory that builds an {@link InvoiceProvider} (Focus, Tecnospeed, eNotas, PlugNotas). */
13
+ export type InvoiceProviderFactory = (ctx: InvoiceContext) => Promise<InvoiceProvider>;
14
+ /** `config.billing.handlers` — normalized webhook event type → handler. */
15
+ export type BillingHandlers = Record<string, WebhookHandler | WebhookHandlerService>;
16
+ /** Context handed to driver factories when the provider resolves them. */
17
+ export interface PaymentsContext {
18
+ /** Lazy import of the package's own config (circular-import safe). */
19
+ config: () => PaymentsConfig;
20
+ /** Resolve an invoice provider by name (falls back to the configured default). */
21
+ invoice?: (name?: string) => InvoiceProvider;
22
+ }
23
+ /** Context handed to invoice provider factories. */
24
+ export interface InvoiceContext {
25
+ /** Lazy import of the package's own invoice config section. */
26
+ config: () => InvoiceSectionConfig;
27
+ }
28
+ export interface StripeDriverConfig {
29
+ /** Stripe secret key. Defaults to `env.get('STRIPE_KEY')`. */
30
+ apiKey?: string;
31
+ /** Default currency. Defaults to `'brl'`. */
32
+ currency?: string;
33
+ /**
34
+ * Webhook signing secret (`whsec_...`) used to verify `stripe-signature`. Defaults
35
+ * to `env.get('STRIPE_WEBHOOK_SECRET')`. Required to parse Stripe webhooks.
36
+ */
37
+ webhookSecret?: string;
38
+ }
39
+ export interface AbacateDriverConfig {
40
+ /** AbacatePay API token. Defaults to `env.get('ABACATE_API_KEY')`. */
41
+ apiKey?: string;
42
+ /** Public key used to verify webhook HMAC signatures. */
43
+ publicKey?: string;
44
+ /**
45
+ * HMAC secret that signs AbacatePay webhooks (the dashboard's "public key").
46
+ * Alias of {@link publicKey}; defaults to `env.get('ABACATE_PUBLIC_KEY')`. When set,
47
+ * webhooks without a valid `x-webhook-signature` are rejected.
48
+ */
49
+ webhookSecret?: string;
50
+ }
51
+ export interface AsaasDriverConfig {
52
+ /** Asaas API key. Defaults to `env.get('ASAAS_API_KEY')`. */
53
+ apiKey?: string;
54
+ /** Use the Asaas sandbox environment. Defaults to `NODE_ENV !== 'production'`. */
55
+ sandbox?: boolean;
56
+ /**
57
+ * Shared webhook token configured in the Asaas dashboard. Defaults to
58
+ * `env.get('ASAAS_WEBHOOK_ACCESS_TOKEN')` (or `ASAAS_WEBHOOK_TOKEN`). When set,
59
+ * webhooks without the matching token header are rejected.
60
+ */
61
+ webhookToken?: string;
62
+ }
63
+ export interface FocusInvoiceConfig {
64
+ /** Focus NFe API token. Defaults to `env.get('FOCUS_NFE_TOKEN')`. */
65
+ token?: string;
66
+ /** Focus NFe API URL. Defaults to the production endpoint. */
67
+ baseUrl?: string;
68
+ }
69
+ export interface ENotasInvoiceConfig {
70
+ /** eNotas API key. Defaults to `env.get('ENOTAS_API_KEY')`. */
71
+ apiKey?: string;
72
+ /** eNotas API URL. Defaults to the production endpoint. */
73
+ baseUrl?: string;
74
+ }
75
+ export interface PlugNotasInvoiceConfig {
76
+ /** PlugNotas API key. Defaults to `env.get('PLUGNOTAS_API_KEY')`. */
77
+ apiKey?: string;
78
+ /** PlugNotas API URL. Defaults to the production endpoint. */
79
+ baseUrl?: string;
80
+ }
81
+ export interface AsaasInvoiceConfig {
82
+ /** Asaas API key. Defaults to `env.get('ASAAS_API_KEY')`. */
83
+ apiKey?: string;
84
+ /** Use the Asaas sandbox environment. Defaults to `NODE_ENV !== 'production'`. */
85
+ sandbox?: boolean;
86
+ }
87
+ export interface TecnospeedInvoiceConfig {
88
+ /** Tecnospeed API token. Defaults to `env.get('TECNOSPEED_TOKEN')`. */
89
+ token?: string;
90
+ /** Tecnospeed API base URL (per-municipality/plan). Defaults to the generic v1 base. */
91
+ baseUrl?: string;
92
+ }
93
+ export interface WooviDriverConfig {
94
+ /** Woovi/OpenPix app id. Defaults to `env.get('WOOVI_APP_ID')`. */
95
+ appId?: string;
96
+ /** Base URL of the OpenPix API. Defaults to production. */
97
+ baseUrl?: string;
98
+ /**
99
+ * Per-webhook HMAC secret (dashboard → API/Plugins). Verifies the deprecated
100
+ * `X-OpenPix-Signature` header. Defaults to `env.get('WOOVI_WEBHOOK_SECRET')`.
101
+ * Prefer {@link webhookPublicKey}.
102
+ */
103
+ webhookSecret?: string;
104
+ /**
105
+ * Woovi account public key, used to verify the recommended `x-webhook-signature`
106
+ * header (RSA-SHA256). PEM or base64-encoded PEM; defaults to
107
+ * `env.get('WOOVI_WEBHOOK_PUBLIC_KEY')`.
108
+ */
109
+ webhookPublicKey?: string;
110
+ }
111
+ /**
112
+ * Shape of `config/payments.ts`.
113
+ *
114
+ * Both payment gateways and invoice providers are named maps with a `default` — so a
115
+ * charge call either just works with the defaults, or names a specific provider per call.
116
+ *
117
+ * ```ts
118
+ * import { defineConfig, payments, invoice } from '@adonis-agora/payments'
119
+ *
120
+ * export default defineConfig({
121
+ * default: 'stripe',
122
+ * providers: {
123
+ * stripe: payments.stripe(),
124
+ * asaas: payments.asaas({ sandbox: true }),
125
+ * },
126
+ * invoice: {
127
+ * default: 'focus',
128
+ * providers: {
129
+ * focus: invoice.focus(),
130
+ * // Custom providers are plain factories too.
131
+ * myProvider: () => import('#services/my_invoice').then((m) => new m.MyInvoiceProvider()),
132
+ * },
133
+ * defaults: {
134
+ * service: { description: 'Software license' },
135
+ * },
136
+ * },
137
+ * billing: {
138
+ * enabled: true,
139
+ * durable: 'auto',
140
+ * },
141
+ * })
142
+ * ```
143
+ */
144
+ export interface PaymentsConfig {
145
+ /** Name of the default payment provider (a key of `providers`). */
146
+ default?: string;
147
+ /** Named payment providers, built with the {@link payments} factory. */
148
+ providers?: Record<string, PaymentsDriverFactory>;
149
+ /**
150
+ * Route a payment method to a provider name (a key of `providers`). Resolves the
151
+ * driver per method on a charge call.
152
+ *
153
+ * ```ts
154
+ * methods: {
155
+ * pix: 'woovi', // Pix via Woovi/OpenPix
156
+ * credit_card: 'stripe', // card via Stripe
157
+ * boleto: 'asaas', // boleto via Asaas
158
+ * debit_card: 'asaas',
159
+ * undefined: 'asaas', // customer picks at checkout
160
+ * }
161
+ * ```
162
+ */
163
+ methods?: Partial<Record<PaymentMethodName, string>>;
164
+ /** Invoice emission settings. */
165
+ invoice?: InvoiceSectionConfig;
166
+ /** Billing (subscription) layer settings. */
167
+ billing?: {
168
+ /**
169
+ * Whether the Lucid billing layer is enabled. When enabled the provider wires the
170
+ * billing stores, mixins and webhook processor. Defaults to true.
171
+ */
172
+ enabled?: boolean;
173
+ /**
174
+ * Legacy alias for {@link dispatcher}: `'auto'` (default) or a boolean (`true` =
175
+ * `'durable'`, `false` = `'in-process'`). Prefer `dispatcher` for the full set of
176
+ * backends.
177
+ */
178
+ durable?: 'auto' | boolean;
179
+ /**
180
+ * How webhook events are processed:
181
+ *
182
+ * - `'auto'` (default) — `@adonis-agora/durable` when its provider is registered;
183
+ * else `@adonisjs/queue` when it's installed; else in-process with retries.
184
+ * - `'durable'` — a durable workflow run (requires `@adonis-agora/durable`, throws when missing).
185
+ * - `'queue'` — an `@adonisjs/queue` job (requires the queue provider, throws when missing).
186
+ * - `'in-process'` — inline with exponential-backoff retries.
187
+ *
188
+ * Mirrors how other Agora libraries pick a backend (`durable`'s `store`, etc.).
189
+ */
190
+ dispatcher?: 'auto' | 'durable' | 'queue' | 'in-process';
191
+ /** Queue name the `'queue'` dispatcher enqueues to. Defaults to the queue's default. */
192
+ queue?: string;
193
+ /**
194
+ * Business webhook handlers run INSIDE the lib-mounted `/payments/webhook/:provider`
195
+ * route, by the {@link WebhookProcessor}. Errors mark the event failed in the ledger
196
+ * and trigger the dispatcher's retry. An alternative to subscribing to the
197
+ * `agora:payments:billing:*` events — pick whichever fits the app (events for
198
+ * fire-and-forget, handlers here for error-driven retry).
199
+ *
200
+ * Keyed by the normalized event type (e.g. `'payment.succeeded'`). Each factory
201
+ * receives the AdonisJS container and returns the handler, so it can resolve DI
202
+ * services lazily:
203
+ *
204
+ * ```ts
205
+ * handlers: {
206
+ * 'payment.succeeded': async ({ app }) => {
207
+ * const svc = await app.container.make(MeetingPackageService)
208
+ * return (event) => svc.handlePayment(event)
209
+ * },
210
+ * }
211
+ * ```
212
+ */
213
+ handlers?: BillingHandlers;
214
+ };
215
+ }
216
+ /**
217
+ * Identity helper giving `config/payments.ts` full type-checking (media/durable pattern).
218
+ */
219
+ export declare function defineConfig<const T extends PaymentsConfig>(config: T): T;
220
+ /** Built-in driver factories. Each lazily imports its gateway SDK. */
221
+ export declare const payments: {
222
+ stripe(config?: StripeDriverConfig): PaymentsDriverFactory;
223
+ abacate(config?: AbacateDriverConfig): PaymentsDriverFactory;
224
+ asaas(config?: AsaasDriverConfig): PaymentsDriverFactory;
225
+ woovi(config?: WooviDriverConfig): PaymentsDriverFactory;
226
+ };
227
+ /** Built-in invoice provider factories. Each lazily imports its provider module. */
228
+ export declare const invoice: {
229
+ focus(config?: FocusInvoiceConfig): InvoiceProviderFactory;
230
+ enotas(config?: ENotasInvoiceConfig): InvoiceProviderFactory;
231
+ plugnotas(config?: PlugNotasInvoiceConfig): InvoiceProviderFactory;
232
+ asaas(config?: AsaasInvoiceConfig): InvoiceProviderFactory;
233
+ tecnospeed(config?: TecnospeedInvoiceConfig): InvoiceProviderFactory;
234
+ };
235
+ export type { PaymentsDriver, InvoiceProvider };
236
+ /** Invoice emission settings (the `invoice` key of {@link PaymentsConfig}). */
237
+ export interface InvoiceSectionConfig {
238
+ /** Name of the default invoice provider (a key of `invoice.providers`). */
239
+ default?: string;
240
+ /** Named invoice providers, built with the {@link invoice} factory. */
241
+ providers?: Record<string, InvoiceProviderFactory>;
242
+ /** Defaults merged into every `invoice` option. */
243
+ defaults?: {
244
+ service?: InvoiceOptions['service'];
245
+ tax?: InvoiceOptions['tax'];
246
+ metadata?: InvoiceOptions['metadata'];
247
+ };
248
+ }
249
+ export type { InvoiceConfig };
250
+ type InvoiceConfig = InvoiceSectionConfig;
251
+ //# sourceMappingURL=define_config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Identity helper giving `config/payments.ts` full type-checking (media/durable pattern).
3
+ */
4
+ export function defineConfig(config) {
5
+ return config;
6
+ }
7
+ /** Built-in driver factories. Each lazily imports its gateway SDK. */
8
+ export const payments = {
9
+ stripe(config = {}) {
10
+ return async (ctx) => {
11
+ const { StripeDriver } = await import('./drivers/stripe.js');
12
+ return new StripeDriver(ctx, config);
13
+ };
14
+ },
15
+ abacate(config = {}) {
16
+ return async (ctx) => {
17
+ const { AbacateDriver } = await import('./drivers/abacate.js');
18
+ return new AbacateDriver(ctx, config);
19
+ };
20
+ },
21
+ asaas(config = {}) {
22
+ return async (ctx) => {
23
+ const { AsaasDriver } = await import('./drivers/asaas.js');
24
+ return new AsaasDriver(ctx, config);
25
+ };
26
+ },
27
+ woovi(config = {}) {
28
+ return async (ctx) => {
29
+ const { WooviDriver } = await import('./drivers/woovi.js');
30
+ return new WooviDriver(ctx, config);
31
+ };
32
+ },
33
+ };
34
+ /** Built-in invoice provider factories. Each lazily imports its provider module. */
35
+ export const invoice = {
36
+ focus(config = {}) {
37
+ return async (ctx) => {
38
+ const { FocusInvoiceProvider } = await import('./invoice/drivers/focus.js');
39
+ return new FocusInvoiceProvider(ctx, config);
40
+ };
41
+ },
42
+ enotas(config = {}) {
43
+ return async (ctx) => {
44
+ const { ENotasInvoiceProvider } = await import('./invoice/drivers/enotas.js');
45
+ return new ENotasInvoiceProvider(ctx, config);
46
+ };
47
+ },
48
+ plugnotas(config = {}) {
49
+ return async (ctx) => {
50
+ const { PlugNotasInvoiceProvider } = await import('./invoice/drivers/plugnotas.js');
51
+ return new PlugNotasInvoiceProvider(ctx, config);
52
+ };
53
+ },
54
+ asaas(config = {}) {
55
+ return async (ctx) => {
56
+ const { AsaasInvoiceProvider } = await import('./invoice/drivers/asaas.js');
57
+ return new AsaasInvoiceProvider(ctx, config);
58
+ };
59
+ },
60
+ tecnospeed(config = {}) {
61
+ return async (ctx) => {
62
+ const { TecnospeedInvoiceProvider } = await import('./invoice/drivers/tecnospeed.js');
63
+ return new TecnospeedInvoiceProvider(ctx, config);
64
+ };
65
+ },
66
+ };
67
+ //# sourceMappingURL=define_config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * The `@adonis-agora/diagnostics` emit capability, published on this global slot at that
3
+ * package's module load. `@adonis-agora/payments` reads it STRUCTURALLY — it never imports
4
+ * or depends on the diagnostics package. When diagnostics isn't installed the slot is
5
+ * empty and emitting is an inert no-op. (Same pattern as `@adonis-agora/media`.)
6
+ */
7
+ import type { Payment, Subscription } from './types.js';
8
+ /**
9
+ * Every payments milestone published on `agora:payments:<event>`. The single runtime
10
+ * source for the {@link PaymentsDiagnosticEvent} union — a Telescope watcher iterates
11
+ * this to subscribe/claim, and apps subscribe with `onDiagnostic('payments', ...)`.
12
+ *
13
+ * Two layers:
14
+ * - **Gateway-action** events, emitted by the drivers on API calls (`charge.created`,
15
+ * `charge.refunded`, `subscription.created`/`canceled`, `invoice.emitted`).
16
+ * - **Business** events, emitted by the `WebhookProcessor` when a webhook confirms a
17
+ * state change (`payment.succeeded`/`failed`/`refunded`/`updated`,
18
+ * `subscription.updated`, plus `subscription.created`/`canceled` from webhooks) and
19
+ * the webhook lifecycle (`webhook.received`/`processed`/`failed`).
20
+ */
21
+ export declare const PAYMENTS_DIAGNOSTIC_EVENTS: readonly ["charge.created", "charge.refunded", "subscription.created", "subscription.updated", "subscription.canceled", "payment.succeeded", "payment.failed", "payment.refunded", "payment.updated", "invoice.emitted", "webhook.received", "webhook.processed", "webhook.failed"];
22
+ export type PaymentsDiagnosticEvent = (typeof PAYMENTS_DIAGNOSTIC_EVENTS)[number];
23
+ /**
24
+ * Claim `payments:<event>` for every event, so the generic diagnostics→telescope bridge
25
+ * skips them. Reference-counted (mirrors `@adonis-agora/diagnostics`'
26
+ * `claimDiagnostics`).
27
+ */
28
+ export declare function claimPaymentsDiagnostics(events: readonly string[]): () => void;
29
+ /** Whether `payments:<event>` is currently claimed. */
30
+ export declare function isPaymentsDiagnosticClaimed(event: string): boolean;
31
+ export interface ChargeCreatedPayload {
32
+ gatewayId: string;
33
+ provider: string;
34
+ amount: number;
35
+ currency: string;
36
+ method?: string;
37
+ }
38
+ export interface ChargeRefundedPayload {
39
+ gatewayId: string;
40
+ provider: string;
41
+ amount: number;
42
+ currency: string;
43
+ }
44
+ export interface SubscriptionCreatedPayload {
45
+ gatewayId: string;
46
+ provider: string;
47
+ customerId: string;
48
+ planId: string;
49
+ }
50
+ export interface SubscriptionUpdatedPayload {
51
+ gatewayId: string;
52
+ provider: string;
53
+ customerId: string;
54
+ status: string;
55
+ }
56
+ export interface SubscriptionCanceledPayload {
57
+ gatewayId: string;
58
+ provider: string;
59
+ }
60
+ /** Webhook-confirmed payment (normalized business event). */
61
+ export interface PaymentSucceededPayload {
62
+ gatewayId: string;
63
+ provider: string;
64
+ amount: number;
65
+ currency: string;
66
+ /** The `externalReference` the app set on the charge, echoed back by the gateway. */
67
+ externalReference?: string;
68
+ }
69
+ export interface PaymentFailedPayload {
70
+ gatewayId: string;
71
+ provider: string;
72
+ amount: number;
73
+ currency: string;
74
+ reason?: string;
75
+ externalReference?: string;
76
+ }
77
+ export interface PaymentRefundedPayload {
78
+ gatewayId: string;
79
+ provider: string;
80
+ amount: number;
81
+ currency: string;
82
+ }
83
+ export interface PaymentUpdatedPayload {
84
+ gatewayId: string;
85
+ provider: string;
86
+ status: string;
87
+ }
88
+ export interface InvoiceEmittedPayload {
89
+ gatewayId: string;
90
+ provider: string;
91
+ number?: string;
92
+ url?: string;
93
+ }
94
+ export interface WebhookReceivedPayload {
95
+ id: string;
96
+ provider: string;
97
+ type: string;
98
+ }
99
+ export interface WebhookProcessedPayload {
100
+ id: string;
101
+ provider: string;
102
+ type: string;
103
+ }
104
+ export interface WebhookFailedPayload {
105
+ id: string;
106
+ provider: string;
107
+ type: string;
108
+ error: string;
109
+ }
110
+ /** Maps each event to its payload type, so {@link publishPayments} is checked at the call site. */
111
+ export interface PaymentsDiagnosticPayloads {
112
+ 'charge.created': ChargeCreatedPayload;
113
+ 'charge.refunded': ChargeRefundedPayload;
114
+ 'subscription.created': SubscriptionCreatedPayload;
115
+ 'subscription.updated': SubscriptionUpdatedPayload;
116
+ 'subscription.canceled': SubscriptionCanceledPayload;
117
+ 'payment.succeeded': PaymentSucceededPayload;
118
+ 'payment.failed': PaymentFailedPayload;
119
+ 'payment.refunded': PaymentRefundedPayload;
120
+ 'payment.updated': PaymentUpdatedPayload;
121
+ 'invoice.emitted': InvoiceEmittedPayload;
122
+ 'webhook.received': WebhookReceivedPayload;
123
+ 'webhook.processed': WebhookProcessedPayload;
124
+ 'webhook.failed': WebhookFailedPayload;
125
+ }
126
+ /**
127
+ * Publish a payments event on `agora:payments:<event>` via the structural diagnostics
128
+ * slot. No-op when diagnostics isn't installed (the slot is empty) — and it never throws
129
+ * back into the library.
130
+ */
131
+ export declare function publishPayments<E extends PaymentsDiagnosticEvent>(event: E, payload: PaymentsDiagnosticPayloads[E]): void;
132
+ /** Wrap a unit of payments work in a structural trace span. */
133
+ export declare function tracePayments<T>(event: string, fn: () => T, payload?: unknown): T;
134
+ /**
135
+ * Emit the `charge.created` / `charge.refunded` / `subscription.created` /
136
+ * `subscription.canceled` diagnostics for a normalized payment/subscription. Called by
137
+ * the drivers after a successful gateway call; a no-op when diagnostics isn't installed.
138
+ */
139
+ export declare function publishPaymentDiagnostics(payment: Payment): void;
140
+ export declare function publishRefundDiagnostics(refund: {
141
+ gatewayId: string;
142
+ provider: string;
143
+ amount: {
144
+ amount: number;
145
+ currency: string;
146
+ };
147
+ }): void;
148
+ export declare function publishSubscriptionDiagnostics(subscription: Subscription, event: 'subscription.created' | 'subscription.canceled'): void;
149
+ export declare function publishInvoiceEmittedDiagnostics(invoice: {
150
+ gatewayId: string;
151
+ provider: string;
152
+ number?: string;
153
+ url?: string;
154
+ }): void;
155
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ const EMIT_SLOT = Symbol.for('@agora/diagnostics:emit');
2
+ /**
3
+ * The `@adonis-agora/diagnostics` trace capability. Like {@link EMIT_SLOT} it is read
4
+ * STRUCTURALLY — payments never imports the diagnostics package.
5
+ */
6
+ const TRACE_SLOT = Symbol.for('@agora/diagnostics:trace');
7
+ /**
8
+ * Every payments milestone published on `agora:payments:<event>`. The single runtime
9
+ * source for the {@link PaymentsDiagnosticEvent} union — a Telescope watcher iterates
10
+ * this to subscribe/claim, and apps subscribe with `onDiagnostic('payments', ...)`.
11
+ *
12
+ * Two layers:
13
+ * - **Gateway-action** events, emitted by the drivers on API calls (`charge.created`,
14
+ * `charge.refunded`, `subscription.created`/`canceled`, `invoice.emitted`).
15
+ * - **Business** events, emitted by the `WebhookProcessor` when a webhook confirms a
16
+ * state change (`payment.succeeded`/`failed`/`refunded`/`updated`,
17
+ * `subscription.updated`, plus `subscription.created`/`canceled` from webhooks) and
18
+ * the webhook lifecycle (`webhook.received`/`processed`/`failed`).
19
+ */
20
+ export const PAYMENTS_DIAGNOSTIC_EVENTS = [
21
+ 'charge.created',
22
+ 'charge.refunded',
23
+ 'subscription.created',
24
+ 'subscription.updated',
25
+ 'subscription.canceled',
26
+ 'payment.succeeded',
27
+ 'payment.failed',
28
+ 'payment.refunded',
29
+ 'payment.updated',
30
+ 'invoice.emitted',
31
+ 'webhook.received',
32
+ 'webhook.processed',
33
+ 'webhook.failed',
34
+ ];
35
+ /**
36
+ * The claim registry, published by `@adonis-agora/diagnostics` under this global slot as
37
+ * a reference-counted `Map<`${lib}:${event}`, number>`. Read STRUCTURALLY — same
38
+ * decoupling as {@link EMIT_SLOT}. A lib-specific Telescope watcher claims the channels
39
+ * it records here so the generic `DiagnosticsWatcher` skips them (its `recordClaimed:
40
+ * false` default), avoiding double-recording.
41
+ */
42
+ const CLAIMS_SLOT = Symbol.for('@agora/diagnostics:claims');
43
+ function claimsRegistry() {
44
+ const g = globalThis;
45
+ let registry = g[CLAIMS_SLOT];
46
+ if (registry === undefined) {
47
+ registry = new Map();
48
+ g[CLAIMS_SLOT] = registry;
49
+ }
50
+ return registry;
51
+ }
52
+ /**
53
+ * Claim `payments:<event>` for every event, so the generic diagnostics→telescope bridge
54
+ * skips them. Reference-counted (mirrors `@adonis-agora/diagnostics`'
55
+ * `claimDiagnostics`).
56
+ */
57
+ export function claimPaymentsDiagnostics(events) {
58
+ const registry = claimsRegistry();
59
+ const keys = events.map((event) => `payments:${event}`);
60
+ for (const key of keys)
61
+ registry.set(key, (registry.get(key) ?? 0) + 1);
62
+ let released = false;
63
+ return () => {
64
+ if (released)
65
+ return;
66
+ released = true;
67
+ for (const key of keys) {
68
+ const count = registry.get(key);
69
+ if (count === undefined)
70
+ continue;
71
+ if (count <= 1)
72
+ registry.delete(key);
73
+ else
74
+ registry.set(key, count - 1);
75
+ }
76
+ };
77
+ }
78
+ /** Whether `payments:<event>` is currently claimed. */
79
+ export function isPaymentsDiagnosticClaimed(event) {
80
+ const registry = globalThis[CLAIMS_SLOT];
81
+ return registry?.has(`payments:${event}`) ?? false;
82
+ }
83
+ /**
84
+ * Publish a payments event on `agora:payments:<event>` via the structural diagnostics
85
+ * slot. No-op when diagnostics isn't installed (the slot is empty) — and it never throws
86
+ * back into the library.
87
+ */
88
+ export function publishPayments(event, payload) {
89
+ const emit = globalThis[EMIT_SLOT];
90
+ if (typeof emit === 'function') {
91
+ try {
92
+ emit('payments', event, payload);
93
+ }
94
+ catch {
95
+ // diagnostics must never break a payment operation
96
+ }
97
+ }
98
+ }
99
+ /** Wrap a unit of payments work in a structural trace span. */
100
+ export function tracePayments(event, fn, payload) {
101
+ const trace = globalThis[TRACE_SLOT];
102
+ if (typeof trace === 'function') {
103
+ return trace('payments', event, fn, payload);
104
+ }
105
+ return fn();
106
+ }
107
+ /**
108
+ * Emit the `charge.created` / `charge.refunded` / `subscription.created` /
109
+ * `subscription.canceled` diagnostics for a normalized payment/subscription. Called by
110
+ * the drivers after a successful gateway call; a no-op when diagnostics isn't installed.
111
+ */
112
+ export function publishPaymentDiagnostics(payment) {
113
+ publishPayments('charge.created', {
114
+ gatewayId: payment.gatewayId,
115
+ provider: payment.provider,
116
+ amount: payment.amount.amount,
117
+ currency: payment.amount.currency,
118
+ ...(payment.method !== undefined ? { method: payment.method } : {}),
119
+ });
120
+ }
121
+ export function publishRefundDiagnostics(refund) {
122
+ publishPayments('charge.refunded', {
123
+ gatewayId: refund.gatewayId,
124
+ provider: refund.provider,
125
+ amount: refund.amount.amount,
126
+ currency: refund.amount.currency,
127
+ });
128
+ }
129
+ export function publishSubscriptionDiagnostics(subscription, event) {
130
+ if (event === 'subscription.created') {
131
+ publishPayments('subscription.created', {
132
+ gatewayId: subscription.gatewayId,
133
+ provider: subscription.provider,
134
+ customerId: subscription.customerId,
135
+ planId: subscription.planId,
136
+ });
137
+ }
138
+ else {
139
+ publishPayments('subscription.canceled', {
140
+ gatewayId: subscription.gatewayId,
141
+ provider: subscription.provider,
142
+ });
143
+ }
144
+ }
145
+ export function publishInvoiceEmittedDiagnostics(invoice) {
146
+ publishPayments('invoice.emitted', {
147
+ gatewayId: invoice.gatewayId,
148
+ provider: invoice.provider,
149
+ ...(invoice.number !== undefined ? { number: invoice.number } : {}),
150
+ ...(invoice.url !== undefined ? { url: invoice.url } : {}),
151
+ });
152
+ }
153
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/diagnostics.ts"],"names":[],"mappings":"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"}