@modainteract/moda-interact-shared 0.9.0 → 0.11.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";
@@ -18,70 +22,27 @@ declare const BillingUsageMetricSchema: z.ZodEnum<{
18
22
  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
- readonly FREE_ALLOWANCE_EXHAUSTED: "BILLING_FREE_ALLOWANCE_EXHAUSTED";
25
+ readonly RECOVERY_CAPACITY_EXHAUSTED: "BILLING_RECOVERY_CAPACITY_EXHAUSTED";
22
26
  readonly PLAN_UPGRADED: "BILLING_PLAN_UPGRADED";
23
27
  readonly PLAN_DOWNGRADE_SCHEDULED: "BILLING_PLAN_DOWNGRADE_SCHEDULED";
24
28
  readonly SUBSCRIPTION_ENDED: "BILLING_SUBSCRIPTION_ENDED";
25
29
  readonly SAFETY_LIMIT_REACHED: "BILLING_SAFETY_LIMIT_REACHED";
26
- readonly PLAN_CHANGE_ACTION_REQUIRED: "BILLING_PLAN_CHANGE_ACTION_REQUIRED";
27
- readonly CANCELLATION_REQUEST_RECEIVED: "BILLING_CANCELLATION_REQUEST_RECEIVED";
28
- readonly CANCELLATION_COMPLETED: "BILLING_CANCELLATION_COMPLETED";
29
- readonly CANCELLATION_REJECTED: "BILLING_CANCELLATION_REJECTED";
30
30
  readonly REFUND_REQUEST_RECEIVED: "BILLING_REFUND_REQUEST_RECEIVED";
31
31
  readonly REFUND_COMPLETED: "BILLING_REFUND_COMPLETED";
32
32
  readonly REFUND_REJECTED: "BILLING_REFUND_REJECTED";
33
33
  };
34
34
  declare const BillingSystemMessageCodeSchema: z.ZodEnum<{
35
35
  BILLING_FREE_ALLOWANCE_WARNING: "BILLING_FREE_ALLOWANCE_WARNING";
36
- BILLING_FREE_ALLOWANCE_EXHAUSTED: "BILLING_FREE_ALLOWANCE_EXHAUSTED";
36
+ BILLING_RECOVERY_CAPACITY_EXHAUSTED: "BILLING_RECOVERY_CAPACITY_EXHAUSTED";
37
37
  BILLING_PLAN_UPGRADED: "BILLING_PLAN_UPGRADED";
38
38
  BILLING_PLAN_DOWNGRADE_SCHEDULED: "BILLING_PLAN_DOWNGRADE_SCHEDULED";
39
39
  BILLING_SUBSCRIPTION_ENDED: "BILLING_SUBSCRIPTION_ENDED";
40
40
  BILLING_SAFETY_LIMIT_REACHED: "BILLING_SAFETY_LIMIT_REACHED";
41
- BILLING_PLAN_CHANGE_ACTION_REQUIRED: "BILLING_PLAN_CHANGE_ACTION_REQUIRED";
42
- BILLING_CANCELLATION_REQUEST_RECEIVED: "BILLING_CANCELLATION_REQUEST_RECEIVED";
43
- BILLING_CANCELLATION_COMPLETED: "BILLING_CANCELLATION_COMPLETED";
44
- BILLING_CANCELLATION_REJECTED: "BILLING_CANCELLATION_REJECTED";
45
41
  BILLING_REFUND_REQUEST_RECEIVED: "BILLING_REFUND_REQUEST_RECEIVED";
46
42
  BILLING_REFUND_COMPLETED: "BILLING_REFUND_COMPLETED";
47
43
  BILLING_REFUND_REJECTED: "BILLING_REFUND_REJECTED";
48
44
  }>;
49
45
  type BillingSystemMessageCode = z.infer<typeof BillingSystemMessageCodeSchema>;
50
- declare const SUBSCRIPTION_CANCELLATION_MODES: readonly ["END_OF_CYCLE", "IMMEDIATE_NO_PRORATION", "IMMEDIATE_PRORATED", "IMMEDIATE_SKIP_FINAL_USAGE"];
51
- declare const SubscriptionCancellationModeSchema: z.ZodEnum<{
52
- END_OF_CYCLE: "END_OF_CYCLE";
53
- IMMEDIATE_NO_PRORATION: "IMMEDIATE_NO_PRORATION";
54
- IMMEDIATE_PRORATED: "IMMEDIATE_PRORATED";
55
- IMMEDIATE_SKIP_FINAL_USAGE: "IMMEDIATE_SKIP_FINAL_USAGE";
56
- }>;
57
- type SubscriptionCancellationMode = z.infer<typeof SubscriptionCancellationModeSchema>;
58
- type ShopifySubscriptionCancellationArgs = Readonly<{
59
- deferCancellation: boolean;
60
- prorate: boolean;
61
- skipFinalUsageCharge: boolean;
62
- }>;
63
- declare const SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS: {
64
- readonly END_OF_CYCLE: {
65
- readonly deferCancellation: true;
66
- readonly prorate: false;
67
- readonly skipFinalUsageCharge: false;
68
- };
69
- readonly IMMEDIATE_NO_PRORATION: {
70
- readonly deferCancellation: false;
71
- readonly prorate: false;
72
- readonly skipFinalUsageCharge: false;
73
- };
74
- readonly IMMEDIATE_PRORATED: {
75
- readonly deferCancellation: false;
76
- readonly prorate: true;
77
- readonly skipFinalUsageCharge: false;
78
- };
79
- readonly IMMEDIATE_SKIP_FINAL_USAGE: {
80
- readonly deferCancellation: false;
81
- readonly prorate: false;
82
- readonly skipFinalUsageCharge: true;
83
- };
84
- };
85
46
  type PurchasedRecoveryCreditCounterSnapshot = Readonly<{
86
47
  grantedQuantity: number;
87
48
  committedQuantity: number;
@@ -97,6 +58,20 @@ declare const WhatsAppProviderStatusSchema: z.ZodEnum<{
97
58
  FAILED: "FAILED";
98
59
  }>;
99
60
  type WhatsAppProviderStatus = z.infer<typeof WhatsAppProviderStatusSchema>;
61
+ declare const BillingSubscriptionReconcileJobSchema: z.ZodObject<{
62
+ schemaVersion: z.ZodLiteral<1>;
63
+ shopId: z.ZodString;
64
+ subscriptionId: z.ZodString;
65
+ expectedNextReconcileAt: z.ZodISODateTime;
66
+ }, z.core.$strict>;
67
+ type BillingSubscriptionReconcileJob = z.infer<typeof BillingSubscriptionReconcileJobSchema>;
68
+ declare function parseBillingSubscriptionReconcileJob(input: unknown): BillingSubscriptionReconcileJob;
69
+ declare function safeParseBillingSubscriptionReconcileJob(input: unknown): z.ZodSafeParseResult<{
70
+ schemaVersion: 1;
71
+ shopId: string;
72
+ subscriptionId: string;
73
+ expectedNextReconcileAt: string;
74
+ }>;
100
75
  declare const WhatsAppProviderPricingMetadataSchema: z.ZodObject<{
101
76
  billable: z.ZodOptional<z.ZodBoolean>;
102
77
  category: z.ZodOptional<z.ZodString>;
@@ -136,8 +111,9 @@ declare function safeParseNormalizedWhatsAppStatus(input: unknown): z.ZodSafePar
136
111
  model?: string | undefined;
137
112
  } | undefined;
138
113
  }>;
114
+ declare function createBillingSubscriptionReconcileJobId(subscriptionId: string, expectedNextReconcileAt: string): string;
139
115
  declare function createMerchantBillingSystemSourceKey(shopId: string, code: BillingSystemMessageCode, eventIdentity: string, version?: number): string;
140
116
  declare function createRecoveryIdempotencyKey(shopId: string, recoveryId: string): string;
141
117
  declare function createShopifyUsageIdempotencyKey(shopId: string, usageEventId: string): string;
142
118
 
143
- 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, 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, createMerchantBillingSystemSourceKey, createRecoveryIdempotencyKey, createShopifyUsageIdempotencyKey, parseNormalizedWhatsAppStatus, safeParseNormalizedWhatsAppStatus };
119
+ 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, 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,47 +1,57 @@
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,
10
- SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
11
- SUBSCRIPTION_CANCELLATION_MODES,
12
- SubscriptionCancellationModeSchema,
13
15
  WHATSAPP_PROVIDER_STATUSES,
14
16
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
15
17
  WhatsAppProviderPricingMetadataSchema,
16
18
  WhatsAppProviderStatusSchema,
17
19
  availablePurchasedRecoveryCredits,
20
+ createBillingSubscriptionReconcileJobId,
18
21
  createMerchantBillingSystemSourceKey,
19
22
  createRecoveryIdempotencyKey,
20
23
  createShopifyUsageIdempotencyKey,
24
+ parseBillingSubscriptionReconcileJob,
21
25
  parseNormalizedWhatsAppStatus,
26
+ safeParseBillingSubscriptionReconcileJob,
22
27
  safeParseNormalizedWhatsAppStatus
23
- } from "./chunk-YDKVCS3T.js";
28
+ } from "./chunk-Z2RS2BSG.js";
24
29
  export {
30
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
25
31
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
26
32
  BILLING_PLAN_KINDS,
33
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
34
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
35
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
27
36
  BILLING_SYSTEM_MESSAGE_CODES,
28
37
  BILLING_USAGE_METRICS,
29
38
  BillingPlanKindSchema,
39
+ BillingSubscriptionReconcileJobSchema,
30
40
  BillingSystemMessageCodeSchema,
31
41
  BillingUsageMetricSchema,
32
42
  NormalizedWhatsAppStatusSchema,
33
- SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
34
- SUBSCRIPTION_CANCELLATION_MODES,
35
- SubscriptionCancellationModeSchema,
36
43
  WHATSAPP_PROVIDER_STATUSES,
37
44
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
38
45
  WhatsAppProviderPricingMetadataSchema,
39
46
  WhatsAppProviderStatusSchema,
40
47
  availablePurchasedRecoveryCredits,
48
+ createBillingSubscriptionReconcileJobId,
41
49
  createMerchantBillingSystemSourceKey,
42
50
  createRecoveryIdempotencyKey,
43
51
  createShopifyUsageIdempotencyKey,
52
+ parseBillingSubscriptionReconcileJob,
44
53
  parseNormalizedWhatsAppStatus,
54
+ safeParseBillingSubscriptionReconcileJob,
45
55
  safeParseNormalizedWhatsAppStatus
46
56
  };
47
57
  //# 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 = [
@@ -13,64 +17,27 @@ var BILLING_USAGE_METRICS = [
13
17
  var BillingUsageMetricSchema = z.enum(BILLING_USAGE_METRICS);
14
18
  var BILLING_SYSTEM_MESSAGE_CODES = {
15
19
  FREE_ALLOWANCE_WARNING: "BILLING_FREE_ALLOWANCE_WARNING",
16
- FREE_ALLOWANCE_EXHAUSTED: "BILLING_FREE_ALLOWANCE_EXHAUSTED",
20
+ RECOVERY_CAPACITY_EXHAUSTED: "BILLING_RECOVERY_CAPACITY_EXHAUSTED",
17
21
  PLAN_UPGRADED: "BILLING_PLAN_UPGRADED",
18
22
  PLAN_DOWNGRADE_SCHEDULED: "BILLING_PLAN_DOWNGRADE_SCHEDULED",
19
23
  SUBSCRIPTION_ENDED: "BILLING_SUBSCRIPTION_ENDED",
20
24
  SAFETY_LIMIT_REACHED: "BILLING_SAFETY_LIMIT_REACHED",
21
- PLAN_CHANGE_ACTION_REQUIRED: "BILLING_PLAN_CHANGE_ACTION_REQUIRED",
22
- CANCELLATION_REQUEST_RECEIVED: "BILLING_CANCELLATION_REQUEST_RECEIVED",
23
- CANCELLATION_COMPLETED: "BILLING_CANCELLATION_COMPLETED",
24
- CANCELLATION_REJECTED: "BILLING_CANCELLATION_REJECTED",
25
25
  REFUND_REQUEST_RECEIVED: "BILLING_REFUND_REQUEST_RECEIVED",
26
26
  REFUND_COMPLETED: "BILLING_REFUND_COMPLETED",
27
27
  REFUND_REJECTED: "BILLING_REFUND_REJECTED"
28
28
  };
29
29
  var BILLING_SYSTEM_MESSAGE_CODE_VALUES = [
30
30
  BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_WARNING,
31
- BILLING_SYSTEM_MESSAGE_CODES.FREE_ALLOWANCE_EXHAUSTED,
31
+ BILLING_SYSTEM_MESSAGE_CODES.RECOVERY_CAPACITY_EXHAUSTED,
32
32
  BILLING_SYSTEM_MESSAGE_CODES.PLAN_UPGRADED,
33
33
  BILLING_SYSTEM_MESSAGE_CODES.PLAN_DOWNGRADE_SCHEDULED,
34
34
  BILLING_SYSTEM_MESSAGE_CODES.SUBSCRIPTION_ENDED,
35
35
  BILLING_SYSTEM_MESSAGE_CODES.SAFETY_LIMIT_REACHED,
36
- BILLING_SYSTEM_MESSAGE_CODES.PLAN_CHANGE_ACTION_REQUIRED,
37
- BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_REQUEST_RECEIVED,
38
- BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_COMPLETED,
39
- BILLING_SYSTEM_MESSAGE_CODES.CANCELLATION_REJECTED,
40
36
  BILLING_SYSTEM_MESSAGE_CODES.REFUND_REQUEST_RECEIVED,
41
37
  BILLING_SYSTEM_MESSAGE_CODES.REFUND_COMPLETED,
42
38
  BILLING_SYSTEM_MESSAGE_CODES.REFUND_REJECTED
43
39
  ];
44
40
  var BillingSystemMessageCodeSchema = z.enum(BILLING_SYSTEM_MESSAGE_CODE_VALUES);
45
- var SUBSCRIPTION_CANCELLATION_MODES = [
46
- "END_OF_CYCLE",
47
- "IMMEDIATE_NO_PRORATION",
48
- "IMMEDIATE_PRORATED",
49
- "IMMEDIATE_SKIP_FINAL_USAGE"
50
- ];
51
- var SubscriptionCancellationModeSchema = z.enum(SUBSCRIPTION_CANCELLATION_MODES);
52
- var SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS = {
53
- END_OF_CYCLE: {
54
- deferCancellation: true,
55
- prorate: false,
56
- skipFinalUsageCharge: false
57
- },
58
- IMMEDIATE_NO_PRORATION: {
59
- deferCancellation: false,
60
- prorate: false,
61
- skipFinalUsageCharge: false
62
- },
63
- IMMEDIATE_PRORATED: {
64
- deferCancellation: false,
65
- prorate: true,
66
- skipFinalUsageCharge: false
67
- },
68
- IMMEDIATE_SKIP_FINAL_USAGE: {
69
- deferCancellation: false,
70
- prorate: false,
71
- skipFinalUsageCharge: true
72
- }
73
- };
74
41
  function availablePurchasedRecoveryCredits(counter) {
75
42
  for (const [name, value] of Object.entries(counter)) {
76
43
  if (!Number.isInteger(value) || value < 0) {
@@ -91,6 +58,18 @@ var WHATSAPP_PROVIDER_STATUSES = [
91
58
  var WhatsAppProviderStatusSchema = z.enum(WHATSAPP_PROVIDER_STATUSES);
92
59
  var MAX_ID_LENGTH = 128;
93
60
  var MAX_SHORT_TEXT_LENGTH = 128;
61
+ var BillingSubscriptionReconcileJobSchema = z.object({
62
+ schemaVersion: z.literal(BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION),
63
+ shopId: z.string().trim().min(1).max(MAX_ID_LENGTH),
64
+ subscriptionId: z.string().trim().min(1).max(MAX_ID_LENGTH),
65
+ expectedNextReconcileAt: z.iso.datetime({ offset: true })
66
+ }).strict();
67
+ function parseBillingSubscriptionReconcileJob(input) {
68
+ return BillingSubscriptionReconcileJobSchema.parse(input);
69
+ }
70
+ function safeParseBillingSubscriptionReconcileJob(input) {
71
+ return BillingSubscriptionReconcileJobSchema.safeParse(input);
72
+ }
94
73
  var WhatsAppProviderPricingMetadataSchema = z.object({
95
74
  billable: z.boolean().optional(),
96
75
  category: z.string().trim().min(1).max(MAX_SHORT_TEXT_LENGTH).optional(),
@@ -124,6 +103,14 @@ function fnv1a64(value) {
124
103
  }
125
104
  return hash.toString(16).padStart(16, "0");
126
105
  }
106
+ function createBillingSubscriptionReconcileJobId(subscriptionId, expectedNextReconcileAt) {
107
+ assertKeyPart("subscriptionId", subscriptionId);
108
+ if (subscriptionId.trim().length > MAX_ID_LENGTH) {
109
+ throw new Error(`subscriptionId must be at most ${MAX_ID_LENGTH} characters`);
110
+ }
111
+ z.iso.datetime({ offset: true }).parse(expectedNextReconcileAt);
112
+ return `billing-subscription-reconcile-${fnv1a64(`${subscriptionId.trim()}\0${expectedNextReconcileAt}`)}`;
113
+ }
127
114
  function boundedKey(prefix, parts, maxLength) {
128
115
  const canonical = parts.map((part) => part.trim()).join(":");
129
116
  const readable = `${prefix}:${canonical}`;
@@ -153,24 +140,29 @@ function createShopifyUsageIdempotencyKey(shopId, usageEventId) {
153
140
  export {
154
141
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
155
142
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
143
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
144
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
145
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
146
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
156
147
  BILLING_PLAN_KINDS,
157
148
  BillingPlanKindSchema,
158
149
  BILLING_USAGE_METRICS,
159
150
  BillingUsageMetricSchema,
160
151
  BILLING_SYSTEM_MESSAGE_CODES,
161
152
  BillingSystemMessageCodeSchema,
162
- SUBSCRIPTION_CANCELLATION_MODES,
163
- SubscriptionCancellationModeSchema,
164
- SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
165
153
  availablePurchasedRecoveryCredits,
166
154
  WHATSAPP_PROVIDER_STATUSES,
167
155
  WhatsAppProviderStatusSchema,
156
+ BillingSubscriptionReconcileJobSchema,
157
+ parseBillingSubscriptionReconcileJob,
158
+ safeParseBillingSubscriptionReconcileJob,
168
159
  WhatsAppProviderPricingMetadataSchema,
169
160
  NormalizedWhatsAppStatusSchema,
170
161
  parseNormalizedWhatsAppStatus,
171
162
  safeParseNormalizedWhatsAppStatus,
163
+ createBillingSubscriptionReconcileJobId,
172
164
  createMerchantBillingSystemSourceKey,
173
165
  createRecoveryIdempotencyKey,
174
166
  createShopifyUsageIdempotencyKey
175
167
  };
176
- //# sourceMappingURL=chunk-YDKVCS3T.js.map
168
+ //# sourceMappingURL=chunk-Z2RS2BSG.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 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 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.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.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 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, PurchasedRecoveryCreditCounterSnapshot, SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS, SUBSCRIPTION_CANCELLATION_MODES, ShopifySubscriptionCancellationArgs, SubscriptionCancellationMode, SubscriptionCancellationModeSchema, WHATSAPP_PROVIDER_STATUSES, WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION, WhatsAppProviderPricingMetadata, WhatsAppProviderPricingMetadataSchema, WhatsAppProviderStatus, WhatsAppProviderStatusSchema, availablePurchasedRecoveryCredits, 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, 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,26 +1,31 @@
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,
10
- SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
11
- SUBSCRIPTION_CANCELLATION_MODES,
12
- SubscriptionCancellationModeSchema,
13
15
  WHATSAPP_PROVIDER_STATUSES,
14
16
  WHATSAPP_PROVIDER_STATUS_SCHEMA_VERSION,
15
17
  WhatsAppProviderPricingMetadataSchema,
16
18
  WhatsAppProviderStatusSchema,
17
19
  availablePurchasedRecoveryCredits,
20
+ createBillingSubscriptionReconcileJobId,
18
21
  createMerchantBillingSystemSourceKey,
19
22
  createRecoveryIdempotencyKey,
20
23
  createShopifyUsageIdempotencyKey,
24
+ parseBillingSubscriptionReconcileJob,
21
25
  parseNormalizedWhatsAppStatus,
26
+ safeParseBillingSubscriptionReconcileJob,
22
27
  safeParseNormalizedWhatsAppStatus
23
- } from "./chunk-YDKVCS3T.js";
28
+ } from "./chunk-Z2RS2BSG.js";
24
29
  import {
25
30
  AuthoredSupportBodySchema,
26
31
  MERCHANT_COMMUNICATIONS_JOB_NAMES,
@@ -109,12 +114,17 @@ import {
109
114
  validateIcuCatalogue
110
115
  } from "./chunk-B6Y3QQLI.js";
111
116
  export {
117
+ APP_PRICING_BILLING_PERIOD_DRAIN_WINDOW_MS,
112
118
  ARCH007_BILLING_CONTRACT_SCHEMA_VERSION,
113
119
  AuthoredSupportBodySchema,
114
120
  BILLING_PLAN_KINDS,
121
+ BILLING_SUBSCRIPTION_RECONCILE_JOB_NAME,
122
+ BILLING_SUBSCRIPTION_RECONCILE_QUEUE_NAME,
123
+ BILLING_SUBSCRIPTION_RECONCILE_SCHEMA_VERSION,
115
124
  BILLING_SYSTEM_MESSAGE_CODES,
116
125
  BILLING_USAGE_METRICS,
117
126
  BillingPlanKindSchema,
127
+ BillingSubscriptionReconcileJobSchema,
118
128
  BillingSystemMessageCodeSchema,
119
129
  BillingUsageMetricSchema,
120
130
  CheckoutCreatedPayloadV2Schema,
@@ -150,10 +160,8 @@ export {
150
160
  SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2,
151
161
  SHOPIFY_COMMERCE_EVENT_TYPES,
152
162
  SHOPIFY_RECOVERY_EVENT_TYPES_V2,
153
- SHOPIFY_SUBSCRIPTION_CANCELLATION_ARGS,
154
163
  SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS,
155
164
  SHOPIFY_WEBHOOK_QUEUE_CONTRACTS,
156
- SUBSCRIPTION_CANCELLATION_MODES,
157
165
  ShopifyCartActivityEventV2Schema,
158
166
  ShopifyCartActivityPayloadV2Schema,
159
167
  ShopifyCheckoutCreatedEventV2Schema,
@@ -168,7 +176,6 @@ export {
168
176
  ShopifyOrderCompletedEventV2Schema,
169
177
  ShopifyRecoveryEventV2Schema,
170
178
  ShopifyTenantSchema,
171
- SubscriptionCancellationModeSchema,
172
179
  TimeZoneIdSchema,
173
180
  TranslatedSupportBodySchema,
174
181
  TranslationBatchPollJobSchema,
@@ -183,6 +190,7 @@ export {
183
190
  availablePurchasedRecoveryCredits,
184
191
  canonicaliseLanguageTag,
185
192
  countUnicodeGraphemes,
193
+ createBillingSubscriptionReconcileJobId,
186
194
  createInternationalizationRuntime,
187
195
  createMerchantBillingSystemSourceKey,
188
196
  createRecoveryIdempotencyKey,
@@ -202,11 +210,13 @@ export {
202
210
  normalizeCountryCode,
203
211
  normalizeCurrencyCode,
204
212
  normalizeTimeZone,
213
+ parseBillingSubscriptionReconcileJob,
205
214
  parseNormalizedWhatsAppStatus,
206
215
  parseShopifyCommerceEvent,
207
216
  parseShopifyRecoveryEventV2,
208
217
  requiresMerchantTranslation,
209
218
  resolveLocaleDirection,
219
+ safeParseBillingSubscriptionReconcileJob,
210
220
  safeParseNormalizedWhatsAppStatus,
211
221
  safeParseShopifyCommerceEvent,
212
222
  safeParseShopifyRecoveryEventV2,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modainteract/moda-interact-shared",
3
- "version": "0.9.0",
3
+ "version": "0.11.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 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.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 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":";AAAA,SAAS,SAAS;AAEX,IAAM,0CAA0C;AAChD,IAAM,0CAA0C;AAEhD,IAAM,qBAAqB,CAAC,QAAQ,cAAc;AAClD,IAAM,wBAAwB,EAAE,KAAK,kBAAkB;AAGvD,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAM,2BAA2B,EAAE,KAAK,qBAAqB;AAG7D,IAAM,+BAA+B;AAAA,EAC1C,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,kBAAkB;AAAA,EAClB,iBAAiB;AACnB;AAEA,IAAM,qCAAqC;AAAA,EACzC,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,6BAA6B;AAC/B;AAEO,IAAM,iCAAiC,EAAE,KAAK,kCAAkC;AAGhF,IAAM,kCAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,qCAAqC,EAAE,KAAK,+BAA+B;AASjF,IAAM,yCAAyC;AAAA,EACpD,cAAc;AAAA,IACZ,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AAAA,EACA,wBAAwB;AAAA,IACtB,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AAAA,EACA,oBAAoB;AAAA,IAClB,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AAAA,EACA,4BAA4B;AAAA,IAC1B,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AACF;AAWO,SAAS,kCACd,SACQ;AACR,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,YAAM,IAAI,MAAM,GAAG,IAAI,iCAAiC;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO,KAAK;AAAA,IACV,QAAQ,kBACJ,QAAQ,oBACR,QAAQ,mBACR,QAAQ;AAAA,IACZ;AAAA,EACF;AACF;AAEO,IAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAM,+BAA+B,EAAE,KAAK,0BAA0B;AAG7E,IAAM,gBAAgB;AACtB,IAAM,wBAAwB;AAEvB,IAAM,wCAAwC,EAClD,OAAO;AAAA,EACN,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,qBAAqB,EAAE,SAAS;AAAA,EACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,qBAAqB,EAAE,SAAS;AACtE,CAAC,EACA,OAAO,EACP,OAAO,CAAC,UAAU,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG,oCAAoC;AAMjF,IAAM,iCAAiC,EAC3C,OAAO;AAAA,EACN,eAAe,EAAE,QAAQ,uCAAuC;AAAA,EAChE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,aAAa;AAAA,EAC7D,uBAAuB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,aAAa;AAAA,EACjE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,aAAa;AAAA,EAC7D,QAAQ;AAAA,EACR,YAAY,EAAE,IAAI,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC3C,SAAS,sCAAsC,SAAS;AAC1D,CAAC,EACA,OAAO;AAIH,SAAS,8BAA8B,OAA0C;AACtF,SAAO,+BAA+B,MAAM,KAAK;AACnD;AAEO,SAAS,kCAAkC,OAAgB;AAChE,SAAO,+BAA+B,UAAU,KAAK;AACvD;AAEA,SAAS,cAAc,MAAc,OAAqB;AACxD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,GAAG,IAAI,6BAA6B;AAAA,EACtD;AACF;AAEA,SAAS,QAAQ,OAAuB;AACtC,MAAI,OAAO;AACX,aAAW,aAAa,OAAO;AAC7B,YAAQ,OAAO,UAAU,YAAY,CAAC,KAAK,CAAC;AAC5C,WAAO,OAAO,QAAQ,IAAI,OAAO,cAAc;AAAA,EACjD;AACA,SAAO,KAAK,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAC3C;AAEA,SAAS,WAAW,QAAgB,OAAiB,WAA2B;AAC9E,QAAM,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,KAAK,GAAG;AAC3D,QAAM,WAAW,GAAG,MAAM,IAAI,SAAS;AACvC,MAAI,SAAS,UAAU,UAAW,QAAO;AACzC,SAAO,GAAG,MAAM,KAAK,QAAQ,SAAS,CAAC;AACzC;AAEO,SAAS,qCACd,QACA,MACA,eACA,UAAU,GACF;AACR,gBAAc,UAAU,MAAM;AAC9B,gBAAc,QAAQ,IAAI;AAC1B,gBAAc,iBAAiB,aAAa;AAC5C,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,GAAG;AAC7C,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,SAAO,WAAW,kBAAkB,CAAC,QAAQ,MAAM,eAAe,OAAO,OAAO,CAAC,GAAG,GAAG;AACzF;AAEO,SAAS,6BAA6B,QAAgB,YAA4B;AACvF,gBAAc,UAAU,MAAM;AAC9B,gBAAc,cAAc,UAAU;AACtC,SAAO,WAAW,YAAY,CAAC,QAAQ,UAAU,GAAG,GAAG;AACzD;AAEO,SAAS,iCACd,QACA,cACQ;AACR,gBAAc,UAAU,MAAM;AAC9B,gBAAc,gBAAgB,YAAY;AAC1C,SAAO,WAAW,WAAW,CAAC,QAAQ,YAAY,GAAG,EAAE;AACzD;","names":[]}