@marlinjai/mail-contract 0.21.0 → 0.23.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/index.mjs CHANGED
@@ -3047,8 +3047,15 @@ var AUDIT_ACTIONS = [
3047
3047
  "domain_order.registered",
3048
3048
  "domain_order.ready",
3049
3049
  "domain_order.needs_attention",
3050
+ "domain_order.kind_changed",
3050
3051
  "domain_order.refunded",
3051
3052
  "domain_order.cancelled",
3053
+ // Bought domains, managed by their holder
3054
+ "domain_record.created",
3055
+ "domain_record.updated",
3056
+ "domain_record.deleted",
3057
+ "domain_leave.requested",
3058
+ "domain_leave.done",
3052
3059
  // A1: automations
3053
3060
  "automation.created",
3054
3061
  "automation.updated",
@@ -3974,6 +3981,292 @@ var SendingDomainUpdate = z15.object({ from_name: SenderFields.from_name.optiona
3974
3981
 
3975
3982
  // src/domains.ts
3976
3983
  import { z as z16 } from "zod";
3984
+
3985
+ // src/phone.ts
3986
+ var REGISTRY_PHONE = /^\+\d{1,3}\.\d{4,14}$/;
3987
+ var CALLING_CODE_OF_COUNTRY = {
3988
+ DE: "49",
3989
+ AT: "43",
3990
+ CH: "41",
3991
+ LI: "423",
3992
+ LU: "352",
3993
+ NL: "31",
3994
+ BE: "32",
3995
+ FR: "33",
3996
+ IT: "39",
3997
+ ES: "34",
3998
+ PT: "351",
3999
+ IE: "353",
4000
+ GB: "44",
4001
+ DK: "45",
4002
+ SE: "46",
4003
+ NO: "47",
4004
+ FI: "358",
4005
+ IS: "354",
4006
+ PL: "48",
4007
+ CZ: "420",
4008
+ SK: "421",
4009
+ HU: "36",
4010
+ SI: "386",
4011
+ HR: "385",
4012
+ RO: "40",
4013
+ BG: "359",
4014
+ GR: "30",
4015
+ CY: "357",
4016
+ MT: "356",
4017
+ EE: "372",
4018
+ LV: "371",
4019
+ LT: "370",
4020
+ US: "1",
4021
+ CA: "1",
4022
+ AU: "61",
4023
+ NZ: "64",
4024
+ TR: "90",
4025
+ IL: "972",
4026
+ AE: "971",
4027
+ IN: "91",
4028
+ JP: "81",
4029
+ CN: "86",
4030
+ SG: "65",
4031
+ ZA: "27",
4032
+ BR: "55",
4033
+ MX: "52",
4034
+ UA: "380",
4035
+ RS: "381"
4036
+ };
4037
+ var CALLING_CODES = /* @__PURE__ */ new Set([
4038
+ "1",
4039
+ "7",
4040
+ "20",
4041
+ "27",
4042
+ "30",
4043
+ "31",
4044
+ "32",
4045
+ "33",
4046
+ "34",
4047
+ "36",
4048
+ "39",
4049
+ "40",
4050
+ "41",
4051
+ "43",
4052
+ "44",
4053
+ "45",
4054
+ "46",
4055
+ "47",
4056
+ "48",
4057
+ "49",
4058
+ "51",
4059
+ "52",
4060
+ "53",
4061
+ "54",
4062
+ "55",
4063
+ "56",
4064
+ "57",
4065
+ "58",
4066
+ "60",
4067
+ "61",
4068
+ "62",
4069
+ "63",
4070
+ "64",
4071
+ "65",
4072
+ "66",
4073
+ "81",
4074
+ "82",
4075
+ "84",
4076
+ "86",
4077
+ "90",
4078
+ "91",
4079
+ "92",
4080
+ "93",
4081
+ "94",
4082
+ "95",
4083
+ "98",
4084
+ "211",
4085
+ "212",
4086
+ "213",
4087
+ "216",
4088
+ "218",
4089
+ "220",
4090
+ "221",
4091
+ "222",
4092
+ "223",
4093
+ "224",
4094
+ "225",
4095
+ "226",
4096
+ "227",
4097
+ "228",
4098
+ "229",
4099
+ "230",
4100
+ "231",
4101
+ "232",
4102
+ "233",
4103
+ "234",
4104
+ "235",
4105
+ "236",
4106
+ "237",
4107
+ "238",
4108
+ "239",
4109
+ "240",
4110
+ "241",
4111
+ "242",
4112
+ "243",
4113
+ "244",
4114
+ "245",
4115
+ "246",
4116
+ "247",
4117
+ "248",
4118
+ "249",
4119
+ "250",
4120
+ "251",
4121
+ "252",
4122
+ "253",
4123
+ "254",
4124
+ "255",
4125
+ "256",
4126
+ "257",
4127
+ "258",
4128
+ "260",
4129
+ "261",
4130
+ "262",
4131
+ "263",
4132
+ "264",
4133
+ "265",
4134
+ "266",
4135
+ "267",
4136
+ "268",
4137
+ "269",
4138
+ "290",
4139
+ "291",
4140
+ "297",
4141
+ "298",
4142
+ "299",
4143
+ "350",
4144
+ "351",
4145
+ "352",
4146
+ "353",
4147
+ "354",
4148
+ "355",
4149
+ "356",
4150
+ "357",
4151
+ "358",
4152
+ "359",
4153
+ "370",
4154
+ "371",
4155
+ "372",
4156
+ "373",
4157
+ "374",
4158
+ "375",
4159
+ "376",
4160
+ "377",
4161
+ "378",
4162
+ "379",
4163
+ "380",
4164
+ "381",
4165
+ "382",
4166
+ "383",
4167
+ "385",
4168
+ "386",
4169
+ "387",
4170
+ "389",
4171
+ "420",
4172
+ "421",
4173
+ "423",
4174
+ "500",
4175
+ "501",
4176
+ "502",
4177
+ "503",
4178
+ "504",
4179
+ "505",
4180
+ "506",
4181
+ "507",
4182
+ "508",
4183
+ "509",
4184
+ "590",
4185
+ "591",
4186
+ "592",
4187
+ "593",
4188
+ "594",
4189
+ "595",
4190
+ "596",
4191
+ "597",
4192
+ "598",
4193
+ "599",
4194
+ "670",
4195
+ "672",
4196
+ "673",
4197
+ "674",
4198
+ "675",
4199
+ "676",
4200
+ "677",
4201
+ "678",
4202
+ "679",
4203
+ "680",
4204
+ "681",
4205
+ "682",
4206
+ "683",
4207
+ "685",
4208
+ "686",
4209
+ "687",
4210
+ "688",
4211
+ "689",
4212
+ "690",
4213
+ "691",
4214
+ "692",
4215
+ "850",
4216
+ "852",
4217
+ "853",
4218
+ "855",
4219
+ "856",
4220
+ "880",
4221
+ "886",
4222
+ "960",
4223
+ "961",
4224
+ "962",
4225
+ "963",
4226
+ "964",
4227
+ "965",
4228
+ "966",
4229
+ "967",
4230
+ "968",
4231
+ "970",
4232
+ "971",
4233
+ "972",
4234
+ "973",
4235
+ "974",
4236
+ "975",
4237
+ "976",
4238
+ "977",
4239
+ "992",
4240
+ "993",
4241
+ "994",
4242
+ "995",
4243
+ "996",
4244
+ "998"
4245
+ ]);
4246
+ var KEEPS_LEADING_ZERO = /* @__PURE__ */ new Set(["39", "378", "379"]);
4247
+ function normalizePhone(raw, country) {
4248
+ const text = raw.trim();
4249
+ if (REGISTRY_PHONE.test(text)) return text;
4250
+ const compact = text.replace(/\(0\)/g, "").replace(/[\s\-./()]/g, "");
4251
+ let international;
4252
+ if (/^\+\d+$/.test(compact)) international = compact.slice(1);
4253
+ else if (/^00\d+$/.test(compact)) international = compact.slice(2);
4254
+ else if (/^0\d+$/.test(compact)) {
4255
+ const code = country ? CALLING_CODE_OF_COUNTRY[country.trim().toUpperCase()] : void 0;
4256
+ if (!code) return raw;
4257
+ return `+${code}.${KEEPS_LEADING_ZERO.has(code) ? compact : compact.slice(1)}`;
4258
+ } else return raw;
4259
+ for (const length of [1, 2, 3]) {
4260
+ const code = international.slice(0, length);
4261
+ if (CALLING_CODES.has(code)) {
4262
+ const rest = international.slice(length);
4263
+ return `+${code}.${KEEPS_LEADING_ZERO.has(code) ? rest : rest.replace(/^0/, "")}`;
4264
+ }
4265
+ }
4266
+ return raw;
4267
+ }
4268
+
4269
+ // src/domains.ts
3977
4270
  var DomainSearchQuery = z16.object({ q: z16.string().trim().min(1).max(63) });
3978
4271
  var DOMAIN_UNAVAILABLE_REASONS = ["taken", "extension_not_supported", "premium", "not_registrable"];
3979
4272
  var DomainUnavailableReason = z16.enum(DOMAIN_UNAVAILABLE_REASONS);
@@ -3995,20 +4288,27 @@ var DomainRegistrant = z16.object({
3995
4288
  name: z16.string().trim().min(3).max(120).regex(/\S+\s+\S+/, "must be a first and a last name"),
3996
4289
  organization: z16.string().trim().min(1).max(120).nullable().optional(),
3997
4290
  email: Email,
3998
- phone: z16.string().trim().regex(/^\+\d{1,3}\.\d{4,14}$/, "must be +<country code>.<number>, such as +49.3012345678"),
4291
+ phone: z16.string().trim().min(1).max(40),
3999
4292
  street: z16.string().trim().min(3).max(200),
4000
4293
  city: z16.string().trim().min(1).max(100),
4001
4294
  state: z16.string().trim().min(1).max(100),
4002
4295
  postal_code: z16.string().trim().min(2).max(20),
4003
4296
  country_code: z16.string().trim().toUpperCase().regex(/^[A-Z]{2}$/, "must be a two-letter country code such as DE")
4004
- });
4297
+ }).superRefine((holder, ctx) => {
4298
+ if (typeof holder.phone === "string" && !REGISTRY_PHONE.test(normalizePhone(holder.phone, holder.country_code))) {
4299
+ ctx.addIssue({ code: z16.ZodIssueCode.custom, path: ["phone"], message: "must be a phone number with its country code, such as +49 30 1234 5678" });
4300
+ }
4301
+ }).transform((holder) => ({ ...holder, phone: normalizePhone(holder.phone, holder.country_code) }));
4005
4302
  var MAX_DOMAIN_ORDERS_PER_DAY = 2;
4303
+ var DOMAIN_ORDER_KINDS = ["sending", "domain_only"];
4304
+ var DomainOrderKind = z16.enum(DOMAIN_ORDER_KINDS);
4006
4305
  var DomainOrderCreate = z16.object({
4007
4306
  domain: SendingDomainName,
4008
4307
  price_cents: z16.number().int().min(0),
4009
4308
  registrant: DomainRegistrant,
4010
- from_name: z16.string().trim().min(1).max(120),
4011
- from_local_part: z16.string().trim().toLowerCase().regex(/^[a-z0-9](?:[a-z0-9._+-]{0,62}[a-z0-9])?$/, "must be the part before the @, such as hello"),
4309
+ kind: DomainOrderKind.default("sending"),
4310
+ from_name: z16.string().trim().min(1).max(120).optional(),
4311
+ from_local_part: z16.string().trim().toLowerCase().regex(/^[a-z0-9](?:[a-z0-9._+-]{0,62}[a-z0-9])?$/, "must be the part before the @, such as hello").optional(),
4012
4312
  /**
4013
4313
  * Where Stripe returns to after paying, and after leaving the payment. The
4014
4314
  * service adds `domain_order=<order id>` to both, so the page coming back
@@ -4019,6 +4319,10 @@ var DomainOrderCreate = z16.object({
4019
4319
  cancel_url: z16.string().url(),
4020
4320
  /** The buyer accepted the terms of service (which cover bought domains) of this version. */
4021
4321
  accept_terms: AcceptTerms
4322
+ }).superRefine((order, ctx) => {
4323
+ if (order.kind !== "sending") return;
4324
+ if (!order.from_name) ctx.addIssue({ code: z16.ZodIssueCode.custom, path: ["from_name"], message: "is needed for a domain mail is sent from" });
4325
+ if (!order.from_local_part) ctx.addIssue({ code: z16.ZodIssueCode.custom, path: ["from_local_part"], message: "is needed for a domain mail is sent from" });
4022
4326
  });
4023
4327
  var DOMAIN_ORDER_STATES = [
4024
4328
  "awaiting_payment",
@@ -4041,8 +4345,10 @@ var DomainOrder = z16.object({
4041
4345
  /** Stripe's payment page while `awaiting_payment`; null otherwise. */
4042
4346
  checkout_url: z16.string().url().nullable(),
4043
4347
  registrant_name: z16.string(),
4044
- from_name: z16.string(),
4045
- from_email: Email,
4348
+ kind: DomainOrderKind,
4349
+ /** The sender, for a `sending` order; null for `domain_only`. */
4350
+ from_name: z16.string().nullable(),
4351
+ from_email: Email.nullable(),
4046
4352
  /** The sending domain once `ready`. */
4047
4353
  sending_domain_id: Id.nullable(),
4048
4354
  /** When the paid year ends, once registered. */
@@ -4055,36 +4361,124 @@ var DomainOrder = z16.object({
4055
4361
  updated_at: Timestamp
4056
4362
  });
4057
4363
 
4058
- // src/contacts.ts
4364
+ // src/bought-domains.ts
4059
4365
  import { z as z17 } from "zod";
4060
- var Topic = z17.object({
4366
+ var DOMAIN_LEAVE_WAYS = ["cloudflare_account", "transfer"];
4367
+ var DomainLeaveWay = z17.enum(DOMAIN_LEAVE_WAYS);
4368
+ var DOMAIN_LEAVE_STATES = ["requested", "done", "cancelled"];
4369
+ var DomainLeaveState = z17.enum(DOMAIN_LEAVE_STATES);
4370
+ var DomainLeave = z17.object({
4371
+ id: Id,
4372
+ way: DomainLeaveWay,
4373
+ state: DomainLeaveState,
4374
+ /** The Cloudflare account the domain moves into (way `cloudflare_account`). */
4375
+ target_account_id: z17.string().nullable(),
4376
+ /** The transfer code, once support has it (way `transfer`, state `done`); only owners and admins read it. */
4377
+ auth_code: z17.string().nullable(),
4378
+ requested_at: Timestamp,
4379
+ done_at: Timestamp.nullable()
4380
+ });
4381
+ var BoughtDomain = z17.object({
4382
+ /** The order the domain was bought with. */
4383
+ id: Id,
4384
+ domain: z17.string(),
4385
+ kind: DomainOrderKind,
4386
+ registrant_name: z17.string(),
4387
+ registered_at: Timestamp,
4388
+ /** When the paid year ends. */
4389
+ expires_at: Timestamp.nullable(),
4390
+ /** Each further year, final, in euro cents; 0 for a domain registered without a charge. */
4391
+ renewal_price_cents: z17.number().int().min(0),
4392
+ currency: z17.literal("EUR"),
4393
+ /** Registered for one of Lumitra's own companies, never charged. */
4394
+ no_charge: z17.boolean(),
4395
+ /** The earliest moment each way of leaving is possible. */
4396
+ move_account_from: Timestamp,
4397
+ transfer_from: Timestamp,
4398
+ /** The latest request to leave, if any. */
4399
+ leave: DomainLeave.nullable(),
4400
+ /** True once the domain has left: its records are no longer Lumitra Mail's to edit. */
4401
+ left: z17.boolean()
4402
+ });
4403
+ var DNS_RECORD_TYPES = ["A", "AAAA", "CNAME", "TXT", "MX", "NS"];
4404
+ var DnsRecordType = z17.enum(DNS_RECORD_TYPES);
4405
+ var DomainRecord = z17.object({
4406
+ id: z17.string(),
4407
+ type: z17.string(),
4408
+ /** The full name (www.example.com). */
4409
+ name: z17.string(),
4410
+ content: z17.string(),
4411
+ /** Seconds; 1 is automatic. */
4412
+ ttl: z17.number().int(),
4413
+ /** Served through Cloudflare's proxy (A, AAAA, CNAME only). */
4414
+ proxied: z17.boolean(),
4415
+ priority: z17.number().int().nullable(),
4416
+ /**
4417
+ * Not the holder's to change: a record Lumitra Mail wrote for sending (it
4418
+ * keeps those right itself), or a type the dashboard does not edit.
4419
+ */
4420
+ locked: z17.boolean()
4421
+ });
4422
+ var IPV4 = /^(25[0-5]|2[0-4]\d|1?\d?\d)(\.(25[0-5]|2[0-4]\d|1?\d?\d)){3}$/;
4423
+ var HOSTNAME = /^(?=.{1,253}\.?$)([a-z0-9_](?:[a-z0-9_-]{0,61}[a-z0-9])?\.)*[a-z0-9_](?:[a-z0-9_-]{0,61}[a-z0-9])?\.?$/i;
4424
+ var DomainRecordInput = z17.object({
4425
+ type: DnsRecordType,
4426
+ name: z17.string().trim().min(1).max(253),
4427
+ content: z17.string().trim().min(1).max(2048),
4428
+ ttl: z17.union([z17.literal(1), z17.number().int().min(60).max(86400)]).default(1),
4429
+ proxied: z17.boolean().default(false),
4430
+ priority: z17.number().int().min(0).max(65535).nullable().optional()
4431
+ }).superRefine((r, ctx) => {
4432
+ const bad = (path, message) => ctx.addIssue({ code: z17.ZodIssueCode.custom, path: [path], message });
4433
+ if (r.type === "A" && !IPV4.test(r.content)) bad("content", "must be an IPv4 address, such as 192.0.2.10");
4434
+ if (r.type === "AAAA" && (!r.content.includes(":") || !/^[0-9a-f:.]+$/i.test(r.content))) bad("content", "must be an IPv6 address, such as 2001:db8::10");
4435
+ if ((r.type === "CNAME" || r.type === "MX" || r.type === "NS") && !HOSTNAME.test(r.content)) bad("content", "must be a host name, such as host.example.com");
4436
+ if (r.type === "MX" && (r.priority === void 0 || r.priority === null)) bad("priority", "is needed for an MX record");
4437
+ if (r.type !== "MX" && r.priority !== void 0 && r.priority !== null) bad("priority", "is only for an MX record");
4438
+ if (r.proxied && !["A", "AAAA", "CNAME"].includes(r.type)) bad("proxied", "is only for A, AAAA and CNAME records");
4439
+ });
4440
+ var BoughtDomainRecordParams = z17.object({ id: Id, record_id: z17.string().regex(/^[0-9a-f]{32}$/, "must be a record id") });
4441
+ var DomainLeaveCreate = z17.object({
4442
+ way: DomainLeaveWay,
4443
+ /** The holder's own Cloudflare account id (32 hex characters), for `cloudflare_account`. */
4444
+ target_account_id: z17.string().trim().toLowerCase().regex(/^[0-9a-f]{32}$/, "must be a Cloudflare account id: 32 letters and digits, from the account\u2019s overview page").optional()
4445
+ }).superRefine((r, ctx) => {
4446
+ if (r.way === "cloudflare_account" && !r.target_account_id) {
4447
+ ctx.addIssue({ code: z17.ZodIssueCode.custom, path: ["target_account_id"], message: "is needed to move the domain into your Cloudflare account" });
4448
+ }
4449
+ });
4450
+ var ZoneFile = z17.object({ domain: z17.string(), zone_file: z17.string() });
4451
+
4452
+ // src/contacts.ts
4453
+ import { z as z18 } from "zod";
4454
+ var Topic = z18.object({
4061
4455
  id: Id,
4062
4456
  slug: Slug,
4063
- name: z17.string().min(1).max(120),
4457
+ name: z18.string().min(1).max(120),
4064
4458
  /** Shown on the hosted preference page. */
4065
- description: z17.string().max(1e3).nullable(),
4459
+ description: z18.string().max(1e3).nullable(),
4066
4460
  /** Translations of `name` and `description` per locale, for the hosted page. */
4067
- translations: z17.record(
4068
- z17.object({ name: z17.string().min(1).max(120), description: z17.string().max(1e3).nullable() })
4461
+ translations: z18.record(
4462
+ z18.object({ name: z18.string().min(1).max(120), description: z18.string().max(1e3).nullable() })
4069
4463
  ),
4070
4464
  created_at: Timestamp,
4071
4465
  updated_at: Timestamp
4072
4466
  });
4073
- var TopicCreate = z17.object({
4467
+ var TopicCreate = z18.object({
4074
4468
  slug: Slug,
4075
- name: z17.string().min(1).max(120),
4076
- description: z17.string().max(1e3).optional(),
4469
+ name: z18.string().min(1).max(120),
4470
+ description: z18.string().max(1e3).optional(),
4077
4471
  translations: Topic.shape.translations.optional()
4078
4472
  });
4079
4473
  var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4080
- var Contact = z17.object({
4474
+ var Contact = z18.object({
4081
4475
  id: Id,
4082
- external_id: z17.string().min(1).max(255).nullable(),
4476
+ external_id: z18.string().min(1).max(255).nullable(),
4083
4477
  /** Stored lowercased, unique per workspace. */
4084
4478
  email: Email,
4085
- first_name: z17.string().max(200).nullable(),
4086
- last_name: z17.string().max(200).nullable(),
4087
- locale: z17.string().min(2).max(35).nullable(),
4479
+ first_name: z18.string().max(200).nullable(),
4480
+ last_name: z18.string().max(200).nullable(),
4481
+ locale: z18.string().min(2).max(35).nullable(),
4088
4482
  /**
4089
4483
  * The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
4090
4484
  * Every wall clock an automation waits for is read in it, falling back to the
@@ -4092,65 +4486,65 @@ var Contact = z17.object({
4092
4486
  */
4093
4487
  timezone: TimezoneName.nullable(),
4094
4488
  properties: Properties,
4095
- topics: z17.array(Slug),
4489
+ topics: z18.array(Slug),
4096
4490
  /** The slugs of the contact's tags (S4). */
4097
- tags: z17.array(Slug),
4491
+ tags: z18.array(Slug),
4098
4492
  created_at: Timestamp,
4099
4493
  updated_at: Timestamp
4100
4494
  });
4101
- var ContactUpsert = z17.object({
4102
- external_id: z17.string().min(1).max(255).optional(),
4495
+ var ContactUpsert = z18.object({
4496
+ external_id: z18.string().min(1).max(255).optional(),
4103
4497
  email: Email.optional(),
4104
- first_name: z17.string().max(200).nullable().optional(),
4105
- last_name: z17.string().max(200).nullable().optional(),
4106
- locale: z17.string().min(2).max(35).nullable().optional(),
4498
+ first_name: z18.string().max(200).nullable().optional(),
4499
+ last_name: z18.string().max(200).nullable().optional(),
4500
+ locale: z18.string().min(2).max(35).nullable().optional(),
4107
4501
  timezone: TimezoneName.nullable().optional(),
4108
4502
  properties: Properties.optional(),
4109
- topics: z17.array(Slug).max(100).optional()
4503
+ topics: z18.array(Slug).max(100).optional()
4110
4504
  }).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
4111
4505
  message: "external_id or email is required",
4112
4506
  path: ["email"]
4113
4507
  });
4114
- var ContactUpsertResult = z17.object({
4508
+ var ContactUpsertResult = z18.object({
4115
4509
  contact: Contact,
4116
- created: z17.boolean()
4510
+ created: z18.boolean()
4117
4511
  });
4118
4512
  var ContactListQuery = PageQuery.extend({
4119
- email: z17.string().min(1).max(254).optional(),
4120
- external_id: z17.string().min(1).max(255).optional(),
4513
+ email: z18.string().min(1).max(254).optional(),
4514
+ external_id: z18.string().min(1).max(255).optional(),
4121
4515
  topic: Slug.optional()
4122
4516
  });
4123
- var ContactErased = z17.object({
4124
- ok: z17.literal(true),
4125
- erased_messages: z17.number().int().min(0),
4126
- erased_recipients: z17.number().int().min(0),
4127
- suppressions_kept: z17.number().int().min(0)
4517
+ var ContactErased = z18.object({
4518
+ ok: z18.literal(true),
4519
+ erased_messages: z18.number().int().min(0),
4520
+ erased_recipients: z18.number().int().min(0),
4521
+ suppressions_kept: z18.number().int().min(0)
4128
4522
  });
4129
4523
  var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
4130
- var SuppressionReason = z17.enum(SUPPRESSION_REASONS);
4131
- var Suppression = z17.object({
4524
+ var SuppressionReason = z18.enum(SUPPRESSION_REASONS);
4525
+ var Suppression = z18.object({
4132
4526
  id: Id,
4133
4527
  email: Email,
4134
4528
  reason: SuppressionReason,
4135
4529
  topic: Slug.nullable(),
4136
4530
  source_message_id: Id.nullable(),
4137
- note: z17.string().max(1e3).nullable(),
4531
+ note: z18.string().max(1e3).nullable(),
4138
4532
  created_at: Timestamp
4139
4533
  });
4140
- var SuppressionCreate = z17.object({
4534
+ var SuppressionCreate = z18.object({
4141
4535
  email: Email,
4142
- reason: z17.enum(["manual", "unsubscribed"]),
4536
+ reason: z18.enum(["manual", "unsubscribed"]),
4143
4537
  topic: Slug.nullable().optional(),
4144
- note: z17.string().max(1e3).optional()
4538
+ note: z18.string().max(1e3).optional()
4145
4539
  });
4146
4540
  var SuppressionListQuery = PageQuery.extend({
4147
- email: z17.string().min(1).max(254).optional(),
4541
+ email: z18.string().min(1).max(254).optional(),
4148
4542
  reason: SuppressionReason.optional(),
4149
4543
  topic: Slug.optional()
4150
4544
  });
4151
4545
 
4152
4546
  // src/webhooks.ts
4153
- import { z as z18 } from "zod";
4547
+ import { z as z19 } from "zod";
4154
4548
  var WEBHOOK_EVENT_TYPES = [
4155
4549
  "message.sent",
4156
4550
  "message.failed",
@@ -4194,23 +4588,23 @@ var WEBHOOK_EVENT_TYPES = [
4194
4588
  "template.updated",
4195
4589
  "template.deleted"
4196
4590
  ];
4197
- var WebhookEventType = z18.enum(WEBHOOK_EVENT_TYPES);
4198
- var MessageEventBase = z18.object({
4591
+ var WebhookEventType = z19.enum(WEBHOOK_EVENT_TYPES);
4592
+ var MessageEventBase = z19.object({
4199
4593
  message_id: Id,
4200
4594
  mailing_id: Id.nullable(),
4201
4595
  mailing_metadata: MailingMetadata.nullable(),
4202
4596
  recipient_id: Id.nullable(),
4203
4597
  contact_id: Id.nullable(),
4204
- external_id: z18.string().nullable(),
4598
+ external_id: z19.string().nullable(),
4205
4599
  email: Email,
4206
- subject: z18.string(),
4600
+ subject: z19.string(),
4207
4601
  topic: Slug.nullable(),
4208
- provider_message_id: z18.string().nullable(),
4209
- is_test: z18.boolean()
4602
+ provider_message_id: z19.string().nullable(),
4603
+ is_test: z19.boolean()
4210
4604
  });
4211
4605
  var MessageSentData = MessageEventBase.extend({
4212
4606
  /** The final HTML as sent, so the client can archive it beside its own records. */
4213
- html: z18.string(),
4607
+ html: z19.string(),
4214
4608
  sent_at: Timestamp,
4215
4609
  /**
4216
4610
  * The choice each insertion made (see `Message.insertions`); absent or null
@@ -4221,20 +4615,20 @@ var MessageSentData = MessageEventBase.extend({
4221
4615
  insertions: InsertionChoices.nullish()
4222
4616
  });
4223
4617
  var MessageFailedData = MessageEventBase.extend({
4224
- error: z18.string(),
4618
+ error: z19.string(),
4225
4619
  /** False when the provider rejected permanently; the recipient will not be retried. */
4226
- retryable: z18.boolean(),
4620
+ retryable: z19.boolean(),
4227
4621
  failed_at: Timestamp
4228
4622
  });
4229
4623
  var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
4230
- var ContactUnsubscribedData = z18.object({
4624
+ var ContactUnsubscribedData = z19.object({
4231
4625
  contact_id: Id.nullable(),
4232
- external_id: z18.string().nullable(),
4626
+ external_id: z19.string().nullable(),
4233
4627
  email: Email,
4234
4628
  /** The topic unsubscribed from; null means every topic. */
4235
4629
  topic: Slug.nullable(),
4236
4630
  mailing_id: Id.nullable(),
4237
- source: z18.enum(UNSUBSCRIBE_SOURCES),
4631
+ source: z19.enum(UNSUBSCRIBE_SOURCES),
4238
4632
  unsubscribed_at: Timestamp
4239
4633
  });
4240
4634
  var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
@@ -4243,142 +4637,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
4243
4637
  * breaker undid a `bounced` block it judged false (a `contact.bounced` for the
4244
4638
  * same address and mailing went out before); `topic` is null.
4245
4639
  */
4246
- source: z18.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4640
+ source: z19.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4247
4641
  resubscribed_at: Timestamp
4248
4642
  });
4249
- var ContactBouncedData = z18.object({
4643
+ var ContactBouncedData = z19.object({
4250
4644
  contact_id: Id.nullable(),
4251
- external_id: z18.string().nullable(),
4645
+ external_id: z19.string().nullable(),
4252
4646
  email: Email,
4253
4647
  /** `bounced` for a hard bounce, `complained` for a spam complaint. */
4254
- reason: z18.enum(["bounced", "complained"]),
4648
+ reason: z19.enum(["bounced", "complained"]),
4255
4649
  message_id: Id.nullable(),
4256
- diagnostic: z18.string().nullable(),
4650
+ diagnostic: z19.string().nullable(),
4257
4651
  bounced_at: Timestamp
4258
4652
  });
4259
- var MailingFinishedData = z18.object({
4653
+ var MailingFinishedData = z19.object({
4260
4654
  mailing_id: Id,
4261
4655
  mailing_metadata: MailingMetadata,
4262
- status: z18.enum(["sent", "partially_failed", "cancelled"]),
4656
+ status: z19.enum(["sent", "partially_failed", "cancelled"]),
4263
4657
  counts: MailingCounts,
4264
4658
  finished_at: Timestamp
4265
4659
  });
4266
- var ContactSubscribedData = z18.object({
4660
+ var ContactSubscribedData = z19.object({
4267
4661
  contact_id: Id,
4268
- external_id: z18.string().nullable(),
4662
+ external_id: z19.string().nullable(),
4269
4663
  email: Email,
4270
- topics: z18.array(Slug),
4271
- source: z18.enum(["signup_form", "api", "dashboard", "automation"]),
4664
+ topics: z19.array(Slug),
4665
+ source: z19.enum(["signup_form", "api", "dashboard", "automation"]),
4272
4666
  signup_form_id: Id.nullable(),
4273
- signup_form_version: z18.number().int().min(1).nullable(),
4667
+ signup_form_version: z19.number().int().min(1).nullable(),
4274
4668
  subscribed_at: Timestamp
4275
4669
  });
4276
- var ImportFinishedData = z18.object({
4670
+ var ImportFinishedData = z19.object({
4277
4671
  import_id: Id,
4278
- status: z18.enum(["completed", "cancelled", "failed"]),
4672
+ status: z19.enum(["completed", "cancelled", "failed"]),
4279
4673
  result: ImportReport.nullable(),
4280
- error: z18.string().nullable(),
4674
+ error: z19.string().nullable(),
4281
4675
  finished_at: Timestamp
4282
4676
  });
4283
- var MailingScheduledData = z18.object({
4677
+ var MailingScheduledData = z19.object({
4284
4678
  mailing_id: Id,
4285
4679
  mailing_metadata: MailingMetadata,
4286
4680
  scheduled_at: Timestamp.nullable()
4287
4681
  });
4288
- var MailingStartedData = z18.object({
4682
+ var MailingStartedData = z19.object({
4289
4683
  mailing_id: Id,
4290
4684
  mailing_metadata: MailingMetadata,
4291
- trigger: z18.enum(["send", "schedule"]),
4292
- recipients: z18.number().int().min(0),
4685
+ trigger: z19.enum(["send", "schedule"]),
4686
+ recipients: z19.number().int().min(0),
4293
4687
  started_at: Timestamp
4294
4688
  });
4295
- var MailingScheduleFailedData = z18.object({
4689
+ var MailingScheduleFailedData = z19.object({
4296
4690
  mailing_id: Id,
4297
4691
  mailing_metadata: MailingMetadata,
4298
- code: z18.string(),
4299
- message: z18.string(),
4692
+ code: z19.string(),
4693
+ message: z19.string(),
4300
4694
  failed_at: Timestamp
4301
4695
  });
4302
- var MailingAbWinnerSelectedData = z18.object({
4696
+ var MailingAbWinnerSelectedData = z19.object({
4303
4697
  mailing_id: Id,
4304
4698
  mailing_metadata: MailingMetadata,
4305
- winner: z18.string(),
4306
- decided_by: z18.enum(["metric", "manual"]),
4307
- variants: z18.array(VariantAnalytics),
4699
+ winner: z19.string(),
4700
+ decided_by: z19.enum(["metric", "manual"]),
4701
+ variants: z19.array(VariantAnalytics),
4308
4702
  decided_at: Timestamp
4309
4703
  });
4310
- var ContactTaggedData = z18.object({
4704
+ var ContactTaggedData = z19.object({
4311
4705
  contact_id: Id,
4312
- external_id: z18.string().nullable(),
4706
+ external_id: z19.string().nullable(),
4313
4707
  email: Email,
4314
4708
  /** Only the tags the contact did not already have. */
4315
- tags: z18.array(Slug).min(1),
4316
- source: z18.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4709
+ tags: z19.array(Slug).min(1),
4710
+ source: z19.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4317
4711
  tagged_at: Timestamp
4318
4712
  });
4319
- var ContactUpdatedData = z18.object({
4713
+ var ContactUpdatedData = z19.object({
4320
4714
  contact_id: Id,
4321
- external_id: z18.string().nullable(),
4715
+ external_id: z19.string().nullable(),
4322
4716
  email: Email,
4323
- changed: z18.array(z18.string()).min(1),
4717
+ changed: z19.array(z19.string()).min(1),
4324
4718
  properties: Properties,
4325
- source: z18.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4719
+ source: z19.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4326
4720
  updated_at: Timestamp
4327
4721
  });
4328
- var AutomationRunEventBase = z18.object({
4722
+ var AutomationRunEventBase = z19.object({
4329
4723
  automation_id: Id,
4330
- automation_name: z18.string(),
4724
+ automation_name: z19.string(),
4331
4725
  run_id: Id,
4332
- version: z18.number().int().min(1),
4726
+ version: z19.number().int().min(1),
4333
4727
  contact_id: Id,
4334
- external_id: z18.string().nullable(),
4728
+ external_id: z19.string().nullable(),
4335
4729
  email: Email
4336
4730
  });
4337
4731
  var AutomationRunStartedData = AutomationRunEventBase.extend({
4338
4732
  /** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
4339
- trigger_kind: z18.string(),
4733
+ trigger_kind: z19.string(),
4340
4734
  entered_at: Timestamp
4341
4735
  });
4342
4736
  var AutomationRunCompletedData = AutomationRunEventBase.extend({
4343
- last_step_id: z18.string().nullable(),
4737
+ last_step_id: z19.string().nullable(),
4344
4738
  completed_at: Timestamp
4345
4739
  });
4346
4740
  var AutomationRunExitedData = AutomationRunEventBase.extend({
4347
4741
  reason: AutomationEndReason,
4348
- step_id: z18.string().nullable(),
4742
+ step_id: z19.string().nullable(),
4349
4743
  exited_at: Timestamp
4350
4744
  });
4351
4745
  var AutomationRunFailedData = AutomationRunEventBase.extend({
4352
- reason: z18.string(),
4353
- step_id: z18.string().nullable(),
4746
+ reason: z19.string(),
4747
+ step_id: z19.string().nullable(),
4354
4748
  failed_at: Timestamp
4355
4749
  });
4356
4750
  var AutomationWebhookData = AutomationRunEventBase.extend({
4357
- step_id: z18.string(),
4751
+ step_id: z19.string(),
4358
4752
  /** The step's own label, when it was given one, so a receiver can branch on a name. */
4359
- step_label: z18.string().nullable(),
4753
+ step_label: z19.string().nullable(),
4360
4754
  /** Whatever the step carries, verbatim. Null when it carries nothing. */
4361
4755
  payload: JsonValue.nullable(),
4362
4756
  fired_at: Timestamp
4363
4757
  });
4364
- var TemplateEventBase = z18.object({
4758
+ var TemplateEventBase = z19.object({
4365
4759
  template_id: Id,
4366
- name: z18.string().min(1).max(200),
4367
- version: z18.number().int().min(1),
4368
- source: z18.enum(["api", "dashboard", "mjml_import"])
4760
+ name: z19.string().min(1).max(200),
4761
+ version: z19.number().int().min(1),
4762
+ source: z19.enum(["api", "dashboard", "mjml_import"])
4369
4763
  });
4370
4764
  var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
4371
- var TemplateUpdatedData = TemplateEventBase.extend({ archived: z18.boolean(), updated_at: Timestamp });
4765
+ var TemplateUpdatedData = TemplateEventBase.extend({ archived: z19.boolean(), updated_at: Timestamp });
4372
4766
  var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
4373
- var envelope = (type, data) => z18.object({
4767
+ var envelope = (type, data) => z19.object({
4374
4768
  /** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
4375
4769
  id: Id,
4376
- type: z18.literal(type),
4770
+ type: z19.literal(type),
4377
4771
  created_at: Timestamp,
4378
4772
  workspace_id: Id,
4379
4773
  data
4380
4774
  });
4381
- var WebhookEvent = z18.discriminatedUnion("type", [
4775
+ var WebhookEvent = z19.discriminatedUnion("type", [
4382
4776
  envelope("message.sent", MessageSentData),
4383
4777
  envelope("message.failed", MessageFailedData),
4384
4778
  envelope("contact.unsubscribed", ContactUnsubscribedData),
@@ -4402,16 +4796,16 @@ var WebhookEvent = z18.discriminatedUnion("type", [
4402
4796
  envelope("template.updated", TemplateUpdatedData),
4403
4797
  envelope("template.deleted", TemplateDeletedData)
4404
4798
  ]);
4405
- var WebhookEndpoint = z18.object({
4799
+ var WebhookEndpoint = z19.object({
4406
4800
  id: Id,
4407
- url: z18.string().url(),
4408
- description: z18.string().max(500).nullable(),
4409
- events: z18.array(WebhookEventType).min(1),
4410
- enabled: z18.boolean(),
4801
+ url: z19.string().url(),
4802
+ description: z19.string().max(500).nullable(),
4803
+ events: z19.array(WebhookEventType).min(1),
4804
+ enabled: z19.boolean(),
4411
4805
  created_at: Timestamp,
4412
4806
  updated_at: Timestamp
4413
4807
  });
4414
- var WebhookUrl = z18.string().url().refine((u) => {
4808
+ var WebhookUrl = z19.string().url().refine((u) => {
4415
4809
  try {
4416
4810
  const url = new URL(u);
4417
4811
  if (url.protocol === "https:") return true;
@@ -4420,35 +4814,35 @@ var WebhookUrl = z18.string().url().refine((u) => {
4420
4814
  return false;
4421
4815
  }
4422
4816
  }, "must be https (http only for localhost)");
4423
- var WebhookEndpointCreate = z18.object({
4817
+ var WebhookEndpointCreate = z19.object({
4424
4818
  url: WebhookUrl,
4425
- description: z18.string().max(500).optional(),
4426
- events: z18.array(WebhookEventType).min(1),
4427
- enabled: z18.boolean().optional()
4819
+ description: z19.string().max(500).optional(),
4820
+ events: z19.array(WebhookEventType).min(1),
4821
+ enabled: z19.boolean().optional()
4428
4822
  });
4429
- var WebhookEndpointUpdate = z18.object({
4823
+ var WebhookEndpointUpdate = z19.object({
4430
4824
  url: WebhookUrl,
4431
- description: z18.string().max(500).nullable(),
4432
- events: z18.array(WebhookEventType).min(1),
4433
- enabled: z18.boolean()
4825
+ description: z19.string().max(500).nullable(),
4826
+ events: z19.array(WebhookEventType).min(1),
4827
+ enabled: z19.boolean()
4434
4828
  }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4435
- var WebhookEndpointWithSecret = z18.object({
4829
+ var WebhookEndpointWithSecret = z19.object({
4436
4830
  endpoint: WebhookEndpoint,
4437
- secret: z18.string().min(32)
4831
+ secret: z19.string().min(32)
4438
4832
  });
4439
4833
  var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
4440
- var WebhookDeliveryStatus = z18.enum(WEBHOOK_DELIVERY_STATUSES);
4834
+ var WebhookDeliveryStatus = z19.enum(WEBHOOK_DELIVERY_STATUSES);
4441
4835
  var WEBHOOK_MAX_ATTEMPTS = 8;
4442
4836
  var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
4443
- var WebhookDelivery = z18.object({
4837
+ var WebhookDelivery = z19.object({
4444
4838
  id: Id,
4445
4839
  endpoint_id: Id,
4446
4840
  event_id: Id,
4447
4841
  event_type: WebhookEventType,
4448
4842
  status: WebhookDeliveryStatus,
4449
- attempts: z18.number().int().min(0),
4450
- last_status_code: z18.number().int().min(100).max(599).nullable(),
4451
- last_error: z18.string().nullable(),
4843
+ attempts: z19.number().int().min(0),
4844
+ last_status_code: z19.number().int().min(100).max(599).nullable(),
4845
+ last_error: z19.string().nullable(),
4452
4846
  next_attempt_at: Timestamp.nullable(),
4453
4847
  delivered_at: Timestamp.nullable(),
4454
4848
  created_at: Timestamp
@@ -4457,7 +4851,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
4457
4851
  status: WebhookDeliveryStatus.optional(),
4458
4852
  event_type: WebhookEventType.optional()
4459
4853
  });
4460
- var WebhookDeliveryParams = z18.object({ id: Id, delivery_id: Id });
4854
+ var WebhookDeliveryParams = z19.object({ id: Id, delivery_id: Id });
4461
4855
 
4462
4856
  // src/webhook-signing.ts
4463
4857
  var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
@@ -4524,99 +4918,99 @@ async function verifyWebhook(input) {
4524
4918
  }
4525
4919
 
4526
4920
  // src/billing.ts
4527
- import { z as z19 } from "zod";
4921
+ import { z as z20 } from "zod";
4528
4922
  var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
4529
- var PlanId = z19.enum(PLAN_IDS);
4530
- var PlanLimits = z19.object({
4531
- monthly_messages: z19.number().int().min(0).nullable(),
4532
- contacts: z19.number().int().min(0).nullable(),
4533
- members: z19.number().int().min(1).nullable(),
4534
- providers: z19.number().int().min(1).nullable(),
4535
- webhook_endpoints: z19.number().int().min(0).nullable(),
4923
+ var PlanId = z20.enum(PLAN_IDS);
4924
+ var PlanLimits = z20.object({
4925
+ monthly_messages: z20.number().int().min(0).nullable(),
4926
+ contacts: z20.number().int().min(0).nullable(),
4927
+ members: z20.number().int().min(1).nullable(),
4928
+ providers: z20.number().int().min(1).nullable(),
4929
+ webhook_endpoints: z20.number().int().min(0).nullable(),
4536
4930
  /** Automations that may be live (active or paused) at once (A1). */
4537
- active_automations: z19.number().int().min(0).nullable(),
4931
+ active_automations: z20.number().int().min(0).nullable(),
4538
4932
  /** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
4539
- automation_steps: z19.number().int().min(1).nullable(),
4933
+ automation_steps: z20.number().int().min(1).nullable(),
4540
4934
  /** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
4541
- sending_domains: z19.number().int().min(0).nullable()
4935
+ sending_domains: z20.number().int().min(0).nullable()
4542
4936
  });
4543
- var PlanFeatures = z19.object({
4937
+ var PlanFeatures = z20.object({
4544
4938
  /** A/B tests of subject and content on a mailing (S4). */
4545
- ab_testing: z19.boolean(),
4939
+ ab_testing: z20.boolean(),
4546
4940
  /** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
4547
- tracking: z19.boolean(),
4941
+ tracking: z20.boolean(),
4548
4942
  /** Automations: flows a person walks through step by step (A1). */
4549
- automations: z19.boolean()
4943
+ automations: z20.boolean()
4550
4944
  });
4551
4945
  var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
4552
- var Plan = z19.object({
4946
+ var Plan = z20.object({
4553
4947
  id: PlanId,
4554
- name: z19.string().min(1),
4948
+ name: z20.string().min(1),
4555
4949
  /** Price in the smallest currency unit per month; null for plans not sold. */
4556
- monthly_price_cents: z19.number().int().min(0).nullable(),
4557
- currency: z19.string().length(3),
4950
+ monthly_price_cents: z20.number().int().min(0).nullable(),
4951
+ currency: z20.string().length(3),
4558
4952
  limits: PlanLimits,
4559
4953
  features: PlanFeatures
4560
4954
  });
4561
- var CatalogPlan = Plan.extend({ sellable: z19.boolean() });
4562
- var Subscription = z19.object({
4955
+ var CatalogPlan = Plan.extend({ sellable: z20.boolean() });
4956
+ var Subscription = z20.object({
4563
4957
  workspace_id: Id,
4564
4958
  plan: PlanId,
4565
- status: z19.enum(["active", "trialing", "past_due", "cancelled"]),
4959
+ status: z20.enum(["active", "trialing", "past_due", "cancelled"]),
4566
4960
  current_period_start: Timestamp,
4567
4961
  current_period_end: Timestamp,
4568
- cancel_at_period_end: z19.boolean(),
4962
+ cancel_at_period_end: z20.boolean(),
4569
4963
  /**
4570
4964
  * A design partner outside billing (plan `design_partner`, no limits, no
4571
4965
  * checkout). Set only by an operator, never through the API.
4572
4966
  */
4573
- billing_exempt: z19.boolean(),
4967
+ billing_exempt: z20.boolean(),
4574
4968
  /**
4575
4969
  * Own sending domains bought on top of the plan's included ones (the
4576
4970
  * add-on), each a monthly charge on the same subscription. 0 without the
4577
4971
  * add-on; the usage limit `sending_domains` is the plan's plus these.
4578
4972
  */
4579
- extra_sending_domains: z19.number().int().min(0)
4973
+ extra_sending_domains: z20.number().int().min(0)
4580
4974
  });
4581
- var BillingAddons = z19.object({
4582
- sending_domain: z19.object({
4583
- monthly_price_cents: z19.number().int().min(0),
4584
- currency: z19.string().length(3),
4585
- sellable: z19.boolean()
4975
+ var BillingAddons = z20.object({
4976
+ sending_domain: z20.object({
4977
+ monthly_price_cents: z20.number().int().min(0),
4978
+ currency: z20.string().length(3),
4979
+ sellable: z20.boolean()
4586
4980
  })
4587
4981
  });
4588
4982
  var MAX_EXTRA_SENDING_DOMAINS = 100;
4589
- var ExtraSendingDomainsUpdate = z19.object({ quantity: z19.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4983
+ var ExtraSendingDomainsUpdate = z20.object({ quantity: z20.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4590
4984
  var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
4591
- var UsageMetric = z19.enum(USAGE_METRICS);
4985
+ var UsageMetric = z20.enum(USAGE_METRICS);
4592
4986
  var USAGE_WARNING_RATIO = 0.8;
4593
- var UsageWarning = z19.object({
4987
+ var UsageWarning = z20.object({
4594
4988
  metric: UsageMetric,
4595
- used: z19.number().int().min(0),
4596
- limit: z19.number().int().min(0),
4989
+ used: z20.number().int().min(0),
4990
+ limit: z20.number().int().min(0),
4597
4991
  /** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
4598
- level: z19.enum(["approaching", "reached"])
4992
+ level: z20.enum(["approaching", "reached"])
4599
4993
  });
4600
- var TermsStatus = z19.object({ accepted_version: z19.string().nullable(), current_version: z19.string() });
4601
- var Usage = z19.object({
4994
+ var TermsStatus = z20.object({ accepted_version: z20.string().nullable(), current_version: z20.string() });
4995
+ var Usage = z20.object({
4602
4996
  plan: PlanId,
4603
4997
  period_start: Timestamp,
4604
4998
  period_end: Timestamp,
4605
- metrics: z19.record(UsageMetric, z19.object({ used: z19.number().int().min(0), limit: z19.number().int().min(0).nullable() })),
4606
- warnings: z19.array(UsageWarning),
4999
+ metrics: z20.record(UsageMetric, z20.object({ used: z20.number().int().min(0), limit: z20.number().int().min(0).nullable() })),
5000
+ warnings: z20.array(UsageWarning),
4607
5001
  terms: TermsStatus
4608
5002
  });
4609
- var TermsAcceptance = z19.object({ accept_terms: AcceptTerms });
4610
- var CheckoutRequest = z19.object({
4611
- plan: z19.enum(["starter", "growth"]),
4612
- success_url: z19.string().url(),
4613
- cancel_url: z19.string().url(),
5003
+ var TermsAcceptance = z20.object({ accept_terms: AcceptTerms });
5004
+ var CheckoutRequest = z20.object({
5005
+ plan: z20.enum(["starter", "growth"]),
5006
+ success_url: z20.string().url(),
5007
+ cancel_url: z20.string().url(),
4614
5008
  /** The buyer accepted the terms of service and the processing agreement of this version. */
4615
5009
  accept_terms: AcceptTerms
4616
5010
  });
4617
- var CheckoutSession = z19.object({ url: z19.string().url() });
4618
- var PortalRequest = z19.object({ return_url: z19.string().url() });
4619
- var PortalSession = z19.object({ url: z19.string().url() });
5011
+ var CheckoutSession = z20.object({ url: z20.string().url() });
5012
+ var PortalRequest = z20.object({ return_url: z20.string().url() });
5013
+ var PortalSession = z20.object({ url: z20.string().url() });
4620
5014
  var USAGE_WARNING_HEADER = "x-mail-usage-warning";
4621
5015
  function formatUsageWarningHeader(warnings) {
4622
5016
  if (warnings.length === 0) return null;
@@ -4636,7 +5030,7 @@ function parseUsageWarningHeader(value) {
4636
5030
  }
4637
5031
 
4638
5032
  // src/routes.ts
4639
- import { z as z20 } from "zod";
5033
+ import { z as z21 } from "zod";
4640
5034
  var list = (item) => page(item);
4641
5035
  var foundationRoutes = {
4642
5036
  "workspaces.create": {
@@ -4882,7 +5276,7 @@ var templateRoutes = {
4882
5276
  path: "/v1/templates/:id/export",
4883
5277
  params: IdParams,
4884
5278
  query: TemplateExportQuery,
4885
- response: z20.string(),
5279
+ response: z21.string(),
4886
5280
  responseType: "text",
4887
5281
  status: 200,
4888
5282
  access: "read",
@@ -5262,7 +5656,7 @@ var sendingRoutes = {
5262
5656
  path: "/v1/mailings/:id/export",
5263
5657
  params: IdParams,
5264
5658
  query: MailingExportQuery,
5265
- response: z20.string(),
5659
+ response: z21.string(),
5266
5660
  responseType: "text",
5267
5661
  status: 200,
5268
5662
  access: "read",
@@ -5529,7 +5923,7 @@ var platformRoutes = {
5529
5923
  "contactProperties.list": {
5530
5924
  method: "GET",
5531
5925
  path: "/v1/contact-properties",
5532
- response: z20.object({ data: z20.array(ContactPropertyDefinition) }),
5926
+ response: z21.object({ data: z21.array(ContactPropertyDefinition) }),
5533
5927
  status: 200,
5534
5928
  access: "read",
5535
5929
  phase: "S4"
@@ -5828,7 +6222,7 @@ var billingRoutes = {
5828
6222
  "billing.plans": {
5829
6223
  method: "GET",
5830
6224
  path: "/v1/billing/plans",
5831
- response: z20.object({ data: z20.array(CatalogPlan), addons: BillingAddons }),
6225
+ response: z21.object({ data: z21.array(CatalogPlan), addons: BillingAddons }),
5832
6226
  status: 200,
5833
6227
  access: "read",
5834
6228
  phase: "S5"
@@ -5917,6 +6311,73 @@ var domainBuyingRoutes = {
5917
6311
  phase: "S5"
5918
6312
  }
5919
6313
  };
6314
+ var boughtDomainRoutes = {
6315
+ "boughtDomains.list": {
6316
+ method: "GET",
6317
+ path: "/v1/bought-domains",
6318
+ response: z21.object({ data: z21.array(BoughtDomain) }),
6319
+ status: 200,
6320
+ access: "admin",
6321
+ phase: "S5"
6322
+ },
6323
+ "boughtDomains.records": {
6324
+ method: "GET",
6325
+ path: "/v1/bought-domains/:id/records",
6326
+ params: IdParams,
6327
+ response: z21.object({ data: z21.array(DomainRecord) }),
6328
+ status: 200,
6329
+ access: "admin",
6330
+ phase: "S5"
6331
+ },
6332
+ "boughtDomains.createRecord": {
6333
+ method: "POST",
6334
+ path: "/v1/bought-domains/:id/records",
6335
+ params: IdParams,
6336
+ body: DomainRecordInput,
6337
+ response: DomainRecord,
6338
+ status: 201,
6339
+ access: "admin",
6340
+ phase: "S5"
6341
+ },
6342
+ "boughtDomains.updateRecord": {
6343
+ method: "PATCH",
6344
+ path: "/v1/bought-domains/:id/records/:record_id",
6345
+ params: BoughtDomainRecordParams,
6346
+ body: DomainRecordInput,
6347
+ response: DomainRecord,
6348
+ status: 200,
6349
+ access: "admin",
6350
+ phase: "S5"
6351
+ },
6352
+ "boughtDomains.deleteRecord": {
6353
+ method: "DELETE",
6354
+ path: "/v1/bought-domains/:id/records/:record_id",
6355
+ params: BoughtDomainRecordParams,
6356
+ response: Ok,
6357
+ status: 200,
6358
+ access: "admin",
6359
+ phase: "S5"
6360
+ },
6361
+ "boughtDomains.zoneFile": {
6362
+ method: "GET",
6363
+ path: "/v1/bought-domains/:id/zone-file",
6364
+ params: IdParams,
6365
+ response: ZoneFile,
6366
+ status: 200,
6367
+ access: "admin",
6368
+ phase: "S5"
6369
+ },
6370
+ "boughtDomains.leave": {
6371
+ method: "POST",
6372
+ path: "/v1/bought-domains/:id/leave",
6373
+ params: IdParams,
6374
+ body: DomainLeaveCreate,
6375
+ response: BoughtDomain,
6376
+ status: 201,
6377
+ access: "admin",
6378
+ phase: "S5"
6379
+ }
6380
+ };
5920
6381
  var inviteRoutes = {
5921
6382
  "invites.create": {
5922
6383
  method: "POST",
@@ -6026,7 +6487,7 @@ var automationRoutes = {
6026
6487
  method: "POST",
6027
6488
  path: "/v1/automations/:id/pause",
6028
6489
  params: IdParams,
6029
- body: z20.object({}).strict(),
6490
+ body: z21.object({}).strict(),
6030
6491
  response: Automation,
6031
6492
  status: 200,
6032
6493
  access: "write",
@@ -6036,7 +6497,7 @@ var automationRoutes = {
6036
6497
  method: "POST",
6037
6498
  path: "/v1/automations/:id/resume",
6038
6499
  params: IdParams,
6039
- body: z20.object({}).strict(),
6500
+ body: z21.object({}).strict(),
6040
6501
  response: Automation,
6041
6502
  status: 200,
6042
6503
  access: "write",
@@ -6046,7 +6507,7 @@ var automationRoutes = {
6046
6507
  method: "POST",
6047
6508
  path: "/v1/automations/:id/archive",
6048
6509
  params: IdParams,
6049
- body: z20.object({}).strict(),
6510
+ body: z21.object({}).strict(),
6050
6511
  response: Automation,
6051
6512
  status: 200,
6052
6513
  access: "write",
@@ -6162,6 +6623,7 @@ var routes = {
6162
6623
  ...platformRoutes,
6163
6624
  ...billingRoutes,
6164
6625
  ...domainBuyingRoutes,
6626
+ ...boughtDomainRoutes,
6165
6627
  ...automationRoutes
6166
6628
  };
6167
6629
  var TRUSTED_APP_OPERATIONS = {
@@ -6293,6 +6755,8 @@ export {
6293
6755
  BEARER_PREFIX,
6294
6756
  BILLING_NOT_CONFIGURED_REASON,
6295
6757
  BillingAddons,
6758
+ BoughtDomain,
6759
+ BoughtDomainRecordParams,
6296
6760
  BoundedAutomationFilter,
6297
6761
  BoundedSegmentFilter,
6298
6762
  COMPANY_GRANT_ROLES,
@@ -6327,21 +6791,33 @@ export {
6327
6791
  DATE_PASSED_ANSWERS,
6328
6792
  DEFAULT_INVITE_TTL_DAYS,
6329
6793
  DEFAULT_PAGE_LIMIT,
6794
+ DNS_RECORD_TYPES,
6330
6795
  DOCUMENT_SCHEMA_VERSIONS,
6331
6796
  DOMAIN_BUYING_BLOCKS,
6332
6797
  DOMAIN_BUYING_NOT_CONFIGURED_REASON,
6798
+ DOMAIN_LEAVE_STATES,
6799
+ DOMAIN_LEAVE_WAYS,
6800
+ DOMAIN_ORDER_KINDS,
6333
6801
  DOMAIN_ORDER_STATES,
6334
6802
  DOMAIN_PRICE_CHANGED_REASON,
6335
6803
  DOMAIN_UNAVAILABLE_REASONS,
6336
6804
  DateOnly,
6337
6805
  DatePassedAnswer,
6338
6806
  DelayStep,
6807
+ DnsRecordType,
6339
6808
  DocumentSchemaVersion,
6340
6809
  DomainBuyingBlock,
6810
+ DomainLeave,
6811
+ DomainLeaveCreate,
6812
+ DomainLeaveState,
6813
+ DomainLeaveWay,
6341
6814
  DomainOffer,
6342
6815
  DomainOrder,
6343
6816
  DomainOrderCreate,
6817
+ DomainOrderKind,
6344
6818
  DomainOrderState,
6819
+ DomainRecord,
6820
+ DomainRecordInput,
6345
6821
  DomainRegistrant,
6346
6822
  DomainSearchQuery,
6347
6823
  DomainSearchResult,
@@ -6554,6 +7030,7 @@ export {
6554
7030
  QuietHours,
6555
7031
  RECIPIENT_REJECTIONS,
6556
7032
  RECIPIENT_STATUSES,
7033
+ REGISTRY_PHONE,
6557
7034
  REQUEST_ID_HEADER,
6558
7035
  RESEND_EVENT_TYPES,
6559
7036
  RESERVED_MERGE_FIELDS,
@@ -6718,6 +7195,7 @@ export {
6718
7195
  WorkspaceMove,
6719
7196
  WorkspaceSettings,
6720
7197
  WorkspaceUpdate,
7198
+ ZoneFile,
6721
7199
  acceptsIdempotencyKey,
6722
7200
  addInsertion,
6723
7201
  addInsertionChoice,
@@ -6727,6 +7205,7 @@ export {
6727
7205
  automationFilterFamily,
6728
7206
  automationRoutes,
6729
7207
  billingRoutes,
7208
+ boughtDomainRoutes,
6730
7209
  buildPath,
6731
7210
  buildTemplatePatch,
6732
7211
  canDeleteMailing,
@@ -6791,6 +7270,7 @@ export {
6791
7270
  missingInsertionTexts,
6792
7271
  missingRequiredMergeFields,
6793
7272
  normalizeChoiceKey,
7273
+ normalizePhone,
6794
7274
  nowSeconds,
6795
7275
  operationsWithAccess,
6796
7276
  ownEntry,