typeorm 0.3.4 → 0.3.5-dev.9d1e246

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +2 -1
  2. package/browser/cli-ts-node-commonjs.d.ts +1 -1
  3. package/browser/cli-ts-node-commonjs.js +2 -1
  4. package/browser/cli-ts-node-commonjs.js.map +1 -1
  5. package/browser/cli-ts-node-esm.d.ts +2 -2
  6. package/browser/cli-ts-node-esm.js +19 -2
  7. package/browser/cli-ts-node-esm.js.map +1 -1
  8. package/browser/data-source/DataSource.js +2 -5
  9. package/browser/data-source/DataSource.js.map +1 -1
  10. package/browser/driver/DriverUtils.d.ts +1 -0
  11. package/browser/driver/DriverUtils.js +3 -0
  12. package/browser/driver/DriverUtils.js.map +1 -1
  13. package/browser/driver/postgres/PostgresDriver.js +1 -4
  14. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  15. package/browser/persistence/EntityPersistExecutor.js +12 -1
  16. package/browser/persistence/EntityPersistExecutor.js.map +1 -1
  17. package/browser/query-builder/InsertQueryBuilder.d.ts +9 -0
  18. package/browser/query-builder/InsertQueryBuilder.js +4 -5
  19. package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
  20. package/browser/query-builder/SelectQueryBuilder.js +1 -1
  21. package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
  22. package/cli-ts-node-commonjs.d.ts +1 -1
  23. package/cli-ts-node-commonjs.js +2 -1
  24. package/cli-ts-node-commonjs.js.map +1 -1
  25. package/cli-ts-node-esm.d.ts +2 -2
  26. package/cli-ts-node-esm.js +19 -2
  27. package/cli-ts-node-esm.js.map +1 -1
  28. package/cli.js +0 -0
  29. package/data-source/DataSource.js +17 -20
  30. package/data-source/DataSource.js.map +1 -1
  31. package/driver/DriverUtils.d.ts +1 -0
  32. package/driver/DriverUtils.js +3 -0
  33. package/driver/DriverUtils.js.map +1 -1
  34. package/driver/postgres/PostgresDriver.js +1 -4
  35. package/driver/postgres/PostgresDriver.js.map +1 -1
  36. package/package.json +1 -261
  37. package/persistence/EntityPersistExecutor.js +12 -1
  38. package/persistence/EntityPersistExecutor.js.map +1 -1
  39. package/query-builder/InsertQueryBuilder.d.ts +9 -0
  40. package/query-builder/InsertQueryBuilder.js +4 -5
  41. package/query-builder/InsertQueryBuilder.js.map +1 -1
  42. package/query-builder/SelectQueryBuilder.js +1 -1
  43. package/query-builder/SelectQueryBuilder.js.map +1 -1
package/package.json CHANGED
@@ -1,261 +1 @@
1
- {
2
- "name": "typeorm",
3
- "private": false,
4
- "version": "0.3.4",
5
- "description": "Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.",
6
- "license": "MIT",
7
- "readmeFilename": "README.md",
8
- "author": {
9
- "name": "Umed Khudoiberdiev",
10
- "email": "pleerock.me@gmail.com"
11
- },
12
- "engines": {
13
- "node": ">= 12.9.0"
14
- },
15
- "exports": {
16
- ".": {
17
- "node": {
18
- "import": "./index.mjs",
19
- "require": "./index.js"
20
- },
21
- "browser": {
22
- "require": "./index.js",
23
- "import": "./browser/index.js",
24
- "default": "./index.js"
25
- }
26
- },
27
- "./browser": "./browser/index.js",
28
- "./*.js": "./*.js",
29
- "./*": {
30
- "require": "./*.js",
31
- "import": "./*"
32
- }
33
- },
34
- "main": "./index.js",
35
- "module": "./index.mjs",
36
- "types": "./index.d.ts",
37
- "browser": {
38
- "./browser/connection/ConnectionOptionsReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js",
39
- "./browser/connection/options-reader/ConnectionOptionsXmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js",
40
- "./browser/connection/options-reader/ConnectionOptionsYmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js",
41
- "./browser/driver/aurora-data-api/AuroraDataApiDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
42
- "./browser/driver/better-sqlite3/BetterSqlite3Driver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
43
- "./browser/driver/cockroachdb/CockroachDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
44
- "./browser/driver/mongodb/MongoDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
45
- "./browser/driver/mongodb/MongoQueryRunner.js": "./browser/platform/BrowserDisabledDriversDummy.js",
46
- "./browser/driver/mysql/MysqlDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
47
- "./browser/driver/oracle/OracleDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
48
- "./browser/driver/postgres/PostgresDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
49
- "./browser/driver/sap/SapDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
50
- "./browser/driver/sqlite/SqliteDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
51
- "./browser/driver/sqlserver/SqlServerDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js",
52
- "./browser/entity-manager/MongoEntityManager.js": "./browser/platform/BrowserDisabledDriversDummy.js",
53
- "./browser/logger/FileLogger.js": "./browser/platform/BrowserFileLoggerDummy.js",
54
- "./browser/platform/PlatformTools.js": "./browser/platform/BrowserPlatformTools.js",
55
- "./browser/repository/MongoRepository.js": "./browser/platform/BrowserDisabledDriversDummy.js",
56
- "./browser/util/DirectoryExportedClassesLoader.js": "./browser/platform/BrowserDirectoryExportedClassesLoader.js",
57
- "./index.js": "./browser/index.js",
58
- "./index.mjs": "./browser/index.js"
59
- },
60
- "repository": {
61
- "type": "git",
62
- "url": "https://github.com/typeorm/typeorm.git"
63
- },
64
- "bugs": {
65
- "url": "https://github.com/typeorm/typeorm/issues"
66
- },
67
- "tags": [
68
- "orm",
69
- "typescript",
70
- "typescript-orm",
71
- "mysql",
72
- "mysql-orm",
73
- "postgresql",
74
- "postgresql-orm",
75
- "mariadb",
76
- "mariadb-orm",
77
- "sqlite",
78
- "sqlite-orm",
79
- "sql-server",
80
- "sql-server-orm",
81
- "oracle",
82
- "oracle-orm"
83
- ],
84
- "devDependencies": {
85
- "@types/app-root-path": "^1.2.4",
86
- "@types/chai": "^4.2.15",
87
- "@types/chai-as-promised": "^7.1.3",
88
- "@types/debug": "^4.1.5",
89
- "@types/js-yaml": "^4.0.0",
90
- "@types/mkdirp": "^1.0.1",
91
- "@types/mocha": "^8.2.1",
92
- "@types/node": "^14.14.31",
93
- "@types/rimraf": "^3.0.0",
94
- "@types/sha.js": "^2.4.0",
95
- "@types/sinon": "^9.0.10",
96
- "@types/source-map-support": "^0.5.3",
97
- "@types/uuid": "^8.3.4",
98
- "@types/xml2js": "^0.4.8",
99
- "@types/yargs": "^17.0.2",
100
- "better-sqlite3": "^7.1.2",
101
- "chai": "^4.3.0",
102
- "chai-as-promised": "^7.1.1",
103
- "class-transformer": "^0.4.0",
104
- "conventional-changelog-angular": "^5.0.12",
105
- "conventional-changelog-cli": "^2.1.1",
106
- "del": "^6.0.0",
107
- "gulp": "^4.0.2",
108
- "gulp-istanbul": "^1.1.3",
109
- "gulp-mocha": "^8.0.0",
110
- "gulp-rename": "^2.0.0",
111
- "gulp-replace": "^1.0.0",
112
- "gulp-shell": "^0.8.0",
113
- "gulp-sourcemaps": "^3.0.0",
114
- "gulp-typescript": "^6.0.0-alpha.1",
115
- "gulpclass": "^0.2.0",
116
- "husky": "^5.1.1",
117
- "mocha": "^8.3.0",
118
- "mongodb": "^3.6.4",
119
- "mssql": "^7.3.0",
120
- "mysql": "^2.18.1",
121
- "mysql2": "^2.2.5",
122
- "pg": "^8.5.1",
123
- "pg-query-stream": "^4.0.0",
124
- "redis": "^3.1.1",
125
- "remap-istanbul": "^0.13.0",
126
- "rimraf": "^3.0.2",
127
- "sinon": "^9.2.4",
128
- "sinon-chai": "^3.5.0",
129
- "source-map-support": "^0.5.19",
130
- "sql.js": "^1.4.0",
131
- "sqlite3": "^5.0.2",
132
- "ts-node": "^10.7.0",
133
- "typeorm-aurora-data-api-driver": "^2.0.0",
134
- "typescript": "^4.6.2",
135
- "prettier": "^2.5.1"
136
- },
137
- "peerDependencies": {
138
- "@sap/hana-client": "^2.11.14",
139
- "better-sqlite3": "^7.1.2",
140
- "hdb-pool": "^0.1.6",
141
- "ioredis": "^4.28.3",
142
- "mongodb": "^3.6.0",
143
- "mssql": "^6.3.1",
144
- "mysql2": "^2.2.5",
145
- "oracledb": "^5.1.0",
146
- "pg": "^8.5.1",
147
- "pg-native": "^3.0.0",
148
- "pg-query-stream": "^4.0.0",
149
- "redis": "^3.1.1",
150
- "sql.js": "^1.4.0",
151
- "sqlite3": "^5.0.2",
152
- "ts-node": "^10.7.0",
153
- "typeorm-aurora-data-api-driver": "^2.0.0"
154
- },
155
- "peerDependenciesMeta": {
156
- "@sap/hana-client": {
157
- "optional": true
158
- },
159
- "better-sqlite3": {
160
- "optional": true
161
- },
162
- "hdb-pool": {
163
- "optional": true
164
- },
165
- "ioredis": {
166
- "optional": true
167
- },
168
- "mongodb": {
169
- "optional": true
170
- },
171
- "mssql": {
172
- "optional": true
173
- },
174
- "mysql2": {
175
- "optional": true
176
- },
177
- "oracledb": {
178
- "optional": true
179
- },
180
- "pg": {
181
- "optional": true
182
- },
183
- "pg-native": {
184
- "optional": true
185
- },
186
- "pg-query-stream": {
187
- "optional": true
188
- },
189
- "redis": {
190
- "optional": true
191
- },
192
- "sql.js": {
193
- "optional": true
194
- },
195
- "sqlite3": {
196
- "optional": true
197
- },
198
- "ts-node": {
199
- "optional": true
200
- },
201
- "typeorm-aurora-data-api-driver": {
202
- "optional": true
203
- }
204
- },
205
- "dependencies": {
206
- "@sqltools/formatter": "^1.2.2",
207
- "app-root-path": "^3.0.0",
208
- "buffer": "^6.0.3",
209
- "chalk": "^4.1.0",
210
- "cli-highlight": "^2.1.11",
211
- "debug": "^4.3.3",
212
- "dotenv": "^16.0.0",
213
- "glob": "^7.2.0",
214
- "js-yaml": "^4.1.0",
215
- "mkdirp": "^1.0.4",
216
- "reflect-metadata": "^0.1.13",
217
- "sha.js": "^2.4.11",
218
- "tslib": "^2.3.1",
219
- "uuid": "^8.3.2",
220
- "xml2js": "^0.4.23",
221
- "yargs": "^17.3.1",
222
- "date-fns": "^2.28.0"
223
- },
224
- "scripts": {
225
- "test": "rimraf ./build && tsc && mocha --file ./build/compiled/test/utils/test-setup.js --bail --recursive --timeout 60000 ./build/compiled/test",
226
- "test-fast": "mocha --file ./build/compiled/test/utils/test-setup.js --bail --recursive --timeout 60000 ./build/compiled/test",
227
- "compile": "rimraf ./build && tsc",
228
- "watch": "./node_modules/.bin/tsc -w",
229
- "package": "gulp package",
230
- "pack": "gulp pack",
231
- "lint": "prettier --check \"./src/**/*.ts\" \"./test/**/*.ts\" \"./sample/**/*.ts\"",
232
- "format": "prettier --write \"./src/**/*.ts\" \"./test/**/*.ts\" \"./sample/**/*.ts\"",
233
- "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 2"
234
- },
235
- "bin": {
236
- "typeorm": "./cli.js",
237
- "typeorm-ts-node-commonjs": "./cli-ts-node-commonjs.js",
238
- "typeorm-ts-node-esm": "./cli-ts-node-esm.js"
239
- },
240
- "funding": "https://opencollective.com/typeorm",
241
- "collective": {
242
- "type": "opencollective",
243
- "url": "https://opencollective.com/typeorm",
244
- "logo": "https://opencollective.com/opencollective/logo.txt"
245
- },
246
- "nyc": {
247
- "all": true,
248
- "cache": false,
249
- "exclude": [
250
- "**/*.d.ts"
251
- ],
252
- "extension": [
253
- ".ts"
254
- ],
255
- "include": [
256
- "build/compiled/src/**",
257
- "src/**"
258
- ],
259
- "reporter": "json"
260
- }
261
- }
1
+ { "name": "typeorm", "private": false, "version": "0.3.5-dev.9d1e246", "description": "Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.", "license": "MIT", "readmeFilename": "README.md", "author": { "name": "Umed Khudoiberdiev", "email": "pleerock.me@gmail.com" }, "engines": { "node": ">= 12.9.0" }, "exports": { ".": { "node": { "import": "./index.mjs", "require": "./index.js" }, "browser": { "require": "./index.js", "import": "./browser/index.js", "default": "./index.js" } }, "./browser": "./browser/index.js", "./*.js": "./*.js", "./*": { "require": "./*.js", "import": "./*" } }, "main": "./index.js", "module": "./index.mjs", "types": "./index.d.ts", "browser": { "./browser/connection/ConnectionOptionsReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/connection/options-reader/ConnectionOptionsXmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/connection/options-reader/ConnectionOptionsYmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/driver/aurora-data-api/AuroraDataApiDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/better-sqlite3/BetterSqlite3Driver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/cockroachdb/CockroachDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/MongoDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/MongoQueryRunner.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mysql/MysqlDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/oracle/OracleDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/postgres/PostgresDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sap/SapDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sqlite/SqliteDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sqlserver/SqlServerDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/entity-manager/MongoEntityManager.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/logger/FileLogger.js": "./browser/platform/BrowserFileLoggerDummy.js", "./browser/platform/PlatformTools.js": "./browser/platform/BrowserPlatformTools.js", "./browser/repository/MongoRepository.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/util/DirectoryExportedClassesLoader.js": "./browser/platform/BrowserDirectoryExportedClassesLoader.js", "./index.js": "./browser/index.js", "./index.mjs": "./browser/index.js" }, "repository": { "type": "git", "url": "https://github.com/typeorm/typeorm.git" }, "bugs": { "url": "https://github.com/typeorm/typeorm/issues" }, "tags": [ "orm", "typescript", "typescript-orm", "mysql", "mysql-orm", "postgresql", "postgresql-orm", "mariadb", "mariadb-orm", "sqlite", "sqlite-orm", "sql-server", "sql-server-orm", "oracle", "oracle-orm" ], "devDependencies": { "@types/app-root-path": "^1.2.4", "@types/chai": "^4.2.15", "@types/chai-as-promised": "^7.1.3", "@types/debug": "^4.1.5", "@types/js-yaml": "^4.0.0", "@types/mkdirp": "^1.0.1", "@types/mocha": "^8.2.1", "@types/node": "^14.14.31", "@types/rimraf": "^3.0.0", "@types/sha.js": "^2.4.0", "@types/sinon": "^9.0.10", "@types/source-map-support": "^0.5.3", "@types/uuid": "^8.3.4", "@types/xml2js": "^0.4.8", "@types/yargs": "^17.0.2", "better-sqlite3": "^7.1.2", "chai": "^4.3.0", "chai-as-promised": "^7.1.1", "class-transformer": "^0.4.0", "conventional-changelog-angular": "^5.0.12", "conventional-changelog-cli": "^2.1.1", "del": "^6.0.0", "gulp": "^4.0.2", "gulp-istanbul": "^1.1.3", "gulp-mocha": "^8.0.0", "gulp-rename": "^2.0.0", "gulp-replace": "^1.0.0", "gulp-shell": "^0.8.0", "gulp-sourcemaps": "^3.0.0", "gulp-typescript": "^6.0.0-alpha.1", "gulpclass": "^0.2.0", "husky": "^5.1.1", "mocha": "^8.3.0", "mongodb": "^3.6.4", "mssql": "^7.3.0", "mysql": "^2.18.1", "mysql2": "^2.2.5", "pg": "^8.5.1", "pg-query-stream": "^4.0.0", "redis": "^3.1.1", "remap-istanbul": "^0.13.0", "rimraf": "^3.0.2", "sinon": "^9.2.4", "sinon-chai": "^3.5.0", "source-map-support": "^0.5.19", "sql.js": "^1.4.0", "sqlite3": "^5.0.2", "ts-node": "^10.7.0", "typeorm-aurora-data-api-driver": "^2.0.0", "typescript": "^4.6.2", "prettier": "^2.5.1" }, "peerDependencies": { "@sap/hana-client": "^2.11.14", "better-sqlite3": "^7.1.2", "hdb-pool": "^0.1.6", "ioredis": "^4.28.3", "mongodb": "^3.6.0", "mssql": "^6.3.1", "mysql2": "^2.2.5", "oracledb": "^5.1.0", "pg": "^8.5.1", "pg-native": "^3.0.0", "pg-query-stream": "^4.0.0", "redis": "^3.1.1", "sql.js": "^1.4.0", "sqlite3": "^5.0.2", "ts-node": "^10.7.0", "typeorm-aurora-data-api-driver": "^2.0.0" }, "peerDependenciesMeta": { "@sap/hana-client": { "optional": true }, "better-sqlite3": { "optional": true }, "hdb-pool": { "optional": true }, "ioredis": { "optional": true }, "mongodb": { "optional": true }, "mssql": { "optional": true }, "mysql2": { "optional": true }, "oracledb": { "optional": true }, "pg": { "optional": true }, "pg-native": { "optional": true }, "pg-query-stream": { "optional": true }, "redis": { "optional": true }, "sql.js": { "optional": true }, "sqlite3": { "optional": true }, "ts-node": { "optional": true }, "typeorm-aurora-data-api-driver": { "optional": true } }, "dependencies": { "@sqltools/formatter": "^1.2.2", "app-root-path": "^3.0.0", "buffer": "^6.0.3", "chalk": "^4.1.0", "cli-highlight": "^2.1.11", "debug": "^4.3.3", "dotenv": "^16.0.0", "glob": "^7.2.0", "js-yaml": "^4.1.0", "mkdirp": "^1.0.4", "reflect-metadata": "^0.1.13", "sha.js": "^2.4.11", "tslib": "^2.3.1", "uuid": "^8.3.2", "xml2js": "^0.4.23", "yargs": "^17.3.1", "date-fns": "^2.28.0" }, "scripts": { "test": "rimraf ./build && tsc && mocha --file ./build/compiled/test/utils/test-setup.js --bail --recursive --timeout 60000 ./build/compiled/test", "test-fast": "mocha --file ./build/compiled/test/utils/test-setup.js --bail --recursive --timeout 60000 ./build/compiled/test", "compile": "rimraf ./build && tsc", "watch": "./node_modules/.bin/tsc -w", "package": "gulp package", "pack": "gulp pack", "lint": "prettier --check \"./src/**/*.ts\" \"./test/**/*.ts\" \"./sample/**/*.ts\"", "format": "prettier --write \"./src/**/*.ts\" \"./test/**/*.ts\" \"./sample/**/*.ts\"", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 2" }, "bin": { "typeorm": "./cli.js", "typeorm-ts-node-commonjs": "./cli-ts-node-commonjs.js", "typeorm-ts-node-esm": "./cli-ts-node-esm.js" }, "funding": "https://opencollective.com/typeorm", "collective": { "type": "opencollective", "url": "https://opencollective.com/typeorm", "logo": "https://opencollective.com/opencollective/logo.txt" }, "nyc": { "all": true, "cache": false, "exclude": [ "**/*.d.ts" ], "extension": [ ".ts" ], "include": [ "build/compiled/src/**", "src/**" ], "reporter": "json" } }
@@ -65,8 +65,19 @@ class EntityPersistExecutor {
65
65
  : entity.constructor;
66
66
  if (entityTarget === Object)
67
67
  throw new CannotDetermineEntityError_1.CannotDetermineEntityError(this.mode);
68
+ let metadata = this.connection.getMetadata(entityTarget);
69
+ // Check for single table inheritance and find the correct metadata in that case.
70
+ // Goal is to use the correct discriminator as we could have a repository
71
+ // for an (abstract) base class and thus the target would not match.
72
+ if (metadata.inheritancePattern === "STI" &&
73
+ metadata.childEntityMetadatas.length > 0) {
74
+ const matchingChildMetadata = metadata.childEntityMetadatas.find((meta) => entity.constructor === meta.target);
75
+ if (matchingChildMetadata) {
76
+ metadata = matchingChildMetadata;
77
+ }
78
+ }
68
79
  subjects.push(new Subject_1.Subject({
69
- metadata: this.connection.getMetadata(entityTarget),
80
+ metadata,
70
81
  entity: entity,
71
82
  canBeInserted: this.mode === "save",
72
83
  canBeUpdated: this.mode === "save",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/persistence/EntityPersistExecutor.ts"],"names":[],"mappings":"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","file":"EntityPersistExecutor.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SaveOptions } from \"../repository/SaveOptions\"\nimport { RemoveOptions } from \"../repository/RemoveOptions\"\nimport { MustBeEntityError } from \"../error/MustBeEntityError\"\nimport { SubjectExecutor } from \"./SubjectExecutor\"\nimport { CannotDetermineEntityError } from \"../error/CannotDetermineEntityError\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { Subject } from \"./Subject\"\nimport { OneToManySubjectBuilder } from \"./subject-builder/OneToManySubjectBuilder\"\nimport { OneToOneInverseSideSubjectBuilder } from \"./subject-builder/OneToOneInverseSideSubjectBuilder\"\nimport { ManyToManySubjectBuilder } from \"./subject-builder/ManyToManySubjectBuilder\"\nimport { SubjectDatabaseEntityLoader } from \"./SubjectDatabaseEntityLoader\"\nimport { CascadesSubjectBuilder } from \"./subject-builder/CascadesSubjectBuilder\"\nimport { OrmUtils } from \"../util/OrmUtils\"\n\n/**\n * Persists a single entity or multiple entities - saves or removes them.\n */\nexport class EntityPersistExecutor {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n protected connection: DataSource,\n protected queryRunner: QueryRunner | undefined,\n protected mode: \"save\" | \"remove\" | \"soft-remove\" | \"recover\",\n protected target: Function | string | undefined,\n protected entity: ObjectLiteral | ObjectLiteral[],\n protected options?: SaveOptions & RemoveOptions,\n ) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes persistence operation ob given entity or entities.\n */\n async execute(): Promise<void> {\n // check if entity we are going to save is valid and is an object\n if (!this.entity || typeof this.entity !== \"object\")\n return Promise.reject(new MustBeEntityError(this.mode, this.entity))\n\n // we MUST call \"fake\" resolve here to make sure all properties of lazily loaded relations are resolved\n await Promise.resolve()\n\n // if query runner is already defined in this class, it means this entity manager was already created for a single connection\n // if its not defined we create a new query runner - single connection where we'll execute all our operations\n const queryRunner =\n this.queryRunner || this.connection.createQueryRunner()\n\n // save data in the query runner - this is useful functionality to share data from outside of the world\n // with third classes - like subscribers and listener methods\n let oldQueryRunnerData = queryRunner.data\n if (this.options && this.options.data) {\n queryRunner.data = this.options.data\n }\n\n try {\n // collect all operate subjects\n const entities: ObjectLiteral[] = Array.isArray(this.entity)\n ? this.entity\n : [this.entity]\n const entitiesInChunks =\n this.options && this.options.chunk && this.options.chunk > 0\n ? OrmUtils.chunk(entities, this.options.chunk)\n : [entities]\n\n // console.time(\"building subject executors...\");\n const executors = await Promise.all(\n entitiesInChunks.map(async (entities) => {\n const subjects: Subject[] = []\n\n // create subjects for all entities we received for the persistence\n entities.forEach((entity) => {\n const entityTarget = this.target\n ? this.target\n : entity.constructor\n if (entityTarget === Object)\n throw new CannotDetermineEntityError(this.mode)\n\n subjects.push(\n new Subject({\n metadata:\n this.connection.getMetadata(entityTarget),\n entity: entity,\n canBeInserted: this.mode === \"save\",\n canBeUpdated: this.mode === \"save\",\n mustBeRemoved: this.mode === \"remove\",\n canBeSoftRemoved: this.mode === \"soft-remove\",\n canBeRecovered: this.mode === \"recover\",\n }),\n )\n })\n\n // console.time(\"building cascades...\");\n // go through each entity with metadata and create subjects and subjects by cascades for them\n const cascadesSubjectBuilder = new CascadesSubjectBuilder(\n subjects,\n )\n subjects.forEach((subject) => {\n // next step we build list of subjects we will operate with\n // these subjects are subjects that we need to insert or update alongside with main persisted entity\n cascadesSubjectBuilder.build(subject, this.mode)\n })\n // console.timeEnd(\"building cascades...\");\n\n // load database entities for all subjects we have\n // next step is to load database entities for all operate subjects\n // console.time(\"loading...\");\n await new SubjectDatabaseEntityLoader(\n queryRunner,\n subjects,\n ).load(this.mode)\n // console.timeEnd(\"loading...\");\n\n // console.time(\"other subjects...\");\n // build all related subjects and change maps\n if (\n this.mode === \"save\" ||\n this.mode === \"soft-remove\" ||\n this.mode === \"recover\"\n ) {\n new OneToManySubjectBuilder(subjects).build()\n new OneToOneInverseSideSubjectBuilder(subjects).build()\n new ManyToManySubjectBuilder(subjects).build()\n } else {\n subjects.forEach((subject) => {\n if (subject.mustBeRemoved) {\n new ManyToManySubjectBuilder(\n subjects,\n ).buildForAllRemoval(subject)\n }\n })\n }\n // console.timeEnd(\"other subjects...\");\n // console.timeEnd(\"building subjects...\");\n // console.log(\"subjects\", subjects);\n\n // create a subject executor\n return new SubjectExecutor(\n queryRunner,\n subjects,\n this.options,\n )\n }),\n )\n // console.timeEnd(\"building subject executors...\");\n\n // make sure we have at least one executable operation before we create a transaction and proceed\n // if we don't have operations it means we don't really need to update or remove something\n const executorsWithExecutableOperations = executors.filter(\n (executor) => executor.hasExecutableOperations,\n )\n if (executorsWithExecutableOperations.length === 0) return\n\n // start execute queries in a transaction\n // if transaction is already opened in this query runner then we don't touch it\n // if its not opened yet then we open it here, and once we finish - we close it\n let isTransactionStartedByUs = false\n try {\n // open transaction if its not opened yet\n if (!queryRunner.isTransactionActive) {\n if (!this.options || this.options.transaction !== false) {\n // start transaction until it was not explicitly disabled\n isTransactionStartedByUs = true\n await queryRunner.startTransaction()\n }\n }\n\n // execute all persistence operations for all entities we have\n // console.time(\"executing subject executors...\");\n for (const executor of executorsWithExecutableOperations) {\n await executor.execute()\n }\n // console.timeEnd(\"executing subject executors...\");\n\n // commit transaction if it was started by us\n // console.time(\"commit\");\n if (isTransactionStartedByUs === true)\n await queryRunner.commitTransaction()\n // console.timeEnd(\"commit\");\n } catch (error) {\n // rollback transaction if it was started by us\n if (isTransactionStartedByUs) {\n try {\n await queryRunner.rollbackTransaction()\n } catch (rollbackError) {}\n }\n throw error\n }\n } finally {\n queryRunner.data = oldQueryRunnerData\n\n // release query runner only if its created by us\n if (!this.queryRunner) await queryRunner.release()\n }\n }\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../../src/persistence/EntityPersistExecutor.ts"],"names":[],"mappings":";;;AAGA,kEAA8D;AAC9D,uDAAmD;AACnD,oFAAgF;AAGhF,uCAAmC;AACnC,uFAAmF;AACnF,2GAAuG;AACvG,yFAAqF;AACrF,+EAA2E;AAC3E,qFAAiF;AACjF,+CAA2C;AAE3C;;GAEG;AACH,MAAa,qBAAqB;IAC9B,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAE5E,YACc,UAAsB,EACtB,WAAoC,EACpC,IAAmD,EACnD,MAAqC,EACrC,MAAuC,EACvC,OAAqC;QALrC,eAAU,GAAV,UAAU,CAAY;QACtB,gBAAW,GAAX,WAAW,CAAyB;QACpC,SAAI,GAAJ,IAAI,CAA+C;QACnD,WAAM,GAAN,MAAM,CAA+B;QACrC,WAAM,GAAN,MAAM,CAAiC;QACvC,YAAO,GAAP,OAAO,CAA8B;IAChD,CAAC;IAEJ,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CAAC,OAAO;QACT,iEAAiE;QACjE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAC/C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,qCAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAExE,uGAAuG;QACvG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QAEvB,6HAA6H;QAC7H,6GAA6G;QAC7G,MAAM,WAAW,GACb,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAA;QAE3D,uGAAuG;QACvG,6DAA6D;QAC7D,IAAI,kBAAkB,GAAG,WAAW,CAAC,IAAI,CAAA;QACzC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACnC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;SACvC;QAED,IAAI;YACA,+BAA+B;YAC/B,MAAM,QAAQ,GAAoB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBACxD,CAAC,CAAC,IAAI,CAAC,MAAM;gBACb,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACnB,MAAM,gBAAgB,GAClB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC;gBACxD,CAAC,CAAC,mBAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9C,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;YAEpB,iDAAiD;YACjD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACpC,MAAM,QAAQ,GAAc,EAAE,CAAA;gBAE9B,mEAAmE;gBACnE,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;oBACxB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM;wBAC5B,CAAC,CAAC,IAAI,CAAC,MAAM;wBACb,CAAC,CAAC,MAAM,CAAC,WAAW,CAAA;oBACxB,IAAI,YAAY,KAAK,MAAM;wBACvB,MAAM,IAAI,uDAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBAEnD,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;oBAExD,iFAAiF;oBACjF,yEAAyE;oBACzE,oEAAoE;oBACpE,IACI,QAAQ,CAAC,kBAAkB,KAAK,KAAK;wBACrC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAC1C;wBACE,MAAM,qBAAqB,GACvB,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE,CACL,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,MAAM,CACzC,CAAA;wBACL,IAAI,qBAAqB,EAAE;4BACvB,QAAQ,GAAG,qBAAqB,CAAA;yBACnC;qBACJ;oBAED,QAAQ,CAAC,IAAI,CACT,IAAI,iBAAO,CAAC;wBACR,QAAQ;wBACR,MAAM,EAAE,MAAM;wBACd,aAAa,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM;wBACnC,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM;wBAClC,aAAa,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ;wBACrC,gBAAgB,EAAE,IAAI,CAAC,IAAI,KAAK,aAAa;wBAC7C,cAAc,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS;qBAC1C,CAAC,CACL,CAAA;gBACL,CAAC,CAAC,CAAA;gBAEF,wCAAwC;gBACxC,6FAA6F;gBAC7F,MAAM,sBAAsB,GAAG,IAAI,+CAAsB,CACrD,QAAQ,CACX,CAAA;gBACD,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACzB,2DAA2D;oBAC3D,oGAAoG;oBACpG,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpD,CAAC,CAAC,CAAA;gBACF,2CAA2C;gBAE3C,kDAAkD;gBAClD,kEAAkE;gBAClE,8BAA8B;gBAC9B,MAAM,IAAI,yDAA2B,CACjC,WAAW,EACX,QAAQ,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACjB,iCAAiC;gBAEjC,qCAAqC;gBACrC,6CAA6C;gBAC7C,IACI,IAAI,CAAC,IAAI,KAAK,MAAM;oBACpB,IAAI,CAAC,IAAI,KAAK,aAAa;oBAC3B,IAAI,CAAC,IAAI,KAAK,SAAS,EACzB;oBACE,IAAI,iDAAuB,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAA;oBAC7C,IAAI,qEAAiC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAA;oBACvD,IAAI,mDAAwB,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAA;iBACjD;qBAAM;oBACH,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;wBACzB,IAAI,OAAO,CAAC,aAAa,EAAE;4BACvB,IAAI,mDAAwB,CACxB,QAAQ,CACX,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;yBAChC;oBACL,CAAC,CAAC,CAAA;iBACL;gBACD,wCAAwC;gBACxC,2CAA2C;gBAC3C,qCAAqC;gBAErC,4BAA4B;gBAC5B,OAAO,IAAI,iCAAe,CACtB,WAAW,EACX,QAAQ,EACR,IAAI,CAAC,OAAO,CACf,CAAA;YACL,CAAC,CAAC,CACL,CAAA;YACD,oDAAoD;YAEpD,iGAAiG;YACjG,0FAA0F;YAC1F,MAAM,iCAAiC,GAAG,SAAS,CAAC,MAAM,CACtD,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CACjD,CAAA;YACD,IAAI,iCAAiC,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAE1D,yCAAyC;YACzC,+EAA+E;YAC/E,+EAA+E;YAC/E,IAAI,wBAAwB,GAAG,KAAK,CAAA;YACpC,IAAI;gBACA,yCAAyC;gBACzC,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE;oBAClC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE;wBACrD,yDAAyD;wBACzD,wBAAwB,GAAG,IAAI,CAAA;wBAC/B,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAA;qBACvC;iBACJ;gBAED,8DAA8D;gBAC9D,kDAAkD;gBAClD,KAAK,MAAM,QAAQ,IAAI,iCAAiC,EAAE;oBACtD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;iBAC3B;gBACD,qDAAqD;gBAErD,6CAA6C;gBAC7C,0BAA0B;gBAC1B,IAAI,wBAAwB,KAAK,IAAI;oBACjC,MAAM,WAAW,CAAC,iBAAiB,EAAE,CAAA;gBACzC,6BAA6B;aAChC;YAAC,OAAO,KAAK,EAAE;gBACZ,+CAA+C;gBAC/C,IAAI,wBAAwB,EAAE;oBAC1B,IAAI;wBACA,MAAM,WAAW,CAAC,mBAAmB,EAAE,CAAA;qBAC1C;oBAAC,OAAO,aAAa,EAAE,GAAE;iBAC7B;gBACD,MAAM,KAAK,CAAA;aACd;SACJ;gBAAS;YACN,WAAW,CAAC,IAAI,GAAG,kBAAkB,CAAA;YAErC,iDAAiD;YACjD,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;SACrD;IACL,CAAC;CACJ;AAvMD,sDAuMC","file":"EntityPersistExecutor.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SaveOptions } from \"../repository/SaveOptions\"\nimport { RemoveOptions } from \"../repository/RemoveOptions\"\nimport { MustBeEntityError } from \"../error/MustBeEntityError\"\nimport { SubjectExecutor } from \"./SubjectExecutor\"\nimport { CannotDetermineEntityError } from \"../error/CannotDetermineEntityError\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { Subject } from \"./Subject\"\nimport { OneToManySubjectBuilder } from \"./subject-builder/OneToManySubjectBuilder\"\nimport { OneToOneInverseSideSubjectBuilder } from \"./subject-builder/OneToOneInverseSideSubjectBuilder\"\nimport { ManyToManySubjectBuilder } from \"./subject-builder/ManyToManySubjectBuilder\"\nimport { SubjectDatabaseEntityLoader } from \"./SubjectDatabaseEntityLoader\"\nimport { CascadesSubjectBuilder } from \"./subject-builder/CascadesSubjectBuilder\"\nimport { OrmUtils } from \"../util/OrmUtils\"\n\n/**\n * Persists a single entity or multiple entities - saves or removes them.\n */\nexport class EntityPersistExecutor {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n protected connection: DataSource,\n protected queryRunner: QueryRunner | undefined,\n protected mode: \"save\" | \"remove\" | \"soft-remove\" | \"recover\",\n protected target: Function | string | undefined,\n protected entity: ObjectLiteral | ObjectLiteral[],\n protected options?: SaveOptions & RemoveOptions,\n ) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes persistence operation ob given entity or entities.\n */\n async execute(): Promise<void> {\n // check if entity we are going to save is valid and is an object\n if (!this.entity || typeof this.entity !== \"object\")\n return Promise.reject(new MustBeEntityError(this.mode, this.entity))\n\n // we MUST call \"fake\" resolve here to make sure all properties of lazily loaded relations are resolved\n await Promise.resolve()\n\n // if query runner is already defined in this class, it means this entity manager was already created for a single connection\n // if its not defined we create a new query runner - single connection where we'll execute all our operations\n const queryRunner =\n this.queryRunner || this.connection.createQueryRunner()\n\n // save data in the query runner - this is useful functionality to share data from outside of the world\n // with third classes - like subscribers and listener methods\n let oldQueryRunnerData = queryRunner.data\n if (this.options && this.options.data) {\n queryRunner.data = this.options.data\n }\n\n try {\n // collect all operate subjects\n const entities: ObjectLiteral[] = Array.isArray(this.entity)\n ? this.entity\n : [this.entity]\n const entitiesInChunks =\n this.options && this.options.chunk && this.options.chunk > 0\n ? OrmUtils.chunk(entities, this.options.chunk)\n : [entities]\n\n // console.time(\"building subject executors...\");\n const executors = await Promise.all(\n entitiesInChunks.map(async (entities) => {\n const subjects: Subject[] = []\n\n // create subjects for all entities we received for the persistence\n entities.forEach((entity) => {\n const entityTarget = this.target\n ? this.target\n : entity.constructor\n if (entityTarget === Object)\n throw new CannotDetermineEntityError(this.mode)\n\n let metadata = this.connection.getMetadata(entityTarget)\n\n // Check for single table inheritance and find the correct metadata in that case.\n // Goal is to use the correct discriminator as we could have a repository\n // for an (abstract) base class and thus the target would not match.\n if (\n metadata.inheritancePattern === \"STI\" &&\n metadata.childEntityMetadatas.length > 0\n ) {\n const matchingChildMetadata =\n metadata.childEntityMetadatas.find(\n (meta) =>\n entity.constructor === meta.target,\n )\n if (matchingChildMetadata) {\n metadata = matchingChildMetadata\n }\n }\n\n subjects.push(\n new Subject({\n metadata,\n entity: entity,\n canBeInserted: this.mode === \"save\",\n canBeUpdated: this.mode === \"save\",\n mustBeRemoved: this.mode === \"remove\",\n canBeSoftRemoved: this.mode === \"soft-remove\",\n canBeRecovered: this.mode === \"recover\",\n }),\n )\n })\n\n // console.time(\"building cascades...\");\n // go through each entity with metadata and create subjects and subjects by cascades for them\n const cascadesSubjectBuilder = new CascadesSubjectBuilder(\n subjects,\n )\n subjects.forEach((subject) => {\n // next step we build list of subjects we will operate with\n // these subjects are subjects that we need to insert or update alongside with main persisted entity\n cascadesSubjectBuilder.build(subject, this.mode)\n })\n // console.timeEnd(\"building cascades...\");\n\n // load database entities for all subjects we have\n // next step is to load database entities for all operate subjects\n // console.time(\"loading...\");\n await new SubjectDatabaseEntityLoader(\n queryRunner,\n subjects,\n ).load(this.mode)\n // console.timeEnd(\"loading...\");\n\n // console.time(\"other subjects...\");\n // build all related subjects and change maps\n if (\n this.mode === \"save\" ||\n this.mode === \"soft-remove\" ||\n this.mode === \"recover\"\n ) {\n new OneToManySubjectBuilder(subjects).build()\n new OneToOneInverseSideSubjectBuilder(subjects).build()\n new ManyToManySubjectBuilder(subjects).build()\n } else {\n subjects.forEach((subject) => {\n if (subject.mustBeRemoved) {\n new ManyToManySubjectBuilder(\n subjects,\n ).buildForAllRemoval(subject)\n }\n })\n }\n // console.timeEnd(\"other subjects...\");\n // console.timeEnd(\"building subjects...\");\n // console.log(\"subjects\", subjects);\n\n // create a subject executor\n return new SubjectExecutor(\n queryRunner,\n subjects,\n this.options,\n )\n }),\n )\n // console.timeEnd(\"building subject executors...\");\n\n // make sure we have at least one executable operation before we create a transaction and proceed\n // if we don't have operations it means we don't really need to update or remove something\n const executorsWithExecutableOperations = executors.filter(\n (executor) => executor.hasExecutableOperations,\n )\n if (executorsWithExecutableOperations.length === 0) return\n\n // start execute queries in a transaction\n // if transaction is already opened in this query runner then we don't touch it\n // if its not opened yet then we open it here, and once we finish - we close it\n let isTransactionStartedByUs = false\n try {\n // open transaction if its not opened yet\n if (!queryRunner.isTransactionActive) {\n if (!this.options || this.options.transaction !== false) {\n // start transaction until it was not explicitly disabled\n isTransactionStartedByUs = true\n await queryRunner.startTransaction()\n }\n }\n\n // execute all persistence operations for all entities we have\n // console.time(\"executing subject executors...\");\n for (const executor of executorsWithExecutableOperations) {\n await executor.execute()\n }\n // console.timeEnd(\"executing subject executors...\");\n\n // commit transaction if it was started by us\n // console.time(\"commit\");\n if (isTransactionStartedByUs === true)\n await queryRunner.commitTransaction()\n // console.timeEnd(\"commit\");\n } catch (error) {\n // rollback transaction if it was started by us\n if (isTransactionStartedByUs) {\n try {\n await queryRunner.rollbackTransaction()\n } catch (rollbackError) {}\n }\n throw error\n }\n } finally {\n queryRunner.data = oldQueryRunnerData\n\n // release query runner only if its created by us\n if (!this.queryRunner) await queryRunner.release()\n }\n }\n}\n"],"sourceRoot":".."}
@@ -72,6 +72,15 @@ export declare class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
72
72
  orIgnore(statement?: string | boolean): this;
73
73
  /**
74
74
  * @deprecated
75
+ *
76
+ * `.orUpdate({ columns: [ "is_updated" ] }).setParameter("is_updated", value)`
77
+ *
78
+ * is now `.orUpdate(["is_updated"])`
79
+ *
80
+ * `.orUpdate({ conflict_target: ['date'], overwrite: ['title'] })`
81
+ *
82
+ * is now `.orUpdate(['title'], ['date'])`
83
+ *
75
84
  */
76
85
  orUpdate(statement?: {
77
86
  columns?: string[];
@@ -255,7 +255,7 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
255
255
  }
256
256
  query += `INTO ${tableName}`;
257
257
  if (this.alias !== this.getMainTableName() &&
258
- this.connection.driver.options.type === "postgres") {
258
+ DriverUtils_1.DriverUtils.isPostgresFamily(this.connection.driver)) {
259
259
  query += ` AS "${this.alias}"`;
260
260
  }
261
261
  // add columns expression
@@ -327,7 +327,7 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
327
327
  }
328
328
  if (Array.isArray(overwrite) &&
329
329
  skipUpdateIfNoValuesChanged &&
330
- this.connection.driver.options.type === "postgres") {
330
+ DriverUtils_1.DriverUtils.isPostgresFamily(this.connection.driver)) {
331
331
  query += ` WHERE (`;
332
332
  query += overwrite
333
333
  .map((column) => `${tableName}.${this.escape(column)} IS DISTINCT FROM EXCLUDED.${this.escape(column)}`)
@@ -363,7 +363,7 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
363
363
  }
364
364
  // add RETURNING expression
365
365
  if (returningExpression &&
366
- (this.connection.driver.options.type === "postgres" ||
366
+ (DriverUtils_1.DriverUtils.isPostgresFamily(this.connection.driver) ||
367
367
  this.connection.driver.options.type === "oracle" ||
368
368
  this.connection.driver.options.type === "cockroachdb" ||
369
369
  DriverUtils_1.DriverUtils.isMySQLFamily(this.connection.driver))) {
@@ -558,8 +558,7 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
558
558
  expression += `${geomFromText}(${paramName})`;
559
559
  }
560
560
  }
561
- else if (this.connection.driver.options.type ===
562
- "postgres" &&
561
+ else if (DriverUtils_1.DriverUtils.isPostgresFamily(this.connection.driver) &&
563
562
  this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
564
563
  if (column.srid != null) {
565
564
  expression += `ST_SetSRID(ST_GeomFromGeoJSON(${paramName}), ${column.srid})::${column.type}`;