@marlinjai/mail-contract 0.22.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
@@ -3050,6 +3050,12 @@ var AUDIT_ACTIONS = [
3050
3050
  "domain_order.kind_changed",
3051
3051
  "domain_order.refunded",
3052
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",
3053
3059
  // A1: automations
3054
3060
  "automation.created",
3055
3061
  "automation.updated",
@@ -4355,36 +4361,124 @@ var DomainOrder = z16.object({
4355
4361
  updated_at: Timestamp
4356
4362
  });
4357
4363
 
4358
- // src/contacts.ts
4364
+ // src/bought-domains.ts
4359
4365
  import { z as z17 } from "zod";
4360
- 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({
4361
4455
  id: Id,
4362
4456
  slug: Slug,
4363
- name: z17.string().min(1).max(120),
4457
+ name: z18.string().min(1).max(120),
4364
4458
  /** Shown on the hosted preference page. */
4365
- description: z17.string().max(1e3).nullable(),
4459
+ description: z18.string().max(1e3).nullable(),
4366
4460
  /** Translations of `name` and `description` per locale, for the hosted page. */
4367
- translations: z17.record(
4368
- 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() })
4369
4463
  ),
4370
4464
  created_at: Timestamp,
4371
4465
  updated_at: Timestamp
4372
4466
  });
4373
- var TopicCreate = z17.object({
4467
+ var TopicCreate = z18.object({
4374
4468
  slug: Slug,
4375
- name: z17.string().min(1).max(120),
4376
- description: z17.string().max(1e3).optional(),
4469
+ name: z18.string().min(1).max(120),
4470
+ description: z18.string().max(1e3).optional(),
4377
4471
  translations: Topic.shape.translations.optional()
4378
4472
  });
4379
4473
  var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4380
- var Contact = z17.object({
4474
+ var Contact = z18.object({
4381
4475
  id: Id,
4382
- external_id: z17.string().min(1).max(255).nullable(),
4476
+ external_id: z18.string().min(1).max(255).nullable(),
4383
4477
  /** Stored lowercased, unique per workspace. */
4384
4478
  email: Email,
4385
- first_name: z17.string().max(200).nullable(),
4386
- last_name: z17.string().max(200).nullable(),
4387
- 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(),
4388
4482
  /**
4389
4483
  * The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
4390
4484
  * Every wall clock an automation waits for is read in it, falling back to the
@@ -4392,65 +4486,65 @@ var Contact = z17.object({
4392
4486
  */
4393
4487
  timezone: TimezoneName.nullable(),
4394
4488
  properties: Properties,
4395
- topics: z17.array(Slug),
4489
+ topics: z18.array(Slug),
4396
4490
  /** The slugs of the contact's tags (S4). */
4397
- tags: z17.array(Slug),
4491
+ tags: z18.array(Slug),
4398
4492
  created_at: Timestamp,
4399
4493
  updated_at: Timestamp
4400
4494
  });
4401
- var ContactUpsert = z17.object({
4402
- external_id: z17.string().min(1).max(255).optional(),
4495
+ var ContactUpsert = z18.object({
4496
+ external_id: z18.string().min(1).max(255).optional(),
4403
4497
  email: Email.optional(),
4404
- first_name: z17.string().max(200).nullable().optional(),
4405
- last_name: z17.string().max(200).nullable().optional(),
4406
- 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(),
4407
4501
  timezone: TimezoneName.nullable().optional(),
4408
4502
  properties: Properties.optional(),
4409
- topics: z17.array(Slug).max(100).optional()
4503
+ topics: z18.array(Slug).max(100).optional()
4410
4504
  }).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
4411
4505
  message: "external_id or email is required",
4412
4506
  path: ["email"]
4413
4507
  });
4414
- var ContactUpsertResult = z17.object({
4508
+ var ContactUpsertResult = z18.object({
4415
4509
  contact: Contact,
4416
- created: z17.boolean()
4510
+ created: z18.boolean()
4417
4511
  });
4418
4512
  var ContactListQuery = PageQuery.extend({
4419
- email: z17.string().min(1).max(254).optional(),
4420
- 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(),
4421
4515
  topic: Slug.optional()
4422
4516
  });
4423
- var ContactErased = z17.object({
4424
- ok: z17.literal(true),
4425
- erased_messages: z17.number().int().min(0),
4426
- erased_recipients: z17.number().int().min(0),
4427
- 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)
4428
4522
  });
4429
4523
  var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
4430
- var SuppressionReason = z17.enum(SUPPRESSION_REASONS);
4431
- var Suppression = z17.object({
4524
+ var SuppressionReason = z18.enum(SUPPRESSION_REASONS);
4525
+ var Suppression = z18.object({
4432
4526
  id: Id,
4433
4527
  email: Email,
4434
4528
  reason: SuppressionReason,
4435
4529
  topic: Slug.nullable(),
4436
4530
  source_message_id: Id.nullable(),
4437
- note: z17.string().max(1e3).nullable(),
4531
+ note: z18.string().max(1e3).nullable(),
4438
4532
  created_at: Timestamp
4439
4533
  });
4440
- var SuppressionCreate = z17.object({
4534
+ var SuppressionCreate = z18.object({
4441
4535
  email: Email,
4442
- reason: z17.enum(["manual", "unsubscribed"]),
4536
+ reason: z18.enum(["manual", "unsubscribed"]),
4443
4537
  topic: Slug.nullable().optional(),
4444
- note: z17.string().max(1e3).optional()
4538
+ note: z18.string().max(1e3).optional()
4445
4539
  });
4446
4540
  var SuppressionListQuery = PageQuery.extend({
4447
- email: z17.string().min(1).max(254).optional(),
4541
+ email: z18.string().min(1).max(254).optional(),
4448
4542
  reason: SuppressionReason.optional(),
4449
4543
  topic: Slug.optional()
4450
4544
  });
4451
4545
 
4452
4546
  // src/webhooks.ts
4453
- import { z as z18 } from "zod";
4547
+ import { z as z19 } from "zod";
4454
4548
  var WEBHOOK_EVENT_TYPES = [
4455
4549
  "message.sent",
4456
4550
  "message.failed",
@@ -4494,23 +4588,23 @@ var WEBHOOK_EVENT_TYPES = [
4494
4588
  "template.updated",
4495
4589
  "template.deleted"
4496
4590
  ];
4497
- var WebhookEventType = z18.enum(WEBHOOK_EVENT_TYPES);
4498
- var MessageEventBase = z18.object({
4591
+ var WebhookEventType = z19.enum(WEBHOOK_EVENT_TYPES);
4592
+ var MessageEventBase = z19.object({
4499
4593
  message_id: Id,
4500
4594
  mailing_id: Id.nullable(),
4501
4595
  mailing_metadata: MailingMetadata.nullable(),
4502
4596
  recipient_id: Id.nullable(),
4503
4597
  contact_id: Id.nullable(),
4504
- external_id: z18.string().nullable(),
4598
+ external_id: z19.string().nullable(),
4505
4599
  email: Email,
4506
- subject: z18.string(),
4600
+ subject: z19.string(),
4507
4601
  topic: Slug.nullable(),
4508
- provider_message_id: z18.string().nullable(),
4509
- is_test: z18.boolean()
4602
+ provider_message_id: z19.string().nullable(),
4603
+ is_test: z19.boolean()
4510
4604
  });
4511
4605
  var MessageSentData = MessageEventBase.extend({
4512
4606
  /** The final HTML as sent, so the client can archive it beside its own records. */
4513
- html: z18.string(),
4607
+ html: z19.string(),
4514
4608
  sent_at: Timestamp,
4515
4609
  /**
4516
4610
  * The choice each insertion made (see `Message.insertions`); absent or null
@@ -4521,20 +4615,20 @@ var MessageSentData = MessageEventBase.extend({
4521
4615
  insertions: InsertionChoices.nullish()
4522
4616
  });
4523
4617
  var MessageFailedData = MessageEventBase.extend({
4524
- error: z18.string(),
4618
+ error: z19.string(),
4525
4619
  /** False when the provider rejected permanently; the recipient will not be retried. */
4526
- retryable: z18.boolean(),
4620
+ retryable: z19.boolean(),
4527
4621
  failed_at: Timestamp
4528
4622
  });
4529
4623
  var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
4530
- var ContactUnsubscribedData = z18.object({
4624
+ var ContactUnsubscribedData = z19.object({
4531
4625
  contact_id: Id.nullable(),
4532
- external_id: z18.string().nullable(),
4626
+ external_id: z19.string().nullable(),
4533
4627
  email: Email,
4534
4628
  /** The topic unsubscribed from; null means every topic. */
4535
4629
  topic: Slug.nullable(),
4536
4630
  mailing_id: Id.nullable(),
4537
- source: z18.enum(UNSUBSCRIBE_SOURCES),
4631
+ source: z19.enum(UNSUBSCRIBE_SOURCES),
4538
4632
  unsubscribed_at: Timestamp
4539
4633
  });
4540
4634
  var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
@@ -4543,142 +4637,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
4543
4637
  * breaker undid a `bounced` block it judged false (a `contact.bounced` for the
4544
4638
  * same address and mailing went out before); `topic` is null.
4545
4639
  */
4546
- source: z18.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4640
+ source: z19.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4547
4641
  resubscribed_at: Timestamp
4548
4642
  });
4549
- var ContactBouncedData = z18.object({
4643
+ var ContactBouncedData = z19.object({
4550
4644
  contact_id: Id.nullable(),
4551
- external_id: z18.string().nullable(),
4645
+ external_id: z19.string().nullable(),
4552
4646
  email: Email,
4553
4647
  /** `bounced` for a hard bounce, `complained` for a spam complaint. */
4554
- reason: z18.enum(["bounced", "complained"]),
4648
+ reason: z19.enum(["bounced", "complained"]),
4555
4649
  message_id: Id.nullable(),
4556
- diagnostic: z18.string().nullable(),
4650
+ diagnostic: z19.string().nullable(),
4557
4651
  bounced_at: Timestamp
4558
4652
  });
4559
- var MailingFinishedData = z18.object({
4653
+ var MailingFinishedData = z19.object({
4560
4654
  mailing_id: Id,
4561
4655
  mailing_metadata: MailingMetadata,
4562
- status: z18.enum(["sent", "partially_failed", "cancelled"]),
4656
+ status: z19.enum(["sent", "partially_failed", "cancelled"]),
4563
4657
  counts: MailingCounts,
4564
4658
  finished_at: Timestamp
4565
4659
  });
4566
- var ContactSubscribedData = z18.object({
4660
+ var ContactSubscribedData = z19.object({
4567
4661
  contact_id: Id,
4568
- external_id: z18.string().nullable(),
4662
+ external_id: z19.string().nullable(),
4569
4663
  email: Email,
4570
- topics: z18.array(Slug),
4571
- source: z18.enum(["signup_form", "api", "dashboard", "automation"]),
4664
+ topics: z19.array(Slug),
4665
+ source: z19.enum(["signup_form", "api", "dashboard", "automation"]),
4572
4666
  signup_form_id: Id.nullable(),
4573
- signup_form_version: z18.number().int().min(1).nullable(),
4667
+ signup_form_version: z19.number().int().min(1).nullable(),
4574
4668
  subscribed_at: Timestamp
4575
4669
  });
4576
- var ImportFinishedData = z18.object({
4670
+ var ImportFinishedData = z19.object({
4577
4671
  import_id: Id,
4578
- status: z18.enum(["completed", "cancelled", "failed"]),
4672
+ status: z19.enum(["completed", "cancelled", "failed"]),
4579
4673
  result: ImportReport.nullable(),
4580
- error: z18.string().nullable(),
4674
+ error: z19.string().nullable(),
4581
4675
  finished_at: Timestamp
4582
4676
  });
4583
- var MailingScheduledData = z18.object({
4677
+ var MailingScheduledData = z19.object({
4584
4678
  mailing_id: Id,
4585
4679
  mailing_metadata: MailingMetadata,
4586
4680
  scheduled_at: Timestamp.nullable()
4587
4681
  });
4588
- var MailingStartedData = z18.object({
4682
+ var MailingStartedData = z19.object({
4589
4683
  mailing_id: Id,
4590
4684
  mailing_metadata: MailingMetadata,
4591
- trigger: z18.enum(["send", "schedule"]),
4592
- recipients: z18.number().int().min(0),
4685
+ trigger: z19.enum(["send", "schedule"]),
4686
+ recipients: z19.number().int().min(0),
4593
4687
  started_at: Timestamp
4594
4688
  });
4595
- var MailingScheduleFailedData = z18.object({
4689
+ var MailingScheduleFailedData = z19.object({
4596
4690
  mailing_id: Id,
4597
4691
  mailing_metadata: MailingMetadata,
4598
- code: z18.string(),
4599
- message: z18.string(),
4692
+ code: z19.string(),
4693
+ message: z19.string(),
4600
4694
  failed_at: Timestamp
4601
4695
  });
4602
- var MailingAbWinnerSelectedData = z18.object({
4696
+ var MailingAbWinnerSelectedData = z19.object({
4603
4697
  mailing_id: Id,
4604
4698
  mailing_metadata: MailingMetadata,
4605
- winner: z18.string(),
4606
- decided_by: z18.enum(["metric", "manual"]),
4607
- variants: z18.array(VariantAnalytics),
4699
+ winner: z19.string(),
4700
+ decided_by: z19.enum(["metric", "manual"]),
4701
+ variants: z19.array(VariantAnalytics),
4608
4702
  decided_at: Timestamp
4609
4703
  });
4610
- var ContactTaggedData = z18.object({
4704
+ var ContactTaggedData = z19.object({
4611
4705
  contact_id: Id,
4612
- external_id: z18.string().nullable(),
4706
+ external_id: z19.string().nullable(),
4613
4707
  email: Email,
4614
4708
  /** Only the tags the contact did not already have. */
4615
- tags: z18.array(Slug).min(1),
4616
- 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"]),
4617
4711
  tagged_at: Timestamp
4618
4712
  });
4619
- var ContactUpdatedData = z18.object({
4713
+ var ContactUpdatedData = z19.object({
4620
4714
  contact_id: Id,
4621
- external_id: z18.string().nullable(),
4715
+ external_id: z19.string().nullable(),
4622
4716
  email: Email,
4623
- changed: z18.array(z18.string()).min(1),
4717
+ changed: z19.array(z19.string()).min(1),
4624
4718
  properties: Properties,
4625
- source: z18.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4719
+ source: z19.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4626
4720
  updated_at: Timestamp
4627
4721
  });
4628
- var AutomationRunEventBase = z18.object({
4722
+ var AutomationRunEventBase = z19.object({
4629
4723
  automation_id: Id,
4630
- automation_name: z18.string(),
4724
+ automation_name: z19.string(),
4631
4725
  run_id: Id,
4632
- version: z18.number().int().min(1),
4726
+ version: z19.number().int().min(1),
4633
4727
  contact_id: Id,
4634
- external_id: z18.string().nullable(),
4728
+ external_id: z19.string().nullable(),
4635
4729
  email: Email
4636
4730
  });
4637
4731
  var AutomationRunStartedData = AutomationRunEventBase.extend({
4638
4732
  /** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
4639
- trigger_kind: z18.string(),
4733
+ trigger_kind: z19.string(),
4640
4734
  entered_at: Timestamp
4641
4735
  });
4642
4736
  var AutomationRunCompletedData = AutomationRunEventBase.extend({
4643
- last_step_id: z18.string().nullable(),
4737
+ last_step_id: z19.string().nullable(),
4644
4738
  completed_at: Timestamp
4645
4739
  });
4646
4740
  var AutomationRunExitedData = AutomationRunEventBase.extend({
4647
4741
  reason: AutomationEndReason,
4648
- step_id: z18.string().nullable(),
4742
+ step_id: z19.string().nullable(),
4649
4743
  exited_at: Timestamp
4650
4744
  });
4651
4745
  var AutomationRunFailedData = AutomationRunEventBase.extend({
4652
- reason: z18.string(),
4653
- step_id: z18.string().nullable(),
4746
+ reason: z19.string(),
4747
+ step_id: z19.string().nullable(),
4654
4748
  failed_at: Timestamp
4655
4749
  });
4656
4750
  var AutomationWebhookData = AutomationRunEventBase.extend({
4657
- step_id: z18.string(),
4751
+ step_id: z19.string(),
4658
4752
  /** The step's own label, when it was given one, so a receiver can branch on a name. */
4659
- step_label: z18.string().nullable(),
4753
+ step_label: z19.string().nullable(),
4660
4754
  /** Whatever the step carries, verbatim. Null when it carries nothing. */
4661
4755
  payload: JsonValue.nullable(),
4662
4756
  fired_at: Timestamp
4663
4757
  });
4664
- var TemplateEventBase = z18.object({
4758
+ var TemplateEventBase = z19.object({
4665
4759
  template_id: Id,
4666
- name: z18.string().min(1).max(200),
4667
- version: z18.number().int().min(1),
4668
- 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"])
4669
4763
  });
4670
4764
  var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
4671
- var TemplateUpdatedData = TemplateEventBase.extend({ archived: z18.boolean(), updated_at: Timestamp });
4765
+ var TemplateUpdatedData = TemplateEventBase.extend({ archived: z19.boolean(), updated_at: Timestamp });
4672
4766
  var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
4673
- var envelope = (type, data) => z18.object({
4767
+ var envelope = (type, data) => z19.object({
4674
4768
  /** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
4675
4769
  id: Id,
4676
- type: z18.literal(type),
4770
+ type: z19.literal(type),
4677
4771
  created_at: Timestamp,
4678
4772
  workspace_id: Id,
4679
4773
  data
4680
4774
  });
4681
- var WebhookEvent = z18.discriminatedUnion("type", [
4775
+ var WebhookEvent = z19.discriminatedUnion("type", [
4682
4776
  envelope("message.sent", MessageSentData),
4683
4777
  envelope("message.failed", MessageFailedData),
4684
4778
  envelope("contact.unsubscribed", ContactUnsubscribedData),
@@ -4702,16 +4796,16 @@ var WebhookEvent = z18.discriminatedUnion("type", [
4702
4796
  envelope("template.updated", TemplateUpdatedData),
4703
4797
  envelope("template.deleted", TemplateDeletedData)
4704
4798
  ]);
4705
- var WebhookEndpoint = z18.object({
4799
+ var WebhookEndpoint = z19.object({
4706
4800
  id: Id,
4707
- url: z18.string().url(),
4708
- description: z18.string().max(500).nullable(),
4709
- events: z18.array(WebhookEventType).min(1),
4710
- 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(),
4711
4805
  created_at: Timestamp,
4712
4806
  updated_at: Timestamp
4713
4807
  });
4714
- var WebhookUrl = z18.string().url().refine((u) => {
4808
+ var WebhookUrl = z19.string().url().refine((u) => {
4715
4809
  try {
4716
4810
  const url = new URL(u);
4717
4811
  if (url.protocol === "https:") return true;
@@ -4720,35 +4814,35 @@ var WebhookUrl = z18.string().url().refine((u) => {
4720
4814
  return false;
4721
4815
  }
4722
4816
  }, "must be https (http only for localhost)");
4723
- var WebhookEndpointCreate = z18.object({
4817
+ var WebhookEndpointCreate = z19.object({
4724
4818
  url: WebhookUrl,
4725
- description: z18.string().max(500).optional(),
4726
- events: z18.array(WebhookEventType).min(1),
4727
- enabled: z18.boolean().optional()
4819
+ description: z19.string().max(500).optional(),
4820
+ events: z19.array(WebhookEventType).min(1),
4821
+ enabled: z19.boolean().optional()
4728
4822
  });
4729
- var WebhookEndpointUpdate = z18.object({
4823
+ var WebhookEndpointUpdate = z19.object({
4730
4824
  url: WebhookUrl,
4731
- description: z18.string().max(500).nullable(),
4732
- events: z18.array(WebhookEventType).min(1),
4733
- enabled: z18.boolean()
4825
+ description: z19.string().max(500).nullable(),
4826
+ events: z19.array(WebhookEventType).min(1),
4827
+ enabled: z19.boolean()
4734
4828
  }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4735
- var WebhookEndpointWithSecret = z18.object({
4829
+ var WebhookEndpointWithSecret = z19.object({
4736
4830
  endpoint: WebhookEndpoint,
4737
- secret: z18.string().min(32)
4831
+ secret: z19.string().min(32)
4738
4832
  });
4739
4833
  var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
4740
- var WebhookDeliveryStatus = z18.enum(WEBHOOK_DELIVERY_STATUSES);
4834
+ var WebhookDeliveryStatus = z19.enum(WEBHOOK_DELIVERY_STATUSES);
4741
4835
  var WEBHOOK_MAX_ATTEMPTS = 8;
4742
4836
  var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
4743
- var WebhookDelivery = z18.object({
4837
+ var WebhookDelivery = z19.object({
4744
4838
  id: Id,
4745
4839
  endpoint_id: Id,
4746
4840
  event_id: Id,
4747
4841
  event_type: WebhookEventType,
4748
4842
  status: WebhookDeliveryStatus,
4749
- attempts: z18.number().int().min(0),
4750
- last_status_code: z18.number().int().min(100).max(599).nullable(),
4751
- 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(),
4752
4846
  next_attempt_at: Timestamp.nullable(),
4753
4847
  delivered_at: Timestamp.nullable(),
4754
4848
  created_at: Timestamp
@@ -4757,7 +4851,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
4757
4851
  status: WebhookDeliveryStatus.optional(),
4758
4852
  event_type: WebhookEventType.optional()
4759
4853
  });
4760
- var WebhookDeliveryParams = z18.object({ id: Id, delivery_id: Id });
4854
+ var WebhookDeliveryParams = z19.object({ id: Id, delivery_id: Id });
4761
4855
 
4762
4856
  // src/webhook-signing.ts
4763
4857
  var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
@@ -4824,99 +4918,99 @@ async function verifyWebhook(input) {
4824
4918
  }
4825
4919
 
4826
4920
  // src/billing.ts
4827
- import { z as z19 } from "zod";
4921
+ import { z as z20 } from "zod";
4828
4922
  var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
4829
- var PlanId = z19.enum(PLAN_IDS);
4830
- var PlanLimits = z19.object({
4831
- monthly_messages: z19.number().int().min(0).nullable(),
4832
- contacts: z19.number().int().min(0).nullable(),
4833
- members: z19.number().int().min(1).nullable(),
4834
- providers: z19.number().int().min(1).nullable(),
4835
- 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(),
4836
4930
  /** Automations that may be live (active or paused) at once (A1). */
4837
- active_automations: z19.number().int().min(0).nullable(),
4931
+ active_automations: z20.number().int().min(0).nullable(),
4838
4932
  /** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
4839
- automation_steps: z19.number().int().min(1).nullable(),
4933
+ automation_steps: z20.number().int().min(1).nullable(),
4840
4934
  /** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
4841
- sending_domains: z19.number().int().min(0).nullable()
4935
+ sending_domains: z20.number().int().min(0).nullable()
4842
4936
  });
4843
- var PlanFeatures = z19.object({
4937
+ var PlanFeatures = z20.object({
4844
4938
  /** A/B tests of subject and content on a mailing (S4). */
4845
- ab_testing: z19.boolean(),
4939
+ ab_testing: z20.boolean(),
4846
4940
  /** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
4847
- tracking: z19.boolean(),
4941
+ tracking: z20.boolean(),
4848
4942
  /** Automations: flows a person walks through step by step (A1). */
4849
- automations: z19.boolean()
4943
+ automations: z20.boolean()
4850
4944
  });
4851
4945
  var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
4852
- var Plan = z19.object({
4946
+ var Plan = z20.object({
4853
4947
  id: PlanId,
4854
- name: z19.string().min(1),
4948
+ name: z20.string().min(1),
4855
4949
  /** Price in the smallest currency unit per month; null for plans not sold. */
4856
- monthly_price_cents: z19.number().int().min(0).nullable(),
4857
- currency: z19.string().length(3),
4950
+ monthly_price_cents: z20.number().int().min(0).nullable(),
4951
+ currency: z20.string().length(3),
4858
4952
  limits: PlanLimits,
4859
4953
  features: PlanFeatures
4860
4954
  });
4861
- var CatalogPlan = Plan.extend({ sellable: z19.boolean() });
4862
- var Subscription = z19.object({
4955
+ var CatalogPlan = Plan.extend({ sellable: z20.boolean() });
4956
+ var Subscription = z20.object({
4863
4957
  workspace_id: Id,
4864
4958
  plan: PlanId,
4865
- status: z19.enum(["active", "trialing", "past_due", "cancelled"]),
4959
+ status: z20.enum(["active", "trialing", "past_due", "cancelled"]),
4866
4960
  current_period_start: Timestamp,
4867
4961
  current_period_end: Timestamp,
4868
- cancel_at_period_end: z19.boolean(),
4962
+ cancel_at_period_end: z20.boolean(),
4869
4963
  /**
4870
4964
  * A design partner outside billing (plan `design_partner`, no limits, no
4871
4965
  * checkout). Set only by an operator, never through the API.
4872
4966
  */
4873
- billing_exempt: z19.boolean(),
4967
+ billing_exempt: z20.boolean(),
4874
4968
  /**
4875
4969
  * Own sending domains bought on top of the plan's included ones (the
4876
4970
  * add-on), each a monthly charge on the same subscription. 0 without the
4877
4971
  * add-on; the usage limit `sending_domains` is the plan's plus these.
4878
4972
  */
4879
- extra_sending_domains: z19.number().int().min(0)
4973
+ extra_sending_domains: z20.number().int().min(0)
4880
4974
  });
4881
- var BillingAddons = z19.object({
4882
- sending_domain: z19.object({
4883
- monthly_price_cents: z19.number().int().min(0),
4884
- currency: z19.string().length(3),
4885
- 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()
4886
4980
  })
4887
4981
  });
4888
4982
  var MAX_EXTRA_SENDING_DOMAINS = 100;
4889
- 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) });
4890
4984
  var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
4891
- var UsageMetric = z19.enum(USAGE_METRICS);
4985
+ var UsageMetric = z20.enum(USAGE_METRICS);
4892
4986
  var USAGE_WARNING_RATIO = 0.8;
4893
- var UsageWarning = z19.object({
4987
+ var UsageWarning = z20.object({
4894
4988
  metric: UsageMetric,
4895
- used: z19.number().int().min(0),
4896
- limit: z19.number().int().min(0),
4989
+ used: z20.number().int().min(0),
4990
+ limit: z20.number().int().min(0),
4897
4991
  /** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
4898
- level: z19.enum(["approaching", "reached"])
4992
+ level: z20.enum(["approaching", "reached"])
4899
4993
  });
4900
- var TermsStatus = z19.object({ accepted_version: z19.string().nullable(), current_version: z19.string() });
4901
- var Usage = z19.object({
4994
+ var TermsStatus = z20.object({ accepted_version: z20.string().nullable(), current_version: z20.string() });
4995
+ var Usage = z20.object({
4902
4996
  plan: PlanId,
4903
4997
  period_start: Timestamp,
4904
4998
  period_end: Timestamp,
4905
- metrics: z19.record(UsageMetric, z19.object({ used: z19.number().int().min(0), limit: z19.number().int().min(0).nullable() })),
4906
- 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),
4907
5001
  terms: TermsStatus
4908
5002
  });
4909
- var TermsAcceptance = z19.object({ accept_terms: AcceptTerms });
4910
- var CheckoutRequest = z19.object({
4911
- plan: z19.enum(["starter", "growth"]),
4912
- success_url: z19.string().url(),
4913
- 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(),
4914
5008
  /** The buyer accepted the terms of service and the processing agreement of this version. */
4915
5009
  accept_terms: AcceptTerms
4916
5010
  });
4917
- var CheckoutSession = z19.object({ url: z19.string().url() });
4918
- var PortalRequest = z19.object({ return_url: z19.string().url() });
4919
- 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() });
4920
5014
  var USAGE_WARNING_HEADER = "x-mail-usage-warning";
4921
5015
  function formatUsageWarningHeader(warnings) {
4922
5016
  if (warnings.length === 0) return null;
@@ -4936,7 +5030,7 @@ function parseUsageWarningHeader(value) {
4936
5030
  }
4937
5031
 
4938
5032
  // src/routes.ts
4939
- import { z as z20 } from "zod";
5033
+ import { z as z21 } from "zod";
4940
5034
  var list = (item) => page(item);
4941
5035
  var foundationRoutes = {
4942
5036
  "workspaces.create": {
@@ -5182,7 +5276,7 @@ var templateRoutes = {
5182
5276
  path: "/v1/templates/:id/export",
5183
5277
  params: IdParams,
5184
5278
  query: TemplateExportQuery,
5185
- response: z20.string(),
5279
+ response: z21.string(),
5186
5280
  responseType: "text",
5187
5281
  status: 200,
5188
5282
  access: "read",
@@ -5562,7 +5656,7 @@ var sendingRoutes = {
5562
5656
  path: "/v1/mailings/:id/export",
5563
5657
  params: IdParams,
5564
5658
  query: MailingExportQuery,
5565
- response: z20.string(),
5659
+ response: z21.string(),
5566
5660
  responseType: "text",
5567
5661
  status: 200,
5568
5662
  access: "read",
@@ -5829,7 +5923,7 @@ var platformRoutes = {
5829
5923
  "contactProperties.list": {
5830
5924
  method: "GET",
5831
5925
  path: "/v1/contact-properties",
5832
- response: z20.object({ data: z20.array(ContactPropertyDefinition) }),
5926
+ response: z21.object({ data: z21.array(ContactPropertyDefinition) }),
5833
5927
  status: 200,
5834
5928
  access: "read",
5835
5929
  phase: "S4"
@@ -6128,7 +6222,7 @@ var billingRoutes = {
6128
6222
  "billing.plans": {
6129
6223
  method: "GET",
6130
6224
  path: "/v1/billing/plans",
6131
- response: z20.object({ data: z20.array(CatalogPlan), addons: BillingAddons }),
6225
+ response: z21.object({ data: z21.array(CatalogPlan), addons: BillingAddons }),
6132
6226
  status: 200,
6133
6227
  access: "read",
6134
6228
  phase: "S5"
@@ -6217,6 +6311,73 @@ var domainBuyingRoutes = {
6217
6311
  phase: "S5"
6218
6312
  }
6219
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
+ };
6220
6381
  var inviteRoutes = {
6221
6382
  "invites.create": {
6222
6383
  method: "POST",
@@ -6326,7 +6487,7 @@ var automationRoutes = {
6326
6487
  method: "POST",
6327
6488
  path: "/v1/automations/:id/pause",
6328
6489
  params: IdParams,
6329
- body: z20.object({}).strict(),
6490
+ body: z21.object({}).strict(),
6330
6491
  response: Automation,
6331
6492
  status: 200,
6332
6493
  access: "write",
@@ -6336,7 +6497,7 @@ var automationRoutes = {
6336
6497
  method: "POST",
6337
6498
  path: "/v1/automations/:id/resume",
6338
6499
  params: IdParams,
6339
- body: z20.object({}).strict(),
6500
+ body: z21.object({}).strict(),
6340
6501
  response: Automation,
6341
6502
  status: 200,
6342
6503
  access: "write",
@@ -6346,7 +6507,7 @@ var automationRoutes = {
6346
6507
  method: "POST",
6347
6508
  path: "/v1/automations/:id/archive",
6348
6509
  params: IdParams,
6349
- body: z20.object({}).strict(),
6510
+ body: z21.object({}).strict(),
6350
6511
  response: Automation,
6351
6512
  status: 200,
6352
6513
  access: "write",
@@ -6462,6 +6623,7 @@ var routes = {
6462
6623
  ...platformRoutes,
6463
6624
  ...billingRoutes,
6464
6625
  ...domainBuyingRoutes,
6626
+ ...boughtDomainRoutes,
6465
6627
  ...automationRoutes
6466
6628
  };
6467
6629
  var TRUSTED_APP_OPERATIONS = {
@@ -6593,6 +6755,8 @@ export {
6593
6755
  BEARER_PREFIX,
6594
6756
  BILLING_NOT_CONFIGURED_REASON,
6595
6757
  BillingAddons,
6758
+ BoughtDomain,
6759
+ BoughtDomainRecordParams,
6596
6760
  BoundedAutomationFilter,
6597
6761
  BoundedSegmentFilter,
6598
6762
  COMPANY_GRANT_ROLES,
@@ -6627,9 +6791,12 @@ export {
6627
6791
  DATE_PASSED_ANSWERS,
6628
6792
  DEFAULT_INVITE_TTL_DAYS,
6629
6793
  DEFAULT_PAGE_LIMIT,
6794
+ DNS_RECORD_TYPES,
6630
6795
  DOCUMENT_SCHEMA_VERSIONS,
6631
6796
  DOMAIN_BUYING_BLOCKS,
6632
6797
  DOMAIN_BUYING_NOT_CONFIGURED_REASON,
6798
+ DOMAIN_LEAVE_STATES,
6799
+ DOMAIN_LEAVE_WAYS,
6633
6800
  DOMAIN_ORDER_KINDS,
6634
6801
  DOMAIN_ORDER_STATES,
6635
6802
  DOMAIN_PRICE_CHANGED_REASON,
@@ -6637,13 +6804,20 @@ export {
6637
6804
  DateOnly,
6638
6805
  DatePassedAnswer,
6639
6806
  DelayStep,
6807
+ DnsRecordType,
6640
6808
  DocumentSchemaVersion,
6641
6809
  DomainBuyingBlock,
6810
+ DomainLeave,
6811
+ DomainLeaveCreate,
6812
+ DomainLeaveState,
6813
+ DomainLeaveWay,
6642
6814
  DomainOffer,
6643
6815
  DomainOrder,
6644
6816
  DomainOrderCreate,
6645
6817
  DomainOrderKind,
6646
6818
  DomainOrderState,
6819
+ DomainRecord,
6820
+ DomainRecordInput,
6647
6821
  DomainRegistrant,
6648
6822
  DomainSearchQuery,
6649
6823
  DomainSearchResult,
@@ -7021,6 +7195,7 @@ export {
7021
7195
  WorkspaceMove,
7022
7196
  WorkspaceSettings,
7023
7197
  WorkspaceUpdate,
7198
+ ZoneFile,
7024
7199
  acceptsIdempotencyKey,
7025
7200
  addInsertion,
7026
7201
  addInsertionChoice,
@@ -7030,6 +7205,7 @@ export {
7030
7205
  automationFilterFamily,
7031
7206
  automationRoutes,
7032
7207
  billingRoutes,
7208
+ boughtDomainRoutes,
7033
7209
  buildPath,
7034
7210
  buildTemplatePatch,
7035
7211
  canDeleteMailing,