@reverso/api 0.1.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 (74) hide show
  1. package/README.md +47 -0
  2. package/dist/index.d.ts +41 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +56 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/plugins/auth.d.ts +72 -0
  7. package/dist/plugins/auth.d.ts.map +1 -0
  8. package/dist/plugins/auth.js +173 -0
  9. package/dist/plugins/auth.js.map +1 -0
  10. package/dist/plugins/database.d.ts +19 -0
  11. package/dist/plugins/database.d.ts.map +1 -0
  12. package/dist/plugins/database.js +23 -0
  13. package/dist/plugins/database.js.map +1 -0
  14. package/dist/plugins/index.d.ts +5 -0
  15. package/dist/plugins/index.d.ts.map +1 -0
  16. package/dist/plugins/index.js +5 -0
  17. package/dist/plugins/index.js.map +1 -0
  18. package/dist/routes/auth.d.ts +6 -0
  19. package/dist/routes/auth.d.ts.map +1 -0
  20. package/dist/routes/auth.js +258 -0
  21. package/dist/routes/auth.js.map +1 -0
  22. package/dist/routes/content.d.ts +8 -0
  23. package/dist/routes/content.d.ts.map +1 -0
  24. package/dist/routes/content.js +339 -0
  25. package/dist/routes/content.js.map +1 -0
  26. package/dist/routes/forms.d.ts +8 -0
  27. package/dist/routes/forms.d.ts.map +1 -0
  28. package/dist/routes/forms.js +953 -0
  29. package/dist/routes/forms.js.map +1 -0
  30. package/dist/routes/index.d.ts +19 -0
  31. package/dist/routes/index.d.ts.map +1 -0
  32. package/dist/routes/index.js +31 -0
  33. package/dist/routes/index.js.map +1 -0
  34. package/dist/routes/media.d.ts +8 -0
  35. package/dist/routes/media.d.ts.map +1 -0
  36. package/dist/routes/media.js +400 -0
  37. package/dist/routes/media.js.map +1 -0
  38. package/dist/routes/pages.d.ts +8 -0
  39. package/dist/routes/pages.d.ts.map +1 -0
  40. package/dist/routes/pages.js +220 -0
  41. package/dist/routes/pages.js.map +1 -0
  42. package/dist/routes/redirects.d.ts +8 -0
  43. package/dist/routes/redirects.d.ts.map +1 -0
  44. package/dist/routes/redirects.js +462 -0
  45. package/dist/routes/redirects.js.map +1 -0
  46. package/dist/routes/schema.d.ts +8 -0
  47. package/dist/routes/schema.d.ts.map +1 -0
  48. package/dist/routes/schema.js +151 -0
  49. package/dist/routes/schema.js.map +1 -0
  50. package/dist/routes/sitemap.d.ts +8 -0
  51. package/dist/routes/sitemap.d.ts.map +1 -0
  52. package/dist/routes/sitemap.js +144 -0
  53. package/dist/routes/sitemap.js.map +1 -0
  54. package/dist/server.d.ts +47 -0
  55. package/dist/server.d.ts.map +1 -0
  56. package/dist/server.js +218 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/types.d.ts +91 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +5 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/utils/index.d.ts +5 -0
  63. package/dist/utils/index.d.ts.map +1 -0
  64. package/dist/utils/index.js +5 -0
  65. package/dist/utils/index.js.map +1 -0
  66. package/dist/utils/security.d.ts +32 -0
  67. package/dist/utils/security.d.ts.map +1 -0
  68. package/dist/utils/security.js +154 -0
  69. package/dist/utils/security.js.map +1 -0
  70. package/dist/validation.d.ts +402 -0
  71. package/dist/validation.d.ts.map +1 -0
  72. package/dist/validation.js +308 -0
  73. package/dist/validation.js.map +1 -0
  74. package/package.json +76 -0
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Security utilities for the API.
3
+ */
4
+ import crypto from 'node:crypto';
5
+ /**
6
+ * Private IP ranges that should be blocked for SSRF protection.
7
+ */
8
+ const PRIVATE_IP_RANGES = [
9
+ /^127\./, // 127.0.0.0/8 (loopback)
10
+ /^10\./, // 10.0.0.0/8 (private)
11
+ /^172\.(1[6-9]|2[0-9]|3[0-1])\./, // 172.16.0.0/12 (private)
12
+ /^192\.168\./, // 192.168.0.0/16 (private)
13
+ /^169\.254\./, // 169.254.0.0/16 (link-local)
14
+ /^0\./, // 0.0.0.0/8 (current network)
15
+ /^224\./, // 224.0.0.0/4 (multicast)
16
+ /^240\./, // 240.0.0.0/4 (reserved)
17
+ /^255\.255\.255\.255$/, // broadcast
18
+ /^localhost$/i, // localhost hostname
19
+ /^::1$/, // IPv6 loopback
20
+ /^fe80:/i, // IPv6 link-local
21
+ /^fc00:/i, // IPv6 private
22
+ /^fd00:/i, // IPv6 private
23
+ ];
24
+ /**
25
+ * Blocked hostnames for SSRF protection.
26
+ */
27
+ const BLOCKED_HOSTNAMES = [
28
+ 'localhost',
29
+ 'metadata.google.internal',
30
+ 'metadata.google.com',
31
+ '169.254.169.254', // AWS/GCP metadata
32
+ 'metadata',
33
+ ];
34
+ /**
35
+ * Check if a URL is safe for server-side requests (SSRF protection).
36
+ * Blocks private IPs, localhost, and cloud metadata endpoints.
37
+ */
38
+ export function isUrlSafeForSSRF(urlString) {
39
+ try {
40
+ const url = new URL(urlString);
41
+ // Only allow http and https
42
+ if (!['http:', 'https:'].includes(url.protocol)) {
43
+ return { safe: false, reason: 'Only HTTP and HTTPS protocols are allowed' };
44
+ }
45
+ // Check blocked hostnames
46
+ const hostname = url.hostname.toLowerCase();
47
+ if (BLOCKED_HOSTNAMES.includes(hostname)) {
48
+ return { safe: false, reason: 'Blocked hostname' };
49
+ }
50
+ // Check private IP ranges
51
+ for (const pattern of PRIVATE_IP_RANGES) {
52
+ if (pattern.test(hostname)) {
53
+ return { safe: false, reason: 'Private IP addresses are not allowed' };
54
+ }
55
+ }
56
+ // Block URLs with credentials
57
+ if (url.username || url.password) {
58
+ return { safe: false, reason: 'URLs with credentials are not allowed' };
59
+ }
60
+ return { safe: true };
61
+ }
62
+ catch {
63
+ return { safe: false, reason: 'Invalid URL format' };
64
+ }
65
+ }
66
+ /**
67
+ * Allowed redirect domains (empty means only relative URLs allowed).
68
+ * Configure via REVERSO_ALLOWED_REDIRECT_DOMAINS environment variable.
69
+ */
70
+ function getAllowedRedirectDomains() {
71
+ const envDomains = process.env.REVERSO_ALLOWED_REDIRECT_DOMAINS;
72
+ if (envDomains) {
73
+ return envDomains.split(',').map((d) => d.trim().toLowerCase());
74
+ }
75
+ return [];
76
+ }
77
+ /**
78
+ * Check if a redirect URL is safe (prevents open redirect attacks).
79
+ * Only allows relative URLs or URLs to whitelisted domains.
80
+ */
81
+ export function isRedirectUrlSafe(urlString) {
82
+ if (!urlString) {
83
+ return { safe: true }; // No redirect is safe
84
+ }
85
+ // Allow relative URLs (must start with /)
86
+ if (urlString.startsWith('/') && !urlString.startsWith('//')) {
87
+ return { safe: true };
88
+ }
89
+ try {
90
+ const url = new URL(urlString);
91
+ // Only allow http and https
92
+ if (!['http:', 'https:'].includes(url.protocol)) {
93
+ return { safe: false, reason: 'Only HTTP and HTTPS protocols are allowed' };
94
+ }
95
+ // Check against allowed domains
96
+ const allowedDomains = getAllowedRedirectDomains();
97
+ const hostname = url.hostname.toLowerCase();
98
+ if (allowedDomains.length === 0) {
99
+ return { safe: false, reason: 'External redirects are not allowed. Use relative URLs or configure REVERSO_ALLOWED_REDIRECT_DOMAINS' };
100
+ }
101
+ const isAllowed = allowedDomains.some((domain) => {
102
+ // Exact match or subdomain match
103
+ return hostname === domain || hostname.endsWith(`.${domain}`);
104
+ });
105
+ if (!isAllowed) {
106
+ return { safe: false, reason: `Domain "${hostname}" is not in the allowed list` };
107
+ }
108
+ return { safe: true };
109
+ }
110
+ catch {
111
+ return { safe: false, reason: 'Invalid URL format' };
112
+ }
113
+ }
114
+ /**
115
+ * Generate HMAC-SHA256 signature for webhook payloads.
116
+ */
117
+ export function generateWebhookSignature(payload, secret) {
118
+ const hmac = crypto.createHmac('sha256', secret);
119
+ hmac.update(payload);
120
+ return `sha256=${hmac.digest('hex')}`;
121
+ }
122
+ /**
123
+ * Verify HMAC-SHA256 signature for webhook payloads.
124
+ */
125
+ export function verifyWebhookSignature(payload, signature, secret) {
126
+ const expected = generateWebhookSignature(payload, secret);
127
+ // Use timing-safe comparison to prevent timing attacks
128
+ try {
129
+ return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
130
+ }
131
+ catch {
132
+ return false;
133
+ }
134
+ }
135
+ /**
136
+ * Validate token format and length.
137
+ */
138
+ export function isValidTokenFormat(token) {
139
+ // Session tokens are 64 hex characters (32 bytes)
140
+ // API keys can vary but should be reasonable length
141
+ if (!token || typeof token !== 'string') {
142
+ return false;
143
+ }
144
+ // Max reasonable length for a token
145
+ if (token.length > 256) {
146
+ return false;
147
+ }
148
+ // Min length for security
149
+ if (token.length < 16) {
150
+ return false;
151
+ }
152
+ return true;
153
+ }
154
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,402 @@
1
+ /**
2
+ * Input validation schemas using Zod.
3
+ */
4
+ import { z } from 'zod';
5
+ /**
6
+ * Allowed MIME types for file uploads.
7
+ */
8
+ export declare const ALLOWED_MIME_TYPES: Set<string>;
9
+ /**
10
+ * Max file size (50MB).
11
+ */
12
+ export declare const MAX_FILE_SIZE: number;
13
+ /**
14
+ * Slug validation regex.
15
+ * Allows lowercase letters, numbers, and hyphens.
16
+ */
17
+ export declare const SLUG_REGEX: RegExp;
18
+ /**
19
+ * Path validation regex.
20
+ * Allows alphanumeric, dots, underscores, and $ for repeaters.
21
+ */
22
+ export declare const PATH_REGEX: RegExp;
23
+ /**
24
+ * Locale validation regex.
25
+ * Allows standard locale codes like "en", "en-US", "pt-BR".
26
+ */
27
+ export declare const LOCALE_REGEX: RegExp;
28
+ /**
29
+ * Sanitize filename to prevent path traversal attacks.
30
+ */
31
+ export declare function sanitizeFilename(filename: string): string;
32
+ /**
33
+ * Check if MIME type is allowed.
34
+ */
35
+ export declare function isAllowedMimeType(mimeType: string): boolean;
36
+ /**
37
+ * Content update body schema.
38
+ */
39
+ export declare const contentUpdateSchema: z.ZodObject<{
40
+ value: z.ZodUnknown;
41
+ locale: z.ZodDefault<z.ZodOptional<z.ZodString>>;
42
+ publish: z.ZodOptional<z.ZodBoolean>;
43
+ }, z.core.$strip>;
44
+ /**
45
+ * Bulk content update schema.
46
+ */
47
+ export declare const bulkContentUpdateSchema: z.ZodObject<{
48
+ updates: z.ZodArray<z.ZodObject<{
49
+ path: z.ZodString;
50
+ value: z.ZodUnknown;
51
+ locale: z.ZodOptional<z.ZodString>;
52
+ }, z.core.$strip>>;
53
+ }, z.core.$strip>;
54
+ /**
55
+ * Schema sync body schema.
56
+ */
57
+ export declare const schemaSyncSchema: z.ZodObject<{
58
+ schema: z.ZodObject<{
59
+ version: z.ZodString;
60
+ generatedAt: z.ZodString;
61
+ pages: z.ZodArray<z.ZodObject<{
62
+ slug: z.ZodString;
63
+ name: z.ZodString;
64
+ sections: z.ZodArray<z.ZodAny>;
65
+ fieldCount: z.ZodNumber;
66
+ sourceFiles: z.ZodArray<z.ZodString>;
67
+ }, z.core.$strip>>;
68
+ pageCount: z.ZodNumber;
69
+ totalFields: z.ZodNumber;
70
+ meta: z.ZodObject<{
71
+ srcDir: z.ZodString;
72
+ filesScanned: z.ZodNumber;
73
+ filesWithMarkers: z.ZodNumber;
74
+ scanDuration: z.ZodNumber;
75
+ }, z.core.$strip>;
76
+ }, z.core.$strip>;
77
+ deleteRemoved: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
78
+ }, z.core.$strip>;
79
+ /**
80
+ * Media metadata update schema.
81
+ */
82
+ export declare const mediaUpdateSchema: z.ZodObject<{
83
+ alt: z.ZodOptional<z.ZodString>;
84
+ caption: z.ZodOptional<z.ZodString>;
85
+ }, z.core.$strip>;
86
+ /**
87
+ * Pagination query schema.
88
+ */
89
+ export declare const paginationSchema: z.ZodObject<{
90
+ limit: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
91
+ offset: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
92
+ }, z.core.$strip>;
93
+ /**
94
+ * Media list query schema.
95
+ */
96
+ export declare const mediaListQuerySchema: z.ZodObject<{
97
+ limit: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
98
+ offset: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodNumber>>;
99
+ type: z.ZodOptional<z.ZodString>;
100
+ }, z.core.$strip>;
101
+ /**
102
+ * Path param schema.
103
+ */
104
+ export declare const pathParamSchema: z.ZodObject<{
105
+ path: z.ZodString;
106
+ }, z.core.$strip>;
107
+ /**
108
+ * Slug param schema.
109
+ */
110
+ export declare const slugParamSchema: z.ZodObject<{
111
+ slug: z.ZodString;
112
+ }, z.core.$strip>;
113
+ /**
114
+ * ID param schema.
115
+ */
116
+ export declare const idParamSchema: z.ZodObject<{
117
+ id: z.ZodString;
118
+ }, z.core.$strip>;
119
+ /**
120
+ * Locale query schema.
121
+ */
122
+ export declare const localeQuerySchema: z.ZodObject<{
123
+ locale: z.ZodDefault<z.ZodOptional<z.ZodString>>;
124
+ }, z.core.$strip>;
125
+ /**
126
+ * Form status enum.
127
+ */
128
+ export declare const formStatusSchema: z.ZodEnum<{
129
+ draft: "draft";
130
+ published: "published";
131
+ archived: "archived";
132
+ }>;
133
+ /**
134
+ * Form step schema.
135
+ */
136
+ export declare const formStepSchema: z.ZodObject<{
137
+ id: z.ZodString;
138
+ name: z.ZodString;
139
+ description: z.ZodOptional<z.ZodString>;
140
+ }, z.core.$strip>;
141
+ /**
142
+ * Form settings schema.
143
+ */
144
+ export declare const formSettingsSchema: z.ZodObject<{
145
+ submitButtonText: z.ZodOptional<z.ZodString>;
146
+ successMessage: z.ZodOptional<z.ZodString>;
147
+ redirectUrl: z.ZodOptional<z.ZodString>;
148
+ }, z.core.$strip>;
149
+ /**
150
+ * Form create schema.
151
+ */
152
+ export declare const formCreateSchema: z.ZodObject<{
153
+ name: z.ZodString;
154
+ slug: z.ZodString;
155
+ description: z.ZodOptional<z.ZodString>;
156
+ status: z.ZodOptional<z.ZodEnum<{
157
+ draft: "draft";
158
+ published: "published";
159
+ archived: "archived";
160
+ }>>;
161
+ isMultiStep: z.ZodOptional<z.ZodBoolean>;
162
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
163
+ id: z.ZodString;
164
+ name: z.ZodString;
165
+ description: z.ZodOptional<z.ZodString>;
166
+ }, z.core.$strip>>>;
167
+ settings: z.ZodOptional<z.ZodObject<{
168
+ submitButtonText: z.ZodOptional<z.ZodString>;
169
+ successMessage: z.ZodOptional<z.ZodString>;
170
+ redirectUrl: z.ZodOptional<z.ZodString>;
171
+ }, z.core.$strip>>;
172
+ notifyEmails: z.ZodOptional<z.ZodArray<z.ZodString>>;
173
+ notifyOnSubmission: z.ZodOptional<z.ZodBoolean>;
174
+ webhookUrl: z.ZodOptional<z.ZodString>;
175
+ webhookSecret: z.ZodOptional<z.ZodString>;
176
+ webhookEnabled: z.ZodOptional<z.ZodBoolean>;
177
+ honeypotEnabled: z.ZodOptional<z.ZodBoolean>;
178
+ rateLimitPerMinute: z.ZodOptional<z.ZodNumber>;
179
+ }, z.core.$strip>;
180
+ /**
181
+ * Form update schema.
182
+ */
183
+ export declare const formUpdateSchema: z.ZodObject<{
184
+ name: z.ZodOptional<z.ZodString>;
185
+ slug: z.ZodOptional<z.ZodString>;
186
+ description: z.ZodOptional<z.ZodOptional<z.ZodString>>;
187
+ status: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
188
+ draft: "draft";
189
+ published: "published";
190
+ archived: "archived";
191
+ }>>>;
192
+ isMultiStep: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
193
+ steps: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodObject<{
194
+ id: z.ZodString;
195
+ name: z.ZodString;
196
+ description: z.ZodOptional<z.ZodString>;
197
+ }, z.core.$strip>>>>;
198
+ settings: z.ZodOptional<z.ZodOptional<z.ZodObject<{
199
+ submitButtonText: z.ZodOptional<z.ZodString>;
200
+ successMessage: z.ZodOptional<z.ZodString>;
201
+ redirectUrl: z.ZodOptional<z.ZodString>;
202
+ }, z.core.$strip>>>;
203
+ notifyEmails: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString>>>;
204
+ notifyOnSubmission: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
205
+ webhookUrl: z.ZodOptional<z.ZodOptional<z.ZodString>>;
206
+ webhookSecret: z.ZodOptional<z.ZodOptional<z.ZodString>>;
207
+ webhookEnabled: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
208
+ honeypotEnabled: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
209
+ rateLimitPerMinute: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
210
+ }, z.core.$strip>;
211
+ /**
212
+ * Form field type enum.
213
+ */
214
+ export declare const formFieldTypeSchema: z.ZodEnum<{
215
+ number: "number";
216
+ date: "date";
217
+ email: "email";
218
+ select: "select";
219
+ file: "file";
220
+ text: "text";
221
+ textarea: "textarea";
222
+ checkbox: "checkbox";
223
+ radio: "radio";
224
+ hidden: "hidden";
225
+ }>;
226
+ /**
227
+ * Field condition schema.
228
+ */
229
+ export declare const fieldConditionSchema: z.ZodObject<{
230
+ field: z.ZodString;
231
+ operator: z.ZodEnum<{
232
+ equals: "equals";
233
+ notEquals: "notEquals";
234
+ contains: "contains";
235
+ notContains: "notContains";
236
+ isEmpty: "isEmpty";
237
+ isNotEmpty: "isNotEmpty";
238
+ }>;
239
+ value: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
240
+ }, z.core.$strip>;
241
+ /**
242
+ * Field config schema.
243
+ */
244
+ export declare const fieldConfigSchema: z.ZodObject<{
245
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
246
+ label: z.ZodString;
247
+ value: z.ZodString;
248
+ }, z.core.$strip>>>;
249
+ accept: z.ZodOptional<z.ZodString>;
250
+ min: z.ZodOptional<z.ZodNumber>;
251
+ max: z.ZodOptional<z.ZodNumber>;
252
+ minLength: z.ZodOptional<z.ZodNumber>;
253
+ maxLength: z.ZodOptional<z.ZodNumber>;
254
+ pattern: z.ZodOptional<z.ZodString>;
255
+ rows: z.ZodOptional<z.ZodNumber>;
256
+ multiple: z.ZodOptional<z.ZodBoolean>;
257
+ }, z.core.$strip>;
258
+ /**
259
+ * Form field create schema.
260
+ */
261
+ export declare const formFieldCreateSchema: z.ZodObject<{
262
+ name: z.ZodString;
263
+ type: z.ZodEnum<{
264
+ number: "number";
265
+ date: "date";
266
+ email: "email";
267
+ select: "select";
268
+ file: "file";
269
+ text: "text";
270
+ textarea: "textarea";
271
+ checkbox: "checkbox";
272
+ radio: "radio";
273
+ hidden: "hidden";
274
+ }>;
275
+ label: z.ZodOptional<z.ZodString>;
276
+ placeholder: z.ZodOptional<z.ZodString>;
277
+ help: z.ZodOptional<z.ZodString>;
278
+ required: z.ZodOptional<z.ZodBoolean>;
279
+ validation: z.ZodOptional<z.ZodString>;
280
+ config: z.ZodOptional<z.ZodObject<{
281
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
282
+ label: z.ZodString;
283
+ value: z.ZodString;
284
+ }, z.core.$strip>>>;
285
+ accept: z.ZodOptional<z.ZodString>;
286
+ min: z.ZodOptional<z.ZodNumber>;
287
+ max: z.ZodOptional<z.ZodNumber>;
288
+ minLength: z.ZodOptional<z.ZodNumber>;
289
+ maxLength: z.ZodOptional<z.ZodNumber>;
290
+ pattern: z.ZodOptional<z.ZodString>;
291
+ rows: z.ZodOptional<z.ZodNumber>;
292
+ multiple: z.ZodOptional<z.ZodBoolean>;
293
+ }, z.core.$strip>>;
294
+ width: z.ZodOptional<z.ZodNumber>;
295
+ step: z.ZodOptional<z.ZodNumber>;
296
+ sortOrder: z.ZodOptional<z.ZodNumber>;
297
+ condition: z.ZodOptional<z.ZodObject<{
298
+ field: z.ZodString;
299
+ operator: z.ZodEnum<{
300
+ equals: "equals";
301
+ notEquals: "notEquals";
302
+ contains: "contains";
303
+ notContains: "notContains";
304
+ isEmpty: "isEmpty";
305
+ isNotEmpty: "isNotEmpty";
306
+ }>;
307
+ value: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
308
+ }, z.core.$strip>>;
309
+ }, z.core.$strip>;
310
+ /**
311
+ * Form field update schema.
312
+ */
313
+ export declare const formFieldUpdateSchema: z.ZodObject<{
314
+ name: z.ZodOptional<z.ZodString>;
315
+ type: z.ZodOptional<z.ZodEnum<{
316
+ number: "number";
317
+ date: "date";
318
+ email: "email";
319
+ select: "select";
320
+ file: "file";
321
+ text: "text";
322
+ textarea: "textarea";
323
+ checkbox: "checkbox";
324
+ radio: "radio";
325
+ hidden: "hidden";
326
+ }>>;
327
+ label: z.ZodOptional<z.ZodOptional<z.ZodString>>;
328
+ placeholder: z.ZodOptional<z.ZodOptional<z.ZodString>>;
329
+ help: z.ZodOptional<z.ZodOptional<z.ZodString>>;
330
+ required: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
331
+ validation: z.ZodOptional<z.ZodOptional<z.ZodString>>;
332
+ config: z.ZodOptional<z.ZodOptional<z.ZodObject<{
333
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
334
+ label: z.ZodString;
335
+ value: z.ZodString;
336
+ }, z.core.$strip>>>;
337
+ accept: z.ZodOptional<z.ZodString>;
338
+ min: z.ZodOptional<z.ZodNumber>;
339
+ max: z.ZodOptional<z.ZodNumber>;
340
+ minLength: z.ZodOptional<z.ZodNumber>;
341
+ maxLength: z.ZodOptional<z.ZodNumber>;
342
+ pattern: z.ZodOptional<z.ZodString>;
343
+ rows: z.ZodOptional<z.ZodNumber>;
344
+ multiple: z.ZodOptional<z.ZodBoolean>;
345
+ }, z.core.$strip>>>;
346
+ width: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
347
+ step: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
348
+ sortOrder: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
349
+ condition: z.ZodOptional<z.ZodOptional<z.ZodObject<{
350
+ field: z.ZodString;
351
+ operator: z.ZodEnum<{
352
+ equals: "equals";
353
+ notEquals: "notEquals";
354
+ contains: "contains";
355
+ notContains: "notContains";
356
+ isEmpty: "isEmpty";
357
+ isNotEmpty: "isNotEmpty";
358
+ }>;
359
+ value: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
360
+ }, z.core.$strip>>>;
361
+ }, z.core.$strip>;
362
+ /**
363
+ * Form submission create schema (public).
364
+ */
365
+ export declare const formSubmissionCreateSchema: z.ZodObject<{
366
+ data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
367
+ honeypot: z.ZodOptional<z.ZodString>;
368
+ }, z.core.$strip>;
369
+ /**
370
+ * Redirect status code enum.
371
+ */
372
+ export declare const redirectStatusCodeSchema: z.ZodUnion<readonly [z.ZodLiteral<301>, z.ZodLiteral<302>, z.ZodLiteral<307>, z.ZodLiteral<308>]>;
373
+ /**
374
+ * Redirect create schema.
375
+ */
376
+ export declare const redirectCreateSchema: z.ZodObject<{
377
+ fromPath: z.ZodString;
378
+ toPath: z.ZodString;
379
+ statusCode: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<301>, z.ZodLiteral<302>, z.ZodLiteral<307>, z.ZodLiteral<308>]>>;
380
+ isEnabled: z.ZodOptional<z.ZodBoolean>;
381
+ }, z.core.$strip>;
382
+ /**
383
+ * Redirect update schema.
384
+ */
385
+ export declare const redirectUpdateSchema: z.ZodObject<{
386
+ fromPath: z.ZodOptional<z.ZodString>;
387
+ toPath: z.ZodOptional<z.ZodString>;
388
+ statusCode: z.ZodOptional<z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<301>, z.ZodLiteral<302>, z.ZodLiteral<307>, z.ZodLiteral<308>]>>>;
389
+ isEnabled: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
390
+ }, z.core.$strip>;
391
+ export type ContentUpdateInput = z.infer<typeof contentUpdateSchema>;
392
+ export type BulkContentUpdateInput = z.infer<typeof bulkContentUpdateSchema>;
393
+ export type SchemaSyncInput = z.infer<typeof schemaSyncSchema>;
394
+ export type MediaUpdateInput = z.infer<typeof mediaUpdateSchema>;
395
+ export type FormCreateInput = z.infer<typeof formCreateSchema>;
396
+ export type FormUpdateInput = z.infer<typeof formUpdateSchema>;
397
+ export type FormFieldCreateInput = z.infer<typeof formFieldCreateSchema>;
398
+ export type FormFieldUpdateInput = z.infer<typeof formFieldUpdateSchema>;
399
+ export type FormSubmissionCreateInput = z.infer<typeof formSubmissionCreateSchema>;
400
+ export type RedirectCreateInput = z.infer<typeof redirectCreateSchema>;
401
+ export type RedirectUpdateInput = z.infer<typeof redirectUpdateSchema>;
402
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}