@marlinjai/mail-contract 0.20.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 +771 -59
- package/dist/index.d.ts +771 -59
- package/dist/index.js +353 -186
- package/dist/index.mjs +337 -186
- 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,
|
|
@@ -539,6 +554,7 @@ __export(index_exports, {
|
|
|
539
554
|
demoteForSave: () => demoteForSave,
|
|
540
555
|
demotedBySave: () => demotedBySave,
|
|
541
556
|
describeMissingTexts: () => describeMissingTexts,
|
|
557
|
+
domainBuyingRoutes: () => domainBuyingRoutes,
|
|
542
558
|
draftDocument: () => draftDocument,
|
|
543
559
|
draftInsertionProblems: () => draftInsertionProblems,
|
|
544
560
|
draftsDirty: () => draftsDirty,
|
|
@@ -789,8 +805,11 @@ var RETRYABLE_ERRORS = [
|
|
|
789
805
|
"service_unavailable"
|
|
790
806
|
];
|
|
791
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];
|
|
792
811
|
function isRetryableError(code, details) {
|
|
793
|
-
return RETRYABLE_ERRORS.includes(code) && details?.reason
|
|
812
|
+
return RETRYABLE_ERRORS.includes(code) && !LASTING_REASONS.includes(details?.reason);
|
|
794
813
|
}
|
|
795
814
|
|
|
796
815
|
// src/headers.ts
|
|
@@ -3443,7 +3462,7 @@ var EventListQuery = PageQuery.extend({
|
|
|
3443
3462
|
|
|
3444
3463
|
// src/legal.ts
|
|
3445
3464
|
var import_zod11 = require("zod");
|
|
3446
|
-
var LEGAL_TERMS_VERSION = "2026-10-
|
|
3465
|
+
var LEGAL_TERMS_VERSION = "2026-10-28";
|
|
3447
3466
|
var AcceptTerms = import_zod11.z.literal(LEGAL_TERMS_VERSION, {
|
|
3448
3467
|
errorMap: () => ({ message: `must be "${LEGAL_TERMS_VERSION}": accept the current terms of service and processing agreement` })
|
|
3449
3468
|
});
|
|
@@ -3696,6 +3715,14 @@ var AUDIT_ACTIONS = [
|
|
|
3696
3715
|
"billing.exemption_changed",
|
|
3697
3716
|
"billing.extra_sending_domains_changed",
|
|
3698
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",
|
|
3699
3726
|
// A1: automations
|
|
3700
3727
|
"automation.created",
|
|
3701
3728
|
"automation.updated",
|
|
@@ -3710,7 +3737,7 @@ var AUDIT_ACTIONS = [
|
|
|
3710
3737
|
"event.recorded"
|
|
3711
3738
|
];
|
|
3712
3739
|
var AuditAction = import_zod12.z.enum(AUDIT_ACTIONS);
|
|
3713
|
-
var TRUSTED_APPS = ["booking"];
|
|
3740
|
+
var TRUSTED_APPS = ["booking", "sites"];
|
|
3714
3741
|
var TrustedApp = import_zod12.z.enum(TRUSTED_APPS);
|
|
3715
3742
|
var AuditActor = import_zod12.z.discriminatedUnion("type", [
|
|
3716
3743
|
import_zod12.z.object({
|
|
@@ -4619,36 +4646,119 @@ function senderOnDomain(input, ctx) {
|
|
|
4619
4646
|
var SendingDomainCreate = import_zod15.z.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
|
|
4620
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");
|
|
4621
4648
|
|
|
4622
|
-
// src/
|
|
4649
|
+
// src/domains.ts
|
|
4623
4650
|
var import_zod16 = require("zod");
|
|
4624
|
-
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({
|
|
4625
4735
|
id: Id,
|
|
4626
4736
|
slug: Slug,
|
|
4627
|
-
name:
|
|
4737
|
+
name: import_zod17.z.string().min(1).max(120),
|
|
4628
4738
|
/** Shown on the hosted preference page. */
|
|
4629
|
-
description:
|
|
4739
|
+
description: import_zod17.z.string().max(1e3).nullable(),
|
|
4630
4740
|
/** Translations of `name` and `description` per locale, for the hosted page. */
|
|
4631
|
-
translations:
|
|
4632
|
-
|
|
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() })
|
|
4633
4743
|
),
|
|
4634
4744
|
created_at: Timestamp,
|
|
4635
4745
|
updated_at: Timestamp
|
|
4636
4746
|
});
|
|
4637
|
-
var TopicCreate =
|
|
4747
|
+
var TopicCreate = import_zod17.z.object({
|
|
4638
4748
|
slug: Slug,
|
|
4639
|
-
name:
|
|
4640
|
-
description:
|
|
4749
|
+
name: import_zod17.z.string().min(1).max(120),
|
|
4750
|
+
description: import_zod17.z.string().max(1e3).optional(),
|
|
4641
4751
|
translations: Topic.shape.translations.optional()
|
|
4642
4752
|
});
|
|
4643
4753
|
var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
4644
|
-
var Contact =
|
|
4754
|
+
var Contact = import_zod17.z.object({
|
|
4645
4755
|
id: Id,
|
|
4646
|
-
external_id:
|
|
4756
|
+
external_id: import_zod17.z.string().min(1).max(255).nullable(),
|
|
4647
4757
|
/** Stored lowercased, unique per workspace. */
|
|
4648
4758
|
email: Email,
|
|
4649
|
-
first_name:
|
|
4650
|
-
last_name:
|
|
4651
|
-
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(),
|
|
4652
4762
|
/**
|
|
4653
4763
|
* The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
|
|
4654
4764
|
* Every wall clock an automation waits for is read in it, falling back to the
|
|
@@ -4656,65 +4766,65 @@ var Contact = import_zod16.z.object({
|
|
|
4656
4766
|
*/
|
|
4657
4767
|
timezone: TimezoneName.nullable(),
|
|
4658
4768
|
properties: Properties,
|
|
4659
|
-
topics:
|
|
4769
|
+
topics: import_zod17.z.array(Slug),
|
|
4660
4770
|
/** The slugs of the contact's tags (S4). */
|
|
4661
|
-
tags:
|
|
4771
|
+
tags: import_zod17.z.array(Slug),
|
|
4662
4772
|
created_at: Timestamp,
|
|
4663
4773
|
updated_at: Timestamp
|
|
4664
4774
|
});
|
|
4665
|
-
var ContactUpsert =
|
|
4666
|
-
external_id:
|
|
4775
|
+
var ContactUpsert = import_zod17.z.object({
|
|
4776
|
+
external_id: import_zod17.z.string().min(1).max(255).optional(),
|
|
4667
4777
|
email: Email.optional(),
|
|
4668
|
-
first_name:
|
|
4669
|
-
last_name:
|
|
4670
|
-
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(),
|
|
4671
4781
|
timezone: TimezoneName.nullable().optional(),
|
|
4672
4782
|
properties: Properties.optional(),
|
|
4673
|
-
topics:
|
|
4783
|
+
topics: import_zod17.z.array(Slug).max(100).optional()
|
|
4674
4784
|
}).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
|
|
4675
4785
|
message: "external_id or email is required",
|
|
4676
4786
|
path: ["email"]
|
|
4677
4787
|
});
|
|
4678
|
-
var ContactUpsertResult =
|
|
4788
|
+
var ContactUpsertResult = import_zod17.z.object({
|
|
4679
4789
|
contact: Contact,
|
|
4680
|
-
created:
|
|
4790
|
+
created: import_zod17.z.boolean()
|
|
4681
4791
|
});
|
|
4682
4792
|
var ContactListQuery = PageQuery.extend({
|
|
4683
|
-
email:
|
|
4684
|
-
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(),
|
|
4685
4795
|
topic: Slug.optional()
|
|
4686
4796
|
});
|
|
4687
|
-
var ContactErased =
|
|
4688
|
-
ok:
|
|
4689
|
-
erased_messages:
|
|
4690
|
-
erased_recipients:
|
|
4691
|
-
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)
|
|
4692
4802
|
});
|
|
4693
4803
|
var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
|
|
4694
|
-
var SuppressionReason =
|
|
4695
|
-
var Suppression =
|
|
4804
|
+
var SuppressionReason = import_zod17.z.enum(SUPPRESSION_REASONS);
|
|
4805
|
+
var Suppression = import_zod17.z.object({
|
|
4696
4806
|
id: Id,
|
|
4697
4807
|
email: Email,
|
|
4698
4808
|
reason: SuppressionReason,
|
|
4699
4809
|
topic: Slug.nullable(),
|
|
4700
4810
|
source_message_id: Id.nullable(),
|
|
4701
|
-
note:
|
|
4811
|
+
note: import_zod17.z.string().max(1e3).nullable(),
|
|
4702
4812
|
created_at: Timestamp
|
|
4703
4813
|
});
|
|
4704
|
-
var SuppressionCreate =
|
|
4814
|
+
var SuppressionCreate = import_zod17.z.object({
|
|
4705
4815
|
email: Email,
|
|
4706
|
-
reason:
|
|
4816
|
+
reason: import_zod17.z.enum(["manual", "unsubscribed"]),
|
|
4707
4817
|
topic: Slug.nullable().optional(),
|
|
4708
|
-
note:
|
|
4818
|
+
note: import_zod17.z.string().max(1e3).optional()
|
|
4709
4819
|
});
|
|
4710
4820
|
var SuppressionListQuery = PageQuery.extend({
|
|
4711
|
-
email:
|
|
4821
|
+
email: import_zod17.z.string().min(1).max(254).optional(),
|
|
4712
4822
|
reason: SuppressionReason.optional(),
|
|
4713
4823
|
topic: Slug.optional()
|
|
4714
4824
|
});
|
|
4715
4825
|
|
|
4716
4826
|
// src/webhooks.ts
|
|
4717
|
-
var
|
|
4827
|
+
var import_zod18 = require("zod");
|
|
4718
4828
|
var WEBHOOK_EVENT_TYPES = [
|
|
4719
4829
|
"message.sent",
|
|
4720
4830
|
"message.failed",
|
|
@@ -4758,23 +4868,23 @@ var WEBHOOK_EVENT_TYPES = [
|
|
|
4758
4868
|
"template.updated",
|
|
4759
4869
|
"template.deleted"
|
|
4760
4870
|
];
|
|
4761
|
-
var WebhookEventType =
|
|
4762
|
-
var MessageEventBase =
|
|
4871
|
+
var WebhookEventType = import_zod18.z.enum(WEBHOOK_EVENT_TYPES);
|
|
4872
|
+
var MessageEventBase = import_zod18.z.object({
|
|
4763
4873
|
message_id: Id,
|
|
4764
4874
|
mailing_id: Id.nullable(),
|
|
4765
4875
|
mailing_metadata: MailingMetadata.nullable(),
|
|
4766
4876
|
recipient_id: Id.nullable(),
|
|
4767
4877
|
contact_id: Id.nullable(),
|
|
4768
|
-
external_id:
|
|
4878
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4769
4879
|
email: Email,
|
|
4770
|
-
subject:
|
|
4880
|
+
subject: import_zod18.z.string(),
|
|
4771
4881
|
topic: Slug.nullable(),
|
|
4772
|
-
provider_message_id:
|
|
4773
|
-
is_test:
|
|
4882
|
+
provider_message_id: import_zod18.z.string().nullable(),
|
|
4883
|
+
is_test: import_zod18.z.boolean()
|
|
4774
4884
|
});
|
|
4775
4885
|
var MessageSentData = MessageEventBase.extend({
|
|
4776
4886
|
/** The final HTML as sent, so the client can archive it beside its own records. */
|
|
4777
|
-
html:
|
|
4887
|
+
html: import_zod18.z.string(),
|
|
4778
4888
|
sent_at: Timestamp,
|
|
4779
4889
|
/**
|
|
4780
4890
|
* The choice each insertion made (see `Message.insertions`); absent or null
|
|
@@ -4785,20 +4895,20 @@ var MessageSentData = MessageEventBase.extend({
|
|
|
4785
4895
|
insertions: InsertionChoices.nullish()
|
|
4786
4896
|
});
|
|
4787
4897
|
var MessageFailedData = MessageEventBase.extend({
|
|
4788
|
-
error:
|
|
4898
|
+
error: import_zod18.z.string(),
|
|
4789
4899
|
/** False when the provider rejected permanently; the recipient will not be retried. */
|
|
4790
|
-
retryable:
|
|
4900
|
+
retryable: import_zod18.z.boolean(),
|
|
4791
4901
|
failed_at: Timestamp
|
|
4792
4902
|
});
|
|
4793
4903
|
var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
|
|
4794
|
-
var ContactUnsubscribedData =
|
|
4904
|
+
var ContactUnsubscribedData = import_zod18.z.object({
|
|
4795
4905
|
contact_id: Id.nullable(),
|
|
4796
|
-
external_id:
|
|
4906
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4797
4907
|
email: Email,
|
|
4798
4908
|
/** The topic unsubscribed from; null means every topic. */
|
|
4799
4909
|
topic: Slug.nullable(),
|
|
4800
4910
|
mailing_id: Id.nullable(),
|
|
4801
|
-
source:
|
|
4911
|
+
source: import_zod18.z.enum(UNSUBSCRIBE_SOURCES),
|
|
4802
4912
|
unsubscribed_at: Timestamp
|
|
4803
4913
|
});
|
|
4804
4914
|
var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
|
|
@@ -4807,142 +4917,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
|
|
|
4807
4917
|
* breaker undid a `bounced` block it judged false (a `contact.bounced` for the
|
|
4808
4918
|
* same address and mailing went out before); `topic` is null.
|
|
4809
4919
|
*/
|
|
4810
|
-
source:
|
|
4920
|
+
source: import_zod18.z.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
|
|
4811
4921
|
resubscribed_at: Timestamp
|
|
4812
4922
|
});
|
|
4813
|
-
var ContactBouncedData =
|
|
4923
|
+
var ContactBouncedData = import_zod18.z.object({
|
|
4814
4924
|
contact_id: Id.nullable(),
|
|
4815
|
-
external_id:
|
|
4925
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4816
4926
|
email: Email,
|
|
4817
4927
|
/** `bounced` for a hard bounce, `complained` for a spam complaint. */
|
|
4818
|
-
reason:
|
|
4928
|
+
reason: import_zod18.z.enum(["bounced", "complained"]),
|
|
4819
4929
|
message_id: Id.nullable(),
|
|
4820
|
-
diagnostic:
|
|
4930
|
+
diagnostic: import_zod18.z.string().nullable(),
|
|
4821
4931
|
bounced_at: Timestamp
|
|
4822
4932
|
});
|
|
4823
|
-
var MailingFinishedData =
|
|
4933
|
+
var MailingFinishedData = import_zod18.z.object({
|
|
4824
4934
|
mailing_id: Id,
|
|
4825
4935
|
mailing_metadata: MailingMetadata,
|
|
4826
|
-
status:
|
|
4936
|
+
status: import_zod18.z.enum(["sent", "partially_failed", "cancelled"]),
|
|
4827
4937
|
counts: MailingCounts,
|
|
4828
4938
|
finished_at: Timestamp
|
|
4829
4939
|
});
|
|
4830
|
-
var ContactSubscribedData =
|
|
4940
|
+
var ContactSubscribedData = import_zod18.z.object({
|
|
4831
4941
|
contact_id: Id,
|
|
4832
|
-
external_id:
|
|
4942
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4833
4943
|
email: Email,
|
|
4834
|
-
topics:
|
|
4835
|
-
source:
|
|
4944
|
+
topics: import_zod18.z.array(Slug),
|
|
4945
|
+
source: import_zod18.z.enum(["signup_form", "api", "dashboard", "automation"]),
|
|
4836
4946
|
signup_form_id: Id.nullable(),
|
|
4837
|
-
signup_form_version:
|
|
4947
|
+
signup_form_version: import_zod18.z.number().int().min(1).nullable(),
|
|
4838
4948
|
subscribed_at: Timestamp
|
|
4839
4949
|
});
|
|
4840
|
-
var ImportFinishedData =
|
|
4950
|
+
var ImportFinishedData = import_zod18.z.object({
|
|
4841
4951
|
import_id: Id,
|
|
4842
|
-
status:
|
|
4952
|
+
status: import_zod18.z.enum(["completed", "cancelled", "failed"]),
|
|
4843
4953
|
result: ImportReport.nullable(),
|
|
4844
|
-
error:
|
|
4954
|
+
error: import_zod18.z.string().nullable(),
|
|
4845
4955
|
finished_at: Timestamp
|
|
4846
4956
|
});
|
|
4847
|
-
var MailingScheduledData =
|
|
4957
|
+
var MailingScheduledData = import_zod18.z.object({
|
|
4848
4958
|
mailing_id: Id,
|
|
4849
4959
|
mailing_metadata: MailingMetadata,
|
|
4850
4960
|
scheduled_at: Timestamp.nullable()
|
|
4851
4961
|
});
|
|
4852
|
-
var MailingStartedData =
|
|
4962
|
+
var MailingStartedData = import_zod18.z.object({
|
|
4853
4963
|
mailing_id: Id,
|
|
4854
4964
|
mailing_metadata: MailingMetadata,
|
|
4855
|
-
trigger:
|
|
4856
|
-
recipients:
|
|
4965
|
+
trigger: import_zod18.z.enum(["send", "schedule"]),
|
|
4966
|
+
recipients: import_zod18.z.number().int().min(0),
|
|
4857
4967
|
started_at: Timestamp
|
|
4858
4968
|
});
|
|
4859
|
-
var MailingScheduleFailedData =
|
|
4969
|
+
var MailingScheduleFailedData = import_zod18.z.object({
|
|
4860
4970
|
mailing_id: Id,
|
|
4861
4971
|
mailing_metadata: MailingMetadata,
|
|
4862
|
-
code:
|
|
4863
|
-
message:
|
|
4972
|
+
code: import_zod18.z.string(),
|
|
4973
|
+
message: import_zod18.z.string(),
|
|
4864
4974
|
failed_at: Timestamp
|
|
4865
4975
|
});
|
|
4866
|
-
var MailingAbWinnerSelectedData =
|
|
4976
|
+
var MailingAbWinnerSelectedData = import_zod18.z.object({
|
|
4867
4977
|
mailing_id: Id,
|
|
4868
4978
|
mailing_metadata: MailingMetadata,
|
|
4869
|
-
winner:
|
|
4870
|
-
decided_by:
|
|
4871
|
-
variants:
|
|
4979
|
+
winner: import_zod18.z.string(),
|
|
4980
|
+
decided_by: import_zod18.z.enum(["metric", "manual"]),
|
|
4981
|
+
variants: import_zod18.z.array(VariantAnalytics),
|
|
4872
4982
|
decided_at: Timestamp
|
|
4873
4983
|
});
|
|
4874
|
-
var ContactTaggedData =
|
|
4984
|
+
var ContactTaggedData = import_zod18.z.object({
|
|
4875
4985
|
contact_id: Id,
|
|
4876
|
-
external_id:
|
|
4986
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4877
4987
|
email: Email,
|
|
4878
4988
|
/** Only the tags the contact did not already have. */
|
|
4879
|
-
tags:
|
|
4880
|
-
source:
|
|
4989
|
+
tags: import_zod18.z.array(Slug).min(1),
|
|
4990
|
+
source: import_zod18.z.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4881
4991
|
tagged_at: Timestamp
|
|
4882
4992
|
});
|
|
4883
|
-
var ContactUpdatedData =
|
|
4993
|
+
var ContactUpdatedData = import_zod18.z.object({
|
|
4884
4994
|
contact_id: Id,
|
|
4885
|
-
external_id:
|
|
4995
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4886
4996
|
email: Email,
|
|
4887
|
-
changed:
|
|
4997
|
+
changed: import_zod18.z.array(import_zod18.z.string()).min(1),
|
|
4888
4998
|
properties: Properties,
|
|
4889
|
-
source:
|
|
4999
|
+
source: import_zod18.z.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4890
5000
|
updated_at: Timestamp
|
|
4891
5001
|
});
|
|
4892
|
-
var AutomationRunEventBase =
|
|
5002
|
+
var AutomationRunEventBase = import_zod18.z.object({
|
|
4893
5003
|
automation_id: Id,
|
|
4894
|
-
automation_name:
|
|
5004
|
+
automation_name: import_zod18.z.string(),
|
|
4895
5005
|
run_id: Id,
|
|
4896
|
-
version:
|
|
5006
|
+
version: import_zod18.z.number().int().min(1),
|
|
4897
5007
|
contact_id: Id,
|
|
4898
|
-
external_id:
|
|
5008
|
+
external_id: import_zod18.z.string().nullable(),
|
|
4899
5009
|
email: Email
|
|
4900
5010
|
});
|
|
4901
5011
|
var AutomationRunStartedData = AutomationRunEventBase.extend({
|
|
4902
5012
|
/** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
|
|
4903
|
-
trigger_kind:
|
|
5013
|
+
trigger_kind: import_zod18.z.string(),
|
|
4904
5014
|
entered_at: Timestamp
|
|
4905
5015
|
});
|
|
4906
5016
|
var AutomationRunCompletedData = AutomationRunEventBase.extend({
|
|
4907
|
-
last_step_id:
|
|
5017
|
+
last_step_id: import_zod18.z.string().nullable(),
|
|
4908
5018
|
completed_at: Timestamp
|
|
4909
5019
|
});
|
|
4910
5020
|
var AutomationRunExitedData = AutomationRunEventBase.extend({
|
|
4911
5021
|
reason: AutomationEndReason,
|
|
4912
|
-
step_id:
|
|
5022
|
+
step_id: import_zod18.z.string().nullable(),
|
|
4913
5023
|
exited_at: Timestamp
|
|
4914
5024
|
});
|
|
4915
5025
|
var AutomationRunFailedData = AutomationRunEventBase.extend({
|
|
4916
|
-
reason:
|
|
4917
|
-
step_id:
|
|
5026
|
+
reason: import_zod18.z.string(),
|
|
5027
|
+
step_id: import_zod18.z.string().nullable(),
|
|
4918
5028
|
failed_at: Timestamp
|
|
4919
5029
|
});
|
|
4920
5030
|
var AutomationWebhookData = AutomationRunEventBase.extend({
|
|
4921
|
-
step_id:
|
|
5031
|
+
step_id: import_zod18.z.string(),
|
|
4922
5032
|
/** The step's own label, when it was given one, so a receiver can branch on a name. */
|
|
4923
|
-
step_label:
|
|
5033
|
+
step_label: import_zod18.z.string().nullable(),
|
|
4924
5034
|
/** Whatever the step carries, verbatim. Null when it carries nothing. */
|
|
4925
5035
|
payload: JsonValue.nullable(),
|
|
4926
5036
|
fired_at: Timestamp
|
|
4927
5037
|
});
|
|
4928
|
-
var TemplateEventBase =
|
|
5038
|
+
var TemplateEventBase = import_zod18.z.object({
|
|
4929
5039
|
template_id: Id,
|
|
4930
|
-
name:
|
|
4931
|
-
version:
|
|
4932
|
-
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"])
|
|
4933
5043
|
});
|
|
4934
5044
|
var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
|
|
4935
|
-
var TemplateUpdatedData = TemplateEventBase.extend({ archived:
|
|
5045
|
+
var TemplateUpdatedData = TemplateEventBase.extend({ archived: import_zod18.z.boolean(), updated_at: Timestamp });
|
|
4936
5046
|
var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
|
|
4937
|
-
var envelope = (type, data) =>
|
|
5047
|
+
var envelope = (type, data) => import_zod18.z.object({
|
|
4938
5048
|
/** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
|
|
4939
5049
|
id: Id,
|
|
4940
|
-
type:
|
|
5050
|
+
type: import_zod18.z.literal(type),
|
|
4941
5051
|
created_at: Timestamp,
|
|
4942
5052
|
workspace_id: Id,
|
|
4943
5053
|
data
|
|
4944
5054
|
});
|
|
4945
|
-
var WebhookEvent =
|
|
5055
|
+
var WebhookEvent = import_zod18.z.discriminatedUnion("type", [
|
|
4946
5056
|
envelope("message.sent", MessageSentData),
|
|
4947
5057
|
envelope("message.failed", MessageFailedData),
|
|
4948
5058
|
envelope("contact.unsubscribed", ContactUnsubscribedData),
|
|
@@ -4966,16 +5076,16 @@ var WebhookEvent = import_zod17.z.discriminatedUnion("type", [
|
|
|
4966
5076
|
envelope("template.updated", TemplateUpdatedData),
|
|
4967
5077
|
envelope("template.deleted", TemplateDeletedData)
|
|
4968
5078
|
]);
|
|
4969
|
-
var WebhookEndpoint =
|
|
5079
|
+
var WebhookEndpoint = import_zod18.z.object({
|
|
4970
5080
|
id: Id,
|
|
4971
|
-
url:
|
|
4972
|
-
description:
|
|
4973
|
-
events:
|
|
4974
|
-
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(),
|
|
4975
5085
|
created_at: Timestamp,
|
|
4976
5086
|
updated_at: Timestamp
|
|
4977
5087
|
});
|
|
4978
|
-
var WebhookUrl =
|
|
5088
|
+
var WebhookUrl = import_zod18.z.string().url().refine((u) => {
|
|
4979
5089
|
try {
|
|
4980
5090
|
const url = new URL(u);
|
|
4981
5091
|
if (url.protocol === "https:") return true;
|
|
@@ -4984,35 +5094,35 @@ var WebhookUrl = import_zod17.z.string().url().refine((u) => {
|
|
|
4984
5094
|
return false;
|
|
4985
5095
|
}
|
|
4986
5096
|
}, "must be https (http only for localhost)");
|
|
4987
|
-
var WebhookEndpointCreate =
|
|
5097
|
+
var WebhookEndpointCreate = import_zod18.z.object({
|
|
4988
5098
|
url: WebhookUrl,
|
|
4989
|
-
description:
|
|
4990
|
-
events:
|
|
4991
|
-
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()
|
|
4992
5102
|
});
|
|
4993
|
-
var WebhookEndpointUpdate =
|
|
5103
|
+
var WebhookEndpointUpdate = import_zod18.z.object({
|
|
4994
5104
|
url: WebhookUrl,
|
|
4995
|
-
description:
|
|
4996
|
-
events:
|
|
4997
|
-
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()
|
|
4998
5108
|
}).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
4999
|
-
var WebhookEndpointWithSecret =
|
|
5109
|
+
var WebhookEndpointWithSecret = import_zod18.z.object({
|
|
5000
5110
|
endpoint: WebhookEndpoint,
|
|
5001
|
-
secret:
|
|
5111
|
+
secret: import_zod18.z.string().min(32)
|
|
5002
5112
|
});
|
|
5003
5113
|
var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
|
|
5004
|
-
var WebhookDeliveryStatus =
|
|
5114
|
+
var WebhookDeliveryStatus = import_zod18.z.enum(WEBHOOK_DELIVERY_STATUSES);
|
|
5005
5115
|
var WEBHOOK_MAX_ATTEMPTS = 8;
|
|
5006
5116
|
var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
|
|
5007
|
-
var WebhookDelivery =
|
|
5117
|
+
var WebhookDelivery = import_zod18.z.object({
|
|
5008
5118
|
id: Id,
|
|
5009
5119
|
endpoint_id: Id,
|
|
5010
5120
|
event_id: Id,
|
|
5011
5121
|
event_type: WebhookEventType,
|
|
5012
5122
|
status: WebhookDeliveryStatus,
|
|
5013
|
-
attempts:
|
|
5014
|
-
last_status_code:
|
|
5015
|
-
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(),
|
|
5016
5126
|
next_attempt_at: Timestamp.nullable(),
|
|
5017
5127
|
delivered_at: Timestamp.nullable(),
|
|
5018
5128
|
created_at: Timestamp
|
|
@@ -5021,7 +5131,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
|
|
|
5021
5131
|
status: WebhookDeliveryStatus.optional(),
|
|
5022
5132
|
event_type: WebhookEventType.optional()
|
|
5023
5133
|
});
|
|
5024
|
-
var WebhookDeliveryParams =
|
|
5134
|
+
var WebhookDeliveryParams = import_zod18.z.object({ id: Id, delivery_id: Id });
|
|
5025
5135
|
|
|
5026
5136
|
// src/webhook-signing.ts
|
|
5027
5137
|
var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
|
|
@@ -5088,99 +5198,99 @@ async function verifyWebhook(input) {
|
|
|
5088
5198
|
}
|
|
5089
5199
|
|
|
5090
5200
|
// src/billing.ts
|
|
5091
|
-
var
|
|
5201
|
+
var import_zod19 = require("zod");
|
|
5092
5202
|
var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
|
|
5093
|
-
var PlanId =
|
|
5094
|
-
var PlanLimits =
|
|
5095
|
-
monthly_messages:
|
|
5096
|
-
contacts:
|
|
5097
|
-
members:
|
|
5098
|
-
providers:
|
|
5099
|
-
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(),
|
|
5100
5210
|
/** Automations that may be live (active or paused) at once (A1). */
|
|
5101
|
-
active_automations:
|
|
5211
|
+
active_automations: import_zod19.z.number().int().min(0).nullable(),
|
|
5102
5212
|
/** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
|
|
5103
|
-
automation_steps:
|
|
5213
|
+
automation_steps: import_zod19.z.number().int().min(1).nullable(),
|
|
5104
5214
|
/** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
|
|
5105
|
-
sending_domains:
|
|
5215
|
+
sending_domains: import_zod19.z.number().int().min(0).nullable()
|
|
5106
5216
|
});
|
|
5107
|
-
var PlanFeatures =
|
|
5217
|
+
var PlanFeatures = import_zod19.z.object({
|
|
5108
5218
|
/** A/B tests of subject and content on a mailing (S4). */
|
|
5109
|
-
ab_testing:
|
|
5219
|
+
ab_testing: import_zod19.z.boolean(),
|
|
5110
5220
|
/** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
|
|
5111
|
-
tracking:
|
|
5221
|
+
tracking: import_zod19.z.boolean(),
|
|
5112
5222
|
/** Automations: flows a person walks through step by step (A1). */
|
|
5113
|
-
automations:
|
|
5223
|
+
automations: import_zod19.z.boolean()
|
|
5114
5224
|
});
|
|
5115
5225
|
var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
|
|
5116
|
-
var Plan =
|
|
5226
|
+
var Plan = import_zod19.z.object({
|
|
5117
5227
|
id: PlanId,
|
|
5118
|
-
name:
|
|
5228
|
+
name: import_zod19.z.string().min(1),
|
|
5119
5229
|
/** Price in the smallest currency unit per month; null for plans not sold. */
|
|
5120
|
-
monthly_price_cents:
|
|
5121
|
-
currency:
|
|
5230
|
+
monthly_price_cents: import_zod19.z.number().int().min(0).nullable(),
|
|
5231
|
+
currency: import_zod19.z.string().length(3),
|
|
5122
5232
|
limits: PlanLimits,
|
|
5123
5233
|
features: PlanFeatures
|
|
5124
5234
|
});
|
|
5125
|
-
var CatalogPlan = Plan.extend({ sellable:
|
|
5126
|
-
var Subscription =
|
|
5235
|
+
var CatalogPlan = Plan.extend({ sellable: import_zod19.z.boolean() });
|
|
5236
|
+
var Subscription = import_zod19.z.object({
|
|
5127
5237
|
workspace_id: Id,
|
|
5128
5238
|
plan: PlanId,
|
|
5129
|
-
status:
|
|
5239
|
+
status: import_zod19.z.enum(["active", "trialing", "past_due", "cancelled"]),
|
|
5130
5240
|
current_period_start: Timestamp,
|
|
5131
5241
|
current_period_end: Timestamp,
|
|
5132
|
-
cancel_at_period_end:
|
|
5242
|
+
cancel_at_period_end: import_zod19.z.boolean(),
|
|
5133
5243
|
/**
|
|
5134
5244
|
* A design partner outside billing (plan `design_partner`, no limits, no
|
|
5135
5245
|
* checkout). Set only by an operator, never through the API.
|
|
5136
5246
|
*/
|
|
5137
|
-
billing_exempt:
|
|
5247
|
+
billing_exempt: import_zod19.z.boolean(),
|
|
5138
5248
|
/**
|
|
5139
5249
|
* Own sending domains bought on top of the plan's included ones (the
|
|
5140
5250
|
* add-on), each a monthly charge on the same subscription. 0 without the
|
|
5141
5251
|
* add-on; the usage limit `sending_domains` is the plan's plus these.
|
|
5142
5252
|
*/
|
|
5143
|
-
extra_sending_domains:
|
|
5253
|
+
extra_sending_domains: import_zod19.z.number().int().min(0)
|
|
5144
5254
|
});
|
|
5145
|
-
var BillingAddons =
|
|
5146
|
-
sending_domain:
|
|
5147
|
-
monthly_price_cents:
|
|
5148
|
-
currency:
|
|
5149
|
-
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()
|
|
5150
5260
|
})
|
|
5151
5261
|
});
|
|
5152
5262
|
var MAX_EXTRA_SENDING_DOMAINS = 100;
|
|
5153
|
-
var ExtraSendingDomainsUpdate =
|
|
5263
|
+
var ExtraSendingDomainsUpdate = import_zod19.z.object({ quantity: import_zod19.z.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
|
|
5154
5264
|
var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
|
|
5155
|
-
var UsageMetric =
|
|
5265
|
+
var UsageMetric = import_zod19.z.enum(USAGE_METRICS);
|
|
5156
5266
|
var USAGE_WARNING_RATIO = 0.8;
|
|
5157
|
-
var UsageWarning =
|
|
5267
|
+
var UsageWarning = import_zod19.z.object({
|
|
5158
5268
|
metric: UsageMetric,
|
|
5159
|
-
used:
|
|
5160
|
-
limit:
|
|
5269
|
+
used: import_zod19.z.number().int().min(0),
|
|
5270
|
+
limit: import_zod19.z.number().int().min(0),
|
|
5161
5271
|
/** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
|
|
5162
|
-
level:
|
|
5272
|
+
level: import_zod19.z.enum(["approaching", "reached"])
|
|
5163
5273
|
});
|
|
5164
|
-
var TermsStatus =
|
|
5165
|
-
var Usage =
|
|
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({
|
|
5166
5276
|
plan: PlanId,
|
|
5167
5277
|
period_start: Timestamp,
|
|
5168
5278
|
period_end: Timestamp,
|
|
5169
|
-
metrics:
|
|
5170
|
-
warnings:
|
|
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),
|
|
5171
5281
|
terms: TermsStatus
|
|
5172
5282
|
});
|
|
5173
|
-
var TermsAcceptance =
|
|
5174
|
-
var CheckoutRequest =
|
|
5175
|
-
plan:
|
|
5176
|
-
success_url:
|
|
5177
|
-
cancel_url:
|
|
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(),
|
|
5178
5288
|
/** The buyer accepted the terms of service and the processing agreement of this version. */
|
|
5179
5289
|
accept_terms: AcceptTerms
|
|
5180
5290
|
});
|
|
5181
|
-
var CheckoutSession =
|
|
5182
|
-
var PortalRequest =
|
|
5183
|
-
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() });
|
|
5184
5294
|
var USAGE_WARNING_HEADER = "x-mail-usage-warning";
|
|
5185
5295
|
function formatUsageWarningHeader(warnings) {
|
|
5186
5296
|
if (warnings.length === 0) return null;
|
|
@@ -5200,7 +5310,7 @@ function parseUsageWarningHeader(value) {
|
|
|
5200
5310
|
}
|
|
5201
5311
|
|
|
5202
5312
|
// src/routes.ts
|
|
5203
|
-
var
|
|
5313
|
+
var import_zod20 = require("zod");
|
|
5204
5314
|
var list = (item) => page(item);
|
|
5205
5315
|
var foundationRoutes = {
|
|
5206
5316
|
"workspaces.create": {
|
|
@@ -5446,7 +5556,7 @@ var templateRoutes = {
|
|
|
5446
5556
|
path: "/v1/templates/:id/export",
|
|
5447
5557
|
params: IdParams,
|
|
5448
5558
|
query: TemplateExportQuery,
|
|
5449
|
-
response:
|
|
5559
|
+
response: import_zod20.z.string(),
|
|
5450
5560
|
responseType: "text",
|
|
5451
5561
|
status: 200,
|
|
5452
5562
|
access: "read",
|
|
@@ -5826,7 +5936,7 @@ var sendingRoutes = {
|
|
|
5826
5936
|
path: "/v1/mailings/:id/export",
|
|
5827
5937
|
params: IdParams,
|
|
5828
5938
|
query: MailingExportQuery,
|
|
5829
|
-
response:
|
|
5939
|
+
response: import_zod20.z.string(),
|
|
5830
5940
|
responseType: "text",
|
|
5831
5941
|
status: 200,
|
|
5832
5942
|
access: "read",
|
|
@@ -6093,7 +6203,7 @@ var platformRoutes = {
|
|
|
6093
6203
|
"contactProperties.list": {
|
|
6094
6204
|
method: "GET",
|
|
6095
6205
|
path: "/v1/contact-properties",
|
|
6096
|
-
response:
|
|
6206
|
+
response: import_zod20.z.object({ data: import_zod20.z.array(ContactPropertyDefinition) }),
|
|
6097
6207
|
status: 200,
|
|
6098
6208
|
access: "read",
|
|
6099
6209
|
phase: "S4"
|
|
@@ -6392,7 +6502,7 @@ var billingRoutes = {
|
|
|
6392
6502
|
"billing.plans": {
|
|
6393
6503
|
method: "GET",
|
|
6394
6504
|
path: "/v1/billing/plans",
|
|
6395
|
-
response:
|
|
6505
|
+
response: import_zod20.z.object({ data: import_zod20.z.array(CatalogPlan), addons: BillingAddons }),
|
|
6396
6506
|
status: 200,
|
|
6397
6507
|
access: "read",
|
|
6398
6508
|
phase: "S5"
|
|
@@ -6443,6 +6553,44 @@ var billingRoutes = {
|
|
|
6443
6553
|
phase: "S5"
|
|
6444
6554
|
}
|
|
6445
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"
|
|
6592
|
+
}
|
|
6593
|
+
};
|
|
6446
6594
|
var inviteRoutes = {
|
|
6447
6595
|
"invites.create": {
|
|
6448
6596
|
method: "POST",
|
|
@@ -6552,7 +6700,7 @@ var automationRoutes = {
|
|
|
6552
6700
|
method: "POST",
|
|
6553
6701
|
path: "/v1/automations/:id/pause",
|
|
6554
6702
|
params: IdParams,
|
|
6555
|
-
body:
|
|
6703
|
+
body: import_zod20.z.object({}).strict(),
|
|
6556
6704
|
response: Automation,
|
|
6557
6705
|
status: 200,
|
|
6558
6706
|
access: "write",
|
|
@@ -6562,7 +6710,7 @@ var automationRoutes = {
|
|
|
6562
6710
|
method: "POST",
|
|
6563
6711
|
path: "/v1/automations/:id/resume",
|
|
6564
6712
|
params: IdParams,
|
|
6565
|
-
body:
|
|
6713
|
+
body: import_zod20.z.object({}).strict(),
|
|
6566
6714
|
response: Automation,
|
|
6567
6715
|
status: 200,
|
|
6568
6716
|
access: "write",
|
|
@@ -6572,7 +6720,7 @@ var automationRoutes = {
|
|
|
6572
6720
|
method: "POST",
|
|
6573
6721
|
path: "/v1/automations/:id/archive",
|
|
6574
6722
|
params: IdParams,
|
|
6575
|
-
body:
|
|
6723
|
+
body: import_zod20.z.object({}).strict(),
|
|
6576
6724
|
response: Automation,
|
|
6577
6725
|
status: 200,
|
|
6578
6726
|
access: "write",
|
|
@@ -6687,10 +6835,13 @@ var routes = {
|
|
|
6687
6835
|
...inviteRoutes,
|
|
6688
6836
|
...platformRoutes,
|
|
6689
6837
|
...billingRoutes,
|
|
6838
|
+
...domainBuyingRoutes,
|
|
6690
6839
|
...automationRoutes
|
|
6691
6840
|
};
|
|
6692
6841
|
var TRUSTED_APP_OPERATIONS = {
|
|
6693
|
-
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"]
|
|
6694
6845
|
};
|
|
6695
6846
|
function trustedAppMayCall(app, id) {
|
|
6696
6847
|
return TRUSTED_APP_OPERATIONS[app].includes(id);
|
|
@@ -6852,10 +7003,24 @@ function matchRoute(method, pathname) {
|
|
|
6852
7003
|
DEFAULT_INVITE_TTL_DAYS,
|
|
6853
7004
|
DEFAULT_PAGE_LIMIT,
|
|
6854
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,
|
|
6855
7011
|
DateOnly,
|
|
6856
7012
|
DatePassedAnswer,
|
|
6857
7013
|
DelayStep,
|
|
6858
7014
|
DocumentSchemaVersion,
|
|
7015
|
+
DomainBuyingBlock,
|
|
7016
|
+
DomainOffer,
|
|
7017
|
+
DomainOrder,
|
|
7018
|
+
DomainOrderCreate,
|
|
7019
|
+
DomainOrderState,
|
|
7020
|
+
DomainRegistrant,
|
|
7021
|
+
DomainSearchQuery,
|
|
7022
|
+
DomainSearchResult,
|
|
7023
|
+
DomainUnavailableReason,
|
|
6859
7024
|
EDITABLE_MAILING_STATUSES,
|
|
6860
7025
|
ERROR_CODES,
|
|
6861
7026
|
ERROR_STATUS,
|
|
@@ -6939,6 +7104,7 @@ function matchRoute(method, pathname) {
|
|
|
6939
7104
|
MAX_ASSET_BYTES,
|
|
6940
7105
|
MAX_DELAY_SECONDS,
|
|
6941
7106
|
MAX_DOCUMENT_BYTES,
|
|
7107
|
+
MAX_DOMAIN_ORDERS_PER_DAY,
|
|
6942
7108
|
MAX_ENGAGEMENT_DAYS,
|
|
6943
7109
|
MAX_EXPORT_WARNINGS_HEADER_LENGTH,
|
|
6944
7110
|
MAX_EXTRA_SENDING_DOMAINS,
|
|
@@ -7249,6 +7415,7 @@ function matchRoute(method, pathname) {
|
|
|
7249
7415
|
demoteForSave,
|
|
7250
7416
|
demotedBySave,
|
|
7251
7417
|
describeMissingTexts,
|
|
7418
|
+
domainBuyingRoutes,
|
|
7252
7419
|
draftDocument,
|
|
7253
7420
|
draftInsertionProblems,
|
|
7254
7421
|
draftsDirty,
|