@modainteract/moda-interact-shared 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/billing.d.ts CHANGED
@@ -2,6 +2,10 @@ import { z } from 'zod';
2
2
 
3
3
  declare const ARCH007_BILLING_CONTRACT_SCHEMA_VERSION: 1;
4
4
  declare const WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION: 2;
5
+ declare const BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION: 1;
6
+ declare const BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME = "billing-subscription-reconcile";
7
+ declare const BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME = "reconcile-subscription";
8
+ declare const APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS: 300000;
5
9
  declare const BILLING_PLAN_KINDS: readonly ["FREE", "PAID_METERED"];
6
10
  declare const BillingPlanKindSchema: z.ZodEnum<{
7
11
  FREE: "FREE";
@@ -19,20 +23,78 @@ type BillingUsageMetric = z.infer<typeof BillingUsageMetricSchema>;
19
23
  declare const BILLING_SYSTEM_MESSAGE_CODES: {
20
24
  readonly FREE_ALLOWANCE_WARNING: "BILLING_FREE_ALLOWANCE_WARNING";
21
25
  readonly FREE_ALLOWANCE_EXHAUSTED: "BILLING_FREE_ALLOWANCE_EXHAUSTED";
26
+ readonly RECOVERY_CAPACITY_EXHAUSTED: "BILLING_RECOVERY_CAPACITY_EXHAUSTED";
22
27
  readonly PLAN_UPGRADED: "BILLING_PLAN_UPGRADED";
23
28
  readonly PLAN_DOWNGRADE_SCHEDULED: "BILLING_PLAN_DOWNGRADE_SCHEDULED";
24
29
  readonly SUBSCRIPTION_ENDED: "BILLING_SUBSCRIPTION_ENDED";
25
30
  readonly SAFETY_LIMIT_REACHED: "BILLING_SAFETY_LIMIT_REACHED";
31
+ readonly PLAN_CHANGE_ACTION_REQUIRED: "BILLING_PLAN_CHANGE_ACTION_REQUIRED";
32
+ readonly CANCELLATION_REQUEST_RECEIVED: "BILLING_CANCELLATION_REQUEST_RECEIVED";
33
+ readonly CANCELLATION_COMPLETED: "BILLING_CANCELLATION_COMPLETED";
34
+ readonly CANCELLATION_REJECTED: "BILLING_CANCELLATION_REJECTED";
35
+ readonly REFUND_REQUEST_RECEIVED: "BILLING_REFUND_REQUEST_RECEIVED";
36
+ readonly REFUND_COMPLETED: "BILLING_REFUND_COMPLETED";
37
+ readonly REFUND_REJECTED: "BILLING_REFUND_REJECTED";
26
38
  };
27
39
  declare const BillingSystemMessageCodeSchema: z.ZodEnum<{
28
40
  BILLING_FREE_ALLOWANCE_WARNING: "BILLING_FREE_ALLOWANCE_WARNING";
29
41
  BILLING_FREE_ALLOWANCE_EXHAUSTED: "BILLING_FREE_ALLOWANCE_EXHAUSTED";
42
+ BILLING_RECOVERY_CAPACITY_EXHAUSTED: "BILLING_RECOVERY_CAPACITY_EXHAUSTED";
30
43
  BILLING_PLAN_UPGRADED: "BILLING_PLAN_UPGRADED";
31
44
  BILLING_PLAN_DOWNGRADE_SCHEDULED: "BILLING_PLAN_DOWNGRADE_SCHEDULED";
32
45
  BILLING_SUBSCRIPTION_ENDED: "BILLING_SUBSCRIPTION_ENDED";
33
46
  BILLING_SAFETY_LIMIT_REACHED: "BILLING_SAFETY_LIMIT_REACHED";
47
+ BILLING_PLAN_CHANGE_ACTION_REQUIRED: "BILLING_PLAN_CHANGE_ACTION_REQUIRED";
48
+ BILLING_CANCELLATION_REQUEST_RECEIVED: "BILLING_CANCELLATION_REQUEST_RECEIVED";
49
+ BILLING_CANCELLATION_COMPLETED: "BILLING_CANCELLATION_COMPLETED";
50
+ BILLING_CANCELLATION_REJECTED: "BILLING_CANCELLATION_REJECTED";
51
+ BILLING_REFUND_REQUEST_RECEIVED: "BILLING_REFUND_REQUEST_RECEIVED";
52
+ BILLING_REFUND_COMPLETED: "BILLING_REFUND_COMPLETED";
53
+ BILLING_REFUND_REJECTED: "BILLING_REFUND_REJECTED";
34
54
  }>;
35
55
  type BillingSystemMessageCode = z.infer<typeof BillingSystemMessageCodeSchema>;
56
+ declare const SUBSCRIPTION_CANCELLATION_MODES: readonly ["END_OF_CYCLE", "IMMEDIATE_NO_PRORATION", "IMMEDIATE_PRORATED", "IMMEDIATE_SKIP_FINAL_USAGE"];
57
+ declare const SubscriptionCancellationModeSchema: z.ZodEnum<{
58
+ END_OF_CYCLE: "END_OF_CYCLE";
59
+ IMMEDIATE_NO_PRORATION: "IMMEDIATE_NO_PRORATION";
60
+ IMMEDIATE_PRORATED: "IMMEDIATE_PRORATED";
61
+ IMMEDIATE_SKIP_FINAL_USAGE: "IMMEDIATE_SKIP_FINAL_USAGE";
62
+ }>;
63
+ type SubscriptionCancellationMode = z.infer<typeof SubscriptionCancellationModeSchema>;
64
+ type ShopifySubscriptionCancellationArgs = Readonly<{
65
+ deferCancellation: boolean;
66
+ prorate: boolean;
67
+ skipFinalUsageCharge: boolean;
68
+ }>;
69
+ declare const SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS: {
70
+ readonly END_OF_CYCLE: {
71
+ readonly deferCancellation: true;
72
+ readonly prorate: false;
73
+ readonly skipFinalUsageCharge: false;
74
+ };
75
+ readonly IMMEDIATE_NO_PRORATION: {
76
+ readonly deferCancellation: false;
77
+ readonly prorate: false;
78
+ readonly skipFinalUsageCharge: false;
79
+ };
80
+ readonly IMMEDIATE_PRORATED: {
81
+ readonly deferCancellation: false;
82
+ readonly prorate: true;
83
+ readonly skipFinalUsageCharge: false;
84
+ };
85
+ readonly IMMEDIATE_SKIP_FINAL_USAGE: {
86
+ readonly deferCancellation: false;
87
+ readonly prorate: false;
88
+ readonly skipFinalUsageCharge: true;
89
+ };
90
+ };
91
+ type PurchasedRecoveryCreditCounterSnapshot = Readonly<{
92
+ grantedQuantity: number;
93
+ committedQuantity: number;
94
+ reservedQuantity: number;
95
+ refundingQuantity: number;
96
+ }>;
97
+ declare function availablePurchasedRecoveryCredits(counter: PurchasedRecoveryCreditCounterSnapshot): number;
36
98
  declare const WHATSAPP_PROVIDER_STATUSES: readonly ["SENT", "DELIVERED", "READ", "FAILED"];
37
99
  declare const WhatsAppProviderStatusSchema: z.ZodEnum<{
38
100
  SENT: "SENT";
@@ -41,6 +103,20 @@ declare const WhatsAppProviderStatusSchema: z.ZodEnum<{
41
103
  FAILED: "FAILED";
42
104
  }>;
43
105
  type WhatsAppProviderStatus = z.infer<typeof WhatsAppProviderStatusSchema>;
106
+ declare const BillingSubscriptionReconcileJobSchema: z.ZodObject<{
107
+ schemaVersion: z.ZodLiteral<1>;
108
+ shopId: z.ZodString;
109
+ subscriptionId: z.ZodString;
110
+ expectedNextReconcileAt: z.ZodISODateTime;
111
+ }, z.core.$strict>;
112
+ type BillingSubscriptionReconcileJob = z.infer<typeof BillingSubscriptionReconcileJobSchema>;
113
+ declare function parseBillingSubscriptionReconcileJob(input: unknown): BillingSubscriptionReconcileJob;
114
+ declare function safeParseBillingSubscriptionReconcileJob(input: unknown): z.ZodSafeParseResult<{
115
+ schemaVersion: 1;
116
+ shopId: string;
117
+ subscriptionId: string;
118
+ expectedNextReconcileAt: string;
119
+ }>;
44
120
  declare const WhatsAppProviderPricingMetadataSchema: z.ZodObject<{
45
121
  billable: z.ZodOptional<z.ZodBoolean>;
46
122
  category: z.ZodOptional<z.ZodString>;
@@ -80,8 +156,9 @@ declare function safeParseNormalizedWhatsAppStatus(input: unknown): z.ZodSafePar
80
156
  model?: string | undefined;
81
157
  } | undefined;
82
158
  }>;
159
+ declare function createBillingSubscriptionReconcileJobId(subscriptionId: string, expectedNextReconcileAt: string): string;
83
160
  declare function createMerchantBillingSystemSourceKey(shopId: string, code: BillingSystemMessageCode, eventIdentity: string, version?: number): string;
84
161
  declare function createRecoveryIdempotencyKey(shopId: string, recoveryId: string): string;
85
162
  declare function createShopifyUsageIdempotencyKey(shopId: string, usageEventId: string): string;
86
163
 
87
- export { ARCH007_BILLING_CONTRACT_SCHEMA_VERSION, BILLING_PLAN_KINDS, BILLING_SYSTEM_MESSAGE_CODES, BILLING_USAGE_METRICS, type BillingPlanKind, BillingPlanKindSchema, type BillingSystemMessageCode, BillingSystemMessageCodeSchema, type BillingUsageMetric, BillingUsageMetricSchema, type NormalizedWhatsAppStatus, NormalizedWhatsAppStatusSchema, WHATSAPP_PROVIDER_STATUSES, WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION, type WhatsAppProviderPricingMetadata, WhatsAppProviderPricingMetadataSchema, type WhatsAppProviderStatus, WhatsAppProviderStatusSchema, createMerchantBillingSystemSourceKey, createRecoveryIdempotencyKey, createShopifyUsageIdempotencyKey, parseNormalizedWhatsAppStatus, safeParseNormalizedWhatsAppStatus };
164
+ export { APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS, ARCH007_BILLING_CONTRACT_SCHEMA_VERSION, BILLING_PLAN_KINDS, BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME, BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME, BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION, BILLING_SYSTEM_MESSAGE_CODES, BILLING_USAGE_METRICS, type BillingPlanKind, BillingPlanKindSchema, type BillingSubscriptionReconcileJob, BillingSubscriptionReconcileJobSchema, type BillingSystemMessageCode, BillingSystemMessageCodeSchema, type BillingUsageMetric, BillingUsageMetricSchema, type NormalizedWhatsAppStatus, NormalizedWhatsAppStatusSchema, type PurchasedRecoveryCreditCounterSnapshot, SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS, SUBSCRIPTION_CANCELLATION_MODES, type ShopifySubscriptionCancellationArgs, type SubscriptionCancellationMode, SubscriptionCancellationModeSchema, WHATSAPP_PROVIDER_STATUSES, WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION, type WhatsAppProviderPricingMetadata, WhatsAppProviderPricingMetadataSchema, type WhatsAppProviderStatus, WhatsAppProviderStatusSchema, availablePurchasedRecoveryCredits, createBillingSubscriptionReconcileJobId, createMerchantBillingSystemSourceKey, createRecoveryIdempotencyKey, createShopifyUsageIdempotencyKey, parseBillingSubscriptionReconcileJob, parseNormalizedWhatsAppStatus, safeParseBillingSubscriptionReconcileJob, safeParseNormalizedWhatsAppStatus };
package/dist/billing.js CHANGED
@@ -1,39 +1,63 @@
1
1
  import {
2
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
2
3
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
3
4
  BILLING_PLAN_KINDS,
5
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
6
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
7
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
4
8
  BILLING_SYSTEM_MESSAGE_CODES,
5
9
  BILLING_USAGE_METRICS,
6
10
  BillingPlanKindSchema,
11
+ BillingSubscriptionReconcileJobSchema,
7
12
  BillingSystemMessageCodeSchema,
8
13
  BillingUsageMetricSchema,
9
14
  NormalizedWhatsAppStatusSchema,
15
+ SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
16
+ SUBSCRIPTION_CANCELLATION_MODES,
17
+ SubscriptionCancellationModeSchema,
10
18
  WHATSAPP_PROVIDER_STATUSES,
11
19
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
12
20
  WhatsAppProviderPricingMetadataSchema,
13
21
  WhatsAppProviderStatusSchema,
22
+ availablePurchasedRecoveryCredits,
23
+ createBillingSubscriptionReconcileJobId,
14
24
  createMerchantBillingSystemSourceKey,
15
25
  createRecoveryIdempotencyKey,
16
26
  createShopifyUsageIdempotencyKey,
27
+ parseBillingSubscriptionReconcileJob,
17
28
  parseNormalizedWhatsAppStatus,
29
+ safeParseBillingSubscriptionReconcileJob,
18
30
  safeParseNormalizedWhatsAppStatus
19
- } from "./chunk-RFTEH4ER.js";
31
+ } from "./chunk-KO4LMZ66.js";
20
32
  export {
33
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
21
34
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
22
35
  BILLING_PLAN_KINDS,
36
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
37
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
38
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
23
39
  BILLING_SYSTEM_MESSAGE_CODES,
24
40
  BILLING_USAGE_METRICS,
25
41
  BillingPlanKindSchema,
42
+ BillingSubscriptionReconcileJobSchema,
26
43
  BillingSystemMessageCodeSchema,
27
44
  BillingUsageMetricSchema,
28
45
  NormalizedWhatsAppStatusSchema,
46
+ SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
47
+ SUBSCRIPTION_CANCELLATION_MODES,
48
+ SubscriptionCancellationModeSchema,
29
49
  WHATSAPP_PROVIDER_STATUSES,
30
50
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
31
51
  WhatsAppProviderPricingMetadataSchema,
32
52
  WhatsAppProviderStatusSchema,
53
+ availablePurchasedRecoveryCredits,
54
+ createBillingSubscriptionReconcileJobId,
33
55
  createMerchantBillingSystemSourceKey,
34
56
  createRecoveryIdempotencyKey,
35
57
  createShopifyUsageIdempotencyKey,
58
+ parseBillingSubscriptionReconcileJob,
36
59
  parseNormalizedWhatsAppStatus,
60
+ safeParseBillingSubscriptionReconcileJob,
37
61
  safeParseNormalizedWhatsAppStatus
38
62
  };
39
63
  //# sourceMappingURL=billing.js.map
@@ -2,6 +2,10 @@
2
2
  import { z } from "zod";
3
3
  var ARCH007_BILLING_CONTRACT_SCHEMA_VERSION = 1;
4
4
  var WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION = 2;
5
+ var BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION = 1;
6
+ var BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME = "billing-subscription-reconcile";
7
+ var BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME = "reconcile-subscription";
8
+ var APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS = 3e5;
5
9
  var BILLING_PLAN_KINDS = ["FREE", "PAID_METERED"];
6
10
  var BillingPlanKindSchema = z.enum(BILLING_PLAN_KINDS);
7
11
  var BILLING_USAGE_METRICS = [
@@ -14,20 +18,76 @@ var BillingUsageMetricSchema = z.enum(BILLING_USAGE_METRICS);
14
18
  var BILLING_SYSTEM_MESSAGE_CODES = {
15
19
  FREE_ALLOWANCE_WARNING: "BILLING_FREE_ALLOWANCE_WARNING",
16
20
  FREE_ALLOWANCE_EXHAUSTED: "BILLING_FREE_ALLOWANCE_EXHAUSTED",
21
+ RECOVERY_CAPACITY_EXHAUSTED: "BILLING_RECOVERY_CAPACITY_EXHAUSTED",
17
22
  PLAN_UPGRADED: "BILLING_PLAN_UPGRADED",
18
23
  PLAN_DOWNGRADE_SCHEDULED: "BILLING_PLAN_DOWNGRADE_SCHEDULED",
19
24
  SUBSCRIPTION_ENDED: "BILLING_SUBSCRIPTION_ENDED",
20
- SAFETY_LIMIT_REACHED: "BILLING_SAFETY_LIMIT_REACHED"
25
+ SAFETY_LIMIT_REACHED: "BILLING_SAFETY_LIMIT_REACHED",
26
+ PLAN_CHANGE_ACTION_REQUIRED: "BILLING_PLAN_CHANGE_ACTION_REQUIRED",
27
+ CANCELLATION_REQUEST_RECEIVED: "BILLING_CANCELLATION_REQUEST_RECEIVED",
28
+ CANCELLATION_COMPLETED: "BILLING_CANCELLATION_COMPLETED",
29
+ CANCELLATION_REJECTED: "BILLING_CANCELLATION_REJECTED",
30
+ REFUND_REQUEST_RECEIVED: "BILLING_REFUND_REQUEST_RECEIVED",
31
+ REFUND_COMPLETED: "BILLING_REFUND_COMPLETED",
32
+ REFUND_REJECTED: "BILLING_REFUND_REJECTED"
21
33
  };
22
34
  var BILLING_SYSTEM_MESSAGE_CODE_VALUES = [
23
35
  BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_WARNING,
24
36
  BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_EXHAUSTED,
37
+ BILLING_SYSTEM_MESSAGE_CODES.RECOVERY_CAPACITY_EXHAUSTED,
25
38
  BILLING_SYSTEM_MESSAGE_CODES.PLAN_UPGRADED,
26
39
  BILLING_SYSTEM_MESSAGE_CODES.PLAN_DOWNGRADE_SCHEDULED,
27
40
  BILLING_SYSTEM_MESSAGE_CODES.SUBSCRIPTION_ENDED,
28
- BILLING_SYSTEM_MESSAGE_CODES.SAFETY_LIMIT_REACHED
41
+ BILLING_SYSTEM_MESSAGE_CODES.SAFETY_LIMIT_REACHED,
42
+ BILLING_SYSTEM_MESSAGE_CODES.PLAN_CHANGE_ACTION_REQUIRED,
43
+ BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_REQUEST_RECEIVED,
44
+ BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_COMPLETED,
45
+ BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_REJECTED,
46
+ BILLING_SYSTEM_MESSAGE_CODES.REFUND_REQUEST_RECEIVED,
47
+ BILLING_SYSTEM_MESSAGE_CODES.REFUND_COMPLETED,
48
+ BILLING_SYSTEM_MESSAGE_CODES.REFUND_REJECTED
29
49
  ];
30
50
  var BillingSystemMessageCodeSchema = z.enum(BILLING_SYSTEM_MESSAGE_CODE_VALUES);
51
+ var SUBSCRIPTION_CANCELLATION_MODES = [
52
+ "END_OF_CYCLE",
53
+ "IMMEDIATE_NO_PRORATION",
54
+ "IMMEDIATE_PRORATED",
55
+ "IMMEDIATE_SKIP_FINAL_USAGE"
56
+ ];
57
+ var SubscriptionCancellationModeSchema = z.enum(SUBSCRIPTION_CANCELLATION_MODES);
58
+ var SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS = {
59
+ END_OF_CYCLE: {
60
+ deferCancellation: true,
61
+ prorate: false,
62
+ skipFinalUsageCharge: false
63
+ },
64
+ IMMEDIATE_NO_PRORATION: {
65
+ deferCancellation: false,
66
+ prorate: false,
67
+ skipFinalUsageCharge: false
68
+ },
69
+ IMMEDIATE_PRORATED: {
70
+ deferCancellation: false,
71
+ prorate: true,
72
+ skipFinalUsageCharge: false
73
+ },
74
+ IMMEDIATE_SKIP_FINAL_USAGE: {
75
+ deferCancellation: false,
76
+ prorate: false,
77
+ skipFinalUsageCharge: true
78
+ }
79
+ };
80
+ function availablePurchasedRecoveryCredits(counter) {
81
+ for (const [name, value] of Object.entries(counter)) {
82
+ if (!Number.isInteger(value) || value < 0) {
83
+ throw new Error(`${name} must be a non-negative integer`);
84
+ }
85
+ }
86
+ return Math.max(
87
+ counter.grantedQuantity - counter.committedQuantity - counter.reservedQuantity - counter.refundingQuantity,
88
+ 0
89
+ );
90
+ }
31
91
  var WHATSAPP_PROVIDER_STATUSES = [
32
92
  "SENT",
33
93
  "DELIVERED",
@@ -37,6 +97,18 @@ var WHATSAPP_PROVIDER_STATUSES = [
37
97
  var WhatsAppProviderStatusSchema = z.enum(WHATSAPP_PROVIDER_STATUSES);
38
98
  var MAX_ID_LENGTH = 128;
39
99
  var MAX_SHORT_TEXT_LENGTH = 128;
100
+ var BillingSubscriptionReconcileJobSchema = z.object({
101
+ schemaVersion: z.literal(BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION),
102
+ shopId: z.string().trim().min(1).max(MAX_ID_LENGTH),
103
+ subscriptionId: z.string().trim().min(1).max(MAX_ID_LENGTH),
104
+ expectedNextReconcileAt: z.iso.datetime({ offset: true })
105
+ }).strict();
106
+ function parseBillingSubscriptionReconcileJob(input) {
107
+ return BillingSubscriptionReconcileJobSchema.parse(input);
108
+ }
109
+ function safeParseBillingSubscriptionReconcileJob(input) {
110
+ return BillingSubscriptionReconcileJobSchema.safeParse(input);
111
+ }
40
112
  var WhatsAppProviderPricingMetadataSchema = z.object({
41
113
  billable: z.boolean().optional(),
42
114
  category: z.string().trim().min(1).max(MAX_SHORT_TEXT_LENGTH).optional(),
@@ -70,6 +142,14 @@ function fnv1a64(value) {
70
142
  }
71
143
  return hash.toString(16).padStart(16, "0");
72
144
  }
145
+ function createBillingSubscriptionReconcileJobId(subscriptionId, expectedNextReconcileAt) {
146
+ assertKeyPart("subscriptionId", subscriptionId);
147
+ if (subscriptionId.trim().length > MAX_ID_LENGTH) {
148
+ throw new Error(`subscriptionId must be at most ${MAX_ID_LENGTH} characters`);
149
+ }
150
+ z.iso.datetime({ offset: true }).parse(expectedNextReconcileAt);
151
+ return `billing-subscription-reconcile-${fnv1a64(`${subscriptionId.trim()}\0${expectedNextReconcileAt}`)}`;
152
+ }
73
153
  function boundedKey(prefix, parts, maxLength) {
74
154
  const canonical = parts.map((part) => part.trim()).join(":");
75
155
  const readable = `${prefix}:${canonical}`;
@@ -99,20 +179,32 @@ function createShopifyUsageIdempotencyKey(shopId, usageEventId) {
99
179
  export {
100
180
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
101
181
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
182
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
183
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
184
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
185
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
102
186
  BILLING_PLAN_KINDS,
103
187
  BillingPlanKindSchema,
104
188
  BILLING_USAGE_METRICS,
105
189
  BillingUsageMetricSchema,
106
190
  BILLING_SYSTEM_MESSAGE_CODES,
107
191
  BillingSystemMessageCodeSchema,
192
+ SUBSCRIPTION_CANCELLATION_MODES,
193
+ SubscriptionCancellationModeSchema,
194
+ SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
195
+ availablePurchasedRecoveryCredits,
108
196
  WHATSAPP_PROVIDER_STATUSES,
109
197
  WhatsAppProviderStatusSchema,
198
+ BillingSubscriptionReconcileJobSchema,
199
+ parseBillingSubscriptionReconcileJob,
200
+ safeParseBillingSubscriptionReconcileJob,
110
201
  WhatsAppProviderPricingMetadataSchema,
111
202
  NormalizedWhatsAppStatusSchema,
112
203
  parseNormalizedWhatsAppStatus,
113
204
  safeParseNormalizedWhatsAppStatus,
205
+ createBillingSubscriptionReconcileJobId,
114
206
  createMerchantBillingSystemSourceKey,
115
207
  createRecoveryIdempotencyKey,
116
208
  createShopifyUsageIdempotencyKey
117
209
  };
118
- //# sourceMappingURL=chunk-RFTEH4ER.js.map
210
+ //# sourceMappingURL=chunk-KO4LMZ66.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/billing.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const ARCH007_BILLING_CONTRACT_SCHEMA_VERSION = 1 as const;\nexport const WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION = 2 as const;\nexport const BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION = 1 as const;\nexport const BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME = \"billing-subscription-reconcile\";\nexport const BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME = \"reconcile-subscription\";\nexport const APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS = 300000 as const;\n\nexport const BILLING_PLAN_KINDS = [\"FREE\", \"PAID_METERED\"] as const;\nexport const BillingPlanKindSchema = z.enum(BILLING_PLAN_KINDS);\nexport type BillingPlanKind = z.infer<typeof BillingPlanKindSchema>;\n\nexport const BILLING_USAGE_METRICS = [\n \"RECOVERY_CONVERSATION\",\n \"OUTBOUND_AUTOMATED_MESSAGE\",\n \"DELIVERED_WHATSAPP_MESSAGE\",\n \"RECOVERY_CREDIT_PACK_PURCHASE\",\n] as const;\nexport const BillingUsageMetricSchema = z.enum(BILLING_USAGE_METRICS);\nexport type BillingUsageMetric = z.infer<typeof BillingUsageMetricSchema>;\n\nexport const BILLING_SYSTEM_MESSAGE_CODES = {\n FREE_ALLOWANCE_WARNING: \"BILLING_FREE_ALLOWANCE_WARNING\",\n FREE_ALLOWANCE_EXHAUSTED: \"BILLING_FREE_ALLOWANCE_EXHAUSTED\",\n RECOVERY_CAPACITY_EXHAUSTED: \"BILLING_RECOVERY_CAPACITY_EXHAUSTED\",\n PLAN_UPGRADED: \"BILLING_PLAN_UPGRADED\",\n PLAN_DOWNGRADE_SCHEDULED: \"BILLING_PLAN_DOWNGRADE_SCHEDULED\",\n SUBSCRIPTION_ENDED: \"BILLING_SUBSCRIPTION_ENDED\",\n SAFETY_LIMIT_REACHED: \"BILLING_SAFETY_LIMIT_REACHED\",\n PLAN_CHANGE_ACTION_REQUIRED: \"BILLING_PLAN_CHANGE_ACTION_REQUIRED\",\n CANCELLATION_REQUEST_RECEIVED: \"BILLING_CANCELLATION_REQUEST_RECEIVED\",\n CANCELLATION_COMPLETED: \"BILLING_CANCELLATION_COMPLETED\",\n CANCELLATION_REJECTED: \"BILLING_CANCELLATION_REJECTED\",\n REFUND_REQUEST_RECEIVED: \"BILLING_REFUND_REQUEST_RECEIVED\",\n REFUND_COMPLETED: \"BILLING_REFUND_COMPLETED\",\n REFUND_REJECTED: \"BILLING_REFUND_REJECTED\",\n} as const;\n\nconst BILLING_SYSTEM_MESSAGE_CODE_VALUES = [\n BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_WARNING,\n BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_EXHAUSTED,\n BILLING_SYSTEM_MESSAGE_CODES.RECOVERY_CAPACITY_EXHAUSTED,\n BILLING_SYSTEM_MESSAGE_CODES.PLAN_UPGRADED,\n BILLING_SYSTEM_MESSAGE_CODES.PLAN_DOWNGRADE_SCHEDULED,\n BILLING_SYSTEM_MESSAGE_CODES.SUBSCRIPTION_ENDED,\n BILLING_SYSTEM_MESSAGE_CODES.SAFETY_LIMIT_REACHED,\n BILLING_SYSTEM_MESSAGE_CODES.PLAN_CHANGE_ACTION_REQUIRED,\n BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_REQUEST_RECEIVED,\n BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_COMPLETED,\n BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_REJECTED,\n BILLING_SYSTEM_MESSAGE_CODES.REFUND_REQUEST_RECEIVED,\n BILLING_SYSTEM_MESSAGE_CODES.REFUND_COMPLETED,\n BILLING_SYSTEM_MESSAGE_CODES.REFUND_REJECTED,\n] as const;\n\nexport const BillingSystemMessageCodeSchema = z.enum(BILLING_SYSTEM_MESSAGE_CODE_VALUES);\nexport type BillingSystemMessageCode = z.infer<typeof BillingSystemMessageCodeSchema>;\n\nexport const SUBSCRIPTION_CANCELLATION_MODES = [\n \"END_OF_CYCLE\",\n \"IMMEDIATE_NO_PRORATION\",\n \"IMMEDIATE_PRORATED\",\n \"IMMEDIATE_SKIP_FINAL_USAGE\",\n] as const;\n\nexport const SubscriptionCancellationModeSchema = z.enum(SUBSCRIPTION_CANCELLATION_MODES);\nexport type SubscriptionCancellationMode = z.infer<typeof SubscriptionCancellationModeSchema>;\n\nexport type ShopifySubscriptionCancellationArgs = Readonly<{\n deferCancellation: boolean;\n prorate: boolean;\n skipFinalUsageCharge: boolean;\n}>;\n\nexport const SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS = {\n END_OF_CYCLE: {\n deferCancellation: true,\n prorate: false,\n skipFinalUsageCharge: false,\n },\n IMMEDIATE_NO_PRORATION: {\n deferCancellation: false,\n prorate: false,\n skipFinalUsageCharge: false,\n },\n IMMEDIATE_PRORATED: {\n deferCancellation: false,\n prorate: true,\n skipFinalUsageCharge: false,\n },\n IMMEDIATE_SKIP_FINAL_USAGE: {\n deferCancellation: false,\n prorate: false,\n skipFinalUsageCharge: true,\n },\n} as const satisfies Readonly<\n Record<SubscriptionCancellationMode, ShopifySubscriptionCancellationArgs>\n>;\n\nexport type PurchasedRecoveryCreditCounterSnapshot = Readonly<{\n grantedQuantity: number;\n committedQuantity: number;\n reservedQuantity: number;\n refundingQuantity: number;\n}>;\n\nexport function availablePurchasedRecoveryCredits(\n counter: PurchasedRecoveryCreditCounterSnapshot,\n): number {\n for (const [name, value] of Object.entries(counter)) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative integer`);\n }\n }\n\n return Math.max(\n counter.grantedQuantity\n - counter.committedQuantity\n - counter.reservedQuantity\n - counter.refundingQuantity,\n 0,\n );\n}\n\nexport const WHATSAPP_PROVIDER_STATUSES = [\n \"SENT\",\n \"DELIVERED\",\n \"READ\",\n \"FAILED\",\n] as const;\nexport const WhatsAppProviderStatusSchema = z.enum(WHATSAPP_PROVIDER_STATUSES);\nexport type WhatsAppProviderStatus = z.infer<typeof WhatsAppProviderStatusSchema>;\n\nconst MAX_ID_LENGTH = 128;\nconst MAX_SHORT_TEXT_LENGTH = 128;\n\nexport const BillingSubscriptionReconcileJobSchema = z\n .object({\n schemaVersion: z.literal(BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION),\n shopId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n subscriptionId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n expectedNextReconcileAt: z.iso.datetime({ offset: true }),\n })\n .strict();\n\nexport type BillingSubscriptionReconcileJob = z.infer<\n typeof BillingSubscriptionReconcileJobSchema\n>;\n\nexport function parseBillingSubscriptionReconcileJob(\n input: unknown,\n): BillingSubscriptionReconcileJob {\n return BillingSubscriptionReconcileJobSchema.parse(input);\n}\n\nexport function safeParseBillingSubscriptionReconcileJob(input: unknown) {\n return BillingSubscriptionReconcileJobSchema.safeParse(input);\n}\n\nexport const WhatsAppProviderPricingMetadataSchema = z\n .object({\n billable: z.boolean().optional(),\n category: z.string().trim().min(1).max(MAX_SHORT_TEXT_LENGTH).optional(),\n model: z.string().trim().min(1).max(MAX_SHORT_TEXT_LENGTH).optional(),\n })\n .strict()\n .refine((value) => Object.keys(value).length > 0, \"pricing metadata must not be empty\");\n\nexport type WhatsAppProviderPricingMetadata = z.infer<\n typeof WhatsAppProviderPricingMetadataSchema\n>;\n\nexport const NormalizedWhatsAppStatusSchema = z\n .object({\n schemaVersion: z.literal(WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION),\n providerAccountId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n providerPhoneNumberId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n providerMessageId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n status: WhatsAppProviderStatusSchema,\n occurredAt: z.iso.datetime({ offset: true }),\n pricing: WhatsAppProviderPricingMetadataSchema.optional(),\n })\n .strict();\n\nexport type NormalizedWhatsAppStatus = z.infer<typeof NormalizedWhatsAppStatusSchema>;\n\nexport function parseNormalizedWhatsAppStatus(input: unknown): NormalizedWhatsAppStatus {\n return NormalizedWhatsAppStatusSchema.parse(input);\n}\n\nexport function safeParseNormalizedWhatsAppStatus(input: unknown) {\n return NormalizedWhatsAppStatusSchema.safeParse(input);\n}\n\nfunction assertKeyPart(name: string, value: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string`);\n }\n}\n\nfunction fnv1a64(value: string): string {\n let hash = 0xcbf29ce484222325n;\n for (const character of value) {\n hash ^= BigInt(character.codePointAt(0) ?? 0);\n hash = BigInt.asUintN(64, hash * 0x100000001b3n);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\n\nexport function createBillingSubscriptionReconcileJobId(\n subscriptionId: string,\n expectedNextReconcileAt: string,\n): string {\n assertKeyPart(\"subscriptionId\", subscriptionId);\n if (subscriptionId.trim().length > MAX_ID_LENGTH) {\n throw new Error(`subscriptionId must be at most ${MAX_ID_LENGTH} characters`);\n }\n z.iso.datetime({ offset: true }).parse(expectedNextReconcileAt);\n return `billing-subscription-reconcile-${fnv1a64(`${subscriptionId.trim()}\\u0000${expectedNextReconcileAt}`)}`;\n}\n\nfunction boundedKey(prefix: string, parts: string[], maxLength: number): string {\n const canonical = parts.map((part) => part.trim()).join(\":\");\n const readable = `${prefix}:${canonical}`;\n if (readable.length <= maxLength) return readable;\n return `${prefix}:h${fnv1a64(canonical)}`;\n}\n\nexport function createMerchantBillingSystemSourceKey(\n shopId: string,\n code: BillingSystemMessageCode,\n eventIdentity: string,\n version = 1,\n): string {\n assertKeyPart(\"shopId\", shopId);\n assertKeyPart(\"code\", code);\n assertKeyPart(\"eventIdentity\", eventIdentity);\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(\"version must be a positive integer\");\n }\n return boundedKey(\"billing-system\", [shopId, code, eventIdentity, String(version)], 255);\n}\n\nexport function createRecoveryIdempotencyKey(shopId: string, recoveryId: string): string {\n assertKeyPart(\"shopId\", shopId);\n assertKeyPart(\"recoveryId\", recoveryId);\n return boundedKey(\"recovery\", [shopId, recoveryId], 255);\n}\n\nexport function createShopifyUsageIdempotencyKey(\n shopId: string,\n usageEventId: string,\n): string {\n assertKeyPart(\"shopId\", shopId);\n assertKeyPart(\"usageEventId\", usageEventId);\n return boundedKey(\"shopify\", [shopId, usageEventId], 64);\n}"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { CatalogueValidationOptions, CountryCode, CountryCodeSchema, CurrencyCode, CurrencyCodeSchema, IcuMessageCatalogue, IcuMessageValues, InternationalContext, InternationalContextSchema, InternationalizationRuntime, InternationalizationRuntimeOptions, LanguageSource, LanguageSourceSchema, LanguageTag, LanguageTagSchema, TimeZoneId, TimeZoneIdSchema, canonicaliseLanguageTag, createInternationalizationRuntime, mergeInternationalContext, normalizeCountryCode, normalizeCurrencyCode, normalizeTimeZone, resolveLocaleDirection, validateIcuCatalogue } from './internationalization.js';
2
- export { ARCH007_BILLING_CONTRACT_SCHEMA_VERSION, BILLING_PLAN_KINDS, BILLING_SYSTEM_MESSAGE_CODES, BILLING_USAGE_METRICS, BillingPlanKind, BillingPlanKindSchema, BillingSystemMessageCode, BillingSystemMessageCodeSchema, BillingUsageMetric, BillingUsageMetricSchema, NormalizedWhatsAppStatus, NormalizedWhatsAppStatusSchema, WHATSAPP_PROVIDER_STATUSES, WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION, WhatsAppProviderPricingMetadata, WhatsAppProviderPricingMetadataSchema, WhatsAppProviderStatus, WhatsAppProviderStatusSchema, createMerchantBillingSystemSourceKey, createRecoveryIdempotencyKey, createShopifyUsageIdempotencyKey, parseNormalizedWhatsAppStatus, safeParseNormalizedWhatsAppStatus } from './billing.js';
2
+ export { APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS, ARCH007_BILLING_CONTRACT_SCHEMA_VERSION, BILLING_PLAN_KINDS, BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME, BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME, BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION, BILLING_SYSTEM_MESSAGE_CODES, BILLING_USAGE_METRICS, BillingPlanKind, BillingPlanKindSchema, BillingSubscriptionReconcileJob, BillingSubscriptionReconcileJobSchema, BillingSystemMessageCode, BillingSystemMessageCodeSchema, BillingUsageMetric, BillingUsageMetricSchema, NormalizedWhatsAppStatus, NormalizedWhatsAppStatusSchema, PurchasedRecoveryCreditCounterSnapshot, SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS, SUBSCRIPTION_CANCELLATION_MODES, ShopifySubscriptionCancellationArgs, SubscriptionCancellationMode, SubscriptionCancellationModeSchema, WHATSAPP_PROVIDER_STATUSES, WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION, WhatsAppProviderPricingMetadata, WhatsAppProviderPricingMetadataSchema, WhatsAppProviderStatus, WhatsAppProviderStatusSchema, availablePurchasedRecoveryCredits, createBillingSubscriptionReconcileJobId, createMerchantBillingSystemSourceKey, createRecoveryIdempotencyKey, createShopifyUsageIdempotencyKey, parseBillingSubscriptionReconcileJob, parseNormalizedWhatsAppStatus, safeParseBillingSubscriptionReconcileJob, safeParseNormalizedWhatsAppStatus } from './billing.js';
3
3
  export { AuthoredSupportBodySchema, MERCHANT_COMMUNICATIONS_JOB_NAMES, MERCHANT_COMMUNICATIONS_QUEUE_NAME, MERCHANT_COMMUNICATIONS_SCHEMA_VERSION, MerchantMessageTranslationContract, MerchantMessageTranslationContractSchema, MerchantMessageTranslationStatus, MerchantMessageTranslationStatusSchema, MerchantSupportMessageContract, MerchantSupportMessageContractSchema, MerchantSupportMessageKind, MerchantSupportMessageKindSchema, MerchantSupportMessageState, MerchantSupportMessageStateSchema, MerchantTranslationBatchContract, MerchantTranslationBatchContractSchema, MerchantTranslationBatchStatus, MerchantTranslationBatchStatusSchema, MerchantTranslationDirection, MerchantTranslationDirectionSchema, MerchantTranslationReconciliationRequestContract, MerchantTranslationReconciliationRequestContractSchema, MerchantTranslationReconciliationScope, MerchantTranslationReconciliationScopeSchema, MerchantTranslationReconciliationStatus, MerchantTranslationReconciliationStatusSchema, PLATFORM_SUPPORT_LANGUAGE_TAG, TranslatedSupportBodySchema, TranslationBatchPollJob, TranslationBatchPollJobSchema, TranslationBatchResultsJob, TranslationBatchResultsJobSchema, TranslationBatchSubmitJob, TranslationBatchSubmitJobSchema, TranslationDispatchJob, TranslationDispatchJobSchema, TranslationReconcileJob, TranslationReconcileJobSchema, countUnicodeGraphemes, requiresMerchantTranslation } from './merchant-communications.js';
4
4
  export { CheckoutCreatedPayloadV2, CheckoutCreatedPayloadV2Schema, CheckoutObservedPayload, CheckoutObservedPayloadSchema, CheckoutUpdatedPayloadV2, CheckoutUpdatedPayloadV2Schema, MAX_LINE_ITEMS, MAX_URL_LENGTH, OrderCompletedPayload, OrderCompletedPayloadSchema, OrderCompletedPayloadV2, OrderCompletedPayloadV2Schema, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2, SHOPIFY_COMMERCE_EVENT_TYPES, SHOPIFY_RECOVERY_EVENT_TYPES_V2, SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS, SHOPIFY_WEBHOOK_QUEUE_CONTRACTS, ShopifyCartActivityEventV2, ShopifyCartActivityEventV2Schema, ShopifyCartActivityPayloadV2, ShopifyCartActivityPayloadV2Schema, ShopifyCheckoutCreatedEventV2, ShopifyCheckoutCreatedEventV2Schema, ShopifyCheckoutLineItem, ShopifyCheckoutLineItemSchema, ShopifyCheckoutLineItemsSchema, ShopifyCheckoutObservedEvent, ShopifyCheckoutObservedEventSchema, ShopifyCheckoutUpdatedEventV2, ShopifyCheckoutUpdatedEventV2Schema, ShopifyCommerceEvent, ShopifyCommerceEventSchema, ShopifyCommerceEventType, ShopifyCustomerReference, ShopifyCustomerReferenceSchema, ShopifyMoney, ShopifyMoneySchema, ShopifyOrderCompletedEvent, ShopifyOrderCompletedEventSchema, ShopifyOrderCompletedEventV2, ShopifyOrderCompletedEventV2Schema, ShopifyRecoveryEventTypeV2, ShopifyRecoveryEventV2, ShopifyRecoveryEventV2Schema, ShopifyTenant, ShopifyTenantSchema, createShopifyCartActivityOrderingKey, createShopifyCommerceOrderingKey, createShopifyOrderCorrelationOrderingKey, createShopifyOrderOrderingKey, createShopifyPendingRecoveryOrderingKey, isCartActivityEventV2, isCheckoutCreatedEventV2, isCheckoutObservedEvent, isCheckoutUpdatedEventV2, isOrderCompletedEvent, isOrderCompletedEventV2, parseShopifyCommerceEvent, parseShopifyRecoveryEventV2, safeParseShopifyCommerceEvent, safeParseShopifyRecoveryEventV2 } from './shopify/index.js';
5
5
  import 'zod';
package/dist/index.js CHANGED
@@ -1,22 +1,34 @@
1
1
  import {
2
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
2
3
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
3
4
  BILLING_PLAN_KINDS,
5
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
6
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
7
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
4
8
  BILLING_SYSTEM_MESSAGE_CODES,
5
9
  BILLING_USAGE_METRICS,
6
10
  BillingPlanKindSchema,
11
+ BillingSubscriptionReconcileJobSchema,
7
12
  BillingSystemMessageCodeSchema,
8
13
  BillingUsageMetricSchema,
9
14
  NormalizedWhatsAppStatusSchema,
15
+ SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
16
+ SUBSCRIPTION_CANCELLATION_MODES,
17
+ SubscriptionCancellationModeSchema,
10
18
  WHATSAPP_PROVIDER_STATUSES,
11
19
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
12
20
  WhatsAppProviderPricingMetadataSchema,
13
21
  WhatsAppProviderStatusSchema,
22
+ availablePurchasedRecoveryCredits,
23
+ createBillingSubscriptionReconcileJobId,
14
24
  createMerchantBillingSystemSourceKey,
15
25
  createRecoveryIdempotencyKey,
16
26
  createShopifyUsageIdempotencyKey,
27
+ parseBillingSubscriptionReconcileJob,
17
28
  parseNormalizedWhatsAppStatus,
29
+ safeParseBillingSubscriptionReconcileJob,
18
30
  safeParseNormalizedWhatsAppStatus
19
- } from "./chunk-RFTEH4ER.js";
31
+ } from "./chunk-KO4LMZ66.js";
20
32
  import {
21
33
  AuthoredSupportBodySchema,
22
34
  MERCHANT_COMMUNICATIONS_JOB_NAMES,
@@ -105,12 +117,17 @@ import {
105
117
  validateIcuCatalogue
106
118
  } from "./chunk-B6Y3QQLI.js";
107
119
  export {
120
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
108
121
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
109
122
  AuthoredSupportBodySchema,
110
123
  BILLING_PLAN_KINDS,
124
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
125
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
126
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
111
127
  BILLING_SYSTEM_MESSAGE_CODES,
112
128
  BILLING_USAGE_METRICS,
113
129
  BillingPlanKindSchema,
130
+ BillingSubscriptionReconcileJobSchema,
114
131
  BillingSystemMessageCodeSchema,
115
132
  BillingUsageMetricSchema,
116
133
  CheckoutCreatedPayloadV2Schema,
@@ -146,8 +163,10 @@ export {
146
163
  SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2,
147
164
  SHOPIFY_COMMERCE_EVENT_TYPES,
148
165
  SHOPIFY_RECOVERY_EVENT_TYPES_V2,
166
+ SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
149
167
  SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS,
150
168
  SHOPIFY_WEBHOOK_QUEUE_CONTRACTS,
169
+ SUBSCRIPTION_CANCELLATION_MODES,
151
170
  ShopifyCartActivityEventV2Schema,
152
171
  ShopifyCartActivityPayloadV2Schema,
153
172
  ShopifyCheckoutCreatedEventV2Schema,
@@ -162,6 +181,7 @@ export {
162
181
  ShopifyOrderCompletedEventV2Schema,
163
182
  ShopifyRecoveryEventV2Schema,
164
183
  ShopifyTenantSchema,
184
+ SubscriptionCancellationModeSchema,
165
185
  TimeZoneIdSchema,
166
186
  TranslatedSupportBodySchema,
167
187
  TranslationBatchPollJobSchema,
@@ -173,8 +193,10 @@ export {
173
193
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
174
194
  WhatsAppProviderPricingMetadataSchema,
175
195
  WhatsAppProviderStatusSchema,
196
+ availablePurchasedRecoveryCredits,
176
197
  canonicaliseLanguageTag,
177
198
  countUnicodeGraphemes,
199
+ createBillingSubscriptionReconcileJobId,
178
200
  createInternationalizationRuntime,
179
201
  createMerchantBillingSystemSourceKey,
180
202
  createRecoveryIdempotencyKey,
@@ -194,11 +216,13 @@ export {
194
216
  normalizeCountryCode,
195
217
  normalizeCurrencyCode,
196
218
  normalizeTimeZone,
219
+ parseBillingSubscriptionReconcileJob,
197
220
  parseNormalizedWhatsAppStatus,
198
221
  parseShopifyCommerceEvent,
199
222
  parseShopifyRecoveryEventV2,
200
223
  requiresMerchantTranslation,
201
224
  resolveLocaleDirection,
225
+ safeParseBillingSubscriptionReconcileJob,
202
226
  safeParseNormalizedWhatsAppStatus,
203
227
  safeParseShopifyCommerceEvent,
204
228
  safeParseShopifyRecoveryEventV2,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modainteract/moda-interact-shared",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -72,6 +72,7 @@
72
72
  "build": "tsup",
73
73
  "typecheck": "tsc --noEmit",
74
74
  "test": "tsx --test \"src/**/*.test.ts\"",
75
+ "validate:billing-entrypoint": "npm run build && node scripts/validate-billing-entrypoint.mjs",
75
76
  "validate:internationalization-entrypoint": "npm run build && node scripts/validate-internationalization-entrypoint.mjs",
76
77
  "validate:merchant-communications-node": "npm run build && node scripts/validate-merchant-communications-node.mjs",
77
78
  "validate:testing-node": "npm run build && node scripts/validate-testing-node.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/billing.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const ARCH007_BILLING_CONTRACT_SCHEMA_VERSION = 1 as const;\nexport const WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION = 2 as const;\n\nexport const BILLING_PLAN_KINDS = [\"FREE\", \"PAID_METERED\"] as const;\nexport const BillingPlanKindSchema = z.enum(BILLING_PLAN_KINDS);\nexport type BillingPlanKind = z.infer<typeof BillingPlanKindSchema>;\n\nexport const BILLING_USAGE_METRICS = [\n \"RECOVERY_CONVERSATION\",\n \"OUTBOUND_AUTOMATED_MESSAGE\",\n \"DELIVERED_WHATSAPP_MESSAGE\",\n \"RECOVERY_CREDIT_PACK_PURCHASE\",\n] as const;\nexport const BillingUsageMetricSchema = z.enum(BILLING_USAGE_METRICS);\nexport type BillingUsageMetric = z.infer<typeof BillingUsageMetricSchema>;\n\nexport const BILLING_SYSTEM_MESSAGE_CODES = {\n FREE_ALLOWANCE_WARNING: \"BILLING_FREE_ALLOWANCE_WARNING\",\n FREE_ALLOWANCE_EXHAUSTED: \"BILLING_FREE_ALLOWANCE_EXHAUSTED\",\n PLAN_UPGRADED: \"BILLING_PLAN_UPGRADED\",\n PLAN_DOWNGRADE_SCHEDULED: \"BILLING_PLAN_DOWNGRADE_SCHEDULED\",\n SUBSCRIPTION_ENDED: \"BILLING_SUBSCRIPTION_ENDED\",\n SAFETY_LIMIT_REACHED: \"BILLING_SAFETY_LIMIT_REACHED\",\n} as const;\n\nconst BILLING_SYSTEM_MESSAGE_CODE_VALUES = [\n BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_WARNING,\n BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_EXHAUSTED,\n BILLING_SYSTEM_MESSAGE_CODES.PLAN_UPGRADED,\n BILLING_SYSTEM_MESSAGE_CODES.PLAN_DOWNGRADE_SCHEDULED,\n BILLING_SYSTEM_MESSAGE_CODES.SUBSCRIPTION_ENDED,\n BILLING_SYSTEM_MESSAGE_CODES.SAFETY_LIMIT_REACHED,\n] as const;\n\nexport const BillingSystemMessageCodeSchema = z.enum(BILLING_SYSTEM_MESSAGE_CODE_VALUES);\nexport type BillingSystemMessageCode = z.infer<typeof BillingSystemMessageCodeSchema>;\n\nexport const WHATSAPP_PROVIDER_STATUSES = [\n \"SENT\",\n \"DELIVERED\",\n \"READ\",\n \"FAILED\",\n] as const;\nexport const WhatsAppProviderStatusSchema = z.enum(WHATSAPP_PROVIDER_STATUSES);\nexport type WhatsAppProviderStatus = z.infer<typeof WhatsAppProviderStatusSchema>;\n\nconst MAX_ID_LENGTH = 128;\nconst MAX_SHORT_TEXT_LENGTH = 128;\n\nexport const WhatsAppProviderPricingMetadataSchema = z\n .object({\n billable: z.boolean().optional(),\n category: z.string().trim().min(1).max(MAX_SHORT_TEXT_LENGTH).optional(),\n model: z.string().trim().min(1).max(MAX_SHORT_TEXT_LENGTH).optional(),\n })\n .strict()\n .refine((value) => Object.keys(value).length > 0, \"pricing metadata must not be empty\");\n\nexport type WhatsAppProviderPricingMetadata = z.infer<\n typeof WhatsAppProviderPricingMetadataSchema\n>;\n\nexport const NormalizedWhatsAppStatusSchema = z\n .object({\n schemaVersion: z.literal(WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION),\n providerAccountId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n providerPhoneNumberId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n providerMessageId: z.string().trim().min(1).max(MAX_ID_LENGTH),\n status: WhatsAppProviderStatusSchema,\n occurredAt: z.iso.datetime({ offset: true }),\n pricing: WhatsAppProviderPricingMetadataSchema.optional(),\n })\n .strict();\n\nexport type NormalizedWhatsAppStatus = z.infer<typeof NormalizedWhatsAppStatusSchema>;\n\nexport function parseNormalizedWhatsAppStatus(input: unknown): NormalizedWhatsAppStatus {\n return NormalizedWhatsAppStatusSchema.parse(input);\n}\n\nexport function safeParseNormalizedWhatsAppStatus(input: unknown) {\n return NormalizedWhatsAppStatusSchema.safeParse(input);\n}\n\nfunction assertKeyPart(name: string, value: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string`);\n }\n}\n\nfunction fnv1a64(value: string): string {\n let hash = 0xcbf29ce484222325n;\n for (const character of value) {\n hash ^= BigInt(character.codePointAt(0) ?? 0);\n hash = BigInt.asUintN(64, hash * 0x100000001b3n);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\n\nfunction boundedKey(prefix: string, parts: string[], maxLength: number): string {\n const canonical = parts.map((part) => part.trim()).join(\":\");\n const readable = `${prefix}:${canonical}`;\n if (readable.length <= maxLength) return readable;\n return `${prefix}:h${fnv1a64(canonical)}`;\n}\n\nexport function createMerchantBillingSystemSourceKey(\n shopId: string,\n code: BillingSystemMessageCode,\n eventIdentity: string,\n version = 1,\n): string {\n assertKeyPart(\"shopId\", shopId);\n assertKeyPart(\"code\", code);\n assertKeyPart(\"eventIdentity\", eventIdentity);\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(\"version must be a positive integer\");\n }\n return boundedKey(\"billing-system\", [shopId, code, eventIdentity, String(version)], 255);\n}\n\nexport function createRecoveryIdempotencyKey(shopId: string, recoveryId: string): string {\n assertKeyPart(\"shopId\", shopId);\n assertKeyPart(\"recoveryId\", recoveryId);\n return boundedKey(\"recovery\", [shopId, recoveryId], 255);\n}\n\nexport function createShopifyUsageIdempotencyKey(\n shopId: string,\n usageEventId: string,\n): string {\n assertKeyPart(\"shopId\", shopId);\n assertKeyPart(\"usageEventId\", usageEventId);\n return boundedKey(\"shopify\", [shopId, usageEventId], 64);\n}"],"mappings":"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","names":[]}