@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.
- package/dist/{chunk-VD7XT52J.cjs → chunk-72KNINHB.cjs} +48 -2
- package/dist/chunk-72KNINHB.cjs.map +1 -0
- package/dist/{chunk-NHNDPIPM.js → chunk-XEETYJA3.js} +47 -3
- package/dist/chunk-XEETYJA3.js.map +1 -0
- package/dist/index.cjs +25 -63
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -46
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +160 -10
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.cts +138 -11
- package/dist/internal.d.ts +138 -11
- package/dist/internal.js +148 -5
- package/dist/internal.js.map +1 -1
- package/dist/{raw-Bx8c-TrC.d.cts → raw-AiElbDzC.d.cts} +2 -2
- package/dist/{raw-Bx8c-TrC.d.ts → raw-AiElbDzC.d.ts} +2 -2
- package/package.json +1 -1
- package/dist/chunk-NHNDPIPM.js.map +0 -1
- package/dist/chunk-VD7XT52J.cjs.map +0 -1
|
@@ -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-
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
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":";;;;;;;AAOO,IAAM,gBAAA,GAAmB,EAAA,CAAA,CAGnB,aAAA,GAAgB,EAAA,CAAA,CAOhB,oBAAA,GAAuB,KAGvB,iBAAA,GAAoB,GAAA,CAAA,CASpB,wBAAA,GAA2B,CAAA,CAAA,CAG3B,sBAAA,GAAyB,EAAA,CAAA,CAGzB,uBAAuB,GAAA,CAAA,CAGvB,yBAAA,GAA4B,GAAA,CAAA,CAG5B,kBAAA,GAAqB,GAAA,CAAA,CAGrB,uBAAA,GAA0B,GAO1B,0BAAA,GAA6B,CAAA,CAAA,CAc7B,oBAAA,GAA8C,MAAA,CAAO,MAAA,CAAO;AAAA,EACvE,QAAA,EAAU,CAAA;AAAA,EACV,aAAA,EAAe,EAAA;AAAA,EACf,UAAA,EAAY,GAAA;AAAA,EACZ,eAAA,EAAiB,GAAA;AAAA,EACjB,SAAA,EAAW,GAAA;AAAA,EACX,aAAA,EAAe,CAAA;AAAA,EACf,gBAAA,EAAkB;AACpB,CAAC;AAWM,SAAS,aAAA,CAAc,MAAA,GAA+B,EAAC,EAAgB;AAC5E,EAAA,IAAM,QAAA,GAAW,EAAE,GAAG,oBAAA,EAAqB;AAC3C,EAAA,KAAA,IAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA,EAA4B;AAC7E,IAAA,IAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAI,KAAA,KAAU,MAAA,KAAW,QAAA,CAAS,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,QAAA;AACT;;;AClFA,IAAM,GAAA,mBAAM,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AAa9B,SAAS,IAAsB,KAAA,EAAa;AACjD,EAAA,OAAA,MAAA,CAAO,cAAA,CAAe,OAAO,GAAA,EAAK,EAAE,OAAO,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,CAAA,EAC7D,KAAA;AACT;AAGO,IAAM,KAAA,GAAQ,CAAC,IAAA,KAA2B,OAAO,IAAA,IAAS,YAAY,IAAA,KAAS,IAAA,IAAS,IAAA,CAAiC,GAAG,CAAA,KAAM;;;ACRlI,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAOvC,YAAY,IAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,SAAA,EAAO,IAAA,CAAK,GAAG,CAAA,GAAA,EAAM,IAAA,CAAK,IAAI,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,EAAA,CAAI,CAAA;AANtF;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,EAAO,4BAAA,CAAA;AAGhB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA,EACZ,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF,CAAA,CAAA,CAOa,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EAI9C,WAAA,CAEW,MAAA,EAEA,SAAA,EACT,OAAA,EACA;AACA,IAAA,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAM,CAAA,sBAAA,EAAyB,SAAS,SAAS,OAAO,CAAA;AAL7E,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAA,MAAA,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAA,SAAA,CAAA;AANX;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,EAAO,kBAAA,CAAA;AAUd,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;;;ACjDO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA;AAAA,EACA,IAAA;AAAA;AAAA,EACA,IAAA;AAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,CAAA,CASa,qBAAA,GAAwB;AAAA,EACnC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF","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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
95
|
+
get: function () { return chunk72KNINHB_cjs.QueryKitError; }
|
|
136
96
|
});
|
|
137
97
|
Object.defineProperty(exports, "QueryKitTimeoutError", {
|
|
138
98
|
enumerable: true,
|
|
139
|
-
get: function () { return
|
|
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
|
|
107
|
+
get: function () { return chunk72KNINHB_cjs.raw; }
|
|
144
108
|
});
|
|
145
109
|
Object.defineProperty(exports, "resolveLimits", {
|
|
146
110
|
enumerable: true,
|
|
147
|
-
get: function () { return
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filters.ts"
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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"
|
|
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"]}
|