@marlinjai/mail-contract 0.17.0 → 0.19.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 +63 -18
- package/dist/index.d.ts +63 -18
- package/dist/index.js +365 -332
- package/dist/index.mjs +362 -332
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -151,7 +151,7 @@ var API_VERSION_PREFIX = "/v1";
|
|
|
151
151
|
var HEALTH_PATH = "/healthz";
|
|
152
152
|
|
|
153
153
|
// src/workspace.ts
|
|
154
|
-
import { z as
|
|
154
|
+
import { z as z12 } from "zod";
|
|
155
155
|
|
|
156
156
|
// src/automations.ts
|
|
157
157
|
import { z as z10 } from "zod";
|
|
@@ -2783,16 +2783,23 @@ var EventListQuery = PageQuery.extend({
|
|
|
2783
2783
|
contact_id: Id.optional()
|
|
2784
2784
|
});
|
|
2785
2785
|
|
|
2786
|
+
// src/legal.ts
|
|
2787
|
+
import { z as z11 } from "zod";
|
|
2788
|
+
var LEGAL_TERMS_VERSION = "2026-10-23";
|
|
2789
|
+
var AcceptTerms = z11.literal(LEGAL_TERMS_VERSION, {
|
|
2790
|
+
errorMap: () => ({ message: `must be "${LEGAL_TERMS_VERSION}": accept the current terms of service and processing agreement` })
|
|
2791
|
+
});
|
|
2792
|
+
|
|
2786
2793
|
// src/workspace.ts
|
|
2787
|
-
var CompanyId =
|
|
2794
|
+
var CompanyId = z12.string().min(1).max(64);
|
|
2788
2795
|
var ASSET_POLICIES = ["any", "service_only"];
|
|
2789
|
-
var AssetPolicy =
|
|
2796
|
+
var AssetPolicy = z12.enum(ASSET_POLICIES);
|
|
2790
2797
|
var MAX_ALLOWED_ASSET_HOSTS = 20;
|
|
2791
|
-
var AssetHost =
|
|
2792
|
-
var MergeDefaults =
|
|
2798
|
+
var AssetHost = z12.string().trim().toLowerCase().min(1).max(253).regex(/^(?=.{1,253}(?::\d{1,5})?$)[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+(:\d{1,5})?$/, "a host name such as example.com");
|
|
2799
|
+
var MergeDefaults = z12.record(MergeFieldName, MergeDefaultValue).refine((m) => Object.keys(m).length <= MAX_MERGE_DEFAULTS, `at most ${MAX_MERGE_DEFAULTS} merge defaults`).refine((m) => !Object.keys(m).some((k) => k in RESERVED_MERGE_FIELDS), {
|
|
2793
2800
|
message: `a reserved merge field (${Object.keys(RESERVED_MERGE_FIELDS).join(", ")}) cannot have a workspace default`
|
|
2794
2801
|
});
|
|
2795
|
-
var WorkspaceSettings =
|
|
2802
|
+
var WorkspaceSettings = z12.object({
|
|
2796
2803
|
/**
|
|
2797
2804
|
* The workspace's main language (a {@link LocaleTag}, e.g. "de"): the main
|
|
2798
2805
|
* language of a new template, and of the hosted pages when nothing else
|
|
@@ -2805,9 +2812,9 @@ var WorkspaceSettings = z11.object({
|
|
|
2805
2812
|
* each; the hosted pages are offered in those of them they support (English,
|
|
2806
2813
|
* German, French, Italian, Spanish). The service stores canonical casing.
|
|
2807
2814
|
*/
|
|
2808
|
-
locales:
|
|
2815
|
+
locales: z12.array(LocaleTag).min(1).max(20).refine((l) => new Set(l.map((t) => t.toLowerCase())).size === l.length, "a language appears twice"),
|
|
2809
2816
|
/** Open and click tracking. Off by default, opt-in per workspace. */
|
|
2810
|
-
tracking_enabled:
|
|
2817
|
+
tracking_enabled: z12.boolean(),
|
|
2811
2818
|
/** Where images, stylesheets and fonts in a mail may load from. `any` by default. */
|
|
2812
2819
|
asset_policy: AssetPolicy,
|
|
2813
2820
|
/**
|
|
@@ -2815,7 +2822,7 @@ var WorkspaceSettings = z11.object({
|
|
|
2815
2822
|
* the workspace's website, typically. Empty by default. Ignored under `any`,
|
|
2816
2823
|
* which allows everything already.
|
|
2817
2824
|
*/
|
|
2818
|
-
allowed_asset_hosts:
|
|
2825
|
+
allowed_asset_hosts: z12.array(AssetHost).max(MAX_ALLOWED_ASSET_HOSTS),
|
|
2819
2826
|
/** Merge values every mail of the workspace can use (see `MergeDefaults`). Empty by default. */
|
|
2820
2827
|
merge_defaults: MergeDefaults,
|
|
2821
2828
|
/**
|
|
@@ -2824,10 +2831,10 @@ var WorkspaceSettings = z11.object({
|
|
|
2824
2831
|
*/
|
|
2825
2832
|
default_timezone: TimezoneName.nullable()
|
|
2826
2833
|
});
|
|
2827
|
-
var Workspace =
|
|
2834
|
+
var Workspace = z12.object({
|
|
2828
2835
|
id: Id,
|
|
2829
2836
|
slug: Slug,
|
|
2830
|
-
name:
|
|
2837
|
+
name: z12.string().min(1).max(120),
|
|
2831
2838
|
settings: WorkspaceSettings,
|
|
2832
2839
|
/**
|
|
2833
2840
|
* The auth-brain company (tenant) the workspace was created for, or null for
|
|
@@ -2838,13 +2845,13 @@ var Workspace = z11.object({
|
|
|
2838
2845
|
created_at: Timestamp,
|
|
2839
2846
|
updated_at: Timestamp
|
|
2840
2847
|
});
|
|
2841
|
-
var WorkspaceCreate =
|
|
2848
|
+
var WorkspaceCreate = z12.object({
|
|
2842
2849
|
slug: Slug,
|
|
2843
|
-
name:
|
|
2850
|
+
name: z12.string().min(1).max(120),
|
|
2844
2851
|
settings: WorkspaceSettings.partial().optional(),
|
|
2845
|
-
owner:
|
|
2852
|
+
owner: z12.object({
|
|
2846
2853
|
email: Email,
|
|
2847
|
-
name:
|
|
2854
|
+
name: z12.string().max(200).nullable().optional()
|
|
2848
2855
|
}),
|
|
2849
2856
|
/**
|
|
2850
2857
|
* The auth-brain company the workspace is created in. Required since 0.14.0:
|
|
@@ -2853,27 +2860,33 @@ var WorkspaceCreate = z11.object({
|
|
|
2853
2860
|
* invitation (`members.syncCompanyRole`). A workspace created before, without
|
|
2854
2861
|
* one, keeps working and simply has no such inheritance.
|
|
2855
2862
|
*/
|
|
2856
|
-
company_id: CompanyId
|
|
2863
|
+
company_id: CompanyId,
|
|
2864
|
+
/**
|
|
2865
|
+
* The person creating the workspace accepts the terms of service and the
|
|
2866
|
+
* processing agreement for its company, of this version (required since
|
|
2867
|
+
* 0.19.0): the workspace processes recipients' data from its first contact.
|
|
2868
|
+
*/
|
|
2869
|
+
accept_terms: AcceptTerms
|
|
2857
2870
|
});
|
|
2858
|
-
var WorkspaceUpdate =
|
|
2859
|
-
name:
|
|
2871
|
+
var WorkspaceUpdate = z12.object({
|
|
2872
|
+
name: z12.string().min(1).max(120),
|
|
2860
2873
|
settings: WorkspaceSettings.partial()
|
|
2861
2874
|
}).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
2862
|
-
var WorkspaceMove =
|
|
2875
|
+
var WorkspaceMove = z12.object({ company_id: CompanyId });
|
|
2863
2876
|
var MEMBER_ROLES = ["owner", "admin", "editor", "viewer"];
|
|
2864
|
-
var MemberRole =
|
|
2877
|
+
var MemberRole = z12.enum(MEMBER_ROLES);
|
|
2865
2878
|
var WorkspaceMembership = Workspace.extend({ role: MemberRole });
|
|
2866
2879
|
var MEMBER_SOURCES = ["invited", "company"];
|
|
2867
|
-
var MemberSource =
|
|
2880
|
+
var MemberSource = z12.enum(MEMBER_SOURCES);
|
|
2868
2881
|
var COMPANY_GRANT_ROLES = ["owner", "admin"];
|
|
2869
|
-
var CompanyGrantRole =
|
|
2882
|
+
var CompanyGrantRole = z12.enum(COMPANY_GRANT_ROLES);
|
|
2870
2883
|
var COMPANY_ROLE_MAX_AGE_HOURS = 24;
|
|
2871
|
-
var Member =
|
|
2884
|
+
var Member = z12.object({
|
|
2872
2885
|
id: Id,
|
|
2873
2886
|
/** The person's auth-brain subject. */
|
|
2874
|
-
subject:
|
|
2887
|
+
subject: z12.string().min(1).max(255),
|
|
2875
2888
|
email: Email,
|
|
2876
|
-
name:
|
|
2889
|
+
name: z12.string().max(200).nullable(),
|
|
2877
2890
|
/**
|
|
2878
2891
|
* The role in force: the higher of the person's own role in the workspace
|
|
2879
2892
|
* and the one a confirmed company role carries. For a `company` row that is
|
|
@@ -2900,48 +2913,48 @@ var Member = z11.object({
|
|
|
2900
2913
|
* false is one whose company role has not been confirmed within
|
|
2901
2914
|
* `COMPANY_ROLE_MAX_AGE_HOURS`; it grants nothing and an admin may remove it.
|
|
2902
2915
|
*/
|
|
2903
|
-
inherited:
|
|
2916
|
+
inherited: z12.boolean().optional()
|
|
2904
2917
|
});
|
|
2905
2918
|
var MAX_SYNC_COMPANIES = 100;
|
|
2906
|
-
var MemberCompanySync =
|
|
2919
|
+
var MemberCompanySync = z12.object({
|
|
2907
2920
|
email: Email,
|
|
2908
|
-
name:
|
|
2909
|
-
companies:
|
|
2921
|
+
name: z12.string().max(200).nullable().optional(),
|
|
2922
|
+
companies: z12.array(z12.object({ company_id: CompanyId, role: CompanyGrantRole })).max(MAX_SYNC_COMPANIES).refine((list2) => new Set(list2.map((c) => c.company_id)).size === list2.length, "each company at most once")
|
|
2910
2923
|
});
|
|
2911
|
-
var MemberCompanySyncResult =
|
|
2924
|
+
var MemberCompanySyncResult = z12.object({
|
|
2912
2925
|
/** Workspaces in which the person now holds a company role they did not hold, or held differently, before this call. */
|
|
2913
|
-
granted:
|
|
2926
|
+
granted: z12.array(Id),
|
|
2914
2927
|
/** Workspaces in which a company role was taken away by this call. */
|
|
2915
|
-
revoked:
|
|
2928
|
+
revoked: z12.array(Id),
|
|
2916
2929
|
/** Workspaces in which the person's company role was already as stated. */
|
|
2917
|
-
unchanged:
|
|
2930
|
+
unchanged: z12.array(Id)
|
|
2918
2931
|
});
|
|
2919
|
-
var MemberCreate =
|
|
2920
|
-
subject:
|
|
2932
|
+
var MemberCreate = z12.object({
|
|
2933
|
+
subject: z12.string().min(1).max(255),
|
|
2921
2934
|
email: Email,
|
|
2922
|
-
name:
|
|
2935
|
+
name: z12.string().max(200).nullable().optional(),
|
|
2923
2936
|
role: MemberRole
|
|
2924
2937
|
});
|
|
2925
|
-
var MemberUpdate =
|
|
2938
|
+
var MemberUpdate = z12.object({ role: MemberRole });
|
|
2926
2939
|
var API_KEY_SCOPES = ["full", "read", "send"];
|
|
2927
|
-
var ApiKeyScope =
|
|
2928
|
-
var ApiKey =
|
|
2940
|
+
var ApiKeyScope = z12.enum(API_KEY_SCOPES);
|
|
2941
|
+
var ApiKey = z12.object({
|
|
2929
2942
|
id: Id,
|
|
2930
|
-
name:
|
|
2943
|
+
name: z12.string().min(1).max(120),
|
|
2931
2944
|
/** The first characters of the key, for recognising it in a list. */
|
|
2932
|
-
prefix:
|
|
2945
|
+
prefix: z12.string().min(4).max(32),
|
|
2933
2946
|
scope: ApiKeyScope,
|
|
2934
2947
|
last_used_at: Timestamp.nullable(),
|
|
2935
2948
|
revoked_at: Timestamp.nullable(),
|
|
2936
2949
|
created_at: Timestamp
|
|
2937
2950
|
});
|
|
2938
|
-
var ApiKeyCreate =
|
|
2939
|
-
name:
|
|
2951
|
+
var ApiKeyCreate = z12.object({
|
|
2952
|
+
name: z12.string().min(1).max(120),
|
|
2940
2953
|
/** Omitted means `full`. */
|
|
2941
2954
|
scope: ApiKeyScope.optional()
|
|
2942
2955
|
});
|
|
2943
|
-
var ApiKeyCreated =
|
|
2944
|
-
key:
|
|
2956
|
+
var ApiKeyCreated = z12.object({
|
|
2957
|
+
key: z12.string().min(20),
|
|
2945
2958
|
api_key: ApiKey
|
|
2946
2959
|
});
|
|
2947
2960
|
var AUDIT_ACTIONS = [
|
|
@@ -2965,6 +2978,7 @@ var AUDIT_ACTIONS = [
|
|
|
2965
2978
|
"sending_domain.created",
|
|
2966
2979
|
"sending_domain.updated",
|
|
2967
2980
|
"sending_domain.checked",
|
|
2981
|
+
"sending_domain.records_written",
|
|
2968
2982
|
"sending_domain.deleted",
|
|
2969
2983
|
"topic.created",
|
|
2970
2984
|
"topic.updated",
|
|
@@ -3036,14 +3050,14 @@ var AUDIT_ACTIONS = [
|
|
|
3036
3050
|
"automation.run_ended",
|
|
3037
3051
|
"event.recorded"
|
|
3038
3052
|
];
|
|
3039
|
-
var AuditAction =
|
|
3053
|
+
var AuditAction = z12.enum(AUDIT_ACTIONS);
|
|
3040
3054
|
var TRUSTED_APPS = ["booking"];
|
|
3041
|
-
var TrustedApp =
|
|
3042
|
-
var AuditActor =
|
|
3043
|
-
|
|
3044
|
-
type:
|
|
3055
|
+
var TrustedApp = z12.enum(TRUSTED_APPS);
|
|
3056
|
+
var AuditActor = z12.discriminatedUnion("type", [
|
|
3057
|
+
z12.object({
|
|
3058
|
+
type: z12.literal("member"),
|
|
3045
3059
|
member_id: Id,
|
|
3046
|
-
subject:
|
|
3060
|
+
subject: z12.string().min(1),
|
|
3047
3061
|
/**
|
|
3048
3062
|
* The application the person acted through, when it was not the dashboard:
|
|
3049
3063
|
* the service set it from the service token the call carried, so it is
|
|
@@ -3051,26 +3065,26 @@ var AuditActor = z11.discriminatedUnion("type", [
|
|
|
3051
3065
|
*/
|
|
3052
3066
|
app: TrustedApp.optional()
|
|
3053
3067
|
}),
|
|
3054
|
-
|
|
3055
|
-
type:
|
|
3068
|
+
z12.object({
|
|
3069
|
+
type: z12.literal("api_key"),
|
|
3056
3070
|
api_key_id: Id,
|
|
3057
3071
|
/**
|
|
3058
3072
|
* Who the client's application said it was acting for, from
|
|
3059
3073
|
* `ON_BEHALF_OF_HEADER`: reported by that application, never verified.
|
|
3060
3074
|
* Absent when the call carried no label.
|
|
3061
3075
|
*/
|
|
3062
|
-
on_behalf_of:
|
|
3076
|
+
on_behalf_of: z12.string().min(1).max(ON_BEHALF_OF_MAX_LENGTH).optional()
|
|
3063
3077
|
}),
|
|
3064
3078
|
/** The service itself (the worker, a bounce, the hosted unsubscribe page). */
|
|
3065
|
-
|
|
3079
|
+
z12.object({ type: z12.literal("system"), reason: z12.string().min(1).max(200) })
|
|
3066
3080
|
]);
|
|
3067
|
-
var AuditEntry =
|
|
3081
|
+
var AuditEntry = z12.object({
|
|
3068
3082
|
id: Id,
|
|
3069
3083
|
action: AuditAction,
|
|
3070
3084
|
actor: AuditActor,
|
|
3071
|
-
target_type:
|
|
3085
|
+
target_type: z12.string().min(1).max(64),
|
|
3072
3086
|
target_id: Id.nullable(),
|
|
3073
|
-
details:
|
|
3087
|
+
details: z12.record(z12.unknown()),
|
|
3074
3088
|
created_at: Timestamp
|
|
3075
3089
|
});
|
|
3076
3090
|
var AuditQuery = PageQuery.extend({
|
|
@@ -3079,12 +3093,12 @@ var AuditQuery = PageQuery.extend({
|
|
|
3079
3093
|
});
|
|
3080
3094
|
|
|
3081
3095
|
// src/invites.ts
|
|
3082
|
-
import { z as
|
|
3096
|
+
import { z as z13 } from "zod";
|
|
3083
3097
|
var INVITE_STATUSES = ["pending", "accepted", "revoked", "expired"];
|
|
3084
|
-
var InviteStatus =
|
|
3098
|
+
var InviteStatus = z13.enum(INVITE_STATUSES);
|
|
3085
3099
|
var DEFAULT_INVITE_TTL_DAYS = 7;
|
|
3086
3100
|
var MAX_INVITE_TTL_DAYS = 30;
|
|
3087
|
-
var Invite =
|
|
3101
|
+
var Invite = z13.object({
|
|
3088
3102
|
id: Id,
|
|
3089
3103
|
/** Stored lowercased; only a person signed in with this address can accept. */
|
|
3090
3104
|
email: Email,
|
|
@@ -3092,32 +3106,32 @@ var Invite = z12.object({
|
|
|
3092
3106
|
/** Derived from the timestamps below, never stored. */
|
|
3093
3107
|
status: InviteStatus,
|
|
3094
3108
|
/** The member who invited, while they are still one (null after they left). */
|
|
3095
|
-
invited_by:
|
|
3109
|
+
invited_by: z13.object({ member_id: Id.nullable(), email: Email.nullable() }),
|
|
3096
3110
|
expires_at: Timestamp,
|
|
3097
3111
|
accepted_at: Timestamp.nullable(),
|
|
3098
3112
|
revoked_at: Timestamp.nullable(),
|
|
3099
3113
|
created_at: Timestamp
|
|
3100
3114
|
});
|
|
3101
|
-
var InviteCreate =
|
|
3115
|
+
var InviteCreate = z13.object({
|
|
3102
3116
|
email: Email,
|
|
3103
3117
|
role: MemberRole,
|
|
3104
|
-
expires_in_days:
|
|
3118
|
+
expires_in_days: z13.number().int().min(1).max(MAX_INVITE_TTL_DAYS).optional()
|
|
3105
3119
|
});
|
|
3106
|
-
var InviteCreated =
|
|
3120
|
+
var InviteCreated = z13.object({
|
|
3107
3121
|
invite: Invite,
|
|
3108
|
-
token:
|
|
3122
|
+
token: z13.string().min(32).max(128)
|
|
3109
3123
|
});
|
|
3110
3124
|
var InviteListQuery = PageQuery.extend({
|
|
3111
3125
|
status: InviteStatus.optional()
|
|
3112
3126
|
});
|
|
3113
|
-
var InviteAccept =
|
|
3114
|
-
token:
|
|
3127
|
+
var InviteAccept = z13.object({
|
|
3128
|
+
token: z13.string().min(32).max(128),
|
|
3115
3129
|
email: Email,
|
|
3116
|
-
name:
|
|
3130
|
+
name: z13.string().max(200).nullable().optional()
|
|
3117
3131
|
});
|
|
3118
|
-
var InviteAccepted =
|
|
3132
|
+
var InviteAccepted = z13.object({
|
|
3119
3133
|
workspace: WorkspaceMembership,
|
|
3120
|
-
already_member:
|
|
3134
|
+
already_member: z13.boolean()
|
|
3121
3135
|
});
|
|
3122
3136
|
var INVITE_REFUSAL_REASONS = ["email_mismatch", "inviter_lacks_role", "expired", "revoked", "accepted"];
|
|
3123
3137
|
|
|
@@ -3747,13 +3761,13 @@ function renameInsertionEverywhere(drafts, from, rawTo) {
|
|
|
3747
3761
|
}
|
|
3748
3762
|
|
|
3749
3763
|
// src/providers.ts
|
|
3750
|
-
import { z as
|
|
3764
|
+
import { z as z14 } from "zod";
|
|
3751
3765
|
var PROVIDER_KINDS = ["smtp", "resend"];
|
|
3752
|
-
var ProviderKind =
|
|
3753
|
-
var ProviderPolicy =
|
|
3754
|
-
daily_recipient_budget:
|
|
3755
|
-
min_interval_ms:
|
|
3756
|
-
max_recipients_per_message:
|
|
3766
|
+
var ProviderKind = z14.enum(PROVIDER_KINDS);
|
|
3767
|
+
var ProviderPolicy = z14.object({
|
|
3768
|
+
daily_recipient_budget: z14.number().int().min(1).max(1e7),
|
|
3769
|
+
min_interval_ms: z14.number().int().min(0).max(36e5),
|
|
3770
|
+
max_recipients_per_message: z14.number().int().min(1).max(1e3)
|
|
3757
3771
|
});
|
|
3758
3772
|
var ICLOUD_SMTP_POLICY = {
|
|
3759
3773
|
daily_recipient_budget: 800,
|
|
@@ -3761,17 +3775,17 @@ var ICLOUD_SMTP_POLICY = {
|
|
|
3761
3775
|
max_recipients_per_message: 1
|
|
3762
3776
|
};
|
|
3763
3777
|
var SMTP_SECURITY = ["tls", "starttls"];
|
|
3764
|
-
var SmtpConfigBase =
|
|
3765
|
-
host:
|
|
3766
|
-
port:
|
|
3778
|
+
var SmtpConfigBase = z14.object({
|
|
3779
|
+
host: z14.string().min(1).max(255),
|
|
3780
|
+
port: z14.number().int().min(1).max(65535),
|
|
3767
3781
|
/** `tls` connects encrypted (465), `starttls` upgrades (587). Never plaintext. */
|
|
3768
|
-
security:
|
|
3769
|
-
username:
|
|
3782
|
+
security: z14.enum(SMTP_SECURITY),
|
|
3783
|
+
username: z14.string().min(1).max(255)
|
|
3770
3784
|
});
|
|
3771
|
-
var ResendConfigBase =
|
|
3772
|
-
var ProviderRejections =
|
|
3773
|
-
count:
|
|
3774
|
-
last_error:
|
|
3785
|
+
var ResendConfigBase = z14.object({});
|
|
3786
|
+
var ProviderRejections = z14.object({
|
|
3787
|
+
count: z14.number().int().min(0),
|
|
3788
|
+
last_error: z14.string().nullable(),
|
|
3775
3789
|
last_at: Timestamp.nullable(),
|
|
3776
3790
|
/**
|
|
3777
3791
|
* The last time the bounce circuit breaker tripped on one of this provider's
|
|
@@ -3781,59 +3795,59 @@ var ProviderRejections = z13.object({
|
|
|
3781
3795
|
* run's bounce blocks were undone and the mailing paused. `sample` is the
|
|
3782
3796
|
* reply that tripped it.
|
|
3783
3797
|
*/
|
|
3784
|
-
anomaly:
|
|
3798
|
+
anomaly: z14.object({
|
|
3785
3799
|
at: Timestamp,
|
|
3786
3800
|
/** `mailing`: one mailing was paused. `provider`: 5 refusals in a row with the same reply across the provider's sends (test sends and one-recipient mailings included) within 24 hours. */
|
|
3787
|
-
scope:
|
|
3801
|
+
scope: z14.enum(["mailing", "provider"]),
|
|
3788
3802
|
/**
|
|
3789
3803
|
* True while the provider-wide breaker is open: no bounce blocks through
|
|
3790
3804
|
* this provider, test sends refused and mailings not started or resumed
|
|
3791
3805
|
* (`provider_anomaly`), until an admin clears it (`providers.clearAnomaly`).
|
|
3792
3806
|
*/
|
|
3793
|
-
blocking:
|
|
3807
|
+
blocking: z14.boolean(),
|
|
3794
3808
|
mailing_id: Id.nullable(),
|
|
3795
|
-
reason:
|
|
3796
|
-
sample:
|
|
3809
|
+
reason: z14.string(),
|
|
3810
|
+
sample: z14.string()
|
|
3797
3811
|
}).nullable()
|
|
3798
3812
|
});
|
|
3799
|
-
var ProviderEvents =
|
|
3800
|
-
status:
|
|
3801
|
-
source:
|
|
3802
|
-
url:
|
|
3803
|
-
error:
|
|
3813
|
+
var ProviderEvents = z14.object({
|
|
3814
|
+
status: z14.enum(["active", "needs_secret"]),
|
|
3815
|
+
source: z14.enum(["automatic", "manual", "managed"]).nullable(),
|
|
3816
|
+
url: z14.string().url(),
|
|
3817
|
+
error: z14.string().nullable(),
|
|
3804
3818
|
/**
|
|
3805
3819
|
* Events that named an email this provider never sent through the service
|
|
3806
3820
|
* (another workspace or system sharing the Resend account): counted, never
|
|
3807
3821
|
* acted on.
|
|
3808
3822
|
*/
|
|
3809
|
-
unmatched:
|
|
3823
|
+
unmatched: z14.number().int().min(0)
|
|
3810
3824
|
});
|
|
3811
3825
|
var RESEND_EVENT_TYPES = ["email.bounced", "email.complained", "email.delivery_delayed"];
|
|
3812
|
-
var ResendSigningSecret =
|
|
3813
|
-
var ProviderEventsSecret =
|
|
3826
|
+
var ResendSigningSecret = z14.string().max(200).regex(/^whsec_[A-Za-z0-9+/]{16,}={0,2}$/, "must be the signing secret Resend shows, starting with whsec_");
|
|
3827
|
+
var ProviderEventsSecret = z14.object({ signing_secret: ResendSigningSecret });
|
|
3814
3828
|
var ProviderFields = {
|
|
3815
|
-
name:
|
|
3816
|
-
from_name:
|
|
3829
|
+
name: z14.string().min(1).max(120),
|
|
3830
|
+
from_name: z14.string().min(1).max(120),
|
|
3817
3831
|
from_email: Email,
|
|
3818
3832
|
reply_to: Email.nullable(),
|
|
3819
3833
|
policy: ProviderPolicy
|
|
3820
3834
|
};
|
|
3821
|
-
var Provider =
|
|
3822
|
-
|
|
3835
|
+
var Provider = z14.discriminatedUnion("kind", [
|
|
3836
|
+
z14.object({
|
|
3823
3837
|
id: Id,
|
|
3824
|
-
kind:
|
|
3838
|
+
kind: z14.literal("smtp"),
|
|
3825
3839
|
config: SmtpConfigBase,
|
|
3826
|
-
has_secret:
|
|
3840
|
+
has_secret: z14.boolean(),
|
|
3827
3841
|
...ProviderFields,
|
|
3828
3842
|
rejections: ProviderRejections,
|
|
3829
3843
|
created_at: Timestamp,
|
|
3830
3844
|
updated_at: Timestamp
|
|
3831
3845
|
}),
|
|
3832
|
-
|
|
3846
|
+
z14.object({
|
|
3833
3847
|
id: Id,
|
|
3834
|
-
kind:
|
|
3848
|
+
kind: z14.literal("resend"),
|
|
3835
3849
|
config: ResendConfigBase,
|
|
3836
|
-
has_secret:
|
|
3850
|
+
has_secret: z14.boolean(),
|
|
3837
3851
|
...ProviderFields,
|
|
3838
3852
|
rejections: ProviderRejections,
|
|
3839
3853
|
events: ProviderEvents,
|
|
@@ -3841,31 +3855,31 @@ var Provider = z13.discriminatedUnion("kind", [
|
|
|
3841
3855
|
updated_at: Timestamp
|
|
3842
3856
|
})
|
|
3843
3857
|
]);
|
|
3844
|
-
var ProviderCreate =
|
|
3845
|
-
|
|
3846
|
-
kind:
|
|
3847
|
-
config: SmtpConfigBase.extend({ password:
|
|
3858
|
+
var ProviderCreate = z14.discriminatedUnion("kind", [
|
|
3859
|
+
z14.object({
|
|
3860
|
+
kind: z14.literal("smtp"),
|
|
3861
|
+
config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024) }),
|
|
3848
3862
|
...ProviderFields
|
|
3849
3863
|
}),
|
|
3850
|
-
|
|
3851
|
-
kind:
|
|
3852
|
-
config: ResendConfigBase.extend({ api_key:
|
|
3864
|
+
z14.object({
|
|
3865
|
+
kind: z14.literal("resend"),
|
|
3866
|
+
config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024) }),
|
|
3853
3867
|
...ProviderFields
|
|
3854
3868
|
})
|
|
3855
3869
|
]);
|
|
3856
|
-
var ProviderUpdate =
|
|
3857
|
-
|
|
3858
|
-
kind:
|
|
3859
|
-
config: SmtpConfigBase.extend({ password:
|
|
3870
|
+
var ProviderUpdate = z14.discriminatedUnion("kind", [
|
|
3871
|
+
z14.object({
|
|
3872
|
+
kind: z14.literal("smtp"),
|
|
3873
|
+
config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024).optional() }).partial().optional(),
|
|
3860
3874
|
name: ProviderFields.name.optional(),
|
|
3861
3875
|
from_name: ProviderFields.from_name.optional(),
|
|
3862
3876
|
from_email: ProviderFields.from_email.optional(),
|
|
3863
3877
|
reply_to: ProviderFields.reply_to.optional(),
|
|
3864
3878
|
policy: ProviderPolicy.partial().optional()
|
|
3865
3879
|
}),
|
|
3866
|
-
|
|
3867
|
-
kind:
|
|
3868
|
-
config: ResendConfigBase.extend({ api_key:
|
|
3880
|
+
z14.object({
|
|
3881
|
+
kind: z14.literal("resend"),
|
|
3882
|
+
config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024).optional() }).optional(),
|
|
3869
3883
|
name: ProviderFields.name.optional(),
|
|
3870
3884
|
from_name: ProviderFields.from_name.optional(),
|
|
3871
3885
|
from_email: ProviderFields.from_email.optional(),
|
|
@@ -3873,98 +3887,109 @@ var ProviderUpdate = z13.discriminatedUnion("kind", [
|
|
|
3873
3887
|
policy: ProviderPolicy.partial().optional()
|
|
3874
3888
|
})
|
|
3875
3889
|
]);
|
|
3876
|
-
var ProviderUsage =
|
|
3890
|
+
var ProviderUsage = z14.object({
|
|
3877
3891
|
provider_id: Id,
|
|
3878
|
-
recipients_last_24h:
|
|
3879
|
-
remaining_budget:
|
|
3892
|
+
recipients_last_24h: z14.number().int().min(0),
|
|
3893
|
+
remaining_budget: z14.number().int().min(0),
|
|
3880
3894
|
/** When enough of the rolling window frees up to send again, if exhausted. */
|
|
3881
3895
|
next_capacity_at: Timestamp.nullable()
|
|
3882
3896
|
});
|
|
3883
|
-
var ProviderVerifyResult =
|
|
3884
|
-
ok:
|
|
3885
|
-
error:
|
|
3897
|
+
var ProviderVerifyResult = z14.object({
|
|
3898
|
+
ok: z14.boolean(),
|
|
3899
|
+
error: z14.string().nullable()
|
|
3886
3900
|
});
|
|
3887
3901
|
|
|
3888
3902
|
// src/sending-domains.ts
|
|
3889
|
-
import { z as
|
|
3903
|
+
import { z as z15 } from "zod";
|
|
3890
3904
|
var SENDING_DOMAIN_STATUSES = ["pending_dns", "verifying", "verified", "failed", "temporary_failure"];
|
|
3891
|
-
var SendingDomainStatus =
|
|
3905
|
+
var SendingDomainStatus = z15.enum(SENDING_DOMAIN_STATUSES);
|
|
3892
3906
|
var SENDING_DOMAIN_DNS_MODES = ["manual", "managed"];
|
|
3893
|
-
var SendingDomainDnsMode =
|
|
3907
|
+
var SendingDomainDnsMode = z15.enum(SENDING_DOMAIN_DNS_MODES);
|
|
3894
3908
|
var SENDING_DOMAIN_REGION = "eu-west-1";
|
|
3895
|
-
var SendingDomainName =
|
|
3909
|
+
var SendingDomainName = z15.string().trim().toLowerCase().max(253).regex(
|
|
3896
3910
|
/^(?=.{1,253}$)(?!-)[a-z0-9-]{1,63}(?<!-)(\.(?!-)[a-z0-9-]{1,63}(?<!-))*\.[a-z]{2,63}$/,
|
|
3897
3911
|
"must be a domain such as example.com, without https:// or an @"
|
|
3898
3912
|
);
|
|
3899
|
-
var SendingDomainRecord =
|
|
3900
|
-
record:
|
|
3901
|
-
name:
|
|
3902
|
-
type:
|
|
3903
|
-
value:
|
|
3904
|
-
ttl:
|
|
3905
|
-
status:
|
|
3906
|
-
priority:
|
|
3907
|
-
});
|
|
3908
|
-
|
|
3913
|
+
var SendingDomainRecord = z15.object({
|
|
3914
|
+
record: z15.string().max(40),
|
|
3915
|
+
name: z15.string().max(253),
|
|
3916
|
+
type: z15.string().max(10),
|
|
3917
|
+
value: z15.string().max(4096),
|
|
3918
|
+
ttl: z15.string().max(20),
|
|
3919
|
+
status: z15.string().max(40),
|
|
3920
|
+
priority: z15.number().int().min(0).max(65535).optional()
|
|
3921
|
+
});
|
|
3922
|
+
function sendingDomainRecordFullName(domain, name) {
|
|
3923
|
+
const d = domain.toLowerCase();
|
|
3924
|
+
const n = name.toLowerCase().replace(/\.$/, "");
|
|
3925
|
+
if (n === "@" || n === "") return d;
|
|
3926
|
+
const labels = d.split(".");
|
|
3927
|
+
for (let k = labels.length - 2; k >= 1; k--) {
|
|
3928
|
+
const sub = labels.slice(0, k).join(".");
|
|
3929
|
+
if (n === sub || n.endsWith(`.${sub}`)) return `${n}.${labels.slice(k).join(".")}`;
|
|
3930
|
+
}
|
|
3931
|
+
return `${n}.${d}`;
|
|
3932
|
+
}
|
|
3933
|
+
var SendingDomain = z15.object({
|
|
3909
3934
|
id: Id,
|
|
3910
|
-
domain:
|
|
3911
|
-
from_name:
|
|
3935
|
+
domain: z15.string(),
|
|
3936
|
+
from_name: z15.string(),
|
|
3912
3937
|
from_email: Email,
|
|
3913
3938
|
reply_to: Email.nullable(),
|
|
3914
3939
|
status: SendingDomainStatus,
|
|
3915
3940
|
dns_mode: SendingDomainDnsMode,
|
|
3916
|
-
records:
|
|
3941
|
+
records: z15.array(SendingDomainRecord),
|
|
3917
3942
|
provider_id: Id.nullable(),
|
|
3918
3943
|
checked_at: Timestamp.nullable(),
|
|
3919
3944
|
verified_at: Timestamp.nullable(),
|
|
3920
|
-
last_error:
|
|
3945
|
+
last_error: z15.string().nullable(),
|
|
3921
3946
|
created_at: Timestamp,
|
|
3922
3947
|
updated_at: Timestamp
|
|
3923
3948
|
});
|
|
3924
3949
|
var SenderFields = {
|
|
3925
|
-
from_name:
|
|
3950
|
+
from_name: z15.string().trim().min(1).max(120),
|
|
3926
3951
|
from_email: Email,
|
|
3927
3952
|
reply_to: Email.nullable().optional()
|
|
3928
3953
|
};
|
|
3929
3954
|
function senderOnDomain(input, ctx) {
|
|
3930
3955
|
const at = input.from_email.lastIndexOf("@");
|
|
3931
3956
|
if (at < 0 || input.from_email.slice(at + 1).toLowerCase() !== input.domain) {
|
|
3932
|
-
ctx.addIssue({ code:
|
|
3957
|
+
ctx.addIssue({ code: z15.ZodIssueCode.custom, path: ["from_email"], message: `must be an address on ${input.domain}` });
|
|
3933
3958
|
}
|
|
3934
3959
|
}
|
|
3935
|
-
var SendingDomainCreate =
|
|
3936
|
-
var SendingDomainUpdate =
|
|
3960
|
+
var SendingDomainCreate = z15.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
|
|
3961
|
+
var SendingDomainUpdate = z15.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");
|
|
3937
3962
|
|
|
3938
3963
|
// src/contacts.ts
|
|
3939
|
-
import { z as
|
|
3940
|
-
var Topic =
|
|
3964
|
+
import { z as z16 } from "zod";
|
|
3965
|
+
var Topic = z16.object({
|
|
3941
3966
|
id: Id,
|
|
3942
3967
|
slug: Slug,
|
|
3943
|
-
name:
|
|
3968
|
+
name: z16.string().min(1).max(120),
|
|
3944
3969
|
/** Shown on the hosted preference page. */
|
|
3945
|
-
description:
|
|
3970
|
+
description: z16.string().max(1e3).nullable(),
|
|
3946
3971
|
/** Translations of `name` and `description` per locale, for the hosted page. */
|
|
3947
|
-
translations:
|
|
3948
|
-
|
|
3972
|
+
translations: z16.record(
|
|
3973
|
+
z16.object({ name: z16.string().min(1).max(120), description: z16.string().max(1e3).nullable() })
|
|
3949
3974
|
),
|
|
3950
3975
|
created_at: Timestamp,
|
|
3951
3976
|
updated_at: Timestamp
|
|
3952
3977
|
});
|
|
3953
|
-
var TopicCreate =
|
|
3978
|
+
var TopicCreate = z16.object({
|
|
3954
3979
|
slug: Slug,
|
|
3955
|
-
name:
|
|
3956
|
-
description:
|
|
3980
|
+
name: z16.string().min(1).max(120),
|
|
3981
|
+
description: z16.string().max(1e3).optional(),
|
|
3957
3982
|
translations: Topic.shape.translations.optional()
|
|
3958
3983
|
});
|
|
3959
3984
|
var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
3960
|
-
var Contact =
|
|
3985
|
+
var Contact = z16.object({
|
|
3961
3986
|
id: Id,
|
|
3962
|
-
external_id:
|
|
3987
|
+
external_id: z16.string().min(1).max(255).nullable(),
|
|
3963
3988
|
/** Stored lowercased, unique per workspace. */
|
|
3964
3989
|
email: Email,
|
|
3965
|
-
first_name:
|
|
3966
|
-
last_name:
|
|
3967
|
-
locale:
|
|
3990
|
+
first_name: z16.string().max(200).nullable(),
|
|
3991
|
+
last_name: z16.string().max(200).nullable(),
|
|
3992
|
+
locale: z16.string().min(2).max(35).nullable(),
|
|
3968
3993
|
/**
|
|
3969
3994
|
* The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
|
|
3970
3995
|
* Every wall clock an automation waits for is read in it, falling back to the
|
|
@@ -3972,65 +3997,65 @@ var Contact = z15.object({
|
|
|
3972
3997
|
*/
|
|
3973
3998
|
timezone: TimezoneName.nullable(),
|
|
3974
3999
|
properties: Properties,
|
|
3975
|
-
topics:
|
|
4000
|
+
topics: z16.array(Slug),
|
|
3976
4001
|
/** The slugs of the contact's tags (S4). */
|
|
3977
|
-
tags:
|
|
4002
|
+
tags: z16.array(Slug),
|
|
3978
4003
|
created_at: Timestamp,
|
|
3979
4004
|
updated_at: Timestamp
|
|
3980
4005
|
});
|
|
3981
|
-
var ContactUpsert =
|
|
3982
|
-
external_id:
|
|
4006
|
+
var ContactUpsert = z16.object({
|
|
4007
|
+
external_id: z16.string().min(1).max(255).optional(),
|
|
3983
4008
|
email: Email.optional(),
|
|
3984
|
-
first_name:
|
|
3985
|
-
last_name:
|
|
3986
|
-
locale:
|
|
4009
|
+
first_name: z16.string().max(200).nullable().optional(),
|
|
4010
|
+
last_name: z16.string().max(200).nullable().optional(),
|
|
4011
|
+
locale: z16.string().min(2).max(35).nullable().optional(),
|
|
3987
4012
|
timezone: TimezoneName.nullable().optional(),
|
|
3988
4013
|
properties: Properties.optional(),
|
|
3989
|
-
topics:
|
|
4014
|
+
topics: z16.array(Slug).max(100).optional()
|
|
3990
4015
|
}).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
|
|
3991
4016
|
message: "external_id or email is required",
|
|
3992
4017
|
path: ["email"]
|
|
3993
4018
|
});
|
|
3994
|
-
var ContactUpsertResult =
|
|
4019
|
+
var ContactUpsertResult = z16.object({
|
|
3995
4020
|
contact: Contact,
|
|
3996
|
-
created:
|
|
4021
|
+
created: z16.boolean()
|
|
3997
4022
|
});
|
|
3998
4023
|
var ContactListQuery = PageQuery.extend({
|
|
3999
|
-
email:
|
|
4000
|
-
external_id:
|
|
4024
|
+
email: z16.string().min(1).max(254).optional(),
|
|
4025
|
+
external_id: z16.string().min(1).max(255).optional(),
|
|
4001
4026
|
topic: Slug.optional()
|
|
4002
4027
|
});
|
|
4003
|
-
var ContactErased =
|
|
4004
|
-
ok:
|
|
4005
|
-
erased_messages:
|
|
4006
|
-
erased_recipients:
|
|
4007
|
-
suppressions_kept:
|
|
4028
|
+
var ContactErased = z16.object({
|
|
4029
|
+
ok: z16.literal(true),
|
|
4030
|
+
erased_messages: z16.number().int().min(0),
|
|
4031
|
+
erased_recipients: z16.number().int().min(0),
|
|
4032
|
+
suppressions_kept: z16.number().int().min(0)
|
|
4008
4033
|
});
|
|
4009
4034
|
var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
|
|
4010
|
-
var SuppressionReason =
|
|
4011
|
-
var Suppression =
|
|
4035
|
+
var SuppressionReason = z16.enum(SUPPRESSION_REASONS);
|
|
4036
|
+
var Suppression = z16.object({
|
|
4012
4037
|
id: Id,
|
|
4013
4038
|
email: Email,
|
|
4014
4039
|
reason: SuppressionReason,
|
|
4015
4040
|
topic: Slug.nullable(),
|
|
4016
4041
|
source_message_id: Id.nullable(),
|
|
4017
|
-
note:
|
|
4042
|
+
note: z16.string().max(1e3).nullable(),
|
|
4018
4043
|
created_at: Timestamp
|
|
4019
4044
|
});
|
|
4020
|
-
var SuppressionCreate =
|
|
4045
|
+
var SuppressionCreate = z16.object({
|
|
4021
4046
|
email: Email,
|
|
4022
|
-
reason:
|
|
4047
|
+
reason: z16.enum(["manual", "unsubscribed"]),
|
|
4023
4048
|
topic: Slug.nullable().optional(),
|
|
4024
|
-
note:
|
|
4049
|
+
note: z16.string().max(1e3).optional()
|
|
4025
4050
|
});
|
|
4026
4051
|
var SuppressionListQuery = PageQuery.extend({
|
|
4027
|
-
email:
|
|
4052
|
+
email: z16.string().min(1).max(254).optional(),
|
|
4028
4053
|
reason: SuppressionReason.optional(),
|
|
4029
4054
|
topic: Slug.optional()
|
|
4030
4055
|
});
|
|
4031
4056
|
|
|
4032
4057
|
// src/webhooks.ts
|
|
4033
|
-
import { z as
|
|
4058
|
+
import { z as z17 } from "zod";
|
|
4034
4059
|
var WEBHOOK_EVENT_TYPES = [
|
|
4035
4060
|
"message.sent",
|
|
4036
4061
|
"message.failed",
|
|
@@ -4074,23 +4099,23 @@ var WEBHOOK_EVENT_TYPES = [
|
|
|
4074
4099
|
"template.updated",
|
|
4075
4100
|
"template.deleted"
|
|
4076
4101
|
];
|
|
4077
|
-
var WebhookEventType =
|
|
4078
|
-
var MessageEventBase =
|
|
4102
|
+
var WebhookEventType = z17.enum(WEBHOOK_EVENT_TYPES);
|
|
4103
|
+
var MessageEventBase = z17.object({
|
|
4079
4104
|
message_id: Id,
|
|
4080
4105
|
mailing_id: Id.nullable(),
|
|
4081
4106
|
mailing_metadata: MailingMetadata.nullable(),
|
|
4082
4107
|
recipient_id: Id.nullable(),
|
|
4083
4108
|
contact_id: Id.nullable(),
|
|
4084
|
-
external_id:
|
|
4109
|
+
external_id: z17.string().nullable(),
|
|
4085
4110
|
email: Email,
|
|
4086
|
-
subject:
|
|
4111
|
+
subject: z17.string(),
|
|
4087
4112
|
topic: Slug.nullable(),
|
|
4088
|
-
provider_message_id:
|
|
4089
|
-
is_test:
|
|
4113
|
+
provider_message_id: z17.string().nullable(),
|
|
4114
|
+
is_test: z17.boolean()
|
|
4090
4115
|
});
|
|
4091
4116
|
var MessageSentData = MessageEventBase.extend({
|
|
4092
4117
|
/** The final HTML as sent, so the client can archive it beside its own records. */
|
|
4093
|
-
html:
|
|
4118
|
+
html: z17.string(),
|
|
4094
4119
|
sent_at: Timestamp,
|
|
4095
4120
|
/**
|
|
4096
4121
|
* The choice each insertion made (see `Message.insertions`); absent or null
|
|
@@ -4101,20 +4126,20 @@ var MessageSentData = MessageEventBase.extend({
|
|
|
4101
4126
|
insertions: InsertionChoices.nullish()
|
|
4102
4127
|
});
|
|
4103
4128
|
var MessageFailedData = MessageEventBase.extend({
|
|
4104
|
-
error:
|
|
4129
|
+
error: z17.string(),
|
|
4105
4130
|
/** False when the provider rejected permanently; the recipient will not be retried. */
|
|
4106
|
-
retryable:
|
|
4131
|
+
retryable: z17.boolean(),
|
|
4107
4132
|
failed_at: Timestamp
|
|
4108
4133
|
});
|
|
4109
4134
|
var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
|
|
4110
|
-
var ContactUnsubscribedData =
|
|
4135
|
+
var ContactUnsubscribedData = z17.object({
|
|
4111
4136
|
contact_id: Id.nullable(),
|
|
4112
|
-
external_id:
|
|
4137
|
+
external_id: z17.string().nullable(),
|
|
4113
4138
|
email: Email,
|
|
4114
4139
|
/** The topic unsubscribed from; null means every topic. */
|
|
4115
4140
|
topic: Slug.nullable(),
|
|
4116
4141
|
mailing_id: Id.nullable(),
|
|
4117
|
-
source:
|
|
4142
|
+
source: z17.enum(UNSUBSCRIBE_SOURCES),
|
|
4118
4143
|
unsubscribed_at: Timestamp
|
|
4119
4144
|
});
|
|
4120
4145
|
var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
|
|
@@ -4123,142 +4148,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
|
|
|
4123
4148
|
* breaker undid a `bounced` block it judged false (a `contact.bounced` for the
|
|
4124
4149
|
* same address and mailing went out before); `topic` is null.
|
|
4125
4150
|
*/
|
|
4126
|
-
source:
|
|
4151
|
+
source: z17.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
|
|
4127
4152
|
resubscribed_at: Timestamp
|
|
4128
4153
|
});
|
|
4129
|
-
var ContactBouncedData =
|
|
4154
|
+
var ContactBouncedData = z17.object({
|
|
4130
4155
|
contact_id: Id.nullable(),
|
|
4131
|
-
external_id:
|
|
4156
|
+
external_id: z17.string().nullable(),
|
|
4132
4157
|
email: Email,
|
|
4133
4158
|
/** `bounced` for a hard bounce, `complained` for a spam complaint. */
|
|
4134
|
-
reason:
|
|
4159
|
+
reason: z17.enum(["bounced", "complained"]),
|
|
4135
4160
|
message_id: Id.nullable(),
|
|
4136
|
-
diagnostic:
|
|
4161
|
+
diagnostic: z17.string().nullable(),
|
|
4137
4162
|
bounced_at: Timestamp
|
|
4138
4163
|
});
|
|
4139
|
-
var MailingFinishedData =
|
|
4164
|
+
var MailingFinishedData = z17.object({
|
|
4140
4165
|
mailing_id: Id,
|
|
4141
4166
|
mailing_metadata: MailingMetadata,
|
|
4142
|
-
status:
|
|
4167
|
+
status: z17.enum(["sent", "partially_failed", "cancelled"]),
|
|
4143
4168
|
counts: MailingCounts,
|
|
4144
4169
|
finished_at: Timestamp
|
|
4145
4170
|
});
|
|
4146
|
-
var ContactSubscribedData =
|
|
4171
|
+
var ContactSubscribedData = z17.object({
|
|
4147
4172
|
contact_id: Id,
|
|
4148
|
-
external_id:
|
|
4173
|
+
external_id: z17.string().nullable(),
|
|
4149
4174
|
email: Email,
|
|
4150
|
-
topics:
|
|
4151
|
-
source:
|
|
4175
|
+
topics: z17.array(Slug),
|
|
4176
|
+
source: z17.enum(["signup_form", "api", "dashboard", "automation"]),
|
|
4152
4177
|
signup_form_id: Id.nullable(),
|
|
4153
|
-
signup_form_version:
|
|
4178
|
+
signup_form_version: z17.number().int().min(1).nullable(),
|
|
4154
4179
|
subscribed_at: Timestamp
|
|
4155
4180
|
});
|
|
4156
|
-
var ImportFinishedData =
|
|
4181
|
+
var ImportFinishedData = z17.object({
|
|
4157
4182
|
import_id: Id,
|
|
4158
|
-
status:
|
|
4183
|
+
status: z17.enum(["completed", "cancelled", "failed"]),
|
|
4159
4184
|
result: ImportReport.nullable(),
|
|
4160
|
-
error:
|
|
4185
|
+
error: z17.string().nullable(),
|
|
4161
4186
|
finished_at: Timestamp
|
|
4162
4187
|
});
|
|
4163
|
-
var MailingScheduledData =
|
|
4188
|
+
var MailingScheduledData = z17.object({
|
|
4164
4189
|
mailing_id: Id,
|
|
4165
4190
|
mailing_metadata: MailingMetadata,
|
|
4166
4191
|
scheduled_at: Timestamp.nullable()
|
|
4167
4192
|
});
|
|
4168
|
-
var MailingStartedData =
|
|
4193
|
+
var MailingStartedData = z17.object({
|
|
4169
4194
|
mailing_id: Id,
|
|
4170
4195
|
mailing_metadata: MailingMetadata,
|
|
4171
|
-
trigger:
|
|
4172
|
-
recipients:
|
|
4196
|
+
trigger: z17.enum(["send", "schedule"]),
|
|
4197
|
+
recipients: z17.number().int().min(0),
|
|
4173
4198
|
started_at: Timestamp
|
|
4174
4199
|
});
|
|
4175
|
-
var MailingScheduleFailedData =
|
|
4200
|
+
var MailingScheduleFailedData = z17.object({
|
|
4176
4201
|
mailing_id: Id,
|
|
4177
4202
|
mailing_metadata: MailingMetadata,
|
|
4178
|
-
code:
|
|
4179
|
-
message:
|
|
4203
|
+
code: z17.string(),
|
|
4204
|
+
message: z17.string(),
|
|
4180
4205
|
failed_at: Timestamp
|
|
4181
4206
|
});
|
|
4182
|
-
var MailingAbWinnerSelectedData =
|
|
4207
|
+
var MailingAbWinnerSelectedData = z17.object({
|
|
4183
4208
|
mailing_id: Id,
|
|
4184
4209
|
mailing_metadata: MailingMetadata,
|
|
4185
|
-
winner:
|
|
4186
|
-
decided_by:
|
|
4187
|
-
variants:
|
|
4210
|
+
winner: z17.string(),
|
|
4211
|
+
decided_by: z17.enum(["metric", "manual"]),
|
|
4212
|
+
variants: z17.array(VariantAnalytics),
|
|
4188
4213
|
decided_at: Timestamp
|
|
4189
4214
|
});
|
|
4190
|
-
var ContactTaggedData =
|
|
4215
|
+
var ContactTaggedData = z17.object({
|
|
4191
4216
|
contact_id: Id,
|
|
4192
|
-
external_id:
|
|
4217
|
+
external_id: z17.string().nullable(),
|
|
4193
4218
|
email: Email,
|
|
4194
4219
|
/** Only the tags the contact did not already have. */
|
|
4195
|
-
tags:
|
|
4196
|
-
source:
|
|
4220
|
+
tags: z17.array(Slug).min(1),
|
|
4221
|
+
source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4197
4222
|
tagged_at: Timestamp
|
|
4198
4223
|
});
|
|
4199
|
-
var ContactUpdatedData =
|
|
4224
|
+
var ContactUpdatedData = z17.object({
|
|
4200
4225
|
contact_id: Id,
|
|
4201
|
-
external_id:
|
|
4226
|
+
external_id: z17.string().nullable(),
|
|
4202
4227
|
email: Email,
|
|
4203
|
-
changed:
|
|
4228
|
+
changed: z17.array(z17.string()).min(1),
|
|
4204
4229
|
properties: Properties,
|
|
4205
|
-
source:
|
|
4230
|
+
source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4206
4231
|
updated_at: Timestamp
|
|
4207
4232
|
});
|
|
4208
|
-
var AutomationRunEventBase =
|
|
4233
|
+
var AutomationRunEventBase = z17.object({
|
|
4209
4234
|
automation_id: Id,
|
|
4210
|
-
automation_name:
|
|
4235
|
+
automation_name: z17.string(),
|
|
4211
4236
|
run_id: Id,
|
|
4212
|
-
version:
|
|
4237
|
+
version: z17.number().int().min(1),
|
|
4213
4238
|
contact_id: Id,
|
|
4214
|
-
external_id:
|
|
4239
|
+
external_id: z17.string().nullable(),
|
|
4215
4240
|
email: Email
|
|
4216
4241
|
});
|
|
4217
4242
|
var AutomationRunStartedData = AutomationRunEventBase.extend({
|
|
4218
4243
|
/** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
|
|
4219
|
-
trigger_kind:
|
|
4244
|
+
trigger_kind: z17.string(),
|
|
4220
4245
|
entered_at: Timestamp
|
|
4221
4246
|
});
|
|
4222
4247
|
var AutomationRunCompletedData = AutomationRunEventBase.extend({
|
|
4223
|
-
last_step_id:
|
|
4248
|
+
last_step_id: z17.string().nullable(),
|
|
4224
4249
|
completed_at: Timestamp
|
|
4225
4250
|
});
|
|
4226
4251
|
var AutomationRunExitedData = AutomationRunEventBase.extend({
|
|
4227
4252
|
reason: AutomationEndReason,
|
|
4228
|
-
step_id:
|
|
4253
|
+
step_id: z17.string().nullable(),
|
|
4229
4254
|
exited_at: Timestamp
|
|
4230
4255
|
});
|
|
4231
4256
|
var AutomationRunFailedData = AutomationRunEventBase.extend({
|
|
4232
|
-
reason:
|
|
4233
|
-
step_id:
|
|
4257
|
+
reason: z17.string(),
|
|
4258
|
+
step_id: z17.string().nullable(),
|
|
4234
4259
|
failed_at: Timestamp
|
|
4235
4260
|
});
|
|
4236
4261
|
var AutomationWebhookData = AutomationRunEventBase.extend({
|
|
4237
|
-
step_id:
|
|
4262
|
+
step_id: z17.string(),
|
|
4238
4263
|
/** The step's own label, when it was given one, so a receiver can branch on a name. */
|
|
4239
|
-
step_label:
|
|
4264
|
+
step_label: z17.string().nullable(),
|
|
4240
4265
|
/** Whatever the step carries, verbatim. Null when it carries nothing. */
|
|
4241
4266
|
payload: JsonValue.nullable(),
|
|
4242
4267
|
fired_at: Timestamp
|
|
4243
4268
|
});
|
|
4244
|
-
var TemplateEventBase =
|
|
4269
|
+
var TemplateEventBase = z17.object({
|
|
4245
4270
|
template_id: Id,
|
|
4246
|
-
name:
|
|
4247
|
-
version:
|
|
4248
|
-
source:
|
|
4271
|
+
name: z17.string().min(1).max(200),
|
|
4272
|
+
version: z17.number().int().min(1),
|
|
4273
|
+
source: z17.enum(["api", "dashboard", "mjml_import"])
|
|
4249
4274
|
});
|
|
4250
4275
|
var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
|
|
4251
|
-
var TemplateUpdatedData = TemplateEventBase.extend({ archived:
|
|
4276
|
+
var TemplateUpdatedData = TemplateEventBase.extend({ archived: z17.boolean(), updated_at: Timestamp });
|
|
4252
4277
|
var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
|
|
4253
|
-
var envelope = (type, data) =>
|
|
4278
|
+
var envelope = (type, data) => z17.object({
|
|
4254
4279
|
/** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
|
|
4255
4280
|
id: Id,
|
|
4256
|
-
type:
|
|
4281
|
+
type: z17.literal(type),
|
|
4257
4282
|
created_at: Timestamp,
|
|
4258
4283
|
workspace_id: Id,
|
|
4259
4284
|
data
|
|
4260
4285
|
});
|
|
4261
|
-
var WebhookEvent =
|
|
4286
|
+
var WebhookEvent = z17.discriminatedUnion("type", [
|
|
4262
4287
|
envelope("message.sent", MessageSentData),
|
|
4263
4288
|
envelope("message.failed", MessageFailedData),
|
|
4264
4289
|
envelope("contact.unsubscribed", ContactUnsubscribedData),
|
|
@@ -4282,16 +4307,16 @@ var WebhookEvent = z16.discriminatedUnion("type", [
|
|
|
4282
4307
|
envelope("template.updated", TemplateUpdatedData),
|
|
4283
4308
|
envelope("template.deleted", TemplateDeletedData)
|
|
4284
4309
|
]);
|
|
4285
|
-
var WebhookEndpoint =
|
|
4310
|
+
var WebhookEndpoint = z17.object({
|
|
4286
4311
|
id: Id,
|
|
4287
|
-
url:
|
|
4288
|
-
description:
|
|
4289
|
-
events:
|
|
4290
|
-
enabled:
|
|
4312
|
+
url: z17.string().url(),
|
|
4313
|
+
description: z17.string().max(500).nullable(),
|
|
4314
|
+
events: z17.array(WebhookEventType).min(1),
|
|
4315
|
+
enabled: z17.boolean(),
|
|
4291
4316
|
created_at: Timestamp,
|
|
4292
4317
|
updated_at: Timestamp
|
|
4293
4318
|
});
|
|
4294
|
-
var WebhookUrl =
|
|
4319
|
+
var WebhookUrl = z17.string().url().refine((u) => {
|
|
4295
4320
|
try {
|
|
4296
4321
|
const url = new URL(u);
|
|
4297
4322
|
if (url.protocol === "https:") return true;
|
|
@@ -4300,35 +4325,35 @@ var WebhookUrl = z16.string().url().refine((u) => {
|
|
|
4300
4325
|
return false;
|
|
4301
4326
|
}
|
|
4302
4327
|
}, "must be https (http only for localhost)");
|
|
4303
|
-
var WebhookEndpointCreate =
|
|
4328
|
+
var WebhookEndpointCreate = z17.object({
|
|
4304
4329
|
url: WebhookUrl,
|
|
4305
|
-
description:
|
|
4306
|
-
events:
|
|
4307
|
-
enabled:
|
|
4330
|
+
description: z17.string().max(500).optional(),
|
|
4331
|
+
events: z17.array(WebhookEventType).min(1),
|
|
4332
|
+
enabled: z17.boolean().optional()
|
|
4308
4333
|
});
|
|
4309
|
-
var WebhookEndpointUpdate =
|
|
4334
|
+
var WebhookEndpointUpdate = z17.object({
|
|
4310
4335
|
url: WebhookUrl,
|
|
4311
|
-
description:
|
|
4312
|
-
events:
|
|
4313
|
-
enabled:
|
|
4336
|
+
description: z17.string().max(500).nullable(),
|
|
4337
|
+
events: z17.array(WebhookEventType).min(1),
|
|
4338
|
+
enabled: z17.boolean()
|
|
4314
4339
|
}).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
4315
|
-
var WebhookEndpointWithSecret =
|
|
4340
|
+
var WebhookEndpointWithSecret = z17.object({
|
|
4316
4341
|
endpoint: WebhookEndpoint,
|
|
4317
|
-
secret:
|
|
4342
|
+
secret: z17.string().min(32)
|
|
4318
4343
|
});
|
|
4319
4344
|
var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
|
|
4320
|
-
var WebhookDeliveryStatus =
|
|
4345
|
+
var WebhookDeliveryStatus = z17.enum(WEBHOOK_DELIVERY_STATUSES);
|
|
4321
4346
|
var WEBHOOK_MAX_ATTEMPTS = 8;
|
|
4322
4347
|
var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
|
|
4323
|
-
var WebhookDelivery =
|
|
4348
|
+
var WebhookDelivery = z17.object({
|
|
4324
4349
|
id: Id,
|
|
4325
4350
|
endpoint_id: Id,
|
|
4326
4351
|
event_id: Id,
|
|
4327
4352
|
event_type: WebhookEventType,
|
|
4328
4353
|
status: WebhookDeliveryStatus,
|
|
4329
|
-
attempts:
|
|
4330
|
-
last_status_code:
|
|
4331
|
-
last_error:
|
|
4354
|
+
attempts: z17.number().int().min(0),
|
|
4355
|
+
last_status_code: z17.number().int().min(100).max(599).nullable(),
|
|
4356
|
+
last_error: z17.string().nullable(),
|
|
4332
4357
|
next_attempt_at: Timestamp.nullable(),
|
|
4333
4358
|
delivered_at: Timestamp.nullable(),
|
|
4334
4359
|
created_at: Timestamp
|
|
@@ -4337,7 +4362,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
|
|
|
4337
4362
|
status: WebhookDeliveryStatus.optional(),
|
|
4338
4363
|
event_type: WebhookEventType.optional()
|
|
4339
4364
|
});
|
|
4340
|
-
var WebhookDeliveryParams =
|
|
4365
|
+
var WebhookDeliveryParams = z17.object({ id: Id, delivery_id: Id });
|
|
4341
4366
|
|
|
4342
4367
|
// src/webhook-signing.ts
|
|
4343
4368
|
var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
|
|
@@ -4404,94 +4429,96 @@ async function verifyWebhook(input) {
|
|
|
4404
4429
|
}
|
|
4405
4430
|
|
|
4406
4431
|
// src/billing.ts
|
|
4407
|
-
import { z as
|
|
4432
|
+
import { z as z18 } from "zod";
|
|
4408
4433
|
var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
|
|
4409
|
-
var PlanId =
|
|
4410
|
-
var PlanLimits =
|
|
4411
|
-
monthly_messages:
|
|
4412
|
-
contacts:
|
|
4413
|
-
members:
|
|
4414
|
-
providers:
|
|
4415
|
-
webhook_endpoints:
|
|
4434
|
+
var PlanId = z18.enum(PLAN_IDS);
|
|
4435
|
+
var PlanLimits = z18.object({
|
|
4436
|
+
monthly_messages: z18.number().int().min(0).nullable(),
|
|
4437
|
+
contacts: z18.number().int().min(0).nullable(),
|
|
4438
|
+
members: z18.number().int().min(1).nullable(),
|
|
4439
|
+
providers: z18.number().int().min(1).nullable(),
|
|
4440
|
+
webhook_endpoints: z18.number().int().min(0).nullable(),
|
|
4416
4441
|
/** Automations that may be live (active or paused) at once (A1). */
|
|
4417
|
-
active_automations:
|
|
4442
|
+
active_automations: z18.number().int().min(0).nullable(),
|
|
4418
4443
|
/** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
|
|
4419
|
-
automation_steps:
|
|
4444
|
+
automation_steps: z18.number().int().min(1).nullable(),
|
|
4420
4445
|
/** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
|
|
4421
|
-
sending_domains:
|
|
4446
|
+
sending_domains: z18.number().int().min(0).nullable()
|
|
4422
4447
|
});
|
|
4423
|
-
var PlanFeatures =
|
|
4448
|
+
var PlanFeatures = z18.object({
|
|
4424
4449
|
/** A/B tests of subject and content on a mailing (S4). */
|
|
4425
|
-
ab_testing:
|
|
4450
|
+
ab_testing: z18.boolean(),
|
|
4426
4451
|
/** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
|
|
4427
|
-
tracking:
|
|
4452
|
+
tracking: z18.boolean(),
|
|
4428
4453
|
/** Automations: flows a person walks through step by step (A1). */
|
|
4429
|
-
automations:
|
|
4454
|
+
automations: z18.boolean()
|
|
4430
4455
|
});
|
|
4431
4456
|
var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
|
|
4432
|
-
var Plan =
|
|
4457
|
+
var Plan = z18.object({
|
|
4433
4458
|
id: PlanId,
|
|
4434
|
-
name:
|
|
4459
|
+
name: z18.string().min(1),
|
|
4435
4460
|
/** Price in the smallest currency unit per month; null for plans not sold. */
|
|
4436
|
-
monthly_price_cents:
|
|
4437
|
-
currency:
|
|
4461
|
+
monthly_price_cents: z18.number().int().min(0).nullable(),
|
|
4462
|
+
currency: z18.string().length(3),
|
|
4438
4463
|
limits: PlanLimits,
|
|
4439
4464
|
features: PlanFeatures
|
|
4440
4465
|
});
|
|
4441
|
-
var CatalogPlan = Plan.extend({ sellable:
|
|
4442
|
-
var Subscription =
|
|
4466
|
+
var CatalogPlan = Plan.extend({ sellable: z18.boolean() });
|
|
4467
|
+
var Subscription = z18.object({
|
|
4443
4468
|
workspace_id: Id,
|
|
4444
4469
|
plan: PlanId,
|
|
4445
|
-
status:
|
|
4470
|
+
status: z18.enum(["active", "trialing", "past_due", "cancelled"]),
|
|
4446
4471
|
current_period_start: Timestamp,
|
|
4447
4472
|
current_period_end: Timestamp,
|
|
4448
|
-
cancel_at_period_end:
|
|
4473
|
+
cancel_at_period_end: z18.boolean(),
|
|
4449
4474
|
/**
|
|
4450
4475
|
* A design partner outside billing (plan `design_partner`, no limits, no
|
|
4451
4476
|
* checkout). Set only by an operator, never through the API.
|
|
4452
4477
|
*/
|
|
4453
|
-
billing_exempt:
|
|
4478
|
+
billing_exempt: z18.boolean(),
|
|
4454
4479
|
/**
|
|
4455
4480
|
* Own sending domains bought on top of the plan's included ones (the
|
|
4456
4481
|
* add-on), each a monthly charge on the same subscription. 0 without the
|
|
4457
4482
|
* add-on; the usage limit `sending_domains` is the plan's plus these.
|
|
4458
4483
|
*/
|
|
4459
|
-
extra_sending_domains:
|
|
4484
|
+
extra_sending_domains: z18.number().int().min(0)
|
|
4460
4485
|
});
|
|
4461
|
-
var BillingAddons =
|
|
4462
|
-
sending_domain:
|
|
4463
|
-
monthly_price_cents:
|
|
4464
|
-
currency:
|
|
4465
|
-
sellable:
|
|
4486
|
+
var BillingAddons = z18.object({
|
|
4487
|
+
sending_domain: z18.object({
|
|
4488
|
+
monthly_price_cents: z18.number().int().min(0),
|
|
4489
|
+
currency: z18.string().length(3),
|
|
4490
|
+
sellable: z18.boolean()
|
|
4466
4491
|
})
|
|
4467
4492
|
});
|
|
4468
4493
|
var MAX_EXTRA_SENDING_DOMAINS = 100;
|
|
4469
|
-
var ExtraSendingDomainsUpdate =
|
|
4494
|
+
var ExtraSendingDomainsUpdate = z18.object({ quantity: z18.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
|
|
4470
4495
|
var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
|
|
4471
|
-
var UsageMetric =
|
|
4496
|
+
var UsageMetric = z18.enum(USAGE_METRICS);
|
|
4472
4497
|
var USAGE_WARNING_RATIO = 0.8;
|
|
4473
|
-
var UsageWarning =
|
|
4498
|
+
var UsageWarning = z18.object({
|
|
4474
4499
|
metric: UsageMetric,
|
|
4475
|
-
used:
|
|
4476
|
-
limit:
|
|
4500
|
+
used: z18.number().int().min(0),
|
|
4501
|
+
limit: z18.number().int().min(0),
|
|
4477
4502
|
/** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
|
|
4478
|
-
level:
|
|
4503
|
+
level: z18.enum(["approaching", "reached"])
|
|
4479
4504
|
});
|
|
4480
|
-
var Usage =
|
|
4505
|
+
var Usage = z18.object({
|
|
4481
4506
|
plan: PlanId,
|
|
4482
4507
|
period_start: Timestamp,
|
|
4483
4508
|
period_end: Timestamp,
|
|
4484
|
-
metrics:
|
|
4485
|
-
warnings:
|
|
4486
|
-
});
|
|
4487
|
-
var CheckoutRequest =
|
|
4488
|
-
plan:
|
|
4489
|
-
success_url:
|
|
4490
|
-
cancel_url:
|
|
4491
|
-
|
|
4492
|
-
|
|
4493
|
-
|
|
4494
|
-
var
|
|
4509
|
+
metrics: z18.record(UsageMetric, z18.object({ used: z18.number().int().min(0), limit: z18.number().int().min(0).nullable() })),
|
|
4510
|
+
warnings: z18.array(UsageWarning)
|
|
4511
|
+
});
|
|
4512
|
+
var CheckoutRequest = z18.object({
|
|
4513
|
+
plan: z18.enum(["starter", "growth"]),
|
|
4514
|
+
success_url: z18.string().url(),
|
|
4515
|
+
cancel_url: z18.string().url(),
|
|
4516
|
+
/** The buyer accepted the terms of service and the processing agreement of this version. */
|
|
4517
|
+
accept_terms: AcceptTerms
|
|
4518
|
+
});
|
|
4519
|
+
var CheckoutSession = z18.object({ url: z18.string().url() });
|
|
4520
|
+
var PortalRequest = z18.object({ return_url: z18.string().url() });
|
|
4521
|
+
var PortalSession = z18.object({ url: z18.string().url() });
|
|
4495
4522
|
var USAGE_WARNING_HEADER = "x-mail-usage-warning";
|
|
4496
4523
|
function formatUsageWarningHeader(warnings) {
|
|
4497
4524
|
if (warnings.length === 0) return null;
|
|
@@ -4511,7 +4538,7 @@ function parseUsageWarningHeader(value) {
|
|
|
4511
4538
|
}
|
|
4512
4539
|
|
|
4513
4540
|
// src/routes.ts
|
|
4514
|
-
import { z as
|
|
4541
|
+
import { z as z19 } from "zod";
|
|
4515
4542
|
var list = (item) => page(item);
|
|
4516
4543
|
var foundationRoutes = {
|
|
4517
4544
|
"workspaces.create": {
|
|
@@ -4757,7 +4784,7 @@ var templateRoutes = {
|
|
|
4757
4784
|
path: "/v1/templates/:id/export",
|
|
4758
4785
|
params: IdParams,
|
|
4759
4786
|
query: TemplateExportQuery,
|
|
4760
|
-
response:
|
|
4787
|
+
response: z19.string(),
|
|
4761
4788
|
responseType: "text",
|
|
4762
4789
|
status: 200,
|
|
4763
4790
|
access: "read",
|
|
@@ -5137,7 +5164,7 @@ var sendingRoutes = {
|
|
|
5137
5164
|
path: "/v1/mailings/:id/export",
|
|
5138
5165
|
params: IdParams,
|
|
5139
5166
|
query: MailingExportQuery,
|
|
5140
|
-
response:
|
|
5167
|
+
response: z19.string(),
|
|
5141
5168
|
responseType: "text",
|
|
5142
5169
|
status: 200,
|
|
5143
5170
|
access: "read",
|
|
@@ -5404,7 +5431,7 @@ var platformRoutes = {
|
|
|
5404
5431
|
"contactProperties.list": {
|
|
5405
5432
|
method: "GET",
|
|
5406
5433
|
path: "/v1/contact-properties",
|
|
5407
|
-
response:
|
|
5434
|
+
response: z19.object({ data: z19.array(ContactPropertyDefinition) }),
|
|
5408
5435
|
status: 200,
|
|
5409
5436
|
access: "read",
|
|
5410
5437
|
phase: "S4"
|
|
@@ -5703,7 +5730,7 @@ var billingRoutes = {
|
|
|
5703
5730
|
"billing.plans": {
|
|
5704
5731
|
method: "GET",
|
|
5705
5732
|
path: "/v1/billing/plans",
|
|
5706
|
-
response:
|
|
5733
|
+
response: z19.object({ data: z19.array(CatalogPlan), addons: BillingAddons }),
|
|
5707
5734
|
status: 200,
|
|
5708
5735
|
access: "read",
|
|
5709
5736
|
phase: "S5"
|
|
@@ -5854,7 +5881,7 @@ var automationRoutes = {
|
|
|
5854
5881
|
method: "POST",
|
|
5855
5882
|
path: "/v1/automations/:id/pause",
|
|
5856
5883
|
params: IdParams,
|
|
5857
|
-
body:
|
|
5884
|
+
body: z19.object({}).strict(),
|
|
5858
5885
|
response: Automation,
|
|
5859
5886
|
status: 200,
|
|
5860
5887
|
access: "write",
|
|
@@ -5864,7 +5891,7 @@ var automationRoutes = {
|
|
|
5864
5891
|
method: "POST",
|
|
5865
5892
|
path: "/v1/automations/:id/resume",
|
|
5866
5893
|
params: IdParams,
|
|
5867
|
-
body:
|
|
5894
|
+
body: z19.object({}).strict(),
|
|
5868
5895
|
response: Automation,
|
|
5869
5896
|
status: 200,
|
|
5870
5897
|
access: "write",
|
|
@@ -5874,7 +5901,7 @@ var automationRoutes = {
|
|
|
5874
5901
|
method: "POST",
|
|
5875
5902
|
path: "/v1/automations/:id/archive",
|
|
5876
5903
|
params: IdParams,
|
|
5877
|
-
body:
|
|
5904
|
+
body: z19.object({}).strict(),
|
|
5878
5905
|
response: Automation,
|
|
5879
5906
|
status: 200,
|
|
5880
5907
|
access: "write",
|
|
@@ -6054,6 +6081,7 @@ export {
|
|
|
6054
6081
|
AbTestState,
|
|
6055
6082
|
AbVariant,
|
|
6056
6083
|
AbWinnerRequest,
|
|
6084
|
+
AcceptTerms,
|
|
6057
6085
|
ApiKey,
|
|
6058
6086
|
ApiKeyCreate,
|
|
6059
6087
|
ApiKeyCreated,
|
|
@@ -6225,6 +6253,7 @@ export {
|
|
|
6225
6253
|
InviteListQuery,
|
|
6226
6254
|
InviteStatus,
|
|
6227
6255
|
JsonValue,
|
|
6256
|
+
LEGAL_TERMS_VERSION,
|
|
6228
6257
|
LETTER_ONLY_MERGE_FIELDS,
|
|
6229
6258
|
LETTER_RECIPIENT_REFUSAL,
|
|
6230
6259
|
LIST_UNSUBSCRIBE_POST_VALUE,
|
|
@@ -6634,6 +6663,7 @@ export {
|
|
|
6634
6663
|
sameJson,
|
|
6635
6664
|
sampleMergeValue,
|
|
6636
6665
|
saveDemotions,
|
|
6666
|
+
sendingDomainRecordFullName,
|
|
6637
6667
|
sendingRoutes,
|
|
6638
6668
|
setInsertionBy,
|
|
6639
6669
|
setInsertionFilled,
|