@querykitjs/web 3.0.0 → 4.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.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: [{ 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"]}
1
+ {"version":3,"sources":["../src/filters.ts","../src/query.ts","../src/meta.ts","../src/schema.ts","../src/url.ts","../src/registry.ts","../src/errors.ts"],"names":["createFilters","coreCreateFilters","DEFAULTS","DEFAULT_PER_PAGE","DEFAULT_LIMIT","DEFAULT_MAX_PER_PAGE","DEFAULT_MAX_LIMIT","DEFAULT_MAX_OFFSET","DEFAULT_MAX_SORT_FIELDS","isEmptyValue","value","toSortItem","item","desc","key","normalizeSort","input","fallback","items","i","normalizeCondition","condition","prune","operation","noValue","out","normalizeNode","node","kids","inner","normalizeFilter","filter","c","buildBase","cfg","base","clampInt","max","resolved","limitError","what","limit","hint","build","sort","CURSOR_HINT","buildList","page","perPage","payload","buildInfinite","offset","buildCursor","createQuery","config","buildParams","buildListParams","buildInfiniteParams","buildCursorParams","total","mapMeta","raw","mapInfiniteMeta","mapCursorMeta","defineListSchema","schema","URL_DEFAULTS","decodeSort","s","tok","encodeSort","schemaToFilter","searchParams","conditions","groups","param","d","from","to","cond","field","delimiter","parts","withClamped","clamped","lastPage","limits","readListParams","url","size","maxPage","maxSortFields","isPageClamped","isSortClamped","searchParamsToPayload","params","clone","setParam","name","next","setPage","setSize","setSort","encoded","resetParams","keep","createRegistry","defaults","createdAt","timestampSort","cursorOrder","qcfg","q","urlLimits","parseList","parseInfinite","parseCursor","resource","f","term","fields","options","read","p","id","REASONS","SITES","isMember","table","isQueryKitError","body","candidate"],"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_MAX_LIMIT, DEFAULT_MAX_OFFSET, DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_SORT_FIELDS, 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 withTotalField?: string;\n pageField?: string;\n perPageField?: string;\n limitField?: string;\n offsetField?: string;\n cursorField?: string;\n defaultPerPage?: number;\n defaultLimit?: number;\n /**\n * `perPage` yuqori chegarasi (core `DEFAULT_MAX_PER_PAGE` = 200) — backend\n * repositorylari va `@querykitjs/zod` factory'lari bilan **bir xil manba**,\n * shuning uchun front rad etiladigan so'rovni umuman yubormaydi.\n */\n maxPerPage?: number;\n /** `limit` yuqori chegarasi (core `DEFAULT_MAX_LIMIT` = 200). */\n maxLimit?: number;\n /**\n * Sahifa chuqurligi: list'da `(page - 1) × perPage`, infinite'da `offset` (core\n * `DEFAULT_MAX_OFFSET` = 10 000). Oshsa builder `Error` tashlaydi — jim kesish\n * so'rov ma'nosini o'zgartirardi. Chuqurroq sahifalar — cursor.\n */\n maxOffset?: number;\n /** `sort` maydonlari soni (core `DEFAULT_MAX_SORT_FIELDS` = 3). Oshsa — `Error`. */\n maxSortFields?: 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 withTotalField: \"withTotal\",\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 maxPerPage: DEFAULT_MAX_PER_PAGE,\n maxLimit: DEFAULT_MAX_LIMIT,\n maxOffset: DEFAULT_MAX_OFFSET,\n maxSortFields: DEFAULT_MAX_SORT_FIELDS,\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\n/** A positive integer (fraction truncated); absent, < 1 or NaN → `fallback`; capped at `max`. */\nexport function clampInt(value: number | undefined, fallback: number, max = Infinity): number {\n const resolved = value === undefined || value < 1 || Number.isNaN(value) ? fallback : Math.trunc(value);\n return Math.min(max, resolved);\n}\n\n/**\n * The server rejects a request past a limit; the builder refuses to make one.\n * Filter limits stay with the server (task 008, Locked decision 5).\n */\nfunction limitError(what: string, limit: \"maxOffset\" | \"maxSortFields\", max: number, hint = \"\"): Error {\n return new Error(`querykit: ${what} exceeds ${limit} (${max})${hint}`);\n}\n\nfunction build(input: Params, cfg: Required<QueryConfig>): Record<string, unknown> {\n const sort = normalizeSort(input.sort, cfg.defaultSort);\n if (sort.length > cfg.maxSortFields) throw limitError(`sort with ${sort.length} fields`, \"maxSortFields\", cfg.maxSortFields);\n return { ...buildBase(input, cfg), [cfg.sortField]: sort };\n}\n\nconst CURSOR_HINT = \"; use cursor pagination for deeper pages\";\n\nfunction buildList(input: ListParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n const page = clampInt(input.page, 1); // page >= 1 (kasr/0/manfiy → 1)\n const perPage = clampInt(input.perPage, cfg.defaultPerPage, cfg.maxPerPage);\n if ((page - 1) * perPage > cfg.maxOffset) throw limitError(`page ${page} × perPage ${perPage}`, \"maxOffset\", cfg.maxOffset, CURSOR_HINT);\n const payload: Record<string, unknown> = { ...build(input, cfg), [cfg.pageField]: page, [cfg.perPageField]: perPage };\n if (input.withTotal !== undefined) payload[cfg.withTotalField] = input.withTotal;\n return payload;\n}\n\nfunction buildInfinite(input: InfiniteParams, cfg: Required<QueryConfig>): Record<string, unknown> {\n const offset = input.offset && input.offset > 0 ? Math.trunc(input.offset) : 0;\n if (offset > cfg.maxOffset) throw limitError(`offset ${offset}`, \"maxOffset\", cfg.maxOffset, CURSOR_HINT);\n return {\n ...build(input, cfg),\n [cfg.limitField]: clampInt(input.limit, cfg.defaultLimit, cfg.maxLimit),\n [cfg.offsetField]: offset,\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, cfg.maxLimit),\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/** A server `null` total means \"not counted\" (`withTotal: false`) and stays `null`; an absent one is `0`. */\nconst total = (value: number | null | undefined): number | null => (value === null ? null : (value ?? 0));\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: total(raw?.total_pages),\n totalCount: total(raw?.total_items),\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 { DEFAULT_MAX_OFFSET, DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_SORT_FIELDS, DEFAULT_PER_PAGE } from \"@querykitjs/core\";\n\nimport { buildListParams, clampInt } 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/**\n * The bounds the URL readers clamp to — the builder's own (`createRegistry`\n * `defaults`); an absent one is the core default.\n */\nexport interface UrlLimits {\n perPage?: number;\n maxPerPage?: number;\n maxOffset?: number;\n maxSortFields?: number;\n}\n\n/** {@link ListParams} read from a URL. `clamped` — the URL's page or sort was cut to the limits. */\nexport type UrlListParams = ListParams & { clamped: boolean };\n\n/**\n * A list payload built from a URL. `clamped` is non-enumerable: readable in code,\n * never serialized, so the wire payload is unchanged.\n */\nexport type UrlListPayload = ListPayload & { readonly clamped?: boolean };\n\n/** Marks a payload with a non-enumerable `clamped` flag. */\nexport function withClamped(payload: ListPayload, clamped: boolean): UrlListPayload {\n return Object.defineProperty(payload, \"clamped\", { value: clamped, enumerable: false });\n}\n\n/** The last page the builder accepts: `(page - 1) × perPage ≤ maxOffset`. */\nfunction lastPage(perPage: number | undefined, limits: UrlLimits): number {\n const resolved = clampInt(perPage, limits.perPage ?? DEFAULT_PER_PAGE, limits.maxPerPage ?? DEFAULT_MAX_PER_PAGE);\n return Math.floor((limits.maxOffset ?? DEFAULT_MAX_OFFSET) / resolved) + 1;\n}\n\n/**\n * searchParams → normalizatsiyalanmagan {@link ListParams} (filter/sort/page/perPage).\n * The URL is user input: a page past `maxOffset` becomes the last allowed page and a\n * sort past `maxSortFields` keeps its first fields, with `clamped: true` — so a\n * hand-edited `?page=9999` never throws during render. The builders still throw\n * for a direct call (task 008).\n */\nexport function readListParams(schema: ListSchema, searchParams: URLSearchParams, url: UrlConfig = {}, limits: UrlLimits = {}): UrlListParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const size = searchParams.get(cfg.sizeParam);\n const perPage = size ? Number(size) : undefined;\n const page = Math.trunc(Number(searchParams.get(cfg.pageParam))) || 1;\n const sort = decodeSort(searchParams.get(cfg.sortParam));\n const maxPage = lastPage(perPage, limits);\n const maxSortFields = limits.maxSortFields ?? DEFAULT_MAX_SORT_FIELDS;\n const isPageClamped = page > maxPage;\n const isSortClamped = sort !== undefined && sort.length > maxSortFields;\n return {\n filter: schemaToFilter(schema, searchParams),\n sort: isSortClamped ? sort.slice(0, maxSortFields) : sort,\n page: isPageClamped ? maxPage : page,\n perPage,\n clamped: isPageClamped || isSortClamped,\n };\n}\n\n/** searchParams → to'liq, yuborishga tayyor {@link ListPayload} (core default limits; clamped like {@link readListParams}). */\nexport function searchParamsToPayload(schema: ListSchema, searchParams: URLSearchParams, url?: UrlConfig): UrlListPayload {\n const params = readListParams(schema, searchParams, url);\n return withClamped(buildListParams(params), params.clamped);\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, withClamped, type UrlConfig, type UrlLimits, type UrlListPayload } 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/** `resource.search` options. */\nexport interface SearchOptions {\n /** The string operator per field (default `\"contains\"`). */\n operation?: \"contains\" | \"startsWith\" | \"endsWith\";\n}\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 /**\n * Search preset — OR of `operation` (default `contains`) across `fields` (one input → many columns).\n * Each field must be `filterable` with that operator on the server.\n */\n search(term: string, fields: FieldKey<T>[], options?: SearchOptions): Filter<T>;\n /** Declare a URL↔filter schema (identity helper). */\n schema<S extends ListSchema>(s: S): S;\n /**\n * Build a list payload from URL search params (SSR — the non-hook `useListParams`).\n * A page or sort past the registry limits is clamped (`clamped`, non-enumerable — never sent).\n */\n fromSearchParams(searchParams: URLSearchParams, options: { schema: ListSchema; url?: UrlConfig; with?: WithFor<A> }): UrlListPayload;\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 /**\n * `perPage` upper bound (core `DEFAULT_MAX_PER_PAGE` = 200) — the same constant\n * the zod factories and both backend repositories use, so the frontend never\n * sends a request the server would reject.\n */\n maxPerPage?: number;\n /** `limit` upper bound (core `DEFAULT_MAX_LIMIT` = 200). */\n maxLimit?: number;\n /** Page depth bound (core `DEFAULT_MAX_OFFSET` = 10 000) — a deeper `list`/`infinite` request throws. */\n maxOffset?: number;\n /** Sort field count bound (core `DEFAULT_MAX_SORT_FIELDS` = 3) — more fields throw. */\n maxSortFields?: number;\n /** `list`/`infinite` sort — `[{key,direction}]` or `[\"-createdAt\", \"id\"]` shorthand. */\n sort?: SortInput;\n /** Cursor-only defaults. */\n cursor?: { order?: SortDirection };\n}\n\n/** The backend registry's `timestamps` field names, so the web default sort names the same field. */\nexport interface RegistryTimestamps {\n /** The createdAt field (default `\"createdAt\"`) — the default `list`/`infinite` sort is `[{ key: createdAt, direction: \"desc\" }]`. */\n createdAt?: string;\n}\n\nexport interface RegistryConfig<A extends AdapterName> {\n adapter: A;\n defaults?: RegistryDefaults;\n /** Same as the backend registry's `timestamps`; `defaults.sort` wins over it. */\n timestamps?: RegistryTimestamps;\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 createdAt = config.timestamps?.createdAt;\n const timestampSort: Sort = createdAt ? [{ key: createdAt, direction: \"desc\" }] : [];\n const sort: Sort = normalizeSort(defaults.sort, timestampSort); // 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 (defaults.maxPerPage !== undefined) qcfg.maxPerPage = defaults.maxPerPage;\n if (defaults.maxLimit !== undefined) qcfg.maxLimit = defaults.maxLimit;\n if (defaults.maxOffset !== undefined) qcfg.maxOffset = defaults.maxOffset;\n if (defaults.maxSortFields !== undefined) qcfg.maxSortFields = defaults.maxSortFields;\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 const urlLimits: UrlLimits = {\n perPage: defaults.perPage,\n maxPerPage: defaults.maxPerPage,\n maxOffset: defaults.maxOffset,\n maxSortFields: defaults.maxSortFields,\n };\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, options) => rawF.or(...fields.map(field => rawF[options?.operation ?? \"contains\"](field, term))) as unknown as Filter<T>,\n schema: s => defineListSchema(s),\n fromSearchParams: (searchParams, options) => {\n const read = readListParams(options.schema, searchParams, options.url, urlLimits);\n return withClamped(q.list({ ...read, with: options.with } as unknown as ListParams) as unknown as ListPayload, read.clamped);\n },\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","import type { SkipReason, SkippedCondition, SkipSite } from \"@querykitjs/core\";\n\n/**\n * The `QueryKitError.info` shape a backend may put in its 400 response body. The\n * response envelope is the project's own; web only types this part.\n */\nexport type QueryKitErrorBody = Pick<SkippedCondition, \"site\" | \"key\" | \"reason\"> & Partial<Pick<SkippedCondition, \"source\" | \"operation\">>;\n\n/* Records keyed by the core unions: a new core reason or site fails the typecheck here until it is listed. */\nconst REASONS: Record<SkipReason, true> = {\n \"unknown-key\": true,\n \"invalid-value\": true,\n \"forbidden-key\": true,\n \"forbidden-operator\": true,\n \"limit-exceeded\": true,\n \"empty-filter\": true,\n};\nconst SITES: Record<SkipSite, true> = { filter: true, sort: true, cursorKey: true, aggregate: true, page: true, mutation: true, with: true };\n\nconst isMember = <K extends string>(table: Record<K, true>, value: unknown): value is K => typeof value === \"string\" && Object.hasOwn(table, value);\n\n/**\n * Is `body` a querykit error (`reason`, `site`, `key`)? Lets the frontend tell a\n * rejected query (forbidden key, limit exceeded, …) from any other 400.\n *\n * @example\n * ```ts\n * const body = error.response?.data?.error;\n * if (isQueryKitError(body) && body.reason === \"forbidden-key\") showFieldError(body.key);\n * ```\n */\nexport function isQueryKitError(body: unknown): body is QueryKitErrorBody {\n if (typeof body !== \"object\" || body === null) return false;\n const candidate = body as Record<string, unknown>;\n return isMember(REASONS, candidate.reason) && isMember(SITES, candidate.site) && typeof candidate.key === \"string\";\n}\n"]}
@@ -1,148 +1,2 @@
1
- 'use strict';
2
-
3
- var reactRouterDom = require('react-router-dom');
4
- var react = require('react');
5
-
6
- // src/react/use-list-params.ts
7
-
8
- // src/url.ts
9
- var URL_DEFAULTS = {
10
- pageParam: "page",
11
- sizeParam: "size",
12
- sortParam: "sortType"
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
- }
22
- function encodeSort(sort) {
23
- return sort.map((i) => typeof i === "string" ? i.trim() : i && i.key ? (i.direction === "desc" ? "-" : "") + i.key : "").filter(Boolean).join(",");
24
- }
25
- function schemaToFilter(schema, searchParams) {
26
- const conditions = [];
27
- const groups = [];
28
- for (const [param, d] of Object.entries(schema)) {
29
- const key = d.key ?? param;
30
- if (d.range) {
31
- const from = searchParams.get(d.range[0]);
32
- const to = searchParams.get(d.range[1]);
33
- if (from) conditions.push(cond(key, ">=", from));
34
- if (to) conditions.push(cond(key, "<=", to));
35
- continue;
36
- }
37
- if (d.between) {
38
- const from = searchParams.get(d.between[0]);
39
- const to = searchParams.get(d.between[1]);
40
- if (from && to) conditions.push(cond(key, "between", [from, to]));
41
- continue;
42
- }
43
- const raw = searchParams.get(param);
44
- let value = raw !== null ? raw : d.default;
45
- if (typeof value === "string" && d.trim) value = value.trim();
46
- if (value === void 0 || value === null || value === "") continue;
47
- if (Array.isArray(value) && value.length === 0) continue;
48
- if (d.search && typeof value === "string") {
49
- groups.push({ or: d.search.map((field) => cond(field, "%_%", value)) });
50
- continue;
51
- }
52
- if (d.split && typeof value === "string") {
53
- const delimiter = d.split === true ? "," : d.split;
54
- const parts = value.split(delimiter).map((s) => s.trim()).filter(Boolean);
55
- if (parts.length === 0) continue;
56
- value = parts;
57
- }
58
- conditions.push(cond(key, d.operation ?? "=", value));
59
- }
60
- return groups.length === 0 ? conditions : { and: [...groups, ...conditions] };
61
- }
62
- function cond(key, operation, value) {
63
- return { key, operation, value };
64
- }
65
- function readListParams(schema, searchParams, url = {}) {
66
- const cfg = { ...URL_DEFAULTS, ...url };
67
- const size = searchParams.get(cfg.sizeParam);
68
- return {
69
- filter: schemaToFilter(schema, searchParams),
70
- sort: decodeSort(searchParams.get(cfg.sortParam)),
71
- page: Number(searchParams.get(cfg.pageParam)) || 1,
72
- perPage: size ? Number(size) : void 0
73
- };
74
- }
75
- function clone(searchParams) {
76
- return new URLSearchParams(searchParams);
77
- }
78
- function setParam(searchParams, name, value, url = {}) {
79
- const cfg = { ...URL_DEFAULTS, ...url };
80
- const next = clone(searchParams);
81
- next.delete(cfg.pageParam);
82
- if (value === null || value === void 0 || value === "") next.delete(name);
83
- else next.set(name, value);
84
- return next;
85
- }
86
- function setPage(searchParams, page, url = {}) {
87
- const cfg = { ...URL_DEFAULTS, ...url };
88
- const next = clone(searchParams);
89
- next.set(cfg.pageParam, String(page));
90
- return next;
91
- }
92
- function setSize(searchParams, size, url = {}) {
93
- const cfg = { ...URL_DEFAULTS, ...url };
94
- const next = clone(searchParams);
95
- next.delete(cfg.pageParam);
96
- next.set(cfg.sizeParam, String(size));
97
- return next;
98
- }
99
- function setSort(searchParams, sort, url = {}) {
100
- const cfg = { ...URL_DEFAULTS, ...url };
101
- const next = clone(searchParams);
102
- next.delete(cfg.pageParam);
103
- const encoded = encodeSort(sort);
104
- if (encoded) next.set(cfg.sortParam, encoded);
105
- else next.delete(cfg.sortParam);
106
- return next;
107
- }
108
- function resetParams(searchParams, keep = []) {
109
- const next = new URLSearchParams();
110
- for (const key of keep) {
111
- const value = searchParams.get(key);
112
- if (value !== null) next.set(key, value);
113
- }
114
- return next;
115
- }
116
-
117
- // src/react/use-list-params-base.ts
118
- function useListParamsBase(resource, options) {
119
- const { schema, searchParams, setSearchParams, url, with: withRel } = options;
120
- const params = react.useMemo(
121
- () => resource.list({ ...readListParams(schema, searchParams, url), with: withRel }),
122
- [resource, schema, searchParams, url, withRel]
123
- );
124
- return {
125
- params,
126
- searchParams,
127
- setParam: react.useCallback((name, value) => setSearchParams(setParam(searchParams, name, value, url)), [searchParams, setSearchParams, url]),
128
- setPage: react.useCallback((page) => setSearchParams(setPage(searchParams, page, url)), [searchParams, setSearchParams, url]),
129
- setSize: react.useCallback((size) => setSearchParams(setSize(searchParams, size, url)), [searchParams, setSearchParams, url]),
130
- setSort: react.useCallback((sort) => setSearchParams(setSort(searchParams, sort, url)), [searchParams, setSearchParams, url]),
131
- reset: react.useCallback((keep) => setSearchParams(resetParams(searchParams, keep)), [searchParams, setSearchParams])
132
- };
133
- }
134
-
135
- // src/react/use-list-params.ts
136
- function useListParams(resource, options) {
137
- const [searchParams, setSearchParams] = reactRouterDom.useSearchParams();
138
- return useListParamsBase(resource, {
139
- ...options,
140
- searchParams,
141
- setSearchParams: (next) => setSearchParams(next)
142
- });
143
- }
144
-
145
- exports.useListParams = useListParams;
146
- exports.useListParamsBase = useListParamsBase;
147
- //# sourceMappingURL=index.cjs.map
1
+ 'use strict';var reactRouter=require('react-router'),react=require('react');require('@querykitjs/core');var m={pageParam:"page",sizeParam:"size",sortParam:"sortType"};function S(a){return a.map(r=>typeof r=="string"?r.trim():r&&r.key?(r.direction==="desc"?"-":"")+r.key:"").filter(Boolean).join(",")}function c(a){return new URLSearchParams(a)}function f(a,r,s,e={}){let t={...m,...e},n=c(a);return n.delete(t.pageParam),s==null||s===""?n.delete(r):n.set(r,s),n}function d(a,r,s={}){let e={...m,...s},t=c(a);return t.set(e.pageParam,String(r)),t}function P(a,r,s={}){let e={...m,...s},t=c(a);return t.delete(e.pageParam),t.set(e.sizeParam,String(r)),t}function g(a,r,s={}){let e={...m,...s},t=c(a);t.delete(e.pageParam);let n=S(r);return n?t.set(e.sortParam,n):t.delete(e.sortParam),t}function L(a,r=[]){let s=new URLSearchParams;for(let e of r){let t=a.get(e);t!==null&&s.set(e,t);}return s}function p(a,r){let{schema:s,searchParams:e,setSearchParams:t,url:n,with:l}=r,u=react.useMemo(()=>a.fromSearchParams(e,{schema:s,url:n,with:l}),[a,s,e,n,l]);return {params:u,clamped:u.clamped===true,searchParams:e,setParam:react.useCallback((o,h)=>t(f(e,o,h,n)),[e,t,n]),setPage:react.useCallback(o=>t(d(e,o,n)),[e,t,n]),setSize:react.useCallback(o=>t(P(e,o,n)),[e,t,n]),setSort:react.useCallback(o=>t(g(e,o,n)),[e,t,n]),reset:react.useCallback(o=>t(L(e,o)),[e,t])}}function x(a,r){let[s,e]=reactRouter.useSearchParams();return p(a,{...r,searchParams:s,setSearchParams:t=>e(t)})}exports.useListParams=x;exports.useListParamsBase=p;//# sourceMappingURL=index.cjs.map
148
2
  //# sourceMappingURL=index.cjs.map
@@ -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, 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
+ {"version":3,"sources":["../../src/url.ts","../../src/react/use-list-params-base.ts","../../src/react/use-list-params.ts"],"names":["URL_DEFAULTS","encodeSort","sort","i","clone","searchParams","setParam","name","value","url","cfg","next","setPage","page","setSize","size","setSort","encoded","resetParams","keep","key","useListParamsBase","resource","options","schema","setSearchParams","withRel","params","useMemo","useCallback","useListParams","useSearchParams"],"mappings":"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","file":"index.cjs","sourcesContent":["import { DEFAULT_MAX_OFFSET, DEFAULT_MAX_PER_PAGE, DEFAULT_MAX_SORT_FIELDS, DEFAULT_PER_PAGE } from \"@querykitjs/core\";\n\nimport { buildListParams, clampInt } 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/**\n * The bounds the URL readers clamp to — the builder's own (`createRegistry`\n * `defaults`); an absent one is the core default.\n */\nexport interface UrlLimits {\n perPage?: number;\n maxPerPage?: number;\n maxOffset?: number;\n maxSortFields?: number;\n}\n\n/** {@link ListParams} read from a URL. `clamped` — the URL's page or sort was cut to the limits. */\nexport type UrlListParams = ListParams & { clamped: boolean };\n\n/**\n * A list payload built from a URL. `clamped` is non-enumerable: readable in code,\n * never serialized, so the wire payload is unchanged.\n */\nexport type UrlListPayload = ListPayload & { readonly clamped?: boolean };\n\n/** Marks a payload with a non-enumerable `clamped` flag. */\nexport function withClamped(payload: ListPayload, clamped: boolean): UrlListPayload {\n return Object.defineProperty(payload, \"clamped\", { value: clamped, enumerable: false });\n}\n\n/** The last page the builder accepts: `(page - 1) × perPage ≤ maxOffset`. */\nfunction lastPage(perPage: number | undefined, limits: UrlLimits): number {\n const resolved = clampInt(perPage, limits.perPage ?? DEFAULT_PER_PAGE, limits.maxPerPage ?? DEFAULT_MAX_PER_PAGE);\n return Math.floor((limits.maxOffset ?? DEFAULT_MAX_OFFSET) / resolved) + 1;\n}\n\n/**\n * searchParams → normalizatsiyalanmagan {@link ListParams} (filter/sort/page/perPage).\n * The URL is user input: a page past `maxOffset` becomes the last allowed page and a\n * sort past `maxSortFields` keeps its first fields, with `clamped: true` — so a\n * hand-edited `?page=9999` never throws during render. The builders still throw\n * for a direct call (task 008).\n */\nexport function readListParams(schema: ListSchema, searchParams: URLSearchParams, url: UrlConfig = {}, limits: UrlLimits = {}): UrlListParams {\n const cfg = { ...URL_DEFAULTS, ...url };\n const size = searchParams.get(cfg.sizeParam);\n const perPage = size ? Number(size) : undefined;\n const page = Math.trunc(Number(searchParams.get(cfg.pageParam))) || 1;\n const sort = decodeSort(searchParams.get(cfg.sortParam));\n const maxPage = lastPage(perPage, limits);\n const maxSortFields = limits.maxSortFields ?? DEFAULT_MAX_SORT_FIELDS;\n const isPageClamped = page > maxPage;\n const isSortClamped = sort !== undefined && sort.length > maxSortFields;\n return {\n filter: schemaToFilter(schema, searchParams),\n sort: isSortClamped ? sort.slice(0, maxSortFields) : sort,\n page: isPageClamped ? maxPage : page,\n perPage,\n clamped: isPageClamped || isSortClamped,\n };\n}\n\n/** searchParams → to'liq, yuborishga tayyor {@link ListPayload} (core default limits; clamped like {@link readListParams}). */\nexport function searchParamsToPayload(schema: ListSchema, searchParams: URLSearchParams, url?: UrlConfig): UrlListPayload {\n const params = readListParams(schema, searchParams, url);\n return withClamped(buildListParams(params), params.clamped);\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 } from \"../registry\";\nimport type { ListSchema } from \"../schema\";\nimport type { ListPayload, SortInput } from \"../types\";\nimport type { UrlConfig } from \"../url\";\nimport { 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 /**\n * The URL's page or sort was past the limits and was clamped (`?page=9999` → the last\n * allowed page). The app may rewrite the URL (`setPage(params.page)`).\n */\n clamped: boolean;\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 (a page or sort\n * past the limits is clamped — `clamped`, never a render error), 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(() => resource.fromSearchParams(searchParams, { schema, url, with: withRel }), [resource, schema, searchParams, url, withRel]);\n\n return {\n params,\n clamped: params.clamped === true,\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\";\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** v7 / v8 (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-DbZQk28q.cjs';
1
+ import { AdapterName, ListSchema, UrlConfig, WithFor, ListPayload, SortInput, Resource } from '../index.cjs';
2
2
  import '@querykitjs/core';
3
3
 
4
4
  interface UseListParamsBaseOptions<A extends AdapterName> {
@@ -16,6 +16,11 @@ interface UseListParamsBaseOptions<A extends AdapterName> {
16
16
  interface UseListParamsResult {
17
17
  /** Ready-to-send list payload (built from the URL via the resource's defaults). */
18
18
  params: ListPayload;
19
+ /**
20
+ * The URL's page or sort was past the limits and was clamped (`?page=9999` → the last
21
+ * allowed page). The app may rewrite the URL (`setPage(params.page)`).
22
+ */
23
+ clamped: boolean;
19
24
  searchParams: URLSearchParams;
20
25
  /** Set/clear a filter param (resets `page`). */
21
26
  setParam: (name: string, value: string | null | undefined) => void;
@@ -25,7 +30,8 @@ interface UseListParamsResult {
25
30
  reset: (keep?: string[]) => void;
26
31
  }
27
32
  /**
28
- * Router-agnostic list URL-state hook. Reads the URL via the schema, builds a
33
+ * Router-agnostic list URL-state hook. Reads the URL via the schema (a page or sort
34
+ * past the limits is clamped — `clamped`, never a render error), builds a
29
35
  * ready-to-send payload through the `resource` (registry defaults + adapter), and
30
36
  * returns URL setters (filter/sort/size changes reset `page`). Bring your own
31
37
  * `searchParams`/`setSearchParams` (Next.js, TanStack Router, …).
@@ -41,7 +47,7 @@ interface UseListParamsOptions<A extends AdapterName> {
41
47
  with?: WithFor<A>;
42
48
  }
43
49
  /**
44
- * List URL-state hook — turnkey with **react-router-dom** (uses `useSearchParams`
50
+ * List URL-state hook — turnkey with **react-router** v7 / v8 (uses `useSearchParams`
45
51
  * internally). Reads filters/sort/page from the URL via the schema, builds a
46
52
  * ready-to-send payload through the `resource`, and returns URL setters (which
47
53
  * reset `page` on filter/sort/size change). Does **not** fetch — pass `params`
@@ -59,4 +65,5 @@ interface UseListParamsOptions<A extends AdapterName> {
59
65
  */
60
66
  declare function useListParams<T, A extends AdapterName>(resource: Resource<T, A>, options: UseListParamsOptions<A>): UseListParamsResult;
61
67
 
62
- export { type UseListParamsBaseOptions, type UseListParamsOptions, type UseListParamsResult, useListParams, useListParamsBase };
68
+ export { useListParams, useListParamsBase };
69
+ export type { UseListParamsBaseOptions, UseListParamsOptions, UseListParamsResult };
@@ -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-DbZQk28q.js';
1
+ import { AdapterName, ListSchema, UrlConfig, WithFor, ListPayload, SortInput, Resource } from '../index.js';
2
2
  import '@querykitjs/core';
3
3
 
4
4
  interface UseListParamsBaseOptions<A extends AdapterName> {
@@ -16,6 +16,11 @@ interface UseListParamsBaseOptions<A extends AdapterName> {
16
16
  interface UseListParamsResult {
17
17
  /** Ready-to-send list payload (built from the URL via the resource's defaults). */
18
18
  params: ListPayload;
19
+ /**
20
+ * The URL's page or sort was past the limits and was clamped (`?page=9999` → the last
21
+ * allowed page). The app may rewrite the URL (`setPage(params.page)`).
22
+ */
23
+ clamped: boolean;
19
24
  searchParams: URLSearchParams;
20
25
  /** Set/clear a filter param (resets `page`). */
21
26
  setParam: (name: string, value: string | null | undefined) => void;
@@ -25,7 +30,8 @@ interface UseListParamsResult {
25
30
  reset: (keep?: string[]) => void;
26
31
  }
27
32
  /**
28
- * Router-agnostic list URL-state hook. Reads the URL via the schema, builds a
33
+ * Router-agnostic list URL-state hook. Reads the URL via the schema (a page or sort
34
+ * past the limits is clamped — `clamped`, never a render error), builds a
29
35
  * ready-to-send payload through the `resource` (registry defaults + adapter), and
30
36
  * returns URL setters (filter/sort/size changes reset `page`). Bring your own
31
37
  * `searchParams`/`setSearchParams` (Next.js, TanStack Router, …).
@@ -41,7 +47,7 @@ interface UseListParamsOptions<A extends AdapterName> {
41
47
  with?: WithFor<A>;
42
48
  }
43
49
  /**
44
- * List URL-state hook — turnkey with **react-router-dom** (uses `useSearchParams`
50
+ * List URL-state hook — turnkey with **react-router** v7 / v8 (uses `useSearchParams`
45
51
  * internally). Reads filters/sort/page from the URL via the schema, builds a
46
52
  * ready-to-send payload through the `resource`, and returns URL setters (which
47
53
  * reset `page` on filter/sort/size change). Does **not** fetch — pass `params`
@@ -59,4 +65,5 @@ interface UseListParamsOptions<A extends AdapterName> {
59
65
  */
60
66
  declare function useListParams<T, A extends AdapterName>(resource: Resource<T, A>, options: UseListParamsOptions<A>): UseListParamsResult;
61
67
 
62
- export { type UseListParamsBaseOptions, type UseListParamsOptions, type UseListParamsResult, useListParams, useListParamsBase };
68
+ export { useListParams, useListParamsBase };
69
+ export type { UseListParamsBaseOptions, UseListParamsOptions, UseListParamsResult };