@shware/purchase 5.0.0 → 5.1.1

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 (93) hide show
  1. package/dist/app-store/config.d.cts +1 -2
  2. package/dist/app-store/config.d.cts.map +1 -1
  3. package/dist/app-store/config.d.mts +1 -2
  4. package/dist/app-store/config.d.mts.map +1 -1
  5. package/dist/app-store/handler.d.cts +2 -3
  6. package/dist/app-store/handler.d.cts.map +1 -1
  7. package/dist/app-store/handler.d.mts +2 -3
  8. package/dist/app-store/handler.d.mts.map +1 -1
  9. package/dist/app-store/index.cjs +2 -0
  10. package/dist/app-store/index.d.cts +2 -1
  11. package/dist/app-store/index.d.mts +2 -1
  12. package/dist/app-store/index.mjs +2 -1
  13. package/dist/app-store/mapper.cjs +47 -0
  14. package/dist/app-store/mapper.cjs.map +1 -0
  15. package/dist/app-store/mapper.d.cts +24 -0
  16. package/dist/app-store/mapper.d.cts.map +1 -0
  17. package/dist/app-store/mapper.d.mts +24 -0
  18. package/dist/app-store/mapper.d.mts.map +1 -0
  19. package/dist/app-store/mapper.mjs +46 -0
  20. package/dist/app-store/mapper.mjs.map +1 -0
  21. package/dist/google-play/config.d.cts +1 -2
  22. package/dist/google-play/config.d.cts.map +1 -1
  23. package/dist/google-play/config.d.mts +1 -2
  24. package/dist/google-play/config.d.mts.map +1 -1
  25. package/dist/google-play/index.cjs +2 -0
  26. package/dist/google-play/index.d.cts +2 -2
  27. package/dist/google-play/index.d.mts +2 -2
  28. package/dist/google-play/index.mjs +2 -2
  29. package/dist/google-play/mapper.cjs +48 -0
  30. package/dist/google-play/mapper.cjs.map +1 -1
  31. package/dist/google-play/mapper.d.cts +30 -3
  32. package/dist/google-play/mapper.d.cts.map +1 -1
  33. package/dist/google-play/mapper.d.mts +30 -3
  34. package/dist/google-play/mapper.d.mts.map +1 -1
  35. package/dist/google-play/mapper.mjs +47 -1
  36. package/dist/google-play/mapper.mjs.map +1 -1
  37. package/dist/google-play/real-time-developer-notification.d.cts +16 -17
  38. package/dist/google-play/real-time-developer-notification.d.cts.map +1 -1
  39. package/dist/google-play/real-time-developer-notification.d.mts +16 -17
  40. package/dist/google-play/real-time-developer-notification.d.mts.map +1 -1
  41. package/dist/index.cjs +3 -0
  42. package/dist/index.d.cts +2 -2
  43. package/dist/index.d.mts +2 -2
  44. package/dist/index.mjs +2 -2
  45. package/dist/stripe/config.d.cts +3 -4
  46. package/dist/stripe/config.d.cts.map +1 -1
  47. package/dist/stripe/config.d.mts +3 -4
  48. package/dist/stripe/config.d.mts.map +1 -1
  49. package/dist/stripe/handler.d.cts +1 -2
  50. package/dist/stripe/handler.d.cts.map +1 -1
  51. package/dist/stripe/handler.d.mts +1 -2
  52. package/dist/stripe/handler.d.mts.map +1 -1
  53. package/dist/stripe/index.cjs +1 -0
  54. package/dist/stripe/index.d.cts +4 -3
  55. package/dist/stripe/index.d.mts +4 -3
  56. package/dist/stripe/index.mjs +2 -2
  57. package/dist/stripe/mapper.cjs +18 -0
  58. package/dist/stripe/mapper.cjs.map +1 -1
  59. package/dist/stripe/mapper.d.cts +29 -23
  60. package/dist/stripe/mapper.d.cts.map +1 -1
  61. package/dist/stripe/mapper.d.mts +29 -23
  62. package/dist/stripe/mapper.d.mts.map +1 -1
  63. package/dist/stripe/mapper.mjs +18 -1
  64. package/dist/stripe/mapper.mjs.map +1 -1
  65. package/dist/stripe/metadata.d.cts +1 -2
  66. package/dist/stripe/metadata.d.cts.map +1 -1
  67. package/dist/stripe/metadata.d.mts +1 -2
  68. package/dist/stripe/metadata.d.mts.map +1 -1
  69. package/dist/stripe/pending-checkout.d.cts +3 -4
  70. package/dist/stripe/pending-checkout.d.cts.map +1 -1
  71. package/dist/stripe/pending-checkout.d.mts +3 -4
  72. package/dist/stripe/pending-checkout.d.mts.map +1 -1
  73. package/dist/stripe/schema.cjs +4 -15
  74. package/dist/stripe/schema.cjs.map +1 -1
  75. package/dist/stripe/schema.d.cts +7 -11
  76. package/dist/stripe/schema.d.cts.map +1 -1
  77. package/dist/stripe/schema.d.mts +7 -11
  78. package/dist/stripe/schema.d.mts.map +1 -1
  79. package/dist/stripe/schema.mjs +4 -15
  80. package/dist/stripe/schema.mjs.map +1 -1
  81. package/dist/subscription/index.cjs +25 -0
  82. package/dist/subscription/index.cjs.map +1 -1
  83. package/dist/subscription/index.d.cts +41 -6
  84. package/dist/subscription/index.d.cts.map +1 -1
  85. package/dist/subscription/index.d.mts +41 -6
  86. package/dist/subscription/index.d.mts.map +1 -1
  87. package/dist/subscription/index.mjs +23 -1
  88. package/dist/subscription/index.mjs.map +1 -1
  89. package/dist/types.d.cts +2 -3
  90. package/dist/types.d.cts.map +1 -1
  91. package/dist/types.d.mts +2 -3
  92. package/dist/types.d.mts.map +1 -1
  93. package/package.json +6 -6
@@ -1,8 +1,8 @@
1
- import { SubscriptionStatus } from "../subscription/index.cjs";
1
+ import { CancellationDetails, SubscriptionStatus } from "../subscription/index.cjs";
2
2
  import { Stripe } from "stripe";
3
3
  //#region src/stripe/mapper.d.ts
4
- declare function mapTime<T extends number | null>(stripeTimestampSeconds: T): T extends number ? string : null;
5
- type Price = {
4
+ export declare function mapTime<T extends number | null>(stripeTimestampSeconds: T): T extends number ? string : null;
5
+ export type Price = {
6
6
  id: string;
7
7
  type: Stripe.Price.Type;
8
8
  active: boolean;
@@ -12,8 +12,8 @@ type Price = {
12
12
  unit_amount_decimal: string | null;
13
13
  recurring: Stripe.Price.Recurring | null;
14
14
  };
15
- declare function mapPrice(price: Stripe.Price): Price;
16
- interface LineItem {
15
+ export declare function mapPrice(price: Stripe.Price): Price;
16
+ export interface LineItem {
17
17
  id: string;
18
18
  currency: string;
19
19
  quantity: number | null;
@@ -24,9 +24,9 @@ interface LineItem {
24
24
  amount_discount: number;
25
25
  price: Price | null;
26
26
  }
27
- declare function mapLineItem(item: Stripe.LineItem): LineItem;
28
- type PaymentStatus = Stripe.Checkout.Session.PaymentStatus;
29
- interface CheckoutSession {
27
+ export declare function mapLineItem(item: Stripe.LineItem): LineItem;
28
+ export type PaymentStatus = Stripe.Checkout.Session.PaymentStatus;
29
+ export interface CheckoutSession {
30
30
  id: string;
31
31
  url: string | null;
32
32
  coupon: string | undefined;
@@ -37,8 +37,8 @@ interface CheckoutSession {
37
37
  amount_total: number | null;
38
38
  line_items: LineItem[] | undefined;
39
39
  }
40
- declare function mapCheckoutSession(session: Stripe.Checkout.Session): CheckoutSession;
41
- declare function mapInvoice(i: Stripe.Invoice): {
40
+ export declare function mapCheckoutSession(session: Stripe.Checkout.Session): CheckoutSession;
41
+ export declare function mapInvoice(i: Stripe.Invoice): {
42
42
  id: string;
43
43
  number: string | null;
44
44
  total: number;
@@ -56,7 +56,7 @@ declare function mapInvoice(i: Stripe.Invoice): {
56
56
  period_start: number;
57
57
  period_end: number;
58
58
  };
59
- declare function mapPaymentIntent(intent: Stripe.PaymentIntent): {
59
+ export declare function mapPaymentIntent(intent: Stripe.PaymentIntent): {
60
60
  id: string;
61
61
  amount: number;
62
62
  amount_capturable: number;
@@ -67,7 +67,7 @@ declare function mapPaymentIntent(intent: Stripe.PaymentIntent): {
67
67
  status: Stripe.PaymentIntent.Status;
68
68
  created: number;
69
69
  };
70
- declare function mapCharge(charge: Stripe.Charge): {
70
+ export declare function mapCharge(charge: Stripe.Charge): {
71
71
  id: string;
72
72
  description: string | null;
73
73
  currency: string;
@@ -91,7 +91,7 @@ declare function mapCharge(charge: Stripe.Charge): {
91
91
  created: number;
92
92
  } | undefined;
93
93
  };
94
- type ProductPrice = {
94
+ export type ProductPrice = {
95
95
  id: string;
96
96
  type: Stripe.Price.Type;
97
97
  unit_amount: number;
@@ -103,11 +103,11 @@ type ProductPrice = {
103
103
  livemode: Stripe.Product['livemode'];
104
104
  };
105
105
  };
106
- declare function mapSubscriptionStatus(status: Stripe.Subscription.Status): SubscriptionStatus;
107
- declare const ZERO_DECIMAL_CURRENCIES: string[];
108
- declare function minorUnits(currency: string): 1 | 100;
109
- declare function price(value: number, currency: string): number;
110
- interface Item {
106
+ export declare function mapSubscriptionStatus(status: Stripe.Subscription.Status): SubscriptionStatus;
107
+ export declare const ZERO_DECIMAL_CURRENCIES: string[];
108
+ export declare function minorUnits(currency: string): 1 | 100;
109
+ export declare function price(value: number, currency: string): number;
110
+ export interface Item {
111
111
  item_id: string;
112
112
  item_name: string;
113
113
  affiliation?: 'Google Store' | (string & {});
@@ -127,7 +127,7 @@ interface Item {
127
127
  price?: number;
128
128
  quantity?: number;
129
129
  }
130
- interface PurchaseProperties {
130
+ export interface PurchaseProperties {
131
131
  currency: string;
132
132
  value: number;
133
133
  transaction_id: string;
@@ -136,14 +136,20 @@ interface PurchaseProperties {
136
136
  tax?: number;
137
137
  items?: Item[];
138
138
  }
139
- interface BeginCheckoutProperties {
139
+ export interface BeginCheckoutProperties {
140
140
  currency: string;
141
141
  value: number;
142
142
  coupon?: string;
143
143
  items: Item[];
144
144
  }
145
- declare function getPurchaseProperties(session: CheckoutSession): PurchaseProperties;
146
- declare function getBeginCheckoutProperties(p: ProductPrice): BeginCheckoutProperties;
145
+ export declare function getPurchaseProperties(session: CheckoutSession): PurchaseProperties;
146
+ export declare function getBeginCheckoutProperties(p: ProductPrice): BeginCheckoutProperties;
147
+ /**
148
+ * Stripe's `cancellation_details` in the shared shape. The object is present on every
149
+ * subscription with all three fields null, so an active one maps to null rather than an empty
150
+ * record. `reason` says who acted: `cancellation_requested` is the customer (or us on their
151
+ * behalf), the payment reasons are Stripe ending it.
152
+ */
153
+ export declare function mapCancellationDetails(subscription: Pick<Stripe.Subscription, 'cancellation_details'>): CancellationDetails | null;
147
154
  //#endregion
148
- export { BeginCheckoutProperties, CheckoutSession, Item, LineItem, PaymentStatus, Price, ProductPrice, PurchaseProperties, ZERO_DECIMAL_CURRENCIES, getBeginCheckoutProperties, getPurchaseProperties, mapCharge, mapCheckoutSession, mapInvoice, mapLineItem, mapPaymentIntent, mapPrice, mapSubscriptionStatus, mapTime, minorUnits, price };
149
155
  //# sourceMappingURL=mapper.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.d.cts","names":[],"sources":["../../src/stripe/mapper.ts"],"mappings":";;;iBAGgB,QAAQ,yBACtB,wBAAwB,IACvB;KAKS;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,gBAAgB,OAAO,MAAM;EAC7B,UAAU,OAAO;EACjB;EACA;EACA,WAAW,OAAO,MAAM;;iBAGV,SAAS,OAAO,OAAO,QAAQ;UAa9B;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAO;;iBAGO,YAAY,MAAM,OAAO,WAAW;KAoBxC,gBAAgB,OAAO,SAAS,QAAQ;UAMnC;EACf;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB;EACA;EACA,YAAY;;iBAGE,mBAAmB,SAAS,OAAO,SAAS,UAAU;iBA0BtD,WAAW,GAAG,OAAO;EAEjC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAAc,OAAA,QAAA;EACd;EACA;EACA;EACA,QAAM,OAAA,QAAA;EACN;EACA;EACA;;iBAIY,iBAAiB,QAAQ,OAAO;EAE5C;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,cAAA;EACN;;iBAIY,UAAU,QAAQ,OAAO;EAErC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,OAAA;EACN;EACA;;;;;;;;;;;;KAOQ;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,UAAU,OAAO;EACjB;IACE,IAAI,OAAO;IACX,MAAM,OAAO;IACb,aAAa,OAAO;IACpB,UAAU,OAAO;;;iBAIL,sBAAsB,QAAQ,OAAO,aAAa,SAAS;cAyB9D;iBAmBG,WAAW;iBAIX,MAAM,eAAe;UAIpB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;;UAGO;EACf;EACA;EACA;EACA,OAAO;;iBAqCO,sBAAsB,SAAS,kBAAkB;iBA2BjD,2BAA2B,GAAG,eAAe"}
1
+ {"version":3,"file":"mapper.d.cts","names":[],"sources":["../../src/stripe/mapper.ts"],"mappings":";;;wBAQgB,QAAQ,yBACtB,wBAAwB,IACvB;YAKS;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,gBAAgB,OAAO,MAAM;EAC7B,UAAU,OAAO;EACjB;EACA;EACA,WAAW,OAAO,MAAM;;wBAGV,SAAS,OAAO,OAAO,QAAQ;iBAa9B;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAO;;wBAGO,YAAY,MAAM,OAAO,WAAW;YAoBxC,gBAAgB,OAAO,SAAS,QAAQ;iBAMnC;EACf;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB;EACA;EACA,YAAY;;wBAGE,mBAAmB,SAAS,OAAO,SAAS,UAAU;wBA0BtD,WAAW,GAAG,OAAO;EAEjC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAAc,OAAA,QAAA;EACd;EACA;EACA;EACA,QAAM,OAAA,QAAA;EACN;EACA;EACA;;wBAIY,iBAAiB,QAAQ,OAAO;EAE5C;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,cAAA;EACN;;wBAIY,UAAU,QAAQ,OAAO;EAErC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,OAAA;EACN;EACA;;;;;;;;;;;;YAOQ;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,UAAU,OAAO;EACjB;IACE,IAAI,OAAO;IACX,MAAM,OAAO;IACb,aAAa,OAAO;IACpB,UAAU,OAAO;;;wBAIL,sBAAsB,QAAQ,OAAO,aAAa,SAAS;qBAyB9D;wBAmBG,WAAW;wBAIX,MAAM,eAAe;iBAIpB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;;iBAGO;EACf;EACA;EACA;EACA,OAAO;;wBAqCO,sBAAsB,SAAS,kBAAkB;wBA2BjD,2BAA2B,GAAG,eAAe;;;;;;;wBAoB7C,uBACd,cAAc,KAAK,OAAO,wCACzB"}
@@ -1,8 +1,8 @@
1
- import { SubscriptionStatus } from "../subscription/index.mjs";
1
+ import { CancellationDetails, SubscriptionStatus } from "../subscription/index.mjs";
2
2
  import { Stripe } from "stripe";
3
3
  //#region src/stripe/mapper.d.ts
4
- declare function mapTime<T extends number | null>(stripeTimestampSeconds: T): T extends number ? string : null;
5
- type Price = {
4
+ export declare function mapTime<T extends number | null>(stripeTimestampSeconds: T): T extends number ? string : null;
5
+ export type Price = {
6
6
  id: string;
7
7
  type: Stripe.Price.Type;
8
8
  active: boolean;
@@ -12,8 +12,8 @@ type Price = {
12
12
  unit_amount_decimal: string | null;
13
13
  recurring: Stripe.Price.Recurring | null;
14
14
  };
15
- declare function mapPrice(price: Stripe.Price): Price;
16
- interface LineItem {
15
+ export declare function mapPrice(price: Stripe.Price): Price;
16
+ export interface LineItem {
17
17
  id: string;
18
18
  currency: string;
19
19
  quantity: number | null;
@@ -24,9 +24,9 @@ interface LineItem {
24
24
  amount_discount: number;
25
25
  price: Price | null;
26
26
  }
27
- declare function mapLineItem(item: Stripe.LineItem): LineItem;
28
- type PaymentStatus = Stripe.Checkout.Session.PaymentStatus;
29
- interface CheckoutSession {
27
+ export declare function mapLineItem(item: Stripe.LineItem): LineItem;
28
+ export type PaymentStatus = Stripe.Checkout.Session.PaymentStatus;
29
+ export interface CheckoutSession {
30
30
  id: string;
31
31
  url: string | null;
32
32
  coupon: string | undefined;
@@ -37,8 +37,8 @@ interface CheckoutSession {
37
37
  amount_total: number | null;
38
38
  line_items: LineItem[] | undefined;
39
39
  }
40
- declare function mapCheckoutSession(session: Stripe.Checkout.Session): CheckoutSession;
41
- declare function mapInvoice(i: Stripe.Invoice): {
40
+ export declare function mapCheckoutSession(session: Stripe.Checkout.Session): CheckoutSession;
41
+ export declare function mapInvoice(i: Stripe.Invoice): {
42
42
  id: string;
43
43
  number: string | null;
44
44
  total: number;
@@ -56,7 +56,7 @@ declare function mapInvoice(i: Stripe.Invoice): {
56
56
  period_start: number;
57
57
  period_end: number;
58
58
  };
59
- declare function mapPaymentIntent(intent: Stripe.PaymentIntent): {
59
+ export declare function mapPaymentIntent(intent: Stripe.PaymentIntent): {
60
60
  id: string;
61
61
  amount: number;
62
62
  amount_capturable: number;
@@ -67,7 +67,7 @@ declare function mapPaymentIntent(intent: Stripe.PaymentIntent): {
67
67
  status: Stripe.PaymentIntent.Status;
68
68
  created: number;
69
69
  };
70
- declare function mapCharge(charge: Stripe.Charge): {
70
+ export declare function mapCharge(charge: Stripe.Charge): {
71
71
  id: string;
72
72
  description: string | null;
73
73
  currency: string;
@@ -91,7 +91,7 @@ declare function mapCharge(charge: Stripe.Charge): {
91
91
  created: number;
92
92
  } | undefined;
93
93
  };
94
- type ProductPrice = {
94
+ export type ProductPrice = {
95
95
  id: string;
96
96
  type: Stripe.Price.Type;
97
97
  unit_amount: number;
@@ -103,11 +103,11 @@ type ProductPrice = {
103
103
  livemode: Stripe.Product['livemode'];
104
104
  };
105
105
  };
106
- declare function mapSubscriptionStatus(status: Stripe.Subscription.Status): SubscriptionStatus;
107
- declare const ZERO_DECIMAL_CURRENCIES: string[];
108
- declare function minorUnits(currency: string): 1 | 100;
109
- declare function price(value: number, currency: string): number;
110
- interface Item {
106
+ export declare function mapSubscriptionStatus(status: Stripe.Subscription.Status): SubscriptionStatus;
107
+ export declare const ZERO_DECIMAL_CURRENCIES: string[];
108
+ export declare function minorUnits(currency: string): 1 | 100;
109
+ export declare function price(value: number, currency: string): number;
110
+ export interface Item {
111
111
  item_id: string;
112
112
  item_name: string;
113
113
  affiliation?: 'Google Store' | (string & {});
@@ -127,7 +127,7 @@ interface Item {
127
127
  price?: number;
128
128
  quantity?: number;
129
129
  }
130
- interface PurchaseProperties {
130
+ export interface PurchaseProperties {
131
131
  currency: string;
132
132
  value: number;
133
133
  transaction_id: string;
@@ -136,14 +136,20 @@ interface PurchaseProperties {
136
136
  tax?: number;
137
137
  items?: Item[];
138
138
  }
139
- interface BeginCheckoutProperties {
139
+ export interface BeginCheckoutProperties {
140
140
  currency: string;
141
141
  value: number;
142
142
  coupon?: string;
143
143
  items: Item[];
144
144
  }
145
- declare function getPurchaseProperties(session: CheckoutSession): PurchaseProperties;
146
- declare function getBeginCheckoutProperties(p: ProductPrice): BeginCheckoutProperties;
145
+ export declare function getPurchaseProperties(session: CheckoutSession): PurchaseProperties;
146
+ export declare function getBeginCheckoutProperties(p: ProductPrice): BeginCheckoutProperties;
147
+ /**
148
+ * Stripe's `cancellation_details` in the shared shape. The object is present on every
149
+ * subscription with all three fields null, so an active one maps to null rather than an empty
150
+ * record. `reason` says who acted: `cancellation_requested` is the customer (or us on their
151
+ * behalf), the payment reasons are Stripe ending it.
152
+ */
153
+ export declare function mapCancellationDetails(subscription: Pick<Stripe.Subscription, 'cancellation_details'>): CancellationDetails | null;
147
154
  //#endregion
148
- export { BeginCheckoutProperties, CheckoutSession, Item, LineItem, PaymentStatus, Price, ProductPrice, PurchaseProperties, ZERO_DECIMAL_CURRENCIES, getBeginCheckoutProperties, getPurchaseProperties, mapCharge, mapCheckoutSession, mapInvoice, mapLineItem, mapPaymentIntent, mapPrice, mapSubscriptionStatus, mapTime, minorUnits, price };
149
155
  //# sourceMappingURL=mapper.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.d.mts","names":[],"sources":["../../src/stripe/mapper.ts"],"mappings":";;;iBAGgB,QAAQ,yBACtB,wBAAwB,IACvB;KAKS;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,gBAAgB,OAAO,MAAM;EAC7B,UAAU,OAAO;EACjB;EACA;EACA,WAAW,OAAO,MAAM;;iBAGV,SAAS,OAAO,OAAO,QAAQ;UAa9B;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAO;;iBAGO,YAAY,MAAM,OAAO,WAAW;KAoBxC,gBAAgB,OAAO,SAAS,QAAQ;UAMnC;EACf;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB;EACA;EACA,YAAY;;iBAGE,mBAAmB,SAAS,OAAO,SAAS,UAAU;iBA0BtD,WAAW,GAAG,OAAO;EAEjC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAAc,OAAA,QAAA;EACd;EACA;EACA;EACA,QAAM,OAAA,QAAA;EACN;EACA;EACA;;iBAIY,iBAAiB,QAAQ,OAAO;EAE5C;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,cAAA;EACN;;iBAIY,UAAU,QAAQ,OAAO;EAErC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,OAAA;EACN;EACA;;;;;;;;;;;;KAOQ;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,UAAU,OAAO;EACjB;IACE,IAAI,OAAO;IACX,MAAM,OAAO;IACb,aAAa,OAAO;IACpB,UAAU,OAAO;;;iBAIL,sBAAsB,QAAQ,OAAO,aAAa,SAAS;cAyB9D;iBAmBG,WAAW;iBAIX,MAAM,eAAe;UAIpB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;;UAGO;EACf;EACA;EACA;EACA,OAAO;;iBAqCO,sBAAsB,SAAS,kBAAkB;iBA2BjD,2BAA2B,GAAG,eAAe"}
1
+ {"version":3,"file":"mapper.d.mts","names":[],"sources":["../../src/stripe/mapper.ts"],"mappings":";;;wBAQgB,QAAQ,yBACtB,wBAAwB,IACvB;YAKS;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,gBAAgB,OAAO,MAAM;EAC7B,UAAU,OAAO;EACjB;EACA;EACA,WAAW,OAAO,MAAM;;wBAGV,SAAS,OAAO,OAAO,QAAQ;iBAa9B;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAO;;wBAGO,YAAY,MAAM,OAAO,WAAW;YAoBxC,gBAAgB,OAAO,SAAS,QAAQ;iBAMnC;EACf;EACA;EACA;EACA;EACA;EACA,gBAAgB;EAChB;EACA;EACA,YAAY;;wBAGE,mBAAmB,SAAS,OAAO,SAAS,UAAU;wBA0BtD,WAAW,GAAG,OAAO;EAEjC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBAAc,OAAA,QAAA;EACd;EACA;EACA;EACA,QAAM,OAAA,QAAA;EACN;EACA;EACA;;wBAIY,iBAAiB,QAAQ,OAAO;EAE5C;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,cAAA;EACN;;wBAIY,UAAU,QAAQ,OAAO;EAErC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAM,OAAA,OAAA;EACN;EACA;;;;;;;;;;;;YAOQ;EACV;EACA,MAAM,OAAO,MAAM;EACnB;EACA,UAAU,OAAO;EACjB;IACE,IAAI,OAAO;IACX,MAAM,OAAO;IACb,aAAa,OAAO;IACpB,UAAU,OAAO;;;wBAIL,sBAAsB,QAAQ,OAAO,aAAa,SAAS;qBAyB9D;wBAmBG,WAAW;wBAIX,MAAM,eAAe;iBAIpB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;;iBAGO;EACf;EACA;EACA;EACA,OAAO;;wBAqCO,sBAAsB,SAAS,kBAAkB;wBA2BjD,2BAA2B,GAAG,eAAe;;;;;;;wBAoB7C,uBACd,cAAc,KAAK,OAAO,wCACzB"}
@@ -1,3 +1,4 @@
1
+ import { CANCELLATION_FEEDBACKS } from "../subscription/index.mjs";
1
2
  //#region src/stripe/mapper.ts
2
3
  function mapTime(stripeTimestampSeconds) {
3
4
  if (!stripeTimestampSeconds) return null;
@@ -197,7 +198,23 @@ function getBeginCheckoutProperties(p) {
197
198
  }]
198
199
  };
199
200
  }
201
+ /**
202
+ * Stripe's `cancellation_details` in the shared shape. The object is present on every
203
+ * subscription with all three fields null, so an active one maps to null rather than an empty
204
+ * record. `reason` says who acted: `cancellation_requested` is the customer (or us on their
205
+ * behalf), the payment reasons are Stripe ending it.
206
+ */
207
+ function mapCancellationDetails(subscription) {
208
+ const details = subscription.cancellation_details;
209
+ if (!details || !details.reason && !details.feedback && !details.comment) return null;
210
+ return {
211
+ initiator: details.reason === "payment_failed" || details.reason === "payment_disputed" ? "system" : "user",
212
+ reason: details.reason ?? null,
213
+ feedback: details.feedback ? CANCELLATION_FEEDBACKS.includes(details.feedback) ? details.feedback : "other" : null,
214
+ comment: details.comment ?? null
215
+ };
216
+ }
200
217
  //#endregion
201
- export { ZERO_DECIMAL_CURRENCIES, getBeginCheckoutProperties, getPurchaseProperties, mapCharge, mapCheckoutSession, mapInvoice, mapLineItem, mapPaymentIntent, mapPrice, mapSubscriptionStatus, mapTime, minorUnits, price };
218
+ export { ZERO_DECIMAL_CURRENCIES, getBeginCheckoutProperties, getPurchaseProperties, mapCancellationDetails, mapCharge, mapCheckoutSession, mapInvoice, mapLineItem, mapPaymentIntent, mapPrice, mapSubscriptionStatus, mapTime, minorUnits, price };
202
219
 
203
220
  //# sourceMappingURL=mapper.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.mjs","names":[],"sources":["../../src/stripe/mapper.ts"],"sourcesContent":["import type { Stripe } from 'stripe';\nimport type { SubscriptionStatus } from '../subscription/index';\n\nexport function mapTime<T extends number | null>(\n stripeTimestampSeconds: T\n): T extends number ? string : null {\n if (!stripeTimestampSeconds) return null as T extends number ? string : null;\n return new Date(stripeTimestampSeconds * 1000).toISOString() as T extends number ? string : null;\n}\n\nexport type Price = {\n id: string;\n type: Stripe.Price.Type;\n active: boolean;\n billing_scheme: Stripe.Price.BillingScheme;\n currency: Stripe.Price['currency'];\n unit_amount: number | null;\n unit_amount_decimal: string | null;\n recurring: Stripe.Price.Recurring | null;\n};\n\nexport function mapPrice(price: Stripe.Price): Price {\n return {\n id: price.id,\n type: price.type,\n active: price.active,\n billing_scheme: price.billing_scheme,\n currency: price.currency,\n unit_amount: price.unit_amount,\n unit_amount_decimal: price.unit_amount_decimal?.toString() ?? null,\n recurring: price.recurring,\n };\n}\n\nexport interface LineItem {\n id: string;\n currency: string;\n quantity: number | null;\n description: string | null;\n amount_tax: number;\n amount_total: number;\n amount_subtotal: number;\n amount_discount: number;\n price: Price | null;\n}\n\nexport function mapLineItem(item: Stripe.LineItem): LineItem {\n return {\n id: item.price\n ? typeof item.price.product === 'string'\n ? item.price.product\n : item.price.product.id\n : item.id,\n currency: item.currency,\n quantity: item.quantity,\n description: item.description,\n amount_tax: item.amount_tax,\n amount_total: item.amount_total,\n amount_subtotal: item.amount_subtotal,\n amount_discount: item.amount_discount,\n price: item.price ? mapPrice(item.price) : null,\n };\n}\n\n// Re-exported under our own name so consumers need not reach into stripe's namespace.\n// Open-ended since stripe 22.4: a status the API adds later is not a type error.\nexport type PaymentStatus = Stripe.Checkout.Session.PaymentStatus;\n\n// Declared rather than inferred from mapCheckoutSession: an inferred shape is\n// structural, so a consumer's declaration emit has to spell out payment_status\n// through stripe's internal module path — TS2883 in any package that reaches\n// stripe transitively instead of depending on it (see line_items/price too).\nexport interface CheckoutSession {\n id: string;\n url: string | null;\n coupon: string | undefined;\n livemode: boolean;\n expires_at: number;\n payment_status: PaymentStatus;\n currency: string | null;\n amount_total: number | null;\n line_items: LineItem[] | undefined;\n}\n\nexport function mapCheckoutSession(session: Stripe.Checkout.Session): CheckoutSession {\n let coupon: string | undefined = undefined;\n if (Array.isArray(session.discounts) && session.discounts.length !== 0) {\n const discount = session.discounts[0];\n if (discount.coupon && typeof discount.coupon === 'object') {\n coupon = discount.coupon.id;\n } else if (typeof discount.coupon === 'string') {\n coupon = discount.coupon;\n } else {\n coupon = undefined;\n }\n }\n\n return {\n id: session.id,\n url: session.url,\n coupon,\n livemode: session.livemode,\n expires_at: session.expires_at,\n payment_status: session.payment_status,\n currency: session.currency,\n amount_total: session.amount_total,\n line_items: session.line_items?.data.map(mapLineItem),\n };\n}\n\nexport function mapInvoice(i: Stripe.Invoice) {\n return {\n id: i.id,\n number: i.number,\n total: i.total,\n subtotal: i.subtotal,\n amount_due: i.amount_due,\n amount_paid: i.amount_paid,\n amount_remaining: i.amount_remaining,\n currency: i.currency,\n billing_reason: i.billing_reason,\n hosted_invoice_url: i.hosted_invoice_url,\n invoice_pdf: i.invoice_pdf,\n receipt_number: i.receipt_number,\n status: i.status,\n created: i.created,\n period_start: i.period_start,\n period_end: i.period_end,\n };\n}\n\nexport function mapPaymentIntent(intent: Stripe.PaymentIntent) {\n return {\n id: intent.id,\n amount: intent.amount,\n amount_capturable: intent.amount_capturable,\n amount_received: intent.amount_received,\n currency: intent.currency,\n client_secret: intent.client_secret,\n description: intent.description,\n status: intent.status,\n created: intent.created,\n };\n}\n\nexport function mapCharge(charge: Stripe.Charge) {\n return {\n id: charge.id,\n description: charge.description,\n currency: charge.currency,\n amount: charge.amount,\n amount_captured: charge.amount_captured,\n amount_refunded: charge.amount_refunded,\n receipt_email: charge.receipt_email,\n receipt_number: charge.receipt_number,\n receipt_url: charge.receipt_url,\n status: charge.status,\n created: charge.created,\n payment_intent:\n charge.payment_intent && typeof charge.payment_intent === 'object'\n ? mapPaymentIntent(charge.payment_intent)\n : undefined,\n };\n}\n\nexport type ProductPrice = {\n id: string;\n type: Stripe.Price.Type;\n unit_amount: number;\n currency: Stripe.Price['currency'];\n product: {\n id: Stripe.Product['id'];\n name: Stripe.Product['name'];\n description: Stripe.Product['description'];\n livemode: Stripe.Product['livemode'];\n };\n};\n\nexport function mapSubscriptionStatus(status: Stripe.Subscription.Status): SubscriptionStatus {\n switch (status) {\n case 'active':\n return 'ACTIVE';\n case 'canceled':\n return 'CANCELED';\n case 'incomplete':\n return 'INCOMPLETE';\n case 'incomplete_expired':\n return 'INCOMPLETE_EXPIRED';\n case 'past_due':\n return 'PAST_DUE';\n case 'paused':\n return 'PAUSED';\n case 'trialing':\n return 'TRIALING';\n case 'unpaid':\n return 'UNPAID';\n default: {\n console.error(`Invalid stripe status: ${String(status)}`);\n throw new Error(`Invalid stripe status: ${String(status)}`);\n }\n }\n}\n\nexport const ZERO_DECIMAL_CURRENCIES = [\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n];\n\nexport function minorUnits(currency: string) {\n return ZERO_DECIMAL_CURRENCIES.includes(currency.toUpperCase()) ? 1 : 100;\n}\n\nexport function price(value: number, currency: string) {\n return value / minorUnits(currency);\n}\n\nexport interface Item {\n item_id: string;\n item_name: string;\n affiliation?: 'Google Store' | (string & {});\n coupon?: string;\n discount?: number;\n index?: number;\n item_brand?: string;\n item_category?: string;\n item_category2?: string;\n item_category3?: string;\n item_category4?: string;\n item_category5?: string;\n item_list_id?: string;\n item_list_name?: string;\n item_variant?: string;\n location_id?: string;\n price?: number;\n quantity?: number;\n}\n\nexport interface PurchaseProperties {\n currency: string;\n value: number;\n transaction_id: string;\n coupon?: string;\n shipping?: number;\n tax?: number;\n items?: Item[];\n}\n\nexport interface BeginCheckoutProperties {\n currency: string;\n value: number;\n coupon?: string;\n items: Item[];\n}\n\n// Google Ads rejects conversion transaction IDs longer than 64 characters.\n// https://support.google.com/google-ads/answer/6386790\nconst GOOGLE_ADS_TRANSACTION_ID_MAX = 64;\n\n/**\n * GA4 purchase events feed Google Ads conversions, whose transaction IDs are\n * capped at 64 characters — but Stripe checkout session ids exceed that:\n * around 2021 they grew from ~32 chars (`cs_live_` + 24 random chars) to ~66\n * (`cs_live_a` + 57), with no announcement. Stripe treats id length/format as\n * opaque and backwards-compatible, guaranteeing only that ids never exceed\n * 255 chars, so they may grow again at any time.\n *\n * Dropping the fixed `cs_live_`/`cs_test_` prefix brings the id under 64\n * while staying reversible: prepend the prefix (livemode tells which) to\n * reconstruct the full session id for Stripe dashboard lookups. The payment\n * intent id (~27 chars) is not a substitute — it only exists on\n * `mode: 'payment'` sessions (subscription-mode sessions carry it on the\n * invoice instead), and its short length is just as unguaranteed as the\n * session id's was.\n *\n * Must stay deterministic: GA4/Google Ads dedupe purchases by\n * transaction_id, and the same session may be tracked from multiple paths.\n */\nfunction toTransactionId(sessionId: string): string {\n const stripped = sessionId.replace(/^cs_(live|test)_/, '');\n if (stripped.length > GOOGLE_ADS_TRANSACTION_ID_MAX) {\n console.warn(\n `transaction_id still exceeds ${GOOGLE_ADS_TRANSACTION_ID_MAX} chars after stripping ` +\n `the prefix — Stripe may have lengthened session ids again; truncating: ${sessionId}`\n );\n }\n return stripped.slice(0, GOOGLE_ADS_TRANSACTION_ID_MAX);\n}\n\nexport function getPurchaseProperties(session: CheckoutSession): PurchaseProperties {\n let value: number;\n let currency: string;\n if (!session.amount_total || !session.currency) {\n value = session.line_items?.reduce((acc, item) => acc + item.amount_total, 0) ?? 0;\n currency = session.line_items?.[0]?.currency ?? 'usd';\n } else {\n value = session.amount_total;\n currency = session.currency;\n }\n\n return {\n transaction_id: toTransactionId(session.id),\n value: price(value, currency),\n currency: currency.toUpperCase(),\n coupon: session.coupon,\n items: session.line_items?.map((item, index) => ({\n index,\n item_id: item.id,\n item_name: item.description ?? '',\n price: price(item.amount_total, item.currency),\n quantity: item.quantity ?? 1,\n discount: price(item.amount_discount, item.currency),\n })),\n };\n}\n\nexport function getBeginCheckoutProperties(p: ProductPrice): BeginCheckoutProperties {\n return {\n currency: p.currency.toUpperCase(),\n value: price(p.unit_amount, p.currency),\n items: [\n {\n item_id: p.product.id,\n item_name: p.product.name,\n price: price(p.unit_amount, p.currency),\n },\n ],\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mapper.mjs","names":[],"sources":["../../src/stripe/mapper.ts"],"sourcesContent":["import type { Stripe } from 'stripe';\nimport {\n CANCELLATION_FEEDBACKS,\n type CancellationDetails,\n type CancellationFeedback,\n type SubscriptionStatus,\n} from '../subscription/index';\n\nexport function mapTime<T extends number | null>(\n stripeTimestampSeconds: T\n): T extends number ? string : null {\n if (!stripeTimestampSeconds) return null as T extends number ? string : null;\n return new Date(stripeTimestampSeconds * 1000).toISOString() as T extends number ? string : null;\n}\n\nexport type Price = {\n id: string;\n type: Stripe.Price.Type;\n active: boolean;\n billing_scheme: Stripe.Price.BillingScheme;\n currency: Stripe.Price['currency'];\n unit_amount: number | null;\n unit_amount_decimal: string | null;\n recurring: Stripe.Price.Recurring | null;\n};\n\nexport function mapPrice(price: Stripe.Price): Price {\n return {\n id: price.id,\n type: price.type,\n active: price.active,\n billing_scheme: price.billing_scheme,\n currency: price.currency,\n unit_amount: price.unit_amount,\n unit_amount_decimal: price.unit_amount_decimal?.toString() ?? null,\n recurring: price.recurring,\n };\n}\n\nexport interface LineItem {\n id: string;\n currency: string;\n quantity: number | null;\n description: string | null;\n amount_tax: number;\n amount_total: number;\n amount_subtotal: number;\n amount_discount: number;\n price: Price | null;\n}\n\nexport function mapLineItem(item: Stripe.LineItem): LineItem {\n return {\n id: item.price\n ? typeof item.price.product === 'string'\n ? item.price.product\n : item.price.product.id\n : item.id,\n currency: item.currency,\n quantity: item.quantity,\n description: item.description,\n amount_tax: item.amount_tax,\n amount_total: item.amount_total,\n amount_subtotal: item.amount_subtotal,\n amount_discount: item.amount_discount,\n price: item.price ? mapPrice(item.price) : null,\n };\n}\n\n// Re-exported under our own name so consumers need not reach into stripe's namespace.\n// Open-ended since stripe 22.4: a status the API adds later is not a type error.\nexport type PaymentStatus = Stripe.Checkout.Session.PaymentStatus;\n\n// Declared rather than inferred from mapCheckoutSession: an inferred shape is\n// structural, so a consumer's declaration emit has to spell out payment_status\n// through stripe's internal module path — TS2883 in any package that reaches\n// stripe transitively instead of depending on it (see line_items/price too).\nexport interface CheckoutSession {\n id: string;\n url: string | null;\n coupon: string | undefined;\n livemode: boolean;\n expires_at: number;\n payment_status: PaymentStatus;\n currency: string | null;\n amount_total: number | null;\n line_items: LineItem[] | undefined;\n}\n\nexport function mapCheckoutSession(session: Stripe.Checkout.Session): CheckoutSession {\n let coupon: string | undefined = undefined;\n if (Array.isArray(session.discounts) && session.discounts.length !== 0) {\n const discount = session.discounts[0];\n if (discount.coupon && typeof discount.coupon === 'object') {\n coupon = discount.coupon.id;\n } else if (typeof discount.coupon === 'string') {\n coupon = discount.coupon;\n } else {\n coupon = undefined;\n }\n }\n\n return {\n id: session.id,\n url: session.url,\n coupon,\n livemode: session.livemode,\n expires_at: session.expires_at,\n payment_status: session.payment_status,\n currency: session.currency,\n amount_total: session.amount_total,\n line_items: session.line_items?.data.map(mapLineItem),\n };\n}\n\nexport function mapInvoice(i: Stripe.Invoice) {\n return {\n id: i.id,\n number: i.number,\n total: i.total,\n subtotal: i.subtotal,\n amount_due: i.amount_due,\n amount_paid: i.amount_paid,\n amount_remaining: i.amount_remaining,\n currency: i.currency,\n billing_reason: i.billing_reason,\n hosted_invoice_url: i.hosted_invoice_url,\n invoice_pdf: i.invoice_pdf,\n receipt_number: i.receipt_number,\n status: i.status,\n created: i.created,\n period_start: i.period_start,\n period_end: i.period_end,\n };\n}\n\nexport function mapPaymentIntent(intent: Stripe.PaymentIntent) {\n return {\n id: intent.id,\n amount: intent.amount,\n amount_capturable: intent.amount_capturable,\n amount_received: intent.amount_received,\n currency: intent.currency,\n client_secret: intent.client_secret,\n description: intent.description,\n status: intent.status,\n created: intent.created,\n };\n}\n\nexport function mapCharge(charge: Stripe.Charge) {\n return {\n id: charge.id,\n description: charge.description,\n currency: charge.currency,\n amount: charge.amount,\n amount_captured: charge.amount_captured,\n amount_refunded: charge.amount_refunded,\n receipt_email: charge.receipt_email,\n receipt_number: charge.receipt_number,\n receipt_url: charge.receipt_url,\n status: charge.status,\n created: charge.created,\n payment_intent:\n charge.payment_intent && typeof charge.payment_intent === 'object'\n ? mapPaymentIntent(charge.payment_intent)\n : undefined,\n };\n}\n\nexport type ProductPrice = {\n id: string;\n type: Stripe.Price.Type;\n unit_amount: number;\n currency: Stripe.Price['currency'];\n product: {\n id: Stripe.Product['id'];\n name: Stripe.Product['name'];\n description: Stripe.Product['description'];\n livemode: Stripe.Product['livemode'];\n };\n};\n\nexport function mapSubscriptionStatus(status: Stripe.Subscription.Status): SubscriptionStatus {\n switch (status) {\n case 'active':\n return 'ACTIVE';\n case 'canceled':\n return 'CANCELED';\n case 'incomplete':\n return 'INCOMPLETE';\n case 'incomplete_expired':\n return 'INCOMPLETE_EXPIRED';\n case 'past_due':\n return 'PAST_DUE';\n case 'paused':\n return 'PAUSED';\n case 'trialing':\n return 'TRIALING';\n case 'unpaid':\n return 'UNPAID';\n default: {\n console.error(`Invalid stripe status: ${String(status)}`);\n throw new Error(`Invalid stripe status: ${String(status)}`);\n }\n }\n}\n\nexport const ZERO_DECIMAL_CURRENCIES = [\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n];\n\nexport function minorUnits(currency: string) {\n return ZERO_DECIMAL_CURRENCIES.includes(currency.toUpperCase()) ? 1 : 100;\n}\n\nexport function price(value: number, currency: string) {\n return value / minorUnits(currency);\n}\n\nexport interface Item {\n item_id: string;\n item_name: string;\n affiliation?: 'Google Store' | (string & {});\n coupon?: string;\n discount?: number;\n index?: number;\n item_brand?: string;\n item_category?: string;\n item_category2?: string;\n item_category3?: string;\n item_category4?: string;\n item_category5?: string;\n item_list_id?: string;\n item_list_name?: string;\n item_variant?: string;\n location_id?: string;\n price?: number;\n quantity?: number;\n}\n\nexport interface PurchaseProperties {\n currency: string;\n value: number;\n transaction_id: string;\n coupon?: string;\n shipping?: number;\n tax?: number;\n items?: Item[];\n}\n\nexport interface BeginCheckoutProperties {\n currency: string;\n value: number;\n coupon?: string;\n items: Item[];\n}\n\n// Google Ads rejects conversion transaction IDs longer than 64 characters.\n// https://support.google.com/google-ads/answer/6386790\nconst GOOGLE_ADS_TRANSACTION_ID_MAX = 64;\n\n/**\n * GA4 purchase events feed Google Ads conversions, whose transaction IDs are\n * capped at 64 characters — but Stripe checkout session ids exceed that:\n * around 2021 they grew from ~32 chars (`cs_live_` + 24 random chars) to ~66\n * (`cs_live_a` + 57), with no announcement. Stripe treats id length/format as\n * opaque and backwards-compatible, guaranteeing only that ids never exceed\n * 255 chars, so they may grow again at any time.\n *\n * Dropping the fixed `cs_live_`/`cs_test_` prefix brings the id under 64\n * while staying reversible: prepend the prefix (livemode tells which) to\n * reconstruct the full session id for Stripe dashboard lookups. The payment\n * intent id (~27 chars) is not a substitute — it only exists on\n * `mode: 'payment'` sessions (subscription-mode sessions carry it on the\n * invoice instead), and its short length is just as unguaranteed as the\n * session id's was.\n *\n * Must stay deterministic: GA4/Google Ads dedupe purchases by\n * transaction_id, and the same session may be tracked from multiple paths.\n */\nfunction toTransactionId(sessionId: string): string {\n const stripped = sessionId.replace(/^cs_(live|test)_/, '');\n if (stripped.length > GOOGLE_ADS_TRANSACTION_ID_MAX) {\n console.warn(\n `transaction_id still exceeds ${GOOGLE_ADS_TRANSACTION_ID_MAX} chars after stripping ` +\n `the prefix — Stripe may have lengthened session ids again; truncating: ${sessionId}`\n );\n }\n return stripped.slice(0, GOOGLE_ADS_TRANSACTION_ID_MAX);\n}\n\nexport function getPurchaseProperties(session: CheckoutSession): PurchaseProperties {\n let value: number;\n let currency: string;\n if (!session.amount_total || !session.currency) {\n value = session.line_items?.reduce((acc, item) => acc + item.amount_total, 0) ?? 0;\n currency = session.line_items?.[0]?.currency ?? 'usd';\n } else {\n value = session.amount_total;\n currency = session.currency;\n }\n\n return {\n transaction_id: toTransactionId(session.id),\n value: price(value, currency),\n currency: currency.toUpperCase(),\n coupon: session.coupon,\n items: session.line_items?.map((item, index) => ({\n index,\n item_id: item.id,\n item_name: item.description ?? '',\n price: price(item.amount_total, item.currency),\n quantity: item.quantity ?? 1,\n discount: price(item.amount_discount, item.currency),\n })),\n };\n}\n\nexport function getBeginCheckoutProperties(p: ProductPrice): BeginCheckoutProperties {\n return {\n currency: p.currency.toUpperCase(),\n value: price(p.unit_amount, p.currency),\n items: [\n {\n item_id: p.product.id,\n item_name: p.product.name,\n price: price(p.unit_amount, p.currency),\n },\n ],\n };\n}\n\n/**\n * Stripe's `cancellation_details` in the shared shape. The object is present on every\n * subscription with all three fields null, so an active one maps to null rather than an empty\n * record. `reason` says who acted: `cancellation_requested` is the customer (or us on their\n * behalf), the payment reasons are Stripe ending it.\n */\nexport function mapCancellationDetails(\n subscription: Pick<Stripe.Subscription, 'cancellation_details'>\n): CancellationDetails | null {\n const details = subscription.cancellation_details;\n if (!details || (!details.reason && !details.feedback && !details.comment)) return null;\n return {\n initiator:\n details.reason === 'payment_failed' || details.reason === 'payment_disputed'\n ? 'system'\n : 'user',\n reason: details.reason ?? null,\n // Stripe's feedback vocabulary is ours; anything it adds later is reported as \"other\".\n feedback: details.feedback\n ? (CANCELLATION_FEEDBACKS as readonly string[]).includes(details.feedback)\n ? (details.feedback as CancellationFeedback)\n : 'other'\n : null,\n comment: details.comment ?? null,\n };\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  //#region src/stripe/metadata.d.ts
2
- declare const METADATA_KEYS: {
2
+ export declare const METADATA_KEYS: {
3
3
  readonly USER_ID: 'user_id';
4
4
  readonly USER_ACCOUNT_TOKEN: 'user_account_token';
5
5
  readonly PRODUCT_ID: 'product_id';
@@ -8,5 +8,4 @@ declare const METADATA_KEYS: {
8
8
  readonly CREDIT_EXPIRES_IN: 'credit_expires_in';
9
9
  };
10
10
  //#endregion
11
- export { METADATA_KEYS };
12
11
  //# sourceMappingURL=metadata.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.cts","names":[],"sources":["../../src/stripe/metadata.ts"],"mappings":";cAAa;WACX;WACA;WACA;WACA;WACA;WACA"}
1
+ {"version":3,"file":"metadata.d.cts","names":[],"sources":["../../src/stripe/metadata.ts"],"mappings":";qBAAa;WACX;WACA;WACA;WACA;WACA;WACA"}
@@ -1,5 +1,5 @@
1
1
  //#region src/stripe/metadata.d.ts
2
- declare const METADATA_KEYS: {
2
+ export declare const METADATA_KEYS: {
3
3
  readonly USER_ID: 'user_id';
4
4
  readonly USER_ACCOUNT_TOKEN: 'user_account_token';
5
5
  readonly PRODUCT_ID: 'product_id';
@@ -8,5 +8,4 @@ declare const METADATA_KEYS: {
8
8
  readonly CREDIT_EXPIRES_IN: 'credit_expires_in';
9
9
  };
10
10
  //#endregion
11
- export { METADATA_KEYS };
12
11
  //# sourceMappingURL=metadata.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.mts","names":[],"sources":["../../src/stripe/metadata.ts"],"mappings":";cAAa;WACX;WACA;WACA;WACA;WACA;WACA"}
1
+ {"version":3,"file":"metadata.d.mts","names":[],"sources":["../../src/stripe/metadata.ts"],"mappings":";qBAAa;WACX;WACA;WACA;WACA;WACA;WACA"}
@@ -17,11 +17,10 @@
17
17
  * before the first was reconciled — must not clobber each other.
18
18
  */
19
19
  /** Record a started checkout to retry confirmation on later. Dedupes by session id. */
20
- declare function addPendingCheckout(sessionId: string): void;
20
+ export declare function addPendingCheckout(sessionId: string): void;
21
21
  /** Fresh session ids awaiting confirmation. Persists the pruned list as a side effect. */
22
- declare function getPendingCheckouts(): string[];
22
+ export declare function getPendingCheckouts(): string[];
23
23
  /** Drop one session once it's confirmed (or known not to belong to this user). */
24
- declare function removePendingCheckout(sessionId: string): void;
24
+ export declare function removePendingCheckout(sessionId: string): void;
25
25
  //#endregion
26
- export { addPendingCheckout, getPendingCheckouts, removePendingCheckout };
27
26
  //# sourceMappingURL=pending-checkout.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pending-checkout.d.cts","names":[],"sources":["../../src/stripe/pending-checkout.ts"],"mappings":";;;;;;;;;;;;;;;;;;;iBAwDgB,mBAAmB;;iBAOnB;;iBAQA,sBAAsB"}
1
+ {"version":3,"file":"pending-checkout.d.cts","names":[],"sources":["../../src/stripe/pending-checkout.ts"],"mappings":";;;;;;;;;;;;;;;;;;;wBAwDgB,mBAAmB;;wBAOnB;;wBAQA,sBAAsB"}
@@ -17,11 +17,10 @@
17
17
  * before the first was reconciled — must not clobber each other.
18
18
  */
19
19
  /** Record a started checkout to retry confirmation on later. Dedupes by session id. */
20
- declare function addPendingCheckout(sessionId: string): void;
20
+ export declare function addPendingCheckout(sessionId: string): void;
21
21
  /** Fresh session ids awaiting confirmation. Persists the pruned list as a side effect. */
22
- declare function getPendingCheckouts(): string[];
22
+ export declare function getPendingCheckouts(): string[];
23
23
  /** Drop one session once it's confirmed (or known not to belong to this user). */
24
- declare function removePendingCheckout(sessionId: string): void;
24
+ export declare function removePendingCheckout(sessionId: string): void;
25
25
  //#endregion
26
- export { addPendingCheckout, getPendingCheckouts, removePendingCheckout };
27
26
  //# sourceMappingURL=pending-checkout.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pending-checkout.d.mts","names":[],"sources":["../../src/stripe/pending-checkout.ts"],"mappings":";;;;;;;;;;;;;;;;;;;iBAwDgB,mBAAmB;;iBAOnB;;iBAQA,sBAAsB"}
1
+ {"version":3,"file":"pending-checkout.d.mts","names":[],"sources":["../../src/stripe/pending-checkout.ts"],"mappings":";;;;;;;;;;;;;;;;;;;wBAwDgB,mBAAmB;;wBAOnB;;wBAQA,sBAAsB"}
@@ -1,23 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_subscription_index = require("../subscription/index.cjs");
2
3
  let zod_mini = require("zod/mini");
3
4
  //#region src/stripe/schema.ts
5
+ /** What our own cancel dialog may send along with a cancellation (see `CancellationDetails`). */
4
6
  const cancellationDetailsSchema = (0, zod_mini.object)({
5
7
  comment: (0, zod_mini.optional)((0, zod_mini.nullable)((0, zod_mini.string)().check((0, zod_mini.maxLength)(1024)))),
6
- feedback: (0, zod_mini.optional)((0, zod_mini.nullable)((0, zod_mini.enum)([
7
- "customer_service",
8
- "low_quality",
9
- "missing_features",
10
- "switched_service",
11
- "too_complex",
12
- "too_expensive",
13
- "unused",
14
- "other"
15
- ]))),
16
- resubscribeIntent: (0, zod_mini.optional)((0, zod_mini.nullable)((0, zod_mini.enum)([
17
- "maybe",
18
- "no",
19
- "yes"
20
- ])))
8
+ feedback: (0, zod_mini.optional)((0, zod_mini.nullable)((0, zod_mini.enum)(require_subscription_index.CANCELLATION_FEEDBACKS))),
9
+ resubscribeIntent: (0, zod_mini.optional)((0, zod_mini.nullable)((0, zod_mini.enum)(require_subscription_index.RESUBSCRIBE_INTENTS)))
21
10
  });
22
11
  function createCheckoutSessionSchema(productIds) {
23
12
  return (0, zod_mini.object)({
@@ -1 +1 @@
1
- {"version":3,"file":"schema.cjs","names":["object","optional","nullable","string","maxLength","_enum","_default","int","gte","url"],"sources":["../../src/stripe/schema.ts"],"sourcesContent":["import type { Stripe } from 'stripe';\nimport {\n _default,\n enum as _enum,\n gte,\n int,\n maxLength,\n nullable,\n object,\n optional,\n type output,\n string,\n url,\n} from 'zod/mini';\n\nexport const cancellationDetailsSchema = object({\n comment: optional(nullable(string().check(maxLength(1024)))),\n feedback: optional(\n nullable(\n _enum([\n 'customer_service',\n 'low_quality',\n 'missing_features',\n 'switched_service',\n 'too_complex',\n 'too_expensive',\n 'unused',\n 'other',\n ])\n )\n ),\n resubscribeIntent: optional(nullable(_enum(['maybe', 'no', 'yes']))),\n});\n\nexport function createCheckoutSessionSchema(productIds: string[]) {\n return object({\n quantity: _default(int().check(gte(1)), 1),\n productId: _enum(productIds),\n cancelUrl: optional(url()),\n successUrl: optional(url()),\n });\n}\n\n// The schema validates what a client may send; this is the stored/returned shape,\n// so `feedback` and `reason` take stripe's own open-ended enums — since 22.4 both\n// carry `OtherString`, and a Subscription.cancellation_details is assigned here\n// verbatim.\nexport interface CancellationDetails extends Omit<\n output<typeof cancellationDetailsSchema>,\n 'feedback'\n> {\n feedback?: Stripe.Subscription.CancellationDetails.Feedback | null;\n reason?: Stripe.Subscription.CancellationDetails.Reason | null;\n}\n\nexport interface CreateCheckoutSessionDTO {\n productId: string;\n cancelUrl?: string;\n successUrl?: `${string}session_id={CHECKOUT_SESSION_ID}${string}`;\n}\n"],"mappings":";;;AAeA,MAAa,6BAAA,GAA4BA,SAAAA,OAAAA,CAAO;CAC9C,UAAA,GAASC,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,OAAAA,CAAO,CAAC,CAAC,OAAA,GAAMC,SAAAA,UAAAA,CAAU,IAAI,CAAC,CAAC,CAAC;CAC3D,WAAA,GAAUH,SAAAA,SAAAA,EAAAA,GACRC,SAAAA,SAAAA,EAAAA,GACEG,SAAAA,KAAAA,CAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CACH,CACF;CACA,oBAAA,GAAmBJ,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,SAAAA,EAAAA,GAASG,SAAAA,KAAAA,CAAM;EAAC;EAAS;EAAM;CAAK,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,4BAA4B,YAAsB;CAChE,QAAA,GAAOL,SAAAA,OAAAA,CAAO;EACZ,WAAA,GAAUM,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,IAAAA,CAAI,CAAC,CAAC,OAAA,GAAMC,SAAAA,IAAAA,CAAI,CAAC,CAAC,GAAG,CAAC;EACzC,YAAA,GAAWH,SAAAA,KAAAA,CAAM,UAAU;EAC3B,YAAA,GAAWJ,SAAAA,SAAAA,EAAAA,GAASQ,SAAAA,IAAAA,CAAI,CAAC;EACzB,aAAA,GAAYR,SAAAA,SAAAA,EAAAA,GAASQ,SAAAA,IAAAA,CAAI,CAAC;CAC5B,CAAC;AACH"}
1
+ {"version":3,"file":"schema.cjs","names":["object","optional","nullable","string","maxLength","_enum","CANCELLATION_FEEDBACKS","RESUBSCRIBE_INTENTS","_default","int","gte","url"],"sources":["../../src/stripe/schema.ts"],"sourcesContent":["import {\n _default,\n enum as _enum,\n gte,\n int,\n maxLength,\n nullable,\n object,\n optional,\n string,\n url,\n} from 'zod/mini';\nimport { CANCELLATION_FEEDBACKS, RESUBSCRIBE_INTENTS } from '../subscription/index';\n\n/** What our own cancel dialog may send along with a cancellation (see `CancellationDetails`). */\nexport const cancellationDetailsSchema = object({\n comment: optional(nullable(string().check(maxLength(1024)))),\n feedback: optional(nullable(_enum(CANCELLATION_FEEDBACKS))),\n resubscribeIntent: optional(nullable(_enum(RESUBSCRIBE_INTENTS))),\n});\n\nexport function createCheckoutSessionSchema(productIds: string[]) {\n return object({\n quantity: _default(int().check(gte(1)), 1),\n productId: _enum(productIds),\n cancelUrl: optional(url()),\n successUrl: optional(url()),\n });\n}\n\n// Kept under the stripe entry for callers that imported it from here; the type is platform\n// neutral and lives with the subscription statuses.\nexport type { CancellationDetails } from '../subscription/index';\n\nexport interface CreateCheckoutSessionDTO {\n productId: string;\n cancelUrl?: string;\n successUrl?: `${string}session_id={CHECKOUT_SESSION_ID}${string}`;\n}\n"],"mappings":";;;;;AAeA,MAAa,6BAAA,GAA4BA,SAAAA,OAAAA,CAAO;CAC9C,UAAA,GAASC,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,OAAAA,CAAO,CAAC,CAAC,OAAA,GAAMC,SAAAA,UAAAA,CAAU,IAAI,CAAC,CAAC,CAAC;CAC3D,WAAA,GAAUH,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,SAAAA,EAAAA,GAASG,SAAAA,KAAAA,CAAMC,2BAAAA,sBAAsB,CAAC,CAAC;CAC1D,oBAAA,GAAmBL,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,SAAAA,EAAAA,GAASG,SAAAA,KAAAA,CAAME,2BAAAA,mBAAmB,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,4BAA4B,YAAsB;CAChE,QAAA,GAAOP,SAAAA,OAAAA,CAAO;EACZ,WAAA,GAAUQ,SAAAA,SAAAA,EAAAA,GAASC,SAAAA,IAAAA,CAAI,CAAC,CAAC,OAAA,GAAMC,SAAAA,IAAAA,CAAI,CAAC,CAAC,GAAG,CAAC;EACzC,YAAA,GAAWL,SAAAA,KAAAA,CAAM,UAAU;EAC3B,YAAA,GAAWJ,SAAAA,SAAAA,EAAAA,GAASU,SAAAA,IAAAA,CAAI,CAAC;EACzB,aAAA,GAAYV,SAAAA,SAAAA,EAAAA,GAASU,SAAAA,IAAAA,CAAI,CAAC;CAC5B,CAAC;AACH"}
@@ -1,7 +1,7 @@
1
- import { Stripe } from "stripe";
2
- import { output } from "zod/mini";
1
+ import { CancellationDetails } from "../subscription/index.cjs";
3
2
  //#region src/stripe/schema.d.ts
4
- declare const cancellationDetailsSchema: import("zod/mini").ZodMiniObject<{
3
+ /** What our own cancel dialog may send along with a cancellation (see `CancellationDetails`). */
4
+ export declare const cancellationDetailsSchema: import("zod/mini").ZodMiniObject<{
5
5
  comment: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniNullable<import("zod/mini").ZodMiniString<string>>>;
6
6
  feedback: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniNullable<import("zod/mini").ZodMiniEnum<{
7
7
  customer_service: "customer_service";
@@ -19,23 +19,19 @@ declare const cancellationDetailsSchema: import("zod/mini").ZodMiniObject<{
19
19
  yes: "yes";
20
20
  }>>>;
21
21
  }, import("zod/v4/core").$strip>;
22
- declare function createCheckoutSessionSchema(productIds: string[]): import("zod/mini").ZodMiniObject<{
23
- quantity: import("zod/mini").ZodMiniDefault<import("zod/mini").ZodMiniNumberFormat>;
22
+ export declare function createCheckoutSessionSchema(productIds: string[]): import("zod/mini").ZodMiniObject<{
23
+ quantity: import("zod/mini").ZodMiniDefault<import("zod/mini").ZodMiniInt>;
24
24
  productId: import("zod/mini").ZodMiniEnum<{
25
25
  [x: string]: string;
26
26
  }>;
27
27
  cancelUrl: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniURL>;
28
28
  successUrl: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniURL>;
29
29
  }, import("zod/v4/core").$strip>;
30
- interface CancellationDetails extends Omit<output<typeof cancellationDetailsSchema>, 'feedback'> {
31
- feedback?: Stripe.Subscription.CancellationDetails.Feedback | null;
32
- reason?: Stripe.Subscription.CancellationDetails.Reason | null;
33
- }
34
- interface CreateCheckoutSessionDTO {
30
+ export interface CreateCheckoutSessionDTO {
35
31
  productId: string;
36
32
  cancelUrl?: string;
37
33
  successUrl?: `${string}session_id={CHECKOUT_SESSION_ID}${string}`;
38
34
  }
39
35
  //#endregion
40
- export { CancellationDetails, CreateCheckoutSessionDTO, cancellationDetailsSchema, createCheckoutSessionSchema };
36
+ export type { CancellationDetails };
41
37
  //# sourceMappingURL=schema.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.cts","names":[],"sources":["../../src/stripe/schema.ts"],"mappings":";;;cAea,8CAAyB;;;;;;;;;;;;;;;;;yBAiBpC;iBAEc,4BAA4B,0CAAoB;;;;;;;yBAO/D;UAMgB,4BAA4B,KAC3C,cAAc;EAGd,WAAW,OAAO,aAAa,oBAAoB;EACnD,SAAS,OAAO,aAAa,oBAAoB;;UAGlC;EACf;EACA;EACA"}
1
+ {"version":3,"file":"schema.d.cts","names":[],"sources":["../../src/stripe/schema.ts"],"mappings":";;;qBAea,8CAAyB;;;;;;;;;;;;;;;;;yBAIpC;wBAEc,4BAA4B,0CAAoB;;;;;;;yBAO/D;iBAMgB;EACf;EACA;EACA"}
@@ -1,7 +1,7 @@
1
- import { output } from "zod/mini";
2
- import { Stripe } from "stripe";
1
+ import { CancellationDetails } from "../subscription/index.mjs";
3
2
  //#region src/stripe/schema.d.ts
4
- declare const cancellationDetailsSchema: import("zod/mini").ZodMiniObject<{
3
+ /** What our own cancel dialog may send along with a cancellation (see `CancellationDetails`). */
4
+ export declare const cancellationDetailsSchema: import("zod/mini").ZodMiniObject<{
5
5
  comment: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniNullable<import("zod/mini").ZodMiniString<string>>>;
6
6
  feedback: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniNullable<import("zod/mini").ZodMiniEnum<{
7
7
  customer_service: "customer_service";
@@ -19,23 +19,19 @@ declare const cancellationDetailsSchema: import("zod/mini").ZodMiniObject<{
19
19
  yes: "yes";
20
20
  }>>>;
21
21
  }, import("zod/v4/core").$strip>;
22
- declare function createCheckoutSessionSchema(productIds: string[]): import("zod/mini").ZodMiniObject<{
23
- quantity: import("zod/mini").ZodMiniDefault<import("zod/mini").ZodMiniNumberFormat>;
22
+ export declare function createCheckoutSessionSchema(productIds: string[]): import("zod/mini").ZodMiniObject<{
23
+ quantity: import("zod/mini").ZodMiniDefault<import("zod/mini").ZodMiniInt>;
24
24
  productId: import("zod/mini").ZodMiniEnum<{
25
25
  [x: string]: string;
26
26
  }>;
27
27
  cancelUrl: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniURL>;
28
28
  successUrl: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniURL>;
29
29
  }, import("zod/v4/core").$strip>;
30
- interface CancellationDetails extends Omit<output<typeof cancellationDetailsSchema>, 'feedback'> {
31
- feedback?: Stripe.Subscription.CancellationDetails.Feedback | null;
32
- reason?: Stripe.Subscription.CancellationDetails.Reason | null;
33
- }
34
- interface CreateCheckoutSessionDTO {
30
+ export interface CreateCheckoutSessionDTO {
35
31
  productId: string;
36
32
  cancelUrl?: string;
37
33
  successUrl?: `${string}session_id={CHECKOUT_SESSION_ID}${string}`;
38
34
  }
39
35
  //#endregion
40
- export { CancellationDetails, CreateCheckoutSessionDTO, cancellationDetailsSchema, createCheckoutSessionSchema };
36
+ export type { CancellationDetails };
41
37
  //# sourceMappingURL=schema.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.mts","names":[],"sources":["../../src/stripe/schema.ts"],"mappings":";;;cAea,8CAAyB;;;;;;;;;;;;;;;;;yBAiBpC;iBAEc,4BAA4B,0CAAoB;;;;;;;yBAO/D;UAMgB,4BAA4B,KAC3C,cAAc;EAGd,WAAW,OAAO,aAAa,oBAAoB;EACnD,SAAS,OAAO,aAAa,oBAAoB;;UAGlC;EACf;EACA;EACA"}
1
+ {"version":3,"file":"schema.d.mts","names":[],"sources":["../../src/stripe/schema.ts"],"mappings":";;;qBAea,8CAAyB;;;;;;;;;;;;;;;;;yBAIpC;wBAEc,4BAA4B,0CAAoB;;;;;;;yBAO/D;iBAMgB;EACf;EACA;EACA"}
@@ -1,22 +1,11 @@
1
+ import { CANCELLATION_FEEDBACKS, RESUBSCRIBE_INTENTS } from "../subscription/index.mjs";
1
2
  import { _default, enum as enum$1, gte, int, maxLength, nullable, object, optional, string, url } from "zod/mini";
2
3
  //#region src/stripe/schema.ts
4
+ /** What our own cancel dialog may send along with a cancellation (see `CancellationDetails`). */
3
5
  const cancellationDetailsSchema = object({
4
6
  comment: optional(nullable(string().check(maxLength(1024)))),
5
- feedback: optional(nullable(enum$1([
6
- "customer_service",
7
- "low_quality",
8
- "missing_features",
9
- "switched_service",
10
- "too_complex",
11
- "too_expensive",
12
- "unused",
13
- "other"
14
- ]))),
15
- resubscribeIntent: optional(nullable(enum$1([
16
- "maybe",
17
- "no",
18
- "yes"
19
- ])))
7
+ feedback: optional(nullable(enum$1(CANCELLATION_FEEDBACKS))),
8
+ resubscribeIntent: optional(nullable(enum$1(RESUBSCRIBE_INTENTS)))
20
9
  });
21
10
  function createCheckoutSessionSchema(productIds) {
22
11
  return object({
@@ -1 +1 @@
1
- {"version":3,"file":"schema.mjs","names":["_enum"],"sources":["../../src/stripe/schema.ts"],"sourcesContent":["import type { Stripe } from 'stripe';\nimport {\n _default,\n enum as _enum,\n gte,\n int,\n maxLength,\n nullable,\n object,\n optional,\n type output,\n string,\n url,\n} from 'zod/mini';\n\nexport const cancellationDetailsSchema = object({\n comment: optional(nullable(string().check(maxLength(1024)))),\n feedback: optional(\n nullable(\n _enum([\n 'customer_service',\n 'low_quality',\n 'missing_features',\n 'switched_service',\n 'too_complex',\n 'too_expensive',\n 'unused',\n 'other',\n ])\n )\n ),\n resubscribeIntent: optional(nullable(_enum(['maybe', 'no', 'yes']))),\n});\n\nexport function createCheckoutSessionSchema(productIds: string[]) {\n return object({\n quantity: _default(int().check(gte(1)), 1),\n productId: _enum(productIds),\n cancelUrl: optional(url()),\n successUrl: optional(url()),\n });\n}\n\n// The schema validates what a client may send; this is the stored/returned shape,\n// so `feedback` and `reason` take stripe's own open-ended enums — since 22.4 both\n// carry `OtherString`, and a Subscription.cancellation_details is assigned here\n// verbatim.\nexport interface CancellationDetails extends Omit<\n output<typeof cancellationDetailsSchema>,\n 'feedback'\n> {\n feedback?: Stripe.Subscription.CancellationDetails.Feedback | null;\n reason?: Stripe.Subscription.CancellationDetails.Reason | null;\n}\n\nexport interface CreateCheckoutSessionDTO {\n productId: string;\n cancelUrl?: string;\n successUrl?: `${string}session_id={CHECKOUT_SESSION_ID}${string}`;\n}\n"],"mappings":";;AAeA,MAAa,4BAA4B,OAAO;CAC9C,SAAS,SAAS,SAAS,OAAO,CAAC,CAAC,MAAM,UAAU,IAAI,CAAC,CAAC,CAAC;CAC3D,UAAU,SACR,SACEA,OAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CACH,CACF;CACA,mBAAmB,SAAS,SAASA,OAAM;EAAC;EAAS;EAAM;CAAK,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,4BAA4B,YAAsB;CAChE,OAAO,OAAO;EACZ,UAAU,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;EACzC,WAAWA,OAAM,UAAU;EAC3B,WAAW,SAAS,IAAI,CAAC;EACzB,YAAY,SAAS,IAAI,CAAC;CAC5B,CAAC;AACH"}
1
+ {"version":3,"file":"schema.mjs","names":["_enum"],"sources":["../../src/stripe/schema.ts"],"sourcesContent":["import {\n _default,\n enum as _enum,\n gte,\n int,\n maxLength,\n nullable,\n object,\n optional,\n string,\n url,\n} from 'zod/mini';\nimport { CANCELLATION_FEEDBACKS, RESUBSCRIBE_INTENTS } from '../subscription/index';\n\n/** What our own cancel dialog may send along with a cancellation (see `CancellationDetails`). */\nexport const cancellationDetailsSchema = object({\n comment: optional(nullable(string().check(maxLength(1024)))),\n feedback: optional(nullable(_enum(CANCELLATION_FEEDBACKS))),\n resubscribeIntent: optional(nullable(_enum(RESUBSCRIBE_INTENTS))),\n});\n\nexport function createCheckoutSessionSchema(productIds: string[]) {\n return object({\n quantity: _default(int().check(gte(1)), 1),\n productId: _enum(productIds),\n cancelUrl: optional(url()),\n successUrl: optional(url()),\n });\n}\n\n// Kept under the stripe entry for callers that imported it from here; the type is platform\n// neutral and lives with the subscription statuses.\nexport type { CancellationDetails } from '../subscription/index';\n\nexport interface CreateCheckoutSessionDTO {\n productId: string;\n cancelUrl?: string;\n successUrl?: `${string}session_id={CHECKOUT_SESSION_ID}${string}`;\n}\n"],"mappings":";;;;AAeA,MAAa,4BAA4B,OAAO;CAC9C,SAAS,SAAS,SAAS,OAAO,CAAC,CAAC,MAAM,UAAU,IAAI,CAAC,CAAC,CAAC;CAC3D,UAAU,SAAS,SAASA,OAAM,sBAAsB,CAAC,CAAC;CAC1D,mBAAmB,SAAS,SAASA,OAAM,mBAAmB,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,4BAA4B,YAAsB;CAChE,OAAO,OAAO;EACZ,UAAU,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;EACzC,WAAWA,OAAM,UAAU;EAC3B,WAAW,SAAS,IAAI,CAAC;EACzB,YAAY,SAAS,IAAI,CAAC;CAC5B,CAAC;AACH"}