@marlinjai/mail-contract 0.18.0 → 0.20.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 +133 -17
- package/dist/index.d.ts +133 -17
- package/dist/index.js +367 -331
- package/dist/index.mjs +363 -331
- 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 = [
|
|
@@ -3024,6 +3037,7 @@ var AUDIT_ACTIONS = [
|
|
|
3024
3037
|
"billing.subscription_changed",
|
|
3025
3038
|
"billing.exemption_changed",
|
|
3026
3039
|
"billing.extra_sending_domains_changed",
|
|
3040
|
+
"billing.terms_accepted",
|
|
3027
3041
|
// A1: automations
|
|
3028
3042
|
"automation.created",
|
|
3029
3043
|
"automation.updated",
|
|
@@ -3037,14 +3051,14 @@ var AUDIT_ACTIONS = [
|
|
|
3037
3051
|
"automation.run_ended",
|
|
3038
3052
|
"event.recorded"
|
|
3039
3053
|
];
|
|
3040
|
-
var AuditAction =
|
|
3054
|
+
var AuditAction = z12.enum(AUDIT_ACTIONS);
|
|
3041
3055
|
var TRUSTED_APPS = ["booking"];
|
|
3042
|
-
var TrustedApp =
|
|
3043
|
-
var AuditActor =
|
|
3044
|
-
|
|
3045
|
-
type:
|
|
3056
|
+
var TrustedApp = z12.enum(TRUSTED_APPS);
|
|
3057
|
+
var AuditActor = z12.discriminatedUnion("type", [
|
|
3058
|
+
z12.object({
|
|
3059
|
+
type: z12.literal("member"),
|
|
3046
3060
|
member_id: Id,
|
|
3047
|
-
subject:
|
|
3061
|
+
subject: z12.string().min(1),
|
|
3048
3062
|
/**
|
|
3049
3063
|
* The application the person acted through, when it was not the dashboard:
|
|
3050
3064
|
* the service set it from the service token the call carried, so it is
|
|
@@ -3052,26 +3066,26 @@ var AuditActor = z11.discriminatedUnion("type", [
|
|
|
3052
3066
|
*/
|
|
3053
3067
|
app: TrustedApp.optional()
|
|
3054
3068
|
}),
|
|
3055
|
-
|
|
3056
|
-
type:
|
|
3069
|
+
z12.object({
|
|
3070
|
+
type: z12.literal("api_key"),
|
|
3057
3071
|
api_key_id: Id,
|
|
3058
3072
|
/**
|
|
3059
3073
|
* Who the client's application said it was acting for, from
|
|
3060
3074
|
* `ON_BEHALF_OF_HEADER`: reported by that application, never verified.
|
|
3061
3075
|
* Absent when the call carried no label.
|
|
3062
3076
|
*/
|
|
3063
|
-
on_behalf_of:
|
|
3077
|
+
on_behalf_of: z12.string().min(1).max(ON_BEHALF_OF_MAX_LENGTH).optional()
|
|
3064
3078
|
}),
|
|
3065
3079
|
/** The service itself (the worker, a bounce, the hosted unsubscribe page). */
|
|
3066
|
-
|
|
3080
|
+
z12.object({ type: z12.literal("system"), reason: z12.string().min(1).max(200) })
|
|
3067
3081
|
]);
|
|
3068
|
-
var AuditEntry =
|
|
3082
|
+
var AuditEntry = z12.object({
|
|
3069
3083
|
id: Id,
|
|
3070
3084
|
action: AuditAction,
|
|
3071
3085
|
actor: AuditActor,
|
|
3072
|
-
target_type:
|
|
3086
|
+
target_type: z12.string().min(1).max(64),
|
|
3073
3087
|
target_id: Id.nullable(),
|
|
3074
|
-
details:
|
|
3088
|
+
details: z12.record(z12.unknown()),
|
|
3075
3089
|
created_at: Timestamp
|
|
3076
3090
|
});
|
|
3077
3091
|
var AuditQuery = PageQuery.extend({
|
|
@@ -3080,12 +3094,12 @@ var AuditQuery = PageQuery.extend({
|
|
|
3080
3094
|
});
|
|
3081
3095
|
|
|
3082
3096
|
// src/invites.ts
|
|
3083
|
-
import { z as
|
|
3097
|
+
import { z as z13 } from "zod";
|
|
3084
3098
|
var INVITE_STATUSES = ["pending", "accepted", "revoked", "expired"];
|
|
3085
|
-
var InviteStatus =
|
|
3099
|
+
var InviteStatus = z13.enum(INVITE_STATUSES);
|
|
3086
3100
|
var DEFAULT_INVITE_TTL_DAYS = 7;
|
|
3087
3101
|
var MAX_INVITE_TTL_DAYS = 30;
|
|
3088
|
-
var Invite =
|
|
3102
|
+
var Invite = z13.object({
|
|
3089
3103
|
id: Id,
|
|
3090
3104
|
/** Stored lowercased; only a person signed in with this address can accept. */
|
|
3091
3105
|
email: Email,
|
|
@@ -3093,32 +3107,32 @@ var Invite = z12.object({
|
|
|
3093
3107
|
/** Derived from the timestamps below, never stored. */
|
|
3094
3108
|
status: InviteStatus,
|
|
3095
3109
|
/** The member who invited, while they are still one (null after they left). */
|
|
3096
|
-
invited_by:
|
|
3110
|
+
invited_by: z13.object({ member_id: Id.nullable(), email: Email.nullable() }),
|
|
3097
3111
|
expires_at: Timestamp,
|
|
3098
3112
|
accepted_at: Timestamp.nullable(),
|
|
3099
3113
|
revoked_at: Timestamp.nullable(),
|
|
3100
3114
|
created_at: Timestamp
|
|
3101
3115
|
});
|
|
3102
|
-
var InviteCreate =
|
|
3116
|
+
var InviteCreate = z13.object({
|
|
3103
3117
|
email: Email,
|
|
3104
3118
|
role: MemberRole,
|
|
3105
|
-
expires_in_days:
|
|
3119
|
+
expires_in_days: z13.number().int().min(1).max(MAX_INVITE_TTL_DAYS).optional()
|
|
3106
3120
|
});
|
|
3107
|
-
var InviteCreated =
|
|
3121
|
+
var InviteCreated = z13.object({
|
|
3108
3122
|
invite: Invite,
|
|
3109
|
-
token:
|
|
3123
|
+
token: z13.string().min(32).max(128)
|
|
3110
3124
|
});
|
|
3111
3125
|
var InviteListQuery = PageQuery.extend({
|
|
3112
3126
|
status: InviteStatus.optional()
|
|
3113
3127
|
});
|
|
3114
|
-
var InviteAccept =
|
|
3115
|
-
token:
|
|
3128
|
+
var InviteAccept = z13.object({
|
|
3129
|
+
token: z13.string().min(32).max(128),
|
|
3116
3130
|
email: Email,
|
|
3117
|
-
name:
|
|
3131
|
+
name: z13.string().max(200).nullable().optional()
|
|
3118
3132
|
});
|
|
3119
|
-
var InviteAccepted =
|
|
3133
|
+
var InviteAccepted = z13.object({
|
|
3120
3134
|
workspace: WorkspaceMembership,
|
|
3121
|
-
already_member:
|
|
3135
|
+
already_member: z13.boolean()
|
|
3122
3136
|
});
|
|
3123
3137
|
var INVITE_REFUSAL_REASONS = ["email_mismatch", "inviter_lacks_role", "expired", "revoked", "accepted"];
|
|
3124
3138
|
|
|
@@ -3748,13 +3762,13 @@ function renameInsertionEverywhere(drafts, from, rawTo) {
|
|
|
3748
3762
|
}
|
|
3749
3763
|
|
|
3750
3764
|
// src/providers.ts
|
|
3751
|
-
import { z as
|
|
3765
|
+
import { z as z14 } from "zod";
|
|
3752
3766
|
var PROVIDER_KINDS = ["smtp", "resend"];
|
|
3753
|
-
var ProviderKind =
|
|
3754
|
-
var ProviderPolicy =
|
|
3755
|
-
daily_recipient_budget:
|
|
3756
|
-
min_interval_ms:
|
|
3757
|
-
max_recipients_per_message:
|
|
3767
|
+
var ProviderKind = z14.enum(PROVIDER_KINDS);
|
|
3768
|
+
var ProviderPolicy = z14.object({
|
|
3769
|
+
daily_recipient_budget: z14.number().int().min(1).max(1e7),
|
|
3770
|
+
min_interval_ms: z14.number().int().min(0).max(36e5),
|
|
3771
|
+
max_recipients_per_message: z14.number().int().min(1).max(1e3)
|
|
3758
3772
|
});
|
|
3759
3773
|
var ICLOUD_SMTP_POLICY = {
|
|
3760
3774
|
daily_recipient_budget: 800,
|
|
@@ -3762,17 +3776,17 @@ var ICLOUD_SMTP_POLICY = {
|
|
|
3762
3776
|
max_recipients_per_message: 1
|
|
3763
3777
|
};
|
|
3764
3778
|
var SMTP_SECURITY = ["tls", "starttls"];
|
|
3765
|
-
var SmtpConfigBase =
|
|
3766
|
-
host:
|
|
3767
|
-
port:
|
|
3779
|
+
var SmtpConfigBase = z14.object({
|
|
3780
|
+
host: z14.string().min(1).max(255),
|
|
3781
|
+
port: z14.number().int().min(1).max(65535),
|
|
3768
3782
|
/** `tls` connects encrypted (465), `starttls` upgrades (587). Never plaintext. */
|
|
3769
|
-
security:
|
|
3770
|
-
username:
|
|
3783
|
+
security: z14.enum(SMTP_SECURITY),
|
|
3784
|
+
username: z14.string().min(1).max(255)
|
|
3771
3785
|
});
|
|
3772
|
-
var ResendConfigBase =
|
|
3773
|
-
var ProviderRejections =
|
|
3774
|
-
count:
|
|
3775
|
-
last_error:
|
|
3786
|
+
var ResendConfigBase = z14.object({});
|
|
3787
|
+
var ProviderRejections = z14.object({
|
|
3788
|
+
count: z14.number().int().min(0),
|
|
3789
|
+
last_error: z14.string().nullable(),
|
|
3776
3790
|
last_at: Timestamp.nullable(),
|
|
3777
3791
|
/**
|
|
3778
3792
|
* The last time the bounce circuit breaker tripped on one of this provider's
|
|
@@ -3782,59 +3796,59 @@ var ProviderRejections = z13.object({
|
|
|
3782
3796
|
* run's bounce blocks were undone and the mailing paused. `sample` is the
|
|
3783
3797
|
* reply that tripped it.
|
|
3784
3798
|
*/
|
|
3785
|
-
anomaly:
|
|
3799
|
+
anomaly: z14.object({
|
|
3786
3800
|
at: Timestamp,
|
|
3787
3801
|
/** `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. */
|
|
3788
|
-
scope:
|
|
3802
|
+
scope: z14.enum(["mailing", "provider"]),
|
|
3789
3803
|
/**
|
|
3790
3804
|
* True while the provider-wide breaker is open: no bounce blocks through
|
|
3791
3805
|
* this provider, test sends refused and mailings not started or resumed
|
|
3792
3806
|
* (`provider_anomaly`), until an admin clears it (`providers.clearAnomaly`).
|
|
3793
3807
|
*/
|
|
3794
|
-
blocking:
|
|
3808
|
+
blocking: z14.boolean(),
|
|
3795
3809
|
mailing_id: Id.nullable(),
|
|
3796
|
-
reason:
|
|
3797
|
-
sample:
|
|
3810
|
+
reason: z14.string(),
|
|
3811
|
+
sample: z14.string()
|
|
3798
3812
|
}).nullable()
|
|
3799
3813
|
});
|
|
3800
|
-
var ProviderEvents =
|
|
3801
|
-
status:
|
|
3802
|
-
source:
|
|
3803
|
-
url:
|
|
3804
|
-
error:
|
|
3814
|
+
var ProviderEvents = z14.object({
|
|
3815
|
+
status: z14.enum(["active", "needs_secret"]),
|
|
3816
|
+
source: z14.enum(["automatic", "manual", "managed"]).nullable(),
|
|
3817
|
+
url: z14.string().url(),
|
|
3818
|
+
error: z14.string().nullable(),
|
|
3805
3819
|
/**
|
|
3806
3820
|
* Events that named an email this provider never sent through the service
|
|
3807
3821
|
* (another workspace or system sharing the Resend account): counted, never
|
|
3808
3822
|
* acted on.
|
|
3809
3823
|
*/
|
|
3810
|
-
unmatched:
|
|
3824
|
+
unmatched: z14.number().int().min(0)
|
|
3811
3825
|
});
|
|
3812
3826
|
var RESEND_EVENT_TYPES = ["email.bounced", "email.complained", "email.delivery_delayed"];
|
|
3813
|
-
var ResendSigningSecret =
|
|
3814
|
-
var ProviderEventsSecret =
|
|
3827
|
+
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_");
|
|
3828
|
+
var ProviderEventsSecret = z14.object({ signing_secret: ResendSigningSecret });
|
|
3815
3829
|
var ProviderFields = {
|
|
3816
|
-
name:
|
|
3817
|
-
from_name:
|
|
3830
|
+
name: z14.string().min(1).max(120),
|
|
3831
|
+
from_name: z14.string().min(1).max(120),
|
|
3818
3832
|
from_email: Email,
|
|
3819
3833
|
reply_to: Email.nullable(),
|
|
3820
3834
|
policy: ProviderPolicy
|
|
3821
3835
|
};
|
|
3822
|
-
var Provider =
|
|
3823
|
-
|
|
3836
|
+
var Provider = z14.discriminatedUnion("kind", [
|
|
3837
|
+
z14.object({
|
|
3824
3838
|
id: Id,
|
|
3825
|
-
kind:
|
|
3839
|
+
kind: z14.literal("smtp"),
|
|
3826
3840
|
config: SmtpConfigBase,
|
|
3827
|
-
has_secret:
|
|
3841
|
+
has_secret: z14.boolean(),
|
|
3828
3842
|
...ProviderFields,
|
|
3829
3843
|
rejections: ProviderRejections,
|
|
3830
3844
|
created_at: Timestamp,
|
|
3831
3845
|
updated_at: Timestamp
|
|
3832
3846
|
}),
|
|
3833
|
-
|
|
3847
|
+
z14.object({
|
|
3834
3848
|
id: Id,
|
|
3835
|
-
kind:
|
|
3849
|
+
kind: z14.literal("resend"),
|
|
3836
3850
|
config: ResendConfigBase,
|
|
3837
|
-
has_secret:
|
|
3851
|
+
has_secret: z14.boolean(),
|
|
3838
3852
|
...ProviderFields,
|
|
3839
3853
|
rejections: ProviderRejections,
|
|
3840
3854
|
events: ProviderEvents,
|
|
@@ -3842,31 +3856,31 @@ var Provider = z13.discriminatedUnion("kind", [
|
|
|
3842
3856
|
updated_at: Timestamp
|
|
3843
3857
|
})
|
|
3844
3858
|
]);
|
|
3845
|
-
var ProviderCreate =
|
|
3846
|
-
|
|
3847
|
-
kind:
|
|
3848
|
-
config: SmtpConfigBase.extend({ password:
|
|
3859
|
+
var ProviderCreate = z14.discriminatedUnion("kind", [
|
|
3860
|
+
z14.object({
|
|
3861
|
+
kind: z14.literal("smtp"),
|
|
3862
|
+
config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024) }),
|
|
3849
3863
|
...ProviderFields
|
|
3850
3864
|
}),
|
|
3851
|
-
|
|
3852
|
-
kind:
|
|
3853
|
-
config: ResendConfigBase.extend({ api_key:
|
|
3865
|
+
z14.object({
|
|
3866
|
+
kind: z14.literal("resend"),
|
|
3867
|
+
config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024) }),
|
|
3854
3868
|
...ProviderFields
|
|
3855
3869
|
})
|
|
3856
3870
|
]);
|
|
3857
|
-
var ProviderUpdate =
|
|
3858
|
-
|
|
3859
|
-
kind:
|
|
3860
|
-
config: SmtpConfigBase.extend({ password:
|
|
3871
|
+
var ProviderUpdate = z14.discriminatedUnion("kind", [
|
|
3872
|
+
z14.object({
|
|
3873
|
+
kind: z14.literal("smtp"),
|
|
3874
|
+
config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024).optional() }).partial().optional(),
|
|
3861
3875
|
name: ProviderFields.name.optional(),
|
|
3862
3876
|
from_name: ProviderFields.from_name.optional(),
|
|
3863
3877
|
from_email: ProviderFields.from_email.optional(),
|
|
3864
3878
|
reply_to: ProviderFields.reply_to.optional(),
|
|
3865
3879
|
policy: ProviderPolicy.partial().optional()
|
|
3866
3880
|
}),
|
|
3867
|
-
|
|
3868
|
-
kind:
|
|
3869
|
-
config: ResendConfigBase.extend({ api_key:
|
|
3881
|
+
z14.object({
|
|
3882
|
+
kind: z14.literal("resend"),
|
|
3883
|
+
config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024).optional() }).optional(),
|
|
3870
3884
|
name: ProviderFields.name.optional(),
|
|
3871
3885
|
from_name: ProviderFields.from_name.optional(),
|
|
3872
3886
|
from_email: ProviderFields.from_email.optional(),
|
|
@@ -3874,37 +3888,37 @@ var ProviderUpdate = z13.discriminatedUnion("kind", [
|
|
|
3874
3888
|
policy: ProviderPolicy.partial().optional()
|
|
3875
3889
|
})
|
|
3876
3890
|
]);
|
|
3877
|
-
var ProviderUsage =
|
|
3891
|
+
var ProviderUsage = z14.object({
|
|
3878
3892
|
provider_id: Id,
|
|
3879
|
-
recipients_last_24h:
|
|
3880
|
-
remaining_budget:
|
|
3893
|
+
recipients_last_24h: z14.number().int().min(0),
|
|
3894
|
+
remaining_budget: z14.number().int().min(0),
|
|
3881
3895
|
/** When enough of the rolling window frees up to send again, if exhausted. */
|
|
3882
3896
|
next_capacity_at: Timestamp.nullable()
|
|
3883
3897
|
});
|
|
3884
|
-
var ProviderVerifyResult =
|
|
3885
|
-
ok:
|
|
3886
|
-
error:
|
|
3898
|
+
var ProviderVerifyResult = z14.object({
|
|
3899
|
+
ok: z14.boolean(),
|
|
3900
|
+
error: z14.string().nullable()
|
|
3887
3901
|
});
|
|
3888
3902
|
|
|
3889
3903
|
// src/sending-domains.ts
|
|
3890
|
-
import { z as
|
|
3904
|
+
import { z as z15 } from "zod";
|
|
3891
3905
|
var SENDING_DOMAIN_STATUSES = ["pending_dns", "verifying", "verified", "failed", "temporary_failure"];
|
|
3892
|
-
var SendingDomainStatus =
|
|
3906
|
+
var SendingDomainStatus = z15.enum(SENDING_DOMAIN_STATUSES);
|
|
3893
3907
|
var SENDING_DOMAIN_DNS_MODES = ["manual", "managed"];
|
|
3894
|
-
var SendingDomainDnsMode =
|
|
3908
|
+
var SendingDomainDnsMode = z15.enum(SENDING_DOMAIN_DNS_MODES);
|
|
3895
3909
|
var SENDING_DOMAIN_REGION = "eu-west-1";
|
|
3896
|
-
var SendingDomainName =
|
|
3910
|
+
var SendingDomainName = z15.string().trim().toLowerCase().max(253).regex(
|
|
3897
3911
|
/^(?=.{1,253}$)(?!-)[a-z0-9-]{1,63}(?<!-)(\.(?!-)[a-z0-9-]{1,63}(?<!-))*\.[a-z]{2,63}$/,
|
|
3898
3912
|
"must be a domain such as example.com, without https:// or an @"
|
|
3899
3913
|
);
|
|
3900
|
-
var SendingDomainRecord =
|
|
3901
|
-
record:
|
|
3902
|
-
name:
|
|
3903
|
-
type:
|
|
3904
|
-
value:
|
|
3905
|
-
ttl:
|
|
3906
|
-
status:
|
|
3907
|
-
priority:
|
|
3914
|
+
var SendingDomainRecord = z15.object({
|
|
3915
|
+
record: z15.string().max(40),
|
|
3916
|
+
name: z15.string().max(253),
|
|
3917
|
+
type: z15.string().max(10),
|
|
3918
|
+
value: z15.string().max(4096),
|
|
3919
|
+
ttl: z15.string().max(20),
|
|
3920
|
+
status: z15.string().max(40),
|
|
3921
|
+
priority: z15.number().int().min(0).max(65535).optional()
|
|
3908
3922
|
});
|
|
3909
3923
|
function sendingDomainRecordFullName(domain, name) {
|
|
3910
3924
|
const d = domain.toLowerCase();
|
|
@@ -3917,66 +3931,66 @@ function sendingDomainRecordFullName(domain, name) {
|
|
|
3917
3931
|
}
|
|
3918
3932
|
return `${n}.${d}`;
|
|
3919
3933
|
}
|
|
3920
|
-
var SendingDomain =
|
|
3934
|
+
var SendingDomain = z15.object({
|
|
3921
3935
|
id: Id,
|
|
3922
|
-
domain:
|
|
3923
|
-
from_name:
|
|
3936
|
+
domain: z15.string(),
|
|
3937
|
+
from_name: z15.string(),
|
|
3924
3938
|
from_email: Email,
|
|
3925
3939
|
reply_to: Email.nullable(),
|
|
3926
3940
|
status: SendingDomainStatus,
|
|
3927
3941
|
dns_mode: SendingDomainDnsMode,
|
|
3928
|
-
records:
|
|
3942
|
+
records: z15.array(SendingDomainRecord),
|
|
3929
3943
|
provider_id: Id.nullable(),
|
|
3930
3944
|
checked_at: Timestamp.nullable(),
|
|
3931
3945
|
verified_at: Timestamp.nullable(),
|
|
3932
|
-
last_error:
|
|
3946
|
+
last_error: z15.string().nullable(),
|
|
3933
3947
|
created_at: Timestamp,
|
|
3934
3948
|
updated_at: Timestamp
|
|
3935
3949
|
});
|
|
3936
3950
|
var SenderFields = {
|
|
3937
|
-
from_name:
|
|
3951
|
+
from_name: z15.string().trim().min(1).max(120),
|
|
3938
3952
|
from_email: Email,
|
|
3939
3953
|
reply_to: Email.nullable().optional()
|
|
3940
3954
|
};
|
|
3941
3955
|
function senderOnDomain(input, ctx) {
|
|
3942
3956
|
const at = input.from_email.lastIndexOf("@");
|
|
3943
3957
|
if (at < 0 || input.from_email.slice(at + 1).toLowerCase() !== input.domain) {
|
|
3944
|
-
ctx.addIssue({ code:
|
|
3958
|
+
ctx.addIssue({ code: z15.ZodIssueCode.custom, path: ["from_email"], message: `must be an address on ${input.domain}` });
|
|
3945
3959
|
}
|
|
3946
3960
|
}
|
|
3947
|
-
var SendingDomainCreate =
|
|
3948
|
-
var SendingDomainUpdate =
|
|
3961
|
+
var SendingDomainCreate = z15.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
|
|
3962
|
+
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");
|
|
3949
3963
|
|
|
3950
3964
|
// src/contacts.ts
|
|
3951
|
-
import { z as
|
|
3952
|
-
var Topic =
|
|
3965
|
+
import { z as z16 } from "zod";
|
|
3966
|
+
var Topic = z16.object({
|
|
3953
3967
|
id: Id,
|
|
3954
3968
|
slug: Slug,
|
|
3955
|
-
name:
|
|
3969
|
+
name: z16.string().min(1).max(120),
|
|
3956
3970
|
/** Shown on the hosted preference page. */
|
|
3957
|
-
description:
|
|
3971
|
+
description: z16.string().max(1e3).nullable(),
|
|
3958
3972
|
/** Translations of `name` and `description` per locale, for the hosted page. */
|
|
3959
|
-
translations:
|
|
3960
|
-
|
|
3973
|
+
translations: z16.record(
|
|
3974
|
+
z16.object({ name: z16.string().min(1).max(120), description: z16.string().max(1e3).nullable() })
|
|
3961
3975
|
),
|
|
3962
3976
|
created_at: Timestamp,
|
|
3963
3977
|
updated_at: Timestamp
|
|
3964
3978
|
});
|
|
3965
|
-
var TopicCreate =
|
|
3979
|
+
var TopicCreate = z16.object({
|
|
3966
3980
|
slug: Slug,
|
|
3967
|
-
name:
|
|
3968
|
-
description:
|
|
3981
|
+
name: z16.string().min(1).max(120),
|
|
3982
|
+
description: z16.string().max(1e3).optional(),
|
|
3969
3983
|
translations: Topic.shape.translations.optional()
|
|
3970
3984
|
});
|
|
3971
3985
|
var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
3972
|
-
var Contact =
|
|
3986
|
+
var Contact = z16.object({
|
|
3973
3987
|
id: Id,
|
|
3974
|
-
external_id:
|
|
3988
|
+
external_id: z16.string().min(1).max(255).nullable(),
|
|
3975
3989
|
/** Stored lowercased, unique per workspace. */
|
|
3976
3990
|
email: Email,
|
|
3977
|
-
first_name:
|
|
3978
|
-
last_name:
|
|
3979
|
-
locale:
|
|
3991
|
+
first_name: z16.string().max(200).nullable(),
|
|
3992
|
+
last_name: z16.string().max(200).nullable(),
|
|
3993
|
+
locale: z16.string().min(2).max(35).nullable(),
|
|
3980
3994
|
/**
|
|
3981
3995
|
* The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
|
|
3982
3996
|
* Every wall clock an automation waits for is read in it, falling back to the
|
|
@@ -3984,65 +3998,65 @@ var Contact = z15.object({
|
|
|
3984
3998
|
*/
|
|
3985
3999
|
timezone: TimezoneName.nullable(),
|
|
3986
4000
|
properties: Properties,
|
|
3987
|
-
topics:
|
|
4001
|
+
topics: z16.array(Slug),
|
|
3988
4002
|
/** The slugs of the contact's tags (S4). */
|
|
3989
|
-
tags:
|
|
4003
|
+
tags: z16.array(Slug),
|
|
3990
4004
|
created_at: Timestamp,
|
|
3991
4005
|
updated_at: Timestamp
|
|
3992
4006
|
});
|
|
3993
|
-
var ContactUpsert =
|
|
3994
|
-
external_id:
|
|
4007
|
+
var ContactUpsert = z16.object({
|
|
4008
|
+
external_id: z16.string().min(1).max(255).optional(),
|
|
3995
4009
|
email: Email.optional(),
|
|
3996
|
-
first_name:
|
|
3997
|
-
last_name:
|
|
3998
|
-
locale:
|
|
4010
|
+
first_name: z16.string().max(200).nullable().optional(),
|
|
4011
|
+
last_name: z16.string().max(200).nullable().optional(),
|
|
4012
|
+
locale: z16.string().min(2).max(35).nullable().optional(),
|
|
3999
4013
|
timezone: TimezoneName.nullable().optional(),
|
|
4000
4014
|
properties: Properties.optional(),
|
|
4001
|
-
topics:
|
|
4015
|
+
topics: z16.array(Slug).max(100).optional()
|
|
4002
4016
|
}).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
|
|
4003
4017
|
message: "external_id or email is required",
|
|
4004
4018
|
path: ["email"]
|
|
4005
4019
|
});
|
|
4006
|
-
var ContactUpsertResult =
|
|
4020
|
+
var ContactUpsertResult = z16.object({
|
|
4007
4021
|
contact: Contact,
|
|
4008
|
-
created:
|
|
4022
|
+
created: z16.boolean()
|
|
4009
4023
|
});
|
|
4010
4024
|
var ContactListQuery = PageQuery.extend({
|
|
4011
|
-
email:
|
|
4012
|
-
external_id:
|
|
4025
|
+
email: z16.string().min(1).max(254).optional(),
|
|
4026
|
+
external_id: z16.string().min(1).max(255).optional(),
|
|
4013
4027
|
topic: Slug.optional()
|
|
4014
4028
|
});
|
|
4015
|
-
var ContactErased =
|
|
4016
|
-
ok:
|
|
4017
|
-
erased_messages:
|
|
4018
|
-
erased_recipients:
|
|
4019
|
-
suppressions_kept:
|
|
4029
|
+
var ContactErased = z16.object({
|
|
4030
|
+
ok: z16.literal(true),
|
|
4031
|
+
erased_messages: z16.number().int().min(0),
|
|
4032
|
+
erased_recipients: z16.number().int().min(0),
|
|
4033
|
+
suppressions_kept: z16.number().int().min(0)
|
|
4020
4034
|
});
|
|
4021
4035
|
var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
|
|
4022
|
-
var SuppressionReason =
|
|
4023
|
-
var Suppression =
|
|
4036
|
+
var SuppressionReason = z16.enum(SUPPRESSION_REASONS);
|
|
4037
|
+
var Suppression = z16.object({
|
|
4024
4038
|
id: Id,
|
|
4025
4039
|
email: Email,
|
|
4026
4040
|
reason: SuppressionReason,
|
|
4027
4041
|
topic: Slug.nullable(),
|
|
4028
4042
|
source_message_id: Id.nullable(),
|
|
4029
|
-
note:
|
|
4043
|
+
note: z16.string().max(1e3).nullable(),
|
|
4030
4044
|
created_at: Timestamp
|
|
4031
4045
|
});
|
|
4032
|
-
var SuppressionCreate =
|
|
4046
|
+
var SuppressionCreate = z16.object({
|
|
4033
4047
|
email: Email,
|
|
4034
|
-
reason:
|
|
4048
|
+
reason: z16.enum(["manual", "unsubscribed"]),
|
|
4035
4049
|
topic: Slug.nullable().optional(),
|
|
4036
|
-
note:
|
|
4050
|
+
note: z16.string().max(1e3).optional()
|
|
4037
4051
|
});
|
|
4038
4052
|
var SuppressionListQuery = PageQuery.extend({
|
|
4039
|
-
email:
|
|
4053
|
+
email: z16.string().min(1).max(254).optional(),
|
|
4040
4054
|
reason: SuppressionReason.optional(),
|
|
4041
4055
|
topic: Slug.optional()
|
|
4042
4056
|
});
|
|
4043
4057
|
|
|
4044
4058
|
// src/webhooks.ts
|
|
4045
|
-
import { z as
|
|
4059
|
+
import { z as z17 } from "zod";
|
|
4046
4060
|
var WEBHOOK_EVENT_TYPES = [
|
|
4047
4061
|
"message.sent",
|
|
4048
4062
|
"message.failed",
|
|
@@ -4086,23 +4100,23 @@ var WEBHOOK_EVENT_TYPES = [
|
|
|
4086
4100
|
"template.updated",
|
|
4087
4101
|
"template.deleted"
|
|
4088
4102
|
];
|
|
4089
|
-
var WebhookEventType =
|
|
4090
|
-
var MessageEventBase =
|
|
4103
|
+
var WebhookEventType = z17.enum(WEBHOOK_EVENT_TYPES);
|
|
4104
|
+
var MessageEventBase = z17.object({
|
|
4091
4105
|
message_id: Id,
|
|
4092
4106
|
mailing_id: Id.nullable(),
|
|
4093
4107
|
mailing_metadata: MailingMetadata.nullable(),
|
|
4094
4108
|
recipient_id: Id.nullable(),
|
|
4095
4109
|
contact_id: Id.nullable(),
|
|
4096
|
-
external_id:
|
|
4110
|
+
external_id: z17.string().nullable(),
|
|
4097
4111
|
email: Email,
|
|
4098
|
-
subject:
|
|
4112
|
+
subject: z17.string(),
|
|
4099
4113
|
topic: Slug.nullable(),
|
|
4100
|
-
provider_message_id:
|
|
4101
|
-
is_test:
|
|
4114
|
+
provider_message_id: z17.string().nullable(),
|
|
4115
|
+
is_test: z17.boolean()
|
|
4102
4116
|
});
|
|
4103
4117
|
var MessageSentData = MessageEventBase.extend({
|
|
4104
4118
|
/** The final HTML as sent, so the client can archive it beside its own records. */
|
|
4105
|
-
html:
|
|
4119
|
+
html: z17.string(),
|
|
4106
4120
|
sent_at: Timestamp,
|
|
4107
4121
|
/**
|
|
4108
4122
|
* The choice each insertion made (see `Message.insertions`); absent or null
|
|
@@ -4113,20 +4127,20 @@ var MessageSentData = MessageEventBase.extend({
|
|
|
4113
4127
|
insertions: InsertionChoices.nullish()
|
|
4114
4128
|
});
|
|
4115
4129
|
var MessageFailedData = MessageEventBase.extend({
|
|
4116
|
-
error:
|
|
4130
|
+
error: z17.string(),
|
|
4117
4131
|
/** False when the provider rejected permanently; the recipient will not be retried. */
|
|
4118
|
-
retryable:
|
|
4132
|
+
retryable: z17.boolean(),
|
|
4119
4133
|
failed_at: Timestamp
|
|
4120
4134
|
});
|
|
4121
4135
|
var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
|
|
4122
|
-
var ContactUnsubscribedData =
|
|
4136
|
+
var ContactUnsubscribedData = z17.object({
|
|
4123
4137
|
contact_id: Id.nullable(),
|
|
4124
|
-
external_id:
|
|
4138
|
+
external_id: z17.string().nullable(),
|
|
4125
4139
|
email: Email,
|
|
4126
4140
|
/** The topic unsubscribed from; null means every topic. */
|
|
4127
4141
|
topic: Slug.nullable(),
|
|
4128
4142
|
mailing_id: Id.nullable(),
|
|
4129
|
-
source:
|
|
4143
|
+
source: z17.enum(UNSUBSCRIBE_SOURCES),
|
|
4130
4144
|
unsubscribed_at: Timestamp
|
|
4131
4145
|
});
|
|
4132
4146
|
var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
|
|
@@ -4135,142 +4149,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
|
|
|
4135
4149
|
* breaker undid a `bounced` block it judged false (a `contact.bounced` for the
|
|
4136
4150
|
* same address and mailing went out before); `topic` is null.
|
|
4137
4151
|
*/
|
|
4138
|
-
source:
|
|
4152
|
+
source: z17.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
|
|
4139
4153
|
resubscribed_at: Timestamp
|
|
4140
4154
|
});
|
|
4141
|
-
var ContactBouncedData =
|
|
4155
|
+
var ContactBouncedData = z17.object({
|
|
4142
4156
|
contact_id: Id.nullable(),
|
|
4143
|
-
external_id:
|
|
4157
|
+
external_id: z17.string().nullable(),
|
|
4144
4158
|
email: Email,
|
|
4145
4159
|
/** `bounced` for a hard bounce, `complained` for a spam complaint. */
|
|
4146
|
-
reason:
|
|
4160
|
+
reason: z17.enum(["bounced", "complained"]),
|
|
4147
4161
|
message_id: Id.nullable(),
|
|
4148
|
-
diagnostic:
|
|
4162
|
+
diagnostic: z17.string().nullable(),
|
|
4149
4163
|
bounced_at: Timestamp
|
|
4150
4164
|
});
|
|
4151
|
-
var MailingFinishedData =
|
|
4165
|
+
var MailingFinishedData = z17.object({
|
|
4152
4166
|
mailing_id: Id,
|
|
4153
4167
|
mailing_metadata: MailingMetadata,
|
|
4154
|
-
status:
|
|
4168
|
+
status: z17.enum(["sent", "partially_failed", "cancelled"]),
|
|
4155
4169
|
counts: MailingCounts,
|
|
4156
4170
|
finished_at: Timestamp
|
|
4157
4171
|
});
|
|
4158
|
-
var ContactSubscribedData =
|
|
4172
|
+
var ContactSubscribedData = z17.object({
|
|
4159
4173
|
contact_id: Id,
|
|
4160
|
-
external_id:
|
|
4174
|
+
external_id: z17.string().nullable(),
|
|
4161
4175
|
email: Email,
|
|
4162
|
-
topics:
|
|
4163
|
-
source:
|
|
4176
|
+
topics: z17.array(Slug),
|
|
4177
|
+
source: z17.enum(["signup_form", "api", "dashboard", "automation"]),
|
|
4164
4178
|
signup_form_id: Id.nullable(),
|
|
4165
|
-
signup_form_version:
|
|
4179
|
+
signup_form_version: z17.number().int().min(1).nullable(),
|
|
4166
4180
|
subscribed_at: Timestamp
|
|
4167
4181
|
});
|
|
4168
|
-
var ImportFinishedData =
|
|
4182
|
+
var ImportFinishedData = z17.object({
|
|
4169
4183
|
import_id: Id,
|
|
4170
|
-
status:
|
|
4184
|
+
status: z17.enum(["completed", "cancelled", "failed"]),
|
|
4171
4185
|
result: ImportReport.nullable(),
|
|
4172
|
-
error:
|
|
4186
|
+
error: z17.string().nullable(),
|
|
4173
4187
|
finished_at: Timestamp
|
|
4174
4188
|
});
|
|
4175
|
-
var MailingScheduledData =
|
|
4189
|
+
var MailingScheduledData = z17.object({
|
|
4176
4190
|
mailing_id: Id,
|
|
4177
4191
|
mailing_metadata: MailingMetadata,
|
|
4178
4192
|
scheduled_at: Timestamp.nullable()
|
|
4179
4193
|
});
|
|
4180
|
-
var MailingStartedData =
|
|
4194
|
+
var MailingStartedData = z17.object({
|
|
4181
4195
|
mailing_id: Id,
|
|
4182
4196
|
mailing_metadata: MailingMetadata,
|
|
4183
|
-
trigger:
|
|
4184
|
-
recipients:
|
|
4197
|
+
trigger: z17.enum(["send", "schedule"]),
|
|
4198
|
+
recipients: z17.number().int().min(0),
|
|
4185
4199
|
started_at: Timestamp
|
|
4186
4200
|
});
|
|
4187
|
-
var MailingScheduleFailedData =
|
|
4201
|
+
var MailingScheduleFailedData = z17.object({
|
|
4188
4202
|
mailing_id: Id,
|
|
4189
4203
|
mailing_metadata: MailingMetadata,
|
|
4190
|
-
code:
|
|
4191
|
-
message:
|
|
4204
|
+
code: z17.string(),
|
|
4205
|
+
message: z17.string(),
|
|
4192
4206
|
failed_at: Timestamp
|
|
4193
4207
|
});
|
|
4194
|
-
var MailingAbWinnerSelectedData =
|
|
4208
|
+
var MailingAbWinnerSelectedData = z17.object({
|
|
4195
4209
|
mailing_id: Id,
|
|
4196
4210
|
mailing_metadata: MailingMetadata,
|
|
4197
|
-
winner:
|
|
4198
|
-
decided_by:
|
|
4199
|
-
variants:
|
|
4211
|
+
winner: z17.string(),
|
|
4212
|
+
decided_by: z17.enum(["metric", "manual"]),
|
|
4213
|
+
variants: z17.array(VariantAnalytics),
|
|
4200
4214
|
decided_at: Timestamp
|
|
4201
4215
|
});
|
|
4202
|
-
var ContactTaggedData =
|
|
4216
|
+
var ContactTaggedData = z17.object({
|
|
4203
4217
|
contact_id: Id,
|
|
4204
|
-
external_id:
|
|
4218
|
+
external_id: z17.string().nullable(),
|
|
4205
4219
|
email: Email,
|
|
4206
4220
|
/** Only the tags the contact did not already have. */
|
|
4207
|
-
tags:
|
|
4208
|
-
source:
|
|
4221
|
+
tags: z17.array(Slug).min(1),
|
|
4222
|
+
source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4209
4223
|
tagged_at: Timestamp
|
|
4210
4224
|
});
|
|
4211
|
-
var ContactUpdatedData =
|
|
4225
|
+
var ContactUpdatedData = z17.object({
|
|
4212
4226
|
contact_id: Id,
|
|
4213
|
-
external_id:
|
|
4227
|
+
external_id: z17.string().nullable(),
|
|
4214
4228
|
email: Email,
|
|
4215
|
-
changed:
|
|
4229
|
+
changed: z17.array(z17.string()).min(1),
|
|
4216
4230
|
properties: Properties,
|
|
4217
|
-
source:
|
|
4231
|
+
source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
|
|
4218
4232
|
updated_at: Timestamp
|
|
4219
4233
|
});
|
|
4220
|
-
var AutomationRunEventBase =
|
|
4234
|
+
var AutomationRunEventBase = z17.object({
|
|
4221
4235
|
automation_id: Id,
|
|
4222
|
-
automation_name:
|
|
4236
|
+
automation_name: z17.string(),
|
|
4223
4237
|
run_id: Id,
|
|
4224
|
-
version:
|
|
4238
|
+
version: z17.number().int().min(1),
|
|
4225
4239
|
contact_id: Id,
|
|
4226
|
-
external_id:
|
|
4240
|
+
external_id: z17.string().nullable(),
|
|
4227
4241
|
email: Email
|
|
4228
4242
|
});
|
|
4229
4243
|
var AutomationRunStartedData = AutomationRunEventBase.extend({
|
|
4230
4244
|
/** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
|
|
4231
|
-
trigger_kind:
|
|
4245
|
+
trigger_kind: z17.string(),
|
|
4232
4246
|
entered_at: Timestamp
|
|
4233
4247
|
});
|
|
4234
4248
|
var AutomationRunCompletedData = AutomationRunEventBase.extend({
|
|
4235
|
-
last_step_id:
|
|
4249
|
+
last_step_id: z17.string().nullable(),
|
|
4236
4250
|
completed_at: Timestamp
|
|
4237
4251
|
});
|
|
4238
4252
|
var AutomationRunExitedData = AutomationRunEventBase.extend({
|
|
4239
4253
|
reason: AutomationEndReason,
|
|
4240
|
-
step_id:
|
|
4254
|
+
step_id: z17.string().nullable(),
|
|
4241
4255
|
exited_at: Timestamp
|
|
4242
4256
|
});
|
|
4243
4257
|
var AutomationRunFailedData = AutomationRunEventBase.extend({
|
|
4244
|
-
reason:
|
|
4245
|
-
step_id:
|
|
4258
|
+
reason: z17.string(),
|
|
4259
|
+
step_id: z17.string().nullable(),
|
|
4246
4260
|
failed_at: Timestamp
|
|
4247
4261
|
});
|
|
4248
4262
|
var AutomationWebhookData = AutomationRunEventBase.extend({
|
|
4249
|
-
step_id:
|
|
4263
|
+
step_id: z17.string(),
|
|
4250
4264
|
/** The step's own label, when it was given one, so a receiver can branch on a name. */
|
|
4251
|
-
step_label:
|
|
4265
|
+
step_label: z17.string().nullable(),
|
|
4252
4266
|
/** Whatever the step carries, verbatim. Null when it carries nothing. */
|
|
4253
4267
|
payload: JsonValue.nullable(),
|
|
4254
4268
|
fired_at: Timestamp
|
|
4255
4269
|
});
|
|
4256
|
-
var TemplateEventBase =
|
|
4270
|
+
var TemplateEventBase = z17.object({
|
|
4257
4271
|
template_id: Id,
|
|
4258
|
-
name:
|
|
4259
|
-
version:
|
|
4260
|
-
source:
|
|
4272
|
+
name: z17.string().min(1).max(200),
|
|
4273
|
+
version: z17.number().int().min(1),
|
|
4274
|
+
source: z17.enum(["api", "dashboard", "mjml_import"])
|
|
4261
4275
|
});
|
|
4262
4276
|
var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
|
|
4263
|
-
var TemplateUpdatedData = TemplateEventBase.extend({ archived:
|
|
4277
|
+
var TemplateUpdatedData = TemplateEventBase.extend({ archived: z17.boolean(), updated_at: Timestamp });
|
|
4264
4278
|
var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
|
|
4265
|
-
var envelope = (type, data) =>
|
|
4279
|
+
var envelope = (type, data) => z17.object({
|
|
4266
4280
|
/** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
|
|
4267
4281
|
id: Id,
|
|
4268
|
-
type:
|
|
4282
|
+
type: z17.literal(type),
|
|
4269
4283
|
created_at: Timestamp,
|
|
4270
4284
|
workspace_id: Id,
|
|
4271
4285
|
data
|
|
4272
4286
|
});
|
|
4273
|
-
var WebhookEvent =
|
|
4287
|
+
var WebhookEvent = z17.discriminatedUnion("type", [
|
|
4274
4288
|
envelope("message.sent", MessageSentData),
|
|
4275
4289
|
envelope("message.failed", MessageFailedData),
|
|
4276
4290
|
envelope("contact.unsubscribed", ContactUnsubscribedData),
|
|
@@ -4294,16 +4308,16 @@ var WebhookEvent = z16.discriminatedUnion("type", [
|
|
|
4294
4308
|
envelope("template.updated", TemplateUpdatedData),
|
|
4295
4309
|
envelope("template.deleted", TemplateDeletedData)
|
|
4296
4310
|
]);
|
|
4297
|
-
var WebhookEndpoint =
|
|
4311
|
+
var WebhookEndpoint = z17.object({
|
|
4298
4312
|
id: Id,
|
|
4299
|
-
url:
|
|
4300
|
-
description:
|
|
4301
|
-
events:
|
|
4302
|
-
enabled:
|
|
4313
|
+
url: z17.string().url(),
|
|
4314
|
+
description: z17.string().max(500).nullable(),
|
|
4315
|
+
events: z17.array(WebhookEventType).min(1),
|
|
4316
|
+
enabled: z17.boolean(),
|
|
4303
4317
|
created_at: Timestamp,
|
|
4304
4318
|
updated_at: Timestamp
|
|
4305
4319
|
});
|
|
4306
|
-
var WebhookUrl =
|
|
4320
|
+
var WebhookUrl = z17.string().url().refine((u) => {
|
|
4307
4321
|
try {
|
|
4308
4322
|
const url = new URL(u);
|
|
4309
4323
|
if (url.protocol === "https:") return true;
|
|
@@ -4312,35 +4326,35 @@ var WebhookUrl = z16.string().url().refine((u) => {
|
|
|
4312
4326
|
return false;
|
|
4313
4327
|
}
|
|
4314
4328
|
}, "must be https (http only for localhost)");
|
|
4315
|
-
var WebhookEndpointCreate =
|
|
4329
|
+
var WebhookEndpointCreate = z17.object({
|
|
4316
4330
|
url: WebhookUrl,
|
|
4317
|
-
description:
|
|
4318
|
-
events:
|
|
4319
|
-
enabled:
|
|
4331
|
+
description: z17.string().max(500).optional(),
|
|
4332
|
+
events: z17.array(WebhookEventType).min(1),
|
|
4333
|
+
enabled: z17.boolean().optional()
|
|
4320
4334
|
});
|
|
4321
|
-
var WebhookEndpointUpdate =
|
|
4335
|
+
var WebhookEndpointUpdate = z17.object({
|
|
4322
4336
|
url: WebhookUrl,
|
|
4323
|
-
description:
|
|
4324
|
-
events:
|
|
4325
|
-
enabled:
|
|
4337
|
+
description: z17.string().max(500).nullable(),
|
|
4338
|
+
events: z17.array(WebhookEventType).min(1),
|
|
4339
|
+
enabled: z17.boolean()
|
|
4326
4340
|
}).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
|
|
4327
|
-
var WebhookEndpointWithSecret =
|
|
4341
|
+
var WebhookEndpointWithSecret = z17.object({
|
|
4328
4342
|
endpoint: WebhookEndpoint,
|
|
4329
|
-
secret:
|
|
4343
|
+
secret: z17.string().min(32)
|
|
4330
4344
|
});
|
|
4331
4345
|
var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
|
|
4332
|
-
var WebhookDeliveryStatus =
|
|
4346
|
+
var WebhookDeliveryStatus = z17.enum(WEBHOOK_DELIVERY_STATUSES);
|
|
4333
4347
|
var WEBHOOK_MAX_ATTEMPTS = 8;
|
|
4334
4348
|
var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
|
|
4335
|
-
var WebhookDelivery =
|
|
4349
|
+
var WebhookDelivery = z17.object({
|
|
4336
4350
|
id: Id,
|
|
4337
4351
|
endpoint_id: Id,
|
|
4338
4352
|
event_id: Id,
|
|
4339
4353
|
event_type: WebhookEventType,
|
|
4340
4354
|
status: WebhookDeliveryStatus,
|
|
4341
|
-
attempts:
|
|
4342
|
-
last_status_code:
|
|
4343
|
-
last_error:
|
|
4355
|
+
attempts: z17.number().int().min(0),
|
|
4356
|
+
last_status_code: z17.number().int().min(100).max(599).nullable(),
|
|
4357
|
+
last_error: z17.string().nullable(),
|
|
4344
4358
|
next_attempt_at: Timestamp.nullable(),
|
|
4345
4359
|
delivered_at: Timestamp.nullable(),
|
|
4346
4360
|
created_at: Timestamp
|
|
@@ -4349,7 +4363,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
|
|
|
4349
4363
|
status: WebhookDeliveryStatus.optional(),
|
|
4350
4364
|
event_type: WebhookEventType.optional()
|
|
4351
4365
|
});
|
|
4352
|
-
var WebhookDeliveryParams =
|
|
4366
|
+
var WebhookDeliveryParams = z17.object({ id: Id, delivery_id: Id });
|
|
4353
4367
|
|
|
4354
4368
|
// src/webhook-signing.ts
|
|
4355
4369
|
var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
|
|
@@ -4416,94 +4430,99 @@ async function verifyWebhook(input) {
|
|
|
4416
4430
|
}
|
|
4417
4431
|
|
|
4418
4432
|
// src/billing.ts
|
|
4419
|
-
import { z as
|
|
4433
|
+
import { z as z18 } from "zod";
|
|
4420
4434
|
var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
|
|
4421
|
-
var PlanId =
|
|
4422
|
-
var PlanLimits =
|
|
4423
|
-
monthly_messages:
|
|
4424
|
-
contacts:
|
|
4425
|
-
members:
|
|
4426
|
-
providers:
|
|
4427
|
-
webhook_endpoints:
|
|
4435
|
+
var PlanId = z18.enum(PLAN_IDS);
|
|
4436
|
+
var PlanLimits = z18.object({
|
|
4437
|
+
monthly_messages: z18.number().int().min(0).nullable(),
|
|
4438
|
+
contacts: z18.number().int().min(0).nullable(),
|
|
4439
|
+
members: z18.number().int().min(1).nullable(),
|
|
4440
|
+
providers: z18.number().int().min(1).nullable(),
|
|
4441
|
+
webhook_endpoints: z18.number().int().min(0).nullable(),
|
|
4428
4442
|
/** Automations that may be live (active or paused) at once (A1). */
|
|
4429
|
-
active_automations:
|
|
4443
|
+
active_automations: z18.number().int().min(0).nullable(),
|
|
4430
4444
|
/** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
|
|
4431
|
-
automation_steps:
|
|
4445
|
+
automation_steps: z18.number().int().min(1).nullable(),
|
|
4432
4446
|
/** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
|
|
4433
|
-
sending_domains:
|
|
4447
|
+
sending_domains: z18.number().int().min(0).nullable()
|
|
4434
4448
|
});
|
|
4435
|
-
var PlanFeatures =
|
|
4449
|
+
var PlanFeatures = z18.object({
|
|
4436
4450
|
/** A/B tests of subject and content on a mailing (S4). */
|
|
4437
|
-
ab_testing:
|
|
4451
|
+
ab_testing: z18.boolean(),
|
|
4438
4452
|
/** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
|
|
4439
|
-
tracking:
|
|
4453
|
+
tracking: z18.boolean(),
|
|
4440
4454
|
/** Automations: flows a person walks through step by step (A1). */
|
|
4441
|
-
automations:
|
|
4455
|
+
automations: z18.boolean()
|
|
4442
4456
|
});
|
|
4443
4457
|
var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
|
|
4444
|
-
var Plan =
|
|
4458
|
+
var Plan = z18.object({
|
|
4445
4459
|
id: PlanId,
|
|
4446
|
-
name:
|
|
4460
|
+
name: z18.string().min(1),
|
|
4447
4461
|
/** Price in the smallest currency unit per month; null for plans not sold. */
|
|
4448
|
-
monthly_price_cents:
|
|
4449
|
-
currency:
|
|
4462
|
+
monthly_price_cents: z18.number().int().min(0).nullable(),
|
|
4463
|
+
currency: z18.string().length(3),
|
|
4450
4464
|
limits: PlanLimits,
|
|
4451
4465
|
features: PlanFeatures
|
|
4452
4466
|
});
|
|
4453
|
-
var CatalogPlan = Plan.extend({ sellable:
|
|
4454
|
-
var Subscription =
|
|
4467
|
+
var CatalogPlan = Plan.extend({ sellable: z18.boolean() });
|
|
4468
|
+
var Subscription = z18.object({
|
|
4455
4469
|
workspace_id: Id,
|
|
4456
4470
|
plan: PlanId,
|
|
4457
|
-
status:
|
|
4471
|
+
status: z18.enum(["active", "trialing", "past_due", "cancelled"]),
|
|
4458
4472
|
current_period_start: Timestamp,
|
|
4459
4473
|
current_period_end: Timestamp,
|
|
4460
|
-
cancel_at_period_end:
|
|
4474
|
+
cancel_at_period_end: z18.boolean(),
|
|
4461
4475
|
/**
|
|
4462
4476
|
* A design partner outside billing (plan `design_partner`, no limits, no
|
|
4463
4477
|
* checkout). Set only by an operator, never through the API.
|
|
4464
4478
|
*/
|
|
4465
|
-
billing_exempt:
|
|
4479
|
+
billing_exempt: z18.boolean(),
|
|
4466
4480
|
/**
|
|
4467
4481
|
* Own sending domains bought on top of the plan's included ones (the
|
|
4468
4482
|
* add-on), each a monthly charge on the same subscription. 0 without the
|
|
4469
4483
|
* add-on; the usage limit `sending_domains` is the plan's plus these.
|
|
4470
4484
|
*/
|
|
4471
|
-
extra_sending_domains:
|
|
4485
|
+
extra_sending_domains: z18.number().int().min(0)
|
|
4472
4486
|
});
|
|
4473
|
-
var BillingAddons =
|
|
4474
|
-
sending_domain:
|
|
4475
|
-
monthly_price_cents:
|
|
4476
|
-
currency:
|
|
4477
|
-
sellable:
|
|
4487
|
+
var BillingAddons = z18.object({
|
|
4488
|
+
sending_domain: z18.object({
|
|
4489
|
+
monthly_price_cents: z18.number().int().min(0),
|
|
4490
|
+
currency: z18.string().length(3),
|
|
4491
|
+
sellable: z18.boolean()
|
|
4478
4492
|
})
|
|
4479
4493
|
});
|
|
4480
4494
|
var MAX_EXTRA_SENDING_DOMAINS = 100;
|
|
4481
|
-
var ExtraSendingDomainsUpdate =
|
|
4495
|
+
var ExtraSendingDomainsUpdate = z18.object({ quantity: z18.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
|
|
4482
4496
|
var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
|
|
4483
|
-
var UsageMetric =
|
|
4497
|
+
var UsageMetric = z18.enum(USAGE_METRICS);
|
|
4484
4498
|
var USAGE_WARNING_RATIO = 0.8;
|
|
4485
|
-
var UsageWarning =
|
|
4499
|
+
var UsageWarning = z18.object({
|
|
4486
4500
|
metric: UsageMetric,
|
|
4487
|
-
used:
|
|
4488
|
-
limit:
|
|
4501
|
+
used: z18.number().int().min(0),
|
|
4502
|
+
limit: z18.number().int().min(0),
|
|
4489
4503
|
/** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
|
|
4490
|
-
level:
|
|
4504
|
+
level: z18.enum(["approaching", "reached"])
|
|
4491
4505
|
});
|
|
4492
|
-
var
|
|
4506
|
+
var TermsStatus = z18.object({ accepted_version: z18.string().nullable(), current_version: z18.string() });
|
|
4507
|
+
var Usage = z18.object({
|
|
4493
4508
|
plan: PlanId,
|
|
4494
4509
|
period_start: Timestamp,
|
|
4495
4510
|
period_end: Timestamp,
|
|
4496
|
-
metrics:
|
|
4497
|
-
warnings:
|
|
4498
|
-
|
|
4499
|
-
|
|
4500
|
-
|
|
4501
|
-
|
|
4502
|
-
|
|
4503
|
-
|
|
4504
|
-
|
|
4505
|
-
|
|
4506
|
-
|
|
4511
|
+
metrics: z18.record(UsageMetric, z18.object({ used: z18.number().int().min(0), limit: z18.number().int().min(0).nullable() })),
|
|
4512
|
+
warnings: z18.array(UsageWarning),
|
|
4513
|
+
terms: TermsStatus
|
|
4514
|
+
});
|
|
4515
|
+
var TermsAcceptance = z18.object({ accept_terms: AcceptTerms });
|
|
4516
|
+
var CheckoutRequest = z18.object({
|
|
4517
|
+
plan: z18.enum(["starter", "growth"]),
|
|
4518
|
+
success_url: z18.string().url(),
|
|
4519
|
+
cancel_url: z18.string().url(),
|
|
4520
|
+
/** The buyer accepted the terms of service and the processing agreement of this version. */
|
|
4521
|
+
accept_terms: AcceptTerms
|
|
4522
|
+
});
|
|
4523
|
+
var CheckoutSession = z18.object({ url: z18.string().url() });
|
|
4524
|
+
var PortalRequest = z18.object({ return_url: z18.string().url() });
|
|
4525
|
+
var PortalSession = z18.object({ url: z18.string().url() });
|
|
4507
4526
|
var USAGE_WARNING_HEADER = "x-mail-usage-warning";
|
|
4508
4527
|
function formatUsageWarningHeader(warnings) {
|
|
4509
4528
|
if (warnings.length === 0) return null;
|
|
@@ -4523,7 +4542,7 @@ function parseUsageWarningHeader(value) {
|
|
|
4523
4542
|
}
|
|
4524
4543
|
|
|
4525
4544
|
// src/routes.ts
|
|
4526
|
-
import { z as
|
|
4545
|
+
import { z as z19 } from "zod";
|
|
4527
4546
|
var list = (item) => page(item);
|
|
4528
4547
|
var foundationRoutes = {
|
|
4529
4548
|
"workspaces.create": {
|
|
@@ -4769,7 +4788,7 @@ var templateRoutes = {
|
|
|
4769
4788
|
path: "/v1/templates/:id/export",
|
|
4770
4789
|
params: IdParams,
|
|
4771
4790
|
query: TemplateExportQuery,
|
|
4772
|
-
response:
|
|
4791
|
+
response: z19.string(),
|
|
4773
4792
|
responseType: "text",
|
|
4774
4793
|
status: 200,
|
|
4775
4794
|
access: "read",
|
|
@@ -5149,7 +5168,7 @@ var sendingRoutes = {
|
|
|
5149
5168
|
path: "/v1/mailings/:id/export",
|
|
5150
5169
|
params: IdParams,
|
|
5151
5170
|
query: MailingExportQuery,
|
|
5152
|
-
response:
|
|
5171
|
+
response: z19.string(),
|
|
5153
5172
|
responseType: "text",
|
|
5154
5173
|
status: 200,
|
|
5155
5174
|
access: "read",
|
|
@@ -5416,7 +5435,7 @@ var platformRoutes = {
|
|
|
5416
5435
|
"contactProperties.list": {
|
|
5417
5436
|
method: "GET",
|
|
5418
5437
|
path: "/v1/contact-properties",
|
|
5419
|
-
response:
|
|
5438
|
+
response: z19.object({ data: z19.array(ContactPropertyDefinition) }),
|
|
5420
5439
|
status: 200,
|
|
5421
5440
|
access: "read",
|
|
5422
5441
|
phase: "S4"
|
|
@@ -5715,7 +5734,7 @@ var billingRoutes = {
|
|
|
5715
5734
|
"billing.plans": {
|
|
5716
5735
|
method: "GET",
|
|
5717
5736
|
path: "/v1/billing/plans",
|
|
5718
|
-
response:
|
|
5737
|
+
response: z19.object({ data: z19.array(CatalogPlan), addons: BillingAddons }),
|
|
5719
5738
|
status: 200,
|
|
5720
5739
|
access: "read",
|
|
5721
5740
|
phase: "S5"
|
|
@@ -5755,6 +5774,15 @@ var billingRoutes = {
|
|
|
5755
5774
|
status: 200,
|
|
5756
5775
|
access: "admin",
|
|
5757
5776
|
phase: "S5"
|
|
5777
|
+
},
|
|
5778
|
+
"billing.acceptTerms": {
|
|
5779
|
+
method: "POST",
|
|
5780
|
+
path: "/v1/billing/terms",
|
|
5781
|
+
body: TermsAcceptance,
|
|
5782
|
+
response: TermsStatus,
|
|
5783
|
+
status: 200,
|
|
5784
|
+
access: "admin",
|
|
5785
|
+
phase: "S5"
|
|
5758
5786
|
}
|
|
5759
5787
|
};
|
|
5760
5788
|
var inviteRoutes = {
|
|
@@ -5866,7 +5894,7 @@ var automationRoutes = {
|
|
|
5866
5894
|
method: "POST",
|
|
5867
5895
|
path: "/v1/automations/:id/pause",
|
|
5868
5896
|
params: IdParams,
|
|
5869
|
-
body:
|
|
5897
|
+
body: z19.object({}).strict(),
|
|
5870
5898
|
response: Automation,
|
|
5871
5899
|
status: 200,
|
|
5872
5900
|
access: "write",
|
|
@@ -5876,7 +5904,7 @@ var automationRoutes = {
|
|
|
5876
5904
|
method: "POST",
|
|
5877
5905
|
path: "/v1/automations/:id/resume",
|
|
5878
5906
|
params: IdParams,
|
|
5879
|
-
body:
|
|
5907
|
+
body: z19.object({}).strict(),
|
|
5880
5908
|
response: Automation,
|
|
5881
5909
|
status: 200,
|
|
5882
5910
|
access: "write",
|
|
@@ -5886,7 +5914,7 @@ var automationRoutes = {
|
|
|
5886
5914
|
method: "POST",
|
|
5887
5915
|
path: "/v1/automations/:id/archive",
|
|
5888
5916
|
params: IdParams,
|
|
5889
|
-
body:
|
|
5917
|
+
body: z19.object({}).strict(),
|
|
5890
5918
|
response: Automation,
|
|
5891
5919
|
status: 200,
|
|
5892
5920
|
access: "write",
|
|
@@ -6066,6 +6094,7 @@ export {
|
|
|
6066
6094
|
AbTestState,
|
|
6067
6095
|
AbVariant,
|
|
6068
6096
|
AbWinnerRequest,
|
|
6097
|
+
AcceptTerms,
|
|
6069
6098
|
ApiKey,
|
|
6070
6099
|
ApiKeyCreate,
|
|
6071
6100
|
ApiKeyCreated,
|
|
@@ -6237,6 +6266,7 @@ export {
|
|
|
6237
6266
|
InviteListQuery,
|
|
6238
6267
|
InviteStatus,
|
|
6239
6268
|
JsonValue,
|
|
6269
|
+
LEGAL_TERMS_VERSION,
|
|
6240
6270
|
LETTER_ONLY_MERGE_FIELDS,
|
|
6241
6271
|
LETTER_RECIPIENT_REFUSAL,
|
|
6242
6272
|
LIST_UNSUBSCRIBE_POST_VALUE,
|
|
@@ -6483,6 +6513,8 @@ export {
|
|
|
6483
6513
|
TemplateUpdatedData,
|
|
6484
6514
|
TemplateVersion,
|
|
6485
6515
|
TemplateVersionParams,
|
|
6516
|
+
TermsAcceptance,
|
|
6517
|
+
TermsStatus,
|
|
6486
6518
|
TimeOfDay,
|
|
6487
6519
|
Timestamp,
|
|
6488
6520
|
TimezoneName,
|