sorting-query
Version:
An utility to parse and define types of sorting queries
1 lines • 5.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/SORT_PREFIX.ts","../src/utils.ts"],"sourcesContent":["export const SORT_PREFIX = \"orderBy.\" as const;\n","import { SORT_PREFIX } from \"./SORT_PREFIX\";\nimport {\n AscendingComparatorsDict,\n Comparator,\n SortedColumn,\n SortedPropertiesFromParams,\n TKey,\n} from \"./types\";\n\nfunction opposite<T>(comparator: Comparator<T>) {\n return (a: T, b: T) => -comparator(a, b);\n}\n\nfunction combineComparators<T>(...comparators: Comparator<T>[]) {\n return (a: T, b: T) => {\n for (const comparator of comparators) {\n const result = comparator(a, b);\n if (result !== 0) return result;\n }\n return 0;\n };\n}\n\nexport function indifferentComparator<T>(a: T, b: T) {\n return 0;\n}\n\nexport function getSorted<V extends object, K extends keyof V>(\n ascendingComparators: AscendingComparatorsDict<V, K>,\n orderBy: SortedColumn<K>[],\n items: V[]\n): V[] {\n const comparators = orderBy.map((orderBy) => {\n const { key, order } = orderBy;\n const ascendingComparator = ascendingComparators[key];\n\n if (!ascendingComparator) return indifferentComparator;\n\n const propertyComparator =\n order === \"asc\" ? ascendingComparator : opposite(ascendingComparator);\n return (a: V, b: V) => propertyComparator(a[key], b[key]);\n });\n\n const combinedComparator = combineComparators(...comparators);\n\n const res = [...items];\n\n res.sort(combinedComparator);\n\n return res;\n}\n\nexport function numberAscending(a: number, b: number) {\n return a - b;\n}\nexport function stringAscending<T extends string | undefined>(a: T, b: T) {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n return a.localeCompare(b);\n}\n\nexport function timestampNewerFirst(a: number, b: number) {\n return b - a;\n}\n\nexport function isValidOrder(value: unknown): value is \"asc\" | \"desc\" {\n return value === \"asc\" || value === \"desc\";\n}\n\nexport function isSortQueryParam(\n value: unknown\n): value is `${typeof SORT_PREFIX}${string}` {\n if (typeof value !== \"string\") return false;\n return value.startsWith(SORT_PREFIX);\n}\n\nexport function getSortedProperty<P extends string>(\n value: `${typeof SORT_PREFIX}${P}`\n): P {\n return value.slice(SORT_PREFIX.length) as P;\n}\n\nexport function parseSortingParams<Obj extends object>(\n params: Obj\n): SortedColumn<SortedPropertiesFromParams<Obj>>[] {\n const res: SortedColumn<SortedPropertiesFromParams<Obj>>[] = [];\n\n const keys = Object.keys(params) as (keyof Obj)[];\n\n for (const param of keys) {\n if (!isSortQueryParam(param)) continue;\n\n const order = params[param];\n if (!isValidOrder(order)) continue;\n\n const sortedProperty = getSortedProperty(param);\n\n res.push({\n key: sortedProperty as SortedPropertiesFromParams<Obj>,\n order,\n });\n }\n return res;\n}\n\nexport function isValidSortedColumns<T extends TKey>(\n sortableKeys: readonly T[],\n value: any\n): value is SortedColumn<T>[] {\n if (!Array.isArray(value)) return false;\n const sortedColumns = value as SortedColumn<T>[];\n\n const s = new Set<TKey>(sortableKeys);\n\n for (const column of sortedColumns) {\n if (!column) return false;\n if (!s.has(column.key)) return false;\n if (column.order !== \"desc\" && column.order !== \"asc\") return false;\n }\n return true;\n}\n\nexport function toQueryParams<T extends TKey>(\n sortedColumns: SortedColumn<T>[]\n): Record<string, string> {\n const res: Record<string, string> = Object.create(null);\n for (const { key, order } of sortedColumns) {\n res[`orderBy.${key.toString()}`] = order;\n }\n return res;\n}\n"],"mappings":";AAAO,IAAM,cAAc;;;ACS3B,SAAS,SAAY,YAA2B;AAC9C,SAAO,CAAC,GAAM,MAAS,CAAC,WAAW,GAAG,CAAC;AACzC;AAEA,SAAS,sBAAyB,aAA8B;AAC9D,SAAO,CAAC,GAAM,MAAS;AACrB,eAAW,cAAc,aAAa;AACpC,YAAM,SAAS,WAAW,GAAG,CAAC;AAC9B,UAAI,WAAW;AAAG,eAAO;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAAyB,GAAM,GAAM;AACnD,SAAO;AACT;AAEO,SAAS,UACd,sBACA,SACA,OACK;AACL,QAAM,cAAc,QAAQ,IAAI,CAACA,aAAY;AAC3C,UAAM,EAAE,KAAK,MAAM,IAAIA;AACvB,UAAM,sBAAsB,qBAAqB,GAAG;AAEpD,QAAI,CAAC;AAAqB,aAAO;AAEjC,UAAM,qBACJ,UAAU,QAAQ,sBAAsB,SAAS,mBAAmB;AACtE,WAAO,CAAC,GAAM,MAAS,mBAAmB,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC;AAAA,EAC1D,CAAC;AAED,QAAM,qBAAqB,mBAAmB,GAAG,WAAW;AAE5D,QAAM,MAAM,CAAC,GAAG,KAAK;AAErB,MAAI,KAAK,kBAAkB;AAE3B,SAAO;AACT;AAEO,SAAS,gBAAgB,GAAW,GAAW;AACpD,SAAO,IAAI;AACb;AACO,SAAS,gBAA8C,GAAM,GAAM;AACxE,MAAI,KAAK,QAAQ,KAAK;AAAM,WAAO;AACnC,MAAI,KAAK;AAAM,WAAO;AACtB,MAAI,KAAK;AAAM,WAAO;AACtB,SAAO,EAAE,cAAc,CAAC;AAC1B;AAEO,SAAS,oBAAoB,GAAW,GAAW;AACxD,SAAO,IAAI;AACb;AAEO,SAAS,aAAa,OAAyC;AACpE,SAAO,UAAU,SAAS,UAAU;AACtC;AAEO,SAAS,iBACd,OAC2C;AAC3C,MAAI,OAAO,UAAU;AAAU,WAAO;AACtC,SAAO,MAAM,WAAW,WAAW;AACrC;AAEO,SAAS,kBACd,OACG;AACH,SAAO,MAAM,MAAM,YAAY,MAAM;AACvC;AAEO,SAAS,mBACd,QACiD;AACjD,QAAM,MAAuD,CAAC;AAE9D,QAAM,OAAO,OAAO,KAAK,MAAM;AAE/B,aAAW,SAAS,MAAM;AACxB,QAAI,CAAC,iBAAiB,KAAK;AAAG;AAE9B,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,CAAC,aAAa,KAAK;AAAG;AAE1B,UAAM,iBAAiB,kBAAkB,KAAK;AAE9C,QAAI,KAAK;AAAA,MACP,KAAK;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,qBACd,cACA,OAC4B;AAC5B,MAAI,CAAC,MAAM,QAAQ,KAAK;AAAG,WAAO;AAClC,QAAM,gBAAgB;AAEtB,QAAM,IAAI,IAAI,IAAU,YAAY;AAEpC,aAAW,UAAU,eAAe;AAClC,QAAI,CAAC;AAAQ,aAAO;AACpB,QAAI,CAAC,EAAE,IAAI,OAAO,GAAG;AAAG,aAAO;AAC/B,QAAI,OAAO,UAAU,UAAU,OAAO,UAAU;AAAO,aAAO;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,cACd,eACwB;AACxB,QAAM,MAA8B,uBAAO,OAAO,IAAI;AACtD,aAAW,EAAE,KAAK,MAAM,KAAK,eAAe;AAC1C,QAAI,WAAW,IAAI,SAAS,CAAC,EAAE,IAAI;AAAA,EACrC;AACA,SAAO;AACT;","names":["orderBy"]}