{"version":3,"file":"process.mjs","sources":["../../../../src/query/helpers/populate/process.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport * as types from '../../../utils/types';\nimport type { Meta } from '../../../metadata';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\n\nconst getRootLevelPopulate = (meta: Meta) => {\n const populate: PopulateMap = {};\n\n for (const attributeName of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[attributeName];\n if (attribute.type === 'relation') {\n populate[attributeName] = true;\n }\n }\n\n return populate;\n};\n\ntype Context = {\n qb: QueryBuilder;\n db: Database;\n uid: string;\n};\n\ntype PopulateMap = {\n [key: string]:\n | true\n | {\n populate?: PopulateMap | true | string[];\n };\n};\n\n/**\n * Converts and prepares the query for populate\n *\n * @param {boolean|string[]|object} populate populate param\n * @param {object} ctx query context\n * @param {object} ctx.db database instance\n * @param {object} ctx.qb query builder instance\n * @param {string} ctx.uid model uid\n */\nconst processPopulate = (populate: unknown, ctx: Context) => {\n const { qb, db, uid } = ctx;\n const meta = db.metadata.get(uid);\n\n let populateMap: PopulateMap = {};\n\n if (populate === false || _.isNil(populate)) {\n return null;\n }\n\n if (populate === true) {\n populateMap = getRootLevelPopulate(meta);\n } else if (Array.isArray(populate)) {\n for (const key of populate) {\n const [root, ...rest] = key.split('.');\n\n if (rest.length > 0) {\n const subPopulate = rest.join('.');\n if (populateMap[root]) {\n const populateValue = populateMap[root];\n\n if (populateValue === true) {\n populateMap[root] = {\n populate: [subPopulate],\n };\n } else {\n populateValue.populate = [subPopulate].concat(populateValue.populate ?? []);\n }\n } else {\n populateMap[root] = {\n populate: [subPopulate],\n };\n }\n } else {\n populateMap[root] = populateMap[root] ? populateMap[root] : true;\n }\n }\n } else {\n populateMap = populate as PopulateMap;\n }\n\n if (!_.isPlainObject(populateMap)) {\n throw new Error('Populate must be an object');\n }\n\n const finalPopulate: PopulateMap = {};\n for (const key of Object.keys(populateMap)) {\n const attribute = meta.attributes[key];\n\n if (!attribute) {\n continue;\n }\n\n if (!types.isRelation(attribute.type)) {\n continue;\n }\n\n // Make sure to query the join column value if needed,\n // so that we can apply the populate later on\n if ('joinColumn' in attribute && attribute.joinColumn) {\n qb.addSelect(attribute.joinColumn.name);\n }\n\n // Make sure id is present for future populate queries\n if (_.has('id', meta.attributes)) {\n qb.addSelect('id');\n }\n\n finalPopulate[key] = populateMap[key];\n }\n\n return finalPopulate;\n};\n\nexport default processPopulate;\n"],"names":["getRootLevelPopulate","meta","populate","attributeName","Object","keys","attributes","attribute","type","processPopulate","ctx","qb","db","uid","metadata","get","populateMap","_","isNil","Array","isArray","key","root","rest","split","length","subPopulate","join","populateValue","concat","isPlainObject","Error","finalPopulate","types","joinColumn","addSelect","name","has"],"mappings":"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"}