@open-mercato/gateway-stripe 0.6.6 → 0.6.7-develop.6553.1.2ec7246e04

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.
@@ -26,7 +26,7 @@ const stripeAdapterV20231016 = {
26
26
  }),
27
27
  payment_method_types: input.paymentTypes ?? ["card"],
28
28
  description: input.description
29
- });
29
+ }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : void 0);
30
30
  return {
31
31
  sessionId: paymentIntent.id,
32
32
  clientSecret: paymentIntent.client_secret ?? void 0,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/gateway_stripe/lib/adapters/v2023-10-16.ts"],
4
- "sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nexport const stripeAdapterV20231016: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n })\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n })\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId)\n return { status: mapStripeStatus(cancelled.status) }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nexport const stripeAdapterV20231016: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n })\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId)\n return { status: mapStripeStatus(cancelled.status) }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -27,7 +27,7 @@ const stripeAdapterV20241218 = {
27
27
  }),
28
28
  payment_method_types: input.paymentTypes ?? ["card"],
29
29
  description: input.description
30
- });
30
+ }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : void 0);
31
31
  return {
32
32
  sessionId: paymentIntent.id,
33
33
  clientSecret: paymentIntent.client_secret ?? void 0,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/gateway_stripe/lib/adapters/v2024-12-18.ts"],
4
- "sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2024-12-18'\n\nexport const stripeAdapterV20241218: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n })\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n const capturedCurrencyCode = captured.currency.toUpperCase()\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, capturedCurrencyCode),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n const refundCurrencyCode = refund.currency.toUpperCase()\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refundCurrencyCode),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2024-12-18'\n\nexport const stripeAdapterV20241218: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n const capturedCurrencyCode = captured.currency.toUpperCase()\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, capturedCurrencyCode),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n const refundCurrencyCode = refund.currency.toUpperCase()\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refundCurrencyCode),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -27,7 +27,7 @@ const stripeAdapterV20250224Acacia = {
27
27
  }),
28
28
  payment_method_types: input.paymentTypes ?? ["card"],
29
29
  description: input.description
30
- });
30
+ }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : void 0);
31
31
  return {
32
32
  sessionId: paymentIntent.id,
33
33
  clientSecret: paymentIntent.client_secret ?? void 0,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/gateway_stripe/lib/adapters/v2025-02-24.acacia.ts"],
4
- "sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2025-02-24.acacia'\n\nexport const stripeAdapterV20250224Acacia: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n })\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2025-02-24.acacia'\n\nexport const stripeAdapterV20250224Acacia: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/gateway-stripe",
3
- "version": "0.6.6",
3
+ "version": "0.6.7-develop.6553.1.2ec7246e04",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -62,21 +62,21 @@
62
62
  }
63
63
  },
64
64
  "dependencies": {
65
- "@open-mercato/core": "0.6.6",
66
- "@open-mercato/queue": "0.6.6",
67
- "@open-mercato/ui": "0.6.6",
65
+ "@open-mercato/core": "0.6.7-develop.6553.1.2ec7246e04",
66
+ "@open-mercato/queue": "0.6.7-develop.6553.1.2ec7246e04",
67
+ "@open-mercato/ui": "0.6.7-develop.6553.1.2ec7246e04",
68
68
  "@stripe/react-stripe-js": "^6.6.0",
69
69
  "@stripe/stripe-js": "^9.8.0",
70
70
  "stripe": "^22.3.0"
71
71
  },
72
72
  "peerDependencies": {
73
73
  "@mikro-orm/postgresql": "^7.0.14",
74
- "@open-mercato/shared": "0.6.6",
74
+ "@open-mercato/shared": "0.6.7-develop.6553.1.2ec7246e04",
75
75
  "react": "^19.0.0",
76
76
  "react-dom": "^19.0.0"
77
77
  },
78
78
  "devDependencies": {
79
- "@open-mercato/shared": "0.6.6",
79
+ "@open-mercato/shared": "0.6.7-develop.6553.1.2ec7246e04",
80
80
  "@types/jest": "^30.0.0",
81
81
  "@types/react": "^19.2.17",
82
82
  "@types/react-dom": "^19.2.3",
@@ -95,5 +95,6 @@
95
95
  "type": "git",
96
96
  "url": "https://github.com/open-mercato/open-mercato",
97
97
  "directory": "packages/gateway-stripe"
98
- }
98
+ },
99
+ "stableVersion": "0.6.6"
99
100
  }
@@ -0,0 +1,42 @@
1
+ import type { CreateSessionInput, GatewayAdapter } from '@open-mercato/shared/modules/payment_gateways/types'
2
+ import { resolveStripeClient } from '../lib/client'
3
+ import { stripeAdapterV20231016 } from '../lib/adapters/v2023-10-16'
4
+ import { stripeAdapterV20241218 } from '../lib/adapters/v2024-12-18'
5
+ import { stripeAdapterV20250224Acacia } from '../lib/adapters/v2025-02-24.acacia'
6
+
7
+ jest.mock('../lib/client', () => ({
8
+ resolveStripeClient: jest.fn(),
9
+ }))
10
+
11
+ const adapters: Array<[string, GatewayAdapter]> = [
12
+ ['2023-10-16', stripeAdapterV20231016],
13
+ ['2024-12-18', stripeAdapterV20241218],
14
+ ['2025-02-24.acacia', stripeAdapterV20250224Acacia],
15
+ ]
16
+
17
+ describe.each(adapters)('Stripe adapter %s session idempotency', (_version, adapter) => {
18
+ it('passes the stable operation key to Stripe PaymentIntent creation', async () => {
19
+ const create = jest.fn(async () => ({
20
+ id: 'pi_123',
21
+ client_secret: 'secret_123',
22
+ status: 'requires_payment_method',
23
+ }))
24
+ ;(resolveStripeClient as jest.Mock).mockReturnValue({ paymentIntents: { create } })
25
+ const input = {
26
+ paymentId: '11111111-1111-4111-8111-111111111111',
27
+ tenantId: '22222222-2222-4222-8222-222222222222',
28
+ organizationId: '33333333-3333-4333-8333-333333333333',
29
+ amount: 25,
30
+ currencyCode: 'USD',
31
+ credentials: { secretKey: 'sk_test', publishableKey: 'pk_test' },
32
+ idempotencyKey: 'om-payment-session:stable-operation-key',
33
+ } as CreateSessionInput & { idempotencyKey: string }
34
+
35
+ await adapter.createSession(input)
36
+
37
+ expect(create).toHaveBeenCalledWith(
38
+ expect.any(Object),
39
+ { idempotencyKey: 'om-payment-session:stable-operation-key' },
40
+ )
41
+ })
42
+ })
@@ -45,7 +45,7 @@ export const stripeAdapterV20231016: GatewayAdapter = {
45
45
  }),
46
46
  payment_method_types: input.paymentTypes ?? ['card'],
47
47
  description: input.description,
48
- })
48
+ }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)
49
49
 
50
50
  return {
51
51
  sessionId: paymentIntent.id,
@@ -47,7 +47,7 @@ export const stripeAdapterV20241218: GatewayAdapter = {
47
47
  }),
48
48
  payment_method_types: input.paymentTypes ?? ['card'],
49
49
  description: input.description,
50
- })
50
+ }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)
51
51
 
52
52
  return {
53
53
  sessionId: paymentIntent.id,
@@ -47,7 +47,7 @@ export const stripeAdapterV20250224Acacia: GatewayAdapter = {
47
47
  }),
48
48
  payment_method_types: input.paymentTypes ?? ['card'],
49
49
  description: input.description,
50
- })
50
+ }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)
51
51
 
52
52
  return {
53
53
  sessionId: paymentIntent.id,