@revisium/schema-toolkit 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { parseExpression, buildDependencyGraph, detectCircularDependencies, validateFormulaSyntax, inferFormulaType, parseFormula, getTopologicalOrder, evaluateWithContext } from '@revisium/formula';
1
+ import { parseExpression, buildDependencyGraph, detectCircularDependencies, validateFormulaSyntax, inferFormulaType, parseFormula, evaluateWithContext } from '@revisium/formula';
2
2
  export { formulaSpec } from '@revisium/formula/spec';
3
3
 
4
4
  // src/lib/extract-schema-formulas.ts
@@ -137,6 +137,18 @@ function validateFormulaInContext(expression, fieldPath, rootSchema) {
137
137
  error: `Formula cannot reference itself`
138
138
  };
139
139
  }
140
+ const isInsideArray = fieldPath.includes("[");
141
+ if (isInsideArray) {
142
+ const computedFields = getComputedFieldsInContext(contextSchema);
143
+ const arrayRefError = validateArrayReferences(
144
+ expression,
145
+ fieldPath,
146
+ computedFields
147
+ );
148
+ if (arrayRefError) {
149
+ return arrayRefError;
150
+ }
151
+ }
140
152
  const fieldSchema = contextSchema.properties?.[localFieldName];
141
153
  const expectedType = schemaTypeToInferred(fieldSchema?.type);
142
154
  const fieldTypes = getSchemaFieldTypes(contextSchema);
@@ -336,6 +348,39 @@ function validateRelativePath(relativePath, currentPath, rootSchema, fieldPath)
336
348
  }
337
349
  return null;
338
350
  }
351
+ function getComputedFieldsInContext(schema) {
352
+ const computedFields = /* @__PURE__ */ new Set();
353
+ const properties = schema.properties ?? {};
354
+ for (const [fieldName, fieldSchema] of Object.entries(properties)) {
355
+ if (fieldSchema["x-formula"]) {
356
+ computedFields.add(fieldName);
357
+ }
358
+ }
359
+ return computedFields;
360
+ }
361
+ function validateArrayReferences(expression, fieldPath, computedFields) {
362
+ const atNextMatches = expression.matchAll(/@next\.(\w+)/g);
363
+ for (const match of atNextMatches) {
364
+ const fieldName = match[1];
365
+ if (fieldName && computedFields.has(fieldName)) {
366
+ return {
367
+ field: fieldPath,
368
+ error: `Cannot reference computed field '${fieldName}' via @next. Use @prev instead for cross-element computed field references.`
369
+ };
370
+ }
371
+ }
372
+ const absoluteIndexMatches = expression.matchAll(/\/[\w[\]]+\[\d+\]\.(\w+)/g);
373
+ for (const match of absoluteIndexMatches) {
374
+ const fieldName = match[1];
375
+ if (fieldName && computedFields.has(fieldName)) {
376
+ return {
377
+ field: fieldPath,
378
+ error: `Absolute index reference to computed field '${fieldName}' may cause forward reference issues. Consider using @prev pattern instead.`
379
+ };
380
+ }
381
+ }
382
+ return null;
383
+ }
339
384
  var FORMULA_TYPES = /* @__PURE__ */ new Set(["number", "string", "boolean"]);
340
385
  function collectFormulaNodes(schema, data) {
341
386
  const nodes = [];
@@ -357,7 +402,7 @@ function traverseAndCollect(schema, data, currentPath, nodes, ctx) {
357
402
  fieldType: fieldSchema.type,
358
403
  currentPath: parentPath,
359
404
  dependencies: parseDependencies(expression),
360
- arrayContext: ctx.arrayLevels.length > 0 ? { levels: [...ctx.arrayLevels] } : void 0
405
+ arrayLevels: [...ctx.arrayLevels]
361
406
  });
362
407
  }
363
408
  traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes, ctx);
@@ -369,8 +414,7 @@ function traverseAndCollect(schema, data, currentPath, nodes, ctx) {
369
414
  const arrayLevel = {
370
415
  index: i,
371
416
  length: data.length,
372
- prev: i > 0 ? data[i - 1] : null,
373
- next: i < data.length - 1 ? data[i + 1] : null
417
+ arrayPath: currentPath
374
418
  };
375
419
  const newCtx = {
376
420
  arrayLevels: [arrayLevel, ...ctx.arrayLevels]
@@ -424,17 +468,34 @@ function orderByDependencies(nodes) {
424
468
  if (nodes.length <= 1) {
425
469
  return nodes;
426
470
  }
427
- const dependencies = Object.fromEntries(
428
- nodes.map((n) => [n.path, n.dependencies])
429
- );
430
- const result = getTopologicalOrder(buildDependencyGraph(dependencies));
431
- if (!result.success) {
432
- throw new Error(
433
- `Cyclic dependency detected in formulas: ${result.error ?? "unknown error"}`
434
- );
471
+ const formulaNodes = new Set(nodes.map((n) => n.path));
472
+ const visited = /* @__PURE__ */ new Set();
473
+ const order = [];
474
+ const nodeByPath = new Map(nodes.map((n) => [n.path, n]));
475
+ const visit = (node, stack) => {
476
+ if (visited.has(node.path)) {
477
+ return;
478
+ }
479
+ if (stack.has(node.path)) {
480
+ throw new Error(`Cyclic dependency detected in formulas: ${node.path}`);
481
+ }
482
+ stack.add(node.path);
483
+ for (const dep of node.dependencies) {
484
+ if (formulaNodes.has(dep)) {
485
+ const depNode = nodeByPath.get(dep);
486
+ if (depNode) {
487
+ visit(depNode, stack);
488
+ }
489
+ }
490
+ }
491
+ stack.delete(node.path);
492
+ visited.add(node.path);
493
+ order.push(node);
494
+ };
495
+ for (const node of nodes) {
496
+ visit(node, /* @__PURE__ */ new Set());
435
497
  }
436
- const nodeMap = new Map(nodes.map((n) => [n.path, n]));
437
- return result.order.map((path) => nodeMap.get(path)).filter((n) => n !== void 0);
498
+ return order;
438
499
  }
439
500
  function hasFailedDependency(node, failedPaths) {
440
501
  return node.dependencies.some((dep) => {
@@ -446,13 +507,35 @@ function hasFailedDependency(node, failedPaths) {
446
507
  return false;
447
508
  });
448
509
  }
510
+ function buildArrayContext(node, data) {
511
+ if (node.arrayLevels.length === 0) {
512
+ return void 0;
513
+ }
514
+ const levels = node.arrayLevels.map((level) => {
515
+ const array = getValueByPath(data, level.arrayPath);
516
+ const { index, length } = level;
517
+ let prev = null;
518
+ let next = null;
519
+ if (array) {
520
+ if (index > 0) {
521
+ prev = array[index - 1] ?? null;
522
+ }
523
+ if (index < length - 1) {
524
+ next = array[index + 1] ?? null;
525
+ }
526
+ }
527
+ return { index, length, prev, next };
528
+ });
529
+ return { levels };
530
+ }
449
531
  function evaluateNode(node, data) {
450
532
  try {
451
533
  const itemData = node.currentPath ? getValueByPath(data, node.currentPath) : void 0;
534
+ const arrayContext = buildArrayContext(node, data);
452
535
  const result = evaluateWithContext(node.expression, {
453
536
  rootData: data,
454
537
  ...itemData && { itemData, currentPath: node.currentPath },
455
- arrayContext: node.arrayContext
538
+ arrayContext
456
539
  });
457
540
  if (result === void 0) {
458
541
  return { success: false, error: "Formula returned undefined" };
@@ -585,5 +668,5 @@ function setValueByPath(obj, path, value) {
585
668
  }
586
669
 
587
670
  export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, validateFormulaAgainstSchema, validateSchemaFormulas };
588
- //# sourceMappingURL=chunk-HHS27GGA.js.map
589
- //# sourceMappingURL=chunk-HHS27GGA.js.map
671
+ //# sourceMappingURL=chunk-R3MS2N4A.js.map
672
+ //# sourceMappingURL=chunk-R3MS2N4A.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"],"mappings":"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","file":"chunk-R3MS2N4A.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 XFormula {\n version: number;\n expression: string;\n}\n\ninterface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n 'x-formula'?: XFormula;\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 isInsideArray = fieldPath.includes('[');\n if (isInsideArray) {\n const computedFields = getComputedFieldsInContext(contextSchema);\n const arrayRefError = validateArrayReferences(\n expression,\n fieldPath,\n computedFields,\n );\n if (arrayRefError) {\n return arrayRefError;\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\nfunction getComputedFieldsInContext(\n schema: SchemaProperty | JsonSchemaInput,\n): Set<string> {\n const computedFields = new Set<string>();\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n if (fieldSchema['x-formula']) {\n computedFields.add(fieldName);\n }\n }\n\n return computedFields;\n}\n\nfunction validateArrayReferences(\n expression: string,\n fieldPath: string,\n computedFields: Set<string>,\n): FormulaValidationError | null {\n const atNextMatches = expression.matchAll(/@next\\.(\\w+)/g);\n for (const match of atNextMatches) {\n const fieldName = match[1];\n if (fieldName && computedFields.has(fieldName)) {\n return {\n field: fieldPath,\n error: `Cannot reference computed field '${fieldName}' via @next. Use @prev instead for cross-element computed field references.`,\n };\n }\n }\n\n const absoluteIndexMatches = expression.matchAll(/\\/[\\w[\\]]+\\[\\d+\\]\\.(\\w+)/g);\n for (const match of absoluteIndexMatches) {\n const fieldName = match[1];\n if (fieldName && computedFields.has(fieldName)) {\n return {\n field: fieldPath,\n error: `Absolute index reference to computed field '${fieldName}' may cause forward reference issues. Consider using @prev pattern instead.`,\n };\n }\n }\n\n return null;\n}\n","import {\n parseFormula,\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\ninterface ArrayLevelInfo {\n index: number;\n length: number;\n arrayPath: string;\n}\n\nexport interface FormulaNode {\n path: string;\n expression: string;\n fieldType: 'number' | 'string' | 'boolean';\n currentPath: string;\n dependencies: string[];\n arrayLevels: ArrayLevelInfo[];\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: ArrayLevelInfo[];\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 arrayLevels: [...ctx.arrayLevels],\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: ArrayLevelInfo = {\n index: i,\n length: data.length,\n arrayPath: currentPath,\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 formulaNodes = new Set(nodes.map((n) => n.path));\n const visited = new Set<string>();\n const order: FormulaNode[] = [];\n\n const nodeByPath = new Map(nodes.map((n) => [n.path, n]));\n\n const visit = (node: FormulaNode, stack: Set<string>): void => {\n if (visited.has(node.path)) {\n return;\n }\n\n if (stack.has(node.path)) {\n throw new Error(`Cyclic dependency detected in formulas: ${node.path}`);\n }\n\n stack.add(node.path);\n\n for (const dep of node.dependencies) {\n if (formulaNodes.has(dep)) {\n const depNode = nodeByPath.get(dep);\n if (depNode) {\n visit(depNode, stack);\n }\n }\n }\n\n stack.delete(node.path);\n visited.add(node.path);\n order.push(node);\n };\n\n for (const node of nodes) {\n visit(node, new Set());\n }\n\n return order;\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 buildArrayContext(\n node: FormulaNode,\n data: Record<string, unknown>,\n): ArrayContext | undefined {\n if (node.arrayLevels.length === 0) {\n return undefined;\n }\n\n const levels: ArrayLevelContext[] = node.arrayLevels.map((level) => {\n const array = getValueByPath(data, level.arrayPath) as unknown[] | undefined;\n const { index, length } = level;\n\n let prev: unknown = null;\n let next: unknown = null;\n\n if (array) {\n if (index > 0) {\n prev = array[index - 1] ?? null;\n }\n if (index < length - 1) {\n next = array[index + 1] ?? null;\n }\n }\n\n return { index, length, prev, next };\n });\n\n return { levels };\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 arrayContext = buildArrayContext(node, data);\n\n const result = evaluateWithContext(node.expression, {\n rootData: data,\n ...(itemData && { itemData, currentPath: node.currentPath }),\n 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"]}
@@ -139,6 +139,18 @@ function validateFormulaInContext(expression, fieldPath, rootSchema) {
139
139
  error: `Formula cannot reference itself`
140
140
  };
141
141
  }
142
+ const isInsideArray = fieldPath.includes("[");
143
+ if (isInsideArray) {
144
+ const computedFields = getComputedFieldsInContext(contextSchema);
145
+ const arrayRefError = validateArrayReferences(
146
+ expression,
147
+ fieldPath,
148
+ computedFields
149
+ );
150
+ if (arrayRefError) {
151
+ return arrayRefError;
152
+ }
153
+ }
142
154
  const fieldSchema = contextSchema.properties?.[localFieldName];
143
155
  const expectedType = schemaTypeToInferred(fieldSchema?.type);
144
156
  const fieldTypes = getSchemaFieldTypes(contextSchema);
@@ -338,6 +350,39 @@ function validateRelativePath(relativePath, currentPath, rootSchema, fieldPath)
338
350
  }
339
351
  return null;
340
352
  }
353
+ function getComputedFieldsInContext(schema) {
354
+ const computedFields = /* @__PURE__ */ new Set();
355
+ const properties = schema.properties ?? {};
356
+ for (const [fieldName, fieldSchema] of Object.entries(properties)) {
357
+ if (fieldSchema["x-formula"]) {
358
+ computedFields.add(fieldName);
359
+ }
360
+ }
361
+ return computedFields;
362
+ }
363
+ function validateArrayReferences(expression, fieldPath, computedFields) {
364
+ const atNextMatches = expression.matchAll(/@next\.(\w+)/g);
365
+ for (const match of atNextMatches) {
366
+ const fieldName = match[1];
367
+ if (fieldName && computedFields.has(fieldName)) {
368
+ return {
369
+ field: fieldPath,
370
+ error: `Cannot reference computed field '${fieldName}' via @next. Use @prev instead for cross-element computed field references.`
371
+ };
372
+ }
373
+ }
374
+ const absoluteIndexMatches = expression.matchAll(/\/[\w[\]]+\[\d+\]\.(\w+)/g);
375
+ for (const match of absoluteIndexMatches) {
376
+ const fieldName = match[1];
377
+ if (fieldName && computedFields.has(fieldName)) {
378
+ return {
379
+ field: fieldPath,
380
+ error: `Absolute index reference to computed field '${fieldName}' may cause forward reference issues. Consider using @prev pattern instead.`
381
+ };
382
+ }
383
+ }
384
+ return null;
385
+ }
341
386
  var FORMULA_TYPES = /* @__PURE__ */ new Set(["number", "string", "boolean"]);
342
387
  function collectFormulaNodes(schema, data) {
343
388
  const nodes = [];
@@ -359,7 +404,7 @@ function traverseAndCollect(schema, data, currentPath, nodes, ctx) {
359
404
  fieldType: fieldSchema.type,
360
405
  currentPath: parentPath,
361
406
  dependencies: parseDependencies(expression),
362
- arrayContext: ctx.arrayLevels.length > 0 ? { levels: [...ctx.arrayLevels] } : void 0
407
+ arrayLevels: [...ctx.arrayLevels]
363
408
  });
364
409
  }
365
410
  traverseAndCollect(fieldSchema, fieldValue, fieldPath, nodes, ctx);
@@ -371,8 +416,7 @@ function traverseAndCollect(schema, data, currentPath, nodes, ctx) {
371
416
  const arrayLevel = {
372
417
  index: i,
373
418
  length: data.length,
374
- prev: i > 0 ? data[i - 1] : null,
375
- next: i < data.length - 1 ? data[i + 1] : null
419
+ arrayPath: currentPath
376
420
  };
377
421
  const newCtx = {
378
422
  arrayLevels: [arrayLevel, ...ctx.arrayLevels]
@@ -426,17 +470,34 @@ function orderByDependencies(nodes) {
426
470
  if (nodes.length <= 1) {
427
471
  return nodes;
428
472
  }
429
- const dependencies = Object.fromEntries(
430
- nodes.map((n) => [n.path, n.dependencies])
431
- );
432
- const result = formula.getTopologicalOrder(formula.buildDependencyGraph(dependencies));
433
- if (!result.success) {
434
- throw new Error(
435
- `Cyclic dependency detected in formulas: ${result.error ?? "unknown error"}`
436
- );
473
+ const formulaNodes = new Set(nodes.map((n) => n.path));
474
+ const visited = /* @__PURE__ */ new Set();
475
+ const order = [];
476
+ const nodeByPath = new Map(nodes.map((n) => [n.path, n]));
477
+ const visit = (node, stack) => {
478
+ if (visited.has(node.path)) {
479
+ return;
480
+ }
481
+ if (stack.has(node.path)) {
482
+ throw new Error(`Cyclic dependency detected in formulas: ${node.path}`);
483
+ }
484
+ stack.add(node.path);
485
+ for (const dep of node.dependencies) {
486
+ if (formulaNodes.has(dep)) {
487
+ const depNode = nodeByPath.get(dep);
488
+ if (depNode) {
489
+ visit(depNode, stack);
490
+ }
491
+ }
492
+ }
493
+ stack.delete(node.path);
494
+ visited.add(node.path);
495
+ order.push(node);
496
+ };
497
+ for (const node of nodes) {
498
+ visit(node, /* @__PURE__ */ new Set());
437
499
  }
438
- const nodeMap = new Map(nodes.map((n) => [n.path, n]));
439
- return result.order.map((path) => nodeMap.get(path)).filter((n) => n !== void 0);
500
+ return order;
440
501
  }
441
502
  function hasFailedDependency(node, failedPaths) {
442
503
  return node.dependencies.some((dep) => {
@@ -448,13 +509,35 @@ function hasFailedDependency(node, failedPaths) {
448
509
  return false;
449
510
  });
450
511
  }
512
+ function buildArrayContext(node, data) {
513
+ if (node.arrayLevels.length === 0) {
514
+ return void 0;
515
+ }
516
+ const levels = node.arrayLevels.map((level) => {
517
+ const array = getValueByPath(data, level.arrayPath);
518
+ const { index, length } = level;
519
+ let prev = null;
520
+ let next = null;
521
+ if (array) {
522
+ if (index > 0) {
523
+ prev = array[index - 1] ?? null;
524
+ }
525
+ if (index < length - 1) {
526
+ next = array[index + 1] ?? null;
527
+ }
528
+ }
529
+ return { index, length, prev, next };
530
+ });
531
+ return { levels };
532
+ }
451
533
  function evaluateNode(node, data) {
452
534
  try {
453
535
  const itemData = node.currentPath ? getValueByPath(data, node.currentPath) : void 0;
536
+ const arrayContext = buildArrayContext(node, data);
454
537
  const result = formula.evaluateWithContext(node.expression, {
455
538
  rootData: data,
456
539
  ...itemData && { itemData, currentPath: node.currentPath },
457
- arrayContext: node.arrayContext
540
+ arrayContext
458
541
  });
459
542
  if (result === void 0) {
460
543
  return { success: false, error: "Formula returned undefined" };
@@ -595,5 +678,5 @@ exports.evaluateFormulas = evaluateFormulas;
595
678
  exports.extractSchemaFormulas = extractSchemaFormulas;
596
679
  exports.validateFormulaAgainstSchema = validateFormulaAgainstSchema;
597
680
  exports.validateSchemaFormulas = validateSchemaFormulas;
598
- //# sourceMappingURL=chunk-SVQTPQIM.cjs.map
599
- //# sourceMappingURL=chunk-SVQTPQIM.cjs.map
681
+ //# sourceMappingURL=chunk-X2VRR7V7.cjs.map
682
+ //# sourceMappingURL=chunk-X2VRR7V7.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","evaluateWithContext"],"mappings":"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","file":"chunk-X2VRR7V7.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 XFormula {\n version: number;\n expression: string;\n}\n\ninterface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n 'x-formula'?: XFormula;\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 isInsideArray = fieldPath.includes('[');\n if (isInsideArray) {\n const computedFields = getComputedFieldsInContext(contextSchema);\n const arrayRefError = validateArrayReferences(\n expression,\n fieldPath,\n computedFields,\n );\n if (arrayRefError) {\n return arrayRefError;\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\nfunction getComputedFieldsInContext(\n schema: SchemaProperty | JsonSchemaInput,\n): Set<string> {\n const computedFields = new Set<string>();\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n if (fieldSchema['x-formula']) {\n computedFields.add(fieldName);\n }\n }\n\n return computedFields;\n}\n\nfunction validateArrayReferences(\n expression: string,\n fieldPath: string,\n computedFields: Set<string>,\n): FormulaValidationError | null {\n const atNextMatches = expression.matchAll(/@next\\.(\\w+)/g);\n for (const match of atNextMatches) {\n const fieldName = match[1];\n if (fieldName && computedFields.has(fieldName)) {\n return {\n field: fieldPath,\n error: `Cannot reference computed field '${fieldName}' via @next. Use @prev instead for cross-element computed field references.`,\n };\n }\n }\n\n const absoluteIndexMatches = expression.matchAll(/\\/[\\w[\\]]+\\[\\d+\\]\\.(\\w+)/g);\n for (const match of absoluteIndexMatches) {\n const fieldName = match[1];\n if (fieldName && computedFields.has(fieldName)) {\n return {\n field: fieldPath,\n error: `Absolute index reference to computed field '${fieldName}' may cause forward reference issues. Consider using @prev pattern instead.`,\n };\n }\n }\n\n return null;\n}\n","import {\n parseFormula,\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\ninterface ArrayLevelInfo {\n index: number;\n length: number;\n arrayPath: string;\n}\n\nexport interface FormulaNode {\n path: string;\n expression: string;\n fieldType: 'number' | 'string' | 'boolean';\n currentPath: string;\n dependencies: string[];\n arrayLevels: ArrayLevelInfo[];\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: ArrayLevelInfo[];\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 arrayLevels: [...ctx.arrayLevels],\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: ArrayLevelInfo = {\n index: i,\n length: data.length,\n arrayPath: currentPath,\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 formulaNodes = new Set(nodes.map((n) => n.path));\n const visited = new Set<string>();\n const order: FormulaNode[] = [];\n\n const nodeByPath = new Map(nodes.map((n) => [n.path, n]));\n\n const visit = (node: FormulaNode, stack: Set<string>): void => {\n if (visited.has(node.path)) {\n return;\n }\n\n if (stack.has(node.path)) {\n throw new Error(`Cyclic dependency detected in formulas: ${node.path}`);\n }\n\n stack.add(node.path);\n\n for (const dep of node.dependencies) {\n if (formulaNodes.has(dep)) {\n const depNode = nodeByPath.get(dep);\n if (depNode) {\n visit(depNode, stack);\n }\n }\n }\n\n stack.delete(node.path);\n visited.add(node.path);\n order.push(node);\n };\n\n for (const node of nodes) {\n visit(node, new Set());\n }\n\n return order;\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 buildArrayContext(\n node: FormulaNode,\n data: Record<string, unknown>,\n): ArrayContext | undefined {\n if (node.arrayLevels.length === 0) {\n return undefined;\n }\n\n const levels: ArrayLevelContext[] = node.arrayLevels.map((level) => {\n const array = getValueByPath(data, level.arrayPath) as unknown[] | undefined;\n const { index, length } = level;\n\n let prev: unknown = null;\n let next: unknown = null;\n\n if (array) {\n if (index > 0) {\n prev = array[index - 1] ?? null;\n }\n if (index < length - 1) {\n next = array[index + 1] ?? null;\n }\n }\n\n return { index, length, prev, next };\n });\n\n return { levels };\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 arrayContext = buildArrayContext(node, data);\n\n const result = evaluateWithContext(node.expression, {\n rootData: data,\n ...(itemData && { itemData, currentPath: node.currentPath }),\n 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 chunkSVQTPQIM_cjs = require('../chunk-SVQTPQIM.cjs');
3
+ var chunkX2VRR7V7_cjs = require('../chunk-X2VRR7V7.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "collectFormulaNodes", {
8
8
  enumerable: true,
9
- get: function () { return chunkSVQTPQIM_cjs.collectFormulaNodes; }
9
+ get: function () { return chunkX2VRR7V7_cjs.collectFormulaNodes; }
10
10
  });
11
11
  Object.defineProperty(exports, "evaluateFormulas", {
12
12
  enumerable: true,
13
- get: function () { return chunkSVQTPQIM_cjs.evaluateFormulas; }
13
+ get: function () { return chunkX2VRR7V7_cjs.evaluateFormulas; }
14
14
  });
15
15
  Object.defineProperty(exports, "extractSchemaFormulas", {
16
16
  enumerable: true,
17
- get: function () { return chunkSVQTPQIM_cjs.extractSchemaFormulas; }
17
+ get: function () { return chunkX2VRR7V7_cjs.extractSchemaFormulas; }
18
18
  });
19
19
  Object.defineProperty(exports, "formulaSpec", {
20
20
  enumerable: true,
21
- get: function () { return chunkSVQTPQIM_cjs.formulaSpec; }
21
+ get: function () { return chunkX2VRR7V7_cjs.formulaSpec; }
22
22
  });
23
23
  Object.defineProperty(exports, "validateFormulaAgainstSchema", {
24
24
  enumerable: true,
25
- get: function () { return chunkSVQTPQIM_cjs.validateFormulaAgainstSchema; }
25
+ get: function () { return chunkX2VRR7V7_cjs.validateFormulaAgainstSchema; }
26
26
  });
27
27
  Object.defineProperty(exports, "validateSchemaFormulas", {
28
28
  enumerable: true,
29
- get: function () { return chunkSVQTPQIM_cjs.validateSchemaFormulas; }
29
+ get: function () { return chunkX2VRR7V7_cjs.validateSchemaFormulas; }
30
30
  });
31
31
  //# sourceMappingURL=index.cjs.map
32
32
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,3 @@
1
- import { ArrayContext } from '@revisium/formula';
2
1
  import { i as JsonSchema } from '../schema.types-CLHMJmkJ.cjs';
3
2
  export { formulaSpec } from '@revisium/formula/spec';
4
3
 
@@ -26,10 +25,15 @@ interface ExtractedFormula {
26
25
  }
27
26
  declare function extractSchemaFormulas(schema: JsonSchemaInput$1): ExtractedFormula[];
28
27
 
28
+ interface XFormula {
29
+ version: number;
30
+ expression: string;
31
+ }
29
32
  interface SchemaProperty {
30
33
  type?: string;
31
34
  properties?: Record<string, SchemaProperty>;
32
35
  items?: SchemaProperty;
36
+ 'x-formula'?: XFormula;
33
37
  [key: string]: unknown;
34
38
  }
35
39
  interface JsonSchemaInput {
@@ -50,13 +54,18 @@ interface SchemaValidationResult {
50
54
  declare function validateSchemaFormulas(schema: JsonSchemaInput): SchemaValidationResult;
51
55
  declare function validateFormulaAgainstSchema(expression: string, fieldName: string, schema: JsonSchemaInput): FormulaValidationError | null;
52
56
 
57
+ interface ArrayLevelInfo {
58
+ index: number;
59
+ length: number;
60
+ arrayPath: string;
61
+ }
53
62
  interface FormulaNode {
54
63
  path: string;
55
64
  expression: string;
56
65
  fieldType: 'number' | 'string' | 'boolean';
57
66
  currentPath: string;
58
67
  dependencies: string[];
59
- arrayContext?: ArrayContext;
68
+ arrayLevels: ArrayLevelInfo[];
60
69
  }
61
70
  interface FormulaError {
62
71
  field: string;
@@ -1,4 +1,3 @@
1
- import { ArrayContext } from '@revisium/formula';
2
1
  import { i as JsonSchema } from '../schema.types-CLHMJmkJ.js';
3
2
  export { formulaSpec } from '@revisium/formula/spec';
4
3
 
@@ -26,10 +25,15 @@ interface ExtractedFormula {
26
25
  }
27
26
  declare function extractSchemaFormulas(schema: JsonSchemaInput$1): ExtractedFormula[];
28
27
 
28
+ interface XFormula {
29
+ version: number;
30
+ expression: string;
31
+ }
29
32
  interface SchemaProperty {
30
33
  type?: string;
31
34
  properties?: Record<string, SchemaProperty>;
32
35
  items?: SchemaProperty;
36
+ 'x-formula'?: XFormula;
33
37
  [key: string]: unknown;
34
38
  }
35
39
  interface JsonSchemaInput {
@@ -50,13 +54,18 @@ interface SchemaValidationResult {
50
54
  declare function validateSchemaFormulas(schema: JsonSchemaInput): SchemaValidationResult;
51
55
  declare function validateFormulaAgainstSchema(expression: string, fieldName: string, schema: JsonSchemaInput): FormulaValidationError | null;
52
56
 
57
+ interface ArrayLevelInfo {
58
+ index: number;
59
+ length: number;
60
+ arrayPath: string;
61
+ }
53
62
  interface FormulaNode {
54
63
  path: string;
55
64
  expression: string;
56
65
  fieldType: 'number' | 'string' | 'boolean';
57
66
  currentPath: string;
58
67
  dependencies: string[];
59
- arrayContext?: ArrayContext;
68
+ arrayLevels: ArrayLevelInfo[];
60
69
  }
61
70
  interface FormulaError {
62
71
  field: string;
@@ -1,3 +1,3 @@
1
- export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from '../chunk-HHS27GGA.js';
1
+ export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from '../chunk-R3MS2N4A.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 chunkSVQTPQIM_cjs = require('./chunk-SVQTPQIM.cjs');
8
+ var chunkX2VRR7V7_cjs = require('./chunk-X2VRR7V7.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 chunkSVQTPQIM_cjs.collectFormulaNodes; }
196
+ get: function () { return chunkX2VRR7V7_cjs.collectFormulaNodes; }
197
197
  });
198
198
  Object.defineProperty(exports, "evaluateFormulas", {
199
199
  enumerable: true,
200
- get: function () { return chunkSVQTPQIM_cjs.evaluateFormulas; }
200
+ get: function () { return chunkX2VRR7V7_cjs.evaluateFormulas; }
201
201
  });
202
202
  Object.defineProperty(exports, "extractSchemaFormulas", {
203
203
  enumerable: true,
204
- get: function () { return chunkSVQTPQIM_cjs.extractSchemaFormulas; }
204
+ get: function () { return chunkX2VRR7V7_cjs.extractSchemaFormulas; }
205
205
  });
206
206
  Object.defineProperty(exports, "formulaSpec", {
207
207
  enumerable: true,
208
- get: function () { return chunkSVQTPQIM_cjs.formulaSpec; }
208
+ get: function () { return chunkX2VRR7V7_cjs.formulaSpec; }
209
209
  });
210
210
  Object.defineProperty(exports, "validateFormulaAgainstSchema", {
211
211
  enumerable: true,
212
- get: function () { return chunkSVQTPQIM_cjs.validateFormulaAgainstSchema; }
212
+ get: function () { return chunkX2VRR7V7_cjs.validateFormulaAgainstSchema; }
213
213
  });
214
214
  Object.defineProperty(exports, "validateSchemaFormulas", {
215
215
  enumerable: true,
216
- get: function () { return chunkSVQTPQIM_cjs.validateSchemaFormulas; }
216
+ get: function () { return chunkX2VRR7V7_cjs.validateSchemaFormulas; }
217
217
  });
218
218
  Object.defineProperty(exports, "FieldChangeType", {
219
219
  enumerable: true,
package/dist/index.d.cts CHANGED
@@ -14,5 +14,4 @@ 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';
18
17
  import 'ajv/dist/2020';
package/dist/index.d.ts CHANGED
@@ -14,5 +14,4 @@ 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';
18
17
  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-HHS27GGA.js';
6
+ export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from './chunk-R3MS2N4A.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 chunkSVQTPQIM_cjs = require('../chunk-SVQTPQIM.cjs');
4
+ var chunkX2VRR7V7_cjs = require('../chunk-X2VRR7V7.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 chunkSVQTPQIM_cjs.collectFormulaNodes; }
147
+ get: function () { return chunkX2VRR7V7_cjs.collectFormulaNodes; }
148
148
  });
149
149
  Object.defineProperty(exports, "evaluateFormulas", {
150
150
  enumerable: true,
151
- get: function () { return chunkSVQTPQIM_cjs.evaluateFormulas; }
151
+ get: function () { return chunkX2VRR7V7_cjs.evaluateFormulas; }
152
152
  });
153
153
  Object.defineProperty(exports, "extractSchemaFormulas", {
154
154
  enumerable: true,
155
- get: function () { return chunkSVQTPQIM_cjs.extractSchemaFormulas; }
155
+ get: function () { return chunkX2VRR7V7_cjs.extractSchemaFormulas; }
156
156
  });
157
157
  Object.defineProperty(exports, "formulaSpec", {
158
158
  enumerable: true,
159
- get: function () { return chunkSVQTPQIM_cjs.formulaSpec; }
159
+ get: function () { return chunkX2VRR7V7_cjs.formulaSpec; }
160
160
  });
161
161
  Object.defineProperty(exports, "validateFormulaAgainstSchema", {
162
162
  enumerable: true,
163
- get: function () { return chunkSVQTPQIM_cjs.validateFormulaAgainstSchema; }
163
+ get: function () { return chunkX2VRR7V7_cjs.validateFormulaAgainstSchema; }
164
164
  });
165
165
  Object.defineProperty(exports, "validateSchemaFormulas", {
166
166
  enumerable: true,
167
- get: function () { return chunkSVQTPQIM_cjs.validateSchemaFormulas; }
167
+ get: function () { return chunkX2VRR7V7_cjs.validateSchemaFormulas; }
168
168
  });
169
169
  Object.defineProperty(exports, "addSharedFieldsFromState", {
170
170
  enumerable: true,
@@ -6,7 +6,6 @@ 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';
10
9
 
11
10
  declare const addSharedFieldsFromState: <T extends JsonSchema = JsonSchema>(schema: T, state: {
12
11
  title?: string;
@@ -6,7 +6,6 @@ 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';
10
9
 
11
10
  declare const addSharedFieldsFromState: <T extends JsonSchema = JsonSchema>(schema: T, state: {
12
11
  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-HHS27GGA.js';
2
+ export { collectFormulaNodes, evaluateFormulas, extractSchemaFormulas, formulaSpec, validateFormulaAgainstSchema, validateSchemaFormulas } from '../chunk-R3MS2N4A.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.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Universal schema toolkit with TypeScript types and utilities for JSON Schema manipulation",
5
5
  "keywords": [
6
6
  "json-schema",
@@ -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-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"]}
@@ -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":";;;;;;AA0BO,SAAS,sBACd,MAAA,EACoB;AACpB,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,wBAAA,CAAyB,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAC7C,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,wBAAA,CACP,MAAA,EACA,UAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,IAAW,MAAA,CAAO,KAAA,EAAO;AAC3C,IAAA,wBAAA,CAAyB,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,UAAU,MAAM,QAAQ,CAAA;AAClE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACjE,IAAA,MAAM,WAAW,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,SAAA;AAE7D,IAAA,MAAM,QAAA,GAAW,YAAY,WAAW,CAAA;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,SAAA,EAAW,QAAA;AAAA,QACX,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,SAAA,EAAW,YAAY,IAAA,IAAQ;AAAA,OAChC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,WAAA,CAAY,IAAA,KAAS,QAAA,IAAY,WAAA,CAAY,UAAA,EAAY;AAC3D,MAAA,wBAAA,CAAyB,WAAA,EAAa,UAAU,QAAQ,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,WAAA,CAAY,IAAA,KAAS,OAAA,IAAW,WAAA,CAAY,KAAA,EAAO;AACrD,MAAA,wBAAA,CAAyB,WAAA,CAAY,KAAA,EAAO,CAAA,EAAG,QAAQ,MAAM,QAAQ,CAAA;AAAA,IACvE;AAAA,EACF;AACF;AC9BO,SAAS,uBACd,MAAA,EACwB;AACxB,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,QAAA,GAAW,sBAAsB,MAAM,CAAA;AAE7C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,KAAA,GAAQ,4BAAA;AAAA,MACZ,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,SAAA;AAAA,MACR;AAAA,KACF;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,EAClC;AAEA,EAAA,MAAM,eAAyC,EAAC;AAChD,EAAA,KAAA,MAAWA,aAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,WAAA,GAAcC,uBAAA,CAAgBD,SAAA,CAAQ,UAAU,CAAA;AACtD,IAAA,MAAM,UAAA,GAAa,aAAA,CAAcA,SAAA,CAAQ,SAAS,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA,GAAM,EAAA;AAE/C,IAAA,YAAA,CAAaA,UAAQ,SAAS,CAAA,GAAI,YAAY,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,KAAQ;AACtE,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,QAAA,OAAO,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACtC;AACA,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACzB,QAAA,OAAO,gCAAA,CAAiC,KAAK,UAAU,CAAA;AAAA,MACzD;AACA,MAAA,MAAM,SAAA,GAAY,iBAAiB,GAAG,CAAA;AACtC,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,CAAA,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAQE,6BAAqB,YAAY,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgBC,mCAA2B,KAAK,CAAA;AAEtD,EAAA,MAAM,QAAQ,aAAA,CAAc,KAAA;AAC5B,EAAA,IAAI,aAAA,CAAc,WAAA,IAAe,KAAA,IAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,UAAA;AAAA,QACP,KAAA,EAAO,CAAA,qBAAA,EAAwB,KAAA,CAAM,IAAA,CAAK,UAAK,CAAC,CAAA;AAAA,OACjD,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAE;AACrC;AAEO,SAAS,4BAAA,CACd,UAAA,EACA,SAAA,EACA,MAAA,EAC+B;AAC/B,EAAA,OAAO,wBAAA,CAAyB,UAAA,EAAY,SAAA,EAAW,MAAM,CAAA;AAC/D;AAEA,SAAS,wBAAA,CACP,UAAA,EACA,SAAA,EACA,UAAA,EAC+B;AAC/B,EAAA,MAAM,YAAA,GAAeC,8BAAsB,UAAU,CAAA;AACrD,EAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,OAAO,YAAA,CAAa,KAAA;AAAA,MACpB,UAAU,YAAA,CAAa;AAAA,KACzB;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,cAAc,SAAS,CAAA;AAC1C,EAAA,MAAM,cAAA,GAAiB,aAAa,SAAS,CAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAE7D,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,2CAA2C,UAAU,CAAA,CAAA;AAAA,KAC9D;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAcH,wBAAgB,UAAU,CAAA;AAC9C,EAAA,MAAM,iBAAA,GAAoB,gBAAgB,aAAa,CAAA;AACvD,EAAA,MAAM,gBAAA,GAAmB,gBAAgB,UAAU,CAAA;AAEnD,EAAA,KAAA,MAAW,GAAA,IAAO,YAAY,YAAA,EAAc;AAC1C,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAC/C,MAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG;AACpC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,SAAA;AAAA,UACP,KAAA,EAAO,uBAAuB,SAAS,CAAA,YAAA;AAAA,SACzC;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AAChC,MAAA,MAAM,gBAAA,GAAmB,oBAAA;AAAA,QACvB,GAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,OAAO,gBAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,iBAAiB,GAAG,CAAA;AACtC,MAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA,EAAG;AACrC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,SAAA;AAAA,UACP,KAAA,EAAO,kBAAkB,SAAS,CAAA,YAAA;AAAA,SACpC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IACE,WAAA,CAAY,aAAa,IAAA,CAAK,CAAC,MAAM,gBAAA,CAAiB,CAAC,CAAA,KAAM,cAAc,CAAA,EAC3E;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,CAAA,+BAAA;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,UAAA,GAAa,cAAc,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,WAAA,EAAa,IAAI,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,oBAAoB,aAAa,CAAA;AACpD,EAAA,MAAM,YAAA,GAAeI,wBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAE5D,EAAA,IAAI,CAAC,gBAAA,CAAiB,YAAA,EAAc,YAAY,CAAA,EAAG;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,CAAA,gCAAA,EAAmC,YAAY,CAAA,qBAAA,EAAwB,YAAY,CAAA,CAAA;AAAA,KAC5F;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAA,CACP,QACA,SAAA,EACuB;AACvB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,2BAA2B,SAAS,CAAA;AACrD,EAAA,IAAI,OAAA,GAA4C,MAAA;AAEhD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,OAAA,CAAQ,KAAA,EAAO;AAC7C,QAAA,OAAA,GAAU,OAAA,CAAQ,KAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,GAAa,OAAO,CAAA,EAAG;AACxC,MAAA,OAAA,GAAU,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,2BAA2B,IAAA,EAAwB;AAC1D,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AACA,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IACpB,CAAA,MAAA,IAAW,IAAA,KAAS,GAAA,IAAO,CAAC,SAAA,EAAW;AACrC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AAAA,IACF,CAAA,MAAA,IAAW,CAAC,SAAA,EAAW;AACrB,MAAA,OAAA,IAAW,IAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,kBAAkB,IAAA,EAAwB;AACjD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AACA,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,MAAA,SAAA,GAAY,KAAA;AAAA,IACd,CAAA,MAAA,IAAW,IAAA,KAAS,GAAA,IAAO,CAAC,SAAA,EAAW;AACrC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AAAA,IACF,CAAA,MAAA,IAAW,CAAC,SAAA,EAAW;AACrB,MAAA,OAAA,IAAW,IAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,cAAc,SAAA,EAA2B;AAChD,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAC9C,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,gBAAgB,CAAA;AAE1D,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,UAAU,CAAA;AAC1C;AAEA,SAAS,aAAa,SAAA,EAA2B;AAC/C,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAC9C,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,gBAAgB,CAAA;AAE1D,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA,CAAU,SAAA,CAAU,UAAA,GAAa,CAAC,CAAA;AAC3C;AAEA,SAAS,gBAAgB,MAAA,EAAuD;AAC9E,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,EAAC;AAEzC,EAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AAC/C,IAAA,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAoB,MAAA,EAAsD;AACjF,EAAA,MAAM,aAAyB,EAAC;AAChC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACjE,IAAA,MAAM,aAAa,WAAA,CAAY,IAAA;AAC/B,IAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,MAAA,UAAA,CAAW,SAAS,CAAA,GAAI,QAAA;AAAA,IAC1B,CAAA,MAAA,IACE,UAAA,KAAe,QAAA,IACf,UAAA,KAAe,QAAA,IACf,eAAe,SAAA,IACf,UAAA,KAAe,QAAA,IACf,UAAA,KAAe,OAAA,EACf;AACA,MAAA,UAAA,CAAW,SAAS,CAAA,GAAI,UAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,qBACP,UAAA,EACqB;AACrB,EAAA,IAAI,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,SAAA,EAAW,OAAO,QAAA;AAChE,EAAA,IAAI,UAAA,KAAe,UAAU,OAAO,QAAA;AACpC,EAAA,IAAI,UAAA,KAAe,WAAW,OAAO,SAAA;AACrC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAA,CACP,cACA,YAAA,EACS;AACT,EAAA,IAAI,YAAA,KAAiB,MAAM,OAAO,IAAA;AAClC,EAAA,IAAI,YAAA,KAAiB,WAAW,OAAO,IAAA;AACvC,EAAA,OAAO,YAAA,KAAiB,YAAA;AAC1B;AAEA,SAAS,iBAAiB,UAAA,EAA4B;AACpD,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACnD,EAAA,OAAO,IAAA,IAAQ,UAAA;AACjB;AAEA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,SAAA,GAAY,IAAA;AAChB,EAAA,OAAO,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA,EAAG;AAClC,IAAA,KAAA,EAAA;AACA,IAAA,SAAA,GAAY,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,gCAAA,CACP,cACA,WAAA,EACQ;AACR,EAAA,MAAM,YAAA,GAAe,kBAAkB,YAAY,CAAA;AACnD,EAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,iBAAiB,iBAAiB,CAAA;AAEtD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,kBAAkB,WAAW,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,aAAa,MAAA,GAAS,YAAA;AAE1C,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,YAAA,CAAa,KAAA,CAAM,GAAG,WAAW,CAAA,CAAE,KAAK,GAAG,CAAA;AAC5D,EAAA,OAAO,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,WAAA;AACnD;AAEA,SAAS,oBAAA,CACP,YAAA,EACA,WAAA,EACA,UAAA,EACA,SAAA,EAC+B;AAC/B,EAAA,MAAM,YAAA,GAAe,kBAAkB,YAAY,CAAA;AACnD,EAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,iBAAiB,iBAAiB,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,kBAAkB,WAAW,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,aAAa,MAAA,GAAS,YAAA;AAE1C,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,MAAM,UAAA,GAAa,gBAAgB,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA,EAAG;AAChC,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,uBAAuB,WAAW,CAAA,YAAA;AAAA,OAC3C;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,YAAA,CAAa,KAAA,CAAM,GAAG,WAAW,CAAA,CAAE,KAAK,GAAG,CAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAE5D,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,4CAA4C,YAAY,CAAA,CAAA;AAAA,KACjE;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,gBAAgB,YAAY,CAAA;AACjD,EAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAAG;AAClC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,kBAAkB,WAAW,CAAA,YAAA;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;ACxXA,IAAM,gCAAgB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,CAAC,CAAA;AAMtD,SAAS,mBAAA,CACd,QACA,IAAA,EACe;AACf,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,kBAAA,CAAmB,MAAA,EAAsB,MAAM,EAAA,EAAI,KAAA,EAAO,EAAE,WAAA,EAAa,IAAI,CAAA;AAC7E,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAA,CACP,MAAA,EACA,IAAA,EACA,WAAA,EACA,OACA,GAAA,EACM;AACN,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,IAAY,MAAA,CAAO,cAAc,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA;AAEf,IAAA,KAAA,MAAW,CAAC,WAAW,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACxE,MAAA,MAAM,YAAY,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,SAAA;AAChE,MAAA,MAAM,UAAA,GAAa,OAAO,SAAS,CAAA;AAEnC,MAAA,IAAI,WAAA,CAAY,WAAW,CAAA,IAAK,aAAA,CAAc,IAAI,WAAA,CAAY,IAAA,IAAQ,EAAE,CAAA,EAAG;AACzE,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,WAAW,CAAA,CAAE,UAAA;AAC5C,QAAA,MAAM,UAAA,GAAaC,eAAc,SAAS,CAAA;AAE1C,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,SAAA;AAAA,UACN,UAAA;AAAA,UACA,WAAW,WAAA,CAAY,IAAA;AAAA,UACvB,WAAA,EAAa,UAAA;AAAA,UACb,YAAA,EAAc,kBAAkB,UAAU,CAAA;AAAA,UAC1C,YAAA,EAAc,GAAA,CAAI,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,EAAE,MAAA,EAAQ,CAAC,GAAG,GAAA,CAAI,WAAW,CAAA,EAAE,GAAI;AAAA,SAC/E,CAAA;AAAA,MACH;AAEA,MAAA,kBAAA,CAAmB,WAAA,EAAa,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,GAAG,CAAA;AAAA,IACnE;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,IAAW,MAAA,CAAO,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAClE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA;AACpC,MAAA,MAAM,UAAA,GAAgC;AAAA,QACpC,KAAA,EAAO,CAAA;AAAA,QACP,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAAA,QAC5B,IAAA,EAAM,IAAI,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI;AAAA,OAC5C;AACA,MAAA,MAAM,MAAA,GAA2B;AAAA,QAC/B,WAAA,EAAa,CAAC,UAAA,EAAY,GAAG,IAAI,WAAW;AAAA,OAC9C;AACA,MAAA,kBAAA,CAAmB,OAAO,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,EAAG,QAAA,EAAU,OAAO,MAAM,CAAA;AAAA,IACnE;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,UAAA,EAA8B;AACvD,EAAA,IAAI;AACF,IAAA,OAAOC,oBAAA,CAAa,UAAU,CAAA,CAAE,YAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAASD,eAAc,SAAA,EAA2B;AAChD,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAC9C,EAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,YAAY,CAAA;AAC5C;AAEO,SAAS,gBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,GAAmC,EAAC,EACZ;AACxB,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAA;AAE9C,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,EAClC;AAEA,EAAA,MAAM,WAAA,GAAc,oBAAoB,KAAK,CAAA;AAC7C,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,oBAAA,GAAuB,mBAAA,CAAoB,IAAA,EAAM,WAAW,CAAA;AAElE,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,WAAA,CAAY,GAAA,CAAI,KAAK,IAAI,CAAA;AACzB,MAAA,WAAA,CAAY,IAAA,EAAM,2BAAA,EAA6B,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAC5E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AAEtC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,WAAA,CAAY,GAAA,CAAI,KAAK,IAAI,CAAA;AACzB,MAAA,WAAA,CAAY,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAC5C,IAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;AAEA,SAAS,oBAAoB,KAAA,EAAqC;AAChE,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAe,MAAA,CAAO,WAAA;AAAA,IAC1B,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,YAAY,CAAC;AAAA,GAC3C;AAEA,EAAA,MAAM,MAAA,GAASE,2BAAA,CAAoBN,4BAAAA,CAAqB,YAAY,CAAC,CAAA;AAErE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,wCAAA,EAA2C,MAAA,CAAO,KAAA,IAAS,eAAe,CAAA;AAAA,KAC5E;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAErD,EAAA,OAAO,MAAA,CAAO,KAAA,CACX,GAAA,CAAI,CAAC,SAAS,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA,CAC/B,MAAA,CAAO,CAAC,CAAA,KAAwB,MAAM,MAAS,CAAA;AACpD;AAEA,SAAS,mBAAA,CAAoB,MAAmB,WAAA,EAAmC;AACjF,EAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,CAAC,GAAA,KAAQ;AACrC,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,IAAI,eAAe,GAAA,IAAO,UAAA,CAAW,SAAS,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,EAAG;AACxD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,YAAA,CACP,MACA,IAAA,EACuE;AACvE,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,IAAA,CAAK,WAAA,GAClB,eAAe,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA,GACrC,KAAA,CAAA;AAEJ,IAAA,MAAM,MAAA,GAASO,2BAAA,CAAoB,IAAA,CAAK,UAAA,EAAY;AAAA,MAClD,QAAA,EAAU,IAAA;AAAA,MACV,GAAI,QAAA,IAAY,EAAE,QAAA,EAAU,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,MAC1D,cAAc,IAAA,CAAK;AAAA,KACpB,CAAA;AAED,IAAA,IAAI,WAAW,KAAA,CAAA,EAAW;AACxB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,4BAAA,EAA6B;AAAA,IAC/D;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,MAAA,EAAO;AAAA,EACxC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,KAC9D;AAAA,EACF;AACF;AAEA,SAAS,YACP,IAAA,EACA,YAAA,EACA,IAAA,EACA,MAAA,EACA,QACA,OAAA,EACM;AACN,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,KAAA;AAE3C,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAC3D,IAAA,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAC5C,IAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,YAAA;AAAA,EACtB;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK;AAAA,IACV,OAAO,IAAA,CAAK,IAAA;AAAA,IACZ,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AAEA,SAAS,eAAA,CACP,MACA,QAAA,EACS;AACT,EAAA,IAAI,QAAA,IAAY,IAAA,CAAK,IAAA,IAAQ,QAAA,EAAU;AACrC,IAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,QAAQ,KAAK,SAAA;AAAW,IACtB,KAAK,QAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,EAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,cAAA,CACP,KACA,IAAA,EACS;AACT,EAAA,MAAM,QAAA,GAAW,UAAU,IAAI,CAAA;AAC/B,EAAA,IAAI,OAAA,GAAmB,GAAA;AAEvB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC5B,MAAA,OAAA,GAAW,OAAA,CAAoC,QAAQ,IAAI,CAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC3B,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAA,GAAU,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAIA,SAAS,UAAU,IAAA,EAA6B;AAC9C,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,OAAO,QAAA,GAAW,KAAK,MAAA,EAAQ;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAK,QAAQ,CAAA;AAE1B,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAC9C,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AACA,MAAA,QAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAC9C,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ;AACA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AAC7C,MAAA,IAAI,eAAe,EAAA,EAAI;AACrB,QAAA,QAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,UAAU,CAAA;AACpD,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAO,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA;AACrE,QAAA,QAAA,GAAW,UAAA,GAAa,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,IAAW,IAAA;AACX,MAAA,QAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,OAAO,GAAA,KAAQ,WAAA;AACjB;AAEA,SAAS,cAAA,CACP,GAAA,EACA,IAAA,EACA,KAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,UAAU,IAAI,CAAA;AAC/B,EAAA,IAAI,OAAA,GAAmB,GAAA;AAEvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAE1B,IAAA,IAAI,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAC,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,OAAA;AACf,MAAA,IAAI,EAAE,OAAA,CAAQ,IAAA,IAAQ,MAAA,CAAA,EAAS;AAC7B,QAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,GAAI,EAAC;AAAA,MAC1B;AACA,MAAA,OAAA,GAAU,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,OAAA;AACZ,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvB,QAAA,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAC;AAAA,MACxB;AACA,MAAA,OAAA,GAAU,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,EAAA,CAAG,EAAE,CAAA;AAClC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,OAAA,EAAS;AAChC,IAAA,IAAI,CAAC,SAAA,CAAU,WAAA,CAAY,IAAI,CAAA,EAAG;AAChC,MAAA;AAAA,IACF;AACA,IAAC,OAAA,CAAoC,WAAA,CAAY,IAAI,CAAA,GAAI,KAAA;AAAA,EAC3D,CAAA,MAAO;AACL,IAAC,OAAA,CAAsB,WAAA,CAAY,KAAK,CAAA,GAAI,KAAA;AAAA,EAC9C;AACF","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"]}