@kubuild/schema 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 kustora
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # @kubuild/schema
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@kubuild/schema.svg)](https://www.npmjs.com/package/@kubuild/schema)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue)](https://www.typescriptlang.org/)
6
+
7
+ Zod schemas and inferred TypeScript definitions for the **KUBUILD** portable page document format (`.stora`), Action Pipeline, Form Configuration, and JSON Schema generation utilities.
8
+
9
+ ---
10
+
11
+ ## 📦 Installation
12
+
13
+ ```bash
14
+ # Using pnpm (recommended)
15
+ pnpm add @kubuild/schema
16
+
17
+ # Using npm
18
+ npm install @kubuild/schema
19
+
20
+ # Using yarn
21
+ yarn add @kubuild/schema
22
+ ```
23
+
24
+ ---
25
+
26
+ ## ✨ Features
27
+
28
+ - **Runtime Validation with Zod**: Strict validation and sanitization for all page document structures, node trees, styles, and action pipelines.
29
+ - **Portable Document Model**: Type-safe definitions for `PageDocument`, `Node`, `StyleObject`, `Metadata`, and `AnimationConfig`.
30
+ - **Action Pipeline Schema**: Rich action trigger models (`onClick`, `onSubmit`, `onChange`, `onLoad`) and step definitions (`apiRequest`, `showToast`, `openModal`, `closeModal`, `navigate`, `custom`).
31
+ - **Form & Field Binding Schema**: Data structures for form configuration, field validation rules (regex, required, min/max length, email), and variable state binding.
32
+ - **JSON Schema Export**: Utility functions (`generateJsonSchema`) to produce standard JSON Schema definitions for external tooling and validators.
33
+
34
+ ---
35
+
36
+ ## 🚀 Quick Usage
37
+
38
+ ### Validating a Page Document
39
+
40
+ ```typescript
41
+ import { PageDocumentSchema, type PageDocument } from '@kubuild/schema';
42
+
43
+ const untrustedData = {
44
+ schema: 'stora.page',
45
+ version: '1.0.0',
46
+ metadata: {
47
+ title: 'My Landing Page',
48
+ createdAt: new Date().toISOString()
49
+ },
50
+ document: {
51
+ id: 'root-1',
52
+ type: 'container',
53
+ children: [
54
+ {
55
+ id: 'heading-1',
56
+ type: 'heading',
57
+ props: { content: 'Welcome to KUBUILD' },
58
+ styles: { fontSize: '2rem', fontWeight: 'bold' }
59
+ }
60
+ ]
61
+ }
62
+ };
63
+
64
+ // Validates and returns strongly typed PageDocument
65
+ const result = PageDocumentSchema.safeParse(untrustedData);
66
+
67
+ if (result.success) {
68
+ const page: PageDocument = result.data;
69
+ console.log('Document valid:', page.metadata.title);
70
+ } else {
71
+ console.error('Validation errors:', result.error.format());
72
+ }
73
+ ```
74
+
75
+ ### Validating Action Pipelines
76
+
77
+ ```typescript
78
+ import { ActionPipelineSchema, type ActionPipeline } from '@kubuild/schema';
79
+
80
+ const pipelineData = {
81
+ id: 'pipeline-submit-form',
82
+ name: 'Submit Lead Form',
83
+ trigger: 'onSubmit',
84
+ steps: [
85
+ {
86
+ id: 'step-api-1',
87
+ type: 'apiRequest',
88
+ name: 'Send to Backend',
89
+ config: {
90
+ url: 'https://api.example.com/leads',
91
+ method: 'POST',
92
+ headers: { 'Content-Type': 'application/json' },
93
+ body: '{{form}}'
94
+ },
95
+ onSuccess: [
96
+ {
97
+ id: 'step-toast-success',
98
+ type: 'showToast',
99
+ name: 'Success Notification',
100
+ config: {
101
+ message: 'Thank you! We will get in touch.',
102
+ type: 'success'
103
+ }
104
+ }
105
+ ]
106
+ }
107
+ ]
108
+ };
109
+
110
+ const pipeline: ActionPipeline = ActionPipelineSchema.parse(pipelineData);
111
+ ```
112
+
113
+ ---
114
+
115
+ ## 📄 License
116
+
117
+ MIT © [KUBUILD](https://github.com/kustora/kubuild)
@@ -0,0 +1,423 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Action Trigger Types
4
+ * Events in the DOM or component lifecycle that can trigger an action pipeline.
5
+ */
6
+ export declare const ActionTriggerTypeSchema: z.ZodEnum<{
7
+ load: "load";
8
+ change: "change";
9
+ blur: "blur";
10
+ click: "click";
11
+ focus: "focus";
12
+ submit: "submit";
13
+ }>;
14
+ export type ActionTriggerType = z.infer<typeof ActionTriggerTypeSchema>;
15
+ export type ActionTrigger = ActionTriggerType;
16
+ export declare const ActionTriggerSchema: z.ZodEnum<{
17
+ load: "load";
18
+ change: "change";
19
+ blur: "blur";
20
+ click: "click";
21
+ focus: "focus";
22
+ submit: "submit";
23
+ }>;
24
+ /**
25
+ * Action Step Types
26
+ * Discrete operations executed sequentially or conditionally within an action pipeline.
27
+ */
28
+ export declare const ActionStepTypeSchema: z.ZodEnum<{
29
+ navigate: "navigate";
30
+ api_request: "api_request";
31
+ set_state: "set_state";
32
+ reset_form: "reset_form";
33
+ show_toast: "show_toast";
34
+ open_modal: "open_modal";
35
+ close_modal: "close_modal";
36
+ copy_clipboard: "copy_clipboard";
37
+ custom_event: "custom_event";
38
+ }>;
39
+ export type ActionStepType = z.infer<typeof ActionStepTypeSchema>;
40
+ /**
41
+ * Condition Operators for branch & conditional step execution.
42
+ */
43
+ export declare const ConditionOperatorSchema: z.ZodEnum<{
44
+ contains: "contains";
45
+ regex: "regex";
46
+ equals: "equals";
47
+ not_equals: "not_equals";
48
+ not_contains: "not_contains";
49
+ is_truthy: "is_truthy";
50
+ is_falsy: "is_falsy";
51
+ gt: "gt";
52
+ gte: "gte";
53
+ lt: "lt";
54
+ lte: "lte";
55
+ }>;
56
+ export type ConditionOperator = z.infer<typeof ConditionOperatorSchema>;
57
+ /**
58
+ * Action Step Condition Schema
59
+ * Evaluated before running a step. If condition fails, step is skipped.
60
+ */
61
+ export declare const ActionStepConditionSchema: z.ZodObject<{
62
+ field: z.ZodString;
63
+ operator: z.ZodEnum<{
64
+ contains: "contains";
65
+ regex: "regex";
66
+ equals: "equals";
67
+ not_equals: "not_equals";
68
+ not_contains: "not_contains";
69
+ is_truthy: "is_truthy";
70
+ is_falsy: "is_falsy";
71
+ gt: "gt";
72
+ gte: "gte";
73
+ lt: "lt";
74
+ lte: "lte";
75
+ }>;
76
+ value: z.ZodOptional<z.ZodUnknown>;
77
+ }, z.core.$strip>;
78
+ export type ActionStepCondition = z.infer<typeof ActionStepConditionSchema>;
79
+ export declare function isSafeActionUrl(url: string): boolean;
80
+ /**
81
+ * 1. API Request Step Payload Schema
82
+ */
83
+ export declare const ApiRequestStepPayloadSchema: z.ZodObject<{
84
+ url: z.ZodString;
85
+ method: z.ZodDefault<z.ZodEnum<{
86
+ GET: "GET";
87
+ POST: "POST";
88
+ PUT: "PUT";
89
+ DELETE: "DELETE";
90
+ PATCH: "PATCH";
91
+ HEAD: "HEAD";
92
+ OPTIONS: "OPTIONS";
93
+ }>>;
94
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
95
+ queryParams: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
96
+ body: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodUnknown>]>>;
97
+ bodyFormat: z.ZodOptional<z.ZodEnum<{
98
+ raw: "raw";
99
+ formData: "formData";
100
+ text: "text";
101
+ json: "json";
102
+ "form-data": "form-data";
103
+ urlencoded: "urlencoded";
104
+ "url-encoded": "url-encoded";
105
+ }>>;
106
+ bodyType: z.ZodOptional<z.ZodEnum<{
107
+ raw: "raw";
108
+ formData: "formData";
109
+ text: "text";
110
+ json: "json";
111
+ "form-data": "form-data";
112
+ urlencoded: "urlencoded";
113
+ "url-encoded": "url-encoded";
114
+ }>>;
115
+ timeout: z.ZodOptional<z.ZodNumber>;
116
+ responseMapping: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
117
+ }, z.core.$strip>;
118
+ export type ApiRequestStepPayload = z.infer<typeof ApiRequestStepPayloadSchema>;
119
+ /**
120
+ * 2. Navigate Step Payload Schema
121
+ */
122
+ export declare const NavigateStepPayloadSchema: z.ZodObject<{
123
+ url: z.ZodString;
124
+ target: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
125
+ _self: "_self";
126
+ _blank: "_blank";
127
+ _parent: "_parent";
128
+ _top: "_top";
129
+ }>>>;
130
+ replace: z.ZodOptional<z.ZodBoolean>;
131
+ scroll: z.ZodOptional<z.ZodBoolean>;
132
+ behavior: z.ZodOptional<z.ZodEnum<{
133
+ auto: "auto";
134
+ smooth: "smooth";
135
+ }>>;
136
+ }, z.core.$strip>;
137
+ export type NavigateStepPayload = z.infer<typeof NavigateStepPayloadSchema>;
138
+ /**
139
+ * 3. Set State Step Payload Schema
140
+ */
141
+ export declare const SetStateStepPayloadSchema: z.ZodObject<{
142
+ key: z.ZodString;
143
+ value: z.ZodUnknown;
144
+ scope: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
145
+ session: "session";
146
+ document: "document";
147
+ local: "local";
148
+ runtime: "runtime";
149
+ }>>>;
150
+ }, z.core.$strip>;
151
+ export type SetStateStepPayload = z.infer<typeof SetStateStepPayloadSchema>;
152
+ /**
153
+ * 4. Reset Form Step Payload Schema
154
+ */
155
+ export declare const ResetFormStepPayloadSchema: z.ZodObject<{
156
+ formId: z.ZodOptional<z.ZodString>;
157
+ }, z.core.$strip>;
158
+ export type ResetFormStepPayload = z.infer<typeof ResetFormStepPayloadSchema>;
159
+ /**
160
+ * 5. Show Toast Step Payload Schema
161
+ */
162
+ export declare const ShowToastStepPayloadSchema: z.ZodObject<{
163
+ message: z.ZodString;
164
+ type: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
165
+ error: "error";
166
+ info: "info";
167
+ warning: "warning";
168
+ success: "success";
169
+ }>>>;
170
+ variant: z.ZodOptional<z.ZodEnum<{
171
+ error: "error";
172
+ info: "info";
173
+ warning: "warning";
174
+ success: "success";
175
+ }>>;
176
+ title: z.ZodOptional<z.ZodString>;
177
+ duration: z.ZodOptional<z.ZodNumber>;
178
+ position: z.ZodOptional<z.ZodEnum<{
179
+ "top-right": "top-right";
180
+ "top-left": "top-left";
181
+ "bottom-right": "bottom-right";
182
+ "bottom-left": "bottom-left";
183
+ "top-center": "top-center";
184
+ "bottom-center": "bottom-center";
185
+ }>>;
186
+ }, z.core.$strip>;
187
+ export type ShowToastStepPayload = z.infer<typeof ShowToastStepPayloadSchema>;
188
+ /**
189
+ * 6. Open Modal Step Payload Schema
190
+ */
191
+ export declare const OpenModalStepPayloadSchema: z.ZodObject<{
192
+ modalId: z.ZodOptional<z.ZodString>;
193
+ modalNodeId: z.ZodOptional<z.ZodString>;
194
+ }, z.core.$strip>;
195
+ export type OpenModalStepPayload = z.infer<typeof OpenModalStepPayloadSchema>;
196
+ /**
197
+ * 7. Close Modal Step Payload Schema
198
+ */
199
+ export declare const CloseModalStepPayloadSchema: z.ZodObject<{
200
+ modalId: z.ZodOptional<z.ZodString>;
201
+ modalNodeId: z.ZodOptional<z.ZodString>;
202
+ }, z.core.$strip>;
203
+ export type CloseModalStepPayload = z.infer<typeof CloseModalStepPayloadSchema>;
204
+ /**
205
+ * 8. Copy Clipboard Step Payload Schema
206
+ */
207
+ export declare const CopyClipboardStepPayloadSchema: z.ZodObject<{
208
+ text: z.ZodOptional<z.ZodString>;
209
+ value: z.ZodOptional<z.ZodUnknown>;
210
+ notify: z.ZodOptional<z.ZodBoolean>;
211
+ toastMessage: z.ZodOptional<z.ZodString>;
212
+ }, z.core.$strip>;
213
+ export type CopyClipboardStepPayload = z.infer<typeof CopyClipboardStepPayloadSchema>;
214
+ /**
215
+ * 9. Custom Event Step Payload Schema
216
+ */
217
+ export declare const CustomEventStepPayloadSchema: z.ZodObject<{
218
+ eventName: z.ZodString;
219
+ detail: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
220
+ bubbles: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
221
+ cancelable: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
222
+ }, z.core.$strip>;
223
+ export type CustomEventStepPayload = z.infer<typeof CustomEventStepPayloadSchema>;
224
+ /**
225
+ * Dictionary of Step Payload Schemas by Step Type
226
+ */
227
+ export declare const StepPayloadSchemas: {
228
+ readonly api_request: z.ZodObject<{
229
+ url: z.ZodString;
230
+ method: z.ZodDefault<z.ZodEnum<{
231
+ GET: "GET";
232
+ POST: "POST";
233
+ PUT: "PUT";
234
+ DELETE: "DELETE";
235
+ PATCH: "PATCH";
236
+ HEAD: "HEAD";
237
+ OPTIONS: "OPTIONS";
238
+ }>>;
239
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
240
+ queryParams: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
241
+ body: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodUnknown>]>>;
242
+ bodyFormat: z.ZodOptional<z.ZodEnum<{
243
+ raw: "raw";
244
+ formData: "formData";
245
+ text: "text";
246
+ json: "json";
247
+ "form-data": "form-data";
248
+ urlencoded: "urlencoded";
249
+ "url-encoded": "url-encoded";
250
+ }>>;
251
+ bodyType: z.ZodOptional<z.ZodEnum<{
252
+ raw: "raw";
253
+ formData: "formData";
254
+ text: "text";
255
+ json: "json";
256
+ "form-data": "form-data";
257
+ urlencoded: "urlencoded";
258
+ "url-encoded": "url-encoded";
259
+ }>>;
260
+ timeout: z.ZodOptional<z.ZodNumber>;
261
+ responseMapping: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
262
+ }, z.core.$strip>;
263
+ readonly navigate: z.ZodObject<{
264
+ url: z.ZodString;
265
+ target: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
266
+ _self: "_self";
267
+ _blank: "_blank";
268
+ _parent: "_parent";
269
+ _top: "_top";
270
+ }>>>;
271
+ replace: z.ZodOptional<z.ZodBoolean>;
272
+ scroll: z.ZodOptional<z.ZodBoolean>;
273
+ behavior: z.ZodOptional<z.ZodEnum<{
274
+ auto: "auto";
275
+ smooth: "smooth";
276
+ }>>;
277
+ }, z.core.$strip>;
278
+ readonly set_state: z.ZodObject<{
279
+ key: z.ZodString;
280
+ value: z.ZodUnknown;
281
+ scope: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
282
+ session: "session";
283
+ document: "document";
284
+ local: "local";
285
+ runtime: "runtime";
286
+ }>>>;
287
+ }, z.core.$strip>;
288
+ readonly reset_form: z.ZodObject<{
289
+ formId: z.ZodOptional<z.ZodString>;
290
+ }, z.core.$strip>;
291
+ readonly show_toast: z.ZodObject<{
292
+ message: z.ZodString;
293
+ type: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
294
+ error: "error";
295
+ info: "info";
296
+ warning: "warning";
297
+ success: "success";
298
+ }>>>;
299
+ variant: z.ZodOptional<z.ZodEnum<{
300
+ error: "error";
301
+ info: "info";
302
+ warning: "warning";
303
+ success: "success";
304
+ }>>;
305
+ title: z.ZodOptional<z.ZodString>;
306
+ duration: z.ZodOptional<z.ZodNumber>;
307
+ position: z.ZodOptional<z.ZodEnum<{
308
+ "top-right": "top-right";
309
+ "top-left": "top-left";
310
+ "bottom-right": "bottom-right";
311
+ "bottom-left": "bottom-left";
312
+ "top-center": "top-center";
313
+ "bottom-center": "bottom-center";
314
+ }>>;
315
+ }, z.core.$strip>;
316
+ readonly open_modal: z.ZodObject<{
317
+ modalId: z.ZodOptional<z.ZodString>;
318
+ modalNodeId: z.ZodOptional<z.ZodString>;
319
+ }, z.core.$strip>;
320
+ readonly close_modal: z.ZodObject<{
321
+ modalId: z.ZodOptional<z.ZodString>;
322
+ modalNodeId: z.ZodOptional<z.ZodString>;
323
+ }, z.core.$strip>;
324
+ readonly copy_clipboard: z.ZodObject<{
325
+ text: z.ZodOptional<z.ZodString>;
326
+ value: z.ZodOptional<z.ZodUnknown>;
327
+ notify: z.ZodOptional<z.ZodBoolean>;
328
+ toastMessage: z.ZodOptional<z.ZodString>;
329
+ }, z.core.$strip>;
330
+ readonly custom_event: z.ZodObject<{
331
+ eventName: z.ZodString;
332
+ detail: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
333
+ bubbles: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
334
+ cancelable: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
335
+ }, z.core.$strip>;
336
+ };
337
+ /**
338
+ * Action Step Interface
339
+ * Recursive definition allowing branching (onSuccess, onError).
340
+ */
341
+ export interface ActionStep {
342
+ id: string;
343
+ type: ActionStepType;
344
+ label?: string;
345
+ payload?: Record<string, unknown>;
346
+ condition?: ActionStepCondition;
347
+ timeout?: number;
348
+ continueOnError?: boolean;
349
+ onSuccess?: ActionStep[];
350
+ onError?: ActionStep[];
351
+ }
352
+ /**
353
+ * Action Step Schema
354
+ * Validates individual steps in an action pipeline, supporting recursive branching.
355
+ */
356
+ export declare const ActionStepSchema: z.ZodType<ActionStep>;
357
+ /**
358
+ * Action Pipeline Schema
359
+ * Defines an event trigger and an ordered sequence of action steps to execute.
360
+ */
361
+ export declare const ActionPipelineSchema: z.ZodObject<{
362
+ id: z.ZodString;
363
+ trigger: z.ZodEnum<{
364
+ load: "load";
365
+ change: "change";
366
+ blur: "blur";
367
+ click: "click";
368
+ focus: "focus";
369
+ submit: "submit";
370
+ }>;
371
+ label: z.ZodOptional<z.ZodString>;
372
+ debounceMs: z.ZodOptional<z.ZodNumber>;
373
+ preventDuplicate: z.ZodOptional<z.ZodBoolean>;
374
+ enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
375
+ steps: z.ZodArray<z.ZodType<ActionStep, unknown, z.core.$ZodTypeInternals<ActionStep, unknown>>>;
376
+ }, z.core.$strip>;
377
+ export type ActionPipeline = z.infer<typeof ActionPipelineSchema>;
378
+ /**
379
+ * Type Guards
380
+ */
381
+ export declare function isActionTriggerType(value: unknown): value is ActionTriggerType;
382
+ export declare function isActionStepType(value: unknown): value is ActionStepType;
383
+ export declare function isConditionOperator(value: unknown): value is ConditionOperator;
384
+ export declare function isActionStepCondition(value: unknown): value is ActionStepCondition;
385
+ export declare function isActionStep(value: unknown): value is ActionStep;
386
+ export declare function isActionPipeline(value: unknown): value is ActionPipeline;
387
+ /**
388
+ * Validates a step's payload specifically according to its step type.
389
+ */
390
+ export declare function validateActionStepPayload(type: ActionStepType, payload: unknown): {
391
+ success: boolean;
392
+ data?: unknown;
393
+ error?: z.ZodError;
394
+ };
395
+ /**
396
+ * Sanitization Utilities
397
+ */
398
+ /**
399
+ * Sanitizes a URL string by checking if it contains dangerous protocols or scripts.
400
+ * Returns the trimmed URL if safe, or a fallback string (default empty string `""`).
401
+ */
402
+ export declare function sanitizeActionUrl(url: unknown, fallback?: string): string;
403
+ /**
404
+ * Sanitizes a general string value against script tags and dangerous HTML/protocols.
405
+ */
406
+ export declare function sanitizeActionString(value: unknown, fallback?: string): string;
407
+ /**
408
+ * Recursively sanitizes any arbitrary value (string, object, array, primitive) in an action payload.
409
+ */
410
+ export declare function sanitizeActionValue(value: unknown): unknown;
411
+ /**
412
+ * Sanitizes an action step payload object, cleaning dangerous URLs and injection strings recursively.
413
+ */
414
+ export declare function sanitizeActionPayload(payload: Record<string, unknown> | undefined): Record<string, unknown>;
415
+ /**
416
+ * Recursively sanitizes an ActionStep, including its payload, condition, onSuccess, and onError branches.
417
+ */
418
+ export declare function sanitizeActionStep(step: ActionStep): ActionStep;
419
+ /**
420
+ * Recursively sanitizes an ActionPipeline and all its nested steps.
421
+ */
422
+ export declare function sanitizeActionPipeline(pipeline: ActionPipeline): ActionPipeline;
423
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { z } from 'zod';
2
+ import { ActionPipeline } from './actions';
3
+ import { FormConfig } from './form';
2
4
  export declare const SCHEMA_NAME: "stora.page";
3
5
  export declare const CURRENT_SCHEMA_VERSION: "1.0.0";
4
6
  /**
@@ -53,8 +55,24 @@ export declare const ResponsiveStylesSchema: z.ZodDefault<z.ZodObject<{
53
55
  tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>;
54
56
  mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>;
55
57
  states: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>>;
56
- }, z.core.$catchall<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodUndefined]>>>>>;
58
+ }, z.core.$loose>>;
57
59
  export type ResponsiveStyles = z.infer<typeof ResponsiveStylesSchema>;
60
+ /**
61
+ * Animation Configuration Schema
62
+ * Defines scroll entrance animations (AOS), duration, delay, easing curve,
63
+ * trigger behavior (once), hover micro-interactions, and continuous loop effects.
64
+ */
65
+ export declare const AnimationConfigSchema: z.ZodObject<{
66
+ type: z.ZodDefault<z.ZodOptional<z.ZodString>>;
67
+ duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
68
+ delay: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
69
+ easing: z.ZodDefault<z.ZodOptional<z.ZodString>>;
70
+ once: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
71
+ hoverEffect: z.ZodDefault<z.ZodOptional<z.ZodString>>;
72
+ loopEffect: z.ZodDefault<z.ZodOptional<z.ZodString>>;
73
+ }, z.core.$strip>;
74
+ export type AnimationConfig = z.infer<typeof AnimationConfigSchema>;
75
+ export declare const DEFAULT_ANIMATION_CONFIG: AnimationConfig;
58
76
  /**
59
77
  * Recursive Node Type Definition
60
78
  */
@@ -63,6 +81,9 @@ export type Node = {
63
81
  type: string;
64
82
  props?: Record<string, unknown>;
65
83
  styles?: ResponsiveStyles;
84
+ animation?: AnimationConfig;
85
+ actions?: ActionPipeline[];
86
+ formConfig?: FormConfig;
66
87
  children?: Node[];
67
88
  };
68
89
  /**
@@ -126,6 +147,7 @@ export type PageDocument = z.infer<typeof PageDocumentSchema>;
126
147
  export declare function isAssetReference(value: unknown): value is AssetReference;
127
148
  export declare function isVariableBinding(value: unknown): value is VariableBinding;
128
149
  export declare function isActionBinding(value: unknown): value is ActionBinding;
150
+ export declare function isAnimationConfig(value: unknown): value is AnimationConfig;
129
151
  /**
130
152
  * Deterministic Node ID Generator
131
153
  * Generates predictable IDs based on prefix and an index/identifier (not bound to React keys).
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}