@querykitjs/core 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,6 +51,50 @@ var QueryKitError = class extends Error {
51
51
  }
52
52
  };
53
53
 
54
+ // src/operators.ts
55
+ var FILTER_OPERATORS = [
56
+ "=",
57
+ "!=",
58
+ ">",
59
+ ">=",
60
+ "<",
61
+ "<=",
62
+ "eq",
63
+ "ne",
64
+ "gt",
65
+ "gte",
66
+ "lt",
67
+ "lte",
68
+ "like",
69
+ "ilike",
70
+ "notLike",
71
+ "contains",
72
+ "startsWith",
73
+ "endsWith",
74
+ "%_%",
75
+ // contains
76
+ "%_",
77
+ // startsWith
78
+ "_%",
79
+ // endsWith
80
+ "in",
81
+ "notIn",
82
+ "between",
83
+ "notBetween",
84
+ "isNull",
85
+ "isNotNull"
86
+ ], TEXT_FILTER_OPERATORS = [
87
+ "like",
88
+ "ilike",
89
+ "notLike",
90
+ "contains",
91
+ "startsWith",
92
+ "endsWith",
93
+ "%_%",
94
+ "%_",
95
+ "_%"
96
+ ];
97
+
54
98
  exports.DEFAULT_LIMIT = DEFAULT_LIMIT;
55
99
  exports.DEFAULT_MAX_CONDITIONS = DEFAULT_MAX_CONDITIONS;
56
100
  exports.DEFAULT_MAX_FILTER_DEPTH = DEFAULT_MAX_FILTER_DEPTH;
@@ -63,10 +107,12 @@ exports.DEFAULT_MAX_SORT_FIELDS = DEFAULT_MAX_SORT_FIELDS;
63
107
  exports.DEFAULT_MAX_STRING_LENGTH = DEFAULT_MAX_STRING_LENGTH;
64
108
  exports.DEFAULT_PER_PAGE = DEFAULT_PER_PAGE;
65
109
  exports.DEFAULT_QUERY_LIMITS = DEFAULT_QUERY_LIMITS;
110
+ exports.FILTER_OPERATORS = FILTER_OPERATORS;
66
111
  exports.QueryKitError = QueryKitError;
67
112
  exports.QueryKitTimeoutError = QueryKitTimeoutError;
113
+ exports.TEXT_FILTER_OPERATORS = TEXT_FILTER_OPERATORS;
68
114
  exports.isRaw = isRaw;
69
115
  exports.raw = raw;
70
116
  exports.resolveLimits = resolveLimits;
71
- //# sourceMappingURL=chunk-VD7XT52J.cjs.map
72
- //# sourceMappingURL=chunk-VD7XT52J.cjs.map
117
+ //# sourceMappingURL=chunk-72KNINHB.cjs.map
118
+ //# sourceMappingURL=chunk-72KNINHB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defaults.ts","../src/raw.ts","../src/errors.ts","../src/operators.ts"],"names":[],"mappings":"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","file":"chunk-72KNINHB.cjs","sourcesContent":["/**\n * Umumiy pagination default'lari — yagona manba. Backend adapter (`createRegistry`\n * options) va frontend (`createQuery` config) shu qiymatlarni fallback sifatida\n * ishlatadi, shuning uchun ular hech qachon bir-biridan farq qilmaydi.\n */\n\n/** Offset (list) sahifa o'lchami default'i. */\nexport const DEFAULT_PER_PAGE = 20;\n\n/** Infinite/cursor `limit` default'i. */\nexport const DEFAULT_LIMIT = 20;\n\n/**\n * `perPage` uchun yuqori chegara — cap'siz paginatsiya DoS yuzasi. Validatsiya\n * (`@querykitjs/zod` factory'lari), backend repositorylari va frontend `createQuery`\n * shu bitta qiymatga tayanadi, shuning uchun ular hech qachon farq qilmaydi.\n */\nexport const DEFAULT_MAX_PER_PAGE = 200;\n\n/** Infinite/cursor `limit` uchun yuqori chegara. Qarang: {@link DEFAULT_MAX_PER_PAGE}. */\nexport const DEFAULT_MAX_LIMIT = 200;\n\n/* ----------------------------- request limits ------------------------------ */\n/* Parse-time size limits for every filter and pagination request. The\n * validators (`@querykitjs/zod`, `@querykitjs/class-validator`) reject a payload\n * past any of them; `@querykitjs/web` refuses to build one past the offset or\n * sort limit. Raise one per schema/DTO with `limits`, never globally. */\n\n/** Longest root-to-leaf path of a filter tree, in nodes: the root is level 1, every `and`/`or`/`not` and the condition itself add one. */\nexport const DEFAULT_MAX_FILTER_DEPTH = 5;\n\n/** Field conditions (leaves) in one filter, across all groups. */\nexport const DEFAULT_MAX_CONDITIONS = 30;\n\n/** Items in one array filter value (`in`, `notIn`, …). */\nexport const DEFAULT_MAX_IN_ITEMS = 200;\n\n/** Characters in one string filter value, also inside an array value. */\nexport const DEFAULT_MAX_STRING_LENGTH = 256;\n\n/** Rows skipped before a page: `(page - 1) × perPage` for offset pagination, `offset` for infinite. Deeper pages need a cursor. */\nexport const DEFAULT_MAX_OFFSET = 10_000;\n\n/** Fields in one `sort` array. */\nexport const DEFAULT_MAX_SORT_FIELDS = 3;\n\n/**\n * Wildcards (`%`, `_`) in one `like` / `ilike` / `notLike` pattern, after a run\n * of `%` counts as one. Each extra wildcard multiplies the matcher's backtracking\n * (`%a%a%a…%b`), on MongoDB's regex engine and on Postgres alike.\n */\nexport const DEFAULT_MAX_LIKE_WILDCARDS = 2;\n\n/** The six request limits, by the option name every package uses. */\nexport interface QueryLimits {\n maxDepth: number;\n maxConditions: number;\n maxInItems: number;\n maxStringLength: number;\n maxOffset: number;\n maxSortFields: number;\n maxLikeWildcards: number;\n}\n\n/** The core defaults as one object. */\nexport const DEFAULT_QUERY_LIMITS: Readonly<QueryLimits> = Object.freeze({\n maxDepth: DEFAULT_MAX_FILTER_DEPTH,\n maxConditions: DEFAULT_MAX_CONDITIONS,\n maxInItems: DEFAULT_MAX_IN_ITEMS,\n maxStringLength: DEFAULT_MAX_STRING_LENGTH,\n maxOffset: DEFAULT_MAX_OFFSET,\n maxSortFields: DEFAULT_MAX_SORT_FIELDS,\n maxLikeWildcards: DEFAULT_MAX_LIKE_WILDCARDS,\n});\n\n/**\n * The defaults with the given limits on top; an `undefined` entry keeps the\n * default. `Infinity` turns a limit off (⚠️ a DoS surface).\n *\n * @example\n * ```ts\n * resolveLimits({ maxInItems: 50 }); // { maxDepth: 5, …, maxInItems: 50, … }\n * ```\n */\nexport function resolveLimits(limits: Partial<QueryLimits> = {}): QueryLimits {\n const resolved = { ...DEFAULT_QUERY_LIMITS };\n for (const name of Object.keys(DEFAULT_QUERY_LIMITS) as (keyof QueryLimits)[]) {\n const value = limits[name];\n if (value !== undefined) resolved[name] = value;\n }\n return resolved;\n}\n","/**\n * The branded raw-filter escape hatch (REQUIREMENTS R19). A driver's own `where`\n * object (Prisma `where`, Mongo filter) is accepted inside a querykit filter only\n * when server code wraps it in `raw(...)`: the brand is a `Symbol`, which no JSON\n * body can carry. An unbranded plain object is refused (`forbidden-key`).\n *\n * ⚠️ A raw node is server code — the `filterable` policy does **not** look inside it.\n * Never build one from request data.\n */\nconst RAW = Symbol.for(\"querykit.raw\");\n\n/**\n * Brand a driver-native filter object so an adapter accepts it as a filter node.\n * The object itself is returned (non-enumerable brand), so the driver receives\n * exactly what you wrote.\n *\n * @example\n * ```ts\n * import { raw } from \"@querykitjs/core\";\n * repo.findAll({ filter: { and: [{ key: \"status\", value: \"active\" }, raw({ posts: { some: { published: true } } })] } });\n * ```\n */\nexport function raw<T extends object>(value: T): T {\n Object.defineProperty(value, RAW, { value: true, enumerable: false });\n return value;\n}\n\n/** Whether a filter node was branded with {@link raw}. */\nexport const isRaw = (node: unknown): boolean => typeof node === \"object\" && node !== null && (node as Record<symbol, unknown>)[RAW] === true;\n","/**\n * querykit xatolari. Backend adapterlari (`drizzle-pg`, `mongoose`) `strict`\n * rejimda shu bitta klassni tashlaydi — ya'ni ikkala backend uchun xatoni\n * ushlash usuli bir xil.\n */\nimport type { SkippedCondition } from \"./types\";\n\n/**\n * `strict` rejimda noto'g'ri so'rov shartida tashlanadi (noma'lum kalit yoki\n * operatorga mos kelmagan qiymat). Backend'da 400 qilib qaytarish uchun:\n *\n * ```ts\n * try {\n * return await usersRepository.findList(params);\n * } catch (err) {\n * if (err instanceof QueryKitError) return c.json({ error: err.message }, 400);\n * throw err;\n * }\n * ```\n */\nexport class QueryKitError extends Error {\n /** Barqaror kod — `instanceof` ishlamaydigan chegaralarda (RPC, worker) tekshirish uchun. */\n readonly code = \"QUERYKIT_INVALID_CONDITION\";\n\n /** Tashlab yuborilgan shart haqida to'liq ma'lumot (hook argumenti bilan bir xil shakl). */\n readonly info: SkippedCondition;\n\n constructor(info: SkippedCondition) {\n super(`querykit: ${info.reason} — \"${info.key}\" (${info.site}) on \"${info.source}\".`);\n this.name = \"QueryKitError\";\n this.info = info;\n }\n}\n\n/**\n * A read ran past its time limit (`maxTimeMS` on MongoDB). Kept apart from\n * {@link QueryKitError}: the request was valid, the database was slow — map it to\n * 503 / 504, not 400.\n */\nexport class QueryKitTimeoutError extends Error {\n /** Stable code for boundaries where `instanceof` does not work. */\n readonly code = \"QUERYKIT_TIMEOUT\";\n\n constructor(\n /** Collection / model name. */\n readonly source: string,\n /** The limit that was hit, in milliseconds. */\n readonly maxTimeMS: number,\n options?: { cause?: unknown },\n ) {\n super(`querykit: a read on \"${source}\" ran past maxTimeMS (${maxTimeMS} ms).`, options);\n this.name = \"QueryKitTimeoutError\";\n }\n}\n","/**\n * Filter operatorlari — yagona runtime manba. `FilterOperator` tipi (`types.ts`)\n * shundan chiqadi; `@querykitjs/zod` shu massivdan zod enum quradi.\n */\nexport const FILTER_OPERATORS = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"eq\",\n \"ne\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\", // contains\n \"%_\", // startsWith\n \"_%\", // endsWith\n \"in\",\n \"notIn\",\n \"between\",\n \"notBetween\",\n \"isNull\",\n \"isNotNull\",\n] as const;\n\n/**\n * Qiymati **text pattern** bo'lgan operatorlar. Backend adapterlari wire qiymatni\n * ustun/path tipiga cast qilishda shularni chetlab o'tadi — aks holda\n * `ilike(dateColumn, \"%2026%\")` ISO string o'rniga `String(Date)` olardi\n * (`\"Mon Jul 28 2026 …\"`). Ro'yxat ikki adapterda divergent bo'lmasligi uchun\n * shu yerda — yagona manba.\n */\nexport const TEXT_FILTER_OPERATORS = [\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\",\n \"%_\",\n \"_%\",\n] as const satisfies readonly (typeof FILTER_OPERATORS)[number][];\n"]}
@@ -49,6 +49,50 @@ var QueryKitError = class extends Error {
49
49
  }
50
50
  };
51
51
 
52
- export { DEFAULT_LIMIT, DEFAULT_MAX_CONDITIONS, DEFAULT_MAX_FILTER_DEPTH, DEFAULT_MAX_IN_ITEMS, DEFAULT_MAX_LIKE_WILDCARDS, DEFAULT_MAX_LIMIT, DEFAULT_MAX_OFFSET, DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_SORT_FIELDS, DEFAULT_MAX_STRING_LENGTH, DEFAULT_PER_PAGE, DEFAULT_QUERY_LIMITS, QueryKitError, QueryKitTimeoutError, isRaw, raw, resolveLimits };
53
- //# sourceMappingURL=chunk-NHNDPIPM.js.map
54
- //# sourceMappingURL=chunk-NHNDPIPM.js.map
52
+ // src/operators.ts
53
+ var FILTER_OPERATORS = [
54
+ "=",
55
+ "!=",
56
+ ">",
57
+ ">=",
58
+ "<",
59
+ "<=",
60
+ "eq",
61
+ "ne",
62
+ "gt",
63
+ "gte",
64
+ "lt",
65
+ "lte",
66
+ "like",
67
+ "ilike",
68
+ "notLike",
69
+ "contains",
70
+ "startsWith",
71
+ "endsWith",
72
+ "%_%",
73
+ // contains
74
+ "%_",
75
+ // startsWith
76
+ "_%",
77
+ // endsWith
78
+ "in",
79
+ "notIn",
80
+ "between",
81
+ "notBetween",
82
+ "isNull",
83
+ "isNotNull"
84
+ ], TEXT_FILTER_OPERATORS = [
85
+ "like",
86
+ "ilike",
87
+ "notLike",
88
+ "contains",
89
+ "startsWith",
90
+ "endsWith",
91
+ "%_%",
92
+ "%_",
93
+ "_%"
94
+ ];
95
+
96
+ export { DEFAULT_LIMIT, DEFAULT_MAX_CONDITIONS, DEFAULT_MAX_FILTER_DEPTH, DEFAULT_MAX_IN_ITEMS, DEFAULT_MAX_LIKE_WILDCARDS, DEFAULT_MAX_LIMIT, DEFAULT_MAX_OFFSET, DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_SORT_FIELDS, DEFAULT_MAX_STRING_LENGTH, DEFAULT_PER_PAGE, DEFAULT_QUERY_LIMITS, FILTER_OPERATORS, QueryKitError, QueryKitTimeoutError, TEXT_FILTER_OPERATORS, isRaw, raw, resolveLimits };
97
+ //# sourceMappingURL=chunk-XEETYJA3.js.map
98
+ //# sourceMappingURL=chunk-XEETYJA3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defaults.ts","../src/raw.ts","../src/errors.ts","../src/operators.ts"],"names":[],"mappings":"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","file":"chunk-XEETYJA3.js","sourcesContent":["/**\n * Umumiy pagination default'lari — yagona manba. Backend adapter (`createRegistry`\n * options) va frontend (`createQuery` config) shu qiymatlarni fallback sifatida\n * ishlatadi, shuning uchun ular hech qachon bir-biridan farq qilmaydi.\n */\n\n/** Offset (list) sahifa o'lchami default'i. */\nexport const DEFAULT_PER_PAGE = 20;\n\n/** Infinite/cursor `limit` default'i. */\nexport const DEFAULT_LIMIT = 20;\n\n/**\n * `perPage` uchun yuqori chegara — cap'siz paginatsiya DoS yuzasi. Validatsiya\n * (`@querykitjs/zod` factory'lari), backend repositorylari va frontend `createQuery`\n * shu bitta qiymatga tayanadi, shuning uchun ular hech qachon farq qilmaydi.\n */\nexport const DEFAULT_MAX_PER_PAGE = 200;\n\n/** Infinite/cursor `limit` uchun yuqori chegara. Qarang: {@link DEFAULT_MAX_PER_PAGE}. */\nexport const DEFAULT_MAX_LIMIT = 200;\n\n/* ----------------------------- request limits ------------------------------ */\n/* Parse-time size limits for every filter and pagination request. The\n * validators (`@querykitjs/zod`, `@querykitjs/class-validator`) reject a payload\n * past any of them; `@querykitjs/web` refuses to build one past the offset or\n * sort limit. Raise one per schema/DTO with `limits`, never globally. */\n\n/** Longest root-to-leaf path of a filter tree, in nodes: the root is level 1, every `and`/`or`/`not` and the condition itself add one. */\nexport const DEFAULT_MAX_FILTER_DEPTH = 5;\n\n/** Field conditions (leaves) in one filter, across all groups. */\nexport const DEFAULT_MAX_CONDITIONS = 30;\n\n/** Items in one array filter value (`in`, `notIn`, …). */\nexport const DEFAULT_MAX_IN_ITEMS = 200;\n\n/** Characters in one string filter value, also inside an array value. */\nexport const DEFAULT_MAX_STRING_LENGTH = 256;\n\n/** Rows skipped before a page: `(page - 1) × perPage` for offset pagination, `offset` for infinite. Deeper pages need a cursor. */\nexport const DEFAULT_MAX_OFFSET = 10_000;\n\n/** Fields in one `sort` array. */\nexport const DEFAULT_MAX_SORT_FIELDS = 3;\n\n/**\n * Wildcards (`%`, `_`) in one `like` / `ilike` / `notLike` pattern, after a run\n * of `%` counts as one. Each extra wildcard multiplies the matcher's backtracking\n * (`%a%a%a…%b`), on MongoDB's regex engine and on Postgres alike.\n */\nexport const DEFAULT_MAX_LIKE_WILDCARDS = 2;\n\n/** The six request limits, by the option name every package uses. */\nexport interface QueryLimits {\n maxDepth: number;\n maxConditions: number;\n maxInItems: number;\n maxStringLength: number;\n maxOffset: number;\n maxSortFields: number;\n maxLikeWildcards: number;\n}\n\n/** The core defaults as one object. */\nexport const DEFAULT_QUERY_LIMITS: Readonly<QueryLimits> = Object.freeze({\n maxDepth: DEFAULT_MAX_FILTER_DEPTH,\n maxConditions: DEFAULT_MAX_CONDITIONS,\n maxInItems: DEFAULT_MAX_IN_ITEMS,\n maxStringLength: DEFAULT_MAX_STRING_LENGTH,\n maxOffset: DEFAULT_MAX_OFFSET,\n maxSortFields: DEFAULT_MAX_SORT_FIELDS,\n maxLikeWildcards: DEFAULT_MAX_LIKE_WILDCARDS,\n});\n\n/**\n * The defaults with the given limits on top; an `undefined` entry keeps the\n * default. `Infinity` turns a limit off (⚠️ a DoS surface).\n *\n * @example\n * ```ts\n * resolveLimits({ maxInItems: 50 }); // { maxDepth: 5, …, maxInItems: 50, … }\n * ```\n */\nexport function resolveLimits(limits: Partial<QueryLimits> = {}): QueryLimits {\n const resolved = { ...DEFAULT_QUERY_LIMITS };\n for (const name of Object.keys(DEFAULT_QUERY_LIMITS) as (keyof QueryLimits)[]) {\n const value = limits[name];\n if (value !== undefined) resolved[name] = value;\n }\n return resolved;\n}\n","/**\n * The branded raw-filter escape hatch (REQUIREMENTS R19). A driver's own `where`\n * object (Prisma `where`, Mongo filter) is accepted inside a querykit filter only\n * when server code wraps it in `raw(...)`: the brand is a `Symbol`, which no JSON\n * body can carry. An unbranded plain object is refused (`forbidden-key`).\n *\n * ⚠️ A raw node is server code — the `filterable` policy does **not** look inside it.\n * Never build one from request data.\n */\nconst RAW = Symbol.for(\"querykit.raw\");\n\n/**\n * Brand a driver-native filter object so an adapter accepts it as a filter node.\n * The object itself is returned (non-enumerable brand), so the driver receives\n * exactly what you wrote.\n *\n * @example\n * ```ts\n * import { raw } from \"@querykitjs/core\";\n * repo.findAll({ filter: { and: [{ key: \"status\", value: \"active\" }, raw({ posts: { some: { published: true } } })] } });\n * ```\n */\nexport function raw<T extends object>(value: T): T {\n Object.defineProperty(value, RAW, { value: true, enumerable: false });\n return value;\n}\n\n/** Whether a filter node was branded with {@link raw}. */\nexport const isRaw = (node: unknown): boolean => typeof node === \"object\" && node !== null && (node as Record<symbol, unknown>)[RAW] === true;\n","/**\n * querykit xatolari. Backend adapterlari (`drizzle-pg`, `mongoose`) `strict`\n * rejimda shu bitta klassni tashlaydi — ya'ni ikkala backend uchun xatoni\n * ushlash usuli bir xil.\n */\nimport type { SkippedCondition } from \"./types\";\n\n/**\n * `strict` rejimda noto'g'ri so'rov shartida tashlanadi (noma'lum kalit yoki\n * operatorga mos kelmagan qiymat). Backend'da 400 qilib qaytarish uchun:\n *\n * ```ts\n * try {\n * return await usersRepository.findList(params);\n * } catch (err) {\n * if (err instanceof QueryKitError) return c.json({ error: err.message }, 400);\n * throw err;\n * }\n * ```\n */\nexport class QueryKitError extends Error {\n /** Barqaror kod — `instanceof` ishlamaydigan chegaralarda (RPC, worker) tekshirish uchun. */\n readonly code = \"QUERYKIT_INVALID_CONDITION\";\n\n /** Tashlab yuborilgan shart haqida to'liq ma'lumot (hook argumenti bilan bir xil shakl). */\n readonly info: SkippedCondition;\n\n constructor(info: SkippedCondition) {\n super(`querykit: ${info.reason} — \"${info.key}\" (${info.site}) on \"${info.source}\".`);\n this.name = \"QueryKitError\";\n this.info = info;\n }\n}\n\n/**\n * A read ran past its time limit (`maxTimeMS` on MongoDB). Kept apart from\n * {@link QueryKitError}: the request was valid, the database was slow — map it to\n * 503 / 504, not 400.\n */\nexport class QueryKitTimeoutError extends Error {\n /** Stable code for boundaries where `instanceof` does not work. */\n readonly code = \"QUERYKIT_TIMEOUT\";\n\n constructor(\n /** Collection / model name. */\n readonly source: string,\n /** The limit that was hit, in milliseconds. */\n readonly maxTimeMS: number,\n options?: { cause?: unknown },\n ) {\n super(`querykit: a read on \"${source}\" ran past maxTimeMS (${maxTimeMS} ms).`, options);\n this.name = \"QueryKitTimeoutError\";\n }\n}\n","/**\n * Filter operatorlari — yagona runtime manba. `FilterOperator` tipi (`types.ts`)\n * shundan chiqadi; `@querykitjs/zod` shu massivdan zod enum quradi.\n */\nexport const FILTER_OPERATORS = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"eq\",\n \"ne\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\", // contains\n \"%_\", // startsWith\n \"_%\", // endsWith\n \"in\",\n \"notIn\",\n \"between\",\n \"notBetween\",\n \"isNull\",\n \"isNotNull\",\n] as const;\n\n/**\n * Qiymati **text pattern** bo'lgan operatorlar. Backend adapterlari wire qiymatni\n * ustun/path tipiga cast qilishda shularni chetlab o'tadi — aks holda\n * `ilike(dateColumn, \"%2026%\")` ISO string o'rniga `String(Date)` olardi\n * (`\"Mon Jul 28 2026 …\"`). Ro'yxat ikki adapterda divergent bo'lmasligi uchun\n * shu yerda — yagona manba.\n */\nexport const TEXT_FILTER_OPERATORS = [\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\",\n \"%_\",\n \"_%\",\n] as const satisfies readonly (typeof FILTER_OPERATORS)[number][];\n"]}
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkVD7XT52J_cjs = require('./chunk-VD7XT52J.cjs');
3
+ var chunk72KNINHB_cjs = require('./chunk-72KNINHB.cjs');
4
4
 
5
5
  // src/filters.ts
6
6
  function field(key, operation, value) {
@@ -38,116 +38,78 @@ function createFilters() {
38
38
  }
39
39
  var f = /* @__PURE__ */ createFilters();
40
40
 
41
- // src/operators.ts
42
- var FILTER_OPERATORS = [
43
- "=",
44
- "!=",
45
- ">",
46
- ">=",
47
- "<",
48
- "<=",
49
- "eq",
50
- "ne",
51
- "gt",
52
- "gte",
53
- "lt",
54
- "lte",
55
- "like",
56
- "ilike",
57
- "notLike",
58
- "contains",
59
- "startsWith",
60
- "endsWith",
61
- "%_%",
62
- // contains
63
- "%_",
64
- // startsWith
65
- "_%",
66
- // endsWith
67
- "in",
68
- "notIn",
69
- "between",
70
- "notBetween",
71
- "isNull",
72
- "isNotNull"
73
- ], TEXT_FILTER_OPERATORS = [
74
- "like",
75
- "ilike",
76
- "notLike",
77
- "contains",
78
- "startsWith",
79
- "endsWith",
80
- "%_%",
81
- "%_",
82
- "_%"
83
- ];
84
-
85
41
  Object.defineProperty(exports, "DEFAULT_LIMIT", {
86
42
  enumerable: true,
87
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_LIMIT; }
43
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_LIMIT; }
88
44
  });
89
45
  Object.defineProperty(exports, "DEFAULT_MAX_CONDITIONS", {
90
46
  enumerable: true,
91
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_CONDITIONS; }
47
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_CONDITIONS; }
92
48
  });
93
49
  Object.defineProperty(exports, "DEFAULT_MAX_FILTER_DEPTH", {
94
50
  enumerable: true,
95
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_FILTER_DEPTH; }
51
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_FILTER_DEPTH; }
96
52
  });
97
53
  Object.defineProperty(exports, "DEFAULT_MAX_IN_ITEMS", {
98
54
  enumerable: true,
99
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_IN_ITEMS; }
55
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_IN_ITEMS; }
100
56
  });
101
57
  Object.defineProperty(exports, "DEFAULT_MAX_LIKE_WILDCARDS", {
102
58
  enumerable: true,
103
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_LIKE_WILDCARDS; }
59
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_LIKE_WILDCARDS; }
104
60
  });
105
61
  Object.defineProperty(exports, "DEFAULT_MAX_LIMIT", {
106
62
  enumerable: true,
107
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_LIMIT; }
63
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_LIMIT; }
108
64
  });
109
65
  Object.defineProperty(exports, "DEFAULT_MAX_OFFSET", {
110
66
  enumerable: true,
111
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_OFFSET; }
67
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_OFFSET; }
112
68
  });
113
69
  Object.defineProperty(exports, "DEFAULT_MAX_PER_PAGE", {
114
70
  enumerable: true,
115
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_PER_PAGE; }
71
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_PER_PAGE; }
116
72
  });
117
73
  Object.defineProperty(exports, "DEFAULT_MAX_SORT_FIELDS", {
118
74
  enumerable: true,
119
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_SORT_FIELDS; }
75
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_SORT_FIELDS; }
120
76
  });
121
77
  Object.defineProperty(exports, "DEFAULT_MAX_STRING_LENGTH", {
122
78
  enumerable: true,
123
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_MAX_STRING_LENGTH; }
79
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_MAX_STRING_LENGTH; }
124
80
  });
125
81
  Object.defineProperty(exports, "DEFAULT_PER_PAGE", {
126
82
  enumerable: true,
127
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_PER_PAGE; }
83
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_PER_PAGE; }
128
84
  });
129
85
  Object.defineProperty(exports, "DEFAULT_QUERY_LIMITS", {
130
86
  enumerable: true,
131
- get: function () { return chunkVD7XT52J_cjs.DEFAULT_QUERY_LIMITS; }
87
+ get: function () { return chunk72KNINHB_cjs.DEFAULT_QUERY_LIMITS; }
88
+ });
89
+ Object.defineProperty(exports, "FILTER_OPERATORS", {
90
+ enumerable: true,
91
+ get: function () { return chunk72KNINHB_cjs.FILTER_OPERATORS; }
132
92
  });
133
93
  Object.defineProperty(exports, "QueryKitError", {
134
94
  enumerable: true,
135
- get: function () { return chunkVD7XT52J_cjs.QueryKitError; }
95
+ get: function () { return chunk72KNINHB_cjs.QueryKitError; }
136
96
  });
137
97
  Object.defineProperty(exports, "QueryKitTimeoutError", {
138
98
  enumerable: true,
139
- get: function () { return chunkVD7XT52J_cjs.QueryKitTimeoutError; }
99
+ get: function () { return chunk72KNINHB_cjs.QueryKitTimeoutError; }
100
+ });
101
+ Object.defineProperty(exports, "TEXT_FILTER_OPERATORS", {
102
+ enumerable: true,
103
+ get: function () { return chunk72KNINHB_cjs.TEXT_FILTER_OPERATORS; }
140
104
  });
141
105
  Object.defineProperty(exports, "raw", {
142
106
  enumerable: true,
143
- get: function () { return chunkVD7XT52J_cjs.raw; }
107
+ get: function () { return chunk72KNINHB_cjs.raw; }
144
108
  });
145
109
  Object.defineProperty(exports, "resolveLimits", {
146
110
  enumerable: true,
147
- get: function () { return chunkVD7XT52J_cjs.resolveLimits; }
111
+ get: function () { return chunk72KNINHB_cjs.resolveLimits; }
148
112
  });
149
- exports.FILTER_OPERATORS = FILTER_OPERATORS;
150
- exports.TEXT_FILTER_OPERATORS = TEXT_FILTER_OPERATORS;
151
113
  exports.createFilters = createFilters;
152
114
  exports.f = f;
153
115
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filters.ts","../src/operators.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AndGroup, FieldCondition, FilterNode, FilterOperator, FilterScalar, FilterValue, NotGroup, OrGroup } from \"./types\";\n\nfunction field<TKey extends string>(key: TKey, operation: FilterOperator, value?: FilterValue): FieldCondition<TKey> {\n return { key, operation, value };\n}\n\n/**\n * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit\n * tipiga (`TKey`) bog'lanadi; adapterlar uni o'z ustun/maydon kaliti bilan\n * chaqiradi. `TRaw` — guruhlarga (`and/or/not`) qo'shsa bo'ladigan raw tugun tipi.\n *\n * @typeParam TKey - ustun/maydon kaliti (string union).\n * @typeParam TRaw - raw escape-hatch tugun tipi (masalan Drizzle `SQL`).\n * @example\n * ```ts\n * const f = createFilters<\"status\" | \"age\">();\n * f.and(f.eq(\"status\", \"active\"), f.gte(\"age\", 18));\n * ```\n */\nexport function createFilters<TKey extends string = string, TRaw = never>() {\n type Node = FilterNode<TKey, TRaw>;\n\n return {\n eq: (key: TKey, value: FilterValue) => field(key, \"=\", value),\n ne: (key: TKey, value: FilterValue) => field(key, \"!=\", value),\n gt: (key: TKey, value: FilterValue) => field(key, \">\", value),\n gte: (key: TKey, value: FilterValue) => field(key, \">=\", value),\n lt: (key: TKey, value: FilterValue) => field(key, \"<\", value),\n lte: (key: TKey, value: FilterValue) => field(key, \"<=\", value),\n\n contains: (key: TKey, value: string) => field(key, \"%_%\", value),\n startsWith: (key: TKey, value: string) => field(key, \"%_\", value),\n endsWith: (key: TKey, value: string) => field(key, \"_%\", value),\n like: (key: TKey, value: string) => field(key, \"like\", value),\n ilike: (key: TKey, value: string) => field(key, \"ilike\", value),\n notLike: (key: TKey, value: string) => field(key, \"notLike\", value),\n\n in: (key: TKey, value: Array<string | number>) => field(key, \"in\", value),\n notIn: (key: TKey, value: Array<string | number>) => field(key, \"notIn\", value),\n between: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"between\", [min, max] as FilterValue),\n notBetween: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"notBetween\", [min, max] as FilterValue),\n /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */\n range: (key: TKey, from: FilterScalar | Date, to: FilterScalar | Date): FieldCondition<TKey>[] => [\n field(key, \">=\", from as FilterValue),\n field(key, \"<=\", to as FilterValue),\n ],\n\n isNull: (key: TKey) => field(key, \"isNull\"),\n isNotNull: (key: TKey) => field(key, \"isNotNull\"),\n\n and: (...nodes: Node[]): AndGroup<TKey, TRaw> => ({ and: nodes }),\n or: (...nodes: Node[]): OrGroup<TKey, TRaw> => ({ or: nodes }),\n not: (node: Node): NotGroup<TKey, TRaw> => ({ not: node }),\n };\n}\n\n/** Tipsiz (kalitga bog'lanmagan) filter quruvchilar — tez foydalanish uchun. */\nexport const f = /* @__PURE__ */ createFilters();\n","/**\n * Filter operatorlari — yagona runtime manba. `FilterOperator` tipi (`types.ts`)\n * shundan chiqadi; `@querykitjs/zod` shu massivdan zod enum quradi.\n */\nexport const FILTER_OPERATORS = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"eq\",\n \"ne\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\", // contains\n \"%_\", // startsWith\n \"_%\", // endsWith\n \"in\",\n \"notIn\",\n \"between\",\n \"notBetween\",\n \"isNull\",\n \"isNotNull\",\n] as const;\n\n/**\n * Qiymati **text pattern** bo'lgan operatorlar. Backend adapterlari wire qiymatni\n * ustun/path tipiga cast qilishda shularni chetlab o'tadi — aks holda\n * `ilike(dateColumn, \"%2026%\")` ISO string o'rniga `String(Date)` olardi\n * (`\"Mon Jul 28 2026 …\"`). Ro'yxat ikki adapterda divergent bo'lmasligi uchun\n * shu yerda — yagona manba.\n */\nexport const TEXT_FILTER_OPERATORS = [\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\",\n \"%_\",\n \"_%\",\n] as const satisfies readonly (typeof FILTER_OPERATORS)[number][];\n"]}
1
+ {"version":3,"sources":["../src/filters.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,KAAA,CAA2B,GAAA,EAAW,SAAA,EAA2B,KAAA,EAA2C;AACnH,EAAA,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAM;AACjC;AAeO,SAAS,aAAA,GAA4D;AAG1E,EAAA,OAAO;AAAA,IACL,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,IAC5D,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAC7D,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,IAC5D,KAAK,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAC9D,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,IAC5D,KAAK,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAE9D,UAAU,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,OAAO,KAAK,CAAA;AAAA,IAC/D,YAAY,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAChE,UAAU,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAC9D,MAAM,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,QAAQ,KAAK,CAAA;AAAA,IAC5D,OAAO,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,SAAS,KAAK,CAAA;AAAA,IAC9D,SAAS,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,WAAW,KAAK,CAAA;AAAA,IAElE,IAAI,CAAC,GAAA,EAAW,UAAkC,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IACxE,OAAO,CAAC,GAAA,EAAW,UAAkC,KAAA,CAAM,GAAA,EAAK,SAAS,KAAK,CAAA;AAAA,IAC9E,OAAA,EAAS,CAAC,GAAA,EAAW,GAAA,EAA0B,GAAA,KAA6B,KAAA,CAAM,GAAA,EAAK,SAAA,EAAW,CAAC,GAAA,EAAK,GAAG,CAAgB,CAAA;AAAA,IAC3H,UAAA,EAAY,CAAC,GAAA,EAAW,GAAA,EAA0B,GAAA,KAA6B,KAAA,CAAM,GAAA,EAAK,YAAA,EAAc,CAAC,GAAA,EAAK,GAAG,CAAgB,CAAA;AAAA;AAAA,IAEjI,KAAA,EAAO,CAAC,GAAA,EAAW,IAAA,EAA2B,EAAA,KAAoD;AAAA,MAChG,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM,IAAmB,CAAA;AAAA,MACpC,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM,EAAiB;AAAA,KACpC;AAAA,IAEA,MAAA,EAAQ,CAAC,GAAA,KAAc,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IAC1C,SAAA,EAAW,CAAC,GAAA,KAAc,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,IAEhD,GAAA,EAAK,CAAA,GAAI,KAAA,MAAyC,EAAE,KAAK,KAAA,EAAM,CAAA;AAAA,IAC/D,EAAA,EAAI,CAAA,GAAI,KAAA,MAAwC,EAAE,IAAI,KAAA,EAAM,CAAA;AAAA,IAC5D,GAAA,EAAK,CAAC,IAAA,MAAsC,EAAE,KAAK,IAAA,EAAK;AAAA,GAC1D;AACF;AAGO,IAAM,oBAAoB,aAAA","file":"index.cjs","sourcesContent":["import type { AndGroup, FieldCondition, FilterNode, FilterOperator, FilterScalar, FilterValue, NotGroup, OrGroup } from \"./types\";\n\nfunction field<TKey extends string>(key: TKey, operation: FilterOperator, value?: FilterValue): FieldCondition<TKey> {\n return { key, operation, value };\n}\n\n/**\n * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit\n * tipiga (`TKey`) bog'lanadi; adapterlar uni o'z ustun/maydon kaliti bilan\n * chaqiradi. `TRaw` — guruhlarga (`and/or/not`) qo'shsa bo'ladigan raw tugun tipi.\n *\n * @typeParam TKey - ustun/maydon kaliti (string union).\n * @typeParam TRaw - raw escape-hatch tugun tipi (masalan Drizzle `SQL`).\n * @example\n * ```ts\n * const f = createFilters<\"status\" | \"age\">();\n * f.and(f.eq(\"status\", \"active\"), f.gte(\"age\", 18));\n * ```\n */\nexport function createFilters<TKey extends string = string, TRaw = never>() {\n type Node = FilterNode<TKey, TRaw>;\n\n return {\n eq: (key: TKey, value: FilterValue) => field(key, \"=\", value),\n ne: (key: TKey, value: FilterValue) => field(key, \"!=\", value),\n gt: (key: TKey, value: FilterValue) => field(key, \">\", value),\n gte: (key: TKey, value: FilterValue) => field(key, \">=\", value),\n lt: (key: TKey, value: FilterValue) => field(key, \"<\", value),\n lte: (key: TKey, value: FilterValue) => field(key, \"<=\", value),\n\n contains: (key: TKey, value: string) => field(key, \"%_%\", value),\n startsWith: (key: TKey, value: string) => field(key, \"%_\", value),\n endsWith: (key: TKey, value: string) => field(key, \"_%\", value),\n like: (key: TKey, value: string) => field(key, \"like\", value),\n ilike: (key: TKey, value: string) => field(key, \"ilike\", value),\n notLike: (key: TKey, value: string) => field(key, \"notLike\", value),\n\n in: (key: TKey, value: Array<string | number>) => field(key, \"in\", value),\n notIn: (key: TKey, value: Array<string | number>) => field(key, \"notIn\", value),\n between: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"between\", [min, max] as FilterValue),\n notBetween: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"notBetween\", [min, max] as FilterValue),\n /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */\n range: (key: TKey, from: FilterScalar | Date, to: FilterScalar | Date): FieldCondition<TKey>[] => [\n field(key, \">=\", from as FilterValue),\n field(key, \"<=\", to as FilterValue),\n ],\n\n isNull: (key: TKey) => field(key, \"isNull\"),\n isNotNull: (key: TKey) => field(key, \"isNotNull\"),\n\n and: (...nodes: Node[]): AndGroup<TKey, TRaw> => ({ and: nodes }),\n or: (...nodes: Node[]): OrGroup<TKey, TRaw> => ({ or: nodes }),\n not: (node: Node): NotGroup<TKey, TRaw> => ({ not: node }),\n };\n}\n\n/** Tipsiz (kalitga bog'lanmagan) filter quruvchilar — tez foydalanish uchun. */\nexport const f = /* @__PURE__ */ createFilters();\n"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FilterValue, a as FieldCondition, b as FilterScalar, c as FilterNode, A as AndGroup, O as OrGroup, N as NotGroup, S as SkippedCondition } from './raw-Bx8c-TrC.cjs';
2
- export { d as AggregateSpec, e as AllRows, C as CursorMeta, D as DEFAULT_LIMIT, f as DEFAULT_MAX_CONDITIONS, g as DEFAULT_MAX_FILTER_DEPTH, h as DEFAULT_MAX_IN_ITEMS, i as DEFAULT_MAX_LIKE_WILDCARDS, j as DEFAULT_MAX_LIMIT, k as DEFAULT_MAX_OFFSET, l as DEFAULT_MAX_PER_PAGE, m as DEFAULT_MAX_SORT_FIELDS, n as DEFAULT_MAX_STRING_LENGTH, o as DEFAULT_PER_PAGE, p as DEFAULT_QUERY_LIMITS, q as FILTER_OPERATORS, r as Filter, s as FilterOperator, t as Filterable, I as InfiniteMeta, L as LooseKey, M as MutationCount, u as MutationOptions, v as MutationRows, w as OffsetMeta, Q as QueryLimits, R as RelationRule, x as Relations, y as Scope, z as ScopeIn, B as SkipReason, E as SkipSite, G as Sort, H as SortDirection, J as SortItem, T as TEXT_FILTER_OPERATORS, U as UpsertOptions, W as WireBaseParams, K as WireCursorParams, P as WireInfiniteParams, V as WireOffsetParams, X as raw, Y as resolveLimits } from './raw-Bx8c-TrC.cjs';
1
+ import { F as FilterValue, a as FieldCondition, b as FilterScalar, c as FilterNode, A as AndGroup, O as OrGroup, N as NotGroup, S as SkippedCondition } from './raw-AiElbDzC.cjs';
2
+ export { d as AggregateSpec, e as AllRows, C as CursorMeta, D as DEFAULT_LIMIT, f as DEFAULT_MAX_CONDITIONS, g as DEFAULT_MAX_FILTER_DEPTH, h as DEFAULT_MAX_IN_ITEMS, i as DEFAULT_MAX_LIKE_WILDCARDS, j as DEFAULT_MAX_LIMIT, k as DEFAULT_MAX_OFFSET, l as DEFAULT_MAX_PER_PAGE, m as DEFAULT_MAX_SORT_FIELDS, n as DEFAULT_MAX_STRING_LENGTH, o as DEFAULT_PER_PAGE, p as DEFAULT_QUERY_LIMITS, q as FILTER_OPERATORS, r as Filter, s as FilterOperator, t as Filterable, I as InfiniteMeta, L as LooseKey, M as MutationCount, u as MutationOptions, v as MutationRows, w as OffsetMeta, Q as QueryLimits, R as RelationRule, x as Relations, y as Scope, z as ScopeIn, B as SkipReason, E as SkipSite, G as Sort, H as SortDirection, J as SortItem, T as TEXT_FILTER_OPERATORS, U as UpsertOptions, W as WireBaseParams, K as WireCursorParams, P as WireInfiniteParams, V as WireOffsetParams, X as raw, Y as resolveLimits } from './raw-AiElbDzC.cjs';
3
3
 
4
4
  /**
5
5
  * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FilterValue, a as FieldCondition, b as FilterScalar, c as FilterNode, A as AndGroup, O as OrGroup, N as NotGroup, S as SkippedCondition } from './raw-Bx8c-TrC.js';
2
- export { d as AggregateSpec, e as AllRows, C as CursorMeta, D as DEFAULT_LIMIT, f as DEFAULT_MAX_CONDITIONS, g as DEFAULT_MAX_FILTER_DEPTH, h as DEFAULT_MAX_IN_ITEMS, i as DEFAULT_MAX_LIKE_WILDCARDS, j as DEFAULT_MAX_LIMIT, k as DEFAULT_MAX_OFFSET, l as DEFAULT_MAX_PER_PAGE, m as DEFAULT_MAX_SORT_FIELDS, n as DEFAULT_MAX_STRING_LENGTH, o as DEFAULT_PER_PAGE, p as DEFAULT_QUERY_LIMITS, q as FILTER_OPERATORS, r as Filter, s as FilterOperator, t as Filterable, I as InfiniteMeta, L as LooseKey, M as MutationCount, u as MutationOptions, v as MutationRows, w as OffsetMeta, Q as QueryLimits, R as RelationRule, x as Relations, y as Scope, z as ScopeIn, B as SkipReason, E as SkipSite, G as Sort, H as SortDirection, J as SortItem, T as TEXT_FILTER_OPERATORS, U as UpsertOptions, W as WireBaseParams, K as WireCursorParams, P as WireInfiniteParams, V as WireOffsetParams, X as raw, Y as resolveLimits } from './raw-Bx8c-TrC.js';
1
+ import { F as FilterValue, a as FieldCondition, b as FilterScalar, c as FilterNode, A as AndGroup, O as OrGroup, N as NotGroup, S as SkippedCondition } from './raw-AiElbDzC.js';
2
+ export { d as AggregateSpec, e as AllRows, C as CursorMeta, D as DEFAULT_LIMIT, f as DEFAULT_MAX_CONDITIONS, g as DEFAULT_MAX_FILTER_DEPTH, h as DEFAULT_MAX_IN_ITEMS, i as DEFAULT_MAX_LIKE_WILDCARDS, j as DEFAULT_MAX_LIMIT, k as DEFAULT_MAX_OFFSET, l as DEFAULT_MAX_PER_PAGE, m as DEFAULT_MAX_SORT_FIELDS, n as DEFAULT_MAX_STRING_LENGTH, o as DEFAULT_PER_PAGE, p as DEFAULT_QUERY_LIMITS, q as FILTER_OPERATORS, r as Filter, s as FilterOperator, t as Filterable, I as InfiniteMeta, L as LooseKey, M as MutationCount, u as MutationOptions, v as MutationRows, w as OffsetMeta, Q as QueryLimits, R as RelationRule, x as Relations, y as Scope, z as ScopeIn, B as SkipReason, E as SkipSite, G as Sort, H as SortDirection, J as SortItem, T as TEXT_FILTER_OPERATORS, U as UpsertOptions, W as WireBaseParams, K as WireCursorParams, P as WireInfiniteParams, V as WireOffsetParams, X as raw, Y as resolveLimits } from './raw-AiElbDzC.js';
3
3
 
4
4
  /**
5
5
  * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { DEFAULT_LIMIT, DEFAULT_MAX_CONDITIONS, DEFAULT_MAX_FILTER_DEPTH, DEFAULT_MAX_IN_ITEMS, DEFAULT_MAX_LIKE_WILDCARDS, DEFAULT_MAX_LIMIT, DEFAULT_MAX_OFFSET, DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_SORT_FIELDS, DEFAULT_MAX_STRING_LENGTH, DEFAULT_PER_PAGE, DEFAULT_QUERY_LIMITS, QueryKitError, QueryKitTimeoutError, raw, resolveLimits } from './chunk-NHNDPIPM.js';
1
+ export { DEFAULT_LIMIT, DEFAULT_MAX_CONDITIONS, DEFAULT_MAX_FILTER_DEPTH, DEFAULT_MAX_IN_ITEMS, DEFAULT_MAX_LIKE_WILDCARDS, DEFAULT_MAX_LIMIT, DEFAULT_MAX_OFFSET, DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_SORT_FIELDS, DEFAULT_MAX_STRING_LENGTH, DEFAULT_PER_PAGE, DEFAULT_QUERY_LIMITS, FILTER_OPERATORS, QueryKitError, QueryKitTimeoutError, TEXT_FILTER_OPERATORS, raw, resolveLimits } from './chunk-XEETYJA3.js';
2
2
 
3
3
  // src/filters.ts
4
4
  function field(key, operation, value) {
@@ -36,50 +36,6 @@ function createFilters() {
36
36
  }
37
37
  var f = /* @__PURE__ */ createFilters();
38
38
 
39
- // src/operators.ts
40
- var FILTER_OPERATORS = [
41
- "=",
42
- "!=",
43
- ">",
44
- ">=",
45
- "<",
46
- "<=",
47
- "eq",
48
- "ne",
49
- "gt",
50
- "gte",
51
- "lt",
52
- "lte",
53
- "like",
54
- "ilike",
55
- "notLike",
56
- "contains",
57
- "startsWith",
58
- "endsWith",
59
- "%_%",
60
- // contains
61
- "%_",
62
- // startsWith
63
- "_%",
64
- // endsWith
65
- "in",
66
- "notIn",
67
- "between",
68
- "notBetween",
69
- "isNull",
70
- "isNotNull"
71
- ], TEXT_FILTER_OPERATORS = [
72
- "like",
73
- "ilike",
74
- "notLike",
75
- "contains",
76
- "startsWith",
77
- "endsWith",
78
- "%_%",
79
- "%_",
80
- "_%"
81
- ];
82
-
83
- export { FILTER_OPERATORS, TEXT_FILTER_OPERATORS, createFilters, f };
39
+ export { createFilters, f };
84
40
  //# sourceMappingURL=index.js.map
85
41
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filters.ts","../src/operators.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { AndGroup, FieldCondition, FilterNode, FilterOperator, FilterScalar, FilterValue, NotGroup, OrGroup } from \"./types\";\n\nfunction field<TKey extends string>(key: TKey, operation: FilterOperator, value?: FilterValue): FieldCondition<TKey> {\n return { key, operation, value };\n}\n\n/**\n * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit\n * tipiga (`TKey`) bog'lanadi; adapterlar uni o'z ustun/maydon kaliti bilan\n * chaqiradi. `TRaw` — guruhlarga (`and/or/not`) qo'shsa bo'ladigan raw tugun tipi.\n *\n * @typeParam TKey - ustun/maydon kaliti (string union).\n * @typeParam TRaw - raw escape-hatch tugun tipi (masalan Drizzle `SQL`).\n * @example\n * ```ts\n * const f = createFilters<\"status\" | \"age\">();\n * f.and(f.eq(\"status\", \"active\"), f.gte(\"age\", 18));\n * ```\n */\nexport function createFilters<TKey extends string = string, TRaw = never>() {\n type Node = FilterNode<TKey, TRaw>;\n\n return {\n eq: (key: TKey, value: FilterValue) => field(key, \"=\", value),\n ne: (key: TKey, value: FilterValue) => field(key, \"!=\", value),\n gt: (key: TKey, value: FilterValue) => field(key, \">\", value),\n gte: (key: TKey, value: FilterValue) => field(key, \">=\", value),\n lt: (key: TKey, value: FilterValue) => field(key, \"<\", value),\n lte: (key: TKey, value: FilterValue) => field(key, \"<=\", value),\n\n contains: (key: TKey, value: string) => field(key, \"%_%\", value),\n startsWith: (key: TKey, value: string) => field(key, \"%_\", value),\n endsWith: (key: TKey, value: string) => field(key, \"_%\", value),\n like: (key: TKey, value: string) => field(key, \"like\", value),\n ilike: (key: TKey, value: string) => field(key, \"ilike\", value),\n notLike: (key: TKey, value: string) => field(key, \"notLike\", value),\n\n in: (key: TKey, value: Array<string | number>) => field(key, \"in\", value),\n notIn: (key: TKey, value: Array<string | number>) => field(key, \"notIn\", value),\n between: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"between\", [min, max] as FilterValue),\n notBetween: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"notBetween\", [min, max] as FilterValue),\n /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */\n range: (key: TKey, from: FilterScalar | Date, to: FilterScalar | Date): FieldCondition<TKey>[] => [\n field(key, \">=\", from as FilterValue),\n field(key, \"<=\", to as FilterValue),\n ],\n\n isNull: (key: TKey) => field(key, \"isNull\"),\n isNotNull: (key: TKey) => field(key, \"isNotNull\"),\n\n and: (...nodes: Node[]): AndGroup<TKey, TRaw> => ({ and: nodes }),\n or: (...nodes: Node[]): OrGroup<TKey, TRaw> => ({ or: nodes }),\n not: (node: Node): NotGroup<TKey, TRaw> => ({ not: node }),\n };\n}\n\n/** Tipsiz (kalitga bog'lanmagan) filter quruvchilar — tez foydalanish uchun. */\nexport const f = /* @__PURE__ */ createFilters();\n","/**\n * Filter operatorlari — yagona runtime manba. `FilterOperator` tipi (`types.ts`)\n * shundan chiqadi; `@querykitjs/zod` shu massivdan zod enum quradi.\n */\nexport const FILTER_OPERATORS = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"eq\",\n \"ne\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\", // contains\n \"%_\", // startsWith\n \"_%\", // endsWith\n \"in\",\n \"notIn\",\n \"between\",\n \"notBetween\",\n \"isNull\",\n \"isNotNull\",\n] as const;\n\n/**\n * Qiymati **text pattern** bo'lgan operatorlar. Backend adapterlari wire qiymatni\n * ustun/path tipiga cast qilishda shularni chetlab o'tadi — aks holda\n * `ilike(dateColumn, \"%2026%\")` ISO string o'rniga `String(Date)` olardi\n * (`\"Mon Jul 28 2026 …\"`). Ro'yxat ikki adapterda divergent bo'lmasligi uchun\n * shu yerda — yagona manba.\n */\nexport const TEXT_FILTER_OPERATORS = [\n \"like\",\n \"ilike\",\n \"notLike\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"%_%\",\n \"%_\",\n \"_%\",\n] as const satisfies readonly (typeof FILTER_OPERATORS)[number][];\n"]}
1
+ {"version":3,"sources":["../src/filters.ts"],"names":[],"mappings":";;;AAEA,SAAS,KAAA,CAA2B,GAAA,EAAW,SAAA,EAA2B,KAAA,EAA2C;AACnH,EAAA,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAM;AACjC;AAeO,SAAS,aAAA,GAA4D;AAG1E,EAAA,OAAO;AAAA,IACL,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,IAC5D,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAC7D,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,IAC5D,KAAK,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAC9D,IAAI,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,IAC5D,KAAK,CAAC,GAAA,EAAW,UAAuB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAE9D,UAAU,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,OAAO,KAAK,CAAA;AAAA,IAC/D,YAAY,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAChE,UAAU,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IAC9D,MAAM,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,QAAQ,KAAK,CAAA;AAAA,IAC5D,OAAO,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,SAAS,KAAK,CAAA;AAAA,IAC9D,SAAS,CAAC,GAAA,EAAW,UAAkB,KAAA,CAAM,GAAA,EAAK,WAAW,KAAK,CAAA;AAAA,IAElE,IAAI,CAAC,GAAA,EAAW,UAAkC,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,IACxE,OAAO,CAAC,GAAA,EAAW,UAAkC,KAAA,CAAM,GAAA,EAAK,SAAS,KAAK,CAAA;AAAA,IAC9E,OAAA,EAAS,CAAC,GAAA,EAAW,GAAA,EAA0B,GAAA,KAA6B,KAAA,CAAM,GAAA,EAAK,SAAA,EAAW,CAAC,GAAA,EAAK,GAAG,CAAgB,CAAA;AAAA,IAC3H,UAAA,EAAY,CAAC,GAAA,EAAW,GAAA,EAA0B,GAAA,KAA6B,KAAA,CAAM,GAAA,EAAK,YAAA,EAAc,CAAC,GAAA,EAAK,GAAG,CAAgB,CAAA;AAAA;AAAA,IAEjI,KAAA,EAAO,CAAC,GAAA,EAAW,IAAA,EAA2B,EAAA,KAAoD;AAAA,MAChG,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM,IAAmB,CAAA;AAAA,MACpC,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM,EAAiB;AAAA,KACpC;AAAA,IAEA,MAAA,EAAQ,CAAC,GAAA,KAAc,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IAC1C,SAAA,EAAW,CAAC,GAAA,KAAc,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,IAEhD,GAAA,EAAK,CAAA,GAAI,KAAA,MAAyC,EAAE,KAAK,KAAA,EAAM,CAAA;AAAA,IAC/D,EAAA,EAAI,CAAA,GAAI,KAAA,MAAwC,EAAE,IAAI,KAAA,EAAM,CAAA;AAAA,IAC5D,GAAA,EAAK,CAAC,IAAA,MAAsC,EAAE,KAAK,IAAA,EAAK;AAAA,GAC1D;AACF;AAGO,IAAM,oBAAoB,aAAA","file":"index.js","sourcesContent":["import type { AndGroup, FieldCondition, FilterNode, FilterOperator, FilterScalar, FilterValue, NotGroup, OrGroup } from \"./types\";\n\nfunction field<TKey extends string>(key: TKey, operation: FilterOperator, value?: FilterValue): FieldCondition<TKey> {\n return { key, operation, value };\n}\n\n/**\n * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit\n * tipiga (`TKey`) bog'lanadi; adapterlar uni o'z ustun/maydon kaliti bilan\n * chaqiradi. `TRaw` — guruhlarga (`and/or/not`) qo'shsa bo'ladigan raw tugun tipi.\n *\n * @typeParam TKey - ustun/maydon kaliti (string union).\n * @typeParam TRaw - raw escape-hatch tugun tipi (masalan Drizzle `SQL`).\n * @example\n * ```ts\n * const f = createFilters<\"status\" | \"age\">();\n * f.and(f.eq(\"status\", \"active\"), f.gte(\"age\", 18));\n * ```\n */\nexport function createFilters<TKey extends string = string, TRaw = never>() {\n type Node = FilterNode<TKey, TRaw>;\n\n return {\n eq: (key: TKey, value: FilterValue) => field(key, \"=\", value),\n ne: (key: TKey, value: FilterValue) => field(key, \"!=\", value),\n gt: (key: TKey, value: FilterValue) => field(key, \">\", value),\n gte: (key: TKey, value: FilterValue) => field(key, \">=\", value),\n lt: (key: TKey, value: FilterValue) => field(key, \"<\", value),\n lte: (key: TKey, value: FilterValue) => field(key, \"<=\", value),\n\n contains: (key: TKey, value: string) => field(key, \"%_%\", value),\n startsWith: (key: TKey, value: string) => field(key, \"%_\", value),\n endsWith: (key: TKey, value: string) => field(key, \"_%\", value),\n like: (key: TKey, value: string) => field(key, \"like\", value),\n ilike: (key: TKey, value: string) => field(key, \"ilike\", value),\n notLike: (key: TKey, value: string) => field(key, \"notLike\", value),\n\n in: (key: TKey, value: Array<string | number>) => field(key, \"in\", value),\n notIn: (key: TKey, value: Array<string | number>) => field(key, \"notIn\", value),\n between: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"between\", [min, max] as FilterValue),\n notBetween: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => field(key, \"notBetween\", [min, max] as FilterValue),\n /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */\n range: (key: TKey, from: FilterScalar | Date, to: FilterScalar | Date): FieldCondition<TKey>[] => [\n field(key, \">=\", from as FilterValue),\n field(key, \"<=\", to as FilterValue),\n ],\n\n isNull: (key: TKey) => field(key, \"isNull\"),\n isNotNull: (key: TKey) => field(key, \"isNotNull\"),\n\n and: (...nodes: Node[]): AndGroup<TKey, TRaw> => ({ and: nodes }),\n or: (...nodes: Node[]): OrGroup<TKey, TRaw> => ({ or: nodes }),\n not: (node: Node): NotGroup<TKey, TRaw> => ({ not: node }),\n };\n}\n\n/** Tipsiz (kalitga bog'lanmagan) filter quruvchilar — tez foydalanish uchun. */\nexport const f = /* @__PURE__ */ createFilters();\n"]}