typeorm 0.3.5-dev.ec6c119 → 0.3.6-dev.0659ec3

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 (443) hide show
  1. package/README.md +37 -15
  2. package/browser/cache/DbQueryResultCache.js +9 -1
  3. package/browser/cache/DbQueryResultCache.js.map +1 -1
  4. package/browser/cache/RedisQueryResultCache.js +3 -0
  5. package/browser/cache/RedisQueryResultCache.js.map +1 -1
  6. package/browser/cli-ts-node-commonjs.d.ts +1 -1
  7. package/browser/cli-ts-node-commonjs.js +2 -1
  8. package/browser/cli-ts-node-commonjs.js.map +1 -1
  9. package/browser/cli-ts-node-esm.d.ts +2 -2
  10. package/browser/cli-ts-node-esm.js +19 -2
  11. package/browser/cli-ts-node-esm.js.map +1 -1
  12. package/browser/common/DeepPartial.d.ts +2 -2
  13. package/browser/common/DeepPartial.js.map +1 -1
  14. package/browser/data-source/BaseDataSourceOptions.d.ts +1 -2
  15. package/browser/data-source/BaseDataSourceOptions.js.map +1 -1
  16. package/browser/data-source/DataSource.js +2 -5
  17. package/browser/data-source/DataSource.js.map +1 -1
  18. package/browser/data-source/DataSourceOptions.d.ts +2 -1
  19. package/browser/data-source/DataSourceOptions.js.map +1 -1
  20. package/browser/decorator/Index.js +1 -0
  21. package/browser/decorator/Index.js.map +1 -1
  22. package/browser/decorator/columns/PrimaryColumn.js +4 -1
  23. package/browser/decorator/columns/PrimaryColumn.js.map +1 -1
  24. package/browser/decorator/options/ColumnOptions.d.ts +11 -2
  25. package/browser/decorator/options/ColumnOptions.js.map +1 -1
  26. package/browser/decorator/options/IndexOptions.d.ts +8 -0
  27. package/browser/decorator/options/IndexOptions.js.map +1 -1
  28. package/browser/decorator/options/JoinColumnOptions.d.ts +4 -0
  29. package/browser/decorator/options/JoinColumnOptions.js.map +1 -1
  30. package/browser/decorator/options/PrimaryGeneratedColumnIdentityOptions.d.ts +4 -0
  31. package/browser/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
  32. package/browser/decorator/options/PrimaryGeneratedColumnNumericOptions.d.ts +4 -0
  33. package/browser/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
  34. package/browser/decorator/options/PrimaryGeneratedColumnUUIDOptions.d.ts +4 -0
  35. package/browser/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
  36. package/browser/decorator/relations/JoinColumn.js +1 -0
  37. package/browser/decorator/relations/JoinColumn.js.map +1 -1
  38. package/browser/driver/DriverFactory.js +4 -0
  39. package/browser/driver/DriverFactory.js.map +1 -1
  40. package/browser/driver/DriverUtils.d.ts +1 -0
  41. package/browser/driver/DriverUtils.js +3 -0
  42. package/browser/driver/DriverUtils.js.map +1 -1
  43. package/browser/driver/aurora-mysql/AuroraMysqlDriver.d.ts +1 -1
  44. package/browser/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
  45. package/browser/driver/cockroachdb/CockroachDriver.js +4 -1
  46. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  47. package/browser/driver/cockroachdb/CockroachQueryRunner.d.ts +3 -3
  48. package/browser/driver/cockroachdb/CockroachQueryRunner.js +233 -33
  49. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  50. package/browser/driver/cordova/CordovaDriver.js +1 -1
  51. package/browser/driver/cordova/CordovaDriver.js.map +1 -1
  52. package/browser/driver/cordova/CordovaQueryRunner.js +2 -2
  53. package/browser/driver/cordova/CordovaQueryRunner.js.map +1 -1
  54. package/browser/driver/expo/ExpoDriver.js +1 -1
  55. package/browser/driver/expo/ExpoDriver.js.map +1 -1
  56. package/browser/driver/expo/ExpoQueryRunner.js +2 -2
  57. package/browser/driver/expo/ExpoQueryRunner.js.map +1 -1
  58. package/browser/driver/mongodb/typings.d.ts +5 -5
  59. package/browser/driver/mongodb/typings.js.map +1 -1
  60. package/browser/driver/mysql/MysqlDriver.d.ts +1 -0
  61. package/browser/driver/mysql/MysqlDriver.js +94 -23
  62. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  63. package/browser/driver/mysql/MysqlQueryRunner.js +219 -24
  64. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  65. package/browser/driver/nativescript/NativescriptDriver.js +1 -1
  66. package/browser/driver/nativescript/NativescriptDriver.js.map +1 -1
  67. package/browser/driver/oracle/OracleDriver.js +79 -15
  68. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  69. package/browser/driver/oracle/OracleQueryRunner.d.ts +3 -3
  70. package/browser/driver/oracle/OracleQueryRunner.js +216 -42
  71. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  72. package/browser/driver/postgres/PostgresDriver.js +96 -22
  73. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  74. package/browser/driver/postgres/PostgresQueryRunner.d.ts +3 -3
  75. package/browser/driver/postgres/PostgresQueryRunner.js +159 -59
  76. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  77. package/browser/driver/react-native/ReactNativeDriver.js +1 -1
  78. package/browser/driver/react-native/ReactNativeDriver.js.map +1 -1
  79. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
  80. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js +3 -0
  81. package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
  82. package/browser/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
  83. package/browser/driver/spanner/SpannerConnectionOptions.js +3 -0
  84. package/browser/driver/spanner/SpannerConnectionOptions.js.map +1 -0
  85. package/browser/driver/spanner/SpannerDriver.d.ts +241 -0
  86. package/browser/driver/spanner/SpannerDriver.js +604 -0
  87. package/browser/driver/spanner/SpannerDriver.js.map +1 -0
  88. package/browser/driver/spanner/SpannerQueryRunner.d.ts +350 -0
  89. package/browser/driver/spanner/SpannerQueryRunner.js +1445 -0
  90. package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -0
  91. package/browser/driver/sqlite/SqliteDriver.js +3 -3
  92. package/browser/driver/sqlite/SqliteDriver.js.map +1 -1
  93. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +65 -16
  94. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  95. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +220 -34
  96. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  97. package/browser/driver/sqljs/SqljsDriver.js +1 -1
  98. package/browser/driver/sqljs/SqljsDriver.js.map +1 -1
  99. package/browser/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  100. package/browser/driver/sqlserver/SqlServerDriver.js +99 -26
  101. package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
  102. package/browser/driver/sqlserver/SqlServerQueryRunner.d.ts +3 -3
  103. package/browser/driver/sqlserver/SqlServerQueryRunner.js +251 -37
  104. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  105. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryAccessTokenAuthentication.d.ts +1 -1
  106. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryAccessTokenAuthentication.js.map +1 -1
  107. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryMsiAppServiceAuthentication.d.ts +2 -2
  108. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryMsiAppServiceAuthentication.js.map +1 -1
  109. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryMsiVmAuthentication.d.ts +2 -2
  110. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryMsiVmAuthentication.js.map +1 -1
  111. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryPasswordAuthentication.d.ts +2 -2
  112. package/browser/driver/sqlserver/authentication/AzureActiveDirectoryPasswordAuthentication.js.map +1 -1
  113. package/browser/driver/types/ColumnTypes.d.ts +1 -1
  114. package/browser/driver/types/ColumnTypes.js.map +1 -1
  115. package/browser/driver/types/DatabaseType.d.ts +1 -1
  116. package/browser/driver/types/DatabaseType.js.map +1 -1
  117. package/browser/entity-manager/EntityManager.js +1 -1
  118. package/browser/entity-manager/EntityManager.js.map +1 -1
  119. package/browser/entity-schema/EntitySchemaColumnOptions.d.ts +6 -2
  120. package/browser/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  121. package/browser/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
  122. package/browser/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
  123. package/browser/entity-schema/EntitySchemaTransformer.js +3 -0
  124. package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
  125. package/browser/find-options/FindOneOptions.d.ts +1 -1
  126. package/browser/find-options/FindOneOptions.js.map +1 -1
  127. package/browser/find-options/FindOptionsUtils.d.ts +2 -1
  128. package/browser/find-options/FindOptionsUtils.js +2 -1
  129. package/browser/find-options/FindOptionsUtils.js.map +1 -1
  130. package/browser/index.d.ts +4 -0
  131. package/browser/index.js +3 -0
  132. package/browser/index.js.map +1 -1
  133. package/browser/logger/AdvancedConsoleLogger.d.ts +1 -1
  134. package/browser/logger/AdvancedConsoleLogger.js +1 -1
  135. package/browser/logger/AdvancedConsoleLogger.js.map +1 -1
  136. package/browser/metadata/ColumnMetadata.d.ts +10 -2
  137. package/browser/metadata/ColumnMetadata.js +8 -0
  138. package/browser/metadata/ColumnMetadata.js.map +1 -1
  139. package/browser/metadata/EntityMetadata.js +1 -1
  140. package/browser/metadata/EntityMetadata.js.map +1 -1
  141. package/browser/metadata/ForeignKeyMetadata.d.ts +7 -0
  142. package/browser/metadata/ForeignKeyMetadata.js +4 -1
  143. package/browser/metadata/ForeignKeyMetadata.js.map +1 -1
  144. package/browser/metadata/IndexMetadata.d.ts +8 -0
  145. package/browser/metadata/IndexMetadata.js +9 -0
  146. package/browser/metadata/IndexMetadata.js.map +1 -1
  147. package/browser/metadata-args/IndexMetadataArgs.d.ts +8 -0
  148. package/browser/metadata-args/IndexMetadataArgs.js.map +1 -1
  149. package/browser/metadata-args/JoinColumnMetadataArgs.d.ts +4 -0
  150. package/browser/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
  151. package/browser/metadata-builder/EntityMetadataBuilder.js +13 -6
  152. package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  153. package/browser/metadata-builder/EntityMetadataValidator.js +17 -0
  154. package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
  155. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +18 -6
  156. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  157. package/browser/metadata-builder/RelationJoinColumnBuilder.js +2 -0
  158. package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  159. package/browser/migration/MigrationExecutor.js +1 -1
  160. package/browser/migration/MigrationExecutor.js.map +1 -1
  161. package/browser/persistence/EntityPersistExecutor.js +12 -1
  162. package/browser/persistence/EntityPersistExecutor.js.map +1 -1
  163. package/browser/persistence/SubjectDatabaseEntityLoader.d.ts +1 -1
  164. package/browser/persistence/SubjectDatabaseEntityLoader.js +1 -1
  165. package/browser/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
  166. package/browser/persistence/SubjectExecutor.js +1 -1
  167. package/browser/persistence/SubjectExecutor.js.map +1 -1
  168. package/browser/persistence/subject-builder/CascadesSubjectBuilder.d.ts +1 -1
  169. package/browser/persistence/subject-builder/CascadesSubjectBuilder.js +1 -1
  170. package/browser/persistence/subject-builder/CascadesSubjectBuilder.js.map +1 -1
  171. package/browser/persistence/subject-builder/ManyToManySubjectBuilder.js +1 -1
  172. package/browser/persistence/subject-builder/ManyToManySubjectBuilder.js.map +1 -1
  173. package/browser/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.js +1 -1
  174. package/browser/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.js.map +1 -1
  175. package/browser/platform/PlatformTools.js +5 -0
  176. package/browser/platform/PlatformTools.js.map +1 -1
  177. package/browser/query-builder/InsertQueryBuilder.d.ts +9 -0
  178. package/browser/query-builder/InsertQueryBuilder.js +19 -8
  179. package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
  180. package/browser/query-builder/QueryBuilder.d.ts +1 -1
  181. package/browser/query-builder/QueryBuilder.js +3 -5
  182. package/browser/query-builder/QueryBuilder.js.map +1 -1
  183. package/browser/query-builder/QueryExpressionMap.d.ts +2 -2
  184. package/browser/query-builder/QueryExpressionMap.js +1 -1
  185. package/browser/query-builder/QueryExpressionMap.js.map +1 -1
  186. package/browser/query-builder/ReturningResultsEntityUpdator.js +2 -2
  187. package/browser/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
  188. package/browser/query-builder/SelectQueryBuilder.d.ts +1 -1
  189. package/browser/query-builder/SelectQueryBuilder.js +25 -4
  190. package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
  191. package/browser/query-builder/UpdateQueryBuilder.js +18 -7
  192. package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
  193. package/browser/query-runner/BaseQueryRunner.d.ts +10 -0
  194. package/browser/query-runner/BaseQueryRunner.js +25 -1
  195. package/browser/query-runner/BaseQueryRunner.js.map +1 -1
  196. package/browser/query-runner/QueryRunner.d.ts +2 -2
  197. package/browser/query-runner/QueryRunner.js.map +1 -1
  198. package/browser/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  199. package/browser/schema-builder/RdbmsSchemaBuilder.js +26 -6
  200. package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  201. package/browser/schema-builder/options/TableColumnOptions.d.ts +10 -2
  202. package/browser/schema-builder/options/TableColumnOptions.js.map +1 -1
  203. package/browser/schema-builder/options/TableIndexOptions.d.ts +8 -0
  204. package/browser/schema-builder/options/TableIndexOptions.js.map +1 -1
  205. package/browser/schema-builder/table/TableColumn.d.ts +6 -2
  206. package/browser/schema-builder/table/TableColumn.js +2 -0
  207. package/browser/schema-builder/table/TableColumn.js.map +1 -1
  208. package/browser/schema-builder/table/TableIndex.d.ts +8 -0
  209. package/browser/schema-builder/table/TableIndex.js +3 -0
  210. package/browser/schema-builder/table/TableIndex.js.map +1 -1
  211. package/browser/schema-builder/util/TableUtils.js +1 -0
  212. package/browser/schema-builder/util/TableUtils.js.map +1 -1
  213. package/browser/util/OrmUtils.d.ts +1 -1
  214. package/browser/util/OrmUtils.js +4 -4
  215. package/browser/util/OrmUtils.js.map +1 -1
  216. package/browser/util/escapeRegExp.d.ts +1 -0
  217. package/browser/util/escapeRegExp.js +6 -0
  218. package/browser/util/escapeRegExp.js.map +1 -0
  219. package/cache/DbQueryResultCache.js +9 -1
  220. package/cache/DbQueryResultCache.js.map +1 -1
  221. package/cache/RedisQueryResultCache.js +3 -0
  222. package/cache/RedisQueryResultCache.js.map +1 -1
  223. package/cli-ts-node-commonjs.d.ts +1 -1
  224. package/cli-ts-node-commonjs.js +2 -1
  225. package/cli-ts-node-commonjs.js.map +1 -1
  226. package/cli-ts-node-esm.d.ts +2 -2
  227. package/cli-ts-node-esm.js +19 -2
  228. package/cli-ts-node-esm.js.map +1 -1
  229. package/commands/CommandUtils.js +1 -1
  230. package/commands/CommandUtils.js.map +1 -1
  231. package/commands/InitCommand.js +2 -2
  232. package/commands/InitCommand.js.map +1 -1
  233. package/commands/MigrationGenerateCommand.js +3 -2
  234. package/commands/MigrationGenerateCommand.js.map +1 -1
  235. package/common/DeepPartial.d.ts +2 -2
  236. package/common/DeepPartial.js.map +1 -1
  237. package/data-source/BaseDataSourceOptions.d.ts +1 -2
  238. package/data-source/BaseDataSourceOptions.js.map +1 -1
  239. package/data-source/DataSource.js +17 -20
  240. package/data-source/DataSource.js.map +1 -1
  241. package/data-source/DataSourceOptions.d.ts +2 -1
  242. package/data-source/DataSourceOptions.js.map +1 -1
  243. package/decorator/Index.js +1 -0
  244. package/decorator/Index.js.map +1 -1
  245. package/decorator/columns/PrimaryColumn.js +4 -1
  246. package/decorator/columns/PrimaryColumn.js.map +1 -1
  247. package/decorator/options/ColumnOptions.d.ts +11 -2
  248. package/decorator/options/ColumnOptions.js.map +1 -1
  249. package/decorator/options/IndexOptions.d.ts +8 -0
  250. package/decorator/options/IndexOptions.js.map +1 -1
  251. package/decorator/options/JoinColumnOptions.d.ts +4 -0
  252. package/decorator/options/JoinColumnOptions.js.map +1 -1
  253. package/decorator/options/PrimaryGeneratedColumnIdentityOptions.d.ts +4 -0
  254. package/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
  255. package/decorator/options/PrimaryGeneratedColumnNumericOptions.d.ts +4 -0
  256. package/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
  257. package/decorator/options/PrimaryGeneratedColumnUUIDOptions.d.ts +4 -0
  258. package/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
  259. package/decorator/relations/JoinColumn.js +1 -0
  260. package/decorator/relations/JoinColumn.js.map +1 -1
  261. package/driver/DriverFactory.js +4 -0
  262. package/driver/DriverFactory.js.map +1 -1
  263. package/driver/DriverUtils.d.ts +1 -0
  264. package/driver/DriverUtils.js +3 -0
  265. package/driver/DriverUtils.js.map +1 -1
  266. package/driver/aurora-mysql/AuroraMysqlDriver.d.ts +1 -1
  267. package/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
  268. package/driver/cockroachdb/CockroachDriver.js +4 -1
  269. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  270. package/driver/cockroachdb/CockroachQueryRunner.d.ts +3 -3
  271. package/driver/cockroachdb/CockroachQueryRunner.js +233 -33
  272. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  273. package/driver/cordova/CordovaDriver.js +1 -1
  274. package/driver/cordova/CordovaDriver.js.map +1 -1
  275. package/driver/cordova/CordovaQueryRunner.js +2 -2
  276. package/driver/cordova/CordovaQueryRunner.js.map +1 -1
  277. package/driver/expo/ExpoDriver.js +1 -1
  278. package/driver/expo/ExpoDriver.js.map +1 -1
  279. package/driver/expo/ExpoQueryRunner.js +2 -2
  280. package/driver/expo/ExpoQueryRunner.js.map +1 -1
  281. package/driver/mongodb/typings.d.ts +5 -5
  282. package/driver/mongodb/typings.js.map +1 -1
  283. package/driver/mysql/MysqlDriver.d.ts +1 -0
  284. package/driver/mysql/MysqlDriver.js +94 -23
  285. package/driver/mysql/MysqlDriver.js.map +1 -1
  286. package/driver/mysql/MysqlQueryRunner.js +219 -24
  287. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  288. package/driver/nativescript/NativescriptDriver.js +1 -1
  289. package/driver/nativescript/NativescriptDriver.js.map +1 -1
  290. package/driver/oracle/OracleDriver.js +79 -15
  291. package/driver/oracle/OracleDriver.js.map +1 -1
  292. package/driver/oracle/OracleQueryRunner.d.ts +3 -3
  293. package/driver/oracle/OracleQueryRunner.js +216 -42
  294. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  295. package/driver/postgres/PostgresDriver.js +96 -22
  296. package/driver/postgres/PostgresDriver.js.map +1 -1
  297. package/driver/postgres/PostgresQueryRunner.d.ts +3 -3
  298. package/driver/postgres/PostgresQueryRunner.js +159 -59
  299. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  300. package/driver/react-native/ReactNativeDriver.js +1 -1
  301. package/driver/react-native/ReactNativeDriver.js.map +1 -1
  302. package/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
  303. package/driver/spanner/SpannerConnectionCredentialsOptions.js +4 -0
  304. package/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
  305. package/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
  306. package/driver/spanner/SpannerConnectionOptions.js +4 -0
  307. package/driver/spanner/SpannerConnectionOptions.js.map +1 -0
  308. package/driver/spanner/SpannerDriver.d.ts +241 -0
  309. package/driver/spanner/SpannerDriver.js +608 -0
  310. package/driver/spanner/SpannerDriver.js.map +1 -0
  311. package/driver/spanner/SpannerQueryRunner.d.ts +350 -0
  312. package/driver/spanner/SpannerQueryRunner.js +1449 -0
  313. package/driver/spanner/SpannerQueryRunner.js.map +1 -0
  314. package/driver/sqlite/SqliteDriver.js +3 -3
  315. package/driver/sqlite/SqliteDriver.js.map +1 -1
  316. package/driver/sqlite-abstract/AbstractSqliteDriver.js +65 -16
  317. package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  318. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +220 -34
  319. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  320. package/driver/sqljs/SqljsDriver.js +1 -1
  321. package/driver/sqljs/SqljsDriver.js.map +1 -1
  322. package/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  323. package/driver/sqlserver/SqlServerDriver.js +99 -26
  324. package/driver/sqlserver/SqlServerDriver.js.map +1 -1
  325. package/driver/sqlserver/SqlServerQueryRunner.d.ts +3 -3
  326. package/driver/sqlserver/SqlServerQueryRunner.js +251 -37
  327. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  328. package/driver/sqlserver/authentication/AzureActiveDirectoryAccessTokenAuthentication.d.ts +1 -1
  329. package/driver/sqlserver/authentication/AzureActiveDirectoryAccessTokenAuthentication.js.map +1 -1
  330. package/driver/sqlserver/authentication/AzureActiveDirectoryMsiAppServiceAuthentication.d.ts +2 -2
  331. package/driver/sqlserver/authentication/AzureActiveDirectoryMsiAppServiceAuthentication.js.map +1 -1
  332. package/driver/sqlserver/authentication/AzureActiveDirectoryMsiVmAuthentication.d.ts +2 -2
  333. package/driver/sqlserver/authentication/AzureActiveDirectoryMsiVmAuthentication.js.map +1 -1
  334. package/driver/sqlserver/authentication/AzureActiveDirectoryPasswordAuthentication.d.ts +2 -2
  335. package/driver/sqlserver/authentication/AzureActiveDirectoryPasswordAuthentication.js.map +1 -1
  336. package/driver/types/ColumnTypes.d.ts +1 -1
  337. package/driver/types/ColumnTypes.js.map +1 -1
  338. package/driver/types/DatabaseType.d.ts +1 -1
  339. package/driver/types/DatabaseType.js.map +1 -1
  340. package/entity-manager/EntityManager.js +1 -1
  341. package/entity-manager/EntityManager.js.map +1 -1
  342. package/entity-schema/EntitySchemaColumnOptions.d.ts +6 -2
  343. package/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  344. package/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
  345. package/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
  346. package/entity-schema/EntitySchemaTransformer.js +3 -0
  347. package/entity-schema/EntitySchemaTransformer.js.map +1 -1
  348. package/find-options/FindOneOptions.d.ts +1 -1
  349. package/find-options/FindOneOptions.js.map +1 -1
  350. package/find-options/FindOptionsUtils.d.ts +2 -1
  351. package/find-options/FindOptionsUtils.js +2 -1
  352. package/find-options/FindOptionsUtils.js.map +1 -1
  353. package/index.d.ts +4 -0
  354. package/index.js +3 -0
  355. package/index.js.map +1 -1
  356. package/index.mjs +6 -0
  357. package/logger/AdvancedConsoleLogger.d.ts +1 -1
  358. package/logger/AdvancedConsoleLogger.js +1 -1
  359. package/logger/AdvancedConsoleLogger.js.map +1 -1
  360. package/metadata/ColumnMetadata.d.ts +10 -2
  361. package/metadata/ColumnMetadata.js +8 -0
  362. package/metadata/ColumnMetadata.js.map +1 -1
  363. package/metadata/EntityMetadata.js +1 -1
  364. package/metadata/EntityMetadata.js.map +1 -1
  365. package/metadata/ForeignKeyMetadata.d.ts +7 -0
  366. package/metadata/ForeignKeyMetadata.js +4 -1
  367. package/metadata/ForeignKeyMetadata.js.map +1 -1
  368. package/metadata/IndexMetadata.d.ts +8 -0
  369. package/metadata/IndexMetadata.js +9 -0
  370. package/metadata/IndexMetadata.js.map +1 -1
  371. package/metadata-args/IndexMetadataArgs.d.ts +8 -0
  372. package/metadata-args/IndexMetadataArgs.js.map +1 -1
  373. package/metadata-args/JoinColumnMetadataArgs.d.ts +4 -0
  374. package/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
  375. package/metadata-builder/EntityMetadataBuilder.js +13 -6
  376. package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  377. package/metadata-builder/EntityMetadataValidator.js +17 -0
  378. package/metadata-builder/EntityMetadataValidator.js.map +1 -1
  379. package/metadata-builder/JunctionEntityMetadataBuilder.js +18 -6
  380. package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  381. package/metadata-builder/RelationJoinColumnBuilder.js +2 -0
  382. package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  383. package/migration/MigrationExecutor.js +1 -1
  384. package/migration/MigrationExecutor.js.map +1 -1
  385. package/package.json +1 -1
  386. package/persistence/EntityPersistExecutor.js +12 -1
  387. package/persistence/EntityPersistExecutor.js.map +1 -1
  388. package/persistence/SubjectDatabaseEntityLoader.d.ts +1 -1
  389. package/persistence/SubjectDatabaseEntityLoader.js +1 -1
  390. package/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
  391. package/persistence/SubjectExecutor.js +1 -1
  392. package/persistence/SubjectExecutor.js.map +1 -1
  393. package/persistence/subject-builder/CascadesSubjectBuilder.d.ts +1 -1
  394. package/persistence/subject-builder/CascadesSubjectBuilder.js +1 -1
  395. package/persistence/subject-builder/CascadesSubjectBuilder.js.map +1 -1
  396. package/persistence/subject-builder/ManyToManySubjectBuilder.js +1 -1
  397. package/persistence/subject-builder/ManyToManySubjectBuilder.js.map +1 -1
  398. package/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.js +1 -1
  399. package/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.js.map +1 -1
  400. package/platform/PlatformTools.js +5 -0
  401. package/platform/PlatformTools.js.map +1 -1
  402. package/query-builder/InsertQueryBuilder.d.ts +9 -0
  403. package/query-builder/InsertQueryBuilder.js +19 -8
  404. package/query-builder/InsertQueryBuilder.js.map +1 -1
  405. package/query-builder/QueryBuilder.d.ts +1 -1
  406. package/query-builder/QueryBuilder.js +5 -7
  407. package/query-builder/QueryBuilder.js.map +1 -1
  408. package/query-builder/QueryExpressionMap.d.ts +2 -2
  409. package/query-builder/QueryExpressionMap.js +1 -1
  410. package/query-builder/QueryExpressionMap.js.map +1 -1
  411. package/query-builder/ReturningResultsEntityUpdator.js +2 -2
  412. package/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
  413. package/query-builder/SelectQueryBuilder.d.ts +1 -1
  414. package/query-builder/SelectQueryBuilder.js +25 -4
  415. package/query-builder/SelectQueryBuilder.js.map +1 -1
  416. package/query-builder/UpdateQueryBuilder.js +18 -7
  417. package/query-builder/UpdateQueryBuilder.js.map +1 -1
  418. package/query-runner/BaseQueryRunner.d.ts +10 -0
  419. package/query-runner/BaseQueryRunner.js +25 -1
  420. package/query-runner/BaseQueryRunner.js.map +1 -1
  421. package/query-runner/QueryRunner.d.ts +2 -2
  422. package/query-runner/QueryRunner.js.map +1 -1
  423. package/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  424. package/schema-builder/RdbmsSchemaBuilder.js +26 -6
  425. package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  426. package/schema-builder/options/TableColumnOptions.d.ts +10 -2
  427. package/schema-builder/options/TableColumnOptions.js.map +1 -1
  428. package/schema-builder/options/TableIndexOptions.d.ts +8 -0
  429. package/schema-builder/options/TableIndexOptions.js.map +1 -1
  430. package/schema-builder/table/TableColumn.d.ts +6 -2
  431. package/schema-builder/table/TableColumn.js +2 -0
  432. package/schema-builder/table/TableColumn.js.map +1 -1
  433. package/schema-builder/table/TableIndex.d.ts +8 -0
  434. package/schema-builder/table/TableIndex.js +3 -0
  435. package/schema-builder/table/TableIndex.js.map +1 -1
  436. package/schema-builder/util/TableUtils.js +1 -0
  437. package/schema-builder/util/TableUtils.js.map +1 -1
  438. package/util/OrmUtils.d.ts +1 -1
  439. package/util/OrmUtils.js +4 -4
  440. package/util/OrmUtils.js.map +1 -1
  441. package/util/escapeRegExp.d.ts +1 -0
  442. package/util/escapeRegExp.js +10 -0
  443. package/util/escapeRegExp.js.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/persistence/subject-builder/ManyToManySubjectBuilder.ts"],"names":[],"mappings":";;;AAAA,wCAAoC;AACpC,kDAA8C;AAI9C;;;;;;;GAOG;AACH,MAAa,wBAAwB;IACjC,wEAAwE;IACxE,cAAc;IACd,wEAAwE;IAExE,YAAsB,QAAmB;QAAnB,aAAQ,GAAR,QAAQ,CAAW;IAAG,CAAC;IAE7C,wEAAwE;IACxE,iBAAiB;IACjB,wEAAwE;IAExE;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,mGAAmG;YACnG,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAM;YAE3B,kGAAkG;YAClG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACtD,mDAAmD;gBACnD,IAAI,QAAQ,CAAC,kBAAkB,KAAK,KAAK;oBAAE,OAAM;gBAEjD,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YACnD,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAgB;QAC/B,6FAA6F;QAC7F,gFAAgF;QAChF,IAAI,CAAC,OAAO,CAAC,cAAc;YAAE,OAAM;QAEnC,kGAAkG;QAClG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACtD,mDAAmD;YACnD,IAAI,QAAQ,CAAC,kBAAkB,KAAK,KAAK;gBAAE,OAAM;YAEjD,8FAA8F;YAC9F,sGAAsG;YACtG,MAAM,kCAAkC,GACpC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,cAAe,CAAC,CAAA;YAEpD,mGAAmG;YACnG,kCAAkC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;gBACtD,MAAM,eAAe,GAAG,IAAI,iBAAO,CAAC;oBAChC,QAAQ,EAAE,QAAQ,CAAC,sBAAuB;oBAC1C,aAAa,EAAE,OAAO;oBACtB,aAAa,EAAE,IAAI;oBACnB,UAAU,EAAE,IAAI,CAAC,uBAAuB,CACpC,OAAO,EACP,QAAQ,EACR,UAAU,CACb;iBACJ,CAAC,CAAA;gBAEF,+FAA+F;gBAC/F,oDAAoD;gBACpD,yGAAyG;gBACzG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACvC,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC;IAED,wEAAwE;IACxE,oBAAoB;IACpB,wEAAwE;IAExE;;;;OAIG;IACO,uBAAuB,CAC7B,OAAgB,EAChB,QAA0B;QAE1B,4FAA4F;QAC5F,sGAAsG;QACtG,IAAI,wBAAwB,GAAoB,EAAE,CAAA;QAElD,oHAAoH;QACpH,0DAA0D;QAC1D,IAAI,OAAO,CAAC,cAAc;YACtB,wBAAwB,GAAG,QAAQ,CAAC,cAAc,CAC9C,OAAO,CAAC,cAAc,CACzB,CAAA;QAEL,kCAAkC;QAClC,kEAAkE;QAClE,IAAI,eAAe,GAAoB,QAAQ,CAAC,cAAc,CAC1D,OAAO,CAAC,MAAO,CAClB,CAAA;QACD,IAAI,eAAe,KAAK,IAAI;YACxB,2GAA2G;YAC3G,eAAe,GAAG,EAAE,CAAA;QACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,OAAM;QAE3C,sHAAsH;QACtH,eAAe,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;YACtC,wEAAwE;YAExE,8GAA8G;YAE9G,4FAA4F;YAC5F,+HAA+H;YAC/H,IAAI,0BAA0B,GAC1B,QAAQ,CAAC,qBAAsB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAA;YAEjE,kGAAkG;YAClG,MAAM,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBACxD,OAAO,OAAO,CAAC,MAAM,KAAK,aAAa,CAAA;YAC3C,CAAC,CAAC,CAAA;YAEF,6HAA6H;YAC7H,IAAI,oBAAoB;gBACpB,0BAA0B,GAAG,oBAAoB,CAAC,UAAU,CAAA;YAEhE,wFAAwF;YACxF,IAAI,CAAC,0BAA0B,EAAE;gBAC7B,6GAA6G;gBAC7G,uGAAuG;gBACvG,6FAA6F;gBAC7F,+GAA+G;gBAC/G,6GAA6G;gBAC7G,6BAA6B;gBAC7B,4HAA4H;gBAC5H,0GAA0G;gBAC1G,iFAAiF;gBACjF,IAAI,CAAC,oBAAoB;oBAAE,OAAM;aACpC;YAED,6CAA6C;YAC7C,qEAAqE;YACrE,MAAM,4BAA4B,GAAG,wBAAwB,CAAC,IAAI,CAC9D,CAAC,+BAA+B,EAAE,EAAE;gBAChC,OAAO,mBAAQ,CAAC,UAAU,CACtB,+BAA+B,EAC/B,0BAA0B,CAC7B,CAAA;YACL,CAAC,CACJ,CAAA;YAED,8HAA8H;YAC9H,IAAI,4BAA4B;gBAAE,OAAM;YAExC,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ;gBAChC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,oBAAoB,IAAI,aAAa,CAAA,CAAC,uDAAuD;YACnG,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ;gBAClC,CAAC,CAAC,oBAAoB,IAAI,aAAa;gBACvC,CAAC,CAAC,OAAO,CAAA,CAAC,sEAAsE;YAEpF,6DAA6D;YAC7D,MAAM,eAAe,GAAG,IAAI,iBAAO,CAAC;gBAChC,QAAQ,EAAE,QAAQ,CAAC,sBAAuB;gBAC1C,aAAa,EAAE,OAAO;gBACtB,aAAa,EAAE,IAAI;aACtB,CAAC,CAAA;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YAEnC,QAAQ,CAAC,sBAAuB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC7D,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC;oBAC5B,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,UAAU;oBACjB,sIAAsI;iBACzI,CAAC,CAAA;YACN,CAAC,CAAC,CAAA;YAEF,QAAQ,CAAC,sBAAuB,CAAC,cAAc,CAAC,OAAO,CACnD,CAAC,MAAM,EAAE,EAAE;gBACP,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC;oBAC5B,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,YAAY;oBACnB,wIAAwI;iBAC3I,CAAC,CAAA;YACN,CAAC,CACJ,CAAA;QACL,CAAC,CAAC,CAAA;QAEF,0FAA0F;QAC1F,MAAM,+BAA+B,GAAoB,EAAE,CAAA;QAC3D,eAAe,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;YACtC,gEAAgE;YAChE,IAAI,0BAA0B,GAC1B,QAAQ,CAAC,qBAAsB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAA;YAEjE,kGAAkG;YAClG,MAAM,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBACxD,OAAO,OAAO,CAAC,MAAM,KAAK,aAAa,CAAA;YAC3C,CAAC,CAAC,CAAA;YAEF,6HAA6H;YAC7H,IAAI,oBAAoB;gBACpB,0BAA0B,GAAG,oBAAoB,CAAC,UAAU,CAAA;YAEhE,IACI,0BAA0B,KAAK,SAAS;gBACxC,0BAA0B,KAAK,IAAI;gBAEnC,+BAA+B,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,6FAA6F;QAC7F,MAAM,wBAAwB,GAAG,wBAAwB,CAAC,MAAM,CAC5D,CAAC,eAAe,EAAE,EAAE;YAChB,OAAO,CAAC,+BAA+B,CAAC,IAAI,CACxC,CAAC,iBAAiB,EAAE,EAAE;gBAClB,OAAO,mBAAQ,CAAC,UAAU,CACtB,iBAAiB,EACjB,eAAe,CAClB,CAAA;YACL,CAAC,CACJ,CAAA;QACL,CAAC,CACJ,CAAA;QAED,+EAA+E;QAC/E,wBAAwB,CAAC,OAAO,CAAC,CAAC,uBAAuB,EAAE,EAAE;YACzD,MAAM,eAAe,GAAG,IAAI,iBAAO,CAAC;gBAChC,QAAQ,EAAE,QAAQ,CAAC,sBAAuB;gBAC1C,aAAa,EAAE,OAAO;gBACtB,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI,CAAC,uBAAuB,CACpC,OAAO,EACP,QAAQ,EACR,uBAAuB,CAC1B;aACJ,CAAC,CAAA;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;;OAGG;IACO,uBAAuB,CAC7B,OAAgB,EAChB,QAA0B,EAC1B,UAAyB;QAEzB,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAO,CAAC,CAAC,CAAC,UAAU,CAAA;QACvE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ;YACtC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,OAAO,CAAC,MAAO,CAAA;QAErB,MAAM,UAAU,GAAkB,EAAE,CAAA;QACpC,QAAQ,CAAC,sBAAuB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7D,mBAAQ,CAAC,SAAS,CACd,UAAU,EACV,MAAM,CAAC,cAAc,CACjB,MAAM,CAAC,gBAAiB,CAAC,cAAc,CAAC,cAAc,CAAC,CAC1D,CACJ,CAAA;QACL,CAAC,CAAC,CAAA;QACF,QAAQ,CAAC,sBAAuB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/D,mBAAQ,CAAC,SAAS,CACd,UAAU,EACV,MAAM,CAAC,cAAc,CACjB,MAAM,CAAC,gBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAC5D,CACJ,CAAA;QACL,CAAC,CAAC,CAAA;QACF,OAAO,UAAU,CAAA;IACrB,CAAC;CACJ;AA9QD,4DA8QC","file":"ManyToManySubjectBuilder.js","sourcesContent":["import { Subject } from \"../Subject\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\n\n/**\n * Builds operations needs to be executed for many-to-many relations of the given subjects.\n *\n * by example: post contains owner many-to-many relation with categories in the property called \"categories\", e.g.\n * @ManyToMany(type => Category, category => category.posts) categories: Category[]\n * If user adds categories into the post and saves post we need to bind them.\n * This operation requires updation of junction table.\n */\nexport class ManyToManySubjectBuilder {\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {}\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for any changes in the many-to-many relations of the subjects.\n */\n build(): void {\n this.subjects.forEach((subject) => {\n // if subject doesn't have entity then no need to find something that should be inserted or removed\n if (!subject.entity) return\n\n // go through all persistence enabled many-to-many relations and build subject operations for them\n subject.metadata.manyToManyRelations.forEach((relation) => {\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false) return\n\n this.buildForSubjectRelation(subject, relation)\n })\n })\n }\n\n /**\n * Builds operations for removal of all many-to-many records of all many-to-many relations of the given subject.\n */\n buildForAllRemoval(subject: Subject) {\n // if subject does not have a database entity then it means it does not exist in the database\n // if it does not exist in the database then we don't have anything for deletion\n if (!subject.databaseEntity) return\n\n // go through all persistence enabled many-to-many relations and build subject operations for them\n subject.metadata.manyToManyRelations.forEach((relation) => {\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false) return\n\n // get all related entities (actually related entity relation ids) bind to this subject entity\n // by example: returns category ids of the post we are currently working with (subject.entity is post)\n const relatedEntityRelationIdsInDatabase: ObjectLiteral[] =\n relation.getEntityValue(subject.databaseEntity!)\n\n // go through all related entities and create a new junction subject for each row in junction table\n relatedEntityRelationIdsInDatabase.forEach((relationId) => {\n const junctionSubject = new Subject({\n metadata: relation.junctionEntityMetadata!,\n parentSubject: subject,\n mustBeRemoved: true,\n identifier: this.buildJunctionIdentifier(\n subject,\n relation,\n relationId,\n ),\n })\n\n // we use unshift because we need to perform those operations before post deletion is performed\n // but post deletion was already added as an subject\n // this is temporary solution, later we need to implement proper sorting of subjects before their removal\n this.subjects.push(junctionSubject)\n })\n })\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for a given subject and relation.\n *\n * by example: subject is \"post\" entity we are saving here and relation is \"categories\" inside it here.\n */\n protected buildForSubjectRelation(\n subject: Subject,\n relation: RelationMetadata,\n ) {\n // load from db all relation ids of inverse entities that are \"bind\" to the subject's entity\n // this way we gonna check which relation ids are missing and which are new (e.g. inserted or removed)\n let databaseRelatedEntityIds: ObjectLiteral[] = []\n\n // if subject don't have database entity it means all related entities in persisted subject are new and must be bind\n // and we don't need to remove something that is not exist\n if (subject.databaseEntity)\n databaseRelatedEntityIds = relation.getEntityValue(\n subject.databaseEntity,\n )\n\n // extract entity's relation value\n // by example: categories inside our post (subject.entity is post)\n let relatedEntities: ObjectLiteral[] = relation.getEntityValue(\n subject.entity!,\n )\n if (relatedEntities === null)\n // if value set to null its equal if we set it to empty array - all items must be removed from the database\n relatedEntities = []\n if (!Array.isArray(relatedEntities)) return\n\n // from all related entities find only those which aren't found in the db - for them we will create operation subjects\n relatedEntities.forEach((relatedEntity) => {\n // by example: relatedEntity is category from categories saved with post\n\n // todo: check how it will work for entities which are saved by cascades, but aren't saved in the database yet\n\n // extract only relation id from the related entities, since we only need it for comparision\n // by example: extract from category only relation id (category id, or let's say category title, depend on join column options)\n let relatedEntityRelationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity)\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n const relatedEntitySubject = this.subjects.find((subject) => {\n return subject.entity === relatedEntity\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relatedEntityRelationIdMap = relatedEntitySubject.identifier\n\n // if related entity relation id map is empty it means related entity is newly persisted\n if (!relatedEntityRelationIdMap) {\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if related entity does not have a subject then it means user tries to bind entity which wasn't saved\n // in this persistence because he didn't pass this entity for save or he did not set cascades\n // but without entity being inserted we cannot bind it in the relation operation, so we throw an exception here\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if (!relatedEntitySubject)\n // throw new TypeORMError(`Many-to-many relation \"${relation.entityMetadata.name}.${relation.propertyPath}\" contains ` +\n // `entities which do not exist in the database yet, thus they cannot be bind in the database. ` +\n // `Please setup cascade insertion or save entities before binding it.`);\n if (!relatedEntitySubject) return\n }\n\n // try to find related entity in the database\n // by example: find post's category in the database post's categories\n const relatedEntityExistInDatabase = databaseRelatedEntityIds.find(\n (databaseRelatedEntityRelationId) => {\n return OrmUtils.compareIds(\n databaseRelatedEntityRelationId,\n relatedEntityRelationIdMap,\n )\n },\n )\n\n // if entity is found then don't do anything - it means binding in junction table already exist, we don't need to add anything\n if (relatedEntityExistInDatabase) return\n\n const ownerValue = relation.isOwning\n ? subject\n : relatedEntitySubject || relatedEntity // by example: ownerEntityMap is post from subject here\n const inverseValue = relation.isOwning\n ? relatedEntitySubject || relatedEntity\n : subject // by example: inverseEntityMap is category from categories array here\n\n // create a new subject for insert operation of junction rows\n const junctionSubject = new Subject({\n metadata: relation.junctionEntityMetadata!,\n parentSubject: subject,\n canBeInserted: true,\n })\n this.subjects.push(junctionSubject)\n\n relation.junctionEntityMetadata!.ownerColumns.forEach((column) => {\n junctionSubject.changeMaps.push({\n column: column,\n value: ownerValue,\n // valueFactory: (value) => column.referencedColumn!.getEntityValue(value) // column.referencedColumn!.getEntityValue(ownerEntityMap),\n })\n })\n\n relation.junctionEntityMetadata!.inverseColumns.forEach(\n (column) => {\n junctionSubject.changeMaps.push({\n column: column,\n value: inverseValue,\n // valueFactory: (value) => column.referencedColumn!.getEntityValue(value) // column.referencedColumn!.getEntityValue(inverseEntityMap),\n })\n },\n )\n })\n\n // get all inverse entities relation ids that are \"bind\" to the currently persisted entity\n const changedInverseEntityRelationIds: ObjectLiteral[] = []\n relatedEntities.forEach((relatedEntity) => {\n // relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity)\n let relatedEntityRelationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity)\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n const relatedEntitySubject = this.subjects.find((subject) => {\n return subject.entity === relatedEntity\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relatedEntityRelationIdMap = relatedEntitySubject.identifier\n\n if (\n relatedEntityRelationIdMap !== undefined &&\n relatedEntityRelationIdMap !== null\n )\n changedInverseEntityRelationIds.push(relatedEntityRelationIdMap)\n })\n\n // now from all entities in the persisted entity find only those which aren't found in the db\n const removedJunctionEntityIds = databaseRelatedEntityIds.filter(\n (existRelationId) => {\n return !changedInverseEntityRelationIds.find(\n (changedRelationId) => {\n return OrmUtils.compareIds(\n changedRelationId,\n existRelationId,\n )\n },\n )\n },\n )\n\n // finally create a new junction remove operations for missing related entities\n removedJunctionEntityIds.forEach((removedEntityRelationId) => {\n const junctionSubject = new Subject({\n metadata: relation.junctionEntityMetadata!,\n parentSubject: subject,\n mustBeRemoved: true,\n identifier: this.buildJunctionIdentifier(\n subject,\n relation,\n removedEntityRelationId,\n ),\n })\n this.subjects.push(junctionSubject)\n })\n }\n\n /**\n * Creates identifiers for junction table.\n * Example: { postId: 1, categoryId: 2 }\n */\n protected buildJunctionIdentifier(\n subject: Subject,\n relation: RelationMetadata,\n relationId: ObjectLiteral,\n ) {\n const ownerEntityMap = relation.isOwning ? subject.entity! : relationId\n const inverseEntityMap = relation.isOwning\n ? relationId\n : subject.entity!\n\n const identifier: ObjectLiteral = {}\n relation.junctionEntityMetadata!.ownerColumns.forEach((column) => {\n OrmUtils.mergeDeep(\n identifier,\n column.createValueMap(\n column.referencedColumn!.getEntityValue(ownerEntityMap),\n ),\n )\n })\n relation.junctionEntityMetadata!.inverseColumns.forEach((column) => {\n OrmUtils.mergeDeep(\n identifier,\n column.createValueMap(\n column.referencedColumn!.getEntityValue(inverseEntityMap),\n ),\n )\n })\n return identifier\n }\n}\n"],"sourceRoot":"../.."}
1
+ {"version":3,"sources":["../../src/persistence/subject-builder/ManyToManySubjectBuilder.ts"],"names":[],"mappings":"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","file":"ManyToManySubjectBuilder.js","sourcesContent":["import { Subject } from \"../Subject\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\n\n/**\n * Builds operations needs to be executed for many-to-many relations of the given subjects.\n *\n * by example: post contains owner many-to-many relation with categories in the property called \"categories\", e.g.\n * @ManyToMany(type => Category, category => category.posts) categories: Category[]\n * If user adds categories into the post and saves post we need to bind them.\n * This operation requires updation of junction table.\n */\nexport class ManyToManySubjectBuilder {\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {}\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for any changes in the many-to-many relations of the subjects.\n */\n build(): void {\n this.subjects.forEach((subject) => {\n // if subject doesn't have entity then no need to find something that should be inserted or removed\n if (!subject.entity) return\n\n // go through all persistence enabled many-to-many relations and build subject operations for them\n subject.metadata.manyToManyRelations.forEach((relation) => {\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false) return\n\n this.buildForSubjectRelation(subject, relation)\n })\n })\n }\n\n /**\n * Builds operations for removal of all many-to-many records of all many-to-many relations of the given subject.\n */\n buildForAllRemoval(subject: Subject) {\n // if subject does not have a database entity then it means it does not exist in the database\n // if it does not exist in the database then we don't have anything for deletion\n if (!subject.databaseEntity) return\n\n // go through all persistence enabled many-to-many relations and build subject operations for them\n subject.metadata.manyToManyRelations.forEach((relation) => {\n // skip relations for which persistence is disabled\n if (relation.persistenceEnabled === false) return\n\n // get all related entities (actually related entity relation ids) bind to this subject entity\n // by example: returns category ids of the post we are currently working with (subject.entity is post)\n const relatedEntityRelationIdsInDatabase: ObjectLiteral[] =\n relation.getEntityValue(subject.databaseEntity!)\n\n // go through all related entities and create a new junction subject for each row in junction table\n relatedEntityRelationIdsInDatabase.forEach((relationId) => {\n const junctionSubject = new Subject({\n metadata: relation.junctionEntityMetadata!,\n parentSubject: subject,\n mustBeRemoved: true,\n identifier: this.buildJunctionIdentifier(\n subject,\n relation,\n relationId,\n ),\n })\n\n // we use unshift because we need to perform those operations before post deletion is performed\n // but post deletion was already added as an subject\n // this is temporary solution, later we need to implement proper sorting of subjects before their removal\n this.subjects.push(junctionSubject)\n })\n })\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for a given subject and relation.\n *\n * by example: subject is \"post\" entity we are saving here and relation is \"categories\" inside it here.\n */\n protected buildForSubjectRelation(\n subject: Subject,\n relation: RelationMetadata,\n ) {\n // load from db all relation ids of inverse entities that are \"bind\" to the subject's entity\n // this way we gonna check which relation ids are missing and which are new (e.g. inserted or removed)\n let databaseRelatedEntityIds: ObjectLiteral[] = []\n\n // if subject don't have database entity it means all related entities in persisted subject are new and must be bind\n // and we don't need to remove something that is not exist\n if (subject.databaseEntity)\n databaseRelatedEntityIds = relation.getEntityValue(\n subject.databaseEntity,\n )\n\n // extract entity's relation value\n // by example: categories inside our post (subject.entity is post)\n let relatedEntities: ObjectLiteral[] = relation.getEntityValue(\n subject.entity!,\n )\n if (relatedEntities === null)\n // if value set to null its equal if we set it to empty array - all items must be removed from the database\n relatedEntities = []\n if (!Array.isArray(relatedEntities)) return\n\n // from all related entities find only those which aren't found in the db - for them we will create operation subjects\n relatedEntities.forEach((relatedEntity) => {\n // by example: relatedEntity is category from categories saved with post\n\n // todo: check how it will work for entities which are saved by cascades, but aren't saved in the database yet\n\n // extract only relation id from the related entities, since we only need it for comparison\n // by example: extract from category only relation id (category id, or let's say category title, depend on join column options)\n let relatedEntityRelationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity)\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n const relatedEntitySubject = this.subjects.find((subject) => {\n return subject.entity === relatedEntity\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relatedEntityRelationIdMap = relatedEntitySubject.identifier\n\n // if related entity relation id map is empty it means related entity is newly persisted\n if (!relatedEntityRelationIdMap) {\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if related entity does not have a subject then it means user tries to bind entity which wasn't saved\n // in this persistence because he didn't pass this entity for save or he did not set cascades\n // but without entity being inserted we cannot bind it in the relation operation, so we throw an exception here\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if (!relatedEntitySubject)\n // throw new TypeORMError(`Many-to-many relation \"${relation.entityMetadata.name}.${relation.propertyPath}\" contains ` +\n // `entities which do not exist in the database yet, thus they cannot be bind in the database. ` +\n // `Please setup cascade insertion or save entities before binding it.`);\n if (!relatedEntitySubject) return\n }\n\n // try to find related entity in the database\n // by example: find post's category in the database post's categories\n const relatedEntityExistInDatabase = databaseRelatedEntityIds.find(\n (databaseRelatedEntityRelationId) => {\n return OrmUtils.compareIds(\n databaseRelatedEntityRelationId,\n relatedEntityRelationIdMap,\n )\n },\n )\n\n // if entity is found then don't do anything - it means binding in junction table already exist, we don't need to add anything\n if (relatedEntityExistInDatabase) return\n\n const ownerValue = relation.isOwning\n ? subject\n : relatedEntitySubject || relatedEntity // by example: ownerEntityMap is post from subject here\n const inverseValue = relation.isOwning\n ? relatedEntitySubject || relatedEntity\n : subject // by example: inverseEntityMap is category from categories array here\n\n // create a new subject for insert operation of junction rows\n const junctionSubject = new Subject({\n metadata: relation.junctionEntityMetadata!,\n parentSubject: subject,\n canBeInserted: true,\n })\n this.subjects.push(junctionSubject)\n\n relation.junctionEntityMetadata!.ownerColumns.forEach((column) => {\n junctionSubject.changeMaps.push({\n column: column,\n value: ownerValue,\n // valueFactory: (value) => column.referencedColumn!.getEntityValue(value) // column.referencedColumn!.getEntityValue(ownerEntityMap),\n })\n })\n\n relation.junctionEntityMetadata!.inverseColumns.forEach(\n (column) => {\n junctionSubject.changeMaps.push({\n column: column,\n value: inverseValue,\n // valueFactory: (value) => column.referencedColumn!.getEntityValue(value) // column.referencedColumn!.getEntityValue(inverseEntityMap),\n })\n },\n )\n })\n\n // get all inverse entities relation ids that are \"bind\" to the currently persisted entity\n const changedInverseEntityRelationIds: ObjectLiteral[] = []\n relatedEntities.forEach((relatedEntity) => {\n // relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity)\n let relatedEntityRelationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity)\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n const relatedEntitySubject = this.subjects.find((subject) => {\n return subject.entity === relatedEntity\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relatedEntityRelationIdMap = relatedEntitySubject.identifier\n\n if (\n relatedEntityRelationIdMap !== undefined &&\n relatedEntityRelationIdMap !== null\n )\n changedInverseEntityRelationIds.push(relatedEntityRelationIdMap)\n })\n\n // now from all entities in the persisted entity find only those which aren't found in the db\n const removedJunctionEntityIds = databaseRelatedEntityIds.filter(\n (existRelationId) => {\n return !changedInverseEntityRelationIds.find(\n (changedRelationId) => {\n return OrmUtils.compareIds(\n changedRelationId,\n existRelationId,\n )\n },\n )\n },\n )\n\n // finally create a new junction remove operations for missing related entities\n removedJunctionEntityIds.forEach((removedEntityRelationId) => {\n const junctionSubject = new Subject({\n metadata: relation.junctionEntityMetadata!,\n parentSubject: subject,\n mustBeRemoved: true,\n identifier: this.buildJunctionIdentifier(\n subject,\n relation,\n removedEntityRelationId,\n ),\n })\n this.subjects.push(junctionSubject)\n })\n }\n\n /**\n * Creates identifiers for junction table.\n * Example: { postId: 1, categoryId: 2 }\n */\n protected buildJunctionIdentifier(\n subject: Subject,\n relation: RelationMetadata,\n relationId: ObjectLiteral,\n ) {\n const ownerEntityMap = relation.isOwning ? subject.entity! : relationId\n const inverseEntityMap = relation.isOwning\n ? relationId\n : subject.entity!\n\n const identifier: ObjectLiteral = {}\n relation.junctionEntityMetadata!.ownerColumns.forEach((column) => {\n OrmUtils.mergeDeep(\n identifier,\n column.createValueMap(\n column.referencedColumn!.getEntityValue(ownerEntityMap),\n ),\n )\n })\n relation.junctionEntityMetadata!.inverseColumns.forEach((column) => {\n OrmUtils.mergeDeep(\n identifier,\n column.createValueMap(\n column.referencedColumn!.getEntityValue(inverseEntityMap),\n ),\n )\n })\n return identifier\n }\n}\n"],"sourceRoot":"../.."}
@@ -86,7 +86,7 @@ class OneToOneInverseSideSubjectBuilder {
86
86
  }
87
87
  return;
88
88
  } // else means entity is bind in the database
89
- // extract only relation id from the related entities, since we only need it for comparision
89
+ // extract only relation id from the related entities, since we only need it for comparison
90
90
  // by example: extract from category only relation id (category id, or let's say category title, depend on join column options)
91
91
  let relationIdMap = relation.inverseEntityMetadata.getEntityIdMap(relatedEntity); // by example: relationIdMap is category.id map here, e.g. { id: ... }
92
92
  // try to find a subject of this related entity, maybe it was loaded or was marked for persistence
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.ts"],"names":[],"mappings":"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","file":"OneToOneInverseSideSubjectBuilder.js","sourcesContent":["import { Subject } from \"../Subject\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\n\n/**\n * Builds operations needs to be executed for one-to-one non-owner relations of the given subjects.\n *\n * by example: post contains one-to-one non-owner relation with category in the property called \"category\", e.g.\n * @OneToOne(type => Category, category => category.post) category: Category\n * If user sets a category into the post and saves post we need to bind them.\n * This operation requires updation of category table since its owner of the relation and contains a join column.\n *\n * note: this class shares lot of things with OneToManyUpdateBuilder, so when you change this class\n * make sure to reflect changes there as well.\n */\nexport class OneToOneInverseSideSubjectBuilder {\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {}\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds all required operations.\n */\n build(): void {\n this.subjects.forEach((subject) => {\n subject.metadata.oneToOneRelations.forEach((relation) => {\n // we don't need owning relations, this operation is only for inverse side of one-to-one relations\n // skip relations for which persistence is disabled\n if (relation.isOwning || relation.persistenceEnabled === false)\n return\n\n this.buildForSubjectRelation(subject, relation)\n })\n })\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for a given subject and relation.\n *\n * by example: subject is \"post\" entity we are saving here and relation is \"category\" inside it here.\n */\n protected buildForSubjectRelation(\n subject: Subject,\n relation: RelationMetadata,\n ) {\n // prepare objects (relation id map) for the database entity\n // note: subject.databaseEntity contains relation with loaded relation id only (id map)\n // by example: since subject is a post, we are expecting to get post's category saved in the database here,\n // particularly its relation id, e.g. category id stored in the database\n let relatedEntityDatabaseRelationId: ObjectLiteral | undefined =\n undefined\n if (subject.databaseEntity)\n // related entity in the database can exist only if this entity (post) is saved\n relatedEntityDatabaseRelationId = relation.getEntityValue(\n subject.databaseEntity,\n )\n\n // get related entities of persisted entity\n // by example: get category from the passed to persist post entity\n let relatedEntity: ObjectLiteral | null = relation.getEntityValue(\n subject.entity!,\n ) // by example: relatedEntity is a category here\n if (relatedEntity === undefined)\n // if relation is undefined then nothing to update\n return\n\n // if related entity is null then we need to check if there a bind in the database and unset it\n // if there is no bind in the entity then we don't need to do anything\n // by example: if post.category = null and category has this post in the database then we unset it\n if (relatedEntity === null) {\n // it makes sense to update database only there is a previously set value in the database\n if (relatedEntityDatabaseRelationId) {\n // todo: probably we can improve this in the future by finding entity with column those values,\n // todo: maybe it was already in persistence process. This is possible due to unique requirements of join columns\n // we create a new subject which operations will be executed in subject operation executor\n\n const removedRelatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n parentSubject: subject,\n canBeUpdated: true,\n identifier: relatedEntityDatabaseRelationId,\n changeMaps: [\n {\n relation: relation.inverseRelation!,\n value: null,\n },\n ],\n })\n this.subjects.push(removedRelatedEntitySubject)\n }\n\n return\n } // else means entity is bind in the database\n\n // extract only relation id from the related entities, since we only need it for comparision\n // by example: extract from category only relation id (category id, or let's say category title, depend on join column options)\n let relationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity) // by example: relationIdMap is category.id map here, e.g. { id: ... }\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n let relatedEntitySubject = this.subjects.find((operateSubject) => {\n return (\n !!operateSubject.entity &&\n operateSubject.entity === relatedEntity\n )\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relationIdMap = relatedEntitySubject.identifier\n\n // if relationIdMap is undefined then it means user binds object which is not saved in the database yet\n // by example: if post contains category which does not have id(s) yet (because its a new category)\n // it means its always newly inserted and relation update operation always must be created for it\n // it does not make sense to perform difference operation for it for both add and remove actions\n if (!relationIdMap) {\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if related entity does not have a subject then it means user tries to bind entity which wasn't saved\n // in this persistence because he didn't pass this entity for save or he did not set cascades\n // but without entity being inserted we cannot bind it in the relation operation, so we throw an exception here\n // if (!relatedEntitySubject)\n // throw new TypeORMError(`One-to-one inverse relation \"${relation.entityMetadata.name}.${relation.propertyPath}\" contains ` +\n // `entity which does not exist in the database yet, thus cannot be bind in the database. ` +\n // `Please setup cascade insertion or save entity before binding it.`);\n if (!relatedEntitySubject) return\n\n // okay, so related subject exist and its marked for insertion, then add a new change map\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is OneToOne owner relation inside Category\n // subject is Post needs to be inserted into Category\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n }\n\n // check if this binding really exist in the database\n // by example: find our post if its already bind to category in the database and its not equal to what user tries to set\n const areRelatedIdEqualWithDatabase =\n relatedEntityDatabaseRelationId &&\n OrmUtils.compareIds(relationIdMap, relatedEntityDatabaseRelationId)\n\n // if they aren't equal it means its a new relation and we need to \"bind\" them\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is ManyToOne relation inside Category\n // subject is Post needs to be inserted into Category\n if (!areRelatedIdEqualWithDatabase) {\n // if there is no relatedEntitySubject then it means \"category\" wasn't persisted,\n // but since we are going to update \"category\" table (since its an owning side of relation with join column)\n // we create a new subject here:\n if (!relatedEntitySubject) {\n relatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n canBeUpdated: true,\n identifier: relationIdMap,\n })\n this.subjects.push(relatedEntitySubject)\n }\n\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n }\n }\n}\n"],"sourceRoot":"../.."}
1
+ {"version":3,"sources":["../../src/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.ts"],"names":[],"mappings":"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","file":"OneToOneInverseSideSubjectBuilder.js","sourcesContent":["import { Subject } from \"../Subject\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { RelationMetadata } from \"../../metadata/RelationMetadata\"\n\n/**\n * Builds operations needs to be executed for one-to-one non-owner relations of the given subjects.\n *\n * by example: post contains one-to-one non-owner relation with category in the property called \"category\", e.g.\n * @OneToOne(type => Category, category => category.post) category: Category\n * If user sets a category into the post and saves post we need to bind them.\n * This operation requires updation of category table since its owner of the relation and contains a join column.\n *\n * note: this class shares lot of things with OneToManyUpdateBuilder, so when you change this class\n * make sure to reflect changes there as well.\n */\nexport class OneToOneInverseSideSubjectBuilder {\n // ---------------------------------------------------------------------\n // Constructor\n // ---------------------------------------------------------------------\n\n constructor(protected subjects: Subject[]) {}\n\n // ---------------------------------------------------------------------\n // Public Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds all required operations.\n */\n build(): void {\n this.subjects.forEach((subject) => {\n subject.metadata.oneToOneRelations.forEach((relation) => {\n // we don't need owning relations, this operation is only for inverse side of one-to-one relations\n // skip relations for which persistence is disabled\n if (relation.isOwning || relation.persistenceEnabled === false)\n return\n\n this.buildForSubjectRelation(subject, relation)\n })\n })\n }\n\n // ---------------------------------------------------------------------\n // Protected Methods\n // ---------------------------------------------------------------------\n\n /**\n * Builds operations for a given subject and relation.\n *\n * by example: subject is \"post\" entity we are saving here and relation is \"category\" inside it here.\n */\n protected buildForSubjectRelation(\n subject: Subject,\n relation: RelationMetadata,\n ) {\n // prepare objects (relation id map) for the database entity\n // note: subject.databaseEntity contains relation with loaded relation id only (id map)\n // by example: since subject is a post, we are expecting to get post's category saved in the database here,\n // particularly its relation id, e.g. category id stored in the database\n let relatedEntityDatabaseRelationId: ObjectLiteral | undefined =\n undefined\n if (subject.databaseEntity)\n // related entity in the database can exist only if this entity (post) is saved\n relatedEntityDatabaseRelationId = relation.getEntityValue(\n subject.databaseEntity,\n )\n\n // get related entities of persisted entity\n // by example: get category from the passed to persist post entity\n let relatedEntity: ObjectLiteral | null = relation.getEntityValue(\n subject.entity!,\n ) // by example: relatedEntity is a category here\n if (relatedEntity === undefined)\n // if relation is undefined then nothing to update\n return\n\n // if related entity is null then we need to check if there a bind in the database and unset it\n // if there is no bind in the entity then we don't need to do anything\n // by example: if post.category = null and category has this post in the database then we unset it\n if (relatedEntity === null) {\n // it makes sense to update database only there is a previously set value in the database\n if (relatedEntityDatabaseRelationId) {\n // todo: probably we can improve this in the future by finding entity with column those values,\n // todo: maybe it was already in persistence process. This is possible due to unique requirements of join columns\n // we create a new subject which operations will be executed in subject operation executor\n\n const removedRelatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n parentSubject: subject,\n canBeUpdated: true,\n identifier: relatedEntityDatabaseRelationId,\n changeMaps: [\n {\n relation: relation.inverseRelation!,\n value: null,\n },\n ],\n })\n this.subjects.push(removedRelatedEntitySubject)\n }\n\n return\n } // else means entity is bind in the database\n\n // extract only relation id from the related entities, since we only need it for comparison\n // by example: extract from category only relation id (category id, or let's say category title, depend on join column options)\n let relationIdMap =\n relation.inverseEntityMetadata!.getEntityIdMap(relatedEntity) // by example: relationIdMap is category.id map here, e.g. { id: ... }\n\n // try to find a subject of this related entity, maybe it was loaded or was marked for persistence\n let relatedEntitySubject = this.subjects.find((operateSubject) => {\n return (\n !!operateSubject.entity &&\n operateSubject.entity === relatedEntity\n )\n })\n\n // if subject with entity was found take subject identifier as relation id map since it may contain extra properties resolved\n if (relatedEntitySubject)\n relationIdMap = relatedEntitySubject.identifier\n\n // if relationIdMap is undefined then it means user binds object which is not saved in the database yet\n // by example: if post contains category which does not have id(s) yet (because its a new category)\n // it means its always newly inserted and relation update operation always must be created for it\n // it does not make sense to perform difference operation for it for both add and remove actions\n if (!relationIdMap) {\n // we decided to remove this error because it brings complications when saving object with non-saved entities\n // if related entity does not have a subject then it means user tries to bind entity which wasn't saved\n // in this persistence because he didn't pass this entity for save or he did not set cascades\n // but without entity being inserted we cannot bind it in the relation operation, so we throw an exception here\n // if (!relatedEntitySubject)\n // throw new TypeORMError(`One-to-one inverse relation \"${relation.entityMetadata.name}.${relation.propertyPath}\" contains ` +\n // `entity which does not exist in the database yet, thus cannot be bind in the database. ` +\n // `Please setup cascade insertion or save entity before binding it.`);\n if (!relatedEntitySubject) return\n\n // okay, so related subject exist and its marked for insertion, then add a new change map\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is OneToOne owner relation inside Category\n // subject is Post needs to be inserted into Category\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n }\n\n // check if this binding really exist in the database\n // by example: find our post if its already bind to category in the database and its not equal to what user tries to set\n const areRelatedIdEqualWithDatabase =\n relatedEntityDatabaseRelationId &&\n OrmUtils.compareIds(relationIdMap, relatedEntityDatabaseRelationId)\n\n // if they aren't equal it means its a new relation and we need to \"bind\" them\n // by example: this will tell category to insert into its post relation our post we are working with\n // relatedEntitySubject is newly inserted CategorySubject\n // relation.inverseRelation is ManyToOne relation inside Category\n // subject is Post needs to be inserted into Category\n if (!areRelatedIdEqualWithDatabase) {\n // if there is no relatedEntitySubject then it means \"category\" wasn't persisted,\n // but since we are going to update \"category\" table (since its an owning side of relation with join column)\n // we create a new subject here:\n if (!relatedEntitySubject) {\n relatedEntitySubject = new Subject({\n metadata: relation.inverseEntityMetadata,\n canBeUpdated: true,\n identifier: relationIdMap,\n })\n this.subjects.push(relatedEntitySubject)\n }\n\n relatedEntitySubject.changeMaps.push({\n relation: relation.inverseRelation!,\n value: subject,\n })\n }\n }\n}\n"],"sourceRoot":"../.."}
@@ -35,6 +35,11 @@ class PlatformTools {
35
35
  try {
36
36
  // switch case to explicit require statements for webpack compatibility.
37
37
  switch (name) {
38
+ /**
39
+ * spanner
40
+ */
41
+ case "spanner":
42
+ return require("@google-cloud/spanner");
38
43
  /**
39
44
  * mongodb
40
45
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/platform/PlatformTools.ts"],"names":[],"mappings":"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","file":"PlatformTools.js","sourcesContent":["import * as path from \"path\"\nimport * as fs from \"fs\"\nimport dotenv from \"dotenv\"\nimport chalk from \"chalk\"\nimport { highlight, Theme } from \"cli-highlight\"\n\nexport { ReadStream } from \"fs\"\nexport { EventEmitter } from \"events\"\nexport { Readable, Writable } from \"stream\"\n\n/**\n * Platform-specific tools.\n */\nexport class PlatformTools {\n /**\n * Type of the currently running platform.\n */\n static type: \"browser\" | \"node\" = \"node\"\n\n /**\n * Gets global variable where global stuff can be stored.\n */\n static getGlobalVariable(): any {\n return global\n }\n\n /**\n * Loads (\"require\"-s) given file or package.\n * This operation only supports on node platform\n */\n static load(name: string): any {\n // if name is not absolute or relative, then try to load package from the node_modules of the directory we are currently in\n // this is useful when we are using typeorm package globally installed and it accesses drivers\n // that are not installed globally\n\n try {\n // switch case to explicit require statements for webpack compatibility.\n\n switch (name) {\n /**\n * mongodb\n */\n case \"mongodb\":\n return require(\"mongodb\")\n\n /**\n * hana\n */\n case \"@sap/hana-client\":\n return require(\"@sap/hana-client\")\n\n case \"hdb-pool\":\n return require(\"hdb-pool\")\n\n /**\n * mysql\n */\n case \"mysql\":\n return require(\"mysql\")\n\n case \"mysql2\":\n return require(\"mysql2\")\n\n /**\n * oracle\n */\n case \"oracledb\":\n return require(\"oracledb\")\n\n /**\n * postgres\n */\n case \"pg\":\n return require(\"pg\")\n\n case \"pg-native\":\n return require(\"pg-native\")\n\n case \"pg-query-stream\":\n return require(\"pg-query-stream\")\n\n case \"typeorm-aurora-data-api-driver\":\n return require(\"typeorm-aurora-data-api-driver\")\n\n /**\n * redis\n */\n case \"redis\":\n return require(\"redis\")\n\n case \"ioredis\":\n return require(\"ioredis\")\n\n /**\n * better-sqlite3\n */\n case \"better-sqlite3\":\n return require(\"better-sqlite3\")\n\n /**\n * sqlite\n */\n case \"sqlite3\":\n return require(\"sqlite3\")\n\n /**\n * sql.js\n */\n case \"sql.js\":\n return require(\"sql.js\")\n\n /**\n * sqlserver\n */\n case \"mssql\":\n return require(\"mssql\")\n\n /**\n * react-native-sqlite\n */\n case \"react-native-sqlite-storage\":\n return require(\"react-native-sqlite-storage\")\n }\n } catch (err) {\n return require(path.resolve(\n process.cwd() + \"/node_modules/\" + name,\n ))\n }\n\n // If nothing above matched and we get here, the package was not listed within PlatformTools\n // and is an Invalid Package. To make it explicit that this is NOT the intended use case for\n // PlatformTools.load - it's not just a way to replace `require` all willy-nilly - let's throw\n // an error.\n throw new TypeError(`Invalid Package for PlatformTools.load: ${name}`)\n }\n\n /**\n * Normalizes given path. Does \"path.normalize\".\n */\n static pathNormalize(pathStr: string): string {\n return path.normalize(pathStr)\n }\n\n /**\n * Gets file extension. Does \"path.extname\".\n */\n static pathExtname(pathStr: string): string {\n return path.extname(pathStr)\n }\n\n /**\n * Resolved given path. Does \"path.resolve\".\n */\n static pathResolve(pathStr: string): string {\n return path.resolve(pathStr)\n }\n\n /**\n * Synchronously checks if file exist. Does \"fs.existsSync\".\n */\n static fileExist(pathStr: string): boolean {\n return fs.existsSync(pathStr)\n }\n\n static readFileSync(filename: string): Buffer {\n return fs.readFileSync(filename)\n }\n\n static appendFileSync(filename: string, data: any): void {\n fs.appendFileSync(filename, data)\n }\n\n static async writeFile(path: string, data: any): Promise<void> {\n return new Promise<void>((ok, fail) => {\n fs.writeFile(path, data, (err) => {\n if (err) fail(err)\n ok()\n })\n })\n }\n\n /**\n * Loads a dotenv file into the environment variables.\n *\n * @param path The file to load as a dotenv configuration\n */\n static dotenv(pathStr: string): void {\n dotenv.config({ path: pathStr })\n }\n\n /**\n * Gets environment variable.\n */\n static getEnvVariable(name: string): any {\n return process.env[name]\n }\n\n /**\n * Highlights sql string to be print in the console.\n */\n static highlightSql(sql: string) {\n const theme: Theme = {\n keyword: chalk.blueBright,\n literal: chalk.blueBright,\n string: chalk.white,\n type: chalk.magentaBright,\n built_in: chalk.magentaBright,\n comment: chalk.gray,\n }\n return highlight(sql, { theme: theme, language: \"sql\" })\n }\n\n /**\n * Highlights json string to be print in the console.\n */\n static highlightJson(json: string) {\n return highlight(json, { language: \"json\" })\n }\n\n /**\n * Logging functions needed by AdvancedConsoleLogger\n */\n static logInfo(prefix: string, info: any) {\n console.log(chalk.gray.underline(prefix), info)\n }\n\n static logError(prefix: string, error: any) {\n console.log(chalk.underline.red(prefix), error)\n }\n\n static logWarn(prefix: string, warning: any) {\n console.log(chalk.underline.yellow(prefix), warning)\n }\n\n static log(message: string) {\n console.log(chalk.underline(message))\n }\n\n static warn(message: string) {\n return chalk.yellow(message)\n }\n\n static logCmdErr(prefix: string, err?: any) {\n console.log(chalk.black.bgRed(prefix))\n if (err) console.error(err)\n }\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../../src/platform/PlatformTools.ts"],"names":[],"mappings":"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","file":"PlatformTools.js","sourcesContent":["import * as path from \"path\"\nimport * as fs from \"fs\"\nimport dotenv from \"dotenv\"\nimport chalk from \"chalk\"\nimport { highlight, Theme } from \"cli-highlight\"\n\nexport { ReadStream } from \"fs\"\nexport { EventEmitter } from \"events\"\nexport { Readable, Writable } from \"stream\"\n\n/**\n * Platform-specific tools.\n */\nexport class PlatformTools {\n /**\n * Type of the currently running platform.\n */\n static type: \"browser\" | \"node\" = \"node\"\n\n /**\n * Gets global variable where global stuff can be stored.\n */\n static getGlobalVariable(): any {\n return global\n }\n\n /**\n * Loads (\"require\"-s) given file or package.\n * This operation only supports on node platform\n */\n static load(name: string): any {\n // if name is not absolute or relative, then try to load package from the node_modules of the directory we are currently in\n // this is useful when we are using typeorm package globally installed and it accesses drivers\n // that are not installed globally\n\n try {\n // switch case to explicit require statements for webpack compatibility.\n switch (name) {\n /**\n * spanner\n */\n case \"spanner\":\n return require(\"@google-cloud/spanner\")\n\n /**\n * mongodb\n */\n case \"mongodb\":\n return require(\"mongodb\")\n\n /**\n * hana\n */\n case \"@sap/hana-client\":\n return require(\"@sap/hana-client\")\n\n case \"hdb-pool\":\n return require(\"hdb-pool\")\n\n /**\n * mysql\n */\n case \"mysql\":\n return require(\"mysql\")\n\n case \"mysql2\":\n return require(\"mysql2\")\n\n /**\n * oracle\n */\n case \"oracledb\":\n return require(\"oracledb\")\n\n /**\n * postgres\n */\n case \"pg\":\n return require(\"pg\")\n\n case \"pg-native\":\n return require(\"pg-native\")\n\n case \"pg-query-stream\":\n return require(\"pg-query-stream\")\n\n case \"typeorm-aurora-data-api-driver\":\n return require(\"typeorm-aurora-data-api-driver\")\n\n /**\n * redis\n */\n case \"redis\":\n return require(\"redis\")\n\n case \"ioredis\":\n return require(\"ioredis\")\n\n /**\n * better-sqlite3\n */\n case \"better-sqlite3\":\n return require(\"better-sqlite3\")\n\n /**\n * sqlite\n */\n case \"sqlite3\":\n return require(\"sqlite3\")\n\n /**\n * sql.js\n */\n case \"sql.js\":\n return require(\"sql.js\")\n\n /**\n * sqlserver\n */\n case \"mssql\":\n return require(\"mssql\")\n\n /**\n * react-native-sqlite\n */\n case \"react-native-sqlite-storage\":\n return require(\"react-native-sqlite-storage\")\n }\n } catch (err) {\n return require(path.resolve(\n process.cwd() + \"/node_modules/\" + name,\n ))\n }\n\n // If nothing above matched and we get here, the package was not listed within PlatformTools\n // and is an Invalid Package. To make it explicit that this is NOT the intended use case for\n // PlatformTools.load - it's not just a way to replace `require` all willy-nilly - let's throw\n // an error.\n throw new TypeError(`Invalid Package for PlatformTools.load: ${name}`)\n }\n\n /**\n * Normalizes given path. Does \"path.normalize\".\n */\n static pathNormalize(pathStr: string): string {\n return path.normalize(pathStr)\n }\n\n /**\n * Gets file extension. Does \"path.extname\".\n */\n static pathExtname(pathStr: string): string {\n return path.extname(pathStr)\n }\n\n /**\n * Resolved given path. Does \"path.resolve\".\n */\n static pathResolve(pathStr: string): string {\n return path.resolve(pathStr)\n }\n\n /**\n * Synchronously checks if file exist. Does \"fs.existsSync\".\n */\n static fileExist(pathStr: string): boolean {\n return fs.existsSync(pathStr)\n }\n\n static readFileSync(filename: string): Buffer {\n return fs.readFileSync(filename)\n }\n\n static appendFileSync(filename: string, data: any): void {\n fs.appendFileSync(filename, data)\n }\n\n static async writeFile(path: string, data: any): Promise<void> {\n return new Promise<void>((ok, fail) => {\n fs.writeFile(path, data, (err) => {\n if (err) fail(err)\n ok()\n })\n })\n }\n\n /**\n * Loads a dotenv file into the environment variables.\n *\n * @param path The file to load as a dotenv configuration\n */\n static dotenv(pathStr: string): void {\n dotenv.config({ path: pathStr })\n }\n\n /**\n * Gets environment variable.\n */\n static getEnvVariable(name: string): any {\n return process.env[name]\n }\n\n /**\n * Highlights sql string to be print in the console.\n */\n static highlightSql(sql: string) {\n const theme: Theme = {\n keyword: chalk.blueBright,\n literal: chalk.blueBright,\n string: chalk.white,\n type: chalk.magentaBright,\n built_in: chalk.magentaBright,\n comment: chalk.gray,\n }\n return highlight(sql, { theme: theme, language: \"sql\" })\n }\n\n /**\n * Highlights json string to be print in the console.\n */\n static highlightJson(json: string) {\n return highlight(json, { language: \"json\" })\n }\n\n /**\n * Logging functions needed by AdvancedConsoleLogger\n */\n static logInfo(prefix: string, info: any) {\n console.log(chalk.gray.underline(prefix), info)\n }\n\n static logError(prefix: string, error: any) {\n console.log(chalk.underline.red(prefix), error)\n }\n\n static logWarn(prefix: string, warning: any) {\n console.log(chalk.underline.yellow(prefix), warning)\n }\n\n static log(message: string) {\n console.log(chalk.underline(message))\n }\n\n static warn(message: string) {\n return chalk.yellow(message)\n }\n\n static logCmdErr(prefix: string, err?: any) {\n console.log(chalk.black.bgRed(prefix))\n if (err) console.error(err)\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))) {
@@ -400,6 +400,7 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
400
400
  // for Oracle we return auto-increment column as well because Oracle does not support DEFAULT VALUES expression
401
401
  if (column.isGenerated &&
402
402
  column.generationStrategy === "increment" &&
403
+ !(this.connection.driver.options.type === "spanner") &&
403
404
  !(this.connection.driver.options.type === "oracle") &&
404
405
  !DriverUtils_1.DriverUtils.isSQLiteFamily(this.connection.driver) &&
405
406
  !DriverUtils_1.DriverUtils.isMySQLFamily(this.connection.driver) &&
@@ -515,7 +516,8 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
515
516
  if ((this.connection.driver.options.type === "oracle" &&
516
517
  valueSets.length > 1) ||
517
518
  DriverUtils_1.DriverUtils.isSQLiteFamily(this.connection.driver) ||
518
- this.connection.driver.options.type === "sap") {
519
+ this.connection.driver.options.type === "sap" ||
520
+ this.connection.driver.options.type === "spanner") {
519
521
  // unfortunately sqlite does not support DEFAULT expression in INSERT queries
520
522
  if (column.default !== undefined &&
521
523
  column.default !== null) {
@@ -530,6 +532,10 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
530
532
  else {
531
533
  expression += "DEFAULT";
532
534
  }
535
+ }
536
+ else if (value === null &&
537
+ this.connection.driver.options.type === "spanner") {
538
+ expression += "NULL";
533
539
  // support for SQL expressions in queries
534
540
  }
535
541
  else if (typeof value === "function") {
@@ -558,8 +564,7 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
558
564
  expression += `${geomFromText}(${paramName})`;
559
565
  }
560
566
  }
561
- else if (this.connection.driver.options.type ===
562
- "postgres" &&
567
+ else if (DriverUtils_1.DriverUtils.isPostgresFamily(this.connection.driver) &&
563
568
  this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
564
569
  if (column.srid != null) {
565
570
  expression += `ST_SetSRID(ST_GeomFromGeoJSON(${paramName}), ${column.srid})::${column.type}`;
@@ -638,13 +643,19 @@ class InsertQueryBuilder extends QueryBuilder_1.QueryBuilder {
638
643
  // if value for this column was not provided then insert default value
639
644
  }
640
645
  else if (value === undefined) {
641
- if (DriverUtils_1.DriverUtils.isSQLiteFamily(this.connection.driver) ||
642
- this.connection.driver.options.type === "sap") {
646
+ if ((this.connection.driver.options.type === "oracle" &&
647
+ valueSets.length > 1) ||
648
+ DriverUtils_1.DriverUtils.isSQLiteFamily(this.connection.driver) ||
649
+ this.connection.driver.options.type === "sap" ||
650
+ this.connection.driver.options.type === "spanner") {
643
651
  expression += "NULL";
644
652
  }
645
653
  else {
646
654
  expression += "DEFAULT";
647
655
  }
656
+ }
657
+ else if (value === null &&
658
+ this.connection.driver.options.type === "spanner") {
648
659
  // just any other regular value
649
660
  }
650
661
  else {