@revisium/schema-toolkit 0.13.0 → 0.14.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.
@@ -339,10 +339,10 @@ function validateRelativePath(relativePath, currentPath, rootSchema, fieldPath)
339
339
  var FORMULA_TYPES = /* @__PURE__ */ new Set(["number", "string", "boolean"]);
340
340
  function collectFormulaNodes(schema, data) {
341
341
  const nodes = [];
342
- traverseAndCollect(schema, data, "", nodes);
342
+ traverseAndCollect(schema, data, "", nodes, { arrayLevels: [] });
343
343
  return nodes;
344
344
  }
345
- function traverseAndCollect(schema, data, currentPath, nodes) {
345
+ function traverseAndCollect(schema, data, currentPath, nodes, ctx) {
346
346
  if (schema.type === "object" && schema.properties && typeof data === "object" && data !== null) {
347
347
  const record = data;
348
348
  for (const [fieldName, fieldSchema] of Object.entries(schema.properties)) {
@@ -356,16 +356,26 @@ function traverseAndCollect(schema, data, currentPath, nodes) {
356
356
  expression,
357
357
  fieldType: fieldSchema.type,
358
358
  currentPath: parentPath,
359
- dependencies: parseDependencies(expression)
359
+ dependencies: parseDependencies(expression),
360
+ arrayContext: ctx.arrayLevels.length > 0 ? { levels: [...ctx.arrayLevels] } : void 0
360
361
  });
361
362
  }
362
- traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes);
363
+ traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes, ctx);
363
364
  }
364
365
  }
365
366
  if (schema.type === "array" && schema.items && Array.isArray(data)) {
366
367
  for (let i = 0; i < data.length; i++) {
367
368
  const itemPath = `${currentPath}[${i}]`;
368
- traverseAndCollect(schema.items, data[i], itemPath, nodes);
369
+ const arrayLevel = {
370
+ index: i,
371
+ length: data.length,
372
+ prev: i > 0 ? data[i - 1] : null,
373
+ next: i < data.length - 1 ? data[i + 1] : null
374
+ };
375
+ const newCtx = {
376
+ arrayLevels: [arrayLevel, ...ctx.arrayLevels]
377
+ };
378
+ traverseAndCollect(schema.items, data[i], itemPath, nodes, newCtx);
369
379
  }
370
380
  }
371
381
  }
@@ -441,7 +451,8 @@ function evaluateNode(node, data) {
441
451
  const itemData = node.currentPath ? getValueByPath(data, node.currentPath) : void 0;
442
452
  const result = evaluateWithContext(node.expression, {
443
453
  rootData: data,
444
- ...itemData && { itemData, currentPath: node.currentPath }
454
+ ...itemData && { itemData, currentPath: node.currentPath },
455
+ arrayContext: node.arrayContext
445
456
  });
446
457
  if (result === void 0) {
447
458
  return { success: false, error: "Formula returned undefined" };
@@ -574,5 +585,5 @@ function setValueByPath(obj, path, value) {
574
585
  }
575
586
 
576
587
  export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, validateFormulaAgainstSchema, validateSchemaFormulas };
577
- //# sourceMappingURL=chunk-I2ECBDBM.js.map
578
- //# sourceMappingURL=chunk-I2ECBDBM.js.map
588
+ //# sourceMappingURL=chunk-HHS27GGA.js.map
589
+ //# sourceMappingURL=chunk-HHS27GGA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/extract-schema-formulas.ts","../src/lib/validate-schema-formulas.ts","../src/lib/formula.ts"],"names":["getParentPath","buildDependencyGraph"],"mappings":"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","file":"chunk-HHS27GGA.js","sourcesContent":["interface XFormulaInput {\n version: number;\n expression: string;\n}\n\ninterface SchemaProperty {\n type?: string;\n 'x-formula'?: XFormulaInput;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface ExtractedFormula {\n fieldName: string;\n expression: string;\n fieldType: string;\n}\n\nexport function extractSchemaFormulas(\n schema: JsonSchemaInput,\n): ExtractedFormula[] {\n const formulas: ExtractedFormula[] = [];\n extractFormulasRecursive(schema, '', formulas);\n return formulas;\n}\n\nfunction extractFormulasRecursive(\n schema: SchemaProperty | JsonSchemaInput,\n pathPrefix: string,\n formulas: ExtractedFormula[],\n): void {\n if (schema.type === 'array' && schema.items) {\n extractFormulasRecursive(schema.items, `${pathPrefix}[]`, formulas);\n return;\n }\n\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const fullPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n\n const xFormula = fieldSchema['x-formula'];\n if (xFormula) {\n formulas.push({\n fieldName: fullPath,\n expression: xFormula.expression,\n fieldType: fieldSchema.type ?? 'string',\n });\n }\n\n if (fieldSchema.type === 'object' && fieldSchema.properties) {\n extractFormulasRecursive(fieldSchema, fullPath, formulas);\n }\n\n if (fieldSchema.type === 'array' && fieldSchema.items) {\n extractFormulasRecursive(fieldSchema.items, `${fullPath}[]`, formulas);\n }\n }\n}\n","import {\n parseExpression,\n validateFormulaSyntax,\n buildDependencyGraph,\n detectCircularDependencies,\n inferFormulaType,\n type FieldTypes,\n type InferredType,\n} from '@revisium/formula';\nimport { extractSchemaFormulas } from './extract-schema-formulas.js';\n\ninterface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface FormulaValidationError {\n field: string;\n error: string;\n position?: number;\n}\n\nexport interface SchemaValidationResult {\n isValid: boolean;\n errors: FormulaValidationError[];\n}\n\nexport function validateSchemaFormulas(\n schema: JsonSchemaInput,\n): SchemaValidationResult {\n const errors: FormulaValidationError[] = [];\n const formulas = extractSchemaFormulas(schema);\n\n for (const formula of formulas) {\n const error = validateFormulaAgainstSchema(\n formula.expression,\n formula.fieldName,\n schema,\n );\n if (error) {\n errors.push(error);\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors };\n }\n\n const dependencies: Record<string, string[]> = {};\n for (const formula of formulas) {\n const parseResult = parseExpression(formula.expression);\n const parentPath = getParentPath(formula.fieldName);\n const prefix = parentPath ? `${parentPath}.` : '';\n\n dependencies[formula.fieldName] = parseResult.dependencies.map((dep) => {\n if (dep.startsWith('/')) {\n return extractFieldRoot(dep.slice(1));\n }\n if (dep.startsWith('../')) {\n return resolveRelativePathForDependency(dep, parentPath);\n }\n const rootField = extractFieldRoot(dep);\n return `${prefix}${rootField}`;\n });\n }\n\n const graph = buildDependencyGraph(dependencies);\n const circularCheck = detectCircularDependencies(graph);\n\n const cycle = circularCheck.cycle;\n if (circularCheck.hasCircular && cycle && cycle.length > 0) {\n const firstField = cycle[0];\n if (firstField) {\n errors.push({\n field: firstField,\n error: `Circular dependency: ${cycle.join(' → ')}`,\n });\n return { isValid: false, errors };\n }\n }\n\n return { isValid: true, errors: [] };\n}\n\nexport function validateFormulaAgainstSchema(\n expression: string,\n fieldName: string,\n schema: JsonSchemaInput,\n): FormulaValidationError | null {\n return validateFormulaInContext(expression, fieldName, schema);\n}\n\nfunction validateFormulaInContext(\n expression: string,\n fieldPath: string,\n rootSchema: JsonSchemaInput,\n): FormulaValidationError | null {\n const syntaxResult = validateFormulaSyntax(expression);\n if (!syntaxResult.isValid) {\n return {\n field: fieldPath,\n error: syntaxResult.error,\n position: syntaxResult.position,\n };\n }\n\n const parentPath = getParentPath(fieldPath);\n const localFieldName = getFieldName(fieldPath);\n const contextSchema = resolveSubSchema(rootSchema, parentPath);\n\n if (!contextSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema context for path '${parentPath}'`,\n };\n }\n\n const parseResult = parseExpression(expression);\n const localSchemaFields = getSchemaFields(contextSchema);\n const rootSchemaFields = getSchemaFields(rootSchema);\n\n for (const dep of parseResult.dependencies) {\n if (dep.startsWith('/')) {\n const rootField = extractFieldRoot(dep.slice(1));\n if (!rootSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${rootField}' in formula`,\n };\n }\n } else if (dep.startsWith('../')) {\n const validationResult = validateRelativePath(\n dep,\n parentPath,\n rootSchema,\n fieldPath,\n );\n if (validationResult) {\n return validationResult;\n }\n } else {\n const rootField = extractFieldRoot(dep);\n if (!localSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${rootField}' in formula`,\n };\n }\n }\n }\n\n if (\n parseResult.dependencies.some((d) => extractFieldRoot(d) === localFieldName)\n ) {\n return {\n field: fieldPath,\n error: `Formula cannot reference itself`,\n };\n }\n\n const fieldSchema = contextSchema.properties?.[localFieldName];\n const expectedType = schemaTypeToInferred(fieldSchema?.type);\n const fieldTypes = getSchemaFieldTypes(contextSchema);\n const inferredType = inferFormulaType(expression, fieldTypes);\n\n if (!isTypeCompatible(inferredType, expectedType)) {\n return {\n field: fieldPath,\n error: `Type mismatch: formula returns '${inferredType}' but field expects '${expectedType}'`,\n };\n }\n\n return null;\n}\n\nfunction resolveSubSchema(\n schema: JsonSchemaInput,\n fieldPath: string,\n): SchemaProperty | null {\n if (!fieldPath) {\n return schema;\n }\n\n const segments = parsePathSegmentsForSchema(fieldPath);\n let current: SchemaProperty | JsonSchemaInput = schema;\n\n for (const segment of segments) {\n if (segment === '[]') {\n if (current.type === 'array' && current.items) {\n current = current.items;\n } else {\n return null;\n }\n } else if (current.properties?.[segment]) {\n current = current.properties[segment];\n } else {\n return null;\n }\n }\n\n return current;\n}\n\nfunction parsePathSegmentsForSchema(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n segments.push('[]');\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction parsePathSegments(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf('[');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex <= 0) {\n return '';\n }\n\n return fieldPath.substring(0, splitIndex);\n}\n\nfunction getFieldName(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf(']');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex === -1) {\n return fieldPath;\n }\n\n return fieldPath.substring(splitIndex + 1);\n}\n\nfunction getSchemaFields(schema: SchemaProperty | JsonSchemaInput): Set<string> {\n const fields = new Set<string>();\n const properties = schema.properties ?? {};\n\n for (const fieldName of Object.keys(properties)) {\n fields.add(fieldName);\n }\n\n return fields;\n}\n\nfunction getSchemaFieldTypes(schema: SchemaProperty | JsonSchemaInput): FieldTypes {\n const fieldTypes: FieldTypes = {};\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const schemaType = fieldSchema.type;\n if (schemaType === 'integer') {\n fieldTypes[fieldName] = 'number';\n } else if (\n schemaType === 'number' ||\n schemaType === 'string' ||\n schemaType === 'boolean' ||\n schemaType === 'object' ||\n schemaType === 'array'\n ) {\n fieldTypes[fieldName] = schemaType;\n }\n }\n\n return fieldTypes;\n}\n\nfunction schemaTypeToInferred(\n schemaType: string | undefined,\n): InferredType | null {\n if (schemaType === 'number' || schemaType === 'integer') return 'number';\n if (schemaType === 'string') return 'string';\n if (schemaType === 'boolean') return 'boolean';\n return null;\n}\n\nfunction isTypeCompatible(\n inferredType: InferredType,\n expectedType: InferredType | null,\n): boolean {\n if (expectedType === null) return true;\n if (inferredType === 'unknown') return true;\n return inferredType === expectedType;\n}\n\nfunction extractFieldRoot(dependency: string): string {\n const root = dependency.split('.')[0]?.split('[')[0];\n return root || dependency;\n}\n\nfunction countParentLevels(path: string): number {\n let count = 0;\n let remaining = path;\n while (remaining.startsWith('../')) {\n count++;\n remaining = remaining.slice(3);\n }\n return count;\n}\n\nfunction resolveRelativePathForDependency(\n relativePath: string,\n currentPath: string,\n): string {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n if (!currentPath) {\n return targetField;\n }\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n return targetField;\n }\n\n const basePath = pathSegments.slice(0, targetLevel).join('.');\n return basePath ? `${basePath}.${targetField}` : targetField;\n}\n\nfunction validateRelativePath(\n relativePath: string,\n currentPath: string,\n rootSchema: JsonSchemaInput,\n fieldPath: string,\n): FormulaValidationError | null {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n const rootFields = getSchemaFields(rootSchema);\n if (!rootFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${targetField}' in formula`,\n };\n }\n return null;\n }\n\n const targetPath = pathSegments.slice(0, targetLevel).join('.');\n const targetSchema = resolveSubSchema(rootSchema, targetPath);\n\n if (!targetSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema for relative path '${relativePath}'`,\n };\n }\n\n const targetFields = getSchemaFields(targetSchema);\n if (!targetFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${targetField}' in formula`,\n };\n }\n\n return null;\n}\n","import {\n parseFormula,\n buildDependencyGraph,\n getTopologicalOrder,\n evaluateWithContext,\n type ArrayContext,\n type ArrayLevelContext,\n} from '@revisium/formula';\nimport { type JsonSchema } from '../types/index.js';\n\nexport { formulaSpec } from '@revisium/formula/spec';\nexport {\n extractSchemaFormulas,\n type ExtractedFormula,\n} from './extract-schema-formulas.js';\nexport {\n validateSchemaFormulas,\n validateFormulaAgainstSchema,\n type SchemaValidationResult,\n type FormulaValidationError,\n} from './validate-schema-formulas.js';\n\nexport interface FormulaNode {\n path: string;\n expression: string;\n fieldType: 'number' | 'string' | 'boolean';\n currentPath: string;\n dependencies: string[];\n arrayContext?: ArrayContext;\n}\n\nexport interface FormulaError {\n field: string;\n expression: string;\n error: string;\n defaultUsed: boolean;\n}\n\nexport interface EvaluateFormulasResult {\n values: Record<string, unknown>;\n errors: FormulaError[];\n}\n\nexport interface EvaluateFormulasOptions {\n useDefaults?: boolean;\n defaults?: Record<string, unknown>;\n}\n\ninterface SchemaNode {\n type?: string;\n properties?: Record<string, SchemaNode>;\n items?: SchemaNode;\n 'x-formula'?: { version: number; expression: string };\n}\n\nconst FORMULA_TYPES = new Set(['number', 'string', 'boolean']);\n\ninterface TraversalContext {\n arrayLevels: ArrayLevelContext[];\n}\n\nexport function collectFormulaNodes(\n schema: JsonSchema,\n data: Record<string, unknown>,\n): FormulaNode[] {\n const nodes: FormulaNode[] = [];\n traverseAndCollect(schema as SchemaNode, data, '', nodes, { arrayLevels: [] });\n return nodes;\n}\n\nfunction traverseAndCollect(\n schema: SchemaNode,\n data: unknown,\n currentPath: string,\n nodes: FormulaNode[],\n ctx: TraversalContext,\n): void {\n if (schema.type === 'object' && schema.properties && typeof data === 'object' && data !== null) {\n const record = data as Record<string, unknown>;\n\n for (const [fieldName, fieldSchema] of Object.entries(schema.properties)) {\n const fieldPath = currentPath ? `${currentPath}.${fieldName}` : fieldName;\n const fieldValue = record[fieldName];\n\n if (fieldSchema['x-formula'] && FORMULA_TYPES.has(fieldSchema.type ?? '')) {\n const expression = fieldSchema['x-formula'].expression;\n const parentPath = getParentPath(fieldPath);\n\n nodes.push({\n path: fieldPath,\n expression,\n fieldType: fieldSchema.type as 'number' | 'string' | 'boolean',\n currentPath: parentPath,\n dependencies: parseDependencies(expression),\n arrayContext: ctx.arrayLevels.length > 0 ? { levels: [...ctx.arrayLevels] } : undefined,\n });\n }\n\n traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes, ctx);\n }\n }\n\n if (schema.type === 'array' && schema.items && Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const itemPath = `${currentPath}[${i}]`;\n const arrayLevel: ArrayLevelContext = {\n index: i,\n length: data.length,\n prev: i > 0 ? data[i - 1] : null,\n next: i < data.length - 1 ? data[i + 1] : null,\n };\n const newCtx: TraversalContext = {\n arrayLevels: [arrayLevel, ...ctx.arrayLevels],\n };\n traverseAndCollect(schema.items, data[i], itemPath, nodes, newCtx);\n }\n }\n}\n\nfunction parseDependencies(expression: string): string[] {\n try {\n return parseFormula(expression).dependencies;\n } catch {\n return [];\n }\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return '';\n }\n return fieldPath.substring(0, lastDotIndex);\n}\n\nexport function evaluateFormulas(\n schema: JsonSchema,\n data: Record<string, unknown>,\n options: EvaluateFormulasOptions = {},\n): EvaluateFormulasResult {\n const nodes = collectFormulaNodes(schema, data);\n\n if (nodes.length === 0) {\n return { values: {}, errors: [] };\n }\n\n const sortedNodes = orderByDependencies(nodes);\n const values: Record<string, unknown> = {};\n const errors: FormulaError[] = [];\n const failedPaths = new Set<string>();\n\n for (const node of sortedNodes) {\n const hasDependencyFailure = hasFailedDependency(node, failedPaths);\n\n if (hasDependencyFailure) {\n failedPaths.add(node.path);\n handleError(node, 'Dependency formula failed', data, values, errors, options);\n continue;\n }\n\n const result = evaluateNode(node, data);\n\n if (!result.success) {\n failedPaths.add(node.path);\n handleError(node, result.error, data, values, errors, options);\n continue;\n }\n\n setValueByPath(data, node.path, result.value);\n values[node.path] = result.value;\n }\n\n return { values, errors };\n}\n\nfunction orderByDependencies(nodes: FormulaNode[]): FormulaNode[] {\n if (nodes.length <= 1) {\n return nodes;\n }\n\n const dependencies = Object.fromEntries(\n nodes.map((n) => [n.path, n.dependencies]),\n );\n\n const result = getTopologicalOrder(buildDependencyGraph(dependencies));\n\n if (!result.success) {\n throw new Error(\n `Cyclic dependency detected in formulas: ${result.error ?? 'unknown error'}`,\n );\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.path, n]));\n\n return result.order\n .map((path) => nodeMap.get(path))\n .filter((n): n is FormulaNode => n !== undefined);\n}\n\nfunction hasFailedDependency(node: FormulaNode, failedPaths: Set<string>): boolean {\n return node.dependencies.some((dep) => {\n for (const failedPath of failedPaths) {\n if (failedPath === dep || failedPath.endsWith(`.${dep}`)) {\n return true;\n }\n }\n return false;\n });\n}\n\nfunction evaluateNode(\n node: FormulaNode,\n data: Record<string, unknown>,\n): { success: true; value: unknown } | { success: false; error: string } {\n try {\n const itemData = node.currentPath\n ? getValueByPath(data, node.currentPath) as Record<string, unknown> | undefined\n : undefined;\n\n const result = evaluateWithContext(node.expression, {\n rootData: data,\n ...(itemData && { itemData, currentPath: node.currentPath }),\n arrayContext: node.arrayContext,\n });\n\n if (result === undefined) {\n return { success: false, error: 'Formula returned undefined' };\n }\n\n return { success: true, value: result };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction handleError(\n node: FormulaNode,\n errorMessage: string,\n data: Record<string, unknown>,\n values: Record<string, unknown>,\n errors: FormulaError[],\n options: EvaluateFormulasOptions,\n): void {\n const defaultUsed = options.useDefaults ?? false;\n\n if (defaultUsed) {\n const defaultValue = getDefaultValue(node, options.defaults);\n setValueByPath(data, node.path, defaultValue);\n values[node.path] = defaultValue;\n }\n\n errors.push({\n field: node.path,\n expression: node.expression,\n error: errorMessage,\n defaultUsed,\n });\n}\n\nfunction getDefaultValue(\n node: FormulaNode,\n defaults?: Record<string, unknown>,\n): unknown {\n if (defaults && node.path in defaults) {\n return defaults[node.path];\n }\n\n switch (node.fieldType) {\n case 'number':\n return 0;\n case 'string':\n return '';\n case 'boolean':\n return false;\n }\n}\n\nfunction getValueByPath(\n obj: Record<string, unknown>,\n path: string,\n): unknown {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (segment.type === 'field') {\n current = (current as Record<string, unknown>)[segment.name];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n current = current[segment.index];\n }\n }\n\n return current;\n}\n\ntype PathSegment = { type: 'field'; name: string } | { type: 'index'; index: number };\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n let current = '';\n let position = 0;\n\n while (position < path.length) {\n const char = path[position];\n\n if (char === '.') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n position++;\n } else if (char === '[') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n const endBracket = path.indexOf(']', position);\n if (endBracket === -1) {\n position++;\n } else {\n const indexStr = path.slice(position + 1, endBracket);\n segments.push({ type: 'index', index: Number.parseInt(indexStr, 10) });\n position = endBracket + 1;\n }\n } else {\n current += char;\n position++;\n }\n }\n\n if (current) {\n segments.push({ type: 'field', name: current });\n }\n\n return segments;\n}\n\nfunction isSafeKey(key: string): boolean {\n return key !== '__proto__';\n}\n\nfunction setValueByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n\n if (segment.type === 'field') {\n if (!isSafeKey(segment.name)) {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment.name in record)) {\n record[segment.name] = {};\n }\n current = record[segment.name];\n } else {\n const arr = current as unknown[];\n if (!arr[segment.index]) {\n arr[segment.index] = {};\n }\n current = arr[segment.index];\n }\n }\n\n const lastSegment = segments.at(-1);\n if (!lastSegment) {\n return;\n }\n\n if (lastSegment.type === 'field') {\n if (!isSafeKey(lastSegment.name)) {\n return;\n }\n (current as Record<string, unknown>)[lastSegment.name] = value;\n } else {\n (current as unknown[])[lastSegment.index] = value;\n }\n}\n"]}
@@ -341,10 +341,10 @@ function validateRelativePath(relativePath, currentPath, rootSchema, fieldPath)
341
341
  var FORMULA_TYPES = /* @__PURE__ */ new Set(["number", "string", "boolean"]);
342
342
  function collectFormulaNodes(schema, data) {
343
343
  const nodes = [];
344
- traverseAndCollect(schema, data, "", nodes);
344
+ traverseAndCollect(schema, data, "", nodes, { arrayLevels: [] });
345
345
  return nodes;
346
346
  }
347
- function traverseAndCollect(schema, data, currentPath, nodes) {
347
+ function traverseAndCollect(schema, data, currentPath, nodes, ctx) {
348
348
  if (schema.type === "object" && schema.properties && typeof data === "object" && data !== null) {
349
349
  const record = data;
350
350
  for (const [fieldName, fieldSchema] of Object.entries(schema.properties)) {
@@ -358,16 +358,26 @@ function traverseAndCollect(schema, data, currentPath, nodes) {
358
358
  expression,
359
359
  fieldType: fieldSchema.type,
360
360
  currentPath: parentPath,
361
- dependencies: parseDependencies(expression)
361
+ dependencies: parseDependencies(expression),
362
+ arrayContext: ctx.arrayLevels.length > 0 ? { levels: [...ctx.arrayLevels] } : void 0
362
363
  });
363
364
  }
364
- traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes);
365
+ traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes, ctx);
365
366
  }
366
367
  }
367
368
  if (schema.type === "array" && schema.items && Array.isArray(data)) {
368
369
  for (let i = 0; i < data.length; i++) {
369
370
  const itemPath = `${currentPath}[${i}]`;
370
- traverseAndCollect(schema.items, data[i], itemPath, nodes);
371
+ const arrayLevel = {
372
+ index: i,
373
+ length: data.length,
374
+ prev: i > 0 ? data[i - 1] : null,
375
+ next: i < data.length - 1 ? data[i + 1] : null
376
+ };
377
+ const newCtx = {
378
+ arrayLevels: [arrayLevel, ...ctx.arrayLevels]
379
+ };
380
+ traverseAndCollect(schema.items, data[i], itemPath, nodes, newCtx);
371
381
  }
372
382
  }
373
383
  }
@@ -443,7 +453,8 @@ function evaluateNode(node, data) {
443
453
  const itemData = node.currentPath ? getValueByPath(data, node.currentPath) : void 0;
444
454
  const result = formula.evaluateWithContext(node.expression, {
445
455
  rootData: data,
446
- ...itemData && { itemData, currentPath: node.currentPath }
456
+ ...itemData && { itemData, currentPath: node.currentPath },
457
+ arrayContext: node.arrayContext
447
458
  });
448
459
  if (result === void 0) {
449
460
  return { success: false, error: "Formula returned undefined" };
@@ -584,5 +595,5 @@ exports.evaluateFormulas = evaluateFormulas;
584
595
  exports.extractSchemaFormulas = extractSchemaFormulas;
585
596
  exports.validateFormulaAgainstSchema = validateFormulaAgainstSchema;
586
597
  exports.validateSchemaFormulas = validateSchemaFormulas;
587
- //# sourceMappingURL=chunk-HZW3UZAB.cjs.map
588
- //# sourceMappingURL=chunk-HZW3UZAB.cjs.map
598
+ //# sourceMappingURL=chunk-SVQTPQIM.cjs.map
599
+ //# sourceMappingURL=chunk-SVQTPQIM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/extract-schema-formulas.ts","../src/lib/validate-schema-formulas.ts","../src/lib/formula.ts"],"names":["formula","parseExpression","buildDependencyGraph","detectCircularDependencies","validateFormulaSyntax","inferFormulaType","getParentPath","parseFormula","getTopologicalOrder","evaluateWithContext"],"mappings":"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","file":"chunk-SVQTPQIM.cjs","sourcesContent":["interface XFormulaInput {\n version: number;\n expression: string;\n}\n\ninterface SchemaProperty {\n type?: string;\n 'x-formula'?: XFormulaInput;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface ExtractedFormula {\n fieldName: string;\n expression: string;\n fieldType: string;\n}\n\nexport function extractSchemaFormulas(\n schema: JsonSchemaInput,\n): ExtractedFormula[] {\n const formulas: ExtractedFormula[] = [];\n extractFormulasRecursive(schema, '', formulas);\n return formulas;\n}\n\nfunction extractFormulasRecursive(\n schema: SchemaProperty | JsonSchemaInput,\n pathPrefix: string,\n formulas: ExtractedFormula[],\n): void {\n if (schema.type === 'array' && schema.items) {\n extractFormulasRecursive(schema.items, `${pathPrefix}[]`, formulas);\n return;\n }\n\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const fullPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n\n const xFormula = fieldSchema['x-formula'];\n if (xFormula) {\n formulas.push({\n fieldName: fullPath,\n expression: xFormula.expression,\n fieldType: fieldSchema.type ?? 'string',\n });\n }\n\n if (fieldSchema.type === 'object' && fieldSchema.properties) {\n extractFormulasRecursive(fieldSchema, fullPath, formulas);\n }\n\n if (fieldSchema.type === 'array' && fieldSchema.items) {\n extractFormulasRecursive(fieldSchema.items, `${fullPath}[]`, formulas);\n }\n }\n}\n","import {\n parseExpression,\n validateFormulaSyntax,\n buildDependencyGraph,\n detectCircularDependencies,\n inferFormulaType,\n type FieldTypes,\n type InferredType,\n} from '@revisium/formula';\nimport { extractSchemaFormulas } from './extract-schema-formulas.js';\n\ninterface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface FormulaValidationError {\n field: string;\n error: string;\n position?: number;\n}\n\nexport interface SchemaValidationResult {\n isValid: boolean;\n errors: FormulaValidationError[];\n}\n\nexport function validateSchemaFormulas(\n schema: JsonSchemaInput,\n): SchemaValidationResult {\n const errors: FormulaValidationError[] = [];\n const formulas = extractSchemaFormulas(schema);\n\n for (const formula of formulas) {\n const error = validateFormulaAgainstSchema(\n formula.expression,\n formula.fieldName,\n schema,\n );\n if (error) {\n errors.push(error);\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors };\n }\n\n const dependencies: Record<string, string[]> = {};\n for (const formula of formulas) {\n const parseResult = parseExpression(formula.expression);\n const parentPath = getParentPath(formula.fieldName);\n const prefix = parentPath ? `${parentPath}.` : '';\n\n dependencies[formula.fieldName] = parseResult.dependencies.map((dep) => {\n if (dep.startsWith('/')) {\n return extractFieldRoot(dep.slice(1));\n }\n if (dep.startsWith('../')) {\n return resolveRelativePathForDependency(dep, parentPath);\n }\n const rootField = extractFieldRoot(dep);\n return `${prefix}${rootField}`;\n });\n }\n\n const graph = buildDependencyGraph(dependencies);\n const circularCheck = detectCircularDependencies(graph);\n\n const cycle = circularCheck.cycle;\n if (circularCheck.hasCircular && cycle && cycle.length > 0) {\n const firstField = cycle[0];\n if (firstField) {\n errors.push({\n field: firstField,\n error: `Circular dependency: ${cycle.join(' → ')}`,\n });\n return { isValid: false, errors };\n }\n }\n\n return { isValid: true, errors: [] };\n}\n\nexport function validateFormulaAgainstSchema(\n expression: string,\n fieldName: string,\n schema: JsonSchemaInput,\n): FormulaValidationError | null {\n return validateFormulaInContext(expression, fieldName, schema);\n}\n\nfunction validateFormulaInContext(\n expression: string,\n fieldPath: string,\n rootSchema: JsonSchemaInput,\n): FormulaValidationError | null {\n const syntaxResult = validateFormulaSyntax(expression);\n if (!syntaxResult.isValid) {\n return {\n field: fieldPath,\n error: syntaxResult.error,\n position: syntaxResult.position,\n };\n }\n\n const parentPath = getParentPath(fieldPath);\n const localFieldName = getFieldName(fieldPath);\n const contextSchema = resolveSubSchema(rootSchema, parentPath);\n\n if (!contextSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema context for path '${parentPath}'`,\n };\n }\n\n const parseResult = parseExpression(expression);\n const localSchemaFields = getSchemaFields(contextSchema);\n const rootSchemaFields = getSchemaFields(rootSchema);\n\n for (const dep of parseResult.dependencies) {\n if (dep.startsWith('/')) {\n const rootField = extractFieldRoot(dep.slice(1));\n if (!rootSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${rootField}' in formula`,\n };\n }\n } else if (dep.startsWith('../')) {\n const validationResult = validateRelativePath(\n dep,\n parentPath,\n rootSchema,\n fieldPath,\n );\n if (validationResult) {\n return validationResult;\n }\n } else {\n const rootField = extractFieldRoot(dep);\n if (!localSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${rootField}' in formula`,\n };\n }\n }\n }\n\n if (\n parseResult.dependencies.some((d) => extractFieldRoot(d) === localFieldName)\n ) {\n return {\n field: fieldPath,\n error: `Formula cannot reference itself`,\n };\n }\n\n const fieldSchema = contextSchema.properties?.[localFieldName];\n const expectedType = schemaTypeToInferred(fieldSchema?.type);\n const fieldTypes = getSchemaFieldTypes(contextSchema);\n const inferredType = inferFormulaType(expression, fieldTypes);\n\n if (!isTypeCompatible(inferredType, expectedType)) {\n return {\n field: fieldPath,\n error: `Type mismatch: formula returns '${inferredType}' but field expects '${expectedType}'`,\n };\n }\n\n return null;\n}\n\nfunction resolveSubSchema(\n schema: JsonSchemaInput,\n fieldPath: string,\n): SchemaProperty | null {\n if (!fieldPath) {\n return schema;\n }\n\n const segments = parsePathSegmentsForSchema(fieldPath);\n let current: SchemaProperty | JsonSchemaInput = schema;\n\n for (const segment of segments) {\n if (segment === '[]') {\n if (current.type === 'array' && current.items) {\n current = current.items;\n } else {\n return null;\n }\n } else if (current.properties?.[segment]) {\n current = current.properties[segment];\n } else {\n return null;\n }\n }\n\n return current;\n}\n\nfunction parsePathSegmentsForSchema(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n segments.push('[]');\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction parsePathSegments(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf('[');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex <= 0) {\n return '';\n }\n\n return fieldPath.substring(0, splitIndex);\n}\n\nfunction getFieldName(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf(']');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex === -1) {\n return fieldPath;\n }\n\n return fieldPath.substring(splitIndex + 1);\n}\n\nfunction getSchemaFields(schema: SchemaProperty | JsonSchemaInput): Set<string> {\n const fields = new Set<string>();\n const properties = schema.properties ?? {};\n\n for (const fieldName of Object.keys(properties)) {\n fields.add(fieldName);\n }\n\n return fields;\n}\n\nfunction getSchemaFieldTypes(schema: SchemaProperty | JsonSchemaInput): FieldTypes {\n const fieldTypes: FieldTypes = {};\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const schemaType = fieldSchema.type;\n if (schemaType === 'integer') {\n fieldTypes[fieldName] = 'number';\n } else if (\n schemaType === 'number' ||\n schemaType === 'string' ||\n schemaType === 'boolean' ||\n schemaType === 'object' ||\n schemaType === 'array'\n ) {\n fieldTypes[fieldName] = schemaType;\n }\n }\n\n return fieldTypes;\n}\n\nfunction schemaTypeToInferred(\n schemaType: string | undefined,\n): InferredType | null {\n if (schemaType === 'number' || schemaType === 'integer') return 'number';\n if (schemaType === 'string') return 'string';\n if (schemaType === 'boolean') return 'boolean';\n return null;\n}\n\nfunction isTypeCompatible(\n inferredType: InferredType,\n expectedType: InferredType | null,\n): boolean {\n if (expectedType === null) return true;\n if (inferredType === 'unknown') return true;\n return inferredType === expectedType;\n}\n\nfunction extractFieldRoot(dependency: string): string {\n const root = dependency.split('.')[0]?.split('[')[0];\n return root || dependency;\n}\n\nfunction countParentLevels(path: string): number {\n let count = 0;\n let remaining = path;\n while (remaining.startsWith('../')) {\n count++;\n remaining = remaining.slice(3);\n }\n return count;\n}\n\nfunction resolveRelativePathForDependency(\n relativePath: string,\n currentPath: string,\n): string {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n if (!currentPath) {\n return targetField;\n }\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n return targetField;\n }\n\n const basePath = pathSegments.slice(0, targetLevel).join('.');\n return basePath ? `${basePath}.${targetField}` : targetField;\n}\n\nfunction validateRelativePath(\n relativePath: string,\n currentPath: string,\n rootSchema: JsonSchemaInput,\n fieldPath: string,\n): FormulaValidationError | null {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n const rootFields = getSchemaFields(rootSchema);\n if (!rootFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${targetField}' in formula`,\n };\n }\n return null;\n }\n\n const targetPath = pathSegments.slice(0, targetLevel).join('.');\n const targetSchema = resolveSubSchema(rootSchema, targetPath);\n\n if (!targetSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema for relative path '${relativePath}'`,\n };\n }\n\n const targetFields = getSchemaFields(targetSchema);\n if (!targetFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${targetField}' in formula`,\n };\n }\n\n return null;\n}\n","import {\n parseFormula,\n buildDependencyGraph,\n getTopologicalOrder,\n evaluateWithContext,\n type ArrayContext,\n type ArrayLevelContext,\n} from '@revisium/formula';\nimport { type JsonSchema } from '../types/index.js';\n\nexport { formulaSpec } from '@revisium/formula/spec';\nexport {\n extractSchemaFormulas,\n type ExtractedFormula,\n} from './extract-schema-formulas.js';\nexport {\n validateSchemaFormulas,\n validateFormulaAgainstSchema,\n type SchemaValidationResult,\n type FormulaValidationError,\n} from './validate-schema-formulas.js';\n\nexport interface FormulaNode {\n path: string;\n expression: string;\n fieldType: 'number' | 'string' | 'boolean';\n currentPath: string;\n dependencies: string[];\n arrayContext?: ArrayContext;\n}\n\nexport interface FormulaError {\n field: string;\n expression: string;\n error: string;\n defaultUsed: boolean;\n}\n\nexport interface EvaluateFormulasResult {\n values: Record<string, unknown>;\n errors: FormulaError[];\n}\n\nexport interface EvaluateFormulasOptions {\n useDefaults?: boolean;\n defaults?: Record<string, unknown>;\n}\n\ninterface SchemaNode {\n type?: string;\n properties?: Record<string, SchemaNode>;\n items?: SchemaNode;\n 'x-formula'?: { version: number; expression: string };\n}\n\nconst FORMULA_TYPES = new Set(['number', 'string', 'boolean']);\n\ninterface TraversalContext {\n arrayLevels: ArrayLevelContext[];\n}\n\nexport function collectFormulaNodes(\n schema: JsonSchema,\n data: Record<string, unknown>,\n): FormulaNode[] {\n const nodes: FormulaNode[] = [];\n traverseAndCollect(schema as SchemaNode, data, '', nodes, { arrayLevels: [] });\n return nodes;\n}\n\nfunction traverseAndCollect(\n schema: SchemaNode,\n data: unknown,\n currentPath: string,\n nodes: FormulaNode[],\n ctx: TraversalContext,\n): void {\n if (schema.type === 'object' && schema.properties && typeof data === 'object' && data !== null) {\n const record = data as Record<string, unknown>;\n\n for (const [fieldName, fieldSchema] of Object.entries(schema.properties)) {\n const fieldPath = currentPath ? `${currentPath}.${fieldName}` : fieldName;\n const fieldValue = record[fieldName];\n\n if (fieldSchema['x-formula'] && FORMULA_TYPES.has(fieldSchema.type ?? '')) {\n const expression = fieldSchema['x-formula'].expression;\n const parentPath = getParentPath(fieldPath);\n\n nodes.push({\n path: fieldPath,\n expression,\n fieldType: fieldSchema.type as 'number' | 'string' | 'boolean',\n currentPath: parentPath,\n dependencies: parseDependencies(expression),\n arrayContext: ctx.arrayLevels.length > 0 ? { levels: [...ctx.arrayLevels] } : undefined,\n });\n }\n\n traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes, ctx);\n }\n }\n\n if (schema.type === 'array' && schema.items && Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const itemPath = `${currentPath}[${i}]`;\n const arrayLevel: ArrayLevelContext = {\n index: i,\n length: data.length,\n prev: i > 0 ? data[i - 1] : null,\n next: i < data.length - 1 ? data[i + 1] : null,\n };\n const newCtx: TraversalContext = {\n arrayLevels: [arrayLevel, ...ctx.arrayLevels],\n };\n traverseAndCollect(schema.items, data[i], itemPath, nodes, newCtx);\n }\n }\n}\n\nfunction parseDependencies(expression: string): string[] {\n try {\n return parseFormula(expression).dependencies;\n } catch {\n return [];\n }\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return '';\n }\n return fieldPath.substring(0, lastDotIndex);\n}\n\nexport function evaluateFormulas(\n schema: JsonSchema,\n data: Record<string, unknown>,\n options: EvaluateFormulasOptions = {},\n): EvaluateFormulasResult {\n const nodes = collectFormulaNodes(schema, data);\n\n if (nodes.length === 0) {\n return { values: {}, errors: [] };\n }\n\n const sortedNodes = orderByDependencies(nodes);\n const values: Record<string, unknown> = {};\n const errors: FormulaError[] = [];\n const failedPaths = new Set<string>();\n\n for (const node of sortedNodes) {\n const hasDependencyFailure = hasFailedDependency(node, failedPaths);\n\n if (hasDependencyFailure) {\n failedPaths.add(node.path);\n handleError(node, 'Dependency formula failed', data, values, errors, options);\n continue;\n }\n\n const result = evaluateNode(node, data);\n\n if (!result.success) {\n failedPaths.add(node.path);\n handleError(node, result.error, data, values, errors, options);\n continue;\n }\n\n setValueByPath(data, node.path, result.value);\n values[node.path] = result.value;\n }\n\n return { values, errors };\n}\n\nfunction orderByDependencies(nodes: FormulaNode[]): FormulaNode[] {\n if (nodes.length <= 1) {\n return nodes;\n }\n\n const dependencies = Object.fromEntries(\n nodes.map((n) => [n.path, n.dependencies]),\n );\n\n const result = getTopologicalOrder(buildDependencyGraph(dependencies));\n\n if (!result.success) {\n throw new Error(\n `Cyclic dependency detected in formulas: ${result.error ?? 'unknown error'}`,\n );\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.path, n]));\n\n return result.order\n .map((path) => nodeMap.get(path))\n .filter((n): n is FormulaNode => n !== undefined);\n}\n\nfunction hasFailedDependency(node: FormulaNode, failedPaths: Set<string>): boolean {\n return node.dependencies.some((dep) => {\n for (const failedPath of failedPaths) {\n if (failedPath === dep || failedPath.endsWith(`.${dep}`)) {\n return true;\n }\n }\n return false;\n });\n}\n\nfunction evaluateNode(\n node: FormulaNode,\n data: Record<string, unknown>,\n): { success: true; value: unknown } | { success: false; error: string } {\n try {\n const itemData = node.currentPath\n ? getValueByPath(data, node.currentPath) as Record<string, unknown> | undefined\n : undefined;\n\n const result = evaluateWithContext(node.expression, {\n rootData: data,\n ...(itemData && { itemData, currentPath: node.currentPath }),\n arrayContext: node.arrayContext,\n });\n\n if (result === undefined) {\n return { success: false, error: 'Formula returned undefined' };\n }\n\n return { success: true, value: result };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction handleError(\n node: FormulaNode,\n errorMessage: string,\n data: Record<string, unknown>,\n values: Record<string, unknown>,\n errors: FormulaError[],\n options: EvaluateFormulasOptions,\n): void {\n const defaultUsed = options.useDefaults ?? false;\n\n if (defaultUsed) {\n const defaultValue = getDefaultValue(node, options.defaults);\n setValueByPath(data, node.path, defaultValue);\n values[node.path] = defaultValue;\n }\n\n errors.push({\n field: node.path,\n expression: node.expression,\n error: errorMessage,\n defaultUsed,\n });\n}\n\nfunction getDefaultValue(\n node: FormulaNode,\n defaults?: Record<string, unknown>,\n): unknown {\n if (defaults && node.path in defaults) {\n return defaults[node.path];\n }\n\n switch (node.fieldType) {\n case 'number':\n return 0;\n case 'string':\n return '';\n case 'boolean':\n return false;\n }\n}\n\nfunction getValueByPath(\n obj: Record<string, unknown>,\n path: string,\n): unknown {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (segment.type === 'field') {\n current = (current as Record<string, unknown>)[segment.name];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n current = current[segment.index];\n }\n }\n\n return current;\n}\n\ntype PathSegment = { type: 'field'; name: string } | { type: 'index'; index: number };\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n let current = '';\n let position = 0;\n\n while (position < path.length) {\n const char = path[position];\n\n if (char === '.') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n position++;\n } else if (char === '[') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n const endBracket = path.indexOf(']', position);\n if (endBracket === -1) {\n position++;\n } else {\n const indexStr = path.slice(position + 1, endBracket);\n segments.push({ type: 'index', index: Number.parseInt(indexStr, 10) });\n position = endBracket + 1;\n }\n } else {\n current += char;\n position++;\n }\n }\n\n if (current) {\n segments.push({ type: 'field', name: current });\n }\n\n return segments;\n}\n\nfunction isSafeKey(key: string): boolean {\n return key !== '__proto__';\n}\n\nfunction setValueByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n\n if (segment.type === 'field') {\n if (!isSafeKey(segment.name)) {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment.name in record)) {\n record[segment.name] = {};\n }\n current = record[segment.name];\n } else {\n const arr = current as unknown[];\n if (!arr[segment.index]) {\n arr[segment.index] = {};\n }\n current = arr[segment.index];\n }\n }\n\n const lastSegment = segments.at(-1);\n if (!lastSegment) {\n return;\n }\n\n if (lastSegment.type === 'field') {\n if (!isSafeKey(lastSegment.name)) {\n return;\n }\n (current as Record<string, unknown>)[lastSegment.name] = value;\n } else {\n (current as unknown[])[lastSegment.index] = value;\n }\n}\n"]}
@@ -1,32 +1,32 @@
1
1
  'use strict';
2
2
 
3
- var chunkHZW3UZAB_cjs = require('../chunk-HZW3UZAB.cjs');
3
+ var chunkSVQTPQIM_cjs = require('../chunk-SVQTPQIM.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "collectFormulaNodes", {
8
8
  enumerable: true,
9
- get: function () { return chunkHZW3UZAB_cjs.collectFormulaNodes; }
9
+ get: function () { return chunkSVQTPQIM_cjs.collectFormulaNodes; }
10
10
  });
11
11
  Object.defineProperty(exports, "evaluateFormulas", {
12
12
  enumerable: true,
13
- get: function () { return chunkHZW3UZAB_cjs.evaluateFormulas; }
13
+ get: function () { return chunkSVQTPQIM_cjs.evaluateFormulas; }
14
14
  });
15
15
  Object.defineProperty(exports, "extractSchemaFormulas", {
16
16
  enumerable: true,
17
- get: function () { return chunkHZW3UZAB_cjs.extractSchemaFormulas; }
17
+ get: function () { return chunkSVQTPQIM_cjs.extractSchemaFormulas; }
18
18
  });
19
19
  Object.defineProperty(exports, "formulaSpec", {
20
20
  enumerable: true,
21
- get: function () { return chunkHZW3UZAB_cjs.formulaSpec; }
21
+ get: function () { return chunkSVQTPQIM_cjs.formulaSpec; }
22
22
  });
23
23
  Object.defineProperty(exports, "validateFormulaAgainstSchema", {
24
24
  enumerable: true,
25
- get: function () { return chunkHZW3UZAB_cjs.validateFormulaAgainstSchema; }
25
+ get: function () { return chunkSVQTPQIM_cjs.validateFormulaAgainstSchema; }
26
26
  });
27
27
  Object.defineProperty(exports, "validateSchemaFormulas", {
28
28
  enumerable: true,
29
- get: function () { return chunkHZW3UZAB_cjs.validateSchemaFormulas; }
29
+ get: function () { return chunkSVQTPQIM_cjs.validateSchemaFormulas; }
30
30
  });
31
31
  //# sourceMappingURL=index.cjs.map
32
32
  //# sourceMappingURL=index.cjs.map
@@ -1,3 +1,4 @@
1
+ import { ArrayContext } from '@revisium/formula';
1
2
  import { i as JsonSchema } from '../schema.types-CLHMJmkJ.cjs';
2
3
  export { formulaSpec } from '@revisium/formula/spec';
3
4
 
@@ -55,6 +56,7 @@ interface FormulaNode {
55
56
  fieldType: 'number' | 'string' | 'boolean';
56
57
  currentPath: string;
57
58
  dependencies: string[];
59
+ arrayContext?: ArrayContext;
58
60
  }
59
61
  interface FormulaError {
60
62
  field: string;
@@ -1,3 +1,4 @@
1
+ import { ArrayContext } from '@revisium/formula';
1
2
  import { i as JsonSchema } from '../schema.types-CLHMJmkJ.js';
2
3
  export { formulaSpec } from '@revisium/formula/spec';
3
4
 
@@ -55,6 +56,7 @@ interface FormulaNode {
55
56
  fieldType: 'number' | 'string' | 'boolean';
56
57
  currentPath: string;
57
58
  dependencies: string[];
59
+ arrayContext?: ArrayContext;
58
60
  }
59
61
  interface FormulaError {
60
62
  field: string;
@@ -1,3 +1,3 @@
1
- export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from '../chunk-I2ECBDBM.js';
1
+ export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from '../chunk-HHS27GGA.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.cjs CHANGED
@@ -5,7 +5,7 @@ var chunkEJYILFAK_cjs = require('./chunk-EJYILFAK.cjs');
5
5
  var chunkIPL2CGVA_cjs = require('./chunk-IPL2CGVA.cjs');
6
6
  require('./chunk-ODCH3PP2.cjs');
7
7
  var chunkVX5C5YMF_cjs = require('./chunk-VX5C5YMF.cjs');
8
- var chunkHZW3UZAB_cjs = require('./chunk-HZW3UZAB.cjs');
8
+ var chunkSVQTPQIM_cjs = require('./chunk-SVQTPQIM.cjs');
9
9
  var chunkGF3XXYOS_cjs = require('./chunk-GF3XXYOS.cjs');
10
10
  var chunkEGC32GPY_cjs = require('./chunk-EGC32GPY.cjs');
11
11
  var chunkXNFSFT7T_cjs = require('./chunk-XNFSFT7T.cjs');
@@ -193,27 +193,27 @@ Object.defineProperty(exports, "validateJsonFieldName", {
193
193
  });
194
194
  Object.defineProperty(exports, "collectFormulaNodes", {
195
195
  enumerable: true,
196
- get: function () { return chunkHZW3UZAB_cjs.collectFormulaNodes; }
196
+ get: function () { return chunkSVQTPQIM_cjs.collectFormulaNodes; }
197
197
  });
198
198
  Object.defineProperty(exports, "evaluateFormulas", {
199
199
  enumerable: true,
200
- get: function () { return chunkHZW3UZAB_cjs.evaluateFormulas; }
200
+ get: function () { return chunkSVQTPQIM_cjs.evaluateFormulas; }
201
201
  });
202
202
  Object.defineProperty(exports, "extractSchemaFormulas", {
203
203
  enumerable: true,
204
- get: function () { return chunkHZW3UZAB_cjs.extractSchemaFormulas; }
204
+ get: function () { return chunkSVQTPQIM_cjs.extractSchemaFormulas; }
205
205
  });
206
206
  Object.defineProperty(exports, "formulaSpec", {
207
207
  enumerable: true,
208
- get: function () { return chunkHZW3UZAB_cjs.formulaSpec; }
208
+ get: function () { return chunkSVQTPQIM_cjs.formulaSpec; }
209
209
  });
210
210
  Object.defineProperty(exports, "validateFormulaAgainstSchema", {
211
211
  enumerable: true,
212
- get: function () { return chunkHZW3UZAB_cjs.validateFormulaAgainstSchema; }
212
+ get: function () { return chunkSVQTPQIM_cjs.validateFormulaAgainstSchema; }
213
213
  });
214
214
  Object.defineProperty(exports, "validateSchemaFormulas", {
215
215
  enumerable: true,
216
- get: function () { return chunkHZW3UZAB_cjs.validateSchemaFormulas; }
216
+ get: function () { return chunkSVQTPQIM_cjs.validateSchemaFormulas; }
217
217
  });
218
218
  Object.defineProperty(exports, "FieldChangeType", {
219
219
  enumerable: true,
package/dist/index.d.cts CHANGED
@@ -14,4 +14,5 @@ export { arrayMetaSchema, baseStringFields, booleanMetaSchema, foreignKeyExclude
14
14
  export { S as SystemSchemaIds } from './system-schema-ids-B-2xMN-1.cjs';
15
15
  export { formulaSpec } from '@revisium/formula/spec';
16
16
  import 'node:events';
17
+ import '@revisium/formula';
17
18
  import 'ajv/dist/2020';
package/dist/index.d.ts CHANGED
@@ -14,4 +14,5 @@ export { arrayMetaSchema, baseStringFields, booleanMetaSchema, foreignKeyExclude
14
14
  export { S as SystemSchemaIds } from './system-schema-ids-B-2xMN-1.js';
15
15
  export { formulaSpec } from '@revisium/formula/spec';
16
16
  import 'node:events';
17
+ import '@revisium/formula';
17
18
  import 'ajv/dist/2020';
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ export { getAddPatch, getArraySchema, getBooleanSchema, getMovePatch, getNumberS
3
3
  export { CustomSchemeKeywords } from './chunk-5VDDLW7U.js';
4
4
  import './chunk-H7W4QNMA.js';
5
5
  export { SchemaTable, VALIDATE_JSON_FIELD_NAME_ERROR_MESSAGE, applyAddPatch, applyMovePatch, applyRemovePatch, applyReplacePatch, computeValueDiff, convertJsonPathToSchemaPath, convertSchemaPathToJsonPath, createJsonObjectSchemaStore, createJsonSchemaStore, createPrimitiveStoreBySchema, deepEqual, getDBJsonPathByJsonSchemaStore, getForeignKeyPatchesFromSchema, getForeignKeysFromSchema, getForeignKeysFromValue, getInvalidFieldNamesInSchema, getJsonSchemaStoreByPath, getJsonValueStoreByPath, getParentForPath, getPathByStore, getValueByPath, hasPath, parsePath, pluginRefs, replaceForeignKeyValue, resolveRefs, saveSharedFields, setValueByPath, traverseStore, traverseValue, validateJsonFieldName } from './chunk-DJ4JPKI4.js';
6
- export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from './chunk-I2ECBDBM.js';
6
+ export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from './chunk-HHS27GGA.js';
7
7
  export { FieldChangeType } from './chunk-KJCURW4D.js';
8
8
  export { ajvFileSchema, ajvRowCreatedAtSchema, ajvRowCreatedIdSchema, ajvRowHashSchema, ajvRowIdSchema, ajvRowPublishedAtSchema, ajvRowSchemaHashSchema, ajvRowUpdatedAtSchema, ajvRowVersionIdSchema, fileSchema, rowCreatedAtSchema, rowCreatedIdSchema, rowHashSchema, rowIdSchema, rowPublishedAtSchema, rowSchemaHashSchema, rowUpdatedAtSchema, rowVersionIdSchema } from './chunk-LLHQWDAR.js';
9
9
  export { SystemSchemaIds } from './chunk-Q2UOTIMG.js';
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkVX5C5YMF_cjs = require('../chunk-VX5C5YMF.cjs');
4
- var chunkHZW3UZAB_cjs = require('../chunk-HZW3UZAB.cjs');
4
+ var chunkSVQTPQIM_cjs = require('../chunk-SVQTPQIM.cjs');
5
5
  require('../chunk-GF3XXYOS.cjs');
6
6
  require('../chunk-EGC32GPY.cjs');
7
7
  require('../chunk-XNFSFT7T.cjs');
@@ -144,27 +144,27 @@ Object.defineProperty(exports, "validateJsonFieldName", {
144
144
  });
145
145
  Object.defineProperty(exports, "collectFormulaNodes", {
146
146
  enumerable: true,
147
- get: function () { return chunkHZW3UZAB_cjs.collectFormulaNodes; }
147
+ get: function () { return chunkSVQTPQIM_cjs.collectFormulaNodes; }
148
148
  });
149
149
  Object.defineProperty(exports, "evaluateFormulas", {
150
150
  enumerable: true,
151
- get: function () { return chunkHZW3UZAB_cjs.evaluateFormulas; }
151
+ get: function () { return chunkSVQTPQIM_cjs.evaluateFormulas; }
152
152
  });
153
153
  Object.defineProperty(exports, "extractSchemaFormulas", {
154
154
  enumerable: true,
155
- get: function () { return chunkHZW3UZAB_cjs.extractSchemaFormulas; }
155
+ get: function () { return chunkSVQTPQIM_cjs.extractSchemaFormulas; }
156
156
  });
157
157
  Object.defineProperty(exports, "formulaSpec", {
158
158
  enumerable: true,
159
- get: function () { return chunkHZW3UZAB_cjs.formulaSpec; }
159
+ get: function () { return chunkSVQTPQIM_cjs.formulaSpec; }
160
160
  });
161
161
  Object.defineProperty(exports, "validateFormulaAgainstSchema", {
162
162
  enumerable: true,
163
- get: function () { return chunkHZW3UZAB_cjs.validateFormulaAgainstSchema; }
163
+ get: function () { return chunkSVQTPQIM_cjs.validateFormulaAgainstSchema; }
164
164
  });
165
165
  Object.defineProperty(exports, "validateSchemaFormulas", {
166
166
  enumerable: true,
167
- get: function () { return chunkHZW3UZAB_cjs.validateSchemaFormulas; }
167
+ get: function () { return chunkSVQTPQIM_cjs.validateSchemaFormulas; }
168
168
  });
169
169
  Object.defineProperty(exports, "addSharedFieldsFromState", {
170
170
  enumerable: true,
@@ -6,6 +6,7 @@ import { c as JsonValue, J as JsonObject, b as JsonArray, a as JsonPrimitives }
6
6
  export { EvaluateFormulasOptions, EvaluateFormulasResult, ExtractedFormula, FormulaError, FormulaNode, FormulaValidationError, SchemaValidationResult, collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, validateFormulaAgainstSchema, validateSchemaFormulas } from '../formula/index.cjs';
7
7
  export { formulaSpec } from '@revisium/formula/spec';
8
8
  import 'node:events';
9
+ import '@revisium/formula';
9
10
 
10
11
  declare const addSharedFieldsFromState: <T extends JsonSchema = JsonSchema>(schema: T, state: {
11
12
  title?: string;
@@ -6,6 +6,7 @@ import { c as JsonValue, J as JsonObject, b as JsonArray, a as JsonPrimitives }
6
6
  export { EvaluateFormulasOptions, EvaluateFormulasResult, ExtractedFormula, FormulaError, FormulaNode, FormulaValidationError, SchemaValidationResult, collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, validateFormulaAgainstSchema, validateSchemaFormulas } from '../formula/index.js';
7
7
  export { formulaSpec } from '@revisium/formula/spec';
8
8
  import 'node:events';
9
+ import '@revisium/formula';
9
10
 
10
11
  declare const addSharedFieldsFromState: <T extends JsonSchema = JsonSchema>(schema: T, state: {
11
12
  title?: string;
package/dist/lib/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { SchemaTable, VALIDATE_JSON_FIELD_NAME_ERROR_MESSAGE, applyAddPatch, applyMovePatch, applyRemovePatch, applyReplacePatch, computeValueDiff, convertJsonPathToSchemaPath, convertSchemaPathToJsonPath, createJsonObjectSchemaStore, createJsonSchemaStore, createPrimitiveStoreBySchema, deepEqual, getDBJsonPathByJsonSchemaStore, getForeignKeyPatchesFromSchema, getForeignKeysFromSchema, getForeignKeysFromValue, getInvalidFieldNamesInSchema, getJsonSchemaStoreByPath, getJsonValueStoreByPath, getParentForPath, getPathByStore, getValueByPath, hasPath, parsePath, pluginRefs, replaceForeignKeyValue, resolveRefs, saveSharedFields, setValueByPath, traverseStore, traverseValue, validateJsonFieldName } from '../chunk-DJ4JPKI4.js';
2
- export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from '../chunk-I2ECBDBM.js';
2
+ export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from '../chunk-HHS27GGA.js';
3
3
  import '../chunk-KJCURW4D.js';
4
4
  import '../chunk-LLHQWDAR.js';
5
5
  import '../chunk-Q2UOTIMG.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revisium/schema-toolkit",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Universal schema toolkit with TypeScript types and utilities for JSON Schema manipulation",
5
5
  "keywords": [
6
6
  "json-schema",
@@ -171,7 +171,7 @@
171
171
  "typescript-eslint": "^8.15.0"
172
172
  },
173
173
  "dependencies": {
174
- "@revisium/formula": "^0.6.2",
174
+ "@revisium/formula": "^0.9.0",
175
175
  "nanoid": "^3.3.7"
176
176
  },
177
177
  "engines": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/extract-schema-formulas.ts","../src/lib/validate-schema-formulas.ts","../src/lib/formula.ts"],"names":["formula","parseExpression","buildDependencyGraph","detectCircularDependencies","validateFormulaSyntax","inferFormulaType","getParentPath","parseFormula","getTopologicalOrder","evaluateWithContext"],"mappings":"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","file":"chunk-HZW3UZAB.cjs","sourcesContent":["interface XFormulaInput {\n version: number;\n expression: string;\n}\n\ninterface SchemaProperty {\n type?: string;\n 'x-formula'?: XFormulaInput;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface ExtractedFormula {\n fieldName: string;\n expression: string;\n fieldType: string;\n}\n\nexport function extractSchemaFormulas(\n schema: JsonSchemaInput,\n): ExtractedFormula[] {\n const formulas: ExtractedFormula[] = [];\n extractFormulasRecursive(schema, '', formulas);\n return formulas;\n}\n\nfunction extractFormulasRecursive(\n schema: SchemaProperty | JsonSchemaInput,\n pathPrefix: string,\n formulas: ExtractedFormula[],\n): void {\n if (schema.type === 'array' && schema.items) {\n extractFormulasRecursive(schema.items, `${pathPrefix}[]`, formulas);\n return;\n }\n\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const fullPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n\n const xFormula = fieldSchema['x-formula'];\n if (xFormula) {\n formulas.push({\n fieldName: fullPath,\n expression: xFormula.expression,\n fieldType: fieldSchema.type ?? 'string',\n });\n }\n\n if (fieldSchema.type === 'object' && fieldSchema.properties) {\n extractFormulasRecursive(fieldSchema, fullPath, formulas);\n }\n\n if (fieldSchema.type === 'array' && fieldSchema.items) {\n extractFormulasRecursive(fieldSchema.items, `${fullPath}[]`, formulas);\n }\n }\n}\n","import {\n parseExpression,\n validateFormulaSyntax,\n buildDependencyGraph,\n detectCircularDependencies,\n inferFormulaType,\n type FieldTypes,\n type InferredType,\n} from '@revisium/formula';\nimport { extractSchemaFormulas } from './extract-schema-formulas.js';\n\ninterface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface FormulaValidationError {\n field: string;\n error: string;\n position?: number;\n}\n\nexport interface SchemaValidationResult {\n isValid: boolean;\n errors: FormulaValidationError[];\n}\n\nexport function validateSchemaFormulas(\n schema: JsonSchemaInput,\n): SchemaValidationResult {\n const errors: FormulaValidationError[] = [];\n const formulas = extractSchemaFormulas(schema);\n\n for (const formula of formulas) {\n const error = validateFormulaAgainstSchema(\n formula.expression,\n formula.fieldName,\n schema,\n );\n if (error) {\n errors.push(error);\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors };\n }\n\n const dependencies: Record<string, string[]> = {};\n for (const formula of formulas) {\n const parseResult = parseExpression(formula.expression);\n const parentPath = getParentPath(formula.fieldName);\n const prefix = parentPath ? `${parentPath}.` : '';\n\n dependencies[formula.fieldName] = parseResult.dependencies.map((dep) => {\n if (dep.startsWith('/')) {\n return extractFieldRoot(dep.slice(1));\n }\n if (dep.startsWith('../')) {\n return resolveRelativePathForDependency(dep, parentPath);\n }\n const rootField = extractFieldRoot(dep);\n return `${prefix}${rootField}`;\n });\n }\n\n const graph = buildDependencyGraph(dependencies);\n const circularCheck = detectCircularDependencies(graph);\n\n const cycle = circularCheck.cycle;\n if (circularCheck.hasCircular && cycle && cycle.length > 0) {\n const firstField = cycle[0];\n if (firstField) {\n errors.push({\n field: firstField,\n error: `Circular dependency: ${cycle.join(' → ')}`,\n });\n return { isValid: false, errors };\n }\n }\n\n return { isValid: true, errors: [] };\n}\n\nexport function validateFormulaAgainstSchema(\n expression: string,\n fieldName: string,\n schema: JsonSchemaInput,\n): FormulaValidationError | null {\n return validateFormulaInContext(expression, fieldName, schema);\n}\n\nfunction validateFormulaInContext(\n expression: string,\n fieldPath: string,\n rootSchema: JsonSchemaInput,\n): FormulaValidationError | null {\n const syntaxResult = validateFormulaSyntax(expression);\n if (!syntaxResult.isValid) {\n return {\n field: fieldPath,\n error: syntaxResult.error,\n position: syntaxResult.position,\n };\n }\n\n const parentPath = getParentPath(fieldPath);\n const localFieldName = getFieldName(fieldPath);\n const contextSchema = resolveSubSchema(rootSchema, parentPath);\n\n if (!contextSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema context for path '${parentPath}'`,\n };\n }\n\n const parseResult = parseExpression(expression);\n const localSchemaFields = getSchemaFields(contextSchema);\n const rootSchemaFields = getSchemaFields(rootSchema);\n\n for (const dep of parseResult.dependencies) {\n if (dep.startsWith('/')) {\n const rootField = extractFieldRoot(dep.slice(1));\n if (!rootSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${rootField}' in formula`,\n };\n }\n } else if (dep.startsWith('../')) {\n const validationResult = validateRelativePath(\n dep,\n parentPath,\n rootSchema,\n fieldPath,\n );\n if (validationResult) {\n return validationResult;\n }\n } else {\n const rootField = extractFieldRoot(dep);\n if (!localSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${rootField}' in formula`,\n };\n }\n }\n }\n\n if (\n parseResult.dependencies.some((d) => extractFieldRoot(d) === localFieldName)\n ) {\n return {\n field: fieldPath,\n error: `Formula cannot reference itself`,\n };\n }\n\n const fieldSchema = contextSchema.properties?.[localFieldName];\n const expectedType = schemaTypeToInferred(fieldSchema?.type);\n const fieldTypes = getSchemaFieldTypes(contextSchema);\n const inferredType = inferFormulaType(expression, fieldTypes);\n\n if (!isTypeCompatible(inferredType, expectedType)) {\n return {\n field: fieldPath,\n error: `Type mismatch: formula returns '${inferredType}' but field expects '${expectedType}'`,\n };\n }\n\n return null;\n}\n\nfunction resolveSubSchema(\n schema: JsonSchemaInput,\n fieldPath: string,\n): SchemaProperty | null {\n if (!fieldPath) {\n return schema;\n }\n\n const segments = parsePathSegmentsForSchema(fieldPath);\n let current: SchemaProperty | JsonSchemaInput = schema;\n\n for (const segment of segments) {\n if (segment === '[]') {\n if (current.type === 'array' && current.items) {\n current = current.items;\n } else {\n return null;\n }\n } else if (current.properties?.[segment]) {\n current = current.properties[segment];\n } else {\n return null;\n }\n }\n\n return current;\n}\n\nfunction parsePathSegmentsForSchema(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n segments.push('[]');\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction parsePathSegments(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf('[');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex <= 0) {\n return '';\n }\n\n return fieldPath.substring(0, splitIndex);\n}\n\nfunction getFieldName(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf(']');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex === -1) {\n return fieldPath;\n }\n\n return fieldPath.substring(splitIndex + 1);\n}\n\nfunction getSchemaFields(schema: SchemaProperty | JsonSchemaInput): Set<string> {\n const fields = new Set<string>();\n const properties = schema.properties ?? {};\n\n for (const fieldName of Object.keys(properties)) {\n fields.add(fieldName);\n }\n\n return fields;\n}\n\nfunction getSchemaFieldTypes(schema: SchemaProperty | JsonSchemaInput): FieldTypes {\n const fieldTypes: FieldTypes = {};\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const schemaType = fieldSchema.type;\n if (schemaType === 'integer') {\n fieldTypes[fieldName] = 'number';\n } else if (\n schemaType === 'number' ||\n schemaType === 'string' ||\n schemaType === 'boolean' ||\n schemaType === 'object' ||\n schemaType === 'array'\n ) {\n fieldTypes[fieldName] = schemaType;\n }\n }\n\n return fieldTypes;\n}\n\nfunction schemaTypeToInferred(\n schemaType: string | undefined,\n): InferredType | null {\n if (schemaType === 'number' || schemaType === 'integer') return 'number';\n if (schemaType === 'string') return 'string';\n if (schemaType === 'boolean') return 'boolean';\n return null;\n}\n\nfunction isTypeCompatible(\n inferredType: InferredType,\n expectedType: InferredType | null,\n): boolean {\n if (expectedType === null) return true;\n if (inferredType === 'unknown') return true;\n return inferredType === expectedType;\n}\n\nfunction extractFieldRoot(dependency: string): string {\n const root = dependency.split('.')[0]?.split('[')[0];\n return root || dependency;\n}\n\nfunction countParentLevels(path: string): number {\n let count = 0;\n let remaining = path;\n while (remaining.startsWith('../')) {\n count++;\n remaining = remaining.slice(3);\n }\n return count;\n}\n\nfunction resolveRelativePathForDependency(\n relativePath: string,\n currentPath: string,\n): string {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n if (!currentPath) {\n return targetField;\n }\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n return targetField;\n }\n\n const basePath = pathSegments.slice(0, targetLevel).join('.');\n return basePath ? `${basePath}.${targetField}` : targetField;\n}\n\nfunction validateRelativePath(\n relativePath: string,\n currentPath: string,\n rootSchema: JsonSchemaInput,\n fieldPath: string,\n): FormulaValidationError | null {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n const rootFields = getSchemaFields(rootSchema);\n if (!rootFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${targetField}' in formula`,\n };\n }\n return null;\n }\n\n const targetPath = pathSegments.slice(0, targetLevel).join('.');\n const targetSchema = resolveSubSchema(rootSchema, targetPath);\n\n if (!targetSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema for relative path '${relativePath}'`,\n };\n }\n\n const targetFields = getSchemaFields(targetSchema);\n if (!targetFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${targetField}' in formula`,\n };\n }\n\n return null;\n}\n","import {\n parseFormula,\n buildDependencyGraph,\n getTopologicalOrder,\n evaluateWithContext,\n} from '@revisium/formula';\nimport { type JsonSchema } from '../types/index.js';\n\nexport { formulaSpec } from '@revisium/formula/spec';\nexport {\n extractSchemaFormulas,\n type ExtractedFormula,\n} from './extract-schema-formulas.js';\nexport {\n validateSchemaFormulas,\n validateFormulaAgainstSchema,\n type SchemaValidationResult,\n type FormulaValidationError,\n} from './validate-schema-formulas.js';\n\nexport interface FormulaNode {\n path: string;\n expression: string;\n fieldType: 'number' | 'string' | 'boolean';\n currentPath: string;\n dependencies: string[];\n}\n\nexport interface FormulaError {\n field: string;\n expression: string;\n error: string;\n defaultUsed: boolean;\n}\n\nexport interface EvaluateFormulasResult {\n values: Record<string, unknown>;\n errors: FormulaError[];\n}\n\nexport interface EvaluateFormulasOptions {\n useDefaults?: boolean;\n defaults?: Record<string, unknown>;\n}\n\ninterface SchemaNode {\n type?: string;\n properties?: Record<string, SchemaNode>;\n items?: SchemaNode;\n 'x-formula'?: { version: number; expression: string };\n}\n\nconst FORMULA_TYPES = new Set(['number', 'string', 'boolean']);\n\nexport function collectFormulaNodes(\n schema: JsonSchema,\n data: Record<string, unknown>,\n): FormulaNode[] {\n const nodes: FormulaNode[] = [];\n traverseAndCollect(schema as SchemaNode, data, '', nodes);\n return nodes;\n}\n\nfunction traverseAndCollect(\n schema: SchemaNode,\n data: unknown,\n currentPath: string,\n nodes: FormulaNode[],\n): void {\n if (schema.type === 'object' && schema.properties && typeof data === 'object' && data !== null) {\n const record = data as Record<string, unknown>;\n\n for (const [fieldName, fieldSchema] of Object.entries(schema.properties)) {\n const fieldPath = currentPath ? `${currentPath}.${fieldName}` : fieldName;\n const fieldValue = record[fieldName];\n\n if (fieldSchema['x-formula'] && FORMULA_TYPES.has(fieldSchema.type ?? '')) {\n const expression = fieldSchema['x-formula'].expression;\n const parentPath = getParentPath(fieldPath);\n\n nodes.push({\n path: fieldPath,\n expression,\n fieldType: fieldSchema.type as 'number' | 'string' | 'boolean',\n currentPath: parentPath,\n dependencies: parseDependencies(expression),\n });\n }\n\n traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes);\n }\n }\n\n if (schema.type === 'array' && schema.items && Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const itemPath = `${currentPath}[${i}]`;\n traverseAndCollect(schema.items, data[i], itemPath, nodes);\n }\n }\n}\n\nfunction parseDependencies(expression: string): string[] {\n try {\n return parseFormula(expression).dependencies;\n } catch {\n return [];\n }\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return '';\n }\n return fieldPath.substring(0, lastDotIndex);\n}\n\nexport function evaluateFormulas(\n schema: JsonSchema,\n data: Record<string, unknown>,\n options: EvaluateFormulasOptions = {},\n): EvaluateFormulasResult {\n const nodes = collectFormulaNodes(schema, data);\n\n if (nodes.length === 0) {\n return { values: {}, errors: [] };\n }\n\n const sortedNodes = orderByDependencies(nodes);\n const values: Record<string, unknown> = {};\n const errors: FormulaError[] = [];\n const failedPaths = new Set<string>();\n\n for (const node of sortedNodes) {\n const hasDependencyFailure = hasFailedDependency(node, failedPaths);\n\n if (hasDependencyFailure) {\n failedPaths.add(node.path);\n handleError(node, 'Dependency formula failed', data, values, errors, options);\n continue;\n }\n\n const result = evaluateNode(node, data);\n\n if (!result.success) {\n failedPaths.add(node.path);\n handleError(node, result.error, data, values, errors, options);\n continue;\n }\n\n setValueByPath(data, node.path, result.value);\n values[node.path] = result.value;\n }\n\n return { values, errors };\n}\n\nfunction orderByDependencies(nodes: FormulaNode[]): FormulaNode[] {\n if (nodes.length <= 1) {\n return nodes;\n }\n\n const dependencies = Object.fromEntries(\n nodes.map((n) => [n.path, n.dependencies]),\n );\n\n const result = getTopologicalOrder(buildDependencyGraph(dependencies));\n\n if (!result.success) {\n throw new Error(\n `Cyclic dependency detected in formulas: ${result.error ?? 'unknown error'}`,\n );\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.path, n]));\n\n return result.order\n .map((path) => nodeMap.get(path))\n .filter((n): n is FormulaNode => n !== undefined);\n}\n\nfunction hasFailedDependency(node: FormulaNode, failedPaths: Set<string>): boolean {\n return node.dependencies.some((dep) => {\n for (const failedPath of failedPaths) {\n if (failedPath === dep || failedPath.endsWith(`.${dep}`)) {\n return true;\n }\n }\n return false;\n });\n}\n\nfunction evaluateNode(\n node: FormulaNode,\n data: Record<string, unknown>,\n): { success: true; value: unknown } | { success: false; error: string } {\n try {\n const itemData = node.currentPath\n ? getValueByPath(data, node.currentPath) as Record<string, unknown> | undefined\n : undefined;\n\n const result = evaluateWithContext(node.expression, {\n rootData: data,\n ...(itemData && { itemData, currentPath: node.currentPath }),\n });\n\n if (result === undefined) {\n return { success: false, error: 'Formula returned undefined' };\n }\n\n return { success: true, value: result };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction handleError(\n node: FormulaNode,\n errorMessage: string,\n data: Record<string, unknown>,\n values: Record<string, unknown>,\n errors: FormulaError[],\n options: EvaluateFormulasOptions,\n): void {\n const defaultUsed = options.useDefaults ?? false;\n\n if (defaultUsed) {\n const defaultValue = getDefaultValue(node, options.defaults);\n setValueByPath(data, node.path, defaultValue);\n values[node.path] = defaultValue;\n }\n\n errors.push({\n field: node.path,\n expression: node.expression,\n error: errorMessage,\n defaultUsed,\n });\n}\n\nfunction getDefaultValue(\n node: FormulaNode,\n defaults?: Record<string, unknown>,\n): unknown {\n if (defaults && node.path in defaults) {\n return defaults[node.path];\n }\n\n switch (node.fieldType) {\n case 'number':\n return 0;\n case 'string':\n return '';\n case 'boolean':\n return false;\n }\n}\n\nfunction getValueByPath(\n obj: Record<string, unknown>,\n path: string,\n): unknown {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (segment.type === 'field') {\n current = (current as Record<string, unknown>)[segment.name];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n current = current[segment.index];\n }\n }\n\n return current;\n}\n\ntype PathSegment = { type: 'field'; name: string } | { type: 'index'; index: number };\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n let current = '';\n let position = 0;\n\n while (position < path.length) {\n const char = path[position];\n\n if (char === '.') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n position++;\n } else if (char === '[') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n const endBracket = path.indexOf(']', position);\n if (endBracket === -1) {\n position++;\n } else {\n const indexStr = path.slice(position + 1, endBracket);\n segments.push({ type: 'index', index: Number.parseInt(indexStr, 10) });\n position = endBracket + 1;\n }\n } else {\n current += char;\n position++;\n }\n }\n\n if (current) {\n segments.push({ type: 'field', name: current });\n }\n\n return segments;\n}\n\nfunction isSafeKey(key: string): boolean {\n return key !== '__proto__';\n}\n\nfunction setValueByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n\n if (segment.type === 'field') {\n if (!isSafeKey(segment.name)) {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment.name in record)) {\n record[segment.name] = {};\n }\n current = record[segment.name];\n } else {\n const arr = current as unknown[];\n if (!arr[segment.index]) {\n arr[segment.index] = {};\n }\n current = arr[segment.index];\n }\n }\n\n const lastSegment = segments.at(-1);\n if (!lastSegment) {\n return;\n }\n\n if (lastSegment.type === 'field') {\n if (!isSafeKey(lastSegment.name)) {\n return;\n }\n (current as Record<string, unknown>)[lastSegment.name] = value;\n } else {\n (current as unknown[])[lastSegment.index] = value;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/extract-schema-formulas.ts","../src/lib/validate-schema-formulas.ts","../src/lib/formula.ts"],"names":["getParentPath","buildDependencyGraph"],"mappings":"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","file":"chunk-I2ECBDBM.js","sourcesContent":["interface XFormulaInput {\n version: number;\n expression: string;\n}\n\ninterface SchemaProperty {\n type?: string;\n 'x-formula'?: XFormulaInput;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface ExtractedFormula {\n fieldName: string;\n expression: string;\n fieldType: string;\n}\n\nexport function extractSchemaFormulas(\n schema: JsonSchemaInput,\n): ExtractedFormula[] {\n const formulas: ExtractedFormula[] = [];\n extractFormulasRecursive(schema, '', formulas);\n return formulas;\n}\n\nfunction extractFormulasRecursive(\n schema: SchemaProperty | JsonSchemaInput,\n pathPrefix: string,\n formulas: ExtractedFormula[],\n): void {\n if (schema.type === 'array' && schema.items) {\n extractFormulasRecursive(schema.items, `${pathPrefix}[]`, formulas);\n return;\n }\n\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const fullPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n\n const xFormula = fieldSchema['x-formula'];\n if (xFormula) {\n formulas.push({\n fieldName: fullPath,\n expression: xFormula.expression,\n fieldType: fieldSchema.type ?? 'string',\n });\n }\n\n if (fieldSchema.type === 'object' && fieldSchema.properties) {\n extractFormulasRecursive(fieldSchema, fullPath, formulas);\n }\n\n if (fieldSchema.type === 'array' && fieldSchema.items) {\n extractFormulasRecursive(fieldSchema.items, `${fullPath}[]`, formulas);\n }\n }\n}\n","import {\n parseExpression,\n validateFormulaSyntax,\n buildDependencyGraph,\n detectCircularDependencies,\n inferFormulaType,\n type FieldTypes,\n type InferredType,\n} from '@revisium/formula';\nimport { extractSchemaFormulas } from './extract-schema-formulas.js';\n\ninterface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\ninterface JsonSchemaInput {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface FormulaValidationError {\n field: string;\n error: string;\n position?: number;\n}\n\nexport interface SchemaValidationResult {\n isValid: boolean;\n errors: FormulaValidationError[];\n}\n\nexport function validateSchemaFormulas(\n schema: JsonSchemaInput,\n): SchemaValidationResult {\n const errors: FormulaValidationError[] = [];\n const formulas = extractSchemaFormulas(schema);\n\n for (const formula of formulas) {\n const error = validateFormulaAgainstSchema(\n formula.expression,\n formula.fieldName,\n schema,\n );\n if (error) {\n errors.push(error);\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors };\n }\n\n const dependencies: Record<string, string[]> = {};\n for (const formula of formulas) {\n const parseResult = parseExpression(formula.expression);\n const parentPath = getParentPath(formula.fieldName);\n const prefix = parentPath ? `${parentPath}.` : '';\n\n dependencies[formula.fieldName] = parseResult.dependencies.map((dep) => {\n if (dep.startsWith('/')) {\n return extractFieldRoot(dep.slice(1));\n }\n if (dep.startsWith('../')) {\n return resolveRelativePathForDependency(dep, parentPath);\n }\n const rootField = extractFieldRoot(dep);\n return `${prefix}${rootField}`;\n });\n }\n\n const graph = buildDependencyGraph(dependencies);\n const circularCheck = detectCircularDependencies(graph);\n\n const cycle = circularCheck.cycle;\n if (circularCheck.hasCircular && cycle && cycle.length > 0) {\n const firstField = cycle[0];\n if (firstField) {\n errors.push({\n field: firstField,\n error: `Circular dependency: ${cycle.join(' → ')}`,\n });\n return { isValid: false, errors };\n }\n }\n\n return { isValid: true, errors: [] };\n}\n\nexport function validateFormulaAgainstSchema(\n expression: string,\n fieldName: string,\n schema: JsonSchemaInput,\n): FormulaValidationError | null {\n return validateFormulaInContext(expression, fieldName, schema);\n}\n\nfunction validateFormulaInContext(\n expression: string,\n fieldPath: string,\n rootSchema: JsonSchemaInput,\n): FormulaValidationError | null {\n const syntaxResult = validateFormulaSyntax(expression);\n if (!syntaxResult.isValid) {\n return {\n field: fieldPath,\n error: syntaxResult.error,\n position: syntaxResult.position,\n };\n }\n\n const parentPath = getParentPath(fieldPath);\n const localFieldName = getFieldName(fieldPath);\n const contextSchema = resolveSubSchema(rootSchema, parentPath);\n\n if (!contextSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema context for path '${parentPath}'`,\n };\n }\n\n const parseResult = parseExpression(expression);\n const localSchemaFields = getSchemaFields(contextSchema);\n const rootSchemaFields = getSchemaFields(rootSchema);\n\n for (const dep of parseResult.dependencies) {\n if (dep.startsWith('/')) {\n const rootField = extractFieldRoot(dep.slice(1));\n if (!rootSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${rootField}' in formula`,\n };\n }\n } else if (dep.startsWith('../')) {\n const validationResult = validateRelativePath(\n dep,\n parentPath,\n rootSchema,\n fieldPath,\n );\n if (validationResult) {\n return validationResult;\n }\n } else {\n const rootField = extractFieldRoot(dep);\n if (!localSchemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${rootField}' in formula`,\n };\n }\n }\n }\n\n if (\n parseResult.dependencies.some((d) => extractFieldRoot(d) === localFieldName)\n ) {\n return {\n field: fieldPath,\n error: `Formula cannot reference itself`,\n };\n }\n\n const fieldSchema = contextSchema.properties?.[localFieldName];\n const expectedType = schemaTypeToInferred(fieldSchema?.type);\n const fieldTypes = getSchemaFieldTypes(contextSchema);\n const inferredType = inferFormulaType(expression, fieldTypes);\n\n if (!isTypeCompatible(inferredType, expectedType)) {\n return {\n field: fieldPath,\n error: `Type mismatch: formula returns '${inferredType}' but field expects '${expectedType}'`,\n };\n }\n\n return null;\n}\n\nfunction resolveSubSchema(\n schema: JsonSchemaInput,\n fieldPath: string,\n): SchemaProperty | null {\n if (!fieldPath) {\n return schema;\n }\n\n const segments = parsePathSegmentsForSchema(fieldPath);\n let current: SchemaProperty | JsonSchemaInput = schema;\n\n for (const segment of segments) {\n if (segment === '[]') {\n if (current.type === 'array' && current.items) {\n current = current.items;\n } else {\n return null;\n }\n } else if (current.properties?.[segment]) {\n current = current.properties[segment];\n } else {\n return null;\n }\n }\n\n return current;\n}\n\nfunction parsePathSegmentsForSchema(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n segments.push('[]');\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction parsePathSegments(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf('[');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex <= 0) {\n return '';\n }\n\n return fieldPath.substring(0, splitIndex);\n}\n\nfunction getFieldName(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf(']');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex === -1) {\n return fieldPath;\n }\n\n return fieldPath.substring(splitIndex + 1);\n}\n\nfunction getSchemaFields(schema: SchemaProperty | JsonSchemaInput): Set<string> {\n const fields = new Set<string>();\n const properties = schema.properties ?? {};\n\n for (const fieldName of Object.keys(properties)) {\n fields.add(fieldName);\n }\n\n return fields;\n}\n\nfunction getSchemaFieldTypes(schema: SchemaProperty | JsonSchemaInput): FieldTypes {\n const fieldTypes: FieldTypes = {};\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const schemaType = fieldSchema.type;\n if (schemaType === 'integer') {\n fieldTypes[fieldName] = 'number';\n } else if (\n schemaType === 'number' ||\n schemaType === 'string' ||\n schemaType === 'boolean' ||\n schemaType === 'object' ||\n schemaType === 'array'\n ) {\n fieldTypes[fieldName] = schemaType;\n }\n }\n\n return fieldTypes;\n}\n\nfunction schemaTypeToInferred(\n schemaType: string | undefined,\n): InferredType | null {\n if (schemaType === 'number' || schemaType === 'integer') return 'number';\n if (schemaType === 'string') return 'string';\n if (schemaType === 'boolean') return 'boolean';\n return null;\n}\n\nfunction isTypeCompatible(\n inferredType: InferredType,\n expectedType: InferredType | null,\n): boolean {\n if (expectedType === null) return true;\n if (inferredType === 'unknown') return true;\n return inferredType === expectedType;\n}\n\nfunction extractFieldRoot(dependency: string): string {\n const root = dependency.split('.')[0]?.split('[')[0];\n return root || dependency;\n}\n\nfunction countParentLevels(path: string): number {\n let count = 0;\n let remaining = path;\n while (remaining.startsWith('../')) {\n count++;\n remaining = remaining.slice(3);\n }\n return count;\n}\n\nfunction resolveRelativePathForDependency(\n relativePath: string,\n currentPath: string,\n): string {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n if (!currentPath) {\n return targetField;\n }\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n return targetField;\n }\n\n const basePath = pathSegments.slice(0, targetLevel).join('.');\n return basePath ? `${basePath}.${targetField}` : targetField;\n}\n\nfunction validateRelativePath(\n relativePath: string,\n currentPath: string,\n rootSchema: JsonSchemaInput,\n fieldPath: string,\n): FormulaValidationError | null {\n const parentLevels = countParentLevels(relativePath);\n const fieldAfterParents = relativePath.replace(/^(\\.\\.\\/)+/, '');\n const targetField = extractFieldRoot(fieldAfterParents);\n\n const pathSegments = parsePathSegments(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n const rootFields = getSchemaFields(rootSchema);\n if (!rootFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown root field '${targetField}' in formula`,\n };\n }\n return null;\n }\n\n const targetPath = pathSegments.slice(0, targetLevel).join('.');\n const targetSchema = resolveSubSchema(rootSchema, targetPath);\n\n if (!targetSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema for relative path '${relativePath}'`,\n };\n }\n\n const targetFields = getSchemaFields(targetSchema);\n if (!targetFields.has(targetField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${targetField}' in formula`,\n };\n }\n\n return null;\n}\n","import {\n parseFormula,\n buildDependencyGraph,\n getTopologicalOrder,\n evaluateWithContext,\n} from '@revisium/formula';\nimport { type JsonSchema } from '../types/index.js';\n\nexport { formulaSpec } from '@revisium/formula/spec';\nexport {\n extractSchemaFormulas,\n type ExtractedFormula,\n} from './extract-schema-formulas.js';\nexport {\n validateSchemaFormulas,\n validateFormulaAgainstSchema,\n type SchemaValidationResult,\n type FormulaValidationError,\n} from './validate-schema-formulas.js';\n\nexport interface FormulaNode {\n path: string;\n expression: string;\n fieldType: 'number' | 'string' | 'boolean';\n currentPath: string;\n dependencies: string[];\n}\n\nexport interface FormulaError {\n field: string;\n expression: string;\n error: string;\n defaultUsed: boolean;\n}\n\nexport interface EvaluateFormulasResult {\n values: Record<string, unknown>;\n errors: FormulaError[];\n}\n\nexport interface EvaluateFormulasOptions {\n useDefaults?: boolean;\n defaults?: Record<string, unknown>;\n}\n\ninterface SchemaNode {\n type?: string;\n properties?: Record<string, SchemaNode>;\n items?: SchemaNode;\n 'x-formula'?: { version: number; expression: string };\n}\n\nconst FORMULA_TYPES = new Set(['number', 'string', 'boolean']);\n\nexport function collectFormulaNodes(\n schema: JsonSchema,\n data: Record<string, unknown>,\n): FormulaNode[] {\n const nodes: FormulaNode[] = [];\n traverseAndCollect(schema as SchemaNode, data, '', nodes);\n return nodes;\n}\n\nfunction traverseAndCollect(\n schema: SchemaNode,\n data: unknown,\n currentPath: string,\n nodes: FormulaNode[],\n): void {\n if (schema.type === 'object' && schema.properties && typeof data === 'object' && data !== null) {\n const record = data as Record<string, unknown>;\n\n for (const [fieldName, fieldSchema] of Object.entries(schema.properties)) {\n const fieldPath = currentPath ? `${currentPath}.${fieldName}` : fieldName;\n const fieldValue = record[fieldName];\n\n if (fieldSchema['x-formula'] && FORMULA_TYPES.has(fieldSchema.type ?? '')) {\n const expression = fieldSchema['x-formula'].expression;\n const parentPath = getParentPath(fieldPath);\n\n nodes.push({\n path: fieldPath,\n expression,\n fieldType: fieldSchema.type as 'number' | 'string' | 'boolean',\n currentPath: parentPath,\n dependencies: parseDependencies(expression),\n });\n }\n\n traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes);\n }\n }\n\n if (schema.type === 'array' && schema.items && Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const itemPath = `${currentPath}[${i}]`;\n traverseAndCollect(schema.items, data[i], itemPath, nodes);\n }\n }\n}\n\nfunction parseDependencies(expression: string): string[] {\n try {\n return parseFormula(expression).dependencies;\n } catch {\n return [];\n }\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n if (lastDotIndex === -1) {\n return '';\n }\n return fieldPath.substring(0, lastDotIndex);\n}\n\nexport function evaluateFormulas(\n schema: JsonSchema,\n data: Record<string, unknown>,\n options: EvaluateFormulasOptions = {},\n): EvaluateFormulasResult {\n const nodes = collectFormulaNodes(schema, data);\n\n if (nodes.length === 0) {\n return { values: {}, errors: [] };\n }\n\n const sortedNodes = orderByDependencies(nodes);\n const values: Record<string, unknown> = {};\n const errors: FormulaError[] = [];\n const failedPaths = new Set<string>();\n\n for (const node of sortedNodes) {\n const hasDependencyFailure = hasFailedDependency(node, failedPaths);\n\n if (hasDependencyFailure) {\n failedPaths.add(node.path);\n handleError(node, 'Dependency formula failed', data, values, errors, options);\n continue;\n }\n\n const result = evaluateNode(node, data);\n\n if (!result.success) {\n failedPaths.add(node.path);\n handleError(node, result.error, data, values, errors, options);\n continue;\n }\n\n setValueByPath(data, node.path, result.value);\n values[node.path] = result.value;\n }\n\n return { values, errors };\n}\n\nfunction orderByDependencies(nodes: FormulaNode[]): FormulaNode[] {\n if (nodes.length <= 1) {\n return nodes;\n }\n\n const dependencies = Object.fromEntries(\n nodes.map((n) => [n.path, n.dependencies]),\n );\n\n const result = getTopologicalOrder(buildDependencyGraph(dependencies));\n\n if (!result.success) {\n throw new Error(\n `Cyclic dependency detected in formulas: ${result.error ?? 'unknown error'}`,\n );\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.path, n]));\n\n return result.order\n .map((path) => nodeMap.get(path))\n .filter((n): n is FormulaNode => n !== undefined);\n}\n\nfunction hasFailedDependency(node: FormulaNode, failedPaths: Set<string>): boolean {\n return node.dependencies.some((dep) => {\n for (const failedPath of failedPaths) {\n if (failedPath === dep || failedPath.endsWith(`.${dep}`)) {\n return true;\n }\n }\n return false;\n });\n}\n\nfunction evaluateNode(\n node: FormulaNode,\n data: Record<string, unknown>,\n): { success: true; value: unknown } | { success: false; error: string } {\n try {\n const itemData = node.currentPath\n ? getValueByPath(data, node.currentPath) as Record<string, unknown> | undefined\n : undefined;\n\n const result = evaluateWithContext(node.expression, {\n rootData: data,\n ...(itemData && { itemData, currentPath: node.currentPath }),\n });\n\n if (result === undefined) {\n return { success: false, error: 'Formula returned undefined' };\n }\n\n return { success: true, value: result };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction handleError(\n node: FormulaNode,\n errorMessage: string,\n data: Record<string, unknown>,\n values: Record<string, unknown>,\n errors: FormulaError[],\n options: EvaluateFormulasOptions,\n): void {\n const defaultUsed = options.useDefaults ?? false;\n\n if (defaultUsed) {\n const defaultValue = getDefaultValue(node, options.defaults);\n setValueByPath(data, node.path, defaultValue);\n values[node.path] = defaultValue;\n }\n\n errors.push({\n field: node.path,\n expression: node.expression,\n error: errorMessage,\n defaultUsed,\n });\n}\n\nfunction getDefaultValue(\n node: FormulaNode,\n defaults?: Record<string, unknown>,\n): unknown {\n if (defaults && node.path in defaults) {\n return defaults[node.path];\n }\n\n switch (node.fieldType) {\n case 'number':\n return 0;\n case 'string':\n return '';\n case 'boolean':\n return false;\n }\n}\n\nfunction getValueByPath(\n obj: Record<string, unknown>,\n path: string,\n): unknown {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (segment.type === 'field') {\n current = (current as Record<string, unknown>)[segment.name];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n current = current[segment.index];\n }\n }\n\n return current;\n}\n\ntype PathSegment = { type: 'field'; name: string } | { type: 'index'; index: number };\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n let current = '';\n let position = 0;\n\n while (position < path.length) {\n const char = path[position];\n\n if (char === '.') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n position++;\n } else if (char === '[') {\n if (current) {\n segments.push({ type: 'field', name: current });\n current = '';\n }\n const endBracket = path.indexOf(']', position);\n if (endBracket === -1) {\n position++;\n } else {\n const indexStr = path.slice(position + 1, endBracket);\n segments.push({ type: 'index', index: Number.parseInt(indexStr, 10) });\n position = endBracket + 1;\n }\n } else {\n current += char;\n position++;\n }\n }\n\n if (current) {\n segments.push({ type: 'field', name: current });\n }\n\n return segments;\n}\n\nfunction isSafeKey(key: string): boolean {\n return key !== '__proto__';\n}\n\nfunction setValueByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const segments = parsePath(path);\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n\n if (segment.type === 'field') {\n if (!isSafeKey(segment.name)) {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment.name in record)) {\n record[segment.name] = {};\n }\n current = record[segment.name];\n } else {\n const arr = current as unknown[];\n if (!arr[segment.index]) {\n arr[segment.index] = {};\n }\n current = arr[segment.index];\n }\n }\n\n const lastSegment = segments.at(-1);\n if (!lastSegment) {\n return;\n }\n\n if (lastSegment.type === 'field') {\n if (!isSafeKey(lastSegment.name)) {\n return;\n }\n (current as Record<string, unknown>)[lastSegment.name] = value;\n } else {\n (current as unknown[])[lastSegment.index] = value;\n }\n}\n"]}