@actuate-media/cms-core 0.61.0 → 0.63.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 (72) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/__tests__/api/email-settings-routes.test.d.ts +2 -0
  3. package/dist/__tests__/api/email-settings-routes.test.d.ts.map +1 -0
  4. package/dist/__tests__/api/email-settings-routes.test.js +240 -0
  5. package/dist/__tests__/api/email-settings-routes.test.js.map +1 -0
  6. package/dist/__tests__/api/field-values-routes.test.d.ts +2 -0
  7. package/dist/__tests__/api/field-values-routes.test.d.ts.map +1 -0
  8. package/dist/__tests__/api/field-values-routes.test.js +147 -0
  9. package/dist/__tests__/api/field-values-routes.test.js.map +1 -0
  10. package/dist/__tests__/api/route-contracts.test.js +5 -0
  11. package/dist/__tests__/api/route-contracts.test.js.map +1 -1
  12. package/dist/__tests__/collections/presets.test.js +24 -0
  13. package/dist/__tests__/collections/presets.test.js.map +1 -1
  14. package/dist/__tests__/email/resolve.test.d.ts +2 -0
  15. package/dist/__tests__/email/resolve.test.d.ts.map +1 -0
  16. package/dist/__tests__/email/resolve.test.js +90 -0
  17. package/dist/__tests__/email/resolve.test.js.map +1 -0
  18. package/dist/__tests__/email/settings-store.test.d.ts +2 -0
  19. package/dist/__tests__/email/settings-store.test.d.ts.map +1 -0
  20. package/dist/__tests__/email/settings-store.test.js +149 -0
  21. package/dist/__tests__/email/settings-store.test.js.map +1 -0
  22. package/dist/api/handlers.d.ts.map +1 -1
  23. package/dist/api/handlers.js +2 -0
  24. package/dist/api/handlers.js.map +1 -1
  25. package/dist/api/route-helpers.d.ts +6 -0
  26. package/dist/api/route-helpers.d.ts.map +1 -1
  27. package/dist/api/route-helpers.js +13 -0
  28. package/dist/api/route-helpers.js.map +1 -1
  29. package/dist/api/routes/documents.d.ts.map +1 -1
  30. package/dist/api/routes/documents.js +76 -0
  31. package/dist/api/routes/documents.js.map +1 -1
  32. package/dist/api/routes/email-settings.d.ts +3 -0
  33. package/dist/api/routes/email-settings.d.ts.map +1 -0
  34. package/dist/api/routes/email-settings.js +248 -0
  35. package/dist/api/routes/email-settings.js.map +1 -0
  36. package/dist/api/routes/users.js +3 -3
  37. package/dist/api/routes/users.js.map +1 -1
  38. package/dist/auth/invites.js +2 -2
  39. package/dist/auth/invites.js.map +1 -1
  40. package/dist/auth/reset.js +2 -2
  41. package/dist/auth/reset.js.map +1 -1
  42. package/dist/collections/presets.d.ts +8 -0
  43. package/dist/collections/presets.d.ts.map +1 -1
  44. package/dist/collections/presets.js +12 -3
  45. package/dist/collections/presets.js.map +1 -1
  46. package/dist/email/resolve.d.ts +27 -0
  47. package/dist/email/resolve.d.ts.map +1 -0
  48. package/dist/email/resolve.js +68 -0
  49. package/dist/email/resolve.js.map +1 -0
  50. package/dist/email/sender.d.ts +36 -0
  51. package/dist/email/sender.d.ts.map +1 -1
  52. package/dist/email/sender.js +16 -0
  53. package/dist/email/sender.js.map +1 -1
  54. package/dist/email/settings-store.d.ts +116 -0
  55. package/dist/email/settings-store.d.ts.map +1 -0
  56. package/dist/email/settings-store.js +222 -0
  57. package/dist/email/settings-store.js.map +1 -0
  58. package/dist/fields/index.d.ts +2 -1
  59. package/dist/fields/index.d.ts.map +1 -1
  60. package/dist/fields/index.js +1 -1
  61. package/dist/fields/index.js.map +1 -1
  62. package/dist/fields/presets.d.ts +15 -0
  63. package/dist/fields/presets.d.ts.map +1 -1
  64. package/dist/fields/presets.js +32 -0
  65. package/dist/fields/presets.js.map +1 -1
  66. package/dist/forms/notify.js +3 -3
  67. package/dist/forms/notify.js.map +1 -1
  68. package/dist/index.d.ts +7 -3
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +4 -2
  71. package/dist/index.js.map +1 -1
  72. package/package.json +1 -1
@@ -19,6 +19,31 @@
19
19
  * once at boot (when the plugin factory runs) and read-only afterwards.
20
20
  */
21
21
  import type { EmailAdapter } from '../config/types.js';
22
+ /**
23
+ * Decrypted provider settings handed to the plugin-registered factory when
24
+ * email is configured through Settings > Email (the `__email_config__` doc).
25
+ */
26
+ export interface ResolvedEmailProviderSettings {
27
+ provider: 'resend' | 'smtpcom' | 'ses' | 'smtp';
28
+ from: string;
29
+ apiKey?: string;
30
+ channel?: string;
31
+ region?: string;
32
+ host?: string;
33
+ port?: number;
34
+ secure?: boolean;
35
+ auth?: {
36
+ user: string;
37
+ pass: string;
38
+ };
39
+ }
40
+ /**
41
+ * Builds a concrete sender from DB-configured settings. Registered by
42
+ * `@actuate-media/plugin-email` at boot (the provider implementations and
43
+ * their optional deps live in the plugin, not in core). Returns `null` when
44
+ * the settings are incomplete for the selected provider.
45
+ */
46
+ export type EmailProviderFactory = (settings: ResolvedEmailProviderSettings) => EmailAdapter | null;
22
47
  /**
23
48
  * Register the process-wide transactional email sender. Called once at boot by
24
49
  * the email plugin. Pass `null` to clear it (used in tests).
@@ -30,6 +55,17 @@ export declare function getRegisteredEmailSender(): EmailAdapter | null;
30
55
  * Resolve the active transactional email sender, or `null` when email is not
31
56
  * configured. Prefers an explicit `platform.email` adapter, then a
32
57
  * plugin-registered sender.
58
+ *
59
+ * NOTE: this sync resolver does not see settings configured through the admin
60
+ * UI (Settings > Email). Send paths should prefer `resolveEmailSenderAsync()`
61
+ * from `email/resolve.js`, which checks the DB-backed config first.
33
62
  */
34
63
  export declare function resolveEmailSender(): EmailAdapter | null;
64
+ /**
65
+ * Register the factory that turns DB-configured email settings into a sender.
66
+ * Called once at boot by the email plugin. Pass `null` to clear (tests).
67
+ */
68
+ export declare function setEmailProviderFactory(factory: EmailProviderFactory | null): void;
69
+ /** The factory registered via {@link setEmailProviderFactory}, if any. */
70
+ export declare function getEmailProviderFactory(): EmailProviderFactory | null;
35
71
  //# sourceMappingURL=sender.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../src/email/sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAatD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAEhE;AAED,gEAAgE;AAChE,wBAAgB,wBAAwB,IAAI,YAAY,GAAG,IAAI,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAExD"}
1
+ {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../src/email/sender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAMtD;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAA;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CACtC;AAED;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,6BAA6B,KAAK,YAAY,GAAG,IAAI,CAAA;AAWnG;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAEhE;AAED,gEAAgE;AAChE,wBAAgB,wBAAwB,IAAI,YAAY,GAAG,IAAI,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAExD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAElF;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,IAAI,oBAAoB,GAAG,IAAI,CAErE"}
@@ -1,5 +1,6 @@
1
1
  import { getActuateConfig } from '../config/runtime.js';
2
2
  const GLOBAL_KEY = '__actuateEmailSender';
3
+ const FACTORY_KEY = '__actuateEmailProviderFactory';
3
4
  function store() {
4
5
  return globalThis;
5
6
  }
@@ -18,8 +19,23 @@ export function getRegisteredEmailSender() {
18
19
  * Resolve the active transactional email sender, or `null` when email is not
19
20
  * configured. Prefers an explicit `platform.email` adapter, then a
20
21
  * plugin-registered sender.
22
+ *
23
+ * NOTE: this sync resolver does not see settings configured through the admin
24
+ * UI (Settings > Email). Send paths should prefer `resolveEmailSenderAsync()`
25
+ * from `email/resolve.js`, which checks the DB-backed config first.
21
26
  */
22
27
  export function resolveEmailSender() {
23
28
  return getActuateConfig()?.platform?.email ?? getRegisteredEmailSender();
24
29
  }
30
+ /**
31
+ * Register the factory that turns DB-configured email settings into a sender.
32
+ * Called once at boot by the email plugin. Pass `null` to clear (tests).
33
+ */
34
+ export function setEmailProviderFactory(factory) {
35
+ store()[FACTORY_KEY] = factory;
36
+ }
37
+ /** The factory registered via {@link setEmailProviderFactory}, if any. */
38
+ export function getEmailProviderFactory() {
39
+ return store()[FACTORY_KEY] ?? null;
40
+ }
25
41
  //# sourceMappingURL=sender.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sender.js","sourceRoot":"","sources":["../../src/email/sender.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,UAAU,GAAG,sBAAsB,CAAA;AAMzC,SAAS,KAAK;IACZ,OAAO,UAA0C,CAAA;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAA2B;IACxD,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,MAAM,CAAA;AAC9B,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,wBAAwB;IACtC,OAAO,KAAK,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAA;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,EAAE,EAAE,QAAQ,EAAE,KAAK,IAAI,wBAAwB,EAAE,CAAA;AAC1E,CAAC"}
1
+ {"version":3,"file":"sender.js","sourceRoot":"","sources":["../../src/email/sender.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,MAAM,UAAU,GAAG,sBAAsB,CAAA;AACzC,MAAM,WAAW,GAAG,+BAA+B,CAAA;AA+BnD,SAAS,KAAK;IACZ,OAAO,UAA0C,CAAA;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAA2B;IACxD,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,MAAM,CAAA;AAC9B,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,wBAAwB;IACtC,OAAO,KAAK,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,CAAA;AACpC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,EAAE,EAAE,QAAQ,EAAE,KAAK,IAAI,wBAAwB,EAAE,CAAA;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAoC;IAC1E,KAAK,EAAE,CAAC,WAAW,CAAC,GAAG,OAAO,CAAA;AAChC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAA;AACrC,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * DB-backed email delivery configuration store (Settings > Email).
3
+ *
4
+ * Storage: a single Document row with `collection = '__email_config__'`,
5
+ * mirroring the AI config-store pattern (`src/ai/config-store.ts`) so no
6
+ * Prisma migration is required.
7
+ *
8
+ * Security invariants:
9
+ * - API keys and SMTP passwords are encrypted at rest via `encryptSecret`.
10
+ * - Encrypted values are NEVER returned to the client; handlers serialize
11
+ * through {@link toPublicEmailConfig} (masked last-4 + has-flags only).
12
+ * - Sending with these settings requires the provider factory registered by
13
+ * `@actuate-media/plugin-email` (dependency direction stays plugin → core).
14
+ */
15
+ import type { ResolvedEmailProviderSettings } from './sender.js';
16
+ export declare const EMAIL_CONFIG_COLLECTION = "__email_config__";
17
+ export declare const EMAIL_PROVIDER_KEYS: readonly ["resend", "smtpcom", "ses", "smtp"];
18
+ export type EmailProviderKey = (typeof EMAIL_PROVIDER_KEYS)[number];
19
+ export declare function isEmailProviderKey(value: unknown): value is EmailProviderKey;
20
+ export declare const EMAIL_PROVIDER_LABELS: Record<EmailProviderKey, string>;
21
+ /** Persisted shape of the `__email_config__` document (secrets encrypted). */
22
+ export interface EmailConfigDocument {
23
+ /** `null` = email is not configured through the admin UI. */
24
+ provider: EmailProviderKey | null;
25
+ /** Default sender address (e.g. `noreply@example.com`). */
26
+ from?: string;
27
+ /** Resend / SMTP.com API key (encrypted at rest). */
28
+ apiKeyEncrypted?: string;
29
+ apiKeyLast4?: string;
30
+ /** SMTP.com sender channel. */
31
+ channel?: string;
32
+ /** Amazon SES region (credentials come from the runtime's AWS env/role). */
33
+ region?: string;
34
+ /** Generic SMTP relay. */
35
+ host?: string;
36
+ port?: number;
37
+ secure?: boolean;
38
+ smtpUser?: string;
39
+ smtpPassEncrypted?: string;
40
+ /** Result of the most recent test send. */
41
+ lastTestStatus?: 'success' | 'failed';
42
+ lastTestedAt?: string;
43
+ lastTestError?: string;
44
+ updatedAt?: string;
45
+ updatedBy?: string;
46
+ }
47
+ /** Client-safe view: secrets stripped, replaced by masked metadata. */
48
+ export interface EmailConfigPublic {
49
+ provider: EmailProviderKey | null;
50
+ from?: string;
51
+ apiKeyLast4?: string;
52
+ hasApiKey: boolean;
53
+ channel?: string;
54
+ region?: string;
55
+ host?: string;
56
+ port?: number;
57
+ secure?: boolean;
58
+ smtpUser?: string;
59
+ hasSmtpPass: boolean;
60
+ lastTestStatus?: 'success' | 'failed';
61
+ lastTestedAt?: string;
62
+ lastTestError?: string;
63
+ updatedAt?: string;
64
+ updatedBy?: string;
65
+ }
66
+ /** Last 4 chars of a secret for masked display (never the full value). */
67
+ export declare function emailKeyLast4(key: string | undefined | null): string | undefined;
68
+ /** Read the email config document; `{ provider: null }` when none exists. */
69
+ export declare function getEmailConfig(db: unknown): Promise<EmailConfigDocument>;
70
+ /**
71
+ * Upsert the email config document. Caller is responsible for auth/role
72
+ * checks. Stamps `updatedAt`/`updatedBy`.
73
+ */
74
+ export declare function putEmailConfig(db: unknown, next: EmailConfigDocument, userId: string): Promise<EmailConfigDocument>;
75
+ /** Strip secret material for client serialization. */
76
+ export declare function toPublicEmailConfig(doc: EmailConfigDocument): EmailConfigPublic;
77
+ /**
78
+ * Decrypt the stored config into the plain settings consumed by the provider
79
+ * factory. Returns `null` when no provider is configured or when a required
80
+ * secret cannot be decrypted (wrong/missing `CMS_ENCRYPTION_KEY`) — callers
81
+ * fall back to the env-configured sender rather than sending with bad creds.
82
+ */
83
+ export declare function resolveEmailProviderSettings(doc: EmailConfigDocument): Promise<ResolvedEmailProviderSettings | null>;
84
+ /** Encrypt a plaintext secret for storage with its masked suffix. */
85
+ export declare function encryptEmailSecret(plaintext: string): Promise<{
86
+ encrypted: string;
87
+ last4: string;
88
+ }>;
89
+ /**
90
+ * Which provider (if any) the environment variables currently configure.
91
+ * Mirrors `resolveEmailConfigFromEnv()` in `@actuate-media/plugin-email` so
92
+ * the Settings UI can tell admins what env-based config exists alongside the
93
+ * DB settings.
94
+ */
95
+ export declare function detectEnvEmailProvider(env?: Record<string, string | undefined>): EmailProviderKey | null;
96
+ export interface EmailSettingsInput {
97
+ provider?: unknown;
98
+ from?: unknown;
99
+ apiKey?: unknown;
100
+ channel?: unknown;
101
+ region?: unknown;
102
+ host?: unknown;
103
+ port?: unknown;
104
+ secure?: unknown;
105
+ smtpUser?: unknown;
106
+ smtpPass?: unknown;
107
+ }
108
+ /**
109
+ * Validate a PUT payload against the selected provider's requirements.
110
+ * `hasStoredApiKey`/`hasStoredSmtpPass` let an update keep an existing secret
111
+ * without re-entering it (apiKey omitted = keep, null/'' = clear).
112
+ */
113
+ export declare function validateEmailSettingsInput(input: EmailSettingsInput, stored: {
114
+ hasApiKey: boolean;
115
+ }): string | null;
116
+ //# sourceMappingURL=settings-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-store.d.ts","sourceRoot":"","sources":["../../src/email/settings-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * DB-backed email delivery configuration store (Settings > Email).
3
+ *
4
+ * Storage: a single Document row with `collection = '__email_config__'`,
5
+ * mirroring the AI config-store pattern (`src/ai/config-store.ts`) so no
6
+ * Prisma migration is required.
7
+ *
8
+ * Security invariants:
9
+ * - API keys and SMTP passwords are encrypted at rest via `encryptSecret`.
10
+ * - Encrypted values are NEVER returned to the client; handlers serialize
11
+ * through {@link toPublicEmailConfig} (masked last-4 + has-flags only).
12
+ * - Sending with these settings requires the provider factory registered by
13
+ * `@actuate-media/plugin-email` (dependency direction stays plugin → core).
14
+ */
15
+ import { decryptSecret, encryptSecret } from '../security/secret-storage.js';
16
+ export const EMAIL_CONFIG_COLLECTION = '__email_config__';
17
+ export const EMAIL_PROVIDER_KEYS = ['resend', 'smtpcom', 'ses', 'smtp'];
18
+ export function isEmailProviderKey(value) {
19
+ return typeof value === 'string' && EMAIL_PROVIDER_KEYS.includes(value);
20
+ }
21
+ export const EMAIL_PROVIDER_LABELS = {
22
+ resend: 'Resend',
23
+ smtpcom: 'SMTP.com',
24
+ ses: 'Amazon SES',
25
+ smtp: 'SMTP server',
26
+ };
27
+ const EMPTY = { provider: null };
28
+ /** Last 4 chars of a secret for masked display (never the full value). */
29
+ export function emailKeyLast4(key) {
30
+ if (!key)
31
+ return undefined;
32
+ const trimmed = key.trim();
33
+ return trimmed.length >= 4 ? trimmed.slice(-4) : trimmed;
34
+ }
35
+ /** Read the email config document; `{ provider: null }` when none exists. */
36
+ export async function getEmailConfig(db) {
37
+ const d = db;
38
+ if (!d?.document?.findFirst)
39
+ return { ...EMPTY };
40
+ try {
41
+ const doc = await d.document.findFirst({
42
+ where: { collection: EMAIL_CONFIG_COLLECTION, deletedAt: null },
43
+ select: { data: true },
44
+ });
45
+ if (!doc?.data || typeof doc.data !== 'object')
46
+ return { ...EMPTY };
47
+ const data = doc.data;
48
+ return {
49
+ ...data,
50
+ provider: isEmailProviderKey(data.provider) ? data.provider : null,
51
+ };
52
+ }
53
+ catch {
54
+ return { ...EMPTY };
55
+ }
56
+ }
57
+ /**
58
+ * Upsert the email config document. Caller is responsible for auth/role
59
+ * checks. Stamps `updatedAt`/`updatedBy`.
60
+ */
61
+ export async function putEmailConfig(db, next, userId) {
62
+ const d = db;
63
+ const data = {
64
+ ...next,
65
+ updatedAt: new Date().toISOString(),
66
+ updatedBy: userId,
67
+ };
68
+ const existing = await d.document.findFirst({
69
+ where: { collection: EMAIL_CONFIG_COLLECTION, deletedAt: null },
70
+ select: { id: true },
71
+ });
72
+ if (existing) {
73
+ await d.document.update({ where: { id: existing.id }, data: { data, updatedById: userId } });
74
+ }
75
+ else {
76
+ await d.document.create({
77
+ data: {
78
+ collection: EMAIL_CONFIG_COLLECTION,
79
+ data,
80
+ status: 'PUBLISHED',
81
+ title: 'Email settings',
82
+ slug: 'email-config',
83
+ createdById: userId,
84
+ updatedById: userId,
85
+ },
86
+ });
87
+ }
88
+ return data;
89
+ }
90
+ /** Strip secret material for client serialization. */
91
+ export function toPublicEmailConfig(doc) {
92
+ const { apiKeyEncrypted: _key, smtpPassEncrypted: _pass, ...rest } = doc;
93
+ return {
94
+ ...rest,
95
+ hasApiKey: Boolean(doc.apiKeyEncrypted),
96
+ hasSmtpPass: Boolean(doc.smtpPassEncrypted),
97
+ };
98
+ }
99
+ /**
100
+ * Decrypt the stored config into the plain settings consumed by the provider
101
+ * factory. Returns `null` when no provider is configured or when a required
102
+ * secret cannot be decrypted (wrong/missing `CMS_ENCRYPTION_KEY`) — callers
103
+ * fall back to the env-configured sender rather than sending with bad creds.
104
+ */
105
+ export async function resolveEmailProviderSettings(doc) {
106
+ if (!doc.provider)
107
+ return null;
108
+ const from = doc.from?.trim();
109
+ if (!from)
110
+ return null;
111
+ try {
112
+ switch (doc.provider) {
113
+ case 'resend':
114
+ case 'smtpcom': {
115
+ if (!doc.apiKeyEncrypted)
116
+ return null;
117
+ const apiKey = await decryptSecret(doc.apiKeyEncrypted);
118
+ if (!apiKey)
119
+ return null;
120
+ return {
121
+ provider: doc.provider,
122
+ from,
123
+ apiKey,
124
+ ...(doc.provider === 'smtpcom' && doc.channel ? { channel: doc.channel } : {}),
125
+ };
126
+ }
127
+ case 'ses': {
128
+ if (!doc.region)
129
+ return null;
130
+ return { provider: 'ses', from, region: doc.region };
131
+ }
132
+ case 'smtp': {
133
+ if (!doc.host)
134
+ return null;
135
+ const pass = doc.smtpPassEncrypted ? await decryptSecret(doc.smtpPassEncrypted) : undefined;
136
+ return {
137
+ provider: 'smtp',
138
+ from,
139
+ host: doc.host,
140
+ port: doc.port,
141
+ secure: doc.secure,
142
+ auth: doc.smtpUser ? { user: doc.smtpUser, pass: pass ?? '' } : undefined,
143
+ };
144
+ }
145
+ }
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ }
151
+ /** Encrypt a plaintext secret for storage with its masked suffix. */
152
+ export async function encryptEmailSecret(plaintext) {
153
+ return { encrypted: await encryptSecret(plaintext), last4: emailKeyLast4(plaintext) ?? '' };
154
+ }
155
+ /**
156
+ * Which provider (if any) the environment variables currently configure.
157
+ * Mirrors `resolveEmailConfigFromEnv()` in `@actuate-media/plugin-email` so
158
+ * the Settings UI can tell admins what env-based config exists alongside the
159
+ * DB settings.
160
+ */
161
+ export function detectEnvEmailProvider(env = process.env) {
162
+ const explicit = env.EMAIL_PROVIDER;
163
+ if (isEmailProviderKey(explicit))
164
+ return explicit;
165
+ if (env.SMTP_HOST)
166
+ return 'smtp';
167
+ if (env.SMTPCOM_API_KEY ?? env.SMTP_KEY)
168
+ return 'smtpcom';
169
+ if (env.RESEND_API_KEY)
170
+ return 'resend';
171
+ return null;
172
+ }
173
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
174
+ const REGION_RE = /^[a-z]{2}(-[a-z]+)+-\d$/;
175
+ // Hostname only — no scheme, path, port suffix, or whitespace.
176
+ const HOST_RE = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/;
177
+ /**
178
+ * Validate a PUT payload against the selected provider's requirements.
179
+ * `hasStoredApiKey`/`hasStoredSmtpPass` let an update keep an existing secret
180
+ * without re-entering it (apiKey omitted = keep, null/'' = clear).
181
+ */
182
+ export function validateEmailSettingsInput(input, stored) {
183
+ if (input.provider === null)
184
+ return null; // clearing the config is always valid
185
+ if (!isEmailProviderKey(input.provider)) {
186
+ return 'A valid `provider` is required (resend, smtpcom, ses, smtp) or null to disable.';
187
+ }
188
+ const from = typeof input.from === 'string' ? input.from.trim() : '';
189
+ if (!from || !EMAIL_RE.test(from)) {
190
+ return 'A valid sender address (`from`) is required, e.g. noreply@yoursite.com.';
191
+ }
192
+ const newKey = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';
193
+ const keepsKey = input.apiKey === undefined && stored.hasApiKey;
194
+ switch (input.provider) {
195
+ case 'resend':
196
+ case 'smtpcom':
197
+ if (!newKey && !keepsKey)
198
+ return 'An API key is required for this provider.';
199
+ return null;
200
+ case 'ses': {
201
+ const region = typeof input.region === 'string' ? input.region.trim() : '';
202
+ if (!region || !REGION_RE.test(region)) {
203
+ return 'A valid AWS region is required, e.g. us-east-1.';
204
+ }
205
+ return null;
206
+ }
207
+ case 'smtp': {
208
+ const host = typeof input.host === 'string' ? input.host.trim() : '';
209
+ if (!host || !HOST_RE.test(host)) {
210
+ return 'A valid SMTP hostname is required, e.g. smtp.example.com.';
211
+ }
212
+ if (input.port !== undefined && input.port !== null) {
213
+ const port = Number(input.port);
214
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
215
+ return 'SMTP port must be an integer between 1 and 65535.';
216
+ }
217
+ }
218
+ return null;
219
+ }
220
+ }
221
+ }
222
+ //# sourceMappingURL=settings-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../../src/email/settings-store.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,8 @@ export interface FieldTypeDefinition {
12
12
  export declare const BUILT_IN_FIELDS: Record<string, FieldTypeDefinition>;
13
13
  export declare function getFieldType(type: string): FieldTypeDefinition | undefined;
14
14
  export declare function getAllFieldTypes(): FieldTypeDefinition[];
15
- export { titleField, slugField, pagePathField, excerptField, richContentField, featuredImageField, tagsField, publishedDateField, authorField, quoteField, ctaField, seoFields, locationFields, geoFields, priceFields, relationField, relatedDocsField, } from './presets.js';
15
+ export { titleField, slugField, pagePathField, excerptField, richContentField, featuredImageField, categoryField, tagsField, publishedDateField, authorField, quoteField, ctaField, seoFields, locationFields, geoFields, priceFields, relationField, relatedDocsField, } from './presets.js';
16
16
  export { collectRelationRefs, validateRelations, populateRelations, parsePopulateParam, } from './relations.js';
17
17
  export type { RelationLookup, RelationSummary, PopulateOptions } from './relations.js';
18
+ export type { CategoryOption } from './presets.js';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGzD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACvC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,KAAK,MAAM,GAAG,IAAI,CAAA;IACpE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;CAC1C;AAED,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAmF/D,CAAA;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAE1E;AAED,wBAAgB,gBAAgB,IAAI,mBAAmB,EAAE,CAExD;AAED,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGzD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACvC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,KAAK,MAAM,GAAG,IAAI,CAAA;IACpE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;CAC1C;AAED,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAmF/D,CAAA;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAE1E;AAED,wBAAgB,gBAAgB,IAAI,mBAAmB,EAAE,CAExD;AAED,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACtF,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
@@ -90,6 +90,6 @@ export function getFieldType(type) {
90
90
  export function getAllFieldTypes() {
91
91
  return Object.values(BUILT_IN_FIELDS);
92
92
  }
93
- export { titleField, slugField, pagePathField, excerptField, richContentField, featuredImageField, tagsField, publishedDateField, authorField, quoteField, ctaField, seoFields, locationFields, geoFields, priceFields, relationField, relatedDocsField, } from './presets.js';
93
+ export { titleField, slugField, pagePathField, excerptField, richContentField, featuredImageField, categoryField, tagsField, publishedDateField, authorField, quoteField, ctaField, seoFields, locationFields, geoFields, priceFields, relationField, relatedDocsField, } from './presets.js';
94
94
  export { collectRelationRefs, validateRelations, populateRelations, parsePopulateParam, } from './relations.js';
95
95
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAY9D,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAwC;IAClE,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB;KACrE;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,aAAa,EAAE;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;SACxD;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QAClD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB;KACrE;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;KACrD;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;KAC/C;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;KAC9D;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;KAChE;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,aAAa,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE;KAC/E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;KACjD;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;KAC/C;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;KAChE;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;KAC7C;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;KACjD;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;KAC7D;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;KAC/D;IACD,cAAc,EAAE,uBAAuB;CACxC,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;AACvC,CAAC;AAED,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,21 @@ export declare function featuredImageField(opts?: {
66
66
  label?: string;
67
67
  required?: boolean;
68
68
  }): Record<string, FieldDefinition>;
69
+ /** One option for {@link categoryField} — a plain string becomes `{ label, value }`. */
70
+ export type CategoryOption = string | {
71
+ label: string;
72
+ value: string;
73
+ };
74
+ /**
75
+ * Editorial category. With `options` it becomes a `select` (structured
76
+ * vocabulary — the editor renders a dropdown instead of free text); without,
77
+ * it stays a free-text field for back-compat with existing sites.
78
+ */
79
+ export declare function categoryField(opts?: {
80
+ label?: string;
81
+ options?: CategoryOption[];
82
+ required?: boolean;
83
+ }): Record<string, FieldDefinition>;
69
84
  /** Tags (array of plain strings). */
70
85
  export declare function tagsField(opts?: {
71
86
  label?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/fields/presets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/fields/presets.ts"],"names":[],"mappings":"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"}
@@ -83,6 +83,38 @@ export function featuredImageField(opts = {}) {
83
83
  },
84
84
  };
85
85
  }
86
+ /**
87
+ * Editorial category. With `options` it becomes a `select` (structured
88
+ * vocabulary — the editor renders a dropdown instead of free text); without,
89
+ * it stays a free-text field for back-compat with existing sites.
90
+ */
91
+ export function categoryField(opts = {}) {
92
+ if (opts.options && opts.options.length > 0) {
93
+ return {
94
+ category: {
95
+ type: 'select',
96
+ label: opts.label ?? 'Category',
97
+ required: opts.required,
98
+ options: opts.options.map((o) => typeof o === 'string' ? { label: o, value: slugifyOption(o) } : o),
99
+ },
100
+ };
101
+ }
102
+ return {
103
+ category: {
104
+ type: 'text',
105
+ label: opts.label ?? 'Category',
106
+ required: opts.required,
107
+ maxLength: 80,
108
+ },
109
+ };
110
+ }
111
+ function slugifyOption(label) {
112
+ return label
113
+ .toLowerCase()
114
+ .trim()
115
+ .replace(/[^a-z0-9]+/g, '-')
116
+ .replace(/^-+|-+$/g, '');
117
+ }
86
118
  /** Tags (array of plain strings). */
87
119
  export function tagsField(opts = {}) {
88
120
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/fields/presets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/fields/presets.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@
12
12
  * before interpolation, so a value can never inject markup into the email.
13
13
  */
14
14
  import { getActuateConfig } from '../config/runtime.js';
15
- import { resolveEmailSender } from '../email/sender.js';
15
+ import { resolveEmailSenderAsync } from '../email/resolve.js';
16
16
  import { createLogger } from '../diagnostics/logger.js';
17
17
  const logger = createLogger('forms-notify');
18
18
  const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -135,7 +135,7 @@ export function buildAutoresponderEmail(settings, ctx) {
135
135
  return { subject, html, text: stripTags(body) };
136
136
  }
137
137
  async function sendEmail(options) {
138
- const email = resolveEmailSender();
138
+ const email = await resolveEmailSenderAsync();
139
139
  if (!email)
140
140
  return false;
141
141
  await email.send(options);
@@ -148,7 +148,7 @@ async function sendEmail(options) {
148
148
  */
149
149
  export async function sendFormNotifications(settings, ctx) {
150
150
  const result = { notified: 0, autoresponded: false };
151
- if (!resolveEmailSender()) {
151
+ if (!(await resolveEmailSenderAsync())) {
152
152
  return { ...result, skippedReason: 'no-email-adapter' };
153
153
  }
154
154
  if (!settings?.enabled) {