@querykitjs/core 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Suhrobbek Soatov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,35 @@
1
+ <div align="right">
2
+
3
+ **English** · [O'zbekcha](./README.md)
4
+
5
+ </div>
6
+
7
+ # @querykitjs/core
8
+
9
+ > Shared, **ORM-agnostic** query DSL for the querykit family: filter types, operators, the `createFilters` builder, and wire-meta shapes.
10
+
11
+ You usually **don't install this directly** — it's the shared foundation used by `@querykitjs/drizzle-pg` (backend) and `@querykitjs/web` (frontend). Types are generic over a key (`TKey`); each adapter specializes it to its own key type (a Drizzle table column or an entity field).
12
+
13
+ ## What's inside
14
+
15
+ - **`FilterOperator`** — every operator: `= != > >= < <=` (+ `eq/ne/gt/gte/lt/lte`), `like/ilike/notLike`, `contains/startsWith/endsWith` (+ tokens `%_%`/`%_`/`_%`), `in/notIn`, `between/notBetween`, `isNull/isNotNull`.
16
+ - **Filter tree** — `FieldCondition<TKey>`, `AndGroup/OrGroup/NotGroup<TKey, TRaw>`, `FilterNode<TKey, TRaw>`, `Filter<TKey, TRaw>`. `TRaw` is an adapter-provided raw escape hatch (e.g. a Drizzle `SQL`; defaults to `never`).
17
+ - **`FilterScalar` / `FilterValue`**, **`SortDirection`**.
18
+ - **`createFilters<TKey, TRaw>()`** + **`f`** — ergonomic builder (eq/ne/…, contains/…, like/ilike/notLike, in/notIn, between, range, isNull/isNotNull, and/or/not).
19
+ - **Wire meta** (server response, snake_case) — `OffsetMeta`, `InfiniteMeta`, `CursorMeta`.
20
+
21
+ ## Usage (inside an adapter)
22
+
23
+ ```ts
24
+ import { createFilters } from "@querykitjs/core";
25
+ import type { Filter } from "@querykitjs/core";
26
+
27
+ // an adapter specializes it to its own key type:
28
+ type MyFilter = Filter<"status" | "age", MyRawSql>;
29
+ const f = createFilters<"status" | "age", MyRawSql>();
30
+ f.and(f.eq("status", "active"), f.gte("age", 18));
31
+ ```
32
+
33
+ ## License
34
+
35
+ MIT © Suhrobbek Soatov
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ <div align="right">
2
+
3
+ [English](./README.en.md) · **O'zbekcha**
4
+
5
+ </div>
6
+
7
+ # @querykitjs/core
8
+
9
+ > querykit oilasi uchun umumiy, **ORM-agnostik** query DSL: filter tiplari, operatorlar, `createFilters` builder va wire-meta shakllari.
10
+
11
+ Bu paketni odatda **to'g'ridan-to'g'ri o'rnatmaysiz** — u `@querykitjs/drizzle-pg` (backend) va `@querykitjs/web` (frontend) tomonidan ishlatiladigan umumiy poydevor. Tiplar ustun-kaliti (`TKey`) bo'yicha generic; har bir adapter uni o'z kalit tipiga ixtisoslashtiradi (Drizzle jadval ustuni yoki entity maydoni).
12
+
13
+ ## Ichida nima bor
14
+
15
+ - **`FilterOperator`** — barcha operatorlar: `= != > >= < <=` (+ `eq/ne/gt/gte/lt/lte`), `like/ilike/notLike`, `contains/startsWith/endsWith` (+ token `%_%`/`%_`/`_%`), `in/notIn`, `between/notBetween`, `isNull/isNotNull`.
16
+ - **Filter daraxti** — `FieldCondition<TKey>`, `AndGroup/OrGroup/NotGroup<TKey, TRaw>`, `FilterNode<TKey, TRaw>`, `Filter<TKey, TRaw>`. `TRaw` — adapter qo'shadigan raw escape-hatch (masalan Drizzle `SQL`; default `never`).
17
+ - **`FilterScalar` / `FilterValue`**, **`SortDirection`**.
18
+ - **`createFilters<TKey, TRaw>()`** + **`f`** — ergonomik builder (eq/ne/…, contains/…, like/ilike/notLike, in/notIn, between, range, isNull/isNotNull, and/or/not).
19
+ - **Wire meta** (server javobi, snake_case) — `OffsetMeta`, `InfiniteMeta`, `CursorMeta`.
20
+
21
+ ## Foydalanish (adapter ichida)
22
+
23
+ ```ts
24
+ import { createFilters } from "@querykitjs/core";
25
+ import type { Filter } from "@querykitjs/core";
26
+
27
+ // adapter o'z kalit tipiga ixtisoslashtiradi:
28
+ type MyFilter = Filter<"status" | "age", MyRawSql>;
29
+ const f = createFilters<"status" | "age", MyRawSql>();
30
+ f.and(f.eq("status", "active"), f.gte("age", 18));
31
+ ```
32
+
33
+ ## Litsenziya
34
+
35
+ MIT © Suhrobbek Soatov
package/dist/index.cjs ADDED
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ // src/filters.ts
4
+ function field(key, operation, value) {
5
+ return { key, operation, value };
6
+ }
7
+ function createFilters() {
8
+ return {
9
+ eq: (key, value) => field(key, "=", value),
10
+ ne: (key, value) => field(key, "!=", value),
11
+ gt: (key, value) => field(key, ">", value),
12
+ gte: (key, value) => field(key, ">=", value),
13
+ lt: (key, value) => field(key, "<", value),
14
+ lte: (key, value) => field(key, "<=", value),
15
+ contains: (key, value) => field(key, "%_%", value),
16
+ startsWith: (key, value) => field(key, "%_", value),
17
+ endsWith: (key, value) => field(key, "_%", value),
18
+ like: (key, value) => field(key, "like", value),
19
+ ilike: (key, value) => field(key, "ilike", value),
20
+ notLike: (key, value) => field(key, "notLike", value),
21
+ in: (key, value) => field(key, "in", value),
22
+ notIn: (key, value) => field(key, "notIn", value),
23
+ between: (key, min, max) => field(key, "between", [min, max]),
24
+ /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */
25
+ range: (key, from, to) => [
26
+ field(key, ">=", from),
27
+ field(key, "<=", to)
28
+ ],
29
+ isNull: (key) => field(key, "isNull"),
30
+ isNotNull: (key) => field(key, "isNotNull"),
31
+ and: (...nodes) => ({ and: nodes }),
32
+ or: (...nodes) => ({ or: nodes }),
33
+ not: (node) => ({ not: node })
34
+ };
35
+ }
36
+ var f = createFilters();
37
+
38
+ // src/defaults.ts
39
+ var DEFAULT_PER_PAGE = 20;
40
+ var DEFAULT_LIMIT = 20;
41
+
42
+ // src/operators.ts
43
+ var FILTER_OPERATORS = [
44
+ "=",
45
+ "!=",
46
+ ">",
47
+ ">=",
48
+ "<",
49
+ "<=",
50
+ "eq",
51
+ "ne",
52
+ "gt",
53
+ "gte",
54
+ "lt",
55
+ "lte",
56
+ "like",
57
+ "ilike",
58
+ "notLike",
59
+ "contains",
60
+ "startsWith",
61
+ "endsWith",
62
+ "%_%",
63
+ // contains
64
+ "%_",
65
+ // startsWith
66
+ "_%",
67
+ // endsWith
68
+ "in",
69
+ "notIn",
70
+ "between",
71
+ "notBetween",
72
+ "isNull",
73
+ "isNotNull"
74
+ ];
75
+
76
+ exports.DEFAULT_LIMIT = DEFAULT_LIMIT;
77
+ exports.DEFAULT_PER_PAGE = DEFAULT_PER_PAGE;
78
+ exports.FILTER_OPERATORS = FILTER_OPERATORS;
79
+ exports.createFilters = createFilters;
80
+ exports.f = f;
81
+ //# sourceMappingURL=index.cjs.map
82
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/filters.ts","../src/defaults.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 /** 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 = createFilters();\n","/**\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 * 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"]}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Filter operatorlari — yagona runtime manba. `FilterOperator` tipi (`types.ts`)
3
+ * shundan chiqadi; `@querykitjs/zod` shu massivdan zod enum quradi.
4
+ */
5
+ declare const FILTER_OPERATORS: readonly ["=", "!=", ">", ">=", "<", "<=", "eq", "ne", "gt", "gte", "lt", "lte", "like", "ilike", "notLike", "contains", "startsWith", "endsWith", "%_%", "%_", "_%", "in", "notIn", "between", "notBetween", "isNull", "isNotNull"];
6
+
7
+ /**
8
+ * `@querykitjs/core` — ORM-agnostik query DSL tiplari. Backend adapterlar
9
+ * (`@querykitjs/drizzle-pg`) va frontend (`@querykitjs/web`) shu bir xil kontraktga
10
+ * tayanadi. Tiplar ustun-kaliti (`TKey`) bo'yicha generic; adapterlar uni o'z
11
+ * kalit tipiga (Drizzle jadval ustuni yoki entity maydoni) ixtisoslashtiradi.
12
+ */
13
+
14
+ /** Qo'llab-quvvatlanadigan filter operatorlari (token va nom aliaslari). */
15
+ type FilterOperator = (typeof FILTER_OPERATORS)[number];
16
+ type FilterScalar = string | number | boolean | Date | null;
17
+ type FilterValue = FilterScalar | FilterScalar[];
18
+ /** Bitta maydon sharti (`operation` default `"="`). */
19
+ interface FieldCondition<TKey extends string = string> {
20
+ key: TKey;
21
+ operation?: FilterOperator;
22
+ value?: FilterValue;
23
+ }
24
+ interface AndGroup<TKey extends string = string, TRaw = never> {
25
+ and: FilterNode<TKey, TRaw>[];
26
+ }
27
+ interface OrGroup<TKey extends string = string, TRaw = never> {
28
+ or: FilterNode<TKey, TRaw>[];
29
+ }
30
+ interface NotGroup<TKey extends string = string, TRaw = never> {
31
+ not: FilterNode<TKey, TRaw>;
32
+ }
33
+ /**
34
+ * Filter daraxti tuguni: maydon sharti, mantiqiy guruh, yoki adapter qo'shadigan
35
+ * raw escape-hatch (`TRaw`, masalan Drizzle `SQL`; default `never`).
36
+ */
37
+ type FilterNode<TKey extends string = string, TRaw = never> = FieldCondition<TKey> | AndGroup<TKey, TRaw> | OrGroup<TKey, TRaw> | NotGroup<TKey, TRaw> | TRaw;
38
+ /** Public filter: daraxt/tugun yoki flat massiv (implicit AND). */
39
+ type Filter<TKey extends string = string, TRaw = never> = FilterNode<TKey, TRaw> | FieldCondition<TKey>[];
40
+ type SortDirection = "asc" | "desc";
41
+ /** Offset (sahifali) paginatsiya meta'si. */
42
+ interface OffsetMeta {
43
+ total_items: number;
44
+ total_pages: number;
45
+ current_page: number;
46
+ per_page: number;
47
+ has_next: boolean;
48
+ has_prev: boolean;
49
+ }
50
+ /** Infinite-scroll paginatsiya meta'si. */
51
+ interface InfiniteMeta {
52
+ limit: number;
53
+ offset: number;
54
+ count: number;
55
+ has_more: boolean;
56
+ next_offset: number | null;
57
+ }
58
+ /** Cursor (keyset) paginatsiya meta'si. */
59
+ interface CursorMeta {
60
+ limit: number;
61
+ has_next: boolean;
62
+ has_prev: boolean;
63
+ next_cursor: string | null;
64
+ prev_cursor: string | null;
65
+ }
66
+
67
+ /**
68
+ * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit
69
+ * tipiga (`TKey`) bog'lanadi; adapterlar uni o'z ustun/maydon kaliti bilan
70
+ * chaqiradi. `TRaw` — guruhlarga (`and/or/not`) qo'shsa bo'ladigan raw tugun tipi.
71
+ *
72
+ * @typeParam TKey - ustun/maydon kaliti (string union).
73
+ * @typeParam TRaw - raw escape-hatch tugun tipi (masalan Drizzle `SQL`).
74
+ * @example
75
+ * ```ts
76
+ * const f = createFilters<"status" | "age">();
77
+ * f.and(f.eq("status", "active"), f.gte("age", 18));
78
+ * ```
79
+ */
80
+ declare function createFilters<TKey extends string = string, TRaw = never>(): {
81
+ eq: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
82
+ ne: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
83
+ gt: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
84
+ gte: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
85
+ lt: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
86
+ lte: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
87
+ contains: (key: TKey, value: string) => FieldCondition<TKey>;
88
+ startsWith: (key: TKey, value: string) => FieldCondition<TKey>;
89
+ endsWith: (key: TKey, value: string) => FieldCondition<TKey>;
90
+ like: (key: TKey, value: string) => FieldCondition<TKey>;
91
+ ilike: (key: TKey, value: string) => FieldCondition<TKey>;
92
+ notLike: (key: TKey, value: string) => FieldCondition<TKey>;
93
+ in: (key: TKey, value: Array<string | number>) => FieldCondition<TKey>;
94
+ notIn: (key: TKey, value: Array<string | number>) => FieldCondition<TKey>;
95
+ between: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => FieldCondition<TKey>;
96
+ /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */
97
+ range: (key: TKey, from: FilterScalar | Date, to: FilterScalar | Date) => FieldCondition<TKey>[];
98
+ isNull: (key: TKey) => FieldCondition<TKey>;
99
+ isNotNull: (key: TKey) => FieldCondition<TKey>;
100
+ and: (...nodes: FilterNode<TKey, TRaw>[]) => AndGroup<TKey, TRaw>;
101
+ or: (...nodes: FilterNode<TKey, TRaw>[]) => OrGroup<TKey, TRaw>;
102
+ not: (node: FilterNode<TKey, TRaw>) => NotGroup<TKey, TRaw>;
103
+ };
104
+ /** Tipsiz (kalitga bog'lanmagan) filter quruvchilar — tez foydalanish uchun. */
105
+ declare const f: {
106
+ eq: (key: string, value: FilterValue) => FieldCondition<string>;
107
+ ne: (key: string, value: FilterValue) => FieldCondition<string>;
108
+ gt: (key: string, value: FilterValue) => FieldCondition<string>;
109
+ gte: (key: string, value: FilterValue) => FieldCondition<string>;
110
+ lt: (key: string, value: FilterValue) => FieldCondition<string>;
111
+ lte: (key: string, value: FilterValue) => FieldCondition<string>;
112
+ contains: (key: string, value: string) => FieldCondition<string>;
113
+ startsWith: (key: string, value: string) => FieldCondition<string>;
114
+ endsWith: (key: string, value: string) => FieldCondition<string>;
115
+ like: (key: string, value: string) => FieldCondition<string>;
116
+ ilike: (key: string, value: string) => FieldCondition<string>;
117
+ notLike: (key: string, value: string) => FieldCondition<string>;
118
+ in: (key: string, value: Array<string | number>) => FieldCondition<string>;
119
+ notIn: (key: string, value: Array<string | number>) => FieldCondition<string>;
120
+ between: (key: string, min: FilterScalar | Date, max: FilterScalar | Date) => FieldCondition<string>;
121
+ /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */
122
+ range: (key: string, from: FilterScalar | Date, to: FilterScalar | Date) => FieldCondition<string>[];
123
+ isNull: (key: string) => FieldCondition<string>;
124
+ isNotNull: (key: string) => FieldCondition<string>;
125
+ and: (...nodes: FilterNode<string, never>[]) => AndGroup<string, never>;
126
+ or: (...nodes: FilterNode<string, never>[]) => OrGroup<string, never>;
127
+ not: (node: FilterNode<string, never>) => NotGroup<string, never>;
128
+ };
129
+
130
+ /**
131
+ * Umumiy pagination default'lari — yagona manba. Backend adapter (`createRegistry`
132
+ * options) va frontend (`createQuery` config) shu qiymatlarni fallback sifatida
133
+ * ishlatadi, shuning uchun ular hech qachon bir-biridan farq qilmaydi.
134
+ */
135
+ /** Offset (list) sahifa o'lchami default'i. */
136
+ declare const DEFAULT_PER_PAGE = 20;
137
+ /** Infinite/cursor `limit` default'i. */
138
+ declare const DEFAULT_LIMIT = 20;
139
+
140
+ export { type AndGroup, type CursorMeta, DEFAULT_LIMIT, DEFAULT_PER_PAGE, FILTER_OPERATORS, type FieldCondition, type Filter, type FilterNode, type FilterOperator, type FilterScalar, type FilterValue, type InfiniteMeta, type NotGroup, type OffsetMeta, type OrGroup, type SortDirection, createFilters, f };
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Filter operatorlari — yagona runtime manba. `FilterOperator` tipi (`types.ts`)
3
+ * shundan chiqadi; `@querykitjs/zod` shu massivdan zod enum quradi.
4
+ */
5
+ declare const FILTER_OPERATORS: readonly ["=", "!=", ">", ">=", "<", "<=", "eq", "ne", "gt", "gte", "lt", "lte", "like", "ilike", "notLike", "contains", "startsWith", "endsWith", "%_%", "%_", "_%", "in", "notIn", "between", "notBetween", "isNull", "isNotNull"];
6
+
7
+ /**
8
+ * `@querykitjs/core` — ORM-agnostik query DSL tiplari. Backend adapterlar
9
+ * (`@querykitjs/drizzle-pg`) va frontend (`@querykitjs/web`) shu bir xil kontraktga
10
+ * tayanadi. Tiplar ustun-kaliti (`TKey`) bo'yicha generic; adapterlar uni o'z
11
+ * kalit tipiga (Drizzle jadval ustuni yoki entity maydoni) ixtisoslashtiradi.
12
+ */
13
+
14
+ /** Qo'llab-quvvatlanadigan filter operatorlari (token va nom aliaslari). */
15
+ type FilterOperator = (typeof FILTER_OPERATORS)[number];
16
+ type FilterScalar = string | number | boolean | Date | null;
17
+ type FilterValue = FilterScalar | FilterScalar[];
18
+ /** Bitta maydon sharti (`operation` default `"="`). */
19
+ interface FieldCondition<TKey extends string = string> {
20
+ key: TKey;
21
+ operation?: FilterOperator;
22
+ value?: FilterValue;
23
+ }
24
+ interface AndGroup<TKey extends string = string, TRaw = never> {
25
+ and: FilterNode<TKey, TRaw>[];
26
+ }
27
+ interface OrGroup<TKey extends string = string, TRaw = never> {
28
+ or: FilterNode<TKey, TRaw>[];
29
+ }
30
+ interface NotGroup<TKey extends string = string, TRaw = never> {
31
+ not: FilterNode<TKey, TRaw>;
32
+ }
33
+ /**
34
+ * Filter daraxti tuguni: maydon sharti, mantiqiy guruh, yoki adapter qo'shadigan
35
+ * raw escape-hatch (`TRaw`, masalan Drizzle `SQL`; default `never`).
36
+ */
37
+ type FilterNode<TKey extends string = string, TRaw = never> = FieldCondition<TKey> | AndGroup<TKey, TRaw> | OrGroup<TKey, TRaw> | NotGroup<TKey, TRaw> | TRaw;
38
+ /** Public filter: daraxt/tugun yoki flat massiv (implicit AND). */
39
+ type Filter<TKey extends string = string, TRaw = never> = FilterNode<TKey, TRaw> | FieldCondition<TKey>[];
40
+ type SortDirection = "asc" | "desc";
41
+ /** Offset (sahifali) paginatsiya meta'si. */
42
+ interface OffsetMeta {
43
+ total_items: number;
44
+ total_pages: number;
45
+ current_page: number;
46
+ per_page: number;
47
+ has_next: boolean;
48
+ has_prev: boolean;
49
+ }
50
+ /** Infinite-scroll paginatsiya meta'si. */
51
+ interface InfiniteMeta {
52
+ limit: number;
53
+ offset: number;
54
+ count: number;
55
+ has_more: boolean;
56
+ next_offset: number | null;
57
+ }
58
+ /** Cursor (keyset) paginatsiya meta'si. */
59
+ interface CursorMeta {
60
+ limit: number;
61
+ has_next: boolean;
62
+ has_prev: boolean;
63
+ next_cursor: string | null;
64
+ prev_cursor: string | null;
65
+ }
66
+
67
+ /**
68
+ * Filter shartlarini tipli, ergonomik quruvchilar to'plamini qaytaradi. Kalit
69
+ * tipiga (`TKey`) bog'lanadi; adapterlar uni o'z ustun/maydon kaliti bilan
70
+ * chaqiradi. `TRaw` — guruhlarga (`and/or/not`) qo'shsa bo'ladigan raw tugun tipi.
71
+ *
72
+ * @typeParam TKey - ustun/maydon kaliti (string union).
73
+ * @typeParam TRaw - raw escape-hatch tugun tipi (masalan Drizzle `SQL`).
74
+ * @example
75
+ * ```ts
76
+ * const f = createFilters<"status" | "age">();
77
+ * f.and(f.eq("status", "active"), f.gte("age", 18));
78
+ * ```
79
+ */
80
+ declare function createFilters<TKey extends string = string, TRaw = never>(): {
81
+ eq: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
82
+ ne: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
83
+ gt: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
84
+ gte: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
85
+ lt: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
86
+ lte: (key: TKey, value: FilterValue) => FieldCondition<TKey>;
87
+ contains: (key: TKey, value: string) => FieldCondition<TKey>;
88
+ startsWith: (key: TKey, value: string) => FieldCondition<TKey>;
89
+ endsWith: (key: TKey, value: string) => FieldCondition<TKey>;
90
+ like: (key: TKey, value: string) => FieldCondition<TKey>;
91
+ ilike: (key: TKey, value: string) => FieldCondition<TKey>;
92
+ notLike: (key: TKey, value: string) => FieldCondition<TKey>;
93
+ in: (key: TKey, value: Array<string | number>) => FieldCondition<TKey>;
94
+ notIn: (key: TKey, value: Array<string | number>) => FieldCondition<TKey>;
95
+ between: (key: TKey, min: FilterScalar | Date, max: FilterScalar | Date) => FieldCondition<TKey>;
96
+ /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */
97
+ range: (key: TKey, from: FilterScalar | Date, to: FilterScalar | Date) => FieldCondition<TKey>[];
98
+ isNull: (key: TKey) => FieldCondition<TKey>;
99
+ isNotNull: (key: TKey) => FieldCondition<TKey>;
100
+ and: (...nodes: FilterNode<TKey, TRaw>[]) => AndGroup<TKey, TRaw>;
101
+ or: (...nodes: FilterNode<TKey, TRaw>[]) => OrGroup<TKey, TRaw>;
102
+ not: (node: FilterNode<TKey, TRaw>) => NotGroup<TKey, TRaw>;
103
+ };
104
+ /** Tipsiz (kalitga bog'lanmagan) filter quruvchilar — tez foydalanish uchun. */
105
+ declare const f: {
106
+ eq: (key: string, value: FilterValue) => FieldCondition<string>;
107
+ ne: (key: string, value: FilterValue) => FieldCondition<string>;
108
+ gt: (key: string, value: FilterValue) => FieldCondition<string>;
109
+ gte: (key: string, value: FilterValue) => FieldCondition<string>;
110
+ lt: (key: string, value: FilterValue) => FieldCondition<string>;
111
+ lte: (key: string, value: FilterValue) => FieldCondition<string>;
112
+ contains: (key: string, value: string) => FieldCondition<string>;
113
+ startsWith: (key: string, value: string) => FieldCondition<string>;
114
+ endsWith: (key: string, value: string) => FieldCondition<string>;
115
+ like: (key: string, value: string) => FieldCondition<string>;
116
+ ilike: (key: string, value: string) => FieldCondition<string>;
117
+ notLike: (key: string, value: string) => FieldCondition<string>;
118
+ in: (key: string, value: Array<string | number>) => FieldCondition<string>;
119
+ notIn: (key: string, value: Array<string | number>) => FieldCondition<string>;
120
+ between: (key: string, min: FilterScalar | Date, max: FilterScalar | Date) => FieldCondition<string>;
121
+ /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */
122
+ range: (key: string, from: FilterScalar | Date, to: FilterScalar | Date) => FieldCondition<string>[];
123
+ isNull: (key: string) => FieldCondition<string>;
124
+ isNotNull: (key: string) => FieldCondition<string>;
125
+ and: (...nodes: FilterNode<string, never>[]) => AndGroup<string, never>;
126
+ or: (...nodes: FilterNode<string, never>[]) => OrGroup<string, never>;
127
+ not: (node: FilterNode<string, never>) => NotGroup<string, never>;
128
+ };
129
+
130
+ /**
131
+ * Umumiy pagination default'lari — yagona manba. Backend adapter (`createRegistry`
132
+ * options) va frontend (`createQuery` config) shu qiymatlarni fallback sifatida
133
+ * ishlatadi, shuning uchun ular hech qachon bir-biridan farq qilmaydi.
134
+ */
135
+ /** Offset (list) sahifa o'lchami default'i. */
136
+ declare const DEFAULT_PER_PAGE = 20;
137
+ /** Infinite/cursor `limit` default'i. */
138
+ declare const DEFAULT_LIMIT = 20;
139
+
140
+ export { type AndGroup, type CursorMeta, DEFAULT_LIMIT, DEFAULT_PER_PAGE, FILTER_OPERATORS, type FieldCondition, type Filter, type FilterNode, type FilterOperator, type FilterScalar, type FilterValue, type InfiniteMeta, type NotGroup, type OffsetMeta, type OrGroup, type SortDirection, createFilters, f };
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ // src/filters.ts
2
+ function field(key, operation, value) {
3
+ return { key, operation, value };
4
+ }
5
+ function createFilters() {
6
+ return {
7
+ eq: (key, value) => field(key, "=", value),
8
+ ne: (key, value) => field(key, "!=", value),
9
+ gt: (key, value) => field(key, ">", value),
10
+ gte: (key, value) => field(key, ">=", value),
11
+ lt: (key, value) => field(key, "<", value),
12
+ lte: (key, value) => field(key, "<=", value),
13
+ contains: (key, value) => field(key, "%_%", value),
14
+ startsWith: (key, value) => field(key, "%_", value),
15
+ endsWith: (key, value) => field(key, "_%", value),
16
+ like: (key, value) => field(key, "like", value),
17
+ ilike: (key, value) => field(key, "ilike", value),
18
+ notLike: (key, value) => field(key, "notLike", value),
19
+ in: (key, value) => field(key, "in", value),
20
+ notIn: (key, value) => field(key, "notIn", value),
21
+ between: (key, min, max) => field(key, "between", [min, max]),
22
+ /** Diapazon — ikkita shart (`>=` va `<=`) massivi (flat filterga spread qilinadi). */
23
+ range: (key, from, to) => [
24
+ field(key, ">=", from),
25
+ field(key, "<=", to)
26
+ ],
27
+ isNull: (key) => field(key, "isNull"),
28
+ isNotNull: (key) => field(key, "isNotNull"),
29
+ and: (...nodes) => ({ and: nodes }),
30
+ or: (...nodes) => ({ or: nodes }),
31
+ not: (node) => ({ not: node })
32
+ };
33
+ }
34
+ var f = createFilters();
35
+
36
+ // src/defaults.ts
37
+ var DEFAULT_PER_PAGE = 20;
38
+ var DEFAULT_LIMIT = 20;
39
+
40
+ // src/operators.ts
41
+ var FILTER_OPERATORS = [
42
+ "=",
43
+ "!=",
44
+ ">",
45
+ ">=",
46
+ "<",
47
+ "<=",
48
+ "eq",
49
+ "ne",
50
+ "gt",
51
+ "gte",
52
+ "lt",
53
+ "lte",
54
+ "like",
55
+ "ilike",
56
+ "notLike",
57
+ "contains",
58
+ "startsWith",
59
+ "endsWith",
60
+ "%_%",
61
+ // contains
62
+ "%_",
63
+ // startsWith
64
+ "_%",
65
+ // endsWith
66
+ "in",
67
+ "notIn",
68
+ "between",
69
+ "notBetween",
70
+ "isNull",
71
+ "isNotNull"
72
+ ];
73
+
74
+ export { DEFAULT_LIMIT, DEFAULT_PER_PAGE, FILTER_OPERATORS, createFilters, f };
75
+ //# sourceMappingURL=index.js.map
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/filters.ts","../src/defaults.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 /** 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 = createFilters();\n","/**\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 * 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"]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@querykitjs/core",
3
+ "version": "1.0.0",
4
+ "description": "ORM-agnostic query DSL shared by querykit packages — filters, operators & wire types.",
5
+ "type": "module",
6
+ "author": {
7
+ "name": "Suhrobbek Soatov",
8
+ "url": "https://soatov.uz",
9
+ "email": "svkhrobbeck@gmail.com"
10
+ },
11
+ "license": "MIT",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/svkhrobbeck/querykit.git",
15
+ "directory": "packages/core"
16
+ },
17
+ "homepage": "https://github.com/svkhrobbeck/querykit/tree/main/packages/core#readme",
18
+ "bugs": {
19
+ "url": "https://github.com/svkhrobbeck/querykit/issues"
20
+ },
21
+ "main": "./dist/index.cjs",
22
+ "module": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.cjs"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "README.en.md",
35
+ "LICENSE"
36
+ ],
37
+ "sideEffects": false,
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "dev": "tsup --watch",
44
+ "typecheck": "tsc --noEmit",
45
+ "test:smoke": "bun run test/smoke.ts"
46
+ },
47
+ "keywords": [
48
+ "querykit",
49
+ "query",
50
+ "filter",
51
+ "dsl",
52
+ "operators",
53
+ "pagination",
54
+ "typescript"
55
+ ]
56
+ }