@marlinjai/mail-contract 0.19.0 → 0.21.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.d.mts +851 -53
- package/dist/index.d.ts +851 -53
- package/dist/index.js +369 -185
- package/dist/index.mjs +351 -185
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -142,10 +142,24 @@ __export(index_exports, {
|
|
|
142
142
|
DEFAULT_INVITE_TTL_DAYS: () => DEFAULT_INVITE_TTL_DAYS,
|
|
143
143
|
DEFAULT_PAGE_LIMIT: () => DEFAULT_PAGE_LIMIT,
|
|
144
144
|
DOCUMENT_SCHEMA_VERSIONS: () => DOCUMENT_SCHEMA_VERSIONS,
|
|
145
|
+
DOMAIN_BUYING_BLOCKS: () => DOMAIN_BUYING_BLOCKS,
|
|
146
|
+
DOMAIN_BUYING_NOT_CONFIGURED_REASON: () => DOMAIN_BUYING_NOT_CONFIGURED_REASON,
|
|
147
|
+
DOMAIN_ORDER_STATES: () => DOMAIN_ORDER_STATES,
|
|
148
|
+
DOMAIN_PRICE_CHANGED_REASON: () => DOMAIN_PRICE_CHANGED_REASON,
|
|
149
|
+
DOMAIN_UNAVAILABLE_REASONS: () => DOMAIN_UNAVAILABLE_REASONS,
|
|
145
150
|
DateOnly: () => DateOnly,
|
|
146
151
|
DatePassedAnswer: () => DatePassedAnswer,
|
|
147
152
|
DelayStep: () => DelayStep,
|
|
148
153
|
DocumentSchemaVersion: () => DocumentSchemaVersion,
|
|
154
|
+
DomainBuyingBlock: () => DomainBuyingBlock,
|
|
155
|
+
DomainOffer: () => DomainOffer,
|
|
156
|
+
DomainOrder: () => DomainOrder,
|
|
157
|
+
DomainOrderCreate: () => DomainOrderCreate,
|
|
158
|
+
DomainOrderState: () => DomainOrderState,
|
|
159
|
+
DomainRegistrant: () => DomainRegistrant,
|
|
160
|
+
DomainSearchQuery: () => DomainSearchQuery,
|
|
161
|
+
DomainSearchResult: () => DomainSearchResult,
|
|
162
|
+
DomainUnavailableReason: () => DomainUnavailableReason,
|
|
149
163
|
EDITABLE_MAILING_STATUSES: () => EDITABLE_MAILING_STATUSES,
|
|
150
164
|
ERROR_CODES: () => ERROR_CODES,
|
|
151
165
|
ERROR_STATUS: () => ERROR_STATUS,
|
|
@@ -229,6 +243,7 @@ __export(index_exports, {
|
|
|
229
243
|
MAX_ASSET_BYTES: () => MAX_ASSET_BYTES,
|
|
230
244
|
MAX_DELAY_SECONDS: () => MAX_DELAY_SECONDS,
|
|
231
245
|
MAX_DOCUMENT_BYTES: () => MAX_DOCUMENT_BYTES,
|
|
246
|
+
MAX_DOMAIN_ORDERS_PER_DAY: () => MAX_DOMAIN_ORDERS_PER_DAY,
|
|
232
247
|
MAX_ENGAGEMENT_DAYS: () => MAX_ENGAGEMENT_DAYS,
|
|
233
248
|
MAX_EXPORT_WARNINGS_HEADER_LENGTH: () => MAX_EXPORT_WARNINGS_HEADER_LENGTH,
|
|
234
249
|
MAX_EXTRA_SENDING_DOMAINS: () => MAX_EXTRA_SENDING_DOMAINS,
|
|
@@ -462,6 +477,8 @@ __export(index_exports, {
|
|
|
462
477
|
TemplateUpdatedData: () => TemplateUpdatedData,
|
|
463
478
|
TemplateVersion: () => TemplateVersion,
|
|
464
479
|
TemplateVersionParams: () => TemplateVersionParams,
|
|
480
|
+
TermsAcceptance: () => TermsAcceptance,
|
|
481
|
+
TermsStatus: () => TermsStatus,
|
|
465
482
|
TimeOfDay: () => TimeOfDay,
|
|
466
483
|
Timestamp: () => Timestamp,
|
|
467
484
|
TimezoneName: () => TimezoneName,
|
|
@@ -537,6 +554,7 @@ __export(index_exports, {
|
|
|
537
554
|
demoteForSave: () => demoteForSave,
|
|
538
555
|
demotedBySave: () => demotedBySave,
|
|
539
556
|
describeMissingTexts: () => describeMissingTexts,
|
|
557
|
+
domainBuyingRoutes: () => domainBuyingRoutes,
|
|
540
558
|
draftDocument: () => draftDocument,
|
|
541
559
|
draftInsertionProblems: () => draftInsertionProblems,
|
|
542
560
|
draftsDirty: () => draftsDirty,
|
|
@@ -787,8 +805,11 @@ var RETRYABLE_ERRORS = [
|
|
|
787
805
|
"service_unavailable"
|
|
788
806
|
];
|
|
789
807
|
var BILLING_NOT_CONFIGURED_REASON = "billing_not_configured";
|
|
808
|
+
var DOMAIN_BUYING_NOT_CONFIGURED_REASON = "domain_buying_not_configured";
|
|
809
|
+
var DOMAIN_PRICE_CHANGED_REASON = "price_changed";
|
|
810
|
+
var LASTING_REASONS = [BILLING_NOT_CONFIGURED_REASON, DOMAIN_BUYING_NOT_CONFIGURED_REASON];
|
|
790
811
|
function isRetryableError(code, details) {
|
|
791
|
-
return RETRYABLE_ERRORS.includes(code) && details?.reason
|
|
812
|
+
return RETRYABLE_ERRORS.includes(code) && !LASTING_REASONS.includes(details?.reason);
|
|
792
813
|
}
|
|
793
814
|
|
|
794
815
|
// src/headers.ts
|
|
@@ -3441,7 +3462,7 @@ var EventListQuery = PageQuery.extend({
|
|
|
3441
3462
|
|
|
3442
3463
|
// src/legal.ts
|
|
3443
3464
|
var import_zod11 = require("zod");
|
|
3444
|
-
var LEGAL_TERMS_VERSION = "2026-10-
|
|
3465
|
+
var LEGAL_TERMS_VERSION = "2026-10-28";
|
|
3445
3466
|
var AcceptTerms = import_zod11.z.literal(LEGAL_TERMS_VERSION, {
|
|
3446
3467
|
errorMap: () => ({ message: `must be "${LEGAL_TERMS_VERSION}": accept the current terms of service and processing agreement` })
|
|
3447
3468
|
});
|
|
@@ -3693,6 +3714,15 @@ var AUDIT_ACTIONS = [
|
|
|
3693
3714
|
"billing.subscription_changed",
|
|
3694
3715
|
"billing.exemption_changed",
|
|
3695
3716
|
"billing.extra_sending_domains_changed",
|
|
3717
|
+
"billing.terms_accepted",
|
|
3718
|
+
// Domains bought inside Lumitra Mail
|
|
3719
|
+
"domain_order.created",
|
|
3720
|
+
"domain_order.paid",
|
|
3721
|
+
"domain_order.registered",
|
|
3722
|
+
"domain_order.ready",
|
|
3723
|
+
"domain_order.needs_attention",
|
|
3724
|
+
"domain_order.refunded",
|
|
3725
|
+
"domain_order.cancelled",
|
|
3696
3726
|
// A1: automations
|
|
3697
3727
|
"automation.created",
|
|
3698
3728
|
"automation.updated",
|
|
@@ -3707,7 +3737,7 @@ var AUDIT_ACTIONS = [
|
|
|
3707
3737
|
"event.recorded"
|
|
3708
3738
|
];
|
|
3709
3739
|
var AuditAction = import_zod12.z.enum(AUDIT_ACTIONS);
|
|
3710
|
-
var TRUSTED_APPS = ["booking"];
|
|
3740
|
+
var TRUSTED_APPS = ["booking", "sites"];
|
|
3711
3741
|
var TrustedApp = import_zod12.z.enum(TRUSTED_APPS);
|
|
3712
3742
|
var AuditActor = import_zod12.z.discriminatedUnion("type", [
|
|
3713
3743
|
import_zod12.z.object({
|
|
@@ -4616,36 +4646,119 @@ function senderOnDomain(input, ctx) {
|
|
|
4616
4646
|
var SendingDomainCreate = import_zod15.z.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
|
|
4617
4647
|
var SendingDomainUpdate = import_zod15.z.object({ from_name: SenderFields.from_name.optional(), from_email: Email.optional(), reply_to: Email.nullable().optional() }).refine((v) => Object.keys(v).length > 0, "nothing to change");
|
|
4618
4648
|
|
|
4619
|
-
// src/
|
|
4649
|
+
// src/domains.ts
|
|
4620
4650
|
var import_zod16 = require("zod");
|
|
4621
|
-
var
|
|
4651
|
+
var DomainSearchQuery = import_zod16.z.object({ q: import_zod16.z.string().trim().min(1).max(63) });
|
|
4652
|
+
var DOMAIN_UNAVAILABLE_REASONS = ["taken", "extension_not_supported", "premium", "not_registrable"];
|
|
4653
|
+
var DomainUnavailableReason = import_zod16.z.enum(DOMAIN_UNAVAILABLE_REASONS);
|
|
4654
|
+
var DomainOffer = import_zod16.z.object({
|
|
4655
|
+
domain: import_zod16.z.string(),
|
|
4656
|
+
available: import_zod16.z.boolean(),
|
|
4657
|
+
reason: DomainUnavailableReason.nullable(),
|
|
4658
|
+
price_cents: import_zod16.z.number().int().min(0).nullable(),
|
|
4659
|
+
renewal_price_cents: import_zod16.z.number().int().min(0).nullable(),
|
|
4660
|
+
currency: import_zod16.z.literal("EUR")
|
|
4661
|
+
});
|
|
4662
|
+
var DOMAIN_BUYING_BLOCKS = ["not_configured", "paid_plan_required", "no_company"];
|
|
4663
|
+
var DomainBuyingBlock = import_zod16.z.enum(DOMAIN_BUYING_BLOCKS);
|
|
4664
|
+
var DomainSearchResult = import_zod16.z.object({
|
|
4665
|
+
data: import_zod16.z.array(DomainOffer),
|
|
4666
|
+
blocked: DomainBuyingBlock.nullable()
|
|
4667
|
+
});
|
|
4668
|
+
var DomainRegistrant = import_zod16.z.object({
|
|
4669
|
+
name: import_zod16.z.string().trim().min(3).max(120).regex(/\S+\s+\S+/, "must be a first and a last name"),
|
|
4670
|
+
organization: import_zod16.z.string().trim().min(1).max(120).nullable().optional(),
|
|
4671
|
+
email: Email,
|
|
4672
|
+
phone: import_zod16.z.string().trim().regex(/^\+\d{1,3}\.\d{4,14}$/, "must be +<country code>.<number>, such as +49.3012345678"),
|
|
4673
|
+
street: import_zod16.z.string().trim().min(3).max(200),
|
|
4674
|
+
city: import_zod16.z.string().trim().min(1).max(100),
|
|
4675
|
+
state: import_zod16.z.string().trim().min(1).max(100),
|
|
4676
|
+
postal_code: import_zod16.z.string().trim().min(2).max(20),
|
|
4677
|
+
country_code: import_zod16.z.string().trim().toUpperCase().regex(/^[A-Z]{2}$/, "must be a two-letter country code such as DE")
|
|
4678
|
+
});
|
|
4679
|
+
var MAX_DOMAIN_ORDERS_PER_DAY = 2;
|
|
4680
|
+
var DomainOrderCreate = import_zod16.z.object({
|
|
4681
|
+
domain: SendingDomainName,
|
|
4682
|
+
price_cents: import_zod16.z.number().int().min(0),
|
|
4683
|
+
registrant: DomainRegistrant,
|
|
4684
|
+
from_name: import_zod16.z.string().trim().min(1).max(120),
|
|
4685
|
+
from_local_part: import_zod16.z.string().trim().toLowerCase().regex(/^[a-z0-9](?:[a-z0-9._+-]{0,62}[a-z0-9])?$/, "must be the part before the @, such as hello"),
|
|
4686
|
+
/**
|
|
4687
|
+
* Where Stripe returns to after paying, and after leaving the payment. The
|
|
4688
|
+
* service adds `domain_order=<order id>` to both, so the page coming back
|
|
4689
|
+
* knows which order to show (and read: `domainOrders.get` confirms a
|
|
4690
|
+
* payment at once, before Stripe's webhook arrives).
|
|
4691
|
+
*/
|
|
4692
|
+
success_url: import_zod16.z.string().url(),
|
|
4693
|
+
cancel_url: import_zod16.z.string().url(),
|
|
4694
|
+
/** The buyer accepted the terms of service (which cover bought domains) of this version. */
|
|
4695
|
+
accept_terms: AcceptTerms
|
|
4696
|
+
});
|
|
4697
|
+
var DOMAIN_ORDER_STATES = [
|
|
4698
|
+
"awaiting_payment",
|
|
4699
|
+
"paid",
|
|
4700
|
+
"registering",
|
|
4701
|
+
"setting_up",
|
|
4702
|
+
"ready",
|
|
4703
|
+
"needs_attention",
|
|
4704
|
+
"refunded",
|
|
4705
|
+
"cancelled"
|
|
4706
|
+
];
|
|
4707
|
+
var DomainOrderState = import_zod16.z.enum(DOMAIN_ORDER_STATES);
|
|
4708
|
+
var DomainOrder = import_zod16.z.object({
|
|
4709
|
+
id: Id,
|
|
4710
|
+
domain: import_zod16.z.string(),
|
|
4711
|
+
state: DomainOrderState,
|
|
4712
|
+
price_cents: import_zod16.z.number().int().min(0),
|
|
4713
|
+
renewal_price_cents: import_zod16.z.number().int().min(0),
|
|
4714
|
+
currency: import_zod16.z.literal("EUR"),
|
|
4715
|
+
/** Stripe's payment page while `awaiting_payment`; null otherwise. */
|
|
4716
|
+
checkout_url: import_zod16.z.string().url().nullable(),
|
|
4717
|
+
registrant_name: import_zod16.z.string(),
|
|
4718
|
+
from_name: import_zod16.z.string(),
|
|
4719
|
+
from_email: Email,
|
|
4720
|
+
/** The sending domain once `ready`. */
|
|
4721
|
+
sending_domain_id: Id.nullable(),
|
|
4722
|
+
/** When the paid year ends, once registered. */
|
|
4723
|
+
expires_at: Timestamp.nullable(),
|
|
4724
|
+
/** What went wrong, for `needs_attention` and `refunded`; null otherwise. */
|
|
4725
|
+
last_error: import_zod16.z.string().nullable(),
|
|
4726
|
+
paid_at: Timestamp.nullable(),
|
|
4727
|
+
registered_at: Timestamp.nullable(),
|
|
4728
|
+
created_at: Timestamp,
|
|
4729
|
+
updated_at: Timestamp
|
|
4730
|
+
});
|
|
4731
|
+
|
|
4732
|
+
// src/contacts.ts
|
|
4733
|
+
var import_zod17 = require("zod");
|
|
4734
|
+
var Topic = import_zod17.z.object({
|
|
4622
4735
|
id: Id,
|
|
4623
4736
|
slug: Slug,
|
|
4624
|
-
name:
|
|
4737
|
+
name: import_zod17.z.string().min(1).max(120),
|
|
4625
4738
|
/** Shown on the hosted preference page. */
|
|
4626
|
-
description:
|
|
4739
|
+
description: import_zod17.z.string().max(1e3).nullable(),
|
|
4627
4740
|
/** Translations of `name` and `description` per locale, for the hosted page. */
|
|
4628
|
-
translations:
|
|
4629
|
-
|
|
4741
|
+
translations: import_zod17.z.record(
|
|
4742
|
+
import_zod17.z.object({ name: import_zod17.z.string().min(1).max(120), description: import_zod17.z.string().max(1e3).nullable() })
|
|
4630
4743
|
),
|
|
4631
4744
|
created_at: Timestamp,
|
|
4632
4745
|
updated_at: Timestamp
|
|
4633
4746
|
});
|
|
4634
|
-
var TopicCreate =
|
|
4747
|
+
var TopicCreate = import_zod17.z.object({
|
|
4635
4748
|
slug: Slug,
|
|
4636
|
-
name:
|
|
4637
|
-
description:
|
|
4749
|
+
name: import_zod17.z.string().min(1).max(120),
|
|
4750
|
+
description: import_zod17.z.string().max(1e3).optional(),
|
|
4638
4751
|
translations: Topic.shape.translations.optional()
|
|
4639
4752
|
});
|
|
4640
4753
|
var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
4641
|
-
var Contact =
|
|
4754
|
+
var Contact = import_zod17.z.object({
|
|
4642
4755
|
id: Id,
|
|
4643
|
-
external_id:
|
|
4756
|
+
external_id: import_zod17.z.string().min(1).max(255).nullable(),
|
|
4644
4757
|
/** Stored lowercased, unique per workspace. */
|
|
4645
4758
|
email: Email,
|
|
4646
|
-
first_name:
|
|
4647
|
-
last_name:
|
|
4648
|
-
locale:
|
|
4759
|
+
first_name: import_zod17.z.string().max(200).nullable(),
|
|
4760
|
+
last_name: import_zod17.z.string().max(200).nullable(),
|
|
4761
|
+
locale: import_zod17.z.string().min(2).max(35).nullable(),
|
|
4649
4762
|
/**
|
|
4650
4763
|
* The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
|
|
4651
4764
|
* Every wall clock an automation waits for is read in it, falling back to the
|
|
@@ -4653,65 +4766,65 @@ var Contact = import_zod16.z.object({
|
|
|
4653
4766
|
*/
|
|
4654
4767
|
timezone: TimezoneName.nullable(),
|
|
4655
4768
|
properties: Properties,
|
|
4656
|
-
topics:
|
|
4769
|
+
topics: import_zod17.z.array(Slug),
|
|
4657
4770
|
/** The slugs of the contact's tags (S4). */
|
|
4658
|
-
tags:
|
|
4771
|
+
tags: import_zod17.z.array(Slug),
|
|
4659
4772
|
created_at: Timestamp,
|
|
4660
4773
|
updated_at: Timestamp
|
|
4661
4774
|
});
|
|
4662
|
-
var ContactUpsert =
|
|
4663
|
-
external_id:
|
|
4775
|
+
var ContactUpsert = import_zod17.z.object({
|
|
4776
|
+
external_id: import_zod17.z.string().min(1).max(255).optional(),
|
|
4664
4777
|
email: Email.optional(),
|
|
4665
|
-
first_name:
|
|
4666
|
-
last_name:
|
|
4667
|
-
locale:
|
|
4778
|
+
first_name: import_zod17.z.string().max(200).nullable().optional(),
|
|
4779
|
+
last_name: import_zod17.z.string().max(200).nullable().optional(),
|
|
4780
|
+
locale: import_zod17.z.string().min(2).max(35).nullable().optional(),
|
|
4668
4781
|
timezone: TimezoneName.nullable().optional(),
|
|
4669
4782
|
properties: Properties.optional(),
|
|
4670
|
-
topics:
|
|
4783
|
+
topics: import_zod17.z.array(Slug).max(100).optional()
|
|
4671
4784
|
}).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
|
|
4672
4785
|
message: "external_id or email is required",
|
|
4673
4786
|
path: ["email"]
|
|
4674
4787
|
});
|
|
4675
|
-
var ContactUpsertResult =
|
|
4788
|
+
var ContactUpsertResult = import_zod17.z.object({
|
|
4676
4789
|
contact: Contact,
|
|
4677
|
-
created:
|
|
4790
|
+
created: import_zod17.z.boolean()
|
|
4678
4791
|
});
|
|
4679
4792
|
var ContactListQuery = PageQuery.extend({
|
|
4680
|
-
email:
|
|
4681
|
-
external_id:
|
|
4793
|
+
email: import_zod17.z.string().min(1).max(254).optional(),
|
|
4794
|
+
external_id: import_zod17.z.string().min(1).max(255).optional(),
|
|
4682
4795
|
topic: Slug.optional()
|
|
4683
4796
|
});
|
|
4684
|
-
var ContactErased =
|
|
4685
|
-
ok:
|
|
4686
|
-
erased_messages:
|
|
4687
|
-
erased_recipients:
|
|
4688
|
-
suppressions_kept:
|
|
4797
|
+
var ContactErased = import_zod17.z.object({
|
|
4798
|
+
ok: import_zod17.z.literal(true),
|
|
4799
|
+
erased_messages: import_zod17.z.number().int().min(0),
|
|
4800
|
+
erased_recipients: import_zod17.z.number().int().min(0),
|
|
4801
|
+
suppressions_kept: import_zod17.z.number().int().min(0)
|
|
4689
4802
|
});
|
|
4690
4803
|
var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
|
|
4691
|
-
var SuppressionReason =
|
|
4692
|
-
var Suppression =
|
|
4804
|
+
var SuppressionReason = import_zod17.z.enum(SUPPRESSION_REASONS);
|
|
4805
|
+
var Suppression = import_zod17.z.object({
|
|
4693
4806
|
id: Id,
|
|
4694
4807
|
email: Email,
|
|
4695
4808
|
reason: SuppressionReason,
|
|
4696
4809
|
topic: Slug.nullable(),
|
|
4697
4810
|
source_message_id: Id.nullable(),
|
|
4698
|
-
note:
|
|
4811
|
+
note: import_zod17.z.string().max(1e3).nullable(),
|
|
4699
4812
|
created_at: Timestamp
|
|
4700
4813
|
});
|
|
4701
|
-
var SuppressionCreate =
|
|
4814
|
+
var SuppressionCreate = import_zod17.z.object({
|
|
4702
4815
|
email: Email,
|
|
4703
|
-
reason:
|
|
4816
|
+
reason: import_zod17.z.enum(["manual", "unsubscribed"]),
|
|
4704
4817
|
topic: Slug.nullable().optional(),
|
|
4705
|
-
note:
|
|
4818
|
+
note: import_zod17.z.string().max(1e3).optional()
|
|
4706
4819
|
});
|
|
4707
4820
|
var SuppressionListQuery = PageQuery.extend({
|
|
4708
|
-
email:
|
|
4821
|
+
email: import_zod17.z.string().min(1).max(254).optional(),
|
|
4709
4822
|
reason: SuppressionReason.optional(),
|
|
4710
4823
|
topic: Slug.optional()
|
|
4711
4824
|
});
|
|
4712
4825
|
|
|
4713
4826
|
// src/webhooks.ts
|
|
4714
|
-
var
|
|
4827
|
+
var import_zod18 = require("zod");
|
|
4715
4828
|
var WEBHOOK_EVENT_TYPES = [
|
|
4716
4829
|
"message.sent",
|
|
4717
4830
|
"message.failed",
|
|
@@ -4755,23 +4868,23 @@ var WEBHOOK_EVENT_TYPES = [
|
|
|
4755
4868
|
"template.updated",
|
|
4756
4869
|
"template.deleted"
|
|
4757
4870
|
];
|
|
4758
|
-
var WebhookEventType =
|
|
4759
|
-
var MessageEventBase =
|
|
4871
|
+
var WebhookEventType = import_zod18.z.enum(WEBHOOK_EVENT_TYPES);
|
|
4872
|
+
var MessageEventBase = import_zod18.z.object({
|
|
4760
4873
|
message_id: Id,
|
|
4761
4874
|
mailing_id: Id.nullable(),
|
|
4762
4875
|
mailing_metadata: MailingMetadata.nullable(),
|
|
4763
4876
|
recipient_id: Id.nullable(),
|
|
4764
4877
|
contact_id: Id.nullable(),
|
|
4765
|
-
external_id:
|
|
4878
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4766
4879
|
email: Email,
|
|
4767
|
-
subject:
|
|
4880
|
+
subject: import_zod18.z.string(),
|
|
4768
4881
|
topic: Slug.nullable(),
|
|
4769
|
-
provider_message_id:
|
|
4770
|
-
is_test:
|
|
4882
|
+
provider_message_id: import_zod18.z.string().nullable(),
|
|
4883
|
+
is_test: import_zod18.z.boolean()
|
|
4771
4884
|
});
|
|
4772
4885
|
var MessageSentData = MessageEventBase.extend({
|
|
4773
4886
|
/** The final HTML as sent, so the client can archive it beside its own records. */
|
|
4774
|
-
html:
|
|
4887
|
+
html: import_zod18.z.string(),
|
|
4775
4888
|
sent_at: Timestamp,
|
|
4776
4889
|
/**
|
|
4777
4890
|
* The choice each insertion made (see `Message.insertions`); absent or null
|
|
@@ -4782,20 +4895,20 @@ var MessageSentData = MessageEventBase.extend({
|
|
|
4782
4895
|
insertions: InsertionChoices.nullish()
|
|
4783
4896
|
});
|
|
4784
4897
|
var MessageFailedData = MessageEventBase.extend({
|
|
4785
|
-
error:
|
|
4898
|
+
error: import_zod18.z.string(),
|
|
4786
4899
|
/** False when the provider rejected permanently; the recipient will not be retried. */
|
|
4787
|
-
retryable:
|
|
4900
|
+
retryable: import_zod18.z.boolean(),
|
|
4788
4901
|
failed_at: Timestamp
|
|
4789
4902
|
});
|
|
4790
4903
|
var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
|
|
4791
|
-
var ContactUnsubscribedData =
|
|
4904
|
+
var ContactUnsubscribedData = import_zod18.z.object({
|
|
4792
4905
|
contact_id: Id.nullable(),
|
|
4793
|
-
external_id:
|
|
4906
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4794
4907
|
email: Email,
|
|
4795
4908
|
/** The topic unsubscribed from; null means every topic. */
|
|
4796
4909
|
topic: Slug.nullable(),
|
|
4797
4910
|
mailing_id: Id.nullable(),
|
|
4798
|
-
source:
|
|
4911
|
+
source: import_zod18.z.enum(UNSUBSCRIBE_SOURCES),
|
|
4799
4912
|
unsubscribed_at: Timestamp
|
|
4800
4913
|
});
|
|
4801
4914
|
var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
|
|
@@ -4804,142 +4917,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
|
|
|
4804
4917
|
* breaker undid a `bounced` block it judged false (a `contact.bounced` for the
|
|
4805
4918
|
* same address and mailing went out before); `topic` is null.
|
|
4806
4919
|
*/
|
|
4807
|
-
source:
|
|
4920
|
+
source: import_zod18.z.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
|
|
4808
4921
|
resubscribed_at: Timestamp
|
|
4809
4922
|
});
|
|
4810
|
-
var ContactBouncedData =
|
|
4923
|
+
var ContactBouncedData = import_zod18.z.object({
|
|
4811
4924
|
contact_id: Id.nullable(),
|
|
4812
|
-
external_id:
|
|
4925
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4813
4926
|
email: Email,
|
|
4814
4927
|
/** `bounced` for a hard bounce, `complained` for a spam complaint. */
|
|
4815
|
-
reason:
|
|
4928
|
+
reason: import_zod18.z.enum(["bounced", "complained"]),
|
|
4816
4929
|
message_id: Id.nullable(),
|
|
4817
|
-
diagnostic:
|
|
4930
|
+
diagnostic: import_zod18.z.string().nullable(),
|
|
4818
4931
|
bounced_at: Timestamp
|
|
4819
4932
|
});
|
|
4820
|
-
var MailingFinishedData =
|
|
4933
|
+
var MailingFinishedData = import_zod18.z.object({
|
|
4821
4934
|
mailing_id: Id,
|
|
4822
4935
|
mailing_metadata: MailingMetadata,
|
|
4823
|
-
status:
|
|
4936
|
+
status: import_zod18.z.enum(["sent", "partially_failed", "cancelled"]),
|
|
4824
4937
|
counts: MailingCounts,
|
|
4825
4938
|
finished_at: Timestamp
|
|
4826
4939
|
});
|
|
4827
|
-
var ContactSubscribedData =
|
|
4940
|
+
var ContactSubscribedData = import_zod18.z.object({
|
|
4828
4941
|
contact_id: Id,
|
|
4829
|
-
external_id:
|
|
4942
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4830
4943
|
email: Email,
|
|
4831
|
-
topics:
|
|
4832
|
-
source:
|
|
4944
|
+
topics: import_zod18.z.array(Slug),
|
|
4945
|
+
source: import_zod18.z.enum(["signup_form", "api", "dashboard", "automation"]),
|
|
4833
4946
|
signup_form_id: Id.nullable(),
|
|
4834
|
-
signup_form_version:
|
|
4947
|
+
signup_form_version: import_zod18.z.number().int().min(1).nullable(),
|
|
4835
4948
|
subscribed_at: Timestamp
|
|
4836
4949
|
});
|
|
4837
|
-
var ImportFinishedData =
|
|
4950
|
+
var ImportFinishedData = import_zod18.z.object({
|
|
4838
4951
|
import_id: Id,
|
|
4839
|
-
status:
|
|
4952
|
+
status: import_zod18.z.enum(["completed", "cancelled", "failed"]),
|
|
4840
4953
|
result: ImportReport.nullable(),
|
|
4841
|
-
error:
|
|
4954
|
+
error: import_zod18.z.string().nullable(),
|
|
4842
4955
|
finished_at: Timestamp
|
|
4843
4956
|
});
|
|
4844
|
-
var MailingScheduledData =
|
|
4957
|
+
var MailingScheduledData = import_zod18.z.object({
|
|
4845
4958
|
mailing_id: Id,
|
|
4846
4959
|
mailing_metadata: MailingMetadata,
|
|
4847
4960
|
scheduled_at: Timestamp.nullable()
|
|
4848
4961
|
});
|
|
4849
|
-
var MailingStartedData =
|
|
4962
|
+
var MailingStartedData = import_zod18.z.object({
|
|
4850
4963
|
mailing_id: Id,
|
|
4851
4964
|
mailing_metadata: MailingMetadata,
|
|
4852
|
-
trigger:
|
|
4853
|
-
recipients:
|
|
4965
|
+
trigger: import_zod18.z.enum(["send", "schedule"]),
|
|
4966
|
+
recipients: import_zod18.z.number().int().min(0),
|
|
4854
4967
|
started_at: Timestamp
|
|
4855
4968
|
});
|
|
4856
|
-
var MailingScheduleFailedData =
|
|
4969
|
+
var MailingScheduleFailedData = import_zod18.z.object({
|
|
4857
4970
|
mailing_id: Id,
|
|
4858
4971
|
mailing_metadata: MailingMetadata,
|
|
4859
|
-
code:
|
|
4860
|
-
message:
|
|
4972
|
+
code: import_zod18.z.string(),
|
|
4973
|
+
message: import_zod18.z.string(),
|
|
4861
4974
|
failed_at: Timestamp
|
|
4862
4975
|
});
|
|
4863
|
-
var MailingAbWinnerSelectedData =
|
|
4976
|
+
var MailingAbWinnerSelectedData = import_zod18.z.object({
|
|
4864
4977
|
mailing_id: Id,
|
|
4865
4978
|
mailing_metadata: MailingMetadata,
|
|
4866
|
-
winner:
|
|
4867
|
-
decided_by:
|
|
4868
|
-
variants:
|
|
4979
|
+
winner: import_zod18.z.string(),
|
|
4980
|
+
decided_by: import_zod18.z.enum(["metric", "manual"]),
|
|
4981
|
+
variants: import_zod18.z.array(VariantAnalytics),
|
|
4869
4982
|
decided_at: Timestamp
|
|
4870
4983
|
});
|
|
4871
|
-
var ContactTaggedData =
|
|
4984
|
+
var ContactTaggedData = import_zod18.z.object({
|
|
4872
4985
|
contact_id: Id,
|
|
4873
|
-
external_id:
|
|
4986
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4874
4987
|
email: Email,
|
|
4875
4988
|
/** Only the tags the contact did not already have. */
|
|
4876
|
-
tags:
|
|
4877
|
-
source:
|
|
4989
|
+
tags: import_zod18.z.array(Slug).min(1),
|
|
4990
|
+
source: import_zod18.z.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4878
4991
|
tagged_at: Timestamp
|
|
4879
4992
|
});
|
|
4880
|
-
var ContactUpdatedData =
|
|
4993
|
+
var ContactUpdatedData = import_zod18.z.object({
|
|
4881
4994
|
contact_id: Id,
|
|
4882
|
-
external_id:
|
|
4995
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4883
4996
|
email: Email,
|
|
4884
|
-
changed:
|
|
4997
|
+
changed: import_zod18.z.array(import_zod18.z.string()).min(1),
|
|
4885
4998
|
properties: Properties,
|
|
4886
|
-
source:
|
|
4999
|
+
source: import_zod18.z.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4887
5000
|
updated_at: Timestamp
|
|
4888
5001
|
});
|
|
4889
|
-
var AutomationRunEventBase =
|
|
5002
|
+
var AutomationRunEventBase = import_zod18.z.object({
|
|
4890
5003
|
automation_id: Id,
|
|
4891
|
-
automation_name:
|
|
5004
|
+
automation_name: import_zod18.z.string(),
|
|
4892
5005
|
run_id: Id,
|
|
4893
|
-
version:
|
|
5006
|
+
version: import_zod18.z.number().int().min(1),
|
|
4894
5007
|
contact_id: Id,
|
|
4895
|
-
external_id:
|
|
5008
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4896
5009
|
email: Email
|
|
4897
5010
|
});
|
|
4898
5011
|
var AutomationRunStartedData = AutomationRunEventBase.extend({
|
|
4899
5012
|
/** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
|
|
4900
|
-
trigger_kind:
|
|
5013
|
+
trigger_kind: import_zod18.z.string(),
|
|
4901
5014
|
entered_at: Timestamp
|
|
4902
5015
|
});
|
|
4903
5016
|
var AutomationRunCompletedData = AutomationRunEventBase.extend({
|
|
4904
|
-
last_step_id:
|
|
5017
|
+
last_step_id: import_zod18.z.string().nullable(),
|
|
4905
5018
|
completed_at: Timestamp
|
|
4906
5019
|
});
|
|
4907
5020
|
var AutomationRunExitedData = AutomationRunEventBase.extend({
|
|
4908
5021
|
reason: AutomationEndReason,
|
|
4909
|
-
step_id:
|
|
5022
|
+
step_id: import_zod18.z.string().nullable(),
|
|
4910
5023
|
exited_at: Timestamp
|
|
4911
5024
|
});
|
|
4912
5025
|
var AutomationRunFailedData = AutomationRunEventBase.extend({
|
|
4913
|
-
reason:
|
|
4914
|
-
step_id:
|
|
5026
|
+
reason: import_zod18.z.string(),
|
|
5027
|
+
step_id: import_zod18.z.string().nullable(),
|
|
4915
5028
|
failed_at: Timestamp
|
|
4916
5029
|
});
|
|
4917
5030
|
var AutomationWebhookData = AutomationRunEventBase.extend({
|
|
4918
|
-
step_id:
|
|
5031
|
+
step_id: import_zod18.z.string(),
|
|
4919
5032
|
/** The step's own label, when it was given one, so a receiver can branch on a name. */
|
|
4920
|
-
step_label:
|
|
5033
|
+
step_label: import_zod18.z.string().nullable(),
|
|
4921
5034
|
/** Whatever the step carries, verbatim. Null when it carries nothing. */
|
|
4922
5035
|
payload: JsonValue.nullable(),
|
|
4923
5036
|
fired_at: Timestamp
|
|
4924
5037
|
});
|
|
4925
|
-
var TemplateEventBase =
|
|
5038
|
+
var TemplateEventBase = import_zod18.z.object({
|
|
4926
5039
|
template_id: Id,
|
|
4927
|
-
name:
|
|
4928
|
-
version:
|
|
4929
|
-
source:
|
|
5040
|
+
name: import_zod18.z.string().min(1).max(200),
|
|
5041
|
+
version: import_zod18.z.number().int().min(1),
|
|
5042
|
+
source: import_zod18.z.enum(["api", "dashboard", "mjml_import"])
|
|
4930
5043
|
});
|
|
4931
5044
|
var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
|
|
4932
|
-
var TemplateUpdatedData = TemplateEventBase.extend({ archived:
|
|
5045
|
+
var TemplateUpdatedData = TemplateEventBase.extend({ archived: import_zod18.z.boolean(), updated_at: Timestamp });
|
|
4933
5046
|
var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
|
|
4934
|
-
var envelope = (type, data) =>
|
|
5047
|
+
var envelope = (type, data) => import_zod18.z.object({
|
|
4935
5048
|
/** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
|
|
4936
5049
|
id: Id,
|
|
4937
|
-
type:
|
|
5050
|
+
type: import_zod18.z.literal(type),
|
|
4938
5051
|
created_at: Timestamp,
|
|
4939
5052
|
workspace_id: Id,
|
|
4940
5053
|
data
|
|
4941
5054
|
});
|
|
4942
|
-
var WebhookEvent =
|
|
5055
|
+
var WebhookEvent = import_zod18.z.discriminatedUnion("type", [
|
|
4943
5056
|
envelope("message.sent", MessageSentData),
|
|
4944
5057
|
envelope("message.failed", MessageFailedData),
|
|
4945
5058
|
envelope("contact.unsubscribed", ContactUnsubscribedData),
|
|
@@ -4963,16 +5076,16 @@ var WebhookEvent = import_zod17.z.discriminatedUnion("type", [
|
|
|
4963
5076
|
envelope("template.updated", TemplateUpdatedData),
|
|
4964
5077
|
envelope("template.deleted", TemplateDeletedData)
|
|
4965
5078
|
]);
|
|
4966
|
-
var WebhookEndpoint =
|
|
5079
|
+
var WebhookEndpoint = import_zod18.z.object({
|
|
4967
5080
|
id: Id,
|
|
4968
|
-
url:
|
|
4969
|
-
description:
|
|
4970
|
-
events:
|
|
4971
|
-
enabled:
|
|
5081
|
+
url: import_zod18.z.string().url(),
|
|
5082
|
+
description: import_zod18.z.string().max(500).nullable(),
|
|
5083
|
+
events: import_zod18.z.array(WebhookEventType).min(1),
|
|
5084
|
+
enabled: import_zod18.z.boolean(),
|
|
4972
5085
|
created_at: Timestamp,
|
|
4973
5086
|
updated_at: Timestamp
|
|
4974
5087
|
});
|
|
4975
|
-
var WebhookUrl =
|
|
5088
|
+
var WebhookUrl = import_zod18.z.string().url().refine((u) => {
|
|
4976
5089
|
try {
|
|
4977
5090
|
const url = new URL(u);
|
|
4978
5091
|
if (url.protocol === "https:") return true;
|
|
@@ -4981,35 +5094,35 @@ var WebhookUrl = import_zod17.z.string().url().refine((u) => {
|
|
|
4981
5094
|
return false;
|
|
4982
5095
|
}
|
|
4983
5096
|
}, "must be https (http only for localhost)");
|
|
4984
|
-
var WebhookEndpointCreate =
|
|
5097
|
+
var WebhookEndpointCreate = import_zod18.z.object({
|
|
4985
5098
|
url: WebhookUrl,
|
|
4986
|
-
description:
|
|
4987
|
-
events:
|
|
4988
|
-
enabled:
|
|
5099
|
+
description: import_zod18.z.string().max(500).optional(),
|
|
5100
|
+
events: import_zod18.z.array(WebhookEventType).min(1),
|
|
5101
|
+
enabled: import_zod18.z.boolean().optional()
|
|
4989
5102
|
});
|
|
4990
|
-
var WebhookEndpointUpdate =
|
|
5103
|
+
var WebhookEndpointUpdate = import_zod18.z.object({
|
|
4991
5104
|
url: WebhookUrl,
|
|
4992
|
-
description:
|
|
4993
|
-
events:
|
|
4994
|
-
enabled:
|
|
5105
|
+
description: import_zod18.z.string().max(500).nullable(),
|
|
5106
|
+
events: import_zod18.z.array(WebhookEventType).min(1),
|
|
5107
|
+
enabled: import_zod18.z.boolean()
|
|
4995
5108
|
}).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
4996
|
-
var WebhookEndpointWithSecret =
|
|
5109
|
+
var WebhookEndpointWithSecret = import_zod18.z.object({
|
|
4997
5110
|
endpoint: WebhookEndpoint,
|
|
4998
|
-
secret:
|
|
5111
|
+
secret: import_zod18.z.string().min(32)
|
|
4999
5112
|
});
|
|
5000
5113
|
var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
|
|
5001
|
-
var WebhookDeliveryStatus =
|
|
5114
|
+
var WebhookDeliveryStatus = import_zod18.z.enum(WEBHOOK_DELIVERY_STATUSES);
|
|
5002
5115
|
var WEBHOOK_MAX_ATTEMPTS = 8;
|
|
5003
5116
|
var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
|
|
5004
|
-
var WebhookDelivery =
|
|
5117
|
+
var WebhookDelivery = import_zod18.z.object({
|
|
5005
5118
|
id: Id,
|
|
5006
5119
|
endpoint_id: Id,
|
|
5007
5120
|
event_id: Id,
|
|
5008
5121
|
event_type: WebhookEventType,
|
|
5009
5122
|
status: WebhookDeliveryStatus,
|
|
5010
|
-
attempts:
|
|
5011
|
-
last_status_code:
|
|
5012
|
-
last_error:
|
|
5123
|
+
attempts: import_zod18.z.number().int().min(0),
|
|
5124
|
+
last_status_code: import_zod18.z.number().int().min(100).max(599).nullable(),
|
|
5125
|
+
last_error: import_zod18.z.string().nullable(),
|
|
5013
5126
|
next_attempt_at: Timestamp.nullable(),
|
|
5014
5127
|
delivered_at: Timestamp.nullable(),
|
|
5015
5128
|
created_at: Timestamp
|
|
@@ -5018,7 +5131,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
|
|
|
5018
5131
|
status: WebhookDeliveryStatus.optional(),
|
|
5019
5132
|
event_type: WebhookEventType.optional()
|
|
5020
5133
|
});
|
|
5021
|
-
var WebhookDeliveryParams =
|
|
5134
|
+
var WebhookDeliveryParams = import_zod18.z.object({ id: Id, delivery_id: Id });
|
|
5022
5135
|
|
|
5023
5136
|
// src/webhook-signing.ts
|
|
5024
5137
|
var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
|
|
@@ -5085,96 +5198,99 @@ async function verifyWebhook(input) {
|
|
|
5085
5198
|
}
|
|
5086
5199
|
|
|
5087
5200
|
// src/billing.ts
|
|
5088
|
-
var
|
|
5201
|
+
var import_zod19 = require("zod");
|
|
5089
5202
|
var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
|
|
5090
|
-
var PlanId =
|
|
5091
|
-
var PlanLimits =
|
|
5092
|
-
monthly_messages:
|
|
5093
|
-
contacts:
|
|
5094
|
-
members:
|
|
5095
|
-
providers:
|
|
5096
|
-
webhook_endpoints:
|
|
5203
|
+
var PlanId = import_zod19.z.enum(PLAN_IDS);
|
|
5204
|
+
var PlanLimits = import_zod19.z.object({
|
|
5205
|
+
monthly_messages: import_zod19.z.number().int().min(0).nullable(),
|
|
5206
|
+
contacts: import_zod19.z.number().int().min(0).nullable(),
|
|
5207
|
+
members: import_zod19.z.number().int().min(1).nullable(),
|
|
5208
|
+
providers: import_zod19.z.number().int().min(1).nullable(),
|
|
5209
|
+
webhook_endpoints: import_zod19.z.number().int().min(0).nullable(),
|
|
5097
5210
|
/** Automations that may be live (active or paused) at once (A1). */
|
|
5098
|
-
active_automations:
|
|
5211
|
+
active_automations: import_zod19.z.number().int().min(0).nullable(),
|
|
5099
5212
|
/** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
|
|
5100
|
-
automation_steps:
|
|
5213
|
+
automation_steps: import_zod19.z.number().int().min(1).nullable(),
|
|
5101
5214
|
/** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
|
|
5102
|
-
sending_domains:
|
|
5215
|
+
sending_domains: import_zod19.z.number().int().min(0).nullable()
|
|
5103
5216
|
});
|
|
5104
|
-
var PlanFeatures =
|
|
5217
|
+
var PlanFeatures = import_zod19.z.object({
|
|
5105
5218
|
/** A/B tests of subject and content on a mailing (S4). */
|
|
5106
|
-
ab_testing:
|
|
5219
|
+
ab_testing: import_zod19.z.boolean(),
|
|
5107
5220
|
/** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
|
|
5108
|
-
tracking:
|
|
5221
|
+
tracking: import_zod19.z.boolean(),
|
|
5109
5222
|
/** Automations: flows a person walks through step by step (A1). */
|
|
5110
|
-
automations:
|
|
5223
|
+
automations: import_zod19.z.boolean()
|
|
5111
5224
|
});
|
|
5112
5225
|
var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
|
|
5113
|
-
var Plan =
|
|
5226
|
+
var Plan = import_zod19.z.object({
|
|
5114
5227
|
id: PlanId,
|
|
5115
|
-
name:
|
|
5228
|
+
name: import_zod19.z.string().min(1),
|
|
5116
5229
|
/** Price in the smallest currency unit per month; null for plans not sold. */
|
|
5117
|
-
monthly_price_cents:
|
|
5118
|
-
currency:
|
|
5230
|
+
monthly_price_cents: import_zod19.z.number().int().min(0).nullable(),
|
|
5231
|
+
currency: import_zod19.z.string().length(3),
|
|
5119
5232
|
limits: PlanLimits,
|
|
5120
5233
|
features: PlanFeatures
|
|
5121
5234
|
});
|
|
5122
|
-
var CatalogPlan = Plan.extend({ sellable:
|
|
5123
|
-
var Subscription =
|
|
5235
|
+
var CatalogPlan = Plan.extend({ sellable: import_zod19.z.boolean() });
|
|
5236
|
+
var Subscription = import_zod19.z.object({
|
|
5124
5237
|
workspace_id: Id,
|
|
5125
5238
|
plan: PlanId,
|
|
5126
|
-
status:
|
|
5239
|
+
status: import_zod19.z.enum(["active", "trialing", "past_due", "cancelled"]),
|
|
5127
5240
|
current_period_start: Timestamp,
|
|
5128
5241
|
current_period_end: Timestamp,
|
|
5129
|
-
cancel_at_period_end:
|
|
5242
|
+
cancel_at_period_end: import_zod19.z.boolean(),
|
|
5130
5243
|
/**
|
|
5131
5244
|
* A design partner outside billing (plan `design_partner`, no limits, no
|
|
5132
5245
|
* checkout). Set only by an operator, never through the API.
|
|
5133
5246
|
*/
|
|
5134
|
-
billing_exempt:
|
|
5247
|
+
billing_exempt: import_zod19.z.boolean(),
|
|
5135
5248
|
/**
|
|
5136
5249
|
* Own sending domains bought on top of the plan's included ones (the
|
|
5137
5250
|
* add-on), each a monthly charge on the same subscription. 0 without the
|
|
5138
5251
|
* add-on; the usage limit `sending_domains` is the plan's plus these.
|
|
5139
5252
|
*/
|
|
5140
|
-
extra_sending_domains:
|
|
5253
|
+
extra_sending_domains: import_zod19.z.number().int().min(0)
|
|
5141
5254
|
});
|
|
5142
|
-
var BillingAddons =
|
|
5143
|
-
sending_domain:
|
|
5144
|
-
monthly_price_cents:
|
|
5145
|
-
currency:
|
|
5146
|
-
sellable:
|
|
5255
|
+
var BillingAddons = import_zod19.z.object({
|
|
5256
|
+
sending_domain: import_zod19.z.object({
|
|
5257
|
+
monthly_price_cents: import_zod19.z.number().int().min(0),
|
|
5258
|
+
currency: import_zod19.z.string().length(3),
|
|
5259
|
+
sellable: import_zod19.z.boolean()
|
|
5147
5260
|
})
|
|
5148
5261
|
});
|
|
5149
5262
|
var MAX_EXTRA_SENDING_DOMAINS = 100;
|
|
5150
|
-
var ExtraSendingDomainsUpdate =
|
|
5263
|
+
var ExtraSendingDomainsUpdate = import_zod19.z.object({ quantity: import_zod19.z.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
|
|
5151
5264
|
var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
|
|
5152
|
-
var UsageMetric =
|
|
5265
|
+
var UsageMetric = import_zod19.z.enum(USAGE_METRICS);
|
|
5153
5266
|
var USAGE_WARNING_RATIO = 0.8;
|
|
5154
|
-
var UsageWarning =
|
|
5267
|
+
var UsageWarning = import_zod19.z.object({
|
|
5155
5268
|
metric: UsageMetric,
|
|
5156
|
-
used:
|
|
5157
|
-
limit:
|
|
5269
|
+
used: import_zod19.z.number().int().min(0),
|
|
5270
|
+
limit: import_zod19.z.number().int().min(0),
|
|
5158
5271
|
/** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
|
|
5159
|
-
level:
|
|
5272
|
+
level: import_zod19.z.enum(["approaching", "reached"])
|
|
5160
5273
|
});
|
|
5161
|
-
var
|
|
5274
|
+
var TermsStatus = import_zod19.z.object({ accepted_version: import_zod19.z.string().nullable(), current_version: import_zod19.z.string() });
|
|
5275
|
+
var Usage = import_zod19.z.object({
|
|
5162
5276
|
plan: PlanId,
|
|
5163
5277
|
period_start: Timestamp,
|
|
5164
5278
|
period_end: Timestamp,
|
|
5165
|
-
metrics:
|
|
5166
|
-
warnings:
|
|
5167
|
-
|
|
5168
|
-
|
|
5169
|
-
|
|
5170
|
-
|
|
5171
|
-
|
|
5279
|
+
metrics: import_zod19.z.record(UsageMetric, import_zod19.z.object({ used: import_zod19.z.number().int().min(0), limit: import_zod19.z.number().int().min(0).nullable() })),
|
|
5280
|
+
warnings: import_zod19.z.array(UsageWarning),
|
|
5281
|
+
terms: TermsStatus
|
|
5282
|
+
});
|
|
5283
|
+
var TermsAcceptance = import_zod19.z.object({ accept_terms: AcceptTerms });
|
|
5284
|
+
var CheckoutRequest = import_zod19.z.object({
|
|
5285
|
+
plan: import_zod19.z.enum(["starter", "growth"]),
|
|
5286
|
+
success_url: import_zod19.z.string().url(),
|
|
5287
|
+
cancel_url: import_zod19.z.string().url(),
|
|
5172
5288
|
/** The buyer accepted the terms of service and the processing agreement of this version. */
|
|
5173
5289
|
accept_terms: AcceptTerms
|
|
5174
5290
|
});
|
|
5175
|
-
var CheckoutSession =
|
|
5176
|
-
var PortalRequest =
|
|
5177
|
-
var PortalSession =
|
|
5291
|
+
var CheckoutSession = import_zod19.z.object({ url: import_zod19.z.string().url() });
|
|
5292
|
+
var PortalRequest = import_zod19.z.object({ return_url: import_zod19.z.string().url() });
|
|
5293
|
+
var PortalSession = import_zod19.z.object({ url: import_zod19.z.string().url() });
|
|
5178
5294
|
var USAGE_WARNING_HEADER = "x-mail-usage-warning";
|
|
5179
5295
|
function formatUsageWarningHeader(warnings) {
|
|
5180
5296
|
if (warnings.length === 0) return null;
|
|
@@ -5194,7 +5310,7 @@ function parseUsageWarningHeader(value) {
|
|
|
5194
5310
|
}
|
|
5195
5311
|
|
|
5196
5312
|
// src/routes.ts
|
|
5197
|
-
var
|
|
5313
|
+
var import_zod20 = require("zod");
|
|
5198
5314
|
var list = (item) => page(item);
|
|
5199
5315
|
var foundationRoutes = {
|
|
5200
5316
|
"workspaces.create": {
|
|
@@ -5440,7 +5556,7 @@ var templateRoutes = {
|
|
|
5440
5556
|
path: "/v1/templates/:id/export",
|
|
5441
5557
|
params: IdParams,
|
|
5442
5558
|
query: TemplateExportQuery,
|
|
5443
|
-
response:
|
|
5559
|
+
response: import_zod20.z.string(),
|
|
5444
5560
|
responseType: "text",
|
|
5445
5561
|
status: 200,
|
|
5446
5562
|
access: "read",
|
|
@@ -5820,7 +5936,7 @@ var sendingRoutes = {
|
|
|
5820
5936
|
path: "/v1/mailings/:id/export",
|
|
5821
5937
|
params: IdParams,
|
|
5822
5938
|
query: MailingExportQuery,
|
|
5823
|
-
response:
|
|
5939
|
+
response: import_zod20.z.string(),
|
|
5824
5940
|
responseType: "text",
|
|
5825
5941
|
status: 200,
|
|
5826
5942
|
access: "read",
|
|
@@ -6087,7 +6203,7 @@ var platformRoutes = {
|
|
|
6087
6203
|
"contactProperties.list": {
|
|
6088
6204
|
method: "GET",
|
|
6089
6205
|
path: "/v1/contact-properties",
|
|
6090
|
-
response:
|
|
6206
|
+
response: import_zod20.z.object({ data: import_zod20.z.array(ContactPropertyDefinition) }),
|
|
6091
6207
|
status: 200,
|
|
6092
6208
|
access: "read",
|
|
6093
6209
|
phase: "S4"
|
|
@@ -6386,7 +6502,7 @@ var billingRoutes = {
|
|
|
6386
6502
|
"billing.plans": {
|
|
6387
6503
|
method: "GET",
|
|
6388
6504
|
path: "/v1/billing/plans",
|
|
6389
|
-
response:
|
|
6505
|
+
response: import_zod20.z.object({ data: import_zod20.z.array(CatalogPlan), addons: BillingAddons }),
|
|
6390
6506
|
status: 200,
|
|
6391
6507
|
access: "read",
|
|
6392
6508
|
phase: "S5"
|
|
@@ -6426,6 +6542,53 @@ var billingRoutes = {
|
|
|
6426
6542
|
status: 200,
|
|
6427
6543
|
access: "admin",
|
|
6428
6544
|
phase: "S5"
|
|
6545
|
+
},
|
|
6546
|
+
"billing.acceptTerms": {
|
|
6547
|
+
method: "POST",
|
|
6548
|
+
path: "/v1/billing/terms",
|
|
6549
|
+
body: TermsAcceptance,
|
|
6550
|
+
response: TermsStatus,
|
|
6551
|
+
status: 200,
|
|
6552
|
+
access: "admin",
|
|
6553
|
+
phase: "S5"
|
|
6554
|
+
}
|
|
6555
|
+
};
|
|
6556
|
+
var domainBuyingRoutes = {
|
|
6557
|
+
"domains.search": {
|
|
6558
|
+
method: "GET",
|
|
6559
|
+
path: "/v1/domains/search",
|
|
6560
|
+
query: DomainSearchQuery,
|
|
6561
|
+
response: DomainSearchResult,
|
|
6562
|
+
status: 200,
|
|
6563
|
+
access: "admin",
|
|
6564
|
+
phase: "S5"
|
|
6565
|
+
},
|
|
6566
|
+
"domainOrders.create": {
|
|
6567
|
+
method: "POST",
|
|
6568
|
+
path: "/v1/domain-orders",
|
|
6569
|
+
body: DomainOrderCreate,
|
|
6570
|
+
response: DomainOrder,
|
|
6571
|
+
status: 201,
|
|
6572
|
+
access: "admin",
|
|
6573
|
+
phase: "S5"
|
|
6574
|
+
},
|
|
6575
|
+
"domainOrders.list": {
|
|
6576
|
+
method: "GET",
|
|
6577
|
+
path: "/v1/domain-orders",
|
|
6578
|
+
query: PageQuery,
|
|
6579
|
+
response: list(DomainOrder),
|
|
6580
|
+
status: 200,
|
|
6581
|
+
access: "admin",
|
|
6582
|
+
phase: "S5"
|
|
6583
|
+
},
|
|
6584
|
+
"domainOrders.get": {
|
|
6585
|
+
method: "GET",
|
|
6586
|
+
path: "/v1/domain-orders/:id",
|
|
6587
|
+
params: IdParams,
|
|
6588
|
+
response: DomainOrder,
|
|
6589
|
+
status: 200,
|
|
6590
|
+
access: "admin",
|
|
6591
|
+
phase: "S5"
|
|
6429
6592
|
}
|
|
6430
6593
|
};
|
|
6431
6594
|
var inviteRoutes = {
|
|
@@ -6537,7 +6700,7 @@ var automationRoutes = {
|
|
|
6537
6700
|
method: "POST",
|
|
6538
6701
|
path: "/v1/automations/:id/pause",
|
|
6539
6702
|
params: IdParams,
|
|
6540
|
-
body:
|
|
6703
|
+
body: import_zod20.z.object({}).strict(),
|
|
6541
6704
|
response: Automation,
|
|
6542
6705
|
status: 200,
|
|
6543
6706
|
access: "write",
|
|
@@ -6547,7 +6710,7 @@ var automationRoutes = {
|
|
|
6547
6710
|
method: "POST",
|
|
6548
6711
|
path: "/v1/automations/:id/resume",
|
|
6549
6712
|
params: IdParams,
|
|
6550
|
-
body:
|
|
6713
|
+
body: import_zod20.z.object({}).strict(),
|
|
6551
6714
|
response: Automation,
|
|
6552
6715
|
status: 200,
|
|
6553
6716
|
access: "write",
|
|
@@ -6557,7 +6720,7 @@ var automationRoutes = {
|
|
|
6557
6720
|
method: "POST",
|
|
6558
6721
|
path: "/v1/automations/:id/archive",
|
|
6559
6722
|
params: IdParams,
|
|
6560
|
-
body:
|
|
6723
|
+
body: import_zod20.z.object({}).strict(),
|
|
6561
6724
|
response: Automation,
|
|
6562
6725
|
status: 200,
|
|
6563
6726
|
access: "write",
|
|
@@ -6672,10 +6835,13 @@ var routes = {
|
|
|
6672
6835
|
...inviteRoutes,
|
|
6673
6836
|
...platformRoutes,
|
|
6674
6837
|
...billingRoutes,
|
|
6838
|
+
...domainBuyingRoutes,
|
|
6675
6839
|
...automationRoutes
|
|
6676
6840
|
};
|
|
6677
6841
|
var TRUSTED_APP_OPERATIONS = {
|
|
6678
|
-
booking: ["workspaces.list", "workspace.update", "providers.list", "sendingDomains.list", "apiKeys.create", "apiKeys.revoke"]
|
|
6842
|
+
booking: ["workspaces.list", "workspace.update", "providers.list", "sendingDomains.list", "apiKeys.create", "apiKeys.revoke"],
|
|
6843
|
+
// The shop's receipt email needs exactly what connecting a booking page needs.
|
|
6844
|
+
sites: ["workspaces.list", "workspace.update", "providers.list", "sendingDomains.list", "apiKeys.create", "apiKeys.revoke"]
|
|
6679
6845
|
};
|
|
6680
6846
|
function trustedAppMayCall(app, id) {
|
|
6681
6847
|
return TRUSTED_APP_OPERATIONS[app].includes(id);
|
|
@@ -6837,10 +7003,24 @@ function matchRoute(method, pathname) {
|
|
|
6837
7003
|
DEFAULT_INVITE_TTL_DAYS,
|
|
6838
7004
|
DEFAULT_PAGE_LIMIT,
|
|
6839
7005
|
DOCUMENT_SCHEMA_VERSIONS,
|
|
7006
|
+
DOMAIN_BUYING_BLOCKS,
|
|
7007
|
+
DOMAIN_BUYING_NOT_CONFIGURED_REASON,
|
|
7008
|
+
DOMAIN_ORDER_STATES,
|
|
7009
|
+
DOMAIN_PRICE_CHANGED_REASON,
|
|
7010
|
+
DOMAIN_UNAVAILABLE_REASONS,
|
|
6840
7011
|
DateOnly,
|
|
6841
7012
|
DatePassedAnswer,
|
|
6842
7013
|
DelayStep,
|
|
6843
7014
|
DocumentSchemaVersion,
|
|
7015
|
+
DomainBuyingBlock,
|
|
7016
|
+
DomainOffer,
|
|
7017
|
+
DomainOrder,
|
|
7018
|
+
DomainOrderCreate,
|
|
7019
|
+
DomainOrderState,
|
|
7020
|
+
DomainRegistrant,
|
|
7021
|
+
DomainSearchQuery,
|
|
7022
|
+
DomainSearchResult,
|
|
7023
|
+
DomainUnavailableReason,
|
|
6844
7024
|
EDITABLE_MAILING_STATUSES,
|
|
6845
7025
|
ERROR_CODES,
|
|
6846
7026
|
ERROR_STATUS,
|
|
@@ -6924,6 +7104,7 @@ function matchRoute(method, pathname) {
|
|
|
6924
7104
|
MAX_ASSET_BYTES,
|
|
6925
7105
|
MAX_DELAY_SECONDS,
|
|
6926
7106
|
MAX_DOCUMENT_BYTES,
|
|
7107
|
+
MAX_DOMAIN_ORDERS_PER_DAY,
|
|
6927
7108
|
MAX_ENGAGEMENT_DAYS,
|
|
6928
7109
|
MAX_EXPORT_WARNINGS_HEADER_LENGTH,
|
|
6929
7110
|
MAX_EXTRA_SENDING_DOMAINS,
|
|
@@ -7157,6 +7338,8 @@ function matchRoute(method, pathname) {
|
|
|
7157
7338
|
TemplateUpdatedData,
|
|
7158
7339
|
TemplateVersion,
|
|
7159
7340
|
TemplateVersionParams,
|
|
7341
|
+
TermsAcceptance,
|
|
7342
|
+
TermsStatus,
|
|
7160
7343
|
TimeOfDay,
|
|
7161
7344
|
Timestamp,
|
|
7162
7345
|
TimezoneName,
|
|
@@ -7232,6 +7415,7 @@ function matchRoute(method, pathname) {
|
|
|
7232
7415
|
demoteForSave,
|
|
7233
7416
|
demotedBySave,
|
|
7234
7417
|
describeMissingTexts,
|
|
7418
|
+
domainBuyingRoutes,
|
|
7235
7419
|
draftDocument,
|
|
7236
7420
|
draftInsertionProblems,
|
|
7237
7421
|
draftsDirty,
|