forked from typeorm/typeorm
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathConnectionMetadataBuilder.ts
117 lines (107 loc) · 4.51 KB
/
ConnectionMetadataBuilder.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import { importClassesFromDirectories } from "../util/DirectoryExportedClassesLoader"
import { OrmUtils } from "../util/OrmUtils"
import { getFromContainer } from "../container"
import { MigrationInterface } from "../migration/MigrationInterface"
import { getMetadataArgsStorage } from "../globals"
import { EntityMetadataBuilder } from "../metadata-builder/EntityMetadataBuilder"
import { EntitySchemaTransformer } from "../entity-schema/EntitySchemaTransformer"
import { DataSource } from "../data-source/DataSource"
import { EntitySchema } from "../entity-schema/EntitySchema"
import { EntityMetadata } from "../metadata/EntityMetadata"
import { EntitySubscriberInterface } from "../subscriber/EntitySubscriberInterface"
import { InstanceChecker } from "../util/InstanceChecker"
/**
* Builds migration instances, subscriber instances and entity metadatas for the given classes.
*/
export class ConnectionMetadataBuilder {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(protected connection: DataSource) {}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Builds migration instances for the given classes or directories.
*/
async buildMigrations(
migrations: (Function | string)[],
): Promise<MigrationInterface[]> {
const [migrationClasses, migrationDirectories] =
OrmUtils.splitClassesAndStrings(migrations)
const allMigrationClasses = [
...migrationClasses,
...(await importClassesFromDirectories(
this.connection.logger,
migrationDirectories,
)),
]
return allMigrationClasses.map((migrationClass) =>
getFromContainer<MigrationInterface>(migrationClass),
)
}
/**
* Builds subscriber instances for the given classes or directories.
*/
async buildSubscribers(
subscribers: (Function | string)[],
): Promise<EntitySubscriberInterface<any>[]> {
const [subscriberClasses, subscriberDirectories] =
OrmUtils.splitClassesAndStrings(subscribers || [])
const allSubscriberClasses = [
...subscriberClasses,
...(await importClassesFromDirectories(
this.connection.logger,
subscriberDirectories,
)),
]
return getMetadataArgsStorage()
.filterSubscribers(allSubscriberClasses)
.map((metadata) =>
getFromContainer<EntitySubscriberInterface<any>>(
metadata.target,
),
)
}
/**
* Builds entity metadatas for the given classes or directories.
*/
async buildEntityMetadatas(
entities: (Function | EntitySchema<any> | string)[],
): Promise<EntityMetadata[]> {
// todo: instead we need to merge multiple metadata args storages
const [entityClassesOrSchemas, entityDirectories] =
OrmUtils.splitClassesAndStrings(entities || [])
const entityClasses: Function[] = entityClassesOrSchemas.filter(
(entityClass) => !InstanceChecker.isEntitySchema(entityClass),
) as any
const entitySchemas: EntitySchema<any>[] =
entityClassesOrSchemas.filter((entityClass) =>
InstanceChecker.isEntitySchema(entityClass),
) as any
const allEntityClasses = [
...entityClasses,
...(await importClassesFromDirectories(
this.connection.logger,
entityDirectories,
)),
]
allEntityClasses.forEach((entityClass) => {
// if we have entity schemas loaded from directories
if (InstanceChecker.isEntitySchema(entityClass)) {
entitySchemas.push(entityClass)
}
})
const decoratorEntityMetadatas = new EntityMetadataBuilder(
this.connection,
getMetadataArgsStorage(),
).build(allEntityClasses)
const metadataArgsStorageFromSchema =
new EntitySchemaTransformer().transform(entitySchemas)
const schemaEntityMetadatas = new EntityMetadataBuilder(
this.connection,
metadataArgsStorageFromSchema,
).build()
return [...decoratorEntityMetadatas, ...schemaEntityMetadatas]
}
}