@actuate-media/cms-core 0.59.1 → 0.62.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/CHANGELOG.md +1731 -0
- package/README.md +33 -0
- package/dist/__tests__/api/email-settings-routes.test.d.ts +2 -0
- package/dist/__tests__/api/email-settings-routes.test.d.ts.map +1 -0
- package/dist/__tests__/api/email-settings-routes.test.js +240 -0
- package/dist/__tests__/api/email-settings-routes.test.js.map +1 -0
- package/dist/__tests__/api/page-sections-routes.test.js +103 -0
- package/dist/__tests__/api/page-sections-routes.test.js.map +1 -1
- package/dist/__tests__/api/route-contracts.test.js +3 -0
- package/dist/__tests__/api/route-contracts.test.js.map +1 -1
- package/dist/__tests__/collections/presets.test.js +19 -0
- package/dist/__tests__/collections/presets.test.js.map +1 -1
- package/dist/__tests__/email/resolve.test.d.ts +2 -0
- package/dist/__tests__/email/resolve.test.d.ts.map +1 -0
- package/dist/__tests__/email/resolve.test.js +90 -0
- package/dist/__tests__/email/resolve.test.js.map +1 -0
- package/dist/__tests__/email/settings-store.test.d.ts +2 -0
- package/dist/__tests__/email/settings-store.test.d.ts.map +1 -0
- package/dist/__tests__/email/settings-store.test.js +149 -0
- package/dist/__tests__/email/settings-store.test.js.map +1 -0
- package/dist/__tests__/forms/client-validation.test.d.ts +2 -0
- package/dist/__tests__/forms/client-validation.test.d.ts.map +1 -0
- package/dist/__tests__/forms/client-validation.test.js +98 -0
- package/dist/__tests__/forms/client-validation.test.js.map +1 -0
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +2 -0
- package/dist/api/handlers.js.map +1 -1
- package/dist/api/route-helpers.d.ts +6 -0
- package/dist/api/route-helpers.d.ts.map +1 -1
- package/dist/api/route-helpers.js +13 -0
- package/dist/api/route-helpers.js.map +1 -1
- package/dist/api/routes/email-settings.d.ts +3 -0
- package/dist/api/routes/email-settings.d.ts.map +1 -0
- package/dist/api/routes/email-settings.js +248 -0
- package/dist/api/routes/email-settings.js.map +1 -0
- package/dist/api/routes/meta.d.ts.map +1 -1
- package/dist/api/routes/meta.js +1 -0
- package/dist/api/routes/meta.js.map +1 -1
- package/dist/api/routes/sections.d.ts.map +1 -1
- package/dist/api/routes/sections.js +15 -4
- package/dist/api/routes/sections.js.map +1 -1
- package/dist/api/routes/users.js +3 -3
- package/dist/api/routes/users.js.map +1 -1
- package/dist/auth/invites.js +2 -2
- package/dist/auth/invites.js.map +1 -1
- package/dist/auth/reset.js +2 -2
- package/dist/auth/reset.js.map +1 -1
- package/dist/collections/presets.d.ts +10 -1
- package/dist/collections/presets.d.ts.map +1 -1
- package/dist/collections/presets.js +26 -5
- package/dist/collections/presets.js.map +1 -1
- package/dist/config/types.d.ts +8 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/email/resolve.d.ts +27 -0
- package/dist/email/resolve.d.ts.map +1 -0
- package/dist/email/resolve.js +68 -0
- package/dist/email/resolve.js.map +1 -0
- package/dist/email/sender.d.ts +36 -0
- package/dist/email/sender.d.ts.map +1 -1
- package/dist/email/sender.js +16 -0
- package/dist/email/sender.js.map +1 -1
- package/dist/email/settings-store.d.ts +116 -0
- package/dist/email/settings-store.d.ts.map +1 -0
- package/dist/email/settings-store.js +222 -0
- package/dist/email/settings-store.js.map +1 -0
- package/dist/forms/client-validation.d.ts +50 -0
- package/dist/forms/client-validation.d.ts.map +1 -0
- package/dist/forms/client-validation.js +215 -0
- package/dist/forms/client-validation.js.map +1 -0
- package/dist/forms/index.d.ts +1 -0
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +3 -0
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/notify.js +3 -3
- package/dist/forms/notify.js.map +1 -1
- package/dist/forms/validation.d.ts.map +1 -1
- package/dist/forms/validation.js +14 -83
- package/dist/forms/validation.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +9 -3
|
@@ -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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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-safe form validation — zero Node dependencies, tree-shakeable.
|
|
3
|
+
*
|
|
4
|
+
* Published as `@actuate-media/cms-core/forms/client` so public-site form
|
|
5
|
+
* components can mirror the server's rules (same regexes, same caps, same
|
|
6
|
+
* conditional-visibility semantics) for instant inline feedback.
|
|
7
|
+
*
|
|
8
|
+
* This is convenience only: the server re-validates every submission via
|
|
9
|
+
* `validateAndNormalizeSubmission()` (which also imports these primitives, so
|
|
10
|
+
* the two can never drift). The one intentional difference is sanitization —
|
|
11
|
+
* the client validates the raw value; the server strips HTML before storing.
|
|
12
|
+
*/
|
|
13
|
+
import type { FormField } from './types.js';
|
|
14
|
+
export declare const FORM_MAX_TEXT_LEN = 5000;
|
|
15
|
+
export declare const FORM_MAX_TEXTAREA_LEN = 50000;
|
|
16
|
+
export declare const FORM_MAX_MULTISELECT_ITEMS = 200;
|
|
17
|
+
/** The exact email format the server accepts for `email`-format fields. */
|
|
18
|
+
export declare const FORM_EMAIL_RE: RegExp;
|
|
19
|
+
/** The exact phone format the server accepts for `phone`-format fields. */
|
|
20
|
+
export declare const FORM_PHONE_RE: RegExp;
|
|
21
|
+
/** Field types that never carry a submitted value. */
|
|
22
|
+
export declare const FORM_NON_INPUT_TYPES: ReadonlySet<string>;
|
|
23
|
+
export declare function asString(value: unknown): string;
|
|
24
|
+
export declare function coerceBoolean(value: unknown): boolean;
|
|
25
|
+
/** A field is visible unless its `show` rules exist and not all of them pass. */
|
|
26
|
+
export declare function isFieldVisible(field: FormField, values: Record<string, unknown>): boolean;
|
|
27
|
+
/** A field is conditionally required when its `require` rules all pass. */
|
|
28
|
+
export declare function isFieldConditionallyRequired(field: FormField, values: Record<string, unknown>): boolean;
|
|
29
|
+
export declare function isValuePresent(raw: unknown): boolean;
|
|
30
|
+
export declare function isHttpUrl(value: string): boolean;
|
|
31
|
+
export interface ClientFieldValidation {
|
|
32
|
+
ok: boolean;
|
|
33
|
+
/** Human-readable message for the first failed rule, when `ok` is false. */
|
|
34
|
+
message?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validate a single field's value with the same rules the server applies.
|
|
38
|
+
*
|
|
39
|
+
* Pass `allValues` (the full form state) so conditional visibility/required
|
|
40
|
+
* logic evaluates correctly; a hidden field always validates as ok, matching
|
|
41
|
+
* the server (hidden fields are skipped, not required, not stored).
|
|
42
|
+
*/
|
|
43
|
+
export declare function validateFormFieldClient(field: FormField, value: unknown, allValues?: Record<string, unknown>): ClientFieldValidation;
|
|
44
|
+
/**
|
|
45
|
+
* Validate the whole form client-side. Returns the first error per field,
|
|
46
|
+
* keyed by field key. An empty object means the form would pass the server's
|
|
47
|
+
* field validation (spam/honeypot/file checks still run server-side).
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateFormValuesClient(fields: FormField[], values: Record<string, unknown>): Record<string, string>;
|
|
50
|
+
//# sourceMappingURL=client-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-validation.d.ts","sourceRoot":"","sources":["../../src/forms/client-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,YAAY,CAAA;AAI5D,eAAO,MAAM,iBAAiB,OAAQ,CAAA;AACtC,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAC3C,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAE7C,2EAA2E;AAC3E,eAAO,MAAM,aAAa,QAA+B,CAAA;AACzD,2EAA2E;AAC3E,eAAO,MAAM,aAAa,QAA4B,CAAA;AAEtD,sDAAsD;AACtD,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAInD,CAAA;AAIF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK/C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIrD;AAqBD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAIzF;AAED,2EAA2E;AAC3E,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAIT;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAKpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOhD;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAA;IACX,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,OAAO,EACd,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACtC,qBAAqB,CAwHvB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// Conservative hard caps so a single field can't be used to balloon the row /
|
|
2
|
+
// exhaust memory even when the schema omits explicit length rules.
|
|
3
|
+
export const FORM_MAX_TEXT_LEN = 5_000;
|
|
4
|
+
export const FORM_MAX_TEXTAREA_LEN = 50_000;
|
|
5
|
+
export const FORM_MAX_MULTISELECT_ITEMS = 200;
|
|
6
|
+
/** The exact email format the server accepts for `email`-format fields. */
|
|
7
|
+
export const FORM_EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
8
|
+
/** The exact phone format the server accepts for `phone`-format fields. */
|
|
9
|
+
export const FORM_PHONE_RE = /^[+]?[0-9\s().-]{6,20}$/;
|
|
10
|
+
/** Field types that never carry a submitted value. */
|
|
11
|
+
export const FORM_NON_INPUT_TYPES = new Set([
|
|
12
|
+
'richtext',
|
|
13
|
+
'divider',
|
|
14
|
+
'honeypot',
|
|
15
|
+
]);
|
|
16
|
+
const TRUTHY = new Set(['true', 'on', '1', 'yes', 'checked']);
|
|
17
|
+
export function asString(value) {
|
|
18
|
+
if (value == null)
|
|
19
|
+
return '';
|
|
20
|
+
if (typeof value === 'string')
|
|
21
|
+
return value;
|
|
22
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
23
|
+
return String(value);
|
|
24
|
+
return '';
|
|
25
|
+
}
|
|
26
|
+
export function coerceBoolean(value) {
|
|
27
|
+
if (typeof value === 'boolean')
|
|
28
|
+
return value;
|
|
29
|
+
if (typeof value === 'number')
|
|
30
|
+
return value === 1;
|
|
31
|
+
return TRUTHY.has(asString(value).trim().toLowerCase());
|
|
32
|
+
}
|
|
33
|
+
function evalRule(rule, values) {
|
|
34
|
+
const current = asString(values[rule.fieldKey]).toLowerCase().trim();
|
|
35
|
+
const target = asString(rule.value).toLowerCase().trim();
|
|
36
|
+
switch (rule.operator) {
|
|
37
|
+
case 'equals':
|
|
38
|
+
return current === target;
|
|
39
|
+
case 'notEquals':
|
|
40
|
+
return current !== target;
|
|
41
|
+
case 'contains':
|
|
42
|
+
return current.includes(target);
|
|
43
|
+
case 'isEmpty':
|
|
44
|
+
return current === '';
|
|
45
|
+
case 'isNotEmpty':
|
|
46
|
+
return current !== '';
|
|
47
|
+
default:
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** A field is visible unless its `show` rules exist and not all of them pass. */
|
|
52
|
+
export function isFieldVisible(field, values) {
|
|
53
|
+
const show = field.conditionalLogic?.show;
|
|
54
|
+
if (!show || show.length === 0)
|
|
55
|
+
return true;
|
|
56
|
+
return show.every((rule) => evalRule(rule, values));
|
|
57
|
+
}
|
|
58
|
+
/** A field is conditionally required when its `require` rules all pass. */
|
|
59
|
+
export function isFieldConditionallyRequired(field, values) {
|
|
60
|
+
const require = field.conditionalLogic?.require;
|
|
61
|
+
if (!require || require.length === 0)
|
|
62
|
+
return false;
|
|
63
|
+
return require.every((rule) => evalRule(rule, values));
|
|
64
|
+
}
|
|
65
|
+
export function isValuePresent(raw) {
|
|
66
|
+
if (raw === undefined || raw === null)
|
|
67
|
+
return false;
|
|
68
|
+
if (typeof raw === 'string')
|
|
69
|
+
return raw.trim() !== '';
|
|
70
|
+
if (Array.isArray(raw))
|
|
71
|
+
return raw.length > 0;
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
export function isHttpUrl(value) {
|
|
75
|
+
try {
|
|
76
|
+
const url = new URL(value);
|
|
77
|
+
return url.protocol === 'http:' || url.protocol === 'https:';
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Validate a single field's value with the same rules the server applies.
|
|
85
|
+
*
|
|
86
|
+
* Pass `allValues` (the full form state) so conditional visibility/required
|
|
87
|
+
* logic evaluates correctly; a hidden field always validates as ok, matching
|
|
88
|
+
* the server (hidden fields are skipped, not required, not stored).
|
|
89
|
+
*/
|
|
90
|
+
export function validateFormFieldClient(field, value, allValues = {}) {
|
|
91
|
+
if (FORM_NON_INPUT_TYPES.has(field.type))
|
|
92
|
+
return { ok: true };
|
|
93
|
+
if (!isFieldVisible(field, allValues))
|
|
94
|
+
return { ok: true };
|
|
95
|
+
const label = field.label || field.key;
|
|
96
|
+
const rules = field.validationRules ?? {};
|
|
97
|
+
const required = Boolean(field.required) ||
|
|
98
|
+
Boolean(rules.required) ||
|
|
99
|
+
isFieldConditionallyRequired(field, allValues);
|
|
100
|
+
const fail = (message) => ({ ok: false, message });
|
|
101
|
+
if (field.type === 'file') {
|
|
102
|
+
// The client knows file presence from its own input state; only the
|
|
103
|
+
// required check is expressible here.
|
|
104
|
+
if (required && !isValuePresent(value))
|
|
105
|
+
return fail(`${label} is required.`);
|
|
106
|
+
return { ok: true };
|
|
107
|
+
}
|
|
108
|
+
if (!isValuePresent(value)) {
|
|
109
|
+
return required ? fail(`${label} is required.`) : { ok: true };
|
|
110
|
+
}
|
|
111
|
+
switch (field.type) {
|
|
112
|
+
case 'checkbox':
|
|
113
|
+
case 'consent': {
|
|
114
|
+
const bool = coerceBoolean(value);
|
|
115
|
+
if ((field.type === 'consent' || required) && !bool) {
|
|
116
|
+
return fail(`${label} must be accepted.`);
|
|
117
|
+
}
|
|
118
|
+
return { ok: true };
|
|
119
|
+
}
|
|
120
|
+
case 'number': {
|
|
121
|
+
const num = typeof value === 'number' ? value : Number(asString(value).trim());
|
|
122
|
+
if (!Number.isFinite(num))
|
|
123
|
+
return fail(`${label} must be a number.`);
|
|
124
|
+
if (rules.min != null && num < rules.min) {
|
|
125
|
+
return fail(`${label} must be at least ${rules.min}.`);
|
|
126
|
+
}
|
|
127
|
+
if (rules.max != null && num > rules.max) {
|
|
128
|
+
return fail(`${label} must be at most ${rules.max}.`);
|
|
129
|
+
}
|
|
130
|
+
return { ok: true };
|
|
131
|
+
}
|
|
132
|
+
case 'multiselect': {
|
|
133
|
+
const list = Array.isArray(value) ? value : [value];
|
|
134
|
+
if (list.length > FORM_MAX_MULTISELECT_ITEMS) {
|
|
135
|
+
return fail(`${label} has too many selections.`);
|
|
136
|
+
}
|
|
137
|
+
const cleaned = list.map((v) => asString(v).trim()).filter((v) => v !== '');
|
|
138
|
+
const allowed = new Set((field.options ?? []).map((o) => o.value));
|
|
139
|
+
if (allowed.size > 0 && cleaned.some((v) => !allowed.has(v))) {
|
|
140
|
+
return fail(`${label} contains an invalid selection.`);
|
|
141
|
+
}
|
|
142
|
+
return { ok: true };
|
|
143
|
+
}
|
|
144
|
+
case 'select':
|
|
145
|
+
case 'radio': {
|
|
146
|
+
const val = asString(value).trim();
|
|
147
|
+
const allowed = new Set((field.options ?? []).map((o) => o.value));
|
|
148
|
+
if (allowed.size > 0 && !allowed.has(val)) {
|
|
149
|
+
return fail(`${label} contains an invalid selection.`);
|
|
150
|
+
}
|
|
151
|
+
return { ok: true };
|
|
152
|
+
}
|
|
153
|
+
case 'date': {
|
|
154
|
+
const d = new Date(asString(value).trim());
|
|
155
|
+
if (Number.isNaN(d.getTime()))
|
|
156
|
+
return fail(`${label} is not a valid date.`);
|
|
157
|
+
return { ok: true };
|
|
158
|
+
}
|
|
159
|
+
default: {
|
|
160
|
+
// text, email, phone, url, textarea, hidden
|
|
161
|
+
const s = asString(value).trim();
|
|
162
|
+
const maxLen = rules.maxLength ?? (field.type === 'textarea' ? FORM_MAX_TEXTAREA_LEN : FORM_MAX_TEXT_LEN);
|
|
163
|
+
if (s.length > maxLen) {
|
|
164
|
+
return fail(`${label} must be at most ${maxLen} characters.`);
|
|
165
|
+
}
|
|
166
|
+
if (rules.minLength != null && s.length < rules.minLength) {
|
|
167
|
+
return fail(`${label} must be at least ${rules.minLength} characters.`);
|
|
168
|
+
}
|
|
169
|
+
const format = rules.format ??
|
|
170
|
+
(field.type === 'email'
|
|
171
|
+
? 'email'
|
|
172
|
+
: field.type === 'url'
|
|
173
|
+
? 'url'
|
|
174
|
+
: field.type === 'phone'
|
|
175
|
+
? 'phone'
|
|
176
|
+
: undefined);
|
|
177
|
+
if (format === 'email' && !FORM_EMAIL_RE.test(s)) {
|
|
178
|
+
return fail(`${label} must be a valid email address.`);
|
|
179
|
+
}
|
|
180
|
+
if (format === 'phone' && !FORM_PHONE_RE.test(s)) {
|
|
181
|
+
return fail(`${label} must be a valid phone number.`);
|
|
182
|
+
}
|
|
183
|
+
if (format === 'url' && !isHttpUrl(s)) {
|
|
184
|
+
return fail(`${label} must be a valid URL.`);
|
|
185
|
+
}
|
|
186
|
+
if (rules.pattern) {
|
|
187
|
+
try {
|
|
188
|
+
if (!new RegExp(rules.pattern).test(s)) {
|
|
189
|
+
return fail(`${label} is not in the expected format.`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// An invalid pattern in the schema must never block input; schema
|
|
194
|
+
// validation already surfaces bad patterns to the editor.
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return { ok: true };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Validate the whole form client-side. Returns the first error per field,
|
|
203
|
+
* keyed by field key. An empty object means the form would pass the server's
|
|
204
|
+
* field validation (spam/honeypot/file checks still run server-side).
|
|
205
|
+
*/
|
|
206
|
+
export function validateFormValuesClient(fields, values) {
|
|
207
|
+
const errors = {};
|
|
208
|
+
for (const field of fields) {
|
|
209
|
+
const result = validateFormFieldClient(field, values[field.key], values);
|
|
210
|
+
if (!result.ok && result.message)
|
|
211
|
+
errors[field.key] = result.message;
|
|
212
|
+
}
|
|
213
|
+
return errors;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=client-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-validation.js","sourceRoot":"","sources":["../../src/forms/client-validation.ts"],"names":[],"mappings":"AAcA,8EAA8E;AAC9E,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAA;AAC3C,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAA;AAE7C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAG,4BAA4B,CAAA;AACzD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAG,yBAAyB,CAAA;AAEtD,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IAC/D,UAAU;IACV,SAAS;IACT,UAAU;CACX,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAA;AAE7D,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACjF,OAAO,EAAE,CAAA;AACX,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,KAAK,CAAC,CAAA;IACjD,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAqB,EAAE,MAA+B;IACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;IACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;IACxD,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,MAAM,CAAA;QAC3B,KAAK,WAAW;YACd,OAAO,OAAO,KAAK,MAAM,CAAA;QAC3B,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACjC,KAAK,SAAS;YACZ,OAAO,OAAO,KAAK,EAAE,CAAA;QACvB,KAAK,YAAY;YACf,OAAO,OAAO,KAAK,EAAE,CAAA;QACvB;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,KAAgB,EAAE,MAA+B;IAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAA;IACzC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,4BAA4B,CAC1C,KAAgB,EAChB,MAA+B;IAE/B,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,EAAE,OAAO,CAAA;IAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAClD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IACnD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAA;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1B,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAA;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAgB,EAChB,KAAc,EACd,YAAqC,EAAE;IAEvC,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAC7D,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAE1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAA;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAA;IACzC,MAAM,QAAQ,GACZ,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvB,4BAA4B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,CAAC,OAAe,EAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAEjF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,oEAAoE;QACpE,sCAAsC;QACtC,IAAI,QAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,KAAK,eAAe,CAAC,CAAA;QAC5E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAChE,CAAC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;YACjC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpD,OAAO,IAAI,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAA;YAC3C,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACrB,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAC9E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAA;YACpE,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAC,GAAG,KAAK,qBAAqB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;YACxD,CAAC;YACD,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAC,GAAG,KAAK,oBAAoB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;YACvD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACrB,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YACnD,IAAI,IAAI,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC,GAAG,KAAK,2BAA2B,CAAC,CAAA;YAClD,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YAClE,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACrB,CAAC;QAED,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;YAClC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;YAClE,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAA;YACxD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACrB,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAC1C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAA;YAC3E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACrB,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,4CAA4C;YAC5C,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;YAChC,MAAM,MAAM,GACV,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;YAC5F,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,GAAG,KAAK,oBAAoB,MAAM,cAAc,CAAC,CAAA;YAC/D,CAAC;YACD,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC,GAAG,KAAK,qBAAqB,KAAK,CAAC,SAAS,cAAc,CAAC,CAAA;YACzE,CAAC;YAED,MAAM,MAAM,GACV,KAAK,CAAC,MAAM;gBACZ,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;oBACrB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK;wBACpB,CAAC,CAAC,KAAK;wBACP,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;4BACtB,CAAC,CAAC,OAAO;4BACT,CAAC,CAAC,SAAS,CAAC,CAAA;YAEpB,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,IAAI,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAA;YACxD,CAAC;YACD,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,IAAI,CAAC,GAAG,KAAK,gCAAgC,CAAC,CAAA;YACvD,CAAC;YACD,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAA;YAC9C,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACH,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvC,OAAO,IAAI,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAA;oBACxD,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,kEAAkE;oBAClE,0DAA0D;gBAC5D,CAAC;YACH,CAAC;YAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAmB,EACnB,MAA+B;IAE/B,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;QACxE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAA;IACtE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/dist/forms/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export type { FormFieldType, PiiClassification, FormFieldOption, FieldValidation
|
|
|
7
7
|
export * from './service.js';
|
|
8
8
|
export * from './entries.js';
|
|
9
9
|
export { validateAndNormalizeSubmission, type FieldError, type SubmissionValidationResult, } from './validation.js';
|
|
10
|
+
export { validateFormFieldClient, validateFormValuesClient, isFieldVisible, isFieldConditionallyRequired, FORM_EMAIL_RE, FORM_PHONE_RE, FORM_MAX_TEXT_LEN, FORM_MAX_TEXTAREA_LEN, FORM_MAX_MULTISELECT_ITEMS, type ClientFieldValidation, } from './client-validation.js';
|
|
10
11
|
export { scoreSubmissionSpam, type SpamScoreInput, type SpamScoreResult } from './spam.js';
|
|
11
12
|
export { validateSubmissionFiles, persistSubmissionFiles, FORM_UPLOAD_ALLOWED_MIME_TYPES, DEFAULT_MAX_FILE_BYTES, type IncomingFile, type ValidateFilesResult, } from './files.js';
|
|
12
13
|
export { processSubmission, buildPublicForm, runSubmissionSideEffects, SubmissionValidationError, type SubmissionContext, type SubmissionResult, type SubmissionConfirmation, type SubmissionSideEffectInput, type PublicForm, type PublicFormField, } from './submission.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,GAC5B,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE3E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACrE,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAA;AAEnB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,8BAA8B,EAC9B,KAAK,UAAU,EACf,KAAK,0BAA0B,GAChC,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,GAC5B,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE3E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACrE,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAA;AAEnB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,8BAA8B,EAC9B,KAAK,UAAU,EACf,KAAK,0BAA0B,GAChC,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,4BAA4B,EAC5B,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,GAChC,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAElG,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA"}
|
package/dist/forms/index.js
CHANGED
|
@@ -4,6 +4,9 @@ export { INPUT_FIELD_TYPES, NON_INPUT_FIELD_TYPES } from './types.js';
|
|
|
4
4
|
export * from './service.js';
|
|
5
5
|
export * from './entries.js';
|
|
6
6
|
export { validateAndNormalizeSubmission, } from './validation.js';
|
|
7
|
+
// Client-safe rule primitives — also published standalone (no Node deps) at
|
|
8
|
+
// `@actuate-media/cms-core/forms/client` for public-site form components.
|
|
9
|
+
export { validateFormFieldClient, validateFormValuesClient, isFieldVisible, isFieldConditionallyRequired, FORM_EMAIL_RE, FORM_PHONE_RE, FORM_MAX_TEXT_LEN, FORM_MAX_TEXTAREA_LEN, FORM_MAX_MULTISELECT_ITEMS, } from './client-validation.js';
|
|
7
10
|
export { scoreSubmissionSpam } from './spam.js';
|
|
8
11
|
export { validateSubmissionFiles, persistSubmissionFiles, FORM_UPLOAD_ALLOWED_MIME_TYPES, DEFAULT_MAX_FILE_BYTES, } from './files.js';
|
|
9
12
|
export { processSubmission, buildPublicForm, runSubmissionSideEffects, SubmissionValidationError, } from './submission.js';
|
package/dist/forms/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,GAC5B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AA8BrE,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,8BAA8B,GAG/B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,sBAAsB,GAGvB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,GAO1B,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GAGxB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAElG,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GAKpB,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,2BAA2B,GAC5B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AA8BrE,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAE5B,OAAO,EACL,8BAA8B,GAG/B,MAAM,iBAAiB,CAAA;AACxB,4EAA4E;AAC5E,0EAA0E;AAC1E,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,4BAA4B,EAC5B,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,GAE3B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,8BAA8B,EAC9B,sBAAsB,GAGvB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,GAO1B,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GAGxB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAElG,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,GAKpB,MAAM,eAAe,CAAA"}
|
package/dist/forms/notify.js
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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 (!
|
|
151
|
+
if (!(await resolveEmailSenderAsync())) {
|
|
152
152
|
return { ...result, skippedReason: 'no-email-adapter' };
|
|
153
153
|
}
|
|
154
154
|
if (!settings?.enabled) {
|
package/dist/forms/notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/forms/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/forms/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAA;AAE3C,MAAM,QAAQ,GAAG,4BAA4B,CAAA;AAqB7C,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvE,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC;AAED,kFAAkF;AAClF,SAAS,WAAW,CAAC,KAAgB;IACnC,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,iBAAiB,KAAK,MAAM,CAAA;AACvE,CAAC;AAED,kFAAkF;AAClF,SAAS,cAAc,CAAC,QAAgB,EAAE,IAA4B;IACpE,OAAO,QAAQ,CAAC,OAAO,CAAC,gCAAgC,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAC3E,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CACnF,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAA2B;IAC5C,MAAM,IAAI,GAA2B;QACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC1F,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;QAChC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;KACnC,CAAA;IACD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAQ;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,gBAAgB,CACvB,GAA2B,EAC3B,gBAAyB;IAEzB,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAQ;QAChG,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;QAClD,MAAM,SAAS,GAAG,gBAAgB,IAAI,WAAW,CAAC,KAAK,CAAC,CAAA;QACxD,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QACvE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,mCAAmC,CAAA;QACpE,IAAI,CAAC,IAAI,CACP,+GAA+G,KAAK,OAAO;YACzH,wEAAwE,KAAK,YAAY,CAC5F,CAAA;QACD,KAAK,CAAC,IAAI,CACR,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAC9F,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,sGAAsG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAA;IAC1I,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;IACjC,MAAM,OAAO,GAAG,MAAM,EAAE,GAAG,EAAE,OAAO,CAAA;IACpC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,MAAM,SAAS,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,QAAQ,CAAA;IACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,SAAS,UAAU,MAAM,cAAc,CAAA;AAChF,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,sBAAsB,CACpC,QAAkC,EAClC,GAA2B;IAE3B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe;QACtC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;QAChD,CAAC,CAAC,mBAAmB,GAAG,CAAC,QAAQ,EAAE,CAAA;IAErC,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,KAAK,KAAK,CAAA;IACtD,MAAM,KAAK,GAAG,aAAa;QACzB,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACjE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IAE1B,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe;QACpC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;QAChD,CAAC,CAAC,gCAAgC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAA;IAE9I,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,IAAI;QACnB,CAAC,CAAC,uCAAuC,UAAU,CAAC,IAAI,CAAC,iDAAiD;QAC1G,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,IAAI,GAAG;4BACa,KAAK;EAC/B,KAAK,CAAC,IAAI;EACV,QAAQ;OACH,CAAA;IAEL,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAC3F,OAAO,CACR,CAAA;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;AACxD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,IAAI,EAAE,CAAA;AACX,CAAC;AAED,qFAAqF;AACrF,SAAS,cAAc,CACrB,QAAkC,EAClC,GAA2B;IAE3B,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAClE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAA;IAChC,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO,GAAG,CAAC,WAAW,CAAA;IAC7E,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,uBAAuB,CACrC,QAAkC,EAClC,GAA2B;IAE3B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,oBAAoB;QAC3C,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC;QACrD,CAAC,CAAC,6BAA6B,CAAA;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB;QACrC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC;QAClD,CAAC,CAAC,SAAS,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,0DAA0D,CAAA;IAC9H,MAAM,IAAI,GAAG,sGAAsG,IAAI,YAAY,CAAA;IACnI,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAyB;IAChD,MAAM,KAAK,GAAG,MAAM,uBAAuB,EAAE,CAAA;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACzB,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAA8C,EAC9C,GAA2B;IAE3B,MAAM,MAAM,GAA+B,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;IAEhF,IAAI,CAAC,CAAC,MAAM,uBAAuB,EAAE,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAA;IACzD,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAA;IAC/D,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACrF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAC7C,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC;oBACd,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;oBACb,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO;iBACR,CAAC,CAAA;gBACF,MAAM,CAAC,QAAQ,EAAE,CAAA;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;oBACvC,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACzD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,0BAA0B,CAAA;QAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;QAClF,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;gBACnD,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBACxF,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;oBACxC,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACzD,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/forms/validation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/forms/validation.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAC/B;AAQD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,EAAE,EACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,GAAE,eAAoB,GAC5B,0BAA0B,CAuJ5B"}
|