{"version":3,"file":"index.mjs","names":["interpreters","interpreters.within"],"sources":["../../src/utils.ts","../../src/interpreter.ts","../../src/interpreters.ts","../../src/defaults.ts"],"sourcesContent":["import { FieldCondition, ITSELF } from '@ucast/core';\nimport { IsArray, JsInterpretationOptions, JsInterpreter } from './types';\n\nexport type AnyObject = Record<PropertyKey, unknown>;\nexport type GetField = (object: any, field: string) => any;\n\nexport function testRegExp(regex: RegExp, value: unknown): boolean {\n  if (typeof value !== 'string') {\n    return false;\n  }\n\n  regex.lastIndex = 0;\n  const result = regex.test(value);\n  regex.lastIndex = 0;\n\n  return result;\n}\n\nexport function getFieldValue(\n  object: unknown,\n  field: string | typeof ITSELF,\n  get: GetField\n) {\n  if (field !== ITSELF && (object == null || typeof object !== 'object')) {\n    return undefined;\n  }\n\n  return get(object, field);\n}\n\nexport function matches(\n  a: unknown,\n  b: unknown,\n  compare: JsInterpretationOptions['compare']\n): boolean {\n  if (a instanceof RegExp) {\n    return testRegExp(a, b);\n  }\n\n  if (b instanceof RegExp) {\n    return testRegExp(b, a);\n  }\n\n  return compare(a, b) === 0;\n}\n\nexport function includes(\n  items: unknown[],\n  value: unknown,\n  compare: JsInterpretationOptions['compare']\n): boolean {\n  for (let i = 0, length = items.length; i < length; i++) {\n    if (matches(items[i], value, compare)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport function isArrayAndNotNumericField<T>(\n  object: T | T[],\n  field: string,\n  isArray: IsArray\n): object is T[] {\n  return isArray(object) && Number.isNaN(Number(field));\n}\n\nfunction getField<T extends AnyObject>(\n  object: T | T[],\n  field: string,\n  get: GetField,\n  isArray: IsArray\n) {\n  if (!isArrayAndNotNumericField(object, field, isArray)) {\n    return get(object, field);\n  }\n\n  let result: unknown[] = [];\n\n  for (let i = 0; i < object.length; i++) {\n    const value = get(object[i], field);\n    if (typeof value !== 'undefined') {\n      result = result.concat(value);\n    }\n  }\n\n  return result;\n}\n\nexport function getValueByPath(\n  object: AnyObject,\n  field: string,\n  get: GetField,\n  isArray: IsArray\n) {\n  if (field.indexOf('.') === -1) {\n    return getField(object, field, get, isArray);\n  }\n\n  const paths = field.split('.');\n  let value = object;\n\n  for (let i = 0, length = paths.length; i < length; i++) {\n    value = getField(value, paths[i], get, isArray);\n\n    if (!value || typeof value !== 'object') {\n      return i < length - 1 ? undefined : value;\n    }\n  }\n\n  return value;\n}\n\nexport function testValueOrArray<T, U = T>(test: JsInterpreter<FieldCondition<T>, U>) {\n  return ((node, object, context) => {\n    const value = context.get(object, node.field);\n\n    if (!context.isArray(value)) {\n      return test(node, value, context);\n    }\n\n    return (value as U[]).some(v => test(node, v, context));\n  }) as JsInterpreter<FieldCondition<T>, AnyObject | U>;\n}\n\nexport const hasOwn: (object: object, key: PropertyKey) => boolean = (Object as {\n  hasOwn?: (object: object, key: PropertyKey) => boolean\n}).hasOwn || ((object, key) => Object.prototype.hasOwnProperty.call(object, key));\n","import { createInterpreter, ITSELF } from '@ucast/core';\nimport { getValueByPath, AnyObject, GetField } from './utils';\nimport { IsArray, JsInterpretationOptions, JsInterpreter } from './types';\n\nconst defaultGet = (object: AnyObject, field: string) => object[field];\nconst defaultIsArray: IsArray = Array.isArray;\ntype Field = string | typeof ITSELF;\n\nexport function getObjectFieldCursor<T extends {}>(object: T, path: string, get: GetField) {\n  const dotIndex = path.lastIndexOf('.');\n\n  if (dotIndex === -1) {\n    return [object, path] as const;\n  }\n\n  return [\n    get(object, path.slice(0, dotIndex)) as T,\n    path.slice(dotIndex + 1)\n  ] as const;\n}\n\nexport function getObjectField(\n  object: unknown,\n  field: Field,\n  get: GetField = defaultGet,\n  isArray: IsArray = defaultIsArray\n) {\n  if (field === ITSELF) {\n    return object;\n  }\n\n  if (!object) {\n    throw new Error(`Unable to get field \"${field}\" out of ${String(object)}.`);\n  }\n\n  return getValueByPath(object as Record<string, unknown>, field, get, isArray);\n}\n\nexport function createGetter<T extends GetField>(\n  get: T,\n  isArray: IsArray = defaultIsArray\n) {\n  return (object: Parameters<T>[0], field: Parameters<T>[1]) => {\n    return getObjectField(object, field, get, isArray);\n  };\n}\n\nexport function compare<T>(a: T, b: T): 0 | 1 | -1 {\n  if (a === b) {\n    return 0;\n  }\n\n  return a > b ? 1 : -1;\n}\n\nexport function createJsInterpreter<\n  T extends JsInterpreter<any>,\n  O extends Partial<JsInterpretationOptions>\n>(\n  operators: Record<string, T>,\n  options: O = {} as O\n) {\n  const isArray = options.isArray || defaultIsArray;\n  const get = (object: unknown, field: Field) => {\n    return getObjectField(object, field, options.get as GetField || defaultGet, isArray);\n  };\n\n  return createInterpreter(operators, {\n    get,\n    compare: options.compare || compare,\n    isArray,\n  });\n}\n","import {\n  CompoundCondition as Compound,\n  FieldCondition as Field,\n  DocumentCondition as Document,\n  Condition,\n  Comparable,\n  ITSELF,\n} from '@ucast/core';\nimport { JsInterpreter as Interpret } from './types';\nimport {\n  includes,\n  testValueOrArray,\n  isArrayAndNotNumericField,\n  getFieldValue,\n  AnyObject,\n  hasOwn,\n  matches,\n  testRegExp,\n} from './utils';\nimport { getObjectFieldCursor } from './interpreter';\n\nexport const or: Interpret<Compound> = (node, object, { interpret }) => {\n  return node.value.some(condition => interpret(condition, object));\n};\n\nexport const nor: typeof or = (node, object, context) => {\n  return !or(node, object, context);\n};\n\nexport const and: Interpret<Compound> = (node, object, { interpret }) => {\n  return node.value.every(condition => interpret(condition, object));\n};\n\nexport const not: Interpret<Compound> = (node, object, { interpret }) => {\n  return !interpret(node.value[0], object);\n};\n\nexport const eq: Interpret<Field> = (node, object, { compare, get, isArray }) => {\n  const [item, field] = getObjectFieldCursor<Record<string, unknown>>(object, node.field, get);\n\n  if (node.value === null) {\n    const test = (candidate: unknown) => {\n      if (candidate == null || typeof candidate !== 'object') {\n        return false;\n      }\n\n      if (!hasOwn(candidate, field)) {\n        return true;\n      }\n\n      const fieldValue = get(candidate, field);\n      return fieldValue === null || (\n        isArray(fieldValue) && includes(fieldValue as unknown[], null, compare)\n      );\n    };\n\n    return isArrayAndNotNumericField(item, field, isArray) ? item.some(test) : test(item);\n  }\n\n  const value = getFieldValue(item, field, get);\n\n  if (isArray(value)) {\n    return compare(value, node.value) === 0\n      || includes(value as unknown[], node.value, compare);\n  }\n\n  return matches(value, node.value, compare);\n};\n\nexport const ne: typeof eq = (node, object, context) => {\n  return !eq(node, object, context);\n};\n\nexport const lte = testValueOrArray<Comparable>((node, value, context) => {\n  const result = context.compare(value, node.value);\n  return result === 0 || result === -1;\n});\n\nexport const lt = testValueOrArray<Comparable>((node, value, context) => {\n  return context.compare(value, node.value) === -1;\n});\nexport const gt = testValueOrArray<Comparable>((node, value, context) => {\n  return context.compare(value, node.value) === 1;\n});\nexport const gte = testValueOrArray<Comparable>((node, value, context) => {\n  const result = context.compare(value, node.value);\n  return result === 0 || result === 1;\n});\n\nexport const exists: Interpret<Field<boolean>> = (node, object, { get, isArray }) => {\n  if (node.field === ITSELF) {\n    return typeof object !== 'undefined';\n  }\n\n  const [item, field] = getObjectFieldCursor<{}>(object, node.field, get);\n  const test = (value: {}) => {\n    if (value == null) return node.value === false;\n    return hasOwn(value, field) === node.value;\n  };\n\n  return isArrayAndNotNumericField(item, field, isArray) ? item.some(test) : test(item);\n};\n\nexport const mod = testValueOrArray<[number, number], number>((node, value) => {\n  return typeof value === 'number' && value % node.value[0] === node.value[1];\n});\n\nexport const size: Interpret<Field<number>, AnyObject | unknown[]> = (\n  node,\n  object,\n  { get, isArray }\n) => {\n  const [items, field] = getObjectFieldCursor(object as AnyObject, node.field, get);\n  const test = (item: unknown) => {\n    const value = getFieldValue(item, field, get);\n    return isArray(value) && (value as unknown[]).length === node.value;\n  };\n\n  return node.field !== ITSELF && isArrayAndNotNumericField(items, field, isArray)\n    ? items.some(test)\n    : test(items);\n};\n\nexport const regex = testValueOrArray<RegExp, string>((node, value) => {\n  return testRegExp(node.value, value);\n});\n\nexport const within = testValueOrArray<unknown[], unknown>((node, object, { compare }) => {\n  return includes(node.value, object, compare);\n});\n\nexport const nin: typeof within = (node, object, context) => !within(node, object, context);\n\nexport const all: Interpret<Field<unknown[]>> = (node, object, { compare, get, isArray }) => {\n  const value = get(object, node.field);\n  return isArray(value) && node.value.every(v => includes(value as unknown[], v, compare));\n};\n\nexport const elemMatch: Interpret<Field<Condition>> = (\n  node,\n  object,\n  { interpret, get, isArray }\n) => {\n  const value = get(object, node.field);\n  return isArray(value) && (value as unknown[]).some(v => interpret(node.value, v));\n};\n\ntype WhereFunction = (this: AnyObject) => boolean;\nexport const where: Interpret<Document<WhereFunction>, AnyObject> = (node, object) => {\n  return node.value.call(object);\n};\n","import { createJsInterpreter } from './interpreter';\nimport * as interpreters from './interpreters';\n\nexport const allInterpreters = {\n  ...interpreters,\n  in: interpreters.within,\n};\nexport const interpret = createJsInterpreter(allInterpreters);\n"],"mappings":"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"}