@kubuild/schema 0.1.0 → 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/README.md +117 -0
- package/dist/actions.d.ts +423 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/document.d.ts +4 -0
- package/dist/document.d.ts.map +1 -1
- package/dist/form.d.ts +129 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/index.cjs +845 -90
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +798 -90
- package/dist/index.js.map +1 -1
- package/dist/json-schema.d.ts +690 -0
- package/dist/json-schema.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -20,103 +20,462 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
+
ACTION_PIPELINE_JSON_SCHEMA_V1: () => ACTION_PIPELINE_JSON_SCHEMA_V1,
|
|
23
24
|
ActionBindingSchema: () => ActionBindingSchema,
|
|
25
|
+
ActionPipelineSchema: () => ActionPipelineSchema,
|
|
26
|
+
ActionStepConditionSchema: () => ActionStepConditionSchema,
|
|
27
|
+
ActionStepSchema: () => ActionStepSchema,
|
|
28
|
+
ActionStepTypeSchema: () => ActionStepTypeSchema,
|
|
29
|
+
ActionTriggerSchema: () => ActionTriggerSchema,
|
|
30
|
+
ActionTriggerTypeSchema: () => ActionTriggerTypeSchema,
|
|
24
31
|
AnimationConfigSchema: () => AnimationConfigSchema,
|
|
32
|
+
ApiRequestStepPayloadSchema: () => ApiRequestStepPayloadSchema,
|
|
25
33
|
AssetReferenceSchema: () => AssetReferenceSchema,
|
|
26
34
|
CURRENT_SCHEMA_VERSION: () => CURRENT_SCHEMA_VERSION,
|
|
35
|
+
CloseModalStepPayloadSchema: () => CloseModalStepPayloadSchema,
|
|
36
|
+
ConditionOperatorSchema: () => ConditionOperatorSchema,
|
|
37
|
+
CopyClipboardStepPayloadSchema: () => CopyClipboardStepPayloadSchema,
|
|
38
|
+
CustomEventStepPayloadSchema: () => CustomEventStepPayloadSchema,
|
|
27
39
|
DEFAULT_ANIMATION_CONFIG: () => DEFAULT_ANIMATION_CONFIG,
|
|
28
40
|
DocumentMetadataSchema: () => DocumentMetadataSchema,
|
|
41
|
+
FORM_CONFIG_JSON_SCHEMA_V1: () => FORM_CONFIG_JSON_SCHEMA_V1,
|
|
42
|
+
FORM_FIELD_BINDING_JSON_SCHEMA_V1: () => FORM_FIELD_BINDING_JSON_SCHEMA_V1,
|
|
43
|
+
FormConfigSchema: () => FormConfigSchema,
|
|
44
|
+
FormFieldBindingSchema: () => FormFieldBindingSchema,
|
|
29
45
|
MANIFEST_JSON_SCHEMA_V1: () => MANIFEST_JSON_SCHEMA_V1,
|
|
30
46
|
ManifestAssetItemSchema: () => ManifestAssetItemSchema,
|
|
31
47
|
ManifestSchema: () => ManifestSchema,
|
|
48
|
+
NavigateStepPayloadSchema: () => NavigateStepPayloadSchema,
|
|
32
49
|
NodeSchema: () => NodeSchema,
|
|
50
|
+
OpenModalStepPayloadSchema: () => OpenModalStepPayloadSchema,
|
|
33
51
|
PAGE_DOCUMENT_JSON_SCHEMA_V1: () => PAGE_DOCUMENT_JSON_SCHEMA_V1,
|
|
34
52
|
PageDocumentSchema: () => PageDocumentSchema,
|
|
35
53
|
PseudoStateStylesSchema: () => PseudoStateStylesSchema,
|
|
54
|
+
ResetFormStepPayloadSchema: () => ResetFormStepPayloadSchema,
|
|
36
55
|
ResponsiveStylesSchema: () => ResponsiveStylesSchema,
|
|
37
56
|
RootPageNodeSchema: () => RootPageNodeSchema,
|
|
38
57
|
SCHEMA_NAME: () => SCHEMA_NAME,
|
|
39
58
|
SafeThumbnailObjectSchema: () => SafeThumbnailObjectSchema,
|
|
40
59
|
SafeThumbnailSchema: () => SafeThumbnailSchema,
|
|
41
60
|
SafeThumbnailUrlSchema: () => SafeThumbnailUrlSchema,
|
|
61
|
+
SetStateStepPayloadSchema: () => SetStateStepPayloadSchema,
|
|
62
|
+
ShowToastStepPayloadSchema: () => ShowToastStepPayloadSchema,
|
|
63
|
+
StepPayloadSchemas: () => StepPayloadSchemas,
|
|
42
64
|
StyleDefinitionSchema: () => StyleDefinitionSchema,
|
|
43
65
|
StyleValueSchema: () => StyleValueSchema,
|
|
44
66
|
TEMPLATE_RECORD_JSON_SCHEMA_V1: () => TEMPLATE_RECORD_JSON_SCHEMA_V1,
|
|
45
67
|
TemplatePackageRefSchema: () => TemplatePackageRefSchema,
|
|
46
68
|
TemplateRecordSchema: () => TemplateRecordSchema,
|
|
47
69
|
TemplateRequirementsSchema: () => TemplateRequirementsSchema,
|
|
70
|
+
ValidateOnEventSchema: () => ValidateOnEventSchema,
|
|
71
|
+
ValidationRuleSchema: () => ValidationRuleSchema,
|
|
72
|
+
ValidationRuleTypeSchema: () => ValidationRuleTypeSchema,
|
|
48
73
|
VariableBindingSchema: () => VariableBindingSchema,
|
|
49
74
|
collectNodeIds: () => collectNodeIds,
|
|
50
75
|
generateDeterministicNodeId: () => generateDeterministicNodeId,
|
|
76
|
+
getActionPipelineJsonSchema: () => getActionPipelineJsonSchema,
|
|
77
|
+
getFormConfigJsonSchema: () => getFormConfigJsonSchema,
|
|
78
|
+
getFormFieldBindingJsonSchema: () => getFormFieldBindingJsonSchema,
|
|
51
79
|
getManifestJsonSchema: () => getManifestJsonSchema,
|
|
52
80
|
getPageDocumentJsonSchema: () => getPageDocumentJsonSchema,
|
|
53
81
|
getTemplateRecordJsonSchema: () => getTemplateRecordJsonSchema,
|
|
54
82
|
isActionBinding: () => isActionBinding,
|
|
83
|
+
isActionPipeline: () => isActionPipeline,
|
|
84
|
+
isActionStep: () => isActionStep,
|
|
85
|
+
isActionStepCondition: () => isActionStepCondition,
|
|
86
|
+
isActionStepType: () => isActionStepType,
|
|
87
|
+
isActionTriggerType: () => isActionTriggerType,
|
|
55
88
|
isAnimationConfig: () => isAnimationConfig,
|
|
56
89
|
isAssetReference: () => isAssetReference,
|
|
90
|
+
isConditionOperator: () => isConditionOperator,
|
|
91
|
+
isFormConfig: () => isFormConfig,
|
|
92
|
+
isFormFieldBinding: () => isFormFieldBinding,
|
|
57
93
|
isManifest: () => isManifest,
|
|
94
|
+
isSafeActionUrl: () => isSafeActionUrl,
|
|
58
95
|
isSafeThumbnail: () => isSafeThumbnail,
|
|
59
96
|
isSafeThumbnailUrl: () => isSafeThumbnailUrl,
|
|
60
97
|
isTemplateRecord: () => isTemplateRecord,
|
|
98
|
+
isValidateOnEvent: () => isValidateOnEvent,
|
|
99
|
+
isValidationRule: () => isValidationRule,
|
|
100
|
+
isValidationRuleType: () => isValidationRuleType,
|
|
61
101
|
isVariableBinding: () => isVariableBinding,
|
|
102
|
+
sanitizeActionPayload: () => sanitizeActionPayload,
|
|
103
|
+
sanitizeActionPipeline: () => sanitizeActionPipeline,
|
|
104
|
+
sanitizeActionStep: () => sanitizeActionStep,
|
|
105
|
+
sanitizeActionString: () => sanitizeActionString,
|
|
106
|
+
sanitizeActionUrl: () => sanitizeActionUrl,
|
|
107
|
+
sanitizeActionValue: () => sanitizeActionValue,
|
|
62
108
|
starterPageFixture: () => starterPageFixture,
|
|
109
|
+
validateActionStepPayload: () => validateActionStepPayload,
|
|
63
110
|
validateNodeIdUniqueness: () => validateNodeIdUniqueness
|
|
64
111
|
});
|
|
65
112
|
module.exports = __toCommonJS(index_exports);
|
|
66
113
|
|
|
67
114
|
// src/document.ts
|
|
115
|
+
var import_zod3 = require("zod");
|
|
116
|
+
|
|
117
|
+
// src/actions.ts
|
|
68
118
|
var import_zod = require("zod");
|
|
119
|
+
var ActionTriggerTypeSchema = import_zod.z.enum([
|
|
120
|
+
"click",
|
|
121
|
+
"submit",
|
|
122
|
+
"change",
|
|
123
|
+
"blur",
|
|
124
|
+
"focus",
|
|
125
|
+
"load"
|
|
126
|
+
]);
|
|
127
|
+
var ActionTriggerSchema = ActionTriggerTypeSchema;
|
|
128
|
+
var ActionStepTypeSchema = import_zod.z.enum([
|
|
129
|
+
"api_request",
|
|
130
|
+
"navigate",
|
|
131
|
+
"set_state",
|
|
132
|
+
"reset_form",
|
|
133
|
+
"show_toast",
|
|
134
|
+
"open_modal",
|
|
135
|
+
"close_modal",
|
|
136
|
+
"copy_clipboard",
|
|
137
|
+
"custom_event"
|
|
138
|
+
]);
|
|
139
|
+
var ConditionOperatorSchema = import_zod.z.enum([
|
|
140
|
+
"equals",
|
|
141
|
+
"not_equals",
|
|
142
|
+
"contains",
|
|
143
|
+
"not_contains",
|
|
144
|
+
"is_truthy",
|
|
145
|
+
"is_falsy",
|
|
146
|
+
"gt",
|
|
147
|
+
"gte",
|
|
148
|
+
"lt",
|
|
149
|
+
"lte",
|
|
150
|
+
"regex"
|
|
151
|
+
]);
|
|
152
|
+
var ActionStepConditionSchema = import_zod.z.object({
|
|
153
|
+
field: import_zod.z.string().min(1, "Condition field cannot be empty"),
|
|
154
|
+
operator: ConditionOperatorSchema,
|
|
155
|
+
value: import_zod.z.unknown().optional()
|
|
156
|
+
});
|
|
157
|
+
var DANGEROUS_URL_PATTERN = /(javascript:|vbscript:|data:text\/html)/i;
|
|
158
|
+
var DANGEROUS_SCRIPT_PATTERN = /<\s*script/i;
|
|
159
|
+
function isSafeActionUrl(url) {
|
|
160
|
+
if (!url || typeof url !== "string") return false;
|
|
161
|
+
const trimmed = url.trim();
|
|
162
|
+
if (DANGEROUS_URL_PATTERN.test(trimmed)) return false;
|
|
163
|
+
if (DANGEROUS_SCRIPT_PATTERN.test(trimmed)) return false;
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
var SafeUrlStringSchema = import_zod.z.string().min(1, "URL cannot be empty").refine(isSafeActionUrl, {
|
|
167
|
+
message: "URL contains disallowed or unsafe protocol/script pattern"
|
|
168
|
+
});
|
|
169
|
+
var SafeEventNameSchema = import_zod.z.string().min(1, "Event name cannot be empty").regex(/^[a-zA-Z0-9_\-:]+$/, {
|
|
170
|
+
message: "Event name must contain only alphanumeric characters, dashes, colons, or underscores"
|
|
171
|
+
});
|
|
172
|
+
var ApiRequestStepPayloadSchema = import_zod.z.object({
|
|
173
|
+
url: SafeUrlStringSchema,
|
|
174
|
+
method: import_zod.z.enum(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]).default("GET"),
|
|
175
|
+
headers: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional(),
|
|
176
|
+
queryParams: import_zod.z.record(import_zod.z.string(), import_zod.z.union([import_zod.z.string(), import_zod.z.number(), import_zod.z.boolean()])).optional(),
|
|
177
|
+
body: import_zod.z.union([import_zod.z.string(), import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()), import_zod.z.array(import_zod.z.unknown())]).optional(),
|
|
178
|
+
bodyFormat: import_zod.z.enum(["json", "form-data", "formData", "urlencoded", "url-encoded", "raw", "text"]).optional(),
|
|
179
|
+
bodyType: import_zod.z.enum(["json", "form-data", "formData", "urlencoded", "url-encoded", "raw", "text"]).optional(),
|
|
180
|
+
timeout: import_zod.z.number().positive("Timeout must be greater than 0 ms").optional(),
|
|
181
|
+
responseMapping: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional()
|
|
182
|
+
});
|
|
183
|
+
var NavigateStepPayloadSchema = import_zod.z.object({
|
|
184
|
+
url: SafeUrlStringSchema,
|
|
185
|
+
target: import_zod.z.enum(["_self", "_blank", "_parent", "_top"]).optional().default("_self"),
|
|
186
|
+
replace: import_zod.z.boolean().optional(),
|
|
187
|
+
scroll: import_zod.z.boolean().optional(),
|
|
188
|
+
behavior: import_zod.z.enum(["smooth", "auto"]).optional()
|
|
189
|
+
});
|
|
190
|
+
var SetStateStepPayloadSchema = import_zod.z.object({
|
|
191
|
+
key: import_zod.z.string().min(1, "State key cannot be empty"),
|
|
192
|
+
value: import_zod.z.unknown(),
|
|
193
|
+
scope: import_zod.z.enum(["runtime", "document", "session", "local"]).optional().default("runtime")
|
|
194
|
+
});
|
|
195
|
+
var ResetFormStepPayloadSchema = import_zod.z.object({
|
|
196
|
+
formId: import_zod.z.string().optional()
|
|
197
|
+
});
|
|
198
|
+
var ShowToastStepPayloadSchema = import_zod.z.object({
|
|
199
|
+
message: import_zod.z.string().min(1, "Toast message cannot be empty"),
|
|
200
|
+
type: import_zod.z.enum(["success", "error", "warning", "info"]).optional().default("info"),
|
|
201
|
+
variant: import_zod.z.enum(["success", "error", "warning", "info"]).optional(),
|
|
202
|
+
title: import_zod.z.string().optional(),
|
|
203
|
+
duration: import_zod.z.number().nonnegative("Duration must be >= 0 ms").optional(),
|
|
204
|
+
position: import_zod.z.enum(["top-right", "top-left", "bottom-right", "bottom-left", "top-center", "bottom-center"]).optional()
|
|
205
|
+
});
|
|
206
|
+
var OpenModalStepPayloadSchema = import_zod.z.object({
|
|
207
|
+
modalId: import_zod.z.string().optional(),
|
|
208
|
+
modalNodeId: import_zod.z.string().optional()
|
|
209
|
+
}).refine((data) => Boolean(data.modalId || data.modalNodeId), {
|
|
210
|
+
message: "Modal ID or Modal Node ID cannot be empty"
|
|
211
|
+
});
|
|
212
|
+
var CloseModalStepPayloadSchema = import_zod.z.object({
|
|
213
|
+
modalId: import_zod.z.string().optional(),
|
|
214
|
+
modalNodeId: import_zod.z.string().optional()
|
|
215
|
+
});
|
|
216
|
+
var CopyClipboardStepPayloadSchema = import_zod.z.object({
|
|
217
|
+
text: import_zod.z.string().optional(),
|
|
218
|
+
value: import_zod.z.unknown().optional(),
|
|
219
|
+
notify: import_zod.z.boolean().optional(),
|
|
220
|
+
toastMessage: import_zod.z.string().optional()
|
|
221
|
+
});
|
|
222
|
+
var CustomEventStepPayloadSchema = import_zod.z.object({
|
|
223
|
+
eventName: SafeEventNameSchema,
|
|
224
|
+
detail: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional(),
|
|
225
|
+
bubbles: import_zod.z.boolean().optional().default(true),
|
|
226
|
+
cancelable: import_zod.z.boolean().optional().default(true)
|
|
227
|
+
});
|
|
228
|
+
var StepPayloadSchemas = {
|
|
229
|
+
api_request: ApiRequestStepPayloadSchema,
|
|
230
|
+
navigate: NavigateStepPayloadSchema,
|
|
231
|
+
set_state: SetStateStepPayloadSchema,
|
|
232
|
+
reset_form: ResetFormStepPayloadSchema,
|
|
233
|
+
show_toast: ShowToastStepPayloadSchema,
|
|
234
|
+
open_modal: OpenModalStepPayloadSchema,
|
|
235
|
+
close_modal: CloseModalStepPayloadSchema,
|
|
236
|
+
copy_clipboard: CopyClipboardStepPayloadSchema,
|
|
237
|
+
custom_event: CustomEventStepPayloadSchema
|
|
238
|
+
};
|
|
239
|
+
var ActionStepSchema = import_zod.z.lazy(
|
|
240
|
+
() => import_zod.z.object({
|
|
241
|
+
id: import_zod.z.string().min(1, "Step ID cannot be empty"),
|
|
242
|
+
type: ActionStepTypeSchema,
|
|
243
|
+
label: import_zod.z.string().optional(),
|
|
244
|
+
payload: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional().default({}),
|
|
245
|
+
condition: ActionStepConditionSchema.optional(),
|
|
246
|
+
timeout: import_zod.z.number().positive().optional(),
|
|
247
|
+
continueOnError: import_zod.z.boolean().optional(),
|
|
248
|
+
onSuccess: import_zod.z.array(ActionStepSchema).optional(),
|
|
249
|
+
onError: import_zod.z.array(ActionStepSchema).optional()
|
|
250
|
+
})
|
|
251
|
+
);
|
|
252
|
+
var ActionPipelineSchema = import_zod.z.object({
|
|
253
|
+
id: import_zod.z.string().min(1, "Pipeline ID cannot be empty"),
|
|
254
|
+
trigger: ActionTriggerTypeSchema,
|
|
255
|
+
label: import_zod.z.string().optional(),
|
|
256
|
+
debounceMs: import_zod.z.number().nonnegative("Debounce ms must be >= 0").optional(),
|
|
257
|
+
preventDuplicate: import_zod.z.boolean().optional(),
|
|
258
|
+
enabled: import_zod.z.boolean().optional().default(true),
|
|
259
|
+
steps: import_zod.z.array(ActionStepSchema).min(1, "Action pipeline must contain at least one step")
|
|
260
|
+
});
|
|
261
|
+
function isActionTriggerType(value) {
|
|
262
|
+
return ActionTriggerTypeSchema.safeParse(value).success;
|
|
263
|
+
}
|
|
264
|
+
function isActionStepType(value) {
|
|
265
|
+
return ActionStepTypeSchema.safeParse(value).success;
|
|
266
|
+
}
|
|
267
|
+
function isConditionOperator(value) {
|
|
268
|
+
return ConditionOperatorSchema.safeParse(value).success;
|
|
269
|
+
}
|
|
270
|
+
function isActionStepCondition(value) {
|
|
271
|
+
return ActionStepConditionSchema.safeParse(value).success;
|
|
272
|
+
}
|
|
273
|
+
function isActionStep(value) {
|
|
274
|
+
return ActionStepSchema.safeParse(value).success;
|
|
275
|
+
}
|
|
276
|
+
function isActionPipeline(value) {
|
|
277
|
+
return ActionPipelineSchema.safeParse(value).success;
|
|
278
|
+
}
|
|
279
|
+
function validateActionStepPayload(type, payload) {
|
|
280
|
+
const schema = StepPayloadSchemas[type];
|
|
281
|
+
if (!schema) {
|
|
282
|
+
return {
|
|
283
|
+
success: false,
|
|
284
|
+
error: new import_zod.z.ZodError([
|
|
285
|
+
{
|
|
286
|
+
code: import_zod.z.ZodIssueCode.custom,
|
|
287
|
+
message: `Unknown step type: ${type}`,
|
|
288
|
+
path: ["type"]
|
|
289
|
+
}
|
|
290
|
+
])
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
const result = schema.safeParse(payload);
|
|
294
|
+
if (result.success) {
|
|
295
|
+
return { success: true, data: result.data };
|
|
296
|
+
}
|
|
297
|
+
return { success: false, error: result.error };
|
|
298
|
+
}
|
|
299
|
+
function sanitizeActionUrl(url, fallback = "") {
|
|
300
|
+
if (typeof url !== "string") return fallback;
|
|
301
|
+
const trimmed = url.trim();
|
|
302
|
+
if (!isSafeActionUrl(trimmed)) {
|
|
303
|
+
return fallback;
|
|
304
|
+
}
|
|
305
|
+
return trimmed;
|
|
306
|
+
}
|
|
307
|
+
function sanitizeActionString(value, fallback = "") {
|
|
308
|
+
if (typeof value !== "string") return fallback;
|
|
309
|
+
if (DANGEROUS_SCRIPT_PATTERN.test(value)) {
|
|
310
|
+
return value.replace(/<\s*script[^>]*>[\s\S]*?<\s*\/\s*script\s*>/gi, "").replace(/<\s*script[^>]*>/gi, "");
|
|
311
|
+
}
|
|
312
|
+
return value;
|
|
313
|
+
}
|
|
314
|
+
function sanitizeActionValue(value) {
|
|
315
|
+
if (value === null || value === void 0) return value;
|
|
316
|
+
if (typeof value === "string") {
|
|
317
|
+
const trimmed = value.trim();
|
|
318
|
+
if (DANGEROUS_URL_PATTERN.test(trimmed)) {
|
|
319
|
+
return "";
|
|
320
|
+
}
|
|
321
|
+
return sanitizeActionString(value);
|
|
322
|
+
}
|
|
323
|
+
if (Array.isArray(value)) {
|
|
324
|
+
return value.map((item) => sanitizeActionValue(item));
|
|
325
|
+
}
|
|
326
|
+
if (typeof value === "object") {
|
|
327
|
+
const result = {};
|
|
328
|
+
for (const [k, v] of Object.entries(value)) {
|
|
329
|
+
if (/^(url|href|src|endpoint|targetUrl)$/i.test(k) && typeof v === "string") {
|
|
330
|
+
result[k] = sanitizeActionUrl(v);
|
|
331
|
+
} else {
|
|
332
|
+
result[k] = sanitizeActionValue(v);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
return value;
|
|
338
|
+
}
|
|
339
|
+
function sanitizeActionPayload(payload) {
|
|
340
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
|
|
341
|
+
return {};
|
|
342
|
+
}
|
|
343
|
+
return sanitizeActionValue(payload);
|
|
344
|
+
}
|
|
345
|
+
function sanitizeActionStep(step) {
|
|
346
|
+
const sanitized = {
|
|
347
|
+
...step,
|
|
348
|
+
label: step.label ? sanitizeActionString(step.label) : step.label,
|
|
349
|
+
payload: sanitizeActionPayload(step.payload)
|
|
350
|
+
};
|
|
351
|
+
if (step.condition && step.condition.value !== void 0) {
|
|
352
|
+
sanitized.condition = {
|
|
353
|
+
...step.condition,
|
|
354
|
+
value: sanitizeActionValue(step.condition.value)
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
if (step.onSuccess && Array.isArray(step.onSuccess)) {
|
|
358
|
+
sanitized.onSuccess = step.onSuccess.map((s) => sanitizeActionStep(s));
|
|
359
|
+
}
|
|
360
|
+
if (step.onError && Array.isArray(step.onError)) {
|
|
361
|
+
sanitized.onError = step.onError.map((s) => sanitizeActionStep(s));
|
|
362
|
+
}
|
|
363
|
+
return sanitized;
|
|
364
|
+
}
|
|
365
|
+
function sanitizeActionPipeline(pipeline) {
|
|
366
|
+
return {
|
|
367
|
+
...pipeline,
|
|
368
|
+
label: pipeline.label ? sanitizeActionString(pipeline.label) : pipeline.label,
|
|
369
|
+
steps: Array.isArray(pipeline.steps) ? pipeline.steps.map((s) => sanitizeActionStep(s)) : []
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// src/form.ts
|
|
374
|
+
var import_zod2 = require("zod");
|
|
375
|
+
var ValidationRuleTypeSchema = import_zod2.z.enum([
|
|
376
|
+
"required",
|
|
377
|
+
"email",
|
|
378
|
+
"url",
|
|
379
|
+
"min_length",
|
|
380
|
+
"max_length",
|
|
381
|
+
"numeric_min",
|
|
382
|
+
"numeric_max",
|
|
383
|
+
"pattern",
|
|
384
|
+
"match_field",
|
|
385
|
+
"custom_regex"
|
|
386
|
+
]);
|
|
387
|
+
var ValidateOnEventSchema = import_zod2.z.enum(["blur", "change", "submit"]);
|
|
388
|
+
var ValidationRuleSchema = import_zod2.z.object({
|
|
389
|
+
type: ValidationRuleTypeSchema,
|
|
390
|
+
value: import_zod2.z.unknown().optional(),
|
|
391
|
+
message: import_zod2.z.string().min(1, "Validation error message cannot be empty")
|
|
392
|
+
});
|
|
393
|
+
var FormFieldBindingSchema = import_zod2.z.object({
|
|
394
|
+
name: import_zod2.z.string().min(1, "Field name cannot be empty"),
|
|
395
|
+
label: import_zod2.z.string().optional(),
|
|
396
|
+
defaultValue: import_zod2.z.unknown().optional(),
|
|
397
|
+
rules: import_zod2.z.array(ValidationRuleSchema).optional().default([]),
|
|
398
|
+
validateOn: ValidateOnEventSchema.optional().default("blur"),
|
|
399
|
+
transform: import_zod2.z.enum(["trim", "lowercase", "uppercase", "number"]).optional(),
|
|
400
|
+
disabled: import_zod2.z.boolean().optional(),
|
|
401
|
+
required: import_zod2.z.boolean().optional()
|
|
402
|
+
});
|
|
403
|
+
var FormConfigSchema = import_zod2.z.object({
|
|
404
|
+
formId: import_zod2.z.string().min(1, "Form ID cannot be empty"),
|
|
405
|
+
resetOnSubmit: import_zod2.z.boolean().optional().default(false),
|
|
406
|
+
scrollToFirstError: import_zod2.z.boolean().optional().default(true),
|
|
407
|
+
validateOn: ValidateOnEventSchema.optional().default("blur"),
|
|
408
|
+
initialValues: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional(),
|
|
409
|
+
rules: import_zod2.z.array(ValidationRuleSchema).optional()
|
|
410
|
+
});
|
|
411
|
+
function isValidationRuleType(value) {
|
|
412
|
+
return ValidationRuleTypeSchema.safeParse(value).success;
|
|
413
|
+
}
|
|
414
|
+
function isValidationRule(value) {
|
|
415
|
+
return ValidationRuleSchema.safeParse(value).success;
|
|
416
|
+
}
|
|
417
|
+
function isValidateOnEvent(value) {
|
|
418
|
+
return ValidateOnEventSchema.safeParse(value).success;
|
|
419
|
+
}
|
|
420
|
+
function isFormFieldBinding(value) {
|
|
421
|
+
return FormFieldBindingSchema.safeParse(value).success;
|
|
422
|
+
}
|
|
423
|
+
function isFormConfig(value) {
|
|
424
|
+
return FormConfigSchema.safeParse(value).success;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// src/document.ts
|
|
69
428
|
var SCHEMA_NAME = "stora.page";
|
|
70
429
|
var CURRENT_SCHEMA_VERSION = "1.0.0";
|
|
71
|
-
var AssetReferenceSchema =
|
|
72
|
-
type:
|
|
73
|
-
assetId:
|
|
74
|
-
filename:
|
|
75
|
-
mimeType:
|
|
76
|
-
fallbackUrl:
|
|
430
|
+
var AssetReferenceSchema = import_zod3.z.object({
|
|
431
|
+
type: import_zod3.z.literal("asset"),
|
|
432
|
+
assetId: import_zod3.z.string().min(1, "Asset ID cannot be empty"),
|
|
433
|
+
filename: import_zod3.z.string().optional(),
|
|
434
|
+
mimeType: import_zod3.z.string().optional(),
|
|
435
|
+
fallbackUrl: import_zod3.z.string().url().optional()
|
|
77
436
|
});
|
|
78
|
-
var VariableBindingSchema =
|
|
79
|
-
type:
|
|
80
|
-
key:
|
|
81
|
-
fallback:
|
|
437
|
+
var VariableBindingSchema = import_zod3.z.object({
|
|
438
|
+
type: import_zod3.z.literal("variable"),
|
|
439
|
+
key: import_zod3.z.string().min(1, "Variable key cannot be empty"),
|
|
440
|
+
fallback: import_zod3.z.unknown().optional()
|
|
82
441
|
});
|
|
83
|
-
var ActionBindingSchema =
|
|
84
|
-
type:
|
|
85
|
-
payload:
|
|
442
|
+
var ActionBindingSchema = import_zod3.z.object({
|
|
443
|
+
type: import_zod3.z.string().min(1, "Action type cannot be empty"),
|
|
444
|
+
payload: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional()
|
|
86
445
|
});
|
|
87
446
|
var DANGEROUS_STYLE_VALUE_PATTERN = /javascript:|expression\(|@import|<script|vbscript:|data:text\/html/i;
|
|
88
|
-
var StyleValueSchema =
|
|
89
|
-
|
|
447
|
+
var StyleValueSchema = import_zod3.z.union([
|
|
448
|
+
import_zod3.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
|
|
90
449
|
message: "Style value contains a disallowed or unsafe pattern"
|
|
91
450
|
}),
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
451
|
+
import_zod3.z.number(),
|
|
452
|
+
import_zod3.z.boolean(),
|
|
453
|
+
import_zod3.z.null(),
|
|
454
|
+
import_zod3.z.undefined()
|
|
96
455
|
]);
|
|
97
|
-
var StyleDefinitionSchema =
|
|
98
|
-
var PseudoStateStylesSchema =
|
|
99
|
-
var ResponsiveStylesSchema =
|
|
456
|
+
var StyleDefinitionSchema = import_zod3.z.record(import_zod3.z.string(), StyleValueSchema);
|
|
457
|
+
var PseudoStateStylesSchema = import_zod3.z.record(import_zod3.z.string(), StyleDefinitionSchema);
|
|
458
|
+
var ResponsiveStylesSchema = import_zod3.z.object({
|
|
100
459
|
base: StyleDefinitionSchema.optional(),
|
|
101
460
|
desktop: StyleDefinitionSchema.optional(),
|
|
102
461
|
tablet: StyleDefinitionSchema.optional(),
|
|
103
462
|
mobile: StyleDefinitionSchema.optional(),
|
|
104
463
|
states: PseudoStateStylesSchema.optional()
|
|
105
464
|
}).passthrough().default({});
|
|
106
|
-
var AnimationConfigSchema =
|
|
107
|
-
type:
|
|
465
|
+
var AnimationConfigSchema = import_zod3.z.object({
|
|
466
|
+
type: import_zod3.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
|
|
108
467
|
message: "Animation type contains a disallowed or unsafe pattern"
|
|
109
468
|
}).optional().default("none"),
|
|
110
|
-
duration:
|
|
111
|
-
delay:
|
|
112
|
-
easing:
|
|
469
|
+
duration: import_zod3.z.number().min(0, "Duration must be non-negative").optional().default(600),
|
|
470
|
+
delay: import_zod3.z.number().min(0, "Delay must be non-negative").optional().default(0),
|
|
471
|
+
easing: import_zod3.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
|
|
113
472
|
message: "Animation easing contains a disallowed or unsafe pattern"
|
|
114
473
|
}).optional().default("ease-out"),
|
|
115
|
-
once:
|
|
116
|
-
hoverEffect:
|
|
474
|
+
once: import_zod3.z.boolean().optional().default(true),
|
|
475
|
+
hoverEffect: import_zod3.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
|
|
117
476
|
message: "Hover effect contains a disallowed or unsafe pattern"
|
|
118
477
|
}).optional().default("none"),
|
|
119
|
-
loopEffect:
|
|
478
|
+
loopEffect: import_zod3.z.string().refine((value) => !DANGEROUS_STYLE_VALUE_PATTERN.test(value), {
|
|
120
479
|
message: "Loop effect contains a disallowed or unsafe pattern"
|
|
121
480
|
}).optional().default("none")
|
|
122
481
|
});
|
|
@@ -129,14 +488,16 @@ var DEFAULT_ANIMATION_CONFIG = {
|
|
|
129
488
|
hoverEffect: "none",
|
|
130
489
|
loopEffect: "none"
|
|
131
490
|
};
|
|
132
|
-
var NodeSchema =
|
|
133
|
-
() =>
|
|
134
|
-
id:
|
|
135
|
-
type:
|
|
136
|
-
props:
|
|
491
|
+
var NodeSchema = import_zod3.z.lazy(
|
|
492
|
+
() => import_zod3.z.object({
|
|
493
|
+
id: import_zod3.z.string().min(1, "Node ID must be a non-empty string"),
|
|
494
|
+
type: import_zod3.z.string().min(1, "Node type must be a non-empty string"),
|
|
495
|
+
props: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional().default({}),
|
|
137
496
|
styles: ResponsiveStylesSchema.optional().default({}),
|
|
138
497
|
animation: AnimationConfigSchema.optional(),
|
|
139
|
-
|
|
498
|
+
actions: import_zod3.z.array(ActionPipelineSchema).optional(),
|
|
499
|
+
formConfig: FormConfigSchema.optional(),
|
|
500
|
+
children: import_zod3.z.array(NodeSchema).optional().default([])
|
|
140
501
|
})
|
|
141
502
|
);
|
|
142
503
|
var RootPageNodeSchema = NodeSchema.refine(
|
|
@@ -146,20 +507,20 @@ var RootPageNodeSchema = NodeSchema.refine(
|
|
|
146
507
|
path: ["type"]
|
|
147
508
|
}
|
|
148
509
|
);
|
|
149
|
-
var DocumentMetadataSchema =
|
|
150
|
-
title:
|
|
151
|
-
description:
|
|
152
|
-
author:
|
|
153
|
-
createdAt:
|
|
154
|
-
updatedAt:
|
|
155
|
-
tags:
|
|
156
|
-
category:
|
|
157
|
-
version:
|
|
158
|
-
custom:
|
|
510
|
+
var DocumentMetadataSchema = import_zod3.z.object({
|
|
511
|
+
title: import_zod3.z.string().min(1, "Title is required").default("Untitled Page"),
|
|
512
|
+
description: import_zod3.z.string().optional().default(""),
|
|
513
|
+
author: import_zod3.z.string().optional().default(""),
|
|
514
|
+
createdAt: import_zod3.z.string().optional(),
|
|
515
|
+
updatedAt: import_zod3.z.string().optional(),
|
|
516
|
+
tags: import_zod3.z.array(import_zod3.z.string()).optional().default([]),
|
|
517
|
+
category: import_zod3.z.string().optional().default("general"),
|
|
518
|
+
version: import_zod3.z.string().optional().default("1.0.0"),
|
|
519
|
+
custom: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional()
|
|
159
520
|
});
|
|
160
|
-
var PageDocumentSchema =
|
|
161
|
-
schema:
|
|
162
|
-
version:
|
|
521
|
+
var PageDocumentSchema = import_zod3.z.object({
|
|
522
|
+
schema: import_zod3.z.literal(SCHEMA_NAME),
|
|
523
|
+
version: import_zod3.z.string().min(1, "Schema version is required").default(CURRENT_SCHEMA_VERSION),
|
|
163
524
|
metadata: DocumentMetadataSchema.optional(),
|
|
164
525
|
document: RootPageNodeSchema
|
|
165
526
|
});
|
|
@@ -206,30 +567,30 @@ function validateNodeIdUniqueness(node) {
|
|
|
206
567
|
}
|
|
207
568
|
|
|
208
569
|
// src/manifest.ts
|
|
209
|
-
var
|
|
210
|
-
var ManifestAssetItemSchema =
|
|
211
|
-
id:
|
|
212
|
-
path:
|
|
213
|
-
mimeType:
|
|
214
|
-
size:
|
|
215
|
-
checksum:
|
|
570
|
+
var import_zod4 = require("zod");
|
|
571
|
+
var ManifestAssetItemSchema = import_zod4.z.object({
|
|
572
|
+
id: import_zod4.z.string().min(1, "Asset ID cannot be empty"),
|
|
573
|
+
path: import_zod4.z.string().min(1, "Asset archive path cannot be empty"),
|
|
574
|
+
mimeType: import_zod4.z.string().min(1, "MIME type cannot be empty"),
|
|
575
|
+
size: import_zod4.z.number().nonnegative("Asset size must be non-negative"),
|
|
576
|
+
checksum: import_zod4.z.string().optional()
|
|
216
577
|
});
|
|
217
|
-
var ManifestSchema =
|
|
218
|
-
schema:
|
|
219
|
-
schemaVersion:
|
|
220
|
-
packageVersion:
|
|
221
|
-
builderCompatibility:
|
|
222
|
-
requiredComponents:
|
|
223
|
-
requiredCapabilities:
|
|
224
|
-
assets:
|
|
225
|
-
createdAt:
|
|
578
|
+
var ManifestSchema = import_zod4.z.object({
|
|
579
|
+
schema: import_zod4.z.literal(SCHEMA_NAME).default(SCHEMA_NAME),
|
|
580
|
+
schemaVersion: import_zod4.z.string().min(1, "Schema version cannot be empty").default("1.0.0"),
|
|
581
|
+
packageVersion: import_zod4.z.string().min(1, "Package version cannot be empty").default("1.0.0"),
|
|
582
|
+
builderCompatibility: import_zod4.z.string().default(">=0.1.0"),
|
|
583
|
+
requiredComponents: import_zod4.z.array(import_zod4.z.string()).default([]),
|
|
584
|
+
requiredCapabilities: import_zod4.z.array(import_zod4.z.string()).default([]),
|
|
585
|
+
assets: import_zod4.z.array(ManifestAssetItemSchema).default([]),
|
|
586
|
+
createdAt: import_zod4.z.string().optional()
|
|
226
587
|
});
|
|
227
588
|
function isManifest(value) {
|
|
228
589
|
return ManifestSchema.safeParse(value).success;
|
|
229
590
|
}
|
|
230
591
|
|
|
231
592
|
// src/template.ts
|
|
232
|
-
var
|
|
593
|
+
var import_zod5 = require("zod");
|
|
233
594
|
var DANGEROUS_URI_PATTERN = /^(javascript:|vbscript:|data:(?!image\/))|<script/i;
|
|
234
595
|
function isSafeThumbnailUrl(url) {
|
|
235
596
|
if (!url || typeof url !== "string") return false;
|
|
@@ -238,49 +599,49 @@ function isSafeThumbnailUrl(url) {
|
|
|
238
599
|
if (DANGEROUS_URI_PATTERN.test(trimmed)) return false;
|
|
239
600
|
return true;
|
|
240
601
|
}
|
|
241
|
-
var SafeThumbnailUrlSchema =
|
|
602
|
+
var SafeThumbnailUrlSchema = import_zod5.z.string().min(1, "Thumbnail URL cannot be empty").refine(
|
|
242
603
|
(url) => isSafeThumbnailUrl(url),
|
|
243
604
|
{ message: "Thumbnail URL contains an unsafe protocol or payload" }
|
|
244
605
|
);
|
|
245
|
-
var SafeThumbnailObjectSchema =
|
|
606
|
+
var SafeThumbnailObjectSchema = import_zod5.z.object({
|
|
246
607
|
url: SafeThumbnailUrlSchema,
|
|
247
|
-
alt:
|
|
248
|
-
width:
|
|
249
|
-
height:
|
|
608
|
+
alt: import_zod5.z.string().optional(),
|
|
609
|
+
width: import_zod5.z.number().positive().optional(),
|
|
610
|
+
height: import_zod5.z.number().positive().optional()
|
|
250
611
|
});
|
|
251
|
-
var SafeThumbnailSchema =
|
|
612
|
+
var SafeThumbnailSchema = import_zod5.z.union([
|
|
252
613
|
AssetReferenceSchema,
|
|
253
614
|
SafeThumbnailObjectSchema,
|
|
254
615
|
SafeThumbnailUrlSchema
|
|
255
616
|
]);
|
|
256
|
-
var TemplatePackageRefSchema =
|
|
257
|
-
path:
|
|
617
|
+
var TemplatePackageRefSchema = import_zod5.z.object({
|
|
618
|
+
path: import_zod5.z.string().optional(),
|
|
258
619
|
url: SafeThumbnailUrlSchema.optional(),
|
|
259
|
-
checksum:
|
|
260
|
-
format:
|
|
620
|
+
checksum: import_zod5.z.string().optional(),
|
|
621
|
+
format: import_zod5.z.enum(["stora", "json"]).default("stora")
|
|
261
622
|
});
|
|
262
|
-
var TemplateRequirementsSchema =
|
|
263
|
-
requiredComponents:
|
|
264
|
-
requiredCapabilities:
|
|
623
|
+
var TemplateRequirementsSchema = import_zod5.z.object({
|
|
624
|
+
requiredComponents: import_zod5.z.array(import_zod5.z.string()).default([]),
|
|
625
|
+
requiredCapabilities: import_zod5.z.array(import_zod5.z.string()).default([])
|
|
265
626
|
});
|
|
266
|
-
var TemplateRecordSchema =
|
|
267
|
-
id:
|
|
268
|
-
name:
|
|
269
|
-
description:
|
|
270
|
-
category:
|
|
271
|
-
tags:
|
|
627
|
+
var TemplateRecordSchema = import_zod5.z.object({
|
|
628
|
+
id: import_zod5.z.string().min(1, "Template ID must be a non-empty string"),
|
|
629
|
+
name: import_zod5.z.string().min(1, "Template name must be a non-empty string"),
|
|
630
|
+
description: import_zod5.z.string().optional().default(""),
|
|
631
|
+
category: import_zod5.z.string().optional().default("general"),
|
|
632
|
+
tags: import_zod5.z.array(import_zod5.z.string()).optional().default([]),
|
|
272
633
|
thumbnail: SafeThumbnailSchema.optional(),
|
|
273
|
-
author:
|
|
274
|
-
version:
|
|
634
|
+
author: import_zod5.z.string().optional().default(""),
|
|
635
|
+
version: import_zod5.z.string().optional().default("1.0.0"),
|
|
275
636
|
document: PageDocumentSchema.optional(),
|
|
276
637
|
packageReference: TemplatePackageRefSchema.optional(),
|
|
277
638
|
requirements: TemplateRequirementsSchema.default({
|
|
278
639
|
requiredComponents: [],
|
|
279
640
|
requiredCapabilities: []
|
|
280
641
|
}),
|
|
281
|
-
createdAt:
|
|
282
|
-
updatedAt:
|
|
283
|
-
custom:
|
|
642
|
+
createdAt: import_zod5.z.string().optional(),
|
|
643
|
+
updatedAt: import_zod5.z.string().optional(),
|
|
644
|
+
custom: import_zod5.z.record(import_zod5.z.string(), import_zod5.z.unknown()).optional()
|
|
284
645
|
});
|
|
285
646
|
function isTemplateRecord(value) {
|
|
286
647
|
return TemplateRecordSchema.safeParse(value).success;
|
|
@@ -600,6 +961,111 @@ var PAGE_DOCUMENT_JSON_SCHEMA_V1 = {
|
|
|
600
961
|
},
|
|
601
962
|
additionalProperties: false
|
|
602
963
|
},
|
|
964
|
+
actionStep: {
|
|
965
|
+
type: "object",
|
|
966
|
+
required: ["id", "type"],
|
|
967
|
+
properties: {
|
|
968
|
+
id: {
|
|
969
|
+
type: "string",
|
|
970
|
+
minLength: 1
|
|
971
|
+
},
|
|
972
|
+
type: {
|
|
973
|
+
type: "string",
|
|
974
|
+
enum: [
|
|
975
|
+
"api_request",
|
|
976
|
+
"navigate",
|
|
977
|
+
"set_state",
|
|
978
|
+
"reset_form",
|
|
979
|
+
"show_toast",
|
|
980
|
+
"open_modal",
|
|
981
|
+
"close_modal",
|
|
982
|
+
"copy_clipboard",
|
|
983
|
+
"custom_event"
|
|
984
|
+
]
|
|
985
|
+
},
|
|
986
|
+
label: { type: "string" },
|
|
987
|
+
payload: { type: "object" },
|
|
988
|
+
condition: {
|
|
989
|
+
type: "object",
|
|
990
|
+
required: ["field", "operator"],
|
|
991
|
+
properties: {
|
|
992
|
+
field: { type: "string", minLength: 1 },
|
|
993
|
+
operator: {
|
|
994
|
+
type: "string",
|
|
995
|
+
enum: [
|
|
996
|
+
"equals",
|
|
997
|
+
"not_equals",
|
|
998
|
+
"contains",
|
|
999
|
+
"not_contains",
|
|
1000
|
+
"is_truthy",
|
|
1001
|
+
"is_falsy",
|
|
1002
|
+
"gt",
|
|
1003
|
+
"gte",
|
|
1004
|
+
"lt",
|
|
1005
|
+
"lte",
|
|
1006
|
+
"regex"
|
|
1007
|
+
]
|
|
1008
|
+
},
|
|
1009
|
+
value: {}
|
|
1010
|
+
},
|
|
1011
|
+
additionalProperties: false
|
|
1012
|
+
},
|
|
1013
|
+
timeout: { type: "number", minimum: 1 },
|
|
1014
|
+
continueOnError: { type: "boolean" },
|
|
1015
|
+
onSuccess: {
|
|
1016
|
+
type: "array",
|
|
1017
|
+
items: { $ref: "#/definitions/actionStep" }
|
|
1018
|
+
},
|
|
1019
|
+
onError: {
|
|
1020
|
+
type: "array",
|
|
1021
|
+
items: { $ref: "#/definitions/actionStep" }
|
|
1022
|
+
}
|
|
1023
|
+
},
|
|
1024
|
+
additionalProperties: false
|
|
1025
|
+
},
|
|
1026
|
+
actionPipeline: {
|
|
1027
|
+
type: "object",
|
|
1028
|
+
required: ["id", "trigger", "steps"],
|
|
1029
|
+
properties: {
|
|
1030
|
+
id: {
|
|
1031
|
+
type: "string",
|
|
1032
|
+
minLength: 1
|
|
1033
|
+
},
|
|
1034
|
+
trigger: {
|
|
1035
|
+
type: "string",
|
|
1036
|
+
enum: ["click", "submit", "change", "blur", "focus", "load"]
|
|
1037
|
+
},
|
|
1038
|
+
label: { type: "string" },
|
|
1039
|
+
debounceMs: { type: "number", minimum: 0 },
|
|
1040
|
+
preventDuplicate: { type: "boolean" },
|
|
1041
|
+
enabled: { type: "boolean", default: true },
|
|
1042
|
+
steps: {
|
|
1043
|
+
type: "array",
|
|
1044
|
+
items: { $ref: "#/definitions/actionStep" },
|
|
1045
|
+
minItems: 1
|
|
1046
|
+
}
|
|
1047
|
+
},
|
|
1048
|
+
additionalProperties: false
|
|
1049
|
+
},
|
|
1050
|
+
formConfig: {
|
|
1051
|
+
type: "object",
|
|
1052
|
+
required: ["formId"],
|
|
1053
|
+
properties: {
|
|
1054
|
+
formId: {
|
|
1055
|
+
type: "string",
|
|
1056
|
+
minLength: 1
|
|
1057
|
+
},
|
|
1058
|
+
resetOnSubmit: { type: "boolean", default: false },
|
|
1059
|
+
scrollToFirstError: { type: "boolean", default: true },
|
|
1060
|
+
validateOn: {
|
|
1061
|
+
type: "string",
|
|
1062
|
+
enum: ["blur", "change", "submit"],
|
|
1063
|
+
default: "blur"
|
|
1064
|
+
},
|
|
1065
|
+
initialValues: { type: "object" }
|
|
1066
|
+
},
|
|
1067
|
+
additionalProperties: false
|
|
1068
|
+
},
|
|
603
1069
|
node: {
|
|
604
1070
|
type: "object",
|
|
605
1071
|
required: ["id", "type"],
|
|
@@ -625,6 +1091,17 @@ var PAGE_DOCUMENT_JSON_SCHEMA_V1 = {
|
|
|
625
1091
|
animation: {
|
|
626
1092
|
$ref: "#/definitions/animationConfig"
|
|
627
1093
|
},
|
|
1094
|
+
actions: {
|
|
1095
|
+
type: "array",
|
|
1096
|
+
items: {
|
|
1097
|
+
$ref: "#/definitions/actionPipeline"
|
|
1098
|
+
},
|
|
1099
|
+
description: "Multi-step action pipelines bound to component events"
|
|
1100
|
+
},
|
|
1101
|
+
formConfig: {
|
|
1102
|
+
$ref: "#/definitions/formConfig",
|
|
1103
|
+
description: "Form container configuration and behavior"
|
|
1104
|
+
},
|
|
628
1105
|
children: {
|
|
629
1106
|
type: "array",
|
|
630
1107
|
items: {
|
|
@@ -961,48 +1438,326 @@ var TEMPLATE_RECORD_JSON_SCHEMA_V1 = {
|
|
|
961
1438
|
function getTemplateRecordJsonSchema() {
|
|
962
1439
|
return TEMPLATE_RECORD_JSON_SCHEMA_V1;
|
|
963
1440
|
}
|
|
1441
|
+
var ACTION_PIPELINE_JSON_SCHEMA_V1 = {
|
|
1442
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
1443
|
+
$id: "https://schema.stora.page/v1/action-pipeline.json",
|
|
1444
|
+
title: "StoraActionPipeline",
|
|
1445
|
+
description: "Action Pipeline schema definition for KUBUILD event workflows",
|
|
1446
|
+
type: "object",
|
|
1447
|
+
required: ["id", "trigger", "steps"],
|
|
1448
|
+
additionalProperties: false,
|
|
1449
|
+
properties: {
|
|
1450
|
+
id: {
|
|
1451
|
+
type: "string",
|
|
1452
|
+
minLength: 1,
|
|
1453
|
+
description: "Unique pipeline identifier"
|
|
1454
|
+
},
|
|
1455
|
+
trigger: {
|
|
1456
|
+
type: "string",
|
|
1457
|
+
enum: ["click", "submit", "change", "blur", "focus", "load"],
|
|
1458
|
+
description: "DOM or component event that triggers the action pipeline"
|
|
1459
|
+
},
|
|
1460
|
+
label: {
|
|
1461
|
+
type: "string",
|
|
1462
|
+
description: "Human readable label for the action pipeline"
|
|
1463
|
+
},
|
|
1464
|
+
debounceMs: {
|
|
1465
|
+
type: "number",
|
|
1466
|
+
minimum: 0,
|
|
1467
|
+
description: "Debounce duration in milliseconds"
|
|
1468
|
+
},
|
|
1469
|
+
preventDuplicate: {
|
|
1470
|
+
type: "boolean",
|
|
1471
|
+
description: "Prevent concurrent duplicate pipeline executions"
|
|
1472
|
+
},
|
|
1473
|
+
enabled: {
|
|
1474
|
+
type: "boolean",
|
|
1475
|
+
default: true,
|
|
1476
|
+
description: "Whether the pipeline is currently active"
|
|
1477
|
+
},
|
|
1478
|
+
steps: {
|
|
1479
|
+
type: "array",
|
|
1480
|
+
items: { $ref: "#/definitions/actionStep" },
|
|
1481
|
+
minItems: 1,
|
|
1482
|
+
description: "Ordered sequence of action steps to execute"
|
|
1483
|
+
}
|
|
1484
|
+
},
|
|
1485
|
+
definitions: {
|
|
1486
|
+
actionStep: {
|
|
1487
|
+
type: "object",
|
|
1488
|
+
required: ["id", "type"],
|
|
1489
|
+
properties: {
|
|
1490
|
+
id: {
|
|
1491
|
+
type: "string",
|
|
1492
|
+
minLength: 1
|
|
1493
|
+
},
|
|
1494
|
+
type: {
|
|
1495
|
+
type: "string",
|
|
1496
|
+
enum: [
|
|
1497
|
+
"api_request",
|
|
1498
|
+
"navigate",
|
|
1499
|
+
"set_state",
|
|
1500
|
+
"reset_form",
|
|
1501
|
+
"show_toast",
|
|
1502
|
+
"open_modal",
|
|
1503
|
+
"close_modal",
|
|
1504
|
+
"copy_clipboard",
|
|
1505
|
+
"custom_event"
|
|
1506
|
+
]
|
|
1507
|
+
},
|
|
1508
|
+
label: { type: "string" },
|
|
1509
|
+
payload: { type: "object" },
|
|
1510
|
+
condition: {
|
|
1511
|
+
type: "object",
|
|
1512
|
+
required: ["field", "operator"],
|
|
1513
|
+
properties: {
|
|
1514
|
+
field: { type: "string", minLength: 1 },
|
|
1515
|
+
operator: {
|
|
1516
|
+
type: "string",
|
|
1517
|
+
enum: [
|
|
1518
|
+
"equals",
|
|
1519
|
+
"not_equals",
|
|
1520
|
+
"contains",
|
|
1521
|
+
"not_contains",
|
|
1522
|
+
"is_truthy",
|
|
1523
|
+
"is_falsy",
|
|
1524
|
+
"gt",
|
|
1525
|
+
"gte",
|
|
1526
|
+
"lt",
|
|
1527
|
+
"lte",
|
|
1528
|
+
"regex"
|
|
1529
|
+
]
|
|
1530
|
+
},
|
|
1531
|
+
value: {}
|
|
1532
|
+
},
|
|
1533
|
+
additionalProperties: false
|
|
1534
|
+
},
|
|
1535
|
+
timeout: { type: "number", minimum: 1 },
|
|
1536
|
+
continueOnError: { type: "boolean" },
|
|
1537
|
+
onSuccess: {
|
|
1538
|
+
type: "array",
|
|
1539
|
+
items: { $ref: "#/definitions/actionStep" }
|
|
1540
|
+
},
|
|
1541
|
+
onError: {
|
|
1542
|
+
type: "array",
|
|
1543
|
+
items: { $ref: "#/definitions/actionStep" }
|
|
1544
|
+
}
|
|
1545
|
+
},
|
|
1546
|
+
additionalProperties: false
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1549
|
+
};
|
|
1550
|
+
function getActionPipelineJsonSchema() {
|
|
1551
|
+
return ACTION_PIPELINE_JSON_SCHEMA_V1;
|
|
1552
|
+
}
|
|
1553
|
+
var FORM_CONFIG_JSON_SCHEMA_V1 = {
|
|
1554
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
1555
|
+
$id: "https://schema.stora.page/v1/form-config.json",
|
|
1556
|
+
title: "StoraFormConfig",
|
|
1557
|
+
description: "Form container configuration and behavior definition for KUBUILD",
|
|
1558
|
+
type: "object",
|
|
1559
|
+
required: ["formId"],
|
|
1560
|
+
additionalProperties: false,
|
|
1561
|
+
properties: {
|
|
1562
|
+
formId: {
|
|
1563
|
+
type: "string",
|
|
1564
|
+
minLength: 1,
|
|
1565
|
+
description: "Unique identifier for the form boundary"
|
|
1566
|
+
},
|
|
1567
|
+
resetOnSubmit: {
|
|
1568
|
+
type: "boolean",
|
|
1569
|
+
default: false,
|
|
1570
|
+
description: "Whether to reset form field values after successful submission"
|
|
1571
|
+
},
|
|
1572
|
+
scrollToFirstError: {
|
|
1573
|
+
type: "boolean",
|
|
1574
|
+
default: true,
|
|
1575
|
+
description: "Auto-scroll viewport to the first invalid input on validation failure"
|
|
1576
|
+
},
|
|
1577
|
+
validateOn: {
|
|
1578
|
+
type: "string",
|
|
1579
|
+
enum: ["blur", "change", "submit"],
|
|
1580
|
+
default: "blur",
|
|
1581
|
+
description: "Default trigger event for field validation evaluation"
|
|
1582
|
+
},
|
|
1583
|
+
initialValues: {
|
|
1584
|
+
type: "object",
|
|
1585
|
+
description: "Initial state values populated in form fields"
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
};
|
|
1589
|
+
function getFormConfigJsonSchema() {
|
|
1590
|
+
return FORM_CONFIG_JSON_SCHEMA_V1;
|
|
1591
|
+
}
|
|
1592
|
+
var FORM_FIELD_BINDING_JSON_SCHEMA_V1 = {
|
|
1593
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
1594
|
+
$id: "https://schema.stora.page/v1/form-field-binding.json",
|
|
1595
|
+
title: "StoraFormFieldBinding",
|
|
1596
|
+
description: "Form field binding definition connecting input elements to form state runtime",
|
|
1597
|
+
type: "object",
|
|
1598
|
+
required: ["name"],
|
|
1599
|
+
additionalProperties: false,
|
|
1600
|
+
properties: {
|
|
1601
|
+
name: {
|
|
1602
|
+
type: "string",
|
|
1603
|
+
minLength: 1,
|
|
1604
|
+
description: "Field state property key"
|
|
1605
|
+
},
|
|
1606
|
+
label: {
|
|
1607
|
+
type: "string",
|
|
1608
|
+
description: "Display label for the field"
|
|
1609
|
+
},
|
|
1610
|
+
defaultValue: {
|
|
1611
|
+
description: "Initial default value if not overridden by form initialValues"
|
|
1612
|
+
},
|
|
1613
|
+
rules: {
|
|
1614
|
+
type: "array",
|
|
1615
|
+
items: { $ref: "#/definitions/validationRule" },
|
|
1616
|
+
default: [],
|
|
1617
|
+
description: "Validation rules applied to the field value"
|
|
1618
|
+
},
|
|
1619
|
+
validateOn: {
|
|
1620
|
+
type: "string",
|
|
1621
|
+
enum: ["blur", "change", "submit"],
|
|
1622
|
+
default: "blur",
|
|
1623
|
+
description: "Field-specific validation trigger timing"
|
|
1624
|
+
},
|
|
1625
|
+
transform: {
|
|
1626
|
+
type: "string",
|
|
1627
|
+
enum: ["trim", "lowercase", "uppercase", "number"],
|
|
1628
|
+
description: "Value transformation applied prior to validation and state storage"
|
|
1629
|
+
},
|
|
1630
|
+
disabled: {
|
|
1631
|
+
type: "boolean",
|
|
1632
|
+
description: "Whether the field is disabled"
|
|
1633
|
+
},
|
|
1634
|
+
required: {
|
|
1635
|
+
type: "boolean",
|
|
1636
|
+
description: "Whether the field is required (shorthand rule)"
|
|
1637
|
+
}
|
|
1638
|
+
},
|
|
1639
|
+
definitions: {
|
|
1640
|
+
validationRule: {
|
|
1641
|
+
type: "object",
|
|
1642
|
+
required: ["type", "message"],
|
|
1643
|
+
properties: {
|
|
1644
|
+
type: {
|
|
1645
|
+
type: "string",
|
|
1646
|
+
enum: [
|
|
1647
|
+
"required",
|
|
1648
|
+
"email",
|
|
1649
|
+
"url",
|
|
1650
|
+
"min_length",
|
|
1651
|
+
"max_length",
|
|
1652
|
+
"numeric_min",
|
|
1653
|
+
"numeric_max",
|
|
1654
|
+
"pattern",
|
|
1655
|
+
"match_field",
|
|
1656
|
+
"custom_regex"
|
|
1657
|
+
]
|
|
1658
|
+
},
|
|
1659
|
+
value: {},
|
|
1660
|
+
message: {
|
|
1661
|
+
type: "string",
|
|
1662
|
+
minLength: 1
|
|
1663
|
+
}
|
|
1664
|
+
},
|
|
1665
|
+
additionalProperties: false
|
|
1666
|
+
}
|
|
1667
|
+
}
|
|
1668
|
+
};
|
|
1669
|
+
function getFormFieldBindingJsonSchema() {
|
|
1670
|
+
return FORM_FIELD_BINDING_JSON_SCHEMA_V1;
|
|
1671
|
+
}
|
|
964
1672
|
// Annotate the CommonJS export names for ESM import in node:
|
|
965
1673
|
0 && (module.exports = {
|
|
1674
|
+
ACTION_PIPELINE_JSON_SCHEMA_V1,
|
|
966
1675
|
ActionBindingSchema,
|
|
1676
|
+
ActionPipelineSchema,
|
|
1677
|
+
ActionStepConditionSchema,
|
|
1678
|
+
ActionStepSchema,
|
|
1679
|
+
ActionStepTypeSchema,
|
|
1680
|
+
ActionTriggerSchema,
|
|
1681
|
+
ActionTriggerTypeSchema,
|
|
967
1682
|
AnimationConfigSchema,
|
|
1683
|
+
ApiRequestStepPayloadSchema,
|
|
968
1684
|
AssetReferenceSchema,
|
|
969
1685
|
CURRENT_SCHEMA_VERSION,
|
|
1686
|
+
CloseModalStepPayloadSchema,
|
|
1687
|
+
ConditionOperatorSchema,
|
|
1688
|
+
CopyClipboardStepPayloadSchema,
|
|
1689
|
+
CustomEventStepPayloadSchema,
|
|
970
1690
|
DEFAULT_ANIMATION_CONFIG,
|
|
971
1691
|
DocumentMetadataSchema,
|
|
1692
|
+
FORM_CONFIG_JSON_SCHEMA_V1,
|
|
1693
|
+
FORM_FIELD_BINDING_JSON_SCHEMA_V1,
|
|
1694
|
+
FormConfigSchema,
|
|
1695
|
+
FormFieldBindingSchema,
|
|
972
1696
|
MANIFEST_JSON_SCHEMA_V1,
|
|
973
1697
|
ManifestAssetItemSchema,
|
|
974
1698
|
ManifestSchema,
|
|
1699
|
+
NavigateStepPayloadSchema,
|
|
975
1700
|
NodeSchema,
|
|
1701
|
+
OpenModalStepPayloadSchema,
|
|
976
1702
|
PAGE_DOCUMENT_JSON_SCHEMA_V1,
|
|
977
1703
|
PageDocumentSchema,
|
|
978
1704
|
PseudoStateStylesSchema,
|
|
1705
|
+
ResetFormStepPayloadSchema,
|
|
979
1706
|
ResponsiveStylesSchema,
|
|
980
1707
|
RootPageNodeSchema,
|
|
981
1708
|
SCHEMA_NAME,
|
|
982
1709
|
SafeThumbnailObjectSchema,
|
|
983
1710
|
SafeThumbnailSchema,
|
|
984
1711
|
SafeThumbnailUrlSchema,
|
|
1712
|
+
SetStateStepPayloadSchema,
|
|
1713
|
+
ShowToastStepPayloadSchema,
|
|
1714
|
+
StepPayloadSchemas,
|
|
985
1715
|
StyleDefinitionSchema,
|
|
986
1716
|
StyleValueSchema,
|
|
987
1717
|
TEMPLATE_RECORD_JSON_SCHEMA_V1,
|
|
988
1718
|
TemplatePackageRefSchema,
|
|
989
1719
|
TemplateRecordSchema,
|
|
990
1720
|
TemplateRequirementsSchema,
|
|
1721
|
+
ValidateOnEventSchema,
|
|
1722
|
+
ValidationRuleSchema,
|
|
1723
|
+
ValidationRuleTypeSchema,
|
|
991
1724
|
VariableBindingSchema,
|
|
992
1725
|
collectNodeIds,
|
|
993
1726
|
generateDeterministicNodeId,
|
|
1727
|
+
getActionPipelineJsonSchema,
|
|
1728
|
+
getFormConfigJsonSchema,
|
|
1729
|
+
getFormFieldBindingJsonSchema,
|
|
994
1730
|
getManifestJsonSchema,
|
|
995
1731
|
getPageDocumentJsonSchema,
|
|
996
1732
|
getTemplateRecordJsonSchema,
|
|
997
1733
|
isActionBinding,
|
|
1734
|
+
isActionPipeline,
|
|
1735
|
+
isActionStep,
|
|
1736
|
+
isActionStepCondition,
|
|
1737
|
+
isActionStepType,
|
|
1738
|
+
isActionTriggerType,
|
|
998
1739
|
isAnimationConfig,
|
|
999
1740
|
isAssetReference,
|
|
1741
|
+
isConditionOperator,
|
|
1742
|
+
isFormConfig,
|
|
1743
|
+
isFormFieldBinding,
|
|
1000
1744
|
isManifest,
|
|
1745
|
+
isSafeActionUrl,
|
|
1001
1746
|
isSafeThumbnail,
|
|
1002
1747
|
isSafeThumbnailUrl,
|
|
1003
1748
|
isTemplateRecord,
|
|
1749
|
+
isValidateOnEvent,
|
|
1750
|
+
isValidationRule,
|
|
1751
|
+
isValidationRuleType,
|
|
1004
1752
|
isVariableBinding,
|
|
1753
|
+
sanitizeActionPayload,
|
|
1754
|
+
sanitizeActionPipeline,
|
|
1755
|
+
sanitizeActionStep,
|
|
1756
|
+
sanitizeActionString,
|
|
1757
|
+
sanitizeActionUrl,
|
|
1758
|
+
sanitizeActionValue,
|
|
1005
1759
|
starterPageFixture,
|
|
1760
|
+
validateActionStepPayload,
|
|
1006
1761
|
validateNodeIdUniqueness
|
|
1007
1762
|
});
|
|
1008
1763
|
//# sourceMappingURL=index.cjs.map
|