@strapi/database 5.55.1 → 5.57.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.
- package/dist/dialects/dialect.d.ts +28 -0
- package/dist/dialects/dialect.d.ts.map +1 -1
- package/dist/dialects/dialect.js +29 -0
- package/dist/dialects/dialect.js.map +1 -1
- package/dist/dialects/dialect.mjs +29 -0
- package/dist/dialects/dialect.mjs.map +1 -1
- package/dist/dialects/mysql/index.d.ts +9 -0
- package/dist/dialects/mysql/index.d.ts.map +1 -1
- package/dist/dialects/mysql/index.js +37 -0
- package/dist/dialects/mysql/index.js.map +1 -1
- package/dist/dialects/mysql/index.mjs +37 -0
- package/dist/dialects/mysql/index.mjs.map +1 -1
- package/dist/dialects/postgresql/index.d.ts +7 -0
- package/dist/dialects/postgresql/index.d.ts.map +1 -1
- package/dist/dialects/postgresql/index.js +50 -0
- package/dist/dialects/postgresql/index.js.map +1 -1
- package/dist/dialects/postgresql/index.mjs +50 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -1
- package/dist/dialects/sqlite/index.d.ts +9 -0
- package/dist/dialects/sqlite/index.d.ts.map +1 -1
- package/dist/dialects/sqlite/index.js +16 -0
- package/dist/dialects/sqlite/index.js.map +1 -1
- package/dist/dialects/sqlite/index.mjs +16 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -1
- package/dist/entity-manager/entity-repository.js +1 -1
- package/dist/entity-manager/entity-repository.js.map +1 -1
- package/dist/entity-manager/entity-repository.mjs +1 -1
- package/dist/entity-manager/entity-repository.mjs.map +1 -1
- package/dist/entity-manager/index.d.ts.map +1 -1
- package/dist/entity-manager/index.js +38 -36
- package/dist/entity-manager/index.js.map +1 -1
- package/dist/entity-manager/index.mjs +38 -36
- package/dist/entity-manager/index.mjs.map +1 -1
- package/dist/entity-manager/morph-relations.d.ts.map +1 -1
- package/dist/entity-manager/morph-relations.js +3 -5
- package/dist/entity-manager/morph-relations.js.map +1 -1
- package/dist/entity-manager/morph-relations.mjs +3 -5
- package/dist/entity-manager/morph-relations.mjs.map +1 -1
- package/dist/entity-manager/regular-relations.js +3 -3
- package/dist/entity-manager/regular-relations.js.map +1 -1
- package/dist/entity-manager/regular-relations.mjs +3 -3
- package/dist/entity-manager/regular-relations.mjs.map +1 -1
- package/dist/entity-manager/relations-orderer.d.ts.map +1 -1
- package/dist/entity-manager/relations-orderer.js +4 -5
- package/dist/entity-manager/relations-orderer.js.map +1 -1
- package/dist/entity-manager/relations-orderer.mjs +2 -3
- package/dist/entity-manager/relations-orderer.mjs.map +1 -1
- package/dist/fields/biginteger.js +1 -1
- package/dist/fields/biginteger.js.map +1 -1
- package/dist/fields/biginteger.mjs +1 -1
- package/dist/fields/biginteger.mjs.map +1 -1
- package/dist/fields/boolean.js +1 -1
- package/dist/fields/boolean.js.map +1 -1
- package/dist/fields/boolean.mjs +1 -1
- package/dist/fields/boolean.mjs.map +1 -1
- package/dist/fields/number.js +1 -1
- package/dist/fields/number.js.map +1 -1
- package/dist/fields/number.mjs +1 -1
- package/dist/fields/number.mjs.map +1 -1
- package/dist/fields/shared/parsers.js +2 -2
- package/dist/fields/shared/parsers.js.map +1 -1
- package/dist/fields/shared/parsers.mjs +2 -2
- package/dist/fields/shared/parsers.mjs.map +1 -1
- package/dist/fields/string.js +1 -1
- package/dist/fields/string.js.map +1 -1
- package/dist/fields/string.mjs +1 -1
- package/dist/fields/string.mjs.map +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/metadata/attribute-naming.d.ts +31 -0
- package/dist/metadata/attribute-naming.d.ts.map +1 -0
- package/dist/metadata/attribute-naming.js +39 -0
- package/dist/metadata/attribute-naming.js.map +1 -0
- package/dist/metadata/attribute-naming.mjs +37 -0
- package/dist/metadata/attribute-naming.mjs.map +1 -0
- package/dist/metadata/index.d.ts +5 -2
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/index.js +3 -0
- package/dist/metadata/index.js.map +1 -1
- package/dist/metadata/index.mjs +3 -1
- package/dist/metadata/index.mjs.map +1 -1
- package/dist/metadata/metadata.d.ts +10 -0
- package/dist/metadata/metadata.d.ts.map +1 -1
- package/dist/metadata/metadata.js +10 -2
- package/dist/metadata/metadata.js.map +1 -1
- package/dist/metadata/metadata.mjs +10 -2
- package/dist/metadata/metadata.mjs.map +1 -1
- package/dist/metadata/relations.d.ts.map +1 -1
- package/dist/metadata/relations.js +6 -5
- package/dist/metadata/relations.js.map +1 -1
- package/dist/metadata/relations.mjs +6 -5
- package/dist/metadata/relations.mjs.map +1 -1
- package/dist/migrations/common.d.ts +2 -0
- package/dist/migrations/common.d.ts.map +1 -1
- package/dist/migrations/common.js.map +1 -1
- package/dist/migrations/common.mjs.map +1 -1
- package/dist/migrations/file-builder.d.ts +97 -0
- package/dist/migrations/file-builder.d.ts.map +1 -0
- package/dist/migrations/file-builder.js +251 -0
- package/dist/migrations/file-builder.js.map +1 -0
- package/dist/migrations/file-builder.mjs +240 -0
- package/dist/migrations/file-builder.mjs.map +1 -0
- package/dist/migrations/index.d.ts +3 -2
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +6 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs +6 -0
- package/dist/migrations/index.mjs.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +1 -1
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -1
- package/dist/migrations/resolver.d.ts.map +1 -1
- package/dist/migrations/resolver.js +4 -1
- package/dist/migrations/resolver.js.map +1 -1
- package/dist/migrations/resolver.mjs +4 -1
- package/dist/migrations/resolver.mjs.map +1 -1
- package/dist/query/helpers/order-by.d.ts.map +1 -1
- package/dist/query/helpers/order-by.js +3 -4
- package/dist/query/helpers/order-by.js.map +1 -1
- package/dist/query/helpers/order-by.mjs +3 -4
- package/dist/query/helpers/order-by.mjs.map +1 -1
- package/dist/query/helpers/populate/apply.d.ts.map +1 -1
- package/dist/query/helpers/populate/apply.js +46 -30
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs +46 -30
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/populate/process.js +3 -3
- package/dist/query/helpers/populate/process.js.map +1 -1
- package/dist/query/helpers/populate/process.mjs +3 -3
- package/dist/query/helpers/populate/process.mjs.map +1 -1
- package/dist/query/helpers/search.js +2 -2
- package/dist/query/helpers/search.js.map +1 -1
- package/dist/query/helpers/search.mjs +2 -2
- package/dist/query/helpers/search.mjs.map +1 -1
- package/dist/query/helpers/streams/readable.js +3 -3
- package/dist/query/helpers/streams/readable.js.map +1 -1
- package/dist/query/helpers/streams/readable.mjs +3 -3
- package/dist/query/helpers/streams/readable.mjs.map +1 -1
- package/dist/query/helpers/transform.d.ts.map +1 -1
- package/dist/query/helpers/transform.js +6 -13
- package/dist/query/helpers/transform.js.map +1 -1
- package/dist/query/helpers/transform.mjs +6 -9
- package/dist/query/helpers/transform.mjs.map +1 -1
- package/dist/query/helpers/where.js +13 -9
- package/dist/query/helpers/where.js.map +1 -1
- package/dist/query/helpers/where.mjs +13 -9
- package/dist/query/helpers/where.mjs.map +1 -1
- package/dist/query/query-builder.d.ts.map +1 -1
- package/dist/query/query-builder.js +35 -29
- package/dist/query/query-builder.js.map +1 -1
- package/dist/query/query-builder.mjs +35 -29
- package/dist/query/query-builder.mjs.map +1 -1
- package/dist/schema/builder.js +5 -5
- package/dist/schema/builder.js.map +1 -1
- package/dist/schema/builder.mjs +5 -5
- package/dist/schema/builder.mjs.map +1 -1
- package/dist/schema/diff.js +12 -12
- package/dist/schema/diff.js.map +1 -1
- package/dist/schema/diff.mjs +12 -12
- package/dist/schema/diff.mjs.map +1 -1
- package/dist/schema/index.d.ts +3 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/index.mjs +6 -0
- package/dist/schema/index.mjs.map +1 -1
- package/dist/schema/rename-helpers.d.ts +78 -0
- package/dist/schema/rename-helpers.d.ts.map +1 -0
- package/dist/schema/rename-helpers.js +235 -0
- package/dist/schema/rename-helpers.js.map +1 -0
- package/dist/schema/rename-helpers.mjs +233 -0
- package/dist/schema/rename-helpers.mjs.map +1 -0
- package/dist/utils/async-curry.d.ts.map +1 -1
- package/dist/utils/async-curry.js +1 -2
- package/dist/utils/async-curry.js.map +1 -1
- package/dist/utils/async-curry.mjs +1 -2
- package/dist/utils/async-curry.mjs.map +1 -1
- package/dist/utils/identifiers/hash.d.ts.map +1 -1
- package/dist/utils/identifiers/hash.js +1 -2
- package/dist/utils/identifiers/hash.js.map +1 -1
- package/dist/utils/identifiers/hash.mjs +1 -2
- package/dist/utils/identifiers/hash.mjs.map +1 -1
- package/dist/utils/identifiers/index.js +8 -10
- package/dist/utils/identifiers/index.js.map +1 -1
- package/dist/utils/identifiers/index.mjs +8 -6
- package/dist/utils/identifiers/index.mjs.map +1 -1
- package/dist/validations/relations/bidirectional.js +1 -1
- package/dist/validations/relations/bidirectional.js.map +1 -1
- package/dist/validations/relations/bidirectional.mjs +1 -1
- package/dist/validations/relations/bidirectional.mjs.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.mjs","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport { hasSort } from '@strapi/utils';\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 const explicitSort = populateValue.orderBy ?? populateValue.sort;\n\n if (hasSort(explicitSort) || !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] = attribute.relation === 'morphOne' ? 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 // Match oneToMany/manyToMany: empty morphMany collections serialize as [], not null.\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 // Match oneToMany/manyToMany: empty morphMany collections serialize as [], not null.\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, isCount } = 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 joinRowsRaw = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...joinTable.on,\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const allowedTypes =\n 'on' in populateValue && populateValue.on ? new Set(Object.keys(populateValue.on)) : null;\n\n const joinRows = allowedTypes\n ? joinRowsRaw.filter((row) => allowedTypes.has(row[typeColumn.name] as string))\n : joinRowsRaw;\n\n if (isCount) {\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n results.forEach((result) => {\n result[attributeName] = {\n count: (joinMap[result[joinColumn.referencedColumn] as string] || []).length,\n };\n });\n\n return;\n }\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, isCount } = 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 const typeRestrictedTypes =\n on && typeof on === 'object'\n ? Object.keys(idsByType).filter((type) => type in on)\n : Object.keys(idsByType);\n const allowedTypes = new Set(typeRestrictedTypes);\n\n if (isCount) {\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n result[attributeName] = { count: id && type && allowedTypes.has(type) ? 1 : 0 };\n });\n\n return;\n }\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n if (!allowedTypes.has(type)) {\n map[type] = {};\n continue;\n }\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","explicitSort","orderBy","sort","hasSort","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","joinRowsRaw","allowedTypes","Set","Object","keys","joinRows","has","joinMap","length","idsByType","acc","idValue","typeValue","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","typeRestrictedTypes","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';\nimport { hasSort } from '@strapi/utils';\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 const explicitSort = populateValue.orderBy ?? populateValue.sort;\n\n if (hasSort(explicitSort) || !joinTable.orderBy) {\n return undefined;\n }\n\n return _.mapValues(joinTable.orderBy, (v) => populateValue.ordering || v);\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 = [\n ...new Set(results.map((r) => r[joinColumnName]).filter((value) => value != null)),\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(rows, referencedColumnName);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string]?.[0]);\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 = [\n ...new Set(results.map((r) => r[referencedColumnName]).filter((value) => value != null)),\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(rows, joinColRenameAs);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string]?.[0]);\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 = [\n ...new Set(results.map((r) => r[joinColumnName]).filter((value) => value != null)),\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(rows, referencedColumnName);\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 = [\n ...new Set(results.map((r) => r[referencedColumnName]).filter((value) => value != null)),\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(rows, joinColRenameAs);\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 = [\n ...new Set(results.map((r) => r[referencedColumnName]).filter((value) => value != null)),\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(rows, joinColRenameAs);\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 = [\n ...new Set(results.map((r) => r[idColumn.referencedColumn]).filter((value) => value != null)),\n ];\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? 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(rows, idColumn.name);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n // Match oneToMany/manyToMany: empty morphMany collections serialize as [], not null.\n const matchingValue =\n attribute.relation === 'morphOne' ? matchingRows?.[0] : 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 = [\n ...new Set(results.map((r) => r[idColumn.referencedColumn]).filter((value) => value != null)),\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(rows, idColumn.name);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n // Match oneToMany/manyToMany: empty morphMany collections serialize as [], not null.\n const matchingValue =\n attribute.relation === 'morphOne' ? matchingRows?.[0] : 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, isCount } = 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 = [\n ...new Set(results.map((r) => r[joinColumn.referencedColumn]).filter((value) => value != null)),\n ];\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRowsRaw = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...joinTable.on,\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const allowedTypes =\n 'on' in populateValue && populateValue.on ? new Set(Object.keys(populateValue.on)) : null;\n\n const joinRows = allowedTypes\n ? joinRowsRaw.filter((row) => allowedTypes.has(row[typeColumn.name] as string))\n : joinRowsRaw;\n\n if (isCount) {\n const joinMap = _.groupBy(joinRows, joinColumn.name);\n\n results.forEach((result) => {\n result[attributeName] = {\n count: (joinMap[result[joinColumn.referencedColumn] as string] || []).length,\n };\n });\n\n return;\n }\n\n const joinMap = _.groupBy(joinRows, joinColumn.name);\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(acc, typeValue)) {\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(rows, idColumn.referencedColumn);\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, isCount } = 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 const typeRestrictedTypes =\n on && typeof on === 'object'\n ? Object.keys(idsByType).filter((type) => type in on)\n : Object.keys(idsByType);\n const allowedTypes = new Set(typeRestrictedTypes);\n\n if (isCount) {\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n result[attributeName] = { count: id && type && allowedTypes.has(type) ? 1 : 0 };\n });\n\n return;\n }\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n if (!allowedTypes.has(type)) {\n map[type] = {};\n continue;\n }\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(rows, idColumn.referencedColumn);\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(matchingRows?.[0]);\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(populate, fieldsToPick);\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(populateValue.on as Record<string, any>, (value) => {\n if (_.isPlainObject(value)) {\n value.filters = filters;\n }\n\n return value;\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","explicitSort","orderBy","sort","hasSort","undefined","_","mapValues","v","ordering","XtoOne","input","ctx","attribute","attributeName","results","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","Set","map","r","filter","value","isEmpty","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","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","joinRowsRaw","allowedTypes","Object","keys","joinRows","has","joinMap","length","idsByType","acc","idValue","typeValue","push","typePopulate","Promise","all","ids","joinResults","flatMap","joinResult","id","morphToOne","typeRestrictedTypes","pickPopulateParams","populate","fieldsToPick","pick","getPopulateValue","filters","isPlainObject","applyPopulate","meta","populateAttribute","Error","state"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var _ = require('lodash
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var types = require('../../../utils/types.js');
|
|
5
5
|
|
|
6
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -29,7 +29,7 @@ const getRootLevelPopulate = (meta)=>{
|
|
|
29
29
|
const { qb, db, uid } = ctx;
|
|
30
30
|
const meta = db.metadata.get(uid);
|
|
31
31
|
let populateMap = {};
|
|
32
|
-
if (populate === false ||
|
|
32
|
+
if (populate === false || populate == null) {
|
|
33
33
|
return null;
|
|
34
34
|
}
|
|
35
35
|
if (populate === true) {
|
|
@@ -84,7 +84,7 @@ const getRootLevelPopulate = (meta)=>{
|
|
|
84
84
|
qb.addSelect(attribute.joinColumn.name);
|
|
85
85
|
}
|
|
86
86
|
// Make sure id is present for future populate queries
|
|
87
|
-
if (___default.default.has('id'
|
|
87
|
+
if (___default.default.has(meta.attributes, 'id')) {
|
|
88
88
|
qb.addSelect('id');
|
|
89
89
|
}
|
|
90
90
|
finalPopulate[key] = populateMap[key];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sources":["../../../../src/query/helpers/populate/process.ts"],"sourcesContent":["import _ from 'lodash
|
|
1
|
+
{"version":3,"file":"process.js","sources":["../../../../src/query/helpers/populate/process.ts"],"sourcesContent":["import _ from 'lodash';\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 || populate == null) {\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(meta.attributes, 'id')) {\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","Array","isArray","key","root","rest","split","length","subPopulate","join","populateValue","concat","_","isPlainObject","Error","finalPopulate","types","joinColumn","addSelect","name","has"],"mappings":";;;;;;;;;AAOA,MAAMA,uBAAuB,CAACC,IAAAA,GAAAA;AAC5B,IAAA,MAAMC,WAAwB,EAAC;AAE/B,IAAA,KAAK,MAAMC,aAAAA,IAAiBC,MAAAA,CAAOC,IAAI,CAACJ,IAAAA,CAAKK,UAAU,CAAA,CAAG;AACxD,QAAA,MAAMC,SAAAA,GAAYN,IAAAA,CAAKK,UAAU,CAACH,aAAAA,CAAc;QAChD,IAAII,SAAAA,CAAUC,IAAI,KAAK,UAAA,EAAY;YACjCN,QAAQ,CAACC,cAAc,GAAG,IAAA;AAC5B,QAAA;AACF,IAAA;IAEA,OAAOD,QAAAA;AACT,CAAA;AAgBA;;;;;;;;IASA,MAAMO,eAAAA,GAAkB,CAACP,QAAAA,EAAmBQ,GAAAA,GAAAA;AAC1C,IAAA,MAAM,EAAEC,EAAE,EAAEC,EAAE,EAAEC,GAAG,EAAE,GAAGH,GAAAA;AACxB,IAAA,MAAMT,IAAAA,GAAOW,EAAAA,CAAGE,QAAQ,CAACC,GAAG,CAACF,GAAAA,CAAAA;AAE7B,IAAA,IAAIG,cAA2B,EAAC;IAEhC,IAAId,QAAAA,KAAa,KAAA,IAASA,QAAAA,IAAY,IAAA,EAAM;QAC1C,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAIA,aAAa,IAAA,EAAM;AACrBc,QAAAA,WAAAA,GAAchB,oBAAAA,CAAqBC,IAAAA,CAAAA;AACrC,IAAA,CAAA,MAAO,IAAIgB,KAAAA,CAAMC,OAAO,CAAChB,QAAAA,CAAAA,EAAW;QAClC,KAAK,MAAMiB,OAAOjB,QAAAA,CAAU;AAC1B,YAAA,MAAM,CAACkB,IAAAA,EAAM,GAAGC,KAAK,GAAGF,GAAAA,CAAIG,KAAK,CAAC,GAAA,CAAA;YAElC,IAAID,IAAAA,CAAKE,MAAM,GAAG,CAAA,EAAG;gBACnB,MAAMC,WAAAA,GAAcH,IAAAA,CAAKI,IAAI,CAAC,GAAA,CAAA;gBAC9B,IAAIT,WAAW,CAACI,IAAAA,CAAK,EAAE;oBACrB,MAAMM,aAAAA,GAAgBV,WAAW,CAACI,IAAAA,CAAK;AAEvC,oBAAA,IAAIM,kBAAkB,IAAA,EAAM;wBAC1BV,WAAW,CAACI,KAAK,GAAG;4BAClBlB,QAAAA,EAAU;AAACsB,gCAAAA;AAAY;AACzB,yBAAA;oBACF,CAAA,MAAO;AACLE,wBAAAA,aAAAA,CAAcxB,QAAQ,GAAG;AAACsB,4BAAAA;AAAY,yBAAA,CAACG,MAAM,CAACD,aAAAA,CAAcxB,QAAQ,IAAI,EAAE,CAAA;AAC5E,oBAAA;gBACF,CAAA,MAAO;oBACLc,WAAW,CAACI,KAAK,GAAG;wBAClBlB,QAAAA,EAAU;AAACsB,4BAAAA;AAAY;AACzB,qBAAA;AACF,gBAAA;YACF,CAAA,MAAO;gBACLR,WAAW,CAACI,IAAAA,CAAK,GAAGJ,WAAW,CAACI,KAAK,GAAGJ,WAAW,CAACI,IAAAA,CAAK,GAAG,IAAA;AAC9D,YAAA;AACF,QAAA;IACF,CAAA,MAAO;QACLJ,WAAAA,GAAcd,QAAAA;AAChB,IAAA;AAEA,IAAA,IAAI,CAAC0B,kBAAAA,CAAEC,aAAa,CAACb,WAAAA,CAAAA,EAAc;AACjC,QAAA,MAAM,IAAIc,KAAAA,CAAM,4BAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAMC,gBAA6B,EAAC;AACpC,IAAA,KAAK,MAAMZ,GAAAA,IAAOf,MAAAA,CAAOC,IAAI,CAACW,WAAAA,CAAAA,CAAc;AAC1C,QAAA,MAAMT,SAAAA,GAAYN,IAAAA,CAAKK,UAAU,CAACa,GAAAA,CAAI;AAEtC,QAAA,IAAI,CAACZ,SAAAA,EAAW;AACd,YAAA;AACF,QAAA;AAEA,QAAA,IAAI,CAACyB,gBAAgB,CAACzB,SAAAA,CAAUC,IAAI,CAAA,EAAG;AACrC,YAAA;AACF,QAAA;;;AAIA,QAAA,IAAI,YAAA,IAAgBD,SAAAA,IAAaA,SAAAA,CAAU0B,UAAU,EAAE;AACrDtB,YAAAA,EAAAA,CAAGuB,SAAS,CAAC3B,SAAAA,CAAU0B,UAAU,CAACE,IAAI,CAAA;AACxC,QAAA;;AAGA,QAAA,IAAIP,mBAAEQ,GAAG,CAACnC,IAAAA,CAAKK,UAAU,EAAE,IAAA,CAAA,EAAO;AAChCK,YAAAA,EAAAA,CAAGuB,SAAS,CAAC,IAAA,CAAA;AACf,QAAA;AAEAH,QAAAA,aAAa,CAACZ,GAAAA,CAAI,GAAGH,WAAW,CAACG,GAAAA,CAAI;AACvC,IAAA;IAEA,OAAOY,aAAAA;AACT;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import _ from 'lodash
|
|
1
|
+
import _ from 'lodash';
|
|
2
2
|
import { isRelation } from '../../../utils/types.mjs';
|
|
3
3
|
|
|
4
4
|
const getRootLevelPopulate = (meta)=>{
|
|
@@ -23,7 +23,7 @@ const getRootLevelPopulate = (meta)=>{
|
|
|
23
23
|
const { qb, db, uid } = ctx;
|
|
24
24
|
const meta = db.metadata.get(uid);
|
|
25
25
|
let populateMap = {};
|
|
26
|
-
if (populate === false ||
|
|
26
|
+
if (populate === false || populate == null) {
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
29
|
if (populate === true) {
|
|
@@ -78,7 +78,7 @@ const getRootLevelPopulate = (meta)=>{
|
|
|
78
78
|
qb.addSelect(attribute.joinColumn.name);
|
|
79
79
|
}
|
|
80
80
|
// Make sure id is present for future populate queries
|
|
81
|
-
if (_.has('id'
|
|
81
|
+
if (_.has(meta.attributes, 'id')) {
|
|
82
82
|
qb.addSelect('id');
|
|
83
83
|
}
|
|
84
84
|
finalPopulate[key] = populateMap[key];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.mjs","sources":["../../../../src/query/helpers/populate/process.ts"],"sourcesContent":["import _ from 'lodash
|
|
1
|
+
{"version":3,"file":"process.mjs","sources":["../../../../src/query/helpers/populate/process.ts"],"sourcesContent":["import _ from 'lodash';\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 || populate == null) {\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(meta.attributes, 'id')) {\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","Array","isArray","key","root","rest","split","length","subPopulate","join","populateValue","concat","_","isPlainObject","Error","finalPopulate","types","joinColumn","addSelect","name","has"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var _ = require('lodash
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var types = require('../../utils/types.js');
|
|
5
5
|
var transform = require('./transform.js');
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ const applySearch = (knex, query, ctx)=>{
|
|
|
20
20
|
return types.isScalarAttribute(attribute) && types.isString(attribute.type) && attribute.searchable !== false;
|
|
21
21
|
});
|
|
22
22
|
searchColumns.push(...stringColumns);
|
|
23
|
-
if (!
|
|
23
|
+
if (!Number.isNaN(___default.default.toNumber(query))) {
|
|
24
24
|
const numberColumns = Object.keys(attributes).filter((attributeName)=>{
|
|
25
25
|
const attribute = attributes[attributeName];
|
|
26
26
|
return types.isScalarAttribute(attribute) && types.isNumber(attribute.type) && attribute.searchable !== false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash
|
|
1
|
+
{"version":3,"file":"search.js","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!Number.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\nexport const escapeQuery = (query: string, charsToEscape: string, escapeChar = '\\\\') => {\n return query\n .split('')\n .reduce(\n (escapedQuery, char) =>\n charsToEscape.includes(char)\n ? `${escapedQuery}${escapeChar}${char}`\n : `${escapedQuery}${char}`,\n ''\n );\n};\n"],"names":["applySearch","knex","query","ctx","qb","uid","db","meta","metadata","get","attributes","searchColumns","stringColumns","Object","keys","filter","attributeName","attribute","types","type","searchable","push","Number","isNaN","_","toNumber","numberColumns","dialect","client","forEach","attr","columnName","toColumnName","orWhereRaw","aliasColumn","escapeQuery","charsToEscape","escapeChar","split","reduce","escapedQuery","char","includes"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import _ from 'lodash
|
|
1
|
+
import _ from 'lodash';
|
|
2
2
|
import { isScalarAttribute, isString, isNumber } from '../../utils/types.mjs';
|
|
3
3
|
import { toColumnName } from './transform.mjs';
|
|
4
4
|
|
|
@@ -14,7 +14,7 @@ const applySearch = (knex, query, ctx)=>{
|
|
|
14
14
|
return isScalarAttribute(attribute) && isString(attribute.type) && attribute.searchable !== false;
|
|
15
15
|
});
|
|
16
16
|
searchColumns.push(...stringColumns);
|
|
17
|
-
if (!
|
|
17
|
+
if (!Number.isNaN(_.toNumber(query))) {
|
|
18
18
|
const numberColumns = Object.keys(attributes).filter((attributeName)=>{
|
|
19
19
|
const attribute = attributes[attributeName];
|
|
20
20
|
return isScalarAttribute(attribute) && isNumber(attribute.type) && attribute.searchable !== false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.mjs","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash
|
|
1
|
+
{"version":3,"file":"search.mjs","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!Number.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\nexport const escapeQuery = (query: string, charsToEscape: string, escapeChar = '\\\\') => {\n return query\n .split('')\n .reduce(\n (escapedQuery, char) =>\n charsToEscape.includes(char)\n ? `${escapedQuery}${escapeChar}${char}`\n : `${escapedQuery}${char}`,\n ''\n );\n};\n"],"names":["applySearch","knex","query","ctx","qb","uid","db","meta","metadata","get","attributes","searchColumns","stringColumns","Object","keys","filter","attributeName","attribute","types","type","searchable","push","Number","isNaN","_","toNumber","numberColumns","dialect","client","forEach","attr","columnName","toColumnName","orWhereRaw","aliasColumn","escapeQuery","charsToEscape","escapeChar","split","reduce","escapedQuery","char","includes"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var stream = require('stream');
|
|
4
|
-
var _ = require('lodash/fp');
|
|
5
4
|
var apply = require('../populate/apply.js');
|
|
5
|
+
require('lodash');
|
|
6
6
|
var transform = require('../transform.js');
|
|
7
7
|
|
|
8
8
|
const knexQueryDone = Symbol('knexQueryDone');
|
|
@@ -105,9 +105,9 @@ class ReadableStrapiQuery extends stream.Readable {
|
|
|
105
105
|
// Extract offset & limit from the query-builder's state
|
|
106
106
|
const { offset, limit } = qb.state;
|
|
107
107
|
// Original offset value
|
|
108
|
-
this._offset =
|
|
108
|
+
this._offset = Number.isFinite(offset) ? Number(offset) : 0;
|
|
109
109
|
// Max amount of entities to fetch, force null as undefined value
|
|
110
|
-
this._limit =
|
|
110
|
+
this._limit = Number.isFinite(limit) ? Number(limit) : null;
|
|
111
111
|
// Total amount of entities fetched
|
|
112
112
|
this._fetched = 0;
|
|
113
113
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readable.js","sources":["../../../../src/query/helpers/streams/readable.ts"],"sourcesContent":["import { Readable } from 'stream';\nimport
|
|
1
|
+
{"version":3,"file":"readable.js","sources":["../../../../src/query/helpers/streams/readable.ts"],"sourcesContent":["import { Readable } from 'stream';\n\nimport type { Knex } from 'knex';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\n\nimport { applyPopulate } from '../populate';\nimport { fromRow } from '../transform';\nimport { Meta } from '../../../metadata';\n\nconst knexQueryDone = Symbol('knexQueryDone');\nconst knexPerformingQuery = Symbol('knexPerformingQuery');\n\ninterface ReadableStrapiQueryOptions {\n qb: QueryBuilder;\n uid: string;\n db: Database;\n mapResults?: boolean;\n batchSize?: number;\n}\n\nclass ReadableStrapiQuery extends Readable {\n _offset: number;\n\n _limit: number | null;\n\n _fetched: number;\n\n _query: Knex.QueryBuilder;\n\n _qb: QueryBuilder;\n\n _db: Database;\n\n _uid: string;\n\n _meta: Meta;\n\n _batchSize: number;\n\n _mapResults: boolean;\n\n [knexPerformingQuery]: boolean;\n\n constructor({ qb, db, uid, mapResults = true, batchSize = 500 }: ReadableStrapiQueryOptions) {\n super({ objectMode: true, highWaterMark: batchSize });\n\n // Extract offset & limit from the query-builder's state\n const { offset, limit } = qb.state;\n\n // Original offset value\n this._offset = Number.isFinite(offset) ? Number(offset) : 0;\n\n // Max amount of entities to fetch, force null as undefined value\n this._limit = Number.isFinite(limit) ? Number(limit) : null;\n\n // Total amount of entities fetched\n this._fetched = 0;\n\n /**\n * Original query\n */\n this._query = qb.getKnexQuery();\n\n // Query Builder instance\n this._qb = qb;\n\n // Database related properties\n this._db = db;\n this._uid = uid;\n this._meta = db.metadata.get(uid);\n\n // Stream params\n this._batchSize = batchSize;\n this._mapResults = mapResults;\n\n // States\n this[knexPerformingQuery] = false;\n }\n\n _destroy(err: Error, cb: (err?: Error) => void) {\n // If the stream is destroyed while a query is being made, then wait for a\n // kQueryDone event to be emitted before actually destroying the stream\n if (this[knexPerformingQuery]) {\n this.once(knexQueryDone, (er) => cb(err || er));\n } else {\n cb(err);\n }\n }\n\n /**\n * Custom ._read() implementation\n *\n * NOTE: Here \"size\" means the number of entities to be read from the database.\n * Not the actual byte size, as it would mean that we need to return partial entities.\n *\n */\n async _read(size: number) {\n const query = this._query;\n\n // Remove the original offset & limit properties from the query\n // Theoretically, they would be replaced by calling them again, but this is just to be sure\n query.clear('limit').clear('offset');\n\n // Define the maximum read size based on the limit and the requested size\n // NOTE: size is equal to _batchSize by default. Since we want to allow customizing it on\n // the fly, we need to use its value instead of batchSize when computing the maxReadSize value\n const maxReadSize =\n // if no limit is defined in the query, use the given size,\n // otherwise, use the smallest value between the two\n this._limit === null ? size : Math.min(size, this._limit);\n\n // Compute the limit for the next query\n const limit =\n // If a limit is defined\n this._limit !== null &&\n // And reading `maxReadSize` would fetch too many entities (> _limit)\n this._fetched + maxReadSize > this._limit\n ? // Then adjust the limit so that it only get the remaining entities\n this._limit - this._fetched\n : // Else, use the max read size\n maxReadSize;\n\n // If we don't have anything left to read (_limit === _fetched),\n // don't bother making the query and end the stream by pushing null\n if (limit <= 0) {\n this.push(null);\n return;\n }\n\n // Compute the offset (base offset + number of entities already fetched)\n const offset = this._offset + this._fetched;\n\n // Update the query with the new values (offset + limit)\n query.offset(offset).limit(limit);\n\n // Lock the ._destroy()\n this[knexPerformingQuery] = true;\n\n let results;\n let count;\n let err;\n\n try {\n // Execute the query and store the results & count\n results = await query;\n\n const { populate } = this._qb.state;\n\n // Applies the populate if needed\n if (populate) {\n await applyPopulate(results, populate, {\n qb: this._qb,\n uid: this._uid,\n db: this._db,\n });\n }\n\n // Map results if asked to\n if (this._mapResults) {\n results = fromRow(this._meta, results);\n }\n\n count = results.length;\n } catch (e) {\n err = e;\n }\n\n // Unlock the ._destroy()\n this[knexPerformingQuery] = false;\n\n // Tell ._destroy() that it's now safe to close the db connection\n if (this.destroyed) {\n this.emit(knexQueryDone);\n return;\n }\n\n // If there is an error, destroy with the given error\n if (err) {\n this.destroy(err as Error);\n return;\n }\n\n // Update the amount of fetched entities\n this._fetched += count;\n\n // While there is at least one value to unpack\n for (const result of results) {\n this.push(result);\n }\n\n // If the amount of fetched entities is smaller than the\n // maximum read size, Then push null to close the stream\n if (this._fetched === this._limit || count < this._batchSize) {\n this.push(null);\n }\n }\n}\n\nexport default ReadableStrapiQuery;\n"],"names":["knexQueryDone","Symbol","knexPerformingQuery","ReadableStrapiQuery","Readable","_destroy","err","cb","once","er","_read","size","query","_query","clear","maxReadSize","_limit","Math","min","limit","_fetched","push","offset","_offset","results","count","populate","_qb","state","applyPopulate","qb","uid","_uid","db","_db","_mapResults","fromRow","_meta","length","e","destroyed","emit","destroy","result","_batchSize","mapResults","batchSize","objectMode","highWaterMark","Number","isFinite","getKnexQuery","metadata","get"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Readable } from 'stream';
|
|
2
|
-
import { isFinite } from 'lodash/fp';
|
|
3
2
|
import applyPopulate from '../populate/apply.mjs';
|
|
3
|
+
import 'lodash';
|
|
4
4
|
import { fromRow } from '../transform.mjs';
|
|
5
5
|
|
|
6
6
|
const knexQueryDone = Symbol('knexQueryDone');
|
|
@@ -103,9 +103,9 @@ class ReadableStrapiQuery extends Readable {
|
|
|
103
103
|
// Extract offset & limit from the query-builder's state
|
|
104
104
|
const { offset, limit } = qb.state;
|
|
105
105
|
// Original offset value
|
|
106
|
-
this._offset = isFinite(offset) ? Number(offset) : 0;
|
|
106
|
+
this._offset = Number.isFinite(offset) ? Number(offset) : 0;
|
|
107
107
|
// Max amount of entities to fetch, force null as undefined value
|
|
108
|
-
this._limit = isFinite(limit) ? Number(limit) : null;
|
|
108
|
+
this._limit = Number.isFinite(limit) ? Number(limit) : null;
|
|
109
109
|
// Total amount of entities fetched
|
|
110
110
|
this._fetched = 0;
|
|
111
111
|
/**
|