formhell 1.0.0 → 1.0.2

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/SchemaForm.tsx","../src/utils/defaultData.ts","../src/utils/jsonPointer.ts","../src/utils/refResolver.ts","../src/utils/schemaValidation.ts","../src/components/SchemaFieldRenderer.tsx","../src/components/fields/SchemaFormArray.tsx","../src/components/fields/FieldShell.tsx","../src/components/fields/SchemaFormBoolean.tsx","../src/components/fields/SchemaFormInteger.tsx","../src/components/fields/SchemaFormNull.tsx","../src/components/fields/SchemaFormNumber.tsx","../src/components/fields/SchemaFormObject.tsx","../src/components/fields/SchemaFormSelect.tsx","../src/components/fields/SchemaFormString.tsx","../src/components/SchemaBuilder.tsx"],"sourcesContent":["import \"./styles.css\";\r\n\r\nexport { SchemaForm } from \"./components/SchemaForm\";\r\nexport { SchemaBuilder } from \"./components/SchemaBuilder\";\r\nexport { SchemaBuilderHelper } from \"./components/SchemaBuilder\";\r\n\r\nexport type { JSONSchema, JSONSchemaType, OutputData, PeerSchemasInput } from \"./types/schema\";\r\nexport type {\r\n\tSchemaFormProps,\r\n\tSchemaFormWidgets,\r\n\tSchemaFormOptions,\r\n\tSchemaFormValidationError,\r\n\tSchemaBuilderProps,\r\n\tSchemaBuilderHelperProps,\r\n\tSchemaBuilderHelperContent,\r\n\tSchemaBuilderHelperContentEntry,\r\n\tSchemaBuilderValidationError,\r\n\tFieldComponentProps\r\n} from \"./types/components\";\r\n","import { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport type { SchemaFormProps, SchemaFormValidationError } from \"../types/components\";\r\nimport type { JSONSchema, OutputData, PeerSchemasInput } from \"../types/schema\";\r\nimport { createDefaultValueFromSchema } from \"../utils/defaultData\";\r\nimport { getValueAtPointer, setValueAtPointer } from \"../utils/jsonPointer\";\r\nimport { MissingPeerSchemaError, resolveSchemaRefs } from \"../utils/refResolver\";\r\nimport { validateDataOrThrow, validatePeerSchemasOrThrow, validateSchemaOrThrow } from \"../utils/schemaValidation\";\r\nimport { SchemaFieldRenderer } from \"./SchemaFieldRenderer\";\r\n\r\nexport function SchemaForm({ schema, peerSchemas, getSchema, widgets, options, data, onChange }: SchemaFormProps) {\r\n const onChangeRef = useRef(onChange);\r\n const [resolvedSchema, setResolvedSchema] = useState<JSONSchema | null>(null);\r\n const [resolutionError, setResolutionError] = useState<Error | null>(null);\r\n const [isWaitingForPeerSchemas, setIsWaitingForPeerSchemas] = useState(false);\r\n\r\n useEffect(() => {\r\n onChangeRef.current = onChange;\r\n }, [onChange]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n const resolveSchema = async () => {\r\n try {\r\n validateSchemaOrThrow(schema, \"schema\");\r\n validatePeerSchemasOrThrow(peerSchemas);\r\n\r\n try {\r\n const resolved = await resolveSchemaRefs(schema, peerSchemas);\r\n if (!cancelled) {\r\n setResolvedSchema(resolved);\r\n setResolutionError(null);\r\n setIsWaitingForPeerSchemas(false);\r\n }\r\n return;\r\n } catch (error) {\r\n if (!(error instanceof MissingPeerSchemaError) || !getSchema) {\r\n throw error;\r\n }\r\n\r\n if (!cancelled) {\r\n setResolvedSchema(null);\r\n setResolutionError(null);\r\n setIsWaitingForPeerSchemas(true);\r\n }\r\n }\r\n\r\n const resolvedWithFallback = await resolveSchemaWithFallback(schema, peerSchemas, getSchema);\r\n if (!cancelled) {\r\n setResolvedSchema(resolvedWithFallback);\r\n setResolutionError(null);\r\n setIsWaitingForPeerSchemas(false);\r\n }\r\n } catch (error) {\r\n if (!cancelled) {\r\n setResolvedSchema(null);\r\n setResolutionError(error instanceof Error ? error : new Error(\"Schema resolution failed.\"));\r\n setIsWaitingForPeerSchemas(false);\r\n }\r\n }\r\n };\r\n\r\n void resolveSchema();\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [schema, peerSchemas, getSchema]);\r\n\r\n const initialData = useMemo(() => {\r\n if (!resolvedSchema) {\r\n return data ?? {};\r\n }\r\n\r\n if (data !== undefined) {\r\n return data;\r\n }\r\n\r\n const fallback = createDefaultValueFromSchema(resolvedSchema, {\r\n defaults: options?.defaults ?? \"all\"\r\n });\r\n return fallback ?? {};\r\n }, [data, options?.defaults, resolvedSchema]);\r\n\r\n const [formData, setFormData] = useState<OutputData>(initialData);\r\n\r\n useEffect(() => {\r\n if (!resolvedSchema) {\r\n return;\r\n }\r\n\r\n setFormData(initialData);\r\n const validationErrors = getDataValidationErrors(initialData, resolvedSchema);\r\n onChangeRef.current?.(initialData, validationErrors, \"\", undefined, initialData);\r\n }, [initialData, resolvedSchema]);\r\n\r\n const handleFieldChange = (pointer: string, next: unknown) => {\r\n if (!resolvedSchema) {\r\n return;\r\n }\r\n\r\n const previousValue = getValueAtPointer(formData, pointer);\r\n const updated = setValueAtPointer(formData, pointer, next) as OutputData;\r\n const validationErrors = getDataValidationErrors(updated, resolvedSchema);\r\n\r\n setFormData(updated);\r\n onChangeRef.current?.(updated, validationErrors, pointer, previousValue, next);\r\n };\r\n\r\n if (resolutionError) {\r\n throw resolutionError;\r\n }\r\n\r\n if (isWaitingForPeerSchemas) {\r\n return (\r\n <div className=\"raf-loading-state\" role=\"status\" aria-live=\"polite\">\r\n <span className=\"raf-loading-spinner\" aria-hidden=\"true\" />\r\n <span>Waiting for required peer schema(s)</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (!resolvedSchema) {\r\n return <div className=\"raf-muted\">Resolving schema references...</div>;\r\n }\r\n\r\n return (\r\n <div className=\"raf-schema-form\">\r\n <SchemaFieldRenderer\r\n schema={resolvedSchema}\r\n label={resolvedSchema.title ?? \"Schema Form\"}\r\n required={true}\r\n pointer=\"\"\r\n schemaPointer=\"\"\r\n value={formData}\r\n onChange={handleFieldChange}\r\n widgets={widgets}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction getDataValidationErrors(data: unknown, schema: JSONSchema): SchemaFormValidationError[] {\r\n try {\r\n validateDataOrThrow(data, schema);\r\n return [];\r\n } catch (error) {\r\n return [\r\n {\r\n message: error instanceof Error ? error.message : \"Validation error\",\r\n source: \"data\"\r\n }\r\n ];\r\n }\r\n}\r\n\r\nasync function resolveSchemaWithFallback(\r\n rootSchema: JSONSchema,\r\n initialPeerSchemas: PeerSchemasInput | undefined,\r\n getSchema: (requestedSchema: string) => Promise<JSONSchema>\r\n): Promise<JSONSchema> {\r\n const attemptedRefs = new Set<string>();\r\n let currentPeerSchemas = initialPeerSchemas;\r\n\r\n while (true) {\r\n try {\r\n return await resolveSchemaRefs(rootSchema, currentPeerSchemas);\r\n } catch (error) {\r\n if (!(error instanceof MissingPeerSchemaError)) {\r\n throw error;\r\n }\r\n\r\n const missingRef = error.ref;\r\n if (attemptedRefs.has(missingRef)) {\r\n throw new Error(`Could not resolve referenced peer schema for: ${missingRef}`);\r\n }\r\n\r\n attemptedRefs.add(missingRef);\r\n\r\n let fetchedSchema: JSONSchema;\r\n try {\r\n const maybeSchema = await getSchema(missingRef);\r\n if (!maybeSchema) {\r\n throw new Error(`getSchema resolved without a schema for: ${missingRef}`);\r\n }\r\n\r\n fetchedSchema = maybeSchema;\r\n } catch (fetchError) {\r\n const message = fetchError instanceof Error ? fetchError.message : \"Unknown schema loading error.\";\r\n throw new Error(`Failed to load referenced schema for: ${missingRef}. ${message}`);\r\n }\r\n\r\n validateSchemaOrThrow(fetchedSchema, `getSchema(${missingRef})`);\r\n currentPeerSchemas = appendPeerSchema(currentPeerSchemas, missingRef, fetchedSchema);\r\n }\r\n }\r\n}\r\n\r\nfunction appendPeerSchema(\r\n peerSchemas: PeerSchemasInput | undefined,\r\n requestedRef: string,\r\n schema: JSONSchema\r\n): Record<string, JSONSchema> {\r\n const next: Record<string, JSONSchema> = {};\r\n\r\n if (Array.isArray(peerSchemas)) {\r\n for (const item of peerSchemas) {\r\n if (typeof item.$id === \"string\" && item.$id.length > 0) {\r\n next[item.$id] = item;\r\n }\r\n }\r\n } else if (peerSchemas) {\r\n Object.assign(next, peerSchemas);\r\n }\r\n\r\n next[requestedRef] = schema;\r\n\r\n const requestedRootId = extractReferenceRootId(requestedRef);\r\n if (requestedRootId) {\r\n next[requestedRootId] = schema;\r\n }\r\n\r\n if (typeof schema.$id === \"string\" && schema.$id.length > 0) {\r\n next[schema.$id] = schema;\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction extractReferenceRootId(ref: string): string {\r\n const hashIndex = ref.indexOf(\"#\");\r\n if (hashIndex === -1) {\r\n return ref;\r\n }\r\n\r\n return ref.slice(0, hashIndex);\r\n}\r\n","import type { JSONSchema } from \"../types/schema\";\r\n\r\nexport interface DefaultGenerationOptions {\r\n defaults?: \"all\" | \"required-only\";\r\n}\r\n\r\nexport function createDefaultValueFromSchema(\r\n schema: JSONSchema,\r\n options?: DefaultGenerationOptions,\r\n isRequiredField = true\r\n): unknown {\r\n const defaultsMode = options?.defaults ?? \"all\";\r\n const shouldUseSchemaDefault = defaultsMode === \"all\" || isRequiredField;\r\n\r\n if (shouldUseSchemaDefault && schema.default !== undefined) {\r\n return schema.default;\r\n }\r\n\r\n const type = getPrimaryType(schema);\r\n\r\n switch (type) {\r\n case \"object\": {\r\n const result: Record<string, unknown> = {};\r\n const required = new Set(schema.required ?? []);\r\n const properties = schema.properties ?? {};\r\n\r\n for (const [key, childSchema] of Object.entries(properties)) {\r\n const childIsRequired = required.has(key);\r\n const shouldIncludeField =\r\n childIsRequired || (defaultsMode === \"all\" && childSchema.default !== undefined);\r\n\r\n if (shouldIncludeField) {\r\n result[key] = createDefaultValueFromSchema(childSchema, options, childIsRequired);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n case \"array\":\r\n return [];\r\n case \"boolean\":\r\n return false;\r\n case \"number\":\r\n case \"integer\":\r\n return undefined;\r\n case \"null\":\r\n return null;\r\n case \"string\":\r\n return schema.enum?.[0] ?? \"\";\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction getPrimaryType(schema: JSONSchema): string | undefined {\r\n if (Array.isArray(schema.type)) {\r\n return schema.type[0];\r\n }\r\n return schema.type;\r\n}\r\n","export function escapeJsonPointerToken(token: string): string {\r\n return token.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\r\n}\r\n\r\nexport function unescapeJsonPointerToken(token: string): string {\r\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\r\n}\r\n\r\nexport function toPointerTokens(pointer: string): string[] {\r\n const normalized = pointer.startsWith(\"#\") ? pointer.slice(1) : pointer;\r\n\r\n if (!normalized) {\r\n return [];\r\n }\r\n\r\n if (!normalized.startsWith(\"/\")) {\r\n throw new Error(`Invalid JSON pointer: ${pointer}`);\r\n }\r\n\r\n return normalized\r\n .split(\"/\")\r\n .slice(1)\r\n .map(unescapeJsonPointerToken);\r\n}\r\n\r\nexport function joinPointer(basePointer: string, token: string): string {\r\n const escaped = escapeJsonPointerToken(token);\r\n if (!basePointer) {\r\n return `/${escaped}`;\r\n }\r\n return `${basePointer}/${escaped}`;\r\n}\r\n\r\nexport function getValueAtPointer(source: unknown, pointer: string): unknown {\r\n const tokens = toPointerTokens(pointer);\r\n let current: any = source;\r\n\r\n for (const token of tokens) {\r\n if (current === undefined || current === null) {\r\n return undefined;\r\n }\r\n current = current[token];\r\n }\r\n\r\n return current;\r\n}\r\n\r\nexport function setValueAtPointer(source: unknown, pointer: string, value: unknown): unknown {\r\n const tokens = toPointerTokens(pointer);\r\n\r\n if (tokens.length === 0) {\r\n return value;\r\n }\r\n\r\n const root = deepClone(source);\r\n let current: any = root;\r\n\r\n for (let index = 0; index < tokens.length - 1; index += 1) {\r\n const token = tokens[index];\r\n const nextToken = tokens[index + 1];\r\n\r\n if (current[token] === undefined || current[token] === null) {\r\n current[token] = isArrayIndexToken(nextToken) ? [] : {};\r\n }\r\n\r\n current = current[token];\r\n }\r\n\r\n const leafToken = tokens[tokens.length - 1];\r\n current[leafToken] = value;\r\n return root;\r\n}\r\n\r\nfunction isArrayIndexToken(token: string): boolean {\r\n return /^\\d+$/.test(token);\r\n}\r\n\r\nfunction deepClone<T>(value: T): T {\r\n if (typeof structuredClone === \"function\") {\r\n return structuredClone(value);\r\n }\r\n\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n}\r\n","import { getByPointer } from \"json-pointer-relational\";\r\nimport { bundle } from \"@hyperjump/json-schema/bundle\";\r\nimport { hasSchema, registerSchema, unregisterSchema } from \"@hyperjump/json-schema/draft-2020-12\";\r\nimport type { JsonSchemaDraft202012 } from \"@hyperjump/json-schema/draft-2020-12\";\r\nimport type { JSONSchema, PeerSchemasInput } from \"../types/schema\";\r\n\r\ninterface SchemaCandidate {\r\n identifier: string;\r\n schema: JSONSchema;\r\n}\r\n\r\nexport class MissingPeerSchemaError extends Error {\r\n readonly ref: string;\r\n\r\n constructor(ref: string) {\r\n super(`Could not find referenced peer schema for: ${ref}`);\r\n this.name = \"MissingPeerSchemaError\";\r\n this.ref = ref;\r\n }\r\n}\r\n\r\nlet generatedSchemaCounter = 0;\r\nconst DEFAULT_DIALECT_URI = \"https://json-schema.org/draft/2020-12/schema\";\r\n\r\nexport async function resolveSchemaRefs(schema: JSONSchema, peerSchemas?: PeerSchemasInput): Promise<JSONSchema> {\r\n const cloned = deepClone(schema);\r\n const peerCandidates = toSchemaCandidates(peerSchemas);\r\n\r\n const missingRef = findFirstMissingExternalRef(cloned, peerCandidates);\r\n if (missingRef) {\r\n throw new MissingPeerSchemaError(missingRef);\r\n }\r\n\r\n const bundled = await bundleWithRegisteredSchemas(cloned, peerCandidates);\r\n const bundledCandidates = collectSchemaCandidates(bundled);\r\n const candidates = mergeCandidates(peerCandidates, bundledCandidates);\r\n const visiting = new Set<string>();\r\n\r\n return resolveNode(bundled, bundled, candidates, visiting) as JSONSchema;\r\n}\r\n\r\nfunction resolveNode(\r\n node: unknown,\r\n currentSchemaRoot: JSONSchema,\r\n candidates: SchemaCandidate[],\r\n visiting: Set<string>\r\n): unknown {\r\n if (Array.isArray(node)) {\r\n return node.map((entry) => resolveNode(entry, currentSchemaRoot, candidates, visiting));\r\n }\r\n\r\n if (!isObject(node)) {\r\n return node;\r\n }\r\n\r\n if (typeof node.$ref === \"string\") {\r\n const resolved = resolveRefNode(node, currentSchemaRoot, candidates, visiting);\r\n return resolveNode(resolved.value, resolved.currentSchemaRoot, candidates, visiting);\r\n }\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(node)) {\r\n result[key] = resolveNode(value, currentSchemaRoot, candidates, visiting);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction resolveRefNode(\r\n node: Record<string, unknown>,\r\n currentSchemaRoot: JSONSchema,\r\n candidates: SchemaCandidate[],\r\n visiting: Set<string>\r\n): { value: Record<string, unknown>; currentSchemaRoot: JSONSchema } {\r\n const ref = node.$ref as string;\r\n const externalReference = isExternalReference(ref);\r\n const recursionKey = `${currentSchemaRoot.$id ?? \"local\"}::${ref}`;\r\n\r\n if (visiting.has(recursionKey)) {\r\n throw new Error(`Infinite recursion detected while resolving reference: ${ref}`);\r\n }\r\n\r\n visiting.add(recursionKey);\r\n\r\n let targetSchema = currentSchemaRoot;\r\n let resultJsonPointer = ref;\r\n\r\n if (externalReference) {\r\n const matched = findBestCandidate(ref, candidates);\r\n if (!matched) {\r\n throw new MissingPeerSchemaError(ref);\r\n }\r\n\r\n targetSchema = matched.schema;\r\n resultJsonPointer = ref.slice(matched.identifier.length);\r\n\r\n if (!resultJsonPointer) {\r\n resultJsonPointer = \"#\";\r\n }\r\n }\r\n\r\n const resolvedValue = getByPointer(resultJsonPointer, targetSchema);\r\n\r\n if (!isObject(resolvedValue)) {\r\n throw new Error(`Could not resolve JSON pointer: ${resultJsonPointer}`);\r\n }\r\n\r\n const { $ref: _omitRef, ...rest } = node;\r\n const merged = {\r\n ...deepClone(resolvedValue),\r\n ...rest\r\n };\r\n\r\n // Inlining a whole external document can duplicate its $id in multiple locations,\r\n // which causes AJV to report that the reference resolves to more than one schema.\r\n if (externalReference && resultJsonPointer === \"#\") {\r\n delete merged.$id;\r\n }\r\n\r\n visiting.delete(recursionKey);\r\n return { value: merged, currentSchemaRoot: targetSchema };\r\n}\r\n\r\nfunction isExternalReference(ref: string): boolean {\r\n return !(ref.startsWith(\"#\") || ref.startsWith(\"/\"));\r\n}\r\n\r\nfunction findFirstMissingExternalRef(rootSchema: JSONSchema, candidates: SchemaCandidate[]): string | null {\r\n const visited = new Set<unknown>();\r\n const stack: unknown[] = [rootSchema, ...candidates.map((candidate) => candidate.schema)];\r\n\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!isObject(current)) {\r\n continue;\r\n }\r\n\r\n if (visited.has(current)) {\r\n continue;\r\n }\r\n\r\n visited.add(current);\r\n\r\n if (typeof current.$ref === \"string\" && isExternalReference(current.$ref)) {\r\n if (!findBestCandidate(current.$ref, candidates)) {\r\n return current.$ref;\r\n }\r\n }\r\n\r\n for (const value of Object.values(current)) {\r\n if (Array.isArray(value)) {\r\n for (const entry of value) {\r\n stack.push(entry);\r\n }\r\n } else {\r\n stack.push(value);\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nasync function bundleWithRegisteredSchemas(schema: JSONSchema, candidates: SchemaCandidate[]): Promise<JSONSchema> {\r\n const rootUri =\r\n typeof schema.$id === \"string\" && schema.$id.length > 0\r\n ? schema.$id\r\n : `urn:formhell:bundled-schema:${generatedSchemaCounter++}`;\r\n const registeredUris = new Set<string>();\r\n\r\n registerSchemaWithOverwrite(asHyperjumpSchema(schema), rootUri);\r\n registeredUris.add(rootUri);\r\n for (const candidate of candidates) {\r\n const candidateUri = normalizeCandidateRegistrationUri(candidate);\r\n if (registeredUris.has(candidateUri)) {\r\n continue;\r\n }\r\n\r\n registerSchemaWithOverwrite(asHyperjumpSchema(candidate.schema), candidateUri);\r\n registeredUris.add(candidateUri);\r\n }\r\n\r\n const bundled = await bundle(rootUri);\r\n if (!isObject(bundled)) {\r\n throw new Error(\"Bundling did not produce a valid schema document.\");\r\n }\r\n\r\n return bundled as JSONSchema;\r\n}\r\n\r\nfunction normalizeCandidateRegistrationUri(candidate: SchemaCandidate): string {\r\n if (typeof candidate.schema.$id === \"string\" && candidate.schema.$id.length > 0) {\r\n return candidate.schema.$id;\r\n }\r\n\r\n return stripFragment(candidate.identifier);\r\n}\r\n\r\nfunction stripFragment(uri: string): string {\r\n const hashIndex = uri.indexOf(\"#\");\r\n if (hashIndex === -1) {\r\n return uri;\r\n }\r\n\r\n return uri.slice(0, hashIndex);\r\n}\r\n\r\nfunction asHyperjumpSchema(schema: JSONSchema): JsonSchemaDraft202012 {\r\n return schema as unknown as JsonSchemaDraft202012;\r\n}\r\n\r\nfunction registerSchemaWithOverwrite(schema: JsonSchemaDraft202012, uri: string): void {\r\n if (hasSchema(uri)) {\r\n unregisterSchema(uri);\r\n }\r\n\r\n registerSchema(schema, uri, DEFAULT_DIALECT_URI);\r\n}\r\n\r\nfunction collectSchemaCandidates(schema: JSONSchema): SchemaCandidate[] {\r\n const collected = new Map<string, SchemaCandidate>();\r\n const visited = new Set<unknown>();\r\n const stack: unknown[] = [schema];\r\n\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!isObject(current)) {\r\n continue;\r\n }\r\n\r\n if (visited.has(current)) {\r\n continue;\r\n }\r\n\r\n visited.add(current);\r\n\r\n if (typeof current.$id === \"string\" && current.$id.length > 0) {\r\n collected.set(current.$id, {\r\n identifier: current.$id,\r\n schema: current as JSONSchema\r\n });\r\n }\r\n\r\n for (const value of Object.values(current)) {\r\n if (Array.isArray(value)) {\r\n for (const entry of value) {\r\n stack.push(entry);\r\n }\r\n } else {\r\n stack.push(value);\r\n }\r\n }\r\n }\r\n\r\n return Array.from(collected.values());\r\n}\r\n\r\nfunction mergeCandidates(...candidateGroups: SchemaCandidate[][]): SchemaCandidate[] {\r\n const merged = new Map<string, SchemaCandidate>();\r\n\r\n for (const group of candidateGroups) {\r\n for (const candidate of group) {\r\n merged.set(candidate.identifier, candidate);\r\n }\r\n }\r\n\r\n return Array.from(merged.values());\r\n}\r\n\r\nfunction findBestCandidate(ref: string, candidates: SchemaCandidate[]): SchemaCandidate | undefined {\r\n const matches = candidates.filter((candidate) => ref.startsWith(candidate.identifier));\r\n matches.sort((a, b) => b.identifier.length - a.identifier.length);\r\n return matches[0];\r\n}\r\n\r\nfunction toSchemaCandidates(peerSchemas?: PeerSchemasInput): SchemaCandidate[] {\r\n if (!peerSchemas) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(peerSchemas)) {\r\n return peerSchemas\r\n .filter((schema) => typeof schema.$id === \"string\" && schema.$id.length > 0)\r\n .map((schema) => ({ identifier: schema.$id as string, schema }));\r\n }\r\n\r\n return Object.entries(peerSchemas).map(([identifier, schema]) => ({ identifier, schema }));\r\n}\r\n\r\nfunction deepClone<T>(value: T): T {\r\n if (typeof structuredClone === \"function\") {\r\n return structuredClone(value);\r\n }\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import Ajv from \"ajv\";\r\nimport Ajv2019 from \"ajv/dist/2019\";\r\nimport Ajv2020 from \"ajv/dist/2020\";\r\nimport type { JSONSchema, PeerSchemasInput } from \"../types/schema\";\r\n\r\nexport const AJV_SUPPORTED_FORMATS = [\r\n \"date\",\r\n \"time\",\r\n \"date-time\",\r\n \"duration\",\r\n \"uri\",\r\n \"uri-reference\",\r\n \"uri-template\",\r\n \"url\",\r\n \"email\",\r\n \"hostname\",\r\n \"ipv4\",\r\n \"ipv6\",\r\n \"regex\",\r\n \"uuid\",\r\n \"json-pointer\",\r\n \"json-pointer-uri-fragment\",\r\n \"relative-json-pointer\"\r\n] as const;\r\n\r\nconst AJV_OPTIONS = {\r\n allErrors: true,\r\n strict: false,\r\n validateSchema: true\r\n};\r\n\r\nexport function createAjvForSchema(schema: JSONSchema): Ajv {\r\n const schemaUri = schema.$schema ?? \"\";\r\n\r\n if (schemaUri.includes(\"2020-12\")) {\r\n return new Ajv2020(AJV_OPTIONS);\r\n }\r\n\r\n if (schemaUri.includes(\"2019-09\")) {\r\n return new Ajv2019(AJV_OPTIONS);\r\n }\r\n\r\n return new Ajv(AJV_OPTIONS);\r\n}\r\n\r\nexport function validateSchemaOrThrow(schema: JSONSchema, label: string): void {\r\n const ajv = createAjvForSchema(schema);\r\n const valid = ajv.validateSchema(schema);\r\n\r\n if (!valid) {\r\n const errors = ajv.errorsText(ajv.errors, { separator: \"; \" });\r\n throw new Error(`${label} is not a valid JSON Schema. ${errors}`.trim());\r\n }\r\n}\r\n\r\nexport function validatePeerSchemasOrThrow(peerSchemas?: PeerSchemasInput): void {\r\n if (!peerSchemas) {\r\n return;\r\n }\r\n\r\n if (Array.isArray(peerSchemas)) {\r\n peerSchemas.forEach((schema, index) => {\r\n validateSchemaOrThrow(schema, `peerSchemas[${index}]`);\r\n });\r\n return;\r\n }\r\n\r\n for (const [key, schema] of Object.entries(peerSchemas)) {\r\n validateSchemaOrThrow(schema, `peerSchemas.${key}`);\r\n }\r\n}\r\n\r\nexport function validateDataOrThrow(data: unknown, schema: JSONSchema): void {\r\n const ajv = createAjvForSchema(schema);\r\n const validate = ajv.compile(schema);\r\n const valid = validate(data);\r\n\r\n if (!valid) {\r\n const errors = ajv.errorsText(validate.errors, { separator: \"; \" });\r\n throw new Error(`Provided data does not match schema. ${errors}`.trim());\r\n }\r\n}\r\n","import { useEffect, useState, type ComponentType, type ReactNode } from \"react\";\r\nimport { SchemaFormArray } from \"./fields/SchemaFormArray\";\r\nimport { SchemaFormBoolean } from \"./fields/SchemaFormBoolean\";\r\nimport { SchemaFormInteger } from \"./fields/SchemaFormInteger\";\r\nimport { SchemaFormNull } from \"./fields/SchemaFormNull\";\r\nimport { SchemaFormNumber } from \"./fields/SchemaFormNumber\";\r\nimport { SchemaFormObject } from \"./fields/SchemaFormObject\";\r\nimport { SchemaFormSelect } from \"./fields/SchemaFormSelect\";\r\nimport { SchemaFormString } from \"./fields/SchemaFormString\";\r\nimport type { FieldComponentProps, SchemaFormArrayProps, SchemaFormObjectProps, SchemaFormWidgets } from \"../types/components\";\r\nimport type { JSONSchema, JSONSchemaType } from \"../types/schema\";\r\nimport { createDefaultValueFromSchema } from \"../utils/defaultData\";\r\nimport { joinPointer } from \"../utils/jsonPointer\";\r\n\r\ninterface SchemaFieldRendererProps {\r\n schema: JSONSchema;\r\n label: string;\r\n required: boolean;\r\n pointer: string;\r\n schemaPointer: string;\r\n value: unknown;\r\n onChange: (pointer: string, next: unknown) => void;\r\n widgets?: SchemaFormWidgets;\r\n controls?: ReactNode;\r\n}\r\n\r\nexport function SchemaFieldRenderer(props: SchemaFieldRendererProps) {\r\n const { schema, label, required, pointer, schemaPointer, value, onChange, widgets, controls } = props;\r\n const hasConstValue = Object.prototype.hasOwnProperty.call(schema, \"const\");\r\n const lockedValue = hasConstValue ? schema.const : value;\r\n const isConstLocked = hasConstValue;\r\n const schemaTypes = resolveTypes(schema);\r\n const type = resolveType(schema);\r\n const hasTypeChoices = schemaTypes.length > 1;\r\n const hasEnum = Array.isArray(schema.enum) && schema.enum.length > 0;\r\n const inferredType = inferValueType(lockedValue, schemaTypes);\r\n const [selectedType, setSelectedType] = useState<JSONSchemaType | undefined>(() => inferredType ?? schemaTypes[0]);\r\n const activeType = selectedType && schemaTypes.includes(selectedType) ? selectedType : inferredType ?? schemaTypes[0];\r\n const tupleItems = activeType === \"array\"\r\n ? Array.isArray(schema.prefixItems)\r\n ? schema.prefixItems\r\n : Array.isArray(schema.items)\r\n ? schema.items\r\n : undefined\r\n : undefined;\r\n const singleItemsSchema =\r\n activeType === \"array\" && !Array.isArray(schema.items) && isObject(schema.items) ? (schema.items as JSONSchema) : undefined;\r\n const itemSchemas = activeType === \"array\" ? tupleItems ?? (singleItemsSchema ? [singleItemsSchema] : undefined) : undefined;\r\n const maxItems = activeType === \"array\" && typeof schema.maxItems === \"number\" ? schema.maxItems : undefined;\r\n\r\n useEffect(() => {\r\n if (selectedType && schemaTypes.includes(selectedType) && !inferredType) {\r\n return;\r\n }\r\n\r\n if (inferredType && inferredType !== selectedType) {\r\n setSelectedType(inferredType);\r\n return;\r\n }\r\n\r\n if (selectedType && !schemaTypes.includes(selectedType)) {\r\n setSelectedType(inferredType ?? schemaTypes[0]);\r\n }\r\n }, [inferredType, schemaTypes, selectedType]);\r\n\r\n const typeChooser = hasTypeChoices && !hasEnum ? (\r\n <div className=\"raf-button-row\" aria-label={`${label} type chooser`}>\r\n {schemaTypes\r\n .filter((choice) => choice !== \"null\")\r\n .map((choice) => (\r\n <button\r\n key={choice}\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n disabled={isConstLocked}\r\n aria-pressed={activeType === choice}\r\n onClick={() => {\r\n setSelectedType(choice);\r\n onChange(pointer, createDefaultValueForType(choice));\r\n }}\r\n >\r\n {choice}\r\n </button>\r\n ))}\r\n\r\n {schemaTypes.includes(\"null\") ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n disabled={isConstLocked}\r\n aria-pressed={activeType === \"null\"}\r\n onClick={() => {\r\n setSelectedType(\"null\");\r\n onChange(pointer, null);\r\n }}\r\n >\r\n Insert NULL\r\n </button>\r\n ) : null}\r\n </div>\r\n ) : null;\r\n const fieldControls = controls && typeChooser ? <>{controls}{typeChooser}</> : controls ?? typeChooser;\r\n\r\n if (activeType === \"object\") {\r\n const ObjectWidget =\r\n getSchemaPointerWidget<SchemaFormObjectProps>(widgets, schemaPointer) ?? widgets?.Object ?? SchemaFormObject;\r\n const objectValue = isObject(lockedValue) ? lockedValue : {};\r\n const requiredKeys = new Set(schema.required ?? []);\r\n const properties = schema.properties ?? {};\r\n\r\n return (\r\n <ObjectWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={objectValue}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n >\r\n {Object.entries(properties).map(([propertyName, propertySchema]) => {\r\n const childPointer = joinPointer(pointer, propertyName);\r\n const childSchemaPointer = joinPointer(joinPointer(schemaPointer, \"properties\"), propertyName);\r\n const childValue = objectValue[propertyName];\r\n\r\n return (\r\n <SchemaFieldRenderer\r\n key={childPointer}\r\n schema={propertySchema}\r\n label={propertySchema.title ?? propertyName}\r\n required={requiredKeys.has(propertyName)}\r\n pointer={childPointer}\r\n schemaPointer={childSchemaPointer}\r\n value={childValue}\r\n onChange={onChange}\r\n widgets={widgets}\r\n />\r\n );\r\n })}\r\n </ObjectWidget>\r\n );\r\n }\r\n\r\n if (activeType === \"array\") {\r\n const ArrayWidget =\r\n getSchemaPointerWidget<SchemaFormArrayProps>(widgets, schemaPointer) ?? widgets?.Array ?? SchemaFormArray;\r\n const arrayValue = Array.isArray(lockedValue) ? lockedValue : [];\r\n const addLimit = maxItems ?? Number.POSITIVE_INFINITY;\r\n const fixedTupleValue = tupleItems\r\n ? tupleItems.map((itemSchema, index) =>\r\n arrayValue[index] === undefined ? createDefaultValueFromSchema(itemSchema) : arrayValue[index]\r\n )\r\n : arrayValue;\r\n const canAddItem = tupleItems ? false : arrayValue.length < addLimit;\r\n\r\n return (\r\n <ArrayWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={fixedTupleValue}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n itemsSchema={singleItemsSchema}\r\n itemSchemas={itemSchemas}\r\n createDefaultItem={() => createDefaultValueForArrayItem(itemSchemas, arrayValue.length)}\r\n renderItem={(index, itemPointer, itemValue) => (\r\n <SchemaFieldRenderer\r\n schema={tupleItems?.[index] ?? singleItemsSchema ?? { type: \"string\" }}\r\n label={tupleItems?.[index]?.title?.trim() ? (tupleItems[index].title as string) : tupleItems ? `Tuple ${index + 1}` : `Item ${index + 1}`}\r\n required={true}\r\n pointer={itemPointer}\r\n schemaPointer={tupleItems ? joinPointer(joinPointer(schemaPointer, \"prefixItems\"), String(index)) : joinPointer(schemaPointer, \"items\")}\r\n value={itemValue}\r\n onChange={onChange}\r\n widgets={widgets}\r\n />\r\n )}\r\n canAddItem={canAddItem}\r\n canRemoveItems={!tupleItems}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"boolean\") {\r\n const BooleanWidget =\r\n getSchemaPointerWidget<FieldComponentProps<boolean>>(widgets, schemaPointer) ??\r\n widgets?.Boolean ??\r\n SchemaFormBoolean;\r\n return (\r\n <BooleanWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={Boolean(lockedValue)}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"number\") {\r\n const NumberWidget =\r\n getSchemaPointerWidget<FieldComponentProps<number | undefined>>(widgets, schemaPointer) ??\r\n widgets?.Number ??\r\n SchemaFormNumber;\r\n return (\r\n <NumberWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={typeof lockedValue === \"number\" ? lockedValue : undefined}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"integer\") {\r\n const IntegerWidget =\r\n getSchemaPointerWidget<FieldComponentProps<number | undefined>>(widgets, schemaPointer) ??\r\n widgets?.Integer ??\r\n SchemaFormInteger;\r\n return (\r\n <IntegerWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={typeof lockedValue === \"number\" ? lockedValue : undefined}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"null\") {\r\n const NullWidget =\r\n getSchemaPointerWidget<FieldComponentProps<null>>(widgets, schemaPointer) ?? widgets?.Null ?? SchemaFormNull;\r\n return (\r\n <NullWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={null}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={() => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, null);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (hasEnum && (activeType === \"string\" || hasTypeChoices)) {\r\n const SelectWidget =\r\n getSchemaPointerWidget<FieldComponentProps<unknown>>(widgets, schemaPointer) ?? widgets?.Select ?? SchemaFormSelect;\r\n return (\r\n <SelectWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={lockedValue}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n const StringWidget =\r\n getSchemaPointerWidget<FieldComponentProps<string>>(widgets, schemaPointer) ?? widgets?.String ?? SchemaFormString;\r\n return (\r\n <StringWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={typeof lockedValue === \"string\" ? lockedValue : \"\"}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction getSchemaPointerWidget<TProps>(\r\n widgets: SchemaFormWidgets | undefined,\r\n schemaPointer: string\r\n): ComponentType<TProps> | undefined {\r\n if (!widgets) {\r\n return undefined;\r\n }\r\n\r\n const candidate = widgets[schemaPointer];\r\n if (!candidate) {\r\n return undefined;\r\n }\r\n\r\n return candidate as ComponentType<TProps>;\r\n}\r\n\r\nfunction resolveType(schema: JSONSchema): JSONSchemaType {\r\n if (Array.isArray(schema.type) && schema.type.length > 0) {\r\n return schema.type[0];\r\n }\r\n\r\n if (typeof schema.type === \"string\") {\r\n return schema.type;\r\n }\r\n\r\n if (schema.properties) {\r\n return \"object\";\r\n }\r\n\r\n if (schema.items) {\r\n return \"array\";\r\n }\r\n\r\n return \"string\";\r\n}\r\n\r\nfunction resolveTypes(schema: JSONSchema): JSONSchemaType[] {\r\n if (Array.isArray(schema.type) && schema.type.length > 0) {\r\n return schema.type.filter((type): type is JSONSchemaType => typeof type === \"string\");\r\n }\r\n\r\n return [resolveType(schema)];\r\n}\r\n\r\nfunction inferValueType(value: unknown, schemaTypes: JSONSchemaType[]): JSONSchemaType | undefined {\r\n if (value === null && schemaTypes.includes(\"null\")) {\r\n return \"null\";\r\n }\r\n\r\n if (Array.isArray(value) && schemaTypes.includes(\"array\")) {\r\n return \"array\";\r\n }\r\n\r\n if (isObject(value) && schemaTypes.includes(\"object\")) {\r\n return \"object\";\r\n }\r\n\r\n if (typeof value === \"boolean\" && schemaTypes.includes(\"boolean\")) {\r\n return \"boolean\";\r\n }\r\n\r\n if (typeof value === \"number\") {\r\n if (schemaTypes.includes(\"integer\") && Number.isInteger(value)) {\r\n return \"integer\";\r\n }\r\n\r\n if (schemaTypes.includes(\"number\")) {\r\n return \"number\";\r\n }\r\n }\r\n\r\n if (typeof value === \"string\" && schemaTypes.includes(\"string\")) {\r\n return \"string\";\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction createDefaultValueForType(type: JSONSchemaType): unknown {\r\n switch (type) {\r\n case \"string\":\r\n return \"\";\r\n case \"number\":\r\n case \"integer\":\r\n return undefined;\r\n case \"boolean\":\r\n return false;\r\n case \"object\":\r\n return {};\r\n case \"array\":\r\n return [];\r\n case \"null\":\r\n return null;\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction createDefaultValueForArrayItem(itemSchemas: JSONSchema[] | undefined, index: number): unknown {\r\n const schema = itemSchemas?.[index] ?? itemSchemas?.[0] ?? itemSchemas?.[itemSchemas.length - 1];\r\n return createDefaultValueFromSchema(schema ?? {});\r\n}\r\n","import { useRef } from \"react\";\r\nimport type { SchemaFormArrayProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormArray({\r\n label,\r\n required,\r\n pointer,\r\n schema,\r\n value,\r\n disabled,\r\n controls,\r\n canAddItem,\r\n canRemoveItems,\r\n onChange,\r\n renderItem,\r\n createDefaultItem\r\n}: SchemaFormArrayProps) {\r\n const items = Array.isArray(value) ? value : [];\r\n const hasUserModifiedRef = useRef(false);\r\n const lastSignatureRef = useRef<string | null>(null);\r\n const maxItems = typeof schema.maxItems === \"number\" ? schema.maxItems : undefined;\r\n const initialItemCount = getInitialItemCount(schema.minItems, maxItems);\r\n const schemaSignature = `${pointer}|${String(schema.minItems ?? \"\")}|${String(schema.maxItems ?? \"\")}|${JSON.stringify(schema.items ?? null)}|${JSON.stringify(schema.prefixItems ?? null)}`;\r\n\r\n if (schemaSignature !== lastSignatureRef.current) {\r\n hasUserModifiedRef.current = false;\r\n lastSignatureRef.current = schemaSignature;\r\n }\r\n\r\n const renderedItems = items.length === 0 && !hasUserModifiedRef.current\r\n ? Array.from({ length: initialItemCount }, () => createDefaultItem())\r\n : items;\r\n const showAddItem = !disabled && canAddItem !== false && renderedItems.length < (maxItems ?? Number.POSITIVE_INFINITY);\r\n\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <div>\r\n {renderedItems.map((item, index) => {\r\n const itemPointer = `${pointer}/${index}`;\r\n\r\n return (\r\n <div className=\"raf-array-item\" key={itemPointer}>\r\n {renderItem(index, itemPointer, item)}\r\n {canRemoveItems === false ? null : (\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => {\r\n hasUserModifiedRef.current = true;\r\n const next = [...renderedItems];\r\n next.splice(index, 1);\r\n onChange(next);\r\n }}\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {showAddItem ? (\r\n <button\r\n className=\"raf-button raf-button-primary\"\r\n type=\"button\"\r\n onClick={() => {\r\n hasUserModifiedRef.current = true;\r\n const next = [...renderedItems, createDefaultItem()];\r\n onChange(next);\r\n }}\r\n >\r\n Add Item\r\n </button>\r\n ) : null}\r\n </div>\r\n </FieldShell>\r\n );\r\n}\r\n\r\nfunction getInitialItemCount(minItems: unknown, maxItems: number | undefined): number {\r\n const desiredCount = typeof minItems === \"number\" && minItems > 1 ? Math.floor(minItems) : 1;\r\n\r\n if (maxItems === undefined) {\r\n return desiredCount;\r\n }\r\n\r\n return Math.max(0, Math.min(desiredCount, maxItems));\r\n}\r\n","import type { PropsWithChildren, ReactNode } from \"react\";\r\n\r\ninterface FieldShellProps {\r\n label: string;\r\n required: boolean;\r\n controls?: ReactNode;\r\n}\r\n\r\nexport function FieldShell({ label, required, controls, children }: PropsWithChildren<FieldShellProps>) {\r\n return (\r\n <div className=\"raf-field\">\r\n <div className=\"raf-field-label-row\">\r\n <label className=\"raf-field-label\">\r\n {label}\r\n {required ? <span className=\"raf-field-required\">*</span> : null}\r\n </label>\r\n {!required ? <span className=\"raf-field-optional\">Optional</span> : null}\r\n </div>\r\n {controls ? <div className=\"raf-button-row\">{controls}</div> : null}\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormBoolean({ label, required, value, disabled, controls, onChange }: FieldComponentProps<boolean>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <label className=\"raf-checkbox-row\">\r\n <input\r\n className=\"raf-checkbox\"\r\n type=\"checkbox\"\r\n checked={Boolean(value)}\r\n disabled={disabled}\r\n onChange={(event) => onChange(event.target.checked)}\r\n />\r\n <span>{value ? \"True\" : \"False\"}</span>\r\n </label>\r\n </FieldShell>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormInteger({ label, required, value, disabled, controls, onChange }: FieldComponentProps<number | undefined>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <input\r\n className=\"raf-input\"\r\n type=\"number\"\r\n step={1}\r\n value={value ?? \"\"}\r\n disabled={disabled}\r\n onChange={(event) => {\r\n const nextValue = event.target.value;\r\n onChange(nextValue === \"\" ? undefined : Math.trunc(Number(nextValue)));\r\n }}\r\n />\r\n </FieldShell>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormNull({ label, required, controls }: FieldComponentProps<null>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <div className=\"raf-muted\">Value is always null.</div>\r\n </FieldShell>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormNumber({ label, required, value, disabled, controls, onChange }: FieldComponentProps<number | undefined>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <input\r\n className=\"raf-input\"\r\n type=\"number\"\r\n value={value ?? \"\"}\r\n disabled={disabled}\r\n onChange={(event) => {\r\n const nextValue = event.target.value;\r\n onChange(nextValue === \"\" ? undefined : Number(nextValue));\r\n }}\r\n />\r\n </FieldShell>\r\n );\r\n}\r\n","import type { SchemaFormObjectProps } from \"../../types/components\";\r\n\r\nexport function SchemaFormObject({ label, required, disabled, controls, children }: SchemaFormObjectProps) {\r\n return (\r\n <details className=\"raf-object\" open>\r\n <summary className=\"raf-object-summary\">\r\n {label}\r\n {required ? <span className=\"raf-field-required\">*</span> : null}\r\n </summary>\r\n <div className=\"raf-object-content\" aria-disabled={disabled}>\r\n {controls ? <div className=\"raf-button-row\">{controls}</div> : null}\r\n {children}\r\n </div>\r\n </details>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormSelect({ label, required, schema, value, disabled, controls, onChange }: FieldComponentProps<unknown>) {\r\n const options = Array.isArray(schema.enum) ? schema.enum : [];\r\n const selectedValue = encodeEnumValue(value);\r\n\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <select\r\n className=\"raf-select\"\r\n value={selectedValue}\r\n disabled={disabled}\r\n onChange={(event) => onChange(decodeEnumValue(event.target.value))}\r\n >\r\n {!required ? <option value=\"\">Select...</option> : null}\r\n {options.map((option) => (\r\n <option key={encodeEnumValue(option)} value={encodeEnumValue(option)}>\r\n {String(option)}\r\n </option>\r\n ))}\r\n </select>\r\n </FieldShell>\r\n );\r\n}\r\n\r\nfunction encodeEnumValue(value: unknown): string {\r\n if (value === undefined) {\r\n return \"\";\r\n }\r\n\r\n return JSON.stringify(value);\r\n}\r\n\r\nfunction decodeEnumValue(value: string): unknown {\r\n if (value === \"\") {\r\n return \"\";\r\n }\r\n\r\n try {\r\n return JSON.parse(value) as unknown;\r\n } catch {\r\n return value;\r\n }\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormString({ label, required, value, disabled, controls, onChange }: FieldComponentProps<string>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <input\r\n className=\"raf-input\"\r\n type=\"text\"\r\n value={value ?? \"\"}\r\n disabled={disabled}\r\n onChange={(event) => onChange(event.target.value)}\r\n />\r\n </FieldShell>\r\n );\r\n}\r\n","import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport parse from \"html-react-parser\";\r\nimport type {\r\n SchemaBuilderHelperContent,\r\n SchemaBuilderHelperContentEntry,\r\n SchemaBuilderHelperProps,\r\n SchemaBuilderProps,\r\n SchemaBuilderValidationError\r\n} from \"../types/components\";\r\nimport type { JSONSchema, JSONSchemaType } from \"../types/schema\";\r\nimport { AJV_SUPPORTED_FORMATS, createAjvForSchema } from \"../utils/schemaValidation\";\r\n\r\ntype SchemaCombinationKey = \"allOf\" | \"anyOf\" | \"oneOf\";\r\ntype SchemaConditionalKey = \"if\" | \"then\" | \"else\";\r\n\r\nconst FIELD_TYPES: JSONSchemaType[] = [\"string\", \"number\", \"integer\", \"boolean\", \"object\", \"array\", \"null\"];\r\n\r\nconst DEFAULT_SCHEMA_URI = \"https://json-schema.org/draft/2020-12/schema\";\r\n\r\ntype HelpAnchorRect = { top: number; left: number; bottom: number; right: number };\r\n\r\ninterface ActiveFieldHelp {\r\n key: string;\r\n label: string;\r\n anchor: HelpAnchorRect;\r\n}\r\n\r\ninterface KeywordHelpDefinition {\r\n summary: string;\r\n details: string;\r\n longDetails: string;\r\n link: string;\r\n}\r\n\r\ninterface FieldHelpContextValue {\r\n openHelp: (key: string, label: string, anchor: HelpAnchorRect) => void;\r\n}\r\n\r\nconst FieldHelpContext = createContext<FieldHelpContextValue | null>(null);\r\n\r\nconst FIELD_HELP_BASE_CONTENT: Record<string, Pick<KeywordHelpDefinition, \"summary\" | \"details\">> = {\r\n \"$id\": {\r\n summary: \"Sets the base URI that identifies this schema.\",\r\n details:\r\n \"Use <strong>$id</strong> to assign a stable identifier for the schema resource. Relative references and nested schema identifiers are resolved against this base URI.\"\r\n },\r\n \"$schema\": {\r\n summary: \"Declares which JSON Schema dialect this schema uses.\",\r\n details:\r\n \"Set <strong>$schema</strong> to the meta-schema URI for the draft you target, such as 2020-12. Validators use it to interpret keyword behavior and vocabulary support.\"\r\n },\r\n \"$ref\": {\r\n summary: \"References another schema and applies it at this location.\",\r\n details:\r\n \"Use <strong>$ref</strong> to point to a schema URI or JSON Pointer. Validation of this node is delegated to the referenced schema, allowing reuse and composition.\"\r\n },\r\n type: {\r\n summary: \"Restricts instance values to one or more JSON types.\",\r\n details:\r\n \"Set <strong>type</strong> to a single <strong>type</strong> or a list of allowed types. This controls which instances can match and which <strong>type</strong>-specific assertion keywords are meaningful.\"\r\n },\r\n title: {\r\n summary: \"Provides a short human-readable name for the schema.\",\r\n details:\r\n \"Use <strong>title</strong> as annotation text for UI labels, documentation, and schema browsing. It does <strong>not</strong> affect assertion or pass/fail validation outcomes.\"\r\n },\r\n description: {\r\n summary: \"Provides longer human-readable documentation for the schema.\",\r\n details:\r\n \"Use <strong>description</strong> to explain intent, constraints, and <strong>examples</strong> in prose. It is an annotation keyword and does <strong>not</strong> directly change validation results.\"\r\n },\r\n deprecated: {\r\n summary: \"Marks values as discouraged for future use.\",\r\n details:\r\n \"Set <strong>deprecated</strong> to true to signal that this schema location should be phased out. It is metadata for tooling and consumers rather than an assertion failure.\"\r\n },\r\n readonly: {\r\n summary: \"Marks a value as read-only for producers and clients.\",\r\n details:\r\n \"<strong>readOnly</strong> is an annotation commonly used by APIs and forms to prevent user edits on output-only fields. It does <strong>not</strong> invalidate JSON instances by itself.\"\r\n },\r\n writeonly: {\r\n summary: \"Marks a value as write-only and not intended for output.\",\r\n details:\r\n \"<strong>writeOnly</strong> is an annotation used for sensitive or input-only fields. Tooling may hide these in responses while still accepting them in requests.\"\r\n },\r\n examples: {\r\n summary: \"Supplies sample instance values for this schema location.\",\r\n details:\r\n \"Use <strong>examples</strong> as annotation data to illustrate typical values. These samples support docs and UI guidance but are <strong>not</strong> automatically enforced as constraints.\"\r\n },\r\n default: {\r\n summary: \"Provides a suggested default value for consumers.\",\r\n details:\r\n \"<strong>default</strong> is an annotation that tools may use to prefill forms or generated objects. Validators do <strong>not</strong> automatically insert or require this value.\"\r\n },\r\n const: {\r\n summary: \"Requires the instance to equal exactly one value.\",\r\n details:\r\n \"Use <strong>const</strong> when a field must always be a specific literal value. The instance must match this value exactly, including <strong>type</strong> and structure.\"\r\n },\r\n enum: {\r\n summary: \"Restricts the instance to one of the listed values.\",\r\n details:\r\n \"<strong>enum</strong> defines an allowed set of values and the instance must equal one of them. Values can be strings, numbers, booleans, null, objects, or arrays.\"\r\n },\r\n minlength: {\r\n summary: \"Sets the minimum string length in Unicode code points.\",\r\n details:\r\n \"<strong>minLength</strong> requires string instances to have at least this many characters. Use it with <strong>maxLength</strong> to bound accepted string sizes.\"\r\n },\r\n maxlength: {\r\n summary: \"Sets the maximum string length in Unicode code points.\",\r\n details:\r\n \"<strong>maxLength</strong> requires string instances to be no longer than this value. It applies only when the instance <strong>type</strong> is string.\"\r\n },\r\n pattern: {\r\n summary: \"Requires strings to match a regular expression. (HINT: Don't provide the leading or trailing slashes.)\",\r\n details:\r\n \"<strong>pattern</strong> uses an ECMA-262 compatible regular expression. A string is valid when the regex finds a match within the instance text.\"\r\n },\r\n format: {\r\n summary: \"Annotates or optionally asserts semantic string formats.\",\r\n details:\r\n \"<strong>format</strong> communicates semantic expectations such as email, uri, or date-time. Depending on validator configuration, it may be informational or enforced.\"\r\n },\r\n minimum: {\r\n summary: \"Sets the inclusive numeric lower bound.\",\r\n details:\r\n \"<strong>minimum</strong> requires numbers to be greater than or equal to this value. Use <strong>exclusiveMinimum</strong> when the lower bound should be strict.\"\r\n },\r\n maximum: {\r\n summary: \"Sets the inclusive numeric upper bound.\",\r\n details:\r\n \"<strong>maximum</strong> requires numbers to be less than or equal to this value. Use <strong>exclusiveMaximum</strong> when the upper bound should be strict.\"\r\n },\r\n multipleof: {\r\n summary: \"Requires numbers to be a multiple of the given divisor.\",\r\n details:\r\n \"<strong>multipleOf</strong> checks exact divisibility by a positive number. It is useful for increments such as currency steps or fixed precision values.\"\r\n },\r\n exclusiveminimum: {\r\n summary: \"Sets a strict numeric lower bound.\",\r\n details:\r\n \"<strong>exclusiveMinimum</strong> requires numbers to be strictly greater than this value. Instances equal to the boundary are invalid.\"\r\n },\r\n exclusivemaximum: {\r\n summary: \"Sets a strict numeric upper bound.\",\r\n details:\r\n \"<strong>exclusiveMaximum</strong> requires numbers to be strictly less than this value. Instances equal to the boundary are invalid.\"\r\n },\r\n properties: {\r\n summary: \"Defines schemas for named object properties.\",\r\n details:\r\n \"<strong>properties</strong> maps property names to subschemas. When an instance has a matching property, that value is validated against the corresponding subschema.\"\r\n },\r\n required: {\r\n summary: \"Lists object properties that must be present.\",\r\n details:\r\n \"<strong>required</strong> is an array of property names. Each listed name must appear on the object instance for validation to succeed.\"\r\n },\r\n additionalproperties: {\r\n summary: \"Controls validation of object properties not listed in properties.\",\r\n details:\r\n \"<strong>additionalProperties</strong> applies to remaining object members after <strong>properties</strong> and <strong>patternProperties</strong>. Use false to disallow extras or a schema to validate them.\"\r\n },\r\n unevaluatedproperties: {\r\n summary: \"Applies constraints to object properties not yet evaluated.\",\r\n details:\r\n \"<strong>unevaluatedProperties</strong> validates leftover object members after all applicable subschemas are considered. It helps enforce closed shapes with composition.\"\r\n },\r\n propertynames: {\r\n summary: \"Validates each object property name as a string.\",\r\n details:\r\n \"<strong>propertyNames</strong> applies its subschema to every key name in the object. This is useful for naming rules such as patterns or length limits on keys.\"\r\n },\r\n minproperties: {\r\n summary: \"Sets the minimum number of object properties.\",\r\n details:\r\n \"<strong>minProperties</strong> requires objects to contain at least this many <strong>properties</strong>. It is ignored for non-object instances.\"\r\n },\r\n maxproperties: {\r\n summary: \"Sets the maximum number of object properties.\",\r\n details:\r\n \"<strong>maxProperties</strong> requires objects to contain no more than this many <strong>properties</strong>. It is ignored for non-object instances.\"\r\n },\r\n dependentrequired: {\r\n summary: \"Requires additional properties when a property is present.\",\r\n details:\r\n \"<strong>dependentRequired</strong> maps a property name to a list of peer <strong>properties</strong> that must also exist whenever that property appears.\"\r\n },\r\n dependentschemas: {\r\n summary: \"Applies additional schema rules when a property is present.\",\r\n details:\r\n \"<strong>dependentSchemas</strong> maps a property name to a subschema. <strong>If</strong> that property exists in the instance object, the entire object must satisfy the mapped schema.\"\r\n },\r\n patternproperties: {\r\n summary: \"Applies schemas to object properties that match regex keys.\",\r\n details:\r\n \"<strong>patternProperties</strong> uses regular-expression keys to target groups of property names. Matching <strong>properties</strong> are validated by the associated subschema.\"\r\n },\r\n items: {\r\n summary: \"Defines the schema for array elements after tuple positions.\",\r\n details:\r\n \"In 2020-12, <strong>items</strong> applies to array elements <strong>not</strong> covered by <strong>prefixItems</strong>. Set a schema to validate trailing elements, or false to disallow them.\"\r\n },\r\n prefixitems: {\r\n summary: \"Defines positional schemas for tuple-style arrays.\",\r\n details:\r\n \"<strong>prefixItems</strong> is an ordered list of schemas, each applied to the array element at the same index. It models fixed-position tuple structures.\"\r\n },\r\n minitems: {\r\n summary: \"Sets the minimum number of items in an array.\",\r\n details:\r\n \"<strong>minItems</strong> requires arrays to contain at least this many elements. It is ignored for non-array instances.\"\r\n },\r\n maxitems: {\r\n summary: \"Sets the maximum number of items in an array.\",\r\n details:\r\n \"<strong>maxItems</strong> requires arrays to contain no more than this many elements. It is ignored for non-array instances.\"\r\n },\r\n uniqueitems: {\r\n summary: \"Requires all array items to be pairwise unique.\",\r\n details:\r\n \"When <strong>uniqueItems</strong> is true, no two <strong>items</strong> in the array may be deeply equal. It enforces set-like semantics for arrays.\"\r\n },\r\n contains: {\r\n summary: \"Requires at least one array item to match a subschema.\",\r\n details:\r\n \"<strong>contains</strong> checks array elements against a subschema and succeeds when enough matches are found. Combine with <strong>minContains</strong> and <strong>maxContains</strong> for match counts.\"\r\n },\r\n mincontains: {\r\n summary: \"Sets the minimum number of contains matches.\",\r\n details:\r\n \"<strong>minContains</strong> works with <strong>contains</strong> and requires at least this many matching elements. It is ignored when <strong>contains</strong> is absent.\"\r\n },\r\n maxcontains: {\r\n summary: \"Sets the maximum number of contains matches.\",\r\n details:\r\n \"<strong>maxContains</strong> works with <strong>contains</strong> and requires no more than this many matching elements. It is ignored when <strong>contains</strong> is absent.\"\r\n },\r\n unevaluateditems: {\r\n summary: \"Applies constraints to array items not yet evaluated.\",\r\n details:\r\n \"<strong>unevaluatedItems</strong> validates leftover array elements after <strong>prefixItems</strong>, <strong>items</strong>, <strong>contains</strong>, and composed schemas are processed.\"\r\n },\r\n allof: {\r\n summary: \"Requires the instance to satisfy every listed subschema.\",\r\n details:\r\n \"<strong>allOf</strong> composes schemas with logical AND behavior. The instance is valid only <strong>if</strong> it passes all subschemas in the array.\"\r\n },\r\n anyof: {\r\n summary: \"Requires the instance to satisfy at least one subschema.\",\r\n details:\r\n \"<strong>anyOf</strong> composes schemas with logical OR behavior. The instance is valid when one or more listed subschemas validate.\"\r\n },\r\n oneof: {\r\n summary: \"Requires the instance to satisfy exactly one subschema.\",\r\n details:\r\n \"<strong>oneOf</strong> succeeds only when exactly one subschema validates. It is useful for mutually exclusive alternatives.\"\r\n },\r\n not: {\r\n summary: \"Requires the instance to fail a given subschema.\",\r\n details:\r\n \"<strong>not</strong> inverts schema logic. The instance is valid only when it does <strong>not</strong> validate against the <strong>not</strong> subschema.\"\r\n },\r\n if: {\r\n summary: \"Defines the condition used by conditional schemas.\",\r\n details:\r\n \"<strong>if</strong> applies a subschema test. When it passes, <strong>then</strong> is applied; when it fails, <strong>else</strong> is applied, <strong>if</strong> those branches are present.\"\r\n },\r\n then: {\r\n summary: \"Applies extra constraints when if succeeds.\",\r\n details:\r\n \"<strong>then</strong> is evaluated only when the <strong>if</strong> subschema validates. Use it to enforce rules that should hold under a matching condition.\"\r\n },\r\n else: {\r\n summary: \"Applies extra constraints when if fails.\",\r\n details:\r\n \"<strong>else</strong> is evaluated only when the <strong>if</strong> subschema does <strong>not</strong> validate. Use it as the alternate branch of conditional validation.\"\r\n }\r\n};\r\n\r\nconst FIELD_HELP_LONG_DETAILS: Record<string, string> = {\r\n \"$id\": \"The <strong>$id</strong> keyword establishes the canonical URI for a schema resource, which becomes the base for relative references and nested identifiers. In draft 2020-12, stable and absolute identifiers make schema reuse, bundling, and external referencing significantly more predictable across tools.\",\r\n \"$schema\": \"The <strong>$schema</strong> keyword declares the dialect and meta-schema that define keyword behavior for this document. Declaring this explicitly helps validators select correct semantics and avoids ambiguity when multiple drafts are supported.\",\r\n \"$ref\": \"The <strong>$ref</strong> keyword replaces local constraints with the referenced schema target, enabling modular schema design and reuse. In 2020-12, references participate in dynamic resolution rules and should be treated as schema application rather than a textual include.\",\r\n type: \"The <strong>type</strong> keyword constrains instance types and is often the first line of validation structure for a field. In 2020-12, <strong>type</strong> can be a single value or an array of values to express unions, and other assertion keywords should align with the allowed types.\",\r\n title: \"The <strong>title</strong> keyword is an annotation intended for human-facing tools such as documentation and generated forms. While it does <strong>not</strong> influence pass/fail validation, it is important for readability and schema maintainability.\",\r\n description: \"The <strong>description</strong> keyword provides richer human guidance about expected data semantics and usage context. It is annotation-only, so it should be used to improve comprehension without being relied on for enforcement.\",\r\n deprecated: \"The <strong>deprecated</strong> keyword communicates that a field or value path is still accepted but should be phased out. This is particularly useful for compatibility windows and migration planning in APIs and event schemas.\",\r\n readonly: \"The <strong>readOnly</strong> keyword is an annotation that indicates values are intended to be supplied by producers and <strong>not</strong> edited by consumers. It is commonly interpreted by UI and API tooling even though it is <strong>not</strong> a direct validation assertion.\",\r\n writeonly: \"The <strong>writeOnly</strong> keyword is an annotation indicating values are intended for input but should <strong>not</strong> be returned in output contexts. It is often used for secrets, credentials, and transient request-only fields.\",\r\n examples: \"The <strong>examples</strong> keyword provides non-normative sample instances that help humans and tools understand expected values. These <strong>examples</strong> are documentation aids and are <strong>not</strong> <strong>required</strong> to be validated as constraints by implementations.\",\r\n default: \"The <strong>default</strong> keyword suggests a value that may be used when an instance omits the field. Because JSON Schema does <strong>not</strong> mandate <strong>default</strong> assignment behavior, producers should treat it as guidance rather than implicit mutation.\",\r\n const: \"The <strong>const</strong> keyword enforces exact deep-equality with one specific JSON value, including <strong>type</strong> and structure. It is useful when a discriminator or fixed contract token must always remain constant.\",\r\n enum: \"The <strong>enum</strong> keyword constrains the instance to one of a finite set of values compared by JSON deep-equality. This is ideal for controlled vocabularies and closed option sets across both primitive and structured values.\",\r\n minlength: \"The <strong>minLength</strong> keyword applies only to strings and sets a lower bound measured in Unicode code points. It should be paired thoughtfully with <strong>maxLength</strong> when defining bounded text fields.\",\r\n maxlength: \"The <strong>maxLength</strong> keyword applies only to strings and sets an upper bound measured in Unicode code points. This protects payload size and supports UI, storage, and transport constraints.\",\r\n pattern: \"The <strong>pattern</strong> keyword applies an ECMA-262 regular expression to string instances, succeeding when a match is found. Patterns are <strong>not</strong> implicitly anchored, so use explicit anchors when full-string matching is <strong>required</strong>.\",\r\n format: \"The <strong>format</strong> keyword conveys semantic expectations such as email, URI, hostname, or date-time. In 2020-12, <strong>format</strong> behavior depends on implementation configuration and may be annotation-only unless assertions are enabled.\",\r\n minimum: \"The <strong>minimum</strong> keyword sets an inclusive numeric lower bound and applies to number and integer instances. Use this when a boundary value itself is valid and should be accepted.\",\r\n maximum: \"The <strong>maximum</strong> keyword sets an inclusive numeric upper bound and applies to number and integer instances. Use this when the boundary value itself should remain valid.\",\r\n multipleof: \"The <strong>multipleOf</strong> keyword requires numeric values to divide evenly by a positive divisor. This is commonly used to enforce precision steps, measurement increments, and monetary granularity.\",\r\n exclusiveminimum: \"The <strong>exclusiveMinimum</strong> keyword defines a strict numeric boundary where values must be greater than the threshold. It is appropriate when an endpoint must be excluded from valid input.\",\r\n exclusivemaximum: \"The <strong>exclusiveMaximum</strong> keyword defines a strict numeric boundary where values must be less than the threshold. It is useful for open upper intervals and strict cap behavior.\",\r\n properties: \"The <strong>properties</strong> keyword maps specific object member names to subschemas that validate corresponding member values. It only applies when those named members are present and does <strong>not</strong> by itself require their presence.\",\r\n required: \"The <strong>required</strong> keyword lists object property names that must exist on an instance object. Presence is enforced independently from value constraints, which are validated by associated subschemas.\",\r\n additionalproperties: \"The <strong>additionalProperties</strong> keyword controls validation for object members <strong>not</strong> matched by <strong>properties</strong> or <strong>patternProperties</strong>. In strict object designs, setting this to false prevents unrecognized keys from passing.\",\r\n unevaluatedproperties: \"The <strong>unevaluatedProperties</strong> keyword applies after other applicators and targets object members that remain unevaluated. This makes it especially powerful with composition keywords when enforcing closed-world object shapes.\",\r\n propertynames: \"The <strong>propertyNames</strong> keyword validates each object key string against a subschema, independent of corresponding values. It is useful for naming conventions, prefix rules, and machine-generated key constraints.\",\r\n minproperties: \"The <strong>minProperties</strong> keyword sets the <strong>minimum</strong> count of key/value pairs <strong>required</strong> in an object instance. It supports cardinality rules independent from which exact <strong>properties</strong> are <strong>required</strong>.\",\r\n maxproperties: \"The <strong>maxProperties</strong> keyword sets the <strong>maximum</strong> count of key/value pairs permitted in an object instance. This can prevent over-populated objects and constrain dynamic key scenarios.\",\r\n dependentrequired: \"The <strong>dependentRequired</strong> keyword expresses conditional presence dependencies between object <strong>properties</strong>. When one property appears, a configured list of sibling <strong>properties</strong> must also be present.\",\r\n dependentschemas: \"The <strong>dependentSchemas</strong> keyword applies whole-object subschemas when specific trigger <strong>properties</strong> are present. It enables conditional object validation patterns that go beyond simple <strong>required</strong> lists.\",\r\n patternproperties: \"The <strong>patternProperties</strong> keyword assigns subschemas to regex-based key groups, allowing families of similarly named members to share validation rules. Multiple regexes may apply to the same property name.\",\r\n items: \"In draft 2020-12, <strong>items</strong> applies to array positions <strong>not</strong> covered by <strong>prefixItems</strong> and therefore governs trailing elements. This separates tuple-prefix constraints from the schema for remaining array entries.\",\r\n prefixitems: \"The <strong>prefixItems</strong> keyword defines positional schemas for tuple-like arrays where each index has a distinct rule. It is evaluated in order and is foundational for fixed-structure array contracts.\",\r\n minitems: \"The <strong>minItems</strong> keyword sets the <strong>minimum</strong> number of elements <strong>required</strong> in an array instance. It is commonly combined with <strong>contains</strong> or tuple rules to ensure baseline completeness.\",\r\n maxitems: \"The <strong>maxItems</strong> keyword sets the <strong>maximum</strong> number of elements permitted in an array instance. It is useful for preventing oversized arrays and bounding processing cost.\",\r\n uniqueitems: \"When <strong>uniqueItems</strong> is true, every pair of array elements must be unequal under deep JSON comparison. This enforces set-like semantics, including for objects and arrays.\",\r\n contains: \"The <strong>contains</strong> keyword requires array instances to include elements matching a given subschema. In 2020-12, it can be further quantified with <strong>minContains</strong> and <strong>maxContains</strong> to constrain match counts.\",\r\n mincontains: \"The <strong>minContains</strong> keyword defines the <strong>minimum</strong> number of elements that must satisfy the <strong>contains</strong> subschema. It is ignored when <strong>contains</strong> is absent and should be configured alongside <strong>contains</strong>.\",\r\n maxcontains: \"The <strong>maxContains</strong> keyword defines the <strong>maximum</strong> number of elements that may satisfy the <strong>contains</strong> subschema. It is ignored when <strong>contains</strong> is absent and helps bound matching frequency.\",\r\n unevaluateditems: \"The <strong>unevaluatedItems</strong> keyword applies to array elements <strong>not</strong> already evaluated by <strong>prefixItems</strong>, <strong>items</strong>, <strong>contains</strong>, or composed branches. It is valuable for enforcing tight post-composition array contracts.\",\r\n allof: \"The <strong>allOf</strong> keyword requires the instance to satisfy every subschema in the array, equivalent to logical conjunction. It is useful for composing orthogonal constraints into a single effective schema.\",\r\n anyof: \"The <strong>anyOf</strong> keyword requires at least one subschema to validate, equivalent to logical disjunction. It is suitable for permissive alternatives where overlaps are acceptable.\",\r\n oneof: \"The <strong>oneOf</strong> keyword requires exactly one subschema to validate, making it stricter than <strong>anyOf</strong>. It is commonly used for tagged union designs where alternatives should be mutually exclusive.\",\r\n not: \"The <strong>not</strong> keyword inverts validation for its subschema and passes only when the subschema fails. It is useful for exclusion constraints and disallowing problematic shapes.\",\r\n if: \"The <strong>if</strong> keyword defines a predicate subschema used to choose conditional branches. Its result controls whether <strong>then</strong> or <strong>else</strong> is evaluated when those keywords are present.\",\r\n then: \"The <strong>then</strong> keyword is applied only when <strong>if</strong> succeeds, allowing additional constraints in the true branch. It is often paired with discriminators and property dependencies.\",\r\n else: \"The <strong>else</strong> keyword is applied only when <strong>if</strong> fails, providing alternate constraints for the false branch. Together with <strong>if</strong>/<strong>then</strong>, it forms full conditional validation flow in a single schema node.\"\r\n};\r\n\r\nconst FIELD_HELP_LINKS: Record<string, string> = {\r\n \"$id\": \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-id-keyword\",\r\n \"$schema\": \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-schema-keyword\",\r\n \"$ref\": \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-ref-keyword\",\r\n type: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-type\",\r\n title: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-title\",\r\n description: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-description\",\r\n deprecated: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-deprecated\",\r\n readonly: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-readonly\",\r\n writeonly: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-writeonly\",\r\n examples: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-examples\",\r\n default: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-default\",\r\n const: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-const\",\r\n enum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-enum\",\r\n minlength: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minlength\",\r\n maxlength: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxlength\",\r\n pattern: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-pattern\",\r\n format: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-format\",\r\n minimum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minimum\",\r\n maximum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maximum\",\r\n multipleof: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-multipleof\",\r\n exclusiveminimum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-exclusiveminimum\",\r\n exclusivemaximum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-exclusivemaximum\",\r\n properties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-properties\",\r\n required: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-required\",\r\n additionalproperties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-additionalproperties\",\r\n unevaluatedproperties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-unevaluatedproperties\",\r\n propertynames: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-propertynames\",\r\n minproperties: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minproperties\",\r\n maxproperties: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxproperties\",\r\n dependentrequired: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-dependentrequired\",\r\n dependentschemas: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-dependentschemas\",\r\n patternproperties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-patternproperties\",\r\n items: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-items\",\r\n prefixitems: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-prefixitems\",\r\n minitems: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minitems\",\r\n maxitems: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxitems\",\r\n uniqueitems: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-uniqueitems\",\r\n contains: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-contains\",\r\n mincontains: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-mincontains\",\r\n maxcontains: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxcontains\",\r\n unevaluateditems: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-unevaluateditems\",\r\n allof: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-allof\",\r\n anyof: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-anyof\",\r\n oneof: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-oneof\",\r\n not: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-not\",\r\n if: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-if\",\r\n then: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-then\",\r\n else: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-else\"\r\n};\r\n\r\nconst DEFAULT_HELP_LINK = \"https://json-schema.org/draft/2020-12/\";\r\n\r\nconst FIELD_HELP_CONTENT: Record<string, KeywordHelpDefinition> = Object.fromEntries(\r\n Object.entries(FIELD_HELP_BASE_CONTENT).map(([key, value]) => [\r\n key,\r\n {\r\n ...value,\r\n longDetails:\r\n FIELD_HELP_LONG_DETAILS[key] ??\r\n \"This keyword participates in JSON Schema 2020-12 evaluation and should be configured according to the intended assertion and annotation behavior.\",\r\n link: FIELD_HELP_LINKS[key] ?? DEFAULT_HELP_LINK\r\n }\r\n ])\r\n) as Record<string, KeywordHelpDefinition>;\r\n\r\nfunction normalizeHelpKey(value: string): string {\r\n return value\r\n .trim()\r\n .toLowerCase()\r\n .replace(/\\(.*?\\)/g, \"\")\r\n .replace(/\\s+/g, \"\")\r\n .replace(/[^$a-z0-9]/g, \"\");\r\n}\r\n\r\nfunction resolveHelpDefinition(keywordOrLabel: string): KeywordHelpDefinition {\r\n const normalized = normalizeHelpKey(keywordOrLabel);\r\n\r\n if (normalized === \"types\") {\r\n return FIELD_HELP_CONTENT.type;\r\n }\r\n\r\n if (normalized === \"min\") {\r\n return FIELD_HELP_CONTENT.minimum;\r\n }\r\n\r\n if (normalized === \"max\") {\r\n return FIELD_HELP_CONTENT.maximum;\r\n }\r\n\r\n const direct = FIELD_HELP_CONTENT[normalized];\r\n if (direct) {\r\n return direct;\r\n }\r\n\r\n return {\r\n summary: \"Defines behavior for this schema field.\",\r\n details:\r\n \"This control edits a JSON Schema keyword or related configuration for the current node. Set a value here to shape validation and annotations.\",\r\n longDetails:\r\n \"For exact semantics, check the draft 2020-12 specification section for this keyword and confirm whether your validator treats it as an assertion, annotation, or applicator.\",\r\n link: DEFAULT_HELP_LINK\r\n };\r\n}\r\n\r\ntype SchemaBuilderHelperMatch = {\r\n keyword: string;\r\n keywordLabel: string;\r\n snippet: string;\r\n score: number;\r\n};\r\n\r\ntype SchemaBuilderHelperSourceEntry = {\r\n keyword: string;\r\n keywordLabel: string;\r\n longDetails: string;\r\n};\r\n\r\nconst KEYWORD_DISPLAY_LABELS: Record<string, string> = {\r\n readonly: \"readOnly\",\r\n writeonly: \"writeOnly\",\r\n minlength: \"minLength\",\r\n maxlength: \"maxLength\",\r\n multipleof: \"multipleOf\",\r\n exclusiveminimum: \"exclusiveMinimum\",\r\n exclusivemaximum: \"exclusiveMaximum\",\r\n additionalproperties: \"additionalProperties\",\r\n unevaluatedproperties: \"unevaluatedProperties\",\r\n propertynames: \"propertyNames\",\r\n minproperties: \"minProperties\",\r\n maxproperties: \"maxProperties\",\r\n dependentrequired: \"dependentRequired\",\r\n dependentschemas: \"dependentSchemas\",\r\n patternproperties: \"patternProperties\",\r\n prefixitems: \"prefixItems\",\r\n minitems: \"minItems\",\r\n maxitems: \"maxItems\",\r\n uniqueitems: \"uniqueItems\",\r\n mincontains: \"minContains\",\r\n maxcontains: \"maxContains\",\r\n unevaluateditems: \"unevaluatedItems\",\r\n allof: \"allOf\",\r\n anyof: \"anyOf\",\r\n oneof: \"oneOf\"\r\n};\r\n\r\nfunction stripHtmlMarkup(text: string): string {\r\n return text.replace(/<[^>]+>/g, \"\");\r\n}\r\n\r\nfunction toKeywordDisplayLabel(keyword: string): string {\r\n return KEYWORD_DISPLAY_LABELS[keyword] ?? keyword;\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\nfunction uniqueQueryWords(input: string): string[] {\r\n const words = input\r\n .toLowerCase()\r\n .split(/[^$a-z0-9]+/g)\r\n .filter((word) => word.length > 0);\r\n\r\n return Array.from(new Set(words));\r\n}\r\n\r\nfunction countOccurrences(text: string, query: string): number {\r\n const normalizedText = text.toLowerCase();\r\n const normalizedQuery = query.toLowerCase();\r\n\r\n if (!normalizedQuery) {\r\n return 0;\r\n }\r\n\r\n let count = 0;\r\n let searchIndex = 0;\r\n\r\n while (searchIndex < normalizedText.length) {\r\n const matchIndex = normalizedText.indexOf(normalizedQuery, searchIndex);\r\n if (matchIndex < 0) {\r\n break;\r\n }\r\n\r\n count += 1;\r\n searchIndex = matchIndex + normalizedQuery.length;\r\n }\r\n\r\n return count;\r\n}\r\n\r\nfunction buildSnippet(text: string, words: string[], targetLength = 180): string {\r\n if (text.length <= targetLength) {\r\n return text;\r\n }\r\n\r\n const lowerText = text.toLowerCase();\r\n let bestIndex = -1;\r\n\r\n for (const word of words) {\r\n const index = lowerText.indexOf(word);\r\n if (index >= 0 && (bestIndex === -1 || index < bestIndex)) {\r\n bestIndex = index;\r\n }\r\n }\r\n\r\n const anchor = bestIndex >= 0 ? bestIndex : 0;\r\n const halfWindow = Math.floor(targetLength / 2);\r\n let start = Math.max(0, anchor - halfWindow);\r\n let end = Math.min(text.length, start + targetLength);\r\n\r\n if (end - start < targetLength) {\r\n start = Math.max(0, end - targetLength);\r\n }\r\n\r\n const rawSlice = text.slice(start, end).trim();\r\n const prefix = start > 0 ? \"...\" : \"\";\r\n const suffix = end < text.length ? \"...\" : \"\";\r\n return `${prefix}${rawSlice}${suffix}`;\r\n}\r\n\r\nfunction renderHighlightedSnippet(snippet: string, words: string[]): ReactNode[] {\r\n if (words.length === 0) {\r\n return [snippet];\r\n }\r\n\r\n const pattern = new RegExp(`(${words.map((word) => escapeRegExp(word)).sort((a, b) => b.length - a.length).join(\"|\")})`, \"gi\");\r\n const parts = snippet.split(pattern);\r\n const lowerWords = new Set(words.map((word) => word.toLowerCase()));\r\n\r\n return parts.map((part, index) => {\r\n if (part && lowerWords.has(part.toLowerCase())) {\r\n return <strong key={`snippet-part-${index}`}>{part}</strong>;\r\n }\r\n\r\n return part;\r\n });\r\n}\r\n\r\nfunction resolveHelperContentEntries(helpContent?: SchemaBuilderHelperContent): SchemaBuilderHelperSourceEntry[] {\r\n if (!helpContent) {\r\n return Object.entries(FIELD_HELP_LONG_DETAILS).map(([keyword, longDetails]) => ({\r\n keyword,\r\n keywordLabel: toKeywordDisplayLabel(keyword),\r\n longDetails\r\n }));\r\n }\r\n\r\n const resolved = new Map<string, SchemaBuilderHelperSourceEntry>();\r\n\r\n for (const [rawKey, rawEntry] of Object.entries(helpContent)) {\r\n const keyword = normalizeHelpKey(rawKey);\r\n if (!keyword) {\r\n continue;\r\n }\r\n\r\n const entry: SchemaBuilderHelperContentEntry =\r\n typeof rawEntry === \"string\"\r\n ? { longDetails: rawEntry }\r\n : {\r\n longDetails: rawEntry.longDetails,\r\n label: rawEntry.label\r\n };\r\n\r\n if (!entry.longDetails.trim()) {\r\n continue;\r\n }\r\n\r\n const fallbackLabel = keyword in FIELD_HELP_LONG_DETAILS ? toKeywordDisplayLabel(keyword) : rawKey.trim() || keyword;\r\n const keywordLabel = entry.label?.trim() || fallbackLabel;\r\n resolved.set(keyword, {\r\n keyword,\r\n keywordLabel,\r\n longDetails: entry.longDetails\r\n });\r\n }\r\n\r\n return Array.from(resolved.values());\r\n}\r\n\r\nexport function SchemaBuilderHelper({\r\n debounceMs = 280,\r\n maxResults = 12,\r\n placeholder = \"Type to search schema keyword guidance...\",\r\n initialQuery = \"\",\r\n helpContent\r\n}: SchemaBuilderHelperProps) {\r\n const [query, setQuery] = useState(initialQuery);\r\n const [debouncedQuery, setDebouncedQuery] = useState(initialQuery);\r\n const helperEntries = useMemo(() => resolveHelperContentEntries(helpContent), [helpContent]);\r\n\r\n useEffect(() => {\r\n const handle = window.setTimeout(() => {\r\n setDebouncedQuery(query);\r\n }, debounceMs);\r\n\r\n return () => {\r\n window.clearTimeout(handle);\r\n };\r\n }, [query, debounceMs]);\r\n\r\n const matches = useMemo(() => {\r\n const words = uniqueQueryWords(debouncedQuery);\r\n if (words.length === 0) {\r\n return [] as SchemaBuilderHelperMatch[];\r\n }\r\n\r\n const scored = helperEntries\r\n .map((entry) => {\r\n const plainText = stripHtmlMarkup(entry.longDetails);\r\n const normalized = plainText.toLowerCase();\r\n\r\n let matchedWords = 0;\r\n let weightedHits = 0;\r\n let totalHits = 0;\r\n\r\n for (const word of words) {\r\n const hits = countOccurrences(normalized, word);\r\n if (hits > 0) {\r\n matchedWords += 1;\r\n totalHits += hits;\r\n weightedHits += hits * Math.max(word.length, 1);\r\n }\r\n }\r\n\r\n if (matchedWords === 0) {\r\n return null;\r\n }\r\n\r\n const score = matchedWords * 100 + weightedHits * 10 + totalHits;\r\n return {\r\n keyword: entry.keyword,\r\n keywordLabel: entry.keywordLabel,\r\n snippet: buildSnippet(plainText, words),\r\n score\r\n } as SchemaBuilderHelperMatch;\r\n })\r\n .filter((entry): entry is SchemaBuilderHelperMatch => entry !== null)\r\n .sort((a, b) => b.score - a.score || a.keywordLabel.localeCompare(b.keywordLabel));\r\n\r\n return scored.slice(0, maxResults);\r\n }, [debouncedQuery, helperEntries, maxResults]);\r\n\r\n const highlightWords = useMemo(() => uniqueQueryWords(debouncedQuery), [debouncedQuery]);\r\n\r\n return (\r\n <div className=\"raf-helper-panel\">\r\n <h3 className=\"raf-helper-title\">Keyword Assistant</h3>\r\n <div className=\"raf-helper-subtitle\">Searches keyword guidance in long-form JSON Schema notes.</div>\r\n\r\n <input\r\n className=\"raf-input raf-builder-control\"\r\n type=\"text\"\r\n value={query}\r\n onChange={(event) => setQuery(event.target.value)}\r\n placeholder={placeholder}\r\n aria-label=\"Search SchemaBuilder keyword help\"\r\n />\r\n\r\n <div className=\"raf-helper-results\" role=\"region\" aria-label=\"SchemaBuilder helper results\">\r\n {highlightWords.length === 0 ? (\r\n <div className=\"raf-helper-empty\">Start typing to see matching keyword snippets.</div>\r\n ) : matches.length === 0 ? (\r\n <div className=\"raf-helper-empty\">No matching keyword guidance found.</div>\r\n ) : (\r\n matches.map((match) => (\r\n <article className=\"raf-helper-snippet\" key={match.keyword}>\r\n <header className=\"raf-helper-snippet-keyword\">{match.keywordLabel}</header>\r\n <div className=\"raf-helper-snippet-body\">{renderHighlightedSnippet(match.snippet, highlightWords)}</div>\r\n </article>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport function SchemaBuilder({ schema, domain, onChange }: SchemaBuilderProps) {\r\n const [currentSchema, setCurrentSchema] = useState<JSONSchema>(() => schema ?? createDefaultRootSchema());\r\n const [rawJson, setRawJson] = useState(() => JSON.stringify(schema ?? createDefaultRootSchema(), null, 2));\r\n const [rawJsonError, setRawJsonError] = useState<string | null>(null);\r\n const [activeHelp, setActiveHelp] = useState<ActiveFieldHelp | null>(null);\r\n const onChangeRef = useRef(onChange);\r\n const publishedSchema = useMemo(() => {\r\n const sanitized = sanitizeSchemaForOutput(currentSchema);\r\n return applyDomainToRootId(sanitized, domain);\r\n }, [currentSchema, domain]);\r\n\r\n useEffect(() => {\r\n onChangeRef.current = onChange;\r\n }, [onChange]);\r\n\r\n useEffect(() => {\r\n if (schema) {\r\n setCurrentSchema(cloneSchema(schema));\r\n }\r\n }, [schema]);\r\n\r\n useEffect(() => {\r\n setRawJson(JSON.stringify(currentSchema, null, 2));\r\n const validationErrors = validateSchemaDefinition(publishedSchema);\r\n onChangeRef.current?.(publishedSchema, validationErrors);\r\n }, [currentSchema, publishedSchema]);\r\n\r\n const handleRootChange = (nextSchema: JSONSchema) => {\r\n setCurrentSchema(nextSchema);\r\n };\r\n\r\n const openHelp = useCallback((key: string, label: string, anchor: HelpAnchorRect) => {\r\n setActiveHelp({ key, label, anchor });\r\n }, []);\r\n\r\n const closeHelp = useCallback(() => {\r\n setActiveHelp(null);\r\n }, []);\r\n\r\n const prettySchema = useMemo(() => JSON.stringify(publishedSchema, null, 2), [publishedSchema]);\r\n\r\n return (\r\n <FieldHelpContext.Provider value={{ openHelp }}>\r\n <div className=\"raf-schema-builder\">\r\n <SchemaNodeEditor\r\n schema={currentSchema}\r\n label=\"Root Schema\"\r\n isRoot={true}\r\n domain={domain}\r\n onChange={handleRootChange}\r\n />\r\n\r\n <details className=\"raf-object\">\r\n <summary className=\"raf-object-summary\">Advanced: Edit Full Schema JSON</summary>\r\n <div className=\"raf-object-content\">\r\n <textarea\r\n className=\"raf-textarea\"\r\n value={rawJson}\r\n onChange={(event) => {\r\n const nextText = event.target.value;\r\n setRawJson(nextText);\r\n\r\n try {\r\n const parsed = JSON.parse(nextText) as JSONSchema;\r\n if (!isObject(parsed)) {\r\n const message = \"Schema JSON must be an object.\";\r\n setRawJsonError(message);\r\n onChangeRef.current?.(publishedSchema, [\r\n {\r\n message,\r\n source: \"json-parse\"\r\n }\r\n ]);\r\n return;\r\n }\r\n\r\n setRawJsonError(null);\r\n setCurrentSchema(parsed);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : \"Invalid JSON.\";\r\n setRawJsonError(message);\r\n onChangeRef.current?.(publishedSchema, [\r\n {\r\n message,\r\n source: \"json-parse\"\r\n }\r\n ]);\r\n }\r\n }}\r\n />\r\n {rawJsonError ? <div className=\"raf-error\">{rawJsonError}</div> : null}\r\n </div>\r\n </details>\r\n\r\n <details className=\"raf-object\">\r\n <summary className=\"raf-object-summary\">Preview JSON Schema</summary>\r\n <div className=\"raf-object-content\">\r\n <pre className=\"raf-json-preview\">{prettySchema}</pre>\r\n </div>\r\n </details>\r\n </div>\r\n\r\n <FieldInfoModal activeHelp={activeHelp} onClose={closeHelp} />\r\n </FieldHelpContext.Provider>\r\n );\r\n}\r\n\r\ninterface SchemaNodeEditorProps {\r\n schema: JSONSchema;\r\n label: string;\r\n onChange: (next: JSONSchema) => void;\r\n onRemove?: () => void;\r\n isRoot?: boolean;\r\n domain?: string;\r\n primaryLeadField?: ReactNode;\r\n primaryFollowField?: ReactNode;\r\n showPrimaryTitle?: boolean;\r\n}\r\n\r\nfunction SchemaNodeEditor({\r\n schema,\r\n label,\r\n onChange,\r\n onRemove,\r\n isRoot = false,\r\n domain,\r\n primaryLeadField,\r\n primaryFollowField,\r\n showPrimaryTitle = isRoot\r\n}: SchemaNodeEditorProps) {\r\n const schemaTypes = getSchemaTypes(schema);\r\n const primaryType = schemaTypes.length === 1 ? schemaTypes[0] : undefined;\r\n const hasType = (type: JSONSchemaType) => schemaTypes.includes(type);\r\n const editableRootId = isRoot ? toLocalId(stringOrEmpty(schema.$id), domain) : stringOrEmpty(schema.$id);\r\n const fullRootId = isRoot ? toFullId(editableRootId, domain) : editableRootId;\r\n\r\n return (\r\n <details className=\"raf-object\" open>\r\n <summary className=\"raf-object-summary\">{label}</summary>\r\n <div className=\"raf-object-content\">\r\n <div className=\"raf-builder-grid\">\r\n {primaryLeadField}\r\n {showPrimaryTitle ? (\r\n <TextInput\r\n label=\"Title\"\r\n keyword=\"title\"\r\n value={stringOrEmpty(schema.title)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"title\", value))}\r\n />\r\n ) : null}\r\n\r\n <TypeListEditor\r\n value={schemaTypes}\r\n onChange={(nextTypes) => {\r\n const next = applyTypes(schema, nextTypes);\r\n delete next.const;\r\n delete next.enum;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n {primaryFollowField}\r\n </div>\r\n\r\n {hasType(\"object\") ? <ObjectSchemaEditor schema={schema} onChange={onChange} showAdvancedOptions={false} /> : null}\r\n\r\n <BuilderDisclosureSection title=\"More Details\">\r\n <BuilderDisclosureSection title=\"Documentation & References\" defaultOpen={true}>\r\n\r\n <div className=\"raf-builder-grid\">\r\n {!showPrimaryTitle ? (\r\n <TextInput\r\n label=\"Title\"\r\n keyword=\"title\"\r\n value={stringOrEmpty(schema.title)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"title\", value))}\r\n />\r\n ) : null}\r\n\r\n <TextInput\r\n label=\"$ref\"\r\n keyword=\"$ref\"\r\n value={stringOrEmpty(schema.$ref)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"$ref\", value))}\r\n />\r\n\r\n <TextInput\r\n label=\"$id\"\r\n keyword=\"$id\"\r\n value={editableRootId}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"$id\", isRoot ? toLocalId(value, domain) : value))}\r\n helperText={isRoot && domain ? `Full $id: ${fullRootId || \"(empty)\"}` : undefined}\r\n />\r\n\r\n <TextInput\r\n label=\"$schema\"\r\n keyword=\"$schema\"\r\n value={stringOrEmpty(schema.$schema)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"$schema\", value))}\r\n placeholder={DEFAULT_SCHEMA_URI}\r\n />\r\n </div>\r\n\r\n <TextAreaInput\r\n label=\"Description\"\r\n keyword=\"description\"\r\n value={stringOrEmpty(schema.description)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"description\", value))}\r\n />\r\n </BuilderDisclosureSection>\r\n\r\n <BuilderDisclosureSection title=\"Meta-data\" defaultOpen={true}>\r\n\r\n <div className=\"raf-builder-grid\">\r\n <KeywordCheckbox\r\n label=\"deprecated\"\r\n keyword=\"deprecated\"\r\n checked={schema.deprecated === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.deprecated = true;\r\n } else {\r\n delete next.deprecated;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <KeywordCheckbox\r\n label=\"readOnly\"\r\n keyword=\"readOnly\"\r\n checked={schema.readOnly === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.readOnly = true;\r\n } else {\r\n delete next.readOnly;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <KeywordCheckbox\r\n label=\"writeOnly\"\r\n keyword=\"writeOnly\"\r\n checked={schema.writeOnly === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.writeOnly = true;\r\n } else {\r\n delete next.writeOnly;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"raf-builder-grid\">\r\n <JsonTextInput\r\n label=\"Default (JSON)\"\r\n keyword=\"default\"\r\n value={schema.default}\r\n placeholder='e.g. \"abc\", 42, true, {\"k\":\"v\"}'\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.default;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n onChange({ ...schema, default: parsed });\r\n }}\r\n />\r\n\r\n <JsonTextInput\r\n label=\"examples\"\r\n keyword=\"examples\"\r\n value={schema.examples}\r\n placeholder='e.g. [\"sample\", 1, true]'\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.examples;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n if (!Array.isArray(parsed)) {\r\n return;\r\n }\r\n\r\n onChange({ ...schema, examples: parsed });\r\n }}\r\n />\r\n </div>\r\n </BuilderDisclosureSection>\r\n\r\n <BuilderDisclosureSection title=\"Value Rules\" defaultOpen={true}>\r\n <ConstEditor schema={schema} schemaTypes={schemaTypes} primaryType={primaryType} onChange={onChange} />\r\n <EnumEditor schema={schema} schemaTypes={schemaTypes} primaryType={primaryType} onChange={onChange} />\r\n </BuilderDisclosureSection>\r\n\r\n {hasType(\"string\") ? (\r\n <BuilderDisclosureSection title=\"String Constraints\" defaultOpen={true}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minLength\"\r\n keyword=\"minLength\"\r\n value={numberOrEmpty(schema.minLength)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minLength\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 1\"\r\n />\r\n <TextInput\r\n label=\"maxLength\"\r\n keyword=\"maxLength\"\r\n value={numberOrEmpty(schema.maxLength)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxLength\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 255\"\r\n />\r\n </div>\r\n <TextInput\r\n label=\"Pattern\"\r\n keyword=\"pattern\"\r\n value={stringOrEmpty(schema.pattern)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"pattern\", value))}\r\n placeholder=\"e.g. ^[A-Za-z]+$\"\r\n />\r\n <TypeaheadInput\r\n label=\"format\"\r\n keyword=\"format\"\r\n value={stringOrEmpty(schema.format)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"format\", value))}\r\n options={AJV_SUPPORTED_FORMATS}\r\n placeholder=\"e.g. email\"\r\n />\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n {hasType(\"number\") || hasType(\"integer\") ? (\r\n <BuilderDisclosureSection title=\"Number Constraints\" defaultOpen={true}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"Min\"\r\n keyword=\"minimum\"\r\n value={numberOrEmpty(schema.minimum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"minimum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"Max\"\r\n keyword=\"maximum\"\r\n value={numberOrEmpty(schema.maximum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"maximum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 100\"\r\n />\r\n </div>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"multipleOf\"\r\n keyword=\"multipleOf\"\r\n value={numberOrEmpty(schema.multipleOf)}\r\n onChange={(value) => onChange(assignOptionalPositiveNumber(schema, \"multipleOf\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 0.5\"\r\n />\r\n <TextInput\r\n label=\"exclusiveMinimum\"\r\n keyword=\"exclusiveMinimum\"\r\n value={numberOrEmpty(schema.exclusiveMinimum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"exclusiveMinimum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"exclusiveMaximum\"\r\n keyword=\"exclusiveMaximum\"\r\n value={numberOrEmpty(schema.exclusiveMaximum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"exclusiveMaximum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 100\"\r\n />\r\n </div>\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n {hasType(\"array\") ? (\r\n <BuilderDisclosureSection title=\"Array Rules\" defaultOpen={true}>\r\n <ArraySchemaEditor schema={schema} onChange={onChange} />\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n {hasType(\"object\") ? (\r\n <BuilderDisclosureSection title=\"Object Rules\" defaultOpen={true}>\r\n <ObjectSchemaAdvancedEditor schema={schema} onChange={onChange} />\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n <BuilderDisclosureSection title=\"Composition & Conditionals\" defaultOpen={true}>\r\n <div className=\"raf-builder-section-group\">\r\n <CombinationEditor kind=\"allOf\" schema={schema} onChange={onChange} />\r\n <CombinationEditor kind=\"anyOf\" schema={schema} onChange={onChange} />\r\n <CombinationEditor kind=\"oneOf\" schema={schema} onChange={onChange} />\r\n <SingleSchemaEditor kind=\"not\" schema={schema} onChange={onChange} />\r\n <ConditionalSchemaEditor kind=\"if\" schema={schema} onChange={onChange} />\r\n <ConditionalSchemaEditor kind=\"then\" schema={schema} onChange={onChange} />\r\n <ConditionalSchemaEditor kind=\"else\" schema={schema} onChange={onChange} />\r\n </div>\r\n </BuilderDisclosureSection>\r\n </BuilderDisclosureSection>\r\n\r\n {!isRoot && onRemove ? (\r\n <div className=\"raf-button-row\">\r\n <button className=\"raf-button raf-button-danger\" type=\"button\" onClick={onRemove}>\r\n Remove Field\r\n </button>\r\n </div>\r\n ) : null}\r\n </div>\r\n </details>\r\n );\r\n}\r\n\r\nfunction BuilderDisclosureSection({\r\n title,\r\n children,\r\n defaultOpen = false\r\n}: {\r\n title: string;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n}) {\r\n return (\r\n <details className=\"raf-builder-disclosure\" open={defaultOpen}>\r\n <summary className=\"raf-builder-disclosure-summary\">{title}</summary>\r\n <div className=\"raf-builder-disclosure-content\">{children}</div>\r\n </details>\r\n );\r\n}\r\n\r\nfunction ObjectSchemaEditor({\r\n schema,\r\n onChange,\r\n showAdvancedOptions = true\r\n}: {\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n showAdvancedOptions?: boolean;\r\n}) {\r\n const properties = schema.properties ?? {};\r\n const requiredSet = new Set(schema.required ?? []);\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <div className=\"raf-builder-heading-wrap\">\r\n <h4 className=\"raf-builder-heading\">Properties</h4>\r\n <FieldLabel label=\"properties\" keyword=\"properties\" />\r\n </div>\r\n\r\n {Object.entries(properties).map(([propertyName, propertySchema], index) => (\r\n <div className=\"raf-builder-property\" key={index}>\r\n <SchemaNodeEditor\r\n label={`Property: ${propertyName}`}\r\n schema={propertySchema}\r\n showPrimaryTitle={false}\r\n primaryLeadField={\r\n <TextInput\r\n label=\"Property Name\"\r\n keyword=\"properties\"\r\n value={propertyName}\r\n onChange={(nextName) => {\r\n const normalized = nextName.trim();\r\n if (normalized === propertyName) {\r\n return;\r\n }\r\n\r\n if (normalized === \"\") {\r\n const next = cloneSchema(schema);\r\n const objectProperties = { ...(next.properties ?? {}) };\r\n objectProperties[\"\"] = objectProperties[propertyName];\r\n if (propertyName !== \"\") {\r\n delete objectProperties[propertyName];\r\n }\r\n next.properties = objectProperties;\r\n next.required = (next.required ?? []).filter((entry) => entry !== propertyName);\r\n onChange(next);\r\n return;\r\n }\r\n\r\n const next = cloneSchema(schema);\r\n const objectProperties = { ...(next.properties ?? {}) };\r\n\r\n if (objectProperties[normalized]) {\r\n return;\r\n }\r\n\r\n objectProperties[normalized] = objectProperties[propertyName];\r\n delete objectProperties[propertyName];\r\n next.properties = objectProperties;\r\n\r\n const required = new Set(next.required ?? []);\r\n if (required.delete(propertyName)) {\r\n required.add(normalized);\r\n next.required = Array.from(required);\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n }\r\n primaryFollowField={\r\n <KeywordCheckbox\r\n label=\"Required\"\r\n keyword=\"required\"\r\n checked={requiredSet.has(propertyName)}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n const required = new Set(next.required ?? []);\r\n\r\n if (checked) {\r\n required.add(propertyName);\r\n } else {\r\n required.delete(propertyName);\r\n }\r\n\r\n next.required = Array.from(required);\r\n onChange(next);\r\n }}\r\n />\r\n }\r\n onChange={(nextPropertySchema) => {\r\n const next = cloneSchema(schema);\r\n next.properties = { ...(next.properties ?? {}), [propertyName]: nextPropertySchema };\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n const objectProperties = { ...(next.properties ?? {}) };\r\n delete objectProperties[propertyName];\r\n next.properties = objectProperties;\r\n next.required = (next.required ?? []).filter((entry) => entry !== propertyName);\r\n onChange(next);\r\n }}\r\n />\r\n </div>\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-primary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.properties = { ...(next.properties ?? {}) };\r\n const newKey = createUniquePropertyName(next.properties, \"field\");\r\n next.properties[newKey] = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add Property\r\n </button>\r\n </div>\r\n\r\n {showAdvancedOptions ? <ObjectSchemaAdvancedEditor schema={schema} onChange={onChange} /> : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectSchemaAdvancedEditor({ schema, onChange }: { schema: JSONSchema; onChange: (next: JSONSchema) => void }) {\r\n const dependentRequired = schema.dependentRequired ?? {};\r\n const dependentSchemas = schema.dependentSchemas ?? {};\r\n const patternProperties = schema.patternProperties ?? {};\r\n const additionalPropertiesSchema = isObject(schema.additionalProperties)\r\n ? (schema.additionalProperties as JSONSchema)\r\n : undefined;\r\n const additionalPropertiesMode = additionalPropertiesSchema\r\n ? \"subschema\"\r\n : schema.additionalProperties === false\r\n ? \"false\"\r\n : \"true\";\r\n const propertyNamesSchema = isObject(schema.propertyNames) ? (schema.propertyNames as JSONSchema) : undefined;\r\n const unevaluatedPropertiesSchema = isObject(schema.unevaluatedProperties)\r\n ? (schema.unevaluatedProperties as JSONSchema)\r\n : undefined;\r\n\r\n return (\r\n <>\r\n\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minProperties\"\r\n keyword=\"minProperties\"\r\n value={numberOrEmpty(schema.minProperties)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minProperties\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"maxProperties\"\r\n keyword=\"maxProperties\"\r\n value={numberOrEmpty(schema.maxProperties)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxProperties\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 10\"\r\n />\r\n </div>\r\n\r\n <SelectInput\r\n label=\"additionalProperties\"\r\n keyword=\"additionalProperties\"\r\n value={additionalPropertiesMode}\r\n onChange={(value) => {\r\n const next = cloneSchema(schema);\r\n\r\n if (value === \"subschema\") {\r\n next.additionalProperties = isObject(next.additionalProperties)\r\n ? (next.additionalProperties as JSONSchema)\r\n : { type: \"string\" };\r\n } else if (value === \"false\") {\r\n next.additionalProperties = false;\r\n } else {\r\n next.additionalProperties = true;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n options={[\r\n { value: \"true\", label: \"True\" },\r\n { value: \"false\", label: \"False\" },\r\n { value: \"subschema\", label: \"Sub-schema\" }\r\n ]}\r\n />\r\n\r\n {additionalPropertiesSchema ? (\r\n <SchemaNodeEditor\r\n label=\"additionalProperties\"\r\n schema={additionalPropertiesSchema}\r\n onChange={(nextAdditionalPropertiesSchema) => {\r\n const next = cloneSchema(schema);\r\n next.additionalProperties = nextAdditionalPropertiesSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n next.additionalProperties = true;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label=\"unevaluatedProperties\" keyword=\"unevaluatedProperties\" labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!unevaluatedPropertiesSchema ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedProperties = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add unevaluatedProperties\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedProperties;\r\n onChange(next);\r\n }}\r\n >\r\n Clear unevaluatedProperties\r\n </button>\r\n )}\r\n </div>\r\n\r\n {unevaluatedPropertiesSchema ? (\r\n <SchemaNodeEditor\r\n label=\"unevaluatedProperties\"\r\n schema={unevaluatedPropertiesSchema}\r\n onChange={(nextUnevaluatedPropertiesSchema) => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedProperties = nextUnevaluatedPropertiesSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedProperties;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label=\"propertyNames\" keyword=\"propertyNames\" labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!propertyNamesSchema ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.propertyNames = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add propertyNames\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.propertyNames;\r\n onChange(next);\r\n }}\r\n >\r\n Clear propertyNames\r\n </button>\r\n )}\r\n </div>\r\n\r\n {propertyNamesSchema ? (\r\n <SchemaNodeEditor\r\n label=\"propertyNames\"\r\n schema={propertyNamesSchema}\r\n onChange={(nextPropertyNamesSchema) => {\r\n const next = cloneSchema(schema);\r\n next.propertyNames = nextPropertyNamesSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next.propertyNames;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label=\"dependentRequired\" keyword=\"dependentRequired\" labelType=\"heading\" />\r\n {Object.entries(dependentRequired).map(([propertyName, dependencies], index) => {\r\n const serializedDependencies = Array.isArray(dependencies) ? dependencies.join(\", \") : \"\";\r\n\r\n return (\r\n <div className=\"raf-builder-property\" key={`dependent-required-${index}`}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"Dependent Property\"\r\n keyword=\"dependentRequired\"\r\n value={propertyName}\r\n onChange={(nextName) => {\r\n const normalized = nextName.trim();\r\n if (normalized === propertyName) {\r\n return;\r\n }\r\n\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n const existingValue = nextEntries[propertyName] ?? [];\r\n\r\n if (normalized === \"\") {\r\n delete nextEntries[propertyName];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n return;\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(nextEntries, normalized)) {\r\n return;\r\n }\r\n\r\n nextEntries[normalized] = Array.isArray(existingValue) ? existingValue : [];\r\n delete nextEntries[propertyName];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n />\r\n <TextInput\r\n label=\"Required Properties (comma-separated)\"\r\n keyword=\"dependentRequired\"\r\n value={serializedDependencies}\r\n onChange={(nextValue) => {\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n nextEntries[propertyName] = parseCommaSeparatedStrings(nextValue);\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n />\r\n </div>\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n delete nextEntries[propertyName];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n >\r\n Remove dependentRequired Entry\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n const newKey = createUniqueEntryName(nextEntries, \"field\");\r\n nextEntries[newKey] = [];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n >\r\n Add dependentRequired Entry\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <SchemaMapEditor\r\n title=\"dependentSchemas\"\r\n addButtonLabel=\"Add dependentSchemas Entry\"\r\n removeButtonLabel=\"Remove dependentSchemas Entry\"\r\n schemaMap={dependentSchemas}\r\n defaultSchemaFactory={() => ({ type: \"object\", properties: {} })}\r\n onChange={(nextMap) => {\r\n const next = cloneSchema(schema);\r\n next.dependentSchemas = nextMap;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <SchemaMapEditor\r\n title=\"patternProperties\"\r\n addButtonLabel=\"Add patternProperties Entry\"\r\n removeButtonLabel=\"Remove patternProperties Entry\"\r\n schemaMap={patternProperties}\r\n defaultSchemaFactory={() => ({ type: \"string\" })}\r\n onChange={(nextMap) => {\r\n const next = cloneSchema(schema);\r\n next.patternProperties = nextMap;\r\n onChange(next);\r\n }}\r\n />\r\n </>\r\n );\r\n}\r\n\r\nfunction ArraySchemaEditor({ schema, onChange }: { schema: JSONSchema; onChange: (next: JSONSchema) => void }) {\r\n const tupleItems = Array.isArray(schema.prefixItems)\r\n ? schema.prefixItems\r\n : Array.isArray(schema.items)\r\n ? schema.items\r\n : undefined;\r\n const items = !Array.isArray(schema.items) && isObject(schema.items) ? schema.items : undefined;\r\n const hasContains = isObject(schema.contains);\r\n const unevaluatedItemsSchema = isObject(schema.unevaluatedItems)\r\n ? (schema.unevaluatedItems as JSONSchema)\r\n : undefined;\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n {tupleItems ? (\r\n <>\r\n <h4 className=\"raf-builder-heading\">Array Items (Tuple)</h4>\r\n <FieldLabel label=\"prefixItems\" keyword=\"prefixItems\" />\r\n {tupleItems.map((itemSchema, index) => (\r\n <SchemaNodeEditor\r\n key={`tuple-item-${index}`}\r\n label={`Tuple Item ${index + 1}`}\r\n schema={itemSchema}\r\n onChange={(nextItemSchema) => {\r\n const next = cloneSchema(schema);\r\n const nextItems = Array.isArray(next.prefixItems)\r\n ? [...next.prefixItems]\r\n : Array.isArray(next.items)\r\n ? [...next.items]\r\n : [];\r\n nextItems[index] = nextItemSchema;\r\n next.prefixItems = nextItems;\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n const nextItems = Array.isArray(next.prefixItems)\r\n ? [...next.prefixItems]\r\n : Array.isArray(next.items)\r\n ? [...next.items]\r\n : [];\r\n nextItems.splice(index, 1);\r\n next.prefixItems = nextItems;\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n />\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-primary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const nextItems = Array.isArray(next.prefixItems)\r\n ? [...next.prefixItems]\r\n : Array.isArray(next.items)\r\n ? [...next.items]\r\n : [];\r\n nextItems.push({ type: \"string\" });\r\n next.prefixItems = nextItems;\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n >\r\n Add Tuple Item Schema\r\n </button>\r\n </div>\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.items = { type: \"string\" };\r\n delete next.prefixItems;\r\n onChange(next);\r\n }}\r\n >\r\n Switch To Single Items Schema\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <h4 className=\"raf-builder-heading\">Array Items</h4>\r\n <FieldLabel label=\"items\" keyword=\"items\" />\r\n\r\n <SchemaNodeEditor\r\n label=\"Items Schema\"\r\n schema={isObject(items) ? (items as JSONSchema) : { type: \"string\" }}\r\n onChange={(nextItemsSchema) => {\r\n const next = cloneSchema(schema);\r\n next.items = nextItemsSchema;\r\n delete next.prefixItems;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.prefixItems = [{ type: \"string\" }];\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n >\r\n Switch To Tuple Items\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n <h4 className=\"raf-builder-heading\">Array Constraints</h4>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minItems\"\r\n keyword=\"minItems\"\r\n value={numberOrEmpty(schema.minItems)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minItems\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"maxItems\"\r\n keyword=\"maxItems\"\r\n value={numberOrEmpty(schema.maxItems)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxItems\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 10\"\r\n />\r\n </div>\r\n\r\n <KeywordCheckbox\r\n label=\"uniqueItems\"\r\n keyword=\"uniqueItems\"\r\n checked={Boolean(schema.uniqueItems)}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.uniqueItems = true;\r\n } else {\r\n delete next.uniqueItems;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <div className=\"raf-button-row\">\r\n {!hasContains ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.contains = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add contains\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.contains;\r\n delete next.minContains;\r\n delete next.maxContains;\r\n onChange(next);\r\n }}\r\n >\r\n Remove contains\r\n </button>\r\n )}\r\n </div>\r\n\r\n {hasContains ? (\r\n <>\r\n <SchemaNodeEditor\r\n label=\"contains\"\r\n schema={schema.contains as JSONSchema}\r\n onChange={(nextContainsSchema) => {\r\n const next = cloneSchema(schema);\r\n next.contains = nextContainsSchema;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minContains\"\r\n keyword=\"minContains\"\r\n value={numberOrEmpty(schema.minContains)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minContains\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 1\"\r\n />\r\n <TextInput\r\n label=\"maxContains\"\r\n keyword=\"maxContains\"\r\n value={numberOrEmpty(schema.maxContains)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxContains\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 3\"\r\n />\r\n </div>\r\n </>\r\n ) : null}\r\n\r\n <div className=\"raf-button-row\">\r\n {!unevaluatedItemsSchema ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedItems = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add unevaluatedItems\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedItems;\r\n onChange(next);\r\n }}\r\n >\r\n Clear unevaluatedItems\r\n </button>\r\n )}\r\n </div>\r\n\r\n {unevaluatedItemsSchema ? (\r\n <SchemaNodeEditor\r\n label=\"unevaluatedItems\"\r\n schema={unevaluatedItemsSchema}\r\n onChange={(nextUnevaluatedItemsSchema) => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedItems = nextUnevaluatedItemsSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedItems;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CombinationEditor({\r\n kind,\r\n schema,\r\n onChange\r\n}: {\r\n kind: SchemaCombinationKey;\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n const entries = (Array.isArray(schema[kind]) ? schema[kind] : []) as JSONSchema[];\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={kind} keyword={kind} labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {entries.length > 0 ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n >\r\n Clear {kind}\r\n </button>\r\n ) : null}\r\n </div>\r\n\r\n {entries.map((entrySchema, index) => (\r\n <SchemaNodeEditor\r\n key={`${kind}-${index}`}\r\n label={`${kind}[${index}]`}\r\n schema={entrySchema}\r\n onChange={(nextEntrySchema) => {\r\n const next = cloneSchema(schema);\r\n const currentEntries = (Array.isArray(next[kind]) ? next[kind] : []) as JSONSchema[];\r\n currentEntries[index] = nextEntrySchema;\r\n next[kind] = currentEntries;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n const currentEntries = (Array.isArray(next[kind]) ? next[kind] : []) as JSONSchema[];\r\n currentEntries.splice(index, 1);\r\n next[kind] = currentEntries;\r\n onChange(next);\r\n }}\r\n />\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-primary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const currentEntries = (Array.isArray(next[kind]) ? next[kind] : []) as JSONSchema[];\r\n next[kind] = [...currentEntries, { type: \"string\" }];\r\n onChange(next);\r\n }}\r\n >\r\n Add {kind} Entry\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ConditionalSchemaEditor({\r\n kind,\r\n schema,\r\n onChange\r\n}: {\r\n kind: SchemaConditionalKey;\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n const entry = isObject(schema[kind]) ? (schema[kind] as JSONSchema) : undefined;\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={kind} keyword={kind} labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!entry ? (\r\n <button\r\n className=\"raf-button raf-button-primary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next[kind] = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add {kind}\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n >\r\n Clear {kind}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {entry ? (\r\n <SchemaNodeEditor\r\n label={kind}\r\n schema={entry}\r\n onChange={(nextEntrySchema) => {\r\n const next = cloneSchema(schema);\r\n next[kind] = nextEntrySchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SingleSchemaEditor({\r\n kind,\r\n schema,\r\n onChange\r\n}: {\r\n kind: \"not\";\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n const entry = isObject(schema[kind]) ? (schema[kind] as JSONSchema) : undefined;\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={kind} keyword={kind} labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!entry ? (\r\n <button\r\n className=\"raf-button raf-button-primary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next[kind] = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add {kind}\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n >\r\n Clear {kind}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {entry ? (\r\n <SchemaNodeEditor\r\n label={kind}\r\n schema={entry}\r\n onChange={(nextEntrySchema) => {\r\n const next = cloneSchema(schema);\r\n next[kind] = nextEntrySchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SchemaMapEditor({\r\n title,\r\n addButtonLabel,\r\n removeButtonLabel,\r\n schemaMap,\r\n defaultSchemaFactory,\r\n onChange\r\n}: {\r\n title: string;\r\n addButtonLabel: string;\r\n removeButtonLabel: string;\r\n schemaMap: Record<string, JSONSchema>;\r\n defaultSchemaFactory: () => JSONSchema;\r\n onChange: (nextMap: Record<string, JSONSchema>) => void;\r\n}) {\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={title} keyword={title} labelType=\"heading\" />\r\n\r\n {Object.entries(schemaMap).map(([entryName, entrySchema], index) => (\r\n <div className=\"raf-builder-property\" key={`${title}-${index}`}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label={`${title} Key`}\r\n keyword={title}\r\n value={entryName}\r\n onChange={(nextName) => {\r\n const normalized = nextName.trim();\r\n if (normalized === entryName || normalized === \"\") {\r\n return;\r\n }\r\n\r\n const nextMap = { ...schemaMap };\r\n if (Object.prototype.hasOwnProperty.call(nextMap, normalized)) {\r\n return;\r\n }\r\n\r\n nextMap[normalized] = nextMap[entryName];\r\n delete nextMap[entryName];\r\n onChange(nextMap);\r\n }}\r\n />\r\n </div>\r\n\r\n <SchemaNodeEditor\r\n label={`${title}[${entryName}]`}\r\n schema={entrySchema}\r\n onChange={(nextEntrySchema) => {\r\n const nextMap = { ...schemaMap, [entryName]: nextEntrySchema };\r\n onChange(nextMap);\r\n }}\r\n onRemove={() => {\r\n const nextMap = { ...schemaMap };\r\n delete nextMap[entryName];\r\n onChange(nextMap);\r\n }}\r\n />\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const nextMap = { ...schemaMap };\r\n delete nextMap[entryName];\r\n onChange(nextMap);\r\n }}\r\n >\r\n {removeButtonLabel}\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const nextMap = { ...schemaMap };\r\n const newKey = createUniqueEntryName(nextMap, \"field\");\r\n nextMap[newKey] = defaultSchemaFactory();\r\n onChange(nextMap);\r\n }}\r\n >\r\n {addButtonLabel}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TypeListEditor({\r\n value,\r\n onChange\r\n}: {\r\n value: JSONSchemaType[];\r\n onChange: (nextTypes: JSONSchemaType[]) => void;\r\n}) {\r\n const availableTypes = FIELD_TYPES.filter((type) => !value.includes(type));\r\n\r\n return (\r\n <div className=\"raf-field\">\r\n <FieldLabel label=\"Types\" keyword=\"type\" />\r\n\r\n {value.map((type, index) => (\r\n <div className=\"raf-button-row raf-type-list-row\" key={`type-${index}`}>\r\n <select\r\n className=\"raf-select raf-builder-control\"\r\n aria-label={`Type ${index + 1}`}\r\n value={type}\r\n onChange={(event) => {\r\n const nextType = event.target.value as JSONSchemaType;\r\n if (nextType === type || value.includes(nextType)) {\r\n return;\r\n }\r\n\r\n const nextTypes = [...value];\r\n nextTypes[index] = nextType;\r\n onChange(nextTypes);\r\n }}\r\n >\r\n {FIELD_TYPES.map((optionType) => (\r\n <option key={optionType} value={optionType}>\r\n {optionType}\r\n </option>\r\n ))}\r\n </select>\r\n\r\n {value.length > 1 ? (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const nextTypes = value.filter((_, currentIndex) => currentIndex !== index);\r\n onChange(nextTypes);\r\n }}\r\n >\r\n Remove\r\n </button>\r\n ) : null}\r\n </div>\r\n ))}\r\n\r\n <div className=\"raf-button-row raf-type-list-add-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n disabled={availableTypes.length === 0}\r\n onClick={() => {\r\n if (availableTypes.length === 0) {\r\n return;\r\n }\r\n\r\n onChange([...value, availableTypes[0]]);\r\n }}\r\n >\r\n Add Type\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFieldHelp() {\r\n return useContext(FieldHelpContext);\r\n}\r\n\r\nfunction FieldLabel({\r\n label,\r\n keyword,\r\n labelType = \"standard\"\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n labelType?: \"standard\" | \"heading\";\r\n}) {\r\n const fieldHelp = useFieldHelp();\r\n const helpKey = keyword ?? label;\r\n const help = resolveHelpDefinition(helpKey);\r\n\r\n return (\r\n <>\r\n <div className=\"raf-field-label-row\">\r\n {labelType === \"heading\" ? <h4 className=\"raf-builder-heading\">{label}</h4> : <span className=\"raf-field-label\">{label}</span>}\r\n <button\r\n className=\"raf-info-button\"\r\n type=\"button\"\r\n aria-label={`Info about ${label}`}\r\n onClick={(event) => {\r\n const rect = event.currentTarget.getBoundingClientRect();\r\n fieldHelp?.openHelp(helpKey, label, {\r\n top: rect.top,\r\n left: rect.left,\r\n bottom: rect.bottom,\r\n right: rect.right\r\n });\r\n }}\r\n >\r\n <span className=\"raf-info-icon\" aria-hidden=\"true\">\r\n i\r\n </span>\r\n <span className=\"raf-sr-only\">Info</span>\r\n </button>\r\n </div>\r\n <div className=\"raf-field-summary\">{help.summary}</div>\r\n </>\r\n );\r\n}\r\n\r\nfunction KeywordCheckbox({\r\n label,\r\n keyword,\r\n checked,\r\n onChange\r\n}: {\r\n label: string;\r\n keyword: string;\r\n checked: boolean;\r\n onChange: (checked: boolean) => void;\r\n}) {\r\n return (\r\n <div className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <label className=\"raf-checkbox-row\">\r\n <input\r\n className=\"raf-checkbox\"\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => onChange(event.target.checked)}\r\n />\r\n <span>{label}</span>\r\n </label>\r\n </div>\r\n );\r\n}\r\n\r\nfunction FieldInfoModal({\r\n activeHelp,\r\n onClose\r\n}: {\r\n activeHelp: ActiveFieldHelp | null;\r\n onClose: () => void;\r\n}) {\r\n const modalRef = useRef<HTMLDivElement | null>(null);\r\n const [desktopPosition, setDesktopPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [isMobile, setIsMobile] = useState(false);\r\n\r\n useLayoutEffect(() => {\r\n if (!activeHelp) {\r\n return;\r\n }\r\n\r\n const updatePosition = () => {\r\n const mobile = window.innerWidth <= 760;\r\n setIsMobile(mobile);\r\n\r\n if (mobile) {\r\n setDesktopPosition(null);\r\n return;\r\n }\r\n\r\n const modalMaxWidth = Math.min(480, window.innerWidth - 24);\r\n const modalMaxHeight = Math.floor(window.innerHeight * 0.38);\r\n const desiredLeft = activeHelp.anchor.left;\r\n const desiredTop = activeHelp.anchor.bottom + 8;\r\n const left = Math.max(12, Math.min(desiredLeft, window.innerWidth - modalMaxWidth - 12));\r\n const top = Math.max(12, Math.min(desiredTop, window.innerHeight - modalMaxHeight - 12));\r\n\r\n setDesktopPosition({ top, left });\r\n };\r\n\r\n updatePosition();\r\n window.addEventListener(\"resize\", updatePosition);\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", updatePosition);\r\n };\r\n }, [activeHelp]);\r\n\r\n useEffect(() => {\r\n if (!activeHelp) {\r\n return;\r\n }\r\n\r\n const closeIfOutside = (event: Event) => {\r\n const target = event.target;\r\n if (!target || !(target instanceof Node)) {\r\n return;\r\n }\r\n\r\n if (modalRef.current?.contains(target)) {\r\n return;\r\n }\r\n\r\n onClose();\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", closeIfOutside, true);\r\n document.addEventListener(\"touchstart\", closeIfOutside, true);\r\n document.addEventListener(\"wheel\", closeIfOutside, true);\r\n document.addEventListener(\"scroll\", closeIfOutside, true);\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", closeIfOutside, true);\r\n document.removeEventListener(\"touchstart\", closeIfOutside, true);\r\n document.removeEventListener(\"wheel\", closeIfOutside, true);\r\n document.removeEventListener(\"scroll\", closeIfOutside, true);\r\n document.removeEventListener(\"keydown\", handleKeyDown);\r\n };\r\n }, [activeHelp, onClose]);\r\n\r\n if (!activeHelp) {\r\n return null;\r\n }\r\n\r\n const help = resolveHelpDefinition(activeHelp.key);\r\n\r\n return (\r\n <div className=\"raf-info-layer\" role=\"presentation\" onMouseDown={onClose}>\r\n <div\r\n ref={modalRef}\r\n className={`raf-info-modal${isMobile ? \" raf-info-modal-mobile\" : \"\"}`}\r\n style={!isMobile && desktopPosition ? { top: `${desktopPosition.top}px`, left: `${desktopPosition.left}px` } : undefined}\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n aria-label={`${activeHelp.label} information`}\r\n onMouseDown={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"raf-info-modal-header\">\r\n <strong>{activeHelp.label}</strong>\r\n <button className=\"raf-button raf-button-secondary\" type=\"button\" onClick={onClose}>\r\n Close\r\n </button>\r\n </div>\r\n <div className=\"raf-info-modal-body\">\r\n <a className=\"raf-info-link\" href={help.link} target=\"_blank\" rel=\"noreferrer\">\r\n View {activeHelp.label} in JSON Schema 2020-12\r\n </a>\r\n <p>{parse(help.details)}</p>\r\n <p>{parse(help.longDetails)}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TextInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange,\r\n placeholder,\r\n helperText,\r\n type = \"text\",\r\n step\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n helperText?: string;\r\n type?: string;\r\n step?: string;\r\n}) {\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <input\r\n className=\"raf-input raf-builder-control\"\r\n type={type}\r\n aria-label={label}\r\n value={value}\r\n placeholder={placeholder}\r\n step={step}\r\n onChange={(event) => onChange(event.target.value)}\r\n />\r\n {helperText ? <div className=\"raf-muted\">{helperText}</div> : null}\r\n </label>\r\n );\r\n}\r\n\r\nfunction SelectInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange,\r\n options\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n options: Array<{ value: string; label: string }>;\r\n}) {\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <select className=\"raf-select raf-builder-control\" aria-label={label} value={value} onChange={(event) => onChange(event.target.value)}>\r\n {options.map((option) => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n );\r\n}\r\n\r\nfunction TypeaheadInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange,\r\n options,\r\n placeholder\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n options: readonly string[];\r\n placeholder?: string;\r\n}) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const containerRef = useRef<HTMLLabelElement | null>(null);\r\n const normalizedValue = value.trim().toLowerCase();\r\n const filteredOptions = options.filter((option) =>\r\n normalizedValue === \"\" ? true : option.toLowerCase().startsWith(normalizedValue)\r\n );\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n return;\r\n }\r\n\r\n const handlePointerDown = (event: MouseEvent) => {\r\n if (!containerRef.current?.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handlePointerDown);\r\n return () => document.removeEventListener(\"mousedown\", handlePointerDown);\r\n }, [isOpen]);\r\n\r\n return (\r\n <label className=\"raf-field raf-typeahead\" ref={containerRef}>\r\n <FieldLabel label={label} keyword={keyword} />\r\n <input\r\n className=\"raf-input raf-builder-control\"\r\n type=\"text\"\r\n aria-label={label}\r\n value={value}\r\n placeholder={placeholder}\r\n onFocus={() => setIsOpen(true)}\r\n onClick={() => setIsOpen(true)}\r\n onChange={(event) => {\r\n setIsOpen(true);\r\n onChange(event.target.value);\r\n }}\r\n />\r\n {isOpen && filteredOptions.length > 0 ? (\r\n <div className=\"raf-typeahead-menu\" role=\"listbox\" aria-label={`${label} options`}>\r\n {filteredOptions.map((option) => (\r\n <button\r\n key={option}\r\n className=\"raf-typeahead-option\"\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={value === option}\r\n onMouseDown={(event) => {\r\n event.preventDefault();\r\n onChange(option);\r\n setIsOpen(false);\r\n }}\r\n >\r\n {option}\r\n </button>\r\n ))}\r\n </div>\r\n ) : null}\r\n </label>\r\n );\r\n}\r\n\r\nfunction TextAreaInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n}) {\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <textarea\r\n className=\"raf-textarea raf-builder-control\"\r\n aria-label={label}\r\n value={value}\r\n onChange={(event) => onChange(event.target.value)}\r\n />\r\n </label>\r\n );\r\n}\r\n\r\nfunction JsonTextInput({\r\n label,\r\n keyword,\r\n value,\r\n onValidJson,\r\n onClear,\r\n onInvalidJsonText,\r\n stringValueDisplay = \"json\",\r\n placeholder\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: unknown;\r\n onValidJson: (parsed: unknown) => void;\r\n onClear: () => void;\r\n onInvalidJsonText?: (rawText: string) => void;\r\n stringValueDisplay?: \"json\" | \"raw\";\r\n placeholder?: string;\r\n}) {\r\n const serializedValue =\r\n value === undefined\r\n ? \"\"\r\n : stringValueDisplay === \"raw\" && typeof value === \"string\"\r\n ? value\r\n : toInlineJson(value);\r\n const [draftValue, setDraftValue] = useState(serializedValue);\r\n\r\n useEffect(() => {\r\n setDraftValue(serializedValue);\r\n }, [serializedValue]);\r\n\r\n return (\r\n <TextInput\r\n label={label}\r\n keyword={keyword}\r\n value={draftValue}\r\n onChange={(nextText) => {\r\n setDraftValue(nextText);\r\n\r\n if (nextText.trim() === \"\") {\r\n onClear();\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(nextText);\r\n onValidJson(parsed);\r\n } catch {\r\n onInvalidJsonText?.(nextText);\r\n }\r\n }}\r\n placeholder={placeholder}\r\n />\r\n );\r\n}\r\n\r\nfunction ConstEditor({\r\n schema,\r\n schemaTypes,\r\n primaryType,\r\n onChange\r\n}: {\r\n schema: JSONSchema;\r\n schemaTypes: JSONSchemaType[];\r\n primaryType?: JSONSchemaType;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n if (primaryType === \"null\" && schemaTypes.length === 1) {\r\n return null;\r\n }\r\n\r\n const enumValues = Array.isArray(schema.enum) ? schema.enum : undefined;\r\n\r\n if (enumValues && enumValues.length > 0) {\r\n const selectedIndex = enumValues.findIndex((entry) => deepEqual(entry, schema.const));\r\n\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label=\"Const\" keyword=\"const\" />\r\n <select\r\n className=\"raf-select raf-builder-control\"\r\n aria-label=\"Const\"\r\n value={selectedIndex >= 0 ? String(selectedIndex) : \"\"}\r\n onChange={(event) => {\r\n const indexValue = event.target.value;\r\n const next = cloneSchema(schema);\r\n\r\n if (indexValue === \"\") {\r\n delete next.const;\r\n onChange(next);\r\n return;\r\n }\r\n\r\n const index = Number(indexValue);\r\n if (!Number.isInteger(index) || index < 0 || index >= enumValues.length) {\r\n return;\r\n }\r\n\r\n next.const = cloneSchema(enumValues[index]);\r\n onChange(next);\r\n }}\r\n >\r\n <option value=\"\">None</option>\r\n {enumValues.map((option, index) => (\r\n <option key={`${index}-${String(option)}`} value={String(index)}>\r\n {String(option)}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n );\r\n }\r\n\r\n if (primaryType === \"boolean\") {\r\n return (\r\n <KeywordCheckbox\r\n label=\"Const\"\r\n keyword=\"const\"\r\n checked={schema.const === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n next.const = checked;\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (primaryType === \"number\" || primaryType === \"integer\") {\r\n return (\r\n <TextInput\r\n label=\"Const\"\r\n keyword=\"const\"\r\n type=\"number\"\r\n step={primaryType === \"integer\" ? \"1\" : \"any\"}\r\n value={typeof schema.const === \"number\" ? String(schema.const) : \"\"}\r\n placeholder={primaryType === \"integer\" ? \"e.g. 3\" : \"e.g. 3.14\"}\r\n onChange={(value) => {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next.const;\r\n onChange(next);\r\n return;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed)) {\r\n return;\r\n }\r\n\r\n if (primaryType === \"integer\" && !Number.isInteger(parsed)) {\r\n return;\r\n }\r\n\r\n next.const = parsed;\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (primaryType === \"string\") {\r\n return (\r\n <TextInput\r\n label=\"Const\"\r\n keyword=\"const\"\r\n type=\"text\"\r\n value={typeof schema.const === \"string\" ? schema.const : \"\"}\r\n placeholder=\"e.g. fixed-value\"\r\n onChange={(value) => {\r\n const next = cloneSchema(schema);\r\n if (value === \"\") {\r\n delete next.const;\r\n } else {\r\n next.const = value;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (!primaryType) {\r\n return (\r\n <JsonTextInput\r\n label=\"Const\"\r\n keyword=\"const\"\r\n value={schema.const}\r\n stringValueDisplay=\"raw\"\r\n placeholder=\"e.g. A, 2, true, null\"\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n if (!matchesAnySchemaType(parsed, schemaTypes)) {\r\n return;\r\n }\r\n\r\n onChange({ ...schema, const: parsed });\r\n }}\r\n onInvalidJsonText={(rawText) => {\r\n const parsed = parseLooseScalarByTypes(rawText, schemaTypes);\r\n if (parsed === undefined) {\r\n return;\r\n }\r\n\r\n onChange({ ...schema, const: parsed });\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <JsonTextInput\r\n label=\"Const (JSON)\"\r\n keyword=\"const\"\r\n value={schema.const}\r\n placeholder='e.g. \"fixed-value\", 3, true, null, {\"k\":\"v\"}'\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n onChange({ ...schema, const: parsed });\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction EnumEditor({\r\n schema,\r\n schemaTypes,\r\n primaryType,\r\n onChange\r\n}: {\r\n schema: JSONSchema;\r\n schemaTypes: JSONSchemaType[];\r\n primaryType?: JSONSchemaType;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n if (primaryType === \"boolean\" || primaryType === \"null\") {\r\n return null;\r\n }\r\n\r\n if (primaryType === \"string\") {\r\n return (\r\n <StringEnumInput\r\n value={Array.isArray(schema.enum) ? schema.enum : undefined}\r\n onChange={(nextEnum) => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n\r\n if (!nextEnum || nextEnum.length === 0) {\r\n delete next.enum;\r\n } else {\r\n next.enum = nextEnum;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (primaryType === \"number\" || primaryType === \"integer\") {\r\n return (\r\n <NumberEnumInput\r\n value={Array.isArray(schema.enum) ? schema.enum : undefined}\r\n integerOnly={primaryType === \"integer\"}\r\n onChange={(nextEnum) => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n\r\n if (!nextEnum || nextEnum.length === 0) {\r\n delete next.enum;\r\n } else {\r\n next.enum = nextEnum;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (!primaryType && schemaTypes.length > 1) {\r\n return (\r\n <StringEnumInput\r\n value={Array.isArray(schema.enum) ? schema.enum : undefined}\r\n parseEntry={(entry) => parseLooseScalarByTypes(entry, schemaTypes)}\r\n onChange={(nextEnum) => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n\r\n if (!nextEnum || nextEnum.length === 0) {\r\n delete next.enum;\r\n } else {\r\n next.enum = nextEnum;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction NumberEnumInput({\r\n value,\r\n integerOnly,\r\n onChange\r\n}: {\r\n value?: unknown[];\r\n integerOnly: boolean;\r\n onChange: (nextEnum: number[] | undefined) => void;\r\n}) {\r\n const serializedValue = Array.isArray(value) ? JSON.stringify(value) : \"\";\r\n const [draftValue, setDraftValue] = useState(serializedValue);\r\n const lastSubmittedSignatureRef = useRef<string | null>(null);\r\n\r\n useEffect(() => {\r\n const nextSignature = Array.isArray(value) ? JSON.stringify(value) : \"\";\r\n if (lastSubmittedSignatureRef.current === nextSignature) {\r\n return;\r\n }\r\n\r\n setDraftValue(serializedValue);\r\n }, [serializedValue, value]);\r\n\r\n return (\r\n <TextInput\r\n label=\"Enum\"\r\n keyword=\"enum\"\r\n value={draftValue}\r\n placeholder={integerOnly ? \"e.g. [1, 2, 3]\" : \"e.g. [1, 2.5, 3]\"}\r\n onChange={(nextText) => {\r\n if (!/^[\\[\\]\\d,\\.\\-+\\seE]*$/.test(nextText)) {\r\n return;\r\n }\r\n\r\n setDraftValue(nextText);\r\n\r\n if (nextText.trim() === \"\") {\r\n lastSubmittedSignatureRef.current = \"\";\r\n onChange(undefined);\r\n return;\r\n }\r\n\r\n const parsed = parseNumberEnum(nextText, integerOnly);\r\n if (!parsed) {\r\n return;\r\n }\r\n\r\n lastSubmittedSignatureRef.current = JSON.stringify(parsed);\r\n onChange(parsed);\r\n }}\r\n />\r\n );\r\n}\r\n\r\n\r\nfunction parseNumberEnum(input: string, integerOnly: boolean): number[] | null {\r\n const trimmed = input.trim();\r\n if (!trimmed) {\r\n return [];\r\n }\r\n\r\n const hasWrappedBrackets = trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\");\r\n const core = hasWrappedBrackets ? trimmed.slice(1, -1) : trimmed;\r\n\r\n if (core.trim() === \"\") {\r\n return [];\r\n }\r\n\r\n const segments = core.split(\",\").map((entry) => entry.trim());\r\n if (segments.some((entry) => entry === \"\")) {\r\n return null;\r\n }\r\n\r\n const parsedValues: number[] = [];\r\n for (const segment of segments) {\r\n const parsed = Number(segment);\r\n if (!Number.isFinite(parsed)) {\r\n return null;\r\n }\r\n\r\n if (integerOnly && !Number.isInteger(parsed)) {\r\n return null;\r\n }\r\n\r\n parsedValues.push(parsed);\r\n }\r\n\r\n return parsedValues;\r\n}\r\nfunction StringEnumInput({\r\n value,\r\n parseEntry,\r\n onChange\r\n}: {\r\n value?: unknown[];\r\n parseEntry?: (entry: string) => unknown | undefined;\r\n onChange: (nextEnum: unknown[] | undefined) => void;\r\n}) {\r\n const displayValues = Array.isArray(value) ? value.map((entry) => (typeof entry === \"string\" ? entry : String(entry))) : [];\r\n const serializedValue = Array.isArray(value) ? serializeStringEnum(displayValues) : \"\";\r\n const [draftValue, setDraftValue] = useState(serializedValue);\r\n const lastSubmittedSignatureRef = useRef<string | null>(null);\r\n\r\n useEffect(() => {\r\n const nextSignature = Array.isArray(value) ? JSON.stringify(displayValues) : \"\";\r\n if (lastSubmittedSignatureRef.current === nextSignature) {\r\n return;\r\n }\r\n\r\n setDraftValue(serializedValue);\r\n }, [serializedValue, value]);\r\n\r\n return (\r\n <TextInput\r\n label=\"Enum\"\r\n keyword=\"enum\"\r\n type=\"text\"\r\n value={draftValue}\r\n placeholder={`e.g. A, B, \"C, D\", 'E, F'`}\r\n onChange={(nextText) => {\r\n setDraftValue(nextText);\r\n\r\n if (nextText.trim() === \"\") {\r\n lastSubmittedSignatureRef.current = \"\";\r\n onChange(undefined);\r\n return;\r\n }\r\n\r\n const parsed = parseStringEnum(nextText);\r\n if (!parsed.valid || !parsed.values) {\r\n return;\r\n }\r\n\r\n const normalizedValues = parsed.values.map((entry) => {\r\n if (!parseEntry) {\r\n return entry;\r\n }\r\n\r\n return parseEntry(entry);\r\n });\r\n\r\n if (normalizedValues.some((entry) => entry === undefined)) {\r\n return;\r\n }\r\n\r\n const typedValues = normalizedValues as unknown[];\r\n const submittedSignature = JSON.stringify(\r\n typedValues.map((entry) => (typeof entry === \"string\" ? entry : String(entry)))\r\n );\r\n lastSubmittedSignatureRef.current = submittedSignature;\r\n onChange(typedValues);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction parseLooseScalarByTypes(value: string, schemaTypes: JSONSchemaType[]): unknown | undefined {\r\n const trimmed = value.trim();\r\n if (trimmed === \"\") {\r\n return undefined;\r\n }\r\n\r\n if (schemaTypes.includes(\"boolean\")) {\r\n if (trimmed === \"true\") {\r\n return true;\r\n }\r\n if (trimmed === \"false\") {\r\n return false;\r\n }\r\n }\r\n\r\n if (schemaTypes.includes(\"null\") && trimmed === \"null\") {\r\n return null;\r\n }\r\n\r\n if (schemaTypes.includes(\"integer\")) {\r\n const parsedInteger = Number(trimmed);\r\n if (Number.isInteger(parsedInteger)) {\r\n return parsedInteger;\r\n }\r\n }\r\n\r\n if (schemaTypes.includes(\"number\")) {\r\n const parsedNumber = Number(trimmed);\r\n if (Number.isFinite(parsedNumber)) {\r\n return parsedNumber;\r\n }\r\n }\r\n\r\n if (schemaTypes.includes(\"string\")) {\r\n return value;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction parseStringEnum(input: string): { valid: boolean; values: string[] | null } {\r\n const values: string[] = [];\r\n let token = \"\";\r\n let inDoubleQuote = false;\r\n let inSingleQuote = false;\r\n let tokenUsedQuotes = false;\r\n let tokenClosedQuote = false;\r\n\r\n const pushToken = () => {\r\n const candidate = tokenUsedQuotes ? token : token.trim();\r\n if (candidate.length > 0) {\r\n values.push(candidate);\r\n }\r\n\r\n token = \"\";\r\n tokenUsedQuotes = false;\r\n tokenClosedQuote = false;\r\n };\r\n\r\n for (let index = 0; index < input.length; index += 1) {\r\n const char = input[index];\r\n\r\n if (inDoubleQuote) {\r\n if (char === '\"') {\r\n if (token.endsWith(\"/\")) {\r\n token = `${token.slice(0, -1)}\"`;\r\n continue;\r\n }\r\n\r\n inDoubleQuote = false;\r\n tokenClosedQuote = true;\r\n continue;\r\n }\r\n\r\n token += char;\r\n continue;\r\n }\r\n\r\n if (inSingleQuote) {\r\n if (char === \"'\") {\r\n if (token.endsWith(\"/\")) {\r\n token = `${token.slice(0, -1)}'`;\r\n continue;\r\n }\r\n\r\n inSingleQuote = false;\r\n tokenClosedQuote = true;\r\n continue;\r\n }\r\n\r\n token += char;\r\n continue;\r\n }\r\n\r\n if (char === \",\") {\r\n pushToken();\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n if (token.trim().length === 0) {\r\n token = \"\";\r\n }\r\n inDoubleQuote = true;\r\n tokenUsedQuotes = true;\r\n continue;\r\n }\r\n\r\n if (char === \"'\") {\r\n if (token.trim().length === 0) {\r\n token = \"\";\r\n }\r\n inSingleQuote = true;\r\n tokenUsedQuotes = true;\r\n continue;\r\n }\r\n\r\n if (tokenClosedQuote && /\\s/.test(char)) {\r\n continue;\r\n }\r\n\r\n token += char;\r\n }\r\n\r\n if (inDoubleQuote || inSingleQuote) {\r\n return { valid: false, values: null };\r\n }\r\n\r\n pushToken();\r\n\r\n return { valid: true, values };\r\n}\r\n\r\nfunction serializeStringEnum(values: string[]): string {\r\n return values\r\n .map((value) => {\r\n const needsQuotes = value === \"\" || /[\\s,\\\"']/.test(value);\r\n if (!needsQuotes) {\r\n return value;\r\n }\r\n\r\n const escaped = value.replace(/\\\"/g, '/\"');\r\n return `\"${escaped}\"`;\r\n })\r\n .join(\", \");\r\n}\r\n\r\nfunction createDefaultRootSchema(): JSONSchema {\r\n return {\r\n $schema: DEFAULT_SCHEMA_URI,\r\n title: \"New Schema\",\r\n type: \"object\",\r\n properties: {},\r\n required: []\r\n };\r\n}\r\n\r\nfunction applyTypes(schema: JSONSchema, nextTypesInput: JSONSchemaType[]): JSONSchema {\r\n const next = cloneSchema(schema);\r\n const previousTypes = getSchemaTypes(next);\r\n const nextTypes = normalizeTypes(nextTypesInput);\r\n const removedTypes = previousTypes.filter((type) => !nextTypes.includes(type));\r\n\r\n for (const removedType of removedTypes) {\r\n removeTypeSpecificKeywords(next, removedType, nextTypes);\r\n }\r\n\r\n next.type = nextTypes.length === 1 ? nextTypes[0] : nextTypes;\r\n\r\n if (nextTypes.includes(\"object\")) {\r\n next.properties = next.properties ?? {};\r\n next.required = Array.isArray(next.required) ? next.required : [];\r\n }\r\n\r\n if (nextTypes.includes(\"array\")) {\r\n next.items = next.items ?? { type: \"string\" };\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction removeTypeSpecificKeywords(schema: JSONSchema, type: JSONSchemaType, activeTypes: JSONSchemaType[]): void {\r\n if (type === \"object\") {\r\n if (!activeTypes.includes(\"object\")) {\r\n delete schema.properties;\r\n delete schema.patternProperties;\r\n delete schema.required;\r\n delete schema.dependentRequired;\r\n delete schema.dependentSchemas;\r\n delete schema.additionalProperties;\r\n delete schema.unevaluatedProperties;\r\n delete schema.propertyNames;\r\n delete schema.minProperties;\r\n delete schema.maxProperties;\r\n }\r\n return;\r\n }\r\n\r\n if (type === \"array\") {\r\n if (!activeTypes.includes(\"array\")) {\r\n delete schema.items;\r\n delete schema.contains;\r\n delete schema.minItems;\r\n delete schema.maxItems;\r\n delete schema.uniqueItems;\r\n delete schema.minContains;\r\n delete schema.maxContains;\r\n delete schema.unevaluatedItems;\r\n }\r\n return;\r\n }\r\n\r\n if (type === \"string\") {\r\n if (!activeTypes.includes(\"string\")) {\r\n delete schema.pattern;\r\n }\r\n return;\r\n }\r\n\r\n if (type === \"number\" || type === \"integer\") {\r\n if (!(activeTypes.includes(\"number\") || activeTypes.includes(\"integer\"))) {\r\n delete schema.minimum;\r\n delete schema.maximum;\r\n delete schema.multipleOf;\r\n delete schema.exclusiveMinimum;\r\n delete schema.exclusiveMaximum;\r\n }\r\n }\r\n}\r\n\r\nfunction getSchemaTypes(schema: JSONSchema): JSONSchemaType[] {\r\n if (Array.isArray(schema.type)) {\r\n return normalizeTypes(schema.type as JSONSchemaType[]);\r\n }\r\n\r\n if (typeof schema.type === \"string\") {\r\n return normalizeTypes([schema.type as JSONSchemaType]);\r\n }\r\n\r\n return [\"object\"];\r\n}\r\n\r\nfunction normalizeTypes(types: JSONSchemaType[]): JSONSchemaType[] {\r\n const normalized: JSONSchemaType[] = [];\r\n\r\n for (const type of types) {\r\n if (!FIELD_TYPES.includes(type)) {\r\n continue;\r\n }\r\n\r\n if (!normalized.includes(type)) {\r\n normalized.push(type);\r\n }\r\n }\r\n\r\n return normalized.length > 0 ? normalized : [\"string\"];\r\n}\r\n\r\nfunction assignOptionalString<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n next[key] = value;\r\n return next;\r\n}\r\n\r\nfunction assignOptionalNumber<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (Number.isNaN(parsed)) {\r\n return next;\r\n }\r\n\r\n next[key] = parsed;\r\n return next;\r\n}\r\n\r\nfunction assignOptionalInteger<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (!Number.isInteger(parsed) || parsed < 0) {\r\n return next;\r\n }\r\n\r\n next[key] = parsed;\r\n return next;\r\n}\r\n\r\nfunction assignOptionalPositiveNumber<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed) || parsed <= 0) {\r\n return next;\r\n }\r\n\r\n next[key] = parsed;\r\n return next;\r\n}\r\n\r\nfunction parseCommaSeparatedStrings(value: string): string[] {\r\n return Array.from(\r\n new Set(\r\n value\r\n .split(\",\")\r\n .map((entry) => entry.trim())\r\n .filter((entry) => entry !== \"\")\r\n )\r\n );\r\n}\r\n\r\nfunction createUniquePropertyName(properties: Record<string, JSONSchema>, baseName: string): string {\r\n if (!properties[baseName]) {\r\n return baseName;\r\n }\r\n\r\n let index = 1;\r\n while (properties[`${baseName}${index}`]) {\r\n index += 1;\r\n }\r\n return `${baseName}${index}`;\r\n}\r\n\r\nfunction createUniqueEntryName(entries: Record<string, unknown>, baseName: string): string {\r\n if (!Object.prototype.hasOwnProperty.call(entries, baseName)) {\r\n return baseName;\r\n }\r\n\r\n let index = 1;\r\n while (Object.prototype.hasOwnProperty.call(entries, `${baseName}${index}`)) {\r\n index += 1;\r\n }\r\n return `${baseName}${index}`;\r\n}\r\n\r\nfunction cloneSchema<T>(value: T): T {\r\n if (typeof structuredClone === \"function\") {\r\n return structuredClone(value);\r\n }\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n}\r\n\r\nfunction stringOrEmpty(value: unknown): string {\r\n return typeof value === \"string\" ? value : \"\";\r\n}\r\n\r\nfunction sanitizeSchemaForOutput(schema: JSONSchema): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (next.properties) {\r\n const sanitizedProperties: Record<string, JSONSchema> = {};\r\n\r\n for (const [propertyName, propertySchema] of Object.entries(next.properties)) {\r\n if (propertyName.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n sanitizedProperties[propertyName] = sanitizeSchemaForOutput(propertySchema);\r\n }\r\n\r\n if (Object.keys(sanitizedProperties).length > 0) {\r\n next.properties = sanitizedProperties;\r\n } else {\r\n delete next.properties;\r\n }\r\n }\r\n\r\n if (next.patternProperties) {\r\n const sanitizedPatternProperties: Record<string, JSONSchema> = {};\r\n\r\n for (const [patternKey, patternSchema] of Object.entries(next.patternProperties)) {\r\n if (patternKey.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n sanitizedPatternProperties[patternKey] = sanitizeSchemaForOutput(patternSchema);\r\n }\r\n\r\n next.patternProperties = sanitizedPatternProperties;\r\n }\r\n\r\n if (next.dependentSchemas) {\r\n const sanitizedDependentSchemas: Record<string, JSONSchema> = {};\r\n\r\n for (const [propertyName, dependentSchema] of Object.entries(next.dependentSchemas)) {\r\n if (propertyName.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n sanitizedDependentSchemas[propertyName] = sanitizeSchemaForOutput(dependentSchema);\r\n }\r\n\r\n next.dependentSchemas = sanitizedDependentSchemas;\r\n }\r\n\r\n if (next.dependentRequired) {\r\n const sanitizedDependentRequired: Record<string, string[]> = {};\r\n\r\n for (const [propertyName, dependencies] of Object.entries(next.dependentRequired)) {\r\n if (propertyName.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(dependencies)) {\r\n sanitizedDependentRequired[propertyName] = [];\r\n continue;\r\n }\r\n\r\n const cleanedDependencies = Array.from(\r\n new Set(\r\n dependencies\r\n .filter((entry) => typeof entry === \"string\")\r\n .map((entry) => entry.trim())\r\n .filter((entry) => entry !== \"\")\r\n )\r\n );\r\n sanitizedDependentRequired[propertyName] = cleanedDependencies;\r\n }\r\n\r\n next.dependentRequired = sanitizedDependentRequired;\r\n }\r\n\r\n if (Array.isArray(next.required)) {\r\n next.required = next.required.filter((entry) => entry.trim() !== \"\");\r\n\r\n if (next.required.length === 0) {\r\n delete next.required;\r\n }\r\n }\r\n\r\n if (Array.isArray(next.items)) {\r\n next.prefixItems = next.items.map((itemSchema) => sanitizeSchemaForOutput(itemSchema));\r\n next.items = false;\r\n }\r\n\r\n if (Array.isArray(next.prefixItems)) {\r\n next.prefixItems = next.prefixItems.map((itemSchema) => sanitizeSchemaForOutput(itemSchema));\r\n } else if (isObject(next.items)) {\r\n next.items = sanitizeSchemaForOutput(next.items as JSONSchema);\r\n }\r\n\r\n if (isObject(next.contains)) {\r\n next.contains = sanitizeSchemaForOutput(next.contains as JSONSchema);\r\n }\r\n\r\n if (isObject(next.unevaluatedItems)) {\r\n next.unevaluatedItems = sanitizeSchemaForOutput(next.unevaluatedItems as JSONSchema);\r\n }\r\n\r\n if (isObject(next.not)) {\r\n next.not = sanitizeSchemaForOutput(next.not as JSONSchema);\r\n }\r\n\r\n if (isObject(next.additionalProperties)) {\r\n next.additionalProperties = sanitizeSchemaForOutput(next.additionalProperties as JSONSchema);\r\n }\r\n\r\n if (isObject(next.unevaluatedProperties)) {\r\n next.unevaluatedProperties = sanitizeSchemaForOutput(next.unevaluatedProperties as JSONSchema);\r\n }\r\n\r\n if (isObject(next.propertyNames)) {\r\n next.propertyNames = sanitizeSchemaForOutput(next.propertyNames as JSONSchema);\r\n }\r\n\r\n for (const key of [\"if\", \"then\", \"else\"] as const) {\r\n if (isObject(next[key])) {\r\n next[key] = sanitizeSchemaForOutput(next[key] as JSONSchema);\r\n }\r\n }\r\n\r\n for (const key of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\r\n if (Array.isArray(next[key])) {\r\n next[key] = next[key].map((entry) => sanitizeSchemaForOutput(entry));\r\n }\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction applyDomainToRootId(schema: JSONSchema, domain?: string): JSONSchema {\r\n if (!domain) {\r\n return schema;\r\n }\r\n\r\n const next = cloneSchema(schema);\r\n const localId = stringOrEmpty(next.$id);\r\n\r\n if (!localId.trim()) {\r\n return next;\r\n }\r\n\r\n next.$id = toFullId(localId, domain);\r\n return next;\r\n}\r\n\r\nfunction toLocalId(value: string, domain?: string): string {\r\n const trimmed = value.trim();\r\n if (!domain || !trimmed) {\r\n return trimmed;\r\n }\r\n\r\n const normalizedDomain = normalizeDomain(domain);\r\n if (!normalizedDomain) {\r\n return trimmed;\r\n }\r\n\r\n if (trimmed === normalizedDomain) {\r\n return \"\";\r\n }\r\n\r\n const domainWithSlash = `${normalizedDomain}/`;\r\n if (trimmed.startsWith(domainWithSlash)) {\r\n return trimmed.slice(domainWithSlash.length);\r\n }\r\n\r\n return trimmed;\r\n}\r\n\r\nfunction toFullId(localId: string, domain?: string): string {\r\n const trimmedLocal = localId.trim();\r\n if (!domain || !trimmedLocal) {\r\n return trimmedLocal;\r\n }\r\n\r\n const normalizedDomain = normalizeDomain(domain);\r\n if (!normalizedDomain) {\r\n return trimmedLocal;\r\n }\r\n\r\n if (trimmedLocal === normalizedDomain || trimmedLocal.startsWith(`${normalizedDomain}/`)) {\r\n return trimmedLocal;\r\n }\r\n\r\n return `${normalizedDomain}/${trimmedLocal.replace(/^\\/+/, \"\")}`;\r\n}\r\n\r\nfunction normalizeDomain(domain: string): string {\r\n return domain.trim().replace(/\\/+$/, \"\");\r\n}\r\n\r\nfunction validateSchemaDefinition(schema: JSONSchema): SchemaBuilderValidationError[] {\r\n const consistencyErrors = validateConstAndEnumConsistency(schema);\r\n\r\n try {\r\n const ajv = createAjvForSchema(schema);\r\n const valid = ajv.validateSchema(schema);\r\n\r\n const schemaErrors: SchemaBuilderValidationError[] = valid\r\n ? []\r\n : (ajv.errors ?? []).map((error) => ({\r\n message: error.message ?? \"Schema validation error\",\r\n keyword: error.keyword,\r\n instancePath: error.instancePath,\r\n schemaPath: error.schemaPath,\r\n source: \"schema\" as const\r\n }));\r\n\r\n return [...schemaErrors, ...consistencyErrors];\r\n } catch (error) {\r\n return [\r\n {\r\n message: error instanceof Error ? error.message : \"Schema validation failed.\",\r\n source: \"schema\"\r\n },\r\n ...consistencyErrors\r\n ];\r\n }\r\n}\r\n\r\nfunction validateConstAndEnumConsistency(schema: JSONSchema, schemaPointer = \"\"): SchemaBuilderValidationError[] {\r\n const errors: SchemaBuilderValidationError[] = [];\r\n const schemaTypes = getSchemaTypes(schema);\r\n const hasConst = Object.prototype.hasOwnProperty.call(schema, \"const\");\r\n\r\n if (hasConst && !matchesAnySchemaType(schema.const, schemaTypes)) {\r\n errors.push({\r\n message: \"const value does not match the field type.\",\r\n keyword: \"const\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/const`,\r\n source: \"schema\"\r\n });\r\n }\r\n\r\n if (schema.enum !== undefined) {\r\n if (!Array.isArray(schema.enum)) {\r\n errors.push({\r\n message: \"enum must be an array.\",\r\n keyword: \"enum\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/enum`,\r\n source: \"schema\"\r\n });\r\n } else {\r\n schema.enum.forEach((enumValue, index) => {\r\n if (!matchesAnySchemaType(enumValue, schemaTypes)) {\r\n errors.push({\r\n message: `enum value at index ${index} does not match the field type.`,\r\n keyword: \"enum\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/enum/${index}`,\r\n source: \"schema\"\r\n });\r\n }\r\n });\r\n\r\n if (hasConst && !schema.enum.some((entry) => deepEqual(entry, schema.const))) {\r\n errors.push({\r\n message: \"const value must exist in enum when both are provided.\",\r\n keyword: \"const\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/const`,\r\n source: \"schema\"\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (schema.properties) {\r\n for (const [propertyName, propertySchema] of Object.entries(schema.properties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(\r\n propertySchema,\r\n `${schemaPointer}/properties/${escapeJsonPointerToken(propertyName)}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (schema.patternProperties) {\r\n for (const [patternKey, patternSchema] of Object.entries(schema.patternProperties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(\r\n patternSchema,\r\n `${schemaPointer}/patternProperties/${escapeJsonPointerToken(patternKey)}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (schema.dependentSchemas) {\r\n for (const [propertyName, dependentSchema] of Object.entries(schema.dependentSchemas)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(\r\n dependentSchema,\r\n `${schemaPointer}/dependentSchemas/${escapeJsonPointerToken(propertyName)}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(schema.items)) {\r\n schema.items.forEach((itemSchema, index) => {\r\n errors.push(...validateConstAndEnumConsistency(itemSchema, `${schemaPointer}/items/${index}`));\r\n });\r\n } else if (isObject(schema.items)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.items as JSONSchema, `${schemaPointer}/items`));\r\n }\r\n\r\n if (isObject(schema.contains)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.contains as JSONSchema, `${schemaPointer}/contains`));\r\n }\r\n\r\n if (isObject(schema.unevaluatedItems)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.unevaluatedItems as JSONSchema, `${schemaPointer}/unevaluatedItems`));\r\n }\r\n\r\n if (isObject(schema.not)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.not as JSONSchema, `${schemaPointer}/not`));\r\n }\r\n\r\n if (isObject(schema.additionalProperties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(schema.additionalProperties as JSONSchema, `${schemaPointer}/additionalProperties`)\r\n );\r\n }\r\n\r\n if (isObject(schema.unevaluatedProperties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(schema.unevaluatedProperties as JSONSchema, `${schemaPointer}/unevaluatedProperties`)\r\n );\r\n }\r\n\r\n if (isObject(schema.propertyNames)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.propertyNames as JSONSchema, `${schemaPointer}/propertyNames`));\r\n }\r\n\r\n for (const key of [\"if\", \"then\", \"else\"] as const) {\r\n if (isObject(schema[key])) {\r\n errors.push(...validateConstAndEnumConsistency(schema[key] as JSONSchema, `${schemaPointer}/${key}`));\r\n }\r\n }\r\n\r\n for (const combinatorKey of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\r\n const entries = schema[combinatorKey];\r\n if (!Array.isArray(entries)) {\r\n continue;\r\n }\r\n\r\n entries.forEach((entry, index) => {\r\n errors.push(...validateConstAndEnumConsistency(entry, `${schemaPointer}/${combinatorKey}/${index}`));\r\n });\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nfunction matchesAnySchemaType(value: unknown, schemaTypes: JSONSchemaType[]): boolean {\r\n return schemaTypes.some((schemaType) => matchesSchemaType(value, schemaType));\r\n}\r\n\r\nfunction matchesSchemaType(value: unknown, schemaType: JSONSchemaType): boolean {\r\n if (schemaType === \"string\") {\r\n return typeof value === \"string\";\r\n }\r\n\r\n if (schemaType === \"number\") {\r\n return typeof value === \"number\" && Number.isFinite(value);\r\n }\r\n\r\n if (schemaType === \"integer\") {\r\n return typeof value === \"number\" && Number.isInteger(value);\r\n }\r\n\r\n if (schemaType === \"boolean\") {\r\n return typeof value === \"boolean\";\r\n }\r\n\r\n if (schemaType === \"null\") {\r\n return value === null;\r\n }\r\n\r\n if (schemaType === \"array\") {\r\n return Array.isArray(value);\r\n }\r\n\r\n return isObject(value);\r\n}\r\n\r\nfunction deepEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n\r\n if (typeof a !== typeof b) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n\r\n return a.every((entry, index) => deepEqual(entry, b[index]));\r\n }\r\n\r\n if (isObject(a) && isObject(b)) {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n\r\n if (keysA.length !== keysB.length) {\r\n return false;\r\n }\r\n\r\n return keysA.every((key) => deepEqual(a[key], b[key]));\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction escapeJsonPointerToken(value: string): string {\r\n return value.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\r\n}\r\n\r\nfunction numberOrEmpty(value: unknown): string {\r\n return typeof value === \"number\" && Number.isFinite(value) ? String(value) : \"\";\r\n}\r\n\r\nfunction toInlineJson(value: unknown): string {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n"],"mappings":"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","names":["import_react","deepClone","import__","Ajv2020","Ajv2019","Ajv","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","isObject","import_jsx_runtime","import_react","import_jsx_runtime","isObject","next","objectProperties","parse","escapeJsonPointerToken"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/SchemaForm.tsx","../src/utils/defaultData.ts","../src/utils/jsonPointer.ts","../src/utils/refResolver.ts","../src/utils/schemaValidation.ts","../src/components/SchemaFieldRenderer.tsx","../src/components/fields/SchemaFormArray.tsx","../src/components/fields/FieldShell.tsx","../src/components/fields/SchemaFormBoolean.tsx","../src/components/fields/SchemaFormInteger.tsx","../src/components/fields/SchemaFormNull.tsx","../src/components/fields/SchemaFormNumber.tsx","../src/components/fields/SchemaFormObject.tsx","../src/components/fields/SchemaFormSelect.tsx","../src/components/fields/SchemaFormString.tsx","../src/components/SchemaBuilder.tsx"],"sourcesContent":["import \"./styles.css\";\r\n\r\nexport { SchemaForm } from \"./components/SchemaForm\";\r\nexport { SchemaBuilder } from \"./components/SchemaBuilder\";\r\nexport { SchemaBuilderHelper } from \"./components/SchemaBuilder\";\r\n\r\nexport type { JSONSchema, JSONSchemaType, OutputData, PeerSchemasInput } from \"./types/schema\";\r\nexport type {\r\n\tSchemaFormProps,\r\n\tSchemaFormWidgets,\r\n\tSchemaFormOptions,\r\n\tSchemaFormValidationError,\r\n\tSchemaBuilderProps,\r\n\tSchemaBuilderHelperProps,\r\n\tSchemaBuilderHelperContent,\r\n\tSchemaBuilderHelperContentEntry,\r\n\tSchemaBuilderValidationError,\r\n\tFieldComponentProps\r\n} from \"./types/components\";\r\n","import { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport type { SchemaFormProps, SchemaFormValidationError } from \"../types/components\";\r\nimport type { JSONSchema, OutputData, PeerSchemasInput } from \"../types/schema\";\r\nimport { createDefaultValueFromSchema } from \"../utils/defaultData\";\r\nimport { getValueAtPointer, setValueAtPointer } from \"../utils/jsonPointer\";\r\nimport { MissingPeerSchemaError, resolveSchemaRefs } from \"../utils/refResolver\";\r\nimport { validateDataOrThrow, validatePeerSchemasOrThrow, validateSchemaOrThrow } from \"../utils/schemaValidation\";\r\nimport { SchemaFieldRenderer } from \"./SchemaFieldRenderer\";\r\n\r\nexport function SchemaForm({ schema, peerSchemas, getSchema, widgets, options, data, onChange }: SchemaFormProps) {\r\n const onChangeRef = useRef(onChange);\r\n const [resolvedSchema, setResolvedSchema] = useState<JSONSchema | null>(null);\r\n const [resolutionError, setResolutionError] = useState<Error | null>(null);\r\n const [isWaitingForPeerSchemas, setIsWaitingForPeerSchemas] = useState(false);\r\n\r\n useEffect(() => {\r\n onChangeRef.current = onChange;\r\n }, [onChange]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n const resolveSchema = async () => {\r\n try {\r\n validateSchemaOrThrow(schema, \"schema\");\r\n validatePeerSchemasOrThrow(peerSchemas);\r\n\r\n try {\r\n const resolved = await resolveSchemaRefs(schema, peerSchemas);\r\n if (!cancelled) {\r\n setResolvedSchema(resolved);\r\n setResolutionError(null);\r\n setIsWaitingForPeerSchemas(false);\r\n }\r\n return;\r\n } catch (error) {\r\n if (!(error instanceof MissingPeerSchemaError) || !getSchema) {\r\n throw error;\r\n }\r\n\r\n if (!cancelled) {\r\n setResolvedSchema(null);\r\n setResolutionError(null);\r\n setIsWaitingForPeerSchemas(true);\r\n }\r\n }\r\n\r\n const resolvedWithFallback = await resolveSchemaWithFallback(schema, peerSchemas, getSchema);\r\n if (!cancelled) {\r\n setResolvedSchema(resolvedWithFallback);\r\n setResolutionError(null);\r\n setIsWaitingForPeerSchemas(false);\r\n }\r\n } catch (error) {\r\n if (!cancelled) {\r\n setResolvedSchema(null);\r\n setResolutionError(error instanceof Error ? error : new Error(\"Schema resolution failed.\"));\r\n setIsWaitingForPeerSchemas(false);\r\n }\r\n }\r\n };\r\n\r\n void resolveSchema();\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [schema, peerSchemas, getSchema]);\r\n\r\n const initialData = useMemo(() => {\r\n if (!resolvedSchema) {\r\n return data ?? {};\r\n }\r\n\r\n if (data !== undefined) {\r\n return data;\r\n }\r\n\r\n const fallback = createDefaultValueFromSchema(resolvedSchema, {\r\n defaults: options?.defaults ?? \"all\"\r\n });\r\n return fallback ?? {};\r\n }, [data, options?.defaults, resolvedSchema]);\r\n\r\n const [formData, setFormData] = useState<OutputData>(initialData);\r\n\r\n useEffect(() => {\r\n if (!resolvedSchema) {\r\n return;\r\n }\r\n\r\n setFormData(initialData);\r\n const validationErrors = getDataValidationErrors(initialData, resolvedSchema);\r\n onChangeRef.current?.(initialData, validationErrors, \"\", undefined, initialData);\r\n }, [initialData, resolvedSchema]);\r\n\r\n const handleFieldChange = (pointer: string, next: unknown) => {\r\n if (!resolvedSchema) {\r\n return;\r\n }\r\n\r\n const previousValue = getValueAtPointer(formData, pointer);\r\n const updated = setValueAtPointer(formData, pointer, next) as OutputData;\r\n const validationErrors = getDataValidationErrors(updated, resolvedSchema);\r\n\r\n setFormData(updated);\r\n onChangeRef.current?.(updated, validationErrors, pointer, previousValue, next);\r\n };\r\n\r\n if (resolutionError) {\r\n throw resolutionError;\r\n }\r\n\r\n if (isWaitingForPeerSchemas) {\r\n return (\r\n <div className=\"raf-loading-state\" role=\"status\" aria-live=\"polite\">\r\n <span className=\"raf-loading-spinner\" aria-hidden=\"true\" />\r\n <span>Waiting for required peer schema(s)</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (!resolvedSchema) {\r\n return <div className=\"raf-muted\">Resolving schema references...</div>;\r\n }\r\n\r\n return (\r\n <div className=\"raf-schema-form\">\r\n <SchemaFieldRenderer\r\n schema={resolvedSchema}\r\n label={resolvedSchema.title ?? \"Schema Form\"}\r\n required={true}\r\n pointer=\"\"\r\n schemaPointer=\"\"\r\n value={formData}\r\n onChange={handleFieldChange}\r\n widgets={widgets}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction getDataValidationErrors(data: unknown, schema: JSONSchema): SchemaFormValidationError[] {\r\n try {\r\n validateDataOrThrow(data, schema);\r\n return [];\r\n } catch (error) {\r\n return [\r\n {\r\n message: error instanceof Error ? error.message : \"Validation error\",\r\n source: \"data\"\r\n }\r\n ];\r\n }\r\n}\r\n\r\nasync function resolveSchemaWithFallback(\r\n rootSchema: JSONSchema,\r\n initialPeerSchemas: PeerSchemasInput | undefined,\r\n getSchema: (requestedSchema: string) => Promise<JSONSchema>\r\n): Promise<JSONSchema> {\r\n const attemptedRefs = new Set<string>();\r\n let currentPeerSchemas = initialPeerSchemas;\r\n\r\n while (true) {\r\n try {\r\n return await resolveSchemaRefs(rootSchema, currentPeerSchemas);\r\n } catch (error) {\r\n if (!(error instanceof MissingPeerSchemaError)) {\r\n throw error;\r\n }\r\n\r\n const missingRef = error.ref;\r\n if (attemptedRefs.has(missingRef)) {\r\n throw new Error(`Could not resolve referenced peer schema for: ${missingRef}`);\r\n }\r\n\r\n attemptedRefs.add(missingRef);\r\n\r\n let fetchedSchema: JSONSchema;\r\n try {\r\n const maybeSchema = await getSchema(missingRef);\r\n if (!maybeSchema) {\r\n throw new Error(`getSchema resolved without a schema for: ${missingRef}`);\r\n }\r\n\r\n fetchedSchema = maybeSchema;\r\n } catch (fetchError) {\r\n const message = fetchError instanceof Error ? fetchError.message : \"Unknown schema loading error.\";\r\n throw new Error(`Failed to load referenced schema for: ${missingRef}. ${message}`);\r\n }\r\n\r\n validateSchemaOrThrow(fetchedSchema, `getSchema(${missingRef})`);\r\n currentPeerSchemas = appendPeerSchema(currentPeerSchemas, missingRef, fetchedSchema);\r\n }\r\n }\r\n}\r\n\r\nfunction appendPeerSchema(\r\n peerSchemas: PeerSchemasInput | undefined,\r\n requestedRef: string,\r\n schema: JSONSchema\r\n): Record<string, JSONSchema> {\r\n const next: Record<string, JSONSchema> = {};\r\n\r\n if (Array.isArray(peerSchemas)) {\r\n for (const item of peerSchemas) {\r\n if (typeof item.$id === \"string\" && item.$id.length > 0) {\r\n next[item.$id] = item;\r\n }\r\n }\r\n } else if (peerSchemas) {\r\n Object.assign(next, peerSchemas);\r\n }\r\n\r\n next[requestedRef] = schema;\r\n\r\n const requestedRootId = extractReferenceRootId(requestedRef);\r\n if (requestedRootId) {\r\n next[requestedRootId] = schema;\r\n }\r\n\r\n if (typeof schema.$id === \"string\" && schema.$id.length > 0) {\r\n next[schema.$id] = schema;\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction extractReferenceRootId(ref: string): string {\r\n const hashIndex = ref.indexOf(\"#\");\r\n if (hashIndex === -1) {\r\n return ref;\r\n }\r\n\r\n return ref.slice(0, hashIndex);\r\n}\r\n","import type { JSONSchema } from \"../types/schema\";\r\n\r\nexport interface DefaultGenerationOptions {\r\n defaults?: \"all\" | \"required-only\";\r\n}\r\n\r\nexport function createDefaultValueFromSchema(\r\n schema: JSONSchema,\r\n options?: DefaultGenerationOptions,\r\n isRequiredField = true\r\n): unknown {\r\n const defaultsMode = options?.defaults ?? \"all\";\r\n const shouldUseSchemaDefault = defaultsMode === \"all\" || isRequiredField;\r\n\r\n if (shouldUseSchemaDefault && schema.default !== undefined) {\r\n return schema.default;\r\n }\r\n\r\n const type = getPrimaryType(schema);\r\n\r\n switch (type) {\r\n case \"object\": {\r\n const result: Record<string, unknown> = {};\r\n const required = new Set(schema.required ?? []);\r\n const properties = schema.properties ?? {};\r\n\r\n for (const [key, childSchema] of Object.entries(properties)) {\r\n const childIsRequired = required.has(key);\r\n const shouldIncludeField =\r\n childIsRequired || (defaultsMode === \"all\" && childSchema.default !== undefined);\r\n\r\n if (shouldIncludeField) {\r\n result[key] = createDefaultValueFromSchema(childSchema, options, childIsRequired);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n case \"array\":\r\n return [];\r\n case \"boolean\":\r\n return false;\r\n case \"number\":\r\n case \"integer\":\r\n return undefined;\r\n case \"null\":\r\n return null;\r\n case \"string\":\r\n return schema.enum?.[0] ?? \"\";\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction getPrimaryType(schema: JSONSchema): string | undefined {\r\n if (Array.isArray(schema.type)) {\r\n return schema.type[0];\r\n }\r\n return schema.type;\r\n}\r\n","export function escapeJsonPointerToken(token: string): string {\r\n return token.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\r\n}\r\n\r\nexport function unescapeJsonPointerToken(token: string): string {\r\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\r\n}\r\n\r\nexport function toPointerTokens(pointer: string): string[] {\r\n const normalized = pointer.startsWith(\"#\") ? pointer.slice(1) : pointer;\r\n\r\n if (!normalized) {\r\n return [];\r\n }\r\n\r\n if (!normalized.startsWith(\"/\")) {\r\n throw new Error(`Invalid JSON pointer: ${pointer}`);\r\n }\r\n\r\n return normalized\r\n .split(\"/\")\r\n .slice(1)\r\n .map(unescapeJsonPointerToken);\r\n}\r\n\r\nexport function joinPointer(basePointer: string, token: string): string {\r\n const escaped = escapeJsonPointerToken(token);\r\n if (!basePointer) {\r\n return `/${escaped}`;\r\n }\r\n return `${basePointer}/${escaped}`;\r\n}\r\n\r\nexport function getValueAtPointer(source: unknown, pointer: string): unknown {\r\n const tokens = toPointerTokens(pointer);\r\n let current: any = source;\r\n\r\n for (const token of tokens) {\r\n if (current === undefined || current === null) {\r\n return undefined;\r\n }\r\n current = current[token];\r\n }\r\n\r\n return current;\r\n}\r\n\r\nexport function setValueAtPointer(source: unknown, pointer: string, value: unknown): unknown {\r\n const tokens = toPointerTokens(pointer);\r\n\r\n if (tokens.length === 0) {\r\n return value;\r\n }\r\n\r\n const root = deepClone(source);\r\n let current: any = root;\r\n\r\n for (let index = 0; index < tokens.length - 1; index += 1) {\r\n const token = tokens[index];\r\n const nextToken = tokens[index + 1];\r\n\r\n if (current[token] === undefined || current[token] === null) {\r\n current[token] = isArrayIndexToken(nextToken) ? [] : {};\r\n }\r\n\r\n current = current[token];\r\n }\r\n\r\n const leafToken = tokens[tokens.length - 1];\r\n current[leafToken] = value;\r\n return root;\r\n}\r\n\r\nfunction isArrayIndexToken(token: string): boolean {\r\n return /^\\d+$/.test(token);\r\n}\r\n\r\nfunction deepClone<T>(value: T): T {\r\n if (typeof structuredClone === \"function\") {\r\n return structuredClone(value);\r\n }\r\n\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n}\r\n","import { getByPointer } from \"json-pointer-relational\";\r\nimport { bundle } from \"@hyperjump/json-schema/bundle\";\r\nimport { hasSchema, registerSchema, unregisterSchema } from \"@hyperjump/json-schema/draft-2020-12\";\r\nimport type { JsonSchemaDraft202012 } from \"@hyperjump/json-schema/draft-2020-12\";\r\nimport type { JSONSchema, PeerSchemasInput } from \"../types/schema\";\r\n\r\ninterface SchemaCandidate {\r\n identifier: string;\r\n schema: JSONSchema;\r\n}\r\n\r\nexport class MissingPeerSchemaError extends Error {\r\n readonly ref: string;\r\n\r\n constructor(ref: string) {\r\n super(`Could not find referenced peer schema for: ${ref}`);\r\n this.name = \"MissingPeerSchemaError\";\r\n this.ref = ref;\r\n }\r\n}\r\n\r\nlet generatedSchemaCounter = 0;\r\nconst DEFAULT_DIALECT_URI = \"https://json-schema.org/draft/2020-12/schema\";\r\n\r\nexport async function resolveSchemaRefs(schema: JSONSchema, peerSchemas?: PeerSchemasInput): Promise<JSONSchema> {\r\n const cloned = deepClone(schema);\r\n const peerCandidates = toSchemaCandidates(peerSchemas);\r\n\r\n const missingRef = findFirstMissingExternalRef(cloned, peerCandidates);\r\n if (missingRef) {\r\n throw new MissingPeerSchemaError(missingRef);\r\n }\r\n\r\n const bundled = await bundleWithRegisteredSchemas(cloned, peerCandidates);\r\n const bundledCandidates = collectSchemaCandidates(bundled);\r\n const candidates = mergeCandidates(peerCandidates, bundledCandidates);\r\n const visiting = new Set<string>();\r\n\r\n return resolveNode(bundled, bundled, candidates, visiting) as JSONSchema;\r\n}\r\n\r\nfunction resolveNode(\r\n node: unknown,\r\n currentSchemaRoot: JSONSchema,\r\n candidates: SchemaCandidate[],\r\n visiting: Set<string>\r\n): unknown {\r\n if (Array.isArray(node)) {\r\n return node.map((entry) => resolveNode(entry, currentSchemaRoot, candidates, visiting));\r\n }\r\n\r\n if (!isObject(node)) {\r\n return node;\r\n }\r\n\r\n if (typeof node.$ref === \"string\") {\r\n const resolved = resolveRefNode(node, currentSchemaRoot, candidates, visiting);\r\n return resolveNode(resolved.value, resolved.currentSchemaRoot, candidates, visiting);\r\n }\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n for (const [key, value] of Object.entries(node)) {\r\n result[key] = resolveNode(value, currentSchemaRoot, candidates, visiting);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction resolveRefNode(\r\n node: Record<string, unknown>,\r\n currentSchemaRoot: JSONSchema,\r\n candidates: SchemaCandidate[],\r\n visiting: Set<string>\r\n): { value: Record<string, unknown>; currentSchemaRoot: JSONSchema } {\r\n const ref = node.$ref as string;\r\n const externalReference = isExternalReference(ref);\r\n const recursionKey = `${currentSchemaRoot.$id ?? \"local\"}::${ref}`;\r\n\r\n if (visiting.has(recursionKey)) {\r\n throw new Error(`Infinite recursion detected while resolving reference: ${ref}`);\r\n }\r\n\r\n visiting.add(recursionKey);\r\n\r\n let targetSchema = currentSchemaRoot;\r\n let resultJsonPointer = ref;\r\n\r\n if (externalReference) {\r\n const matched = findBestCandidate(ref, candidates);\r\n if (!matched) {\r\n throw new MissingPeerSchemaError(ref);\r\n }\r\n\r\n targetSchema = matched.schema;\r\n resultJsonPointer = ref.slice(matched.identifier.length);\r\n\r\n if (!resultJsonPointer) {\r\n resultJsonPointer = \"#\";\r\n }\r\n }\r\n\r\n const resolvedValue = getByPointer(resultJsonPointer, targetSchema);\r\n\r\n if (!isObject(resolvedValue)) {\r\n throw new Error(`Could not resolve JSON pointer: ${resultJsonPointer}`);\r\n }\r\n\r\n const { $ref: _omitRef, ...rest } = node;\r\n const merged = {\r\n ...deepClone(resolvedValue),\r\n ...rest\r\n };\r\n\r\n // Inlining a whole external document can duplicate its $id in multiple locations,\r\n // which causes AJV to report that the reference resolves to more than one schema.\r\n if (externalReference && resultJsonPointer === \"#\") {\r\n delete merged.$id;\r\n }\r\n\r\n visiting.delete(recursionKey);\r\n return { value: merged, currentSchemaRoot: targetSchema };\r\n}\r\n\r\nfunction isExternalReference(ref: string): boolean {\r\n return !(ref.startsWith(\"#\") || ref.startsWith(\"/\"));\r\n}\r\n\r\nfunction findFirstMissingExternalRef(rootSchema: JSONSchema, candidates: SchemaCandidate[]): string | null {\r\n const visited = new Set<unknown>();\r\n const stack: unknown[] = [rootSchema, ...candidates.map((candidate) => candidate.schema)];\r\n\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!isObject(current)) {\r\n continue;\r\n }\r\n\r\n if (visited.has(current)) {\r\n continue;\r\n }\r\n\r\n visited.add(current);\r\n\r\n if (typeof current.$ref === \"string\" && isExternalReference(current.$ref)) {\r\n if (!findBestCandidate(current.$ref, candidates)) {\r\n return current.$ref;\r\n }\r\n }\r\n\r\n for (const value of Object.values(current)) {\r\n if (Array.isArray(value)) {\r\n for (const entry of value) {\r\n stack.push(entry);\r\n }\r\n } else {\r\n stack.push(value);\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nasync function bundleWithRegisteredSchemas(schema: JSONSchema, candidates: SchemaCandidate[]): Promise<JSONSchema> {\r\n const rootUri =\r\n typeof schema.$id === \"string\" && schema.$id.length > 0\r\n ? schema.$id\r\n : `urn:formhell:bundled-schema:${generatedSchemaCounter++}`;\r\n const registeredUris = new Set<string>();\r\n\r\n registerSchemaWithOverwrite(asHyperjumpSchema(schema), rootUri);\r\n registeredUris.add(rootUri);\r\n for (const candidate of candidates) {\r\n const candidateUri = normalizeCandidateRegistrationUri(candidate);\r\n if (registeredUris.has(candidateUri)) {\r\n continue;\r\n }\r\n\r\n registerSchemaWithOverwrite(asHyperjumpSchema(candidate.schema), candidateUri);\r\n registeredUris.add(candidateUri);\r\n }\r\n\r\n const bundled = await bundle(rootUri);\r\n if (!isObject(bundled)) {\r\n throw new Error(\"Bundling did not produce a valid schema document.\");\r\n }\r\n\r\n return bundled as JSONSchema;\r\n}\r\n\r\nfunction normalizeCandidateRegistrationUri(candidate: SchemaCandidate): string {\r\n if (typeof candidate.schema.$id === \"string\" && candidate.schema.$id.length > 0) {\r\n return candidate.schema.$id;\r\n }\r\n\r\n return stripFragment(candidate.identifier);\r\n}\r\n\r\nfunction stripFragment(uri: string): string {\r\n const hashIndex = uri.indexOf(\"#\");\r\n if (hashIndex === -1) {\r\n return uri;\r\n }\r\n\r\n return uri.slice(0, hashIndex);\r\n}\r\n\r\nfunction asHyperjumpSchema(schema: JSONSchema): JsonSchemaDraft202012 {\r\n return schema as unknown as JsonSchemaDraft202012;\r\n}\r\n\r\nfunction registerSchemaWithOverwrite(schema: JsonSchemaDraft202012, uri: string): void {\r\n if (hasSchema(uri)) {\r\n unregisterSchema(uri);\r\n }\r\n\r\n registerSchema(schema, uri, DEFAULT_DIALECT_URI);\r\n}\r\n\r\nfunction collectSchemaCandidates(schema: JSONSchema): SchemaCandidate[] {\r\n const collected = new Map<string, SchemaCandidate>();\r\n const visited = new Set<unknown>();\r\n const stack: unknown[] = [schema];\r\n\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!isObject(current)) {\r\n continue;\r\n }\r\n\r\n if (visited.has(current)) {\r\n continue;\r\n }\r\n\r\n visited.add(current);\r\n\r\n if (typeof current.$id === \"string\" && current.$id.length > 0) {\r\n collected.set(current.$id, {\r\n identifier: current.$id,\r\n schema: current as JSONSchema\r\n });\r\n }\r\n\r\n for (const value of Object.values(current)) {\r\n if (Array.isArray(value)) {\r\n for (const entry of value) {\r\n stack.push(entry);\r\n }\r\n } else {\r\n stack.push(value);\r\n }\r\n }\r\n }\r\n\r\n return Array.from(collected.values());\r\n}\r\n\r\nfunction mergeCandidates(...candidateGroups: SchemaCandidate[][]): SchemaCandidate[] {\r\n const merged = new Map<string, SchemaCandidate>();\r\n\r\n for (const group of candidateGroups) {\r\n for (const candidate of group) {\r\n merged.set(candidate.identifier, candidate);\r\n }\r\n }\r\n\r\n return Array.from(merged.values());\r\n}\r\n\r\nfunction findBestCandidate(ref: string, candidates: SchemaCandidate[]): SchemaCandidate | undefined {\r\n const matches = candidates.filter((candidate) => ref.startsWith(candidate.identifier));\r\n matches.sort((a, b) => b.identifier.length - a.identifier.length);\r\n return matches[0];\r\n}\r\n\r\nfunction toSchemaCandidates(peerSchemas?: PeerSchemasInput): SchemaCandidate[] {\r\n if (!peerSchemas) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(peerSchemas)) {\r\n return peerSchemas\r\n .filter((schema) => typeof schema.$id === \"string\" && schema.$id.length > 0)\r\n .map((schema) => ({ identifier: schema.$id as string, schema }));\r\n }\r\n\r\n return Object.entries(peerSchemas).map(([identifier, schema]) => ({ identifier, schema }));\r\n}\r\n\r\nfunction deepClone<T>(value: T): T {\r\n if (typeof structuredClone === \"function\") {\r\n return structuredClone(value);\r\n }\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n","import Ajv from \"ajv\";\r\nimport Ajv2019 from \"ajv/dist/2019\";\r\nimport Ajv2020 from \"ajv/dist/2020\";\r\nimport type { JSONSchema, PeerSchemasInput } from \"../types/schema\";\r\n\r\nexport const AJV_SUPPORTED_FORMATS = [\r\n \"date\",\r\n \"time\",\r\n \"date-time\",\r\n \"duration\",\r\n \"uri\",\r\n \"uri-reference\",\r\n \"uri-template\",\r\n \"url\",\r\n \"email\",\r\n \"hostname\",\r\n \"ipv4\",\r\n \"ipv6\",\r\n \"regex\",\r\n \"uuid\",\r\n \"json-pointer\",\r\n \"json-pointer-uri-fragment\",\r\n \"relative-json-pointer\"\r\n] as const;\r\n\r\nconst AJV_OPTIONS = {\r\n allErrors: true,\r\n strict: false,\r\n validateSchema: true\r\n};\r\n\r\nexport function createAjvForSchema(schema: JSONSchema): Ajv {\r\n const schemaUri = schema.$schema ?? \"\";\r\n\r\n if (schemaUri.includes(\"2020-12\")) {\r\n return new Ajv2020(AJV_OPTIONS);\r\n }\r\n\r\n if (schemaUri.includes(\"2019-09\")) {\r\n return new Ajv2019(AJV_OPTIONS);\r\n }\r\n\r\n return new Ajv(AJV_OPTIONS);\r\n}\r\n\r\nexport function validateSchemaOrThrow(schema: JSONSchema, label: string): void {\r\n const ajv = createAjvForSchema(schema);\r\n const valid = ajv.validateSchema(schema);\r\n\r\n if (!valid) {\r\n const errors = ajv.errorsText(ajv.errors, { separator: \"; \" });\r\n throw new Error(`${label} is not a valid JSON Schema. ${errors}`.trim());\r\n }\r\n}\r\n\r\nexport function validatePeerSchemasOrThrow(peerSchemas?: PeerSchemasInput): void {\r\n if (!peerSchemas) {\r\n return;\r\n }\r\n\r\n if (Array.isArray(peerSchemas)) {\r\n peerSchemas.forEach((schema, index) => {\r\n validateSchemaOrThrow(schema, `peerSchemas[${index}]`);\r\n });\r\n return;\r\n }\r\n\r\n for (const [key, schema] of Object.entries(peerSchemas)) {\r\n validateSchemaOrThrow(schema, `peerSchemas.${key}`);\r\n }\r\n}\r\n\r\nexport function validateDataOrThrow(data: unknown, schema: JSONSchema): void {\r\n const ajv = createAjvForSchema(schema);\r\n const validate = ajv.compile(schema);\r\n const valid = validate(data);\r\n\r\n if (!valid) {\r\n const errors = ajv.errorsText(validate.errors, { separator: \"; \" });\r\n throw new Error(`Provided data does not match schema. ${errors}`.trim());\r\n }\r\n}\r\n","import { useEffect, useState, type ComponentType, type ReactNode } from \"react\";\r\nimport { SchemaFormArray } from \"./fields/SchemaFormArray\";\r\nimport { SchemaFormBoolean } from \"./fields/SchemaFormBoolean\";\r\nimport { SchemaFormInteger } from \"./fields/SchemaFormInteger\";\r\nimport { SchemaFormNull } from \"./fields/SchemaFormNull\";\r\nimport { SchemaFormNumber } from \"./fields/SchemaFormNumber\";\r\nimport { SchemaFormObject } from \"./fields/SchemaFormObject\";\r\nimport { SchemaFormSelect } from \"./fields/SchemaFormSelect\";\r\nimport { SchemaFormString } from \"./fields/SchemaFormString\";\r\nimport type { FieldComponentProps, SchemaFormArrayProps, SchemaFormObjectProps, SchemaFormWidgets } from \"../types/components\";\r\nimport type { JSONSchema, JSONSchemaType } from \"../types/schema\";\r\nimport { createDefaultValueFromSchema } from \"../utils/defaultData\";\r\nimport { joinPointer } from \"../utils/jsonPointer\";\r\n\r\ninterface SchemaFieldRendererProps {\r\n schema: JSONSchema;\r\n label: string;\r\n required: boolean;\r\n pointer: string;\r\n schemaPointer: string;\r\n value: unknown;\r\n onChange: (pointer: string, next: unknown) => void;\r\n widgets?: SchemaFormWidgets;\r\n controls?: ReactNode;\r\n}\r\n\r\nexport function SchemaFieldRenderer(props: SchemaFieldRendererProps) {\r\n const { schema, label, required, pointer, schemaPointer, value, onChange, widgets, controls } = props;\r\n const hasConstValue = Object.prototype.hasOwnProperty.call(schema, \"const\");\r\n const lockedValue = hasConstValue ? schema.const : value;\r\n const isConstLocked = hasConstValue;\r\n const schemaTypes = resolveTypes(schema);\r\n const type = resolveType(schema);\r\n const hasTypeChoices = schemaTypes.length > 1;\r\n const hasEnum = Array.isArray(schema.enum) && schema.enum.length > 0;\r\n const inferredType = inferValueType(lockedValue, schemaTypes);\r\n const [selectedType, setSelectedType] = useState<JSONSchemaType | undefined>(() => inferredType ?? schemaTypes[0]);\r\n const activeType = selectedType && schemaTypes.includes(selectedType) ? selectedType : inferredType ?? schemaTypes[0];\r\n const tupleItems = activeType === \"array\"\r\n ? Array.isArray(schema.prefixItems)\r\n ? schema.prefixItems\r\n : Array.isArray(schema.items)\r\n ? schema.items\r\n : undefined\r\n : undefined;\r\n const singleItemsSchema =\r\n activeType === \"array\" && !Array.isArray(schema.items) && isObject(schema.items) ? (schema.items as JSONSchema) : undefined;\r\n const itemSchemas = activeType === \"array\" ? tupleItems ?? (singleItemsSchema ? [singleItemsSchema] : undefined) : undefined;\r\n const maxItems = activeType === \"array\" && typeof schema.maxItems === \"number\" ? schema.maxItems : undefined;\r\n\r\n useEffect(() => {\r\n if (selectedType && schemaTypes.includes(selectedType) && !inferredType) {\r\n return;\r\n }\r\n\r\n if (inferredType && inferredType !== selectedType) {\r\n setSelectedType(inferredType);\r\n return;\r\n }\r\n\r\n if (selectedType && !schemaTypes.includes(selectedType)) {\r\n setSelectedType(inferredType ?? schemaTypes[0]);\r\n }\r\n }, [inferredType, schemaTypes, selectedType]);\r\n\r\n const typeChooser = hasTypeChoices && !hasEnum ? (\r\n <div className=\"raf-button-row\" aria-label={`${label} type chooser`}>\r\n {schemaTypes\r\n .filter((choice) => choice !== \"null\")\r\n .map((choice) => (\r\n <button\r\n key={choice}\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n disabled={isConstLocked}\r\n aria-pressed={activeType === choice}\r\n onClick={() => {\r\n setSelectedType(choice);\r\n onChange(pointer, createDefaultValueForType(choice));\r\n }}\r\n >\r\n {choice}\r\n </button>\r\n ))}\r\n\r\n {schemaTypes.includes(\"null\") ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n disabled={isConstLocked}\r\n aria-pressed={activeType === \"null\"}\r\n onClick={() => {\r\n setSelectedType(\"null\");\r\n onChange(pointer, null);\r\n }}\r\n >\r\n Insert NULL\r\n </button>\r\n ) : null}\r\n </div>\r\n ) : null;\r\n const fieldControls = controls && typeChooser ? <>{controls}{typeChooser}</> : controls ?? typeChooser;\r\n\r\n if (activeType === \"object\") {\r\n const ObjectWidget =\r\n getSchemaPointerWidget<SchemaFormObjectProps>(widgets, schemaPointer) ?? widgets?.Object ?? SchemaFormObject;\r\n const objectValue = isObject(lockedValue) ? lockedValue : {};\r\n const requiredKeys = new Set(schema.required ?? []);\r\n const properties = schema.properties ?? {};\r\n\r\n return (\r\n <ObjectWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={objectValue}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n >\r\n {Object.entries(properties).map(([propertyName, propertySchema]) => {\r\n const childPointer = joinPointer(pointer, propertyName);\r\n const childSchemaPointer = joinPointer(joinPointer(schemaPointer, \"properties\"), propertyName);\r\n const childValue = objectValue[propertyName];\r\n\r\n return (\r\n <SchemaFieldRenderer\r\n key={childPointer}\r\n schema={propertySchema}\r\n label={propertySchema.title ?? propertyName}\r\n required={requiredKeys.has(propertyName)}\r\n pointer={childPointer}\r\n schemaPointer={childSchemaPointer}\r\n value={childValue}\r\n onChange={onChange}\r\n widgets={widgets}\r\n />\r\n );\r\n })}\r\n </ObjectWidget>\r\n );\r\n }\r\n\r\n if (activeType === \"array\") {\r\n const ArrayWidget =\r\n getSchemaPointerWidget<SchemaFormArrayProps>(widgets, schemaPointer) ?? widgets?.Array ?? SchemaFormArray;\r\n const arrayValue = Array.isArray(lockedValue) ? lockedValue : [];\r\n const addLimit = maxItems ?? Number.POSITIVE_INFINITY;\r\n const fixedTupleValue = tupleItems\r\n ? tupleItems.map((itemSchema, index) =>\r\n arrayValue[index] === undefined ? createDefaultValueFromSchema(itemSchema) : arrayValue[index]\r\n )\r\n : arrayValue;\r\n const canAddItem = tupleItems ? false : arrayValue.length < addLimit;\r\n\r\n return (\r\n <ArrayWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={fixedTupleValue}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n itemsSchema={singleItemsSchema}\r\n itemSchemas={itemSchemas}\r\n createDefaultItem={() => createDefaultValueForArrayItem(itemSchemas, arrayValue.length)}\r\n renderItem={(index, itemPointer, itemValue) => (\r\n <SchemaFieldRenderer\r\n schema={tupleItems?.[index] ?? singleItemsSchema ?? { type: \"string\" }}\r\n label={tupleItems?.[index]?.title?.trim() ? (tupleItems[index].title as string) : tupleItems ? `Tuple ${index + 1}` : `Item ${index + 1}`}\r\n required={true}\r\n pointer={itemPointer}\r\n schemaPointer={tupleItems ? joinPointer(joinPointer(schemaPointer, \"prefixItems\"), String(index)) : joinPointer(schemaPointer, \"items\")}\r\n value={itemValue}\r\n onChange={onChange}\r\n widgets={widgets}\r\n />\r\n )}\r\n canAddItem={canAddItem}\r\n canRemoveItems={!tupleItems}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"boolean\") {\r\n const BooleanWidget =\r\n getSchemaPointerWidget<FieldComponentProps<boolean>>(widgets, schemaPointer) ??\r\n widgets?.Boolean ??\r\n SchemaFormBoolean;\r\n return (\r\n <BooleanWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={Boolean(lockedValue)}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"number\") {\r\n const NumberWidget =\r\n getSchemaPointerWidget<FieldComponentProps<number | undefined>>(widgets, schemaPointer) ??\r\n widgets?.Number ??\r\n SchemaFormNumber;\r\n return (\r\n <NumberWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={typeof lockedValue === \"number\" ? lockedValue : undefined}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"integer\") {\r\n const IntegerWidget =\r\n getSchemaPointerWidget<FieldComponentProps<number | undefined>>(widgets, schemaPointer) ??\r\n widgets?.Integer ??\r\n SchemaFormInteger;\r\n return (\r\n <IntegerWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={typeof lockedValue === \"number\" ? lockedValue : undefined}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (activeType === \"null\") {\r\n const NullWidget =\r\n getSchemaPointerWidget<FieldComponentProps<null>>(widgets, schemaPointer) ?? widgets?.Null ?? SchemaFormNull;\r\n return (\r\n <NullWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={null}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={() => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, null);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (hasEnum && (activeType === \"string\" || hasTypeChoices)) {\r\n const SelectWidget =\r\n getSchemaPointerWidget<FieldComponentProps<unknown>>(widgets, schemaPointer) ?? widgets?.Select ?? SchemaFormSelect;\r\n return (\r\n <SelectWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={lockedValue}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n const StringWidget =\r\n getSchemaPointerWidget<FieldComponentProps<string>>(widgets, schemaPointer) ?? widgets?.String ?? SchemaFormString;\r\n return (\r\n <StringWidget\r\n label={label}\r\n required={required}\r\n pointer={pointer}\r\n schema={schema}\r\n value={typeof lockedValue === \"string\" ? lockedValue : \"\"}\r\n disabled={isConstLocked}\r\n controls={fieldControls}\r\n onChange={(next) => {\r\n if (isConstLocked) {\r\n return;\r\n }\r\n onChange(pointer, next);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction getSchemaPointerWidget<TProps>(\r\n widgets: SchemaFormWidgets | undefined,\r\n schemaPointer: string\r\n): ComponentType<TProps> | undefined {\r\n if (!widgets) {\r\n return undefined;\r\n }\r\n\r\n const candidate = widgets[schemaPointer];\r\n if (!candidate) {\r\n return undefined;\r\n }\r\n\r\n return candidate as ComponentType<TProps>;\r\n}\r\n\r\nfunction resolveType(schema: JSONSchema): JSONSchemaType {\r\n if (Array.isArray(schema.type) && schema.type.length > 0) {\r\n return schema.type[0];\r\n }\r\n\r\n if (typeof schema.type === \"string\") {\r\n return schema.type;\r\n }\r\n\r\n if (schema.properties) {\r\n return \"object\";\r\n }\r\n\r\n if (schema.items) {\r\n return \"array\";\r\n }\r\n\r\n return \"string\";\r\n}\r\n\r\nfunction resolveTypes(schema: JSONSchema): JSONSchemaType[] {\r\n if (Array.isArray(schema.type) && schema.type.length > 0) {\r\n return schema.type.filter((type): type is JSONSchemaType => typeof type === \"string\");\r\n }\r\n\r\n return [resolveType(schema)];\r\n}\r\n\r\nfunction inferValueType(value: unknown, schemaTypes: JSONSchemaType[]): JSONSchemaType | undefined {\r\n if (value === null && schemaTypes.includes(\"null\")) {\r\n return \"null\";\r\n }\r\n\r\n if (Array.isArray(value) && schemaTypes.includes(\"array\")) {\r\n return \"array\";\r\n }\r\n\r\n if (isObject(value) && schemaTypes.includes(\"object\")) {\r\n return \"object\";\r\n }\r\n\r\n if (typeof value === \"boolean\" && schemaTypes.includes(\"boolean\")) {\r\n return \"boolean\";\r\n }\r\n\r\n if (typeof value === \"number\") {\r\n if (schemaTypes.includes(\"integer\") && Number.isInteger(value)) {\r\n return \"integer\";\r\n }\r\n\r\n if (schemaTypes.includes(\"number\")) {\r\n return \"number\";\r\n }\r\n }\r\n\r\n if (typeof value === \"string\" && schemaTypes.includes(\"string\")) {\r\n return \"string\";\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction createDefaultValueForType(type: JSONSchemaType): unknown {\r\n switch (type) {\r\n case \"string\":\r\n return \"\";\r\n case \"number\":\r\n case \"integer\":\r\n return undefined;\r\n case \"boolean\":\r\n return false;\r\n case \"object\":\r\n return {};\r\n case \"array\":\r\n return [];\r\n case \"null\":\r\n return null;\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction createDefaultValueForArrayItem(itemSchemas: JSONSchema[] | undefined, index: number): unknown {\r\n const schema = itemSchemas?.[index] ?? itemSchemas?.[0] ?? itemSchemas?.[itemSchemas.length - 1];\r\n return createDefaultValueFromSchema(schema ?? {});\r\n}\r\n","import { useRef } from \"react\";\r\nimport type { SchemaFormArrayProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormArray({\r\n label,\r\n required,\r\n pointer,\r\n schema,\r\n value,\r\n disabled,\r\n controls,\r\n canAddItem,\r\n canRemoveItems,\r\n onChange,\r\n renderItem,\r\n createDefaultItem\r\n}: SchemaFormArrayProps) {\r\n const items = Array.isArray(value) ? value : [];\r\n const hasUserModifiedRef = useRef(false);\r\n const lastSignatureRef = useRef<string | null>(null);\r\n const maxItems = typeof schema.maxItems === \"number\" ? schema.maxItems : undefined;\r\n const initialItemCount = getInitialItemCount(schema.minItems, maxItems);\r\n const schemaSignature = `${pointer}|${String(schema.minItems ?? \"\")}|${String(schema.maxItems ?? \"\")}|${JSON.stringify(schema.items ?? null)}|${JSON.stringify(schema.prefixItems ?? null)}`;\r\n\r\n if (schemaSignature !== lastSignatureRef.current) {\r\n hasUserModifiedRef.current = false;\r\n lastSignatureRef.current = schemaSignature;\r\n }\r\n\r\n const renderedItems = items.length === 0 && !hasUserModifiedRef.current\r\n ? Array.from({ length: initialItemCount }, () => createDefaultItem())\r\n : items;\r\n const showAddItem = !disabled && canAddItem !== false && renderedItems.length < (maxItems ?? Number.POSITIVE_INFINITY);\r\n\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <div>\r\n {renderedItems.map((item, index) => {\r\n const itemPointer = `${pointer}/${index}`;\r\n\r\n return (\r\n <div className=\"raf-array-item\" key={itemPointer}>\r\n {renderItem(index, itemPointer, item)}\r\n {canRemoveItems === false ? null : (\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n disabled={disabled}\r\n onClick={() => {\r\n hasUserModifiedRef.current = true;\r\n const next = [...renderedItems];\r\n next.splice(index, 1);\r\n onChange(next);\r\n }}\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {showAddItem ? (\r\n <button\r\n className=\"raf-button raf-button-primary\"\r\n type=\"button\"\r\n onClick={() => {\r\n hasUserModifiedRef.current = true;\r\n const next = [...renderedItems, createDefaultItem()];\r\n onChange(next);\r\n }}\r\n >\r\n Add Item\r\n </button>\r\n ) : null}\r\n </div>\r\n </FieldShell>\r\n );\r\n}\r\n\r\nfunction getInitialItemCount(minItems: unknown, maxItems: number | undefined): number {\r\n const desiredCount = typeof minItems === \"number\" && minItems > 1 ? Math.floor(minItems) : 1;\r\n\r\n if (maxItems === undefined) {\r\n return desiredCount;\r\n }\r\n\r\n return Math.max(0, Math.min(desiredCount, maxItems));\r\n}\r\n","import type { PropsWithChildren, ReactNode } from \"react\";\r\n\r\ninterface FieldShellProps {\r\n label: string;\r\n required: boolean;\r\n controls?: ReactNode;\r\n}\r\n\r\nexport function FieldShell({ label, required, controls, children }: PropsWithChildren<FieldShellProps>) {\r\n return (\r\n <div className=\"raf-field\">\r\n <div className=\"raf-field-label-row\">\r\n <label className=\"raf-field-label\">\r\n {label}\r\n {required ? <span className=\"raf-field-required\">*</span> : null}\r\n </label>\r\n {!required ? <span className=\"raf-field-optional\">Optional</span> : null}\r\n </div>\r\n {controls ? <div className=\"raf-button-row\">{controls}</div> : null}\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormBoolean({ label, required, value, disabled, controls, onChange }: FieldComponentProps<boolean>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <label className=\"raf-checkbox-row\">\r\n <input\r\n className=\"raf-checkbox\"\r\n type=\"checkbox\"\r\n checked={Boolean(value)}\r\n disabled={disabled}\r\n onChange={(event) => onChange(event.target.checked)}\r\n />\r\n <span>{value ? \"True\" : \"False\"}</span>\r\n </label>\r\n </FieldShell>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormInteger({ label, required, value, disabled, controls, onChange }: FieldComponentProps<number | undefined>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <input\r\n className=\"raf-input\"\r\n type=\"number\"\r\n step={1}\r\n value={value ?? \"\"}\r\n disabled={disabled}\r\n onChange={(event) => {\r\n const nextValue = event.target.value;\r\n onChange(nextValue === \"\" ? undefined : Math.trunc(Number(nextValue)));\r\n }}\r\n />\r\n </FieldShell>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormNull({ label, required, controls }: FieldComponentProps<null>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <div className=\"raf-muted\">Value is always null.</div>\r\n </FieldShell>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormNumber({ label, required, value, disabled, controls, onChange }: FieldComponentProps<number | undefined>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <input\r\n className=\"raf-input\"\r\n type=\"number\"\r\n value={value ?? \"\"}\r\n disabled={disabled}\r\n onChange={(event) => {\r\n const nextValue = event.target.value;\r\n onChange(nextValue === \"\" ? undefined : Number(nextValue));\r\n }}\r\n />\r\n </FieldShell>\r\n );\r\n}\r\n","import type { SchemaFormObjectProps } from \"../../types/components\";\r\n\r\nexport function SchemaFormObject({ label, required, disabled, controls, children }: SchemaFormObjectProps) {\r\n return (\r\n <details className=\"raf-object\" open>\r\n <summary className=\"raf-object-summary\">\r\n {label}\r\n {required ? <span className=\"raf-field-required\">*</span> : null}\r\n </summary>\r\n <div className=\"raf-object-content\" aria-disabled={disabled}>\r\n {controls ? <div className=\"raf-button-row\">{controls}</div> : null}\r\n {children}\r\n </div>\r\n </details>\r\n );\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormSelect({ label, required, schema, value, disabled, controls, onChange }: FieldComponentProps<unknown>) {\r\n const options = Array.isArray(schema.enum) ? schema.enum : [];\r\n const selectedValue = encodeEnumValue(value);\r\n\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <select\r\n className=\"raf-select\"\r\n value={selectedValue}\r\n disabled={disabled}\r\n onChange={(event) => onChange(decodeEnumValue(event.target.value))}\r\n >\r\n {!required ? <option value=\"\">Select...</option> : null}\r\n {options.map((option) => (\r\n <option key={encodeEnumValue(option)} value={encodeEnumValue(option)}>\r\n {String(option)}\r\n </option>\r\n ))}\r\n </select>\r\n </FieldShell>\r\n );\r\n}\r\n\r\nfunction encodeEnumValue(value: unknown): string {\r\n if (value === undefined) {\r\n return \"\";\r\n }\r\n\r\n return JSON.stringify(value);\r\n}\r\n\r\nfunction decodeEnumValue(value: string): unknown {\r\n if (value === \"\") {\r\n return \"\";\r\n }\r\n\r\n try {\r\n return JSON.parse(value) as unknown;\r\n } catch {\r\n return value;\r\n }\r\n}\r\n","import type { FieldComponentProps } from \"../../types/components\";\r\nimport { FieldShell } from \"./FieldShell\";\r\n\r\nexport function SchemaFormString({ label, required, value, disabled, controls, onChange }: FieldComponentProps<string>) {\r\n return (\r\n <FieldShell label={label} required={required} controls={controls}>\r\n <input\r\n className=\"raf-input\"\r\n type=\"text\"\r\n value={value ?? \"\"}\r\n disabled={disabled}\r\n onChange={(event) => onChange(event.target.value)}\r\n />\r\n </FieldShell>\r\n );\r\n}\r\n","import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport parse from \"html-react-parser\";\r\nimport type {\r\n SchemaBuilderHelperContent,\r\n SchemaBuilderHelperContentEntry,\r\n SchemaBuilderHelperProps,\r\n SchemaBuilderProps,\r\n SchemaBuilderValidationError\r\n} from \"../types/components\";\r\nimport type { JSONSchema, JSONSchemaType } from \"../types/schema\";\r\nimport { AJV_SUPPORTED_FORMATS, createAjvForSchema } from \"../utils/schemaValidation\";\r\n\r\ntype SchemaCombinationKey = \"allOf\" | \"anyOf\" | \"oneOf\";\r\ntype SchemaConditionalKey = \"if\" | \"then\" | \"else\";\r\n\r\nconst FIELD_TYPES: JSONSchemaType[] = [\"string\", \"number\", \"integer\", \"boolean\", \"object\", \"array\", \"null\"];\r\n\r\nconst DEFAULT_SCHEMA_URI = \"https://json-schema.org/draft/2020-12/schema\";\r\n\r\ntype HelpAnchorRect = { top: number; left: number; bottom: number; right: number };\r\n\r\ninterface ActiveFieldHelp {\r\n key: string;\r\n label: string;\r\n anchor: HelpAnchorRect;\r\n}\r\n\r\ninterface KeywordHelpDefinition {\r\n summary: string;\r\n details: string;\r\n longDetails: string;\r\n link: string;\r\n}\r\n\r\ninterface FieldHelpContextValue {\r\n openHelp: (key: string, label: string, anchor: HelpAnchorRect) => void;\r\n}\r\n\r\nconst FieldHelpContext = createContext<FieldHelpContextValue | null>(null);\r\n\r\nconst FIELD_HELP_BASE_CONTENT: Record<string, Pick<KeywordHelpDefinition, \"summary\" | \"details\">> = {\r\n \"$id\": {\r\n summary: \"Sets the base URI that identifies this schema.\",\r\n details:\r\n \"Use <strong>$id</strong> to assign a stable identifier for the schema resource. Relative references and nested schema identifiers are resolved against this base URI.\"\r\n },\r\n \"$schema\": {\r\n summary: \"Declares which JSON Schema dialect this schema uses.\",\r\n details:\r\n \"Set <strong>$schema</strong> to the meta-schema URI for the draft you target, such as 2020-12. Validators use it to interpret keyword behavior and vocabulary support.\"\r\n },\r\n \"$ref\": {\r\n summary: \"References another schema and applies it at this location.\",\r\n details:\r\n \"Use <strong>$ref</strong> to point to a schema URI or JSON Pointer. Validation of this node is delegated to the referenced schema, allowing reuse and composition.\"\r\n },\r\n type: {\r\n summary: \"Restricts instance values to one or more JSON types.\",\r\n details:\r\n \"Set <strong>type</strong> to a single <strong>type</strong> or a list of allowed types. This controls which instances can match and which <strong>type</strong>-specific assertion keywords are meaningful.\"\r\n },\r\n title: {\r\n summary: \"Provides a short human-readable name for the schema.\",\r\n details:\r\n \"Use <strong>title</strong> as annotation text for UI labels, documentation, and schema browsing. It does <strong>not</strong> affect assertion or pass/fail validation outcomes.\"\r\n },\r\n description: {\r\n summary: \"Provides longer human-readable documentation for the schema.\",\r\n details:\r\n \"Use <strong>description</strong> to explain intent, constraints, and <strong>examples</strong> in prose. It is an annotation keyword and does <strong>not</strong> directly change validation results.\"\r\n },\r\n deprecated: {\r\n summary: \"Marks values as discouraged for future use.\",\r\n details:\r\n \"Set <strong>deprecated</strong> to true to signal that this schema location should be phased out. It is metadata for tooling and consumers rather than an assertion failure.\"\r\n },\r\n readonly: {\r\n summary: \"Marks a value as read-only for producers and clients.\",\r\n details:\r\n \"<strong>readOnly</strong> is an annotation commonly used by APIs and forms to prevent user edits on output-only fields. It does <strong>not</strong> invalidate JSON instances by itself.\"\r\n },\r\n writeonly: {\r\n summary: \"Marks a value as write-only and not intended for output.\",\r\n details:\r\n \"<strong>writeOnly</strong> is an annotation used for sensitive or input-only fields. Tooling may hide these in responses while still accepting them in requests.\"\r\n },\r\n examples: {\r\n summary: \"Supplies sample instance values for this schema location.\",\r\n details:\r\n \"Use <strong>examples</strong> as annotation data to illustrate typical values. These samples support docs and UI guidance but are <strong>not</strong> automatically enforced as constraints.\"\r\n },\r\n default: {\r\n summary: \"Provides a suggested default value for consumers.\",\r\n details:\r\n \"<strong>default</strong> is an annotation that tools may use to prefill forms or generated objects. Validators do <strong>not</strong> automatically insert or require this value.\"\r\n },\r\n const: {\r\n summary: \"Requires the instance to equal exactly one value.\",\r\n details:\r\n \"Use <strong>const</strong> when a field must always be a specific literal value. The instance must match this value exactly, including <strong>type</strong> and structure.\"\r\n },\r\n enum: {\r\n summary: \"Restricts the instance to one of the listed values.\",\r\n details:\r\n \"<strong>enum</strong> defines an allowed set of values and the instance must equal one of them. Values can be strings, numbers, booleans, null, objects, or arrays.\"\r\n },\r\n minlength: {\r\n summary: \"Sets the minimum string length in Unicode code points.\",\r\n details:\r\n \"<strong>minLength</strong> requires string instances to have at least this many characters. Use it with <strong>maxLength</strong> to bound accepted string sizes.\"\r\n },\r\n maxlength: {\r\n summary: \"Sets the maximum string length in Unicode code points.\",\r\n details:\r\n \"<strong>maxLength</strong> requires string instances to be no longer than this value. It applies only when the instance <strong>type</strong> is string.\"\r\n },\r\n pattern: {\r\n summary: \"Requires strings to match a regular expression. (HINT: Don't provide the leading or trailing slashes.)\",\r\n details:\r\n \"<strong>pattern</strong> uses an ECMA-262 compatible regular expression. A string is valid when the regex finds a match within the instance text.\"\r\n },\r\n format: {\r\n summary: \"Annotates or optionally asserts semantic string formats.\",\r\n details:\r\n \"<strong>format</strong> communicates semantic expectations such as email, uri, or date-time. Depending on validator configuration, it may be informational or enforced.\"\r\n },\r\n minimum: {\r\n summary: \"Sets the inclusive numeric lower bound.\",\r\n details:\r\n \"<strong>minimum</strong> requires numbers to be greater than or equal to this value. Use <strong>exclusiveMinimum</strong> when the lower bound should be strict.\"\r\n },\r\n maximum: {\r\n summary: \"Sets the inclusive numeric upper bound.\",\r\n details:\r\n \"<strong>maximum</strong> requires numbers to be less than or equal to this value. Use <strong>exclusiveMaximum</strong> when the upper bound should be strict.\"\r\n },\r\n multipleof: {\r\n summary: \"Requires numbers to be a multiple of the given divisor.\",\r\n details:\r\n \"<strong>multipleOf</strong> checks exact divisibility by a positive number. It is useful for increments such as currency steps or fixed precision values.\"\r\n },\r\n exclusiveminimum: {\r\n summary: \"Sets a strict numeric lower bound.\",\r\n details:\r\n \"<strong>exclusiveMinimum</strong> requires numbers to be strictly greater than this value. Instances equal to the boundary are invalid.\"\r\n },\r\n exclusivemaximum: {\r\n summary: \"Sets a strict numeric upper bound.\",\r\n details:\r\n \"<strong>exclusiveMaximum</strong> requires numbers to be strictly less than this value. Instances equal to the boundary are invalid.\"\r\n },\r\n properties: {\r\n summary: \"Defines schemas for named object properties.\",\r\n details:\r\n \"<strong>properties</strong> maps property names to subschemas. When an instance has a matching property, that value is validated against the corresponding subschema.\"\r\n },\r\n required: {\r\n summary: \"Lists object properties that must be present.\",\r\n details:\r\n \"<strong>required</strong> is an array of property names. Each listed name must appear on the object instance for validation to succeed.\"\r\n },\r\n additionalproperties: {\r\n summary: \"Controls validation of object properties not listed in properties.\",\r\n details:\r\n \"<strong>additionalProperties</strong> applies to remaining object members after <strong>properties</strong> and <strong>patternProperties</strong>. Use false to disallow extras or a schema to validate them.\"\r\n },\r\n unevaluatedproperties: {\r\n summary: \"Applies constraints to object properties not yet evaluated.\",\r\n details:\r\n \"<strong>unevaluatedProperties</strong> validates leftover object members after all applicable subschemas are considered. It helps enforce closed shapes with composition.\"\r\n },\r\n propertynames: {\r\n summary: \"Validates each object property name as a string.\",\r\n details:\r\n \"<strong>propertyNames</strong> applies its subschema to every key name in the object. This is useful for naming rules such as patterns or length limits on keys.\"\r\n },\r\n minproperties: {\r\n summary: \"Sets the minimum number of object properties.\",\r\n details:\r\n \"<strong>minProperties</strong> requires objects to contain at least this many <strong>properties</strong>. It is ignored for non-object instances.\"\r\n },\r\n maxproperties: {\r\n summary: \"Sets the maximum number of object properties.\",\r\n details:\r\n \"<strong>maxProperties</strong> requires objects to contain no more than this many <strong>properties</strong>. It is ignored for non-object instances.\"\r\n },\r\n dependentrequired: {\r\n summary: \"Requires additional properties when a property is present.\",\r\n details:\r\n \"<strong>dependentRequired</strong> maps a property name to a list of peer <strong>properties</strong> that must also exist whenever that property appears.\"\r\n },\r\n dependentschemas: {\r\n summary: \"Applies additional schema rules when a property is present.\",\r\n details:\r\n \"<strong>dependentSchemas</strong> maps a property name to a subschema. <strong>If</strong> that property exists in the instance object, the entire object must satisfy the mapped schema.\"\r\n },\r\n patternproperties: {\r\n summary: \"Applies schemas to object properties that match regex keys.\",\r\n details:\r\n \"<strong>patternProperties</strong> uses regular-expression keys to target groups of property names. Matching <strong>properties</strong> are validated by the associated subschema.\"\r\n },\r\n items: {\r\n summary: \"Defines the schema for array elements after tuple positions.\",\r\n details:\r\n \"In 2020-12, <strong>items</strong> applies to array elements <strong>not</strong> covered by <strong>prefixItems</strong>. Set a schema to validate trailing elements, or false to disallow them.\"\r\n },\r\n prefixitems: {\r\n summary: \"Defines positional schemas for tuple-style arrays.\",\r\n details:\r\n \"<strong>prefixItems</strong> is an ordered list of schemas, each applied to the array element at the same index. It models fixed-position tuple structures.\"\r\n },\r\n minitems: {\r\n summary: \"Sets the minimum number of items in an array.\",\r\n details:\r\n \"<strong>minItems</strong> requires arrays to contain at least this many elements. It is ignored for non-array instances.\"\r\n },\r\n maxitems: {\r\n summary: \"Sets the maximum number of items in an array.\",\r\n details:\r\n \"<strong>maxItems</strong> requires arrays to contain no more than this many elements. It is ignored for non-array instances.\"\r\n },\r\n uniqueitems: {\r\n summary: \"Requires all array items to be pairwise unique.\",\r\n details:\r\n \"When <strong>uniqueItems</strong> is true, no two <strong>items</strong> in the array may be deeply equal. It enforces set-like semantics for arrays.\"\r\n },\r\n contains: {\r\n summary: \"Requires at least one array item to match a subschema.\",\r\n details:\r\n \"<strong>contains</strong> checks array elements against a subschema and succeeds when enough matches are found. Combine with <strong>minContains</strong> and <strong>maxContains</strong> for match counts.\"\r\n },\r\n mincontains: {\r\n summary: \"Sets the minimum number of contains matches.\",\r\n details:\r\n \"<strong>minContains</strong> works with <strong>contains</strong> and requires at least this many matching elements. It is ignored when <strong>contains</strong> is absent.\"\r\n },\r\n maxcontains: {\r\n summary: \"Sets the maximum number of contains matches.\",\r\n details:\r\n \"<strong>maxContains</strong> works with <strong>contains</strong> and requires no more than this many matching elements. It is ignored when <strong>contains</strong> is absent.\"\r\n },\r\n unevaluateditems: {\r\n summary: \"Applies constraints to array items not yet evaluated.\",\r\n details:\r\n \"<strong>unevaluatedItems</strong> validates leftover array elements after <strong>prefixItems</strong>, <strong>items</strong>, <strong>contains</strong>, and composed schemas are processed.\"\r\n },\r\n allof: {\r\n summary: \"Requires the instance to satisfy every listed subschema.\",\r\n details:\r\n \"<strong>allOf</strong> composes schemas with logical AND behavior. The instance is valid only <strong>if</strong> it passes all subschemas in the array.\"\r\n },\r\n anyof: {\r\n summary: \"Requires the instance to satisfy at least one subschema.\",\r\n details:\r\n \"<strong>anyOf</strong> composes schemas with logical OR behavior. The instance is valid when one or more listed subschemas validate.\"\r\n },\r\n oneof: {\r\n summary: \"Requires the instance to satisfy exactly one subschema.\",\r\n details:\r\n \"<strong>oneOf</strong> succeeds only when exactly one subschema validates. It is useful for mutually exclusive alternatives.\"\r\n },\r\n not: {\r\n summary: \"Requires the instance to fail a given subschema.\",\r\n details:\r\n \"<strong>not</strong> inverts schema logic. The instance is valid only when it does <strong>not</strong> validate against the <strong>not</strong> subschema.\"\r\n },\r\n if: {\r\n summary: \"Defines the condition used by conditional schemas.\",\r\n details:\r\n \"<strong>if</strong> applies a subschema test. When it passes, <strong>then</strong> is applied; when it fails, <strong>else</strong> is applied, <strong>if</strong> those branches are present.\"\r\n },\r\n then: {\r\n summary: \"Applies extra constraints when if succeeds.\",\r\n details:\r\n \"<strong>then</strong> is evaluated only when the <strong>if</strong> subschema validates. Use it to enforce rules that should hold under a matching condition.\"\r\n },\r\n else: {\r\n summary: \"Applies extra constraints when if fails.\",\r\n details:\r\n \"<strong>else</strong> is evaluated only when the <strong>if</strong> subschema does <strong>not</strong> validate. Use it as the alternate branch of conditional validation.\"\r\n }\r\n};\r\n\r\nconst FIELD_HELP_LONG_DETAILS: Record<string, string> = {\r\n \"$id\": \"The <strong>$id</strong> keyword establishes the canonical URI for a schema resource, which becomes the base for relative references and nested identifiers. In draft 2020-12, stable and absolute identifiers make schema reuse, bundling, and external referencing significantly more predictable across tools.\",\r\n \"$schema\": \"The <strong>$schema</strong> keyword declares the dialect and meta-schema that define keyword behavior for this document. Declaring this explicitly helps validators select correct semantics and avoids ambiguity when multiple drafts are supported.\",\r\n \"$ref\": \"The <strong>$ref</strong> keyword replaces local constraints with the referenced schema target, enabling modular schema design and reuse. In 2020-12, references participate in dynamic resolution rules and should be treated as schema application rather than a textual include.\",\r\n type: \"The <strong>type</strong> keyword constrains instance types and is often the first line of validation structure for a field. In 2020-12, <strong>type</strong> can be a single value or an array of values to express unions, and other assertion keywords should align with the allowed types.\",\r\n title: \"The <strong>title</strong> keyword is an annotation intended for human-facing tools such as documentation and generated forms. While it does <strong>not</strong> influence pass/fail validation, it is important for readability and schema maintainability.\",\r\n description: \"The <strong>description</strong> keyword provides richer human guidance about expected data semantics and usage context. It is annotation-only, so it should be used to improve comprehension without being relied on for enforcement.\",\r\n deprecated: \"The <strong>deprecated</strong> keyword communicates that a field or value path is still accepted but should be phased out. This is particularly useful for compatibility windows and migration planning in APIs and event schemas.\",\r\n readonly: \"The <strong>readOnly</strong> keyword is an annotation that indicates values are intended to be supplied by producers and <strong>not</strong> edited by consumers. It is commonly interpreted by UI and API tooling even though it is <strong>not</strong> a direct validation assertion.\",\r\n writeonly: \"The <strong>writeOnly</strong> keyword is an annotation indicating values are intended for input but should <strong>not</strong> be returned in output contexts. It is often used for secrets, credentials, and transient request-only fields.\",\r\n examples: \"The <strong>examples</strong> keyword provides non-normative sample instances that help humans and tools understand expected values. These <strong>examples</strong> are documentation aids and are <strong>not</strong> <strong>required</strong> to be validated as constraints by implementations.\",\r\n default: \"The <strong>default</strong> keyword suggests a value that may be used when an instance omits the field. Because JSON Schema does <strong>not</strong> mandate <strong>default</strong> assignment behavior, producers should treat it as guidance rather than implicit mutation.\",\r\n const: \"The <strong>const</strong> keyword enforces exact deep-equality with one specific JSON value, including <strong>type</strong> and structure. It is useful when a discriminator or fixed contract token must always remain constant.\",\r\n enum: \"The <strong>enum</strong> keyword constrains the instance to one of a finite set of values compared by JSON deep-equality. This is ideal for controlled vocabularies and closed option sets across both primitive and structured values.\",\r\n minlength: \"The <strong>minLength</strong> keyword applies only to strings and sets a lower bound measured in Unicode code points. It should be paired thoughtfully with <strong>maxLength</strong> when defining bounded text fields.\",\r\n maxlength: \"The <strong>maxLength</strong> keyword applies only to strings and sets an upper bound measured in Unicode code points. This protects payload size and supports UI, storage, and transport constraints.\",\r\n pattern: \"The <strong>pattern</strong> keyword applies an ECMA-262 regular expression to string instances, succeeding when a match is found. Patterns are <strong>not</strong> implicitly anchored, so use explicit anchors when full-string matching is <strong>required</strong>.\",\r\n format: \"The <strong>format</strong> keyword conveys semantic expectations such as email, URI, hostname, or date-time. In 2020-12, <strong>format</strong> behavior depends on implementation configuration and may be annotation-only unless assertions are enabled.\",\r\n minimum: \"The <strong>minimum</strong> keyword sets an inclusive numeric lower bound and applies to number and integer instances. Use this when a boundary value itself is valid and should be accepted.\",\r\n maximum: \"The <strong>maximum</strong> keyword sets an inclusive numeric upper bound and applies to number and integer instances. Use this when the boundary value itself should remain valid.\",\r\n multipleof: \"The <strong>multipleOf</strong> keyword requires numeric values to divide evenly by a positive divisor. This is commonly used to enforce precision steps, measurement increments, and monetary granularity.\",\r\n exclusiveminimum: \"The <strong>exclusiveMinimum</strong> keyword defines a strict numeric boundary where values must be greater than the threshold. It is appropriate when an endpoint must be excluded from valid input.\",\r\n exclusivemaximum: \"The <strong>exclusiveMaximum</strong> keyword defines a strict numeric boundary where values must be less than the threshold. It is useful for open upper intervals and strict cap behavior.\",\r\n properties: \"The <strong>properties</strong> keyword maps specific object member names to subschemas that validate corresponding member values. It only applies when those named members are present and does <strong>not</strong> by itself require their presence.\",\r\n required: \"The <strong>required</strong> keyword lists object property names that must exist on an instance object. Presence is enforced independently from value constraints, which are validated by associated subschemas.\",\r\n additionalproperties: \"The <strong>additionalProperties</strong> keyword controls validation for object members <strong>not</strong> matched by <strong>properties</strong> or <strong>patternProperties</strong>. In strict object designs, setting this to false prevents unrecognized keys from passing.\",\r\n unevaluatedproperties: \"The <strong>unevaluatedProperties</strong> keyword applies after other applicators and targets object members that remain unevaluated. This makes it especially powerful with composition keywords when enforcing closed-world object shapes.\",\r\n propertynames: \"The <strong>propertyNames</strong> keyword validates each object key string against a subschema, independent of corresponding values. It is useful for naming conventions, prefix rules, and machine-generated key constraints.\",\r\n minproperties: \"The <strong>minProperties</strong> keyword sets the <strong>minimum</strong> count of key/value pairs <strong>required</strong> in an object instance. It supports cardinality rules independent from which exact <strong>properties</strong> are <strong>required</strong>.\",\r\n maxproperties: \"The <strong>maxProperties</strong> keyword sets the <strong>maximum</strong> count of key/value pairs permitted in an object instance. This can prevent over-populated objects and constrain dynamic key scenarios.\",\r\n dependentrequired: \"The <strong>dependentRequired</strong> keyword expresses conditional presence dependencies between object <strong>properties</strong>. When one property appears, a configured list of sibling <strong>properties</strong> must also be present.\",\r\n dependentschemas: \"The <strong>dependentSchemas</strong> keyword applies whole-object subschemas when specific trigger <strong>properties</strong> are present. It enables conditional object validation patterns that go beyond simple <strong>required</strong> lists.\",\r\n patternproperties: \"The <strong>patternProperties</strong> keyword assigns subschemas to regex-based key groups, allowing families of similarly named members to share validation rules. Multiple regexes may apply to the same property name.\",\r\n items: \"In draft 2020-12, <strong>items</strong> applies to array positions <strong>not</strong> covered by <strong>prefixItems</strong> and therefore governs trailing elements. This separates tuple-prefix constraints from the schema for remaining array entries.\",\r\n prefixitems: \"The <strong>prefixItems</strong> keyword defines positional schemas for tuple-like arrays where each index has a distinct rule. It is evaluated in order and is foundational for fixed-structure array contracts.\",\r\n minitems: \"The <strong>minItems</strong> keyword sets the <strong>minimum</strong> number of elements <strong>required</strong> in an array instance. It is commonly combined with <strong>contains</strong> or tuple rules to ensure baseline completeness.\",\r\n maxitems: \"The <strong>maxItems</strong> keyword sets the <strong>maximum</strong> number of elements permitted in an array instance. It is useful for preventing oversized arrays and bounding processing cost.\",\r\n uniqueitems: \"When <strong>uniqueItems</strong> is true, every pair of array elements must be unequal under deep JSON comparison. This enforces set-like semantics, including for objects and arrays.\",\r\n contains: \"The <strong>contains</strong> keyword requires array instances to include elements matching a given subschema. In 2020-12, it can be further quantified with <strong>minContains</strong> and <strong>maxContains</strong> to constrain match counts.\",\r\n mincontains: \"The <strong>minContains</strong> keyword defines the <strong>minimum</strong> number of elements that must satisfy the <strong>contains</strong> subschema. It is ignored when <strong>contains</strong> is absent and should be configured alongside <strong>contains</strong>.\",\r\n maxcontains: \"The <strong>maxContains</strong> keyword defines the <strong>maximum</strong> number of elements that may satisfy the <strong>contains</strong> subschema. It is ignored when <strong>contains</strong> is absent and helps bound matching frequency.\",\r\n unevaluateditems: \"The <strong>unevaluatedItems</strong> keyword applies to array elements <strong>not</strong> already evaluated by <strong>prefixItems</strong>, <strong>items</strong>, <strong>contains</strong>, or composed branches. It is valuable for enforcing tight post-composition array contracts.\",\r\n allof: \"The <strong>allOf</strong> keyword requires the instance to satisfy every subschema in the array, equivalent to logical conjunction. It is useful for composing orthogonal constraints into a single effective schema.\",\r\n anyof: \"The <strong>anyOf</strong> keyword requires at least one subschema to validate, equivalent to logical disjunction. It is suitable for permissive alternatives where overlaps are acceptable.\",\r\n oneof: \"The <strong>oneOf</strong> keyword requires exactly one subschema to validate, making it stricter than <strong>anyOf</strong>. It is commonly used for tagged union designs where alternatives should be mutually exclusive.\",\r\n not: \"The <strong>not</strong> keyword inverts validation for its subschema and passes only when the subschema fails. It is useful for exclusion constraints and disallowing problematic shapes.\",\r\n if: \"The <strong>if</strong> keyword defines a predicate subschema used to choose conditional branches. Its result controls whether <strong>then</strong> or <strong>else</strong> is evaluated when those keywords are present.\",\r\n then: \"The <strong>then</strong> keyword is applied only when <strong>if</strong> succeeds, allowing additional constraints in the true branch. It is often paired with discriminators and property dependencies.\",\r\n else: \"The <strong>else</strong> keyword is applied only when <strong>if</strong> fails, providing alternate constraints for the false branch. Together with <strong>if</strong>/<strong>then</strong>, it forms full conditional validation flow in a single schema node.\"\r\n};\r\n\r\nconst FIELD_HELP_LINKS: Record<string, string> = {\r\n \"$id\": \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-id-keyword\",\r\n \"$schema\": \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-schema-keyword\",\r\n \"$ref\": \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-ref-keyword\",\r\n type: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-type\",\r\n title: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-title\",\r\n description: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-description\",\r\n deprecated: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-deprecated\",\r\n readonly: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-readonly\",\r\n writeonly: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-writeonly\",\r\n examples: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-examples\",\r\n default: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-default\",\r\n const: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-const\",\r\n enum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-enum\",\r\n minlength: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minlength\",\r\n maxlength: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxlength\",\r\n pattern: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-pattern\",\r\n format: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-format\",\r\n minimum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minimum\",\r\n maximum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maximum\",\r\n multipleof: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-multipleof\",\r\n exclusiveminimum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-exclusiveminimum\",\r\n exclusivemaximum: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-exclusivemaximum\",\r\n properties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-properties\",\r\n required: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-required\",\r\n additionalproperties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-additionalproperties\",\r\n unevaluatedproperties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-unevaluatedproperties\",\r\n propertynames: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-propertynames\",\r\n minproperties: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minproperties\",\r\n maxproperties: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxproperties\",\r\n dependentrequired: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-dependentrequired\",\r\n dependentschemas: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-dependentschemas\",\r\n patternproperties: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-patternproperties\",\r\n items: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-items\",\r\n prefixitems: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-prefixitems\",\r\n minitems: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-minitems\",\r\n maxitems: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxitems\",\r\n uniqueitems: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-uniqueitems\",\r\n contains: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-contains\",\r\n mincontains: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-mincontains\",\r\n maxcontains: \"https://json-schema.org/draft/2020-12/json-schema-validation.html#name-maxcontains\",\r\n unevaluateditems: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-unevaluateditems\",\r\n allof: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-allof\",\r\n anyof: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-anyof\",\r\n oneof: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-oneof\",\r\n not: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-not\",\r\n if: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-if\",\r\n then: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-then\",\r\n else: \"https://json-schema.org/draft/2020-12/json-schema-core.html#name-else\"\r\n};\r\n\r\nconst DEFAULT_HELP_LINK = \"https://json-schema.org/draft/2020-12/\";\r\n\r\nconst FIELD_HELP_CONTENT: Record<string, KeywordHelpDefinition> = Object.fromEntries(\r\n Object.entries(FIELD_HELP_BASE_CONTENT).map(([key, value]) => [\r\n key,\r\n {\r\n ...value,\r\n longDetails:\r\n FIELD_HELP_LONG_DETAILS[key] ??\r\n \"This keyword participates in JSON Schema 2020-12 evaluation and should be configured according to the intended assertion and annotation behavior.\",\r\n link: FIELD_HELP_LINKS[key] ?? DEFAULT_HELP_LINK\r\n }\r\n ])\r\n) as Record<string, KeywordHelpDefinition>;\r\n\r\nfunction normalizeHelpKey(value: string): string {\r\n return value\r\n .trim()\r\n .toLowerCase()\r\n .replace(/\\(.*?\\)/g, \"\")\r\n .replace(/\\s+/g, \"\")\r\n .replace(/[^$a-z0-9]/g, \"\");\r\n}\r\n\r\nfunction resolveHelpDefinition(keywordOrLabel: string): KeywordHelpDefinition {\r\n const normalized = normalizeHelpKey(keywordOrLabel);\r\n\r\n if (normalized === \"types\") {\r\n return FIELD_HELP_CONTENT.type;\r\n }\r\n\r\n if (normalized === \"min\") {\r\n return FIELD_HELP_CONTENT.minimum;\r\n }\r\n\r\n if (normalized === \"max\") {\r\n return FIELD_HELP_CONTENT.maximum;\r\n }\r\n\r\n const direct = FIELD_HELP_CONTENT[normalized];\r\n if (direct) {\r\n return direct;\r\n }\r\n\r\n return {\r\n summary: \"Defines behavior for this schema field.\",\r\n details:\r\n \"This control edits a JSON Schema keyword or related configuration for the current node. Set a value here to shape validation and annotations.\",\r\n longDetails:\r\n \"For exact semantics, check the draft 2020-12 specification section for this keyword and confirm whether your validator treats it as an assertion, annotation, or applicator.\",\r\n link: DEFAULT_HELP_LINK\r\n };\r\n}\r\n\r\ntype SchemaBuilderHelperMatch = {\r\n keyword: string;\r\n keywordLabel: string;\r\n snippet: string;\r\n score: number;\r\n};\r\n\r\ntype SchemaBuilderHelperSourceEntry = {\r\n keyword: string;\r\n keywordLabel: string;\r\n longDetails: string;\r\n};\r\n\r\nconst KEYWORD_DISPLAY_LABELS: Record<string, string> = {\r\n readonly: \"readOnly\",\r\n writeonly: \"writeOnly\",\r\n minlength: \"minLength\",\r\n maxlength: \"maxLength\",\r\n multipleof: \"multipleOf\",\r\n exclusiveminimum: \"exclusiveMinimum\",\r\n exclusivemaximum: \"exclusiveMaximum\",\r\n additionalproperties: \"additionalProperties\",\r\n unevaluatedproperties: \"unevaluatedProperties\",\r\n propertynames: \"propertyNames\",\r\n minproperties: \"minProperties\",\r\n maxproperties: \"maxProperties\",\r\n dependentrequired: \"dependentRequired\",\r\n dependentschemas: \"dependentSchemas\",\r\n patternproperties: \"patternProperties\",\r\n prefixitems: \"prefixItems\",\r\n minitems: \"minItems\",\r\n maxitems: \"maxItems\",\r\n uniqueitems: \"uniqueItems\",\r\n mincontains: \"minContains\",\r\n maxcontains: \"maxContains\",\r\n unevaluateditems: \"unevaluatedItems\",\r\n allof: \"allOf\",\r\n anyof: \"anyOf\",\r\n oneof: \"oneOf\"\r\n};\r\n\r\nfunction stripHtmlMarkup(text: string): string {\r\n return text.replace(/<[^>]+>/g, \"\");\r\n}\r\n\r\nfunction toKeywordDisplayLabel(keyword: string): string {\r\n return KEYWORD_DISPLAY_LABELS[keyword] ?? keyword;\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\nfunction uniqueQueryWords(input: string): string[] {\r\n const words = input\r\n .toLowerCase()\r\n .split(/[^$a-z0-9]+/g)\r\n .filter((word) => word.length > 0);\r\n\r\n return Array.from(new Set(words));\r\n}\r\n\r\nfunction countOccurrences(text: string, query: string): number {\r\n const normalizedText = text.toLowerCase();\r\n const normalizedQuery = query.toLowerCase();\r\n\r\n if (!normalizedQuery) {\r\n return 0;\r\n }\r\n\r\n let count = 0;\r\n let searchIndex = 0;\r\n\r\n while (searchIndex < normalizedText.length) {\r\n const matchIndex = normalizedText.indexOf(normalizedQuery, searchIndex);\r\n if (matchIndex < 0) {\r\n break;\r\n }\r\n\r\n count += 1;\r\n searchIndex = matchIndex + normalizedQuery.length;\r\n }\r\n\r\n return count;\r\n}\r\n\r\nfunction buildSnippet(text: string, words: string[], targetLength = 180): string {\r\n if (text.length <= targetLength) {\r\n return text;\r\n }\r\n\r\n const lowerText = text.toLowerCase();\r\n let bestIndex = -1;\r\n\r\n for (const word of words) {\r\n const index = lowerText.indexOf(word);\r\n if (index >= 0 && (bestIndex === -1 || index < bestIndex)) {\r\n bestIndex = index;\r\n }\r\n }\r\n\r\n const anchor = bestIndex >= 0 ? bestIndex : 0;\r\n const halfWindow = Math.floor(targetLength / 2);\r\n let start = Math.max(0, anchor - halfWindow);\r\n let end = Math.min(text.length, start + targetLength);\r\n\r\n if (end - start < targetLength) {\r\n start = Math.max(0, end - targetLength);\r\n }\r\n\r\n const rawSlice = text.slice(start, end).trim();\r\n const prefix = start > 0 ? \"...\" : \"\";\r\n const suffix = end < text.length ? \"...\" : \"\";\r\n return `${prefix}${rawSlice}${suffix}`;\r\n}\r\n\r\nfunction renderHighlightedSnippet(snippet: string, words: string[]): ReactNode[] {\r\n if (words.length === 0) {\r\n return [snippet];\r\n }\r\n\r\n const pattern = new RegExp(`(${words.map((word) => escapeRegExp(word)).sort((a, b) => b.length - a.length).join(\"|\")})`, \"gi\");\r\n const parts = snippet.split(pattern);\r\n const lowerWords = new Set(words.map((word) => word.toLowerCase()));\r\n\r\n return parts.map((part, index) => {\r\n if (part && lowerWords.has(part.toLowerCase())) {\r\n return <strong key={`snippet-part-${index}`}>{part}</strong>;\r\n }\r\n\r\n return part;\r\n });\r\n}\r\n\r\nfunction resolveHelperContentEntries(helpContent?: SchemaBuilderHelperContent): SchemaBuilderHelperSourceEntry[] {\r\n if (!helpContent) {\r\n return Object.entries(FIELD_HELP_LONG_DETAILS).map(([keyword, longDetails]) => ({\r\n keyword,\r\n keywordLabel: toKeywordDisplayLabel(keyword),\r\n longDetails\r\n }));\r\n }\r\n\r\n const resolved = new Map<string, SchemaBuilderHelperSourceEntry>();\r\n\r\n for (const [rawKey, rawEntry] of Object.entries(helpContent)) {\r\n const keyword = normalizeHelpKey(rawKey);\r\n if (!keyword) {\r\n continue;\r\n }\r\n\r\n const entry: SchemaBuilderHelperContentEntry =\r\n typeof rawEntry === \"string\"\r\n ? { longDetails: rawEntry }\r\n : {\r\n longDetails: rawEntry.longDetails,\r\n label: rawEntry.label\r\n };\r\n\r\n if (!entry.longDetails.trim()) {\r\n continue;\r\n }\r\n\r\n const fallbackLabel = keyword in FIELD_HELP_LONG_DETAILS ? toKeywordDisplayLabel(keyword) : rawKey.trim() || keyword;\r\n const keywordLabel = entry.label?.trim() || fallbackLabel;\r\n resolved.set(keyword, {\r\n keyword,\r\n keywordLabel,\r\n longDetails: entry.longDetails\r\n });\r\n }\r\n\r\n return Array.from(resolved.values());\r\n}\r\n\r\nexport function SchemaBuilderHelper({\r\n debounceMs = 280,\r\n maxResults = 12,\r\n placeholder = \"Type to search schema keyword guidance...\",\r\n initialQuery = \"\",\r\n helpContent\r\n}: SchemaBuilderHelperProps) {\r\n const [query, setQuery] = useState(initialQuery);\r\n const [debouncedQuery, setDebouncedQuery] = useState(initialQuery);\r\n const helperEntries = useMemo(() => resolveHelperContentEntries(helpContent), [helpContent]);\r\n\r\n useEffect(() => {\r\n const handle = window.setTimeout(() => {\r\n setDebouncedQuery(query);\r\n }, debounceMs);\r\n\r\n return () => {\r\n window.clearTimeout(handle);\r\n };\r\n }, [query, debounceMs]);\r\n\r\n const matches = useMemo(() => {\r\n const words = uniqueQueryWords(debouncedQuery);\r\n if (words.length === 0) {\r\n return [] as SchemaBuilderHelperMatch[];\r\n }\r\n\r\n const scored = helperEntries\r\n .map((entry) => {\r\n const plainText = stripHtmlMarkup(entry.longDetails);\r\n const normalized = plainText.toLowerCase();\r\n\r\n let matchedWords = 0;\r\n let weightedHits = 0;\r\n let totalHits = 0;\r\n\r\n for (const word of words) {\r\n const hits = countOccurrences(normalized, word);\r\n if (hits > 0) {\r\n matchedWords += 1;\r\n totalHits += hits;\r\n weightedHits += hits * Math.max(word.length, 1);\r\n }\r\n }\r\n\r\n if (matchedWords === 0) {\r\n return null;\r\n }\r\n\r\n const score = matchedWords * 100 + weightedHits * 10 + totalHits;\r\n return {\r\n keyword: entry.keyword,\r\n keywordLabel: entry.keywordLabel,\r\n snippet: buildSnippet(plainText, words),\r\n score\r\n } as SchemaBuilderHelperMatch;\r\n })\r\n .filter((entry): entry is SchemaBuilderHelperMatch => entry !== null)\r\n .sort((a, b) => b.score - a.score || a.keywordLabel.localeCompare(b.keywordLabel));\r\n\r\n return scored.slice(0, maxResults);\r\n }, [debouncedQuery, helperEntries, maxResults]);\r\n\r\n const highlightWords = useMemo(() => uniqueQueryWords(debouncedQuery), [debouncedQuery]);\r\n\r\n return (\r\n <div className=\"raf-helper-panel\">\r\n <h3 className=\"raf-helper-title\">Keyword Assistant</h3>\r\n <div className=\"raf-helper-subtitle\">Searches keyword guidance in long-form JSON Schema notes.</div>\r\n\r\n <input\r\n className=\"raf-input raf-builder-control\"\r\n type=\"text\"\r\n value={query}\r\n onChange={(event) => setQuery(event.target.value)}\r\n placeholder={placeholder}\r\n aria-label=\"Search SchemaBuilder keyword help\"\r\n />\r\n\r\n <div className=\"raf-helper-results\" role=\"region\" aria-label=\"SchemaBuilder helper results\">\r\n {highlightWords.length === 0 ? (\r\n <div className=\"raf-helper-empty\">Start typing to see matching keyword snippets.</div>\r\n ) : matches.length === 0 ? (\r\n <div className=\"raf-helper-empty\">No matching keyword guidance found.</div>\r\n ) : (\r\n matches.map((match) => (\r\n <article className=\"raf-helper-snippet\" key={match.keyword}>\r\n <header className=\"raf-helper-snippet-keyword\">{match.keywordLabel}</header>\r\n <div className=\"raf-helper-snippet-body\">{renderHighlightedSnippet(match.snippet, highlightWords)}</div>\r\n </article>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport function SchemaBuilder({ schema, domain, onChange }: SchemaBuilderProps) {\r\n const [currentSchema, setCurrentSchema] = useState<JSONSchema>(() => schema ?? createDefaultRootSchema());\r\n const [rawJson, setRawJson] = useState(() => JSON.stringify(schema ?? createDefaultRootSchema(), null, 2));\r\n const [rawJsonError, setRawJsonError] = useState<string | null>(null);\r\n const [activeHelp, setActiveHelp] = useState<ActiveFieldHelp | null>(null);\r\n const onChangeRef = useRef(onChange);\r\n const publishedSchema = useMemo(() => {\r\n const sanitized = sanitizeSchemaForOutput(currentSchema);\r\n return applyDomainToRootId(sanitized, domain);\r\n }, [currentSchema, domain]);\r\n\r\n useEffect(() => {\r\n onChangeRef.current = onChange;\r\n }, [onChange]);\r\n\r\n useEffect(() => {\r\n if (schema) {\r\n setCurrentSchema(cloneSchema(schema));\r\n }\r\n }, [schema]);\r\n\r\n useEffect(() => {\r\n setRawJson(JSON.stringify(currentSchema, null, 2));\r\n const validationErrors = validateSchemaDefinition(publishedSchema);\r\n onChangeRef.current?.(publishedSchema, validationErrors);\r\n }, [currentSchema, publishedSchema]);\r\n\r\n const handleRootChange = (nextSchema: JSONSchema) => {\r\n setCurrentSchema(nextSchema);\r\n };\r\n\r\n const openHelp = useCallback((key: string, label: string, anchor: HelpAnchorRect) => {\r\n setActiveHelp({ key, label, anchor });\r\n }, []);\r\n\r\n const closeHelp = useCallback(() => {\r\n setActiveHelp(null);\r\n }, []);\r\n\r\n const prettySchema = useMemo(() => JSON.stringify(publishedSchema, null, 2), [publishedSchema]);\r\n\r\n return (\r\n <FieldHelpContext.Provider value={{ openHelp }}>\r\n <div className=\"raf-schema-builder\">\r\n <SchemaNodeEditor\r\n schema={currentSchema}\r\n label=\"Root Schema\"\r\n isRoot={true}\r\n domain={domain}\r\n onChange={handleRootChange}\r\n />\r\n\r\n <details className=\"raf-object\">\r\n <summary className=\"raf-object-summary\">Advanced: Edit Full Schema JSON</summary>\r\n <div className=\"raf-object-content\">\r\n <textarea\r\n className=\"raf-textarea\"\r\n value={rawJson}\r\n onChange={(event) => {\r\n const nextText = event.target.value;\r\n setRawJson(nextText);\r\n\r\n try {\r\n const parsed = JSON.parse(nextText) as JSONSchema;\r\n if (!isObject(parsed)) {\r\n const message = \"Schema JSON must be an object.\";\r\n setRawJsonError(message);\r\n onChangeRef.current?.(publishedSchema, [\r\n {\r\n message,\r\n source: \"json-parse\"\r\n }\r\n ]);\r\n return;\r\n }\r\n\r\n setRawJsonError(null);\r\n setCurrentSchema(parsed);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : \"Invalid JSON.\";\r\n setRawJsonError(message);\r\n onChangeRef.current?.(publishedSchema, [\r\n {\r\n message,\r\n source: \"json-parse\"\r\n }\r\n ]);\r\n }\r\n }}\r\n />\r\n {rawJsonError ? <div className=\"raf-error\">{rawJsonError}</div> : null}\r\n </div>\r\n </details>\r\n\r\n <details className=\"raf-object\">\r\n <summary className=\"raf-object-summary\">Preview JSON Schema</summary>\r\n <div className=\"raf-object-content\">\r\n <pre className=\"raf-json-preview\">{prettySchema}</pre>\r\n </div>\r\n </details>\r\n </div>\r\n\r\n <FieldInfoModal activeHelp={activeHelp} onClose={closeHelp} />\r\n </FieldHelpContext.Provider>\r\n );\r\n}\r\n\r\ninterface SchemaNodeEditorProps {\r\n schema: JSONSchema;\r\n label: string;\r\n onChange: (next: JSONSchema) => void;\r\n onRemove?: () => void;\r\n isRoot?: boolean;\r\n domain?: string;\r\n primaryLeadField?: ReactNode;\r\n primaryFollowField?: ReactNode;\r\n showPrimaryTitle?: boolean;\r\n}\r\n\r\nfunction SchemaNodeEditor({\r\n schema,\r\n label,\r\n onChange,\r\n onRemove,\r\n isRoot = false,\r\n domain,\r\n primaryLeadField,\r\n primaryFollowField,\r\n showPrimaryTitle = isRoot\r\n}: SchemaNodeEditorProps) {\r\n const schemaTypes = getSchemaTypes(schema);\r\n const primaryType = schemaTypes.length === 1 ? schemaTypes[0] : undefined;\r\n const hasType = (type: JSONSchemaType) => schemaTypes.includes(type);\r\n const editableRootId = isRoot ? toLocalId(stringOrEmpty(schema.$id), domain) : stringOrEmpty(schema.$id);\r\n const fullRootId = isRoot ? toFullId(editableRootId, domain) : editableRootId;\r\n\r\n return (\r\n <details className=\"raf-object\" open>\r\n <summary className=\"raf-object-summary\">{label}</summary>\r\n <div className=\"raf-object-content\">\r\n <div className=\"raf-builder-grid\">\r\n {primaryLeadField}\r\n {showPrimaryTitle ? (\r\n <TextInput\r\n label=\"Title\"\r\n keyword=\"title\"\r\n value={stringOrEmpty(schema.title)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"title\", value))}\r\n />\r\n ) : null}\r\n\r\n <TypeListEditor\r\n value={schemaTypes}\r\n onChange={(nextTypes) => {\r\n const next = applyTypes(schema, nextTypes);\r\n delete next.const;\r\n delete next.enum;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n {primaryFollowField}\r\n </div>\r\n\r\n {hasType(\"object\") ? <ObjectSchemaEditor schema={schema} onChange={onChange} showAdvancedOptions={false} /> : null}\r\n\r\n <BuilderDisclosureSection title=\"More Details\">\r\n <BuilderDisclosureSection title=\"Documentation & References\" defaultOpen={true}>\r\n\r\n <div className=\"raf-builder-grid\">\r\n {!showPrimaryTitle ? (\r\n <TextInput\r\n label=\"Title\"\r\n keyword=\"title\"\r\n value={stringOrEmpty(schema.title)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"title\", value))}\r\n />\r\n ) : null}\r\n\r\n <TextInput\r\n label=\"$ref\"\r\n keyword=\"$ref\"\r\n value={stringOrEmpty(schema.$ref)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"$ref\", value))}\r\n />\r\n\r\n <TextInput\r\n label=\"$id\"\r\n keyword=\"$id\"\r\n value={editableRootId}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"$id\", isRoot ? toLocalId(value, domain) : value))}\r\n helperText={isRoot && domain ? `Full $id: ${fullRootId || \"(empty)\"}` : undefined}\r\n />\r\n\r\n <TextInput\r\n label=\"$schema\"\r\n keyword=\"$schema\"\r\n value={stringOrEmpty(schema.$schema)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"$schema\", value))}\r\n placeholder={DEFAULT_SCHEMA_URI}\r\n />\r\n </div>\r\n\r\n <TextAreaInput\r\n label=\"Description\"\r\n keyword=\"description\"\r\n value={stringOrEmpty(schema.description)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"description\", value))}\r\n />\r\n </BuilderDisclosureSection>\r\n\r\n <BuilderDisclosureSection title=\"Meta-data\" defaultOpen={true}>\r\n\r\n <div className=\"raf-builder-grid\">\r\n <KeywordCheckbox\r\n label=\"deprecated\"\r\n keyword=\"deprecated\"\r\n checked={schema.deprecated === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.deprecated = true;\r\n } else {\r\n delete next.deprecated;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <KeywordCheckbox\r\n label=\"readOnly\"\r\n keyword=\"readOnly\"\r\n checked={schema.readOnly === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.readOnly = true;\r\n } else {\r\n delete next.readOnly;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <KeywordCheckbox\r\n label=\"writeOnly\"\r\n keyword=\"writeOnly\"\r\n checked={schema.writeOnly === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.writeOnly = true;\r\n } else {\r\n delete next.writeOnly;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"raf-builder-grid\">\r\n <JsonTextInput\r\n label=\"Default (JSON)\"\r\n keyword=\"default\"\r\n value={schema.default}\r\n placeholder='e.g. \"abc\", 42, true, {\"k\":\"v\"}'\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.default;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n onChange({ ...schema, default: parsed });\r\n }}\r\n />\r\n\r\n <JsonTextInput\r\n label=\"examples\"\r\n keyword=\"examples\"\r\n value={schema.examples}\r\n placeholder='e.g. [\"sample\", 1, true]'\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.examples;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n if (!Array.isArray(parsed)) {\r\n return;\r\n }\r\n\r\n onChange({ ...schema, examples: parsed });\r\n }}\r\n />\r\n </div>\r\n </BuilderDisclosureSection>\r\n\r\n <BuilderDisclosureSection title=\"Value Rules\" defaultOpen={true}>\r\n <ConstEditor schema={schema} schemaTypes={schemaTypes} primaryType={primaryType} onChange={onChange} />\r\n <EnumEditor schema={schema} schemaTypes={schemaTypes} primaryType={primaryType} onChange={onChange} />\r\n </BuilderDisclosureSection>\r\n\r\n {hasType(\"string\") ? (\r\n <BuilderDisclosureSection title=\"String Constraints\" defaultOpen={true}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minLength\"\r\n keyword=\"minLength\"\r\n value={numberOrEmpty(schema.minLength)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minLength\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 1\"\r\n />\r\n <TextInput\r\n label=\"maxLength\"\r\n keyword=\"maxLength\"\r\n value={numberOrEmpty(schema.maxLength)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxLength\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 255\"\r\n />\r\n </div>\r\n <TextInput\r\n label=\"Pattern\"\r\n keyword=\"pattern\"\r\n value={stringOrEmpty(schema.pattern)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"pattern\", value))}\r\n placeholder=\"e.g. ^[A-Za-z]+$\"\r\n />\r\n <TypeaheadInput\r\n label=\"format\"\r\n keyword=\"format\"\r\n value={stringOrEmpty(schema.format)}\r\n onChange={(value) => onChange(assignOptionalString(schema, \"format\", value))}\r\n options={AJV_SUPPORTED_FORMATS}\r\n placeholder=\"e.g. email\"\r\n />\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n {hasType(\"number\") || hasType(\"integer\") ? (\r\n <BuilderDisclosureSection title=\"Number Constraints\" defaultOpen={true}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"Min\"\r\n keyword=\"minimum\"\r\n value={numberOrEmpty(schema.minimum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"minimum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"Max\"\r\n keyword=\"maximum\"\r\n value={numberOrEmpty(schema.maximum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"maximum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 100\"\r\n />\r\n </div>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"multipleOf\"\r\n keyword=\"multipleOf\"\r\n value={numberOrEmpty(schema.multipleOf)}\r\n onChange={(value) => onChange(assignOptionalPositiveNumber(schema, \"multipleOf\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 0.5\"\r\n />\r\n <TextInput\r\n label=\"exclusiveMinimum\"\r\n keyword=\"exclusiveMinimum\"\r\n value={numberOrEmpty(schema.exclusiveMinimum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"exclusiveMinimum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"exclusiveMaximum\"\r\n keyword=\"exclusiveMaximum\"\r\n value={numberOrEmpty(schema.exclusiveMaximum)}\r\n onChange={(value) => onChange(assignOptionalNumber(schema, \"exclusiveMaximum\", value))}\r\n type=\"number\"\r\n step=\"any\"\r\n placeholder=\"e.g. 100\"\r\n />\r\n </div>\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n {hasType(\"array\") ? (\r\n <BuilderDisclosureSection title=\"Array Rules\" defaultOpen={true}>\r\n <ArraySchemaEditor schema={schema} onChange={onChange} />\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n {hasType(\"object\") ? (\r\n <BuilderDisclosureSection title=\"Object Rules\" defaultOpen={true}>\r\n <ObjectSchemaAdvancedEditor schema={schema} onChange={onChange} />\r\n </BuilderDisclosureSection>\r\n ) : null}\r\n\r\n <BuilderDisclosureSection title=\"Composition & Conditionals\" defaultOpen={true}>\r\n <div className=\"raf-builder-section-group\">\r\n <CombinationEditor kind=\"allOf\" schema={schema} onChange={onChange} />\r\n <CombinationEditor kind=\"anyOf\" schema={schema} onChange={onChange} />\r\n <CombinationEditor kind=\"oneOf\" schema={schema} onChange={onChange} />\r\n <SingleSchemaEditor kind=\"not\" schema={schema} onChange={onChange} />\r\n <ConditionalSchemaEditor kind=\"if\" schema={schema} onChange={onChange} />\r\n <ConditionalSchemaEditor kind=\"then\" schema={schema} onChange={onChange} />\r\n <ConditionalSchemaEditor kind=\"else\" schema={schema} onChange={onChange} />\r\n </div>\r\n </BuilderDisclosureSection>\r\n </BuilderDisclosureSection>\r\n\r\n {!isRoot && onRemove ? (\r\n <div className=\"raf-button-row\">\r\n <button className=\"raf-button raf-button-danger\" type=\"button\" onClick={onRemove}>\r\n Remove Field\r\n </button>\r\n </div>\r\n ) : null}\r\n </div>\r\n </details>\r\n );\r\n}\r\n\r\nfunction BuilderDisclosureSection({\r\n title,\r\n children,\r\n defaultOpen = false\r\n}: {\r\n title: string;\r\n children: ReactNode;\r\n defaultOpen?: boolean;\r\n}) {\r\n return (\r\n <details className=\"raf-builder-disclosure\" open={defaultOpen}>\r\n <summary className=\"raf-builder-disclosure-summary\">{title}</summary>\r\n <div className=\"raf-builder-disclosure-content\">{children}</div>\r\n </details>\r\n );\r\n}\r\n\r\nfunction ObjectSchemaEditor({\r\n schema,\r\n onChange,\r\n showAdvancedOptions = true\r\n}: {\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n showAdvancedOptions?: boolean;\r\n}) {\r\n const properties = schema.properties ?? {};\r\n const requiredSet = new Set(schema.required ?? []);\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <div className=\"raf-builder-heading-wrap\">\r\n <h4 className=\"raf-builder-heading\">Properties</h4>\r\n <FieldLabel label=\"properties\" keyword=\"properties\" />\r\n </div>\r\n\r\n {Object.entries(properties).map(([propertyName, propertySchema], index) => (\r\n <div className=\"raf-builder-property\" key={index}>\r\n <SchemaNodeEditor\r\n label={`Property: ${propertyName}`}\r\n schema={propertySchema}\r\n showPrimaryTitle={false}\r\n primaryLeadField={\r\n <TextInput\r\n label=\"Property Name\"\r\n keyword=\"properties\"\r\n value={propertyName}\r\n onChange={(nextName) => {\r\n const normalized = nextName.trim();\r\n if (normalized === propertyName) {\r\n return;\r\n }\r\n\r\n if (normalized === \"\") {\r\n const next = cloneSchema(schema);\r\n const objectProperties = { ...(next.properties ?? {}) };\r\n objectProperties[\"\"] = objectProperties[propertyName];\r\n if (propertyName !== \"\") {\r\n delete objectProperties[propertyName];\r\n }\r\n next.properties = objectProperties;\r\n next.required = (next.required ?? []).filter((entry) => entry !== propertyName);\r\n onChange(next);\r\n return;\r\n }\r\n\r\n const next = cloneSchema(schema);\r\n const objectProperties = { ...(next.properties ?? {}) };\r\n\r\n if (objectProperties[normalized]) {\r\n return;\r\n }\r\n\r\n objectProperties[normalized] = objectProperties[propertyName];\r\n delete objectProperties[propertyName];\r\n next.properties = objectProperties;\r\n\r\n const required = new Set(next.required ?? []);\r\n if (required.delete(propertyName)) {\r\n required.add(normalized);\r\n next.required = Array.from(required);\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n }\r\n primaryFollowField={\r\n <KeywordCheckbox\r\n label=\"Required\"\r\n keyword=\"required\"\r\n checked={requiredSet.has(propertyName)}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n const required = new Set(next.required ?? []);\r\n\r\n if (checked) {\r\n required.add(propertyName);\r\n } else {\r\n required.delete(propertyName);\r\n }\r\n\r\n next.required = Array.from(required);\r\n onChange(next);\r\n }}\r\n />\r\n }\r\n onChange={(nextPropertySchema) => {\r\n const next = cloneSchema(schema);\r\n next.properties = { ...(next.properties ?? {}), [propertyName]: nextPropertySchema };\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n const objectProperties = { ...(next.properties ?? {}) };\r\n delete objectProperties[propertyName];\r\n next.properties = objectProperties;\r\n next.required = (next.required ?? []).filter((entry) => entry !== propertyName);\r\n onChange(next);\r\n }}\r\n />\r\n </div>\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-primary raf-builder-add-property\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.properties = { ...(next.properties ?? {}) };\r\n const newKey = createUniquePropertyName(next.properties, \"field\");\r\n next.properties[newKey] = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add Property\r\n </button>\r\n </div>\r\n\r\n {showAdvancedOptions ? <ObjectSchemaAdvancedEditor schema={schema} onChange={onChange} /> : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ObjectSchemaAdvancedEditor({ schema, onChange }: { schema: JSONSchema; onChange: (next: JSONSchema) => void }) {\r\n const dependentRequired = schema.dependentRequired ?? {};\r\n const dependentSchemas = schema.dependentSchemas ?? {};\r\n const patternProperties = schema.patternProperties ?? {};\r\n const additionalPropertiesSchema = isObject(schema.additionalProperties)\r\n ? (schema.additionalProperties as JSONSchema)\r\n : undefined;\r\n const additionalPropertiesMode = additionalPropertiesSchema\r\n ? \"subschema\"\r\n : schema.additionalProperties === false\r\n ? \"false\"\r\n : \"true\";\r\n const propertyNamesSchema = isObject(schema.propertyNames) ? (schema.propertyNames as JSONSchema) : undefined;\r\n const unevaluatedPropertiesSchema = isObject(schema.unevaluatedProperties)\r\n ? (schema.unevaluatedProperties as JSONSchema)\r\n : undefined;\r\n\r\n return (\r\n <>\r\n\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minProperties\"\r\n keyword=\"minProperties\"\r\n value={numberOrEmpty(schema.minProperties)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minProperties\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"maxProperties\"\r\n keyword=\"maxProperties\"\r\n value={numberOrEmpty(schema.maxProperties)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxProperties\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 10\"\r\n />\r\n </div>\r\n\r\n <SelectInput\r\n label=\"additionalProperties\"\r\n keyword=\"additionalProperties\"\r\n value={additionalPropertiesMode}\r\n onChange={(value) => {\r\n const next = cloneSchema(schema);\r\n\r\n if (value === \"subschema\") {\r\n next.additionalProperties = isObject(next.additionalProperties)\r\n ? (next.additionalProperties as JSONSchema)\r\n : { type: \"string\" };\r\n } else if (value === \"false\") {\r\n next.additionalProperties = false;\r\n } else {\r\n next.additionalProperties = true;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n options={[\r\n { value: \"true\", label: \"True\" },\r\n { value: \"false\", label: \"False\" },\r\n { value: \"subschema\", label: \"Sub-schema\" }\r\n ]}\r\n />\r\n\r\n {additionalPropertiesSchema ? (\r\n <SchemaNodeEditor\r\n label=\"additionalProperties\"\r\n schema={additionalPropertiesSchema}\r\n onChange={(nextAdditionalPropertiesSchema) => {\r\n const next = cloneSchema(schema);\r\n next.additionalProperties = nextAdditionalPropertiesSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n next.additionalProperties = true;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label=\"unevaluatedProperties\" keyword=\"unevaluatedProperties\" labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!unevaluatedPropertiesSchema ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedProperties = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add unevaluatedProperties\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedProperties;\r\n onChange(next);\r\n }}\r\n >\r\n Clear unevaluatedProperties\r\n </button>\r\n )}\r\n </div>\r\n\r\n {unevaluatedPropertiesSchema ? (\r\n <SchemaNodeEditor\r\n label=\"unevaluatedProperties\"\r\n schema={unevaluatedPropertiesSchema}\r\n onChange={(nextUnevaluatedPropertiesSchema) => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedProperties = nextUnevaluatedPropertiesSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedProperties;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label=\"propertyNames\" keyword=\"propertyNames\" labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!propertyNamesSchema ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.propertyNames = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add propertyNames\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.propertyNames;\r\n onChange(next);\r\n }}\r\n >\r\n Clear propertyNames\r\n </button>\r\n )}\r\n </div>\r\n\r\n {propertyNamesSchema ? (\r\n <SchemaNodeEditor\r\n label=\"propertyNames\"\r\n schema={propertyNamesSchema}\r\n onChange={(nextPropertyNamesSchema) => {\r\n const next = cloneSchema(schema);\r\n next.propertyNames = nextPropertyNamesSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next.propertyNames;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label=\"dependentRequired\" keyword=\"dependentRequired\" labelType=\"heading\" />\r\n {Object.entries(dependentRequired).map(([propertyName, dependencies], index) => {\r\n const serializedDependencies = Array.isArray(dependencies) ? dependencies.join(\", \") : \"\";\r\n\r\n return (\r\n <div className=\"raf-builder-property\" key={`dependent-required-${index}`}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"Dependent Property\"\r\n keyword=\"dependentRequired\"\r\n value={propertyName}\r\n onChange={(nextName) => {\r\n const normalized = nextName.trim();\r\n if (normalized === propertyName) {\r\n return;\r\n }\r\n\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n const existingValue = nextEntries[propertyName] ?? [];\r\n\r\n if (normalized === \"\") {\r\n delete nextEntries[propertyName];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n return;\r\n }\r\n\r\n if (Object.prototype.hasOwnProperty.call(nextEntries, normalized)) {\r\n return;\r\n }\r\n\r\n nextEntries[normalized] = Array.isArray(existingValue) ? existingValue : [];\r\n delete nextEntries[propertyName];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n />\r\n <TextInput\r\n label=\"Required Properties (comma-separated)\"\r\n keyword=\"dependentRequired\"\r\n value={serializedDependencies}\r\n onChange={(nextValue) => {\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n nextEntries[propertyName] = parseCommaSeparatedStrings(nextValue);\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n />\r\n </div>\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n delete nextEntries[propertyName];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n >\r\n Remove dependentRequired Entry\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const nextEntries = { ...(next.dependentRequired ?? {}) };\r\n const newKey = createUniqueEntryName(nextEntries, \"field\");\r\n nextEntries[newKey] = [];\r\n next.dependentRequired = nextEntries;\r\n onChange(next);\r\n }}\r\n >\r\n Add dependentRequired Entry\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <SchemaMapEditor\r\n title=\"dependentSchemas\"\r\n addButtonLabel=\"Add dependentSchemas Entry\"\r\n removeButtonLabel=\"Remove dependentSchemas Entry\"\r\n schemaMap={dependentSchemas}\r\n defaultSchemaFactory={() => ({ type: \"object\", properties: {} })}\r\n onChange={(nextMap) => {\r\n const next = cloneSchema(schema);\r\n next.dependentSchemas = nextMap;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <SchemaMapEditor\r\n title=\"patternProperties\"\r\n addButtonLabel=\"Add patternProperties Entry\"\r\n removeButtonLabel=\"Remove patternProperties Entry\"\r\n schemaMap={patternProperties}\r\n defaultSchemaFactory={() => ({ type: \"string\" })}\r\n onChange={(nextMap) => {\r\n const next = cloneSchema(schema);\r\n next.patternProperties = nextMap;\r\n onChange(next);\r\n }}\r\n />\r\n </>\r\n );\r\n}\r\n\r\nfunction ArraySchemaEditor({ schema, onChange }: { schema: JSONSchema; onChange: (next: JSONSchema) => void }) {\r\n const tupleItems = Array.isArray(schema.prefixItems)\r\n ? schema.prefixItems\r\n : Array.isArray(schema.items)\r\n ? schema.items\r\n : undefined;\r\n const items = !Array.isArray(schema.items) && isObject(schema.items) ? schema.items : undefined;\r\n const hasContains = isObject(schema.contains);\r\n const unevaluatedItemsSchema = isObject(schema.unevaluatedItems)\r\n ? (schema.unevaluatedItems as JSONSchema)\r\n : undefined;\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n {tupleItems ? (\r\n <>\r\n <h4 className=\"raf-builder-heading\">Array Items (Tuple)</h4>\r\n <FieldLabel label=\"prefixItems\" keyword=\"prefixItems\" />\r\n {tupleItems.map((itemSchema, index) => (\r\n <SchemaNodeEditor\r\n key={`tuple-item-${index}`}\r\n label={`Tuple Item ${index + 1}`}\r\n schema={itemSchema}\r\n onChange={(nextItemSchema) => {\r\n const next = cloneSchema(schema);\r\n const nextItems = Array.isArray(next.prefixItems)\r\n ? [...next.prefixItems]\r\n : Array.isArray(next.items)\r\n ? [...next.items]\r\n : [];\r\n nextItems[index] = nextItemSchema;\r\n next.prefixItems = nextItems;\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n const nextItems = Array.isArray(next.prefixItems)\r\n ? [...next.prefixItems]\r\n : Array.isArray(next.items)\r\n ? [...next.items]\r\n : [];\r\n nextItems.splice(index, 1);\r\n next.prefixItems = nextItems;\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n />\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const nextItems = Array.isArray(next.prefixItems)\r\n ? [...next.prefixItems]\r\n : Array.isArray(next.items)\r\n ? [...next.items]\r\n : [];\r\n nextItems.push({ type: \"string\" });\r\n next.prefixItems = nextItems;\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n >\r\n Add Tuple Item Schema\r\n </button>\r\n </div>\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.items = { type: \"string\" };\r\n delete next.prefixItems;\r\n onChange(next);\r\n }}\r\n >\r\n Switch To Single Items Schema\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <h4 className=\"raf-builder-heading\">Array Items</h4>\r\n <FieldLabel label=\"items\" keyword=\"items\" />\r\n\r\n <SchemaNodeEditor\r\n label=\"Items Schema\"\r\n schema={isObject(items) ? (items as JSONSchema) : { type: \"string\" }}\r\n onChange={(nextItemsSchema) => {\r\n const next = cloneSchema(schema);\r\n next.items = nextItemsSchema;\r\n delete next.prefixItems;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.prefixItems = [{ type: \"string\" }];\r\n next.items = false;\r\n onChange(next);\r\n }}\r\n >\r\n Switch To Tuple Items\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n <h4 className=\"raf-builder-heading\">Array Constraints</h4>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minItems\"\r\n keyword=\"minItems\"\r\n value={numberOrEmpty(schema.minItems)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minItems\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 0\"\r\n />\r\n <TextInput\r\n label=\"maxItems\"\r\n keyword=\"maxItems\"\r\n value={numberOrEmpty(schema.maxItems)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxItems\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 10\"\r\n />\r\n </div>\r\n\r\n <KeywordCheckbox\r\n label=\"uniqueItems\"\r\n keyword=\"uniqueItems\"\r\n checked={Boolean(schema.uniqueItems)}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n if (checked) {\r\n next.uniqueItems = true;\r\n } else {\r\n delete next.uniqueItems;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <div className=\"raf-button-row\">\r\n {!hasContains ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.contains = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add contains\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.contains;\r\n delete next.minContains;\r\n delete next.maxContains;\r\n onChange(next);\r\n }}\r\n >\r\n Remove contains\r\n </button>\r\n )}\r\n </div>\r\n\r\n {hasContains ? (\r\n <>\r\n <SchemaNodeEditor\r\n label=\"contains\"\r\n schema={schema.contains as JSONSchema}\r\n onChange={(nextContainsSchema) => {\r\n const next = cloneSchema(schema);\r\n next.contains = nextContainsSchema;\r\n onChange(next);\r\n }}\r\n />\r\n\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label=\"minContains\"\r\n keyword=\"minContains\"\r\n value={numberOrEmpty(schema.minContains)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"minContains\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 1\"\r\n />\r\n <TextInput\r\n label=\"maxContains\"\r\n keyword=\"maxContains\"\r\n value={numberOrEmpty(schema.maxContains)}\r\n onChange={(value) => onChange(assignOptionalInteger(schema, \"maxContains\", value))}\r\n type=\"number\"\r\n step=\"1\"\r\n placeholder=\"e.g. 3\"\r\n />\r\n </div>\r\n </>\r\n ) : null}\r\n\r\n <div className=\"raf-button-row\">\r\n {!unevaluatedItemsSchema ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedItems = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add unevaluatedItems\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedItems;\r\n onChange(next);\r\n }}\r\n >\r\n Clear unevaluatedItems\r\n </button>\r\n )}\r\n </div>\r\n\r\n {unevaluatedItemsSchema ? (\r\n <SchemaNodeEditor\r\n label=\"unevaluatedItems\"\r\n schema={unevaluatedItemsSchema}\r\n onChange={(nextUnevaluatedItemsSchema) => {\r\n const next = cloneSchema(schema);\r\n next.unevaluatedItems = nextUnevaluatedItemsSchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next.unevaluatedItems;\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CombinationEditor({\r\n kind,\r\n schema,\r\n onChange\r\n}: {\r\n kind: SchemaCombinationKey;\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n const entries = (Array.isArray(schema[kind]) ? schema[kind] : []) as JSONSchema[];\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={kind} keyword={kind} labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {entries.length > 0 ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n >\r\n Clear {kind}\r\n </button>\r\n ) : null}\r\n </div>\r\n\r\n {entries.map((entrySchema, index) => (\r\n <SchemaNodeEditor\r\n key={`${kind}-${index}`}\r\n label={`${kind}[${index}]`}\r\n schema={entrySchema}\r\n onChange={(nextEntrySchema) => {\r\n const next = cloneSchema(schema);\r\n const currentEntries = (Array.isArray(next[kind]) ? next[kind] : []) as JSONSchema[];\r\n currentEntries[index] = nextEntrySchema;\r\n next[kind] = currentEntries;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n const currentEntries = (Array.isArray(next[kind]) ? next[kind] : []) as JSONSchema[];\r\n currentEntries.splice(index, 1);\r\n next[kind] = currentEntries;\r\n onChange(next);\r\n }}\r\n />\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n const currentEntries = (Array.isArray(next[kind]) ? next[kind] : []) as JSONSchema[];\r\n next[kind] = [...currentEntries, { type: \"string\" }];\r\n onChange(next);\r\n }}\r\n >\r\n Add {kind} Entry\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction ConditionalSchemaEditor({\r\n kind,\r\n schema,\r\n onChange\r\n}: {\r\n kind: SchemaConditionalKey;\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n const entry = isObject(schema[kind]) ? (schema[kind] as JSONSchema) : undefined;\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={kind} keyword={kind} labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!entry ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next[kind] = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add {kind}\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n >\r\n Clear {kind}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {entry ? (\r\n <SchemaNodeEditor\r\n label={kind}\r\n schema={entry}\r\n onChange={(nextEntrySchema) => {\r\n const next = cloneSchema(schema);\r\n next[kind] = nextEntrySchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SingleSchemaEditor({\r\n kind,\r\n schema,\r\n onChange\r\n}: {\r\n kind: \"not\";\r\n schema: JSONSchema;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n const entry = isObject(schema[kind]) ? (schema[kind] as JSONSchema) : undefined;\r\n\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={kind} keyword={kind} labelType=\"heading\" />\r\n\r\n <div className=\"raf-button-row\">\r\n {!entry ? (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n next[kind] = { type: \"string\" };\r\n onChange(next);\r\n }}\r\n >\r\n Add {kind}\r\n </button>\r\n ) : (\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n >\r\n Clear {kind}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {entry ? (\r\n <SchemaNodeEditor\r\n label={kind}\r\n schema={entry}\r\n onChange={(nextEntrySchema) => {\r\n const next = cloneSchema(schema);\r\n next[kind] = nextEntrySchema;\r\n onChange(next);\r\n }}\r\n onRemove={() => {\r\n const next = cloneSchema(schema);\r\n delete next[kind];\r\n onChange(next);\r\n }}\r\n />\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nfunction SchemaMapEditor({\r\n title,\r\n addButtonLabel,\r\n removeButtonLabel,\r\n schemaMap,\r\n defaultSchemaFactory,\r\n onChange\r\n}: {\r\n title: string;\r\n addButtonLabel: string;\r\n removeButtonLabel: string;\r\n schemaMap: Record<string, JSONSchema>;\r\n defaultSchemaFactory: () => JSONSchema;\r\n onChange: (nextMap: Record<string, JSONSchema>) => void;\r\n}) {\r\n return (\r\n <div className=\"raf-builder-block\">\r\n <FieldLabel label={title} keyword={title} labelType=\"heading\" />\r\n\r\n {Object.entries(schemaMap).map(([entryName, entrySchema], index) => (\r\n <div className=\"raf-builder-property\" key={`${title}-${index}`}>\r\n <div className=\"raf-builder-grid\">\r\n <TextInput\r\n label={`${title} Key`}\r\n keyword={title}\r\n value={entryName}\r\n onChange={(nextName) => {\r\n const normalized = nextName.trim();\r\n if (normalized === entryName || normalized === \"\") {\r\n return;\r\n }\r\n\r\n const nextMap = { ...schemaMap };\r\n if (Object.prototype.hasOwnProperty.call(nextMap, normalized)) {\r\n return;\r\n }\r\n\r\n nextMap[normalized] = nextMap[entryName];\r\n delete nextMap[entryName];\r\n onChange(nextMap);\r\n }}\r\n />\r\n </div>\r\n\r\n <SchemaNodeEditor\r\n label={`${title}[${entryName}]`}\r\n schema={entrySchema}\r\n onChange={(nextEntrySchema) => {\r\n const nextMap = { ...schemaMap, [entryName]: nextEntrySchema };\r\n onChange(nextMap);\r\n }}\r\n onRemove={() => {\r\n const nextMap = { ...schemaMap };\r\n delete nextMap[entryName];\r\n onChange(nextMap);\r\n }}\r\n />\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const nextMap = { ...schemaMap };\r\n delete nextMap[entryName];\r\n onChange(nextMap);\r\n }}\r\n >\r\n {removeButtonLabel}\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n\r\n <div className=\"raf-button-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n const nextMap = { ...schemaMap };\r\n const newKey = createUniqueEntryName(nextMap, \"field\");\r\n nextMap[newKey] = defaultSchemaFactory();\r\n onChange(nextMap);\r\n }}\r\n >\r\n {addButtonLabel}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TypeListEditor({\r\n value,\r\n onChange\r\n}: {\r\n value: JSONSchemaType[];\r\n onChange: (nextTypes: JSONSchemaType[]) => void;\r\n}) {\r\n const availableTypes = FIELD_TYPES.filter((type) => !value.includes(type));\r\n\r\n return (\r\n <div className=\"raf-field\">\r\n <FieldLabel label=\"Types\" keyword=\"type\" />\r\n\r\n {value.map((type, index) => (\r\n <div className=\"raf-button-row raf-type-list-row\" key={`type-${index}`}>\r\n <select\r\n className=\"raf-select raf-builder-control\"\r\n aria-label={`Type ${index + 1}`}\r\n value={type}\r\n onChange={(event) => {\r\n const nextType = event.target.value as JSONSchemaType;\r\n if (nextType === type || value.includes(nextType)) {\r\n return;\r\n }\r\n\r\n const nextTypes = [...value];\r\n nextTypes[index] = nextType;\r\n onChange(nextTypes);\r\n }}\r\n >\r\n {FIELD_TYPES.map((optionType) => (\r\n <option key={optionType} value={optionType}>\r\n {optionType}\r\n </option>\r\n ))}\r\n </select>\r\n\r\n {value.length > 1 ? (\r\n <button\r\n className=\"raf-button raf-button-danger\"\r\n type=\"button\"\r\n onClick={() => {\r\n const nextTypes = value.filter((_, currentIndex) => currentIndex !== index);\r\n onChange(nextTypes);\r\n }}\r\n >\r\n Remove\r\n </button>\r\n ) : null}\r\n </div>\r\n ))}\r\n\r\n <div className=\"raf-button-row raf-type-list-add-row\">\r\n <button\r\n className=\"raf-button raf-button-secondary\"\r\n type=\"button\"\r\n disabled={availableTypes.length === 0}\r\n onClick={() => {\r\n if (availableTypes.length === 0) {\r\n return;\r\n }\r\n\r\n onChange([...value, availableTypes[0]]);\r\n }}\r\n >\r\n Add Type\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFieldHelp() {\r\n return useContext(FieldHelpContext);\r\n}\r\n\r\nfunction FieldLabel({\r\n label,\r\n keyword,\r\n labelType = \"standard\"\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n labelType?: \"standard\" | \"heading\";\r\n}) {\r\n const fieldHelp = useFieldHelp();\r\n const helpKey = keyword ?? label;\r\n const help = resolveHelpDefinition(helpKey);\r\n\r\n return (\r\n <>\r\n <div className=\"raf-field-label-row\">\r\n {labelType === \"heading\" ? <h4 className=\"raf-builder-heading\">{label}</h4> : <span className=\"raf-field-label\">{label}</span>}\r\n <button\r\n className=\"raf-info-button raf-button-secondary\"\r\n type=\"button\"\r\n aria-label={`Info about ${label}`}\r\n onClick={(event) => {\r\n const rect = event.currentTarget.getBoundingClientRect();\r\n fieldHelp?.openHelp(helpKey, label, {\r\n top: rect.top,\r\n left: rect.left,\r\n bottom: rect.bottom,\r\n right: rect.right\r\n });\r\n }}\r\n >\r\n <span className=\"raf-info-icon\" aria-hidden=\"true\">\r\n i\r\n </span>\r\n <span className=\"raf-sr-only\">Info</span>\r\n </button>\r\n </div>\r\n <div className=\"raf-field-summary\">{help.summary}</div>\r\n </>\r\n );\r\n}\r\n\r\nfunction KeywordCheckbox({\r\n label,\r\n keyword,\r\n checked,\r\n onChange\r\n}: {\r\n label: string;\r\n keyword: string;\r\n checked: boolean;\r\n onChange: (checked: boolean) => void;\r\n}) {\r\n return (\r\n <div className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <label className=\"raf-checkbox-row\">\r\n <input\r\n className=\"raf-checkbox\"\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => onChange(event.target.checked)}\r\n />\r\n <span>{label}</span>\r\n </label>\r\n </div>\r\n );\r\n}\r\n\r\nfunction FieldInfoModal({\r\n activeHelp,\r\n onClose\r\n}: {\r\n activeHelp: ActiveFieldHelp | null;\r\n onClose: () => void;\r\n}) {\r\n const modalRef = useRef<HTMLDivElement | null>(null);\r\n const [desktopPosition, setDesktopPosition] = useState<{ top: number; left: number } | null>(null);\r\n const [isMobile, setIsMobile] = useState(false);\r\n\r\n useLayoutEffect(() => {\r\n if (!activeHelp) {\r\n return;\r\n }\r\n\r\n const updatePosition = () => {\r\n const mobile = window.innerWidth <= 760;\r\n setIsMobile(mobile);\r\n\r\n if (mobile) {\r\n setDesktopPosition(null);\r\n return;\r\n }\r\n\r\n const modalMaxWidth = Math.min(480, window.innerWidth - 24);\r\n const modalMaxHeight = Math.floor(window.innerHeight * 0.38);\r\n const desiredLeft = activeHelp.anchor.left;\r\n const desiredTop = activeHelp.anchor.bottom + 8;\r\n const left = Math.max(12, Math.min(desiredLeft, window.innerWidth - modalMaxWidth - 12));\r\n const top = Math.max(12, Math.min(desiredTop, window.innerHeight - modalMaxHeight - 12));\r\n\r\n setDesktopPosition({ top, left });\r\n };\r\n\r\n updatePosition();\r\n window.addEventListener(\"resize\", updatePosition);\r\n\r\n return () => {\r\n window.removeEventListener(\"resize\", updatePosition);\r\n };\r\n }, [activeHelp]);\r\n\r\n useEffect(() => {\r\n if (!activeHelp) {\r\n return;\r\n }\r\n\r\n const closeIfOutside = (event: Event) => {\r\n const target = event.target;\r\n if (!target || !(target instanceof Node)) {\r\n return;\r\n }\r\n\r\n if (modalRef.current?.contains(target)) {\r\n return;\r\n }\r\n\r\n onClose();\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", closeIfOutside, true);\r\n document.addEventListener(\"touchstart\", closeIfOutside, true);\r\n document.addEventListener(\"wheel\", closeIfOutside, true);\r\n document.addEventListener(\"scroll\", closeIfOutside, true);\r\n document.addEventListener(\"keydown\", handleKeyDown);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", closeIfOutside, true);\r\n document.removeEventListener(\"touchstart\", closeIfOutside, true);\r\n document.removeEventListener(\"wheel\", closeIfOutside, true);\r\n document.removeEventListener(\"scroll\", closeIfOutside, true);\r\n document.removeEventListener(\"keydown\", handleKeyDown);\r\n };\r\n }, [activeHelp, onClose]);\r\n\r\n if (!activeHelp) {\r\n return null;\r\n }\r\n\r\n const help = resolveHelpDefinition(activeHelp.key);\r\n\r\n return (\r\n <div className=\"raf-info-layer\" role=\"presentation\" onMouseDown={onClose}>\r\n <div\r\n ref={modalRef}\r\n className={`raf-info-modal${isMobile ? \" raf-info-modal-mobile\" : \"\"}`}\r\n style={!isMobile && desktopPosition ? { top: `${desktopPosition.top}px`, left: `${desktopPosition.left}px` } : undefined}\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n aria-label={`${activeHelp.label} information`}\r\n onMouseDown={(event) => event.stopPropagation()}\r\n >\r\n <div className=\"raf-info-modal-header\">\r\n <strong>{activeHelp.label}</strong>\r\n <button className=\"raf-button raf-button-secondary\" type=\"button\" onClick={onClose}>\r\n Close\r\n </button>\r\n </div>\r\n <div className=\"raf-info-modal-body\">\r\n <a className=\"raf-info-link\" href={help.link} target=\"_blank\" rel=\"noreferrer\">\r\n View {activeHelp.label} in JSON Schema 2020-12\r\n </a>\r\n <p>{parse(help.details)}</p>\r\n <p>{parse(help.longDetails)}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TextInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange,\r\n placeholder,\r\n helperText,\r\n type = \"text\",\r\n step\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n helperText?: string;\r\n type?: string;\r\n step?: string;\r\n}) {\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <input\r\n className=\"raf-input raf-builder-control\"\r\n type={type}\r\n aria-label={label}\r\n value={value}\r\n placeholder={placeholder}\r\n step={step}\r\n onChange={(event) => onChange(event.target.value)}\r\n />\r\n {helperText ? <div className=\"raf-muted\">{helperText}</div> : null}\r\n </label>\r\n );\r\n}\r\n\r\nfunction SelectInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange,\r\n options\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n options: Array<{ value: string; label: string }>;\r\n}) {\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <select className=\"raf-select raf-builder-control\" aria-label={label} value={value} onChange={(event) => onChange(event.target.value)}>\r\n {options.map((option) => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n );\r\n}\r\n\r\nfunction TypeaheadInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange,\r\n options,\r\n placeholder\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n options: readonly string[];\r\n placeholder?: string;\r\n}) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const containerRef = useRef<HTMLLabelElement | null>(null);\r\n const normalizedValue = value.trim().toLowerCase();\r\n const filteredOptions = options.filter((option) =>\r\n normalizedValue === \"\" ? true : option.toLowerCase().startsWith(normalizedValue)\r\n );\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n return;\r\n }\r\n\r\n const handlePointerDown = (event: MouseEvent) => {\r\n if (!containerRef.current?.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handlePointerDown);\r\n return () => document.removeEventListener(\"mousedown\", handlePointerDown);\r\n }, [isOpen]);\r\n\r\n return (\r\n <label className=\"raf-field raf-typeahead\" ref={containerRef}>\r\n <FieldLabel label={label} keyword={keyword} />\r\n <input\r\n className=\"raf-input raf-builder-control\"\r\n type=\"text\"\r\n aria-label={label}\r\n value={value}\r\n placeholder={placeholder}\r\n onFocus={() => setIsOpen(true)}\r\n onClick={() => setIsOpen(true)}\r\n onChange={(event) => {\r\n setIsOpen(true);\r\n onChange(event.target.value);\r\n }}\r\n />\r\n {isOpen && filteredOptions.length > 0 ? (\r\n <div className=\"raf-typeahead-menu\" role=\"listbox\" aria-label={`${label} options`}>\r\n {filteredOptions.map((option) => (\r\n <button\r\n key={option}\r\n className=\"raf-typeahead-option\"\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={value === option}\r\n onMouseDown={(event) => {\r\n event.preventDefault();\r\n onChange(option);\r\n setIsOpen(false);\r\n }}\r\n >\r\n {option}\r\n </button>\r\n ))}\r\n </div>\r\n ) : null}\r\n </label>\r\n );\r\n}\r\n\r\nfunction TextAreaInput({\r\n label,\r\n keyword,\r\n value,\r\n onChange\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: string;\r\n onChange: (value: string) => void;\r\n}) {\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label={label} keyword={keyword} />\r\n <textarea\r\n className=\"raf-textarea raf-builder-control\"\r\n aria-label={label}\r\n value={value}\r\n onChange={(event) => onChange(event.target.value)}\r\n />\r\n </label>\r\n );\r\n}\r\n\r\nfunction JsonTextInput({\r\n label,\r\n keyword,\r\n value,\r\n onValidJson,\r\n onClear,\r\n onInvalidJsonText,\r\n stringValueDisplay = \"json\",\r\n placeholder\r\n}: {\r\n label: string;\r\n keyword?: string;\r\n value: unknown;\r\n onValidJson: (parsed: unknown) => void;\r\n onClear: () => void;\r\n onInvalidJsonText?: (rawText: string) => void;\r\n stringValueDisplay?: \"json\" | \"raw\";\r\n placeholder?: string;\r\n}) {\r\n const serializedValue =\r\n value === undefined\r\n ? \"\"\r\n : stringValueDisplay === \"raw\" && typeof value === \"string\"\r\n ? value\r\n : toInlineJson(value);\r\n const [draftValue, setDraftValue] = useState(serializedValue);\r\n\r\n useEffect(() => {\r\n setDraftValue(serializedValue);\r\n }, [serializedValue]);\r\n\r\n return (\r\n <TextInput\r\n label={label}\r\n keyword={keyword}\r\n value={draftValue}\r\n onChange={(nextText) => {\r\n setDraftValue(nextText);\r\n\r\n if (nextText.trim() === \"\") {\r\n onClear();\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(nextText);\r\n onValidJson(parsed);\r\n } catch {\r\n onInvalidJsonText?.(nextText);\r\n }\r\n }}\r\n placeholder={placeholder}\r\n />\r\n );\r\n}\r\n\r\nfunction ConstEditor({\r\n schema,\r\n schemaTypes,\r\n primaryType,\r\n onChange\r\n}: {\r\n schema: JSONSchema;\r\n schemaTypes: JSONSchemaType[];\r\n primaryType?: JSONSchemaType;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n if (primaryType === \"null\" && schemaTypes.length === 1) {\r\n return null;\r\n }\r\n\r\n const enumValues = Array.isArray(schema.enum) ? schema.enum : undefined;\r\n\r\n if (enumValues && enumValues.length > 0) {\r\n const selectedIndex = enumValues.findIndex((entry) => deepEqual(entry, schema.const));\r\n\r\n return (\r\n <label className=\"raf-field\">\r\n <FieldLabel label=\"Const\" keyword=\"const\" />\r\n <select\r\n className=\"raf-select raf-builder-control\"\r\n aria-label=\"Const\"\r\n value={selectedIndex >= 0 ? String(selectedIndex) : \"\"}\r\n onChange={(event) => {\r\n const indexValue = event.target.value;\r\n const next = cloneSchema(schema);\r\n\r\n if (indexValue === \"\") {\r\n delete next.const;\r\n onChange(next);\r\n return;\r\n }\r\n\r\n const index = Number(indexValue);\r\n if (!Number.isInteger(index) || index < 0 || index >= enumValues.length) {\r\n return;\r\n }\r\n\r\n next.const = cloneSchema(enumValues[index]);\r\n onChange(next);\r\n }}\r\n >\r\n <option value=\"\">None</option>\r\n {enumValues.map((option, index) => (\r\n <option key={`${index}-${String(option)}`} value={String(index)}>\r\n {String(option)}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n );\r\n }\r\n\r\n if (primaryType === \"boolean\") {\r\n return (\r\n <KeywordCheckbox\r\n label=\"Const\"\r\n keyword=\"const\"\r\n checked={schema.const === true}\r\n onChange={(checked) => {\r\n const next = cloneSchema(schema);\r\n next.const = checked;\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (primaryType === \"number\" || primaryType === \"integer\") {\r\n return (\r\n <TextInput\r\n label=\"Const\"\r\n keyword=\"const\"\r\n type=\"number\"\r\n step={primaryType === \"integer\" ? \"1\" : \"any\"}\r\n value={typeof schema.const === \"number\" ? String(schema.const) : \"\"}\r\n placeholder={primaryType === \"integer\" ? \"e.g. 3\" : \"e.g. 3.14\"}\r\n onChange={(value) => {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next.const;\r\n onChange(next);\r\n return;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed)) {\r\n return;\r\n }\r\n\r\n if (primaryType === \"integer\" && !Number.isInteger(parsed)) {\r\n return;\r\n }\r\n\r\n next.const = parsed;\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (primaryType === \"string\") {\r\n return (\r\n <TextInput\r\n label=\"Const\"\r\n keyword=\"const\"\r\n type=\"text\"\r\n value={typeof schema.const === \"string\" ? schema.const : \"\"}\r\n placeholder=\"e.g. fixed-value\"\r\n onChange={(value) => {\r\n const next = cloneSchema(schema);\r\n if (value === \"\") {\r\n delete next.const;\r\n } else {\r\n next.const = value;\r\n }\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (!primaryType) {\r\n return (\r\n <JsonTextInput\r\n label=\"Const\"\r\n keyword=\"const\"\r\n value={schema.const}\r\n stringValueDisplay=\"raw\"\r\n placeholder=\"e.g. A, 2, true, null\"\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n if (!matchesAnySchemaType(parsed, schemaTypes)) {\r\n return;\r\n }\r\n\r\n onChange({ ...schema, const: parsed });\r\n }}\r\n onInvalidJsonText={(rawText) => {\r\n const parsed = parseLooseScalarByTypes(rawText, schemaTypes);\r\n if (parsed === undefined) {\r\n return;\r\n }\r\n\r\n onChange({ ...schema, const: parsed });\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <JsonTextInput\r\n label=\"Const (JSON)\"\r\n keyword=\"const\"\r\n value={schema.const}\r\n placeholder='e.g. \"fixed-value\", 3, true, null, {\"k\":\"v\"}'\r\n onClear={() => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n onChange(next);\r\n }}\r\n onValidJson={(parsed) => {\r\n onChange({ ...schema, const: parsed });\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction EnumEditor({\r\n schema,\r\n schemaTypes,\r\n primaryType,\r\n onChange\r\n}: {\r\n schema: JSONSchema;\r\n schemaTypes: JSONSchemaType[];\r\n primaryType?: JSONSchemaType;\r\n onChange: (next: JSONSchema) => void;\r\n}) {\r\n if (primaryType === \"boolean\" || primaryType === \"null\") {\r\n return null;\r\n }\r\n\r\n if (primaryType === \"string\") {\r\n return (\r\n <StringEnumInput\r\n value={Array.isArray(schema.enum) ? schema.enum : undefined}\r\n onChange={(nextEnum) => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n\r\n if (!nextEnum || nextEnum.length === 0) {\r\n delete next.enum;\r\n } else {\r\n next.enum = nextEnum;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (primaryType === \"number\" || primaryType === \"integer\") {\r\n return (\r\n <NumberEnumInput\r\n value={Array.isArray(schema.enum) ? schema.enum : undefined}\r\n integerOnly={primaryType === \"integer\"}\r\n onChange={(nextEnum) => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n\r\n if (!nextEnum || nextEnum.length === 0) {\r\n delete next.enum;\r\n } else {\r\n next.enum = nextEnum;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n if (!primaryType && schemaTypes.length > 1) {\r\n return (\r\n <StringEnumInput\r\n value={Array.isArray(schema.enum) ? schema.enum : undefined}\r\n parseEntry={(entry) => parseLooseScalarByTypes(entry, schemaTypes)}\r\n onChange={(nextEnum) => {\r\n const next = cloneSchema(schema);\r\n delete next.const;\r\n\r\n if (!nextEnum || nextEnum.length === 0) {\r\n delete next.enum;\r\n } else {\r\n next.enum = nextEnum;\r\n }\r\n\r\n onChange(next);\r\n }}\r\n />\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction NumberEnumInput({\r\n value,\r\n integerOnly,\r\n onChange\r\n}: {\r\n value?: unknown[];\r\n integerOnly: boolean;\r\n onChange: (nextEnum: number[] | undefined) => void;\r\n}) {\r\n const serializedValue = Array.isArray(value) ? JSON.stringify(value) : \"\";\r\n const [draftValue, setDraftValue] = useState(serializedValue);\r\n const lastSubmittedSignatureRef = useRef<string | null>(null);\r\n\r\n useEffect(() => {\r\n const nextSignature = Array.isArray(value) ? JSON.stringify(value) : \"\";\r\n if (lastSubmittedSignatureRef.current === nextSignature) {\r\n return;\r\n }\r\n\r\n setDraftValue(serializedValue);\r\n }, [serializedValue, value]);\r\n\r\n return (\r\n <TextInput\r\n label=\"Enum\"\r\n keyword=\"enum\"\r\n value={draftValue}\r\n placeholder={integerOnly ? \"e.g. [1, 2, 3]\" : \"e.g. [1, 2.5, 3]\"}\r\n onChange={(nextText) => {\r\n if (!/^[\\[\\]\\d,\\.\\-+\\seE]*$/.test(nextText)) {\r\n return;\r\n }\r\n\r\n setDraftValue(nextText);\r\n\r\n if (nextText.trim() === \"\") {\r\n lastSubmittedSignatureRef.current = \"\";\r\n onChange(undefined);\r\n return;\r\n }\r\n\r\n const parsed = parseNumberEnum(nextText, integerOnly);\r\n if (!parsed) {\r\n return;\r\n }\r\n\r\n lastSubmittedSignatureRef.current = JSON.stringify(parsed);\r\n onChange(parsed);\r\n }}\r\n />\r\n );\r\n}\r\n\r\n\r\nfunction parseNumberEnum(input: string, integerOnly: boolean): number[] | null {\r\n const trimmed = input.trim();\r\n if (!trimmed) {\r\n return [];\r\n }\r\n\r\n const hasWrappedBrackets = trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\");\r\n const core = hasWrappedBrackets ? trimmed.slice(1, -1) : trimmed;\r\n\r\n if (core.trim() === \"\") {\r\n return [];\r\n }\r\n\r\n const segments = core.split(\",\").map((entry) => entry.trim());\r\n if (segments.some((entry) => entry === \"\")) {\r\n return null;\r\n }\r\n\r\n const parsedValues: number[] = [];\r\n for (const segment of segments) {\r\n const parsed = Number(segment);\r\n if (!Number.isFinite(parsed)) {\r\n return null;\r\n }\r\n\r\n if (integerOnly && !Number.isInteger(parsed)) {\r\n return null;\r\n }\r\n\r\n parsedValues.push(parsed);\r\n }\r\n\r\n return parsedValues;\r\n}\r\nfunction StringEnumInput({\r\n value,\r\n parseEntry,\r\n onChange\r\n}: {\r\n value?: unknown[];\r\n parseEntry?: (entry: string) => unknown | undefined;\r\n onChange: (nextEnum: unknown[] | undefined) => void;\r\n}) {\r\n const displayValues = Array.isArray(value) ? value.map((entry) => (typeof entry === \"string\" ? entry : String(entry))) : [];\r\n const serializedValue = Array.isArray(value) ? serializeStringEnum(displayValues) : \"\";\r\n const [draftValue, setDraftValue] = useState(serializedValue);\r\n const lastSubmittedSignatureRef = useRef<string | null>(null);\r\n\r\n useEffect(() => {\r\n const nextSignature = Array.isArray(value) ? JSON.stringify(displayValues) : \"\";\r\n if (lastSubmittedSignatureRef.current === nextSignature) {\r\n return;\r\n }\r\n\r\n setDraftValue(serializedValue);\r\n }, [serializedValue, value]);\r\n\r\n return (\r\n <TextInput\r\n label=\"Enum\"\r\n keyword=\"enum\"\r\n type=\"text\"\r\n value={draftValue}\r\n placeholder={`e.g. A, B, \"C, D\", 'E, F'`}\r\n onChange={(nextText) => {\r\n setDraftValue(nextText);\r\n\r\n if (nextText.trim() === \"\") {\r\n lastSubmittedSignatureRef.current = \"\";\r\n onChange(undefined);\r\n return;\r\n }\r\n\r\n const parsed = parseStringEnum(nextText);\r\n if (!parsed.valid || !parsed.values) {\r\n return;\r\n }\r\n\r\n const normalizedValues = parsed.values.map((entry) => {\r\n if (!parseEntry) {\r\n return entry;\r\n }\r\n\r\n return parseEntry(entry);\r\n });\r\n\r\n if (normalizedValues.some((entry) => entry === undefined)) {\r\n return;\r\n }\r\n\r\n const typedValues = normalizedValues as unknown[];\r\n const submittedSignature = JSON.stringify(\r\n typedValues.map((entry) => (typeof entry === \"string\" ? entry : String(entry)))\r\n );\r\n lastSubmittedSignatureRef.current = submittedSignature;\r\n onChange(typedValues);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction parseLooseScalarByTypes(value: string, schemaTypes: JSONSchemaType[]): unknown | undefined {\r\n const trimmed = value.trim();\r\n if (trimmed === \"\") {\r\n return undefined;\r\n }\r\n\r\n if (schemaTypes.includes(\"boolean\")) {\r\n if (trimmed === \"true\") {\r\n return true;\r\n }\r\n if (trimmed === \"false\") {\r\n return false;\r\n }\r\n }\r\n\r\n if (schemaTypes.includes(\"null\") && trimmed === \"null\") {\r\n return null;\r\n }\r\n\r\n if (schemaTypes.includes(\"integer\")) {\r\n const parsedInteger = Number(trimmed);\r\n if (Number.isInteger(parsedInteger)) {\r\n return parsedInteger;\r\n }\r\n }\r\n\r\n if (schemaTypes.includes(\"number\")) {\r\n const parsedNumber = Number(trimmed);\r\n if (Number.isFinite(parsedNumber)) {\r\n return parsedNumber;\r\n }\r\n }\r\n\r\n if (schemaTypes.includes(\"string\")) {\r\n return value;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction parseStringEnum(input: string): { valid: boolean; values: string[] | null } {\r\n const values: string[] = [];\r\n let token = \"\";\r\n let inDoubleQuote = false;\r\n let inSingleQuote = false;\r\n let tokenUsedQuotes = false;\r\n let tokenClosedQuote = false;\r\n\r\n const pushToken = () => {\r\n const candidate = tokenUsedQuotes ? token : token.trim();\r\n if (candidate.length > 0) {\r\n values.push(candidate);\r\n }\r\n\r\n token = \"\";\r\n tokenUsedQuotes = false;\r\n tokenClosedQuote = false;\r\n };\r\n\r\n for (let index = 0; index < input.length; index += 1) {\r\n const char = input[index];\r\n\r\n if (inDoubleQuote) {\r\n if (char === '\"') {\r\n if (token.endsWith(\"/\")) {\r\n token = `${token.slice(0, -1)}\"`;\r\n continue;\r\n }\r\n\r\n inDoubleQuote = false;\r\n tokenClosedQuote = true;\r\n continue;\r\n }\r\n\r\n token += char;\r\n continue;\r\n }\r\n\r\n if (inSingleQuote) {\r\n if (char === \"'\") {\r\n if (token.endsWith(\"/\")) {\r\n token = `${token.slice(0, -1)}'`;\r\n continue;\r\n }\r\n\r\n inSingleQuote = false;\r\n tokenClosedQuote = true;\r\n continue;\r\n }\r\n\r\n token += char;\r\n continue;\r\n }\r\n\r\n if (char === \",\") {\r\n pushToken();\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n if (token.trim().length === 0) {\r\n token = \"\";\r\n }\r\n inDoubleQuote = true;\r\n tokenUsedQuotes = true;\r\n continue;\r\n }\r\n\r\n if (char === \"'\") {\r\n if (token.trim().length === 0) {\r\n token = \"\";\r\n }\r\n inSingleQuote = true;\r\n tokenUsedQuotes = true;\r\n continue;\r\n }\r\n\r\n if (tokenClosedQuote && /\\s/.test(char)) {\r\n continue;\r\n }\r\n\r\n token += char;\r\n }\r\n\r\n if (inDoubleQuote || inSingleQuote) {\r\n return { valid: false, values: null };\r\n }\r\n\r\n pushToken();\r\n\r\n return { valid: true, values };\r\n}\r\n\r\nfunction serializeStringEnum(values: string[]): string {\r\n return values\r\n .map((value) => {\r\n const needsQuotes = value === \"\" || /[\\s,\\\"']/.test(value);\r\n if (!needsQuotes) {\r\n return value;\r\n }\r\n\r\n const escaped = value.replace(/\\\"/g, '/\"');\r\n return `\"${escaped}\"`;\r\n })\r\n .join(\", \");\r\n}\r\n\r\nfunction createDefaultRootSchema(): JSONSchema {\r\n return {\r\n $schema: DEFAULT_SCHEMA_URI,\r\n title: \"New Schema\",\r\n type: \"object\",\r\n properties: {},\r\n required: []\r\n };\r\n}\r\n\r\nfunction applyTypes(schema: JSONSchema, nextTypesInput: JSONSchemaType[]): JSONSchema {\r\n const next = cloneSchema(schema);\r\n const previousTypes = getSchemaTypes(next);\r\n const nextTypes = normalizeTypes(nextTypesInput);\r\n const removedTypes = previousTypes.filter((type) => !nextTypes.includes(type));\r\n\r\n for (const removedType of removedTypes) {\r\n removeTypeSpecificKeywords(next, removedType, nextTypes);\r\n }\r\n\r\n next.type = nextTypes.length === 1 ? nextTypes[0] : nextTypes;\r\n\r\n if (nextTypes.includes(\"object\")) {\r\n next.properties = next.properties ?? {};\r\n next.required = Array.isArray(next.required) ? next.required : [];\r\n }\r\n\r\n if (nextTypes.includes(\"array\")) {\r\n next.items = next.items ?? { type: \"string\" };\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction removeTypeSpecificKeywords(schema: JSONSchema, type: JSONSchemaType, activeTypes: JSONSchemaType[]): void {\r\n if (type === \"object\") {\r\n if (!activeTypes.includes(\"object\")) {\r\n delete schema.properties;\r\n delete schema.patternProperties;\r\n delete schema.required;\r\n delete schema.dependentRequired;\r\n delete schema.dependentSchemas;\r\n delete schema.additionalProperties;\r\n delete schema.unevaluatedProperties;\r\n delete schema.propertyNames;\r\n delete schema.minProperties;\r\n delete schema.maxProperties;\r\n }\r\n return;\r\n }\r\n\r\n if (type === \"array\") {\r\n if (!activeTypes.includes(\"array\")) {\r\n delete schema.items;\r\n delete schema.contains;\r\n delete schema.minItems;\r\n delete schema.maxItems;\r\n delete schema.uniqueItems;\r\n delete schema.minContains;\r\n delete schema.maxContains;\r\n delete schema.unevaluatedItems;\r\n }\r\n return;\r\n }\r\n\r\n if (type === \"string\") {\r\n if (!activeTypes.includes(\"string\")) {\r\n delete schema.pattern;\r\n }\r\n return;\r\n }\r\n\r\n if (type === \"number\" || type === \"integer\") {\r\n if (!(activeTypes.includes(\"number\") || activeTypes.includes(\"integer\"))) {\r\n delete schema.minimum;\r\n delete schema.maximum;\r\n delete schema.multipleOf;\r\n delete schema.exclusiveMinimum;\r\n delete schema.exclusiveMaximum;\r\n }\r\n }\r\n}\r\n\r\nfunction getSchemaTypes(schema: JSONSchema): JSONSchemaType[] {\r\n if (Array.isArray(schema.type)) {\r\n return normalizeTypes(schema.type as JSONSchemaType[]);\r\n }\r\n\r\n if (typeof schema.type === \"string\") {\r\n return normalizeTypes([schema.type as JSONSchemaType]);\r\n }\r\n\r\n return [\"object\"];\r\n}\r\n\r\nfunction normalizeTypes(types: JSONSchemaType[]): JSONSchemaType[] {\r\n const normalized: JSONSchemaType[] = [];\r\n\r\n for (const type of types) {\r\n if (!FIELD_TYPES.includes(type)) {\r\n continue;\r\n }\r\n\r\n if (!normalized.includes(type)) {\r\n normalized.push(type);\r\n }\r\n }\r\n\r\n return normalized.length > 0 ? normalized : [\"string\"];\r\n}\r\n\r\nfunction assignOptionalString<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n next[key] = value;\r\n return next;\r\n}\r\n\r\nfunction assignOptionalNumber<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (Number.isNaN(parsed)) {\r\n return next;\r\n }\r\n\r\n next[key] = parsed;\r\n return next;\r\n}\r\n\r\nfunction assignOptionalInteger<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (!Number.isInteger(parsed) || parsed < 0) {\r\n return next;\r\n }\r\n\r\n next[key] = parsed;\r\n return next;\r\n}\r\n\r\nfunction assignOptionalPositiveNumber<T extends keyof JSONSchema>(schema: JSONSchema, key: T, value: string): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (value.trim() === \"\") {\r\n delete next[key];\r\n return next;\r\n }\r\n\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed) || parsed <= 0) {\r\n return next;\r\n }\r\n\r\n next[key] = parsed;\r\n return next;\r\n}\r\n\r\nfunction parseCommaSeparatedStrings(value: string): string[] {\r\n return Array.from(\r\n new Set(\r\n value\r\n .split(\",\")\r\n .map((entry) => entry.trim())\r\n .filter((entry) => entry !== \"\")\r\n )\r\n );\r\n}\r\n\r\nfunction createUniquePropertyName(properties: Record<string, JSONSchema>, baseName: string): string {\r\n if (!properties[baseName]) {\r\n return baseName;\r\n }\r\n\r\n let index = 1;\r\n while (properties[`${baseName}${index}`]) {\r\n index += 1;\r\n }\r\n return `${baseName}${index}`;\r\n}\r\n\r\nfunction createUniqueEntryName(entries: Record<string, unknown>, baseName: string): string {\r\n if (!Object.prototype.hasOwnProperty.call(entries, baseName)) {\r\n return baseName;\r\n }\r\n\r\n let index = 1;\r\n while (Object.prototype.hasOwnProperty.call(entries, `${baseName}${index}`)) {\r\n index += 1;\r\n }\r\n return `${baseName}${index}`;\r\n}\r\n\r\nfunction cloneSchema<T>(value: T): T {\r\n if (typeof structuredClone === \"function\") {\r\n return structuredClone(value);\r\n }\r\n return JSON.parse(JSON.stringify(value)) as T;\r\n}\r\n\r\nfunction stringOrEmpty(value: unknown): string {\r\n return typeof value === \"string\" ? value : \"\";\r\n}\r\n\r\nfunction sanitizeSchemaForOutput(schema: JSONSchema): JSONSchema {\r\n const next = cloneSchema(schema);\r\n\r\n if (next.properties) {\r\n const sanitizedProperties: Record<string, JSONSchema> = {};\r\n\r\n for (const [propertyName, propertySchema] of Object.entries(next.properties)) {\r\n if (propertyName.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n sanitizedProperties[propertyName] = sanitizeSchemaForOutput(propertySchema);\r\n }\r\n\r\n if (Object.keys(sanitizedProperties).length > 0) {\r\n next.properties = sanitizedProperties;\r\n } else {\r\n delete next.properties;\r\n }\r\n }\r\n\r\n if (next.patternProperties) {\r\n const sanitizedPatternProperties: Record<string, JSONSchema> = {};\r\n\r\n for (const [patternKey, patternSchema] of Object.entries(next.patternProperties)) {\r\n if (patternKey.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n sanitizedPatternProperties[patternKey] = sanitizeSchemaForOutput(patternSchema);\r\n }\r\n\r\n next.patternProperties = sanitizedPatternProperties;\r\n }\r\n\r\n if (next.dependentSchemas) {\r\n const sanitizedDependentSchemas: Record<string, JSONSchema> = {};\r\n\r\n for (const [propertyName, dependentSchema] of Object.entries(next.dependentSchemas)) {\r\n if (propertyName.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n sanitizedDependentSchemas[propertyName] = sanitizeSchemaForOutput(dependentSchema);\r\n }\r\n\r\n next.dependentSchemas = sanitizedDependentSchemas;\r\n }\r\n\r\n if (next.dependentRequired) {\r\n const sanitizedDependentRequired: Record<string, string[]> = {};\r\n\r\n for (const [propertyName, dependencies] of Object.entries(next.dependentRequired)) {\r\n if (propertyName.trim() === \"\") {\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(dependencies)) {\r\n sanitizedDependentRequired[propertyName] = [];\r\n continue;\r\n }\r\n\r\n const cleanedDependencies = Array.from(\r\n new Set(\r\n dependencies\r\n .filter((entry) => typeof entry === \"string\")\r\n .map((entry) => entry.trim())\r\n .filter((entry) => entry !== \"\")\r\n )\r\n );\r\n sanitizedDependentRequired[propertyName] = cleanedDependencies;\r\n }\r\n\r\n next.dependentRequired = sanitizedDependentRequired;\r\n }\r\n\r\n if (Array.isArray(next.required)) {\r\n next.required = next.required.filter((entry) => entry.trim() !== \"\");\r\n\r\n if (next.required.length === 0) {\r\n delete next.required;\r\n }\r\n }\r\n\r\n if (Array.isArray(next.items)) {\r\n next.prefixItems = next.items.map((itemSchema) => sanitizeSchemaForOutput(itemSchema));\r\n next.items = false;\r\n }\r\n\r\n if (Array.isArray(next.prefixItems)) {\r\n next.prefixItems = next.prefixItems.map((itemSchema) => sanitizeSchemaForOutput(itemSchema));\r\n } else if (isObject(next.items)) {\r\n next.items = sanitizeSchemaForOutput(next.items as JSONSchema);\r\n }\r\n\r\n if (isObject(next.contains)) {\r\n next.contains = sanitizeSchemaForOutput(next.contains as JSONSchema);\r\n }\r\n\r\n if (isObject(next.unevaluatedItems)) {\r\n next.unevaluatedItems = sanitizeSchemaForOutput(next.unevaluatedItems as JSONSchema);\r\n }\r\n\r\n if (isObject(next.not)) {\r\n next.not = sanitizeSchemaForOutput(next.not as JSONSchema);\r\n }\r\n\r\n if (isObject(next.additionalProperties)) {\r\n next.additionalProperties = sanitizeSchemaForOutput(next.additionalProperties as JSONSchema);\r\n }\r\n\r\n if (isObject(next.unevaluatedProperties)) {\r\n next.unevaluatedProperties = sanitizeSchemaForOutput(next.unevaluatedProperties as JSONSchema);\r\n }\r\n\r\n if (isObject(next.propertyNames)) {\r\n next.propertyNames = sanitizeSchemaForOutput(next.propertyNames as JSONSchema);\r\n }\r\n\r\n for (const key of [\"if\", \"then\", \"else\"] as const) {\r\n if (isObject(next[key])) {\r\n next[key] = sanitizeSchemaForOutput(next[key] as JSONSchema);\r\n }\r\n }\r\n\r\n for (const key of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\r\n if (Array.isArray(next[key])) {\r\n next[key] = next[key].map((entry) => sanitizeSchemaForOutput(entry));\r\n }\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction applyDomainToRootId(schema: JSONSchema, domain?: string): JSONSchema {\r\n if (!domain) {\r\n return schema;\r\n }\r\n\r\n const next = cloneSchema(schema);\r\n const localId = stringOrEmpty(next.$id);\r\n\r\n if (!localId.trim()) {\r\n return next;\r\n }\r\n\r\n next.$id = toFullId(localId, domain);\r\n return next;\r\n}\r\n\r\nfunction toLocalId(value: string, domain?: string): string {\r\n const trimmed = value.trim();\r\n if (!domain || !trimmed) {\r\n return trimmed;\r\n }\r\n\r\n const normalizedDomain = normalizeDomain(domain);\r\n if (!normalizedDomain) {\r\n return trimmed;\r\n }\r\n\r\n if (trimmed === normalizedDomain) {\r\n return \"\";\r\n }\r\n\r\n const domainWithSlash = `${normalizedDomain}/`;\r\n if (trimmed.startsWith(domainWithSlash)) {\r\n return trimmed.slice(domainWithSlash.length);\r\n }\r\n\r\n return trimmed;\r\n}\r\n\r\nfunction toFullId(localId: string, domain?: string): string {\r\n const trimmedLocal = localId.trim();\r\n if (!domain || !trimmedLocal) {\r\n return trimmedLocal;\r\n }\r\n\r\n const normalizedDomain = normalizeDomain(domain);\r\n if (!normalizedDomain) {\r\n return trimmedLocal;\r\n }\r\n\r\n if (trimmedLocal === normalizedDomain || trimmedLocal.startsWith(`${normalizedDomain}/`)) {\r\n return trimmedLocal;\r\n }\r\n\r\n return `${normalizedDomain}/${trimmedLocal.replace(/^\\/+/, \"\")}`;\r\n}\r\n\r\nfunction normalizeDomain(domain: string): string {\r\n return domain.trim().replace(/\\/+$/, \"\");\r\n}\r\n\r\nfunction validateSchemaDefinition(schema: JSONSchema): SchemaBuilderValidationError[] {\r\n const consistencyErrors = validateConstAndEnumConsistency(schema);\r\n\r\n try {\r\n const ajv = createAjvForSchema(schema);\r\n const valid = ajv.validateSchema(schema);\r\n\r\n const schemaErrors: SchemaBuilderValidationError[] = valid\r\n ? []\r\n : (ajv.errors ?? []).map((error) => ({\r\n message: error.message ?? \"Schema validation error\",\r\n keyword: error.keyword,\r\n instancePath: error.instancePath,\r\n schemaPath: error.schemaPath,\r\n source: \"schema\" as const\r\n }));\r\n\r\n return [...schemaErrors, ...consistencyErrors];\r\n } catch (error) {\r\n return [\r\n {\r\n message: error instanceof Error ? error.message : \"Schema validation failed.\",\r\n source: \"schema\"\r\n },\r\n ...consistencyErrors\r\n ];\r\n }\r\n}\r\n\r\nfunction validateConstAndEnumConsistency(schema: JSONSchema, schemaPointer = \"\"): SchemaBuilderValidationError[] {\r\n const errors: SchemaBuilderValidationError[] = [];\r\n const schemaTypes = getSchemaTypes(schema);\r\n const hasConst = Object.prototype.hasOwnProperty.call(schema, \"const\");\r\n\r\n if (hasConst && !matchesAnySchemaType(schema.const, schemaTypes)) {\r\n errors.push({\r\n message: \"const value does not match the field type.\",\r\n keyword: \"const\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/const`,\r\n source: \"schema\"\r\n });\r\n }\r\n\r\n if (schema.enum !== undefined) {\r\n if (!Array.isArray(schema.enum)) {\r\n errors.push({\r\n message: \"enum must be an array.\",\r\n keyword: \"enum\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/enum`,\r\n source: \"schema\"\r\n });\r\n } else {\r\n schema.enum.forEach((enumValue, index) => {\r\n if (!matchesAnySchemaType(enumValue, schemaTypes)) {\r\n errors.push({\r\n message: `enum value at index ${index} does not match the field type.`,\r\n keyword: \"enum\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/enum/${index}`,\r\n source: \"schema\"\r\n });\r\n }\r\n });\r\n\r\n if (hasConst && !schema.enum.some((entry) => deepEqual(entry, schema.const))) {\r\n errors.push({\r\n message: \"const value must exist in enum when both are provided.\",\r\n keyword: \"const\",\r\n instancePath: schemaPointer,\r\n schemaPath: `${schemaPointer}/const`,\r\n source: \"schema\"\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (schema.properties) {\r\n for (const [propertyName, propertySchema] of Object.entries(schema.properties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(\r\n propertySchema,\r\n `${schemaPointer}/properties/${escapeJsonPointerToken(propertyName)}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (schema.patternProperties) {\r\n for (const [patternKey, patternSchema] of Object.entries(schema.patternProperties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(\r\n patternSchema,\r\n `${schemaPointer}/patternProperties/${escapeJsonPointerToken(patternKey)}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (schema.dependentSchemas) {\r\n for (const [propertyName, dependentSchema] of Object.entries(schema.dependentSchemas)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(\r\n dependentSchema,\r\n `${schemaPointer}/dependentSchemas/${escapeJsonPointerToken(propertyName)}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (Array.isArray(schema.items)) {\r\n schema.items.forEach((itemSchema, index) => {\r\n errors.push(...validateConstAndEnumConsistency(itemSchema, `${schemaPointer}/items/${index}`));\r\n });\r\n } else if (isObject(schema.items)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.items as JSONSchema, `${schemaPointer}/items`));\r\n }\r\n\r\n if (isObject(schema.contains)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.contains as JSONSchema, `${schemaPointer}/contains`));\r\n }\r\n\r\n if (isObject(schema.unevaluatedItems)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.unevaluatedItems as JSONSchema, `${schemaPointer}/unevaluatedItems`));\r\n }\r\n\r\n if (isObject(schema.not)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.not as JSONSchema, `${schemaPointer}/not`));\r\n }\r\n\r\n if (isObject(schema.additionalProperties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(schema.additionalProperties as JSONSchema, `${schemaPointer}/additionalProperties`)\r\n );\r\n }\r\n\r\n if (isObject(schema.unevaluatedProperties)) {\r\n errors.push(\r\n ...validateConstAndEnumConsistency(schema.unevaluatedProperties as JSONSchema, `${schemaPointer}/unevaluatedProperties`)\r\n );\r\n }\r\n\r\n if (isObject(schema.propertyNames)) {\r\n errors.push(...validateConstAndEnumConsistency(schema.propertyNames as JSONSchema, `${schemaPointer}/propertyNames`));\r\n }\r\n\r\n for (const key of [\"if\", \"then\", \"else\"] as const) {\r\n if (isObject(schema[key])) {\r\n errors.push(...validateConstAndEnumConsistency(schema[key] as JSONSchema, `${schemaPointer}/${key}`));\r\n }\r\n }\r\n\r\n for (const combinatorKey of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\r\n const entries = schema[combinatorKey];\r\n if (!Array.isArray(entries)) {\r\n continue;\r\n }\r\n\r\n entries.forEach((entry, index) => {\r\n errors.push(...validateConstAndEnumConsistency(entry, `${schemaPointer}/${combinatorKey}/${index}`));\r\n });\r\n }\r\n\r\n return errors;\r\n}\r\n\r\nfunction matchesAnySchemaType(value: unknown, schemaTypes: JSONSchemaType[]): boolean {\r\n return schemaTypes.some((schemaType) => matchesSchemaType(value, schemaType));\r\n}\r\n\r\nfunction matchesSchemaType(value: unknown, schemaType: JSONSchemaType): boolean {\r\n if (schemaType === \"string\") {\r\n return typeof value === \"string\";\r\n }\r\n\r\n if (schemaType === \"number\") {\r\n return typeof value === \"number\" && Number.isFinite(value);\r\n }\r\n\r\n if (schemaType === \"integer\") {\r\n return typeof value === \"number\" && Number.isInteger(value);\r\n }\r\n\r\n if (schemaType === \"boolean\") {\r\n return typeof value === \"boolean\";\r\n }\r\n\r\n if (schemaType === \"null\") {\r\n return value === null;\r\n }\r\n\r\n if (schemaType === \"array\") {\r\n return Array.isArray(value);\r\n }\r\n\r\n return isObject(value);\r\n}\r\n\r\nfunction deepEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n\r\n if (typeof a !== typeof b) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n\r\n return a.every((entry, index) => deepEqual(entry, b[index]));\r\n }\r\n\r\n if (isObject(a) && isObject(b)) {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n\r\n if (keysA.length !== keysB.length) {\r\n return false;\r\n }\r\n\r\n return keysA.every((key) => deepEqual(a[key], b[key]));\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction escapeJsonPointerToken(value: string): string {\r\n return value.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\r\n}\r\n\r\nfunction numberOrEmpty(value: unknown): string {\r\n return typeof value === \"number\" && Number.isFinite(value) ? String(value) : \"\";\r\n}\r\n\r\nfunction toInlineJson(value: unknown): string {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n"],"mappings":"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","names":["import_react","deepClone","import__","Ajv2020","Ajv2019","Ajv","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","isObject","import_jsx_runtime","import_react","import_jsx_runtime","isObject","next","objectProperties","parse","escapeJsonPointerToken"]}