Skip to content

Commit aae47e6

Browse files
authored
fix: augmented instanceof checks with fallback checks (#968)
1 parent d804a22 commit aae47e6

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

src/helper.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SelectQueryBuilder } from 'typeorm'
1+
import { FindOperator, Repository, SelectQueryBuilder } from 'typeorm'
22
import { ColumnMetadata } from 'typeorm/metadata/ColumnMetadata'
33

44
/**
@@ -227,3 +227,23 @@ const isoDateRegExp = new RegExp(
227227
export function isISODate(str: string): boolean {
228228
return isoDateRegExp.test(str)
229229
}
230+
231+
export function isRepository<T>(repo: unknown | Repository<T>): repo is Repository<T> {
232+
if (repo instanceof Repository) return true
233+
try {
234+
if (Object.getPrototypeOf(repo).constructor.name === 'Repository') return true
235+
return typeof repo === 'object' && !('connection' in repo) && 'manager' in repo
236+
} catch {
237+
return false
238+
}
239+
}
240+
241+
export function isFindOperator<T>(value: unknown | FindOperator<T>): value is FindOperator<T> {
242+
if (value instanceof FindOperator) return true
243+
try {
244+
if (Object.getPrototypeOf(value).constructor.name === 'FindOperator') return true
245+
return typeof value === 'object' && '_type' in value && '_value' in value
246+
} catch {
247+
return false
248+
}
249+
}

src/paginate.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { mapKeys } from 'lodash'
33
import { stringify } from 'querystring'
44
import {
55
Brackets,
6-
FindOperator,
76
FindOptionsRelationByString,
87
FindOptionsRelations,
98
FindOptionsUtils,
@@ -15,21 +14,23 @@ import {
1514
import { WherePredicateOperator } from 'typeorm/query-builder/WhereClause'
1615
import { OrmUtils } from 'typeorm/util/OrmUtils'
1716
import { PaginateQuery } from './decorator'
18-
import { FilterOperator, FilterSuffix, addFilter } from './filter'
17+
import { addFilter, FilterOperator, FilterSuffix } from './filter'
1918
import {
20-
Column,
21-
Order,
22-
RelationColumn,
23-
SortBy,
2419
checkIsEmbedded,
2520
checkIsRelation,
21+
Column,
2622
extractVirtualProperty,
2723
fixColumnAlias,
2824
getPropertiesByColumnName,
2925
getQueryUrlComponents,
3026
includesAllPrimaryKeyColumns,
3127
isEntityKey,
28+
isFindOperator,
29+
isRepository,
30+
Order,
3231
positiveNumberOrDefault,
32+
RelationColumn,
33+
SortBy,
3334
} from './helper'
3435

3536
const logger: Logger = new Logger('nestjs-paginate')
@@ -116,7 +117,7 @@ function flattenWhereAndTransform<T>(
116117
if (obj.hasOwnProperty(key)) {
117118
const joinedKey = parentKey ? `${parentKey}${separator}${key}` : key
118119

119-
if (typeof value === 'object' && value !== null && !(value instanceof FindOperator)) {
120+
if (typeof value === 'object' && value !== null && !isFindOperator(value)) {
120121
return flattenWhereAndTransform(queryBuilder, value as FindOptionsWhere<T>, separator, joinedKey)
121122
} else {
122123
const property = getPropertiesByColumnName(joinedKey)
@@ -210,9 +211,9 @@ export async function paginate<T extends ObjectLiteral>(
210211

211212
let [items, totalItems]: [T[], number] = [[], 0]
212213

213-
const queryBuilder = repo instanceof Repository ? repo.createQueryBuilder('__root') : repo
214+
const queryBuilder = isRepository(repo) ? repo.createQueryBuilder('__root') : repo
214215

215-
if (repo instanceof Repository && !config.relations && config.loadEagerRelations === true) {
216+
if (isRepository(repo) && !config.relations && config.loadEagerRelations === true) {
216217
if (!config.relations) {
217218
FindOptionsUtils.joinEagerRelations(queryBuilder, queryBuilder.alias, repo.metadata)
218219
}
@@ -254,7 +255,7 @@ export async function paginate<T extends ObjectLiteral>(
254255
createQueryBuilderRelations(queryBuilder.alias, relations)
255256
}
256257

257-
const dbType = (repo instanceof Repository ? repo.manager : repo).connection.options.type
258+
const dbType = (isRepository(repo) ? repo.manager : repo).connection.options.type
258259
const isMariaDbOrMySql = (dbType: string) => dbType === 'mariadb' || dbType === 'mysql'
259260
const isMMDb = isMariaDbOrMySql(dbType)
260261

@@ -327,7 +328,7 @@ export async function paginate<T extends ObjectLiteral>(
327328
queryBuilder.select(cols)
328329
}
329330

330-
if (config.where && repo instanceof Repository) {
331+
if (config.where && isRepository(repo)) {
331332
const baseWhereStr = generateWhereStatement(queryBuilder, config.where)
332333
queryBuilder.andWhere(`(${baseWhereStr})`)
333334
}

0 commit comments

Comments
 (0)