{"version":3,"sources":["../src/query.index.ts","../src/query.engine.ts","../src/query.lib.ts"],"sourcesContent":["export { QueryEngine } from \"./query.engine.ts\";\n","import { z } from \"zod/v4\";\nimport {\n  queryApply,\n  queryPredicate,\n  querySchema,\n  type BasePredicates,\n  type QueryPredicate,\n} from \"./query.lib.ts\";\n\nexport class QueryEngine<PREDICATES = never, INPUT = never> {\n  private predicates: Array<QueryPredicate<string, any, INPUT>>;\n  private _schema: z.ZodType<BasePredicates<PREDICATES>>;\n\n  protected constructor(predicates: Array<QueryPredicate<string, any, INPUT>>) {\n    this.predicates = predicates;\n    // Build schema once in constructor instead of rebuilding on every access\n    this._schema = querySchema(\n      this.predicates.map((p) => p.schema),\n    ) as z.ZodType<BasePredicates<PREDICATES>>;\n  }\n\n  public static default<INPUT = never>() {\n    return new QueryEngine<never, INPUT>([]);\n  }\n\n  public static addPredicate<NAME extends string, PARAM, INPUT>(\n    name: NAME,\n    params: z.ZodType<PARAM>,\n    handler: (params: PARAM) => (input: INPUT) => boolean,\n  ) {\n    return new QueryEngine<{ [n in NAME]: PARAM }, INPUT>([\n      queryPredicate(name, params, handler),\n    ]);\n  }\n\n  public addPredicate<NAME extends string, PARAM>(\n    name: NAME,\n    params: z.ZodType<PARAM>,\n    handler: (params: PARAM) => (input: INPUT) => boolean,\n  ) {\n    return new QueryEngine<PREDICATES | { [n in NAME]: PARAM }, INPUT>([\n      ...this.predicates,\n      queryPredicate(name, params, handler),\n    ]);\n  }\n\n  public get schema() {\n    return this._schema;\n  }\n\n  public get jsonSchema() {\n    return z.toJSONSchema(this.schema);\n  }\n\n  public match(\n    query: unknown,\n    input: INPUT,\n    options?: { skipQueryValidation?: boolean },\n  ): boolean {\n    return queryApply(this.predicates, query, input, options);\n  }\n}\n\nexport declare namespace QueryEngine {\n  type InferInput<T extends QueryEngine<any, any>> =\n    T extends QueryEngine<any, infer INPUT> ? INPUT : never;\n\n  type InferQuery<T extends QueryEngine<any, any>> =\n    T extends QueryEngine<infer PREDICATES, any>\n      ? BasePredicates<PREDICATES>\n      : never;\n}\n","import { z } from \"zod/v4\";\n\nexport type BasePredicates<PREDICATES = never> =\n  | { and: BasePredicates<PREDICATES>[] }\n  | { or: BasePredicates<PREDICATES>[] }\n  | { not: BasePredicates<PREDICATES> }\n  | { always: true }\n  | { never: true }\n  | PREDICATES;\n\nexport interface QueryPredicate<NAME extends string, PARAMS, INPUT = unknown> {\n  name: NAME;\n  schema: z.ZodType<{ [key in NAME]: PARAMS }>;\n  handler: (params: PARAMS) => (content: INPUT) => boolean;\n}\n\nexport function queryPredicate<NAME extends string, PARAMS, INPUT = unknown>(\n  name: NAME,\n  params: z.ZodType<PARAMS>,\n  handler: (params: PARAMS) => (content: INPUT) => boolean,\n) {\n  return {\n    name,\n    schema: z.object({\n      [name]: params,\n    }),\n    handler,\n    // Todo: fix this\n  } as unknown as QueryPredicate<NAME, PARAMS, INPUT>;\n}\n\ntype QuerySchemaReturn<EXTRA_SCHEMAS extends z.ZodTypeAny> = z.ZodType<\n  // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n  BasePredicates | z.output<EXTRA_SCHEMAS>\n>;\n\nconst alwaysSchema = z\n  .object({\n    always: z.literal(true),\n  })\n  .meta({ id: \"always\" });\n\nconst neverSchema = z\n  .object({\n    never: z.literal(true),\n  })\n  .meta({ id: \"never\" });\n\nexport function querySchema<EXTRA_SCHEMAS extends z.ZodTypeAny>(\n  extras: EXTRA_SCHEMAS[],\n) {\n  const schema: QuerySchemaReturn<EXTRA_SCHEMAS> = z.union([\n    z.object({\n      get and() {\n        return z.array(schema).min(2);\n      },\n    }),\n    z.object({\n      get or() {\n        return z.array(schema).min(2);\n      },\n    }),\n    z.object({\n      get not() {\n        return schema;\n      },\n    }),\n    alwaysSchema,\n    neverSchema,\n    ...extras,\n    // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n  ]) as z.ZodType<BasePredicates | z.infer<EXTRA_SCHEMAS>>;\n\n  return schema;\n}\n\nexport function queryApply<\n  PREDICATES extends Array<QueryPredicate<string, any, INPUT>>,\n  INPUT,\n>(\n  predicates: PREDICATES,\n  query: unknown,\n  input: INPUT,\n  options?: { skipQueryValidation?: boolean },\n) {\n  if (query === undefined) return false;\n\n  const schema = querySchema(predicates.map((c) => c.schema));\n  const parsedQuery = options?.skipQueryValidation\n    ? (query as z.output<typeof schema>)\n    : schema.parse(query);\n\n  function apply(query: typeof parsedQuery, input: INPUT): boolean {\n    if (\"always\" in query) {\n      return true;\n    }\n\n    if (\"never\" in query) {\n      return false;\n    }\n\n    if (\"and\" in query) {\n      if (query.and.length === 0) return false;\n      return query.and.every((q: any) => apply(q, input));\n    }\n\n    if (\"or\" in query) {\n      if (query.or.length === 0) return false;\n      return query.or.some((q: any) => apply(q, input));\n    }\n\n    if (\"not\" in query) {\n      return !apply(query.not, input);\n    }\n\n    return predicates.some((c) => {\n      if (c.name in query) return c.handler(query[c.name])(input);\n      return false;\n    });\n  }\n\n  return apply(parsedQuery, input);\n}\n"],"mappings":"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","names":["import_v4","query","input"]}