@bwlng/blocks 0.1.0-fork.2e294b1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-DAttVLF0.js","names":[],"sources":["../src/builders.ts","../src/validation.ts"],"sourcesContent":["import type {\n\tActionsBlock,\n\tBannerBlock,\n\tBlock,\n\tButtonElement,\n\tCheckboxElement,\n\tChartBlock,\n\tChartSeries,\n\tCodeBlock,\n\tComboboxElement,\n\tColumnsBlock,\n\tConfirmDialog,\n\tContextBlock,\n\tDateInputElement,\n\tRadioElement,\n\tDividerBlock,\n\tElement,\n\tFieldsBlock,\n\tFormBlock,\n\tFormField,\n\tHeaderBlock,\n\tImageBlock,\n\tMeterBlock,\n\tNumberInputElement,\n\tSecretInputElement,\n\tSectionBlock,\n\tSelectElement,\n\tStatItem,\n\tStatsBlock,\n\tTableBlock,\n\tTableColumn,\n\tTextInputElement,\n\tToggleElement,\n} from \"./types.js\";\n\n// ── Block Builders ───────────────────────────────────────────────────────────\n\nfunction header(text: string, opts?: { blockId?: string }): HeaderBlock {\n\treturn {\n\t\ttype: \"header\",\n\t\ttext,\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction section(text: string, opts?: { accessory?: Element; blockId?: string }): SectionBlock {\n\treturn {\n\t\ttype: \"section\",\n\t\ttext,\n\t\t...(opts?.accessory !== undefined && { accessory: opts.accessory }),\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction divider(opts?: { blockId?: string }): DividerBlock {\n\treturn {\n\t\ttype: \"divider\",\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction fieldsBlock(\n\tfields: Array<{ label: string; value: string }>,\n\topts?: { blockId?: string },\n): FieldsBlock {\n\treturn {\n\t\ttype: \"fields\",\n\t\tfields,\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction table(opts: {\n\tblockId?: string;\n\tcolumns: TableColumn[];\n\trows: Array<Record<string, unknown>>;\n\tnextCursor?: string;\n\tpageActionId: string;\n\temptyText?: string;\n}): TableBlock {\n\treturn {\n\t\ttype: \"table\",\n\t\tcolumns: opts.columns,\n\t\trows: opts.rows,\n\t\tpage_action_id: opts.pageActionId,\n\t\t...(opts.nextCursor !== undefined && { next_cursor: opts.nextCursor }),\n\t\t...(opts.emptyText !== undefined && { empty_text: opts.emptyText }),\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction actionsBlock(elements: Element[], opts?: { blockId?: string }): ActionsBlock {\n\treturn {\n\t\ttype: \"actions\",\n\t\telements,\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction stats(items: StatItem[], opts?: { blockId?: string }): StatsBlock {\n\treturn {\n\t\ttype: \"stats\",\n\t\titems,\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction form(opts: {\n\tblockId?: string;\n\tfields: FormField[];\n\tsubmit: { label: string; actionId: string };\n}): FormBlock {\n\treturn {\n\t\ttype: \"form\",\n\t\tfields: opts.fields,\n\t\tsubmit: { label: opts.submit.label, action_id: opts.submit.actionId },\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction image(opts: { url: string; alt: string; title?: string; blockId?: string }): ImageBlock {\n\treturn {\n\t\ttype: \"image\",\n\t\turl: opts.url,\n\t\talt: opts.alt,\n\t\t...(opts.title !== undefined && { title: opts.title }),\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction context(text: string, opts?: { blockId?: string }): ContextBlock {\n\treturn {\n\t\ttype: \"context\",\n\t\ttext,\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction columnsBlock(columns: Block[][], opts?: { blockId?: string }): ColumnsBlock {\n\treturn {\n\t\ttype: \"columns\",\n\t\tcolumns,\n\t\t...(opts?.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction bannerBlock(\n\topts: {\n\t\tblockId?: string;\n\t\tvariant?: \"default\" | \"alert\" | \"error\";\n\t} & ({ title: string; description?: string } | { title?: string; description: string }),\n): BannerBlock {\n\treturn {\n\t\ttype: \"banner\",\n\t\t...(opts.title !== undefined && { title: opts.title }),\n\t\t...(opts.description !== undefined && { description: opts.description }),\n\t\t...(opts.variant !== undefined && { variant: opts.variant }),\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\n// ── Element Builders ─────────────────────────────────────────────────────────\n\nfunction textInput(\n\tactionId: string,\n\tlabel: string,\n\topts?: {\n\t\tplaceholder?: string;\n\t\tinitialValue?: string;\n\t\tmultiline?: boolean;\n\t},\n): TextInputElement {\n\treturn {\n\t\ttype: \"text_input\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\t...(opts?.placeholder !== undefined && { placeholder: opts.placeholder }),\n\t\t...(opts?.initialValue !== undefined && {\n\t\t\tinitial_value: opts.initialValue,\n\t\t}),\n\t\t...(opts?.multiline !== undefined && { multiline: opts.multiline }),\n\t};\n}\n\nfunction numberInput(\n\tactionId: string,\n\tlabel: string,\n\topts?: { initialValue?: number; min?: number; max?: number },\n): NumberInputElement {\n\treturn {\n\t\ttype: \"number_input\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\t...(opts?.initialValue !== undefined && {\n\t\t\tinitial_value: opts.initialValue,\n\t\t}),\n\t\t...(opts?.min !== undefined && { min: opts.min }),\n\t\t...(opts?.max !== undefined && { max: opts.max }),\n\t};\n}\n\nfunction select(\n\tactionId: string,\n\tlabel: string,\n\toptions: Array<{ label: string; value: string }>,\n\topts?: { initialValue?: string },\n): SelectElement {\n\treturn {\n\t\ttype: \"select\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\toptions,\n\t\t...(opts?.initialValue !== undefined && {\n\t\t\tinitial_value: opts.initialValue,\n\t\t}),\n\t};\n}\n\nfunction toggle(\n\tactionId: string,\n\tlabel: string,\n\topts?: { description?: string; initialValue?: boolean },\n): ToggleElement {\n\treturn {\n\t\ttype: \"toggle\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\t...(opts?.description !== undefined && { description: opts.description }),\n\t\t...(opts?.initialValue !== undefined && {\n\t\t\tinitial_value: opts.initialValue,\n\t\t}),\n\t};\n}\n\nfunction button(\n\tactionId: string,\n\tlabel: string,\n\topts?: {\n\t\tstyle?: \"primary\" | \"danger\" | \"secondary\";\n\t\tvalue?: unknown;\n\t\tconfirm?: ConfirmDialog;\n\t},\n): ButtonElement {\n\treturn {\n\t\ttype: \"button\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\t...(opts?.style !== undefined && { style: opts.style }),\n\t\t...(opts?.value !== undefined && { value: opts.value }),\n\t\t...(opts?.confirm !== undefined && { confirm: opts.confirm }),\n\t};\n}\n\nfunction secretInput(\n\tactionId: string,\n\tlabel: string,\n\topts?: { placeholder?: string; hasValue?: boolean },\n): SecretInputElement {\n\treturn {\n\t\ttype: \"secret_input\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\t...(opts?.placeholder !== undefined && { placeholder: opts.placeholder }),\n\t\t...(opts?.hasValue !== undefined && { has_value: opts.hasValue }),\n\t};\n}\n\nfunction checkbox(\n\tactionId: string,\n\tlabel: string,\n\toptions: Array<{ label: string; value: string }>,\n\topts?: { initialValue?: string[] },\n): CheckboxElement {\n\treturn {\n\t\ttype: \"checkbox\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\toptions,\n\t\t...(opts?.initialValue !== undefined && { initial_value: opts.initialValue }),\n\t};\n}\n\nfunction dateInput(\n\tactionId: string,\n\tlabel: string,\n\topts?: { initialValue?: string; placeholder?: string },\n): DateInputElement {\n\treturn {\n\t\ttype: \"date_input\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\t...(opts?.initialValue !== undefined && { initial_value: opts.initialValue }),\n\t\t...(opts?.placeholder !== undefined && { placeholder: opts.placeholder }),\n\t};\n}\n\nfunction combobox(\n\tactionId: string,\n\tlabel: string,\n\toptions: Array<{ label: string; value: string }>,\n\topts?: { initialValue?: string; placeholder?: string },\n): ComboboxElement {\n\treturn {\n\t\ttype: \"combobox\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\toptions,\n\t\t...(opts?.initialValue !== undefined && { initial_value: opts.initialValue }),\n\t\t...(opts?.placeholder !== undefined && { placeholder: opts.placeholder }),\n\t};\n}\n\nfunction radio(\n\tactionId: string,\n\tlabel: string,\n\toptions: Array<{ label: string; value: string }>,\n\topts?: { initialValue?: string },\n): RadioElement {\n\treturn {\n\t\ttype: \"radio\",\n\t\taction_id: actionId,\n\t\tlabel,\n\t\toptions,\n\t\t...(opts?.initialValue !== undefined && { initial_value: opts.initialValue }),\n\t};\n}\n\nfunction timeseriesChart(opts: {\n\tblockId?: string;\n\tseries: ChartSeries[];\n\tstyle?: \"line\" | \"bar\";\n\txAxisName?: string;\n\tyAxisName?: string;\n\theight?: number;\n\tgradient?: boolean;\n}): ChartBlock {\n\treturn {\n\t\ttype: \"chart\",\n\t\tconfig: {\n\t\t\tchart_type: \"timeseries\",\n\t\t\tseries: opts.series,\n\t\t\t...(opts.style !== undefined && { style: opts.style }),\n\t\t\t...(opts.xAxisName !== undefined && { x_axis_name: opts.xAxisName }),\n\t\t\t...(opts.yAxisName !== undefined && { y_axis_name: opts.yAxisName }),\n\t\t\t...(opts.height !== undefined && { height: opts.height }),\n\t\t\t...(opts.gradient !== undefined && { gradient: opts.gradient }),\n\t\t},\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction customChart(opts: {\n\tblockId?: string;\n\toptions: Record<string, unknown>;\n\theight?: number;\n}): ChartBlock {\n\treturn {\n\t\ttype: \"chart\",\n\t\tconfig: {\n\t\t\tchart_type: \"custom\",\n\t\t\toptions: opts.options,\n\t\t\t...(opts.height !== undefined && { height: opts.height }),\n\t\t},\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction meter(opts: {\n\tblockId?: string;\n\tlabel: string;\n\tvalue: number;\n\tmax?: number;\n\tmin?: number;\n\tcustomValue?: string;\n}): MeterBlock {\n\treturn {\n\t\ttype: \"meter\",\n\t\tlabel: opts.label,\n\t\tvalue: opts.value,\n\t\t...(opts.max !== undefined && { max: opts.max }),\n\t\t...(opts.min !== undefined && { min: opts.min }),\n\t\t...(opts.customValue !== undefined && { custom_value: opts.customValue }),\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\nfunction codeBlock(opts: {\n\tblockId?: string;\n\tcode: string;\n\tlanguage?: \"ts\" | \"tsx\" | \"jsonc\" | \"bash\" | \"css\";\n}): CodeBlock {\n\treturn {\n\t\ttype: \"code\",\n\t\tcode: opts.code,\n\t\t...(opts.language !== undefined && { language: opts.language }),\n\t\t...(opts.blockId !== undefined && { block_id: opts.blockId }),\n\t};\n}\n\n// ── Exports ──────────────────────────────────────────────────────────────────\n\nexport const blocks = {\n\theader,\n\tsection,\n\tdivider,\n\tfields: fieldsBlock,\n\ttable,\n\tactions: actionsBlock,\n\tstats,\n\tform,\n\timage,\n\tcontext,\n\tcolumns: columnsBlock,\n\ttimeseriesChart,\n\tcustomChart,\n\tbanner: bannerBlock,\n\tmeter,\n\tcode: codeBlock,\n};\n\nexport const elements = {\n\ttextInput,\n\tnumberInput,\n\tselect,\n\ttoggle,\n\tbutton,\n\tsecretInput,\n\tcheckbox,\n\tcombobox,\n\tdateInput,\n\tradio,\n};\n","const BLOCK_TYPES = new Set([\n\t\"header\",\n\t\"section\",\n\t\"divider\",\n\t\"fields\",\n\t\"table\",\n\t\"actions\",\n\t\"stats\",\n\t\"form\",\n\t\"image\",\n\t\"context\",\n\t\"columns\",\n\t\"chart\",\n\t\"banner\",\n\t\"meter\",\n\t\"code\",\n]);\n\nconst ELEMENT_TYPES = new Set([\n\t\"button\",\n\t\"text_input\",\n\t\"number_input\",\n\t\"select\",\n\t\"toggle\",\n\t\"secret_input\",\n\t\"checkbox\",\n\t\"radio\",\n\t\"date_input\",\n\t\"combobox\",\n]);\n\nconst COLUMN_FORMATS = new Set([\"text\", \"badge\", \"relative_time\", \"number\", \"code\"]);\n\nconst CODE_LANGUAGES = new Set([\"ts\", \"tsx\", \"jsonc\", \"bash\", \"css\"]);\n\nconst BUTTON_STYLES = new Set([\"primary\", \"danger\", \"secondary\"]);\nconst TREND_VALUES = new Set([\"up\", \"down\", \"neutral\"]);\nconst BANNER_VARIANTS = new Set([\"default\", \"alert\", \"error\"]);\n\n/**\n * Validate option uniqueness and that initial_value references a valid option.\n * Used by select, radio, combobox, and checkbox element validation.\n */\nfunction validateOptionValues(\n\toptions: unknown[],\n\tpath: string,\n\terrors: ValidationError[],\n): Set<string> {\n\tconst seen = new Set<string>();\n\tfor (let i = 0; i < options.length; i++) {\n\t\tconst opt = options[i];\n\t\tif (isRecord(opt) && typeof opt.value === \"string\") {\n\t\t\tif (seen.has(opt.value)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}[${i}].value`,\n\t\t\t\t\tmessage: `Duplicate option value '${opt.value}'`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tseen.add(opt.value);\n\t\t}\n\t}\n\treturn seen;\n}\n\nfunction validateInitialValueInOptions(\n\tinitialValue: unknown,\n\tvalidValues: Set<string>,\n\tpath: string,\n\terrors: ValidationError[],\n): void {\n\tif (typeof initialValue === \"string\" && validValues.size > 0 && !validValues.has(initialValue)) {\n\t\terrors.push({\n\t\t\tpath: `${path}.initial_value`,\n\t\t\tmessage: `initial_value '${initialValue}' does not match any option value`,\n\t\t});\n\t}\n}\n\ninterface ValidationError {\n\tpath: string;\n\tmessage: string;\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n\treturn typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction validateConfirmDialog(value: unknown, path: string, errors: ValidationError[]): void {\n\tif (!isRecord(value)) {\n\t\terrors.push({ path, message: \"Confirm dialog must be an object\" });\n\t\treturn;\n\t}\n\tif (typeof value.title !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.title`,\n\t\t\tmessage: \"Required field 'title' must be a string\",\n\t\t});\n\t}\n\tif (typeof value.text !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.text`,\n\t\t\tmessage: \"Required field 'text' must be a string\",\n\t\t});\n\t}\n\tif (typeof value.confirm !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.confirm`,\n\t\t\tmessage: \"Required field 'confirm' must be a string\",\n\t\t});\n\t}\n\tif (typeof value.deny !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.deny`,\n\t\t\tmessage: \"Required field 'deny' must be a string\",\n\t\t});\n\t}\n\tif (value.style !== undefined && value.style !== \"danger\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.style`,\n\t\t\tmessage: \"Field 'style' must be \\\"danger\\\" if provided\",\n\t\t});\n\t}\n}\n\nfunction validateElement(value: unknown, path: string, errors: ValidationError[]): void {\n\tif (!isRecord(value)) {\n\t\terrors.push({ path, message: \"Element must be an object\" });\n\t\treturn;\n\t}\n\n\tconst type = value.type;\n\tif (typeof type !== \"string\" || !ELEMENT_TYPES.has(type)) {\n\t\terrors.push({\n\t\t\tpath: `${path}.type`,\n\t\t\tmessage: `Unknown element type '${String(type)}'. Expected one of: ${[...ELEMENT_TYPES].join(\", \")}`,\n\t\t});\n\t\treturn;\n\t}\n\n\tif (typeof value.action_id !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.action_id`,\n\t\t\tmessage: \"Required field 'action_id' must be a string\",\n\t\t});\n\t}\n\tif (typeof value.label !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.label`,\n\t\t\tmessage: \"Required field 'label' must be a string\",\n\t\t});\n\t}\n\n\tswitch (type) {\n\t\tcase \"button\": {\n\t\t\tif (\n\t\t\t\tvalue.style !== undefined &&\n\t\t\t\t(typeof value.style !== \"string\" || !BUTTON_STYLES.has(value.style))\n\t\t\t) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.style`,\n\t\t\t\t\tmessage: `Field 'style' must be one of: ${[...BUTTON_STYLES].join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.confirm !== undefined) {\n\t\t\t\tvalidateConfirmDialog(value.confirm, `${path}.confirm`, errors);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text_input\": {\n\t\t\tif (value.placeholder !== undefined && typeof value.placeholder !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.placeholder`,\n\t\t\t\t\tmessage: \"Field 'placeholder' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined && typeof value.initial_value !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\tmessage: \"Field 'initial_value' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.multiline !== undefined && typeof value.multiline !== \"boolean\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.multiline`,\n\t\t\t\t\tmessage: \"Field 'multiline' must be a boolean\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"number_input\": {\n\t\t\tif (value.initial_value !== undefined && typeof value.initial_value !== \"number\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\tmessage: \"Field 'initial_value' must be a number\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.min !== undefined && typeof value.min !== \"number\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.min`,\n\t\t\t\t\tmessage: \"Field 'min' must be a number\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.max !== undefined && typeof value.max !== \"number\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.max`,\n\t\t\t\t\tmessage: \"Field 'max' must be a number\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"select\": {\n\t\t\tlet selectValidValues = new Set<string>();\n\t\t\tif (!Array.isArray(value.options)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.options`,\n\t\t\t\t\tmessage: \"Required field 'options' must be an array\",\n\t\t\t\t});\n\t\t\t} else if (value.options.length === 0) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.options`,\n\t\t\t\t\tmessage: \"Field 'options' must not be empty\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.options.length; i++) {\n\t\t\t\t\tconst opt = value.options[i] as unknown;\n\t\t\t\t\tif (!isRecord(opt)) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}]`,\n\t\t\t\t\t\t\tmessage: \"Option must be an object\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.label !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].label`,\n\t\t\t\t\t\t\tmessage: \"Option 'label' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.value !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].value`,\n\t\t\t\t\t\t\tmessage: \"Option 'value' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tselectValidValues = validateOptionValues(value.options, `${path}.options`, errors);\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined && typeof value.initial_value !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\tmessage: \"Field 'initial_value' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined) {\n\t\t\t\tvalidateInitialValueInOptions(value.initial_value, selectValidValues, path, errors);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"toggle\": {\n\t\t\tif (value.description !== undefined && typeof value.description !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.description`,\n\t\t\t\t\tmessage: \"Field 'description' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined && typeof value.initial_value !== \"boolean\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\tmessage: \"Field 'initial_value' must be a boolean\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"secret_input\": {\n\t\t\tif (value.placeholder !== undefined && typeof value.placeholder !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.placeholder`,\n\t\t\t\t\tmessage: \"Field 'placeholder' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.has_value !== undefined && typeof value.has_value !== \"boolean\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.has_value`,\n\t\t\t\t\tmessage: \"Field 'has_value' must be a boolean\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"checkbox\": {\n\t\t\tlet checkboxValidValues = new Set<string>();\n\t\t\tif (!Array.isArray(value.options)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.options`,\n\t\t\t\t\tmessage: \"Required field 'options' must be an array\",\n\t\t\t\t});\n\t\t\t} else if (value.options.length === 0) {\n\t\t\t\terrors.push({ path: `${path}.options`, message: \"Field 'options' must not be empty\" });\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.options.length; i++) {\n\t\t\t\t\tconst opt = value.options[i] as unknown;\n\t\t\t\t\tif (!isRecord(opt)) {\n\t\t\t\t\t\terrors.push({ path: `${path}.options[${i}]`, message: \"Option must be an object\" });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.label !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].label`,\n\t\t\t\t\t\t\tmessage: \"Option 'label' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.value !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].value`,\n\t\t\t\t\t\t\tmessage: \"Option 'value' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcheckboxValidValues = validateOptionValues(value.options, `${path}.options`, errors);\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined) {\n\t\t\t\tif (!Array.isArray(value.initial_value)) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\t\tmessage: \"Field 'initial_value' must be an array of strings\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 0; i < value.initial_value.length; i++) {\n\t\t\t\t\t\tconst item = value.initial_value[i];\n\t\t\t\t\t\tif (typeof item !== \"string\") {\n\t\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\t\tpath: `${path}.initial_value[${i}]`,\n\t\t\t\t\t\t\t\tmessage: \"Each initial_value entry must be a string\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (checkboxValidValues.size > 0 && !checkboxValidValues.has(item)) {\n\t\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\t\tpath: `${path}.initial_value[${i}]`,\n\t\t\t\t\t\t\t\tmessage: `initial_value '${item}' does not match any option value`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"radio\": {\n\t\t\tlet radioValidValues = new Set<string>();\n\t\t\tif (!Array.isArray(value.options)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.options`,\n\t\t\t\t\tmessage: \"Required field 'options' must be an array\",\n\t\t\t\t});\n\t\t\t} else if (value.options.length === 0) {\n\t\t\t\terrors.push({ path: `${path}.options`, message: \"Field 'options' must not be empty\" });\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.options.length; i++) {\n\t\t\t\t\tconst opt = value.options[i] as unknown;\n\t\t\t\t\tif (!isRecord(opt)) {\n\t\t\t\t\t\terrors.push({ path: `${path}.options[${i}]`, message: \"Option must be an object\" });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.label !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].label`,\n\t\t\t\t\t\t\tmessage: \"Option 'label' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.value !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].value`,\n\t\t\t\t\t\t\tmessage: \"Option 'value' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tradioValidValues = validateOptionValues(value.options, `${path}.options`, errors);\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined && typeof value.initial_value !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\tmessage: \"Field 'initial_value' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined) {\n\t\t\t\tvalidateInitialValueInOptions(value.initial_value, radioValidValues, path, errors);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"date_input\": {\n\t\t\tif (value.initial_value !== undefined && typeof value.initial_value !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\tmessage: \"Field 'initial_value' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.placeholder !== undefined && typeof value.placeholder !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.placeholder`,\n\t\t\t\t\tmessage: \"Field 'placeholder' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"combobox\": {\n\t\t\tlet comboboxValidValues = new Set<string>();\n\t\t\tif (!Array.isArray(value.options)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.options`,\n\t\t\t\t\tmessage: \"Required field 'options' must be an array\",\n\t\t\t\t});\n\t\t\t} else if (value.options.length === 0) {\n\t\t\t\terrors.push({ path: `${path}.options`, message: \"Field 'options' must not be empty\" });\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.options.length; i++) {\n\t\t\t\t\tconst opt = value.options[i] as unknown;\n\t\t\t\t\tif (!isRecord(opt)) {\n\t\t\t\t\t\terrors.push({ path: `${path}.options[${i}]`, message: \"Option must be an object\" });\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.label !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].label`,\n\t\t\t\t\t\t\tmessage: \"Option 'label' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof opt.value !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.options[${i}].value`,\n\t\t\t\t\t\t\tmessage: \"Option 'value' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcomboboxValidValues = validateOptionValues(value.options, `${path}.options`, errors);\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined && typeof value.initial_value !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.initial_value`,\n\t\t\t\t\tmessage: \"Field 'initial_value' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.initial_value !== undefined) {\n\t\t\t\tvalidateInitialValueInOptions(value.initial_value, comboboxValidValues, path, errors);\n\t\t\t}\n\t\t\tif (value.placeholder !== undefined && typeof value.placeholder !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.placeholder`,\n\t\t\t\t\tmessage: \"Field 'placeholder' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction validateFormField(value: unknown, path: string, errors: ValidationError[]): void {\n\tvalidateElement(value, path, errors);\n\n\tif (!isRecord(value)) return;\n\n\tif (value.condition !== undefined) {\n\t\tconst cond = value.condition;\n\t\tif (!isRecord(cond)) {\n\t\t\terrors.push({\n\t\t\t\tpath: `${path}.condition`,\n\t\t\t\tmessage: \"Field 'condition' must be an object\",\n\t\t\t});\n\t\t} else if (typeof cond.field !== \"string\") {\n\t\t\terrors.push({\n\t\t\t\tpath: `${path}.condition.field`,\n\t\t\t\tmessage: \"Condition 'field' must be a string\",\n\t\t\t});\n\t\t} else if (!(\"eq\" in cond) && !(\"neq\" in cond)) {\n\t\t\terrors.push({\n\t\t\t\tpath: `${path}.condition`,\n\t\t\t\tmessage: \"Condition must have either 'eq' or 'neq'\",\n\t\t\t});\n\t\t}\n\t}\n}\n\nconst CHART_TYPES = new Set([\"timeseries\", \"custom\"]);\nconst CHART_STYLES = new Set([\"line\", \"bar\"]);\n\nfunction validateChartSeries(value: unknown, path: string, errors: ValidationError[]): void {\n\tif (!isRecord(value)) {\n\t\terrors.push({ path, message: \"Chart series must be an object\" });\n\t\treturn;\n\t}\n\tif (typeof value.name !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.name`,\n\t\t\tmessage: \"Required field 'name' must be a string\",\n\t\t});\n\t}\n\tif (!Array.isArray(value.data)) {\n\t\terrors.push({\n\t\t\tpath: `${path}.data`,\n\t\t\tmessage: \"Required field 'data' must be an array of [timestamp, value] tuples\",\n\t\t});\n\t} else {\n\t\tfor (let i = 0; i < value.data.length; i++) {\n\t\t\tconst point = value.data[i] as unknown;\n\t\t\tif (\n\t\t\t\t!Array.isArray(point) ||\n\t\t\t\tpoint.length !== 2 ||\n\t\t\t\ttypeof point[0] !== \"number\" ||\n\t\t\t\ttypeof point[1] !== \"number\"\n\t\t\t) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.data[${i}]`,\n\t\t\t\t\tmessage: \"Each data point must be a [number, number] tuple\",\n\t\t\t\t});\n\t\t\t\tbreak; // One error is enough for malformed data arrays\n\t\t\t}\n\t\t}\n\t}\n\tif (value.color !== undefined && typeof value.color !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.color`,\n\t\t\tmessage: \"Field 'color' must be a string if provided\",\n\t\t});\n\t}\n}\n\nfunction validateChartConfig(value: unknown, path: string, errors: ValidationError[]): void {\n\tif (!isRecord(value)) {\n\t\terrors.push({ path, message: \"Required field 'config' must be an object\" });\n\t\treturn;\n\t}\n\n\tconst chartType = value.chart_type;\n\tif (typeof chartType !== \"string\" || !CHART_TYPES.has(chartType)) {\n\t\terrors.push({\n\t\t\tpath: `${path}.chart_type`,\n\t\t\tmessage: `Field 'chart_type' must be one of: ${[...CHART_TYPES].join(\", \")}`,\n\t\t});\n\t\treturn;\n\t}\n\n\tif (value.height !== undefined) {\n\t\tif (typeof value.height !== \"number\") {\n\t\t\terrors.push({\n\t\t\t\tpath: `${path}.height`,\n\t\t\t\tmessage: \"Field 'height' must be a number if provided\",\n\t\t\t});\n\t\t} else if (value.height <= 0) {\n\t\t\terrors.push({\n\t\t\t\tpath: `${path}.height`,\n\t\t\t\tmessage: \"Field 'height' must be a positive number\",\n\t\t\t});\n\t\t}\n\t}\n\n\tswitch (chartType) {\n\t\tcase \"timeseries\": {\n\t\t\tif (\n\t\t\t\tvalue.style !== undefined &&\n\t\t\t\t(typeof value.style !== \"string\" || !CHART_STYLES.has(value.style))\n\t\t\t) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.style`,\n\t\t\t\t\tmessage: `Field 'style' must be one of: ${[...CHART_STYLES].join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!Array.isArray(value.series)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.series`,\n\t\t\t\t\tmessage: \"Required field 'series' must be an array\",\n\t\t\t\t});\n\t\t\t} else if (value.series.length === 0) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.series`,\n\t\t\t\t\tmessage: \"Field 'series' must not be empty\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.series.length; i++) {\n\t\t\t\t\tvalidateChartSeries(value.series[i], `${path}.series[${i}]`, errors);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (value.x_axis_name !== undefined && typeof value.x_axis_name !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.x_axis_name`,\n\t\t\t\t\tmessage: \"Field 'x_axis_name' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.y_axis_name !== undefined && typeof value.y_axis_name !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.y_axis_name`,\n\t\t\t\t\tmessage: \"Field 'y_axis_name' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.gradient !== undefined && typeof value.gradient !== \"boolean\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.gradient`,\n\t\t\t\t\tmessage: \"Field 'gradient' must be a boolean if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"custom\": {\n\t\t\tif (!isRecord(value.options)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.options`,\n\t\t\t\t\tmessage: \"Required field 'options' must be an object\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction validateBlock(value: unknown, path: string, errors: ValidationError[]): void {\n\tif (!isRecord(value)) {\n\t\terrors.push({ path, message: \"Block must be an object\" });\n\t\treturn;\n\t}\n\n\tconst type = value.type;\n\tif (typeof type !== \"string\" || !BLOCK_TYPES.has(type)) {\n\t\terrors.push({\n\t\t\tpath: `${path}.type`,\n\t\t\tmessage: `Unknown block type '${String(type)}'. Expected one of: ${[...BLOCK_TYPES].join(\", \")}`,\n\t\t});\n\t\treturn;\n\t}\n\n\tif (value.block_id !== undefined && typeof value.block_id !== \"string\") {\n\t\terrors.push({\n\t\t\tpath: `${path}.block_id`,\n\t\t\tmessage: \"Field 'block_id' must be a string if provided\",\n\t\t});\n\t}\n\n\tswitch (type) {\n\t\tcase \"header\": {\n\t\t\tif (typeof value.text !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.text`,\n\t\t\t\t\tmessage: \"Required field 'text' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"section\": {\n\t\t\tif (typeof value.text !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.text`,\n\t\t\t\t\tmessage: \"Required field 'text' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.accessory !== undefined) {\n\t\t\t\tvalidateElement(value.accessory, `${path}.accessory`, errors);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"divider\": {\n\t\t\t// No required fields\n\t\t\tbreak;\n\t\t}\n\t\tcase \"fields\": {\n\t\t\tif (!Array.isArray(value.fields)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.fields`,\n\t\t\t\t\tmessage: \"Required field 'fields' must be an array\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.fields.length; i++) {\n\t\t\t\t\tconst f = value.fields[i] as unknown;\n\t\t\t\t\tif (!isRecord(f)) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.fields[${i}]`,\n\t\t\t\t\t\t\tmessage: \"Field entry must be an object\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof f.label !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.fields[${i}].label`,\n\t\t\t\t\t\t\tmessage: \"Required field 'label' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof f.value !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.fields[${i}].value`,\n\t\t\t\t\t\t\tmessage: \"Required field 'value' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"table\": {\n\t\t\tif (!Array.isArray(value.columns)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.columns`,\n\t\t\t\t\tmessage: \"Required field 'columns' must be an array\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.columns.length; i++) {\n\t\t\t\t\tconst col = value.columns[i] as unknown;\n\t\t\t\t\tif (!isRecord(col)) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.columns[${i}]`,\n\t\t\t\t\t\t\tmessage: \"Column must be an object\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof col.key !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.columns[${i}].key`,\n\t\t\t\t\t\t\tmessage: \"Required field 'key' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof col.label !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.columns[${i}].label`,\n\t\t\t\t\t\t\tmessage: \"Required field 'label' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tcol.format !== undefined &&\n\t\t\t\t\t\t(typeof col.format !== \"string\" || !COLUMN_FORMATS.has(col.format))\n\t\t\t\t\t) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.columns[${i}].format`,\n\t\t\t\t\t\t\tmessage: `Field 'format' must be one of: ${[...COLUMN_FORMATS].join(\", \")}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (col.sortable !== undefined && typeof col.sortable !== \"boolean\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.columns[${i}].sortable`,\n\t\t\t\t\t\t\tmessage: \"Field 'sortable' must be a boolean\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!Array.isArray(value.rows)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.rows`,\n\t\t\t\t\tmessage: \"Required field 'rows' must be an array\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.rows.length; i++) {\n\t\t\t\t\tif (!isRecord(value.rows[i] as unknown)) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.rows[${i}]`,\n\t\t\t\t\t\t\tmessage: \"Row must be an object\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value.page_action_id !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.page_action_id`,\n\t\t\t\t\tmessage: \"Required field 'page_action_id' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.next_cursor !== undefined && typeof value.next_cursor !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.next_cursor`,\n\t\t\t\t\tmessage: \"Field 'next_cursor' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.empty_text !== undefined && typeof value.empty_text !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.empty_text`,\n\t\t\t\t\tmessage: \"Field 'empty_text' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"actions\": {\n\t\t\tif (!Array.isArray(value.elements)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.elements`,\n\t\t\t\t\tmessage: \"Required field 'elements' must be an array\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.elements.length; i++) {\n\t\t\t\t\tvalidateElement(value.elements[i], `${path}.elements[${i}]`, errors);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"stats\": {\n\t\t\tif (!Array.isArray(value.items)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.items`,\n\t\t\t\t\tmessage: \"Required field 'items' must be an array\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.items.length; i++) {\n\t\t\t\t\tconst item = value.items[i] as unknown;\n\t\t\t\t\tif (!isRecord(item)) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.items[${i}]`,\n\t\t\t\t\t\t\tmessage: \"Stat item must be an object\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof item.label !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.items[${i}].label`,\n\t\t\t\t\t\t\tmessage: \"Required field 'label' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof item.value !== \"string\" && typeof item.value !== \"number\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.items[${i}].value`,\n\t\t\t\t\t\t\tmessage: \"Required field 'value' must be a string or number\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (item.description !== undefined && typeof item.description !== \"string\") {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.items[${i}].description`,\n\t\t\t\t\t\t\tmessage: \"Field 'description' must be a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\titem.trend !== undefined &&\n\t\t\t\t\t\t(typeof item.trend !== \"string\" || !TREND_VALUES.has(item.trend))\n\t\t\t\t\t) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.items[${i}].trend`,\n\t\t\t\t\t\t\tmessage: `Field 'trend' must be one of: ${[...TREND_VALUES].join(\", \")}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"form\": {\n\t\t\tif (!Array.isArray(value.fields)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.fields`,\n\t\t\t\t\tmessage: \"Required field 'fields' must be an array\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.fields.length; i++) {\n\t\t\t\t\tvalidateFormField(value.fields[i], `${path}.fields[${i}]`, errors);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!isRecord(value.submit)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.submit`,\n\t\t\t\t\tmessage: \"Required field 'submit' must be an object\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (typeof value.submit.label !== \"string\") {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tpath: `${path}.submit.label`,\n\t\t\t\t\t\tmessage: \"Required field 'label' must be a string\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (typeof value.submit.action_id !== \"string\") {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tpath: `${path}.submit.action_id`,\n\t\t\t\t\t\tmessage: \"Required field 'action_id' must be a string\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"image\": {\n\t\t\tif (typeof value.url !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.url`,\n\t\t\t\t\tmessage: \"Required field 'url' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (typeof value.alt !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.alt`,\n\t\t\t\t\tmessage: \"Required field 'alt' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.title !== undefined && typeof value.title !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.title`,\n\t\t\t\t\tmessage: \"Field 'title' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"context\": {\n\t\t\tif (typeof value.text !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.text`,\n\t\t\t\t\tmessage: \"Required field 'text' must be a string\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"columns\": {\n\t\t\tif (!Array.isArray(value.columns)) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.columns`,\n\t\t\t\t\tmessage: \"Required field 'columns' must be an array\",\n\t\t\t\t});\n\t\t\t} else if (value.columns.length < 2 || value.columns.length > 3) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.columns`,\n\t\t\t\t\tmessage: \"Field 'columns' must contain 2-3 column arrays\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < value.columns.length; i++) {\n\t\t\t\t\tconst col = value.columns[i];\n\t\t\t\t\tif (!Array.isArray(col)) {\n\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\tpath: `${path}.columns[${i}]`,\n\t\t\t\t\t\t\tmessage: \"Each column must be an array of blocks\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tfor (let j = 0; j < col.length; j++) {\n\t\t\t\t\t\tvalidateBlock(col[j], `${path}.columns[${i}][${j}]`, errors);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"chart\": {\n\t\t\tvalidateChartConfig(value.config, `${path}.config`, errors);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"meter\": {\n\t\t\tif (typeof value.label !== \"string\") {\n\t\t\t\terrors.push({ path: `${path}.label`, message: \"Required field 'label' must be a string\" });\n\t\t\t}\n\t\t\tif (typeof value.value !== \"number\") {\n\t\t\t\terrors.push({ path: `${path}.value`, message: \"Required field 'value' must be a number\" });\n\t\t\t}\n\t\t\tif (value.max !== undefined && typeof value.max !== \"number\") {\n\t\t\t\terrors.push({ path: `${path}.max`, message: \"Field 'max' must be a number if provided\" });\n\t\t\t}\n\t\t\tif (value.min !== undefined && typeof value.min !== \"number\") {\n\t\t\t\terrors.push({ path: `${path}.min`, message: \"Field 'min' must be a number if provided\" });\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof value.min === \"number\" &&\n\t\t\t\ttypeof value.max === \"number\" &&\n\t\t\t\tvalue.min >= value.max\n\t\t\t) {\n\t\t\t\terrors.push({ path, message: \"Field 'min' must be less than 'max'\" });\n\t\t\t}\n\t\t\tif (value.custom_value !== undefined && typeof value.custom_value !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.custom_value`,\n\t\t\t\t\tmessage: \"Field 'custom_value' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"code\": {\n\t\t\tif (typeof value.code !== \"string\") {\n\t\t\t\terrors.push({ path: `${path}.code`, message: \"Required field 'code' must be a string\" });\n\t\t\t}\n\t\t\tif (\n\t\t\t\tvalue.language !== undefined &&\n\t\t\t\t(typeof value.language !== \"string\" || !CODE_LANGUAGES.has(value.language))\n\t\t\t) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.language`,\n\t\t\t\t\tmessage: `Field 'language' must be one of: ${[...CODE_LANGUAGES].join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"banner\": {\n\t\t\tif (value.title !== undefined && typeof value.title !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.title`,\n\t\t\t\t\tmessage: \"Field 'title' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.description !== undefined && typeof value.description !== \"string\") {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.description`,\n\t\t\t\t\tmessage: \"Field 'description' must be a string if provided\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (value.title === undefined && value.description === undefined) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath,\n\t\t\t\t\tmessage: \"Banner must have at least 'title' or 'description'\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\tvalue.variant !== undefined &&\n\t\t\t\t(typeof value.variant !== \"string\" || !BANNER_VARIANTS.has(value.variant))\n\t\t\t) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: `${path}.variant`,\n\t\t\t\t\tmessage: `Field 'variant' must be one of: ${[...BANNER_VARIANTS].join(\", \")}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nexport function validateBlocks(blocks: unknown): {\n\tvalid: boolean;\n\terrors: ValidationError[];\n} {\n\tconst errors: ValidationError[] = [];\n\n\tif (!Array.isArray(blocks)) {\n\t\terrors.push({ path: \"blocks\", message: \"Blocks must be an array\" });\n\t\treturn { valid: false, errors };\n\t}\n\n\tfor (let i = 0; i < blocks.length; i++) {\n\t\tvalidateBlock(blocks[i], `blocks[${i}]`, errors);\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@bwlng/blocks",
3
+ "version": "0.1.0-fork.2e294b1",
4
+ "description": "Declarative plugin UI blocks for EmDash CMS",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./server": {
16
+ "types": "./dist/server.d.ts",
17
+ "default": "./dist/server.js"
18
+ }
19
+ },
20
+ "scripts": {
21
+ "build": "tsdown",
22
+ "dev": "tsdown --watch",
23
+ "check": "publint && attw --pack --ignore-rules=cjs-resolves-to-esm --ignore-rules=no-resolution",
24
+ "test": "vitest",
25
+ "typecheck": "tsgo --noEmit"
26
+ },
27
+ "dependencies": {
28
+ "@cloudflare/kumo": "^1.10.0",
29
+ "@phosphor-icons/react": "^2.1.10",
30
+ "clsx": "^2.1.1",
31
+ "echarts": "^6.0.0",
32
+ "tailwind-merge": "^3.3.0"
33
+ },
34
+ "peerDependencies": {
35
+ "react": "^18.0.0 || ^19.0.0",
36
+ "react-dom": "^18.0.0 || ^19.0.0"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/emdash-cms/emdash.git",
41
+ "directory": "packages/blocks"
42
+ },
43
+ "homepage": "https://github.com/emdash-cms/emdash",
44
+ "keywords": [
45
+ "emdash",
46
+ "cms",
47
+ "blocks",
48
+ "plugin-ui",
49
+ "react"
50
+ ],
51
+ "author": "Matt Kane",
52
+ "license": "MIT"
53
+ }