@407dev/field-types 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/dist/index.d.ts +8 -1
- package/dist/index.js +45 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -81,6 +81,13 @@ declare function isValidLinkHref(rawHref: string): boolean;
|
|
|
81
81
|
* Validates a ProseMirror document structure against constraints and strict security rules.
|
|
82
82
|
*/
|
|
83
83
|
declare function validateProseMirrorDoc(doc: unknown, constraints?: RichTextConstraints): FieldValidationResult;
|
|
84
|
+
/**
|
|
85
|
+
* Returns a copy of a ProseMirror doc with `null`/`undefined` attrs removed, and attrs the
|
|
86
|
+
* validator doesn't know dropped from known node and mark types. Editors (Tiptap `getJSON()`)
|
|
87
|
+
* serialize every attribute their extensions define, e.g. link `class: null, title: null`,
|
|
88
|
+
* so run their output through this before saving.
|
|
89
|
+
*/
|
|
90
|
+
declare function normalizeProseMirrorDoc<T>(doc: T): T;
|
|
84
91
|
|
|
85
92
|
/**
|
|
86
93
|
* Shared URL guards and validation routines.
|
|
@@ -223,4 +230,4 @@ declare const streamVideoType: FieldTypeDefinition<StreamVideoValue | null>;
|
|
|
223
230
|
|
|
224
231
|
declare function registerBaseTypes(): void;
|
|
225
232
|
|
|
226
|
-
export { type Address, type AddressConstraints, type AddressListConstraints, DEFAULT_ALLOWED_MARKS, DEFAULT_ALLOWED_NODES, type FieldTypeDefinition, type FieldValidationError, type FieldValidationResult, type GeoAreaConstraints, type GeoAreaValue, type GeoJsonMultiPolygon, type GeoJsonPolygon, type ImageConstraints, type MediaRef, type NumberConstraints, type RichTextConstraints, type SelectConstraints, type SelectOption, type StreamVideoConstraints, type StreamVideoValue, type TextConstraints, type VideoConstraints, type VideoItem, type VideoListConstraints, addressListType, addressType, fieldTypeAliases, geoAreaType, getFieldType, hasFieldType, imageType, isSafeActionHref, isSafeMediaSrc, isSafeRelativeOrAnchor, isValidLinkHref, listFieldTypeIds, listFieldTypes, normalizeFieldValue, normalizeGeoArea, numberType, registerBaseTypes, registerFieldType, resetRegistry, resolveTypeAlias, richtextType, selectType, streamVideoType, stripUrlControlChars, textType, toggleType, unknownTypeIds, validateFieldValue, validateProseMirrorDoc, videoListType, videoType };
|
|
233
|
+
export { type Address, type AddressConstraints, type AddressListConstraints, DEFAULT_ALLOWED_MARKS, DEFAULT_ALLOWED_NODES, type FieldTypeDefinition, type FieldValidationError, type FieldValidationResult, type GeoAreaConstraints, type GeoAreaValue, type GeoJsonMultiPolygon, type GeoJsonPolygon, type ImageConstraints, type MediaRef, type NumberConstraints, type RichTextConstraints, type SelectConstraints, type SelectOption, type StreamVideoConstraints, type StreamVideoValue, type TextConstraints, type VideoConstraints, type VideoItem, type VideoListConstraints, addressListType, addressType, fieldTypeAliases, geoAreaType, getFieldType, hasFieldType, imageType, isSafeActionHref, isSafeMediaSrc, isSafeRelativeOrAnchor, isValidLinkHref, listFieldTypeIds, listFieldTypes, normalizeFieldValue, normalizeGeoArea, normalizeProseMirrorDoc, numberType, registerBaseTypes, registerFieldType, resetRegistry, resolveTypeAlias, richtextType, selectType, streamVideoType, stripUrlControlChars, textType, toggleType, unknownTypeIds, validateFieldValue, validateProseMirrorDoc, videoListType, videoType };
|
package/dist/index.js
CHANGED
|
@@ -972,6 +972,7 @@ function validateProseMirrorDoc(doc, constraints) {
|
|
|
972
972
|
});
|
|
973
973
|
continue;
|
|
974
974
|
}
|
|
975
|
+
if (attrVal === null || attrVal === void 0) continue;
|
|
975
976
|
const validator = allowedAttrsForType?.[attrKey];
|
|
976
977
|
if (!validator) {
|
|
977
978
|
errors.push({
|
|
@@ -1052,6 +1053,7 @@ function validateProseMirrorDoc(doc, constraints) {
|
|
|
1052
1053
|
});
|
|
1053
1054
|
continue;
|
|
1054
1055
|
}
|
|
1056
|
+
if (attrVal === null || attrVal === void 0) continue;
|
|
1055
1057
|
const validator = allowedMarkAttrs?.[attrKey];
|
|
1056
1058
|
if (!validator) {
|
|
1057
1059
|
errors.push({
|
|
@@ -1097,6 +1099,48 @@ function validateProseMirrorDoc(doc, constraints) {
|
|
|
1097
1099
|
}
|
|
1098
1100
|
return { valid: false, errors };
|
|
1099
1101
|
}
|
|
1102
|
+
function normalizeProseMirrorDoc(doc) {
|
|
1103
|
+
function cleanAttrs(attrs, allowed) {
|
|
1104
|
+
if (attrs === null || typeof attrs !== "object" || Array.isArray(attrs)) return void 0;
|
|
1105
|
+
const out = {};
|
|
1106
|
+
for (const [key, val] of Object.entries(attrs)) {
|
|
1107
|
+
if (val === null || val === void 0) continue;
|
|
1108
|
+
if (FORBIDDEN_PROPERTY_KEYS.has(key)) continue;
|
|
1109
|
+
if (allowed && !(key in allowed)) continue;
|
|
1110
|
+
out[key] = val;
|
|
1111
|
+
}
|
|
1112
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
1113
|
+
}
|
|
1114
|
+
function visit(value) {
|
|
1115
|
+
if (Array.isArray(value)) return value.map(visit);
|
|
1116
|
+
if (value === null || typeof value !== "object") return value;
|
|
1117
|
+
const node = value;
|
|
1118
|
+
const type = typeof node.type === "string" ? node.type : "";
|
|
1119
|
+
const out = {};
|
|
1120
|
+
for (const [key, val] of Object.entries(node)) {
|
|
1121
|
+
if (FORBIDDEN_PROPERTY_KEYS.has(key)) continue;
|
|
1122
|
+
if (key === "attrs") {
|
|
1123
|
+
const attrs = cleanAttrs(val, ALLOWED_NODE_ATTRS[type]);
|
|
1124
|
+
if (attrs) out.attrs = attrs;
|
|
1125
|
+
} else if (key === "marks" && Array.isArray(val)) {
|
|
1126
|
+
out.marks = val.map((mark) => {
|
|
1127
|
+
if (mark === null || typeof mark !== "object") return mark;
|
|
1128
|
+
const m = mark;
|
|
1129
|
+
const markType = typeof m.type === "string" ? m.type : "";
|
|
1130
|
+
const attrs = cleanAttrs(m.attrs, ALLOWED_MARK_ATTRS[markType]);
|
|
1131
|
+
const { attrs: _drop, ...rest } = m;
|
|
1132
|
+
return attrs ? { ...rest, attrs } : rest;
|
|
1133
|
+
});
|
|
1134
|
+
} else if (key === "content") {
|
|
1135
|
+
out.content = visit(val);
|
|
1136
|
+
} else {
|
|
1137
|
+
out[key] = val;
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
return out;
|
|
1141
|
+
}
|
|
1142
|
+
return visit(doc);
|
|
1143
|
+
}
|
|
1100
1144
|
|
|
1101
1145
|
// src/types/richtext.ts
|
|
1102
1146
|
var richtextType = {
|
|
@@ -1665,6 +1709,6 @@ function registerBaseTypes() {
|
|
|
1665
1709
|
}
|
|
1666
1710
|
registerBaseTypes();
|
|
1667
1711
|
|
|
1668
|
-
export { DEFAULT_ALLOWED_MARKS, DEFAULT_ALLOWED_NODES, addressListType, addressType, fieldTypeAliases, geoAreaType, getFieldType, hasFieldType, imageType, isSafeActionHref, isSafeMediaSrc, isSafeRelativeOrAnchor, isValidLinkHref, listFieldTypeIds, listFieldTypes, normalizeFieldValue, normalizeGeoArea, numberType, registerBaseTypes, registerFieldType, resetRegistry, resolveTypeAlias, richtextType, selectType, streamVideoType, stripUrlControlChars, textType, toggleType, unknownTypeIds, validateFieldValue, validateProseMirrorDoc, videoListType, videoType };
|
|
1712
|
+
export { DEFAULT_ALLOWED_MARKS, DEFAULT_ALLOWED_NODES, addressListType, addressType, fieldTypeAliases, geoAreaType, getFieldType, hasFieldType, imageType, isSafeActionHref, isSafeMediaSrc, isSafeRelativeOrAnchor, isValidLinkHref, listFieldTypeIds, listFieldTypes, normalizeFieldValue, normalizeGeoArea, normalizeProseMirrorDoc, numberType, registerBaseTypes, registerFieldType, resetRegistry, resolveTypeAlias, richtextType, selectType, streamVideoType, stripUrlControlChars, textType, toggleType, unknownTypeIds, validateFieldValue, validateProseMirrorDoc, videoListType, videoType };
|
|
1669
1713
|
//# sourceMappingURL=index.js.map
|
|
1670
1714
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry.ts","../src/types/address.ts","../src/types/geoArea.ts","../src/types/image.ts","../src/types/number.ts","../src/url.ts","../src/richtext.ts","../src/types/richtext.ts","../src/types/select.ts","../src/types/streamVideo.ts","../src/types/text.ts","../src/types/toggle.ts","../src/types/video.ts","../src/types/videoList.ts","../src/index.ts"],"names":["FORBIDDEN_KEYS"],"mappings":"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","file":"index.js","sourcesContent":["import type { FieldTypeDefinition, FieldValidationResult } from './types';\n\nconst registry = new Map<string, FieldTypeDefinition>();\n\n/**\n * Registers a new or custom field type.\n */\nexport function registerFieldType(def: FieldTypeDefinition): void {\n registry.set(def.id, def);\n}\n\n/**\n * Retrieves a field type definition by ID.\n */\nexport function getFieldType(id: string): FieldTypeDefinition | undefined {\n return registry.get(id);\n}\n\n/**\n * Checks whether a field type ID is registered.\n */\nexport function hasFieldType(id: string): boolean {\n return registry.has(id);\n}\n\n/**\n * Returns all registered field type definitions.\n */\nexport function listFieldTypes(): FieldTypeDefinition[] {\n return Array.from(registry.values());\n}\n\n/**\n * Returns all registered field type IDs.\n */\nexport function listFieldTypeIds(): string[] {\n return Array.from(registry.keys());\n}\n\n/**\n * Returns a map of all registered aliases to their canonical field type IDs.\n */\nexport function fieldTypeAliases(): Map<string, string> {\n const aliases = new Map<string, string>();\n for (const def of registry.values()) {\n if (def.aliases) {\n for (const alias of def.aliases) {\n aliases.set(alias, def.id);\n }\n }\n }\n return aliases;\n}\n\n/**\n * Resolves a field method/alias name to its canonical field type ID.\n */\nexport function resolveTypeAlias(name: string): string {\n if (registry.has(name)) {\n return name;\n }\n const aliasMap = fieldTypeAliases();\n return aliasMap.get(name) ?? name;\n}\n\n/**\n * Normalizes a field value using the field type's normalize hook if defined.\n * Never throws — returns input value unchanged if no normalize hook or on error.\n */\nexport function normalizeFieldValue(\n typeId: string,\n value: unknown,\n constraints?: Record<string, unknown>,\n): unknown {\n const canonicalId = resolveTypeAlias(typeId);\n const typeDef = registry.get(canonicalId) || registry.get(typeId);\n if (!typeDef?.normalize) {\n return value;\n }\n try {\n return typeDef.normalize(value, constraints);\n } catch {\n return value;\n }\n}\n\n/**\n * Given a list of field type IDs, returns any IDs that are not registered.\n */\nexport function unknownTypeIds(ids: string[]): string[] {\n return ids.filter((id) => !registry.has(resolveTypeAlias(id)));\n}\n\n/**\n * Validates a field value against a field type's validator and constraints.\n * Never throws — returns an unknown_type error if type is not registered.\n */\nexport function validateFieldValue(\n typeId: string,\n value: unknown,\n constraints?: Record<string, unknown>,\n): FieldValidationResult {\n const canonicalId = resolveTypeAlias(typeId);\n const typeDef = registry.get(canonicalId) || registry.get(typeId);\n if (!typeDef) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Unknown field type: '${typeId}'`,\n keyword: 'unknown_type',\n },\n ],\n };\n }\n\n try {\n return typeDef.validate(value, constraints);\n } catch (err) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: err instanceof Error ? err.message : 'Validation exception',\n keyword: 'validation_error',\n },\n ],\n };\n }\n}\n\n/**\n * Resets the registry (useful for test isolation).\n */\nexport function resetRegistry(): void {\n registry.clear();\n}\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface Address {\n line1: string;\n line2?: string;\n city: string;\n region: string;\n postal: string;\n country: string;\n lat?: number;\n lng?: number;\n}\n\nexport interface AddressConstraints {\n countryFormat?: 'iso2' | 'free';\n}\n\nexport interface AddressListConstraints extends AddressConstraints {\n minItems?: number;\n maxItems?: number;\n}\n\nconst ALLOWED_ADDRESS_KEYS = new Set([\n 'line1',\n 'line2',\n 'city',\n 'region',\n 'postal',\n 'country',\n 'lat',\n 'lng',\n]);\n\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\nconst ISO2_REGEX = /^[A-Za-z]{2}$/;\n\nexport const addressType: FieldTypeDefinition<Address | null> = {\n id: 'address',\n defaultValue: null,\n constraintsSchema: {\n type: 'object',\n properties: {\n countryFormat: { type: 'string', enum: ['iso2', 'free'], default: 'iso2' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n if (value === null || value === undefined) {\n return { valid: true };\n }\n\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as AddressConstraints;\n const countryFormat = c.countryFormat || 'iso2';\n\n if (typeof value !== 'object' || Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected address object, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const record = value as Record<string, unknown>;\n\n for (const key of Object.keys(record)) {\n if (FORBIDDEN_KEYS.has(key) || !ALLOWED_ADDRESS_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Unknown or forbidden property '${key}' in address`,\n keyword: 'additional_properties',\n });\n }\n }\n\n const requiredStringFields: Array<keyof Address> = [\n 'line1',\n 'city',\n 'region',\n 'postal',\n 'country',\n ];\n for (const field of requiredStringFields) {\n const val = record[field];\n if (typeof val !== 'string' || !val.trim()) {\n errors.push({\n path: field,\n message: `Address field '${field}' is required and must be a non-empty string`,\n keyword: 'required',\n });\n }\n }\n\n // Optional line2\n if (record.line2 !== undefined && record.line2 !== null && record.line2 !== '') {\n if (typeof record.line2 !== 'string') {\n errors.push({\n path: 'line2',\n message: 'Address line2 must be a string',\n keyword: 'type',\n });\n }\n }\n\n // Country format check\n if (typeof record.country === 'string' && record.country.trim()) {\n if (countryFormat === 'iso2' && !ISO2_REGEX.test(record.country.trim())) {\n errors.push({\n path: 'country',\n message: `Country '${record.country}' must be a 2-letter ISO-3166-1 alpha-2 code`,\n keyword: 'country_format',\n });\n }\n }\n\n // Optional lat / lng\n if (record.lat !== undefined && record.lat !== null) {\n if (typeof record.lat !== 'number' || !Number.isFinite(record.lat)) {\n errors.push({\n path: 'lat',\n message: 'Latitude must be a finite number',\n keyword: 'type',\n });\n } else if (record.lat < -90 || record.lat > 90) {\n errors.push({\n path: 'lat',\n message: `Latitude ${record.lat} is out of bounds (must be between -90 and 90)`,\n keyword: 'lat_out_of_bounds',\n });\n }\n }\n\n if (record.lng !== undefined && record.lng !== null) {\n if (typeof record.lng !== 'number' || !Number.isFinite(record.lng)) {\n errors.push({\n path: 'lng',\n message: 'Longitude must be a finite number',\n keyword: 'type',\n });\n } else if (record.lng < -180 || record.lng > 180) {\n errors.push({\n path: 'lng',\n message: `Longitude ${record.lng} is out of bounds (must be between -180 and 180)`,\n keyword: 'lng_out_of_bounds',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n\nexport const addressListType: FieldTypeDefinition<Address[]> = {\n id: 'address.list',\n aliases: ['addressList'],\n defaultValue: [],\n constraintsSchema: {\n type: 'object',\n properties: {\n minItems: { type: 'integer', minimum: 0 },\n maxItems: { type: 'integer', minimum: 0, default: 25 },\n countryFormat: { type: 'string', enum: ['iso2', 'free'], default: 'iso2' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n if (value === null || value === undefined) {\n return { valid: true };\n }\n\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as AddressListConstraints;\n const maxItems = typeof c.maxItems === 'number' ? c.maxItems : 25;\n\n if (!Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected array for address.list, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n if (typeof c.minItems === 'number' && value.length < c.minItems) {\n errors.push({\n path: '',\n message: `Address list item count (${value.length}) is less than minimum (${c.minItems})`,\n keyword: 'min_items',\n });\n }\n\n if (value.length > maxItems) {\n errors.push({\n path: '',\n message: `Address list item count (${value.length}) exceeds maximum (${maxItems})`,\n keyword: 'max_items',\n });\n }\n\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const itemResult = addressType.validate(item, constraints);\n if (!itemResult.valid) {\n for (const err of itemResult.errors) {\n const itemPath = err.path ? `[${i}].${err.path}` : `[${i}]`;\n errors.push({\n path: itemPath,\n message: err.message,\n keyword: err.keyword,\n });\n }\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface GeoAreaConstraints {\n maxVertices?: number;\n maxRings?: number;\n}\n\nexport interface GeoJsonPolygon {\n type: 'Polygon';\n coordinates: number[][][]; // [ [ [lon, lat], ... ] ]\n}\n\nexport interface GeoJsonMultiPolygon {\n type: 'MultiPolygon';\n coordinates: number[][][][]; // [ [ [ [lon, lat], ... ] ] ]\n}\n\nexport type GeoAreaValue = GeoJsonPolygon | GeoJsonMultiPolygon | null;\n\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction crossProduct(\n a: readonly [number, number],\n b: readonly [number, number],\n c: readonly [number, number],\n): number {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n\nconst EPSILON = 1e-12;\n\nfunction isPointOnSegment(\n p: readonly [number, number],\n a: readonly [number, number],\n b: readonly [number, number],\n): boolean {\n return (\n p[0] >= Math.min(a[0], b[0]) - EPSILON &&\n p[0] <= Math.max(a[0], b[0]) + EPSILON &&\n p[1] >= Math.min(a[1], b[1]) - EPSILON &&\n p[1] <= Math.max(a[1], b[1]) + EPSILON\n );\n}\n\n/**\n * Determines whether line segment A-B intersects with line segment C-D.\n */\nfunction segmentsIntersect(\n a: readonly [number, number],\n b: readonly [number, number],\n c: readonly [number, number],\n d: readonly [number, number],\n): boolean {\n const cp1 = crossProduct(a, b, c);\n const cp2 = crossProduct(a, b, d);\n const cp3 = crossProduct(c, d, a);\n const cp4 = crossProduct(c, d, b);\n\n // General proper intersection (segments cross each other)\n if (\n ((cp1 > EPSILON && cp2 < -EPSILON) || (cp1 < -EPSILON && cp2 > EPSILON)) &&\n ((cp3 > EPSILON && cp4 < -EPSILON) || (cp3 < -EPSILON && cp4 > EPSILON))\n ) {\n return true;\n }\n\n // Collinear or endpoint on segment\n if (Math.abs(cp1) <= EPSILON && isPointOnSegment(c, a, b)) return true;\n if (Math.abs(cp2) <= EPSILON && isPointOnSegment(d, a, b)) return true;\n if (Math.abs(cp3) <= EPSILON && isPointOnSegment(a, c, d)) return true;\n if (Math.abs(cp4) <= EPSILON && isPointOnSegment(b, c, d)) return true;\n\n return false;\n}\n\n/**\n * Finds the first self-intersection in a single LinearRing.\n * Returns offending segment indices [i, j] or null if no self-intersection.\n */\nfunction findRingSelfIntersection(\n ring: Array<readonly [number, number] | number[]>,\n): [number, number] | null {\n const numSegments = ring.length - 1;\n if (numSegments < 3) return null;\n\n for (let i = 0; i < numSegments; i++) {\n const a = ring[i] as readonly [number, number];\n const b = ring[i + 1] as readonly [number, number];\n\n for (let j = i + 1; j < numSegments; j++) {\n // Skip adjacent segments sharing an endpoint\n if (j === i + 1) continue;\n // Skip first and last segment which share the closed ring start/end vertex\n if (i === 0 && j === numSegments - 1) continue;\n\n const c = ring[j] as readonly [number, number];\n const d = ring[j + 1] as readonly [number, number];\n\n if (segmentsIntersect(a, b, c, d)) {\n return [i, j];\n }\n }\n }\n\n return null;\n}\n\n/**\n * Normalizes a single ring by removing consecutive duplicate points and auto-closing.\n */\nfunction normalizeRing(rawRing: unknown[]): number[][] {\n if (!Array.isArray(rawRing) || rawRing.length === 0) {\n return [];\n }\n\n const cleaned: number[][] = [];\n for (const pos of rawRing) {\n if (!Array.isArray(pos) || pos.length < 2) continue;\n const lon = Number(pos[0]);\n const lat = Number(pos[1]);\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) continue;\n\n // Drop consecutive duplicates\n if (cleaned.length > 0) {\n const prev = cleaned[cleaned.length - 1];\n if (Math.abs(prev[0] - lon) < EPSILON && Math.abs(prev[1] - lat) < EPSILON) {\n continue;\n }\n }\n cleaned.push([lon, lat]);\n }\n\n // Auto-close ring if needed and at least 3 points exist\n if (cleaned.length >= 1) {\n const first = cleaned[0];\n const last = cleaned[cleaned.length - 1];\n if (Math.abs(first[0] - last[0]) >= EPSILON || Math.abs(first[1] - last[1]) >= EPSILON) {\n cleaned.push([first[0], first[1]]);\n }\n }\n\n return cleaned;\n}\n\n/**\n * Pure repair pass for GeoJSON geometry:\n * Auto-closes rings and removes consecutive duplicate positions.\n */\nexport function normalizeGeoArea(value: unknown): unknown {\n if (!value) {\n return value;\n }\n\n let obj = value as Record<string, unknown>;\n if (typeof value === 'string') {\n try {\n obj = JSON.parse(value);\n } catch {\n return value;\n }\n }\n\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return value;\n }\n\n if (obj.type === 'Polygon' && Array.isArray(obj.coordinates)) {\n const newCoords = (obj.coordinates as unknown[][]).map((ring) => normalizeRing(ring));\n return {\n ...obj,\n type: 'Polygon',\n coordinates: newCoords,\n };\n }\n\n if (obj.type === 'MultiPolygon' && Array.isArray(obj.coordinates)) {\n const newCoords = (obj.coordinates as unknown[][][]).map((poly) =>\n Array.isArray(poly) ? poly.map((ring) => normalizeRing(ring)) : [],\n );\n return {\n ...obj,\n type: 'MultiPolygon',\n coordinates: newCoords,\n };\n }\n\n return value;\n}\n\nexport const geoAreaType: FieldTypeDefinition<GeoAreaValue> = {\n id: 'geo.area',\n aliases: ['geoArea'],\n defaultValue: null,\n constraintsSchema: {\n type: 'object',\n properties: {\n maxVertices: { type: 'integer', minimum: 4, default: 2000 },\n maxRings: { type: 'integer', minimum: 1, default: 20 },\n },\n additionalProperties: false,\n },\n normalize: normalizeGeoArea,\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as GeoAreaConstraints;\n const maxVertices = typeof c.maxVertices === 'number' ? c.maxVertices : 2000;\n const maxRings = typeof c.maxRings === 'number' ? c.maxRings : 20;\n\n let targetValue = value;\n if (typeof value === 'string') {\n try {\n targetValue = JSON.parse(value);\n } catch {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: 'Expected GeoJSON object for geo.area, got invalid JSON string',\n keyword: 'type',\n },\n ],\n };\n }\n }\n\n if (typeof targetValue !== 'object' || targetValue === null || Array.isArray(targetValue)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected GeoJSON object for geo.area, got ${typeof targetValue}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const record = targetValue as Record<string, unknown>;\n\n for (const key of Object.keys(record)) {\n if (FORBIDDEN_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Forbidden property '${key}' in GeoJSON object`,\n keyword: 'forbidden_property',\n });\n }\n }\n\n if (record.type !== 'Polygon' && record.type !== 'MultiPolygon') {\n errors.push({\n path: 'type',\n message: `GeoJSON type must be 'Polygon' or 'MultiPolygon', got '${String(record.type)}'`,\n keyword: 'geo_invalid_type',\n });\n return { valid: false, errors };\n }\n\n if (!Array.isArray(record.coordinates)) {\n errors.push({\n path: 'coordinates',\n message: 'GeoJSON coordinates property must be an array',\n keyword: 'type',\n });\n return { valid: false, errors };\n }\n\n // Collect all rings with their logical paths\n interface RingItem {\n ring: unknown[];\n path: string;\n }\n const rings: RingItem[] = [];\n\n if (record.type === 'Polygon') {\n const polyCoords = record.coordinates as unknown[];\n for (let r = 0; r < polyCoords.length; r++) {\n if (!Array.isArray(polyCoords[r])) {\n errors.push({\n path: `coordinates[${r}]`,\n message: `LinearRing at coordinates[${r}] must be an array of coordinates`,\n keyword: 'type',\n });\n } else {\n rings.push({ ring: polyCoords[r] as unknown[], path: `coordinates[${r}]` });\n }\n }\n } else {\n // MultiPolygon\n const multiCoords = record.coordinates as unknown[];\n for (let p = 0; p < multiCoords.length; p++) {\n const poly = multiCoords[p];\n if (!Array.isArray(poly)) {\n errors.push({\n path: `coordinates[${p}]`,\n message: `Polygon at coordinates[${p}] must be an array of rings`,\n keyword: 'type',\n });\n continue;\n }\n for (let r = 0; r < poly.length; r++) {\n if (!Array.isArray(poly[r])) {\n errors.push({\n path: `coordinates[${p}][${r}]`,\n message: `LinearRing at coordinates[${p}][${r}] must be an array of coordinates`,\n keyword: 'type',\n });\n } else {\n rings.push({ ring: poly[r] as unknown[], path: `coordinates[${p}][${r}]` });\n }\n }\n }\n }\n\n if (rings.length > maxRings) {\n errors.push({\n path: 'coordinates',\n message: `Total rings count (${rings.length}) exceeds maximum allowed (${maxRings})`,\n keyword: 'geo_ring_cap',\n });\n }\n\n let totalVertices = 0;\n\n for (const { ring, path } of rings) {\n totalVertices += ring.length;\n\n if (ring.length < 4) {\n errors.push({\n path,\n message: `LinearRing at ${path} must contain at least 4 positions (got ${ring.length})`,\n keyword: 'geo_ring_too_short',\n });\n }\n\n let allPositionsValid = true;\n const validPoints: Array<[number, number]> = [];\n\n for (let p = 0; p < ring.length; p++) {\n const pos = ring[p];\n const posPath = `${path}[${p}]`;\n\n if (!Array.isArray(pos) || pos.length !== 2) {\n errors.push({\n path: posPath,\n message: `Position at ${posPath} must be a 2-element [longitude, latitude] array (elevation is not supported)`,\n keyword: 'geo_position_invalid',\n });\n allPositionsValid = false;\n continue;\n }\n\n const lon = pos[0];\n const lat = pos[1];\n\n if (\n typeof lon !== 'number' ||\n typeof lat !== 'number' ||\n !Number.isFinite(lon) ||\n !Number.isFinite(lat)\n ) {\n errors.push({\n path: posPath,\n message: `Position at ${posPath} contains non-finite numbers`,\n keyword: 'geo_position_invalid',\n });\n allPositionsValid = false;\n continue;\n }\n\n if (lon < -180 || lon > 180 || lat < -90 || lat > 90) {\n errors.push({\n path: posPath,\n message: `Position [${lon}, ${lat}] at ${posPath} is out of bounds (longitude must be in [-180, 180], latitude in [-90, 90])`,\n keyword: 'geo_out_of_bounds',\n });\n allPositionsValid = false;\n continue;\n }\n\n validPoints.push([lon, lat]);\n }\n\n if (allPositionsValid && validPoints.length >= 4) {\n const first = validPoints[0];\n const last = validPoints[validPoints.length - 1];\n\n // Check ring closure\n if (Math.abs(first[0] - last[0]) > EPSILON || Math.abs(first[1] - last[1]) > EPSILON) {\n errors.push({\n path,\n message: `LinearRing at ${path} is not closed (first position [${first[0]}, ${first[1]}] does not match last position [${last[0]}, ${last[1]}])`,\n keyword: 'geo_ring_not_closed',\n });\n } else {\n // Check self-intersection\n const intersection = findRingSelfIntersection(validPoints);\n if (intersection) {\n errors.push({\n path,\n message: `LinearRing at ${path} self-intersects between segment ${intersection[0]} and segment ${intersection[1]}`,\n keyword: 'geo_self_intersection',\n });\n }\n }\n }\n }\n\n if (totalVertices > maxVertices) {\n errors.push({\n path: 'coordinates',\n message: `Total vertex count (${totalVertices}) exceeds maximum allowed (${maxVertices})`,\n keyword: 'geo_vertex_cap',\n });\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface ImageConstraints {\n maxSizeBytes?: number;\n allowedMimeTypes?: string[];\n}\n\nexport const imageType: FieldTypeDefinition<string | null> = {\n id: 'image',\n aliases: ['img'],\n defaultValue: null,\n renderHint: { tag: 'img' },\n constraintsSchema: {\n type: 'object',\n properties: {\n maxSizeBytes: { type: 'integer', minimum: 0 },\n allowedMimeTypes: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n if (typeof value === 'string') {\n // UUID or URL or relative path\n return { valid: true };\n }\n\n if (typeof value === 'object' && value !== null) {\n // Object reference: discriminated { kind: 'asset', id }, { kind: 'url', src }, or legacy { id } / { url }\n const obj = value as Record<string, unknown>;\n if (obj.kind === 'asset' && typeof obj.id === 'string' && obj.id.trim()) {\n return { valid: true };\n }\n if (obj.kind === 'url' && typeof obj.src === 'string' && obj.src.trim()) {\n return { valid: true };\n }\n if (typeof obj.id === 'string' || typeof obj.url === 'string') {\n return { valid: true };\n }\n errors.push({\n path: '',\n message: 'Image object must contain an id, url, or valid kind (asset/url)',\n keyword: 'image_structure',\n });\n return { valid: false, errors };\n }\n\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected image reference (UUID string, URL, or asset object), got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface NumberConstraints {\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n}\n\nexport const numberType: FieldTypeDefinition<number> = {\n id: 'number',\n defaultValue: 0,\n constraintsSchema: {\n type: 'object',\n properties: {\n min: { type: 'number' },\n max: { type: 'number' },\n step: { type: 'number', exclusiveMinimum: 0 },\n integer: { type: 'boolean' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected finite number, got ${typeof value === 'number' ? 'NaN/Infinity' : typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const c = (constraints || {}) as NumberConstraints;\n\n if (c.integer && !Number.isInteger(value)) {\n errors.push({\n path: '',\n message: `Value ${value} must be an integer`,\n keyword: 'integer',\n });\n }\n\n if (typeof c.min === 'number' && value < c.min) {\n errors.push({\n path: '',\n message: `Value ${value} is less than minimum ${c.min}`,\n keyword: 'min',\n });\n }\n\n if (typeof c.max === 'number' && value > c.max) {\n errors.push({\n path: '',\n message: `Value ${value} exceeds maximum ${c.max}`,\n keyword: 'max',\n });\n }\n\n if (typeof c.step === 'number' && c.step > 0) {\n const base = typeof c.min === 'number' ? c.min : 0;\n const diff = Math.abs(value - base);\n const remainder = diff % c.step;\n // Handle floating point imprecision\n const isMultiple = remainder < 1e-9 || Math.abs(remainder - c.step) < 1e-9;\n if (!isMultiple) {\n errors.push({\n path: '',\n message: `Value ${value} is not a valid step multiple of ${c.step}`,\n keyword: 'step',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","/**\n * Shared URL guards and validation routines.\n */\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Strips all ASCII control characters, whitespace, and invisible Unicode control codes from a raw URL.\n */\nexport function stripUrlControlChars(raw: string): string {\n if (typeof raw !== 'string') return '';\n // biome-ignore lint/suspicious/noControlCharactersInRegex: purposeful control char stripping for security\n // biome-ignore lint/suspicious/noMisleadingCharacterClass: intentional unicode control character range\n return raw.replace(/[\\x00-\\x20\\x7F-\\x9F\\u200B-\\u200D\\uFEFF\\s]/g, '');\n}\n\n/**\n * Checks whether a cleaned URL string is a safe relative path or anchor.\n * Must start with exactly one '/' not followed by '/' or '\\', or start with '#'.\n * Rejects any backslashes or percent-encoded backslashes before or at path root.\n */\nexport function isSafeRelativeOrAnchor(cleaned: string): boolean {\n if (!cleaned) return false;\n\n // Reject backslashes anywhere before the first '/' or in the path root\n if (cleaned.startsWith('\\\\')) return false;\n\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('/%5c') || lower.startsWith('%5c')) return false;\n\n if (cleaned.startsWith('#')) {\n return !cleaned.includes('\\\\');\n }\n\n if (cleaned.startsWith('/')) {\n if (cleaned.length === 1) return true;\n const second = cleaned[1];\n if (second === '/' || second === '\\\\') return false;\n return true;\n }\n\n return false;\n}\n\n/**\n * Validates a media src (video/image/audio).\n * Allows relative paths, `#anchor`, UUID asset references, and `https://` URLs (with optional host allowlist).\n */\nexport function isSafeMediaSrc(raw: string, allowedHosts?: string[]): boolean {\n if (typeof raw !== 'string') return false;\n const cleaned = stripUrlControlChars(raw);\n if (!cleaned) return false;\n\n if (UUID_REGEX.test(cleaned)) {\n return true;\n }\n\n if (isSafeRelativeOrAnchor(cleaned)) {\n return true;\n }\n\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('https://') || lower.startsWith('http://')) {\n if (cleaned.includes('\\\\') || lower.includes('%5c')) return false;\n try {\n const parsed = new URL(cleaned);\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return false;\n\n if (parsed.protocol === 'http:') {\n // Loopback is always safe (never attacker-controllable); any other http host needs an explicit allowlist entry.\n const hostname = parsed.hostname.toLowerCase();\n if (hostname === 'localhost' || hostname === '127.0.0.1') return true;\n if (!allowedHosts || allowedHosts.length === 0) return false;\n const allowed = allowedHosts.map((h) => h.toLowerCase());\n return allowed.includes(hostname);\n }\n\n if (allowedHosts && allowedHosts.length > 0) {\n const allowed = allowedHosts.map((h) => h.toLowerCase());\n return allowed.includes(parsed.hostname.toLowerCase());\n }\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\n/**\n * Validates an action href (link/CTA).\n * Default-restrictive: allows relative paths or `#anchor` only.\n * Absolute `https://` is permitted ONLY when its host is in `allowedHosts`.\n * Rejects `mailto:`, `tel:`, `data:`, `blob:`, `javascript:`, and non-allowed absolute URLs.\n */\nexport function isSafeActionHref(raw: string, allowedHosts?: string[]): boolean {\n if (typeof raw !== 'string') return false;\n const cleaned = stripUrlControlChars(raw);\n if (!cleaned) return false;\n\n // Outright reject dangerous or unapproved schemes\n const lower = cleaned.toLowerCase();\n if (\n lower.startsWith('javascript:') ||\n lower.startsWith('data:') ||\n lower.startsWith('blob:') ||\n lower.startsWith('mailto:') ||\n lower.startsWith('tel:') ||\n lower.startsWith('http:')\n ) {\n return false;\n }\n\n if (isSafeRelativeOrAnchor(cleaned)) {\n return true;\n }\n\n if (lower.startsWith('https://')) {\n if (!allowedHosts || allowedHosts.length === 0) {\n return false;\n }\n if (cleaned.includes('\\\\') || lower.includes('%5c')) return false;\n try {\n const parsed = new URL(cleaned);\n if (parsed.protocol !== 'https:') return false;\n\n const allowed = allowedHosts.map((h) => h.toLowerCase());\n return allowed.includes(parsed.hostname.toLowerCase());\n } catch {\n return false;\n }\n }\n\n return false;\n}\n","import type { FieldValidationError, FieldValidationResult } from './types';\nimport { isSafeRelativeOrAnchor, stripUrlControlChars } from './url';\n\nexport interface RichTextConstraints {\n nodes?: string[];\n marks?: string[];\n maxDepth?: number;\n maxNodes?: number;\n}\n\nexport const DEFAULT_ALLOWED_NODES = [\n 'doc',\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'blockquote',\n 'codeBlock',\n 'hardBreak',\n 'horizontalRule',\n 'text',\n 'image',\n];\n\nexport const DEFAULT_ALLOWED_MARKS = ['bold', 'italic', 'underline', 'strike', 'code', 'link'];\n\nconst FORBIDDEN_PROPERTY_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport function isValidLinkHref(rawHref: string): boolean {\n if (typeof rawHref !== 'string') return false;\n\n const cleaned = stripUrlControlChars(rawHref);\n if (cleaned.length === 0) return false;\n\n if (isSafeRelativeOrAnchor(cleaned)) {\n return true;\n }\n\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('https://') || lower.startsWith('mailto:') || lower.startsWith('tel:')) {\n return true;\n }\n\n return false;\n}\n\nfunction isValidImageSrc(rawSrc: string): boolean {\n if (typeof rawSrc !== 'string') return false;\n const cleaned = stripUrlControlChars(rawSrc);\n if (cleaned.length === 0) return false;\n if (isSafeRelativeOrAnchor(cleaned)) return true;\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('https://')) return true;\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(cleaned)) {\n return true;\n }\n return false;\n}\n\ntype AttrValidator = (val: unknown) => boolean;\n\nconst ALLOWED_NODE_ATTRS: Record<string, Record<string, AttrValidator>> = {\n doc: {},\n paragraph: {},\n heading: {\n level: (v) => typeof v === 'number' && Number.isInteger(v) && v >= 1 && v <= 6,\n },\n bulletList: {},\n orderedList: {\n order: (v) => typeof v === 'number' && Number.isInteger(v),\n start: (v) => typeof v === 'number' && Number.isInteger(v),\n },\n listItem: {},\n blockquote: {},\n codeBlock: {\n language: (v) => typeof v === 'string' && v.length <= 100,\n params: (v) => typeof v === 'string' && v.length <= 100,\n },\n hardBreak: {},\n horizontalRule: {},\n text: {},\n image: {\n src: (v) => typeof v === 'string' && isValidImageSrc(v),\n alt: (v) => typeof v === 'string' && v.length <= 2000,\n title: (v) => typeof v === 'string' && v.length <= 2000,\n width: (v) => typeof v === 'number' && v > 0,\n height: (v) => typeof v === 'number' && v > 0,\n },\n};\n\nconst ALLOWED_MARK_ATTRS: Record<string, Record<string, AttrValidator>> = {\n bold: {},\n italic: {},\n underline: {},\n strike: {},\n code: {},\n link: {\n href: (v) => typeof v === 'string' && isValidLinkHref(v),\n title: (v) => typeof v === 'string' && v.length <= 2000,\n target: (v) => typeof v === 'string' && ['_blank', '_self', '_parent', '_top'].includes(v),\n rel: (v) => typeof v === 'string' && v.length <= 100,\n },\n};\n\n/**\n * Validates a ProseMirror document structure against constraints and strict security rules.\n */\nexport function validateProseMirrorDoc(\n doc: unknown,\n constraints?: RichTextConstraints,\n): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n const maxDepth = constraints?.maxDepth ?? 50;\n const maxNodes = constraints?.maxNodes ?? 10_000;\n const allowedNodes = new Set(constraints?.nodes ?? DEFAULT_ALLOWED_NODES);\n const allowedMarks = new Set(constraints?.marks ?? DEFAULT_ALLOWED_MARKS);\n\n if (doc === null || typeof doc !== 'object' || Array.isArray(doc)) {\n return {\n valid: false,\n errors: [{ path: 'doc', message: 'Document root must be a JSON object', keyword: 'type' }],\n };\n }\n\n const rootObj = doc as Record<string, unknown>;\n if (rootObj.type !== 'doc') {\n return {\n valid: false,\n errors: [\n {\n path: 'doc',\n message: `Document root type must be 'doc', got '${String(rootObj.type)}'`,\n keyword: 'invalid_root_type',\n },\n ],\n };\n }\n\n let nodeCount = 0;\n const seenObjects = new WeakSet<object>();\n\n function validateNode(node: unknown, path: string, depth: number): boolean {\n if (depth > maxDepth) {\n errors.push({\n path,\n message: `Maximum nesting depth of ${maxDepth} exceeded`,\n keyword: 'maxDepth',\n });\n return false;\n }\n\n nodeCount++;\n if (nodeCount > maxNodes) {\n errors.push({\n path,\n message: `Maximum node budget of ${maxNodes} exceeded`,\n keyword: 'maxNodes',\n });\n return false;\n }\n\n if (node === null || typeof node !== 'object' || Array.isArray(node)) {\n errors.push({\n path,\n message: 'Node must be a JSON object',\n keyword: 'type',\n });\n return false;\n }\n\n // Cyclic reference check\n if (seenObjects.has(node)) {\n errors.push({\n path,\n message: 'Cyclic reference detected in document',\n keyword: 'cycle',\n });\n return false;\n }\n seenObjects.add(node);\n\n const obj = node as Record<string, unknown>;\n\n // Check forbidden keys on node object\n for (const key of Object.keys(obj)) {\n if (FORBIDDEN_PROPERTY_KEYS.has(key)) {\n errors.push({\n path: `${path}/${key}`,\n message: `Forbidden property '${key}' detected`,\n keyword: 'security',\n });\n return false;\n }\n }\n\n const nodeType = typeof obj.type === 'string' ? obj.type : '';\n if (!nodeType || !allowedNodes.has(nodeType)) {\n errors.push({\n path,\n message: `Unknown or disallowed node type: '${nodeType || String(obj.type)}'`,\n keyword: 'disallowed_node_type',\n });\n return false;\n }\n\n // Node attribute validation\n const allowedAttrsForType = ALLOWED_NODE_ATTRS[nodeType];\n if (obj.attrs !== undefined) {\n if (obj.attrs === null || typeof obj.attrs !== 'object' || Array.isArray(obj.attrs)) {\n errors.push({\n path: `${path}/attrs`,\n message: 'Node attrs must be an object',\n keyword: 'type',\n });\n } else {\n const attrsObj = obj.attrs as Record<string, unknown>;\n for (const [attrKey, attrVal] of Object.entries(attrsObj)) {\n if (FORBIDDEN_PROPERTY_KEYS.has(attrKey)) {\n errors.push({\n path: `${path}/attrs/${attrKey}`,\n message: `Forbidden attribute key '${attrKey}'`,\n keyword: 'security',\n });\n continue;\n }\n\n const validator = allowedAttrsForType?.[attrKey];\n if (!validator) {\n errors.push({\n path: `${path}/attrs/${attrKey}`,\n message: `Unknown attribute '${attrKey}' for node type '${nodeType}'`,\n keyword: 'unknown_attribute',\n });\n } else if (!validator(attrVal)) {\n errors.push({\n path: `${path}/attrs/${attrKey}`,\n message: `Invalid value for attribute '${attrKey}' on node type '${nodeType}'`,\n keyword: 'invalid_attribute_value',\n });\n }\n }\n }\n }\n\n // Text node specifics\n if (nodeType === 'text') {\n if (typeof obj.text !== 'string') {\n errors.push({\n path: `${path}/text`,\n message: 'Text node must have a string text property',\n keyword: 'missing_text',\n });\n }\n if (obj.content !== undefined) {\n errors.push({\n path: `${path}/content`,\n message: 'Text node must not have content',\n keyword: 'invalid_content',\n });\n }\n }\n\n // Marks validation\n if (obj.marks !== undefined) {\n if (!Array.isArray(obj.marks)) {\n errors.push({\n path: `${path}/marks`,\n message: 'Marks must be an array',\n keyword: 'type',\n });\n } else {\n obj.marks.forEach((mark, markIdx) => {\n const markPath = `${path}/marks/${markIdx}`;\n if (mark === null || typeof mark !== 'object' || Array.isArray(mark)) {\n errors.push({\n path: markPath,\n message: 'Mark must be an object',\n keyword: 'type',\n });\n return;\n }\n const markObj = mark as Record<string, unknown>;\n const markType = typeof markObj.type === 'string' ? markObj.type : '';\n if (!markType || !allowedMarks.has(markType)) {\n errors.push({\n path: markPath,\n message: `Unknown or disallowed mark type: '${markType || String(markObj.type)}'`,\n keyword: 'disallowed_mark_type',\n });\n return;\n }\n\n const allowedMarkAttrs = ALLOWED_MARK_ATTRS[markType];\n if (markObj.attrs !== undefined) {\n if (\n markObj.attrs === null ||\n typeof markObj.attrs !== 'object' ||\n Array.isArray(markObj.attrs)\n ) {\n errors.push({\n path: `${markPath}/attrs`,\n message: 'Mark attrs must be an object',\n keyword: 'type',\n });\n } else {\n const attrsObj = markObj.attrs as Record<string, unknown>;\n for (const [attrKey, attrVal] of Object.entries(attrsObj)) {\n if (FORBIDDEN_PROPERTY_KEYS.has(attrKey)) {\n errors.push({\n path: `${markPath}/attrs/${attrKey}`,\n message: `Forbidden attribute key '${attrKey}' in mark`,\n keyword: 'security',\n });\n continue;\n }\n const validator = allowedMarkAttrs?.[attrKey];\n if (!validator) {\n errors.push({\n path: `${markPath}/attrs/${attrKey}`,\n message: `Unknown attribute '${attrKey}' for mark '${markType}'`,\n keyword: 'unknown_attribute',\n });\n } else if (!validator(attrVal)) {\n errors.push({\n path: `${markPath}/attrs/${attrKey}`,\n message: `Invalid value for attribute '${attrKey}' in mark '${markType}'`,\n keyword: 'invalid_attribute_value',\n });\n }\n }\n }\n }\n });\n }\n }\n\n // Content children validation\n if (obj.content !== undefined) {\n if (!Array.isArray(obj.content)) {\n errors.push({\n path: `${path}/content`,\n message: 'Content must be an array of nodes',\n keyword: 'type',\n });\n } else {\n for (let i = 0; i < obj.content.length; i++) {\n const childPath = `${path}/content/${i}`;\n const ok = validateNode(obj.content[i], childPath, depth + 1);\n if (!ok && (nodeCount > maxNodes || depth + 1 > maxDepth)) {\n // Stop early on budget/depth overflows to avoid massive overhead\n break;\n }\n }\n }\n }\n\n return errors.length === 0;\n }\n\n validateNode(doc, 'doc', 1);\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n}\n","import { type RichTextConstraints, validateProseMirrorDoc } from '../richtext';\nimport type { FieldTypeDefinition, FieldValidationResult } from '../types';\n\nexport const richtextType: FieldTypeDefinition<Record<string, unknown>> = {\n id: 'richtext',\n aliases: ['richText'],\n defaultValue: {\n type: 'doc',\n content: [],\n },\n renderHint: { tag: 'div' },\n constraintsSchema: {\n type: 'object',\n properties: {\n nodes: {\n type: 'array',\n items: { type: 'string' },\n },\n marks: {\n type: 'array',\n items: { type: 'string' },\n },\n maxDepth: { type: 'integer', minimum: 1 },\n maxNodes: { type: 'integer', minimum: 1 },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n return validateProseMirrorDoc(value, constraints as RichTextConstraints);\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\nexport interface SelectConstraints {\n options?: Array<string | SelectOption>;\n}\n\nexport const selectType: FieldTypeDefinition<string> = {\n id: 'select',\n defaultValue: '',\n constraintsSchema: {\n type: 'object',\n properties: {\n options: {\n type: 'array',\n items: {\n anyOf: [\n { type: 'string' },\n {\n type: 'object',\n properties: {\n label: { type: 'string' },\n value: { type: 'string' },\n },\n required: ['label', 'value'],\n additionalProperties: false,\n },\n ],\n },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (typeof value !== 'string') {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected string, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const c = (constraints || {}) as SelectConstraints;\n\n if (Array.isArray(c.options) && c.options.length > 0) {\n const allowedValues = c.options.map((opt) =>\n typeof opt === 'string' ? opt : opt && typeof opt === 'object' ? opt.value : '',\n );\n\n // Allow empty string if default or if included in allowed values\n if (value !== '' && !allowedValues.includes(value)) {\n errors.push({\n path: '',\n message: `Value '${value}' is not in allowed options: [${allowedValues.map((v) => JSON.stringify(v)).join(', ')}]`,\n keyword: 'enum',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\nimport { isSafeMediaSrc } from '../url';\n\nexport interface StreamVideoValue {\n uid: string;\n durationMs?: number;\n thumbnail?: string;\n ready?: boolean;\n}\n\nexport interface StreamVideoConstraints {\n maxDurationSeconds?: number;\n allowedThumbnailHosts?: string[];\n}\n\nconst ALLOWED_KEYS = new Set(['uid', 'durationMs', 'thumbnail', 'ready']);\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\nconst STREAM_UID_REGEX = /^[0-9a-f]{32}$/;\n\nexport const streamVideoType: FieldTypeDefinition<StreamVideoValue | null> = {\n id: 'media.streamVideo',\n aliases: ['streamVideo'],\n defaultValue: null,\n renderHint: { tag: 'video' },\n constraintsSchema: {\n type: 'object',\n properties: {\n maxDurationSeconds: { type: 'integer', minimum: 0 },\n allowedThumbnailHosts: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as StreamVideoConstraints;\n\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n if (typeof value !== 'object' || Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected streamVideo object or null, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const obj = value as Record<string, unknown>;\n\n // Check unknown / forbidden keys\n for (const key of Object.keys(obj)) {\n if (FORBIDDEN_KEYS.has(key) || !ALLOWED_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Unknown or forbidden property '${key}' in streamVideo object`,\n keyword: 'additional_properties',\n });\n }\n }\n\n // Check uid (required)\n if (typeof obj.uid !== 'string' || !STREAM_UID_REGEX.test(obj.uid.trim())) {\n errors.push({\n path: 'uid',\n message: 'streamVideo uid is required and must be a 32-character hexadecimal string',\n keyword: 'pattern',\n });\n }\n\n // Check durationMs (optional)\n if (obj.durationMs !== undefined && obj.durationMs !== null) {\n if (\n typeof obj.durationMs !== 'number' ||\n Number.isNaN(obj.durationMs) ||\n obj.durationMs < 0\n ) {\n errors.push({\n path: 'durationMs',\n message: 'durationMs must be a non-negative number',\n keyword: 'type',\n });\n } else if (\n c.maxDurationSeconds !== undefined &&\n obj.durationMs > c.maxDurationSeconds * 1000\n ) {\n errors.push({\n path: 'durationMs',\n message: `Video duration (${Math.round(obj.durationMs / 1000)}s) exceeds max duration of ${c.maxDurationSeconds}s`,\n keyword: 'max_duration',\n });\n }\n }\n\n // Check thumbnail (optional)\n if (obj.thumbnail !== undefined && obj.thumbnail !== null && obj.thumbnail !== '') {\n if (typeof obj.thumbnail !== 'string') {\n errors.push({\n path: 'thumbnail',\n message: 'thumbnail must be a string URL',\n keyword: 'type',\n });\n } else if (!isSafeMediaSrc(obj.thumbnail, c.allowedThumbnailHosts)) {\n errors.push({\n path: 'thumbnail',\n message: `Thumbnail '${obj.thumbnail}' is not a valid or safe media URL`,\n keyword: 'thumbnail_invalid',\n });\n }\n }\n\n // Check ready (optional)\n if (obj.ready !== undefined && obj.ready !== null) {\n if (typeof obj.ready !== 'boolean') {\n errors.push({\n path: 'ready',\n message: 'ready must be a boolean',\n keyword: 'type',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface TextConstraints {\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n}\n\nexport const textType: FieldTypeDefinition<string> = {\n id: 'text',\n defaultValue: '',\n constraintsSchema: {\n type: 'object',\n properties: {\n minLength: { type: 'integer', minimum: 0 },\n maxLength: { type: 'integer', minimum: 0 },\n pattern: { type: 'string' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (typeof value !== 'string') {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected string, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const c = (constraints || {}) as TextConstraints;\n\n if (typeof c.minLength === 'number' && value.length < c.minLength) {\n errors.push({\n path: '',\n message: `String length ${value.length} is less than minimum ${c.minLength}`,\n keyword: 'minLength',\n });\n }\n\n if (typeof c.maxLength === 'number' && value.length > c.maxLength) {\n errors.push({\n path: '',\n message: `String length ${value.length} exceeds maximum ${c.maxLength}`,\n keyword: 'maxLength',\n });\n }\n\n if (typeof c.pattern === 'string') {\n try {\n const regex = new RegExp(c.pattern);\n if (!regex.test(value)) {\n errors.push({\n path: '',\n message: `String does not match required pattern ${c.pattern}`,\n keyword: 'pattern',\n });\n }\n } catch (_e) {\n errors.push({\n path: '',\n message: `Invalid regex pattern in constraints: ${c.pattern}`,\n keyword: 'pattern_invalid',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationResult } from '../types';\n\nexport const toggleType: FieldTypeDefinition<boolean> = {\n id: 'toggle',\n defaultValue: false,\n constraintsSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false,\n },\n validate(value: unknown): FieldValidationResult {\n if (typeof value !== 'boolean') {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected boolean, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n return { valid: true };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface VideoConstraints {\n maxSizeBytes?: number;\n allowedMimeTypes?: string[];\n}\n\nexport const videoType: FieldTypeDefinition<string | null> = {\n id: 'video',\n aliases: ['vid'],\n defaultValue: null,\n renderHint: { tag: 'video' },\n constraintsSchema: {\n type: 'object',\n properties: {\n maxSizeBytes: { type: 'integer', minimum: 0 },\n allowedMimeTypes: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n if (typeof value === 'string') {\n // UUID or URL or relative path\n return { valid: true };\n }\n\n if (typeof value === 'object' && value !== null) {\n // Object reference: discriminated { kind: 'asset', id }, { kind: 'url', src }, or legacy { id } / { url }\n const obj = value as Record<string, unknown>;\n if (obj.kind === 'asset' && typeof obj.id === 'string' && obj.id.trim()) {\n return { valid: true };\n }\n if (obj.kind === 'url' && typeof obj.src === 'string' && obj.src.trim()) {\n return { valid: true };\n }\n if (typeof obj.id === 'string' || typeof obj.url === 'string') {\n return { valid: true };\n }\n errors.push({\n path: '',\n message: 'Video object must contain an id, url, or valid kind (asset/url)',\n keyword: 'video_structure',\n });\n return { valid: false, errors };\n }\n\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected video reference (UUID string, URL, or asset object), got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\nimport { isSafeActionHref, isSafeMediaSrc } from '../url';\n\nexport type MediaRef = string | { kind: 'asset'; id: string } | { kind: 'url'; src: string };\n\nexport interface VideoItem {\n src: MediaRef;\n poster?: MediaRef;\n caption?: string;\n href?: string;\n}\n\nexport interface VideoListConstraints {\n maxItems?: number;\n allowedSrcHosts?: string[];\n allowedHrefHosts?: string[];\n maxCaptionLength?: number;\n}\n\nconst ALLOWED_ITEM_KEYS = new Set(['src', 'poster', 'caption', 'href']);\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport const videoListType: FieldTypeDefinition<VideoItem[]> = {\n id: 'media.videoList',\n aliases: ['videoList'],\n defaultValue: [],\n constraintsSchema: {\n type: 'object',\n properties: {\n maxItems: { type: 'integer', minimum: 0, default: 24 },\n allowedSrcHosts: {\n type: 'array',\n items: { type: 'string' },\n },\n allowedHrefHosts: {\n type: 'array',\n items: { type: 'string' },\n },\n maxCaptionLength: { type: 'integer', minimum: 0, default: 300 },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as VideoListConstraints;\n const maxItems = typeof c.maxItems === 'number' ? c.maxItems : 24;\n const maxCaptionLength = typeof c.maxCaptionLength === 'number' ? c.maxCaptionLength : 300;\n\n if (value === null || value === undefined) {\n return { valid: true };\n }\n\n if (!Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected array for videoList, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n if (value.length > maxItems) {\n errors.push({\n path: '',\n message: `Video list exceeds maximum item count of ${maxItems} (got ${value.length})`,\n keyword: 'max_items',\n });\n }\n\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const itemPath = `videos[${i}]`;\n\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n errors.push({\n path: itemPath,\n message: `Expected video item object, got ${item === null ? 'null' : Array.isArray(item) ? 'array' : typeof item}`,\n keyword: 'type',\n });\n continue;\n }\n\n const record = item as Record<string, unknown>;\n\n // Check forbidden or unknown keys\n for (const k of Object.keys(record)) {\n if (FORBIDDEN_KEYS.has(k) || !ALLOWED_ITEM_KEYS.has(k)) {\n errors.push({\n path: `${itemPath}.${k}`,\n message: `Unknown or forbidden property '${k}' in video item`,\n keyword: 'additional_properties',\n });\n }\n }\n\n // Check src (required)\n if (typeof record.src === 'string') {\n if (!record.src.trim()) {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video src is required and must be a non-empty string',\n keyword: 'required',\n });\n } else if (!isSafeMediaSrc(record.src, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.src`,\n message: `Video src '${record.src}' is not a valid or safe media URL/reference`,\n keyword: 'video_src_invalid',\n });\n }\n } else if (typeof record.src === 'object' && record.src !== null) {\n const srcObj = record.src as Record<string, unknown>;\n if (srcObj.kind === 'asset') {\n if (typeof srcObj.id !== 'string' || !srcObj.id.trim()) {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video asset reference must include a valid id',\n keyword: 'required',\n });\n }\n } else if (srcObj.kind === 'url') {\n if (typeof srcObj.src !== 'string' || !srcObj.src.trim()) {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video url reference must include a valid src',\n keyword: 'required',\n });\n } else if (!isSafeMediaSrc(srcObj.src, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.src`,\n message: `Video src '${srcObj.src}' is not a valid or safe media URL/reference`,\n keyword: 'video_src_invalid',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video src object must have kind \"asset\" or \"url\"',\n keyword: 'type',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video src is required and must be a string or media reference object',\n keyword: 'required',\n });\n }\n\n // Check poster (optional)\n if (record.poster !== undefined && record.poster !== null && record.poster !== '') {\n if (typeof record.poster === 'string') {\n if (!isSafeMediaSrc(record.poster, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.poster`,\n message: `Video poster '${record.poster}' is not a valid or safe media URL/reference`,\n keyword: 'video_poster_invalid',\n });\n }\n } else if (typeof record.poster === 'object' && record.poster !== null) {\n const posterObj = record.poster as Record<string, unknown>;\n if (posterObj.kind === 'asset') {\n if (typeof posterObj.id !== 'string' || !posterObj.id.trim()) {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Poster asset reference must include a valid id',\n keyword: 'required',\n });\n }\n } else if (posterObj.kind === 'url') {\n if (typeof posterObj.src !== 'string' || !posterObj.src.trim()) {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Poster url reference must include a valid src',\n keyword: 'required',\n });\n } else if (!isSafeMediaSrc(posterObj.src, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.poster`,\n message: `Video poster '${posterObj.src}' is not a valid or safe media URL/reference`,\n keyword: 'video_poster_invalid',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Video poster object must have kind \"asset\" or \"url\"',\n keyword: 'type',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Video poster must be a string or media reference object',\n keyword: 'type',\n });\n }\n }\n\n // Check href (optional)\n if (record.href !== undefined && record.href !== null && record.href !== '') {\n if (typeof record.href !== 'string') {\n errors.push({\n path: `${itemPath}.href`,\n message: 'Video href must be a string',\n keyword: 'type',\n });\n } else if (!isSafeActionHref(record.href, c.allowedHrefHosts)) {\n errors.push({\n path: `${itemPath}.href`,\n message: `Video href '${record.href}' is not allowed or invalid`,\n keyword: 'video_href_not_allowed',\n });\n }\n }\n\n // Check caption (optional)\n if (record.caption !== undefined && record.caption !== null) {\n if (typeof record.caption !== 'string') {\n errors.push({\n path: `${itemPath}.caption`,\n message: 'Video caption must be a string',\n keyword: 'type',\n });\n } else if (record.caption.length > maxCaptionLength) {\n errors.push({\n path: `${itemPath}.caption`,\n message: `Video caption length (${record.caption.length}) exceeds maximum ${maxCaptionLength}`,\n keyword: 'max_length',\n });\n }\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import { registerFieldType } from './registry';\nimport { addressListType, addressType } from './types/address';\nimport { geoAreaType } from './types/geoArea';\nimport { imageType } from './types/image';\nimport { numberType } from './types/number';\nimport { richtextType } from './types/richtext';\nimport { selectType } from './types/select';\nimport { streamVideoType } from './types/streamVideo';\nimport { textType } from './types/text';\nimport { toggleType } from './types/toggle';\nimport { videoType } from './types/video';\nimport { videoListType } from './types/videoList';\n\n// Automatically register all base field types\nexport function registerBaseTypes(): void {\n registerFieldType(textType);\n registerFieldType(numberType);\n registerFieldType(toggleType);\n registerFieldType(selectType);\n registerFieldType(imageType);\n registerFieldType(richtextType);\n registerFieldType(videoType);\n registerFieldType(videoListType);\n registerFieldType(geoAreaType);\n registerFieldType(addressType);\n registerFieldType(addressListType);\n registerFieldType(streamVideoType);\n}\n\nregisterBaseTypes();\n\nexport * from './types';\nexport * from './registry';\nexport * from './richtext';\nexport * from './url';\nexport * from './types/text';\nexport * from './types/number';\nexport * from './types/toggle';\nexport * from './types/select';\nexport * from './types/image';\nexport * from './types/richtext';\nexport * from './types/video';\nexport * from './types/videoList';\nexport * from './types/geoArea';\nexport * from './types/address';\nexport * from './types/streamVideo';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry.ts","../src/types/address.ts","../src/types/geoArea.ts","../src/types/image.ts","../src/types/number.ts","../src/url.ts","../src/richtext.ts","../src/types/richtext.ts","../src/types/select.ts","../src/types/streamVideo.ts","../src/types/text.ts","../src/types/toggle.ts","../src/types/video.ts","../src/types/videoList.ts","../src/index.ts"],"names":["FORBIDDEN_KEYS"],"mappings":"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","file":"index.js","sourcesContent":["import type { FieldTypeDefinition, FieldValidationResult } from './types';\n\nconst registry = new Map<string, FieldTypeDefinition>();\n\n/**\n * Registers a new or custom field type.\n */\nexport function registerFieldType(def: FieldTypeDefinition): void {\n registry.set(def.id, def);\n}\n\n/**\n * Retrieves a field type definition by ID.\n */\nexport function getFieldType(id: string): FieldTypeDefinition | undefined {\n return registry.get(id);\n}\n\n/**\n * Checks whether a field type ID is registered.\n */\nexport function hasFieldType(id: string): boolean {\n return registry.has(id);\n}\n\n/**\n * Returns all registered field type definitions.\n */\nexport function listFieldTypes(): FieldTypeDefinition[] {\n return Array.from(registry.values());\n}\n\n/**\n * Returns all registered field type IDs.\n */\nexport function listFieldTypeIds(): string[] {\n return Array.from(registry.keys());\n}\n\n/**\n * Returns a map of all registered aliases to their canonical field type IDs.\n */\nexport function fieldTypeAliases(): Map<string, string> {\n const aliases = new Map<string, string>();\n for (const def of registry.values()) {\n if (def.aliases) {\n for (const alias of def.aliases) {\n aliases.set(alias, def.id);\n }\n }\n }\n return aliases;\n}\n\n/**\n * Resolves a field method/alias name to its canonical field type ID.\n */\nexport function resolveTypeAlias(name: string): string {\n if (registry.has(name)) {\n return name;\n }\n const aliasMap = fieldTypeAliases();\n return aliasMap.get(name) ?? name;\n}\n\n/**\n * Normalizes a field value using the field type's normalize hook if defined.\n * Never throws — returns input value unchanged if no normalize hook or on error.\n */\nexport function normalizeFieldValue(\n typeId: string,\n value: unknown,\n constraints?: Record<string, unknown>,\n): unknown {\n const canonicalId = resolveTypeAlias(typeId);\n const typeDef = registry.get(canonicalId) || registry.get(typeId);\n if (!typeDef?.normalize) {\n return value;\n }\n try {\n return typeDef.normalize(value, constraints);\n } catch {\n return value;\n }\n}\n\n/**\n * Given a list of field type IDs, returns any IDs that are not registered.\n */\nexport function unknownTypeIds(ids: string[]): string[] {\n return ids.filter((id) => !registry.has(resolveTypeAlias(id)));\n}\n\n/**\n * Validates a field value against a field type's validator and constraints.\n * Never throws — returns an unknown_type error if type is not registered.\n */\nexport function validateFieldValue(\n typeId: string,\n value: unknown,\n constraints?: Record<string, unknown>,\n): FieldValidationResult {\n const canonicalId = resolveTypeAlias(typeId);\n const typeDef = registry.get(canonicalId) || registry.get(typeId);\n if (!typeDef) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Unknown field type: '${typeId}'`,\n keyword: 'unknown_type',\n },\n ],\n };\n }\n\n try {\n return typeDef.validate(value, constraints);\n } catch (err) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: err instanceof Error ? err.message : 'Validation exception',\n keyword: 'validation_error',\n },\n ],\n };\n }\n}\n\n/**\n * Resets the registry (useful for test isolation).\n */\nexport function resetRegistry(): void {\n registry.clear();\n}\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface Address {\n line1: string;\n line2?: string;\n city: string;\n region: string;\n postal: string;\n country: string;\n lat?: number;\n lng?: number;\n}\n\nexport interface AddressConstraints {\n countryFormat?: 'iso2' | 'free';\n}\n\nexport interface AddressListConstraints extends AddressConstraints {\n minItems?: number;\n maxItems?: number;\n}\n\nconst ALLOWED_ADDRESS_KEYS = new Set([\n 'line1',\n 'line2',\n 'city',\n 'region',\n 'postal',\n 'country',\n 'lat',\n 'lng',\n]);\n\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\nconst ISO2_REGEX = /^[A-Za-z]{2}$/;\n\nexport const addressType: FieldTypeDefinition<Address | null> = {\n id: 'address',\n defaultValue: null,\n constraintsSchema: {\n type: 'object',\n properties: {\n countryFormat: { type: 'string', enum: ['iso2', 'free'], default: 'iso2' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n if (value === null || value === undefined) {\n return { valid: true };\n }\n\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as AddressConstraints;\n const countryFormat = c.countryFormat || 'iso2';\n\n if (typeof value !== 'object' || Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected address object, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const record = value as Record<string, unknown>;\n\n for (const key of Object.keys(record)) {\n if (FORBIDDEN_KEYS.has(key) || !ALLOWED_ADDRESS_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Unknown or forbidden property '${key}' in address`,\n keyword: 'additional_properties',\n });\n }\n }\n\n const requiredStringFields: Array<keyof Address> = [\n 'line1',\n 'city',\n 'region',\n 'postal',\n 'country',\n ];\n for (const field of requiredStringFields) {\n const val = record[field];\n if (typeof val !== 'string' || !val.trim()) {\n errors.push({\n path: field,\n message: `Address field '${field}' is required and must be a non-empty string`,\n keyword: 'required',\n });\n }\n }\n\n // Optional line2\n if (record.line2 !== undefined && record.line2 !== null && record.line2 !== '') {\n if (typeof record.line2 !== 'string') {\n errors.push({\n path: 'line2',\n message: 'Address line2 must be a string',\n keyword: 'type',\n });\n }\n }\n\n // Country format check\n if (typeof record.country === 'string' && record.country.trim()) {\n if (countryFormat === 'iso2' && !ISO2_REGEX.test(record.country.trim())) {\n errors.push({\n path: 'country',\n message: `Country '${record.country}' must be a 2-letter ISO-3166-1 alpha-2 code`,\n keyword: 'country_format',\n });\n }\n }\n\n // Optional lat / lng\n if (record.lat !== undefined && record.lat !== null) {\n if (typeof record.lat !== 'number' || !Number.isFinite(record.lat)) {\n errors.push({\n path: 'lat',\n message: 'Latitude must be a finite number',\n keyword: 'type',\n });\n } else if (record.lat < -90 || record.lat > 90) {\n errors.push({\n path: 'lat',\n message: `Latitude ${record.lat} is out of bounds (must be between -90 and 90)`,\n keyword: 'lat_out_of_bounds',\n });\n }\n }\n\n if (record.lng !== undefined && record.lng !== null) {\n if (typeof record.lng !== 'number' || !Number.isFinite(record.lng)) {\n errors.push({\n path: 'lng',\n message: 'Longitude must be a finite number',\n keyword: 'type',\n });\n } else if (record.lng < -180 || record.lng > 180) {\n errors.push({\n path: 'lng',\n message: `Longitude ${record.lng} is out of bounds (must be between -180 and 180)`,\n keyword: 'lng_out_of_bounds',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n\nexport const addressListType: FieldTypeDefinition<Address[]> = {\n id: 'address.list',\n aliases: ['addressList'],\n defaultValue: [],\n constraintsSchema: {\n type: 'object',\n properties: {\n minItems: { type: 'integer', minimum: 0 },\n maxItems: { type: 'integer', minimum: 0, default: 25 },\n countryFormat: { type: 'string', enum: ['iso2', 'free'], default: 'iso2' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n if (value === null || value === undefined) {\n return { valid: true };\n }\n\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as AddressListConstraints;\n const maxItems = typeof c.maxItems === 'number' ? c.maxItems : 25;\n\n if (!Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected array for address.list, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n if (typeof c.minItems === 'number' && value.length < c.minItems) {\n errors.push({\n path: '',\n message: `Address list item count (${value.length}) is less than minimum (${c.minItems})`,\n keyword: 'min_items',\n });\n }\n\n if (value.length > maxItems) {\n errors.push({\n path: '',\n message: `Address list item count (${value.length}) exceeds maximum (${maxItems})`,\n keyword: 'max_items',\n });\n }\n\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const itemResult = addressType.validate(item, constraints);\n if (!itemResult.valid) {\n for (const err of itemResult.errors) {\n const itemPath = err.path ? `[${i}].${err.path}` : `[${i}]`;\n errors.push({\n path: itemPath,\n message: err.message,\n keyword: err.keyword,\n });\n }\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface GeoAreaConstraints {\n maxVertices?: number;\n maxRings?: number;\n}\n\nexport interface GeoJsonPolygon {\n type: 'Polygon';\n coordinates: number[][][]; // [ [ [lon, lat], ... ] ]\n}\n\nexport interface GeoJsonMultiPolygon {\n type: 'MultiPolygon';\n coordinates: number[][][][]; // [ [ [ [lon, lat], ... ] ] ]\n}\n\nexport type GeoAreaValue = GeoJsonPolygon | GeoJsonMultiPolygon | null;\n\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction crossProduct(\n a: readonly [number, number],\n b: readonly [number, number],\n c: readonly [number, number],\n): number {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n}\n\nconst EPSILON = 1e-12;\n\nfunction isPointOnSegment(\n p: readonly [number, number],\n a: readonly [number, number],\n b: readonly [number, number],\n): boolean {\n return (\n p[0] >= Math.min(a[0], b[0]) - EPSILON &&\n p[0] <= Math.max(a[0], b[0]) + EPSILON &&\n p[1] >= Math.min(a[1], b[1]) - EPSILON &&\n p[1] <= Math.max(a[1], b[1]) + EPSILON\n );\n}\n\n/**\n * Determines whether line segment A-B intersects with line segment C-D.\n */\nfunction segmentsIntersect(\n a: readonly [number, number],\n b: readonly [number, number],\n c: readonly [number, number],\n d: readonly [number, number],\n): boolean {\n const cp1 = crossProduct(a, b, c);\n const cp2 = crossProduct(a, b, d);\n const cp3 = crossProduct(c, d, a);\n const cp4 = crossProduct(c, d, b);\n\n // General proper intersection (segments cross each other)\n if (\n ((cp1 > EPSILON && cp2 < -EPSILON) || (cp1 < -EPSILON && cp2 > EPSILON)) &&\n ((cp3 > EPSILON && cp4 < -EPSILON) || (cp3 < -EPSILON && cp4 > EPSILON))\n ) {\n return true;\n }\n\n // Collinear or endpoint on segment\n if (Math.abs(cp1) <= EPSILON && isPointOnSegment(c, a, b)) return true;\n if (Math.abs(cp2) <= EPSILON && isPointOnSegment(d, a, b)) return true;\n if (Math.abs(cp3) <= EPSILON && isPointOnSegment(a, c, d)) return true;\n if (Math.abs(cp4) <= EPSILON && isPointOnSegment(b, c, d)) return true;\n\n return false;\n}\n\n/**\n * Finds the first self-intersection in a single LinearRing.\n * Returns offending segment indices [i, j] or null if no self-intersection.\n */\nfunction findRingSelfIntersection(\n ring: Array<readonly [number, number] | number[]>,\n): [number, number] | null {\n const numSegments = ring.length - 1;\n if (numSegments < 3) return null;\n\n for (let i = 0; i < numSegments; i++) {\n const a = ring[i] as readonly [number, number];\n const b = ring[i + 1] as readonly [number, number];\n\n for (let j = i + 1; j < numSegments; j++) {\n // Skip adjacent segments sharing an endpoint\n if (j === i + 1) continue;\n // Skip first and last segment which share the closed ring start/end vertex\n if (i === 0 && j === numSegments - 1) continue;\n\n const c = ring[j] as readonly [number, number];\n const d = ring[j + 1] as readonly [number, number];\n\n if (segmentsIntersect(a, b, c, d)) {\n return [i, j];\n }\n }\n }\n\n return null;\n}\n\n/**\n * Normalizes a single ring by removing consecutive duplicate points and auto-closing.\n */\nfunction normalizeRing(rawRing: unknown[]): number[][] {\n if (!Array.isArray(rawRing) || rawRing.length === 0) {\n return [];\n }\n\n const cleaned: number[][] = [];\n for (const pos of rawRing) {\n if (!Array.isArray(pos) || pos.length < 2) continue;\n const lon = Number(pos[0]);\n const lat = Number(pos[1]);\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) continue;\n\n // Drop consecutive duplicates\n if (cleaned.length > 0) {\n const prev = cleaned[cleaned.length - 1];\n if (Math.abs(prev[0] - lon) < EPSILON && Math.abs(prev[1] - lat) < EPSILON) {\n continue;\n }\n }\n cleaned.push([lon, lat]);\n }\n\n // Auto-close ring if needed and at least 3 points exist\n if (cleaned.length >= 1) {\n const first = cleaned[0];\n const last = cleaned[cleaned.length - 1];\n if (Math.abs(first[0] - last[0]) >= EPSILON || Math.abs(first[1] - last[1]) >= EPSILON) {\n cleaned.push([first[0], first[1]]);\n }\n }\n\n return cleaned;\n}\n\n/**\n * Pure repair pass for GeoJSON geometry:\n * Auto-closes rings and removes consecutive duplicate positions.\n */\nexport function normalizeGeoArea(value: unknown): unknown {\n if (!value) {\n return value;\n }\n\n let obj = value as Record<string, unknown>;\n if (typeof value === 'string') {\n try {\n obj = JSON.parse(value);\n } catch {\n return value;\n }\n }\n\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return value;\n }\n\n if (obj.type === 'Polygon' && Array.isArray(obj.coordinates)) {\n const newCoords = (obj.coordinates as unknown[][]).map((ring) => normalizeRing(ring));\n return {\n ...obj,\n type: 'Polygon',\n coordinates: newCoords,\n };\n }\n\n if (obj.type === 'MultiPolygon' && Array.isArray(obj.coordinates)) {\n const newCoords = (obj.coordinates as unknown[][][]).map((poly) =>\n Array.isArray(poly) ? poly.map((ring) => normalizeRing(ring)) : [],\n );\n return {\n ...obj,\n type: 'MultiPolygon',\n coordinates: newCoords,\n };\n }\n\n return value;\n}\n\nexport const geoAreaType: FieldTypeDefinition<GeoAreaValue> = {\n id: 'geo.area',\n aliases: ['geoArea'],\n defaultValue: null,\n constraintsSchema: {\n type: 'object',\n properties: {\n maxVertices: { type: 'integer', minimum: 4, default: 2000 },\n maxRings: { type: 'integer', minimum: 1, default: 20 },\n },\n additionalProperties: false,\n },\n normalize: normalizeGeoArea,\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as GeoAreaConstraints;\n const maxVertices = typeof c.maxVertices === 'number' ? c.maxVertices : 2000;\n const maxRings = typeof c.maxRings === 'number' ? c.maxRings : 20;\n\n let targetValue = value;\n if (typeof value === 'string') {\n try {\n targetValue = JSON.parse(value);\n } catch {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: 'Expected GeoJSON object for geo.area, got invalid JSON string',\n keyword: 'type',\n },\n ],\n };\n }\n }\n\n if (typeof targetValue !== 'object' || targetValue === null || Array.isArray(targetValue)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected GeoJSON object for geo.area, got ${typeof targetValue}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const record = targetValue as Record<string, unknown>;\n\n for (const key of Object.keys(record)) {\n if (FORBIDDEN_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Forbidden property '${key}' in GeoJSON object`,\n keyword: 'forbidden_property',\n });\n }\n }\n\n if (record.type !== 'Polygon' && record.type !== 'MultiPolygon') {\n errors.push({\n path: 'type',\n message: `GeoJSON type must be 'Polygon' or 'MultiPolygon', got '${String(record.type)}'`,\n keyword: 'geo_invalid_type',\n });\n return { valid: false, errors };\n }\n\n if (!Array.isArray(record.coordinates)) {\n errors.push({\n path: 'coordinates',\n message: 'GeoJSON coordinates property must be an array',\n keyword: 'type',\n });\n return { valid: false, errors };\n }\n\n // Collect all rings with their logical paths\n interface RingItem {\n ring: unknown[];\n path: string;\n }\n const rings: RingItem[] = [];\n\n if (record.type === 'Polygon') {\n const polyCoords = record.coordinates as unknown[];\n for (let r = 0; r < polyCoords.length; r++) {\n if (!Array.isArray(polyCoords[r])) {\n errors.push({\n path: `coordinates[${r}]`,\n message: `LinearRing at coordinates[${r}] must be an array of coordinates`,\n keyword: 'type',\n });\n } else {\n rings.push({ ring: polyCoords[r] as unknown[], path: `coordinates[${r}]` });\n }\n }\n } else {\n // MultiPolygon\n const multiCoords = record.coordinates as unknown[];\n for (let p = 0; p < multiCoords.length; p++) {\n const poly = multiCoords[p];\n if (!Array.isArray(poly)) {\n errors.push({\n path: `coordinates[${p}]`,\n message: `Polygon at coordinates[${p}] must be an array of rings`,\n keyword: 'type',\n });\n continue;\n }\n for (let r = 0; r < poly.length; r++) {\n if (!Array.isArray(poly[r])) {\n errors.push({\n path: `coordinates[${p}][${r}]`,\n message: `LinearRing at coordinates[${p}][${r}] must be an array of coordinates`,\n keyword: 'type',\n });\n } else {\n rings.push({ ring: poly[r] as unknown[], path: `coordinates[${p}][${r}]` });\n }\n }\n }\n }\n\n if (rings.length > maxRings) {\n errors.push({\n path: 'coordinates',\n message: `Total rings count (${rings.length}) exceeds maximum allowed (${maxRings})`,\n keyword: 'geo_ring_cap',\n });\n }\n\n let totalVertices = 0;\n\n for (const { ring, path } of rings) {\n totalVertices += ring.length;\n\n if (ring.length < 4) {\n errors.push({\n path,\n message: `LinearRing at ${path} must contain at least 4 positions (got ${ring.length})`,\n keyword: 'geo_ring_too_short',\n });\n }\n\n let allPositionsValid = true;\n const validPoints: Array<[number, number]> = [];\n\n for (let p = 0; p < ring.length; p++) {\n const pos = ring[p];\n const posPath = `${path}[${p}]`;\n\n if (!Array.isArray(pos) || pos.length !== 2) {\n errors.push({\n path: posPath,\n message: `Position at ${posPath} must be a 2-element [longitude, latitude] array (elevation is not supported)`,\n keyword: 'geo_position_invalid',\n });\n allPositionsValid = false;\n continue;\n }\n\n const lon = pos[0];\n const lat = pos[1];\n\n if (\n typeof lon !== 'number' ||\n typeof lat !== 'number' ||\n !Number.isFinite(lon) ||\n !Number.isFinite(lat)\n ) {\n errors.push({\n path: posPath,\n message: `Position at ${posPath} contains non-finite numbers`,\n keyword: 'geo_position_invalid',\n });\n allPositionsValid = false;\n continue;\n }\n\n if (lon < -180 || lon > 180 || lat < -90 || lat > 90) {\n errors.push({\n path: posPath,\n message: `Position [${lon}, ${lat}] at ${posPath} is out of bounds (longitude must be in [-180, 180], latitude in [-90, 90])`,\n keyword: 'geo_out_of_bounds',\n });\n allPositionsValid = false;\n continue;\n }\n\n validPoints.push([lon, lat]);\n }\n\n if (allPositionsValid && validPoints.length >= 4) {\n const first = validPoints[0];\n const last = validPoints[validPoints.length - 1];\n\n // Check ring closure\n if (Math.abs(first[0] - last[0]) > EPSILON || Math.abs(first[1] - last[1]) > EPSILON) {\n errors.push({\n path,\n message: `LinearRing at ${path} is not closed (first position [${first[0]}, ${first[1]}] does not match last position [${last[0]}, ${last[1]}])`,\n keyword: 'geo_ring_not_closed',\n });\n } else {\n // Check self-intersection\n const intersection = findRingSelfIntersection(validPoints);\n if (intersection) {\n errors.push({\n path,\n message: `LinearRing at ${path} self-intersects between segment ${intersection[0]} and segment ${intersection[1]}`,\n keyword: 'geo_self_intersection',\n });\n }\n }\n }\n }\n\n if (totalVertices > maxVertices) {\n errors.push({\n path: 'coordinates',\n message: `Total vertex count (${totalVertices}) exceeds maximum allowed (${maxVertices})`,\n keyword: 'geo_vertex_cap',\n });\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface ImageConstraints {\n maxSizeBytes?: number;\n allowedMimeTypes?: string[];\n}\n\nexport const imageType: FieldTypeDefinition<string | null> = {\n id: 'image',\n aliases: ['img'],\n defaultValue: null,\n renderHint: { tag: 'img' },\n constraintsSchema: {\n type: 'object',\n properties: {\n maxSizeBytes: { type: 'integer', minimum: 0 },\n allowedMimeTypes: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n if (typeof value === 'string') {\n // UUID or URL or relative path\n return { valid: true };\n }\n\n if (typeof value === 'object' && value !== null) {\n // Object reference: discriminated { kind: 'asset', id }, { kind: 'url', src }, or legacy { id } / { url }\n const obj = value as Record<string, unknown>;\n if (obj.kind === 'asset' && typeof obj.id === 'string' && obj.id.trim()) {\n return { valid: true };\n }\n if (obj.kind === 'url' && typeof obj.src === 'string' && obj.src.trim()) {\n return { valid: true };\n }\n if (typeof obj.id === 'string' || typeof obj.url === 'string') {\n return { valid: true };\n }\n errors.push({\n path: '',\n message: 'Image object must contain an id, url, or valid kind (asset/url)',\n keyword: 'image_structure',\n });\n return { valid: false, errors };\n }\n\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected image reference (UUID string, URL, or asset object), got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface NumberConstraints {\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n}\n\nexport const numberType: FieldTypeDefinition<number> = {\n id: 'number',\n defaultValue: 0,\n constraintsSchema: {\n type: 'object',\n properties: {\n min: { type: 'number' },\n max: { type: 'number' },\n step: { type: 'number', exclusiveMinimum: 0 },\n integer: { type: 'boolean' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected finite number, got ${typeof value === 'number' ? 'NaN/Infinity' : typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const c = (constraints || {}) as NumberConstraints;\n\n if (c.integer && !Number.isInteger(value)) {\n errors.push({\n path: '',\n message: `Value ${value} must be an integer`,\n keyword: 'integer',\n });\n }\n\n if (typeof c.min === 'number' && value < c.min) {\n errors.push({\n path: '',\n message: `Value ${value} is less than minimum ${c.min}`,\n keyword: 'min',\n });\n }\n\n if (typeof c.max === 'number' && value > c.max) {\n errors.push({\n path: '',\n message: `Value ${value} exceeds maximum ${c.max}`,\n keyword: 'max',\n });\n }\n\n if (typeof c.step === 'number' && c.step > 0) {\n const base = typeof c.min === 'number' ? c.min : 0;\n const diff = Math.abs(value - base);\n const remainder = diff % c.step;\n // Handle floating point imprecision\n const isMultiple = remainder < 1e-9 || Math.abs(remainder - c.step) < 1e-9;\n if (!isMultiple) {\n errors.push({\n path: '',\n message: `Value ${value} is not a valid step multiple of ${c.step}`,\n keyword: 'step',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","/**\n * Shared URL guards and validation routines.\n */\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Strips all ASCII control characters, whitespace, and invisible Unicode control codes from a raw URL.\n */\nexport function stripUrlControlChars(raw: string): string {\n if (typeof raw !== 'string') return '';\n // biome-ignore lint/suspicious/noControlCharactersInRegex: purposeful control char stripping for security\n // biome-ignore lint/suspicious/noMisleadingCharacterClass: intentional unicode control character range\n return raw.replace(/[\\x00-\\x20\\x7F-\\x9F\\u200B-\\u200D\\uFEFF\\s]/g, '');\n}\n\n/**\n * Checks whether a cleaned URL string is a safe relative path or anchor.\n * Must start with exactly one '/' not followed by '/' or '\\', or start with '#'.\n * Rejects any backslashes or percent-encoded backslashes before or at path root.\n */\nexport function isSafeRelativeOrAnchor(cleaned: string): boolean {\n if (!cleaned) return false;\n\n // Reject backslashes anywhere before the first '/' or in the path root\n if (cleaned.startsWith('\\\\')) return false;\n\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('/%5c') || lower.startsWith('%5c')) return false;\n\n if (cleaned.startsWith('#')) {\n return !cleaned.includes('\\\\');\n }\n\n if (cleaned.startsWith('/')) {\n if (cleaned.length === 1) return true;\n const second = cleaned[1];\n if (second === '/' || second === '\\\\') return false;\n return true;\n }\n\n return false;\n}\n\n/**\n * Validates a media src (video/image/audio).\n * Allows relative paths, `#anchor`, UUID asset references, and `https://` URLs (with optional host allowlist).\n */\nexport function isSafeMediaSrc(raw: string, allowedHosts?: string[]): boolean {\n if (typeof raw !== 'string') return false;\n const cleaned = stripUrlControlChars(raw);\n if (!cleaned) return false;\n\n if (UUID_REGEX.test(cleaned)) {\n return true;\n }\n\n if (isSafeRelativeOrAnchor(cleaned)) {\n return true;\n }\n\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('https://') || lower.startsWith('http://')) {\n if (cleaned.includes('\\\\') || lower.includes('%5c')) return false;\n try {\n const parsed = new URL(cleaned);\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return false;\n\n if (parsed.protocol === 'http:') {\n // Loopback is always safe (never attacker-controllable); any other http host needs an explicit allowlist entry.\n const hostname = parsed.hostname.toLowerCase();\n if (hostname === 'localhost' || hostname === '127.0.0.1') return true;\n if (!allowedHosts || allowedHosts.length === 0) return false;\n const allowed = allowedHosts.map((h) => h.toLowerCase());\n return allowed.includes(hostname);\n }\n\n if (allowedHosts && allowedHosts.length > 0) {\n const allowed = allowedHosts.map((h) => h.toLowerCase());\n return allowed.includes(parsed.hostname.toLowerCase());\n }\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\n/**\n * Validates an action href (link/CTA).\n * Default-restrictive: allows relative paths or `#anchor` only.\n * Absolute `https://` is permitted ONLY when its host is in `allowedHosts`.\n * Rejects `mailto:`, `tel:`, `data:`, `blob:`, `javascript:`, and non-allowed absolute URLs.\n */\nexport function isSafeActionHref(raw: string, allowedHosts?: string[]): boolean {\n if (typeof raw !== 'string') return false;\n const cleaned = stripUrlControlChars(raw);\n if (!cleaned) return false;\n\n // Outright reject dangerous or unapproved schemes\n const lower = cleaned.toLowerCase();\n if (\n lower.startsWith('javascript:') ||\n lower.startsWith('data:') ||\n lower.startsWith('blob:') ||\n lower.startsWith('mailto:') ||\n lower.startsWith('tel:') ||\n lower.startsWith('http:')\n ) {\n return false;\n }\n\n if (isSafeRelativeOrAnchor(cleaned)) {\n return true;\n }\n\n if (lower.startsWith('https://')) {\n if (!allowedHosts || allowedHosts.length === 0) {\n return false;\n }\n if (cleaned.includes('\\\\') || lower.includes('%5c')) return false;\n try {\n const parsed = new URL(cleaned);\n if (parsed.protocol !== 'https:') return false;\n\n const allowed = allowedHosts.map((h) => h.toLowerCase());\n return allowed.includes(parsed.hostname.toLowerCase());\n } catch {\n return false;\n }\n }\n\n return false;\n}\n","import type { FieldValidationError, FieldValidationResult } from './types';\nimport { isSafeRelativeOrAnchor, stripUrlControlChars } from './url';\n\nexport interface RichTextConstraints {\n nodes?: string[];\n marks?: string[];\n maxDepth?: number;\n maxNodes?: number;\n}\n\nexport const DEFAULT_ALLOWED_NODES = [\n 'doc',\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'blockquote',\n 'codeBlock',\n 'hardBreak',\n 'horizontalRule',\n 'text',\n 'image',\n];\n\nexport const DEFAULT_ALLOWED_MARKS = ['bold', 'italic', 'underline', 'strike', 'code', 'link'];\n\nconst FORBIDDEN_PROPERTY_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport function isValidLinkHref(rawHref: string): boolean {\n if (typeof rawHref !== 'string') return false;\n\n const cleaned = stripUrlControlChars(rawHref);\n if (cleaned.length === 0) return false;\n\n if (isSafeRelativeOrAnchor(cleaned)) {\n return true;\n }\n\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('https://') || lower.startsWith('mailto:') || lower.startsWith('tel:')) {\n return true;\n }\n\n return false;\n}\n\nfunction isValidImageSrc(rawSrc: string): boolean {\n if (typeof rawSrc !== 'string') return false;\n const cleaned = stripUrlControlChars(rawSrc);\n if (cleaned.length === 0) return false;\n if (isSafeRelativeOrAnchor(cleaned)) return true;\n const lower = cleaned.toLowerCase();\n if (lower.startsWith('https://')) return true;\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(cleaned)) {\n return true;\n }\n return false;\n}\n\ntype AttrValidator = (val: unknown) => boolean;\n\nconst ALLOWED_NODE_ATTRS: Record<string, Record<string, AttrValidator>> = {\n doc: {},\n paragraph: {},\n heading: {\n level: (v) => typeof v === 'number' && Number.isInteger(v) && v >= 1 && v <= 6,\n },\n bulletList: {},\n orderedList: {\n order: (v) => typeof v === 'number' && Number.isInteger(v),\n start: (v) => typeof v === 'number' && Number.isInteger(v),\n },\n listItem: {},\n blockquote: {},\n codeBlock: {\n language: (v) => typeof v === 'string' && v.length <= 100,\n params: (v) => typeof v === 'string' && v.length <= 100,\n },\n hardBreak: {},\n horizontalRule: {},\n text: {},\n image: {\n src: (v) => typeof v === 'string' && isValidImageSrc(v),\n alt: (v) => typeof v === 'string' && v.length <= 2000,\n title: (v) => typeof v === 'string' && v.length <= 2000,\n width: (v) => typeof v === 'number' && v > 0,\n height: (v) => typeof v === 'number' && v > 0,\n },\n};\n\nconst ALLOWED_MARK_ATTRS: Record<string, Record<string, AttrValidator>> = {\n bold: {},\n italic: {},\n underline: {},\n strike: {},\n code: {},\n link: {\n href: (v) => typeof v === 'string' && isValidLinkHref(v),\n title: (v) => typeof v === 'string' && v.length <= 2000,\n target: (v) => typeof v === 'string' && ['_blank', '_self', '_parent', '_top'].includes(v),\n rel: (v) => typeof v === 'string' && v.length <= 100,\n },\n};\n\n/**\n * Validates a ProseMirror document structure against constraints and strict security rules.\n */\nexport function validateProseMirrorDoc(\n doc: unknown,\n constraints?: RichTextConstraints,\n): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n const maxDepth = constraints?.maxDepth ?? 50;\n const maxNodes = constraints?.maxNodes ?? 10_000;\n const allowedNodes = new Set(constraints?.nodes ?? DEFAULT_ALLOWED_NODES);\n const allowedMarks = new Set(constraints?.marks ?? DEFAULT_ALLOWED_MARKS);\n\n if (doc === null || typeof doc !== 'object' || Array.isArray(doc)) {\n return {\n valid: false,\n errors: [{ path: 'doc', message: 'Document root must be a JSON object', keyword: 'type' }],\n };\n }\n\n const rootObj = doc as Record<string, unknown>;\n if (rootObj.type !== 'doc') {\n return {\n valid: false,\n errors: [\n {\n path: 'doc',\n message: `Document root type must be 'doc', got '${String(rootObj.type)}'`,\n keyword: 'invalid_root_type',\n },\n ],\n };\n }\n\n let nodeCount = 0;\n const seenObjects = new WeakSet<object>();\n\n function validateNode(node: unknown, path: string, depth: number): boolean {\n if (depth > maxDepth) {\n errors.push({\n path,\n message: `Maximum nesting depth of ${maxDepth} exceeded`,\n keyword: 'maxDepth',\n });\n return false;\n }\n\n nodeCount++;\n if (nodeCount > maxNodes) {\n errors.push({\n path,\n message: `Maximum node budget of ${maxNodes} exceeded`,\n keyword: 'maxNodes',\n });\n return false;\n }\n\n if (node === null || typeof node !== 'object' || Array.isArray(node)) {\n errors.push({\n path,\n message: 'Node must be a JSON object',\n keyword: 'type',\n });\n return false;\n }\n\n // Cyclic reference check\n if (seenObjects.has(node)) {\n errors.push({\n path,\n message: 'Cyclic reference detected in document',\n keyword: 'cycle',\n });\n return false;\n }\n seenObjects.add(node);\n\n const obj = node as Record<string, unknown>;\n\n // Check forbidden keys on node object\n for (const key of Object.keys(obj)) {\n if (FORBIDDEN_PROPERTY_KEYS.has(key)) {\n errors.push({\n path: `${path}/${key}`,\n message: `Forbidden property '${key}' detected`,\n keyword: 'security',\n });\n return false;\n }\n }\n\n const nodeType = typeof obj.type === 'string' ? obj.type : '';\n if (!nodeType || !allowedNodes.has(nodeType)) {\n errors.push({\n path,\n message: `Unknown or disallowed node type: '${nodeType || String(obj.type)}'`,\n keyword: 'disallowed_node_type',\n });\n return false;\n }\n\n // Node attribute validation\n const allowedAttrsForType = ALLOWED_NODE_ATTRS[nodeType];\n if (obj.attrs !== undefined) {\n if (obj.attrs === null || typeof obj.attrs !== 'object' || Array.isArray(obj.attrs)) {\n errors.push({\n path: `${path}/attrs`,\n message: 'Node attrs must be an object',\n keyword: 'type',\n });\n } else {\n const attrsObj = obj.attrs as Record<string, unknown>;\n for (const [attrKey, attrVal] of Object.entries(attrsObj)) {\n if (FORBIDDEN_PROPERTY_KEYS.has(attrKey)) {\n errors.push({\n path: `${path}/attrs/${attrKey}`,\n message: `Forbidden attribute key '${attrKey}'`,\n keyword: 'security',\n });\n continue;\n }\n\n // Unset attrs serialize as null (ProseMirror/Tiptap `getJSON()`); treat them as absent.\n if (attrVal === null || attrVal === undefined) continue;\n\n const validator = allowedAttrsForType?.[attrKey];\n if (!validator) {\n errors.push({\n path: `${path}/attrs/${attrKey}`,\n message: `Unknown attribute '${attrKey}' for node type '${nodeType}'`,\n keyword: 'unknown_attribute',\n });\n } else if (!validator(attrVal)) {\n errors.push({\n path: `${path}/attrs/${attrKey}`,\n message: `Invalid value for attribute '${attrKey}' on node type '${nodeType}'`,\n keyword: 'invalid_attribute_value',\n });\n }\n }\n }\n }\n\n // Text node specifics\n if (nodeType === 'text') {\n if (typeof obj.text !== 'string') {\n errors.push({\n path: `${path}/text`,\n message: 'Text node must have a string text property',\n keyword: 'missing_text',\n });\n }\n if (obj.content !== undefined) {\n errors.push({\n path: `${path}/content`,\n message: 'Text node must not have content',\n keyword: 'invalid_content',\n });\n }\n }\n\n // Marks validation\n if (obj.marks !== undefined) {\n if (!Array.isArray(obj.marks)) {\n errors.push({\n path: `${path}/marks`,\n message: 'Marks must be an array',\n keyword: 'type',\n });\n } else {\n obj.marks.forEach((mark, markIdx) => {\n const markPath = `${path}/marks/${markIdx}`;\n if (mark === null || typeof mark !== 'object' || Array.isArray(mark)) {\n errors.push({\n path: markPath,\n message: 'Mark must be an object',\n keyword: 'type',\n });\n return;\n }\n const markObj = mark as Record<string, unknown>;\n const markType = typeof markObj.type === 'string' ? markObj.type : '';\n if (!markType || !allowedMarks.has(markType)) {\n errors.push({\n path: markPath,\n message: `Unknown or disallowed mark type: '${markType || String(markObj.type)}'`,\n keyword: 'disallowed_mark_type',\n });\n return;\n }\n\n const allowedMarkAttrs = ALLOWED_MARK_ATTRS[markType];\n if (markObj.attrs !== undefined) {\n if (\n markObj.attrs === null ||\n typeof markObj.attrs !== 'object' ||\n Array.isArray(markObj.attrs)\n ) {\n errors.push({\n path: `${markPath}/attrs`,\n message: 'Mark attrs must be an object',\n keyword: 'type',\n });\n } else {\n const attrsObj = markObj.attrs as Record<string, unknown>;\n for (const [attrKey, attrVal] of Object.entries(attrsObj)) {\n if (FORBIDDEN_PROPERTY_KEYS.has(attrKey)) {\n errors.push({\n path: `${markPath}/attrs/${attrKey}`,\n message: `Forbidden attribute key '${attrKey}' in mark`,\n keyword: 'security',\n });\n continue;\n }\n if (attrVal === null || attrVal === undefined) continue;\n\n const validator = allowedMarkAttrs?.[attrKey];\n if (!validator) {\n errors.push({\n path: `${markPath}/attrs/${attrKey}`,\n message: `Unknown attribute '${attrKey}' for mark '${markType}'`,\n keyword: 'unknown_attribute',\n });\n } else if (!validator(attrVal)) {\n errors.push({\n path: `${markPath}/attrs/${attrKey}`,\n message: `Invalid value for attribute '${attrKey}' in mark '${markType}'`,\n keyword: 'invalid_attribute_value',\n });\n }\n }\n }\n }\n });\n }\n }\n\n // Content children validation\n if (obj.content !== undefined) {\n if (!Array.isArray(obj.content)) {\n errors.push({\n path: `${path}/content`,\n message: 'Content must be an array of nodes',\n keyword: 'type',\n });\n } else {\n for (let i = 0; i < obj.content.length; i++) {\n const childPath = `${path}/content/${i}`;\n const ok = validateNode(obj.content[i], childPath, depth + 1);\n if (!ok && (nodeCount > maxNodes || depth + 1 > maxDepth)) {\n // Stop early on budget/depth overflows to avoid massive overhead\n break;\n }\n }\n }\n }\n\n return errors.length === 0;\n }\n\n validateNode(doc, 'doc', 1);\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n}\n\n/**\n * Returns a copy of a ProseMirror doc with `null`/`undefined` attrs removed, and attrs the\n * validator doesn't know dropped from known node and mark types. Editors (Tiptap `getJSON()`)\n * serialize every attribute their extensions define, e.g. link `class: null, title: null`,\n * so run their output through this before saving.\n */\nexport function normalizeProseMirrorDoc<T>(doc: T): T {\n function cleanAttrs(\n attrs: unknown,\n allowed: Record<string, AttrValidator> | undefined,\n ): Record<string, unknown> | undefined {\n if (attrs === null || typeof attrs !== 'object' || Array.isArray(attrs)) return undefined;\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(attrs as Record<string, unknown>)) {\n if (val === null || val === undefined) continue;\n if (FORBIDDEN_PROPERTY_KEYS.has(key)) continue;\n if (allowed && !(key in allowed)) continue;\n out[key] = val;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n }\n\n function visit(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(visit);\n if (value === null || typeof value !== 'object') return value;\n const node = value as Record<string, unknown>;\n const type = typeof node.type === 'string' ? node.type : '';\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(node)) {\n if (FORBIDDEN_PROPERTY_KEYS.has(key)) continue;\n if (key === 'attrs') {\n const attrs = cleanAttrs(val, ALLOWED_NODE_ATTRS[type]);\n if (attrs) out.attrs = attrs;\n } else if (key === 'marks' && Array.isArray(val)) {\n out.marks = val.map((mark) => {\n if (mark === null || typeof mark !== 'object') return mark;\n const m = mark as Record<string, unknown>;\n const markType = typeof m.type === 'string' ? m.type : '';\n const attrs = cleanAttrs(m.attrs, ALLOWED_MARK_ATTRS[markType]);\n const { attrs: _drop, ...rest } = m;\n return attrs ? { ...rest, attrs } : rest;\n });\n } else if (key === 'content') {\n out.content = visit(val);\n } else {\n out[key] = val;\n }\n }\n return out;\n }\n\n return visit(doc) as T;\n}\n","import { type RichTextConstraints, validateProseMirrorDoc } from '../richtext';\nimport type { FieldTypeDefinition, FieldValidationResult } from '../types';\n\nexport const richtextType: FieldTypeDefinition<Record<string, unknown>> = {\n id: 'richtext',\n aliases: ['richText'],\n defaultValue: {\n type: 'doc',\n content: [],\n },\n renderHint: { tag: 'div' },\n constraintsSchema: {\n type: 'object',\n properties: {\n nodes: {\n type: 'array',\n items: { type: 'string' },\n },\n marks: {\n type: 'array',\n items: { type: 'string' },\n },\n maxDepth: { type: 'integer', minimum: 1 },\n maxNodes: { type: 'integer', minimum: 1 },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n return validateProseMirrorDoc(value, constraints as RichTextConstraints);\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\nexport interface SelectConstraints {\n options?: Array<string | SelectOption>;\n}\n\nexport const selectType: FieldTypeDefinition<string> = {\n id: 'select',\n defaultValue: '',\n constraintsSchema: {\n type: 'object',\n properties: {\n options: {\n type: 'array',\n items: {\n anyOf: [\n { type: 'string' },\n {\n type: 'object',\n properties: {\n label: { type: 'string' },\n value: { type: 'string' },\n },\n required: ['label', 'value'],\n additionalProperties: false,\n },\n ],\n },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (typeof value !== 'string') {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected string, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const c = (constraints || {}) as SelectConstraints;\n\n if (Array.isArray(c.options) && c.options.length > 0) {\n const allowedValues = c.options.map((opt) =>\n typeof opt === 'string' ? opt : opt && typeof opt === 'object' ? opt.value : '',\n );\n\n // Allow empty string if default or if included in allowed values\n if (value !== '' && !allowedValues.includes(value)) {\n errors.push({\n path: '',\n message: `Value '${value}' is not in allowed options: [${allowedValues.map((v) => JSON.stringify(v)).join(', ')}]`,\n keyword: 'enum',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\nimport { isSafeMediaSrc } from '../url';\n\nexport interface StreamVideoValue {\n uid: string;\n durationMs?: number;\n thumbnail?: string;\n ready?: boolean;\n}\n\nexport interface StreamVideoConstraints {\n maxDurationSeconds?: number;\n allowedThumbnailHosts?: string[];\n}\n\nconst ALLOWED_KEYS = new Set(['uid', 'durationMs', 'thumbnail', 'ready']);\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\nconst STREAM_UID_REGEX = /^[0-9a-f]{32}$/;\n\nexport const streamVideoType: FieldTypeDefinition<StreamVideoValue | null> = {\n id: 'media.streamVideo',\n aliases: ['streamVideo'],\n defaultValue: null,\n renderHint: { tag: 'video' },\n constraintsSchema: {\n type: 'object',\n properties: {\n maxDurationSeconds: { type: 'integer', minimum: 0 },\n allowedThumbnailHosts: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as StreamVideoConstraints;\n\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n if (typeof value !== 'object' || Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected streamVideo object or null, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const obj = value as Record<string, unknown>;\n\n // Check unknown / forbidden keys\n for (const key of Object.keys(obj)) {\n if (FORBIDDEN_KEYS.has(key) || !ALLOWED_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Unknown or forbidden property '${key}' in streamVideo object`,\n keyword: 'additional_properties',\n });\n }\n }\n\n // Check uid (required)\n if (typeof obj.uid !== 'string' || !STREAM_UID_REGEX.test(obj.uid.trim())) {\n errors.push({\n path: 'uid',\n message: 'streamVideo uid is required and must be a 32-character hexadecimal string',\n keyword: 'pattern',\n });\n }\n\n // Check durationMs (optional)\n if (obj.durationMs !== undefined && obj.durationMs !== null) {\n if (\n typeof obj.durationMs !== 'number' ||\n Number.isNaN(obj.durationMs) ||\n obj.durationMs < 0\n ) {\n errors.push({\n path: 'durationMs',\n message: 'durationMs must be a non-negative number',\n keyword: 'type',\n });\n } else if (\n c.maxDurationSeconds !== undefined &&\n obj.durationMs > c.maxDurationSeconds * 1000\n ) {\n errors.push({\n path: 'durationMs',\n message: `Video duration (${Math.round(obj.durationMs / 1000)}s) exceeds max duration of ${c.maxDurationSeconds}s`,\n keyword: 'max_duration',\n });\n }\n }\n\n // Check thumbnail (optional)\n if (obj.thumbnail !== undefined && obj.thumbnail !== null && obj.thumbnail !== '') {\n if (typeof obj.thumbnail !== 'string') {\n errors.push({\n path: 'thumbnail',\n message: 'thumbnail must be a string URL',\n keyword: 'type',\n });\n } else if (!isSafeMediaSrc(obj.thumbnail, c.allowedThumbnailHosts)) {\n errors.push({\n path: 'thumbnail',\n message: `Thumbnail '${obj.thumbnail}' is not a valid or safe media URL`,\n keyword: 'thumbnail_invalid',\n });\n }\n }\n\n // Check ready (optional)\n if (obj.ready !== undefined && obj.ready !== null) {\n if (typeof obj.ready !== 'boolean') {\n errors.push({\n path: 'ready',\n message: 'ready must be a boolean',\n keyword: 'type',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface TextConstraints {\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n}\n\nexport const textType: FieldTypeDefinition<string> = {\n id: 'text',\n defaultValue: '',\n constraintsSchema: {\n type: 'object',\n properties: {\n minLength: { type: 'integer', minimum: 0 },\n maxLength: { type: 'integer', minimum: 0 },\n pattern: { type: 'string' },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (typeof value !== 'string') {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected string, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n const c = (constraints || {}) as TextConstraints;\n\n if (typeof c.minLength === 'number' && value.length < c.minLength) {\n errors.push({\n path: '',\n message: `String length ${value.length} is less than minimum ${c.minLength}`,\n keyword: 'minLength',\n });\n }\n\n if (typeof c.maxLength === 'number' && value.length > c.maxLength) {\n errors.push({\n path: '',\n message: `String length ${value.length} exceeds maximum ${c.maxLength}`,\n keyword: 'maxLength',\n });\n }\n\n if (typeof c.pattern === 'string') {\n try {\n const regex = new RegExp(c.pattern);\n if (!regex.test(value)) {\n errors.push({\n path: '',\n message: `String does not match required pattern ${c.pattern}`,\n keyword: 'pattern',\n });\n }\n } catch (_e) {\n errors.push({\n path: '',\n message: `Invalid regex pattern in constraints: ${c.pattern}`,\n keyword: 'pattern_invalid',\n });\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationResult } from '../types';\n\nexport const toggleType: FieldTypeDefinition<boolean> = {\n id: 'toggle',\n defaultValue: false,\n constraintsSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false,\n },\n validate(value: unknown): FieldValidationResult {\n if (typeof value !== 'boolean') {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected boolean, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n return { valid: true };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\n\nexport interface VideoConstraints {\n maxSizeBytes?: number;\n allowedMimeTypes?: string[];\n}\n\nexport const videoType: FieldTypeDefinition<string | null> = {\n id: 'video',\n aliases: ['vid'],\n defaultValue: null,\n renderHint: { tag: 'video' },\n constraintsSchema: {\n type: 'object',\n properties: {\n maxSizeBytes: { type: 'integer', minimum: 0 },\n allowedMimeTypes: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n validate(value: unknown): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n\n if (value === null || value === undefined || value === '') {\n return { valid: true };\n }\n\n if (typeof value === 'string') {\n // UUID or URL or relative path\n return { valid: true };\n }\n\n if (typeof value === 'object' && value !== null) {\n // Object reference: discriminated { kind: 'asset', id }, { kind: 'url', src }, or legacy { id } / { url }\n const obj = value as Record<string, unknown>;\n if (obj.kind === 'asset' && typeof obj.id === 'string' && obj.id.trim()) {\n return { valid: true };\n }\n if (obj.kind === 'url' && typeof obj.src === 'string' && obj.src.trim()) {\n return { valid: true };\n }\n if (typeof obj.id === 'string' || typeof obj.url === 'string') {\n return { valid: true };\n }\n errors.push({\n path: '',\n message: 'Video object must contain an id, url, or valid kind (asset/url)',\n keyword: 'video_structure',\n });\n return { valid: false, errors };\n }\n\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected video reference (UUID string, URL, or asset object), got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n },\n};\n","import type { FieldTypeDefinition, FieldValidationError, FieldValidationResult } from '../types';\nimport { isSafeActionHref, isSafeMediaSrc } from '../url';\n\nexport type MediaRef = string | { kind: 'asset'; id: string } | { kind: 'url'; src: string };\n\nexport interface VideoItem {\n src: MediaRef;\n poster?: MediaRef;\n caption?: string;\n href?: string;\n}\n\nexport interface VideoListConstraints {\n maxItems?: number;\n allowedSrcHosts?: string[];\n allowedHrefHosts?: string[];\n maxCaptionLength?: number;\n}\n\nconst ALLOWED_ITEM_KEYS = new Set(['src', 'poster', 'caption', 'href']);\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport const videoListType: FieldTypeDefinition<VideoItem[]> = {\n id: 'media.videoList',\n aliases: ['videoList'],\n defaultValue: [],\n constraintsSchema: {\n type: 'object',\n properties: {\n maxItems: { type: 'integer', minimum: 0, default: 24 },\n allowedSrcHosts: {\n type: 'array',\n items: { type: 'string' },\n },\n allowedHrefHosts: {\n type: 'array',\n items: { type: 'string' },\n },\n maxCaptionLength: { type: 'integer', minimum: 0, default: 300 },\n },\n additionalProperties: false,\n },\n validate(value: unknown, constraints?: Record<string, unknown>): FieldValidationResult {\n const errors: FieldValidationError[] = [];\n const c = (constraints || {}) as VideoListConstraints;\n const maxItems = typeof c.maxItems === 'number' ? c.maxItems : 24;\n const maxCaptionLength = typeof c.maxCaptionLength === 'number' ? c.maxCaptionLength : 300;\n\n if (value === null || value === undefined) {\n return { valid: true };\n }\n\n if (!Array.isArray(value)) {\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: `Expected array for videoList, got ${typeof value}`,\n keyword: 'type',\n },\n ],\n };\n }\n\n if (value.length > maxItems) {\n errors.push({\n path: '',\n message: `Video list exceeds maximum item count of ${maxItems} (got ${value.length})`,\n keyword: 'max_items',\n });\n }\n\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const itemPath = `videos[${i}]`;\n\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n errors.push({\n path: itemPath,\n message: `Expected video item object, got ${item === null ? 'null' : Array.isArray(item) ? 'array' : typeof item}`,\n keyword: 'type',\n });\n continue;\n }\n\n const record = item as Record<string, unknown>;\n\n // Check forbidden or unknown keys\n for (const k of Object.keys(record)) {\n if (FORBIDDEN_KEYS.has(k) || !ALLOWED_ITEM_KEYS.has(k)) {\n errors.push({\n path: `${itemPath}.${k}`,\n message: `Unknown or forbidden property '${k}' in video item`,\n keyword: 'additional_properties',\n });\n }\n }\n\n // Check src (required)\n if (typeof record.src === 'string') {\n if (!record.src.trim()) {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video src is required and must be a non-empty string',\n keyword: 'required',\n });\n } else if (!isSafeMediaSrc(record.src, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.src`,\n message: `Video src '${record.src}' is not a valid or safe media URL/reference`,\n keyword: 'video_src_invalid',\n });\n }\n } else if (typeof record.src === 'object' && record.src !== null) {\n const srcObj = record.src as Record<string, unknown>;\n if (srcObj.kind === 'asset') {\n if (typeof srcObj.id !== 'string' || !srcObj.id.trim()) {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video asset reference must include a valid id',\n keyword: 'required',\n });\n }\n } else if (srcObj.kind === 'url') {\n if (typeof srcObj.src !== 'string' || !srcObj.src.trim()) {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video url reference must include a valid src',\n keyword: 'required',\n });\n } else if (!isSafeMediaSrc(srcObj.src, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.src`,\n message: `Video src '${srcObj.src}' is not a valid or safe media URL/reference`,\n keyword: 'video_src_invalid',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video src object must have kind \"asset\" or \"url\"',\n keyword: 'type',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.src`,\n message: 'Video src is required and must be a string or media reference object',\n keyword: 'required',\n });\n }\n\n // Check poster (optional)\n if (record.poster !== undefined && record.poster !== null && record.poster !== '') {\n if (typeof record.poster === 'string') {\n if (!isSafeMediaSrc(record.poster, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.poster`,\n message: `Video poster '${record.poster}' is not a valid or safe media URL/reference`,\n keyword: 'video_poster_invalid',\n });\n }\n } else if (typeof record.poster === 'object' && record.poster !== null) {\n const posterObj = record.poster as Record<string, unknown>;\n if (posterObj.kind === 'asset') {\n if (typeof posterObj.id !== 'string' || !posterObj.id.trim()) {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Poster asset reference must include a valid id',\n keyword: 'required',\n });\n }\n } else if (posterObj.kind === 'url') {\n if (typeof posterObj.src !== 'string' || !posterObj.src.trim()) {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Poster url reference must include a valid src',\n keyword: 'required',\n });\n } else if (!isSafeMediaSrc(posterObj.src, c.allowedSrcHosts)) {\n errors.push({\n path: `${itemPath}.poster`,\n message: `Video poster '${posterObj.src}' is not a valid or safe media URL/reference`,\n keyword: 'video_poster_invalid',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Video poster object must have kind \"asset\" or \"url\"',\n keyword: 'type',\n });\n }\n } else {\n errors.push({\n path: `${itemPath}.poster`,\n message: 'Video poster must be a string or media reference object',\n keyword: 'type',\n });\n }\n }\n\n // Check href (optional)\n if (record.href !== undefined && record.href !== null && record.href !== '') {\n if (typeof record.href !== 'string') {\n errors.push({\n path: `${itemPath}.href`,\n message: 'Video href must be a string',\n keyword: 'type',\n });\n } else if (!isSafeActionHref(record.href, c.allowedHrefHosts)) {\n errors.push({\n path: `${itemPath}.href`,\n message: `Video href '${record.href}' is not allowed or invalid`,\n keyword: 'video_href_not_allowed',\n });\n }\n }\n\n // Check caption (optional)\n if (record.caption !== undefined && record.caption !== null) {\n if (typeof record.caption !== 'string') {\n errors.push({\n path: `${itemPath}.caption`,\n message: 'Video caption must be a string',\n keyword: 'type',\n });\n } else if (record.caption.length > maxCaptionLength) {\n errors.push({\n path: `${itemPath}.caption`,\n message: `Video caption length (${record.caption.length}) exceeds maximum ${maxCaptionLength}`,\n keyword: 'max_length',\n });\n }\n }\n }\n\n if (errors.length === 0) {\n return { valid: true };\n }\n return { valid: false, errors };\n },\n};\n","import { registerFieldType } from './registry';\nimport { addressListType, addressType } from './types/address';\nimport { geoAreaType } from './types/geoArea';\nimport { imageType } from './types/image';\nimport { numberType } from './types/number';\nimport { richtextType } from './types/richtext';\nimport { selectType } from './types/select';\nimport { streamVideoType } from './types/streamVideo';\nimport { textType } from './types/text';\nimport { toggleType } from './types/toggle';\nimport { videoType } from './types/video';\nimport { videoListType } from './types/videoList';\n\n// Automatically register all base field types\nexport function registerBaseTypes(): void {\n registerFieldType(textType);\n registerFieldType(numberType);\n registerFieldType(toggleType);\n registerFieldType(selectType);\n registerFieldType(imageType);\n registerFieldType(richtextType);\n registerFieldType(videoType);\n registerFieldType(videoListType);\n registerFieldType(geoAreaType);\n registerFieldType(addressType);\n registerFieldType(addressListType);\n registerFieldType(streamVideoType);\n}\n\nregisterBaseTypes();\n\nexport * from './types';\nexport * from './registry';\nexport * from './richtext';\nexport * from './url';\nexport * from './types/text';\nexport * from './types/number';\nexport * from './types/toggle';\nexport * from './types/select';\nexport * from './types/image';\nexport * from './types/richtext';\nexport * from './types/video';\nexport * from './types/videoList';\nexport * from './types/geoArea';\nexport * from './types/address';\nexport * from './types/streamVideo';\n"]}
|