@querykitjs/web 2.0.0 → 3.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/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as Sort, C as CursorParams, a as CursorPayload, I as InfiniteParams, b as InfinitePayload, L as ListParams, c as ListPayload, P as Params, Q as QueryPayload, F as Filter, d as FieldCondition, e as FilterNode, f as SortInput } from './registry-DPIEOvLW.js';
2
- export { A as AdapterName, g as AndGroup, h as CursorMeta, i as CursorResult, D as DrizzleWith, j as FieldDescriptor, k as FieldKey, l as FilterOperator, m as FilterScalar, n as FilterValue, o as InfiniteMeta, p as InfiniteResult, q as ListResult, r as ListSchema, M as Meta, s as MongoosePopulate, N as NotGroup, O as OrGroup, t as PrismaInclude, R as RawCursorMeta, u as RawInfiniteMeta, v as RawMeta, w as Registry, x as RegistryConfig, y as RegistryDefaults, z as Resource, B as ResourceCursorParams, E as ResourceInfiniteParams, G as ResourceKeys, H as ResourceListParams, J as ResourceParams, K as SortDirection, U as UrlConfig, W as WithFor, T as createFilters, V as createRegistry, X as decodeSort, Y as defineListSchema, Z as encodeSort, _ as readListParams, $ as resetParams, a0 as schemaToFilter, a1 as searchParamsToPayload, a2 as setPage, a3 as setParam, a4 as setSize, a5 as setSort } from './registry-DPIEOvLW.js';
1
+ import { S as Sort, C as CursorParams, a as CursorPayload, I as InfiniteParams, b as InfinitePayload, L as ListParams, c as ListPayload, P as Params, Q as QueryPayload, F as Filter, d as FieldCondition, e as FilterNode, f as SortInput } from './registry-DbZQk28q.js';
2
+ export { A as AdapterName, g as AndGroup, h as CursorMeta, i as CursorResult, D as DrizzleWith, j as FieldDescriptor, k as FieldKey, l as FilterOperator, m as FilterScalar, n as FilterValue, o as InfiniteMeta, p as InfiniteResult, q as ListResult, r as ListSchema, M as Meta, s as MongoosePopulate, N as NotGroup, O as OrGroup, t as PrismaInclude, R as RawCursorMeta, u as RawInfiniteMeta, v as RawMeta, w as Registry, x as RegistryConfig, y as RegistryDefaults, z as Resource, B as ResourceCursorParams, E as ResourceInfiniteParams, G as ResourceKeys, H as ResourceListParams, J as ResourceParams, K as SortDirection, T as SortItem, U as UrlConfig, W as WithFor, V as createFilters, X as createRegistry, Y as decodeSort, Z as defineListSchema, _ as encodeSort, $ as readListParams, a0 as resetParams, a1 as schemaToFilter, a2 as searchParamsToPayload, a3 as setPage, a4 as setParam, a5 as setSize, a6 as setSort } from './registry-DbZQk28q.js';
3
3
  export { f } from '@querykitjs/core';
4
4
 
5
5
  /** {@link createQuery} sozlamalari — wire field nomlari va default qiymatlar. */
@@ -20,7 +20,7 @@ interface QueryConfig {
20
20
  /** Bo'sh qiymatli filterlarni tashlash (default `true`). */
21
21
  pruneEmpty?: boolean;
22
22
  }
23
- /** `"-createdAt"` yoki `{ name, direction }` → `{ name, direction }`. */
23
+ /** Normalize a sort array (objects and/or `"-field"` strings) → canonical `SortItem[]`; empty → fallback. */
24
24
  declare function normalizeSort(input: SortInput | undefined, fallback: Sort): Sort;
25
25
  /** Filterni normalizatsiya qiladi: bo'sh shartlarni prune. Massiv → flat massiv. */
26
26
  declare function normalizeFilter(filter: Filter | undefined, prune: boolean): FieldCondition[] | FilterNode;
@@ -48,7 +48,7 @@ declare function createQuery(config?: QueryConfig): {
48
48
  * ```ts
49
49
  * const payload = buildParams({
50
50
  * filter: [{ key: "name", operation: "%_%", value: s }],
51
- * sort: "-createdAt",
51
+ * sort: [{ key: "createdAt", direction: "desc" }],
52
52
  * with: { supervisor: true },
53
53
  * });
54
54
  * ```
@@ -59,8 +59,8 @@ declare function buildParams(input?: Params): QueryPayload;
59
59
  *
60
60
  * @example
61
61
  * ```ts
62
- * const payload = buildListParams({ filter, sort: "-createdAt", page: 2, perPage: 20 });
63
- * // -> { filter, sort:{name,direction}, columns, with, page, perPage }
62
+ * const payload = buildListParams({ filter, sort: [{ key: "createdAt", direction: "desc" }], page: 2, perPage: 20 });
63
+ * // -> { filter, sort: [{ key, direction }], columns, with, page, perPage }
64
64
  * ```
65
65
  */
66
66
  declare function buildListParams(input?: ListParams): ListPayload;
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ var DEFAULTS = {
18
18
  cursorField: "cursor",
19
19
  defaultPerPage: DEFAULT_PER_PAGE,
20
20
  defaultLimit: DEFAULT_LIMIT,
21
- defaultSort: { name: "createdAt", direction: "desc" },
21
+ defaultSort: [{ key: "createdAt", direction: "desc" }],
22
22
  pruneEmpty: true
23
23
  };
24
24
  function isEmptyValue(value) {
@@ -26,13 +26,18 @@ function isEmptyValue(value) {
26
26
  if (Array.isArray(value) && value.length === 0) return true;
27
27
  return false;
28
28
  }
29
- function normalizeSort(input, fallback) {
30
- if (input === void 0 || input === "") return fallback;
31
- if (typeof input === "string") {
32
- const desc = input.startsWith("-");
33
- return { name: desc ? input.slice(1) : input, direction: desc ? "desc" : "asc" };
29
+ function toSortItem(item) {
30
+ if (typeof item === "string") {
31
+ const desc = item.startsWith("-");
32
+ const key = (desc ? item.slice(1) : item).trim();
33
+ return key ? { key, direction: desc ? "desc" : "asc" } : void 0;
34
34
  }
35
- return { name: input.name ?? fallback.name, direction: input.direction ?? fallback.direction };
35
+ return item && item.key ? { key: item.key, direction: item.direction ?? "asc" } : void 0;
36
+ }
37
+ function normalizeSort(input, fallback) {
38
+ if (!input || input.length === 0) return fallback;
39
+ const items = input.map(toSortItem).filter((i) => i !== void 0);
40
+ return items.length ? items : fallback;
36
41
  }
37
42
  function normalizeCondition(condition, prune) {
38
43
  const operation = condition.operation ?? "=";
@@ -171,12 +176,14 @@ var URL_DEFAULTS = {
171
176
  };
172
177
  function decodeSort(value) {
173
178
  if (!value) return void 0;
174
- const desc = value.startsWith("-");
175
- return { name: desc ? value.slice(1) : value, direction: desc ? "desc" : "asc" };
179
+ const items = value.split(",").map((s) => s.trim()).filter(Boolean).map((tok) => {
180
+ const desc = tok.startsWith("-");
181
+ return { key: desc ? tok.slice(1) : tok, direction: desc ? "desc" : "asc" };
182
+ }).filter((i) => i.key);
183
+ return items.length ? items : void 0;
176
184
  }
177
185
  function encodeSort(sort) {
178
- if (!sort.name) return "";
179
- return (sort.direction === "desc" ? "-" : "") + sort.name;
186
+ return sort.map((i) => typeof i === "string" ? i.trim() : i && i.key ? (i.direction === "desc" ? "-" : "") + i.key : "").filter(Boolean).join(",");
180
187
  }
181
188
  function schemaToFilter(schema, searchParams) {
182
189
  const conditions = [];
@@ -223,7 +230,7 @@ function readListParams(schema, searchParams, url = {}) {
223
230
  const size = searchParams.get(cfg.sizeParam);
224
231
  return {
225
232
  filter: schemaToFilter(schema, searchParams),
226
- sort: searchParams.get(cfg.sortParam) ?? void 0,
233
+ sort: decodeSort(searchParams.get(cfg.sortParam)),
227
234
  page: Number(searchParams.get(cfg.pageParam)) || 1,
228
235
  perPage: size ? Number(size) : void 0
229
236
  };
@@ -259,7 +266,7 @@ function setSort(searchParams, sort, url = {}) {
259
266
  const cfg = { ...URL_DEFAULTS, ...url };
260
267
  const next = clone(searchParams);
261
268
  next.delete(cfg.pageParam);
262
- const encoded = typeof sort === "string" ? sort : encodeSort(sort);
269
+ const encoded = encodeSort(sort);
263
270
  if (encoded) next.set(cfg.sortParam, encoded);
264
271
  else next.delete(cfg.sortParam);
265
272
  return next;
@@ -276,12 +283,12 @@ function resetParams(searchParams, keep = []) {
276
283
  // src/registry.ts
277
284
  function createRegistry(config) {
278
285
  const defaults = config.defaults ?? {};
279
- const sort = typeof defaults.sort === "string" ? decodeSort(defaults.sort) : defaults.sort;
286
+ const sort = normalizeSort(defaults.sort, []);
280
287
  const cursorOrder = defaults.cursor?.order ?? "asc";
281
288
  const qcfg = {};
282
289
  if (defaults.perPage !== void 0) qcfg.defaultPerPage = defaults.perPage;
283
290
  if (defaults.limit !== void 0) qcfg.defaultLimit = defaults.limit;
284
- if (sort?.name) qcfg.defaultSort = sort;
291
+ if (sort.length) qcfg.defaultSort = sort;
285
292
  if (config.pruneEmpty !== void 0) qcfg.pruneEmpty = config.pruneEmpty;
286
293
  const q = createQuery(qcfg);
287
294
  const parseList = (raw) => ({ data: raw?.data ?? [], meta: mapMeta(raw?.meta) });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/filters.ts","../src/query.ts","../src/meta.ts","../src/schema.ts","../src/url.ts","../src/registry.ts"],"names":["coreCreateFilters","f"],"mappings":"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","file":"index.js","sourcesContent":["import { createFilters as coreCreateFilters, f } from \"@querykitjs/core\";\n\nimport type { AndGroup, FieldCondition, FieldKey, FilterNode, FilterScalar, FilterValue, NotGroup, OrGroup } from \"./types\";\n\n/** Keys of `T` whose value is assignable to `V`. */\ntype ValueKeys<T, V> = { [K in keyof T]-?: NonNullable<T[K]> extends V ? Extract<K, string> : never }[keyof T];\n/** String-valued field keys (for `contains`/`startsWith`/`like`/…). */\ntype StringKeys<T> = ValueKeys<T, string>;\n/** Comparable field keys — string/number/bigint/Date (for `gt`/`between`/…). */\ntype ComparableKeys<T> = ValueKeys<T, string | number | bigint | Date>;\n\ntype Node<T> = FilterNode<T>;\n\n/**\n * Field-type-aware filter builder: string-match operators are offered only for\n * string fields, comparison only for comparable fields, so nonsensical filters\n * (e.g. `contains` on a number) are compile errors. Runtime is\n * `@querykitjs/core`'s builder unchanged.\n */\nexport interface TypedFilters<T> {\n eq<K extends FieldKey<T>>(key: K, value: FilterValue): FieldCondition<T>;\n ne<K extends FieldKey<T>>(key: K, value: FilterValue): FieldCondition<T>;\n\n gt<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n gte<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n lt<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n lte<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n between<K extends ComparableKeys<T>>(key: K, min: FilterScalar | Date, max: FilterScalar | Date): FieldCondition<T>;\n range<K extends ComparableKeys<T>>(key: K, from: FilterScalar | Date, to: FilterScalar | Date): FieldCondition<T>[];\n\n contains<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n startsWith<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n endsWith<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n like<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n ilike<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n notLike<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n\n in<K extends FieldKey<T>>(key: K, value: Array<string | number>): FieldCondition<T>;\n notIn<K extends FieldKey<T>>(key: K, value: Array<string | number>): FieldCondition<T>;\n\n isNull<K extends FieldKey<T>>(key: K): FieldCondition<T>;\n isNotNull<K extends FieldKey<T>>(key: K): FieldCondition<T>;\n\n and(...nodes: Node<T>[]): AndGroup<T>;\n or(...nodes: Node<T>[]): OrGroup<T>;\n not(node: Node<T>): NotGroup<T>;\n}\n\n/**\n * Typed, ergonomic filter builder for an entity — field-name autocomplete plus\n * field-type-aware operators (see {@link TypedFilters}).\n *\n * @typeParam T - the list entity type (`Buyer`, `Product`, …).\n * @example\n * ```ts\n * const f = createFilters<Buyer>();\n * const filter = f.and(f.contains(\"buyerName\", s), f.gte(\"age\", 18));\n * // f.contains(\"age\", …) → compile error (age is a number)\n * ```\n */\nexport function createFilters<T = Record<string, unknown>>(): TypedFilters<T> {\n return coreCreateFilters<FieldKey<T>>() as unknown as TypedFilters<T>;\n}\n\n/** Untyped (entity-agnostic) filter builder — quick use, no field-type checks. */\nexport { f };\n","import { DEFAULT_LIMIT, DEFAULT_PER_PAGE } from \"@querykitjs/core\";\n\nimport type {\n CursorParams,\n CursorPayload,\n FieldCondition,\n Filter,\n FilterNode,\n FilterValue,\n InfiniteParams,\n InfinitePayload,\n ListParams,\n ListPayload,\n Params,\n QueryPayload,\n Sort,\n SortInput,\n} from \"./types\";\n\n/** {@link createQuery} sozlamalari — wire field nomlari va default qiymatlar. */\nexport interface QueryConfig {\n filterField?: string;\n sortField?: string;\n columnsField?: string;\n withField?: string;\n withDeletedField?: string;\n pageField?: string;\n perPageField?: string;\n limitField?: string;\n offsetField?: string;\n cursorField?: string;\n defaultPerPage?: number;\n defaultLimit?: number;\n defaultSort?: Sort;\n /** Bo'sh qiymatli filterlarni tashlash (default `true`). */\n pruneEmpty?: boolean;\n}\n\nconst DEFAULTS: Required<QueryConfig> = {\n filterField: \"filter\",\n sortField: \"sort\",\n columnsField: \"columns\",\n withField: \"with\",\n withDeletedField: \"withDeleted\",\n pageField: \"page\",\n perPageField: \"perPage\",\n limitField: \"limit\",\n offsetField: \"offset\",\n cursorField: \"cursor\",\n defaultPerPage: DEFAULT_PER_PAGE,\n defaultLimit: DEFAULT_LIMIT,\n defaultSort: { name: \"createdAt\", direction: \"desc\" },\n pruneEmpty: true,\n};\n\n/** Bo'sh (yuborilmaydigan) qiymatmi: undefined/null/\"\"/[] . `false`/`0` — bo'sh emas. */\nfunction isEmptyValue(value: FilterValue | undefined): boolean {\n if (value === undefined || value === null || value === \"\") return true;\n if (Array.isArray(value) && value.length === 0) return true;\n return false;\n}\n\n/** `\"-createdAt\"` yoki `{ name, direction }` → `{ name, direction }`. */\nexport function normalizeSort(input: SortInput | undefined, fallback: Sort): Sort {\n if (input === undefined || input === \"\") return fallback;\n if (typeof input === \"string\") {\n const desc = input.startsWith(\"-\");\n return { name: desc ? input.slice(1) : input, direction: desc ? \"desc\" : \"asc\" };\n }\n return { name: input.name ?? fallback.name, direction: input.direction ?? fallback.direction };\n}\n\nfunction normalizeCondition(condition: FieldCondition, prune: boolean): FieldCondition | undefined {\n const operation = condition.operation ?? \"=\";\n const noValue = operation === \"isNull\" || operation === \"isNotNull\";\n const value = condition.value as FilterValue;\n\n if (!noValue && prune && isEmptyValue(value)) return undefined;\n\n const out: FieldCondition = { key: condition.key, operation };\n if (!noValue) out.value = value;\n return out;\n}\n\nfunction normalizeNode(node: FilterNode, prune: boolean): FilterNode | undefined {\n if (\"and\" in node) {\n const kids = node.and.map(n => normalizeNode(n, prune)).filter((n): n is FilterNode => !!n);\n return kids.length ? { and: kids } : undefined;\n }\n if (\"or\" in node) {\n const kids = node.or.map(n => normalizeNode(n, prune)).filter((n): n is FilterNode => !!n);\n return kids.length ? { or: kids } : undefined;\n }\n if (\"not\" in node) {\n const inner = normalizeNode(node.not, prune);\n return inner ? { not: inner } : undefined;\n }\n return normalizeCondition(node, prune);\n}\n\n/** Filterni normalizatsiya qiladi: bo'sh shartlarni prune. Massiv → flat massiv. */\nexport function normalizeFilter(filter: Filter | undefined, prune: boolean): FieldCondition[] | FilterNode {\n if (!filter) return [];\n if (Array.isArray(filter)) {\n return filter.map(c => normalizeCondition(c, prune)).filter((c): c is FieldCondition => !!c);\n }\n return normalizeNode(filter, prune) ?? [];\n}\n\n/** Umumiy qism: filter/columns/with (+ withDeleted). Sort qo'shilmaydi. */\nfunction buildBase(input: Params, cfg: Required<QueryConfig>): Record<string, unknown> {\n const base: Record<string, unknown> = {\n [cfg.filterField]: normalizeFilter(input.filter, cfg.pruneEmpty),\n [cfg.columnsField]: input.columns ?? {},\n [cfg.withField]: input.with ?? {},\n };\n if (input.withDeleted !== undefined) base[cfg.withDeletedField] = input.withDeleted;\n return base;\n}\n\nfunction clampInt(value: number | undefined, fallback: number): number {\n return value === undefined || value < 1 || Number.isNaN(value) ? fallback : Math.trunc(value);\n}\n\nfunction build(input: Params, cfg: Required<QueryConfig>): Record<string, unknown> {\n return { ...buildBase(input, cfg), [cfg.sortField]: normalizeSort(input.sort, cfg.defaultSort) };\n}\n\nfunction buildList(input: ListParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n return {\n ...build(input, cfg),\n [cfg.pageField]: clampInt(input.page, 1), // page >= 1 (kasr/0/manfiy → 1)\n [cfg.perPageField]: clampInt(input.perPage, cfg.defaultPerPage),\n };\n}\n\nfunction buildInfinite(input: InfiniteParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n return {\n ...build(input, cfg),\n [cfg.limitField]: clampInt(input.limit, cfg.defaultLimit),\n [cfg.offsetField]: input.offset && input.offset > 0 ? Math.trunc(input.offset) : 0,\n };\n}\n\nfunction buildCursor(input: CursorParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n ...buildBase(input, cfg),\n [cfg.limitField]: clampInt(input.limit, cfg.defaultLimit),\n [cfg.cursorField]: input.cursor ?? null,\n order: input.order ?? \"asc\",\n direction: input.direction ?? \"forward\",\n };\n if (input.cursorKey !== undefined) payload.cursorKey = input.cursorKey;\n return payload;\n}\n\n/**\n * Config bilan bog'langan query quruvchilarni qaytaradi. Boshqa backend field\n * nomlari (masalan `perPage`, `withPopulates`) uchun.\n *\n * @example\n * ```ts\n * const q = createQuery({ withField: \"withPopulates\", defaultPerPage: 20 });\n * const params = q.list({ filter, page, perPage });\n * ```\n */\nexport function createQuery(config: QueryConfig = {}) {\n const cfg = { ...DEFAULTS, ...config };\n return {\n params: (input: Params = {}) => build(input, cfg),\n list: (input: ListParams = {}) => buildList(input, cfg),\n infinite: (input: InfiniteParams = {}) => buildInfinite(input, cfg),\n cursor: (input: CursorParams = {}) => buildCursor(input, cfg),\n };\n}\n\n/**\n * Params'ni normalizatsiya qiladi (paginatsiyasiz): filter prune, sort decode,\n * `with`/`columns` pass-through. Default querykit wire-format.\n *\n * @example\n * ```ts\n * const payload = buildParams({\n * filter: [{ key: \"name\", operation: \"%_%\", value: s }],\n * sort: \"-createdAt\",\n * with: { supervisor: true },\n * });\n * ```\n */\nexport function buildParams(input: Params = {}): QueryPayload {\n return build(input, DEFAULTS) as unknown as QueryPayload;\n}\n\n/**\n * {@link buildParams} + `page`/`perPage` (default `perPage = 20`, `@querykitjs/core`).\n *\n * @example\n * ```ts\n * const payload = buildListParams({ filter, sort: \"-createdAt\", page: 2, perPage: 20 });\n * // -> { filter, sort:{name,direction}, columns, with, page, perPage }\n * ```\n */\nexport function buildListParams(input: ListParams = {}): ListPayload {\n return buildList(input, DEFAULTS) as unknown as ListPayload;\n}\n\n/**\n * Infinite-scroll payload — {@link buildParams} + `limit`/`offset` (default\n * `limit = 20`).\n *\n * @example\n * ```ts\n * const payload = buildInfiniteParams({ filter, limit: 20, offset: 40 });\n * // -> { filter, sort, columns, with, limit, offset }\n * ```\n */\nexport function buildInfiniteParams(input: InfiniteParams = {}): InfinitePayload {\n return buildInfinite(input, DEFAULTS) as unknown as InfinitePayload;\n}\n\n/**\n * Cursor (keyset) payload — `sort` o'rniga `order`/`direction`. `cursor`\n * oldingi javob meta'sidagi `next_cursor`/`prev_cursor` tokeni.\n *\n * @example\n * ```ts\n * const payload = buildCursorParams({ filter, limit: 20, cursor, order: \"asc\" });\n * // -> { filter, columns, with, limit, cursor, order, direction }\n * ```\n */\nexport function buildCursorParams(input: CursorParams = {}): CursorPayload {\n return buildCursor(input, DEFAULTS) as unknown as CursorPayload;\n}\n","import type { CursorMeta, InfiniteMeta, Meta, RawCursorMeta, RawInfiniteMeta, RawMeta } from \"./types\";\n\n/**\n * **Offset** (list) meta'sini snake_case → camelCase map qiladi.\n *\n * @example\n * ```ts\n * const { data, meta } = (await http.post(\"/buyers/list\", params)).data;\n * setMeta(mapMeta(meta)); // { totalPages, totalCount, currentPage, perPage, hasNext, hasPrev }\n * ```\n */\nexport function mapMeta(raw?: RawMeta | null): Meta {\n return {\n totalPages: raw?.total_pages ?? 0,\n totalCount: raw?.total_items ?? 0,\n currentPage: raw?.current_page ?? 0,\n perPage: raw?.per_page ?? 0,\n hasNext: raw?.has_next ?? false,\n hasPrev: raw?.has_prev ?? false,\n };\n}\n\n/**\n * **Infinite-scroll** meta'sini map qiladi.\n *\n * @example\n * ```ts\n * const m = mapInfiniteMeta(res.meta); // { limit, offset, count, hasMore, nextOffset }\n * if (m.hasMore) load(m.nextOffset);\n * ```\n */\nexport function mapInfiniteMeta(raw?: RawInfiniteMeta | null): InfiniteMeta {\n return {\n limit: raw?.limit ?? 0,\n offset: raw?.offset ?? 0,\n count: raw?.count ?? 0,\n hasMore: raw?.has_more ?? false,\n nextOffset: raw?.next_offset ?? null,\n };\n}\n\n/**\n * **Cursor** (keyset) meta'sini map qiladi.\n *\n * @example\n * ```ts\n * const m = mapCursorMeta(res.meta); // { limit, hasNext, hasPrev, nextCursor, prevCursor }\n * ```\n */\nexport function mapCursorMeta(raw?: RawCursorMeta | null): CursorMeta {\n return {\n limit: raw?.limit ?? 0,\n hasNext: raw?.has_next ?? false,\n hasPrev: raw?.has_prev ?? false,\n nextCursor: raw?.next_cursor ?? null,\n prevCursor: raw?.prev_cursor ?? null,\n };\n}\n","import type { FilterOperator, FilterValue } from \"./types\";\n\n/** Forbids the listed keys (`?: never`) so modes can't be mixed. */\ntype Without<K extends string> = { [P in K]?: never };\n\n/** Filter-key override, shared by the single-key modes. */\ninterface KeyBase {\n /** Backend field key (defaults to the schema param name). */\n key?: string;\n}\n\n/**\n * **Simple** mode — one URL param → one condition. `operation` defaults to `\"=\"`;\n * `trim`/`default`/`split` shape the value.\n */\nexport interface SimpleField extends KeyBase {\n /** Filter operation (default `\"=\"`). */\n operation?: FilterOperator;\n /** Trim the string value. */\n trim?: boolean;\n /** Value used when the URL param is absent. */\n default?: FilterValue;\n /**\n * For array operations (`in`/`notIn`): split a comma-string into an array.\n * `true` → delimiter `\",\"`; or a custom delimiter. Guarded: absent/empty →\n * pruned; parts trimmed, empties dropped.\n */\n split?: boolean | string;\n}\n\n/** **Range** mode — `[fromParam, toParam]` → two inclusive conditions (`>=`, `<=`). */\nexport interface RangeField extends KeyBase {\n range: [string, string];\n}\n\n/** **Between** mode — `[fromParam, toParam]` → one `between` condition (2-tuple). */\nexport interface BetweenField extends KeyBase {\n between: [string, string];\n}\n\n/** **Search** mode — one URL param → OR of `contains` across these field keys. */\nexport interface SearchField {\n search: string[];\n trim?: boolean;\n default?: FilterValue;\n}\n\n/**\n * One list field's URL→filter mapping. Exactly **one mode** per descriptor —\n * Simple / Range / Between / Search — enforced at compile time (mixing e.g.\n * `range` + `search`, or `range` + `between`, is a type error).\n */\nexport type FieldDescriptor =\n | (SimpleField & Without<\"range\" | \"between\" | \"search\">)\n | (RangeField & Without<\"operation\" | \"trim\" | \"default\" | \"split\" | \"between\" | \"search\">)\n | (BetweenField & Without<\"operation\" | \"trim\" | \"default\" | \"split\" | \"range\" | \"search\">)\n | (SearchField & Without<\"key\" | \"operation\" | \"split\" | \"range\" | \"between\">);\n\n/** URL param → {@link FieldDescriptor} map. */\nexport type ListSchema = Record<string, FieldDescriptor>;\n\n/**\n * Declares a list filter schema (identity helper — preserves the literal type).\n * Maps URL params to `{key, operation, value}` conditions so pages never build\n * `IFilter[]` by hand.\n *\n * @example\n * ```ts\n * const buyersSchema = defineListSchema({\n * id: { operation: \"=\" },\n * status: { operation: \"=\", default: \"active\" },\n * ids: { operation: \"in\", split: true },\n * q: { search: [\"name\", \"email\"] },\n * createdAt: { range: [\"fromDate\", \"toDate\"] },\n * });\n * ```\n */\nexport function defineListSchema<S extends ListSchema>(schema: S): S {\n return schema;\n}\n","import { buildListParams } from \"./query\";\nimport type { FieldDescriptor, ListSchema } from \"./schema\";\nimport type { FieldCondition, Filter, FilterNode, FilterValue, ListParams, ListPayload, Sort, SortInput } from \"./types\";\n\n/** URL param nomlari (sahifa/o'lcham/sort) — sozlanadigan. */\nexport interface UrlConfig {\n pageParam?: string;\n sizeParam?: string;\n sortParam?: string;\n}\n\nconst URL_DEFAULTS: Required<UrlConfig> = {\n pageParam: \"page\",\n sizeParam: \"size\",\n sortParam: \"sortType\",\n};\n\n/** `\"-createdAt\"` → `{ name, direction }` (bo'sh bo'lsa `undefined`). */\nexport function decodeSort(value: string | null | undefined): Sort | undefined {\n if (!value) return undefined;\n const desc = value.startsWith(\"-\");\n return { name: desc ? value.slice(1) : value, direction: desc ? \"desc\" : \"asc\" };\n}\n\n/** `{ name, direction }` → `\"-createdAt\"` / `\"createdAt\"` (nomsiz bo'lsa `\"\"`). */\nexport function encodeSort(sort: Sort): string {\n if (!sort.name) return \"\";\n return (sort.direction === \"desc\" ? \"-\" : \"\") + sort.name;\n}\n\n/**\n * Schema + searchParams → filter. Applies `range`/`between`/`search`/`split`/\n * `default`/`trim`; empty/absent params are dropped. Returns a flat\n * `FieldCondition[]` (implicit AND), or a tree when a `search` OR-group is\n * present (`{ and: [orGroup, …conditions] }`).\n */\nexport function schemaToFilter(schema: ListSchema, searchParams: URLSearchParams): Filter {\n const conditions: FieldCondition[] = [];\n const groups: FilterNode[] = [];\n\n for (const [param, d] of Object.entries(schema) as [string, FieldDescriptor][]) {\n const key = d.key ?? param;\n\n // range → two inclusive conditions (>= , <=)\n if (d.range) {\n const from = searchParams.get(d.range[0]);\n const to = searchParams.get(d.range[1]);\n if (from) conditions.push(cond(key, \">=\", from));\n if (to) conditions.push(cond(key, \"<=\", to));\n continue;\n }\n\n // between → one condition with a 2-tuple value\n if (d.between) {\n const from = searchParams.get(d.between[0]);\n const to = searchParams.get(d.between[1]);\n if (from && to) conditions.push(cond(key, \"between\", [from, to]));\n continue;\n }\n\n // read value, falling back to `default` only when the param is ABSENT\n // (an empty `?x=` means the user cleared the filter → prune, don't default).\n const raw = searchParams.get(param);\n let value: FilterValue | undefined = raw !== null ? raw : d.default;\n if (typeof value === \"string\" && d.trim) value = value.trim();\n if (value === undefined || value === null || value === \"\") continue;\n if (Array.isArray(value) && value.length === 0) continue;\n\n // search → OR of `contains` across the listed fields (needs a string)\n if (d.search && typeof value === \"string\") {\n groups.push({ or: d.search.map(field => cond(field, \"%_%\", value as string)) });\n continue;\n }\n\n // split → comma-string → array (for `in`/`notIn`); guarded against empties\n if (d.split && typeof value === \"string\") {\n const delimiter = d.split === true ? \",\" : d.split;\n const parts = value\n .split(delimiter)\n .map(s => s.trim())\n .filter(Boolean);\n if (parts.length === 0) continue;\n value = parts;\n }\n\n conditions.push(cond(key, d.operation ?? \"=\", value));\n }\n\n return groups.length === 0 ? conditions : { and: [...groups, ...conditions] };\n}\n\nfunction cond(key: string, operation: FieldCondition[\"operation\"], value: FilterValue): FieldCondition {\n return { key, operation, value };\n}\n\n/** searchParams → normalizatsiyalanmagan {@link ListParams} (filter/sort/page/perPage). */\nexport function readListParams(schema: ListSchema, searchParams: URLSearchParams, url: UrlConfig = {}): ListParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const size = searchParams.get(cfg.sizeParam);\n return {\n filter: schemaToFilter(schema, searchParams),\n sort: searchParams.get(cfg.sortParam) ?? undefined,\n page: Number(searchParams.get(cfg.pageParam)) || 1,\n perPage: size ? Number(size) : undefined,\n };\n}\n\n/** searchParams → to'liq, yuborishga tayyor {@link ListPayload}. */\nexport function searchParamsToPayload(schema: ListSchema, searchParams: URLSearchParams, url?: UrlConfig): ListPayload {\n return buildListParams(readListParams(schema, searchParams, url));\n}\n\n/* ------------------------- URL yozish (immutable) ------------------------- */\n/* Har biri YANGI URLSearchParams qaytaradi; filter/sort o'zgarsa `page` reset. */\n\nfunction clone(searchParams: URLSearchParams): URLSearchParams {\n return new URLSearchParams(searchParams);\n}\n\n/** Filter param'ini o'rnatadi/o'chiradi va `page`ni reset qiladi. */\nexport function setParam(searchParams: URLSearchParams, name: string, value: string | null | undefined, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n if (value === null || value === undefined || value === \"\") next.delete(name);\n else next.set(name, value);\n return next;\n}\n\n/** Sahifani o'rnatadi (`page` reset qilinmaydi). */\nexport function setPage(searchParams: URLSearchParams, page: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.set(cfg.pageParam, String(page));\n return next;\n}\n\n/** Sahifa o'lchamini o'rnatadi va `page`ni reset qiladi. */\nexport function setSize(searchParams: URLSearchParams, size: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n next.set(cfg.sizeParam, String(size));\n return next;\n}\n\n/** Sortni o'rnatadi (`\"-createdAt\"` yoki `{name,direction}`) va `page`ni reset qiladi. */\nexport function setSort(searchParams: URLSearchParams, sort: SortInput, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n const encoded = typeof sort === \"string\" ? sort : encodeSort(sort);\n if (encoded) next.set(cfg.sortParam, encoded);\n else next.delete(cfg.sortParam);\n return next;\n}\n\n/** Barcha list param'larini tozalaydi (ixtiyoriy saqlanadigan kalitlar bilan). */\nexport function resetParams(searchParams: URLSearchParams, keep: string[] = []): URLSearchParams {\n const next = new URLSearchParams();\n for (const key of keep) {\n const value = searchParams.get(key);\n if (value !== null) next.set(key, value);\n }\n return next;\n}\n","import { createQuery, type QueryConfig } from \"./query\";\nimport { createFilters, f as rawF } from \"./filters\";\nimport { mapMeta, mapInfiniteMeta, mapCursorMeta } from \"./meta\";\nimport { defineListSchema, type ListSchema } from \"./schema\";\nimport { decodeSort, readListParams, type UrlConfig } from \"./url\";\nimport type { AdapterName, WithFor } from \"./adapter\";\nimport type {\n CursorMeta,\n CursorParams,\n CursorPayload,\n FieldKey,\n Filter,\n InfiniteMeta,\n InfiniteParams,\n InfinitePayload,\n ListParams,\n ListPayload,\n Meta,\n Params,\n QueryPayload,\n RawCursorMeta,\n RawInfiniteMeta,\n RawMeta,\n Sort,\n SortDirection,\n SortInput,\n} from \"./types\";\n\n/* ---------------- resource inputs: entity-typed, adapter-aware `with` ------ */\n\nexport type ResourceListParams<T, A extends AdapterName> = Omit<ListParams<T>, \"with\"> & { with?: WithFor<A> };\nexport type ResourceInfiniteParams<T, A extends AdapterName> = Omit<InfiniteParams<T>, \"with\"> & { with?: WithFor<A> };\nexport type ResourceCursorParams<T, A extends AdapterName> = Omit<CursorParams<T>, \"with\"> & { with?: WithFor<A> };\nexport type ResourceParams<T, A extends AdapterName> = Omit<Params<T>, \"with\"> & { with?: WithFor<A> };\n\n/* ---------------------------- responses / results ------------------------- */\n\ninterface RawResponse<T, M> {\n data?: T[];\n meta?: M | null;\n}\nexport interface ListResult<T> {\n data: T[];\n meta: Meta;\n}\nexport interface InfiniteResult<T> {\n data: T[];\n meta: InfiniteMeta;\n}\nexport interface CursorResult<T> {\n data: T[];\n meta: CursorMeta;\n}\n\n/* -------------------------------- query keys ------------------------------ */\n\nexport interface ResourceKeys {\n all: readonly unknown[];\n list(payload: unknown): readonly unknown[];\n infinite(payload: unknown): readonly unknown[];\n cursor(payload: unknown): readonly unknown[];\n detail(id: unknown): readonly unknown[];\n}\n\n/* -------------------------------- resource -------------------------------- */\n\nexport interface Resource<T, A extends AdapterName> {\n /** Build an offset (page) payload. */\n list(input?: ResourceListParams<T, A>): ListPayload;\n /** Build an infinite (limit/offset) payload. */\n infinite(input?: ResourceInfiniteParams<T, A>): InfinitePayload;\n /** Build a cursor (keyset) payload. */\n cursor(input?: ResourceCursorParams<T, A>): CursorPayload;\n /** Build a paginationless payload (filter/sort/columns/with). */\n params(input?: ResourceParams<T, A>): QueryPayload;\n /** Filter builder typed to `T`'s fields. */\n f: ReturnType<typeof createFilters<T>>;\n /** Search preset — OR of `contains` across `fields` (e.g. one input → many columns). */\n search(term: string, fields: FieldKey<T>[]): Filter<T>;\n /** Declare a URL↔filter schema (identity helper). */\n schema<S extends ListSchema>(s: S): S;\n /** Build a list payload from URL search params (SSR — the non-hook `useListParams`). */\n fromSearchParams(searchParams: URLSearchParams, options: { schema: ListSchema; url?: UrlConfig; with?: WithFor<A> }): ListPayload;\n /** Stable query keys for TanStack/SWR caches. */\n keys: ResourceKeys;\n /** Map a list response's meta to camelCase (`data` typed to `T`). */\n parseList(raw?: RawResponse<T, RawMeta> | null): ListResult<T>;\n parseInfinite(raw?: RawResponse<T, RawInfiniteMeta> | null): InfiniteResult<T>;\n parseCursor(raw?: RawResponse<T, RawCursorMeta> | null): CursorResult<T>;\n}\n\n/* -------------------------------- registry -------------------------------- */\n\nexport interface RegistryDefaults {\n /** `list` page size. */\n perPage?: number;\n /** `infinite` + `cursor` page size. */\n limit?: number;\n /** `list`/`infinite` sort (`\"-createdAt\"` or `{name,direction}`). */\n sort?: SortInput;\n /** Cursor-only defaults. */\n cursor?: { order?: SortDirection };\n}\n\nexport interface RegistryConfig<A extends AdapterName> {\n adapter: A;\n defaults?: RegistryDefaults;\n /** Drop empty filter values built from form inputs (default `true`). */\n pruneEmpty?: boolean;\n}\n\nexport interface Registry<A extends AdapterName> {\n readonly adapter: A;\n /** Entity-typed builders + filters + schema + keys + parsers. `name` = cache-key namespace (required, must be unique). */\n resource<T>(name: string): Resource<T, A>;\n /** Registry-level meta parsing (entity-agnostic — `data: unknown[]`). */\n parseList(raw?: RawResponse<unknown, RawMeta> | null): ListResult<unknown>;\n parseInfinite(raw?: RawResponse<unknown, RawInfiniteMeta> | null): InfiniteResult<unknown>;\n parseCursor(raw?: RawResponse<unknown, RawCursorMeta> | null): CursorResult<unknown>;\n}\n\n/**\n * Create a web query registry — configure defaults + backend adapter once, then\n * `registry.resource<T>()` yields entity-typed, adapter-aware query builders,\n * filters, a URL↔filter schema, cache keys and meta parsers.\n *\n * @example\n * ```ts\n * export const qk = createRegistry({ adapter: \"mongoose\", defaults: { perPage: 20, sort: \"-createdAt\" } });\n * const users = qk.resource<IUser>(\"users\");\n * const body = users.list({ filter: users.f.eq(\"status\", \"active\"), page });\n * ```\n */\nexport function createRegistry<A extends AdapterName>(config: RegistryConfig<A>): Registry<A> {\n const defaults = config.defaults ?? {};\n const sort: Sort | undefined = typeof defaults.sort === \"string\" ? decodeSort(defaults.sort) : defaults.sort;\n const cursorOrder: SortDirection = defaults.cursor?.order ?? \"asc\";\n\n // Only set keys that are provided — createQuery merges over its own defaults,\n // and passing `undefined` would clobber them.\n const qcfg: QueryConfig = {};\n if (defaults.perPage !== undefined) qcfg.defaultPerPage = defaults.perPage;\n if (defaults.limit !== undefined) qcfg.defaultLimit = defaults.limit;\n if (sort?.name) qcfg.defaultSort = sort; // only override when a real sort field is given\n if (config.pruneEmpty !== undefined) qcfg.pruneEmpty = config.pruneEmpty;\n const q = createQuery(qcfg);\n\n const parseList = (raw?: RawResponse<unknown, RawMeta> | null): ListResult<unknown> => ({ data: raw?.data ?? [], meta: mapMeta(raw?.meta) });\n const parseInfinite = (raw?: RawResponse<unknown, RawInfiniteMeta> | null): InfiniteResult<unknown> => ({\n data: raw?.data ?? [],\n meta: mapInfiniteMeta(raw?.meta),\n });\n const parseCursor = (raw?: RawResponse<unknown, RawCursorMeta> | null): CursorResult<unknown> => ({\n data: raw?.data ?? [],\n meta: mapCursorMeta(raw?.meta),\n });\n\n function resource<T>(name: string): Resource<T, A> {\n const f = createFilters<T>();\n const keys: ResourceKeys = {\n all: [name],\n list: p => [name, \"list\", p],\n infinite: p => [name, \"infinite\", p],\n cursor: p => [name, \"cursor\", p],\n detail: id => [name, \"detail\", id],\n };\n return {\n list: input => q.list(input as unknown as ListParams) as unknown as ListPayload,\n infinite: input => q.infinite(input as unknown as InfiniteParams) as unknown as InfinitePayload,\n cursor: input => q.cursor({ ...(input as unknown as CursorParams), order: input?.order ?? cursorOrder }) as unknown as CursorPayload,\n params: input => q.params(input as unknown as Params) as unknown as QueryPayload,\n f,\n search: (term, fields) => rawF.or(...fields.map(field => rawF.contains(field, term))) as unknown as Filter<T>,\n schema: s => defineListSchema(s),\n fromSearchParams: (searchParams, options) =>\n q.list({ ...readListParams(options.schema, searchParams, options.url), with: options.with } as unknown as ListParams) as unknown as ListPayload,\n keys,\n parseList: raw => parseList(raw) as ListResult<T>,\n parseInfinite: raw => parseInfinite(raw) as InfiniteResult<T>,\n parseCursor: raw => parseCursor(raw) as CursorResult<T>,\n };\n }\n\n return { adapter: config.adapter, resource, parseList, parseInfinite, parseCursor };\n}\n"]}
1
+ {"version":3,"sources":["../src/filters.ts","../src/query.ts","../src/meta.ts","../src/schema.ts","../src/url.ts","../src/registry.ts"],"names":["coreCreateFilters","f"],"mappings":"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","file":"index.js","sourcesContent":["import { createFilters as coreCreateFilters, f } from \"@querykitjs/core\";\n\nimport type { AndGroup, FieldCondition, FieldKey, FilterNode, FilterScalar, FilterValue, NotGroup, OrGroup } from \"./types\";\n\n/** Keys of `T` whose value is assignable to `V`. */\ntype ValueKeys<T, V> = { [K in keyof T]-?: NonNullable<T[K]> extends V ? Extract<K, string> : never }[keyof T];\n/** String-valued field keys (for `contains`/`startsWith`/`like`/…). */\ntype StringKeys<T> = ValueKeys<T, string>;\n/** Comparable field keys — string/number/bigint/Date (for `gt`/`between`/…). */\ntype ComparableKeys<T> = ValueKeys<T, string | number | bigint | Date>;\n\ntype Node<T> = FilterNode<T>;\n\n/**\n * Field-type-aware filter builder: string-match operators are offered only for\n * string fields, comparison only for comparable fields, so nonsensical filters\n * (e.g. `contains` on a number) are compile errors. Runtime is\n * `@querykitjs/core`'s builder unchanged.\n */\nexport interface TypedFilters<T> {\n eq<K extends FieldKey<T>>(key: K, value: FilterValue): FieldCondition<T>;\n ne<K extends FieldKey<T>>(key: K, value: FilterValue): FieldCondition<T>;\n\n gt<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n gte<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n lt<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n lte<K extends ComparableKeys<T>>(key: K, value: FilterValue): FieldCondition<T>;\n between<K extends ComparableKeys<T>>(key: K, min: FilterScalar | Date, max: FilterScalar | Date): FieldCondition<T>;\n range<K extends ComparableKeys<T>>(key: K, from: FilterScalar | Date, to: FilterScalar | Date): FieldCondition<T>[];\n\n contains<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n startsWith<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n endsWith<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n like<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n ilike<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n notLike<K extends StringKeys<T>>(key: K, value: string): FieldCondition<T>;\n\n in<K extends FieldKey<T>>(key: K, value: Array<string | number>): FieldCondition<T>;\n notIn<K extends FieldKey<T>>(key: K, value: Array<string | number>): FieldCondition<T>;\n\n isNull<K extends FieldKey<T>>(key: K): FieldCondition<T>;\n isNotNull<K extends FieldKey<T>>(key: K): FieldCondition<T>;\n\n and(...nodes: Node<T>[]): AndGroup<T>;\n or(...nodes: Node<T>[]): OrGroup<T>;\n not(node: Node<T>): NotGroup<T>;\n}\n\n/**\n * Typed, ergonomic filter builder for an entity — field-name autocomplete plus\n * field-type-aware operators (see {@link TypedFilters}).\n *\n * @typeParam T - the list entity type (`Buyer`, `Product`, …).\n * @example\n * ```ts\n * const f = createFilters<Buyer>();\n * const filter = f.and(f.contains(\"buyerName\", s), f.gte(\"age\", 18));\n * // f.contains(\"age\", …) → compile error (age is a number)\n * ```\n */\nexport function createFilters<T = Record<string, unknown>>(): TypedFilters<T> {\n return coreCreateFilters<FieldKey<T>>() as unknown as TypedFilters<T>;\n}\n\n/** Untyped (entity-agnostic) filter builder — quick use, no field-type checks. */\nexport { f };\n","import { DEFAULT_LIMIT, DEFAULT_PER_PAGE } from \"@querykitjs/core\";\n\nimport type {\n CursorParams,\n CursorPayload,\n FieldCondition,\n Filter,\n FilterNode,\n FilterValue,\n InfiniteParams,\n InfinitePayload,\n ListParams,\n ListPayload,\n Params,\n QueryPayload,\n Sort,\n SortInput,\n} from \"./types\";\n\n/** {@link createQuery} sozlamalari — wire field nomlari va default qiymatlar. */\nexport interface QueryConfig {\n filterField?: string;\n sortField?: string;\n columnsField?: string;\n withField?: string;\n withDeletedField?: string;\n pageField?: string;\n perPageField?: string;\n limitField?: string;\n offsetField?: string;\n cursorField?: string;\n defaultPerPage?: number;\n defaultLimit?: number;\n defaultSort?: Sort;\n /** Bo'sh qiymatli filterlarni tashlash (default `true`). */\n pruneEmpty?: boolean;\n}\n\nconst DEFAULTS: Required<QueryConfig> = {\n filterField: \"filter\",\n sortField: \"sort\",\n columnsField: \"columns\",\n withField: \"with\",\n withDeletedField: \"withDeleted\",\n pageField: \"page\",\n perPageField: \"perPage\",\n limitField: \"limit\",\n offsetField: \"offset\",\n cursorField: \"cursor\",\n defaultPerPage: DEFAULT_PER_PAGE,\n defaultLimit: DEFAULT_LIMIT,\n defaultSort: [{ key: \"createdAt\", direction: \"desc\" }],\n pruneEmpty: true,\n};\n\n/** Bo'sh (yuborilmaydigan) qiymatmi: undefined/null/\"\"/[] . `false`/`0` — bo'sh emas. */\nfunction isEmptyValue(value: FilterValue | undefined): boolean {\n if (value === undefined || value === null || value === \"\") return true;\n if (Array.isArray(value) && value.length === 0) return true;\n return false;\n}\n\n/** A `\"-field\"`/`\"field\"` shorthand string or a `{ key, direction }` item → a `SortItem`. */\nfunction toSortItem(item: Sort[number] | string): Sort[number] | undefined {\n if (typeof item === \"string\") {\n const desc = item.startsWith(\"-\");\n const key = (desc ? item.slice(1) : item).trim();\n return key ? { key, direction: desc ? \"desc\" : \"asc\" } : undefined;\n }\n return item && item.key ? { key: item.key, direction: item.direction ?? \"asc\" } : undefined;\n}\n\n/** Normalize a sort array (objects and/or `\"-field\"` strings) → canonical `SortItem[]`; empty → fallback. */\nexport function normalizeSort(input: SortInput | undefined, fallback: Sort): Sort {\n if (!input || input.length === 0) return fallback;\n const items = input.map(toSortItem).filter((i): i is Sort[number] => i !== undefined);\n return items.length ? items : fallback;\n}\n\nfunction normalizeCondition(condition: FieldCondition, prune: boolean): FieldCondition | undefined {\n const operation = condition.operation ?? \"=\";\n const noValue = operation === \"isNull\" || operation === \"isNotNull\";\n const value = condition.value as FilterValue;\n\n if (!noValue && prune && isEmptyValue(value)) return undefined;\n\n const out: FieldCondition = { key: condition.key, operation };\n if (!noValue) out.value = value;\n return out;\n}\n\nfunction normalizeNode(node: FilterNode, prune: boolean): FilterNode | undefined {\n if (\"and\" in node) {\n const kids = node.and.map(n => normalizeNode(n, prune)).filter((n): n is FilterNode => !!n);\n return kids.length ? { and: kids } : undefined;\n }\n if (\"or\" in node) {\n const kids = node.or.map(n => normalizeNode(n, prune)).filter((n): n is FilterNode => !!n);\n return kids.length ? { or: kids } : undefined;\n }\n if (\"not\" in node) {\n const inner = normalizeNode(node.not, prune);\n return inner ? { not: inner } : undefined;\n }\n return normalizeCondition(node, prune);\n}\n\n/** Filterni normalizatsiya qiladi: bo'sh shartlarni prune. Massiv → flat massiv. */\nexport function normalizeFilter(filter: Filter | undefined, prune: boolean): FieldCondition[] | FilterNode {\n if (!filter) return [];\n if (Array.isArray(filter)) {\n return filter.map(c => normalizeCondition(c, prune)).filter((c): c is FieldCondition => !!c);\n }\n return normalizeNode(filter, prune) ?? [];\n}\n\n/** Umumiy qism: filter/columns/with (+ withDeleted). Sort qo'shilmaydi. */\nfunction buildBase(input: Params, cfg: Required<QueryConfig>): Record<string, unknown> {\n const base: Record<string, unknown> = {\n [cfg.filterField]: normalizeFilter(input.filter, cfg.pruneEmpty),\n [cfg.columnsField]: input.columns ?? {},\n [cfg.withField]: input.with ?? {},\n };\n if (input.withDeleted !== undefined) base[cfg.withDeletedField] = input.withDeleted;\n return base;\n}\n\nfunction clampInt(value: number | undefined, fallback: number): number {\n return value === undefined || value < 1 || Number.isNaN(value) ? fallback : Math.trunc(value);\n}\n\nfunction build(input: Params, cfg: Required<QueryConfig>): Record<string, unknown> {\n return { ...buildBase(input, cfg), [cfg.sortField]: normalizeSort(input.sort, cfg.defaultSort) };\n}\n\nfunction buildList(input: ListParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n return {\n ...build(input, cfg),\n [cfg.pageField]: clampInt(input.page, 1), // page >= 1 (kasr/0/manfiy → 1)\n [cfg.perPageField]: clampInt(input.perPage, cfg.defaultPerPage),\n };\n}\n\nfunction buildInfinite(input: InfiniteParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n return {\n ...build(input, cfg),\n [cfg.limitField]: clampInt(input.limit, cfg.defaultLimit),\n [cfg.offsetField]: input.offset && input.offset > 0 ? Math.trunc(input.offset) : 0,\n };\n}\n\nfunction buildCursor(input: CursorParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n ...buildBase(input, cfg),\n [cfg.limitField]: clampInt(input.limit, cfg.defaultLimit),\n [cfg.cursorField]: input.cursor ?? null,\n order: input.order ?? \"asc\",\n direction: input.direction ?? \"forward\",\n };\n if (input.cursorKey !== undefined) payload.cursorKey = input.cursorKey;\n return payload;\n}\n\n/**\n * Config bilan bog'langan query quruvchilarni qaytaradi. Boshqa backend field\n * nomlari (masalan `perPage`, `withPopulates`) uchun.\n *\n * @example\n * ```ts\n * const q = createQuery({ withField: \"withPopulates\", defaultPerPage: 20 });\n * const params = q.list({ filter, page, perPage });\n * ```\n */\nexport function createQuery(config: QueryConfig = {}) {\n const cfg = { ...DEFAULTS, ...config };\n return {\n params: (input: Params = {}) => build(input, cfg),\n list: (input: ListParams = {}) => buildList(input, cfg),\n infinite: (input: InfiniteParams = {}) => buildInfinite(input, cfg),\n cursor: (input: CursorParams = {}) => buildCursor(input, cfg),\n };\n}\n\n/**\n * Params'ni normalizatsiya qiladi (paginatsiyasiz): filter prune, sort decode,\n * `with`/`columns` pass-through. Default querykit wire-format.\n *\n * @example\n * ```ts\n * const payload = buildParams({\n * filter: [{ key: \"name\", operation: \"%_%\", value: s }],\n * sort: [{ key: \"createdAt\", direction: \"desc\" }],\n * with: { supervisor: true },\n * });\n * ```\n */\nexport function buildParams(input: Params = {}): QueryPayload {\n return build(input, DEFAULTS) as unknown as QueryPayload;\n}\n\n/**\n * {@link buildParams} + `page`/`perPage` (default `perPage = 20`, `@querykitjs/core`).\n *\n * @example\n * ```ts\n * const payload = buildListParams({ filter, sort: [{ key: \"createdAt\", direction: \"desc\" }], page: 2, perPage: 20 });\n * // -> { filter, sort: [{ key, direction }], columns, with, page, perPage }\n * ```\n */\nexport function buildListParams(input: ListParams = {}): ListPayload {\n return buildList(input, DEFAULTS) as unknown as ListPayload;\n}\n\n/**\n * Infinite-scroll payload — {@link buildParams} + `limit`/`offset` (default\n * `limit = 20`).\n *\n * @example\n * ```ts\n * const payload = buildInfiniteParams({ filter, limit: 20, offset: 40 });\n * // -> { filter, sort, columns, with, limit, offset }\n * ```\n */\nexport function buildInfiniteParams(input: InfiniteParams = {}): InfinitePayload {\n return buildInfinite(input, DEFAULTS) as unknown as InfinitePayload;\n}\n\n/**\n * Cursor (keyset) payload — `sort` o'rniga `order`/`direction`. `cursor`\n * oldingi javob meta'sidagi `next_cursor`/`prev_cursor` tokeni.\n *\n * @example\n * ```ts\n * const payload = buildCursorParams({ filter, limit: 20, cursor, order: \"asc\" });\n * // -> { filter, columns, with, limit, cursor, order, direction }\n * ```\n */\nexport function buildCursorParams(input: CursorParams = {}): CursorPayload {\n return buildCursor(input, DEFAULTS) as unknown as CursorPayload;\n}\n","import type { CursorMeta, InfiniteMeta, Meta, RawCursorMeta, RawInfiniteMeta, RawMeta } from \"./types\";\n\n/**\n * **Offset** (list) meta'sini snake_case → camelCase map qiladi.\n *\n * @example\n * ```ts\n * const { data, meta } = (await http.post(\"/buyers/list\", params)).data;\n * setMeta(mapMeta(meta)); // { totalPages, totalCount, currentPage, perPage, hasNext, hasPrev }\n * ```\n */\nexport function mapMeta(raw?: RawMeta | null): Meta {\n return {\n totalPages: raw?.total_pages ?? 0,\n totalCount: raw?.total_items ?? 0,\n currentPage: raw?.current_page ?? 0,\n perPage: raw?.per_page ?? 0,\n hasNext: raw?.has_next ?? false,\n hasPrev: raw?.has_prev ?? false,\n };\n}\n\n/**\n * **Infinite-scroll** meta'sini map qiladi.\n *\n * @example\n * ```ts\n * const m = mapInfiniteMeta(res.meta); // { limit, offset, count, hasMore, nextOffset }\n * if (m.hasMore) load(m.nextOffset);\n * ```\n */\nexport function mapInfiniteMeta(raw?: RawInfiniteMeta | null): InfiniteMeta {\n return {\n limit: raw?.limit ?? 0,\n offset: raw?.offset ?? 0,\n count: raw?.count ?? 0,\n hasMore: raw?.has_more ?? false,\n nextOffset: raw?.next_offset ?? null,\n };\n}\n\n/**\n * **Cursor** (keyset) meta'sini map qiladi.\n *\n * @example\n * ```ts\n * const m = mapCursorMeta(res.meta); // { limit, hasNext, hasPrev, nextCursor, prevCursor }\n * ```\n */\nexport function mapCursorMeta(raw?: RawCursorMeta | null): CursorMeta {\n return {\n limit: raw?.limit ?? 0,\n hasNext: raw?.has_next ?? false,\n hasPrev: raw?.has_prev ?? false,\n nextCursor: raw?.next_cursor ?? null,\n prevCursor: raw?.prev_cursor ?? null,\n };\n}\n","import type { FilterOperator, FilterValue } from \"./types\";\n\n/** Forbids the listed keys (`?: never`) so modes can't be mixed. */\ntype Without<K extends string> = { [P in K]?: never };\n\n/** Filter-key override, shared by the single-key modes. */\ninterface KeyBase {\n /** Backend field key (defaults to the schema param name). */\n key?: string;\n}\n\n/**\n * **Simple** mode — one URL param → one condition. `operation` defaults to `\"=\"`;\n * `trim`/`default`/`split` shape the value.\n */\nexport interface SimpleField extends KeyBase {\n /** Filter operation (default `\"=\"`). */\n operation?: FilterOperator;\n /** Trim the string value. */\n trim?: boolean;\n /** Value used when the URL param is absent. */\n default?: FilterValue;\n /**\n * For array operations (`in`/`notIn`): split a comma-string into an array.\n * `true` → delimiter `\",\"`; or a custom delimiter. Guarded: absent/empty →\n * pruned; parts trimmed, empties dropped.\n */\n split?: boolean | string;\n}\n\n/** **Range** mode — `[fromParam, toParam]` → two inclusive conditions (`>=`, `<=`). */\nexport interface RangeField extends KeyBase {\n range: [string, string];\n}\n\n/** **Between** mode — `[fromParam, toParam]` → one `between` condition (2-tuple). */\nexport interface BetweenField extends KeyBase {\n between: [string, string];\n}\n\n/** **Search** mode — one URL param → OR of `contains` across these field keys. */\nexport interface SearchField {\n search: string[];\n trim?: boolean;\n default?: FilterValue;\n}\n\n/**\n * One list field's URL→filter mapping. Exactly **one mode** per descriptor —\n * Simple / Range / Between / Search — enforced at compile time (mixing e.g.\n * `range` + `search`, or `range` + `between`, is a type error).\n */\nexport type FieldDescriptor =\n | (SimpleField & Without<\"range\" | \"between\" | \"search\">)\n | (RangeField & Without<\"operation\" | \"trim\" | \"default\" | \"split\" | \"between\" | \"search\">)\n | (BetweenField & Without<\"operation\" | \"trim\" | \"default\" | \"split\" | \"range\" | \"search\">)\n | (SearchField & Without<\"key\" | \"operation\" | \"split\" | \"range\" | \"between\">);\n\n/** URL param → {@link FieldDescriptor} map. */\nexport type ListSchema = Record<string, FieldDescriptor>;\n\n/**\n * Declares a list filter schema (identity helper — preserves the literal type).\n * Maps URL params to `{key, operation, value}` conditions so pages never build\n * `IFilter[]` by hand.\n *\n * @example\n * ```ts\n * const buyersSchema = defineListSchema({\n * id: { operation: \"=\" },\n * status: { operation: \"=\", default: \"active\" },\n * ids: { operation: \"in\", split: true },\n * q: { search: [\"name\", \"email\"] },\n * createdAt: { range: [\"fromDate\", \"toDate\"] },\n * });\n * ```\n */\nexport function defineListSchema<S extends ListSchema>(schema: S): S {\n return schema;\n}\n","import { buildListParams } from \"./query\";\nimport type { FieldDescriptor, ListSchema } from \"./schema\";\nimport type { FieldCondition, Filter, FilterNode, FilterValue, ListParams, ListPayload, Sort, SortDirection, SortInput } from \"./types\";\n\n/** URL param nomlari (sahifa/o'lcham/sort) — sozlanadigan. */\nexport interface UrlConfig {\n pageParam?: string;\n sizeParam?: string;\n sortParam?: string;\n}\n\nconst URL_DEFAULTS: Required<UrlConfig> = {\n pageParam: \"page\",\n sizeParam: \"size\",\n sortParam: \"sortType\",\n};\n\n/**\n * `\"-createdAt,id,-appNumber\"` → `[{ key, direction }, …]` — comma-separated,\n * order preserved, `-` prefix = `desc` (else `asc`). Empty → `undefined`.\n */\nexport function decodeSort(value: string | null | undefined): Sort | undefined {\n if (!value) return undefined;\n const items = value\n .split(\",\")\n .map(s => s.trim())\n .filter(Boolean)\n .map(tok => {\n const desc = tok.startsWith(\"-\");\n return { key: desc ? tok.slice(1) : tok, direction: (desc ? \"desc\" : \"asc\") as SortDirection };\n })\n .filter(i => i.key); // drop empty keys (e.g. a lone \"-\")\n return items.length ? items : undefined;\n}\n\n/** `[{ key, direction }, …]` (or `\"-field\"` shorthand strings) → `\"-createdAt,id,-appNumber\"` (empty → `\"\"`). */\nexport function encodeSort(sort: SortInput): string {\n return sort\n .map(i => (typeof i === \"string\" ? i.trim() : i && i.key ? (i.direction === \"desc\" ? \"-\" : \"\") + i.key : \"\"))\n .filter(Boolean)\n .join(\",\");\n}\n\n/**\n * Schema + searchParams → filter. Applies `range`/`between`/`search`/`split`/\n * `default`/`trim`; empty/absent params are dropped. Returns a flat\n * `FieldCondition[]` (implicit AND), or a tree when a `search` OR-group is\n * present (`{ and: [orGroup, …conditions] }`).\n */\nexport function schemaToFilter(schema: ListSchema, searchParams: URLSearchParams): Filter {\n const conditions: FieldCondition[] = [];\n const groups: FilterNode[] = [];\n\n for (const [param, d] of Object.entries(schema) as [string, FieldDescriptor][]) {\n const key = d.key ?? param;\n\n // range → two inclusive conditions (>= , <=)\n if (d.range) {\n const from = searchParams.get(d.range[0]);\n const to = searchParams.get(d.range[1]);\n if (from) conditions.push(cond(key, \">=\", from));\n if (to) conditions.push(cond(key, \"<=\", to));\n continue;\n }\n\n // between → one condition with a 2-tuple value\n if (d.between) {\n const from = searchParams.get(d.between[0]);\n const to = searchParams.get(d.between[1]);\n if (from && to) conditions.push(cond(key, \"between\", [from, to]));\n continue;\n }\n\n // read value, falling back to `default` only when the param is ABSENT\n // (an empty `?x=` means the user cleared the filter → prune, don't default).\n const raw = searchParams.get(param);\n let value: FilterValue | undefined = raw !== null ? raw : d.default;\n if (typeof value === \"string\" && d.trim) value = value.trim();\n if (value === undefined || value === null || value === \"\") continue;\n if (Array.isArray(value) && value.length === 0) continue;\n\n // search → OR of `contains` across the listed fields (needs a string)\n if (d.search && typeof value === \"string\") {\n groups.push({ or: d.search.map(field => cond(field, \"%_%\", value as string)) });\n continue;\n }\n\n // split → comma-string → array (for `in`/`notIn`); guarded against empties\n if (d.split && typeof value === \"string\") {\n const delimiter = d.split === true ? \",\" : d.split;\n const parts = value\n .split(delimiter)\n .map(s => s.trim())\n .filter(Boolean);\n if (parts.length === 0) continue;\n value = parts;\n }\n\n conditions.push(cond(key, d.operation ?? \"=\", value));\n }\n\n return groups.length === 0 ? conditions : { and: [...groups, ...conditions] };\n}\n\nfunction cond(key: string, operation: FieldCondition[\"operation\"], value: FilterValue): FieldCondition {\n return { key, operation, value };\n}\n\n/** searchParams → normalizatsiyalanmagan {@link ListParams} (filter/sort/page/perPage). */\nexport function readListParams(schema: ListSchema, searchParams: URLSearchParams, url: UrlConfig = {}): ListParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const size = searchParams.get(cfg.sizeParam);\n return {\n filter: schemaToFilter(schema, searchParams),\n sort: decodeSort(searchParams.get(cfg.sortParam)),\n page: Number(searchParams.get(cfg.pageParam)) || 1,\n perPage: size ? Number(size) : undefined,\n };\n}\n\n/** searchParams → to'liq, yuborishga tayyor {@link ListPayload}. */\nexport function searchParamsToPayload(schema: ListSchema, searchParams: URLSearchParams, url?: UrlConfig): ListPayload {\n return buildListParams(readListParams(schema, searchParams, url));\n}\n\n/* ------------------------- URL yozish (immutable) ------------------------- */\n/* Har biri YANGI URLSearchParams qaytaradi; filter/sort o'zgarsa `page` reset. */\n\nfunction clone(searchParams: URLSearchParams): URLSearchParams {\n return new URLSearchParams(searchParams);\n}\n\n/** Filter param'ini o'rnatadi/o'chiradi va `page`ni reset qiladi. */\nexport function setParam(searchParams: URLSearchParams, name: string, value: string | null | undefined, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n if (value === null || value === undefined || value === \"\") next.delete(name);\n else next.set(name, value);\n return next;\n}\n\n/** Sahifani o'rnatadi (`page` reset qilinmaydi). */\nexport function setPage(searchParams: URLSearchParams, page: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.set(cfg.pageParam, String(page));\n return next;\n}\n\n/** Sahifa o'lchamini o'rnatadi va `page`ni reset qiladi. */\nexport function setSize(searchParams: URLSearchParams, size: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n next.set(cfg.sizeParam, String(size));\n return next;\n}\n\n/** Sortni o'rnatadi (`[{ key, direction }, …]`) va `page`ni reset qiladi. */\nexport function setSort(searchParams: URLSearchParams, sort: SortInput, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n const encoded = encodeSort(sort);\n if (encoded) next.set(cfg.sortParam, encoded);\n else next.delete(cfg.sortParam);\n return next;\n}\n\n/** Barcha list param'larini tozalaydi (ixtiyoriy saqlanadigan kalitlar bilan). */\nexport function resetParams(searchParams: URLSearchParams, keep: string[] = []): URLSearchParams {\n const next = new URLSearchParams();\n for (const key of keep) {\n const value = searchParams.get(key);\n if (value !== null) next.set(key, value);\n }\n return next;\n}\n","import { createQuery, normalizeSort, type QueryConfig } from \"./query\";\nimport { createFilters, f as rawF } from \"./filters\";\nimport { mapMeta, mapInfiniteMeta, mapCursorMeta } from \"./meta\";\nimport { defineListSchema, type ListSchema } from \"./schema\";\nimport { readListParams, type UrlConfig } from \"./url\";\nimport type { AdapterName, WithFor } from \"./adapter\";\nimport type {\n CursorMeta,\n CursorParams,\n CursorPayload,\n FieldKey,\n Filter,\n InfiniteMeta,\n InfiniteParams,\n InfinitePayload,\n ListParams,\n ListPayload,\n Meta,\n Params,\n QueryPayload,\n RawCursorMeta,\n RawInfiniteMeta,\n RawMeta,\n Sort,\n SortDirection,\n SortInput,\n} from \"./types\";\n\n/* ---------------- resource inputs: entity-typed, adapter-aware `with` ------ */\n\nexport type ResourceListParams<T, A extends AdapterName> = Omit<ListParams<T>, \"with\"> & { with?: WithFor<A> };\nexport type ResourceInfiniteParams<T, A extends AdapterName> = Omit<InfiniteParams<T>, \"with\"> & { with?: WithFor<A> };\nexport type ResourceCursorParams<T, A extends AdapterName> = Omit<CursorParams<T>, \"with\"> & { with?: WithFor<A> };\nexport type ResourceParams<T, A extends AdapterName> = Omit<Params<T>, \"with\"> & { with?: WithFor<A> };\n\n/* ---------------------------- responses / results ------------------------- */\n\ninterface RawResponse<T, M> {\n data?: T[];\n meta?: M | null;\n}\nexport interface ListResult<T> {\n data: T[];\n meta: Meta;\n}\nexport interface InfiniteResult<T> {\n data: T[];\n meta: InfiniteMeta;\n}\nexport interface CursorResult<T> {\n data: T[];\n meta: CursorMeta;\n}\n\n/* -------------------------------- query keys ------------------------------ */\n\nexport interface ResourceKeys {\n all: readonly unknown[];\n list(payload: unknown): readonly unknown[];\n infinite(payload: unknown): readonly unknown[];\n cursor(payload: unknown): readonly unknown[];\n detail(id: unknown): readonly unknown[];\n}\n\n/* -------------------------------- resource -------------------------------- */\n\nexport interface Resource<T, A extends AdapterName> {\n /** Build an offset (page) payload. */\n list(input?: ResourceListParams<T, A>): ListPayload;\n /** Build an infinite (limit/offset) payload. */\n infinite(input?: ResourceInfiniteParams<T, A>): InfinitePayload;\n /** Build a cursor (keyset) payload. */\n cursor(input?: ResourceCursorParams<T, A>): CursorPayload;\n /** Build a paginationless payload (filter/sort/columns/with). */\n params(input?: ResourceParams<T, A>): QueryPayload;\n /** Filter builder typed to `T`'s fields. */\n f: ReturnType<typeof createFilters<T>>;\n /** Search preset — OR of `contains` across `fields` (e.g. one input → many columns). */\n search(term: string, fields: FieldKey<T>[]): Filter<T>;\n /** Declare a URL↔filter schema (identity helper). */\n schema<S extends ListSchema>(s: S): S;\n /** Build a list payload from URL search params (SSR — the non-hook `useListParams`). */\n fromSearchParams(searchParams: URLSearchParams, options: { schema: ListSchema; url?: UrlConfig; with?: WithFor<A> }): ListPayload;\n /** Stable query keys for TanStack/SWR caches. */\n keys: ResourceKeys;\n /** Map a list response's meta to camelCase (`data` typed to `T`). */\n parseList(raw?: RawResponse<T, RawMeta> | null): ListResult<T>;\n parseInfinite(raw?: RawResponse<T, RawInfiniteMeta> | null): InfiniteResult<T>;\n parseCursor(raw?: RawResponse<T, RawCursorMeta> | null): CursorResult<T>;\n}\n\n/* -------------------------------- registry -------------------------------- */\n\nexport interface RegistryDefaults {\n /** `list` page size. */\n perPage?: number;\n /** `infinite` + `cursor` page size. */\n limit?: number;\n /** `list`/`infinite` sort — `[{key,direction}]` or `[\"-createdAt\", \"id\"]` shorthand. */\n sort?: SortInput;\n /** Cursor-only defaults. */\n cursor?: { order?: SortDirection };\n}\n\nexport interface RegistryConfig<A extends AdapterName> {\n adapter: A;\n defaults?: RegistryDefaults;\n /** Drop empty filter values built from form inputs (default `true`). */\n pruneEmpty?: boolean;\n}\n\nexport interface Registry<A extends AdapterName> {\n readonly adapter: A;\n /** Entity-typed builders + filters + schema + keys + parsers. `name` = cache-key namespace (required, must be unique). */\n resource<T>(name: string): Resource<T, A>;\n /** Registry-level meta parsing (entity-agnostic — `data: unknown[]`). */\n parseList(raw?: RawResponse<unknown, RawMeta> | null): ListResult<unknown>;\n parseInfinite(raw?: RawResponse<unknown, RawInfiniteMeta> | null): InfiniteResult<unknown>;\n parseCursor(raw?: RawResponse<unknown, RawCursorMeta> | null): CursorResult<unknown>;\n}\n\n/**\n * Create a web query registry — configure defaults + backend adapter once, then\n * `registry.resource<T>()` yields entity-typed, adapter-aware query builders,\n * filters, a URL↔filter schema, cache keys and meta parsers.\n *\n * @example\n * ```ts\n * export const qk = createRegistry({ adapter: \"mongoose\", defaults: { perPage: 20, sort: [\"-createdAt\"] } });\n * const users = qk.resource<IUser>(\"users\");\n * const body = users.list({ filter: users.f.eq(\"status\", \"active\"), page });\n * ```\n */\nexport function createRegistry<A extends AdapterName>(config: RegistryConfig<A>): Registry<A> {\n const defaults = config.defaults ?? {};\n const sort: Sort = normalizeSort(defaults.sort, []); // accepts {key,direction}[] or \"-field\"[] shorthand\n const cursorOrder: SortDirection = defaults.cursor?.order ?? \"asc\";\n\n // Only set keys that are provided — createQuery merges over its own defaults,\n // and passing `undefined` would clobber them.\n const qcfg: QueryConfig = {};\n if (defaults.perPage !== undefined) qcfg.defaultPerPage = defaults.perPage;\n if (defaults.limit !== undefined) qcfg.defaultLimit = defaults.limit;\n if (sort.length) qcfg.defaultSort = sort; // only override when a real sort is given\n if (config.pruneEmpty !== undefined) qcfg.pruneEmpty = config.pruneEmpty;\n const q = createQuery(qcfg);\n\n const parseList = (raw?: RawResponse<unknown, RawMeta> | null): ListResult<unknown> => ({ data: raw?.data ?? [], meta: mapMeta(raw?.meta) });\n const parseInfinite = (raw?: RawResponse<unknown, RawInfiniteMeta> | null): InfiniteResult<unknown> => ({\n data: raw?.data ?? [],\n meta: mapInfiniteMeta(raw?.meta),\n });\n const parseCursor = (raw?: RawResponse<unknown, RawCursorMeta> | null): CursorResult<unknown> => ({\n data: raw?.data ?? [],\n meta: mapCursorMeta(raw?.meta),\n });\n\n function resource<T>(name: string): Resource<T, A> {\n const f = createFilters<T>();\n const keys: ResourceKeys = {\n all: [name],\n list: p => [name, \"list\", p],\n infinite: p => [name, \"infinite\", p],\n cursor: p => [name, \"cursor\", p],\n detail: id => [name, \"detail\", id],\n };\n return {\n list: input => q.list(input as unknown as ListParams) as unknown as ListPayload,\n infinite: input => q.infinite(input as unknown as InfiniteParams) as unknown as InfinitePayload,\n cursor: input => q.cursor({ ...(input as unknown as CursorParams), order: input?.order ?? cursorOrder }) as unknown as CursorPayload,\n params: input => q.params(input as unknown as Params) as unknown as QueryPayload,\n f,\n search: (term, fields) => rawF.or(...fields.map(field => rawF.contains(field, term))) as unknown as Filter<T>,\n schema: s => defineListSchema(s),\n fromSearchParams: (searchParams, options) =>\n q.list({ ...readListParams(options.schema, searchParams, options.url), with: options.with } as unknown as ListParams) as unknown as ListPayload,\n keys,\n parseList: raw => parseList(raw) as ListResult<T>,\n parseInfinite: raw => parseInfinite(raw) as InfiniteResult<T>,\n parseCursor: raw => parseCursor(raw) as CursorResult<T>,\n };\n }\n\n return { adapter: config.adapter, resource, parseList, parseInfinite, parseCursor };\n}\n"]}
@@ -11,9 +11,16 @@ var URL_DEFAULTS = {
11
11
  sizeParam: "size",
12
12
  sortParam: "sortType"
13
13
  };
14
+ function decodeSort(value) {
15
+ if (!value) return void 0;
16
+ const items = value.split(",").map((s) => s.trim()).filter(Boolean).map((tok) => {
17
+ const desc = tok.startsWith("-");
18
+ return { key: desc ? tok.slice(1) : tok, direction: desc ? "desc" : "asc" };
19
+ }).filter((i) => i.key);
20
+ return items.length ? items : void 0;
21
+ }
14
22
  function encodeSort(sort) {
15
- if (!sort.name) return "";
16
- return (sort.direction === "desc" ? "-" : "") + sort.name;
23
+ return sort.map((i) => typeof i === "string" ? i.trim() : i && i.key ? (i.direction === "desc" ? "-" : "") + i.key : "").filter(Boolean).join(",");
17
24
  }
18
25
  function schemaToFilter(schema, searchParams) {
19
26
  const conditions = [];
@@ -60,7 +67,7 @@ function readListParams(schema, searchParams, url = {}) {
60
67
  const size = searchParams.get(cfg.sizeParam);
61
68
  return {
62
69
  filter: schemaToFilter(schema, searchParams),
63
- sort: searchParams.get(cfg.sortParam) ?? void 0,
70
+ sort: decodeSort(searchParams.get(cfg.sortParam)),
64
71
  page: Number(searchParams.get(cfg.pageParam)) || 1,
65
72
  perPage: size ? Number(size) : void 0
66
73
  };
@@ -93,7 +100,7 @@ function setSort(searchParams, sort, url = {}) {
93
100
  const cfg = { ...URL_DEFAULTS, ...url };
94
101
  const next = clone(searchParams);
95
102
  next.delete(cfg.pageParam);
96
- const encoded = typeof sort === "string" ? sort : encodeSort(sort);
103
+ const encoded = encodeSort(sort);
97
104
  if (encoded) next.set(cfg.sortParam, encoded);
98
105
  else next.delete(cfg.sortParam);
99
106
  return next;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/url.ts","../../src/react/use-list-params-base.ts","../../src/react/use-list-params.ts"],"names":["useMemo","useCallback","useSearchParams"],"mappings":"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","file":"index.cjs","sourcesContent":["import { buildListParams } from \"./query\";\nimport type { FieldDescriptor, ListSchema } from \"./schema\";\nimport type { FieldCondition, Filter, FilterNode, FilterValue, ListParams, ListPayload, Sort, SortInput } from \"./types\";\n\n/** URL param nomlari (sahifa/o'lcham/sort) — sozlanadigan. */\nexport interface UrlConfig {\n pageParam?: string;\n sizeParam?: string;\n sortParam?: string;\n}\n\nconst URL_DEFAULTS: Required<UrlConfig> = {\n pageParam: \"page\",\n sizeParam: \"size\",\n sortParam: \"sortType\",\n};\n\n/** `\"-createdAt\"` → `{ name, direction }` (bo'sh bo'lsa `undefined`). */\nexport function decodeSort(value: string | null | undefined): Sort | undefined {\n if (!value) return undefined;\n const desc = value.startsWith(\"-\");\n return { name: desc ? value.slice(1) : value, direction: desc ? \"desc\" : \"asc\" };\n}\n\n/** `{ name, direction }` → `\"-createdAt\"` / `\"createdAt\"` (nomsiz bo'lsa `\"\"`). */\nexport function encodeSort(sort: Sort): string {\n if (!sort.name) return \"\";\n return (sort.direction === \"desc\" ? \"-\" : \"\") + sort.name;\n}\n\n/**\n * Schema + searchParams → filter. Applies `range`/`between`/`search`/`split`/\n * `default`/`trim`; empty/absent params are dropped. Returns a flat\n * `FieldCondition[]` (implicit AND), or a tree when a `search` OR-group is\n * present (`{ and: [orGroup, …conditions] }`).\n */\nexport function schemaToFilter(schema: ListSchema, searchParams: URLSearchParams): Filter {\n const conditions: FieldCondition[] = [];\n const groups: FilterNode[] = [];\n\n for (const [param, d] of Object.entries(schema) as [string, FieldDescriptor][]) {\n const key = d.key ?? param;\n\n // range → two inclusive conditions (>= , <=)\n if (d.range) {\n const from = searchParams.get(d.range[0]);\n const to = searchParams.get(d.range[1]);\n if (from) conditions.push(cond(key, \">=\", from));\n if (to) conditions.push(cond(key, \"<=\", to));\n continue;\n }\n\n // between → one condition with a 2-tuple value\n if (d.between) {\n const from = searchParams.get(d.between[0]);\n const to = searchParams.get(d.between[1]);\n if (from && to) conditions.push(cond(key, \"between\", [from, to]));\n continue;\n }\n\n // read value, falling back to `default` only when the param is ABSENT\n // (an empty `?x=` means the user cleared the filter → prune, don't default).\n const raw = searchParams.get(param);\n let value: FilterValue | undefined = raw !== null ? raw : d.default;\n if (typeof value === \"string\" && d.trim) value = value.trim();\n if (value === undefined || value === null || value === \"\") continue;\n if (Array.isArray(value) && value.length === 0) continue;\n\n // search → OR of `contains` across the listed fields (needs a string)\n if (d.search && typeof value === \"string\") {\n groups.push({ or: d.search.map(field => cond(field, \"%_%\", value as string)) });\n continue;\n }\n\n // split → comma-string → array (for `in`/`notIn`); guarded against empties\n if (d.split && typeof value === \"string\") {\n const delimiter = d.split === true ? \",\" : d.split;\n const parts = value\n .split(delimiter)\n .map(s => s.trim())\n .filter(Boolean);\n if (parts.length === 0) continue;\n value = parts;\n }\n\n conditions.push(cond(key, d.operation ?? \"=\", value));\n }\n\n return groups.length === 0 ? conditions : { and: [...groups, ...conditions] };\n}\n\nfunction cond(key: string, operation: FieldCondition[\"operation\"], value: FilterValue): FieldCondition {\n return { key, operation, value };\n}\n\n/** searchParams → normalizatsiyalanmagan {@link ListParams} (filter/sort/page/perPage). */\nexport function readListParams(schema: ListSchema, searchParams: URLSearchParams, url: UrlConfig = {}): ListParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const size = searchParams.get(cfg.sizeParam);\n return {\n filter: schemaToFilter(schema, searchParams),\n sort: searchParams.get(cfg.sortParam) ?? undefined,\n page: Number(searchParams.get(cfg.pageParam)) || 1,\n perPage: size ? Number(size) : undefined,\n };\n}\n\n/** searchParams → to'liq, yuborishga tayyor {@link ListPayload}. */\nexport function searchParamsToPayload(schema: ListSchema, searchParams: URLSearchParams, url?: UrlConfig): ListPayload {\n return buildListParams(readListParams(schema, searchParams, url));\n}\n\n/* ------------------------- URL yozish (immutable) ------------------------- */\n/* Har biri YANGI URLSearchParams qaytaradi; filter/sort o'zgarsa `page` reset. */\n\nfunction clone(searchParams: URLSearchParams): URLSearchParams {\n return new URLSearchParams(searchParams);\n}\n\n/** Filter param'ini o'rnatadi/o'chiradi va `page`ni reset qiladi. */\nexport function setParam(searchParams: URLSearchParams, name: string, value: string | null | undefined, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n if (value === null || value === undefined || value === \"\") next.delete(name);\n else next.set(name, value);\n return next;\n}\n\n/** Sahifani o'rnatadi (`page` reset qilinmaydi). */\nexport function setPage(searchParams: URLSearchParams, page: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.set(cfg.pageParam, String(page));\n return next;\n}\n\n/** Sahifa o'lchamini o'rnatadi va `page`ni reset qiladi. */\nexport function setSize(searchParams: URLSearchParams, size: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n next.set(cfg.sizeParam, String(size));\n return next;\n}\n\n/** Sortni o'rnatadi (`\"-createdAt\"` yoki `{name,direction}`) va `page`ni reset qiladi. */\nexport function setSort(searchParams: URLSearchParams, sort: SortInput, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n const encoded = typeof sort === \"string\" ? sort : encodeSort(sort);\n if (encoded) next.set(cfg.sortParam, encoded);\n else next.delete(cfg.sortParam);\n return next;\n}\n\n/** Barcha list param'larini tozalaydi (ixtiyoriy saqlanadigan kalitlar bilan). */\nexport function resetParams(searchParams: URLSearchParams, keep: string[] = []): URLSearchParams {\n const next = new URLSearchParams();\n for (const key of keep) {\n const value = searchParams.get(key);\n if (value !== null) next.set(key, value);\n }\n return next;\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport type { AdapterName, WithFor } from \"../adapter\";\nimport type { Resource, ResourceListParams } from \"../registry\";\nimport type { ListSchema } from \"../schema\";\nimport type { ListPayload, SortInput } from \"../types\";\nimport type { UrlConfig } from \"../url\";\nimport { readListParams, resetParams, setPage, setParam, setSize, setSort } from \"../url\";\n\nexport interface UseListParamsBaseOptions<A extends AdapterName> {\n /** URL↔filter schema ({@link defineListSchema} / `resource.schema`). Memoize it. */\n schema: ListSchema;\n /** Current URL search params (from your router). */\n searchParams: URLSearchParams;\n /** Apply new search params (`(next) => void`). */\n setSearchParams: (next: URLSearchParams) => void;\n /** URL param names (page/size/sortType) — optional. Memoize it. */\n url?: UrlConfig;\n /** Fixed relations to load on every request (not URL-driven). */\n with?: WithFor<A>;\n}\n\nexport interface UseListParamsResult {\n /** Ready-to-send list payload (built from the URL via the resource's defaults). */\n params: ListPayload;\n searchParams: URLSearchParams;\n /** Set/clear a filter param (resets `page`). */\n setParam: (name: string, value: string | null | undefined) => void;\n setPage: (page: number) => void;\n setSize: (size: number) => void;\n setSort: (sort: SortInput) => void;\n reset: (keep?: string[]) => void;\n}\n\n/**\n * Router-agnostic list URL-state hook. Reads the URL via the schema, builds a\n * ready-to-send payload through the `resource` (registry defaults + adapter), and\n * returns URL setters (filter/sort/size changes reset `page`). Bring your own\n * `searchParams`/`setSearchParams` (Next.js, TanStack Router, …).\n */\nexport function useListParamsBase<T, A extends AdapterName>(resource: Resource<T, A>, options: UseListParamsBaseOptions<A>): UseListParamsResult {\n const { schema, searchParams, setSearchParams, url, with: withRel } = options;\n\n const params = useMemo(\n () => resource.list({ ...readListParams(schema, searchParams, url), with: withRel } as ResourceListParams<T, A>),\n [resource, schema, searchParams, url, withRel],\n );\n\n return {\n params,\n searchParams,\n setParam: useCallback((name, value) => setSearchParams(setParam(searchParams, name, value, url)), [searchParams, setSearchParams, url]),\n setPage: useCallback((page: number) => setSearchParams(setPage(searchParams, page, url)), [searchParams, setSearchParams, url]),\n setSize: useCallback((size: number) => setSearchParams(setSize(searchParams, size, url)), [searchParams, setSearchParams, url]),\n setSort: useCallback((sort: SortInput) => setSearchParams(setSort(searchParams, sort, url)), [searchParams, setSearchParams, url]),\n reset: useCallback((keep?: string[]) => setSearchParams(resetParams(searchParams, keep)), [searchParams, setSearchParams]),\n };\n}\n","import { useSearchParams } from \"react-router-dom\";\n\nimport type { AdapterName, WithFor } from \"../adapter\";\nimport type { Resource } from \"../registry\";\nimport type { ListSchema } from \"../schema\";\nimport type { UrlConfig } from \"../url\";\nimport { useListParamsBase, type UseListParamsResult } from \"./use-list-params-base\";\n\nexport interface UseListParamsOptions<A extends AdapterName> {\n /** URL↔filter schema ({@link defineListSchema} / `resource.schema`). Memoize it. */\n schema: ListSchema;\n /** URL param names (page/size/sortType) — optional. Memoize it. */\n url?: UrlConfig;\n /** Fixed relations to load on every request (not URL-driven). */\n with?: WithFor<A>;\n}\n\n/**\n * List URL-state hook — turnkey with **react-router-dom** (uses `useSearchParams`\n * internally). Reads filters/sort/page from the URL via the schema, builds a\n * ready-to-send payload through the `resource`, and returns URL setters (which\n * reset `page` on filter/sort/size change). Does **not** fetch — pass `params`\n * to your own axios / TanStack Query.\n *\n * For other routers (Next.js, TanStack Router), use {@link useListParamsBase} and\n * supply `searchParams`/`setSearchParams` yourself.\n *\n * @example\n * ```tsx\n * const users = qk.resource<IUser>(\"users\");\n * const { params, setPage, setSort } = useListParams(users, { schema: usersSchema });\n * const { data } = useQuery({ queryKey: users.keys.list(params), queryFn: () => post(\"/users/list\", params) });\n * ```\n */\nexport function useListParams<T, A extends AdapterName>(resource: Resource<T, A>, options: UseListParamsOptions<A>): UseListParamsResult {\n const [searchParams, setSearchParams] = useSearchParams();\n return useListParamsBase(resource, {\n ...options,\n searchParams,\n setSearchParams: next => setSearchParams(next),\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/url.ts","../../src/react/use-list-params-base.ts","../../src/react/use-list-params.ts"],"names":["useMemo","useCallback","useSearchParams"],"mappings":"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","file":"index.cjs","sourcesContent":["import { buildListParams } from \"./query\";\nimport type { FieldDescriptor, ListSchema } from \"./schema\";\nimport type { FieldCondition, Filter, FilterNode, FilterValue, ListParams, ListPayload, Sort, SortDirection, SortInput } from \"./types\";\n\n/** URL param nomlari (sahifa/o'lcham/sort) — sozlanadigan. */\nexport interface UrlConfig {\n pageParam?: string;\n sizeParam?: string;\n sortParam?: string;\n}\n\nconst URL_DEFAULTS: Required<UrlConfig> = {\n pageParam: \"page\",\n sizeParam: \"size\",\n sortParam: \"sortType\",\n};\n\n/**\n * `\"-createdAt,id,-appNumber\"` → `[{ key, direction }, …]` — comma-separated,\n * order preserved, `-` prefix = `desc` (else `asc`). Empty → `undefined`.\n */\nexport function decodeSort(value: string | null | undefined): Sort | undefined {\n if (!value) return undefined;\n const items = value\n .split(\",\")\n .map(s => s.trim())\n .filter(Boolean)\n .map(tok => {\n const desc = tok.startsWith(\"-\");\n return { key: desc ? tok.slice(1) : tok, direction: (desc ? \"desc\" : \"asc\") as SortDirection };\n })\n .filter(i => i.key); // drop empty keys (e.g. a lone \"-\")\n return items.length ? items : undefined;\n}\n\n/** `[{ key, direction }, …]` (or `\"-field\"` shorthand strings) → `\"-createdAt,id,-appNumber\"` (empty → `\"\"`). */\nexport function encodeSort(sort: SortInput): string {\n return sort\n .map(i => (typeof i === \"string\" ? i.trim() : i && i.key ? (i.direction === \"desc\" ? \"-\" : \"\") + i.key : \"\"))\n .filter(Boolean)\n .join(\",\");\n}\n\n/**\n * Schema + searchParams → filter. Applies `range`/`between`/`search`/`split`/\n * `default`/`trim`; empty/absent params are dropped. Returns a flat\n * `FieldCondition[]` (implicit AND), or a tree when a `search` OR-group is\n * present (`{ and: [orGroup, …conditions] }`).\n */\nexport function schemaToFilter(schema: ListSchema, searchParams: URLSearchParams): Filter {\n const conditions: FieldCondition[] = [];\n const groups: FilterNode[] = [];\n\n for (const [param, d] of Object.entries(schema) as [string, FieldDescriptor][]) {\n const key = d.key ?? param;\n\n // range → two inclusive conditions (>= , <=)\n if (d.range) {\n const from = searchParams.get(d.range[0]);\n const to = searchParams.get(d.range[1]);\n if (from) conditions.push(cond(key, \">=\", from));\n if (to) conditions.push(cond(key, \"<=\", to));\n continue;\n }\n\n // between → one condition with a 2-tuple value\n if (d.between) {\n const from = searchParams.get(d.between[0]);\n const to = searchParams.get(d.between[1]);\n if (from && to) conditions.push(cond(key, \"between\", [from, to]));\n continue;\n }\n\n // read value, falling back to `default` only when the param is ABSENT\n // (an empty `?x=` means the user cleared the filter → prune, don't default).\n const raw = searchParams.get(param);\n let value: FilterValue | undefined = raw !== null ? raw : d.default;\n if (typeof value === \"string\" && d.trim) value = value.trim();\n if (value === undefined || value === null || value === \"\") continue;\n if (Array.isArray(value) && value.length === 0) continue;\n\n // search → OR of `contains` across the listed fields (needs a string)\n if (d.search && typeof value === \"string\") {\n groups.push({ or: d.search.map(field => cond(field, \"%_%\", value as string)) });\n continue;\n }\n\n // split → comma-string → array (for `in`/`notIn`); guarded against empties\n if (d.split && typeof value === \"string\") {\n const delimiter = d.split === true ? \",\" : d.split;\n const parts = value\n .split(delimiter)\n .map(s => s.trim())\n .filter(Boolean);\n if (parts.length === 0) continue;\n value = parts;\n }\n\n conditions.push(cond(key, d.operation ?? \"=\", value));\n }\n\n return groups.length === 0 ? conditions : { and: [...groups, ...conditions] };\n}\n\nfunction cond(key: string, operation: FieldCondition[\"operation\"], value: FilterValue): FieldCondition {\n return { key, operation, value };\n}\n\n/** searchParams → normalizatsiyalanmagan {@link ListParams} (filter/sort/page/perPage). */\nexport function readListParams(schema: ListSchema, searchParams: URLSearchParams, url: UrlConfig = {}): ListParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const size = searchParams.get(cfg.sizeParam);\n return {\n filter: schemaToFilter(schema, searchParams),\n sort: decodeSort(searchParams.get(cfg.sortParam)),\n page: Number(searchParams.get(cfg.pageParam)) || 1,\n perPage: size ? Number(size) : undefined,\n };\n}\n\n/** searchParams → to'liq, yuborishga tayyor {@link ListPayload}. */\nexport function searchParamsToPayload(schema: ListSchema, searchParams: URLSearchParams, url?: UrlConfig): ListPayload {\n return buildListParams(readListParams(schema, searchParams, url));\n}\n\n/* ------------------------- URL yozish (immutable) ------------------------- */\n/* Har biri YANGI URLSearchParams qaytaradi; filter/sort o'zgarsa `page` reset. */\n\nfunction clone(searchParams: URLSearchParams): URLSearchParams {\n return new URLSearchParams(searchParams);\n}\n\n/** Filter param'ini o'rnatadi/o'chiradi va `page`ni reset qiladi. */\nexport function setParam(searchParams: URLSearchParams, name: string, value: string | null | undefined, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n if (value === null || value === undefined || value === \"\") next.delete(name);\n else next.set(name, value);\n return next;\n}\n\n/** Sahifani o'rnatadi (`page` reset qilinmaydi). */\nexport function setPage(searchParams: URLSearchParams, page: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.set(cfg.pageParam, String(page));\n return next;\n}\n\n/** Sahifa o'lchamini o'rnatadi va `page`ni reset qiladi. */\nexport function setSize(searchParams: URLSearchParams, size: number, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n next.set(cfg.sizeParam, String(size));\n return next;\n}\n\n/** Sortni o'rnatadi (`[{ key, direction }, …]`) va `page`ni reset qiladi. */\nexport function setSort(searchParams: URLSearchParams, sort: SortInput, url: UrlConfig = {}): URLSearchParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const next = clone(searchParams);\n next.delete(cfg.pageParam);\n const encoded = encodeSort(sort);\n if (encoded) next.set(cfg.sortParam, encoded);\n else next.delete(cfg.sortParam);\n return next;\n}\n\n/** Barcha list param'larini tozalaydi (ixtiyoriy saqlanadigan kalitlar bilan). */\nexport function resetParams(searchParams: URLSearchParams, keep: string[] = []): URLSearchParams {\n const next = new URLSearchParams();\n for (const key of keep) {\n const value = searchParams.get(key);\n if (value !== null) next.set(key, value);\n }\n return next;\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport type { AdapterName, WithFor } from \"../adapter\";\nimport type { Resource, ResourceListParams } from \"../registry\";\nimport type { ListSchema } from \"../schema\";\nimport type { ListPayload, SortInput } from \"../types\";\nimport type { UrlConfig } from \"../url\";\nimport { readListParams, resetParams, setPage, setParam, setSize, setSort } from \"../url\";\n\nexport interface UseListParamsBaseOptions<A extends AdapterName> {\n /** URL↔filter schema ({@link defineListSchema} / `resource.schema`). Memoize it. */\n schema: ListSchema;\n /** Current URL search params (from your router). */\n searchParams: URLSearchParams;\n /** Apply new search params (`(next) => void`). */\n setSearchParams: (next: URLSearchParams) => void;\n /** URL param names (page/size/sortType) — optional. Memoize it. */\n url?: UrlConfig;\n /** Fixed relations to load on every request (not URL-driven). */\n with?: WithFor<A>;\n}\n\nexport interface UseListParamsResult {\n /** Ready-to-send list payload (built from the URL via the resource's defaults). */\n params: ListPayload;\n searchParams: URLSearchParams;\n /** Set/clear a filter param (resets `page`). */\n setParam: (name: string, value: string | null | undefined) => void;\n setPage: (page: number) => void;\n setSize: (size: number) => void;\n setSort: (sort: SortInput) => void;\n reset: (keep?: string[]) => void;\n}\n\n/**\n * Router-agnostic list URL-state hook. Reads the URL via the schema, builds a\n * ready-to-send payload through the `resource` (registry defaults + adapter), and\n * returns URL setters (filter/sort/size changes reset `page`). Bring your own\n * `searchParams`/`setSearchParams` (Next.js, TanStack Router, …).\n */\nexport function useListParamsBase<T, A extends AdapterName>(resource: Resource<T, A>, options: UseListParamsBaseOptions<A>): UseListParamsResult {\n const { schema, searchParams, setSearchParams, url, with: withRel } = options;\n\n const params = useMemo(\n () => resource.list({ ...readListParams(schema, searchParams, url), with: withRel } as ResourceListParams<T, A>),\n [resource, schema, searchParams, url, withRel],\n );\n\n return {\n params,\n searchParams,\n setParam: useCallback((name, value) => setSearchParams(setParam(searchParams, name, value, url)), [searchParams, setSearchParams, url]),\n setPage: useCallback((page: number) => setSearchParams(setPage(searchParams, page, url)), [searchParams, setSearchParams, url]),\n setSize: useCallback((size: number) => setSearchParams(setSize(searchParams, size, url)), [searchParams, setSearchParams, url]),\n setSort: useCallback((sort: SortInput) => setSearchParams(setSort(searchParams, sort, url)), [searchParams, setSearchParams, url]),\n reset: useCallback((keep?: string[]) => setSearchParams(resetParams(searchParams, keep)), [searchParams, setSearchParams]),\n };\n}\n","import { useSearchParams } from \"react-router-dom\";\n\nimport type { AdapterName, WithFor } from \"../adapter\";\nimport type { Resource } from \"../registry\";\nimport type { ListSchema } from \"../schema\";\nimport type { UrlConfig } from \"../url\";\nimport { useListParamsBase, type UseListParamsResult } from \"./use-list-params-base\";\n\nexport interface UseListParamsOptions<A extends AdapterName> {\n /** URL↔filter schema ({@link defineListSchema} / `resource.schema`). Memoize it. */\n schema: ListSchema;\n /** URL param names (page/size/sortType) — optional. Memoize it. */\n url?: UrlConfig;\n /** Fixed relations to load on every request (not URL-driven). */\n with?: WithFor<A>;\n}\n\n/**\n * List URL-state hook — turnkey with **react-router-dom** (uses `useSearchParams`\n * internally). Reads filters/sort/page from the URL via the schema, builds a\n * ready-to-send payload through the `resource`, and returns URL setters (which\n * reset `page` on filter/sort/size change). Does **not** fetch — pass `params`\n * to your own axios / TanStack Query.\n *\n * For other routers (Next.js, TanStack Router), use {@link useListParamsBase} and\n * supply `searchParams`/`setSearchParams` yourself.\n *\n * @example\n * ```tsx\n * const users = qk.resource<IUser>(\"users\");\n * const { params, setPage, setSort } = useListParams(users, { schema: usersSchema });\n * const { data } = useQuery({ queryKey: users.keys.list(params), queryFn: () => post(\"/users/list\", params) });\n * ```\n */\nexport function useListParams<T, A extends AdapterName>(resource: Resource<T, A>, options: UseListParamsOptions<A>): UseListParamsResult {\n const [searchParams, setSearchParams] = useSearchParams();\n return useListParamsBase(resource, {\n ...options,\n searchParams,\n setSearchParams: next => setSearchParams(next),\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { A as AdapterName, r as ListSchema, U as UrlConfig, W as WithFor, c as ListPayload, f as SortInput, z as Resource } from '../registry-DPIEOvLW.cjs';
1
+ import { A as AdapterName, r as ListSchema, U as UrlConfig, W as WithFor, c as ListPayload, f as SortInput, z as Resource } from '../registry-DbZQk28q.cjs';
2
2
  import '@querykitjs/core';
3
3
 
4
4
  interface UseListParamsBaseOptions<A extends AdapterName> {
@@ -1,4 +1,4 @@
1
- import { A as AdapterName, r as ListSchema, U as UrlConfig, W as WithFor, c as ListPayload, f as SortInput, z as Resource } from '../registry-DPIEOvLW.js';
1
+ import { A as AdapterName, r as ListSchema, U as UrlConfig, W as WithFor, c as ListPayload, f as SortInput, z as Resource } from '../registry-DbZQk28q.js';
2
2
  import '@querykitjs/core';
3
3
 
4
4
  interface UseListParamsBaseOptions<A extends AdapterName> {
@@ -9,9 +9,16 @@ var URL_DEFAULTS = {
9
9
  sizeParam: "size",
10
10
  sortParam: "sortType"
11
11
  };
12
+ function decodeSort(value) {
13
+ if (!value) return void 0;
14
+ const items = value.split(",").map((s) => s.trim()).filter(Boolean).map((tok) => {
15
+ const desc = tok.startsWith("-");
16
+ return { key: desc ? tok.slice(1) : tok, direction: desc ? "desc" : "asc" };
17
+ }).filter((i) => i.key);
18
+ return items.length ? items : void 0;
19
+ }
12
20
  function encodeSort(sort) {
13
- if (!sort.name) return "";
14
- return (sort.direction === "desc" ? "-" : "") + sort.name;
21
+ return sort.map((i) => typeof i === "string" ? i.trim() : i && i.key ? (i.direction === "desc" ? "-" : "") + i.key : "").filter(Boolean).join(",");
15
22
  }
16
23
  function schemaToFilter(schema, searchParams) {
17
24
  const conditions = [];
@@ -58,7 +65,7 @@ function readListParams(schema, searchParams, url = {}) {
58
65
  const size = searchParams.get(cfg.sizeParam);
59
66
  return {
60
67
  filter: schemaToFilter(schema, searchParams),
61
- sort: searchParams.get(cfg.sortParam) ?? void 0,
68
+ sort: decodeSort(searchParams.get(cfg.sortParam)),
62
69
  page: Number(searchParams.get(cfg.pageParam)) || 1,
63
70
  perPage: size ? Number(size) : void 0
64
71
  };
@@ -91,7 +98,7 @@ function setSort(searchParams, sort, url = {}) {
91
98
  const cfg = { ...URL_DEFAULTS, ...url };
92
99
  const next = clone(searchParams);
93
100
  next.delete(cfg.pageParam);
94
- const encoded = typeof sort === "string" ? sort : encodeSort(sort);
101
+ const encoded = encodeSort(sort);
95
102
  if (encoded) next.set(cfg.sortParam, encoded);
96
103
  else next.delete(cfg.sortParam);
97
104
  return next;