{"version":3,"file":"query-sort.mjs","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n  curry,\n  isString,\n  isObject,\n  map,\n  trim,\n  split,\n  isEmpty,\n  flatten,\n  pipe,\n  isNil,\n  first,\n  cloneDeep,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n  Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n  Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n  isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst sort = traverseFactory()\n  .intercept(\n    // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n    isNestedSorts,\n    async (visitor, options, sort, { recurse }) => {\n      return Promise.all(\n        sort\n          .split(',')\n          .map(trim)\n          .map((nestedSort) => recurse(visitor, options, nestedSort))\n      ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n    }\n  )\n  .intercept(\n    // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n    isStringArray,\n    async (visitor, options, sort, { recurse }) => {\n      return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n        (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n      );\n    }\n  )\n  .intercept(\n    // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n    isObjectArray,\n    async (visitor, options, sort, { recurse }) => {\n      return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n        (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n      );\n    }\n  )\n  // Parse string values\n  .parse(isString, () => {\n    const tokenize = pipe(split('.'), map(split(':')), flatten);\n    const recompose = (parts: string[]) => {\n      if (parts.length === 0) {\n        return undefined;\n      }\n\n      return parts.reduce((acc, part) => {\n        if (isEmpty(part)) {\n          return acc;\n        }\n\n        if (acc === '') {\n          return part;\n        }\n\n        return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n      }, '');\n    };\n\n    return {\n      transform: trim,\n\n      remove(key, data) {\n        const [root] = tokenize(data);\n\n        return root === key ? undefined : data;\n      },\n\n      set(key, value, data) {\n        const [root] = tokenize(data);\n\n        if (root !== key) {\n          return data;\n        }\n\n        return isNil(value) ? root : `${root}.${value}`;\n      },\n\n      keys(data) {\n        const v = first(tokenize(data));\n        return v ? [v] : [];\n      },\n\n      get(key, data) {\n        const [root, ...rest] = tokenize(data);\n\n        return key === root ? recompose(rest) : undefined;\n      },\n    };\n  })\n  // Parse object values\n  .parse(isObj, () => ({\n    transform: cloneDeep,\n\n    remove(key, data) {\n      // eslint-disable-next-line no-unused-vars\n      const { [key]: ignored, ...rest } = data;\n\n      return rest;\n    },\n\n    set(key, value, data) {\n      return { ...data, [key]: value };\n    },\n\n    keys(data) {\n      return Object.keys(data);\n    },\n\n    get(key, data) {\n      return data[key];\n    },\n  }))\n  // Handle deep sort on relation\n  .onRelation(\n    async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse }) => {\n      const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n      if (isMorphRelation) {\n        return;\n      }\n\n      const parent: Parent = { key, path, schema, attribute };\n\n      const targetSchemaUID = attribute.target;\n      const targetSchema = getModel(targetSchemaUID!);\n\n      const newValue = await recurse(\n        visitor,\n        { schema: targetSchema, path, getModel, parent },\n        value\n      );\n\n      set(key, newValue);\n    }\n  )\n  // Handle deep sort on media\n  .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n    const parent: Parent = { key, path, schema, attribute };\n\n    const targetSchemaUID = 'plugin::upload.file';\n    const targetSchema = getModel(targetSchemaUID);\n\n    const newValue = await recurse(\n      visitor,\n      { schema: targetSchema, path, getModel, parent },\n      value\n    );\n\n    set(key, newValue);\n  })\n  // Handle deep sort on components\n  .onComponent(\n    async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n      const parent: Parent = { key, path, schema, attribute };\n\n      const targetSchema = getModel(attribute.component);\n\n      const newValue = await recurse(\n        visitor,\n        { schema: targetSchema, path, getModel, parent },\n        value\n      );\n\n      set(key, newValue);\n    }\n  );\n\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","sort","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","pipe","flatten","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","isNil","keys","v","first","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}