{"version":3,"file":"sort-query.mjs","sources":["../src/sort-query.ts"],"sourcesContent":["import _ from 'lodash';\n\nexport type SortOrder = 'asc' | 'desc';\n\nexport interface SortParamsObject {\n  [key: string]: SortOrder | SortParamsObject;\n}\n\nexport type SortParams = string | string[] | SortParamsObject | SortParamsObject[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\n/**\n * Splits a REST sort string into trimmed segments with a non-empty field (drops '', ',', trailing commas).\n */\nexport function getMeaningfulSortSegments(sort: string): string[] {\n  return sort\n    .split(',')\n    .map((segment) => segment.trim())\n    .filter((segment) => {\n      if (segment.length === 0) {\n        return false;\n      }\n\n      const [field] = segment.split(':');\n      return field.trim().length > 0;\n    });\n}\n\n/**\n * Whether a nested sort object ({ field: 'asc' } or { relation: { name: 'desc' } }) specifies\n * at least one field to sort on. Empty objects and keys with blank orders are treated as no sort.\n */\nfunction hasMeaningfulSortObject(sort: SortParamsObject): boolean {\n  return Object.keys(sort).some((key) => {\n    const order = sort[key];\n\n    if (typeof order === 'string') {\n      return order.length > 0;\n    }\n\n    if (isPlainObject(order)) {\n      return hasMeaningfulSortObject(order as SortParamsObject);\n    }\n\n    return false;\n  });\n}\n\n/** Whether a REST-style sort string contains at least one meaningful segment. */\nfunction hasMeaningfulStringSort(sort: string): boolean {\n  return getMeaningfulSortSegments(sort).length > 0;\n}\n\n/**\n * Whether `sort` carries a real ordering instruction. Empty or absent sort must stay undefined so\n * populated relations keep join-table connect order (GraphQL defaults nested sort to []; REST qs\n * `sort[]` with strictNullHandling parses to `[null]`).\n */\nexport function hasSort(sort?: unknown): sort is SortParams {\n  if (sort === undefined || sort === null) {\n    return false;\n  }\n\n  if (typeof sort === 'string') {\n    return hasMeaningfulStringSort(sort);\n  }\n\n  if (Array.isArray(sort)) {\n    if (sort.length === 0) {\n      return false;\n    }\n\n    return sort.some((item) => {\n      if (typeof item === 'string') {\n        return hasMeaningfulStringSort(item);\n      }\n\n      if (isPlainObject(item)) {\n        return hasMeaningfulSortObject(item as SortParamsObject);\n      }\n\n      return false;\n    });\n  }\n\n  if (isPlainObject(sort)) {\n    return hasMeaningfulSortObject(sort as SortParamsObject);\n  }\n\n  return false;\n}\n"],"names":["isPlainObject","value","_","getMeaningfulSortSegments","sort","split","map","segment","trim","filter","length","field","hasMeaningfulSortObject","Object","keys","some","key","order","hasMeaningfulStringSort","hasSort","undefined","Array","isArray","item"],"mappings":";;AAUA,MAAMA,aAAAA,GAAgB,CAACC,KAAAA,GAAqDC,UAAAA,CAAEF,aAAa,CAACC,KAAAA,CAAAA;AAE5F;;IAGO,SAASE,yBAAAA,CAA0BC,IAAY,EAAA;AACpD,IAAA,OAAOA,IAAAA,CACJC,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,OAAAA,GAAYA,OAAAA,CAAQC,IAAI,EAAA,CAAA,CAC7BC,MAAM,CAAC,CAACF,OAAAA,GAAAA;QACP,IAAIA,OAAAA,CAAQG,MAAM,KAAK,CAAA,EAAG;YACxB,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,MAAM,CAACC,KAAAA,CAAM,GAAGJ,OAAAA,CAAQF,KAAK,CAAC,GAAA,CAAA;AAC9B,QAAA,OAAOM,KAAAA,CAAMH,IAAI,EAAA,CAAGE,MAAM,GAAG,CAAA;AAC/B,IAAA,CAAA,CAAA;AACJ;AAEA;;;IAIA,SAASE,wBAAwBR,IAAsB,EAAA;AACrD,IAAA,OAAOS,OAAOC,IAAI,CAACV,IAAAA,CAAAA,CAAMW,IAAI,CAAC,CAACC,GAAAA,GAAAA;QAC7B,MAAMC,KAAAA,GAAQb,IAAI,CAACY,GAAAA,CAAI;QAEvB,IAAI,OAAOC,UAAU,QAAA,EAAU;YAC7B,OAAOA,KAAAA,CAAMP,MAAM,GAAG,CAAA;AACxB,QAAA;AAEA,QAAA,IAAIV,cAAciB,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAOL,uBAAAA,CAAwBK,KAAAA,CAAAA;AACjC,QAAA;QAEA,OAAO,KAAA;AACT,IAAA,CAAA,CAAA;AACF;AAEA,kFACA,SAASC,uBAAAA,CAAwBd,IAAY,EAAA;IAC3C,OAAOD,yBAAAA,CAA0BC,IAAAA,CAAAA,CAAMM,MAAM,GAAG,CAAA;AAClD;AAEA;;;;IAKO,SAASS,OAAAA,CAAQf,IAAc,EAAA;IACpC,IAAIA,IAAAA,KAASgB,SAAAA,IAAahB,IAAAA,KAAS,IAAA,EAAM;QACvC,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,QAAA,OAAOc,uBAAAA,CAAwBd,IAAAA,CAAAA;AACjC,IAAA;IAEA,IAAIiB,KAAAA,CAAMC,OAAO,CAAClB,IAAAA,CAAAA,EAAO;QACvB,IAAIA,IAAAA,CAAKM,MAAM,KAAK,CAAA,EAAG;YACrB,OAAO,KAAA;AACT,QAAA;QAEA,OAAON,IAAAA,CAAKW,IAAI,CAAC,CAACQ,IAAAA,GAAAA;YAChB,IAAI,OAAOA,SAAS,QAAA,EAAU;AAC5B,gBAAA,OAAOL,uBAAAA,CAAwBK,IAAAA,CAAAA;AACjC,YAAA;AAEA,YAAA,IAAIvB,cAAcuB,IAAAA,CAAAA,EAAO;AACvB,gBAAA,OAAOX,uBAAAA,CAAwBW,IAAAA,CAAAA;AACjC,YAAA;YAEA,OAAO,KAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,IAAIvB,cAAcI,IAAAA,CAAAA,EAAO;AACvB,QAAA,OAAOQ,uBAAAA,CAAwBR,IAAAA,CAAAA;AACjC,IAAA;IAEA,OAAO,KAAA;AACT;;;;"}