@osqd/jql 0.1.1 → 0.1.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.
- package/CHANGELOG.md +44 -1
- package/conformance/cases.json +2 -0
- package/dist/chunk-2ZMIVDES.cjs +1661 -0
- package/dist/chunk-2ZMIVDES.cjs.map +1 -0
- package/dist/chunk-6PWYYYWU.js +1637 -0
- package/dist/chunk-6PWYYYWU.js.map +1 -0
- package/dist/chunk-74QKHM6Y.cjs +145 -0
- package/dist/chunk-74QKHM6Y.cjs.map +1 -0
- package/dist/chunk-ATRXHPBJ.js +112 -0
- package/dist/chunk-ATRXHPBJ.js.map +1 -0
- package/dist/chunk-EJFHVGBC.cjs +63 -0
- package/dist/chunk-EJFHVGBC.cjs.map +1 -0
- package/dist/chunk-ITPY6VTV.cjs +115 -0
- package/dist/chunk-ITPY6VTV.cjs.map +1 -0
- package/dist/chunk-JK6OYDLX.js +712 -0
- package/dist/chunk-JK6OYDLX.js.map +1 -0
- package/dist/chunk-N7DS4QNW.js +60 -0
- package/dist/chunk-N7DS4QNW.js.map +1 -0
- package/dist/chunk-PNBQ2HIJ.js +133 -0
- package/dist/chunk-PNBQ2HIJ.js.map +1 -0
- package/dist/chunk-VMFEQXBB.js +578 -0
- package/dist/chunk-VMFEQXBB.js.map +1 -0
- package/dist/cjs/text/index.d.ts +1 -1
- package/dist/cjs/text/parse.d.ts +2 -1
- package/dist/cjs/text/quote.d.ts +17 -0
- package/dist/cjs/text/suggest.d.ts +27 -5
- package/dist/cli.js +13 -2395
- package/dist/cli.js.map +1 -1
- package/dist/global.cjs +26 -1849
- package/dist/global.cjs.map +1 -1
- package/dist/global.js +8 -1831
- package/dist/global.js.map +1 -1
- package/dist/index.cjs +143 -1996
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -2493
- package/dist/index.js.map +1 -1
- package/dist/mongo.cjs +20 -119
- package/dist/mongo.cjs.map +1 -1
- package/dist/mongo.js +2 -101
- package/dist/mongo.js.map +1 -1
- package/dist/text/index.d.ts +1 -1
- package/dist/text/parse.d.ts +2 -1
- package/dist/text/quote.d.ts +17 -0
- package/dist/text/suggest.d.ts +27 -5
- package/dist/text.cjs +146 -101
- package/dist/text.cjs.map +1 -1
- package/dist/text.js +3 -665
- package/dist/text.js.map +1 -1
- package/docs/course/11-the-search-box.md +49 -2
- package/docs/course/16-extending.md +1 -1
- package/docs/reference/api.md +14 -1
- package/docs/reference/specification.md +9 -2
- package/docs/reference/text-syntax.md +41 -6
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/limits.ts","../src/internal/closest.ts","../src/internal/path.ts","../src/internal/equal.ts","../src/operators.ts","../src/core.ts","../src/internal/record.ts","../src/collections.ts","../src/internal/order.ts","../src/search.ts"],"names":["size","present","reach","search","walk","count","i","changed"],"mappings":"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","file":"chunk-6PWYYYWU.js","sourcesContent":["/**\n * How much of a query the engine will take.\n *\n * Queries arrive from places the caller does not control — a URL, a request body, a\n * saved filter somebody else wrote — and every limit here is a way such a query could\n * otherwise cost more than the data it filters. Each one refuses with a `JqlError` rather\n * than truncating, because a query that was quietly cut short answers a different\n * question from the one that was asked.\n *\n * The defaults are far past anything a person writes and far short of anything that\n * hurts. The caps are exported so a caller can say what it accepts in its own\n * documentation and refuse a query before it is even parsed.\n */\nexport interface Limits {\n /** How deep operators may nest. Default 32: recursion over pasted input must stop well short of the stack. */\n readonly maxDepth: number;\n /** How many operators and fields a query may hold in total. Default 10 000. `$in` lists do not count: they cost one set lookup each. */\n readonly maxNodes: number;\n /** The longest `$regex` pattern. Default 1024. */\n readonly maxPatternLength: number;\n /**\n * The longest `$glob`. Default 1024, and 256 for untrusted input.\n *\n * A glob cannot backtrack exponentially, but matching one holding `?` is the length of the\n * pattern times the length of the value — so a megabyte of `?` against a megabyte of text\n * is hours per document. It has a cap of its own because `$regex` is turned *off* for\n * untrusted callers while `$glob` stays on, which is exactly when the cap has to hold.\n */\n readonly maxGlobLength: number;\n /** How deep `$text` looks into a document. Default 16: past that a document is a graph, not a record. */\n readonly maxTextDepth: number;\n /**\n * Which operators a query may use. Default `\"all\"`.\n *\n * An allowlist, because a public endpoint's answer to \"what may a caller ask?\" should be\n * a list it wrote rather than everything the language grows later. `$text` walks a whole\n * document and `$elemMatch` carries a query of its own; an endpoint that needs neither can\n * say so once, here, instead of discovering later which of them somebody found.\n *\n * Names are checked when the query compiles: an operator outside the list is refused by\n * name, never ignored. `$options` and `$comment` are exempt — they modify and annotate\n * rather than ask anything — and `$field` counts as an operator, because comparing two\n * fields is a capability in its own right.\n */\n readonly allowOperators: readonly string[] | \"all\";\n /**\n * Whether `$regex` is accepted at all. Default `true`.\n *\n * Turn it off for queries from untrusted callers. No engine can tell a pattern that\n * backtracks for a minute from one that does not without running it, and the string\n * operators (`$contains`, `$startsWith`, `$endsWith`, `$word`) answer almost every\n * question a pattern would, in linear time.\n */\n readonly allowRegex: boolean;\n}\n\n/** The defaults, frozen, so they can be spread and never edited in place. */\nexport const DEFAULT_LIMITS: Readonly<Limits> = Object.freeze({\n maxDepth: 32,\n maxNodes: 10_000,\n maxPatternLength: 1024,\n maxGlobLength: 1024,\n maxTextDepth: 16,\n allowRegex: true,\n allowOperators: \"all\",\n});\n\n/**\n * What an untrusted query gets: no patterns, and a tighter size.\n *\n * Public so a service taking queries from a URL can use the same answer as every other\n * service in the project, rather than each one picking its own numbers.\n */\nexport const UNTRUSTED_LIMITS: Readonly<Limits> = Object.freeze({\n maxDepth: 16,\n maxNodes: 512,\n maxPatternLength: 0,\n maxGlobLength: 256,\n maxTextDepth: 8,\n allowRegex: false,\n // Still every operator but `$regex`: which of the rest an endpoint wants is a decision\n // only that endpoint can make, and a list guessed here would be one nobody had chosen.\n allowOperators: \"all\",\n});\n","/**\n * \"Did you mean\" for names that almost exist.\n *\n * An unknown operator is refused either way; naming the one that was probably meant turns\n * a lookup in the documentation into a one-character fix.\n */\nexport function closest(word: string, candidates: Iterable<string>): string | undefined {\n let best: string | undefined;\n // Two edits is the line between a typo and a different word: `$gtt` → `$gt` is one,\n // `$foo` → `$not` is two and is still more likely a slip than a new idea.\n let bestDistance = 3;\n for (const candidate of candidates) {\n const distance = editDistance(word.toLowerCase(), candidate.toLowerCase(), bestDistance);\n if (distance < bestDistance) {\n best = candidate;\n bestDistance = distance;\n }\n }\n return best;\n}\n\n/** Levenshtein distance, giving up once it is certain to exceed `ceiling`. */\nfunction editDistance(a: string, b: string, ceiling: number): number {\n if (Math.abs(a.length - b.length) >= ceiling) return ceiling;\n let previous = Array.from({ length: b.length + 1 }, (_, index) => index);\n for (let i = 1; i <= a.length; i++) {\n const current = [i];\n let rowBest = i;\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n const value = Math.min((previous[j] as number) + 1, (current[j - 1] as number) + 1, (previous[j - 1] as number) + cost);\n current.push(value);\n if (value < rowBest) rowBest = value;\n }\n if (rowBest >= ceiling) return ceiling;\n previous = current;\n }\n return previous[b.length] as number;\n}\n\n/** The suffix of an error sentence that offers the likely name, or nothing. */\nexport function didYouMean(word: string, candidates: Iterable<string>): string {\n const guess = closest(word, candidates);\n return guess === undefined ? \"\" : `; did you mean \"${guess}\"?`;\n}\n","/**\n * Reaching a field inside a document.\n *\n * A path is dot-separated: `address.city`, `items.id`, `items.0.id`. Three rules:\n *\n * - **An array is seen through.** `items.id` reaches the `id` of every element, and a\n * condition on it holds when it holds for any of them.\n * - **A numeric segment on an array is a position.** `items.0.id` is the first element's.\n * - **A `Map` is read by key**, so a document that keeps a lookup table in a `Map` can be\n * queried the same way as one that keeps it in an object.\n *\n * Only own properties are read. `{ constructor: { $exists: true } }` would otherwise match\n * every object ever made, and `__proto__` would reach somewhere a query has no business\n * being. The check costs a `hasOwn` call, so it is paid only for the handful of names\n * `Object.prototype` and `Map.prototype` actually have — every other name is read\n * directly. `Map.prototype` is on the list because a `Map` document read directly would\n * answer `size` or `get` with its own method rather than with the entry of that name.\n */\n\n/**\n * Calls `test` with each value the path reaches, stopping at the first `true`.\n *\n * A path that reaches nothing calls `test(undefined)` once, so \"missing\" is a value a\n * condition can ask about: that is how `{ field: null }` and `$exists: false` see it.\n */\nexport type Reach = (document: unknown, test: (value: unknown) => boolean) => boolean;\n\n/** A single-valued read, for paths that cannot fan out. Absent when the path can. */\nexport type Read = (document: unknown) => unknown;\n\n/** What a probe returns when the path met an array before its last segment, and so may reach several values. */\nexport const FANOUT: unique symbol = Symbol(\"jql.fanout\");\n\n/**\n * A straight read of a multi-segment path: the one value it reaches, or `FANOUT` if an\n * array stood in the way and only `Reach` can answer.\n *\n * The point is the common case. `address.city` on a record with no arrays on the way has\n * exactly one value, and reading it directly lets the engine test it the way a hand-written\n * `p.address.city === \"x\"` would — one read, one comparison — instead of through a walk and\n * a callback. A missing or primitive step reads as `undefined`, the same as `Reach` sees it.\n */\nexport type Probe = (document: unknown) => unknown;\n\ninterface Segment {\n readonly key: string;\n /** The position this segment names on an array, or -1. */\n readonly index: number;\n}\n\nconst INDEX = /^(?:0|[1-9]\\d{0,8})$/;\n\n/**\n * The names a plain object inherits, which are therefore the only ones a direct read can\n * find on one by accident.\n */\nconst INHERITED = new Set<string>([...Object.getOwnPropertyNames(Object.prototype), ...Object.getOwnPropertyNames(Map.prototype), \"__proto__\"]);\n\n/** Whether a name could be found on a plain object's prototype, and so must always be asked for carefully. */\nexport function needsGuard(key: string): boolean {\n return INHERITED.has(key);\n}\n\n/**\n * What a plain object's prototype is, for the cheapest plainness test there is.\n *\n * `document.__proto__ === PLAIN` is a map check — about as fast as reading a field — where\n * `Object.getPrototypeOf` is a call and `Object.hasOwn` is a second lookup. Reading it is\n * safe in both directions: a document carrying its own `__proto__` field (which is what\n * `JSON.parse` makes of one) simply fails the test and takes the careful path, and so does\n * anything with a prototype of its own.\n */\nexport const PLAIN = Object.prototype;\n\nfunction segment(key: string): Segment {\n return { key, index: INDEX.test(key) ? Number(key) : -1 };\n}\n\n/**\n * One field of one value: own properties and `Map` entries, nothing else.\n *\n * Ownership is checked **before** the read, not after, and for every name rather than for a\n * list of known-inherited ones. The list was only ever `Object.prototype` and\n * `Map.prototype`, so a document that was a class instance answered `{ role: \"admin\" }` from\n * its prototype — and `{ secret: … }` by *running* an inherited getter, which is a query\n * executing code the document's author wrote. Asking first is also why no accessor outside\n * the item can run at all.\n */\nexport function readOwn(value: object, key: string): unknown {\n if (value instanceof Map) return value.get(key);\n return Object.hasOwn(value, key) ? (value as Record<string, unknown>)[key] : undefined;\n}\n\nfunction readOne(value: object, step: Segment): unknown {\n return readOwn(value, step.key);\n}\n\n/**\n * The value at a single-segment path.\n *\n * The overwhelmingly common case — `{ id: 2 }` — so it is written out: a direct property\n * read, with the `Map` check paid only when the read found nothing, which a plain object\n * with the field never does.\n */\nexport function readKey(key: string): Read {\n return (document) => (document !== null && typeof document === \"object\" ? readOwn(document, key) : undefined);\n}\n\n/** The whole document, for queries that are conditions on the value itself. */\nexport const readSelf: Read = (document) => document;\n\n/**\n * Builds the walk for a multi-segment path.\n *\n * A loop while the path meets only objects, which is nearly always, and the recursive\n * fan-out only from the first array it meets. `address.city` on a record with no arrays in\n * it costs two property reads and one call.\n */\nexport function reachPath(keys: readonly string[]): Reach {\n const steps = keys.map(segment);\n return (document, test) => {\n let value = document;\n for (let at = 0; at < steps.length; at++) {\n if (value === null || typeof value !== \"object\") return test(undefined);\n if (Array.isArray(value)) return walk(value, steps, at, test);\n value = readOne(value, steps[at] as Segment);\n }\n return test(value);\n };\n}\n\n/** Builds the straight read for a multi-segment path. */\nexport function probePath(keys: readonly string[]): Probe {\n const steps = keys.map(segment);\n const last = steps.length - 1;\n const [first, second] = steps as [Segment, Segment];\n if (steps.length === 1 && first.index === -1) {\n // One segment, which is nearly every query: one read, and `FANOUT` where the item is\n // itself an array, because an array is seen through at every segment including the first.\n const only = first.key;\n const guarded = needsGuard(only);\n return (document) => {\n if (document === null || typeof document !== \"object\") return undefined;\n if (Array.isArray(document)) return FANOUT;\n // Written out rather than calling `readOwn`: the call costs about as much as the work\n // it does, and this runs once per document per field.\n if (!guarded && (document as { __proto__?: unknown }).__proto__ === PLAIN) return (document as Record<string, unknown>)[only];\n return readOwn(document, only);\n };\n }\n if (steps.length === 2 && first.index === -1 && second.index === -1) {\n // `a.b`, the shape nearly every nested field has, written out: two reads, no loop.\n const outer = first.key;\n const inner = second.key;\n const outerGuarded = needsGuard(outer);\n const innerGuarded = needsGuard(inner);\n return (document) => {\n if (document === null || typeof document !== \"object\") return undefined;\n if (Array.isArray(document)) return FANOUT;\n const value =\n !outerGuarded && (document as { __proto__?: unknown }).__proto__ === PLAIN ? (document as Record<string, unknown>)[outer] : readOwn(document, outer);\n if (value === null || typeof value !== \"object\") return undefined;\n if (Array.isArray(value)) return FANOUT;\n return !innerGuarded && (value as { __proto__?: unknown }).__proto__ === PLAIN ? (value as Record<string, unknown>)[inner] : readOwn(value, inner);\n };\n }\n return (document) => {\n let value = document;\n for (let at = 0; at <= last; at++) {\n if (value === null || typeof value !== \"object\") return undefined;\n if (Array.isArray(value) && (steps[at] as Segment).index === -1) return FANOUT;\n const step = steps[at] as Segment;\n value = Array.isArray(value) ? value[step.index] : readOwn(value, step.key);\n }\n return value;\n };\n}\n\n/** The same, from a value some other accessor produced. */\nexport function probeFrom(read: Read, keys: readonly string[]): Probe {\n const probe = probePath(keys);\n return (document) => probe(read(document));\n}\n\n/** Continues a walk from a value some other accessor produced. */\nexport function reachFrom(read: Read, keys: readonly string[]): Reach {\n const steps = keys.map(segment);\n return (document, test) => walk(read(document), steps, 0, test);\n}\n\n/**\n * How deep a document may nest before a path stops descending.\n *\n * Every other walk in this library is bounded — the text search by its own limit, equality\n * and sorting by theirs — and this one was not, so a document holding ten thousand nested\n * arrays threw a `RangeError` out of the predicate. That is reachable from a JSON body,\n * whose parser has no such limit, and it aborts a whole scan over one row. Past the cap the\n * value is treated as missing, which is what a path that cannot reach something means\n * everywhere else.\n */\nconst MAX_DOCUMENT_DEPTH = 512;\n\nfunction walk(value: unknown, steps: readonly Segment[], at: number, test: (value: unknown) => boolean, depth = 0): boolean {\n if (at === steps.length) return test(value);\n if (value === null || typeof value !== \"object\" || depth > MAX_DOCUMENT_DEPTH) return test(undefined);\n const step = steps[at] as Segment;\n if (Array.isArray(value)) {\n if (step.index !== -1) return walk(value[step.index], steps, at + 1, test, depth + 1);\n // Fan out: the same segment, applied to each element.\n if (value.length === 0) return test(undefined);\n for (let i = 0; i < value.length; i++) if (walk(value[i], steps, at, test, depth + 1)) return true;\n return false;\n }\n return walk(readOne(value, step), steps, at + 1, test, depth + 1);\n}\n\n/**\n * How many segments a path may have.\n *\n * The same number as the document depth above, and for the same reason: a path longer than\n * the deepest document a walk will follow can reach nothing anyway, so refusing it costs a\n * query nothing real. What it buys is two things. A field name is the one part of a query\n * whose size the node count does not bound — `{\"a.a.a…\": 1}` is a single node however long\n * it is — and each segment becomes an object and a step in a walk, so a field name pasted\n * from somewhere could turn a small query into a large one.\n *\n * And it makes the same path mean the same thing everywhere. Projection walked its own tree\n * of segments and stopped at sixty-four, silently, so a query matched on a path that\n * `fields` then dropped from the result: the filter and the projection disagreed about a\n * path they were both given.\n */\nexport const MAX_PATH_SEGMENTS = 512;\n\n/**\n * Splits a field name into segments, refusing the ones that can reach nothing.\n *\n * Returns the reason as a sentence for the caller to raise, so this module stays free of\n * the error type and its location bookkeeping.\n */\nexport function splitPath(path: string): string[] | string {\n if (path === \"\") return \"an empty field name reaches nothing\";\n const keys = path.split(\".\");\n if (keys.length > MAX_PATH_SEGMENTS) {\n return `the path has ${keys.length} segments, past the limit of ${MAX_PATH_SEGMENTS}; nothing nests that deep`;\n }\n // The path is shown shortened: it is a string from outside, and one long enough to be\n // worth refusing is long enough to bury the sentence explaining why.\n for (const key of keys) if (key === \"\") return `the path \"${path.length > 80 ? `${path.slice(0, 80)}…` : path}\" has an empty segment, which reaches nothing`;\n return keys;\n}\n","import { isDateLiteral, isPlainObject, resolveDate, toTime } from \"./values.js\";\n\n/**\n * Equality between a document value and a query literal.\n *\n * Built once per literal rather than called generically, because the literal is known at\n * compile time and the document value is the only thing that changes: a primitive\n * literal becomes one `===`, and only an object or array literal pays for a walk.\n *\n * The rules, which the specification states and every implementation must share:\n * objects are equal when they have the same keys with equal values, **in any order**\n * (JSON does not promise key order, so a comparison that depended on it would depend on\n * whoever serialised the query); a key whose value is `undefined` counts as absent;\n * arrays are equal element by element, in order; a `$date` literal equals any value that\n * reads as the same instant.\n */\nexport type Equals = (value: unknown) => boolean;\n\n/** Whether a big integer and an ordinary number are the same whole number. */\nfunction sameInteger(a: unknown, b: unknown): boolean {\n const big = typeof a === \"bigint\" ? a : typeof b === \"bigint\" ? b : undefined;\n const other = typeof a === \"bigint\" ? b : a;\n if (big === undefined) return false;\n if (typeof other === \"bigint\") return big === other;\n return typeof other === \"number\" && Number.isInteger(other) && big === BigInt(other);\n}\n\n/** How deep an object literal comparison walks. Past this the two are treated as different. */\nconst MAX_EQUAL_DEPTH = 64;\n\n/**\n * The same whole number as a big integer, when a literal is one and could be written either\n * way.\n *\n * Settled once, when the query compiles, so the comparison stays a single `===` against a\n * value prepared in advance. Only a whole number gets one: nothing is a big integer and a\n * fraction, and a string or a boolean can never be one either.\n */\nexport function alsoBig(literal: unknown): bigint | undefined {\n return typeof literal === \"number\" && Number.isInteger(literal) ? BigInt(literal) : undefined;\n}\n\nexport function equalsLiteral(literal: unknown, now: number, ignoreCase = false): Equals {\n if (literal === null) return (value) => value === null;\n if (typeof literal !== \"object\") {\n if (ignoreCase && typeof literal === \"string\") {\n const wanted = literal.toLowerCase();\n return (value) => typeof value === \"string\" && value.toLowerCase() === wanted;\n }\n // A big integer is a number everywhere else in the language: ordering puts `10n` and\n // `10` in the same place, `$type` calls both numbers. Equality alone compared the two\n // kinds with `===` and said no — so a document holding `10n` was at once `$gte: 10`,\n // `$lte: 10` and `$ne: 10`, which is not a thing any value can be. A query cannot carry\n // a big integer of its own (JSON has none, and one is refused), so a number is the only\n // way to ask about such a value at all.\n const big = alsoBig(literal);\n if (big !== undefined) return (value) => value === literal || value === big;\n return (value) => value === literal;\n }\n if (isDateLiteral(literal)) {\n const time = resolveDate(literal.$date, now);\n return (value) => toTime(value) === time;\n }\n return (value) => deepEqual(value, literal, 0, ignoreCase, now);\n}\n\n/**\n * Equality between two values that both came out of a document, for `$field` references.\n *\n * The same rules as equality with a literal — same type, arrays in order, objects in any\n * key order — but neither side is known when the query compiles, so nothing can be\n * prepared. Missing is not equal to anything, including itself: a reference that reaches\n * nothing matches nothing.\n */\nexport function valuesEqual(a: unknown, b: unknown): boolean {\n if (a === undefined || b === undefined) return false;\n if (a instanceof Date || b instanceof Date) {\n const left = toTime(a);\n const right = toTime(b);\n return a instanceof Date && b instanceof Date && left === right && !Number.isNaN(left);\n }\n return deepEqual(a, b, 0);\n}\n\nfunction deepEqual(actual: unknown, wanted: unknown, depth: number, ignoreCase = false, now = 0): boolean {\n if (actual === wanted) return true;\n // The two kinds of number, one level down — and on both sides, because `valuesEqual`\n // brings two document values here and either of them may be the big one.\n if (typeof actual === \"bigint\" || typeof wanted === \"bigint\") return sameInteger(actual, wanted);\n if (actual instanceof Date && wanted instanceof Date) return actual.getTime() === wanted.getTime();\n if (depth > MAX_EQUAL_DEPTH) return false;\n // Ignoring case is a rule about comparing strings, so it holds wherever a string is\n // compared — including the ones inside a list or an object. Applied only to the literal's\n // own top level, `{ $eq: \"A\", $options: \"i\" }` matched `\"a\"` while `{ $eq: [\"A\"], … }` did\n // not match `[\"a\"]`, and nothing said why.\n if (ignoreCase && typeof actual === \"string\" && typeof wanted === \"string\") return actual.toLowerCase() === wanted.toLowerCase();\n if (wanted === null || typeof wanted !== \"object\") return false;\n // `resolveDate`, not `toTime`: a `{ \"$ago\": … }` or `\"now\"` nested inside a list or an\n // object was read by a function that knows neither, came out `NaN`, and quietly matched\n // nothing — while the same literal written on its own worked.\n if (isDateLiteral(wanted)) return toTime(actual) === resolveDate(wanted.$date, now);\n if (actual === null || typeof actual !== \"object\") return false;\n if (Array.isArray(wanted)) {\n if (!Array.isArray(actual) || actual.length !== wanted.length) return false;\n for (let i = 0; i < wanted.length; i++) if (!deepEqual(actual[i], wanted[i], depth + 1, ignoreCase, now)) return false;\n return true;\n }\n if (Array.isArray(actual) || !isPlainObject(wanted)) return false;\n if (actual instanceof Map) {\n let size = 0;\n for (const key in wanted) {\n const expected = wanted[key];\n if (expected === undefined) continue;\n size++;\n if (!actual.has(key) || !deepEqual(actual.get(key), expected, depth + 1, ignoreCase, now)) return false;\n }\n let present = 0;\n for (const value of actual.values()) if (value !== undefined) present++;\n return present === size;\n }\n const record = actual as Record<string, unknown>;\n let size = 0;\n for (const key in wanted) {\n const expected = wanted[key];\n if (expected === undefined) continue;\n size++;\n if (!Object.hasOwn(record, key) || !deepEqual(record[key], expected, depth + 1, ignoreCase, now)) return false;\n }\n let present = 0;\n for (const key in record) if (Object.hasOwn(record, key) && record[key] !== undefined) present++;\n return present === size;\n}\n","import { JqlError } from \"./errors.js\";\nimport { alsoBig, equalsLiteral, type Equals } from \"./internal/equal.js\";\nimport { compileGlob } from \"./internal/glob.js\";\nimport { DURATION_UNITS } from \"./internal/duration.js\";\nimport { describe, isDateLiteral, isFieldReference, isOfType, isPlainObject, resolveDate, TYPE_NAMES, toTime } from \"./internal/values.js\";\nimport { didYouMean } from \"./internal/closest.js\";\nimport type { TypeName } from \"./types.js\";\n\n/**\n * What each field operator means, as a test on one value.\n *\n * Every builder here runs once, when a query is compiled, and returns the smallest\n * closure that answers its question: the operand is validated, normalised and, where it\n * helps, turned into a `Set` or a lower-cased copy before any document is seen. The\n * returned test only ever does the part that depends on the document.\n *\n * None of these knows about arrays or paths. Whether a test is also tried against each\n * element of an array, and how a field is reached, is `core.ts`'s business — so each\n * operator's meaning is written exactly once.\n */\nexport type Test = (value: unknown) => boolean;\n\nexport const NEVER: Test = () => false;\n\n/** Lower-cases the way the specification defines \"ignoring case\": Unicode default case mapping, no locale. */\nfunction lower(value: string): string {\n return value.toLowerCase();\n}\n\n/**\n * Equality with one literal.\n *\n * `null` also matches a missing field, because \"has no value\" is what\n * people mean by it far more often than \"has the value null\". `$exists` is there for\n * the times the difference matters.\n */\nexport function equalsTest(literal: unknown, ignoreCase: boolean, at: string, now: number): Test {\n checkLiteral(literal, at);\n if (literal === null) return (value) => value === null || value === undefined;\n return equalsLiteral(literal, now, ignoreCase);\n}\n\n/** Membership. A `Set` for the primitives, and a walk only for the object and array literals. */\nexport function inTest(list: unknown, ignoreCase: boolean, at: string, now: number): Test {\n if (!Array.isArray(list)) throw new JqlError(`takes a list of values, not ${describe(list)}`, at);\n if (list.length === 0) return NEVER;\n const primitives = new Set<unknown>();\n const complex: Equals[] = [];\n // A whole number is the only way a query can name a big integer — JSON has no literal for\n // one — but the two forms are kept in *separate* sets. Holding both in one made every\n // lookup 1.17× the cost of a set of plain numbers, on every `$in` ever written, to serve a\n // kind of value almost no document holds; this way the common path is the set it always\n // was, and a big integer costs one comparison more, after that set has already said no.\n let bigints: Set<bigint> | undefined;\n let matchesMissing = false;\n list.forEach((item, index) => {\n checkLiteral(item, `${at}[${index}]`);\n if (item === null) matchesMissing = true;\n else if (typeof item === \"object\") complex.push(equalsLiteral(item, now, ignoreCase));\n else {\n primitives.add(ignoreCase && typeof item === \"string\" ? lower(item) : item);\n const big = alsoBig(item);\n if (big !== undefined) (bigints ??= new Set()).add(big);\n }\n });\n const fold = ignoreCase;\n const whole = bigints;\n return (value) => {\n if (value === undefined || value === null) return matchesMissing;\n if (primitives.has(fold && typeof value === \"string\" ? lower(value) : value)) return true;\n if (whole !== undefined && typeof value === \"bigint\" && whole.has(value)) return true;\n for (let i = 0; i < complex.length; i++) if ((complex[i] as Equals)(value)) return true;\n return false;\n };\n}\n\ntype Ordering = \"$gt\" | \"$gte\" | \"$lt\" | \"$lte\";\n\n/**\n * An ordering comparison.\n *\n * Only like with like: a number against numbers (and bigints), a string against strings\n * in code-unit order, a `$date` against anything that reads as a date. Nothing is\n * coerced, so `\"10\"` is not greater than `9` — a comparison that converted would give a\n * different answer depending on which side happened to be a string, and a query that\n * means different things on different documents is not one anybody can reason about.\n */\nexport function orderTest(operator: Ordering, bound: unknown, at: string, now: number): Test {\n if (typeof bound === \"number\") {\n if (Number.isNaN(bound)) throw new JqlError(\"NaN compares false with everything, so this would match nothing\", at);\n switch (operator) {\n case \"$gt\":\n return (value) => (typeof value === \"number\" || typeof value === \"bigint\") && value > bound;\n case \"$gte\":\n return (value) => (typeof value === \"number\" || typeof value === \"bigint\") && value >= bound;\n case \"$lt\":\n return (value) => (typeof value === \"number\" || typeof value === \"bigint\") && value < bound;\n case \"$lte\":\n return (value) => (typeof value === \"number\" || typeof value === \"bigint\") && value <= bound;\n }\n }\n if (typeof bound === \"string\") {\n switch (operator) {\n case \"$gt\":\n return (value) => typeof value === \"string\" && value > bound;\n case \"$gte\":\n return (value) => typeof value === \"string\" && value >= bound;\n case \"$lt\":\n return (value) => typeof value === \"string\" && value < bound;\n case \"$lte\":\n return (value) => typeof value === \"string\" && value <= bound;\n }\n }\n if (isDateLiteral(bound)) {\n const time = resolveDate(bound.$date, now);\n if (Number.isNaN(time)) throw new JqlError(`${JSON.stringify(bound.$date)} is not a date, so every comparison with it would be false`, at);\n // A value in the document is only a date for the length of this comparison. A `Date`\n // object is not a JSON value, so the engine does not assume one: strings and epoch\n // numbers are read as dates here because the query said \"$date\".\n switch (operator) {\n case \"$gt\":\n return (value) => value !== null && value !== undefined && toTime(value) > time;\n case \"$gte\":\n return (value) => value !== null && value !== undefined && toTime(value) >= time;\n case \"$lt\":\n return (value) => value !== null && value !== undefined && toTime(value) < time;\n case \"$lte\":\n return (value) => value !== null && value !== undefined && toTime(value) <= time;\n }\n }\n throw new JqlError(`compares with a number, a string, a {\"$date\": …} or a {\"$field\": …}, not ${describe(bound)}`, at);\n}\n\ntype StringOperator = \"$contains\" | \"$startsWith\" | \"$endsWith\" | \"$word\" | \"$glob\";\n\n/**\n * The string operators, each taking one value or a list meaning \"any of these\".\n *\n * A list is there because \"the path starts with any of `/health`, `/metrics`\" is a single\n * thought, and spelling it as an `$or` of three conditions makes it three.\n */\nexport function stringTest(operator: StringOperator, operand: unknown, ignoreCase: boolean, at: string, maxGlobLength = Number.POSITIVE_INFINITY): Test {\n const list = typeof operand === \"string\" ? [operand] : operand;\n if (!Array.isArray(list)) throw new JqlError(`takes a string or a list of strings, not ${describe(operand)}`, at);\n if (list.length === 0) return NEVER;\n const wanted = list.map((item, index) => {\n if (typeof item !== \"string\") throw new JqlError(`takes strings, not ${describe(item)}`, `${at}[${index}]`);\n return ignoreCase ? lower(item) : item;\n });\n if (operator === \"$glob\") {\n for (const pattern of wanted) {\n if (pattern.length > maxGlobLength) throw new JqlError(`the glob is ${pattern.length} characters, past the limit of ${maxGlobLength}`, at);\n }\n // Taken apart once, into the narrowest matcher the pattern allows.\n const globs = wanted.map(compileGlob);\n if (globs.length === 1) {\n const only = globs[0] as (text: string) => boolean;\n return ignoreCase ? (value) => typeof value === \"string\" && only(lower(value)) : (value) => typeof value === \"string\" && only(value);\n }\n return (value) => {\n if (typeof value !== \"string\") return false;\n const actual = ignoreCase ? lower(value) : value;\n for (let i = 0; i < globs.length; i++) if ((globs[i] as (text: string) => boolean)(actual)) return true;\n return false;\n };\n }\n const one = (actual: string, value: string): boolean => {\n switch (operator) {\n case \"$contains\":\n return actual.includes(value);\n case \"$startsWith\":\n return actual.startsWith(value);\n case \"$endsWith\":\n return actual.endsWith(value);\n case \"$word\":\n return containsWord(actual, value);\n }\n };\n if (wanted.length === 1) {\n const only = wanted[0] as string;\n // The common single-value `$contains` gets its own closure: no inner call, no loop.\n if (operator === \"$contains\") return ignoreCase ? (value) => typeof value === \"string\" && lower(value).includes(only) : (value) => typeof value === \"string\" && value.includes(only);\n return (value) => typeof value === \"string\" && one(ignoreCase ? lower(value) : value, only);\n }\n return (value) => {\n if (typeof value !== \"string\") return false;\n const actual = ignoreCase ? lower(value) : value;\n for (let i = 0; i < wanted.length; i++) if (one(actual, wanted[i] as string)) return true;\n return false;\n };\n}\n\nconst ALPHANUMERIC = /[\\p{L}\\p{N}]/u;\n\n/**\n * The value as a whole component of the text: bounded on each side by the start or end of\n * the text, or by a character that is not a letter or digit.\n *\n * Ported from BotHandler's actor matching, where it replaced a substring test that let\n * `1.2.3.4` match `1.2.3.45` and `11.2.3.4` — so excluding one address excluded its\n * neighbours too. A side of the value that is itself a separator has chosen its own\n * boundary: `203.0.113.` finds the whole network.\n */\nexport function containsWord(actual: string, wanted: string): boolean {\n if (wanted === \"\") return false;\n const characters = [...wanted];\n const startsAlphanumeric = ALPHANUMERIC.test(characters[0] as string);\n const endsAlphanumeric = ALPHANUMERIC.test(characters[characters.length - 1] as string);\n let from = 0;\n for (;;) {\n const at = actual.indexOf(wanted, from);\n if (at === -1) return false;\n const end = at + wanted.length;\n const startsClean = at === 0 || !startsAlphanumeric || !ALPHANUMERIC.test(before(actual, at));\n const endsClean = end >= actual.length || !endsAlphanumeric || !ALPHANUMERIC.test(after(actual, end));\n if (startsClean && endsClean) return true;\n from = at + 1;\n }\n}\n\n/**\n * The character on either side of a boundary — a whole one.\n *\n * Read a code unit at a time, half of a letter outside the basic plane is a lone surrogate,\n * which is in no Unicode category at all, so `𝐀𝐁` looked like two words rather than one.\n */\nfunction before(text: string, at: number): string {\n const code = text.charCodeAt(at - 1);\n return code >= 0xdc00 && code <= 0xdfff && at >= 2 ? text.slice(at - 2, at) : (text[at - 1] as string);\n}\n\nfunction after(text: string, end: number): string {\n const code = text.charCodeAt(end);\n return code >= 0xd800 && code <= 0xdbff ? text.slice(end, end + 2) : (text[end] as string);\n}\n\n/** Flags `$options` may carry. `g` and `y` are refused: they make `RegExp.test` stateful, so a pattern would match on alternate calls. */\nconst OPTION_FLAGS = new Set([\"i\", \"m\", \"s\", \"u\"]);\n\nexport function parseOptions(options: unknown, at: string): string {\n if (typeof options !== \"string\") throw new JqlError(`takes a string of flags such as \"i\", not ${describe(options)}`, at);\n for (const flag of options) {\n if (!OPTION_FLAGS.has(flag)) {\n const why = flag === \"g\" || flag === \"y\" ? \": it makes a pattern stateful, so it would match on every other document\" : \"\";\n throw new JqlError(`\"${flag}\" is not a flag this language takes (i, m, s, u)${why}`, at);\n }\n }\n if (new Set(options).size !== options.length) throw new JqlError(`\"${options}\" repeats a flag`, at);\n return options;\n}\n\nexport function regexTest(pattern: unknown, flags: string, limits: { allowRegex: boolean; maxPatternLength: number }, at: string): Test {\n if (!limits.allowRegex) throw new JqlError(\"patterns are turned off for this query; $contains, $startsWith, $endsWith and $word cover most of what one is for\", at);\n if (typeof pattern !== \"string\") throw new JqlError(`takes the pattern as a string, not ${describe(pattern)}`, at);\n if (pattern.length > limits.maxPatternLength) throw new JqlError(`the pattern is ${pattern.length} characters, past the limit of ${limits.maxPatternLength}`, at);\n let expression: RegExp;\n try {\n expression = new RegExp(pattern, flags);\n } catch (error) {\n throw new JqlError(`the pattern does not compile: ${error instanceof Error ? error.message : String(error)}`, at);\n }\n return (value) => typeof value === \"string\" && expression.test(value);\n}\n\nexport function typeTest(operand: unknown, at: string): Test {\n const list = typeof operand === \"string\" ? [operand] : operand;\n if (!Array.isArray(list) || list.length === 0) throw new JqlError(`takes a type name or a non-empty list of them, not ${describe(operand)}`, at);\n const types = list.map((name, index) => {\n if (typeof name !== \"string\" || !(TYPE_NAMES as readonly string[]).includes(name)) {\n throw new JqlError(`${describe(name)} is not a type name (${TYPE_NAMES.join(\", \")})${typeof name === \"string\" ? didYouMean(name, TYPE_NAMES) : \"\"}`, `${at}[${index}]`);\n }\n return name as TypeName;\n });\n if (types.length === 1) {\n const only = types[0] as TypeName;\n return (value) => isOfType(value, only);\n }\n return (value) => types.some((type) => isOfType(value, type));\n}\n\nexport function modTest(operand: unknown, at: string): Test {\n if (!Array.isArray(operand) || operand.length !== 2 || typeof operand[0] !== \"number\" || typeof operand[1] !== \"number\") {\n throw new JqlError(`takes [divisor, remainder], not ${describe(operand)}`, at);\n }\n const [divisor, remainder] = operand as [number, number];\n if (divisor === 0 || !Number.isFinite(divisor)) throw new JqlError(\"a divisor of zero leaves no remainder to compare, so this would match nothing\", at);\n // A big integer is a number everywhere else in the language — for ordering, and for\n // `$type` (specification §5.3) — so it is one here. `%` refuses to mix a big integer with\n // an ordinary one, so the divisor is converted once, when the query compiles; a divisor\n // with a fraction cannot divide a big integer at all, and no value matches it.\n const big = Number.isInteger(divisor) ? BigInt(divisor) : undefined;\n return (value) => {\n if (typeof value === \"number\") return value % divisor === remainder;\n if (typeof value === \"bigint\") return big !== undefined && Number(value % big) === remainder;\n return false;\n };\n}\n\n/** `$all`: every literal is equal to the value or to one of its elements. An empty list matches nothing. */\nexport function allTest(list: unknown, ignoreCase: boolean, at: string, now: number): Test {\n if (!Array.isArray(list)) throw new JqlError(`takes a list of values, not ${describe(list)}`, at);\n if (list.length === 0) return NEVER;\n const tests = list.map((item, index) => {\n if (isPlainObject(item) && Object.keys(item).some((key) => key.startsWith(\"$\")) && !isDateLiteral(item)) {\n throw new JqlError(\"takes values, not conditions; use $elemMatch inside $and for that\", `${at}[${index}]`);\n }\n return equalsTest(item, ignoreCase, `${at}[${index}]`, now);\n });\n return (value) => {\n for (const test of tests) {\n if (test(value)) continue;\n if (!Array.isArray(value)) return false;\n let found = false;\n for (let i = 0; i < value.length; i++) {\n if (test(value[i])) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n };\n}\n\n/**\n * The order of two values that both came out of a document, or `undefined` when they\n * cannot be compared.\n *\n * Only like with like, as everywhere else in the language: numbers with numbers, strings\n * with strings, dates with dates. Nothing is read as a date here, because neither side is\n * a query saying it is one — `{ \"$field\": … }` compares what the item holds.\n */\nexport function orderOf(a: unknown, b: unknown): number | undefined {\n if ((typeof a === \"number\" || typeof a === \"bigint\") && (typeof b === \"number\" || typeof b === \"bigint\")) {\n if (Number.isNaN(a) || Number.isNaN(b)) return undefined;\n return a < b ? -1 : a > b ? 1 : 0;\n }\n if (typeof a === \"string\" && typeof b === \"string\") return a < b ? -1 : a > b ? 1 : 0;\n if (a instanceof Date && b instanceof Date) {\n const left = a.getTime();\n const right = b.getTime();\n return Number.isNaN(left) || Number.isNaN(right) ? undefined : left - right;\n }\n return undefined;\n}\n\n/**\n * Refuses a literal JSON cannot carry.\n *\n * A `RegExp`, a `Date`, a function or `undefined` in a query would work in the process\n * that wrote it and mean something else — or nothing — once the query was serialised.\n * The language is the JSON, so the engine holds to it even when handed an object that\n * could have been more.\n */\nexport function checkLiteral(value: unknown, at: string, depth = 0): void {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new JqlError(`${String(value)} is not a JSON number`, at);\n return;\n }\n if (depth > 64) throw new JqlError(\"the literal nests deeper than 64 levels\", at);\n if (Array.isArray(value)) {\n value.forEach((item, index) => checkLiteral(item, `${at}[${index}]`, depth + 1));\n return;\n }\n if (isPlainObject(value)) {\n if (isFieldReference(value)) {\n throw new JqlError(\n `a {\"$field\": …} reference compares with another field, which $eq, $ne and the ordering operators do; it is not a value that can be held here`,\n at,\n );\n }\n if (isDateLiteral(value)) {\n const date = value.$date;\n if (Number.isNaN(resolveDate(date, 0))) {\n const relative = isPlainObject(date) ? `; a relative date is {\"$ago\": \"1h\"} or {\"$ahead\": \"1h\"}, with a count and one of ${DURATION_UNITS.join(\", \")}` : \"\";\n throw new JqlError(`${JSON.stringify(date)} is not a date${relative}`, `${at}.$date`);\n }\n return;\n }\n for (const key in value) checkLiteral(value[key], `${at}.${key}`, depth + 1);\n return;\n }\n const hint = value instanceof RegExp ? '; write {\"$regex\": \"…\"} instead' : value instanceof Date ? '; write {\"$date\": \"…\"} instead' : \"\";\n throw new JqlError(`${describe(value)} is not JSON, so a query holding it could not be stored or sent${hint}`, at);\n}\n","import { JqlError } from \"./errors.js\";\nimport { didYouMean } from \"./internal/closest.js\";\nimport { FANOUT, needsGuard, PLAIN, type Probe, probeFrom, probePath, type Read, type Reach, reachFrom, reachPath, readOwn, readSelf, splitPath } from \"./internal/path.js\";\nimport { describe, isDateLiteral, isFieldReference, isPlainObject } from \"./internal/values.js\";\nimport { DEFAULT_LIMITS, type Limits } from \"./limits.js\";\nimport { alsoBig, valuesEqual } from \"./internal/equal.js\";\nimport {\n allTest,\n checkLiteral,\n orderOf,\n equalsTest,\n inTest,\n modTest,\n orderTest,\n parseOptions,\n regexTest,\n stringTest,\n type Test,\n typeTest,\n} from \"./operators.js\";\nimport type { Matcher, QueryLike, UntypedQuery } from \"./types.js\";\nimport { checkVocabulary, type Vocabulary, type VocabularyField } from \"./vocabulary.js\";\n\n/**\n * The engine: a query document in, a predicate out.\n *\n * **Compile once, test many.** Everything that depends only on the query — validating it,\n * resolving field names, splitting paths, building sets for `$in`, lower-casing for `$options:\n * \"i\"`, compiling patterns — happens here, once. What comes back is a tree of small closures\n * that does only the part that depends on the document. Filtering a million items with one\n * query parses that query once, not a million times.\n *\n * **No code generation.** Emitting JavaScript source and calling `new Function` would be\n * faster still, and it would also be refused by every page with a Content-Security-Policy\n * worth having — including the dashboards in this project, whose build fails on a\n * `new Function`. Closures run everywhere.\n *\n * **Cheapest first.** The parts of an `$and` are reordered so an equality test runs before a\n * pattern and a pattern before a free-text walk, because the first part to fail decides the\n * answer and the rest never run. Every operator is a pure test, so the order changes the\n * cost and never the result.\n *\n * **No implicit cache.** A cache keyed on the query object would hand back a stale predicate\n * the moment somebody edited the object they had already queried with — a filter that looks\n * updated and is not. Compiling a small query costs about as much as testing a handful of\n * documents, so the helpers compile per call, and a hot loop calls `compile` once and keeps\n * the result.\n */\n\nexport interface CompileOptions<Extra extends object = {}> {\n /** The field names, aliases and computed fields a query may use. Its fields become names a typed query may use. */\n readonly vocabulary?: Vocabulary<never, Extra> | undefined;\n /** How much of a query to accept. Default `DEFAULT_LIMITS`; use `UNTRUSTED_LIMITS` for queries from outside. */\n readonly limits?: Partial<Limits> | undefined;\n /**\n * Where \"now\" comes from, for the relative dates in `{ \"$date\": { \"$ago\": \"1h\" } }`.\n * Default the system clock, read **once**, when the query compiles.\n *\n * Read once because a window that moved while a scan was in progress would judge two\n * items a second apart against different hours. It also means a long-lived compiled\n * query keeps the instant it was compiled at: recompile to move the window, which costs\n * well under a microsecond.\n */\n readonly now?: (() => number) | undefined;\n /**\n * Operators this project adds to the language, such as an address-in-network test that\n * no amount of JSON could express.\n *\n * **A query using one is no longer portable JQL**, which is why their names must begin\n * `$x`: somebody reading a stored filter can see at a glance that it needs more than a\n * standard engine, and a future version of the language cannot collide with one.\n */\n readonly operators?: readonly OperatorDefinition[] | undefined;\n}\n\n/** An operator a project adds to the language. Its name must match `$x` followed by a capital: `$xCidr`. */\nexport interface OperatorDefinition {\n readonly name: string;\n /**\n * Builds the test, once, when the query compiles. Throw `JqlError` for an operand this\n * operator cannot use; the message reaches whoever wrote the query.\n */\n readonly compile: (operand: unknown, at: string) => (value: unknown) => boolean;\n /** Roughly what it costs against the others, so an `$and` can run the cheap parts first. Default 4. */\n readonly cost?: number | undefined;\n /** Whether it is also tried against each element of an array value. Default true, like the built-in operators. */\n readonly elementwise?: boolean | undefined;\n}\n\nconst EXTENSION_NAME = /^\\$x[A-Z][A-Za-z0-9]*$/;\n\n/** A predicate with its estimated cost, so an `$and` can run the cheap parts first. */\ninterface Compiled {\n readonly test: (document: unknown) => boolean;\n readonly cost: number;\n}\n\n/**\n * How a field is reached. `read` is present only when the path cannot fan out over an\n * array; `probe` when it can, but usually will not, so the straight read is worth trying\n * first.\n */\ninterface Field {\n readonly read: Read | undefined;\n readonly probe: Probe | undefined;\n readonly reach: Reach;\n /** A plain own-property name, for the fastest equality path. */\n readonly key: string | undefined;\n readonly cost: number;\n}\n\ninterface Context {\n readonly vocabulary: Vocabulary<unknown, object> | undefined;\n readonly limits: Limits;\n readonly operators: ReadonlyMap<string, OperatorDefinition>;\n /** The operators this query may use, or `undefined` when it may use all of them. */\n readonly allowed: ReadonlySet<string> | undefined;\n /** The instant every relative date in this query resolves against. */\n readonly now: number;\n nodes: number;\n}\n\nconst ALWAYS: Compiled = { test: () => true, cost: 0 };\nconst NOTHING: Compiled = { test: () => false, cost: 0 };\n\n/** The operators that combine queries. */\nexport const QUERY_OPERATORS: readonly string[] = [\"$and\", \"$or\", \"$nor\", \"$not\", \"$text\", \"$comment\"];\n\n/** The operators that test a field. At the top of a query they test the item itself. */\nexport const FIELD_OPERATORS: readonly string[] = [\n \"$eq\",\n \"$ne\",\n \"$gt\",\n \"$gte\",\n \"$lt\",\n \"$lte\",\n \"$in\",\n \"$nin\",\n \"$exists\",\n \"$type\",\n \"$contains\",\n \"$startsWith\",\n \"$endsWith\",\n \"$word\",\n \"$glob\",\n \"$regex\",\n \"$options\",\n \"$mod\",\n \"$size\",\n \"$length\",\n \"$all\",\n \"$elemMatch\",\n \"$not\",\n];\n\nconst FIELD_OPERATOR_SET = new Set(FIELD_OPERATORS);\nconst EVERY_OPERATOR = [...new Set([...QUERY_OPERATORS, ...FIELD_OPERATORS])];\n\n/**\n * Operators whose meaning `$options: \"i\"` changes.\n *\n * Not in the barrel — this is the language's own list (specification §5.5), shared with\n * `explain`, which has to know which pieces of a condition the flag travels with.\n */\nexport const CASE_AWARE = new Set([\"$eq\", \"$ne\", \"$in\", \"$nin\", \"$all\", \"$contains\", \"$startsWith\", \"$endsWith\", \"$word\", \"$glob\", \"$regex\"]);\n\n/**\n * Compiles a query into a predicate.\n *\n * Throws `JqlError` for anything that is not a valid query, naming where in the query the\n * problem is. A function passed in is returned as it is, so every helper that takes a\n * query also takes a predicate somebody already has.\n */\nexport function compile<T = unknown, Extra extends object = {}>(query: QueryLike<T, NoInfer<Extra>>, options: CompileOptions<Extra> = {}): Matcher<T> {\n if (typeof query === \"function\") return query as Matcher<T>;\n const limits = options.limits === undefined ? DEFAULT_LIMITS : { ...DEFAULT_LIMITS, ...options.limits };\n const added = extensions(options.operators);\n const context: Context = {\n vocabulary: checkVocabulary(options.vocabulary) as Vocabulary<unknown, object> | undefined,\n limits,\n now: options.now === undefined ? Date.now() : options.now(),\n operators: added,\n allowed: allowlist(limits.allowOperators, added),\n nodes: 0,\n };\n const { test } = compileQuery(query, context, \"\", 0);\n // The shared constants are never handed out, so a caller that attaches something to\n // the predicate it was given cannot reach every other query's.\n if (test === ALWAYS.test) return () => true;\n if (test === NOTHING.test) return () => false;\n return test as Matcher<T>;\n}\n\n/** Whether one value matches a query. For a one-off; in a loop, `compile` once instead. */\nexport function matches<T, Extra extends object = {}>(value: T, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): boolean {\n return compile(query, options)(value);\n}\n\n/**\n * Checks a query, and hands back the predicate when it is a good one.\n *\n * What a service calls on a query it has just received, so it can answer 400 with the\n * sentence rather than 500 with a stack. The predicate comes with it because the caller\n * needs one next, and the two ways of getting it separately are both worse: compiling\n * again costs a second compile, and — the reason this returns it rather than only a\n * verdict — it is compiled from a second set of options, which is how a query gets\n * checked against the untrusted limits and then run without them.\n */\nexport function validate<T = unknown>(query: unknown, options?: CompileOptions<object>): { valid: true; test: Matcher<T> } | { valid: false; error: JqlError } {\n try {\n return { valid: true, test: compile<T>(query as QueryLike<T, object>, options) };\n } catch (error) {\n if (error instanceof JqlError) return { valid: false, error };\n throw error;\n }\n}\n\n/**\n * Marks a query from outside the type system — parsed JSON, a URL parameter — as one to be\n * checked when it is compiled rather than by the compiler. Returns the same object.\n */\nexport function untyped(query: unknown): UntypedQuery {\n return query as UntypedQuery;\n}\n\n/**\n * How a field name is reached, by the same rules a query uses. For sorting and projection,\n * which must name fields exactly as the query beside them does. Not part of the public\n * surface.\n */\nexport function reachField(name: string, vocabulary: Vocabulary<unknown, object> | undefined, at: string): Reach {\n return resolveField(name, { vocabulary, limits: DEFAULT_LIMITS, now: 0, operators: NO_EXTENSIONS, allowed: undefined, nodes: 0 }, at).reach;\n}\n\n/**\n * Operators that modify or annotate rather than ask anything, and so are never what an\n * allowlist is about.\n */\nconst ALWAYS_ALLOWED = new Set([\"$options\", \"$comment\"]);\n\n/** `$field` is not an operator key, but comparing two fields is a capability, so it is gateable by name. */\nconst GATEABLE = new Set([...FIELD_OPERATORS, ...QUERY_OPERATORS, \"$field\"]);\n\nfunction allowlist(names: readonly string[] | \"all\", added: ReadonlyMap<string, OperatorDefinition>): ReadonlySet<string> | undefined {\n if (names === \"all\") return undefined;\n if (!Array.isArray(names)) throw new JqlError(`is a list of operator names or \"all\", not ${describe(names)}`, \"limits.allowOperators\");\n const out = new Set<string>();\n for (const name of names) {\n // A name nobody has is a list that does not say what its author meant: it would allow\n // nothing and look like it allowed something.\n if (typeof name !== \"string\" || (!GATEABLE.has(name) && !added.has(name))) {\n throw new JqlError(`\"${String(name)}\" is not an operator, so allowing it allows nothing${typeof name === \"string\" ? didYouMean(name, [...GATEABLE]) : \"\"}`, \"limits.allowOperators\");\n }\n out.add(name);\n }\n return out;\n}\n\n/** Refuses an operator this query was not allowed to use. */\nfunction permit(key: string, context: Context, at: string): void {\n const allowed = context.allowed;\n if (allowed === undefined || ALWAYS_ALLOWED.has(key) || allowed.has(key)) return;\n const listed = [...allowed];\n const shown = listed.length > 8 ? `${listed.slice(0, 8).join(\", \")}, …` : listed.join(\", \");\n throw new JqlError(`\"${key}\" is not an operator this query may use (${shown === \"\" ? \"none\" : shown})`, at);\n}\n\nconst NO_EXTENSIONS: ReadonlyMap<string, OperatorDefinition> = new Map();\n\nfunction extensions(given: readonly OperatorDefinition[] | undefined): ReadonlyMap<string, OperatorDefinition> {\n if (given === undefined || given.length === 0) return NO_EXTENSIONS;\n const out = new Map<string, OperatorDefinition>();\n for (const definition of given) {\n if (!EXTENSION_NAME.test(definition.name)) {\n throw new JqlError(`\"${definition.name}\" cannot name an added operator: the name is $x and a capital, such as \"$xCidr\", so a query that needs more than standard JQL says so`, \"operators\");\n }\n if (out.has(definition.name)) throw new JqlError(`\"${definition.name}\" is given twice, and the two could not both be it`, \"operators\");\n if (typeof definition.compile !== \"function\") throw new JqlError(`\"${definition.name}\" has no compile function, so there is nothing for it to do`, \"operators\");\n out.set(definition.name, definition);\n }\n return out;\n}\n\n/* ------------------------------------------------------------------------------------ */\n\nfunction count(context: Context, at: string): void {\n context.nodes++;\n if (context.nodes > context.limits.maxNodes) throw new JqlError(`the query holds more than ${context.limits.maxNodes} fields and operators`, at);\n}\n\nfunction join(at: string, key: string): string {\n return at === \"\" ? key : `${at}.${key}`;\n}\n\nfunction compileQuery(query: unknown, context: Context, at: string, depth: number): Compiled {\n if (depth > context.limits.maxDepth) throw new JqlError(`the query nests deeper than ${context.limits.maxDepth} levels`, at);\n if (!isPlainObject(query)) throw new JqlError(`a query is an object, not ${describe(query)}`, at);\n const parts: Compiled[] = [];\n let self: Record<string, unknown> | undefined;\n for (const key in query) {\n const value = query[key];\n const here = join(at, key);\n if (value === undefined) {\n throw new JqlError(\"the value is undefined; JSON has no undefined, and a condition on nothing would match everything\", here);\n }\n count(context, here);\n if (!key.startsWith(\"$\")) {\n parts.push(compileField(resolveField(key, context, here), value, context, here, depth));\n continue;\n }\n permit(key, context, here);\n switch (key) {\n case \"$and\":\n parts.push(allOf(queryList(value, context, here, depth)));\n break;\n case \"$or\":\n parts.push(anyOf(queryList(value, context, here, depth)));\n break;\n case \"$nor\":\n parts.push(negate(anyOf(queryList(value, context, here, depth))));\n break;\n case \"$not\":\n parts.push(negate(compileQuery(value, context, here, depth + 1)));\n break;\n case \"$text\":\n parts.push(compileText(value, context, here));\n break;\n case \"$comment\":\n if (typeof value !== \"string\") throw new JqlError(`a comment is a string, not ${describe(value)}`, here);\n break;\n default:\n if (!FIELD_OPERATOR_SET.has(key)) throw new JqlError(`\"${key}\" is not an operator${didYouMean(key, EVERY_OPERATOR)}`, here);\n // A field operator at the top of a query is a condition on the item itself, which\n // is what lets `[3, 8, 1].jqlFilter({ $gt: 2 })` work on an array of numbers.\n self ??= {};\n self[key] = value;\n }\n }\n if (self !== undefined) parts.push(compileCondition(SELF, self, context, at, depth));\n return allOf(parts);\n}\n\nfunction queryList(value: unknown, context: Context, at: string, depth: number): Compiled[] {\n if (!Array.isArray(value)) throw new JqlError(`takes a list of queries, not ${describe(value)}`, at);\n return value.map((item, index) => compileQuery(item, context, `${at}[${index}]`, depth + 1));\n}\n\n/* ------------------------------------------------------------------------------------ */\n/* Fields */\n/* ------------------------------------------------------------------------------------ */\n\nconst SELF: Field = { read: readSelf, probe: undefined, reach: (document, test) => test(document), key: undefined, cost: 0 };\n\n/**\n * What a field name reaches: a vocabulary field, a vocabulary field followed by a path into\n * it, or a plain path.\n */\nfunction resolveField(name: string, context: Context, at: string): Field {\n const vocabulary = context.vocabulary;\n if (vocabulary !== undefined) {\n const direct = vocabulary.lookup.get(name.toLowerCase());\n if (direct !== undefined) return fieldOf(direct, [], at);\n const dot = name.indexOf(\".\");\n if (dot > 0) {\n const head = vocabulary.lookup.get(name.slice(0, dot).toLowerCase());\n if (head !== undefined) {\n const rest = splitPath(name.slice(dot + 1));\n if (typeof rest === \"string\") throw new JqlError(rest, at);\n return fieldOf(head, rest, at);\n }\n }\n if (vocabulary.strict) throw new JqlError(`\"${name}\" is not a field here${didYouMean(name, vocabulary.names)}`, at);\n }\n const keys = splitPath(name);\n if (typeof keys === \"string\") throw new JqlError(keys, at);\n return pathField(keys);\n}\n\nfunction fieldOf(field: VocabularyField, rest: readonly string[], at: string): Field {\n if (field.get !== undefined) {\n const get = field.get as Read;\n if (rest.length === 0) return { read: get, probe: undefined, reach: (document, test) => test(get(document)), key: undefined, cost: 3 };\n return { read: undefined, probe: probeFrom(get, rest), reach: reachFrom(get, rest), key: undefined, cost: 3 + rest.length };\n }\n const keys = splitPath(field.path);\n if (typeof keys === \"string\") throw new JqlError(keys, at);\n return pathField([...keys, ...rest]);\n}\n\nfunction pathField(keys: readonly string[]): Field {\n // Even one segment can reach several values: an item that is itself an array is seen\n // through, exactly as an array met further down a path is. So a single key is probed like\n // any other path — quickly, and with the fan-out behind it when the probe meets an array.\n if (keys.length === 1) {\n const key = keys[0] as string;\n return { read: undefined, probe: probePath(keys), reach: reachPath(keys), key, cost: 0 };\n }\n return { read: undefined, probe: probePath(keys), reach: reachPath(keys), key: undefined, cost: keys.length };\n}\n\n/** `{ field: literal }`, `{ field: { $field: … } }`, or `{ field: { $op: … } }`. */\nfunction compileField(field: Field, value: unknown, context: Context, at: string, depth: number): Compiled {\n // A reference is a value to compare with, like a date literal, rather than a condition.\n if (isFieldReference(value)) {\n permit(\"$field\", context, at);\n permit(\"$eq\", context, at);\n return compareFields(field, \"$eq\", value.$field, false, context, at);\n }\n if (isPlainObject(value) && !isDateLiteral(value)) {\n let operators = 0;\n let names = 0;\n // A value written plainly still asks for equality, so it is gated as `$eq` is.\n for (const key in value) {\n if (key.startsWith(\"$\")) operators++;\n else names++;\n }\n if (operators > 0 && names > 0) {\n throw new JqlError(\"mixes operators with field names; an object here is either a condition ({ $gt: 1 }) or a value to compare with ({ a: 1 }), not both\", at);\n }\n if (operators > 0) return compileCondition(field, value, context, at, depth + 1);\n }\n permit(\"$eq\", context, at);\n return equality(field, value, false, at, context.now);\n}\n\n/* ------------------------------------------------------------------------------------ */\n/* Conditions */\n/* ------------------------------------------------------------------------------------ */\n\n/** One operator of a condition, as a test on the field's value. */\ninterface ValueTest {\n readonly test: Test;\n readonly cost: number;\n readonly negated: boolean;\n /** The test before it was made to look into arrays, when it was; lets a lone operator inline that loop. */\n readonly any: Test | undefined;\n}\n\n/**\n * Every operator of one condition object.\n *\n * On a field with a single value — a plain property, or a path that meets no array — the\n * operators are fused into one test over one read: `{ age: { $gte: 30, $lt: 50 } }` reads\n * `age` once and compares twice. That fusion is only sound when the field has one value.\n * On a path that fans out over an array each operator has to be tested separately, because\n * \"some element is at least 30 and some element is under 50\" is what the language says\n * there, and one element satisfying both is `$elemMatch`.\n */\nfunction compileCondition(field: Field, condition: Record<string, unknown>, context: Context, at: string, depth: number): Compiled {\n const { values, whole } = conditionParts(field, condition, context, at, depth);\n return combine(field, values, whole);\n}\n\n/** The value tests and the document-level tests of one condition, as a single predicate. */\nfunction combine(field: Field, values: readonly ValueTest[], whole: readonly Compiled[]): Compiled {\n const parts = [...whole];\n if (values.length > 0) {\n const cost = values.reduce((sum, value) => sum + value.cost, 0);\n if (field.read !== undefined) {\n const only = values.length === 1 ? (values[0] as ValueTest) : undefined;\n parts.push(only !== undefined && only.any !== undefined ? holdsAny(field, only.any, only.negated, cost) : holds(field, allOfValues(values), cost));\n } else {\n const separate = allOf(values.map((value) => (value.negated ? negate(holds(field, value.test, value.cost)) : holds(field, value.test, value.cost))));\n const probe = field.probe;\n if (probe === undefined) parts.push(separate);\n else {\n // One value, fused; an array on the way, each operator on its own.\n const fused = allOfValues(values);\n const fallback = separate.test;\n parts.push({ test: (document) => {\n const value = probe(document);\n return value === FANOUT ? fallback(document) : fused(value);\n }, cost: separate.cost });\n }\n }\n }\n return allOf(parts);\n}\n\nfunction conditionParts(field: Field, condition: Record<string, unknown>, context: Context, at: string, depth: number): { values: ValueTest[]; whole: Compiled[] } {\n if (depth > context.limits.maxDepth) throw new JqlError(`the query nests deeper than ${context.limits.maxDepth} levels`, at);\n let flags = \"\";\n if (condition.$options !== undefined) {\n flags = parseOptions(condition.$options, join(at, \"$options\"));\n const usesCase = Object.keys(condition).some((key) => CASE_AWARE.has(key));\n if (!usesCase) throw new JqlError(\"$options has nothing to apply to: it changes $regex and the equality and string operators beside it\", join(at, \"$options\"));\n if (/[msu]/.test(flags) && condition.$regex === undefined) throw new JqlError(`the flags \"${flags.replace(\"i\", \"\")}\" only mean something to $regex, and there is none here`, join(at, \"$options\"));\n }\n const ignoreCase = flags.includes(\"i\");\n const values: ValueTest[] = [];\n const whole: Compiled[] = [];\n const add = (test: Test, cost: number, negated = false): void => {\n values.push({ test, cost, negated, any: undefined });\n };\n const addAny = (test: Test, cost: number, negated = false): void => {\n values.push({ test: elementwise(test), cost, negated, any: test });\n };\n for (const key in condition) {\n const operand = condition[key];\n const here = join(at, key);\n if (operand === undefined) throw new JqlError(\"the value is undefined; JSON has no undefined, and a condition on nothing would match everything\", here);\n count(context, here);\n permit(key, context, here);\n switch (key) {\n case \"$options\":\n break;\n case \"$eq\":\n case \"$ne\": {\n const negated = key === \"$ne\";\n const reference = referencePath(operand, here);\n if (reference !== undefined) {\n permit(\"$field\", context, here);\n whole.push(compareFields(field, \"$eq\", reference, negated, context, here));\n break;\n }\n add(equalsValue(operand, ignoreCase, here, context.now), operand !== null && typeof operand === \"object\" ? 3 : 0, negated);\n break;\n }\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\": {\n const reference = referencePath(operand, here);\n if (reference !== undefined) {\n permit(\"$field\", context, here);\n whole.push(compareFields(field, key, reference, false, context, here));\n break;\n }\n addAny(orderTest(key, operand, here, context.now), 1);\n }\n break;\n case \"$in\":\n addAny(inTest(operand, ignoreCase, here, context.now), 1);\n break;\n case \"$nin\":\n addAny(inTest(operand, ignoreCase, here, context.now), 1, true);\n break;\n case \"$exists\":\n if (typeof operand !== \"boolean\") throw new JqlError(`takes true or false, not ${describe(operand)}`, here);\n add(isPresent, 0, !operand);\n break;\n case \"$type\":\n addAny(typeTest(operand, here), 1);\n break;\n case \"$contains\":\n case \"$startsWith\":\n case \"$endsWith\":\n case \"$word\":\n case \"$glob\":\n addAny(stringTest(key, operand, ignoreCase, here, context.limits.maxGlobLength), key === \"$word\" || key === \"$glob\" ? 4 : 2);\n break;\n case \"$regex\":\n addAny(regexTest(operand, flags, context.limits, here), 5);\n break;\n case \"$mod\":\n addAny(modTest(operand, here), 1);\n break;\n case \"$size\":\n add(sizeTest(operand, context, here, depth, \"array\"), 1);\n break;\n case \"$length\":\n add(sizeTest(operand, context, here, depth, \"anything with a length\"), 1);\n break;\n case \"$all\":\n add(allTest(operand, ignoreCase, here, context.now), 4);\n break;\n case \"$elemMatch\": {\n if (!isPlainObject(operand)) throw new JqlError(`takes a query for one element, not ${describe(operand)}`, here);\n const element = compileQuery(operand, context, here, depth + 1);\n const test = element.test;\n add((value) => {\n if (!Array.isArray(value)) return false;\n for (let i = 0; i < value.length; i++) if (test(value[i])) return true;\n return false;\n }, 4 + element.cost);\n break;\n }\n case \"$not\": {\n if (!isPlainObject(operand) || isDateLiteral(operand) || !Object.keys(operand).every((name) => name.startsWith(\"$\"))) {\n throw new JqlError(`takes a condition such as { \"$gt\": 5 }, not ${describe(operand)}; to negate a value, use $ne`, here);\n }\n const inner = conditionParts(field, operand, context, here, depth + 1);\n // Only when every part of it is a test on the value can the negation be one too.\n // A `$not` holding something that needs the whole document — a `{ \"$field\": … }`\n // reference — used to have that part quietly left out of the negation, so\n // `{ a: { $not: { $exists: false, $eq: { $field: \"b\" } } } }` was answered without\n // ever looking at `b`: a query that reads as restrictive and was not.\n if (field.read !== undefined && inner.whole.length === 0) {\n add(allOfValues(inner.values), inner.values.reduce((sum, value) => sum + value.cost, 0), true);\n break;\n }\n whole.push(negate(combine(field, inner.values, inner.whole)));\n break;\n }\n default: {\n const extension = context.operators.get(key);\n if (extension !== undefined) {\n const test = extension.compile(operand, here);\n if (typeof test !== \"function\") throw new JqlError(`\"${key}\" did not build a test, so there is nothing to run`, here);\n const cost = extension.cost ?? 4;\n if (extension.elementwise === false) add(test, cost);\n else addAny(test, cost);\n break;\n }\n const reason = QUERY_OPERATORS.includes(key)\n ? `\"${key}\" combines whole queries, so it belongs beside field names rather than inside a field's condition`\n : EXTENSION_NAME.test(key)\n ? `\"${key}\" is an added operator, and this query was compiled without it; pass it in \\`operators\\``\n : `\"${key}\" is not an operator${didYouMean(key, [...FIELD_OPERATORS, ...context.operators.keys()])}`;\n throw new JqlError(reason, here);\n }\n }\n }\n return { values, whole };\n}\n\n/** Every value test, cheapest first, with negation applied. */\nfunction allOfValues(values: readonly ValueTest[]): Test {\n const tests = [...values].sort((a, b) => a.cost - b.cost).map(({ test, negated }): Test => (negated ? (value) => !test(value) : test));\n if (tests.length === 0) return () => true;\n if (tests.length === 1) return tests[0] as Test;\n if (tests.length === 2) {\n const [a, b] = tests as [Test, Test];\n return (value) => a(value) && b(value);\n }\n return (value) => {\n for (let i = 0; i < tests.length; i++) if (!(tests[i] as Test)(value)) return false;\n return true;\n };\n}\n\nconst isPresent: Test = (value) => value !== undefined;\n\n/**\n * A test that also holds when it holds for any element of an array value.\n *\n * The whole array is tried first, so `{ tags: [\"a\", \"b\"] }` can match the array exactly\n * and `{ tags: \"a\" }` can match one of its elements.\n */\nfunction elementwise(test: Test): Test {\n return (value) => {\n if (test(value)) return true;\n if (!Array.isArray(value)) return false;\n for (let i = 0; i < value.length; i++) if (test(value[i])) return true;\n return false;\n };\n}\n\n/**\n * Applies a value test to whatever the field reaches.\n *\n * A plain property is read inline rather than through its accessor: one call per document\n * instead of two, which on a filter over a large array is most of the engine's own cost.\n */\nfunction holds(field: Field, test: Test, cost: number): Compiled {\n const key = field.key;\n if (key !== undefined) {\n const reach = field.reach;\n const plain = !needsGuard(key);\n return {\n test: (document) => {\n if (document === null || typeof document !== \"object\") return test(undefined);\n if (Array.isArray(document)) return reach(document, test);\n return test(plain && (document as { __proto__?: unknown }).__proto__ === PLAIN ? (document as Record<string, unknown>)[key] : readOwn(document, key));\n },\n cost: field.cost + cost,\n };\n }\n const read = field.read;\n // A condition on the item itself — what `$size` and `$length` compile their inner\n // condition against — is already a test on the value: wrapping it would call the identity\n // once per document to arrive back where it started.\n if (read === readSelf) return { test, cost: field.cost + cost };\n if (read !== undefined) return { test: (document) => test(read(document)), cost: field.cost + cost };\n const reach = field.reach;\n const probe = field.probe;\n if (probe !== undefined) {\n return {\n test: (document) => {\n const value = probe(document);\n return value === FANOUT ? reach(document, test) : test(value);\n },\n cost: field.cost + cost,\n };\n }\n return { test: (document) => reach(document, test), cost: field.cost + cost };\n}\n\n/**\n * A lone operator on a single-valued field, with the look into arrays written inline, so a\n * document costs one call to the operator rather than one to a wrapper and one to it.\n */\nfunction holdsAny(field: Field, test: Test, negated: boolean, cost: number): Compiled {\n const key = field.key;\n if (key === undefined) {\n const read = field.read as Read;\n const single = (value: unknown): boolean => {\n if (test(value)) return true;\n if (!Array.isArray(value)) return false;\n for (let i = 0; i < value.length; i++) if (test(value[i])) return true;\n return false;\n };\n return { test: negated ? (document) => !single(read(document)) : (document) => single(read(document)), cost: field.cost + cost };\n }\n const reach = field.reach;\n const plain = !needsGuard(key);\n const any = (value: unknown): boolean => {\n if (test(value)) return true;\n if (!Array.isArray(value)) return false;\n for (let i = 0; i < value.length; i++) if (test(value[i])) return true;\n return false;\n };\n const hit = (document: unknown): boolean => {\n if (document === null || typeof document !== \"object\") return test(undefined);\n if (Array.isArray(document)) return reach(document, any);\n return any(plain && (document as { __proto__?: unknown }).__proto__ === PLAIN ? (document as Record<string, unknown>)[key] : readOwn(document, key));\n };\n return { test: negated ? (document) => !hit(document) : hit, cost: field.cost + cost };\n}\n\n/** Equality with one literal, looking into arrays. A primitive gets a closure with no inner call. */\nfunction equalsValue(literal: unknown, ignoreCase: boolean, at: string, now: number): Test {\n if (!ignoreCase && (typeof literal === \"string\" || typeof literal === \"number\" || typeof literal === \"boolean\")) {\n checkLiteral(literal, at);\n const wanted = literal;\n // A whole number is also asking about the big integer of the same value (§5.1); every\n // other literal is a single comparison, exactly as before.\n const big = alsoBig(literal);\n if (big !== undefined) return (value) => value === wanted || value === big || (Array.isArray(value) && (value.includes(wanted) || value.includes(big)));\n return (value) => value === wanted || (Array.isArray(value) && value.includes(wanted));\n }\n return elementwise(equalsTest(literal, ignoreCase, at, now));\n}\n\n/**\n * Equality, with the case that dominates real use written out in full.\n *\n * `{ id: 2 }` on a plain property compiles to one closure with the read, the comparison and\n * the array fallback inline: no accessor call, no test call. It is the one query that runs\n * as fast as the loop somebody would have written by hand, because it is that loop.\n */\nfunction equality(field: Field, literal: unknown, ignoreCase: boolean, at: string, now: number): Compiled {\n const key = field.key;\n if (key !== undefined && !ignoreCase && (typeof literal === \"string\" || typeof literal === \"number\" || typeof literal === \"boolean\")) {\n checkLiteral(literal, at);\n const wanted = literal;\n const reach = field.reach;\n const plain = !needsGuard(key);\n const test = equalsValue(literal, false, at, now);\n const big = alsoBig(literal);\n // Two closures rather than one with a branch in it: a whole number also stands for the\n // big integer of the same value, and every other literal must not pay for that — nor\n // compare against an `undefined` standing in for \"there is no such big integer\", which\n // is what a missing field reads as. The read is written out in both, rather than shared\n // through a helper: `{ \"id\": 2 }` takes this path, and a call per document is most of\n // what this closure costs.\n if (big !== undefined) {\n return {\n test: (document) => {\n if (document === null || typeof document !== \"object\") return false;\n if (Array.isArray(document)) return reach(document, test);\n const value = plain && (document as { __proto__?: unknown }).__proto__ === PLAIN ? (document as Record<string, unknown>)[key] : readOwn(document, key);\n return value === wanted || value === big || (Array.isArray(value) && (value.includes(wanted) || value.includes(big)));\n },\n cost: 0,\n };\n }\n return {\n test: (document) => {\n if (document === null || typeof document !== \"object\") return false;\n // An item that is itself an array is seen through, so the walk answers for it.\n if (Array.isArray(document)) return reach(document, test);\n const value = plain && (document as { __proto__?: unknown }).__proto__ === PLAIN ? (document as Record<string, unknown>)[key] : readOwn(document, key);\n return value === wanted || (Array.isArray(value) && value.includes(wanted));\n },\n cost: 0,\n };\n }\n const probe = field.probe;\n if (probe !== undefined && !ignoreCase && (typeof literal === \"string\" || typeof literal === \"number\" || typeof literal === \"boolean\")) {\n checkLiteral(literal, at);\n const wanted = literal;\n const test = equalsValue(literal, false, at, now);\n const reach = field.reach;\n const big = alsoBig(literal);\n if (big !== undefined) {\n return {\n test: (document) => {\n const value = probe(document);\n if (value === wanted || value === big) return true;\n if (value === FANOUT) return reach(document, test);\n return Array.isArray(value) && (value.includes(wanted) || value.includes(big));\n },\n cost: field.cost,\n };\n }\n return {\n test: (document) => {\n const value = probe(document);\n if (value === wanted) return true;\n if (value === FANOUT) return reach(document, test);\n return Array.isArray(value) && value.includes(wanted);\n },\n cost: field.cost,\n };\n }\n return holds(field, equalsValue(literal, ignoreCase, at, now), literal !== null && typeof literal === \"object\" ? 3 : 0);\n}\n\n/**\n * `$size` and `$length`, which differ only in what they will measure.\n *\n * Neither is tried against the elements of an array, unlike the string operators:\n * `{ tags: { $length: 1 } }` would otherwise mean both \"one tag\" and \"a tag one character\n * long\", and nothing in the query would say which. A string's length is counted in UTF-16\n * code units — what a cap on an incoming value is counted in, and what JSON's own escape\n * syntax is defined in.\n */\nfunction sizeTest(operand: unknown, context: Context, at: string, depth: number, measures: \"array\" | \"anything with a length\"): Test {\n const strings = measures !== \"array\";\n let length: (size: number) => boolean;\n if (typeof operand === \"number\") {\n if (!Number.isInteger(operand) || operand < 0) throw new JqlError(`a length is a whole number, not ${operand}`, at);\n length = (size) => size === operand;\n } else if (isPlainObject(operand)) {\n length = compileCondition(SELF, operand, context, at, depth + 1).test;\n } else throw new JqlError(`takes a number or a condition on one, not ${describe(operand)}`, at);\n if (strings) return (value) => (typeof value === \"string\" || Array.isArray(value)) && length(value.length);\n return (value) => Array.isArray(value) && length(value.length);\n}\n\n/**\n * A comparison between two fields of the same item.\n *\n * Both sides are reached the way any path is, so either can fan out over an array, and the\n * comparison holds when **some** pair of values satisfies it — the same \"any of them\" the\n * rest of the language uses. `$ne` is the negation of that: no pair does.\n *\n * Nothing here reads a value as a date. A `{ \"$date\": … }` in a query is the query saying\n * what it means; a reference says only where to look, and the item's own values decide.\n */\nfunction compareFields(field: Field, operator: \"$eq\" | \"$gt\" | \"$gte\" | \"$lt\" | \"$lte\", path: string, negated: boolean, context: Context, at: string): Compiled {\n const other = resolveField(path, context, at);\n // Settled once: the operator is known here, and asking it again per pair of values was\n // most of what a reference cost.\n const compare = comparer(operator);\n const leftRead = field.read;\n const rightRead = other.read;\n let holdsPair: (document: unknown) => boolean;\n if (leftRead !== undefined && rightRead !== undefined) {\n // Both sides are single-valued — a plain property on each — which is what a reference\n // nearly always is. No walk, no callback: two reads and a comparison.\n holdsPair = (document) => eachOf(leftRead(document), (one) => eachOf(rightRead(document), (two) => compare(one, two)));\n } else {\n const left = field.reach;\n const right = other.reach;\n holdsPair = (document) => left(document, (one) => eachOf(one, (a) => right(document, (two) => eachOf(two, (b) => compare(a, b)))));\n }\n return { test: negated ? (document) => !holdsPair(document) : holdsPair, cost: field.cost + other.cost + 4 };\n}\n\n/** One comparison, chosen when the query compiles rather than per pair of values. */\nfunction comparer(operator: \"$eq\" | \"$gt\" | \"$gte\" | \"$lt\" | \"$lte\"): (a: unknown, b: unknown) => boolean {\n if (operator === \"$eq\") return (a, b) => a !== undefined && b !== undefined && valuesEqual(a, b);\n return (a, b) => {\n if (a === undefined || b === undefined) return false;\n const order = orderOf(a, b);\n if (order === undefined) return false;\n switch (operator) {\n case \"$gt\":\n return order > 0;\n case \"$gte\":\n return order >= 0;\n case \"$lt\":\n return order < 0;\n default:\n return order <= 0;\n }\n };\n}\n\n/**\n * The path in a `{ \"$field\": … }` reference, or `undefined` when the operand is not one.\n *\n * A malformed reference is refused here rather than falling through to \"compares with a\n * number, a string or a date, not an object\", which is a true sentence that tells somebody\n * who wrote `{ \"$field\": 5 }` nothing about what they got wrong.\n */\nfunction referencePath(operand: unknown, at: string): string | undefined {\n if (!isPlainObject(operand) || !(\"$field\" in operand)) return undefined;\n if (typeof operand.$field !== \"string\") throw new JqlError(`a {\"$field\": …} reference takes the path as a string, not ${describe(operand.$field)}`, at);\n const beside = Object.keys(operand).filter((key) => key !== \"$field\");\n if (beside.length > 0) throw new JqlError(`a {\"$field\": …} reference holds nothing but the path, and \"${beside[0]}\" is beside it`, at);\n return operand.$field;\n}\n\n/** A value, and then each of its elements when it is an array. */\nfunction eachOf(value: unknown, test: (item: unknown) => boolean): boolean {\n if (test(value)) return true;\n if (!Array.isArray(value)) return false;\n for (let i = 0; i < value.length; i++) if (test(value[i])) return true;\n return false;\n}\n\n/* ------------------------------------------------------------------------------------ */\n/* Free text */\n/* ------------------------------------------------------------------------------------ */\n\nfunction compileText(value: unknown, context: Context, at: string): Compiled {\n let search: unknown;\n let fields: unknown;\n let caseSensitive: unknown = false;\n if (typeof value === \"string\") search = value;\n else if (isPlainObject(value)) {\n for (const key in value) {\n if (key !== \"$search\" && key !== \"$fields\" && key !== \"$caseSensitive\") {\n throw new JqlError(`\"${key}\" is not part of a text search ($search, $fields, $caseSensitive)${didYouMean(key, [\"$search\", \"$fields\", \"$caseSensitive\"])}`, join(at, key));\n }\n }\n search = value.$search;\n fields = value.$fields;\n // Read as written, not defaulted: `?? false` turned an explicit `null` into \"no\", and\n // `?? vocabulary.text` turned `$fields: null` into a search of the whole item — a\n // narrower question silently becoming a wider one.\n caseSensitive = \"$caseSensitive\" in value ? value.$caseSensitive : false;\n } else throw new JqlError(`takes a phrase or { \"$search\": … }, not ${describe(value)}`, at);\n if (typeof search !== \"string\") throw new JqlError(`the phrase is a string, not ${describe(search)}`, join(at, \"$search\"));\n if (typeof caseSensitive !== \"boolean\") throw new JqlError(`takes true or false, not ${describe(caseSensitive)}`, join(at, \"$caseSensitive\"));\n\n // The fields are resolved before the phrase is read, because whether a query is a good one\n // cannot depend on how much of it somebody has typed. An empty phrase returned \"matches\n // everything\" first, so `{ \"$search\": \"\", \"$fields\": 42 }` compiled, and a dashboard that\n // validated its saved filter while the box was empty was told it was fine — until the\n // first letter, when the same filter was refused.\n const names = fields === undefined ? context.vocabulary?.text : fields;\n const reaches = names === undefined ? undefined : textFields(names, context, at);\n\n const needle = caseSensitive ? search : search.toLowerCase();\n // An empty search box is a question nobody has asked yet, and the answer to that is\n // everything — the same as an empty query.\n if (needle === \"\") return ALWAYS;\n const found: (text: string) => boolean = caseSensitive ? (text) => text.includes(needle) : (text) => text.toLowerCase().includes(needle);\n // Numbers are searched only when the phrase could be part of one. Formatting every\n // number in every document to look for a word with no digits in it is pure cost.\n const numeric = /\\d/.test(needle);\n const maxDepth = context.limits.maxTextDepth;\n const inValue: Test = (item) => containsText(item, found, numeric, maxDepth);\n\n if (reaches === undefined) return { test: inValue, cost: 20 };\n return {\n test: (document) => {\n for (let i = 0; i < reaches.length; i++) if ((reaches[i] as Reach)(document, inValue)) return true;\n return false;\n },\n cost: 6 + reaches.length * 2,\n };\n}\n\n/** The fields a text search looks in, as walks. Refuses a list that could never name any. */\nfunction textFields(names: unknown, context: Context, at: string): Reach[] {\n if (!Array.isArray(names) || names.length === 0) throw new JqlError(`takes a non-empty list of field names, not ${describe(names)}`, join(at, \"$fields\"));\n return names.map((name, index) => {\n if (typeof name !== \"string\") throw new JqlError(`a field name is a string, not ${describe(name)}`, `${join(at, \"$fields\")}[${index}]`);\n return resolveField(name, context, `${join(at, \"$fields\")}[${index}]`).reach;\n });\n}\n\n/**\n * Whether the phrase appears in any string (or number) inside a value.\n *\n * Bounded by depth rather than by tracking what it has visited: a depth cap is free on\n * every document without a cycle, which is almost all of them, and still ends the walk on\n * one that has.\n */\nfunction containsText(value: unknown, found: (text: string) => boolean, numeric: boolean, depth: number): boolean {\n if (typeof value === \"string\") return found(value);\n if (typeof value === \"number\" || typeof value === \"bigint\") return numeric && found(String(value));\n if (value === null || typeof value !== \"object\" || depth <= 0 || value instanceof Date) return false;\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) if (containsText(value[i], found, numeric, depth - 1)) return true;\n return false;\n }\n if (value instanceof Map || value instanceof Set) {\n for (const item of value.values()) if (containsText(item, found, numeric, depth - 1)) return true;\n return false;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) if (Object.hasOwn(record, key) && containsText(record[key], found, numeric, depth - 1)) return true;\n return false;\n}\n\n/* ------------------------------------------------------------------------------------ */\n/* Combinators */\n/* ------------------------------------------------------------------------------------ */\n\n/** Every part, cheapest first. Two and three parts get closures of their own rather than a loop. */\nfunction allOf(parts: Compiled[]): Compiled {\n const real = parts.filter((part) => part !== ALWAYS);\n if (real.includes(NOTHING)) return NOTHING;\n if (real.length === 0) return ALWAYS;\n if (real.length === 1) return real[0] as Compiled;\n // Stable, so parts of equal cost keep the order they were written in.\n real.sort((a, b) => a.cost - b.cost);\n const cost = real.reduce((sum, part) => sum + part.cost, 0);\n const tests = real.map((part) => part.test);\n if (tests.length === 2) {\n const [a, b] = tests as [Compiled[\"test\"], Compiled[\"test\"]];\n return { test: (document) => a(document) && b(document), cost };\n }\n if (tests.length === 3) {\n const [a, b, c] = tests as [Compiled[\"test\"], Compiled[\"test\"], Compiled[\"test\"]];\n return { test: (document) => a(document) && b(document) && c(document), cost };\n }\n return {\n test: (document) => {\n for (let i = 0; i < tests.length; i++) if (!(tests[i] as Compiled[\"test\"])(document)) return false;\n return true;\n },\n cost,\n };\n}\n\n/** Any part, cheapest first. An empty list matches nothing, as an empty `$in` does. */\nfunction anyOf(parts: Compiled[]): Compiled {\n const real = parts.filter((part) => part !== NOTHING);\n if (real.includes(ALWAYS)) return ALWAYS;\n if (real.length === 0) return NOTHING;\n if (real.length === 1) return real[0] as Compiled;\n real.sort((a, b) => a.cost - b.cost);\n const cost = real.reduce((sum, part) => sum + part.cost, 0);\n const tests = real.map((part) => part.test);\n if (tests.length === 2) {\n const [a, b] = tests as [Compiled[\"test\"], Compiled[\"test\"]];\n return { test: (document) => a(document) || b(document), cost };\n }\n return {\n test: (document) => {\n for (let i = 0; i < tests.length; i++) if ((tests[i] as Compiled[\"test\"])(document)) return true;\n return false;\n },\n cost,\n };\n}\n\nfunction negate(part: Compiled): Compiled {\n if (part === ALWAYS) return NOTHING;\n if (part === NOTHING) return ALWAYS;\n const test = part.test;\n return { test: (document) => !test(document), cost: part.cost };\n}\n\n","/**\n * Writing a field onto a result object.\n *\n * `target[key] = value` looks harmless until the key is `__proto__`. Assignment goes\n * through the setter inherited from `Object.prototype`, which *replaces the object's\n * prototype* instead of adding a property — so the field the caller asked for is missing\n * and the object answers to names nobody put on it.\n *\n * It is reachable from data rather than from code: `JSON.parse('{\"__proto__\": …}')` makes\n * an own `__proto__` property, so any document read from a file, a request body or a store\n * can carry one. Projecting such a document used to lose that field and hand back a result\n * whose prototype was whatever the document said, which the projection's own test could not\n * see because the property it was looking for was genuinely there — on the prototype.\n *\n * Defining the property puts it where it was meant to go. Every other key takes the plain\n * assignment, so the guard costs one comparison on the path that builds results.\n */\nexport function setField(target: Record<string, unknown>, key: string, value: unknown): void {\n if (key === \"__proto__\") {\n Object.defineProperty(target, key, { value, writable: true, enumerable: true, configurable: true });\n return;\n }\n target[key] = value;\n}\n","import { type CompileOptions, compile } from \"./core.js\";\nimport { setField } from \"./internal/record.js\";\nimport type { Matcher, QueryLike, Source } from \"./types.js\";\n\n/**\n * Running a query over a collection.\n *\n * Every helper takes anything that holds items: an array, an array-like (a typed array,\n * `arguments`, a `NodeList`), any iterable (a `Set`, a generator), or a `Map` — which is\n * read by value, because a query about \"the user whose name is Ada\" is a question about\n * the users, not about the keys they happen to be filed under. `filterMap` and\n * `filterRecord` keep the keys for the times they matter.\n *\n * Arrays and array-likes are walked with an index rather than an iterator: the iterator\n * protocol allocates a result object per step, and on the collection sizes this library\n * is meant for, that allocation is most of the cost of the walk.\n */\n\ntype Items<T> = Source<T> | ReadonlyMap<unknown, T>;\n\n/** Calls `visit` for each item until it returns `true`. Returns the index it stopped at, or -1. */\nfunction walk<T>(source: Items<T>, visit: (item: T) => boolean): number {\n if (Array.isArray(source)) {\n for (let i = 0; i < source.length; i++) if (visit(source[i] as T)) return i;\n return -1;\n }\n if (source instanceof Map) {\n let i = 0;\n for (const item of source.values()) {\n if (visit(item as T)) return i;\n i++;\n }\n return -1;\n }\n if (typeof (source as Iterable<T>)[Symbol.iterator] === \"function\") {\n let i = 0;\n for (const item of source as Iterable<T>) {\n if (visit(item)) return i;\n i++;\n }\n return -1;\n }\n const list = source as ArrayLike<T>;\n for (let i = 0; i < list.length; i++) if (visit(list[i] as T)) return i;\n return -1;\n}\n\n/** The first item that matches, or `undefined`. Stops at the first match. */\nexport function find<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): V | undefined;\nexport function find<T, Extra extends object = {}>(source: Source<T>, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): T | undefined;\nexport function find<T>(source: Items<T>, query: QueryLike<T, object>, options?: CompileOptions<object>): T | undefined {\n const test = compile(query, options);\n let found: T | undefined;\n walk(source, (item) => {\n if (!test(item)) return false;\n found = item;\n return true;\n });\n return found;\n}\n\n/** The position of the first item that matches, or -1. For a `Map`, the position in insertion order. */\nexport function findIndex<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): number;\nexport function findIndex<T, Extra extends object = {}>(source: Source<T>, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): number;\nexport function findIndex<T>(source: Items<T>, query: QueryLike<T, object>, options?: CompileOptions<object>): number {\n return walk(source, compile(query, options));\n}\n\n/** Every item that matches, in order, as a new array. */\nexport function filter<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): V[];\nexport function filter<T, Extra extends object = {}>(source: Source<T>, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): T[];\nexport function filter<T>(source: Items<T>, query: QueryLike<T, object>, options?: CompileOptions<object>): T[] {\n const test = compile(query, options);\n const out: T[] = [];\n walk(source, (item) => {\n if (test(item)) out.push(item);\n return false;\n });\n return out;\n}\n\n/** How many items match. Counts in place rather than building the list it would count. */\nexport function count<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): number;\nexport function count<T, Extra extends object = {}>(source: Source<T>, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): number;\nexport function count<T>(source: Items<T>, query: QueryLike<T, object>, options?: CompileOptions<object>): number {\n const test = compile(query, options);\n let total = 0;\n walk(source, (item) => {\n if (test(item)) total++;\n return false;\n });\n return total;\n}\n\n/** Whether any item matches. Stops at the first. */\nexport function some<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): boolean;\nexport function some<T, Extra extends object = {}>(source: Source<T>, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): boolean;\nexport function some<T>(source: Items<T>, query: QueryLike<T, object>, options?: CompileOptions<object>): boolean {\n return walk(source, compile(query, options)) !== -1;\n}\n\n/** Whether every item matches. True for an empty collection. Stops at the first that does not. */\nexport function every<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): boolean;\nexport function every<T, Extra extends object = {}>(source: Source<T>, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): boolean;\nexport function every<T>(source: Items<T>, query: QueryLike<T, object>, options?: CompileOptions<object>): boolean {\n const test = compile(query, options);\n return walk(source, (item) => !test(item)) === -1;\n}\n\n/** The matches and the rest, in one pass. */\nexport function partition<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): [V[], V[]];\nexport function partition<T, Extra extends object = {}>(source: Source<T>, query: QueryLike<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): [T[], T[]];\nexport function partition<T>(source: Items<T>, query: QueryLike<T, object>, options?: CompileOptions<object>): [T[], T[]] {\n const test = compile(query, options);\n const yes: T[] = [];\n const no: T[] = [];\n walk(source, (item) => {\n (test(item) ? yes : no).push(item);\n return false;\n });\n return [yes, no];\n}\n\n/** The entries of a `Map` whose value matches, as a new `Map` with the same keys. */\nexport function filterMap<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): Map<K, V> {\n const test: Matcher<V> = compile(query, options);\n const out = new Map<K, V>();\n for (const [key, value] of source) if (test(value)) out.set(key, value);\n return out;\n}\n\n/**\n * The properties of a plain object whose value matches, as a new object.\n *\n * Own enumerable properties only — the same ones `Object.entries` sees.\n */\nexport function filterRecord<V, Extra extends object = {}>(source: Readonly<Record<string, V>>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): Record<string, V> {\n const test: Matcher<V> = compile(query, options);\n const out: Record<string, V> = {};\n for (const key of Object.keys(source)) {\n const value = source[key] as V;\n if (test(value)) setField(out as Record<string, unknown>, key, value);\n }\n return out;\n}\n\n/** The first value of a plain object that matches, with its key. */\nexport function findEntry<V, Extra extends object = {}>(source: Readonly<Record<string, V>>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): [string, V] | undefined;\nexport function findEntry<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, query: QueryLike<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): [K, V] | undefined;\nexport function findEntry<V>(source: ReadonlyMap<unknown, V> | Readonly<Record<string, V>>, query: QueryLike<V, object>, options?: CompileOptions<object>): [unknown, V] | undefined {\n const test: Matcher<V> = compile(query, options);\n if (source instanceof Map) {\n for (const [key, value] of source) if (test(value)) return [key, value];\n return undefined;\n }\n const record = source as Readonly<Record<string, V>>;\n for (const key of Object.keys(record)) {\n const value = record[key] as V;\n if (test(value)) return [key, value];\n }\n return undefined;\n}\n","/**\n * One total order over every value a document can hold.\n *\n * A sort has to put *something* first when one item's field is a number and another's is\n * a string, or missing. The order is fixed and written down in the specification, so two\n * implementations sort a shared result the same way:\n *\n * missing and null < numbers < strings < objects < booleans < dates\n *\n * Strings compare by UTF-16 code unit, not by locale. A locale-aware sort would put a\n * shared link's rows in a different order for each reader, which is worse than an order\n * that is merely unidiomatic for some of them. Objects compare equal to one another, so\n * their order is the order they arrived in.\n */\n\nfunction rank(value: unknown): number {\n if (value === undefined || value === null) return 0;\n switch (typeof value) {\n case \"number\":\n case \"bigint\":\n return Number.isNaN(value) ? 0 : 1;\n case \"string\":\n return 2;\n case \"boolean\":\n return 4;\n default:\n return value instanceof Date ? 5 : 3;\n }\n}\n\nexport function compareValues(a: unknown, b: unknown): number {\n const ra = rank(a);\n const rb = rank(b);\n if (ra !== rb) return ra - rb;\n switch (ra) {\n case 1:\n case 2:\n return (a as number) < (b as number) ? -1 : (a as number) > (b as number) ? 1 : 0;\n case 4:\n return a === b ? 0 : a ? 1 : -1;\n case 5:\n return (a as Date).getTime() - (b as Date).getTime();\n default:\n return 0;\n }\n}\n\n/**\n * The value an item sorts by, from everything its path reached.\n *\n * A path that reaches an array — or fans out over one — reaches several values. Ascending\n * sorts by the smallest of them and descending by the largest: an order\n * by \"tags\" puts first whatever has the tag that sorts first. Arrays nested past sixteen\n * levels are passed over, so an array that contains itself ends the walk.\n */\nexport function sortValue(values: readonly unknown[], descending: boolean, depth = 0): unknown {\n let best: unknown;\n let first = true;\n for (const value of values) {\n if (Array.isArray(value)) {\n if (value.length === 0 || depth >= 16) continue;\n const inner = sortValue(value, descending, depth + 1);\n if (first || (descending ? compareValues(inner, best) > 0 : compareValues(inner, best) < 0)) best = inner;\n first = false;\n continue;\n }\n if (first || (descending ? compareValues(value, best) > 0 : compareValues(value, best) < 0)) best = value;\n first = false;\n }\n return best;\n}\n","import { type CompileOptions, compile, reachField } from \"./core.js\";\nimport { JqlError } from \"./errors.js\";\nimport { didYouMean } from \"./internal/closest.js\";\nimport { compareValues, sortValue } from \"./internal/order.js\";\nimport { MAX_PATH_SEGMENTS, readOwn, splitPath } from \"./internal/path.js\";\nimport { setField } from \"./internal/record.js\";\nimport { describe, isPlainObject } from \"./internal/values.js\";\nimport type { Reach } from \"./internal/path.js\";\nimport type { FieldName, QueryLike, Request, Source } from \"./types.js\";\nimport { checkVocabulary, type Vocabulary } from \"./vocabulary.js\";\n\n/**\n * A whole request — which items, in which order, which page, which fields — in one pass.\n *\n * Two things make this cheaper than `filter` then `sort` then `slice`:\n *\n * - **Without a sort, it stops early.** The first page of matches is the first\n * `skip + limit` of them, so the walk ends there instead of testing the rest.\n * - **With a sort and a limit, it keeps only the best `skip + limit`**, in a bounded heap,\n * rather than sorting every match to keep a few: O(n log k) instead of O(n log n), and\n * memory for k items rather than all of them. \"The ten slowest requests\" out of a\n * million sorts ten.\n *\n * Sort keys are read once per match, not once per comparison.\n *\n * The sort is stable: items that tie on every key keep the order they arrived in, so\n * paging through a sorted result never shows an item twice or skips one.\n */\n\nconst REQUEST_KEYS = [\"where\", \"sort\", \"skip\", \"limit\", \"fields\", \"omit\"];\n\ninterface SortKey {\n readonly reach: Reach;\n readonly descending: boolean;\n}\n\ninterface Ranked<T> {\n readonly item: T;\n readonly keys: readonly unknown[];\n readonly index: number;\n}\n\ntype Items<T> = Source<T> | ReadonlyMap<unknown, T>;\n\n/**\n * Runs a request. With `fields`, each result is a new object holding only those paths.\n *\n * A `Map` is read by value, like everywhere else in this library, so its overloads come\n * first: a `Map` also satisfies `Iterable<[key, value]>`, and without them the types would\n * describe a request over the pairs while the code ran one over the values.\n */\nexport function search<K, V, Extra extends object = {}>(\n source: ReadonlyMap<K, V>,\n request: Request<V, NoInfer<Extra>> & { readonly fields: readonly FieldName<V, NoInfer<Extra>>[] },\n options?: CompileOptions<Extra>,\n): Record<string, unknown>[];\nexport function search<K, V, Extra extends object = {}>(\n source: ReadonlyMap<K, V>,\n request: Request<V, NoInfer<Extra>> & { readonly omit: readonly FieldName<V, NoInfer<Extra>>[] },\n options?: CompileOptions<Extra>,\n): Partial<V>[];\nexport function search<K, V, Extra extends object = {}>(source: ReadonlyMap<K, V>, request?: Request<V, NoInfer<Extra>>, options?: CompileOptions<Extra>): V[];\nexport function search<T, Extra extends object = {}>(\n source: Items<T>,\n request: Request<T, NoInfer<Extra>> & { readonly fields: readonly FieldName<T, NoInfer<Extra>>[] },\n options?: CompileOptions<Extra>,\n): Record<string, unknown>[];\nexport function search<T, Extra extends object = {}>(\n source: Items<T>,\n request: Request<T, NoInfer<Extra>> & { readonly omit: readonly FieldName<T, NoInfer<Extra>>[] },\n options?: CompileOptions<Extra>,\n): Partial<T>[];\nexport function search<T, Extra extends object = {}>(source: Items<T>, request?: Request<T, NoInfer<Extra>>, options?: CompileOptions<Extra>): T[];\nexport function search<T>(source: Items<T>, request: Request<T, object> = {}, options: CompileOptions<object> = {}): T[] | Record<string, unknown>[] {\n // Through `planRequest`, which is what it is for: the paging, the heap and the projection\n // are one copy, shared with the asynchronous helpers. Written out here as well — which it\n // was — the two were free to drift, and \"the best twenty, skipping forty\" would have meant\n // whatever each of them happened to say.\n const plan = planRequest<T>(request, options);\n const collect = plan.collect();\n const test = plan.test;\n each(source, (item, index) => {\n if (test !== undefined && !test(item)) return false;\n return collect.offer(item, index);\n });\n return plan.shape(collect.finish()) as T[];\n}\n\n/**\n * Everything about a request that does not depend on where the items come from.\n *\n * Pulled out so the asynchronous helpers run the same paging, the same heap and the same\n * projection as the synchronous ones. Two copies of \"the best twenty, skipping forty\"\n * would be two chances to page differently.\n */\nexport function planRequest<T>(request: Request<T, object>, options: CompileOptions<object>): {\n collect: () => Collector<T>;\n test: ((item: T) => boolean) | undefined;\n shape: (items: T[]) => unknown[];\n} {\n if (!isPlainObject(request)) throw new JqlError(`a request is an object, not ${describe(request)}`);\n for (const key of Object.keys(request)) {\n if (!REQUEST_KEYS.includes(key)) throw new JqlError(`\"${key}\" is not part of a request (${REQUEST_KEYS.join(\", \")})${didYouMean(key, REQUEST_KEYS)}`, key);\n }\n const vocabulary = checkVocabulary(options.vocabulary) as Vocabulary<unknown, object> | undefined;\n const test = request.where === undefined ? undefined : compile(request.where as QueryLike<T, object>, options);\n const skip = count(request.skip, \"skip\") ?? 0;\n const limit = count(request.limit, \"limit\");\n const keys = sortKeys(request.sort, vocabulary);\n const project = request.fields === undefined ? undefined : projector(request.fields, vocabulary);\n const drop = request.omit === undefined ? undefined : redactor(request.omit, vocabulary);\n return {\n collect: () => collector<T>(keys, skip, limit),\n test,\n shape: (items) => {\n const projected = project === undefined ? items : items.map(project);\n return drop === undefined ? projected : projected.map(drop);\n },\n };\n}\n\n/** Gathers the page as items arrive. `offer` returns true once nothing further can change the answer. */\nexport interface Collector<T> {\n offer(item: T, index: number): boolean;\n finish(): T[];\n}\n\nfunction collector<T>(keys: readonly SortKey[], skip: number, limit: number | undefined): Collector<T> {\n return keys.length === 0 ? inOrder<T>(skip, limit) : ranked<T>(keys, skip, limit);\n}\n\nfunction count(value: unknown, name: string): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n throw new JqlError(`is a whole number of items, zero or more, not ${describe(value)}`, name);\n }\n return value;\n}\n\nfunction sortKeys(sort: unknown, vocabulary: Vocabulary<unknown, object> | undefined): SortKey[] {\n if (sort === undefined) return [];\n if (!isPlainObject(sort)) throw new JqlError(`is an object of field names to directions, not ${describe(sort)}`, \"sort\");\n return Object.keys(sort).map((name) => {\n const direction = sort[name];\n const at = `sort.${name}`;\n if (direction !== 1 && direction !== -1 && direction !== \"asc\" && direction !== \"desc\") {\n throw new JqlError(`a direction is 1, -1, \"asc\" or \"desc\", not ${describe(direction)}`, at);\n }\n return { reach: reachField(name, vocabulary, at), descending: direction === -1 || direction === \"desc\" };\n });\n}\n\n/** Calls `visit` with each item and its position until it returns `true`. */\nfunction each<T>(source: Items<T>, visit: (item: T, index: number) => boolean): void {\n if (Array.isArray(source)) {\n for (let i = 0; i < source.length; i++) if (visit(source[i] as T, i)) return;\n return;\n }\n const iterable: Iterable<T> | undefined =\n source instanceof Map ? (source.values() as Iterable<T>) : typeof (source as Iterable<T>)[Symbol.iterator] === \"function\" ? (source as Iterable<T>) : undefined;\n if (iterable === undefined) {\n const list = source as ArrayLike<T>;\n for (let i = 0; i < list.length; i++) if (visit(list[i] as T, i)) return;\n return;\n }\n let i = 0;\n for (const item of iterable) if (visit(item, i++)) return;\n}\n\n/** Without a sort, the page is the first `skip + limit` matches, and the walk can stop there. */\nfunction inOrder<T>(skip: number, limit: number | undefined): Collector<T> {\n const out: T[] = [];\n let passed = 0;\n return {\n offer(item) {\n if (limit === 0) return true;\n if (passed < skip) {\n passed++;\n return false;\n }\n out.push(item);\n return limit !== undefined && out.length >= limit;\n },\n finish: () => out,\n };\n}\n\n/** With a sort and a limit, only the best `skip + limit` are ever held. */\nfunction ranked<T>(keys: readonly SortKey[], skip: number, limit: number | undefined): Collector<T> {\n const compare = (a: Ranked<T>, b: Ranked<T>): number => {\n for (let i = 0; i < keys.length; i++) {\n const order = compareValues(a.keys[i], b.keys[i]);\n if (order !== 0) return (keys[i] as SortKey).descending ? -order : order;\n }\n return a.index - b.index;\n };\n const keep = limit === undefined ? Number.POSITIVE_INFINITY : skip + limit;\n const heap: Ranked<T>[] = [];\n return {\n offer(item, index) {\n if (limit === 0) return true;\n const entry: Ranked<T> = { item, keys: keys.map((key) => keyOf(item, key)), index };\n if (heap.length < keep) {\n heap.push(entry);\n if (keep !== Number.POSITIVE_INFINITY) siftUp(heap, heap.length - 1, compare);\n } else if (compare(entry, heap[0] as Ranked<T>) < 0) {\n heap[0] = entry;\n siftDown(heap, 0, compare);\n }\n return false;\n },\n finish() {\n heap.sort(compare);\n return heap.slice(skip).map((entry) => entry.item);\n },\n };\n}\n\nfunction keyOf(item: unknown, key: SortKey): unknown {\n const values: unknown[] = [];\n key.reach(item, (value) => {\n values.push(value);\n return false;\n });\n return sortValue(values, key.descending);\n}\n\n/* A max-heap under `compare`: the root is the item that would be dropped first. */\n\nfunction siftUp<T>(heap: T[], at: number, compare: (a: T, b: T) => number): void {\n let child = at;\n while (child > 0) {\n const parent = (child - 1) >> 1;\n if (compare(heap[child] as T, heap[parent] as T) <= 0) return;\n [heap[child], heap[parent]] = [heap[parent] as T, heap[child] as T];\n child = parent;\n }\n}\n\nfunction siftDown<T>(heap: T[], at: number, compare: (a: T, b: T) => number): void {\n let parent = at;\n for (;;) {\n const left = parent * 2 + 1;\n const right = left + 1;\n let largest = parent;\n if (left < heap.length && compare(heap[left] as T, heap[largest] as T) > 0) largest = left;\n if (right < heap.length && compare(heap[right] as T, heap[largest] as T) > 0) largest = right;\n if (largest === parent) return;\n [heap[parent], heap[largest]] = [heap[largest] as T, heap[parent] as T];\n parent = largest;\n }\n}\n\n/* ------------------------------------------------------------------------------------ */\n/* Projection */\n/* ------------------------------------------------------------------------------------ */\n\ntype Tree = Map<string, Tree | true>;\n\n/**\n * Keeps the named paths of each item and nothing else.\n *\n * The result has the document's own shape — `address.city` comes back as\n * `{ address: { city } }` — so a caller reads a projected item exactly as it would the\n * whole one. An array on the way is kept as an array of the projected elements. A\n * vocabulary's computed field comes back under its own name.\n */\nfunction projector(fields: unknown, vocabulary: Vocabulary<unknown, object> | undefined): (item: unknown) => Record<string, unknown> {\n if (!Array.isArray(fields)) throw new JqlError(`is a list of field names, not ${describe(fields)}`, \"fields\");\n const tree: Tree = new Map();\n const computed: [string, (item: unknown) => unknown][] = [];\n fields.forEach((name, index) => {\n const at = `fields[${index}]`;\n if (typeof name !== \"string\") throw new JqlError(`a field name is a string, not ${describe(name)}`, at);\n const field = vocabulary?.lookup.get(name.toLowerCase());\n if (field?.get !== undefined) {\n computed.push([field.name, field.get as (item: unknown) => unknown]);\n return;\n }\n const keys = splitPath(field?.path ?? name);\n if (typeof keys === \"string\") throw new JqlError(keys, at);\n // `for`, not `forEach`: skipping a segment has to stop the walk, and a `return` inside\n // the callback only ended that step — leaving the rest of the path attached at the top\n // level, so `fields: [\"a\", \"a.b\"]` also emitted whatever `b` the item had of its own.\n let node = tree;\n for (let position = 0; position < keys.length; position++) {\n const key = keys[position] as string;\n const existing = node.get(key);\n // A whole subtree is already being kept here; anything under it is already included.\n if (existing === true) break;\n if (position === keys.length - 1) {\n // A whole value asked for alongside part of it: the whole wins.\n node.set(key, true);\n break;\n }\n if (existing === undefined) {\n const child: Tree = new Map();\n node.set(key, child);\n node = child;\n } else node = existing;\n }\n });\n return (item) => {\n const out = (pick(item, tree, 0) ?? {}) as Record<string, unknown>;\n for (const [name, get] of computed) setField(out, name, get(item));\n return out;\n };\n}\n\n/**\n * Drops the named paths from each result.\n *\n * A copy, never a change to the item: a request is a question, and a question that edited\n * the store it was asked of would be a very surprising one. Only the objects on the way to\n * a dropped field are copied; everything else is shared with the item, so redacting one\n * field of a large record does not duplicate the record.\n */\nfunction redactor(omit: unknown, vocabulary: Vocabulary<unknown, object> | undefined): (item: unknown) => unknown {\n if (!Array.isArray(omit)) throw new JqlError(`is a list of field names, not ${describe(omit)}`, \"omit\");\n const tree: Tree = new Map();\n omit.forEach((name, index) => {\n const at = `omit[${index}]`;\n if (typeof name !== \"string\") throw new JqlError(`a field name is a string, not ${describe(name)}`, at);\n const field = vocabulary?.lookup.get(name.toLowerCase());\n // A computed field has no place in the item, so it is dropped by its own name — which\n // is where `fields` put it.\n const keys = field?.get !== undefined ? [field.name] : splitPath(field?.path ?? name);\n if (typeof keys === \"string\") throw new JqlError(keys, at);\n let node = tree;\n for (let position = 0; position < keys.length; position++) {\n const key = keys[position] as string;\n if (position === keys.length - 1) {\n node.set(key, true);\n break;\n }\n const existing = node.get(key);\n // The whole subtree is already going; nothing under it needs naming.\n if (existing === true) break;\n if (existing === undefined) {\n const child: Tree = new Map();\n node.set(key, child);\n node = child;\n } else node = existing;\n }\n });\n return (item) => without(item, tree, 0);\n}\n\n/**\n * How deep `omit` will walk.\n *\n * Past this it refuses rather than stopping: a redaction that quietly gave up returned the\n * field it was asked to remove, which is the one outcome this must never have. No item\n * anybody stores is five hundred levels deep.\n */\nconst MAX_REDACT_DEPTH = 512;\n\nfunction without(value: unknown, tree: Tree, depth: number): unknown {\n if (depth > MAX_REDACT_DEPTH) {\n throw new JqlError(`an item nests deeper than ${MAX_REDACT_DEPTH} levels, so it cannot be redacted; nothing was dropped from it`, \"omit\");\n }\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) {\n let changed = false;\n const copy = value.map((element) => {\n const kept = without(element, tree, depth + 1);\n if (kept !== element) changed = true;\n return kept;\n });\n return changed ? copy : value;\n }\n if (value instanceof Map) {\n let changed = false;\n const copy = new Map<unknown, unknown>();\n for (const [key, held] of value) {\n const sub = typeof key === \"string\" ? tree.get(key) : undefined;\n if (sub === true) {\n changed = true;\n continue;\n }\n const kept = sub === undefined ? held : without(held, sub, depth + 1);\n if (kept !== held) changed = true;\n copy.set(key, kept);\n }\n return changed ? copy : value;\n }\n const record = value as Record<string, unknown>;\n const keys = Object.keys(record);\n // Nothing here is named at all: hand back the object itself rather than a copy of it.\n if (!keys.some((key) => tree.has(key))) return value;\n const out: Record<string, unknown> = {};\n let changed = false;\n for (const key of keys) {\n const sub = tree.get(key);\n if (sub === true) {\n changed = true;\n continue;\n }\n const held = record[key];\n const kept = sub === undefined ? held : without(held, sub, depth + 1);\n if (kept !== held) changed = true;\n setField(out, key, kept);\n }\n // A path that named something this item does not have has dropped nothing, and an item\n // with nothing dropped is the item: redacting a field absent from half the rows should\n // not copy those rows.\n return changed ? out : value;\n}\n\n/**\n * The named paths of one item, as a new object.\n *\n * The depth it stops at is the longest path there can be, because the tree it walks is made\n * of paths and can be no deeper than the longest of them. It used to stop at sixty-four,\n * which was shorter than a path is allowed to be: a query matched on `a.b.c…` past that\n * depth and the projection quietly left the field out of the result, so the same path\n * meant two different things in one request.\n */\nfunction pick(value: unknown, tree: Tree, depth: number): Record<string, unknown> | undefined {\n if (value === null || typeof value !== \"object\" || depth > MAX_PATH_SEGMENTS) return undefined;\n const out: Record<string, unknown> = {};\n for (const [key, sub] of tree) {\n const found = readOwn(value, key);\n if (found === undefined) continue;\n if (sub === true) setField(out, key, found);\n else if (Array.isArray(found)) setField(out, key, found.map((element) => pick(element, sub, depth + 1)).filter((element) => element !== undefined));\n else {\n const inner = pick(found, sub, depth + 1);\n if (inner !== undefined) setField(out, key, inner);\n }\n }\n return out;\n}\n"]}
|