@strapi/database 5.47.0 → 5.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/entity-manager/index.d.ts.map +1 -1
  2. package/dist/entity-manager/index.js +9 -3
  3. package/dist/entity-manager/index.js.map +1 -1
  4. package/dist/entity-manager/index.mjs +9 -3
  5. package/dist/entity-manager/index.mjs.map +1 -1
  6. package/dist/fields/biginteger.d.ts +4 -2
  7. package/dist/fields/biginteger.d.ts.map +1 -1
  8. package/dist/fields/biginteger.js +41 -2
  9. package/dist/fields/biginteger.js.map +1 -1
  10. package/dist/fields/biginteger.mjs +41 -2
  11. package/dist/fields/biginteger.mjs.map +1 -1
  12. package/dist/fields/number.d.ts +1 -1
  13. package/dist/fields/number.d.ts.map +1 -1
  14. package/dist/fields/number.js +20 -4
  15. package/dist/fields/number.js.map +1 -1
  16. package/dist/fields/number.mjs +20 -4
  17. package/dist/fields/number.mjs.map +1 -1
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/migrations/internal.d.ts.map +1 -1
  23. package/dist/migrations/internal.js +39 -32
  24. package/dist/migrations/internal.js.map +1 -1
  25. package/dist/migrations/internal.mjs +39 -32
  26. package/dist/migrations/internal.mjs.map +1 -1
  27. package/dist/migrations/users.d.ts.map +1 -1
  28. package/dist/migrations/users.js +40 -33
  29. package/dist/migrations/users.js.map +1 -1
  30. package/dist/migrations/users.mjs +40 -33
  31. package/dist/migrations/users.mjs.map +1 -1
  32. package/dist/query/helpers/populate/apply.js +1 -1
  33. package/dist/query/helpers/populate/apply.js.map +1 -1
  34. package/dist/query/helpers/populate/apply.mjs +1 -1
  35. package/dist/query/helpers/populate/apply.mjs.map +1 -1
  36. package/dist/transaction-context.d.ts.map +1 -1
  37. package/dist/transaction-context.js +22 -0
  38. package/dist/transaction-context.js.map +1 -1
  39. package/dist/transaction-context.mjs +22 -0
  40. package/dist/transaction-context.mjs.map +1 -1
  41. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"apply.mjs","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport { fromRow } from '../transform';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\nimport type { Meta } from '../../../metadata';\nimport { ID, RelationalAttribute, Relation } from '../../../types';\n\n// We must select the join column id, however whatever it is named will overwrite an attribute of the same name\n// Therefore, we will prefix with something unlikely to conflict with a user attribute\n// TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future\nconst joinColPrefix = '__strapi' as const;\n\n/**\n * Join-table `order` preserves connect order when no explicit populate sort is set.\n * When `populateValue.orderBy` is present, join-table ordering must not take precedence\n * over the target attribute sort (see query-builder join vs root orderBy ordering).\n */\nconst getJoinTableOrderBy = (\n populateValue: Record<string, unknown>,\n joinTable: { orderBy?: Record<string, 'asc' | 'desc'> }\n) => {\n if (populateValue.orderBy || !joinTable.orderBy) {\n return undefined;\n }\n\n return _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy);\n};\n\ntype Context = {\n db: Database;\n qb: QueryBuilder;\n uid: string;\n};\n\ntype Input<TRelationAttribute extends RelationalAttribute = RelationalAttribute> = {\n attribute: TRelationAttribute;\n attributeName: string;\n results: Row[];\n populateValue: {\n on?: Record<string, Record<string, unknown>>;\n } & Record<string, unknown>;\n\n isCount: boolean;\n};\n\ntype InputWithTarget<TRelationAttribute extends RelationalAttribute = RelationalAttribute> =\n Input<TRelationAttribute> & {\n targetMeta: Meta;\n };\n\ntype MorphIdMap = Record<string, Record<ID, Row[]>>;\n\ntype Row = Record<string, unknown>;\n\n/**\n * Populate oneToOne and manyToOne relation\n * @param {*} input\n * @param {*} ctx\n * @returns\n */\nconst XtoOne = async (\n input: InputWithTarget<Relation.OneToOne | Relation.ManyToOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({ [referencedColumnName]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row[]>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName] as string]));\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName] as string]));\n });\n }\n};\n\nconst oneToMany = async (input: InputWithTarget<Relation.OneToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const {\n name: joinColumnName,\n referencedColumn: referencedColumnName,\n on,\n } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({\n [referencedColumnName]: referencedValues,\n ...(on && typeof on === 'function' ? on({ populateValue, results }) : {}),\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string] || []);\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColSelect, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColRenameAs]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((r) => {\n r[attributeName] = fromTargetRow(map[r[referencedColumnName] as string] || []);\n });\n }\n};\n\nconst manyToMany = async (input: InputWithTarget<Relation.ManyToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { joinTable } = attribute;\n\n const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = populateQb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, populateQb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string] || []);\n });\n};\n\nconst morphX = async (\n input: InputWithTarget<Relation.MorphMany | Relation.MorphOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta } = input;\n const { db, uid } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { target, morphBy } = attribute;\n\n const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(target)\n .init(populateValue)\n // .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.name]: referencedValues, [typeColumn.name]: uid })\n .execute<Row>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {\n const { joinTable } = targetAttribute;\n\n const { joinColumn, morphColumn } = joinTable;\n\n const { idColumn, typeColumn } = morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? null : [];\n });\n\n return;\n }\n\n // find with join table\n const qb = db.entityManager.createQueryBuilder(target);\n\n const alias = qb.getAlias();\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinColumn.name,\n rootColumn: joinColumn.referencedColumn,\n rootTable: qb.alias,\n on: {\n ...(joinTable.on || {}),\n field: attributeName,\n },\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect([`${alias}.${idColumn.name}`, `${alias}.${typeColumn.name}`])\n .where({\n [`${alias}.${idColumn.name}`]: referencedValues,\n [`${alias}.${typeColumn.name}`]: uid,\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n }\n};\n\nconst morphToMany = async (input: Input<Relation.MorphToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n // find with join table\n const { joinTable } = attribute;\n\n const { joinColumn, morphColumn } = joinTable;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // fetch join table to create the ids map then do the same as morphToOne without the first\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRows = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n // If the populateValue contains an \"on\" property,\n // only populate the types defined in it\n ...('on' in populateValue\n ? { [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {}) }\n : {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n const idsByType = joinRows.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!_.has(typeValue, acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n await Promise.all(\n Object.keys(idsByType).map(async (type) => {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n })\n );\n\n results.forEach((result) => {\n const joinResults = joinMap[result[joinColumn.referencedColumn] as string] || [];\n\n const matchingRows = joinResults.flatMap((joinResult) => {\n const id = joinResult[idColumn.name] as ID;\n const type = joinResult[typeColumn.name] as string;\n\n const targetMeta = db.metadata.get(type);\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n return (map[type][id] || []).map((row) => {\n // Spread target first so a same-named user attribute cannot override the morph type UID\n return { ...fromTargetRow(row), [typeField]: type };\n });\n });\n\n result[attributeName] = matchingRows;\n });\n};\n\nconst morphToOne = async (input: Input<Relation.MorphToOne>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n const { morphColumn } = attribute;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // make a map for each type what ids to return\n // make a nested map per id\n\n const idsByType = results.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!(typeValue in acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n if (!type || !id) {\n result[attributeName] = null;\n return;\n }\n\n const matchingRows = map[type][id];\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) =>\n fromRow(db.metadata.get(type), rowOrRows);\n\n const row = fromTargetRow(_.first(matchingRows));\n // Spread target first so a same-named user attribute cannot override the morph type UID\n result[attributeName] = row ? { ...row, [typeField]: type } : row;\n });\n};\n\n// TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries\nconst pickPopulateParams = (populate: Record<string, unknown>) => {\n const fieldsToPick = [\n 'select',\n 'count',\n 'where',\n 'populate',\n 'orderBy',\n 'filters',\n 'ordering',\n 'on',\n ];\n\n if (populate.count !== true) {\n fieldsToPick.push('limit', 'offset');\n }\n\n return _.pick(fieldsToPick, populate);\n};\n\nconst getPopulateValue = (populate: Record<string, any>, filters: Record<string, any>) => {\n const populateValue = {\n filters,\n ...pickPopulateParams(populate),\n };\n\n if ('on' in populateValue) {\n populateValue.on = _.mapValues(\n (value) => {\n if (_.isPlainObject(value)) {\n value.filters = filters;\n }\n\n return value;\n },\n populateValue.on as Record<string, any>\n );\n }\n\n return populateValue;\n};\n\nconst applyPopulate = async (results: Row[], populate: Record<string, any>, ctx: Context) => {\n const { db, uid, qb } = ctx;\n const meta = db.metadata.get(uid);\n\n if (_.isEmpty(results)) {\n return results;\n }\n\n const populateAttribute = async (attributeName: string) => {\n const attribute = meta.attributes[attributeName];\n\n if (attribute.type !== 'relation') {\n throw new Error(`Invalid populate attribute ${attributeName}`);\n }\n\n const populateValue = getPopulateValue(populate[attributeName], qb.state.filters);\n\n const isCount = 'count' in populateValue && populateValue.count === true;\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'manyToOne': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await XtoOne(input, ctx);\n break;\n }\n case 'oneToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await oneToMany(input, ctx);\n break;\n }\n case 'manyToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await manyToMany(input, ctx);\n break;\n }\n case 'morphOne':\n case 'morphMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await morphX(input, ctx);\n break;\n }\n case 'morphToMany': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToMany(input, ctx);\n break;\n }\n case 'morphToOne': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToOne(input, ctx);\n break;\n }\n default: {\n break;\n }\n }\n };\n\n await Promise.all(Object.keys(populate).map(populateAttribute));\n};\n\nexport default applyPopulate;\n"],"names":["joinColPrefix","getJoinTableOrderBy","populateValue","joinTable","orderBy","undefined","_","mapValues","v","ordering","XtoOne","input","ctx","attribute","attributeName","results","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","uniq","map","r","filter","value","isNil","isEmpty","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","first","getAlias","joinColAlias","joinColRenameAs","joinColSelect","count","join","referencedTable","inverseJoinColumn","rootColumn","rootTable","on","select","raw","reduce","row","Number","oneToMany","manyToMany","populateQb","morphX","target","morphBy","targetAttribute","metadata","get","attributes","type","relation","idColumn","typeColumn","morphColumn","matchingRows","matchingValue","field","morphToMany","typeField","joinRows","Object","keys","joinMap","idsByType","acc","idValue","typeValue","has","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","pickPopulateParams","populate","fieldsToPick","pick","getPopulateValue","filters","isPlainObject","applyPopulate","meta","populateAttribute","Error","state"],"mappings":"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"}
1
+ {"version":3,"file":"apply.mjs","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport { fromRow } from '../transform';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\nimport type { Meta } from '../../../metadata';\nimport { ID, RelationalAttribute, Relation } from '../../../types';\n\n// We must select the join column id, however whatever it is named will overwrite an attribute of the same name\n// Therefore, we will prefix with something unlikely to conflict with a user attribute\n// TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future\nconst joinColPrefix = '__strapi' as const;\n\n/**\n * Join-table `order` preserves connect order when no explicit populate sort is set.\n * When `populateValue.orderBy` is present, join-table ordering must not take precedence\n * over the target attribute sort (see query-builder join vs root orderBy ordering).\n */\nconst getJoinTableOrderBy = (\n populateValue: Record<string, unknown>,\n joinTable: { orderBy?: Record<string, 'asc' | 'desc'> }\n) => {\n if (!_.isEmpty(populateValue.orderBy) || !joinTable.orderBy) {\n return undefined;\n }\n\n return _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy);\n};\n\ntype Context = {\n db: Database;\n qb: QueryBuilder;\n uid: string;\n};\n\ntype Input<TRelationAttribute extends RelationalAttribute = RelationalAttribute> = {\n attribute: TRelationAttribute;\n attributeName: string;\n results: Row[];\n populateValue: {\n on?: Record<string, Record<string, unknown>>;\n } & Record<string, unknown>;\n\n isCount: boolean;\n};\n\ntype InputWithTarget<TRelationAttribute extends RelationalAttribute = RelationalAttribute> =\n Input<TRelationAttribute> & {\n targetMeta: Meta;\n };\n\ntype MorphIdMap = Record<string, Record<ID, Row[]>>;\n\ntype Row = Record<string, unknown>;\n\n/**\n * Populate oneToOne and manyToOne relation\n * @param {*} input\n * @param {*} ctx\n * @returns\n */\nconst XtoOne = async (\n input: InputWithTarget<Relation.OneToOne | Relation.ManyToOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({ [referencedColumnName]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row[]>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName] as string]));\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName] as string]));\n });\n }\n};\n\nconst oneToMany = async (input: InputWithTarget<Relation.OneToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const {\n name: joinColumnName,\n referencedColumn: referencedColumnName,\n on,\n } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({\n [referencedColumnName]: referencedValues,\n ...(on && typeof on === 'function' ? on({ populateValue, results }) : {}),\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string] || []);\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColSelect, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColRenameAs]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((r) => {\n r[attributeName] = fromTargetRow(map[r[referencedColumnName] as string] || []);\n });\n }\n};\n\nconst manyToMany = async (input: InputWithTarget<Relation.ManyToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { joinTable } = attribute;\n\n const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = populateQb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, populateQb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string] || []);\n });\n};\n\nconst morphX = async (\n input: InputWithTarget<Relation.MorphMany | Relation.MorphOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta } = input;\n const { db, uid } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { target, morphBy } = attribute;\n\n const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(target)\n .init(populateValue)\n // .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.name]: referencedValues, [typeColumn.name]: uid })\n .execute<Row>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {\n const { joinTable } = targetAttribute;\n\n const { joinColumn, morphColumn } = joinTable;\n\n const { idColumn, typeColumn } = morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? null : [];\n });\n\n return;\n }\n\n // find with join table\n const qb = db.entityManager.createQueryBuilder(target);\n\n const alias = qb.getAlias();\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinColumn.name,\n rootColumn: joinColumn.referencedColumn,\n rootTable: qb.alias,\n on: {\n ...(joinTable.on || {}),\n field: attributeName,\n },\n orderBy: getJoinTableOrderBy(populateValue, joinTable),\n })\n .addSelect([`${alias}.${idColumn.name}`, `${alias}.${typeColumn.name}`])\n .where({\n [`${alias}.${idColumn.name}`]: referencedValues,\n [`${alias}.${typeColumn.name}`]: uid,\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n }\n};\n\nconst morphToMany = async (input: Input<Relation.MorphToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n // find with join table\n const { joinTable } = attribute;\n\n const { joinColumn, morphColumn } = joinTable;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // fetch join table to create the ids map then do the same as morphToOne without the first\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRows = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n // If the populateValue contains an \"on\" property,\n // only populate the types defined in it\n ...('on' in populateValue\n ? { [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {}) }\n : {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n const idsByType = joinRows.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!_.has(typeValue, acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n await Promise.all(\n Object.keys(idsByType).map(async (type) => {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n })\n );\n\n results.forEach((result) => {\n const joinResults = joinMap[result[joinColumn.referencedColumn] as string] || [];\n\n const matchingRows = joinResults.flatMap((joinResult) => {\n const id = joinResult[idColumn.name] as ID;\n const type = joinResult[typeColumn.name] as string;\n\n const targetMeta = db.metadata.get(type);\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n return (map[type][id] || []).map((row) => {\n // Spread target first so a same-named user attribute cannot override the morph type UID\n return { ...fromTargetRow(row), [typeField]: type };\n });\n });\n\n result[attributeName] = matchingRows;\n });\n};\n\nconst morphToOne = async (input: Input<Relation.MorphToOne>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n const { morphColumn } = attribute;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // make a map for each type what ids to return\n // make a nested map per id\n\n const idsByType = results.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!(typeValue in acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n if (!type || !id) {\n result[attributeName] = null;\n return;\n }\n\n const matchingRows = map[type][id];\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) =>\n fromRow(db.metadata.get(type), rowOrRows);\n\n const row = fromTargetRow(_.first(matchingRows));\n // Spread target first so a same-named user attribute cannot override the morph type UID\n result[attributeName] = row ? { ...row, [typeField]: type } : row;\n });\n};\n\n// TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries\nconst pickPopulateParams = (populate: Record<string, unknown>) => {\n const fieldsToPick = [\n 'select',\n 'count',\n 'where',\n 'populate',\n 'orderBy',\n 'filters',\n 'ordering',\n 'on',\n ];\n\n if (populate.count !== true) {\n fieldsToPick.push('limit', 'offset');\n }\n\n return _.pick(fieldsToPick, populate);\n};\n\nconst getPopulateValue = (populate: Record<string, any>, filters: Record<string, any>) => {\n const populateValue = {\n filters,\n ...pickPopulateParams(populate),\n };\n\n if ('on' in populateValue) {\n populateValue.on = _.mapValues(\n (value) => {\n if (_.isPlainObject(value)) {\n value.filters = filters;\n }\n\n return value;\n },\n populateValue.on as Record<string, any>\n );\n }\n\n return populateValue;\n};\n\nconst applyPopulate = async (results: Row[], populate: Record<string, any>, ctx: Context) => {\n const { db, uid, qb } = ctx;\n const meta = db.metadata.get(uid);\n\n if (_.isEmpty(results)) {\n return results;\n }\n\n const populateAttribute = async (attributeName: string) => {\n const attribute = meta.attributes[attributeName];\n\n if (attribute.type !== 'relation') {\n throw new Error(`Invalid populate attribute ${attributeName}`);\n }\n\n const populateValue = getPopulateValue(populate[attributeName], qb.state.filters);\n\n const isCount = 'count' in populateValue && populateValue.count === true;\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'manyToOne': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await XtoOne(input, ctx);\n break;\n }\n case 'oneToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await oneToMany(input, ctx);\n break;\n }\n case 'manyToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await manyToMany(input, ctx);\n break;\n }\n case 'morphOne':\n case 'morphMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await morphX(input, ctx);\n break;\n }\n case 'morphToMany': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToMany(input, ctx);\n break;\n }\n case 'morphToOne': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToOne(input, ctx);\n break;\n }\n default: {\n break;\n }\n }\n };\n\n await Promise.all(Object.keys(populate).map(populateAttribute));\n};\n\nexport default applyPopulate;\n"],"names":["joinColPrefix","getJoinTableOrderBy","populateValue","joinTable","_","isEmpty","orderBy","undefined","mapValues","v","ordering","XtoOne","input","ctx","attribute","attributeName","results","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","uniq","map","r","filter","value","isNil","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","first","getAlias","joinColAlias","joinColRenameAs","joinColSelect","count","join","referencedTable","inverseJoinColumn","rootColumn","rootTable","on","select","raw","reduce","row","Number","oneToMany","manyToMany","populateQb","morphX","target","morphBy","targetAttribute","metadata","get","attributes","type","relation","idColumn","typeColumn","morphColumn","matchingRows","matchingValue","field","morphToMany","typeField","joinRows","Object","keys","joinMap","idsByType","acc","idValue","typeValue","has","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","pickPopulateParams","populate","fieldsToPick","pick","getPopulateValue","filters","isPlainObject","applyPopulate","meta","populateAttribute","Error","state"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../src/transaction-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC;CAC7B;AACD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,iBAAiB,EAAE,QAAQ,EAAE,CAAC;CAC/B;AAID,QAAA,MAAM,cAAc;yCACyB,KAAK,WAAW,MAAM,SAAS;;gBAkBxD,KAAK,WAAW;kBAoBd,KAAK,WAAW;iBAoBvB,QAAQ;mBAON,QAAQ;CAMxB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../src/transaction-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC;CAC7B;AACD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,iBAAiB,EAAE,QAAQ,EAAE,CAAC;CAC/B;AAID,QAAA,MAAM,cAAc;yCACyB,KAAK,WAAW,MAAM,SAAS;;gBAkBxD,KAAK,WAAW;kBA0Bd,KAAK,WAAW;iBA0BvB,QAAQ;mBAON,QAAQ;CAMxB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -2,6 +2,16 @@
2
2
 
3
3
  var node_async_hooks = require('node:async_hooks');
4
4
 
5
+ /**
6
+ * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via
7
+ * the callback object returned from `Database#transaction`, or after the
8
+ * container’s promise has settled in Knex), a second finalisation is invalid
9
+ * and can throw (e.g. "Transaction query already complete"). Knex exposes
10
+ * `isCompleted()` for this; optional for mocks that omit it.
11
+ */ const isTransactorComplete = (trx)=>{
12
+ const t = trx;
13
+ return typeof t.isCompleted === 'function' && t.isCompleted();
14
+ };
5
15
  const storage = new node_async_hooks.AsyncLocalStorage();
6
16
  const transactionCtx = {
7
17
  async run (trx, cb) {
@@ -19,6 +29,12 @@ const transactionCtx = {
19
29
  },
20
30
  async commit (trx) {
21
31
  const store = storage.getStore();
32
+ if (isTransactorComplete(trx)) {
33
+ if (store?.trx) {
34
+ store.trx = null;
35
+ }
36
+ return;
37
+ }
22
38
  // Clear transaction from store
23
39
  if (store?.trx) {
24
40
  store.trx = null;
@@ -34,6 +50,12 @@ const transactionCtx = {
34
50
  },
35
51
  async rollback (trx) {
36
52
  const store = storage.getStore();
53
+ if (isTransactorComplete(trx)) {
54
+ if (store?.trx) {
55
+ store.trx = null;
56
+ }
57
+ return;
58
+ }
37
59
  // Clear transaction from store
38
60
  if (store?.trx) {
39
61
  store.trx = null;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.js","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;;;AAgBA,MAAMA,UAAU,IAAIC,kCAAAA,EAAAA;AAEpB,MAAMC,cAAAA,GAAiB;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAAA,EAAiBF,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAAA,EAAmBH,KAAAA,EAAOG,qBAAqB;SACjD,EACAJ,EAAAA,CAAAA;AAEJ,IAAA,CAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAAA,EAAOF,GAAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAAA,EAAOE,eAAAA,CAAgBI,MAAAA,EAAQ;AAClC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACtCC,KAAAA,CAAME,eAAe,GAAG,EAAE;AAC5B,IAAA,CAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAAA,EAAOG,iBAAAA,CAAkBG,MAAAA,EAAQ;AACpC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACxCC,KAAAA,CAAMG,iBAAiB,GAAG,EAAE;AAC9B,IAAA,CAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAAA,EAAiB;YAC1BF,KAAAA,CAAME,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B,QAAA;AACF,IAAA,CAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAAA,EAAmB;YAC5BH,KAAAA,CAAMG,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"transaction-context.js","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\n/**\n * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via\n * the callback object returned from `Database#transaction`, or after the\n * container’s promise has settled in Knex), a second finalisation is invalid\n * and can throw (e.g. \"Transaction query already complete\"). Knex exposes\n * `isCompleted()` for this; optional for mocks that omit it.\n */\nconst isTransactorComplete = (trx: Knex.Transaction) => {\n const t = trx as Knex.Transaction & { isCompleted?: () => boolean };\n return typeof t.isCompleted === 'function' && t.isCompleted();\n};\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["isTransactorComplete","trx","t","isCompleted","storage","AsyncLocalStorage","transactionCtx","run","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":"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"}
@@ -1,5 +1,15 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
 
3
+ /**
4
+ * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via
5
+ * the callback object returned from `Database#transaction`, or after the
6
+ * container’s promise has settled in Knex), a second finalisation is invalid
7
+ * and can throw (e.g. "Transaction query already complete"). Knex exposes
8
+ * `isCompleted()` for this; optional for mocks that omit it.
9
+ */ const isTransactorComplete = (trx)=>{
10
+ const t = trx;
11
+ return typeof t.isCompleted === 'function' && t.isCompleted();
12
+ };
3
13
  const storage = new AsyncLocalStorage();
4
14
  const transactionCtx = {
5
15
  async run (trx, cb) {
@@ -17,6 +27,12 @@ const transactionCtx = {
17
27
  },
18
28
  async commit (trx) {
19
29
  const store = storage.getStore();
30
+ if (isTransactorComplete(trx)) {
31
+ if (store?.trx) {
32
+ store.trx = null;
33
+ }
34
+ return;
35
+ }
20
36
  // Clear transaction from store
21
37
  if (store?.trx) {
22
38
  store.trx = null;
@@ -32,6 +48,12 @@ const transactionCtx = {
32
48
  },
33
49
  async rollback (trx) {
34
50
  const store = storage.getStore();
51
+ if (isTransactorComplete(trx)) {
52
+ if (store?.trx) {
53
+ store.trx = null;
54
+ }
55
+ return;
56
+ }
35
57
  // Clear transaction from store
36
58
  if (store?.trx) {
37
59
  store.trx = null;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.mjs","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["storage","AsyncLocalStorage","transactionCtx","run","trx","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;AAgBA,MAAMA,UAAU,IAAIC,iBAAAA,EAAAA;AAEpB,MAAMC,cAAAA,GAAiB;IACrB,MAAMC,GAAAA,CAAAA,CAAgCC,GAAqB,EAAEC,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;QAC9B,OAAOP,OAAAA,CAAQG,GAAG,CAChB;AACEC,YAAAA,GAAAA;;YAEAI,eAAAA,EAAiBF,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAAA,EAAmBH,KAAAA,EAAOG,qBAAqB;SACjD,EACAJ,EAAAA,CAAAA;AAEJ,IAAA,CAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAAA,EAAOF,GAAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAMO,QAAOP,GAAqB,EAAA;QAChC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIO,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAAA,EAAOE,eAAAA,CAAgBI,MAAAA,EAAQ;AAClC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACtCC,KAAAA,CAAME,eAAe,GAAG,EAAE;AAC5B,IAAA,CAAA;AAEA,IAAA,MAAMM,UAASV,GAAqB,EAAA;QAClC,MAAME,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;;AAG9B,QAAA,IAAID,OAAOF,GAAAA,EAAK;AACdE,YAAAA,KAAAA,CAAMF,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIU,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAAA,EAAOG,iBAAAA,CAAkBG,MAAAA,EAAQ;AACpC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACxCC,KAAAA,CAAMG,iBAAiB,GAAG,EAAE;AAC9B,IAAA,CAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAAA,EAAiB;YAC1BF,KAAAA,CAAME,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B,QAAA;AACF,IAAA,CAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQN,QAAQO,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAAA,EAAmB;YAC5BH,KAAAA,CAAMG,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"transaction-context.mjs","sources":["../src/transaction-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { Knex } from 'knex';\n\n/**\n * After the user calls the Knex transactor’s `commit` or `rollback` (e.g. via\n * the callback object returned from `Database#transaction`, or after the\n * container’s promise has settled in Knex), a second finalisation is invalid\n * and can throw (e.g. \"Transaction query already complete\"). Knex exposes\n * `isCompleted()` for this; optional for mocks that omit it.\n */\nconst isTransactorComplete = (trx: Knex.Transaction) => {\n const t = trx as Knex.Transaction & { isCompleted?: () => boolean };\n return typeof t.isCompleted === 'function' && t.isCompleted();\n};\n\nexport type Callback = (...args: any[]) => Promise<any> | any;\n\nexport interface TransactionObject {\n commit: () => Promise<void>;\n rollback: () => Promise<void>;\n get: () => Knex.Transaction;\n}\nexport interface Store {\n trx: Knex.Transaction | null;\n commitCallbacks: Callback[];\n rollbackCallbacks: Callback[];\n}\n\nconst storage = new AsyncLocalStorage<Store>();\n\nconst transactionCtx = {\n async run<TCallback extends Callback>(trx: Knex.Transaction, cb: TCallback) {\n const store = storage.getStore();\n return storage.run<ReturnType<TCallback>, void[]>(\n {\n trx,\n // Fill with existing callbacks if nesting transactions\n commitCallbacks: store?.commitCallbacks || [],\n rollbackCallbacks: store?.rollbackCallbacks || [],\n },\n cb\n );\n },\n\n get() {\n const store = storage.getStore();\n return store?.trx;\n },\n\n async commit(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Commit transaction\n await trx.commit();\n\n if (!store?.commitCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.commitCallbacks.forEach((cb) => cb());\n store.commitCallbacks = [];\n },\n\n async rollback(trx: Knex.Transaction) {\n const store = storage.getStore();\n if (isTransactorComplete(trx)) {\n if (store?.trx) {\n store.trx = null;\n }\n return;\n }\n\n // Clear transaction from store\n if (store?.trx) {\n store.trx = null;\n }\n\n // Rollback transaction\n await trx.rollback();\n\n if (!store?.rollbackCallbacks.length) {\n return;\n }\n\n // Run callbacks\n store.rollbackCallbacks.forEach((cb) => cb());\n store.rollbackCallbacks = [];\n },\n\n onCommit(cb: Callback) {\n const store = storage.getStore();\n if (store?.commitCallbacks) {\n store.commitCallbacks.push(cb);\n }\n },\n\n onRollback(cb: Callback) {\n const store = storage.getStore();\n if (store?.rollbackCallbacks) {\n store.rollbackCallbacks.push(cb);\n }\n },\n};\n\nexport { transactionCtx };\n"],"names":["isTransactorComplete","trx","t","isCompleted","storage","AsyncLocalStorage","transactionCtx","run","cb","store","getStore","commitCallbacks","rollbackCallbacks","get","commit","length","forEach","rollback","onCommit","push","onRollback"],"mappings":";;AAGA;;;;;;IAOA,MAAMA,uBAAuB,CAACC,GAAAA,GAAAA;AAC5B,IAAA,MAAMC,CAAAA,GAAID,GAAAA;AACV,IAAA,OAAO,OAAOC,CAAAA,CAAEC,WAAW,KAAK,UAAA,IAAcD,EAAEC,WAAW,EAAA;AAC7D,CAAA;AAeA,MAAMC,UAAU,IAAIC,iBAAAA,EAAAA;AAEpB,MAAMC,cAAAA,GAAiB;IACrB,MAAMC,GAAAA,CAAAA,CAAgCN,GAAqB,EAAEO,EAAa,EAAA;QACxE,MAAMC,KAAAA,GAAQL,QAAQM,QAAQ,EAAA;QAC9B,OAAON,OAAAA,CAAQG,GAAG,CAChB;AACEN,YAAAA,GAAAA;;YAEAU,eAAAA,EAAiBF,KAAAA,EAAOE,mBAAmB,EAAE;YAC7CC,iBAAAA,EAAmBH,KAAAA,EAAOG,qBAAqB;SACjD,EACAJ,EAAAA,CAAAA;AAEJ,IAAA,CAAA;AAEAK,IAAAA,GAAAA,CAAAA,GAAAA;QACE,MAAMJ,KAAAA,GAAQL,QAAQM,QAAQ,EAAA;AAC9B,QAAA,OAAOD,KAAAA,EAAOR,GAAAA;AAChB,IAAA,CAAA;AAEA,IAAA,MAAMa,QAAOb,GAAqB,EAAA;QAChC,MAAMQ,KAAAA,GAAQL,QAAQM,QAAQ,EAAA;AAC9B,QAAA,IAAIV,qBAAqBC,GAAAA,CAAAA,EAAM;AAC7B,YAAA,IAAIQ,OAAOR,GAAAA,EAAK;AACdQ,gBAAAA,KAAAA,CAAMR,GAAG,GAAG,IAAA;AACd,YAAA;AACA,YAAA;AACF,QAAA;;AAGA,QAAA,IAAIQ,OAAOR,GAAAA,EAAK;AACdQ,YAAAA,KAAAA,CAAMR,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIa,MAAM,EAAA;QAEhB,IAAI,CAACL,KAAAA,EAAOE,eAAAA,CAAgBI,MAAAA,EAAQ;AAClC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAME,eAAe,CAACK,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACtCC,KAAAA,CAAME,eAAe,GAAG,EAAE;AAC5B,IAAA,CAAA;AAEA,IAAA,MAAMM,UAAShB,GAAqB,EAAA;QAClC,MAAMQ,KAAAA,GAAQL,QAAQM,QAAQ,EAAA;AAC9B,QAAA,IAAIV,qBAAqBC,GAAAA,CAAAA,EAAM;AAC7B,YAAA,IAAIQ,OAAOR,GAAAA,EAAK;AACdQ,gBAAAA,KAAAA,CAAMR,GAAG,GAAG,IAAA;AACd,YAAA;AACA,YAAA;AACF,QAAA;;AAGA,QAAA,IAAIQ,OAAOR,GAAAA,EAAK;AACdQ,YAAAA,KAAAA,CAAMR,GAAG,GAAG,IAAA;AACd,QAAA;;AAGA,QAAA,MAAMA,IAAIgB,QAAQ,EAAA;QAElB,IAAI,CAACR,KAAAA,EAAOG,iBAAAA,CAAkBG,MAAAA,EAAQ;AACpC,YAAA;AACF,QAAA;;AAGAN,QAAAA,KAAAA,CAAMG,iBAAiB,CAACI,OAAO,CAAC,CAACR,EAAAA,GAAOA,EAAAA,EAAAA,CAAAA;QACxCC,KAAAA,CAAMG,iBAAiB,GAAG,EAAE;AAC9B,IAAA,CAAA;AAEAM,IAAAA,QAAAA,CAAAA,CAASV,EAAY,EAAA;QACnB,MAAMC,KAAAA,GAAQL,QAAQM,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOE,eAAAA,EAAiB;YAC1BF,KAAAA,CAAME,eAAe,CAACQ,IAAI,CAACX,EAAAA,CAAAA;AAC7B,QAAA;AACF,IAAA,CAAA;AAEAY,IAAAA,UAAAA,CAAAA,CAAWZ,EAAY,EAAA;QACrB,MAAMC,KAAAA,GAAQL,QAAQM,QAAQ,EAAA;AAC9B,QAAA,IAAID,OAAOG,iBAAAA,EAAmB;YAC5BH,KAAAA,CAAMG,iBAAiB,CAACO,IAAI,CAACX,EAAAA,CAAAA;AAC/B,QAAA;AACF,IAAA;AACF;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/database",
3
- "version": "5.47.0",
3
+ "version": "5.48.0",
4
4
  "description": "Strapi's database layer",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -43,8 +43,8 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@paralleldrive/cuid2": "2.2.2",
46
- "@strapi/utils": "5.47.0",
47
- "ajv": "8.18.0",
46
+ "@strapi/utils": "5.48.0",
47
+ "ajv": "8.20.0",
48
48
  "date-fns": "2.30.0",
49
49
  "debug": "4.3.4",
50
50
  "fs-extra": "11.3.4",
@@ -55,8 +55,8 @@
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/fs-extra": "11.0.4",
58
- "eslint-config-custom": "5.47.0",
59
- "tsconfig": "5.47.0"
58
+ "eslint-config-custom": "5.48.0",
59
+ "tsconfig": "5.48.0"
60
60
  },
61
61
  "engines": {
62
62
  "node": ">=20.0.0 <=24.x.x",