@apollo-deploy/signal-schemas 1.0.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/README.md +117 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/definitions/common.d.ts +72 -0
- package/dist/definitions/common.d.ts.map +1 -0
- package/dist/definitions/common.js +95 -0
- package/dist/definitions/common.js.map +1 -0
- package/dist/definitions/deliverability/deliverability.schema.d.ts +98 -0
- package/dist/definitions/deliverability/deliverability.schema.d.ts.map +1 -0
- package/dist/definitions/deliverability/deliverability.schema.js +77 -0
- package/dist/definitions/deliverability/domain.schema.d.ts +23 -0
- package/dist/definitions/deliverability/domain.schema.d.ts.map +1 -0
- package/dist/definitions/deliverability/domain.schema.js +12 -0
- package/dist/definitions/deliverability/domain.schema.js.map +1 -0
- package/dist/definitions/deliverability/index.d.ts +4 -0
- package/dist/definitions/deliverability/index.d.ts.map +1 -0
- package/dist/definitions/deliverability/index.js +4 -0
- package/dist/definitions/deliverability/index.js.map +1 -0
- package/dist/definitions/deliverability/request.schema.d.ts +27 -0
- package/dist/definitions/deliverability/request.schema.d.ts.map +1 -0
- package/dist/definitions/deliverability/request.schema.js +17 -0
- package/dist/definitions/deliverability/request.schema.js.map +1 -0
- package/dist/definitions/deliverability/response.schema.d.ts +72 -0
- package/dist/definitions/deliverability/response.schema.d.ts.map +1 -0
- package/dist/definitions/deliverability/response.schema.js +37 -0
- package/dist/definitions/deliverability/response.schema.js.map +1 -0
- package/dist/definitions/deliverability/schemas.d.ts +91 -0
- package/dist/definitions/deliverability/schemas.d.ts.map +1 -0
- package/dist/definitions/deliverability/schemas.js +67 -0
- package/dist/definitions/domains/domain.schema.d.ts +160 -0
- package/dist/definitions/domains/domain.schema.d.ts.map +1 -0
- package/dist/definitions/domains/domain.schema.js +36 -0
- package/dist/definitions/domains/domain.schema.js.map +1 -0
- package/dist/definitions/domains/domains.schema.d.ts +668 -0
- package/dist/definitions/domains/domains.schema.d.ts.map +1 -0
- package/dist/definitions/domains/domains.schema.js +113 -0
- package/dist/definitions/domains/index.d.ts +4 -0
- package/dist/definitions/domains/index.d.ts.map +1 -0
- package/dist/definitions/domains/index.js +4 -0
- package/dist/definitions/domains/index.js.map +1 -0
- package/dist/definitions/domains/request.schema.d.ts +26 -0
- package/dist/definitions/domains/request.schema.d.ts.map +1 -0
- package/dist/definitions/domains/request.schema.js +21 -0
- package/dist/definitions/domains/request.schema.js.map +1 -0
- package/dist/definitions/domains/response.schema.d.ts +491 -0
- package/dist/definitions/domains/response.schema.d.ts.map +1 -0
- package/dist/definitions/domains/response.schema.js +24 -0
- package/dist/definitions/domains/response.schema.js.map +1 -0
- package/dist/definitions/domains/schemas.d.ts +545 -0
- package/dist/definitions/domains/schemas.d.ts.map +1 -0
- package/dist/definitions/domains/schemas.js +110 -0
- package/dist/definitions/emails/domain.schema.d.ts +20 -0
- package/dist/definitions/emails/domain.schema.d.ts.map +1 -0
- package/dist/definitions/emails/domain.schema.js +11 -0
- package/dist/definitions/emails/domain.schema.js.map +1 -0
- package/dist/definitions/emails/emails.schema.d.ts +230 -0
- package/dist/definitions/emails/emails.schema.d.ts.map +1 -0
- package/dist/definitions/emails/emails.schema.js +176 -0
- package/dist/definitions/emails/index.d.ts +4 -0
- package/dist/definitions/emails/index.d.ts.map +1 -0
- package/dist/definitions/emails/index.js +4 -0
- package/dist/definitions/emails/index.js.map +1 -0
- package/dist/definitions/emails/request.schema.d.ts +96 -0
- package/dist/definitions/emails/request.schema.d.ts.map +1 -0
- package/dist/definitions/emails/request.schema.js +65 -0
- package/dist/definitions/emails/request.schema.js.map +1 -0
- package/dist/definitions/emails/response.schema.d.ts +141 -0
- package/dist/definitions/emails/response.schema.d.ts.map +1 -0
- package/dist/definitions/emails/response.schema.js +54 -0
- package/dist/definitions/emails/response.schema.js.map +1 -0
- package/dist/definitions/emails/schemas.d.ts +284 -0
- package/dist/definitions/emails/schemas.d.ts.map +1 -0
- package/dist/definitions/emails/schemas.js +227 -0
- package/dist/definitions/health/domain.schema.d.ts +11 -0
- package/dist/definitions/health/domain.schema.d.ts.map +1 -0
- package/dist/definitions/health/domain.schema.js +8 -0
- package/dist/definitions/health/domain.schema.js.map +1 -0
- package/dist/definitions/health/health.schema.d.ts +27 -0
- package/dist/definitions/health/health.schema.d.ts.map +1 -0
- package/dist/definitions/health/health.schema.js +23 -0
- package/dist/definitions/health/index.d.ts +3 -0
- package/dist/definitions/health/index.d.ts.map +1 -0
- package/dist/definitions/health/index.js +3 -0
- package/dist/definitions/health/index.js.map +1 -0
- package/dist/definitions/health/request.schema.d.ts +8 -0
- package/dist/definitions/health/request.schema.d.ts.map +1 -0
- package/dist/definitions/health/request.schema.js +8 -0
- package/dist/definitions/health/request.schema.js.map +1 -0
- package/dist/definitions/health/response.schema.d.ts +26 -0
- package/dist/definitions/health/response.schema.d.ts.map +1 -0
- package/dist/definitions/health/response.schema.js +16 -0
- package/dist/definitions/health/response.schema.js.map +1 -0
- package/dist/definitions/health/schemas.d.ts +30 -0
- package/dist/definitions/health/schemas.d.ts.map +1 -0
- package/dist/definitions/health/schemas.js +23 -0
- package/dist/definitions/index.d.ts +25 -0
- package/dist/definitions/index.d.ts.map +1 -0
- package/dist/definitions/index.js +25 -0
- package/dist/definitions/index.js.map +1 -0
- package/dist/definitions/projects/domain.schema.d.ts +42 -0
- package/dist/definitions/projects/domain.schema.d.ts.map +1 -0
- package/dist/definitions/projects/domain.schema.js +46 -0
- package/dist/definitions/projects/domain.schema.js.map +1 -0
- package/dist/definitions/projects/index.d.ts +4 -0
- package/dist/definitions/projects/index.d.ts.map +1 -0
- package/dist/definitions/projects/index.js +4 -0
- package/dist/definitions/projects/index.js.map +1 -0
- package/dist/definitions/projects/projects.schema.d.ts +8 -0
- package/dist/definitions/projects/projects.schema.d.ts.map +1 -0
- package/dist/definitions/projects/projects.schema.js +23 -0
- package/dist/definitions/projects/request.schema.d.ts +41 -0
- package/dist/definitions/projects/request.schema.d.ts.map +1 -0
- package/dist/definitions/projects/request.schema.js +43 -0
- package/dist/definitions/projects/request.schema.js.map +1 -0
- package/dist/definitions/projects/response.schema.d.ts +79 -0
- package/dist/definitions/projects/response.schema.d.ts.map +1 -0
- package/dist/definitions/projects/response.schema.js +43 -0
- package/dist/definitions/projects/response.schema.js.map +1 -0
- package/dist/definitions/projects/schemas.d.ts +114 -0
- package/dist/definitions/projects/schemas.d.ts.map +1 -0
- package/dist/definitions/projects/schemas.js +87 -0
- package/dist/definitions/signal-email/domain.schema.d.ts +135 -0
- package/dist/definitions/signal-email/domain.schema.d.ts.map +1 -0
- package/dist/definitions/signal-email/domain.schema.js +130 -0
- package/dist/definitions/signal-email/domain.schema.js.map +1 -0
- package/dist/definitions/signal-email/index.d.ts +23 -0
- package/dist/definitions/signal-email/index.d.ts.map +1 -0
- package/dist/definitions/signal-email/index.js +26 -0
- package/dist/definitions/signal-email/index.js.map +1 -0
- package/dist/definitions/signal-email/request.schema.d.ts +123 -0
- package/dist/definitions/signal-email/request.schema.d.ts.map +1 -0
- package/dist/definitions/signal-email/request.schema.js +201 -0
- package/dist/definitions/signal-email/request.schema.js.map +1 -0
- package/dist/definitions/signal-email/response.schema.d.ts +73 -0
- package/dist/definitions/signal-email/response.schema.d.ts.map +1 -0
- package/dist/definitions/signal-email/response.schema.js +83 -0
- package/dist/definitions/signal-email/response.schema.js.map +1 -0
- package/dist/definitions/signal-projects/domain.schema.d.ts +227 -0
- package/dist/definitions/signal-projects/domain.schema.d.ts.map +1 -0
- package/dist/definitions/signal-projects/domain.schema.js +230 -0
- package/dist/definitions/signal-projects/domain.schema.js.map +1 -0
- package/dist/definitions/signal-projects/index.d.ts +16 -0
- package/dist/definitions/signal-projects/index.d.ts.map +1 -0
- package/dist/definitions/signal-projects/index.js +16 -0
- package/dist/definitions/signal-projects/index.js.map +1 -0
- package/dist/definitions/signal-projects/request.schema.d.ts +254 -0
- package/dist/definitions/signal-projects/request.schema.d.ts.map +1 -0
- package/dist/definitions/signal-projects/request.schema.js +213 -0
- package/dist/definitions/signal-projects/request.schema.js.map +1 -0
- package/dist/definitions/signal-projects/response.schema.d.ts +615 -0
- package/dist/definitions/signal-projects/response.schema.d.ts.map +1 -0
- package/dist/definitions/signal-projects/response.schema.js +267 -0
- package/dist/definitions/signal-projects/response.schema.js.map +1 -0
- package/dist/definitions/suppressions/domain.schema.d.ts +13 -0
- package/dist/definitions/suppressions/domain.schema.d.ts.map +1 -0
- package/dist/definitions/suppressions/domain.schema.js +8 -0
- package/dist/definitions/suppressions/domain.schema.js.map +1 -0
- package/dist/definitions/suppressions/index.d.ts +4 -0
- package/dist/definitions/suppressions/index.d.ts.map +1 -0
- package/dist/definitions/suppressions/index.js +4 -0
- package/dist/definitions/suppressions/index.js.map +1 -0
- package/dist/definitions/suppressions/request.schema.d.ts +39 -0
- package/dist/definitions/suppressions/request.schema.d.ts.map +1 -0
- package/dist/definitions/suppressions/request.schema.js +27 -0
- package/dist/definitions/suppressions/request.schema.js.map +1 -0
- package/dist/definitions/suppressions/response.schema.d.ts +42 -0
- package/dist/definitions/suppressions/response.schema.d.ts.map +1 -0
- package/dist/definitions/suppressions/response.schema.js +18 -0
- package/dist/definitions/suppressions/response.schema.js.map +1 -0
- package/dist/definitions/suppressions/schemas.d.ts +90 -0
- package/dist/definitions/suppressions/schemas.d.ts.map +1 -0
- package/dist/definitions/suppressions/schemas.js +68 -0
- package/dist/definitions/suppressions/suppressions.schema.d.ts +79 -0
- package/dist/definitions/suppressions/suppressions.schema.d.ts.map +1 -0
- package/dist/definitions/suppressions/suppressions.schema.js +63 -0
- package/dist/definitions/templates/domain.schema.d.ts +11 -0
- package/dist/definitions/templates/domain.schema.d.ts.map +1 -0
- package/dist/definitions/templates/domain.schema.js +14 -0
- package/dist/definitions/templates/domain.schema.js.map +1 -0
- package/dist/definitions/templates/index.d.ts +4 -0
- package/dist/definitions/templates/index.d.ts.map +1 -0
- package/dist/definitions/templates/index.js +4 -0
- package/dist/definitions/templates/index.js.map +1 -0
- package/dist/definitions/templates/request.schema.d.ts +33 -0
- package/dist/definitions/templates/request.schema.d.ts.map +1 -0
- package/dist/definitions/templates/request.schema.js +32 -0
- package/dist/definitions/templates/request.schema.js.map +1 -0
- package/dist/definitions/templates/response.schema.d.ts +91 -0
- package/dist/definitions/templates/response.schema.d.ts.map +1 -0
- package/dist/definitions/templates/response.schema.js +49 -0
- package/dist/definitions/templates/response.schema.js.map +1 -0
- package/dist/definitions/templates/schemas.d.ts +113 -0
- package/dist/definitions/templates/schemas.d.ts.map +1 -0
- package/dist/definitions/templates/schemas.js +80 -0
- package/dist/definitions/usage/domain.schema.d.ts +60 -0
- package/dist/definitions/usage/domain.schema.d.ts.map +1 -0
- package/dist/definitions/usage/domain.schema.js +23 -0
- package/dist/definitions/usage/domain.schema.js.map +1 -0
- package/dist/definitions/usage/index.d.ts +4 -0
- package/dist/definitions/usage/index.d.ts.map +1 -0
- package/dist/definitions/usage/index.js +4 -0
- package/dist/definitions/usage/index.js.map +1 -0
- package/dist/definitions/usage/request.schema.d.ts +12 -0
- package/dist/definitions/usage/request.schema.d.ts.map +1 -0
- package/dist/definitions/usage/request.schema.js +13 -0
- package/dist/definitions/usage/request.schema.js.map +1 -0
- package/dist/definitions/usage/response.schema.d.ts +76 -0
- package/dist/definitions/usage/response.schema.d.ts.map +1 -0
- package/dist/definitions/usage/response.schema.js +22 -0
- package/dist/definitions/usage/response.schema.js.map +1 -0
- package/dist/definitions/usage/schemas.d.ts +156 -0
- package/dist/definitions/usage/schemas.d.ts.map +1 -0
- package/dist/definitions/usage/schemas.js +83 -0
- package/dist/definitions/usage/usage.schema.d.ts +140 -0
- package/dist/definitions/usage/usage.schema.d.ts.map +1 -0
- package/dist/definitions/usage/usage.schema.js +77 -0
- package/dist/definitions/webhooks/domain.schema.d.ts +26 -0
- package/dist/definitions/webhooks/domain.schema.d.ts.map +1 -0
- package/dist/definitions/webhooks/domain.schema.js +14 -0
- package/dist/definitions/webhooks/domain.schema.js.map +1 -0
- package/dist/definitions/webhooks/index.d.ts +4 -0
- package/dist/definitions/webhooks/index.d.ts.map +1 -0
- package/dist/definitions/webhooks/index.js +4 -0
- package/dist/definitions/webhooks/index.js.map +1 -0
- package/dist/definitions/webhooks/request.schema.d.ts +64 -0
- package/dist/definitions/webhooks/request.schema.d.ts.map +1 -0
- package/dist/definitions/webhooks/request.schema.js +32 -0
- package/dist/definitions/webhooks/request.schema.js.map +1 -0
- package/dist/definitions/webhooks/response.schema.d.ts +76 -0
- package/dist/definitions/webhooks/response.schema.d.ts.map +1 -0
- package/dist/definitions/webhooks/response.schema.js +27 -0
- package/dist/definitions/webhooks/response.schema.js.map +1 -0
- package/dist/definitions/webhooks/schemas.d.ts +145 -0
- package/dist/definitions/webhooks/schemas.d.ts.map +1 -0
- package/dist/definitions/webhooks/schemas.js +97 -0
- package/dist/definitions/webhooks/webhooks.schema.d.ts +152 -0
- package/dist/definitions/webhooks/webhooks.schema.d.ts.map +1 -0
- package/dist/definitions/webhooks/webhooks.schema.js +96 -0
- package/dist/generators/generate-schemas.d.ts +10 -0
- package/dist/generators/generate-schemas.d.ts.map +1 -0
- package/dist/generators/generate-schemas.js +119 -0
- package/dist/generators/generate-schemas.js.map +1 -0
- package/dist/generators/index.d.ts +8 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +8 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/register-global-registry.d.ts +14 -0
- package/dist/generators/register-global-registry.d.ts.map +1 -0
- package/dist/generators/register-global-registry.js +516 -0
- package/dist/generators/register-global-registry.js.map +1 -0
- package/dist/generators/zod-to-json-schema.d.ts +64 -0
- package/dist/generators/zod-to-json-schema.d.ts.map +1 -0
- package/dist/generators/zod-to-json-schema.js +300 -0
- package/dist/generators/zod-to-json-schema.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apollo Signal — Email Request Schemas
|
|
3
|
+
*
|
|
4
|
+
* Validation schemas for the public /v1/emails* API surface.
|
|
5
|
+
* These are the only Signal request schemas that cross the backend-to-client
|
|
6
|
+
* boundary and belong in this package.
|
|
7
|
+
*
|
|
8
|
+
* Dashboard request schemas (/signal/*) are backend-private and live in
|
|
9
|
+
* apps/signal/src/modules/<module>/contracts/internal/.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
/**
|
|
13
|
+
* Request body for POST /v1/emails.
|
|
14
|
+
*
|
|
15
|
+
* Authenticated with a Bearer ap_signal_... API key that carries the
|
|
16
|
+
* emails:send scope. The key is bound to exactly one Signal project at
|
|
17
|
+
* issuance time; the project is resolved server-side from the key's
|
|
18
|
+
* permissions payload — callers do not supply a project ID.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SignalSendEmailBodySchema: z.ZodObject<{
|
|
21
|
+
from: z.ZodString;
|
|
22
|
+
to: z.ZodArray<z.ZodString>;
|
|
23
|
+
cc: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
24
|
+
bcc: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
25
|
+
replyTo: z.ZodOptional<z.ZodString>;
|
|
26
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
27
|
+
html: z.ZodOptional<z.ZodString>;
|
|
28
|
+
text: z.ZodOptional<z.ZodString>;
|
|
29
|
+
tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
30
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
31
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
32
|
+
testMode: z.ZodOptional<z.ZodBoolean>;
|
|
33
|
+
attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
34
|
+
filename: z.ZodString;
|
|
35
|
+
content: z.ZodString;
|
|
36
|
+
contentType: z.ZodString;
|
|
37
|
+
disposition: z.ZodOptional<z.ZodEnum<{
|
|
38
|
+
attachment: "attachment";
|
|
39
|
+
inline: "inline";
|
|
40
|
+
}>>;
|
|
41
|
+
contentId: z.ZodOptional<z.ZodString>;
|
|
42
|
+
}, z.core.$strip>>>;
|
|
43
|
+
scheduledAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"optimal">]>>;
|
|
44
|
+
deliveryWindow: z.ZodOptional<z.ZodObject<{
|
|
45
|
+
start: z.ZodString;
|
|
46
|
+
end: z.ZodString;
|
|
47
|
+
}, z.core.$strip>>;
|
|
48
|
+
sendTimeCategory: z.ZodDefault<z.ZodEnum<{
|
|
49
|
+
transactional: "transactional";
|
|
50
|
+
marketing: "marketing";
|
|
51
|
+
notification: "notification";
|
|
52
|
+
digest: "digest";
|
|
53
|
+
}>>;
|
|
54
|
+
templateId: z.ZodOptional<z.ZodString>;
|
|
55
|
+
variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
56
|
+
trackingSettings: z.ZodOptional<z.ZodObject<{
|
|
57
|
+
openTracking: z.ZodOptional<z.ZodBoolean>;
|
|
58
|
+
clickTracking: z.ZodOptional<z.ZodBoolean>;
|
|
59
|
+
unsubscribeTracking: z.ZodOptional<z.ZodBoolean>;
|
|
60
|
+
readEngagement: z.ZodOptional<z.ZodBoolean>;
|
|
61
|
+
}, z.core.$strip>>;
|
|
62
|
+
}, z.core.$strip>;
|
|
63
|
+
/**
|
|
64
|
+
* Request body for POST /v1/emails/batch.
|
|
65
|
+
* Each item in the emails array follows the same shape as a single send.
|
|
66
|
+
* Rate-limit quota is checked atomically across the full batch before any
|
|
67
|
+
* SES call is made. Results are returned per-item (partial success allowed).
|
|
68
|
+
*/
|
|
69
|
+
export declare const SignalBatchSendEmailBodySchema: z.ZodObject<{
|
|
70
|
+
emails: z.ZodArray<z.ZodObject<{
|
|
71
|
+
from: z.ZodString;
|
|
72
|
+
to: z.ZodArray<z.ZodString>;
|
|
73
|
+
cc: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
74
|
+
bcc: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
75
|
+
replyTo: z.ZodOptional<z.ZodString>;
|
|
76
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
77
|
+
html: z.ZodOptional<z.ZodString>;
|
|
78
|
+
text: z.ZodOptional<z.ZodString>;
|
|
79
|
+
tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
80
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
81
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
82
|
+
testMode: z.ZodOptional<z.ZodBoolean>;
|
|
83
|
+
attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
84
|
+
filename: z.ZodString;
|
|
85
|
+
content: z.ZodString;
|
|
86
|
+
contentType: z.ZodString;
|
|
87
|
+
disposition: z.ZodOptional<z.ZodEnum<{
|
|
88
|
+
attachment: "attachment";
|
|
89
|
+
inline: "inline";
|
|
90
|
+
}>>;
|
|
91
|
+
contentId: z.ZodOptional<z.ZodString>;
|
|
92
|
+
}, z.core.$strip>>>;
|
|
93
|
+
scheduledAt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"optimal">]>>;
|
|
94
|
+
deliveryWindow: z.ZodOptional<z.ZodObject<{
|
|
95
|
+
start: z.ZodString;
|
|
96
|
+
end: z.ZodString;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
sendTimeCategory: z.ZodDefault<z.ZodEnum<{
|
|
99
|
+
transactional: "transactional";
|
|
100
|
+
marketing: "marketing";
|
|
101
|
+
notification: "notification";
|
|
102
|
+
digest: "digest";
|
|
103
|
+
}>>;
|
|
104
|
+
templateId: z.ZodOptional<z.ZodString>;
|
|
105
|
+
variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
106
|
+
trackingSettings: z.ZodOptional<z.ZodObject<{
|
|
107
|
+
openTracking: z.ZodOptional<z.ZodBoolean>;
|
|
108
|
+
clickTracking: z.ZodOptional<z.ZodBoolean>;
|
|
109
|
+
unsubscribeTracking: z.ZodOptional<z.ZodBoolean>;
|
|
110
|
+
readEngagement: z.ZodOptional<z.ZodBoolean>;
|
|
111
|
+
}, z.core.$strip>>;
|
|
112
|
+
}, z.core.$strip>>;
|
|
113
|
+
}, z.core.$strip>;
|
|
114
|
+
/**
|
|
115
|
+
* Path parameters for GET /v1/emails/:emailId.
|
|
116
|
+
*/
|
|
117
|
+
export declare const SignalGetEmailParamsSchema: z.ZodObject<{
|
|
118
|
+
emailId: z.ZodString;
|
|
119
|
+
}, z.core.$strip>;
|
|
120
|
+
export type SignalSendEmailBody = z.infer<typeof SignalSendEmailBodySchema>;
|
|
121
|
+
export type SignalBatchSendEmailBody = z.infer<typeof SignalBatchSendEmailBodySchema>;
|
|
122
|
+
export type SignalGetEmailParams = z.infer<typeof SignalGetEmailParamsSchema>;
|
|
123
|
+
//# sourceMappingURL=request.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.schema.d.ts","sourceRoot":"","sources":["../../../src/definitions/signal-email/request.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqKnC,CAAC;AAMJ;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAEzC,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,0BAA0B;;iBAErC,CAAC;AAMH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apollo Signal — Email Request Schemas
|
|
3
|
+
*
|
|
4
|
+
* Validation schemas for the public /v1/emails* API surface.
|
|
5
|
+
* These are the only Signal request schemas that cross the backend-to-client
|
|
6
|
+
* boundary and belong in this package.
|
|
7
|
+
*
|
|
8
|
+
* Dashboard request schemas (/signal/*) are backend-private and live in
|
|
9
|
+
* apps/signal/src/modules/<module>/contracts/internal/.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Shared address primitives
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* RFC 5321 email address (local@domain), max 320 chars.
|
|
17
|
+
*/
|
|
18
|
+
const EmailAddressSchema = z.string().email().max(320);
|
|
19
|
+
/**
|
|
20
|
+
* "Name <email>" or bare "email" sender/recipient format.
|
|
21
|
+
*/
|
|
22
|
+
const AddressSchema = z.string().min(1).max(998);
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// POST /v1/emails — send a transactional email
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Request body for POST /v1/emails.
|
|
28
|
+
*
|
|
29
|
+
* Authenticated with a Bearer ap_signal_... API key that carries the
|
|
30
|
+
* emails:send scope. The key is bound to exactly one Signal project at
|
|
31
|
+
* issuance time; the project is resolved server-side from the key's
|
|
32
|
+
* permissions payload — callers do not supply a project ID.
|
|
33
|
+
*/
|
|
34
|
+
export const SignalSendEmailBodySchema = z
|
|
35
|
+
.object({
|
|
36
|
+
/**
|
|
37
|
+
* Sender address. Must be a verified domain owned by the project.
|
|
38
|
+
* Accepts "Name <email>" or bare "email" format.
|
|
39
|
+
*/
|
|
40
|
+
from: AddressSchema,
|
|
41
|
+
/**
|
|
42
|
+
* Primary recipient(s). At least one required.
|
|
43
|
+
* Combined with cc and bcc, the total must not exceed the project's
|
|
44
|
+
* maxRecipientsPerMessage limit (default 10).
|
|
45
|
+
*/
|
|
46
|
+
to: z.array(EmailAddressSchema).min(1).max(50),
|
|
47
|
+
/** Carbon-copy recipients. */
|
|
48
|
+
cc: z.array(EmailAddressSchema).max(50).optional(),
|
|
49
|
+
/** Blind carbon-copy recipients. */
|
|
50
|
+
bcc: z.array(EmailAddressSchema).max(50).optional(),
|
|
51
|
+
/** Reply-to address. */
|
|
52
|
+
replyTo: EmailAddressSchema.optional(),
|
|
53
|
+
/**
|
|
54
|
+
* Email subject line. Required unless templateId is provided.
|
|
55
|
+
* Max 998 chars (RFC 5322).
|
|
56
|
+
*/
|
|
57
|
+
subject: z.string().min(1).max(998).optional(),
|
|
58
|
+
/**
|
|
59
|
+
* HTML body. At least one of html or text must be provided.
|
|
60
|
+
* Max 10 MiB after encoding.
|
|
61
|
+
*/
|
|
62
|
+
html: z.string().min(1).optional(),
|
|
63
|
+
/**
|
|
64
|
+
* Plain-text body. At least one of html or text must be provided.
|
|
65
|
+
* Max 10 MiB.
|
|
66
|
+
*/
|
|
67
|
+
text: z.string().min(1).optional(),
|
|
68
|
+
/**
|
|
69
|
+
* Caller-supplied key-value tags attached to the email record.
|
|
70
|
+
* Useful for filtering in the dashboard. Max 50 entries; keys and values
|
|
71
|
+
* max 256 chars each.
|
|
72
|
+
*/
|
|
73
|
+
tags: z
|
|
74
|
+
.record(z.string().max(256), z.string().max(256))
|
|
75
|
+
.refine((t) => Object.keys(t).length <= 50, 'Maximum 50 tags allowed')
|
|
76
|
+
.optional(),
|
|
77
|
+
/**
|
|
78
|
+
* Arbitrary caller-supplied metadata stored with the email record.
|
|
79
|
+
* Not forwarded to SES. Max 50 keys.
|
|
80
|
+
*/
|
|
81
|
+
metadata: z
|
|
82
|
+
.record(z.string().max(256), z.string().max(256))
|
|
83
|
+
.refine((m) => Object.keys(m).length <= 50, 'Maximum 50 metadata keys allowed')
|
|
84
|
+
.optional(),
|
|
85
|
+
/**
|
|
86
|
+
* Idempotency key. When supplied, a second request with the same key
|
|
87
|
+
* within the project returns the original response without re-sending.
|
|
88
|
+
* Max 255 chars; caller-generated (UUID recommended).
|
|
89
|
+
*/
|
|
90
|
+
idempotencyKey: z.string().min(1).max(255).optional(),
|
|
91
|
+
/**
|
|
92
|
+
* When true (or when the X-Apollo-Signal-Test-Mode: true header is
|
|
93
|
+
* present), the email is validated and recorded but NOT submitted to SES.
|
|
94
|
+
* No usage is counted; no webhooks are fired.
|
|
95
|
+
*/
|
|
96
|
+
testMode: z.boolean().optional(),
|
|
97
|
+
/**
|
|
98
|
+
* File attachments. Each item is base64-encoded. Total decoded size across
|
|
99
|
+
* all attachments must not exceed 10 MiB (SES raw message limit).
|
|
100
|
+
*/
|
|
101
|
+
attachments: z
|
|
102
|
+
.array(z.object({
|
|
103
|
+
/** Original filename shown in the email client. */
|
|
104
|
+
filename: z.string().min(1).max(255),
|
|
105
|
+
/** Base64-encoded file content. */
|
|
106
|
+
content: z.string().min(1),
|
|
107
|
+
/** MIME content-type, e.g. "application/pdf" or "image/png". */
|
|
108
|
+
contentType: z.string().min(1).max(127),
|
|
109
|
+
/** "attachment" (default) saves to disk; "inline" embeds in HTML via cid:. */
|
|
110
|
+
disposition: z.enum(['attachment', 'inline']).optional(),
|
|
111
|
+
/** Content-ID for inline images, e.g. "logo" (referenced as cid:logo in HTML). */
|
|
112
|
+
contentId: z.string().max(255).optional(),
|
|
113
|
+
}))
|
|
114
|
+
.max(20)
|
|
115
|
+
.optional(),
|
|
116
|
+
/**
|
|
117
|
+
* ISO 8601 UTC datetime at which to deliver the email. Must be at least
|
|
118
|
+
* 30 seconds and no more than 30 days in the future. When omitted the
|
|
119
|
+
* email is sent immediately.
|
|
120
|
+
*
|
|
121
|
+
* Set to the string "optimal" to use AI-powered send time optimisation.
|
|
122
|
+
* When "optimal" is used, deliveryWindow must also be provided.
|
|
123
|
+
* Not available for sendTimeCategory: "transactional" emails.
|
|
124
|
+
*/
|
|
125
|
+
scheduledAt: z
|
|
126
|
+
.union([z.string().datetime({ offset: true }), z.literal('optimal')])
|
|
127
|
+
.optional(),
|
|
128
|
+
/**
|
|
129
|
+
* Delivery window for send-time optimisation. Required when scheduledAt
|
|
130
|
+
* is "optimal". The email will be delivered within this window at the
|
|
131
|
+
* time Signal predicts the recipient is most likely to engage.
|
|
132
|
+
*/
|
|
133
|
+
deliveryWindow: z
|
|
134
|
+
.object({
|
|
135
|
+
/** ISO 8601 UTC datetime — earliest the email may be delivered. */
|
|
136
|
+
start: z.string().datetime({ offset: true }),
|
|
137
|
+
/** ISO 8601 UTC datetime — latest the email may be delivered. */
|
|
138
|
+
end: z.string().datetime({ offset: true }),
|
|
139
|
+
})
|
|
140
|
+
.optional(),
|
|
141
|
+
/**
|
|
142
|
+
* Category of the email. Used to determine whether send-time optimisation
|
|
143
|
+
* applies. Transactional emails are always sent immediately regardless of
|
|
144
|
+
* scheduledAt. Defaults to "transactional".
|
|
145
|
+
*/
|
|
146
|
+
sendTimeCategory: z
|
|
147
|
+
.enum(['transactional', 'marketing', 'notification', 'digest'])
|
|
148
|
+
.default('transactional'),
|
|
149
|
+
/**
|
|
150
|
+
* ID of a pre-created template to use for subject, html, and text.
|
|
151
|
+
* Explicit subject/html/text fields take precedence over template content.
|
|
152
|
+
*/
|
|
153
|
+
templateId: z.string().min(1).optional(),
|
|
154
|
+
/**
|
|
155
|
+
* Key-value pairs used to substitute {{variable_name}} placeholders in
|
|
156
|
+
* the template. Ignored when templateId is not provided.
|
|
157
|
+
*/
|
|
158
|
+
variables: z.record(z.string(), z.string()).optional(),
|
|
159
|
+
/**
|
|
160
|
+
* Per-send tracking overrides. When provided, these values take precedence
|
|
161
|
+
* over the project-level trackingSettings for this specific email.
|
|
162
|
+
*/
|
|
163
|
+
trackingSettings: z
|
|
164
|
+
.object({
|
|
165
|
+
openTracking: z.boolean().optional(),
|
|
166
|
+
clickTracking: z.boolean().optional(),
|
|
167
|
+
unsubscribeTracking: z.boolean().optional(),
|
|
168
|
+
readEngagement: z.boolean().optional(),
|
|
169
|
+
})
|
|
170
|
+
.optional(),
|
|
171
|
+
})
|
|
172
|
+
.refine((b) => b.subject !== undefined || b.templateId !== undefined, { message: 'subject is required when templateId is not provided', path: ['subject'] })
|
|
173
|
+
.refine((b) => b.templateId !== undefined || b.html !== undefined || b.text !== undefined, { message: 'At least one of html or text must be provided when templateId is not provided', path: ['html'] });
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// POST /v1/emails/batch — send up to 100 emails in a single call
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
/**
|
|
178
|
+
* Request body for POST /v1/emails/batch.
|
|
179
|
+
* Each item in the emails array follows the same shape as a single send.
|
|
180
|
+
* Rate-limit quota is checked atomically across the full batch before any
|
|
181
|
+
* SES call is made. Results are returned per-item (partial success allowed).
|
|
182
|
+
*/
|
|
183
|
+
export const SignalBatchSendEmailBodySchema = z.object({
|
|
184
|
+
emails: z.array(SignalSendEmailBodySchema).min(1).max(100),
|
|
185
|
+
});
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// GET /v1/emails/:emailId — retrieve a sent email
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
/**
|
|
190
|
+
* Path parameters for GET /v1/emails/:emailId.
|
|
191
|
+
*/
|
|
192
|
+
export const SignalGetEmailParamsSchema = z.object({
|
|
193
|
+
emailId: z.string().min(1),
|
|
194
|
+
});
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// Schema registry — promotes types to OpenAPI components/schemas
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
z.globalRegistry.add(SignalSendEmailBodySchema, { id: 'SignalSendEmailBody' });
|
|
199
|
+
z.globalRegistry.add(SignalBatchSendEmailBodySchema, { id: 'SignalBatchSendEmailBody' });
|
|
200
|
+
z.globalRegistry.add(SignalGetEmailParamsSchema, { id: 'SignalGetEmailParams' });
|
|
201
|
+
//# sourceMappingURL=request.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.schema.js","sourceRoot":"","sources":["../../../src/definitions/signal-email/request.schema.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Apollo Signal — Email Request Schemas\n *\n * Validation schemas for the public /v1/emails* API surface.\n * These are the only Signal request schemas that cross the backend-to-client\n * boundary and belong in this package.\n *\n * Dashboard request schemas (/signal/*) are backend-private and live in\n * apps/signal/src/modules/<module>/contracts/internal/.\n */\n\nimport { z } from 'zod';\n\n// ---------------------------------------------------------------------------\n// Shared address primitives\n// ---------------------------------------------------------------------------\n\n/**\n * RFC 5321 email address (local@domain), max 320 chars.\n */\nconst EmailAddressSchema = z.string().email().max(320);\n\n/**\n * \"Name <email>\" or bare \"email\" sender/recipient format.\n */\nconst AddressSchema = z.string().min(1).max(998);\n\n// ---------------------------------------------------------------------------\n// POST /v1/emails — send a transactional email\n// ---------------------------------------------------------------------------\n\n/**\n * Request body for POST /v1/emails.\n *\n * Authenticated with a Bearer ap_signal_... API key that carries the\n * emails:send scope. The key is bound to exactly one Signal project at\n * issuance time; the project is resolved server-side from the key's\n * permissions payload — callers do not supply a project ID.\n */\nexport const SignalSendEmailBodySchema = z\n .object({\n /**\n * Sender address. Must be a verified domain owned by the project.\n * Accepts \"Name <email>\" or bare \"email\" format.\n */\n from: AddressSchema,\n\n /**\n * Primary recipient(s). At least one required.\n * Combined with cc and bcc, the total must not exceed the project's\n * maxRecipientsPerMessage limit (default 10).\n */\n to: z.array(EmailAddressSchema).min(1).max(50),\n\n /** Carbon-copy recipients. */\n cc: z.array(EmailAddressSchema).max(50).optional(),\n\n /** Blind carbon-copy recipients. */\n bcc: z.array(EmailAddressSchema).max(50).optional(),\n\n /** Reply-to address. */\n replyTo: EmailAddressSchema.optional(),\n\n /**\n * Email subject line. Required unless templateId is provided.\n * Max 998 chars (RFC 5322).\n */\n subject: z.string().min(1).max(998).optional(),\n\n /**\n * HTML body. At least one of html or text must be provided.\n * Max 10 MiB after encoding.\n */\n html: z.string().min(1).optional(),\n\n /**\n * Plain-text body. At least one of html or text must be provided.\n * Max 10 MiB.\n */\n text: z.string().min(1).optional(),\n\n /**\n * Caller-supplied key-value tags attached to the email record.\n * Useful for filtering in the dashboard. Max 50 entries; keys and values\n * max 256 chars each.\n */\n tags: z\n .record(z.string().max(256), z.string().max(256))\n .refine((t) => Object.keys(t).length <= 50, 'Maximum 50 tags allowed')\n .optional(),\n\n /**\n * Arbitrary caller-supplied metadata stored with the email record.\n * Not forwarded to SES. Max 50 keys.\n */\n metadata: z\n .record(z.string().max(256), z.string().max(256))\n .refine((m) => Object.keys(m).length <= 50, 'Maximum 50 metadata keys allowed')\n .optional(),\n\n /**\n * Idempotency key. When supplied, a second request with the same key\n * within the project returns the original response without re-sending.\n * Max 255 chars; caller-generated (UUID recommended).\n */\n idempotencyKey: z.string().min(1).max(255).optional(),\n\n /**\n * When true (or when the X-Apollo-Signal-Test-Mode: true header is\n * present), the email is validated and recorded but NOT submitted to SES.\n * No usage is counted; no webhooks are fired.\n */\n testMode: z.boolean().optional(),\n\n /**\n * File attachments. Each item is base64-encoded. Total decoded size across\n * all attachments must not exceed 10 MiB (SES raw message limit).\n */\n attachments: z\n .array(\n z.object({\n /** Original filename shown in the email client. */\n filename: z.string().min(1).max(255),\n /** Base64-encoded file content. */\n content: z.string().min(1),\n /** MIME content-type, e.g. \"application/pdf\" or \"image/png\". */\n contentType: z.string().min(1).max(127),\n /** \"attachment\" (default) saves to disk; \"inline\" embeds in HTML via cid:. */\n disposition: z.enum(['attachment', 'inline']).optional(),\n /** Content-ID for inline images, e.g. \"logo\" (referenced as cid:logo in HTML). */\n contentId: z.string().max(255).optional(),\n }),\n )\n .max(20)\n .optional(),\n\n /**\n * ISO 8601 UTC datetime at which to deliver the email. Must be at least\n * 30 seconds and no more than 30 days in the future. When omitted the\n * email is sent immediately.\n *\n * Set to the string \"optimal\" to use AI-powered send time optimisation.\n * When \"optimal\" is used, deliveryWindow must also be provided.\n * Not available for sendTimeCategory: \"transactional\" emails.\n */\n scheduledAt: z\n .union([z.string().datetime({ offset: true }), z.literal('optimal')])\n .optional(),\n\n /**\n * Delivery window for send-time optimisation. Required when scheduledAt\n * is \"optimal\". The email will be delivered within this window at the\n * time Signal predicts the recipient is most likely to engage.\n */\n deliveryWindow: z\n .object({\n /** ISO 8601 UTC datetime — earliest the email may be delivered. */\n start: z.string().datetime({ offset: true }),\n /** ISO 8601 UTC datetime — latest the email may be delivered. */\n end: z.string().datetime({ offset: true }),\n })\n .optional(),\n\n /**\n * Category of the email. Used to determine whether send-time optimisation\n * applies. Transactional emails are always sent immediately regardless of\n * scheduledAt. Defaults to \"transactional\".\n */\n sendTimeCategory: z\n .enum(['transactional', 'marketing', 'notification', 'digest'])\n .default('transactional'),\n\n /**\n * ID of a pre-created template to use for subject, html, and text.\n * Explicit subject/html/text fields take precedence over template content.\n */\n templateId: z.string().min(1).optional(),\n\n /**\n * Key-value pairs used to substitute {{variable_name}} placeholders in\n * the template. Ignored when templateId is not provided.\n */\n variables: z.record(z.string(), z.string()).optional(),\n\n /**\n * Per-send tracking overrides. When provided, these values take precedence\n * over the project-level trackingSettings for this specific email.\n */\n trackingSettings: z\n .object({\n openTracking: z.boolean().optional(),\n clickTracking: z.boolean().optional(),\n unsubscribeTracking: z.boolean().optional(),\n readEngagement: z.boolean().optional(),\n })\n .optional(),\n })\n .refine(\n (b) => b.subject !== undefined || b.templateId !== undefined,\n { message: 'subject is required when templateId is not provided', path: ['subject'] },\n )\n .refine(\n (b) => b.templateId !== undefined || b.html !== undefined || b.text !== undefined,\n { message: 'At least one of html or text must be provided when templateId is not provided', path: ['html'] },\n );\n\n// ---------------------------------------------------------------------------\n// POST /v1/emails/batch — send up to 100 emails in a single call\n// ---------------------------------------------------------------------------\n\n/**\n * Request body for POST /v1/emails/batch.\n * Each item in the emails array follows the same shape as a single send.\n * Rate-limit quota is checked atomically across the full batch before any\n * SES call is made. Results are returned per-item (partial success allowed).\n */\nexport const SignalBatchSendEmailBodySchema = z.object({\n emails: z.array(SignalSendEmailBodySchema).min(1).max(100),\n});\n\n// ---------------------------------------------------------------------------\n// GET /v1/emails/:emailId — retrieve a sent email\n// ---------------------------------------------------------------------------\n\n/**\n * Path parameters for GET /v1/emails/:emailId.\n */\nexport const SignalGetEmailParamsSchema = z.object({\n emailId: z.string().min(1),\n});\n\n// ---------------------------------------------------------------------------\n// Inferred TypeScript types\n// ---------------------------------------------------------------------------\n\nexport type SignalSendEmailBody = z.infer<typeof SignalSendEmailBodySchema>;\nexport type SignalBatchSendEmailBody = z.infer<typeof SignalBatchSendEmailBodySchema>;\nexport type SignalGetEmailParams = z.infer<typeof SignalGetEmailParamsSchema>;\n\n// ---------------------------------------------------------------------------\n// Schema registry — promotes types to OpenAPI components/schemas\n// ---------------------------------------------------------------------------\n\nz.globalRegistry.add(SignalSendEmailBodySchema, { id: 'SignalSendEmailBody' });\nz.globalRegistry.add(SignalBatchSendEmailBodySchema, { id: 'SignalBatchSendEmailBody' });\nz.globalRegistry.add(SignalGetEmailParamsSchema, { id: 'SignalGetEmailParams' });\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apollo Signal — Email Response Schemas
|
|
3
|
+
*
|
|
4
|
+
* Response shapes for the public /v1/emails* API surface.
|
|
5
|
+
* These are the only Signal response schemas that cross the backend-to-client
|
|
6
|
+
* boundary and belong in this package.
|
|
7
|
+
*
|
|
8
|
+
* Dashboard response schemas (/signal/*) are backend-private and live in
|
|
9
|
+
* apps/signal/src/modules/<module>/contracts/internal/.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
/**
|
|
13
|
+
* Response body for a successful POST /v1/emails.
|
|
14
|
+
*
|
|
15
|
+
* When testMode is true the status field is "test" and messageId is null.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SignalSendEmailResponseSchema: z.ZodObject<{
|
|
18
|
+
id: z.ZodString;
|
|
19
|
+
messageId: z.ZodNullable<z.ZodString>;
|
|
20
|
+
status: z.ZodEnum<{
|
|
21
|
+
failed: "failed";
|
|
22
|
+
queued: "queued";
|
|
23
|
+
scheduled: "scheduled";
|
|
24
|
+
cancelled: "cancelled";
|
|
25
|
+
sent: "sent";
|
|
26
|
+
delivered: "delivered";
|
|
27
|
+
bounced: "bounced";
|
|
28
|
+
complained: "complained";
|
|
29
|
+
rejected: "rejected";
|
|
30
|
+
suppressed: "suppressed";
|
|
31
|
+
test: "test";
|
|
32
|
+
}>;
|
|
33
|
+
createdAt: z.ZodString;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
/**
|
|
36
|
+
* Public email resource returned by GET /v1/emails/:emailId.
|
|
37
|
+
*
|
|
38
|
+
* Scoped to the project bound to the API key. Recipient addresses are
|
|
39
|
+
* returned in full (the caller is the project owner).
|
|
40
|
+
*/
|
|
41
|
+
export declare const SignalEmailResourceSchema: z.ZodObject<{
|
|
42
|
+
id: z.ZodString;
|
|
43
|
+
messageId: z.ZodNullable<z.ZodString>;
|
|
44
|
+
from: z.ZodString;
|
|
45
|
+
to: z.ZodArray<z.ZodString>;
|
|
46
|
+
cc: z.ZodNullable<z.ZodArray<z.ZodString>>;
|
|
47
|
+
bcc: z.ZodNullable<z.ZodArray<z.ZodString>>;
|
|
48
|
+
replyTo: z.ZodNullable<z.ZodString>;
|
|
49
|
+
subject: z.ZodString;
|
|
50
|
+
status: z.ZodEnum<{
|
|
51
|
+
failed: "failed";
|
|
52
|
+
queued: "queued";
|
|
53
|
+
scheduled: "scheduled";
|
|
54
|
+
cancelled: "cancelled";
|
|
55
|
+
sent: "sent";
|
|
56
|
+
delivered: "delivered";
|
|
57
|
+
bounced: "bounced";
|
|
58
|
+
complained: "complained";
|
|
59
|
+
rejected: "rejected";
|
|
60
|
+
suppressed: "suppressed";
|
|
61
|
+
test: "test";
|
|
62
|
+
}>;
|
|
63
|
+
error: z.ZodNullable<z.ZodString>;
|
|
64
|
+
tags: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
65
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
66
|
+
testMode: z.ZodBoolean;
|
|
67
|
+
createdAt: z.ZodString;
|
|
68
|
+
sentAt: z.ZodNullable<z.ZodString>;
|
|
69
|
+
updatedAt: z.ZodString;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
export type SignalSendEmailResponse = z.infer<typeof SignalSendEmailResponseSchema>;
|
|
72
|
+
export type SignalEmailResource = z.infer<typeof SignalEmailResourceSchema>;
|
|
73
|
+
//# sourceMappingURL=response.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.schema.d.ts","sourceRoot":"","sources":["../../../src/definitions/signal-email/response.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB;;;;GAIG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;iBAexC,CAAC;AAMH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgDpC,CAAC;AAMH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apollo Signal — Email Response Schemas
|
|
3
|
+
*
|
|
4
|
+
* Response shapes for the public /v1/emails* API surface.
|
|
5
|
+
* These are the only Signal response schemas that cross the backend-to-client
|
|
6
|
+
* boundary and belong in this package.
|
|
7
|
+
*
|
|
8
|
+
* Dashboard response schemas (/signal/*) are backend-private and live in
|
|
9
|
+
* apps/signal/src/modules/<module>/contracts/internal/.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { IsoDateStringSchema, NullableIsoDateStringSchema } from '../common.js';
|
|
13
|
+
import { SignalEmailStatusSchema } from './domain.schema.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// POST /v1/emails — send response
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Response body for a successful POST /v1/emails.
|
|
19
|
+
*
|
|
20
|
+
* When testMode is true the status field is "test" and messageId is null.
|
|
21
|
+
*/
|
|
22
|
+
export const SignalSendEmailResponseSchema = z.object({
|
|
23
|
+
/** Email ID (email_<crockford-base32>). */
|
|
24
|
+
id: z.string(),
|
|
25
|
+
/**
|
|
26
|
+
* SES message ID. Present when the email was submitted to SES.
|
|
27
|
+
* null for test-mode sends.
|
|
28
|
+
*/
|
|
29
|
+
messageId: z.string().nullable(),
|
|
30
|
+
/** Email status immediately after the send attempt. */
|
|
31
|
+
status: SignalEmailStatusSchema,
|
|
32
|
+
/** ISO 8601 timestamp when the email record was created. */
|
|
33
|
+
createdAt: IsoDateStringSchema,
|
|
34
|
+
});
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// GET /v1/emails/:emailId — email resource
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
/**
|
|
39
|
+
* Public email resource returned by GET /v1/emails/:emailId.
|
|
40
|
+
*
|
|
41
|
+
* Scoped to the project bound to the API key. Recipient addresses are
|
|
42
|
+
* returned in full (the caller is the project owner).
|
|
43
|
+
*/
|
|
44
|
+
export const SignalEmailResourceSchema = z.object({
|
|
45
|
+
/** Email ID (email_<crockford-base32>). */
|
|
46
|
+
id: z.string(),
|
|
47
|
+
/** SES message ID. null until the email is submitted to SES. */
|
|
48
|
+
messageId: z.string().nullable(),
|
|
49
|
+
/** Sender address as supplied in the send request. */
|
|
50
|
+
from: z.string(),
|
|
51
|
+
/** Primary recipient addresses. */
|
|
52
|
+
to: z.array(z.string()),
|
|
53
|
+
/** Carbon-copy recipients. null when not supplied. */
|
|
54
|
+
cc: z.array(z.string()).nullable(),
|
|
55
|
+
/** Blind carbon-copy recipients. null when not supplied. */
|
|
56
|
+
bcc: z.array(z.string()).nullable(),
|
|
57
|
+
/** Reply-to address. null when not supplied. */
|
|
58
|
+
replyTo: z.string().nullable(),
|
|
59
|
+
/** Email subject line. */
|
|
60
|
+
subject: z.string(),
|
|
61
|
+
/** Current lifecycle status. */
|
|
62
|
+
status: SignalEmailStatusSchema,
|
|
63
|
+
/** Error message when status is "failed". null otherwise. */
|
|
64
|
+
error: z.string().nullable(),
|
|
65
|
+
/** Caller-supplied tags. null when not supplied. */
|
|
66
|
+
tags: z.record(z.string(), z.string()).nullable(),
|
|
67
|
+
/** Caller-supplied metadata. null when not supplied. */
|
|
68
|
+
metadata: z.record(z.string(), z.string()).nullable(),
|
|
69
|
+
/** true when the email was sent in test mode. */
|
|
70
|
+
testMode: z.boolean(),
|
|
71
|
+
/** ISO 8601 timestamp when the email record was created. */
|
|
72
|
+
createdAt: IsoDateStringSchema,
|
|
73
|
+
/** ISO 8601 timestamp when the email was submitted to SES. null until sent. */
|
|
74
|
+
sentAt: NullableIsoDateStringSchema,
|
|
75
|
+
/** ISO 8601 timestamp of the last status update. */
|
|
76
|
+
updatedAt: IsoDateStringSchema,
|
|
77
|
+
});
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Schema registry — promotes types to OpenAPI components/schemas
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
z.globalRegistry.add(SignalSendEmailResponseSchema, { id: 'SignalSendEmailResponse' });
|
|
82
|
+
z.globalRegistry.add(SignalEmailResourceSchema, { id: 'SignalEmailResource' });
|
|
83
|
+
//# sourceMappingURL=response.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.schema.js","sourceRoot":"","sources":["../../../src/definitions/signal-email/response.schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,2CAA2C;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IAEd;;;OAGG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEhC,uDAAuD;IACvD,MAAM,EAAE,uBAAuB;IAE/B,4DAA4D;IAC5D,SAAS,EAAE,mBAAmB;CAC/B,CAAC,CAAC;AAEH,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,2CAA2C;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IAEd,gEAAgE;IAChE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEhC,sDAAsD;IACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAEhB,mCAAmC;IACnC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAEvB,sDAAsD;IACtD,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAElC,4DAA4D;IAC5D,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEnC,gDAAgD;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE9B,0BAA0B;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IAEnB,gCAAgC;IAChC,MAAM,EAAE,uBAAuB;IAE/B,6DAA6D;IAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE5B,oDAAoD;IACpD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAEjD,wDAAwD;IACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAErD,iDAAiD;IACjD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IAErB,4DAA4D;IAC5D,SAAS,EAAE,mBAAmB;IAE9B,+EAA+E;IAC/E,MAAM,EAAE,2BAA2B;IAEnC,oDAAoD;IACpD,SAAS,EAAE,mBAAmB;CAC/B,CAAC,CAAC;AASH,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,6BAA6B,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC;AACvF,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC","sourcesContent":["/**\n * Apollo Signal — Email Response Schemas\n *\n * Response shapes for the public /v1/emails* API surface.\n * These are the only Signal response schemas that cross the backend-to-client\n * boundary and belong in this package.\n *\n * Dashboard response schemas (/signal/*) are backend-private and live in\n * apps/signal/src/modules/<module>/contracts/internal/.\n */\n\nimport { z } from 'zod';\n\nimport { IsoDateStringSchema, NullableIsoDateStringSchema } from '../common.js';\nimport { SignalEmailStatusSchema } from './domain.schema.js';\n\n// ---------------------------------------------------------------------------\n// POST /v1/emails — send response\n// ---------------------------------------------------------------------------\n\n/**\n * Response body for a successful POST /v1/emails.\n *\n * When testMode is true the status field is \"test\" and messageId is null.\n */\nexport const SignalSendEmailResponseSchema = z.object({\n /** Email ID (email_<crockford-base32>). */\n id: z.string(),\n\n /**\n * SES message ID. Present when the email was submitted to SES.\n * null for test-mode sends.\n */\n messageId: z.string().nullable(),\n\n /** Email status immediately after the send attempt. */\n status: SignalEmailStatusSchema,\n\n /** ISO 8601 timestamp when the email record was created. */\n createdAt: IsoDateStringSchema,\n});\n\n// ---------------------------------------------------------------------------\n// GET /v1/emails/:emailId — email resource\n// ---------------------------------------------------------------------------\n\n/**\n * Public email resource returned by GET /v1/emails/:emailId.\n *\n * Scoped to the project bound to the API key. Recipient addresses are\n * returned in full (the caller is the project owner).\n */\nexport const SignalEmailResourceSchema = z.object({\n /** Email ID (email_<crockford-base32>). */\n id: z.string(),\n\n /** SES message ID. null until the email is submitted to SES. */\n messageId: z.string().nullable(),\n\n /** Sender address as supplied in the send request. */\n from: z.string(),\n\n /** Primary recipient addresses. */\n to: z.array(z.string()),\n\n /** Carbon-copy recipients. null when not supplied. */\n cc: z.array(z.string()).nullable(),\n\n /** Blind carbon-copy recipients. null when not supplied. */\n bcc: z.array(z.string()).nullable(),\n\n /** Reply-to address. null when not supplied. */\n replyTo: z.string().nullable(),\n\n /** Email subject line. */\n subject: z.string(),\n\n /** Current lifecycle status. */\n status: SignalEmailStatusSchema,\n\n /** Error message when status is \"failed\". null otherwise. */\n error: z.string().nullable(),\n\n /** Caller-supplied tags. null when not supplied. */\n tags: z.record(z.string(), z.string()).nullable(),\n\n /** Caller-supplied metadata. null when not supplied. */\n metadata: z.record(z.string(), z.string()).nullable(),\n\n /** true when the email was sent in test mode. */\n testMode: z.boolean(),\n\n /** ISO 8601 timestamp when the email record was created. */\n createdAt: IsoDateStringSchema,\n\n /** ISO 8601 timestamp when the email was submitted to SES. null until sent. */\n sentAt: NullableIsoDateStringSchema,\n\n /** ISO 8601 timestamp of the last status update. */\n updatedAt: IsoDateStringSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Inferred TypeScript types\n// ---------------------------------------------------------------------------\n\nexport type SignalSendEmailResponse = z.infer<typeof SignalSendEmailResponseSchema>;\nexport type SignalEmailResource = z.infer<typeof SignalEmailResourceSchema>;\n\n// ---------------------------------------------------------------------------\n// Schema registry — promotes types to OpenAPI components/schemas\n// ---------------------------------------------------------------------------\n\nz.globalRegistry.add(SignalSendEmailResponseSchema, { id: 'SignalSendEmailResponse' });\nz.globalRegistry.add(SignalEmailResourceSchema, { id: 'SignalEmailResource' });\n"]}
|