@actuate-media/cms-core 0.59.0 → 0.61.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 +1722 -0
- package/README.md +33 -0
- package/dist/__tests__/api/media-upload-storage.test.d.ts +2 -0
- package/dist/__tests__/api/media-upload-storage.test.d.ts.map +1 -0
- package/dist/__tests__/api/media-upload-storage.test.js +152 -0
- package/dist/__tests__/api/media-upload-storage.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__/collections/presets.test.js +19 -0
- package/dist/__tests__/collections/presets.test.js.map +1 -1
- 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/routes/media.d.ts.map +1 -1
- package/dist/api/routes/media.js +23 -7
- package/dist/api/routes/media.js.map +1 -1
- 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/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/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/validation.d.ts.map +1 -1
- package/dist/forms/validation.js +14 -83
- package/dist/forms/validation.js.map +1 -1
- package/package.json +9 -3
|
@@ -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":"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"}
|
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"}
|
|
@@ -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"}
|
package/dist/forms/validation.js
CHANGED
|
@@ -16,88 +16,28 @@
|
|
|
16
16
|
* conditional logic are skipped (not required, not stored).
|
|
17
17
|
*/
|
|
18
18
|
import { stripHtml } from '../security/sanitize.js';
|
|
19
|
-
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const PHONE_RE = /^[+]?[0-9\s().-]{6,20}$/;
|
|
26
|
-
const NON_INPUT = new Set(['richtext', 'divider', 'honeypot']);
|
|
27
|
-
const TRUTHY = new Set(['true', 'on', '1', 'yes', 'checked']);
|
|
28
|
-
function asString(value) {
|
|
29
|
-
if (value == null)
|
|
30
|
-
return '';
|
|
31
|
-
if (typeof value === 'string')
|
|
32
|
-
return value;
|
|
33
|
-
if (typeof value === 'number' || typeof value === 'boolean')
|
|
34
|
-
return String(value);
|
|
35
|
-
return '';
|
|
36
|
-
}
|
|
37
|
-
function coerceBoolean(value) {
|
|
38
|
-
if (typeof value === 'boolean')
|
|
39
|
-
return value;
|
|
40
|
-
if (typeof value === 'number')
|
|
41
|
-
return value === 1;
|
|
42
|
-
return TRUTHY.has(asString(value).trim().toLowerCase());
|
|
43
|
-
}
|
|
44
|
-
function evalRule(rule, values) {
|
|
45
|
-
const current = asString(values[rule.fieldKey]).toLowerCase().trim();
|
|
46
|
-
const target = asString(rule.value).toLowerCase().trim();
|
|
47
|
-
switch (rule.operator) {
|
|
48
|
-
case 'equals':
|
|
49
|
-
return current === target;
|
|
50
|
-
case 'notEquals':
|
|
51
|
-
return current !== target;
|
|
52
|
-
case 'contains':
|
|
53
|
-
return current.includes(target);
|
|
54
|
-
case 'isEmpty':
|
|
55
|
-
return current === '';
|
|
56
|
-
case 'isNotEmpty':
|
|
57
|
-
return current !== '';
|
|
58
|
-
default:
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/** A field is visible unless its `show` rules exist and not all of them pass. */
|
|
63
|
-
function isVisible(field, values) {
|
|
64
|
-
const show = field.conditionalLogic?.show;
|
|
65
|
-
if (!show || show.length === 0)
|
|
66
|
-
return true;
|
|
67
|
-
return show.every((rule) => evalRule(rule, values));
|
|
68
|
-
}
|
|
69
|
-
/** A field is conditionally required when its `require` rules all pass. */
|
|
70
|
-
function isConditionallyRequired(field, values) {
|
|
71
|
-
const require = field.conditionalLogic?.require;
|
|
72
|
-
if (!require || require.length === 0)
|
|
73
|
-
return false;
|
|
74
|
-
return require.every((rule) => evalRule(rule, values));
|
|
75
|
-
}
|
|
76
|
-
function isPresent(raw) {
|
|
77
|
-
if (raw === undefined || raw === null)
|
|
78
|
-
return false;
|
|
79
|
-
if (typeof raw === 'string')
|
|
80
|
-
return raw.trim() !== '';
|
|
81
|
-
if (Array.isArray(raw))
|
|
82
|
-
return raw.length > 0;
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
19
|
+
import { FORM_EMAIL_RE, FORM_MAX_MULTISELECT_ITEMS, FORM_MAX_TEXT_LEN, FORM_MAX_TEXTAREA_LEN, FORM_NON_INPUT_TYPES, FORM_PHONE_RE, asString, coerceBoolean, isFieldConditionallyRequired, isFieldVisible, isHttpUrl, isValuePresent, } from './client-validation.js';
|
|
20
|
+
// Shared rule primitives (regexes, caps, conditional logic) live in
|
|
21
|
+
// `client-validation.ts` — the client-safe module published at
|
|
22
|
+
// `@actuate-media/cms-core/forms/client` — so client and server can never
|
|
23
|
+
// drift. This module adds the server-only parts: HTML stripping and the
|
|
24
|
+
// data/normalized split.
|
|
85
25
|
export function validateAndNormalizeSubmission(fields, rawValues, options = {}) {
|
|
86
26
|
const errors = [];
|
|
87
27
|
const data = {};
|
|
88
28
|
const normalized = {};
|
|
89
29
|
const fileKeys = options.fileKeys ?? new Set();
|
|
90
30
|
for (const field of fields) {
|
|
91
|
-
if (
|
|
31
|
+
if (FORM_NON_INPUT_TYPES.has(field.type))
|
|
92
32
|
continue;
|
|
93
|
-
if (!
|
|
33
|
+
if (!isFieldVisible(field, rawValues))
|
|
94
34
|
continue;
|
|
95
35
|
const key = field.key;
|
|
96
36
|
const label = field.label || key;
|
|
97
37
|
const rules = field.validationRules ?? {};
|
|
98
38
|
const required = Boolean(field.required) ||
|
|
99
39
|
Boolean(rules.required) ||
|
|
100
|
-
|
|
40
|
+
isFieldConditionallyRequired(field, rawValues);
|
|
101
41
|
if (field.type === 'file') {
|
|
102
42
|
if (required && !fileKeys.has(key)) {
|
|
103
43
|
errors.push({ key, message: `${label} is required.` });
|
|
@@ -105,7 +45,7 @@ export function validateAndNormalizeSubmission(fields, rawValues, options = {})
|
|
|
105
45
|
continue;
|
|
106
46
|
}
|
|
107
47
|
const raw = rawValues[key];
|
|
108
|
-
if (!
|
|
48
|
+
if (!isValuePresent(raw)) {
|
|
109
49
|
if (required)
|
|
110
50
|
errors.push({ key, message: `${label} is required.` });
|
|
111
51
|
continue;
|
|
@@ -139,7 +79,7 @@ export function validateAndNormalizeSubmission(fields, rawValues, options = {})
|
|
|
139
79
|
}
|
|
140
80
|
case 'multiselect': {
|
|
141
81
|
const list = Array.isArray(raw) ? raw : [raw];
|
|
142
|
-
if (list.length >
|
|
82
|
+
if (list.length > FORM_MAX_MULTISELECT_ITEMS) {
|
|
143
83
|
errors.push({ key, message: `${label} has too many selections.` });
|
|
144
84
|
break;
|
|
145
85
|
}
|
|
@@ -179,7 +119,7 @@ export function validateAndNormalizeSubmission(fields, rawValues, options = {})
|
|
|
179
119
|
default: {
|
|
180
120
|
// text, email, phone, url, textarea, hidden
|
|
181
121
|
const s = stripHtml(asString(raw)).trim();
|
|
182
|
-
const maxLen = rules.maxLength ?? (field.type === 'textarea' ?
|
|
122
|
+
const maxLen = rules.maxLength ?? (field.type === 'textarea' ? FORM_MAX_TEXTAREA_LEN : FORM_MAX_TEXT_LEN);
|
|
183
123
|
if (s.length > maxLen) {
|
|
184
124
|
errors.push({ key, message: `${label} must be at most ${maxLen} characters.` });
|
|
185
125
|
}
|
|
@@ -194,10 +134,10 @@ export function validateAndNormalizeSubmission(fields, rawValues, options = {})
|
|
|
194
134
|
: field.type === 'phone'
|
|
195
135
|
? 'phone'
|
|
196
136
|
: undefined);
|
|
197
|
-
if (format === 'email' && !
|
|
137
|
+
if (format === 'email' && !FORM_EMAIL_RE.test(s)) {
|
|
198
138
|
errors.push({ key, message: `${label} must be a valid email address.` });
|
|
199
139
|
}
|
|
200
|
-
else if (format === 'phone' && !
|
|
140
|
+
else if (format === 'phone' && !FORM_PHONE_RE.test(s)) {
|
|
201
141
|
errors.push({ key, message: `${label} must be a valid phone number.` });
|
|
202
142
|
}
|
|
203
143
|
else if (format === 'url') {
|
|
@@ -223,13 +163,4 @@ export function validateAndNormalizeSubmission(fields, rawValues, options = {})
|
|
|
223
163
|
}
|
|
224
164
|
return { ok: errors.length === 0, errors, data, normalized };
|
|
225
165
|
}
|
|
226
|
-
function isHttpUrl(value) {
|
|
227
|
-
try {
|
|
228
|
-
const url = new URL(value);
|
|
229
|
-
return url.protocol === 'http:' || url.protocol === 'https:';
|
|
230
|
-
}
|
|
231
|
-
catch {
|
|
232
|
-
return false;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
166
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/forms/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/forms/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuate-media/cms-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.61.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/actuate-media/actuatecms.git",
|
|
@@ -89,6 +89,11 @@
|
|
|
89
89
|
"import": "./dist/realtime/index.js",
|
|
90
90
|
"default": "./dist/realtime/index.js"
|
|
91
91
|
},
|
|
92
|
+
"./forms/client": {
|
|
93
|
+
"types": "./dist/forms/client-validation.d.ts",
|
|
94
|
+
"import": "./dist/forms/client-validation.js",
|
|
95
|
+
"default": "./dist/forms/client-validation.js"
|
|
96
|
+
},
|
|
92
97
|
"./generated/client": {
|
|
93
98
|
"types": "./generated/client.d.ts",
|
|
94
99
|
"import": "./generated/client.js",
|
|
@@ -108,7 +113,7 @@
|
|
|
108
113
|
"sharp": "^0.34.5",
|
|
109
114
|
"yjs": "^13.6.0",
|
|
110
115
|
"zod": "^3.23.0",
|
|
111
|
-
"@actuate-media/realtime": "0.1.
|
|
116
|
+
"@actuate-media/realtime": "0.1.1"
|
|
112
117
|
},
|
|
113
118
|
"devDependencies": {
|
|
114
119
|
"@types/sanitize-html": "^2.16.1",
|
|
@@ -124,7 +129,8 @@
|
|
|
124
129
|
"files": [
|
|
125
130
|
"dist",
|
|
126
131
|
"generated",
|
|
127
|
-
"prisma"
|
|
132
|
+
"prisma",
|
|
133
|
+
"CHANGELOG.md"
|
|
128
134
|
],
|
|
129
135
|
"scripts": {
|
|
130
136
|
"build": "tsc --project tsconfig.json",
|