{"version":3,"file":"populate-builder.mjs","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { isNil, merge } from 'lodash/fp';\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n  let getInitialPopulate = async (): Promise<undefined | Populate> => {\n    return undefined;\n  };\n  const deepPopulateOptions = {\n    countMany: false,\n    countOne: false,\n    maxLevel: -1,\n  };\n\n  const builder = {\n    /**\n     * Populates all attribute fields present in a query.\n     * @param query - Strapi query object\n     */\n    populateFromQuery(query: object) {\n      getInitialPopulate = async () => getQueryPopulate(uid, query);\n      return builder;\n    },\n\n    /**\n     * Populate relations as count.\n     * @param [options]\n     * @param [options.toMany] - Populate XtoMany relations as count if true.\n     * @param [options.toOne] - Populate XtoOne relations as count if true.\n     */\n    countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n      if (!isNil(toMany)) {\n        deepPopulateOptions.countMany = toMany;\n      }\n      if (!isNil(toOne)) {\n        deepPopulateOptions.countOne = toOne;\n      }\n      return builder;\n    },\n\n    /**\n     * Populate relations deeply, up to a certain level.\n     * @param [level=Infinity] - Max level of nested populate.\n     */\n    populateDeep(level = Infinity) {\n      deepPopulateOptions.maxLevel = level;\n      return builder;\n    },\n\n    /**\n     * Override the populate for specific attributes, taking precedence over\n     * query-derived or deep populate defaults.\n     *\n     * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n     */\n    withPopulateOverride(overrides: Record<string, any>) {\n      const prev = getInitialPopulate;\n      // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n      getInitialPopulate = async () => merge((await prev()) || {}, overrides);\n      return builder;\n    },\n\n    /**\n     * Construct the populate object based on the builder options.\n     * @returns Populate object\n     */\n    async build() {\n      const initialPopulate = await getInitialPopulate();\n\n      if (deepPopulateOptions.maxLevel === -1) {\n        return initialPopulate;\n      }\n\n      return getDeepPopulate(uid, { ...deepPopulateOptions, initialPopulate });\n    },\n  };\n\n  return builder;\n};\n\nexport default () => populateBuilder;\n"],"names":["populateBuilder","uid","getInitialPopulate","undefined","deepPopulateOptions","countMany","countOne","maxLevel","builder","populateFromQuery","query","getQueryPopulate","countRelations","toMany","toOne","isNil","populateDeep","level","Infinity","withPopulateOverride","overrides","prev","merge","build","initialPopulate","getDeepPopulate"],"mappings":";;;AAIA;;;;;;;;;IAUA,MAAMA,oBAAkB,CAACC,GAAAA,GAAAA;AACvB,IAAA,IAAIC,kBAAAA,GAAqB,UAAA;QACvB,OAAOC,SAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMC,mBAAAA,GAAsB;QAC1BC,SAAAA,EAAW,KAAA;QACXC,QAAAA,EAAU,KAAA;AACVC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU;AACd;;;AAGC,QACDC,mBAAkBC,KAAa,EAAA;YAC7BR,kBAAAA,GAAqB,UAAYS,iBAAiBV,GAAAA,EAAKS,KAAAA,CAAAA;YACvD,OAAOF,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDI,gBAAe,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAG;YAAED,MAAAA,EAAQ,IAAA;YAAMC,KAAAA,EAAO;SAAM,EAAA;YAC9D,IAAI,CAACC,MAAMF,MAAAA,CAAAA,EAAS;AAClBT,gBAAAA,mBAAAA,CAAoBC,SAAS,GAAGQ,MAAAA;AAClC,YAAA;YACA,IAAI,CAACE,MAAMD,KAAAA,CAAAA,EAAQ;AACjBV,gBAAAA,mBAAAA,CAAoBE,QAAQ,GAAGQ,KAAAA;AACjC,YAAA;YACA,OAAON,OAAAA;AACT,QAAA,CAAA;AAEA;;;QAIAQ,YAAAA,CAAAA,CAAaC,QAAQC,QAAQ,EAAA;AAC3Bd,YAAAA,mBAAAA,CAAoBG,QAAQ,GAAGU,KAAAA;YAC/B,OAAOT,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDW,sBAAqBC,SAA8B,EAAA;AACjD,YAAA,MAAMC,IAAAA,GAAOnB,kBAAAA;;AAEbA,YAAAA,kBAAAA,GAAqB,UAAYoB,KAAAA,CAAO,MAAMD,IAAAA,EAAAA,IAAW,EAAC,EAAGD,SAAAA,CAAAA;YAC7D,OAAOZ,OAAAA;AACT,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMe,KAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,kBAAkB,MAAMtB,kBAAAA,EAAAA;AAE9B,YAAA,IAAIE,mBAAAA,CAAoBG,QAAQ,KAAK,EAAC,EAAG;gBACvC,OAAOiB,eAAAA;AACT,YAAA;AAEA,YAAA,OAAOC,gBAAgBxB,GAAAA,EAAK;AAAE,gBAAA,GAAGG,mBAAmB;AAAEoB,gBAAAA;AAAgB,aAAA,CAAA;AACxE,QAAA;AACF,KAAA;IAEA,OAAOhB,OAAAA;AACT,CAAA;AAEA,sBAAe,CAAA,IAAMR,iBAAc;;;;"}