@ultimat3/mail 1.0.0 → 1.2.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.
Files changed (69) hide show
  1. package/package.json +6 -6
  2. package/src/blocks.d.ts +0 -47
  3. package/src/blocks.d.ts.map +0 -1
  4. package/src/blocks.js +0 -23
  5. package/src/blocks.js.map +0 -1
  6. package/src/catalog.d.ts +0 -6
  7. package/src/catalog.d.ts.map +0 -1
  8. package/src/catalog.js +0 -78
  9. package/src/catalog.js.map +0 -1
  10. package/src/driver.d.ts +0 -79
  11. package/src/driver.d.ts.map +0 -1
  12. package/src/driver.js +0 -115
  13. package/src/driver.js.map +0 -1
  14. package/src/errors.d.ts +0 -23
  15. package/src/errors.d.ts.map +0 -1
  16. package/src/errors.js +0 -82
  17. package/src/errors.js.map +0 -1
  18. package/src/html.d.ts +0 -10
  19. package/src/html.d.ts.map +0 -1
  20. package/src/html.js +0 -34
  21. package/src/html.js.map +0 -1
  22. package/src/index.d.ts +0 -17
  23. package/src/index.d.ts.map +0 -1
  24. package/src/index.js +0 -13
  25. package/src/index.js.map +0 -1
  26. package/src/job.d.ts +0 -17
  27. package/src/job.d.ts.map +0 -1
  28. package/src/job.js +0 -79
  29. package/src/job.js.map +0 -1
  30. package/src/layout.d.ts +0 -41
  31. package/src/layout.d.ts.map +0 -1
  32. package/src/layout.js +0 -160
  33. package/src/layout.js.map +0 -1
  34. package/src/mail.d.ts +0 -67
  35. package/src/mail.d.ts.map +0 -1
  36. package/src/mail.js +0 -119
  37. package/src/mail.js.map +0 -1
  38. package/src/render.d.ts +0 -26
  39. package/src/render.d.ts.map +0 -1
  40. package/src/render.js +0 -149
  41. package/src/render.js.map +0 -1
  42. package/src/templates/index.d.ts +0 -9
  43. package/src/templates/index.d.ts.map +0 -1
  44. package/src/templates/index.js +0 -23
  45. package/src/templates/index.js.map +0 -1
  46. package/src/templates/invite.d.ts +0 -15
  47. package/src/templates/invite.d.ts.map +0 -1
  48. package/src/templates/invite.js +0 -25
  49. package/src/templates/invite.js.map +0 -1
  50. package/src/templates/mfa-enrolled.d.ts +0 -14
  51. package/src/templates/mfa-enrolled.d.ts.map +0 -1
  52. package/src/templates/mfa-enrolled.js +0 -26
  53. package/src/templates/mfa-enrolled.js.map +0 -1
  54. package/src/templates/reset-password.d.ts +0 -13
  55. package/src/templates/reset-password.d.ts.map +0 -1
  56. package/src/templates/reset-password.js +0 -23
  57. package/src/templates/reset-password.js.map +0 -1
  58. package/src/templates/security-alert.d.ts +0 -16
  59. package/src/templates/security-alert.d.ts.map +0 -1
  60. package/src/templates/security-alert.js +0 -29
  61. package/src/templates/security-alert.js.map +0 -1
  62. package/src/templates/verify-email.d.ts +0 -13
  63. package/src/templates/verify-email.d.ts.map +0 -1
  64. package/src/templates/verify-email.js +0 -23
  65. package/src/templates/verify-email.js.map +0 -1
  66. package/src/templates/welcome.d.ts +0 -13
  67. package/src/templates/welcome.d.ts.map +0 -1
  68. package/src/templates/welcome.js +0 -20
  69. package/src/templates/welcome.js.map +0 -1
package/src/render.js DELETED
@@ -1,149 +0,0 @@
1
- // Single responsibility: turn a template's block list into BOTH an HTML part and a plain-text
2
- // part. One source of truth per mail — the text is derived from the blocks, never scraped back
3
- // out of the HTML, so it never rots. Styling is inlined from the layout's tokens because most
4
- // clients drop <style>; the dark-mode block is the one exception, for clients that honour it.
5
- import { directionOf, translatorFor } from '@ultimat3/i18n';
6
- import { layoutUnknown, textMissing } from './errors';
7
- import { escapeHtml, safeUrl, styleAttr } from './html';
8
- import { layoutFor, registeredLayouts, token } from './layout';
9
- export const FOOTER_KEYS = ['mail.footer.legal', 'mail.footer.help'];
10
- export const UNSUBSCRIBE_KEY = 'mail.footer.unsubscribe';
11
- export function renderMail(mail, data, options) {
12
- const layout = layoutFor(mail.layout);
13
- if (layout === undefined)
14
- throw layoutUnknown(mail.id, mail.layout, registeredLayouts());
15
- const t = translatorFor(options.locale);
16
- const vars = toVars(data);
17
- const subject = t(mail.subject, vars);
18
- const preheaderKey = `mail.${mail.id}.preheader`;
19
- const preheader = t.has(preheaderKey) ? t(preheaderKey, vars) : subject;
20
- const list = mail.template({ data, t, locale: options.locale, tz: options.tz });
21
- const bodyText = textOf(list, t);
22
- if (bodyText.trim() === '')
23
- throw textMissing(mail.id);
24
- const footer = FOOTER_KEYS.filter((key) => t.has(key)).map((key) => t(key, vars));
25
- const unsubscribe = options.unsubscribeUrl === undefined
26
- ? undefined
27
- : { label: t(UNSUBSCRIBE_KEY), url: options.unsubscribeUrl };
28
- const html = layout({
29
- subject,
30
- preheader,
31
- content: list.map((block) => htmlOf(block, t)).join(''),
32
- footer,
33
- unsubscribe,
34
- locale: options.locale,
35
- direction: directionOf(options.locale),
36
- });
37
- const tail = [...footer];
38
- if (unsubscribe !== undefined)
39
- tail.push(`${unsubscribe.label}: ${safeUrl(unsubscribe.url)}`);
40
- const text = tail.length === 0 ? bodyText : `${bodyText}\n\n--\n${tail.join('\n')}`;
41
- return { subject, preheader, html, text };
42
- }
43
- /** The text part, block by block. Never derived from the HTML. */
44
- export function textOf(list, t) {
45
- const lines = [];
46
- for (const block of list) {
47
- switch (block.kind) {
48
- case 'heading':
49
- case 'paragraph':
50
- case 'callout':
51
- lines.push(t(block.key, block.vars));
52
- break;
53
- case 'button':
54
- lines.push(`${t(block.key, block.vars)}: ${safeUrl(block.href)}`);
55
- break;
56
- case 'detail':
57
- lines.push(`${t(block.key)}: ${block.value}`);
58
- break;
59
- case 'divider':
60
- break;
61
- }
62
- }
63
- return lines.join('\n\n');
64
- }
65
- const HEADING_STYLE = styleAttr([
66
- 'margin:0 0 16px 0',
67
- 'font-size:24px',
68
- 'line-height:32px',
69
- 'font-weight:600',
70
- `color:${token('textPrimary')}`,
71
- ]);
72
- const PARAGRAPH_STYLE = styleAttr([
73
- 'margin:0 0 16px 0',
74
- 'font-size:16px',
75
- 'line-height:24px',
76
- `color:${token('textPrimary')}`,
77
- ]);
78
- const DETAIL_LABEL_STYLE = styleAttr([`color:${token('textMuted')}`, 'font-size:14px']);
79
- const BUTTON_LINK_STYLE = styleAttr([
80
- 'display:inline-block',
81
- 'padding:12px 22px',
82
- 'font-size:16px',
83
- 'font-weight:600',
84
- 'text-decoration:none',
85
- `color:${token('accentText')}`,
86
- `background-color:${token('accentBg')}`,
87
- 'border-radius:8px',
88
- ]);
89
- const DIVIDER_STYLE = styleAttr([
90
- `border-top:1px solid ${token('borderSubtle')}`,
91
- 'font-size:0',
92
- 'line-height:0',
93
- 'height:1px',
94
- 'padding:8px 0 0 0',
95
- ]);
96
- const TABLE_ATTRS = 'role="presentation" cellpadding="0" cellspacing="0" border="0"';
97
- function calloutStyle(tone) {
98
- const bg = tone === 'danger' ? token('calloutDangerBg') : token('calloutInfoBg');
99
- const fg = tone === 'danger' ? token('calloutDangerText') : token('calloutInfoText');
100
- return styleAttr([
101
- `background-color:${bg}`,
102
- `color:${fg}`,
103
- 'padding:16px',
104
- 'border-radius:8px',
105
- 'font-size:15px',
106
- 'line-height:22px',
107
- ]);
108
- }
109
- function htmlOf(block, t) {
110
- switch (block.kind) {
111
- case 'heading':
112
- return `<h1 data-x="h" ${HEADING_STYLE}>${escapeHtml(t(block.key, block.vars))}</h1>`;
113
- case 'paragraph':
114
- return `<p data-x="p" ${PARAGRAPH_STYLE}>${escapeHtml(t(block.key, block.vars))}</p>`;
115
- case 'button': {
116
- const href = escapeHtml(safeUrl(block.href));
117
- const label = escapeHtml(t(block.key, block.vars));
118
- const anchor = `<a data-x="btn" href="${href}" ${BUTTON_LINK_STYLE}>${label}</a>`;
119
- return `<table ${TABLE_ATTRS}><tr><td>${anchor}</td></tr></table>`;
120
- }
121
- case 'callout': {
122
- const role = block.tone === 'danger' ? 'cd' : 'ci';
123
- const body = escapeHtml(t(block.key, block.vars));
124
- const cell = `<td data-x="${role}" ${calloutStyle(block.tone)}>${body}</td>`;
125
- return `<table ${TABLE_ATTRS} width="100%"><tr>${cell}</tr></table>`;
126
- }
127
- case 'detail': {
128
- const label = `<span data-x="mut" ${DETAIL_LABEL_STYLE}>${escapeHtml(t(block.key))}</span>`;
129
- return `<p data-x="p" ${PARAGRAPH_STYLE}>${label} ${escapeHtml(block.value)}</p>`;
130
- }
131
- case 'divider': {
132
- const cell = `<td data-x="hr" ${DIVIDER_STYLE}></td>`;
133
- return `<table ${TABLE_ATTRS} width="100%"><tr>${cell}</tr></table>`;
134
- }
135
- }
136
- }
137
- /** Scalar fields of the payload become interpolation vars; Dates and objects never do. */
138
- function toVars(data) {
139
- const vars = {};
140
- if (typeof data !== 'object' || data === null)
141
- return vars;
142
- for (const [key, value] of Object.entries(data)) {
143
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
144
- vars[key] = value;
145
- }
146
- }
147
- return vars;
148
- }
149
- //# sourceMappingURL=render.js.map
package/src/render.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["render.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type { AnyMailDefinition } from '../mail';
2
- export { type InviteInput, inviteInput, inviteMail } from './invite';
3
- export { MFA_METHODS, type MfaEnrolledInput, mfaEnrolledInput, mfaEnrolledMail, } from './mfa-enrolled';
4
- export { type ResetPasswordInput, resetPasswordInput, resetPasswordMail, } from './reset-password';
5
- export { type SecurityAlertInput, securityAlertInput, securityAlertMail, } from './security-alert';
6
- export { type VerifyEmailInput, verifyEmailInput, verifyEmailMail } from './verify-email';
7
- export { type WelcomeInput, welcomeInput, welcomeMail } from './welcome';
8
- export declare const FRAMEWORK_MAILS: readonly AnyMailDefinition[];
9
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAQjD,OAAO,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEzE,eAAO,MAAM,eAAe,EAAE,SAAS,iBAAiB,EAOvD,CAAC"}
@@ -1,23 +0,0 @@
1
- // Single responsibility: the framework's own transactional mails, gathered. `FRAMEWORK_MAILS`
2
- // is what `x mail list` prints and what the i18n audit walks for missing keys.
3
- import { inviteMail } from './invite';
4
- import { mfaEnrolledMail } from './mfa-enrolled';
5
- import { resetPasswordMail } from './reset-password';
6
- import { securityAlertMail } from './security-alert';
7
- import { verifyEmailMail } from './verify-email';
8
- import { welcomeMail } from './welcome';
9
- export { inviteInput, inviteMail } from './invite';
10
- export { MFA_METHODS, mfaEnrolledInput, mfaEnrolledMail, } from './mfa-enrolled';
11
- export { resetPasswordInput, resetPasswordMail, } from './reset-password';
12
- export { securityAlertInput, securityAlertMail, } from './security-alert';
13
- export { verifyEmailInput, verifyEmailMail } from './verify-email';
14
- export { welcomeInput, welcomeMail } from './welcome';
15
- export const FRAMEWORK_MAILS = [
16
- welcomeMail,
17
- verifyEmailMail,
18
- resetPasswordMail,
19
- inviteMail,
20
- mfaEnrolledMail,
21
- securityAlertMail,
22
- ];
23
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+EAA+E;AAG/E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAoB,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EACL,WAAW,EAEX,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAyB,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAqB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEzE,MAAM,CAAC,MAAM,eAAe,GAAiC;IAC3D,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,UAAU;IACV,eAAe;IACf,iBAAiB;CAClB,CAAC"}
@@ -1,15 +0,0 @@
1
- import { type Infer } from '@ultimat3/schema';
2
- export declare const inviteInput: import("@ultimat3/schema").ObjectSchema<{
3
- inviterName: import("@ultimat3/schema").StringSchema;
4
- orgName: import("@ultimat3/schema").StringSchema;
5
- url: import("@ultimat3/schema").StringSchema;
6
- expiresHours: import("@ultimat3/schema").NumberSchema;
7
- }>;
8
- export type InviteInput = Infer<typeof inviteInput>;
9
- export declare const inviteMail: import("..").MailDefinition<{
10
- expiresHours: number;
11
- inviterName: string;
12
- orgName: string;
13
- url: string;
14
- }>;
15
- //# sourceMappingURL=invite.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["invite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,kBAAkB,CAAC;AAIjD,eAAO,MAAM,WAAW;;;;;EAKtB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEpD,eAAO,MAAM,UAAU;;;;;EAarB,CAAC"}
@@ -1,25 +0,0 @@
1
- // Single responsibility: the org-invitation mail.
2
- import { t } from '@ultimat3/schema';
3
- import { blocks } from '../blocks';
4
- import { defineMail } from '../mail';
5
- export const inviteInput = t.object({
6
- inviterName: t.string,
7
- orgName: t.string,
8
- url: t.url,
9
- expiresHours: t.number.int().min(1),
10
- });
11
- export const inviteMail = defineMail({
12
- id: 'invite',
13
- subject: 'mail.invite.subject',
14
- input: inviteInput,
15
- template: ({ data }) => [
16
- blocks.heading('mail.invite.heading', { orgName: data.orgName }),
17
- blocks.paragraph('mail.invite.body', {
18
- inviterName: data.inviterName,
19
- orgName: data.orgName,
20
- }),
21
- blocks.button('mail.invite.cta', data.url),
22
- blocks.paragraph('mail.invite.expiry', { count: data.expiresHours }),
23
- ],
24
- });
25
- //# sourceMappingURL=invite.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invite.js","sourceRoot":"","sources":["invite.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAElD,OAAO,EAAc,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM;IACjB,GAAG,EAAE,CAAC,CAAC,GAAG;IACV,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACpC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAc;IAChD,EAAE,EAAE,QAAQ;IACZ,OAAO,EAAE,qBAAqB;IAC9B,KAAK,EAAE,WAAW;IAClB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE;YACnC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;KACrE;CACF,CAAC,CAAC"}
@@ -1,14 +0,0 @@
1
- import { type Infer } from '@ultimat3/schema';
2
- export declare const MFA_METHODS: readonly ['totp', 'webauthn', 'sms'];
3
- export declare const mfaEnrolledInput: import("@ultimat3/schema").ObjectSchema<{
4
- name: import("@ultimat3/schema").StringSchema;
5
- method: import("@ultimat3/schema").Schema<"sms" | "totp" | "webauthn", "sms" | "totp" | "webauthn">;
6
- at: import("@ultimat3/schema").Schema<string | number | Date, Date>;
7
- }>;
8
- export type MfaEnrolledInput = Infer<typeof mfaEnrolledInput>;
9
- export declare const mfaEnrolledMail: import("..").MailDefinition<{
10
- at: Date;
11
- method: "sms" | "totp" | "webauthn";
12
- name: string;
13
- }>;
14
- //# sourceMappingURL=mfa-enrolled.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mfa-enrolled.d.ts","sourceRoot":"","sources":["mfa-enrolled.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,kBAAkB,CAAC;AAKjD,eAAO,MAAM,WAAW,YAAI,MAAM,EAAE,UAAU,EAAE,KAAK,CAAU,CAAC;AAEhE,eAAO,MAAM,gBAAgB;;;;EAI3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,eAAO,MAAM,eAAe;;;;EAkB1B,CAAC"}
@@ -1,26 +0,0 @@
1
- // Single responsibility: the "a second factor was added" notice. The enrolment time is
2
- // formatted in the recipient's zone — "at 03:12" is only useful if it is their 03:12.
3
- import { t } from '@ultimat3/schema';
4
- import { formatDateTime, instant } from '@ultimat3/time';
5
- import { blocks } from '../blocks';
6
- import { defineMail } from '../mail';
7
- export const MFA_METHODS = ['totp', 'webauthn', 'sms'];
8
- export const mfaEnrolledInput = t.object({
9
- name: t.string,
10
- method: t.enum(MFA_METHODS),
11
- at: t.date,
12
- });
13
- export const mfaEnrolledMail = defineMail({
14
- id: 'mfa-enrolled',
15
- subject: 'mail.mfa-enrolled.subject',
16
- input: mfaEnrolledInput,
17
- template: ({ data, t: translate, locale, tz }) => [
18
- blocks.heading('mail.mfa-enrolled.heading', { name: data.name }),
19
- blocks.paragraph('mail.mfa-enrolled.body'),
20
- blocks.detail('mail.mfa-enrolled.method-label', translate(`mail.mfa-enrolled.method-${data.method}`)),
21
- blocks.detail('mail.mfa-enrolled.at-label', formatDateTime(instant(data.at), { locale, zone: tz, style: 'medium' })),
22
- blocks.divider(),
23
- blocks.paragraph('mail.mfa-enrolled.help'),
24
- ],
25
- });
26
- //# sourceMappingURL=mfa-enrolled.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mfa-enrolled.js","sourceRoot":"","sources":["mfa-enrolled.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,sFAAsF;AAEtF,OAAO,EAAc,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAU,CAAC;AAEhE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM;IACd,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC3B,EAAE,EAAE,CAAC,CAAC,IAAI;CACX,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAmB;IAC1D,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,2BAA2B;IACpC,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC;QAC1C,MAAM,CAAC,MAAM,CACX,gCAAgC,EAChC,SAAS,CAAC,4BAA4B,IAAI,CAAC,MAAM,EAAE,CAAC,CACrD;QACD,MAAM,CAAC,MAAM,CACX,4BAA4B,EAC5B,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CACxE;QACD,MAAM,CAAC,OAAO,EAAE;QAChB,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC;KAC3C;CACF,CAAC,CAAC"}
@@ -1,13 +0,0 @@
1
- import { type Infer } from '@ultimat3/schema';
2
- export declare const resetPasswordInput: import("@ultimat3/schema").ObjectSchema<{
3
- name: import("@ultimat3/schema").StringSchema;
4
- url: import("@ultimat3/schema").StringSchema;
5
- expiresMinutes: import("@ultimat3/schema").NumberSchema;
6
- }>;
7
- export type ResetPasswordInput = Infer<typeof resetPasswordInput>;
8
- export declare const resetPasswordMail: import("..").MailDefinition<{
9
- expiresMinutes: number;
10
- name: string;
11
- url: string;
12
- }>;
13
- //# sourceMappingURL=reset-password.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reset-password.d.ts","sourceRoot":"","sources":["reset-password.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,kBAAkB,CAAC;AAIjD,eAAO,MAAM,kBAAkB;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,eAAO,MAAM,iBAAiB;;;;EAW5B,CAAC"}
@@ -1,23 +0,0 @@
1
- // Single responsibility: the password-reset mail. The "you did not ask for this" line is not
2
- // optional politeness — it is how a targeted reset attempt gets reported.
3
- import { t } from '@ultimat3/schema';
4
- import { blocks } from '../blocks';
5
- import { defineMail } from '../mail';
6
- export const resetPasswordInput = t.object({
7
- name: t.string,
8
- url: t.url,
9
- expiresMinutes: t.number.int().min(1),
10
- });
11
- export const resetPasswordMail = defineMail({
12
- id: 'reset-password',
13
- subject: 'mail.reset-password.subject',
14
- input: resetPasswordInput,
15
- template: ({ data }) => [
16
- blocks.heading('mail.reset-password.heading', { name: data.name }),
17
- blocks.paragraph('mail.reset-password.body'),
18
- blocks.button('mail.reset-password.cta', data.url),
19
- blocks.paragraph('mail.reset-password.expiry', { count: data.expiresMinutes }),
20
- blocks.paragraph('mail.reset-password.ignore'),
21
- ],
22
- });
23
- //# sourceMappingURL=reset-password.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reset-password.js","sourceRoot":"","sources":["reset-password.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,0EAA0E;AAE1E,OAAO,EAAc,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM;IACd,GAAG,EAAE,CAAC,CAAC,GAAG;IACV,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACtC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAqB;IAC9D,EAAE,EAAE,gBAAgB;IACpB,OAAO,EAAE,6BAA6B;IACtC,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,IAAI,CAAC,GAAG,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9E,MAAM,CAAC,SAAS,CAAC,4BAA4B,CAAC;KAC/C;CACF,CAAC,CAAC"}
@@ -1,16 +0,0 @@
1
- import { type Infer } from '@ultimat3/schema';
2
- export declare const securityAlertInput: import("@ultimat3/schema").ObjectSchema<{
3
- name: import("@ultimat3/schema").StringSchema;
4
- /** A machine event id (`session.new-device`), not prose. */
5
- event: import("@ultimat3/schema").StringSchema;
6
- ip: import("@ultimat3/schema").StringSchema;
7
- at: import("@ultimat3/schema").Schema<string | number | Date, Date>;
8
- }>;
9
- export type SecurityAlertInput = Infer<typeof securityAlertInput>;
10
- export declare const securityAlertMail: import("..").MailDefinition<{
11
- at: Date;
12
- event: string;
13
- ip: string;
14
- name: string;
15
- }>;
16
- //# sourceMappingURL=security-alert.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-alert.d.ts","sourceRoot":"","sources":["security-alert.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,kBAAkB,CAAC;AAKjD,eAAO,MAAM,kBAAkB;;IAE7B,4DAA4D;;;;EAI5D,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,eAAO,MAAM,iBAAiB;;;;;EAgB5B,CAAC"}
@@ -1,29 +0,0 @@
1
- // Single responsibility: the security-alert mail — the one transactional mail that is allowed
2
- // to alarm. Event, IP and time are rendered as details, never woven into a sentence, so they
3
- // survive translation intact.
4
- import { t } from '@ultimat3/schema';
5
- import { formatDateTime, instant } from '@ultimat3/time';
6
- import { blocks } from '../blocks';
7
- import { defineMail } from '../mail';
8
- export const securityAlertInput = t.object({
9
- name: t.string,
10
- /** A machine event id (`session.new-device`), not prose. */
11
- event: t.string,
12
- ip: t.string,
13
- at: t.date,
14
- });
15
- export const securityAlertMail = defineMail({
16
- id: 'security-alert',
17
- subject: 'mail.security-alert.subject',
18
- input: securityAlertInput,
19
- template: ({ data, locale, tz }) => [
20
- blocks.heading('mail.security-alert.heading', { name: data.name }),
21
- blocks.callout('mail.security-alert.alert', 'danger'),
22
- blocks.detail('mail.security-alert.event-label', data.event),
23
- blocks.detail('mail.security-alert.ip-label', data.ip),
24
- blocks.detail('mail.security-alert.at-label', formatDateTime(instant(data.at), { locale, zone: tz, style: 'medium' })),
25
- blocks.divider(),
26
- blocks.paragraph('mail.security-alert.help'),
27
- ],
28
- });
29
- //# sourceMappingURL=security-alert.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security-alert.js","sourceRoot":"","sources":["security-alert.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,6FAA6F;AAC7F,8BAA8B;AAE9B,OAAO,EAAc,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM;IACd,4DAA4D;IAC5D,KAAK,EAAE,CAAC,CAAC,MAAM;IACf,EAAE,EAAE,CAAC,CAAC,MAAM;IACZ,EAAE,EAAE,CAAC,CAAC,IAAI;CACX,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAqB;IAC9D,EAAE,EAAE,gBAAgB;IACpB,OAAO,EAAE,6BAA6B;IACtC,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,iCAAiC,EAAE,IAAI,CAAC,KAAK,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,8BAA8B,EAAE,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,MAAM,CACX,8BAA8B,EAC9B,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CACxE;QACD,MAAM,CAAC,OAAO,EAAE;QAChB,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC;KAC7C;CACF,CAAC,CAAC"}
@@ -1,13 +0,0 @@
1
- import { type Infer } from '@ultimat3/schema';
2
- export declare const verifyEmailInput: import("@ultimat3/schema").ObjectSchema<{
3
- name: import("@ultimat3/schema").StringSchema;
4
- url: import("@ultimat3/schema").StringSchema;
5
- expiresMinutes: import("@ultimat3/schema").NumberSchema;
6
- }>;
7
- export type VerifyEmailInput = Infer<typeof verifyEmailInput>;
8
- export declare const verifyEmailMail: import("..").MailDefinition<{
9
- expiresMinutes: number;
10
- name: string;
11
- url: string;
12
- }>;
13
- //# sourceMappingURL=verify-email.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify-email.d.ts","sourceRoot":"","sources":["verify-email.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,kBAAkB,CAAC;AAIjD,eAAO,MAAM,gBAAgB;;;;EAI3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,eAAO,MAAM,eAAe;;;;EAW1B,CAAC"}
@@ -1,23 +0,0 @@
1
- // Single responsibility: the email-verification mail. The expiry line is a plural key, so a
2
- // 1-minute link never reads "1 minutes".
3
- import { t } from '@ultimat3/schema';
4
- import { blocks } from '../blocks';
5
- import { defineMail } from '../mail';
6
- export const verifyEmailInput = t.object({
7
- name: t.string,
8
- url: t.url,
9
- expiresMinutes: t.number.int().min(1),
10
- });
11
- export const verifyEmailMail = defineMail({
12
- id: 'verify-email',
13
- subject: 'mail.verify-email.subject',
14
- input: verifyEmailInput,
15
- template: ({ data }) => [
16
- blocks.heading('mail.verify-email.heading', { name: data.name }),
17
- blocks.paragraph('mail.verify-email.body'),
18
- blocks.button('mail.verify-email.cta', data.url),
19
- blocks.paragraph('mail.verify-email.expiry', { count: data.expiresMinutes }),
20
- blocks.paragraph('mail.verify-email.ignore'),
21
- ],
22
- });
23
- //# sourceMappingURL=verify-email.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify-email.js","sourceRoot":"","sources":["verify-email.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,yCAAyC;AAEzC,OAAO,EAAc,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM;IACd,GAAG,EAAE,CAAC,CAAC,GAAG;IACV,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACtC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAmB;IAC1D,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,2BAA2B;IACpC,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC,GAAG,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5E,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC;KAC7C;CACF,CAAC,CAAC"}
@@ -1,13 +0,0 @@
1
- import { type Infer } from '@ultimat3/schema';
2
- export declare const welcomeInput: import("@ultimat3/schema").ObjectSchema<{
3
- name: import("@ultimat3/schema").StringSchema;
4
- appName: import("@ultimat3/schema").StringSchema;
5
- url: import("@ultimat3/schema").StringSchema;
6
- }>;
7
- export type WelcomeInput = Infer<typeof welcomeInput>;
8
- export declare const welcomeMail: import("..").MailDefinition<{
9
- appName: string;
10
- name: string;
11
- url: string;
12
- }>;
13
- //# sourceMappingURL=welcome.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["welcome.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,KAAK,EAAK,MAAM,kBAAkB,CAAC;AAIjD,eAAO,MAAM,YAAY;;;;EAIvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEtD,eAAO,MAAM,WAAW;;;;EAStB,CAAC"}
@@ -1,20 +0,0 @@
1
- // Single responsibility: the welcome mail, as data. Keys only — the words live in a catalog.
2
- import { t } from '@ultimat3/schema';
3
- import { blocks } from '../blocks';
4
- import { defineMail } from '../mail';
5
- export const welcomeInput = t.object({
6
- name: t.string,
7
- appName: t.string,
8
- url: t.url,
9
- });
10
- export const welcomeMail = defineMail({
11
- id: 'welcome',
12
- subject: 'mail.welcome.subject',
13
- input: welcomeInput,
14
- template: ({ data }) => [
15
- blocks.heading('mail.welcome.heading', { name: data.name }),
16
- blocks.paragraph('mail.welcome.body', { appName: data.appName }),
17
- blocks.button('mail.welcome.cta', data.url, { appName: data.appName }),
18
- ],
19
- });
20
- //# sourceMappingURL=welcome.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"welcome.js","sourceRoot":"","sources":["welcome.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,EAAc,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM;IACd,OAAO,EAAE,CAAC,CAAC,MAAM;IACjB,GAAG,EAAE,CAAC,CAAC,GAAG;CACX,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAe;IAClD,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;KACvE;CACF,CAAC,CAAC"}