@republicroad/seal-editor 1.13.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-BDvVbmiV.js","names":[],"sources":["../src/helpers/request-schema/utils.ts","../src/helpers/request-schema/normalize.ts","../src/helpers/request-schema/schema-property.ts","../src/helpers/request-schema/legacy.ts","../src/helpers/request-schema/schema-value.ts","../src/helpers/request-schema/examples.ts","../src/helpers/request-schema/contract.ts","../src/helpers/request-schema/ajv-validator.ts","../src/helpers/request-schema/definitions.ts","../src/helpers/schema.ts"],"sourcesContent":["export const hasOwn = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key);\n\nexport const isRecord = (value: unknown): value is Record<string, any> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const cloneRequestExampleValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((item) => cloneRequestExampleValue(item));\n }\n\n if (isRecord(value)) {\n return Object.entries(value).reduce<Record<string, unknown>>((acc, [key, item]) => {\n acc[key] = cloneRequestExampleValue(item);\n return acc;\n }, {});\n }\n\n return value;\n};\n\nexport const buildDefinitionPath = (parentPath: string, name: string) => (parentPath ? `${parentPath}.${name}` : name);\n\nconst getPathSegments = (path: string) =>\n path\n .split('.')\n .map((segment) => segment.trim())\n .filter(Boolean);\n\nexport const setPathValue = (source: Record<string, unknown>, path: string, value: unknown) => {\n const segments = getPathSegments(path);\n\n if (segments.length === 0) {\n return;\n }\n\n let cursor: Record<string, unknown> = source;\n segments.forEach((segment, index) => {\n if (index === segments.length - 1) {\n cursor[segment] = value;\n return;\n }\n\n if (!isRecord(cursor[segment])) {\n cursor[segment] = {};\n }\n\n cursor = cursor[segment] as Record<string, unknown>;\n });\n};\n\nexport const getPathValue = (source: Record<string, unknown>, path: string): unknown => {\n const segments = getPathSegments(path);\n\n if (segments.length === 0) {\n return undefined;\n }\n\n let cursor: unknown = source;\n\n for (let index = 0; index < segments.length; index += 1) {\n if (!isRecord(cursor)) {\n return undefined;\n }\n\n const segment = segments[index];\n const nextValue = cursor[segment];\n\n if (index === segments.length - 1) {\n return nextValue;\n }\n\n cursor = nextValue;\n }\n\n return undefined;\n};\n\nexport const deletePathValue = (source: Record<string, unknown>, path: string) => {\n const segments = getPathSegments(path);\n\n if (segments.length === 0) {\n return;\n }\n\n const visit = (cursor: Record<string, unknown>, index: number): boolean => {\n const segment = segments[index];\n if (!hasOwn(cursor, segment)) {\n return Object.keys(cursor).length === 0;\n }\n\n if (index === segments.length - 1) {\n delete cursor[segment];\n return Object.keys(cursor).length === 0;\n }\n\n const nextValue = cursor[segment];\n if (!isRecord(nextValue)) {\n delete cursor[segment];\n return Object.keys(cursor).length === 0;\n }\n\n const shouldDeleteCurrent = visit(nextValue, index + 1);\n if (shouldDeleteCurrent) {\n delete cursor[segment];\n }\n\n return Object.keys(cursor).length === 0;\n };\n\n visit(source, 0);\n};\n\nconst mergeRecordWithTargetPrecedence = (\n sourceValue: Record<string, unknown>,\n targetValue: Record<string, unknown>,\n): Record<string, unknown> => {\n const merged = cloneRequestExampleValue(sourceValue) as Record<string, unknown>;\n\n Object.entries(targetValue).forEach(([key, value]) => {\n const sourceEntry = merged[key];\n if (isRecord(sourceEntry) && isRecord(value)) {\n merged[key] = mergeRecordWithTargetPrecedence(sourceEntry, value);\n return;\n }\n\n merged[key] = cloneRequestExampleValue(value);\n });\n\n return merged;\n};\n\nexport const setMergedPathValue = (source: Record<string, unknown>, path: string, value: unknown) => {\n const existingValue = getPathValue(source, path);\n\n if (isRecord(value) && isRecord(existingValue)) {\n setPathValue(source, path, mergeRecordWithTargetPrecedence(value, existingValue));\n return;\n }\n\n setPathValue(source, path, cloneRequestExampleValue(value));\n};\n","import type { RequestDefinitionType, RequestJsonSchema } from './types';\nimport { isRecord } from './utils';\n\nconst invisibleFormatCharacters = /[\\u00ad\\u061c\\u180e\\u200b-\\u200f\\u202a-\\u202e\\u2060-\\u206f\\ufeff]/g;\n\nexport const normalizeRequestFieldKey = (key: string) => key.replace(invisibleFormatCharacters, '').trim();\n\nexport const normalizeRequestJsonKeys = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map(normalizeRequestJsonKeys);\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n return Object.entries(value).reduce<Record<string, unknown>>((normalizedValue, [key, item]) => {\n normalizedValue[normalizeRequestFieldKey(key)] = normalizeRequestJsonKeys(item);\n return normalizedValue;\n }, {});\n};\n\nconst normalizeSchemaType = (schema?: RequestJsonSchema | null): string | undefined => {\n if (!schema) {\n return undefined;\n }\n\n if (Array.isArray(schema.type)) {\n return schema.type.find((item) => item !== 'null') ?? schema.type[0];\n }\n\n return schema.type;\n};\n\nconst isDateLikeFormat = (format?: unknown) => {\n if (typeof format !== 'string') {\n return false;\n }\n\n return ['date-time', 'datetime', 'utc-millisec'].includes(format);\n};\n\nexport const normalizeDefinitionType = (schema?: RequestJsonSchema | null): RequestDefinitionType => {\n if (!schema) {\n return 'string';\n }\n\n if (isRecord(schema.properties)) {\n return 'object';\n }\n\n const schemaType = normalizeSchemaType(schema);\n if (schemaType === 'string' && isDateLikeFormat(schema.format)) {\n return 'datetime';\n }\n\n switch (schemaType) {\n case 'number':\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'array':\n return 'array';\n case 'object':\n return 'object';\n default:\n return 'string';\n }\n};\n\nconst defaultRequestDateTimeTimezone = '+08:00';\nexport const requestDateTimePattern =\n /^(\\d{4}-\\d{2}-\\d{2})(?:[T\\s](\\d{2}:\\d{2}:\\d{2})(\\.\\d+)?)?(?:\\s*(Z|[+-]\\d{2}:?\\d{2}))?$/;\n\nconst normalizeRequestTimezoneOffset = (timezone?: string) => {\n if (!timezone) {\n return defaultRequestDateTimeTimezone;\n }\n\n if (timezone === 'Z') {\n return 'Z';\n }\n\n if (/^[+-]\\d{2}:\\d{2}$/.test(timezone)) {\n return timezone;\n }\n\n if (/^[+-]\\d{4}$/.test(timezone)) {\n return `${timezone.slice(0, 3)}:${timezone.slice(3)}`;\n }\n\n return defaultRequestDateTimeTimezone;\n};\n\nexport const normalizeRequestDateTimeValue = (value: unknown): unknown => {\n if (typeof value !== 'string') {\n return value;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return trimmed;\n }\n\n const normalizedMatch = trimmed.match(requestDateTimePattern);\n if (!normalizedMatch) {\n return trimmed;\n }\n\n const [, datePart, timePart = '00:00:00', fractionPart = '', timezonePart] = normalizedMatch;\n return `${datePart}T${timePart}${fractionPart}${normalizeRequestTimezoneOffset(timezonePart)}`;\n};\n","import type { RequestDefinition, RequestJsonSchema } from './types';\nimport { isRecord } from './utils';\n\nexport const createSchemaProperty = (\n definition: Pick<RequestDefinition, 'type' | 'description' | 'format' | 'order' | 'defaultValue'>,\n): RequestJsonSchema => {\n const schema: RequestJsonSchema = {};\n\n if (definition.type === 'datetime') {\n schema.type = 'string';\n schema.format = definition.format.trim() || 'date-time';\n } else {\n schema.type = definition.type;\n }\n\n if (definition.description.trim()) {\n schema.description = definition.description.trim();\n }\n\n if (definition.type === 'string' && definition.format.trim()) {\n schema.format = definition.format.trim();\n }\n\n if (definition.type === 'object') {\n schema.properties = schema.properties ?? {};\n }\n\n if (definition.type === 'array' && !schema.items) {\n schema.items = { type: 'string' };\n }\n\n if (definition.defaultValue !== undefined && definition.defaultValue.trim() !== '') {\n schema.default = definition.defaultValue;\n }\n\n schema['x-order'] = definition.order;\n\n return schema;\n};\n\nexport const setSchemaPropertyByPath = (\n properties: Record<string, RequestJsonSchema>,\n key: string,\n definition: Pick<RequestDefinition, 'type' | 'description' | 'format' | 'order' | 'defaultValue'>,\n) => {\n const segments = key\n .split('.')\n .map((segment) => segment.trim())\n .filter(Boolean);\n\n if (segments.length === 0) {\n return;\n }\n\n let cursor = properties;\n segments.forEach((segment, index) => {\n const isLeaf = index === segments.length - 1;\n const existing = isRecord(cursor[segment]) ? (cursor[segment] as RequestJsonSchema) : {};\n\n if (isLeaf) {\n const nextProperty = {\n ...existing,\n ...createSchemaProperty(definition),\n };\n\n if (definition.type === 'object') {\n nextProperty.properties = existing.properties && isRecord(existing.properties) ? existing.properties : {};\n }\n\n if (definition.type === 'array') {\n nextProperty.items = existing.items ?? {};\n }\n\n cursor[segment] = nextProperty;\n return;\n }\n\n cursor[segment] = {\n ...existing,\n type: 'object',\n properties: existing.properties && isRecord(existing.properties) ? existing.properties : {},\n };\n\n cursor = cursor[segment].properties as Record<string, RequestJsonSchema>;\n });\n};\n","import json5 from 'json5';\n\nimport { normalizeDefinitionType, normalizeRequestDateTimeValue } from './normalize';\nimport { createSchemaProperty } from './schema-property';\nimport type { LegacyRequestInput, RequestDefinitionType, RequestJsonSchema } from './types';\nimport { isRecord, setPathValue } from './utils';\n\nconst normalizeLegacyType = (\n type?: string,\n): {\n type: RequestDefinitionType;\n format: string;\n} => {\n switch (type) {\n case 'bool':\n case 'boolean':\n return { type: 'boolean', format: '' };\n case 'number':\n case 'integer':\n return { type: 'number', format: '' };\n case 'array':\n return { type: 'array', format: '' };\n case 'object':\n return { type: 'object', format: '' };\n case 'datetime':\n return { type: 'datetime', format: 'date-time' };\n case 'string':\n return { type: 'string', format: '' };\n default:\n return { type: 'string', format: '' };\n }\n};\n\nexport const parseLegacyInputValue = (input: LegacyRequestInput) => {\n switch (input.type) {\n case 'bool':\n case 'boolean': {\n if (typeof input.value === 'string') {\n return input.value === 'true';\n }\n\n return Boolean(input.value);\n }\n case 'number':\n case 'integer': {\n const numericValue = Number(input.value);\n return Number.isFinite(numericValue) ? numericValue : input.value;\n }\n case 'array':\n if (Array.isArray(input.value)) {\n return input.value;\n }\n\n if (typeof input.value === 'string' && input.value.trim()) {\n try {\n const parsed = json5.parse(input.value);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n return [];\n case 'object':\n if (isRecord(input.value)) {\n return input.value;\n }\n\n if (typeof input.value === 'string' && input.value.trim()) {\n try {\n const parsed = json5.parse(input.value);\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n }\n\n return {};\n case 'datetime':\n return normalizeRequestDateTimeValue(input.value ?? '');\n default:\n return input.value ?? '';\n }\n};\n\nconst inferSchemaFromLegacyValue = (value: unknown): RequestJsonSchema => {\n if (Array.isArray(value)) {\n const sampleItem = value.find((item) => item !== undefined && item !== null);\n\n return {\n type: 'array',\n items: sampleItem === undefined ? { type: 'string' } : inferSchemaFromLegacyValue(sampleItem),\n };\n }\n\n if (isRecord(value)) {\n return {\n type: 'object',\n properties: Object.entries(value).reduce<Record<string, RequestJsonSchema>>((acc, [key, itemValue]) => {\n acc[key] = inferSchemaFromLegacyValue(itemValue);\n return acc;\n }, {}),\n };\n }\n\n switch (typeof value) {\n case 'number':\n return { type: 'number' };\n case 'boolean':\n return { type: 'boolean' };\n default:\n return { type: 'string' };\n }\n};\n\nconst buildLegacyInputSchemaProperty = (input: LegacyRequestInput): RequestJsonSchema => {\n const normalizedType = normalizeLegacyType(input.type);\n const parsedValue = parseLegacyInputValue(input);\n const inferredValueSchema = inferSchemaFromLegacyValue(parsedValue);\n const hasExplicitType = typeof input.type === 'string' && input.type.trim().length > 0;\n const resolvedType = hasExplicitType ? normalizedType.type : normalizeDefinitionType(inferredValueSchema);\n const schemaProperty = createSchemaProperty({\n type: resolvedType,\n description: String(input.description ?? input.desc ?? ''),\n format: resolvedType === 'datetime' ? normalizedType.format : '',\n order: 0,\n });\n\n if (resolvedType === 'object') {\n schemaProperty.properties = isRecord(inferredValueSchema.properties)\n ? inferredValueSchema.properties\n : (schemaProperty.properties ?? {});\n }\n\n if (resolvedType === 'array') {\n schemaProperty.items = inferredValueSchema.items ?? schemaProperty.items ?? { type: 'string' };\n }\n\n return schemaProperty;\n};\n\nconst setSchemaPropertySchemaByPath = (\n properties: Record<string, RequestJsonSchema>,\n key: string,\n schemaProperty: RequestJsonSchema,\n) => {\n const segments = key\n .split('.')\n .map((segment) => segment.trim())\n .filter(Boolean);\n\n if (segments.length === 0) {\n return;\n }\n\n let cursor = properties;\n segments.forEach((segment, index) => {\n const isLeaf = index === segments.length - 1;\n const existing = isRecord(cursor[segment]) ? (cursor[segment] as RequestJsonSchema) : {};\n\n if (isLeaf) {\n const nextProperty: RequestJsonSchema = {\n ...existing,\n ...schemaProperty,\n };\n\n if (isRecord(existing.properties) || isRecord(schemaProperty.properties)) {\n nextProperty.properties = {\n ...(isRecord(existing.properties) ? existing.properties : {}),\n ...(isRecord(schemaProperty.properties) ? schemaProperty.properties : {}),\n };\n }\n\n if (schemaProperty.items !== undefined || existing.items !== undefined) {\n nextProperty.items = schemaProperty.items ?? existing.items;\n }\n\n cursor[segment] = nextProperty;\n return;\n }\n\n cursor[segment] = {\n ...existing,\n type: 'object',\n properties: existing.properties && isRecord(existing.properties) ? existing.properties : {},\n };\n\n cursor = cursor[segment].properties as Record<string, RequestJsonSchema>;\n });\n};\n\nexport const buildLegacyInputProperties = (inputs?: LegacyRequestInput[]): Record<string, RequestJsonSchema> => {\n const legacyProperties: Record<string, RequestJsonSchema> = {};\n\n (inputs ?? []).forEach((input) => {\n const key = String(input.key ?? '').trim();\n if (!key) {\n return;\n }\n\n setSchemaPropertySchemaByPath(legacyProperties, key, buildLegacyInputSchemaProperty(input));\n });\n\n return legacyProperties;\n};\n\nexport const legacyInputsToExampleObject = (inputs?: LegacyRequestInput[]): Record<string, unknown> => {\n const example: Record<string, unknown> = {};\n\n (inputs ?? []).forEach((input) => {\n const key = String(input.key ?? '').trim();\n if (!key) {\n return;\n }\n\n setPathValue(example, key, parseLegacyInputValue(input));\n });\n\n return example;\n};\n\nexport const buildRequestSchemaFromLegacyInputs = (\n inputs?: LegacyRequestInput[],\n options?: {\n includeExamples?: boolean;\n },\n): RequestJsonSchema | null => {\n const legacyProperties = buildLegacyInputProperties(inputs);\n\n if (Object.keys(legacyProperties).length === 0) {\n return null;\n }\n\n const nextSchema: RequestJsonSchema = {\n type: 'object',\n properties: legacyProperties,\n };\n\n if (options?.includeExamples) {\n nextSchema.examples = [legacyInputsToExampleObject(inputs)];\n }\n\n return nextSchema;\n};\n","import json5 from 'json5';\n\nimport { buildRequestSchemaFromLegacyInputs } from './legacy';\nimport type { RequestContentLike, RequestJsonSchema } from './types';\nimport { isRecord } from './utils';\n\nexport const stringifyRequestSchemaValue = (schema?: unknown): string => {\n if (!schema) {\n return '';\n }\n\n if (typeof schema === 'string') {\n return schema;\n }\n\n if (isRecord(schema)) {\n return JSON.stringify(schema, null, 2);\n }\n\n return '';\n};\n\nexport const parseRequestSchemaValue = (schema?: unknown): RequestJsonSchema | null => {\n if (!schema) {\n return null;\n }\n\n if (typeof schema === 'string') {\n const trimmed = schema.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n const parsed = json5.parse(trimmed);\n return isRecord(parsed) ? (parsed as RequestJsonSchema) : null;\n } catch {\n return null;\n }\n }\n\n return isRecord(schema) ? (schema as RequestJsonSchema) : null;\n};\n\nexport const isLegacyRequestSchemaContent = (content?: RequestContentLike | null): boolean =>\n content?.schemaUI !== undefined || (content?.inputs ?? []).length > 0;\n\nexport const getRequestSchemaStorageField = (content?: RequestContentLike | null): 'schema' | 'schemaUI' =>\n isLegacyRequestSchemaContent(content) ? 'schemaUI' : 'schema';\n\nexport const getRequestSchemaSourceValue = (content?: RequestContentLike | null): unknown => {\n if (!content) {\n return undefined;\n }\n\n if (content.schemaUI !== undefined) {\n return content.schemaUI;\n }\n\n if ((content.inputs ?? []).length > 0) {\n return undefined;\n }\n\n return content.schema;\n};\n\nexport const setRequestSchemaValue = (content: RequestContentLike & Record<string, any>, schemaValue: unknown) => {\n const storageField = getRequestSchemaStorageField(content);\n content[storageField] = schemaValue;\n\n if (storageField === 'schemaUI') {\n delete content.schema;\n } else {\n delete content.schemaUI;\n }\n\n delete content.inputs;\n};\n\nexport const resolveRequestSchemaValue = (\n content?: RequestContentLike | null,\n options?: {\n includeExamples?: boolean;\n },\n): RequestJsonSchema | null => {\n const parsedSchema = parseRequestSchemaValue(getRequestSchemaSourceValue(content));\n const hasSchemaProperties = Boolean(parsedSchema && isRecord(parsedSchema.properties));\n const hasSchemaUI = content?.schemaUI !== undefined;\n\n if (parsedSchema && (hasSchemaProperties || hasSchemaUI || (content?.inputs ?? []).length === 0)) {\n return parsedSchema;\n }\n\n return buildRequestSchemaFromLegacyInputs(content?.inputs, options) ?? parsedSchema;\n};\n\nexport const stringifyResolvedRequestSchemaValue = (\n content?: RequestContentLike | null,\n options?: {\n includeExamples?: boolean;\n },\n): string => stringifyRequestSchemaValue(resolveRequestSchemaValue(content, options));\n\nexport const normalizeRequestContentSchemaStorage = <T extends RequestContentLike & Record<string, any>>(\n content: T,\n): T => {\n if (!isLegacyRequestSchemaContent(content)) {\n if (content.schemaUI !== undefined) {\n const nextContent = { ...content };\n delete nextContent.schemaUI;\n return nextContent;\n }\n\n return content;\n }\n\n const nextContent = { ...content };\n const nextSchema = stringifyResolvedRequestSchemaValue(content, { includeExamples: true });\n nextContent.schemaUI = nextSchema;\n delete nextContent.schema;\n delete nextContent.inputs;\n\n return nextContent;\n};\n\nexport const normalizeDecisionGraphRequestSchemaStorage = <T extends { nodes?: any[] }>(graph: T): T => {\n if (!Array.isArray(graph?.nodes)) {\n return graph;\n }\n\n let hasChanges = false;\n const nextNodes = graph.nodes.map((node) => {\n if (node?.type !== 'inputNode' || !isRecord(node?.content)) {\n return node;\n }\n\n const nextContent = normalizeRequestContentSchemaStorage(node.content);\n if (nextContent === node.content) {\n return node;\n }\n\n hasChanges = true;\n return {\n ...node,\n content: nextContent,\n };\n });\n\n return hasChanges\n ? {\n ...graph,\n nodes: nextNodes,\n }\n : graph;\n};\n","import { legacyInputsToExampleObject } from './legacy';\nimport { normalizeRequestDateTimeValue, requestDateTimePattern } from './normalize';\nimport { getRequestSchemaSourceValue, parseRequestSchemaValue, stringifyRequestSchemaValue } from './schema-value';\nimport type {\n RequestContentLike,\n RequestDefinition,\n RequestDefinitionSyncConflict,\n RequestDefinitionType,\n RequestExampleMeta,\n RequestExampleSource,\n RequestJsonSchema,\n} from './types';\nimport {\n cloneRequestExampleValue,\n deletePathValue,\n getPathValue,\n isRecord,\n setMergedPathValue,\n setPathValue,\n} from './utils';\n\nexport const formatRequestExampleSourceName = (index: number, dataLabel = 'Data') => `${dataLabel} ${index + 1}`;\n\nexport const formatJsonDraft = (value: unknown) => {\n if (value === undefined) {\n return '';\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n return JSON.stringify(value, null, 2);\n};\n\nexport const collectExampleDataPaths = (value: unknown, prefix = '', paths: string[] = []): string[] => {\n if (!isRecord(value)) {\n return paths;\n }\n\n Object.entries(value).forEach(([key, item]) => {\n const path = prefix ? `${prefix}.${key}` : key;\n if (isRecord(item)) {\n collectExampleDataPaths(item, path, paths);\n } else {\n paths.push(path);\n }\n });\n\n return paths;\n};\n\nconst parseRequestDefinitionDefaultValue = (defaultValue: string | undefined, type: RequestDefinitionType): unknown => {\n if (defaultValue === undefined || !defaultValue.trim()) {\n return undefined;\n }\n\n const trimmedDefaultValue = defaultValue.trim();\n\n switch (type) {\n case 'number': {\n const parsedNumber = Number(trimmedDefaultValue);\n return Number.isFinite(parsedNumber) ? parsedNumber : trimmedDefaultValue;\n }\n case 'boolean':\n return trimmedDefaultValue.toLowerCase() === 'true';\n case 'array':\n case 'object': {\n try {\n return JSON.parse(trimmedDefaultValue);\n } catch {\n return trimmedDefaultValue;\n }\n }\n default:\n return trimmedDefaultValue;\n }\n};\n\nconst getDefaultExampleValueByDefinitionType = (type: RequestDefinitionType): unknown => {\n const padNumber = (value: number) => String(value).padStart(2, '0');\n const getDefaultDateTimeValue = () => {\n const now = new Date();\n const year = now.getFullYear();\n const month = padNumber(now.getMonth() + 1);\n const day = padNumber(now.getDate());\n const timezoneOffsetMinutes = -now.getTimezoneOffset();\n const timezoneSign = timezoneOffsetMinutes >= 0 ? '+' : '-';\n const absoluteOffsetMinutes = Math.abs(timezoneOffsetMinutes);\n const offsetHours = padNumber(Math.floor(absoluteOffsetMinutes / 60));\n const offsetMinutes = padNumber(absoluteOffsetMinutes % 60);\n\n return `${year}-${month}-${day}T00:00:00${timezoneSign}${offsetHours}:${offsetMinutes}`;\n };\n\n switch (type) {\n case 'number':\n return 0;\n case 'boolean':\n return false;\n case 'array':\n return [];\n case 'object':\n return {};\n case 'datetime':\n return getDefaultDateTimeValue();\n default:\n return '';\n }\n};\n\nexport const buildRequestExampleTemplateFromDefinitions = (\n definitions: Array<Pick<RequestDefinition, 'name' | 'path' | 'type' | 'defaultValue'>>,\n): Record<string, unknown> => {\n const template: Record<string, unknown> = {};\n const orderedDefinitions = [...definitions]\n .filter((definition) => definition.name.trim() && definition.path.trim())\n .sort((left, right) => left.path.split('.').length - right.path.split('.').length);\n\n orderedDefinitions.forEach((definition) => {\n const definitionDefault = parseRequestDefinitionDefaultValue(definition.defaultValue, definition.type);\n setPathValue(\n template,\n definition.path,\n definitionDefault === undefined ? getDefaultExampleValueByDefinitionType(definition.type) : definitionDefault,\n );\n });\n\n return template;\n};\n\nconst mergeRequestExampleValueWithTemplate = (templateValue: unknown, dataValue: unknown): unknown => {\n if (isRecord(templateValue)) {\n if (!isRecord(dataValue)) {\n return dataValue === undefined ? cloneRequestExampleValue(templateValue) : cloneRequestExampleValue(dataValue);\n }\n\n const mergedObject: Record<string, unknown> = {};\n\n Object.keys(templateValue).forEach((key) => {\n mergedObject[key] = mergeRequestExampleValueWithTemplate(templateValue[key], dataValue[key]);\n });\n\n Object.keys(dataValue).forEach((key) => {\n if (!(key in mergedObject)) {\n mergedObject[key] = cloneRequestExampleValue(dataValue[key]);\n }\n });\n\n return mergedObject;\n }\n\n if (dataValue !== undefined) {\n return cloneRequestExampleValue(dataValue);\n }\n\n return cloneRequestExampleValue(templateValue);\n};\n\nexport const mergeRequestExampleDataWithTemplate = (\n template: Record<string, unknown>,\n data?: Record<string, unknown>,\n): Record<string, unknown> => {\n const normalizedData = isRecord(data) ? data : {};\n return mergeRequestExampleValueWithTemplate(template, normalizedData) as Record<string, unknown>;\n};\n\nexport const normalizeRequestExampleDataByDefinitions = (\n data: Record<string, unknown>,\n definitions: Array<Pick<RequestDefinition, 'path' | 'type'>>,\n): Record<string, unknown> => {\n const normalizedData = cloneRequestExampleValue(data) as Record<string, unknown>;\n\n definitions.forEach((definition) => {\n if (definition.type !== 'datetime') {\n return;\n }\n\n const definitionPath = definition.path.trim();\n if (!definitionPath) {\n return;\n }\n\n const currentValue = getPathValue(normalizedData, definitionPath);\n if (currentValue === undefined) {\n return;\n }\n\n setPathValue(normalizedData, definitionPath, normalizeRequestDateTimeValue(currentValue));\n });\n\n return normalizedData;\n};\n\nconst isSkeletonLikeRequestValue = (value: unknown): boolean => {\n if (value === '' || value === 0 || value === false) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (isRecord(value)) {\n const entries = Object.values(value);\n return entries.length === 0 || entries.every((entry) => isSkeletonLikeRequestValue(entry));\n }\n\n return false;\n};\n\nconst isRequestValueCompatibleWithDefinition = (\n value: unknown,\n definition: Pick<RequestDefinition, 'type'>,\n): boolean => {\n switch (definition.type) {\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isRecord(value);\n case 'datetime':\n return typeof value === 'string' && requestDateTimePattern.test(value.trim());\n default:\n return typeof value === 'string';\n }\n};\n\nexport const getRequestExampleDataDefinitionConflicts = (\n data: Record<string, unknown>,\n definitions: Array<Pick<RequestDefinition, 'name' | 'path' | 'type'>>,\n): RequestDefinitionSyncConflict[] =>\n definitions\n .filter((definition) => definition.name.trim() && definition.path.trim())\n .flatMap((definition) => {\n const currentValue = getPathValue(data, definition.path.trim());\n if (currentValue === undefined || isRequestValueCompatibleWithDefinition(currentValue, definition)) {\n return [];\n }\n\n return [\n {\n path: definition.path,\n nextType: definition.type,\n value: cloneRequestExampleValue(currentValue),\n },\n ];\n });\n\nexport const prepareRequestExampleDataDefinitionSync = (\n data: Record<string, unknown>,\n definitions: Array<Pick<RequestDefinition, 'name' | 'path' | 'type'>>,\n options?: {\n forceResetConflicts?: boolean;\n },\n): {\n data: Record<string, unknown>;\n conflicts: RequestDefinitionSyncConflict[];\n} => {\n const validDefinitions = definitions.filter((definition) => definition.name.trim() && definition.path.trim());\n\n if (validDefinitions.length === 0) {\n return {\n data: cloneRequestExampleValue(data) as Record<string, unknown>,\n conflicts: [],\n };\n }\n\n const forceResetConflicts = options?.forceResetConflicts ?? false;\n const syncedData = buildRequestExampleTemplateFromDefinitions(validDefinitions);\n const conflicts: RequestDefinitionSyncConflict[] = [];\n\n validDefinitions\n .slice()\n .sort((left, right) => left.path.split('.').length - right.path.split('.').length)\n .forEach((definition) => {\n const definitionPath = definition.path.trim();\n if (!definitionPath) {\n return;\n }\n\n const currentValue = getPathValue(data, definitionPath);\n if (currentValue === undefined) {\n return;\n }\n\n const isCompatible = isRequestValueCompatibleWithDefinition(currentValue, definition);\n if (!isCompatible) {\n if (!isSkeletonLikeRequestValue(currentValue) && !forceResetConflicts) {\n conflicts.push({\n path: definitionPath,\n nextType: definition.type,\n value: cloneRequestExampleValue(currentValue),\n });\n return;\n }\n\n return;\n }\n\n if (definition.type === 'object') {\n const hasNestedDefinitions = validDefinitions.some(\n (item) => item.path !== definitionPath && item.path.startsWith(`${definitionPath}.`),\n );\n\n if (!hasNestedDefinitions && isRecord(currentValue)) {\n setPathValue(syncedData, definitionPath, cloneRequestExampleValue(currentValue));\n }\n\n return;\n }\n\n if (definition.type === 'datetime') {\n setPathValue(syncedData, definitionPath, normalizeRequestDateTimeValue(currentValue));\n return;\n }\n\n setPathValue(syncedData, definitionPath, cloneRequestExampleValue(currentValue));\n });\n\n return {\n data: normalizeRequestExampleDataByDefinitions(syncedData, validDefinitions),\n conflicts,\n };\n};\n\nexport const syncRequestExampleDataToDefinitions = (\n data: Record<string, unknown>,\n definitions: Array<Pick<RequestDefinition, 'name' | 'path' | 'type'>>,\n): Record<string, unknown> => {\n return prepareRequestExampleDataDefinitionSync(data, definitions, { forceResetConflicts: true }).data;\n};\n\nexport const mergeRequestExampleDefaultsByDefinitions = (\n data: Record<string, unknown>,\n definitions: Array<Pick<RequestDefinition, 'name' | 'path' | 'type' | 'defaultValue'>>,\n): Record<string, unknown> => {\n const mergedData = cloneRequestExampleValue(data) as Record<string, unknown>;\n\n definitions\n .filter((definition) => definition.name.trim() && definition.path.trim())\n .forEach((definition) => {\n const definitionDefault = parseRequestDefinitionDefaultValue(definition.defaultValue, definition.type);\n if (definitionDefault === undefined) {\n return;\n }\n\n const definitionPath = definition.path.trim();\n const currentValue = getPathValue(mergedData, definitionPath);\n if (currentValue !== undefined && !isSkeletonLikeRequestValue(currentValue)) {\n return;\n }\n\n setPathValue(mergedData, definitionPath, cloneRequestExampleValue(definitionDefault));\n });\n\n return mergedData;\n};\n\nexport const syncRequestExampleDataWithDefinitionChanges = (\n data: Record<string, unknown>,\n previousDefinitions: Array<Pick<RequestDefinition, 'id' | 'path'>>,\n nextDefinitions: Array<Pick<RequestDefinition, 'id' | 'path'>>,\n): Record<string, unknown> => {\n const syncedData = cloneRequestExampleValue(data) as Record<string, unknown>;\n const nextDefinitionById = new Map(nextDefinitions.map((definition) => [definition.id, definition]));\n\n const removedPaths = previousDefinitions\n .filter((definition) => !nextDefinitionById.has(definition.id))\n .map((definition) => definition.path)\n .sort((left, right) => right.split('.').length - left.split('.').length);\n\n removedPaths.forEach((path) => deletePathValue(syncedData, path));\n\n const renamedPaths = previousDefinitions\n .flatMap((definition) => {\n const nextDefinition = nextDefinitionById.get(definition.id);\n if (!nextDefinition || nextDefinition.path === definition.path) {\n return [];\n }\n\n return [\n {\n from: definition.path,\n to: nextDefinition.path,\n },\n ];\n })\n .sort((left, right) => right.from.split('.').length - left.from.split('.').length);\n\n renamedPaths.forEach(({ from, to }) => {\n const value = getPathValue(syncedData, from);\n if (value === undefined) {\n return;\n }\n\n deletePathValue(syncedData, from);\n setMergedPathValue(syncedData, to, value);\n });\n\n return syncedData;\n};\n\nexport const getRequestExampleSources = (\n content?: RequestContentLike | null,\n options?: {\n dataLabel?: string;\n },\n): RequestExampleSource[] => {\n const schema = parseRequestSchemaValue(getRequestSchemaSourceValue(content));\n const dataLabel = options?.dataLabel ?? 'Data';\n const schemaExamples = Array.isArray(schema?.examples) ? schema.examples : [];\n const schemaExamplesMeta = Array.isArray(schema?.['x-examples-meta']) ? schema['x-examples-meta'] : [];\n\n if (schemaExamples.length > 0) {\n return schemaExamples.map((example, index) => {\n const meta = schemaExamplesMeta[index];\n return {\n id: `schema-example-${index}`,\n name: meta?.name?.trim() || formatRequestExampleSourceName(index, dataLabel),\n description: meta?.description?.trim(),\n data: isRecord(example) ? { ...example } : { value: example },\n source: 'schema.examples',\n };\n });\n }\n\n if ((content?.inputs ?? []).length > 0) {\n return [\n {\n id: 'schema-example-0',\n name: formatRequestExampleSourceName(0, dataLabel),\n data: legacyInputsToExampleObject(content?.inputs),\n source: 'schema.examples',\n },\n ];\n }\n\n return [];\n};\n\nexport const updateRequestSchemaExamples = (\n schemaValue: unknown,\n examples: Array<Record<string, unknown>>,\n examplesMeta?: RequestExampleMeta[],\n): string => {\n const currentSchema = parseRequestSchemaValue(schemaValue) ?? {};\n const nextSchema: RequestJsonSchema = {\n ...currentSchema,\n type: 'object',\n examples: examples.map((example) => ({ ...example })),\n };\n\n if (examplesMeta && examplesMeta.length > 0) {\n const hasContent = examplesMeta.some((meta) => meta?.name?.trim() || meta?.description?.trim());\n if (hasContent) {\n nextSchema['x-examples-meta'] = examplesMeta.map((meta) => ({\n name: meta?.name?.trim(),\n description: meta?.description?.trim(),\n }));\n }\n }\n\n return stringifyRequestSchemaValue(nextSchema);\n};\n","import json5 from 'json5';\n\nimport {\n buildRequestExampleTemplateFromDefinitions,\n collectExampleDataPaths,\n formatRequestExampleSourceName,\n getRequestExampleDataDefinitionConflicts,\n mergeRequestExampleDataWithTemplate,\n normalizeRequestExampleDataByDefinitions,\n updateRequestSchemaExamples,\n} from './examples';\nimport { parseRequestSchemaValue, resolveRequestSchemaValue, setRequestSchemaValue } from './schema-value';\nimport type {\n InputContract,\n InputContractExample,\n RequestContentLike,\n RequestDefinition,\n RequestDefinitionSyncConflict,\n RequestExampleMeta,\n RequestExampleSource,\n RequestJsonSchema,\n} from './types';\nimport { cloneRequestExampleValue, deletePathValue, getPathValue, isRecord } from './utils';\n\nexport type { InputContract, InputContractExample };\n\n/**\n * InputContract(ADR-013)——输入节点唯一事实源。\n *\n * 存储纪律(additive):契约整体存 `content.inputContract`;旧字段\n * (schema/schemaUI,examples 内嵌)保留为 legacy 读取回退,每次写契约时\n * 同步重生成镜像(双写)——旧版本 kernel / jdm-editor 读取镜像不丢数据。\n */\nexport const INPUT_CONTRACT_VERSION = 1;\n\nexport type RequestInputContractOrigin = 'contract' | 'legacy';\n\nconst EXAMPLES_FIELD = 'examples';\nconst EXAMPLES_META_FIELD = 'x-examples-meta';\n\n// FNV-1a 双通道(不同偏移基、同质数)——仅作相等性锚点,非密码学散列;\n// 规避 crypto.subtle 的安全上下文约束(ADR-007)。\nexport const requestSchemaFingerprint = (schema: unknown): string => {\n const canonicalize = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map(canonicalize);\n }\n\n if (isRecord(value)) {\n return Object.keys(value)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = canonicalize(value[key]);\n return acc;\n }, {});\n }\n\n return value;\n };\n\n const text = JSON.stringify(canonicalize(schema ?? {}));\n let h1 = 0x811c9dc5;\n let h2 = (0x811c9dc5 ^ 0x9e3779b9) >>> 0;\n\n for (let index = 0; index < text.length; index += 1) {\n const charCode = text.charCodeAt(index);\n h1 = Math.imul(h1 ^ charCode, 0x01000193) >>> 0;\n h2 = Math.imul(h2 ^ charCode, 0x01000193) >>> 0;\n }\n\n return `${h1.toString(16).padStart(8, '0')}${h2.toString(16).padStart(8, '0')}`;\n};\n\nconst toRecordData = (data: unknown): Record<string, unknown> => (isRecord(data) ? { ...data } : { value: data });\n\nconst normalizeStoredExample = (example: unknown, index: number): InputContractExample => {\n const record = isRecord(example) ? example : {};\n return {\n id: typeof record.id === 'string' && record.id ? record.id : `contract-example-${index}`,\n name: typeof record.name === 'string' && record.name.trim() ? record.name : formatRequestExampleSourceName(index),\n description: typeof record.description === 'string' && record.description.trim() ? record.description : undefined,\n data: toRecordData(record.data),\n schemaFingerprint: typeof record.schemaFingerprint === 'string' ? record.schemaFingerprint : undefined,\n };\n};\n\nconst normalizeStoredContract = (stored: Record<string, any>): InputContract => {\n const schema = parseRequestSchemaValue(stored.schema) ?? {};\n const examples = Array.isArray(stored.examples) ? stored.examples : [];\n\n return {\n contractVersion: typeof stored.contractVersion === 'number' ? stored.contractVersion : INPUT_CONTRACT_VERSION,\n schema,\n examples: examples.map((example, index) => normalizeStoredExample(example, index)),\n };\n};\n\n/** legacy 形态(examples 内嵌 schema)→ 契约投影。schema 文档剥离 examples / x-examples-meta。 */\nconst deriveContractFromLegacy = (content?: RequestContentLike | null): InputContract => {\n const resolvedSchema = resolveRequestSchemaValue(content, { includeExamples: true });\n const schemaExamples = Array.isArray(resolvedSchema?.[EXAMPLES_FIELD]) ? resolvedSchema?.[EXAMPLES_FIELD] : [];\n const schemaExamplesMeta = Array.isArray(resolvedSchema?.[EXAMPLES_META_FIELD])\n ? resolvedSchema?.[EXAMPLES_META_FIELD]\n : [];\n const schemaProper: RequestJsonSchema = {};\n\n if (resolvedSchema && isRecord(resolvedSchema)) {\n Object.entries(resolvedSchema).forEach(([key, value]) => {\n if (key !== EXAMPLES_FIELD && key !== EXAMPLES_META_FIELD) {\n schemaProper[key] = value;\n }\n });\n }\n\n const examples = schemaExamples.map((example, index) => {\n const meta: RequestExampleMeta | undefined = schemaExamplesMeta[index];\n return {\n id: `schema-example-${index}`,\n name: meta?.name?.trim() || formatRequestExampleSourceName(index),\n description: meta?.description?.trim() || undefined,\n data: toRecordData(example),\n schemaFingerprint: undefined,\n };\n });\n\n return { contractVersion: INPUT_CONTRACT_VERSION, schema: schemaProper, examples };\n};\n\n/**\n * 读契约:`content.inputContract` 优先,legacy(schema 内嵌 examples)回退投影。\n * 返回 origin 供「首次编辑迁移写入」判定。\n */\nexport const readRequestInputContract = (\n content?: RequestContentLike | null,\n): { contract: InputContract; origin: RequestInputContractOrigin } => {\n const stored = isRecord(content?.inputContract) ? content?.inputContract : null;\n\n if (stored) {\n return { contract: normalizeStoredContract(stored), origin: 'contract' };\n }\n\n return { contract: deriveContractFromLegacy(content), origin: 'legacy' };\n};\n\n/**\n * 写契约(双写):`content.inputContract` = 规范形态;legacy 镜像\n * (schemaUI/schema,examples + x-examples-meta 内嵌)同步重生成——\n * 旧版本 kernel / jdm-editor 打开同一张图不丢数据(interchange 硬约束)。\n */\nexport const writeRequestInputContract = (\n content: RequestContentLike & Record<string, any>,\n contract: InputContract,\n): InputContract => {\n const nextContract: InputContract = {\n contractVersion: contract.contractVersion || INPUT_CONTRACT_VERSION,\n schema: isRecord(contract.schema) ? contract.schema : {},\n examples: contract.examples.map((example, index) => normalizeStoredExample(example, index)),\n };\n\n content.inputContract = {\n contractVersion: nextContract.contractVersion,\n schema: nextContract.schema,\n examples: nextContract.examples.map((example) => ({\n id: example.id,\n name: example.name,\n ...(example.description ? { description: example.description } : {}),\n data: cloneRequestExampleValue(example.data) as Record<string, unknown>,\n ...(example.schemaFingerprint ? { schemaFingerprint: example.schemaFingerprint } : {}),\n })),\n };\n\n setRequestSchemaValue(\n content,\n updateRequestSchemaExamples(\n nextContract.schema,\n nextContract.examples.map((example) => example.data),\n nextContract.examples.map((example) => ({ name: example.name, description: example.description })),\n ),\n );\n\n return nextContract;\n};\n\n/** 把带内嵌 examples 的 schema 文本并入契约:结构进 schema、内嵌 examples 按序替换示例集。 */\nexport const applySchemaTextToInputContract = (contract: InputContract, schemaText: string): InputContract => {\n const parsed = parseRequestSchemaValue(schemaText);\n\n if (!parsed) {\n return { contractVersion: contract.contractVersion, schema: {}, examples: contract.examples };\n }\n\n const embeddedExamples = Array.isArray(parsed[EXAMPLES_FIELD]) ? parsed[EXAMPLES_FIELD] : [];\n const embeddedMeta = Array.isArray(parsed[EXAMPLES_META_FIELD]) ? parsed[EXAMPLES_META_FIELD] : [];\n const schemaProper: RequestJsonSchema = {};\n\n Object.entries(parsed).forEach(([key, value]) => {\n if (key !== EXAMPLES_FIELD && key !== EXAMPLES_META_FIELD) {\n schemaProper[key] = value;\n }\n });\n\n if (embeddedExamples.length === 0) {\n return { contractVersion: contract.contractVersion, schema: schemaProper, examples: contract.examples };\n }\n\n const examples = embeddedExamples.map((example, index) => {\n const meta: RequestExampleMeta | undefined = embeddedMeta[index];\n const existing = contract.examples[index];\n\n return {\n id: existing?.id ?? `schema-example-${index}`,\n name: meta?.name?.trim() || existing?.name || formatRequestExampleSourceName(index),\n description: meta?.description?.trim() || existing?.description,\n data: toRecordData(example),\n schemaFingerprint: undefined,\n };\n });\n\n return { contractVersion: contract.contractVersion, schema: schemaProper, examples };\n};\n\nexport const contractExamplesToSources = (\n contract: InputContract,\n options?: { dataLabel?: string },\n): RequestExampleSource[] =>\n contract.examples.map((example, index) => ({\n id: example.id,\n name: example.name.trim() || formatRequestExampleSourceName(index, options?.dataLabel),\n description: example.description,\n data: { ...example.data },\n source: 'schema.examples',\n }));\n\n/**\n * Drift 报告(评审裁定口径):逐 example 重校验 + missing/extra/type-mismatch\n * 三类清单——不做全量 JSON Schema structural diff。\n */\nexport type RequestExampleDrift = {\n /** 定义了字段但 example 缺值 */\n missing: Array<Pick<RequestDefinition, 'name' | 'path' | 'type'>>;\n /** example 有值但定义不存在(嵌套路径被所属定义前缀覆盖的不算) */\n extra: string[];\n /** 类型不匹配(不安全漂移——迁移不动它,用户逐个决策) */\n conflicts: RequestDefinitionSyncConflict[];\n};\n\nexport const computeExampleDrift = (\n data: Record<string, unknown>,\n definitions: Array<Pick<RequestDefinition, 'name' | 'path' | 'type'>>,\n): RequestExampleDrift => {\n const validDefinitions = definitions.filter((definition) => definition.name.trim() && definition.path.trim());\n const conflicts = getRequestExampleDataDefinitionConflicts(data, validDefinitions);\n const missing = validDefinitions.filter((definition) => getPathValue(data, definition.path.trim()) === undefined);\n const dataPaths = collectExampleDataPaths(data);\n const definitionPaths = validDefinitions.map((definition) => definition.path.trim());\n const extra = dataPaths.filter(\n (dataPath) =>\n !definitionPaths.some(\n (definitionPath) => dataPath === definitionPath || dataPath.startsWith(`${definitionPath}.`),\n ),\n );\n\n return { missing, extra, conflicts };\n};\n\nexport const hasExampleDrift = (drift: RequestExampleDrift): boolean =>\n drift.missing.length > 0 || drift.extra.length > 0 || drift.conflicts.length > 0;\n\n/**\n * 安全迁移(ADR-013 §2):缺值按定义默认值(无默认按类型零值)补齐、多余字段\n * 移除、datetime 归一化;类型冲突值**原样保留**(不安全漂移——用户逐个决策),\n * 经 conflicts 返回。\n */\nexport const migrateRequestExampleDataByDefinitions = (\n data: Record<string, unknown>,\n definitions: Array<Pick<RequestDefinition, 'name' | 'path' | 'type' | 'defaultValue'>>,\n): { data: Record<string, unknown>; conflicts: RequestDefinitionSyncConflict[] } => {\n const validDefinitions = definitions.filter((definition) => definition.name.trim() && definition.path.trim());\n\n if (validDefinitions.length === 0) {\n return { data: cloneRequestExampleValue(data) as Record<string, unknown>, conflicts: [] };\n }\n\n const template = buildRequestExampleTemplateFromDefinitions(validDefinitions);\n const migrated = mergeRequestExampleDataWithTemplate(template, data);\n\n collectExampleDataPaths(migrated).forEach((dataPath) => {\n const coveredByDefinition = validDefinitions.some((definition) => {\n const definitionPath = definition.path.trim();\n return dataPath === definitionPath || dataPath.startsWith(`${definitionPath}.`);\n });\n\n if (!coveredByDefinition) {\n deletePathValue(migrated, dataPath);\n }\n });\n\n const normalized = normalizeRequestExampleDataByDefinitions(migrated, validDefinitions);\n\n return {\n data: normalized,\n conflicts: getRequestExampleDataDefinitionConflicts(normalized, validDefinitions),\n };\n};\n\n/**\n * 分享信封(spec §2 / ADR-013 §4,清单 #7):{contractVersion, schema,\n * examples} 自包含交换物——OpenAPI / mock / 测试夹具 / 规则分享的共同根。\n * 不携带 schemaFingerprint:指纹锚是接收方自己的校验时点,导入后重新戳记。\n */\nexport type InputContractEnvelope = {\n contractVersion: number;\n schema: RequestJsonSchema;\n examples: Array<Pick<InputContractExample, 'id' | 'name' | 'description' | 'data'>>;\n};\n\nexport const exportInputContractEnvelope = (contract: InputContract): InputContractEnvelope => ({\n contractVersion: contract.contractVersion || INPUT_CONTRACT_VERSION,\n schema: isRecord(contract.schema) ? contract.schema : {},\n examples: contract.examples.map((example) => ({\n id: example.id,\n name: example.name,\n ...(example.description ? { description: example.description } : {}),\n data: cloneRequestExampleValue(example.data) as Record<string, unknown>,\n })),\n});\n\nexport type ParseInputContractEnvelopeResult =\n | { ok: true; contract: InputContract }\n | { ok: false; error: 'invalid-json' | 'invalid-shape' | 'unsupported-version' };\n\n/** 支持的最低/当前信封版本——更高版本拒收(向前兼容:旧版本读新信封报版本错误而非静默丢数据) */\nexport const INPUT_CONTRACT_SUPPORTED_VERSION = INPUT_CONTRACT_VERSION;\n\n/**\n * 解析分享信封。确定性(无随机):缺失/重复的 id 置为 '',由调用层在合并时\n * 铸造新 id(须对照既有契约的 id 空间)。\n */\nexport const parseInputContractEnvelope = (text: string): ParseInputContractEnvelopeResult => {\n let parsed: unknown;\n\n try {\n parsed = json5.parse(text);\n } catch {\n return { ok: false, error: 'invalid-json' };\n }\n\n if (!isRecord(parsed) || !isRecord(parsed.schema) || !Array.isArray(parsed.examples)) {\n return { ok: false, error: 'invalid-shape' };\n }\n\n const contractVersion = parsed.contractVersion;\n if (typeof contractVersion !== 'number' || contractVersion > INPUT_CONTRACT_SUPPORTED_VERSION) {\n return { ok: false, error: 'unsupported-version' };\n }\n\n const seenIds = new Set<string>();\n const examples = parsed.examples.map((example, index) => {\n const record = isRecord(example) ? example : {};\n const rawId = typeof record.id === 'string' ? record.id.trim() : '';\n const id = rawId && !seenIds.has(rawId) ? rawId : '';\n seenIds.add(rawId);\n\n return {\n id,\n name: typeof record.name === 'string' && record.name.trim() ? record.name : formatRequestExampleSourceName(index),\n description: typeof record.description === 'string' && record.description.trim() ? record.description : undefined,\n data: toRecordData(record.data),\n };\n });\n\n return { ok: true, contract: { contractVersion, schema: parsed.schema, examples } };\n};\n","import type { Ajv2020, ErrorObject, ValidateFunction } from 'ajv/dist/2020';\n\nimport { requestSchemaFingerprint } from './contract';\nimport type { RequestJsonSchema } from './types';\n\n/**\n * ajv 懒加载校验服务(ADR-013 OQ2 裁定:ajv core + 2020-12 模块)。\n *\n * - 动态 import → 独立异步 chunk,主入口体积预算不动(评审:预算上调需宿主裁,\n * 懒加载则无需上调);\n * - 编译产物按 schema 指纹缓存——纯缓存(透明于语义,非权威状态);\n * - 与指纹锚协议正交(ADR-013 实施注记):约束违例是实时警告,不参与戳记。\n */\n\nlet ajvInstancePromise: Promise<Ajv2020> | null = null;\nconst compileCache = new Map<string, Promise<ValidateFunction>>();\n\nconst loadAjv = (): Promise<Ajv2020> => {\n // ajv-formats 随 ajv 同批懒加载——definitions 为 datetime 字段产出\n // format: 'date-time',strict 模式下未知 format 会在编译期抛错,\n // 不注册 formats 则该 schema 的约束校验静默降级(2026-10-01 实测钉住)\n ajvInstancePromise ??= Promise.all([import('ajv/dist/2020'), import('ajv-formats')]).then(([mod, formats]) => {\n const ajv = new mod.default({ allErrors: true });\n formats.default(ajv);\n return ajv;\n });\n return ajvInstancePromise;\n};\n\nconst loadValidator = (schema: RequestJsonSchema): Promise<ValidateFunction> => {\n const fingerprint = requestSchemaFingerprint(schema);\n let validatorPromise = compileCache.get(fingerprint);\n\n if (!validatorPromise) {\n validatorPromise = loadAjv().then((ajv) => ajv.compile(schema));\n compileCache.set(fingerprint, validatorPromise);\n }\n\n return validatorPromise;\n};\n\nconst formatAjvError = (error: ErrorObject): string => `${error.instancePath || '/'} ${error.message ?? ''}`.trim();\n\n/**\n * 单实例校验。schema 不可编译(非法关键字组合等)返回空清单——schema 自身\n * 的错误交回 Schema 页签编辑面反馈,不在实例校验层报错。\n */\nexport const validateExampleDataBySchema = async (data: unknown, schema: RequestJsonSchema): Promise<string[]> => {\n try {\n const validator = await loadValidator(schema);\n\n if (validator(data)) {\n return [];\n }\n\n return validator.errors?.map(formatAjvError) ?? [];\n } catch {\n return [];\n }\n};\n\n/** 批量校验:N 个 example 共享一次编译。 */\nexport const validateExampleDatasBySchema = async (\n datas: unknown[],\n schema: RequestJsonSchema,\n): Promise<string[][]> => {\n try {\n const validator = await loadValidator(schema);\n\n return datas.map((data) => {\n if (validator(data)) {\n return [];\n }\n\n return validator.errors?.map(formatAjvError) ?? [];\n });\n } catch {\n return datas.map(() => []);\n }\n};\n","import { buildLegacyInputProperties } from './legacy';\nimport { normalizeDefinitionType, normalizeRequestFieldKey } from './normalize';\nimport { setSchemaPropertyByPath } from './schema-property';\nimport { getRequestSchemaSourceValue, parseRequestSchemaValue, stringifyRequestSchemaValue } from './schema-value';\nimport type { RequestContentLike, RequestDefinition, RequestJsonSchema } from './types';\nimport { buildDefinitionPath, hasOwn, isRecord } from './utils';\n\nconst getSchemaPropertyOrder = (schema: RequestJsonSchema | undefined, fallbackOrder: number) => {\n const schemaOrder = schema?.['x-order'];\n return typeof schemaOrder === 'number' && Number.isFinite(schemaOrder) ? schemaOrder : fallbackOrder;\n};\n\nconst getSortedSchemaPropertyEntries = (properties: Record<string, RequestJsonSchema>) =>\n Object.entries(properties)\n .map(([key, propertySchema], index) => ({\n key,\n propertySchema,\n index,\n order: getSchemaPropertyOrder(propertySchema, index),\n }))\n .sort((left, right) => left.order - right.order || left.index - right.index);\n\nconst flattenSchemaProperties = (\n properties: Record<string, RequestJsonSchema>,\n parentPath = '',\n depth = 0,\n): RequestDefinition[] => {\n const definitions: RequestDefinition[] = [];\n\n getSortedSchemaPropertyEntries(properties).forEach(({ key, propertySchema, order }) => {\n const fieldPath = buildDefinitionPath(parentPath, key);\n\n definitions.push({\n id: `schema-property-${fieldPath}`,\n path: fieldPath,\n name: key,\n type: normalizeDefinitionType(propertySchema),\n description: String(propertySchema?.description ?? ''),\n format: String(propertySchema?.format ?? ''),\n order,\n depth,\n parentPath: parentPath || null,\n source: 'schema.properties',\n defaultValue: propertySchema?.default !== undefined ? String(propertySchema.default) : undefined,\n });\n\n if (isRecord(propertySchema?.properties)) {\n definitions.push(...flattenSchemaProperties(propertySchema.properties, fieldPath, depth + 1));\n }\n });\n\n return definitions;\n};\n\nexport const normalizeRequestDefinitionOrders = <T extends Pick<RequestDefinition, 'order' | 'parentPath'>>(\n definitions: T[],\n): T[] => {\n const siblingOrderMap = new Map<string, number>();\n\n return definitions.map((definition) => {\n const siblingKey = definition.parentPath ?? '__root__';\n const nextOrder = siblingOrderMap.get(siblingKey) ?? 0;\n siblingOrderMap.set(siblingKey, nextOrder + 1);\n\n return {\n ...definition,\n order: nextOrder,\n };\n });\n};\n\nexport const getRequestDefinitions = (content?: RequestContentLike | null): RequestDefinition[] => {\n const schema = parseRequestSchemaValue(getRequestSchemaSourceValue(content));\n if (schema && hasOwn(schema, 'properties') && isRecord(schema.properties)) {\n return normalizeRequestDefinitionOrders(flattenSchemaProperties(schema.properties));\n }\n\n const legacyProperties = buildLegacyInputProperties(content?.inputs);\n\n if (Object.keys(legacyProperties).length === 0) {\n return [];\n }\n\n return normalizeRequestDefinitionOrders(\n flattenSchemaProperties(legacyProperties).map((definition) => ({\n ...definition,\n source: 'content.inputs',\n })),\n );\n};\n\nexport const buildRequestSchemaFromDefinitions = (\n schemaValue: unknown,\n definitions: Array<\n Pick<RequestDefinition, 'name' | 'path' | 'type' | 'description' | 'format' | 'order' | 'parentPath'>\n >,\n): string => {\n const currentSchema = parseRequestSchemaValue(schemaValue) ?? {};\n const nextProperties: Record<string, RequestJsonSchema> = {};\n const normalizedDefinitions = normalizeRequestDefinitionOrders(definitions);\n\n normalizedDefinitions.forEach((definition) => {\n if (!normalizeRequestFieldKey(definition.name)) {\n return;\n }\n\n const key = definition.path.split('.').map(normalizeRequestFieldKey).filter(Boolean).join('.');\n if (!key) {\n return;\n }\n\n setSchemaPropertyByPath(nextProperties, key, definition);\n });\n\n const nextSchema: RequestJsonSchema = {\n ...currentSchema,\n type: 'object',\n properties: nextProperties,\n };\n\n return stringifyRequestSchemaValue(nextSchema);\n};\n","import { z } from 'zod';\n\nimport { parseRequestSchemaValue, stringifyRequestSchemaValue } from './request-schema';\nimport { isRecord } from './request-schema/utils';\n\nexport const DECISION_GRAPH_CONTENT_TYPE = 'application/vnd.gorules.decision';\nconst id = z.string().default(() => crypto.randomUUID());\n\nconst enumValueSchema = z.object({ label: z.string(), value: z.string() });\n\nexport const columnEnumSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('inline'), values: z.array(enumValueSchema), loose: z.boolean().optional() }),\n z.object({ type: z.literal('ref'), ref: z.string(), loose: z.boolean().optional() }),\n]);\nexport type ColumnEnum = z.infer<typeof columnEnumSchema>;\n\nexport const columnFieldTypeSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('any') }),\n z.object({ type: z.literal('string'), enum: columnEnumSchema.optional() }),\n z.object({ type: z.literal('number') }),\n z.object({ type: z.literal('boolean') }),\n z.object({ type: z.literal('date') }),\n]);\nexport type ColumnFieldType = z.infer<typeof columnFieldTypeSchema>;\n\nexport const COLUMN_FIELD_TYPE_OPTIONS: { value: ColumnFieldType['type']; label: string }[] = [\n { value: 'any', label: 'Any' },\n { value: 'string', label: 'String' },\n { value: 'number', label: 'Number' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'date', label: 'Date' },\n];\n\nexport const outputFieldTypeSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('auto') }),\n z.object({ type: z.literal('string'), enum: columnEnumSchema.optional() }),\n z.object({ type: z.literal('string-array'), enum: columnEnumSchema.optional() }),\n z.object({ type: z.literal('number') }),\n z.object({ type: z.literal('boolean') }),\n z.object({ type: z.literal('date') }),\n]);\nexport type OutputFieldType = z.infer<typeof outputFieldTypeSchema>;\n\nexport const OUTPUT_FIELD_TYPE_OPTIONS: { value: OutputFieldType['type']; label: string }[] = [\n { value: 'auto', label: 'Auto' },\n { value: 'string', label: 'Text' },\n { value: 'string-array', label: 'Text[]' },\n { value: 'number', label: 'Number' },\n { value: 'boolean', label: 'Boolean' },\n { value: 'date', label: 'Date' },\n];\n\nexport enum NodeKind {\n Input = 'inputNode',\n Output = 'outputNode',\n DecisionTable = 'decisionTableNode',\n Function = 'functionNode',\n Expression = 'expressionNode',\n Switch = 'switchNode',\n Decision = 'decisionNode',\n}\n\nexport const CustomKind = 'customNode';\n\nconst nodeCommon = z.object({\n id,\n name: z.string(),\n position: z.object({ x: z.number(), y: z.number() }).default({ x: 0, y: 0 }),\n});\n\nexport const inputNodeSchema = z\n .object({\n type: z.literal(NodeKind.Input),\n content: z\n .object({\n schema: z\n .union([z.string(), z.record(z.string(), z.any())])\n .nullish()\n .transform((val) => stringifyRequestSchemaValue(val)),\n expressions: z\n .array(\n z.object({\n id,\n key: z.string().default(''),\n value: z.any().default(''),\n type: z.string().optional(),\n }),\n )\n .default([]),\n inputField: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n outputPath: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n // InputContract(ADR-013)——必须显式声明:safeParse 会剥掉未声明键\n // (edgeSchema.name 同类事故)。legacy 图无此字段 → 保持缺失(nullish\n // 不物化键),首次编辑后由契约层写入。\n inputContract: z\n .object({\n contractVersion: z.number().default(1),\n schema: z\n .union([z.string(), z.record(z.string(), z.any())])\n .nullish()\n .transform((val) => (isRecord(val) ? val : (parseRequestSchemaValue(val) ?? {}))),\n examples: z\n .array(\n z.object({\n id: z.string(),\n name: z.string().default(''),\n description: z.string().nullish(),\n data: z.record(z.string(), z.any()).default({}),\n schemaFingerprint: z.string().nullish(),\n }),\n )\n .default([]),\n })\n .nullish(),\n })\n .default({\n schema: '',\n expressions: [],\n inputField: null,\n outputPath: null,\n }),\n })\n .merge(nodeCommon);\n\nexport const outputNodeSchema = z\n .object({\n type: z.literal(NodeKind.Output),\n content: z\n .object({\n schema: z\n .string()\n .nullish()\n .transform((val) => val ?? ''),\n })\n .default({\n schema: '',\n }),\n })\n .merge(nodeCommon);\n\nexport const decisionTableSchema = z\n .object({\n type: z.literal(NodeKind.DecisionTable),\n content: z.object({\n hitPolicy: z\n .enum(['first', 'collect'])\n .nullish()\n .transform((val) => val ?? 'first'),\n rules: z\n .array(\n z.record(\n z.string(),\n z\n .string()\n .nullish()\n .transform((val) => val ?? ''),\n ),\n )\n .default([]),\n inputs: z.array(\n z.object({\n id,\n name: z.string().nullish(),\n field: z.string().nullish(),\n defaultValue: z.string().nullish(),\n fieldType: columnFieldTypeSchema.nullish(),\n }),\n ),\n outputs: z.array(\n z.object({\n id,\n name: z.string(),\n field: z.string(),\n defaultValue: z.string().nullish(),\n outputFieldType: outputFieldTypeSchema.nullish(),\n }),\n ),\n passThrough: z\n .boolean()\n .nullish()\n .transform((val) => val ?? false),\n inputField: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n outputPath: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n executionMode: z\n .enum(['single', 'loop'])\n .nullish()\n .transform((val) => val ?? 'single'),\n }),\n })\n .merge(nodeCommon);\n\nexport const functionNodeSchema = z\n .object({\n type: z.literal(NodeKind.Function),\n content: z\n .string()\n .or(\n z.object({\n source: z.string().default(''),\n }),\n )\n .nullish(),\n })\n .merge(nodeCommon);\n\nexport const expressionNodeSchema = z\n .object({\n type: z.literal(NodeKind.Expression),\n content: z.object({\n expressions: z.array(\n z.object({\n id,\n key: z.string().default(''),\n value: z.string().default(''),\n }),\n ),\n passThrough: z\n .boolean()\n .nullish()\n .transform((val) => val ?? false),\n inputField: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n outputPath: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n executionMode: z\n .enum(['single', 'loop'])\n .nullish()\n .transform((val) => val ?? 'single'),\n }),\n })\n .merge(nodeCommon);\n\nexport const decisionNodeSchema = z\n .object({\n type: z.literal(NodeKind.Decision),\n content: z.object({\n key: z.string(),\n passThrough: z\n .boolean()\n .nullish()\n .transform((val) => val ?? false),\n inputField: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n outputPath: z\n .string()\n .nullish()\n .default(null)\n .transform((val) => (val && val.trim().length > 0 ? val : null)),\n executionMode: z\n .enum(['single', 'loop'])\n .nullish()\n .transform((val) => val ?? 'single'),\n }),\n })\n .merge(nodeCommon);\n\nexport const switchNodeSchema = z\n .object({\n type: z.literal(NodeKind.Switch),\n content: z.object({\n hitPolicy: z\n .enum(['first', 'collect'])\n .nullish()\n .transform((val) => val ?? 'first'),\n statements: z.array(\n z.object({\n id,\n condition: z\n .string()\n .nullish()\n .transform((val) => val ?? ''),\n isDefault: z\n .boolean()\n .nullish()\n .transform((val) => val ?? false),\n // WS1-R4:case 名——镜像为出边 edge.name(分支路径标签芯片)。\n // zod 默认剥离未声明键:不声明它,JSON 上传路径(safeParse)会静默丢名。\n name: z\n .string()\n .nullish()\n .transform((val) => (val && val.trim() !== '' ? val : undefined)),\n }),\n ),\n }),\n })\n .merge(nodeCommon);\n\nexport const customNodeSchema = z\n .object({\n type: z.literal(CustomKind),\n content: z.object({\n kind: z.string(),\n config: z.any(),\n }),\n })\n .merge(nodeCommon);\n\nexport const anyNodeSchema = z\n .object({\n type: z.string().refine((val) => !(Object.values(NodeKind) as string[]).includes(val), {\n message: 'Invalid type',\n }),\n content: z.any().nullish(),\n })\n .merge(nodeCommon);\n\nexport const nodeSchema = z\n .discriminatedUnion('type', [\n decisionNodeSchema,\n expressionNodeSchema,\n functionNodeSchema,\n decisionTableSchema,\n switchNodeSchema,\n customNodeSchema,\n inputNodeSchema,\n outputNodeSchema,\n ])\n .or(anyNodeSchema);\n\nexport const edgeSchema = z.object({\n id: z.string(),\n sourceId: z.string(),\n targetId: z.string(),\n sourceHandle: z.string().nullish(),\n type: z.enum(['edge']),\n // WS1-R4:分支路径标签数据源(mapToGraphEdge label ← edge.name)。\n // 不声明它,JSON 上传路径(safeParse)会剥掉所有边名——芯片上传后全部消失。\n name: z\n .string()\n .nullish()\n .transform((val) => (val && val.trim() !== '' ? val : undefined)),\n});\n\nexport const validationSchema = z.object({\n inputSchema: z.any().nullish().default(null),\n outputSchema: z.any().nullish().default(null),\n});\n\nexport const decisionModelSchema = z.object({\n nodes: z.array(nodeSchema).default([]),\n edges: z.array(edgeSchema).default([]),\n});\n"],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -265,6 +265,17 @@ export declare const decisionModelSchema: z.ZodObject<{
265
265
  }, z.core.$strip>>>;
266
266
  inputField: z.ZodPipe<z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>, z.ZodTransform<string | null, string | null>>;
267
267
  outputPath: z.ZodPipe<z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>, z.ZodTransform<string | null, string | null>>;
268
+ inputContract: z.ZodOptional<z.ZodNullable<z.ZodObject<{
269
+ contractVersion: z.ZodDefault<z.ZodNumber>;
270
+ schema: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodAny>]>>>, z.ZodTransform<Record<string, any>, string | Record<string, any> | null | undefined>>;
271
+ examples: z.ZodDefault<z.ZodArray<z.ZodObject<{
272
+ id: z.ZodString;
273
+ name: z.ZodDefault<z.ZodString>;
274
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
275
+ data: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodAny>>;
276
+ schemaFingerprint: z.ZodOptional<z.ZodNullable<z.ZodString>>;
277
+ }, z.core.$strip>>>;
278
+ }, z.core.$strip>>>;
268
279
  }, z.core.$strip>>;
269
280
  id: z.ZodDefault<z.ZodString>;
270
281
  name: z.ZodString;
@@ -481,6 +492,17 @@ export declare const inputNodeSchema: z.ZodObject<{
481
492
  }, z.core.$strip>>>;
482
493
  inputField: z.ZodPipe<z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>, z.ZodTransform<string | null, string | null>>;
483
494
  outputPath: z.ZodPipe<z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>, z.ZodTransform<string | null, string | null>>;
495
+ inputContract: z.ZodOptional<z.ZodNullable<z.ZodObject<{
496
+ contractVersion: z.ZodDefault<z.ZodNumber>;
497
+ schema: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodAny>]>>>, z.ZodTransform<Record<string, any>, string | Record<string, any> | null | undefined>>;
498
+ examples: z.ZodDefault<z.ZodArray<z.ZodObject<{
499
+ id: z.ZodString;
500
+ name: z.ZodDefault<z.ZodString>;
501
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
502
+ data: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodAny>>;
503
+ schemaFingerprint: z.ZodOptional<z.ZodNullable<z.ZodString>>;
504
+ }, z.core.$strip>>>;
505
+ }, z.core.$strip>>>;
484
506
  }, z.core.$strip>>;
485
507
  id: z.ZodDefault<z.ZodString>;
486
508
  name: z.ZodString;
@@ -689,6 +711,17 @@ export declare const nodeSchema: z.ZodUnion<[z.ZodDiscriminatedUnion<[z.ZodObjec
689
711
  }, z.core.$strip>>>;
690
712
  inputField: z.ZodPipe<z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>, z.ZodTransform<string | null, string | null>>;
691
713
  outputPath: z.ZodPipe<z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>, z.ZodTransform<string | null, string | null>>;
714
+ inputContract: z.ZodOptional<z.ZodNullable<z.ZodObject<{
715
+ contractVersion: z.ZodDefault<z.ZodNumber>;
716
+ schema: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodAny>]>>>, z.ZodTransform<Record<string, any>, string | Record<string, any> | null | undefined>>;
717
+ examples: z.ZodDefault<z.ZodArray<z.ZodObject<{
718
+ id: z.ZodString;
719
+ name: z.ZodDefault<z.ZodString>;
720
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
721
+ data: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodAny>>;
722
+ schemaFingerprint: z.ZodOptional<z.ZodNullable<z.ZodString>>;
723
+ }, z.core.$strip>>>;
724
+ }, z.core.$strip>>>;
692
725
  }, z.core.$strip>>;
693
726
  id: z.ZodDefault<z.ZodString>;
694
727
  name: z.ZodString;
@@ -806,11 +839,6 @@ export declare const validationSchema: z.ZodObject<{
806
839
  export { }
807
840
 
808
841
 
809
- declare namespace ContextMenuSub {
810
- var displayName: string;
811
- }
812
-
813
-
814
842
  declare module '@gorules/zen-engine-wasm' {
815
843
  interface VariableType {
816
844
  __hash: string;
@@ -824,6 +852,11 @@ declare global {
824
852
  }
825
853
  }
826
854
 
855
+
856
+ declare namespace ContextMenuSub {
857
+ var displayName: string;
858
+ }
859
+
827
860
  declare namespace console {
828
861
  function log(...args: any[]): void;
829
862
  async function sleep(durationMs: number): Promise<void>;
package/dist/schema.js CHANGED
@@ -1,2 +1,2 @@
1
- import { _ as e, a as t, b as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _, v, x as y, y as b } from "./schema-Csyt47SS.js";
1
+ import { _ as e, a as t, b as n, c as r, d as i, f as a, g as o, h as s, i as c, l, m as u, n as d, o as f, p, r as m, s as h, t as g, u as _, v, x as y, y as b } from "./schema-BDvVbmiV.js";
2
2
  export { g as COLUMN_FIELD_TYPE_OPTIONS, d as CustomKind, m as DECISION_GRAPH_CONTENT_TYPE, c as NodeKind, t as OUTPUT_FIELD_TYPE_OPTIONS, f as anyNodeSchema, h as columnEnumSchema, r as columnFieldTypeSchema, l as customNodeSchema, _ as decisionModelSchema, i as decisionNodeSchema, a as decisionTableSchema, p as edgeSchema, u as expressionNodeSchema, s as functionNodeSchema, o as inputNodeSchema, e as nodeSchema, v as outputFieldTypeSchema, b as outputNodeSchema, n as switchNodeSchema, y as validationSchema };