typeorm 0.3.18-dev.0f11739 → 0.3.18-dev.15bc887

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 (142) hide show
  1. package/browser/cache/DbQueryResultCache.js +3 -0
  2. package/browser/cache/DbQueryResultCache.js.map +1 -1
  3. package/browser/driver/cockroachdb/CockroachDriver.js +20 -10
  4. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  5. package/browser/driver/cockroachdb/CockroachQueryRunner.js +11 -2
  6. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  7. package/browser/driver/cordova/CordovaDriver.js +2 -2
  8. package/browser/driver/cordova/CordovaDriver.js.map +1 -1
  9. package/browser/driver/cordova/CordovaQueryRunner.js +8 -0
  10. package/browser/driver/cordova/CordovaQueryRunner.js.map +1 -1
  11. package/browser/driver/expo/ExpoQueryRunner.js +9 -2
  12. package/browser/driver/expo/ExpoQueryRunner.js.map +1 -1
  13. package/browser/driver/mysql/MysqlQueryRunner.js +10 -2
  14. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  15. package/browser/driver/oracle/OracleQueryRunner.js +9 -1
  16. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  17. package/browser/driver/postgres/PostgresDriver.js +1 -4
  18. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  19. package/browser/driver/postgres/PostgresQueryRunner.js +9 -1
  20. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  21. package/browser/driver/react-native/ReactNativeQueryRunner.js +10 -2
  22. package/browser/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
  23. package/browser/driver/sap/SapQueryRunner.js +10 -4
  24. package/browser/driver/sap/SapQueryRunner.js.map +1 -1
  25. package/browser/driver/spanner/SpannerQueryRunner.js +7 -1
  26. package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -1
  27. package/browser/driver/sqlite/SqliteDriver.js.map +1 -1
  28. package/browser/driver/sqlite/SqliteQueryRunner.js +60 -46
  29. package/browser/driver/sqlite/SqliteQueryRunner.js.map +1 -1
  30. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +1 -1
  31. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  32. package/browser/driver/sqljs/SqljsQueryRunner.js +11 -3
  33. package/browser/driver/sqljs/SqljsQueryRunner.js.map +1 -1
  34. package/browser/driver/sqlserver/SqlServerQueryRunner.js +7 -1
  35. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  36. package/browser/find-options/FindOperatorType.d.ts +1 -1
  37. package/browser/find-options/FindOperatorType.js.map +1 -1
  38. package/browser/find-options/operator/Or.d.ts +2 -0
  39. package/browser/find-options/operator/Or.js +6 -0
  40. package/browser/find-options/operator/Or.js.map +1 -0
  41. package/browser/index.d.ts +1 -0
  42. package/browser/index.js +1 -0
  43. package/browser/index.js.map +1 -1
  44. package/browser/metadata/ColumnMetadata.js +4 -0
  45. package/browser/metadata/ColumnMetadata.js.map +1 -1
  46. package/browser/metadata/EntityMetadata.d.ts +3 -3
  47. package/browser/metadata/EntityMetadata.js +7 -3
  48. package/browser/metadata/EntityMetadata.js.map +1 -1
  49. package/browser/persistence/SubjectExecutor.js +1 -1
  50. package/browser/persistence/SubjectExecutor.js.map +1 -1
  51. package/browser/query-builder/QueryBuilder.js +9 -0
  52. package/browser/query-builder/QueryBuilder.js.map +1 -1
  53. package/browser/query-builder/QueryExpressionMap.d.ts +2 -1
  54. package/browser/query-builder/QueryExpressionMap.js +0 -4
  55. package/browser/query-builder/QueryExpressionMap.js.map +1 -1
  56. package/browser/query-builder/SelectQueryBuilder.js +1 -1
  57. package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
  58. package/browser/query-builder/WhereClause.d.ts +1 -1
  59. package/browser/query-builder/WhereClause.js.map +1 -1
  60. package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.d.ts +9 -0
  61. package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.js +28 -0
  62. package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
  63. package/browser/subscriber/Broadcaster.d.ts +10 -0
  64. package/browser/subscriber/Broadcaster.js +46 -0
  65. package/browser/subscriber/Broadcaster.js.map +1 -1
  66. package/browser/subscriber/EntitySubscriberInterface.d.ts +9 -0
  67. package/browser/subscriber/EntitySubscriberInterface.js.map +1 -1
  68. package/browser/subscriber/event/QueryEvent.d.ts +50 -0
  69. package/browser/subscriber/event/QueryEvent.js +3 -0
  70. package/browser/subscriber/event/QueryEvent.js.map +1 -0
  71. package/cache/DbQueryResultCache.js +3 -0
  72. package/cache/DbQueryResultCache.js.map +1 -1
  73. package/driver/cockroachdb/CockroachDriver.js +20 -10
  74. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  75. package/driver/cockroachdb/CockroachQueryRunner.js +11 -2
  76. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  77. package/driver/cordova/CordovaDriver.js +2 -2
  78. package/driver/cordova/CordovaDriver.js.map +1 -1
  79. package/driver/cordova/CordovaQueryRunner.js +8 -0
  80. package/driver/cordova/CordovaQueryRunner.js.map +1 -1
  81. package/driver/expo/ExpoQueryRunner.js +9 -2
  82. package/driver/expo/ExpoQueryRunner.js.map +1 -1
  83. package/driver/mysql/MysqlQueryRunner.js +10 -2
  84. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  85. package/driver/oracle/OracleQueryRunner.js +9 -1
  86. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  87. package/driver/postgres/PostgresDriver.js +1 -4
  88. package/driver/postgres/PostgresDriver.js.map +1 -1
  89. package/driver/postgres/PostgresQueryRunner.js +9 -1
  90. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  91. package/driver/react-native/ReactNativeQueryRunner.js +10 -2
  92. package/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
  93. package/driver/sap/SapQueryRunner.js +10 -4
  94. package/driver/sap/SapQueryRunner.js.map +1 -1
  95. package/driver/spanner/SpannerQueryRunner.js +7 -1
  96. package/driver/spanner/SpannerQueryRunner.js.map +1 -1
  97. package/driver/sqlite/SqliteDriver.js.map +1 -1
  98. package/driver/sqlite/SqliteQueryRunner.js +60 -46
  99. package/driver/sqlite/SqliteQueryRunner.js.map +1 -1
  100. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +1 -1
  101. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  102. package/driver/sqljs/SqljsQueryRunner.js +11 -3
  103. package/driver/sqljs/SqljsQueryRunner.js.map +1 -1
  104. package/driver/sqlserver/SqlServerQueryRunner.js +7 -1
  105. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  106. package/find-options/FindOperatorType.d.ts +1 -1
  107. package/find-options/FindOperatorType.js.map +1 -1
  108. package/find-options/operator/Or.d.ts +2 -0
  109. package/find-options/operator/Or.js +10 -0
  110. package/find-options/operator/Or.js.map +1 -0
  111. package/index.d.ts +1 -0
  112. package/index.js +1 -0
  113. package/index.js.map +1 -1
  114. package/index.mjs +2 -0
  115. package/metadata/ColumnMetadata.js +4 -0
  116. package/metadata/ColumnMetadata.js.map +1 -1
  117. package/metadata/EntityMetadata.d.ts +3 -3
  118. package/metadata/EntityMetadata.js +7 -3
  119. package/metadata/EntityMetadata.js.map +1 -1
  120. package/package.json +1 -1
  121. package/persistence/SubjectExecutor.js +1 -1
  122. package/persistence/SubjectExecutor.js.map +1 -1
  123. package/query-builder/QueryBuilder.js +9 -0
  124. package/query-builder/QueryBuilder.js.map +1 -1
  125. package/query-builder/QueryExpressionMap.d.ts +2 -1
  126. package/query-builder/QueryExpressionMap.js +0 -4
  127. package/query-builder/QueryExpressionMap.js.map +1 -1
  128. package/query-builder/SelectQueryBuilder.js +1 -1
  129. package/query-builder/SelectQueryBuilder.js.map +1 -1
  130. package/query-builder/WhereClause.d.ts +1 -1
  131. package/query-builder/WhereClause.js.map +1 -1
  132. package/query-builder/transformer/RawSqlResultsToEntityTransformer.d.ts +9 -0
  133. package/query-builder/transformer/RawSqlResultsToEntityTransformer.js +28 -0
  134. package/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
  135. package/subscriber/Broadcaster.d.ts +10 -0
  136. package/subscriber/Broadcaster.js +46 -0
  137. package/subscriber/Broadcaster.js.map +1 -1
  138. package/subscriber/EntitySubscriberInterface.d.ts +9 -0
  139. package/subscriber/EntitySubscriberInterface.js.map +1 -1
  140. package/subscriber/event/QueryEvent.d.ts +50 -0
  141. package/subscriber/event/QueryEvent.js +4 -0
  142. package/subscriber/event/QueryEvent.js.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../browser/src/subscriber/Broadcaster.ts"],"names":[],"mappings":"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","file":"Broadcaster.js","sourcesContent":["import { EntitySubscriberInterface } from \"./EntitySubscriberInterface\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { BroadcasterResult } from \"./BroadcasterResult\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\n\ninterface BroadcasterEvents {\n BeforeTransactionCommit: () => void\n AfterTransactionCommit: () => void\n BeforeTransactionStart: () => void\n AfterTransactionStart: () => void\n BeforeTransactionRollback: () => void\n AfterTransactionRollback: () => void\n\n BeforeUpdate: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ) => void\n AfterUpdate: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ) => void\n\n BeforeInsert: (\n metadata: EntityMetadata,\n entity: ObjectLiteral | undefined,\n ) => void\n AfterInsert: (\n metadata: EntityMetadata,\n entity: ObjectLiteral | undefined,\n ) => void\n\n BeforeRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n AfterRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n\n BeforeSoftRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n AfterSoftRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n\n BeforeRecover: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n AfterRecover: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n\n Load: (metadata: EntityMetadata, entities: ObjectLiteral[]) => void\n}\n\n/**\n * Broadcaster provides a helper methods to broadcast events to the subscribers.\n */\nexport class Broadcaster {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private queryRunner: QueryRunner) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n async broadcast<U extends keyof BroadcasterEvents>(\n event: U,\n ...args: Parameters<BroadcasterEvents[U]>\n ): Promise<void> {\n const result = new BroadcasterResult()\n\n const broadcastFunction = this[`broadcast${event}Event` as keyof this]\n\n if (typeof broadcastFunction === \"function\") {\n ;(broadcastFunction as any).call(this, result, ...args)\n }\n\n await result.wait()\n }\n\n /**\n * Broadcasts \"BEFORE_INSERT\" event.\n * Before insert event is executed before entity is being inserted to the database for the first time.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeInsertEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity: undefined | ObjectLiteral,\n ): void {\n if (entity && metadata.beforeInsertListeners.length) {\n metadata.beforeInsertListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeInsert\n ) {\n const executionResult = subscriber.beforeInsert({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_UPDATE\" event.\n * Before update event is executed before entity is being updated in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeUpdateEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ): void {\n // todo: send relations too?\n if (entity && metadata.beforeUpdateListeners.length) {\n metadata.beforeUpdateListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeUpdate\n ) {\n const executionResult = subscriber.beforeUpdate({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n updatedColumns: updatedColumns || [],\n updatedRelations: updatedRelations || [],\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_REMOVE\" event.\n * Before remove event is executed before entity is being removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.beforeRemoveListeners.length) {\n metadata.beforeRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeRemove\n ) {\n const executionResult = subscriber.beforeRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_SOFT_REMOVE\" event.\n * Before soft remove event is executed before entity is being soft removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeSoftRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.beforeSoftRemoveListeners.length) {\n metadata.beforeSoftRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeSoftRemove\n ) {\n const executionResult = subscriber.beforeSoftRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_RECOVER\" event.\n * Before recover event is executed before entity is being recovered in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeRecoverEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.beforeRecoverListeners.length) {\n metadata.beforeRecoverListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeRecover\n ) {\n const executionResult = subscriber.beforeRecover({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_INSERT\" event.\n * After insert event is executed after entity is being persisted to the database for the first time.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterInsertEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterInsertListeners.length) {\n metadata.afterInsertListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterInsert\n ) {\n const executionResult = subscriber.afterInsert({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n entityId: metadata.getEntityIdMixedMap(identifier),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_TRANSACTION_START\" event.\n */\n broadcastBeforeTransactionStartEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.beforeTransactionStart) {\n const executionResult = subscriber.beforeTransactionStart({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_TRANSACTION_START\" event.\n */\n broadcastAfterTransactionStartEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.afterTransactionStart) {\n const executionResult = subscriber.afterTransactionStart({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_TRANSACTION_COMMIT\" event.\n */\n broadcastBeforeTransactionCommitEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.beforeTransactionCommit) {\n const executionResult = subscriber.beforeTransactionCommit({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_TRANSACTION_COMMIT\" event.\n */\n broadcastAfterTransactionCommitEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.afterTransactionCommit) {\n const executionResult = subscriber.afterTransactionCommit({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_TRANSACTION_ROLLBACK\" event.\n */\n broadcastBeforeTransactionRollbackEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.beforeTransactionRollback) {\n const executionResult =\n subscriber.beforeTransactionRollback({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_TRANSACTION_ROLLBACK\" event.\n */\n broadcastAfterTransactionRollbackEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.afterTransactionRollback) {\n const executionResult = subscriber.afterTransactionRollback(\n {\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n },\n )\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_UPDATE\" event.\n * After update event is executed after entity is being updated in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterUpdateEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ): void {\n if (entity && metadata.afterUpdateListeners.length) {\n metadata.afterUpdateListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterUpdate\n ) {\n const executionResult = subscriber.afterUpdate({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n updatedColumns: updatedColumns || [],\n updatedRelations: updatedRelations || [],\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_REMOVE\" event.\n * After remove event is executed after entity is being removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterRemoveListeners.length) {\n metadata.afterRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterRemove\n ) {\n const executionResult = subscriber.afterRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_SOFT_REMOVE\" event.\n * After soft remove event is executed after entity is being soft removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterSoftRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterSoftRemoveListeners.length) {\n metadata.afterSoftRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterSoftRemove\n ) {\n const executionResult = subscriber.afterSoftRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_RECOVER\" event.\n * After recover event is executed after entity is being recovered in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterRecoverEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterRecoverListeners.length) {\n metadata.afterRecoverListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterRecover\n ) {\n const executionResult = subscriber.afterRecover({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * @deprecated Use `broadcastLoadForAllEvent`\n */\n broadcastLoadEventsForAll(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entities: ObjectLiteral[],\n ): void {\n return this.broadcastLoadEvent(result, metadata, entities)\n }\n\n /**\n * Broadcasts \"AFTER_LOAD\" event for all given entities, and their sub-entities.\n * After load event is executed after entity has been loaded from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastLoadEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entities: ObjectLiteral[],\n ): void {\n // Calculate which subscribers are fitting for the given entity type\n const fittingSubscribers =\n this.queryRunner.connection.subscribers.filter(\n (subscriber) =>\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterLoad,\n )\n\n if (\n metadata.relations.length ||\n metadata.afterLoadListeners.length ||\n fittingSubscribers.length\n ) {\n // todo: check why need this?\n const nonPromiseEntities = entities.filter(\n (entity) => !(entity instanceof Promise),\n )\n\n // collect load events for all children entities that were loaded with the main entity\n if (metadata.relations.length) {\n metadata.relations.forEach((relation) => {\n nonPromiseEntities.forEach((entity) => {\n // in lazy relations we cannot simply access to entity property because it will cause a getter and a database query\n if (\n relation.isLazy &&\n !entity.hasOwnProperty(relation.propertyName)\n )\n return\n\n const value = relation.getEntityValue(entity)\n if (ObjectUtils.isObject(value))\n this.broadcastLoadEvent(\n result,\n relation.inverseEntityMetadata,\n Array.isArray(value) ? value : [value],\n )\n })\n })\n }\n\n if (metadata.afterLoadListeners.length) {\n metadata.afterLoadListeners.forEach((listener) => {\n nonPromiseEntities.forEach((entity) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n })\n }\n\n fittingSubscribers.forEach((subscriber) => {\n nonPromiseEntities.forEach((entity) => {\n const executionResult = subscriber.afterLoad!(entity, {\n entity,\n metadata,\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n })\n })\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Checks if subscriber's methods can be executed by checking if its don't listen to the particular entity,\n * or listens our entity.\n */\n protected isAllowedSubscriber(\n subscriber: EntitySubscriberInterface<any>,\n target: Function | string,\n ): boolean {\n return (\n !subscriber.listenTo ||\n !subscriber.listenTo() ||\n subscriber.listenTo() === Object ||\n subscriber.listenTo() === target ||\n subscriber.listenTo().isPrototypeOf(target)\n )\n }\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../browser/src/subscriber/Broadcaster.ts"],"names":[],"mappings":"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","file":"Broadcaster.js","sourcesContent":["import { EntitySubscriberInterface } from \"./EntitySubscriberInterface\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { BroadcasterResult } from \"./BroadcasterResult\"\nimport { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\n\ninterface BroadcasterEvents {\n BeforeQuery: () => void\n AfterQuery: () => void\n\n BeforeTransactionCommit: () => void\n AfterTransactionCommit: () => void\n BeforeTransactionStart: () => void\n AfterTransactionStart: () => void\n BeforeTransactionRollback: () => void\n AfterTransactionRollback: () => void\n\n BeforeUpdate: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ) => void\n AfterUpdate: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ) => void\n\n BeforeInsert: (\n metadata: EntityMetadata,\n entity: ObjectLiteral | undefined,\n ) => void\n AfterInsert: (\n metadata: EntityMetadata,\n entity: ObjectLiteral | undefined,\n ) => void\n\n BeforeRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n AfterRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n\n BeforeSoftRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n AfterSoftRemove: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n\n BeforeRecover: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n AfterRecover: (\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n ) => void\n\n Load: (metadata: EntityMetadata, entities: ObjectLiteral[]) => void\n}\n\n/**\n * Broadcaster provides a helper methods to broadcast events to the subscribers.\n */\nexport class Broadcaster {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private queryRunner: QueryRunner) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n async broadcast<U extends keyof BroadcasterEvents>(\n event: U,\n ...args: Parameters<BroadcasterEvents[U]>\n ): Promise<void> {\n const result = new BroadcasterResult()\n\n const broadcastFunction = this[`broadcast${event}Event` as keyof this]\n\n if (typeof broadcastFunction === \"function\") {\n ;(broadcastFunction as any).call(this, result, ...args)\n }\n\n await result.wait()\n }\n\n /**\n * Broadcasts \"BEFORE_INSERT\" event.\n * Before insert event is executed before entity is being inserted to the database for the first time.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeInsertEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity: undefined | ObjectLiteral,\n ): void {\n if (entity && metadata.beforeInsertListeners.length) {\n metadata.beforeInsertListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeInsert\n ) {\n const executionResult = subscriber.beforeInsert({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_UPDATE\" event.\n * Before update event is executed before entity is being updated in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeUpdateEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ): void {\n // todo: send relations too?\n if (entity && metadata.beforeUpdateListeners.length) {\n metadata.beforeUpdateListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeUpdate\n ) {\n const executionResult = subscriber.beforeUpdate({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n updatedColumns: updatedColumns || [],\n updatedRelations: updatedRelations || [],\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_REMOVE\" event.\n * Before remove event is executed before entity is being removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.beforeRemoveListeners.length) {\n metadata.beforeRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeRemove\n ) {\n const executionResult = subscriber.beforeRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_SOFT_REMOVE\" event.\n * Before soft remove event is executed before entity is being soft removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeSoftRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.beforeSoftRemoveListeners.length) {\n metadata.beforeSoftRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeSoftRemove\n ) {\n const executionResult = subscriber.beforeSoftRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_RECOVER\" event.\n * Before recover event is executed before entity is being recovered in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastBeforeRecoverEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.beforeRecoverListeners.length) {\n metadata.beforeRecoverListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.beforeRecover\n ) {\n const executionResult = subscriber.beforeRecover({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_INSERT\" event.\n * After insert event is executed after entity is being persisted to the database for the first time.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterInsertEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterInsertListeners.length) {\n metadata.afterInsertListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterInsert\n ) {\n const executionResult = subscriber.afterInsert({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n entityId: metadata.getEntityIdMixedMap(identifier),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_QUERY\" event.\n */\n broadcastBeforeQueryEvent(\n result: BroadcasterResult,\n query: string,\n parameters: undefined | any[],\n ): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.beforeQuery) {\n const executionResult = subscriber.beforeQuery({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n query: query,\n parameters: parameters,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_QUERY\" event.\n */\n broadcastAfterQueryEvent(\n result: BroadcasterResult,\n query: string,\n parameters: undefined | any[],\n success: boolean,\n executionTime: undefined | number,\n rawResults: undefined | any,\n error: undefined | any,\n ): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.afterQuery) {\n const executionResult = subscriber.afterQuery({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n query: query,\n parameters: parameters,\n success: success,\n executionTime: executionTime,\n rawResults: rawResults,\n error: error,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_TRANSACTION_START\" event.\n */\n broadcastBeforeTransactionStartEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.beforeTransactionStart) {\n const executionResult = subscriber.beforeTransactionStart({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_TRANSACTION_START\" event.\n */\n broadcastAfterTransactionStartEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.afterTransactionStart) {\n const executionResult = subscriber.afterTransactionStart({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_TRANSACTION_COMMIT\" event.\n */\n broadcastBeforeTransactionCommitEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.beforeTransactionCommit) {\n const executionResult = subscriber.beforeTransactionCommit({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_TRANSACTION_COMMIT\" event.\n */\n broadcastAfterTransactionCommitEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.afterTransactionCommit) {\n const executionResult = subscriber.afterTransactionCommit({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"BEFORE_TRANSACTION_ROLLBACK\" event.\n */\n broadcastBeforeTransactionRollbackEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.beforeTransactionRollback) {\n const executionResult =\n subscriber.beforeTransactionRollback({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_TRANSACTION_ROLLBACK\" event.\n */\n broadcastAfterTransactionRollbackEvent(result: BroadcasterResult): void {\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (subscriber.afterTransactionRollback) {\n const executionResult = subscriber.afterTransactionRollback(\n {\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n },\n )\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_UPDATE\" event.\n * After update event is executed after entity is being updated in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterUpdateEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n updatedColumns?: ColumnMetadata[],\n updatedRelations?: RelationMetadata[],\n ): void {\n if (entity && metadata.afterUpdateListeners.length) {\n metadata.afterUpdateListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterUpdate\n ) {\n const executionResult = subscriber.afterUpdate({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n updatedColumns: updatedColumns || [],\n updatedRelations: updatedRelations || [],\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_REMOVE\" event.\n * After remove event is executed after entity is being removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterRemoveListeners.length) {\n metadata.afterRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterRemove\n ) {\n const executionResult = subscriber.afterRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_SOFT_REMOVE\" event.\n * After soft remove event is executed after entity is being soft removed from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterSoftRemoveEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterSoftRemoveListeners.length) {\n metadata.afterSoftRemoveListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterSoftRemove\n ) {\n const executionResult = subscriber.afterSoftRemove({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * Broadcasts \"AFTER_RECOVER\" event.\n * After recover event is executed after entity is being recovered in the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastAfterRecoverEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entity?: ObjectLiteral,\n databaseEntity?: ObjectLiteral,\n identifier?: ObjectLiteral,\n ): void {\n if (entity && metadata.afterRecoverListeners.length) {\n metadata.afterRecoverListeners.forEach((listener) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n\n if (this.queryRunner.connection.subscribers.length) {\n this.queryRunner.connection.subscribers.forEach((subscriber) => {\n if (\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterRecover\n ) {\n const executionResult = subscriber.afterRecover({\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n entity: entity,\n metadata: metadata,\n databaseEntity: databaseEntity,\n entityId: metadata.getEntityIdMixedMap(\n databaseEntity ?? identifier,\n ),\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n }\n }\n\n /**\n * @deprecated Use `broadcastLoadForAllEvent`\n */\n broadcastLoadEventsForAll(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entities: ObjectLiteral[],\n ): void {\n return this.broadcastLoadEvent(result, metadata, entities)\n }\n\n /**\n * Broadcasts \"AFTER_LOAD\" event for all given entities, and their sub-entities.\n * After load event is executed after entity has been loaded from the database.\n * All subscribers and entity listeners who listened to this event will be executed at this point.\n * Subscribers and entity listeners can return promises, it will wait until they are resolved.\n *\n * Note: this method has a performance-optimized code organization, do not change code structure.\n */\n broadcastLoadEvent(\n result: BroadcasterResult,\n metadata: EntityMetadata,\n entities: ObjectLiteral[],\n ): void {\n // Calculate which subscribers are fitting for the given entity type\n const fittingSubscribers =\n this.queryRunner.connection.subscribers.filter(\n (subscriber) =>\n this.isAllowedSubscriber(subscriber, metadata.target) &&\n subscriber.afterLoad,\n )\n\n if (\n metadata.relations.length ||\n metadata.afterLoadListeners.length ||\n fittingSubscribers.length\n ) {\n // todo: check why need this?\n const nonPromiseEntities = entities.filter(\n (entity) => !(entity instanceof Promise),\n )\n\n // collect load events for all children entities that were loaded with the main entity\n if (metadata.relations.length) {\n metadata.relations.forEach((relation) => {\n nonPromiseEntities.forEach((entity) => {\n // in lazy relations we cannot simply access to entity property because it will cause a getter and a database query\n if (\n relation.isLazy &&\n !entity.hasOwnProperty(relation.propertyName)\n )\n return\n\n const value = relation.getEntityValue(entity)\n if (ObjectUtils.isObject(value))\n this.broadcastLoadEvent(\n result,\n relation.inverseEntityMetadata,\n Array.isArray(value) ? value : [value],\n )\n })\n })\n }\n\n if (metadata.afterLoadListeners.length) {\n metadata.afterLoadListeners.forEach((listener) => {\n nonPromiseEntities.forEach((entity) => {\n if (listener.isAllowed(entity)) {\n const executionResult = listener.execute(entity)\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n }\n })\n })\n }\n\n fittingSubscribers.forEach((subscriber) => {\n nonPromiseEntities.forEach((entity) => {\n const executionResult = subscriber.afterLoad!(entity, {\n entity,\n metadata,\n connection: this.queryRunner.connection,\n queryRunner: this.queryRunner,\n manager: this.queryRunner.manager,\n })\n if (executionResult instanceof Promise)\n result.promises.push(executionResult)\n result.count++\n })\n })\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Checks if subscriber's methods can be executed by checking if its don't listen to the particular entity,\n * or listens our entity.\n */\n protected isAllowedSubscriber(\n subscriber: EntitySubscriberInterface<any>,\n target: Function | string,\n ): boolean {\n return (\n !subscriber.listenTo ||\n !subscriber.listenTo() ||\n subscriber.listenTo() === Object ||\n subscriber.listenTo() === target ||\n subscriber.listenTo().isPrototypeOf(target)\n )\n }\n}\n"],"sourceRoot":".."}
@@ -7,6 +7,7 @@ import { InsertEvent } from "./event/InsertEvent";
7
7
  import { LoadEvent } from "./event/LoadEvent";
8
8
  import { SoftRemoveEvent } from "./event/SoftRemoveEvent";
9
9
  import { RecoverEvent } from "./event/RecoverEvent";
10
+ import { AfterQueryEvent, BeforeQueryEvent } from "./event/QueryEvent";
10
11
  /**
11
12
  * Classes that implement this interface are subscribers that subscribe for the specific events in the ORM.
12
13
  */
@@ -25,6 +26,14 @@ export interface EntitySubscriberInterface<Entity = any> {
25
26
  * compilation for existing subscribers).
26
27
  */
27
28
  afterLoad?(entity: Entity, event?: LoadEvent<Entity>): Promise<any> | void;
29
+ /**
30
+ * Called before query is executed.
31
+ */
32
+ beforeQuery?(event: BeforeQueryEvent<Entity>): Promise<any> | void;
33
+ /**
34
+ * Called after query is executed.
35
+ */
36
+ afterQuery?(event: AfterQueryEvent<Entity>): Promise<any> | void;
28
37
  /**
29
38
  * Called before entity is inserted to the database.
30
39
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../browser/src/subscriber/EntitySubscriberInterface.ts"],"names":[],"mappings":"","file":"EntitySubscriberInterface.js","sourcesContent":["import { TransactionCommitEvent } from \"./event/TransactionCommitEvent\"\nimport { TransactionRollbackEvent } from \"./event/TransactionRollbackEvent\"\nimport { TransactionStartEvent } from \"./event/TransactionStartEvent\"\nimport { UpdateEvent } from \"./event/UpdateEvent\"\nimport { RemoveEvent } from \"./event/RemoveEvent\"\nimport { InsertEvent } from \"./event/InsertEvent\"\nimport { LoadEvent } from \"./event/LoadEvent\"\nimport { SoftRemoveEvent } from \"./event/SoftRemoveEvent\"\nimport { RecoverEvent } from \"./event/RecoverEvent\"\n\n/**\n * Classes that implement this interface are subscribers that subscribe for the specific events in the ORM.\n */\nexport interface EntitySubscriberInterface<Entity = any> {\n /**\n * Returns the class of the entity to which events will listen.\n * If this method is omitted, then subscriber will listen to events of all entities.\n */\n listenTo?(): Function | string\n\n /**\n * Called after entity is loaded from the database.\n *\n * For backward compatibility this signature is slightly different from the\n * others. `event` was added later but is always provided (it is only\n * optional in the signature so that its introduction does not break\n * compilation for existing subscribers).\n */\n afterLoad?(entity: Entity, event?: LoadEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is inserted to the database.\n */\n beforeInsert?(event: InsertEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is inserted to the database.\n */\n afterInsert?(event: InsertEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is updated in the database.\n */\n beforeUpdate?(event: UpdateEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is updated in the database.\n */\n afterUpdate?(event: UpdateEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is removed from the database.\n */\n beforeRemove?(event: RemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is soft removed from the database.\n */\n beforeSoftRemove?(event: SoftRemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is recovered in the database.\n */\n beforeRecover?(event: RecoverEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is removed from the database.\n */\n afterRemove?(event: RemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is soft removed from the database.\n */\n afterSoftRemove?(event: SoftRemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is recovered in the database.\n */\n afterRecover?(event: RecoverEvent<Entity>): Promise<any> | void\n\n /**\n * Called before transaction is started.\n */\n beforeTransactionStart?(event: TransactionStartEvent): Promise<any> | void\n\n /**\n * Called after transaction is started.\n */\n afterTransactionStart?(event: TransactionStartEvent): Promise<any> | void\n\n /**\n * Called before transaction is committed.\n */\n beforeTransactionCommit?(event: TransactionCommitEvent): Promise<any> | void\n\n /**\n * Called after transaction is committed.\n */\n afterTransactionCommit?(event: TransactionCommitEvent): Promise<any> | void\n\n /**\n * Called before transaction rollback.\n */\n beforeTransactionRollback?(\n event: TransactionRollbackEvent,\n ): Promise<any> | void\n\n /**\n * Called after transaction rollback.\n */\n afterTransactionRollback?(\n event: TransactionRollbackEvent,\n ): Promise<any> | void\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../browser/src/subscriber/EntitySubscriberInterface.ts"],"names":[],"mappings":"","file":"EntitySubscriberInterface.js","sourcesContent":["import { TransactionCommitEvent } from \"./event/TransactionCommitEvent\"\nimport { TransactionRollbackEvent } from \"./event/TransactionRollbackEvent\"\nimport { TransactionStartEvent } from \"./event/TransactionStartEvent\"\nimport { UpdateEvent } from \"./event/UpdateEvent\"\nimport { RemoveEvent } from \"./event/RemoveEvent\"\nimport { InsertEvent } from \"./event/InsertEvent\"\nimport { LoadEvent } from \"./event/LoadEvent\"\nimport { SoftRemoveEvent } from \"./event/SoftRemoveEvent\"\nimport { RecoverEvent } from \"./event/RecoverEvent\"\nimport { AfterQueryEvent, BeforeQueryEvent } from \"./event/QueryEvent\"\n\n/**\n * Classes that implement this interface are subscribers that subscribe for the specific events in the ORM.\n */\nexport interface EntitySubscriberInterface<Entity = any> {\n /**\n * Returns the class of the entity to which events will listen.\n * If this method is omitted, then subscriber will listen to events of all entities.\n */\n listenTo?(): Function | string\n\n /**\n * Called after entity is loaded from the database.\n *\n * For backward compatibility this signature is slightly different from the\n * others. `event` was added later but is always provided (it is only\n * optional in the signature so that its introduction does not break\n * compilation for existing subscribers).\n */\n afterLoad?(entity: Entity, event?: LoadEvent<Entity>): Promise<any> | void\n\n /**\n * Called before query is executed.\n */\n beforeQuery?(event: BeforeQueryEvent<Entity>): Promise<any> | void\n\n /**\n * Called after query is executed.\n */\n afterQuery?(event: AfterQueryEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is inserted to the database.\n */\n beforeInsert?(event: InsertEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is inserted to the database.\n */\n afterInsert?(event: InsertEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is updated in the database.\n */\n beforeUpdate?(event: UpdateEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is updated in the database.\n */\n afterUpdate?(event: UpdateEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is removed from the database.\n */\n beforeRemove?(event: RemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is soft removed from the database.\n */\n beforeSoftRemove?(event: SoftRemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called before entity is recovered in the database.\n */\n beforeRecover?(event: RecoverEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is removed from the database.\n */\n afterRemove?(event: RemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is soft removed from the database.\n */\n afterSoftRemove?(event: SoftRemoveEvent<Entity>): Promise<any> | void\n\n /**\n * Called after entity is recovered in the database.\n */\n afterRecover?(event: RecoverEvent<Entity>): Promise<any> | void\n\n /**\n * Called before transaction is started.\n */\n beforeTransactionStart?(event: TransactionStartEvent): Promise<any> | void\n\n /**\n * Called after transaction is started.\n */\n afterTransactionStart?(event: TransactionStartEvent): Promise<any> | void\n\n /**\n * Called before transaction is committed.\n */\n beforeTransactionCommit?(event: TransactionCommitEvent): Promise<any> | void\n\n /**\n * Called after transaction is committed.\n */\n afterTransactionCommit?(event: TransactionCommitEvent): Promise<any> | void\n\n /**\n * Called before transaction rollback.\n */\n beforeTransactionRollback?(\n event: TransactionRollbackEvent,\n ): Promise<any> | void\n\n /**\n * Called after transaction rollback.\n */\n afterTransactionRollback?(\n event: TransactionRollbackEvent,\n ): Promise<any> | void\n}\n"],"sourceRoot":".."}
@@ -0,0 +1,50 @@
1
+ import { EntityManager } from "../../entity-manager/EntityManager";
2
+ import { DataSource } from "../../data-source/DataSource";
3
+ import { QueryRunner } from "../../query-runner/QueryRunner";
4
+ /**
5
+ * BeforeQueryEvent is an object that broadcaster sends to the entity subscriber before query is ran against the database.
6
+ */
7
+ export interface QueryEvent<Entity> {
8
+ /**
9
+ * Connection used in the event.
10
+ */
11
+ connection: DataSource;
12
+ /**
13
+ * QueryRunner used in the event transaction.
14
+ * All database operations in the subscribed event listener should be performed using this query runner instance.
15
+ */
16
+ queryRunner: QueryRunner;
17
+ /**
18
+ * EntityManager used in the event transaction.
19
+ * All database operations in the subscribed event listener should be performed using this entity manager instance.
20
+ */
21
+ manager: EntityManager;
22
+ /**
23
+ * Query that is being executed.
24
+ */
25
+ query: string;
26
+ /**
27
+ * Parameters used in the query.
28
+ */
29
+ parameters?: any[];
30
+ }
31
+ export interface BeforeQueryEvent<Entity> extends QueryEvent<Entity> {
32
+ }
33
+ export interface AfterQueryEvent<Entity> extends QueryEvent<Entity> {
34
+ /**
35
+ * Whether the query was successful.
36
+ */
37
+ success: boolean;
38
+ /**
39
+ * The duration of the query execution.
40
+ */
41
+ executionTime?: number;
42
+ /**
43
+ * The raw results from the database if the query was successful.
44
+ */
45
+ rawResults?: any;
46
+ /**
47
+ * The error thrown if the query was unsuccessful.
48
+ */
49
+ error?: any;
50
+ }
@@ -0,0 +1,3 @@
1
+ export {};
2
+
3
+ //# sourceMappingURL=QueryEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../browser/src/subscriber/event/QueryEvent.ts"],"names":[],"mappings":"","file":"QueryEvent.js","sourcesContent":["import { EntityManager } from \"../../entity-manager/EntityManager\"\nimport { DataSource } from \"../../data-source/DataSource\"\nimport { QueryRunner } from \"../../query-runner/QueryRunner\"\n\n/**\n * BeforeQueryEvent is an object that broadcaster sends to the entity subscriber before query is ran against the database.\n */\nexport interface QueryEvent<Entity> {\n /**\n * Connection used in the event.\n */\n connection: DataSource\n\n /**\n * QueryRunner used in the event transaction.\n * All database operations in the subscribed event listener should be performed using this query runner instance.\n */\n queryRunner: QueryRunner\n\n /**\n * EntityManager used in the event transaction.\n * All database operations in the subscribed event listener should be performed using this entity manager instance.\n */\n manager: EntityManager\n\n /**\n * Query that is being executed.\n */\n query: string\n\n /**\n * Parameters used in the query.\n */\n parameters?: any[]\n}\n\nexport interface BeforeQueryEvent<Entity> extends QueryEvent<Entity> {}\n\nexport interface AfterQueryEvent<Entity> extends QueryEvent<Entity> {\n /**\n * Whether the query was successful.\n */\n success: boolean\n\n /**\n * The duration of the query execution.\n */\n executionTime?: number\n\n /**\n * The raw results from the database if the query was successful.\n */\n rawResults?: any\n\n /**\n * The error thrown if the query was unsuccessful.\n */\n error?: any\n}\n"],"sourceRoot":"../.."}
@@ -120,12 +120,14 @@ class DbQueryResultCache {
120
120
  ? new MssqlParameter_1.MssqlParameter(options.identifier, "nvarchar")
121
121
  : options.identifier,
122
122
  })
123
+ .cache(false) // disable cache to avoid infinite loops when cache is alwaysEnable
123
124
  .getRawOne();
124
125
  }
125
126
  else if (options.query) {
126
127
  if (this.connection.driver.options.type === "oracle") {
127
128
  return qb
128
129
  .where(`dbms_lob.compare(${qb.escape("cache")}.${qb.escape("query")}, :query) = 0`, { query: options.query })
130
+ .cache(false) // disable cache to avoid infinite loops when cache is alwaysEnable
129
131
  .getRawOne();
130
132
  }
131
133
  return qb
@@ -135,6 +137,7 @@ class DbQueryResultCache {
135
137
  ? new MssqlParameter_1.MssqlParameter(options.query, "nvarchar")
136
138
  : options.query,
137
139
  })
140
+ .cache(false) // disable cache to avoid infinite loops when cache is alwaysEnable
138
141
  .getRawOne();
139
142
  }
140
143
  return Promise.resolve(undefined);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cache/DbQueryResultCache.ts"],"names":[],"mappings":"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","file":"DbQueryResultCache.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { MssqlParameter } from \"../driver/sqlserver/MssqlParameter\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { Table } from \"../schema-builder/table/Table\"\nimport { QueryResultCache } from \"./QueryResultCache\"\nimport { QueryResultCacheOptions } from \"./QueryResultCacheOptions\"\nimport { v4 as uuidv4 } from \"uuid\"\n\n/**\n * Caches query result into current database, into separate table called \"query-result-cache\".\n */\nexport class DbQueryResultCache implements QueryResultCache {\n // -------------------------------------------------------------------------\n // Private properties\n // -------------------------------------------------------------------------\n\n private queryResultCacheTable: string\n\n private queryResultCacheDatabase?: string\n\n private queryResultCacheSchema?: string\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(protected connection: DataSource) {\n const { schema } = this.connection.driver.options as any\n const database = this.connection.driver.database\n const cacheOptions =\n typeof this.connection.options.cache === \"object\"\n ? this.connection.options.cache\n : {}\n const cacheTableName = cacheOptions.tableName || \"query-result-cache\"\n\n this.queryResultCacheDatabase = database\n this.queryResultCacheSchema = schema\n this.queryResultCacheTable = this.connection.driver.buildTableName(\n cacheTableName,\n schema,\n database,\n )\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Creates a connection with given cache provider.\n */\n async connect(): Promise<void> {}\n\n /**\n * Disconnects with given cache provider.\n */\n async disconnect(): Promise<void> {}\n\n /**\n * Creates table for storing cache if it does not exist yet.\n */\n async synchronize(queryRunner?: QueryRunner): Promise<void> {\n queryRunner = this.getQueryRunner(queryRunner)\n const driver = this.connection.driver\n const tableExist = await queryRunner.hasTable(\n this.queryResultCacheTable,\n ) // todo: table name should be configurable\n if (tableExist) return\n\n await queryRunner.createTable(\n new Table({\n database: this.queryResultCacheDatabase,\n schema: this.queryResultCacheSchema,\n name: this.queryResultCacheTable,\n columns: [\n {\n name: \"id\",\n isPrimary: true,\n isNullable: false,\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheId,\n }),\n generationStrategy:\n driver.options.type === \"spanner\"\n ? \"uuid\"\n : \"increment\",\n isGenerated: true,\n },\n {\n name: \"identifier\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheIdentifier,\n }),\n isNullable: true,\n },\n {\n name: \"time\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheTime,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: \"duration\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheDuration,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: \"query\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheQuery,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: \"result\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheResult,\n }),\n isNullable: false,\n },\n ],\n }),\n )\n }\n\n /**\n * Get data from cache.\n * Returns cache result if found.\n * Returns undefined if result is not cached.\n */\n getFromCache(\n options: QueryResultCacheOptions,\n queryRunner?: QueryRunner,\n ): Promise<QueryResultCacheOptions | undefined> {\n queryRunner = this.getQueryRunner(queryRunner)\n const qb = this.connection\n .createQueryBuilder(queryRunner)\n .select()\n .from(this.queryResultCacheTable, \"cache\")\n\n if (options.identifier) {\n return qb\n .where(\n `${qb.escape(\"cache\")}.${qb.escape(\n \"identifier\",\n )} = :identifier`,\n )\n .setParameters({\n identifier:\n this.connection.driver.options.type === \"mssql\"\n ? new MssqlParameter(options.identifier, \"nvarchar\")\n : options.identifier,\n })\n .getRawOne()\n } else if (options.query) {\n if (this.connection.driver.options.type === \"oracle\") {\n return qb\n .where(\n `dbms_lob.compare(${qb.escape(\"cache\")}.${qb.escape(\n \"query\",\n )}, :query) = 0`,\n { query: options.query },\n )\n .getRawOne()\n }\n\n return qb\n .where(`${qb.escape(\"cache\")}.${qb.escape(\"query\")} = :query`)\n .setParameters({\n query:\n this.connection.driver.options.type === \"mssql\"\n ? new MssqlParameter(options.query, \"nvarchar\")\n : options.query,\n })\n .getRawOne()\n }\n\n return Promise.resolve(undefined)\n }\n\n /**\n * Checks if cache is expired or not.\n */\n isExpired(savedCache: QueryResultCacheOptions): boolean {\n const duration =\n typeof savedCache.duration === \"string\"\n ? parseInt(savedCache.duration)\n : savedCache.duration\n return (\n (typeof savedCache.time === \"string\"\n ? parseInt(savedCache.time as any)\n : savedCache.time)! +\n duration <\n new Date().getTime()\n )\n }\n\n /**\n * Stores given query result in the cache.\n */\n async storeInCache(\n options: QueryResultCacheOptions,\n savedCache: QueryResultCacheOptions | undefined,\n queryRunner?: QueryRunner,\n ): Promise<void> {\n const shouldCreateQueryRunner =\n queryRunner === undefined ||\n queryRunner?.getReplicationMode() === \"slave\"\n\n if (queryRunner === undefined || shouldCreateQueryRunner) {\n queryRunner = this.connection.createQueryRunner(\"master\")\n }\n\n let insertedValues: ObjectLiteral = options\n if (this.connection.driver.options.type === \"mssql\") {\n // todo: bad abstraction, re-implement this part, probably better if we create an entity metadata for cache table\n insertedValues = {\n identifier: new MssqlParameter(options.identifier, \"nvarchar\"),\n time: new MssqlParameter(options.time, \"bigint\"),\n duration: new MssqlParameter(options.duration, \"int\"),\n query: new MssqlParameter(options.query, \"nvarchar\"),\n result: new MssqlParameter(options.result, \"nvarchar\"),\n }\n }\n\n if (savedCache && savedCache.identifier) {\n // if exist then update\n const qb = queryRunner.manager\n .createQueryBuilder()\n .update(this.queryResultCacheTable)\n .set(insertedValues)\n\n qb.where(`${qb.escape(\"identifier\")} = :condition`, {\n condition: insertedValues.identifier,\n })\n await qb.execute()\n } else if (savedCache && savedCache.query) {\n // if exist then update\n const qb = queryRunner.manager\n .createQueryBuilder()\n .update(this.queryResultCacheTable)\n .set(insertedValues)\n\n if (this.connection.driver.options.type === \"oracle\") {\n qb.where(`dbms_lob.compare(\"query\", :condition) = 0`, {\n condition: insertedValues.query,\n })\n } else {\n qb.where(`${qb.escape(\"query\")} = :condition`, {\n condition: insertedValues.query,\n })\n }\n\n await qb.execute()\n } else {\n // Spanner does not support auto-generated columns\n if (\n this.connection.driver.options.type === \"spanner\" &&\n !insertedValues.id\n ) {\n insertedValues.id = uuidv4()\n }\n\n // otherwise insert\n await queryRunner.manager\n .createQueryBuilder()\n .insert()\n .into(this.queryResultCacheTable)\n .values(insertedValues)\n .execute()\n }\n\n if (shouldCreateQueryRunner) {\n await queryRunner.release()\n }\n }\n\n /**\n * Clears everything stored in the cache.\n */\n async clear(queryRunner: QueryRunner): Promise<void> {\n return this.getQueryRunner(queryRunner).clearTable(\n this.queryResultCacheTable,\n )\n }\n\n /**\n * Removes all cached results by given identifiers from cache.\n */\n async remove(\n identifiers: string[],\n queryRunner?: QueryRunner,\n ): Promise<void> {\n let _queryRunner: QueryRunner = queryRunner || this.getQueryRunner()\n await Promise.all(\n identifiers.map((identifier) => {\n const qb = _queryRunner.manager.createQueryBuilder()\n return qb\n .delete()\n .from(this.queryResultCacheTable)\n .where(`${qb.escape(\"identifier\")} = :identifier`, {\n identifier,\n })\n .execute()\n }),\n )\n\n if (!queryRunner) {\n await _queryRunner.release()\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets a query runner to work with.\n */\n protected getQueryRunner(queryRunner?: QueryRunner): QueryRunner {\n if (queryRunner) return queryRunner\n\n return this.connection.createQueryRunner()\n }\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../../src/cache/DbQueryResultCache.ts"],"names":[],"mappings":"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","file":"DbQueryResultCache.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { MssqlParameter } from \"../driver/sqlserver/MssqlParameter\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { Table } from \"../schema-builder/table/Table\"\nimport { QueryResultCache } from \"./QueryResultCache\"\nimport { QueryResultCacheOptions } from \"./QueryResultCacheOptions\"\nimport { v4 as uuidv4 } from \"uuid\"\n\n/**\n * Caches query result into current database, into separate table called \"query-result-cache\".\n */\nexport class DbQueryResultCache implements QueryResultCache {\n // -------------------------------------------------------------------------\n // Private properties\n // -------------------------------------------------------------------------\n\n private queryResultCacheTable: string\n\n private queryResultCacheDatabase?: string\n\n private queryResultCacheSchema?: string\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(protected connection: DataSource) {\n const { schema } = this.connection.driver.options as any\n const database = this.connection.driver.database\n const cacheOptions =\n typeof this.connection.options.cache === \"object\"\n ? this.connection.options.cache\n : {}\n const cacheTableName = cacheOptions.tableName || \"query-result-cache\"\n\n this.queryResultCacheDatabase = database\n this.queryResultCacheSchema = schema\n this.queryResultCacheTable = this.connection.driver.buildTableName(\n cacheTableName,\n schema,\n database,\n )\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Creates a connection with given cache provider.\n */\n async connect(): Promise<void> {}\n\n /**\n * Disconnects with given cache provider.\n */\n async disconnect(): Promise<void> {}\n\n /**\n * Creates table for storing cache if it does not exist yet.\n */\n async synchronize(queryRunner?: QueryRunner): Promise<void> {\n queryRunner = this.getQueryRunner(queryRunner)\n const driver = this.connection.driver\n const tableExist = await queryRunner.hasTable(\n this.queryResultCacheTable,\n ) // todo: table name should be configurable\n if (tableExist) return\n\n await queryRunner.createTable(\n new Table({\n database: this.queryResultCacheDatabase,\n schema: this.queryResultCacheSchema,\n name: this.queryResultCacheTable,\n columns: [\n {\n name: \"id\",\n isPrimary: true,\n isNullable: false,\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheId,\n }),\n generationStrategy:\n driver.options.type === \"spanner\"\n ? \"uuid\"\n : \"increment\",\n isGenerated: true,\n },\n {\n name: \"identifier\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheIdentifier,\n }),\n isNullable: true,\n },\n {\n name: \"time\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheTime,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: \"duration\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheDuration,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: \"query\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheQuery,\n }),\n isPrimary: false,\n isNullable: false,\n },\n {\n name: \"result\",\n type: driver.normalizeType({\n type: driver.mappedDataTypes.cacheResult,\n }),\n isNullable: false,\n },\n ],\n }),\n )\n }\n\n /**\n * Get data from cache.\n * Returns cache result if found.\n * Returns undefined if result is not cached.\n */\n getFromCache(\n options: QueryResultCacheOptions,\n queryRunner?: QueryRunner,\n ): Promise<QueryResultCacheOptions | undefined> {\n queryRunner = this.getQueryRunner(queryRunner)\n const qb = this.connection\n .createQueryBuilder(queryRunner)\n .select()\n .from(this.queryResultCacheTable, \"cache\")\n\n if (options.identifier) {\n return qb\n .where(\n `${qb.escape(\"cache\")}.${qb.escape(\n \"identifier\",\n )} = :identifier`,\n )\n .setParameters({\n identifier:\n this.connection.driver.options.type === \"mssql\"\n ? new MssqlParameter(options.identifier, \"nvarchar\")\n : options.identifier,\n })\n .cache(false) // disable cache to avoid infinite loops when cache is alwaysEnable\n .getRawOne()\n } else if (options.query) {\n if (this.connection.driver.options.type === \"oracle\") {\n return qb\n .where(\n `dbms_lob.compare(${qb.escape(\"cache\")}.${qb.escape(\n \"query\",\n )}, :query) = 0`,\n { query: options.query },\n )\n .cache(false) // disable cache to avoid infinite loops when cache is alwaysEnable\n .getRawOne()\n }\n\n return qb\n .where(`${qb.escape(\"cache\")}.${qb.escape(\"query\")} = :query`)\n .setParameters({\n query:\n this.connection.driver.options.type === \"mssql\"\n ? new MssqlParameter(options.query, \"nvarchar\")\n : options.query,\n })\n .cache(false) // disable cache to avoid infinite loops when cache is alwaysEnable\n .getRawOne()\n }\n\n return Promise.resolve(undefined)\n }\n\n /**\n * Checks if cache is expired or not.\n */\n isExpired(savedCache: QueryResultCacheOptions): boolean {\n const duration =\n typeof savedCache.duration === \"string\"\n ? parseInt(savedCache.duration)\n : savedCache.duration\n return (\n (typeof savedCache.time === \"string\"\n ? parseInt(savedCache.time as any)\n : savedCache.time)! +\n duration <\n new Date().getTime()\n )\n }\n\n /**\n * Stores given query result in the cache.\n */\n async storeInCache(\n options: QueryResultCacheOptions,\n savedCache: QueryResultCacheOptions | undefined,\n queryRunner?: QueryRunner,\n ): Promise<void> {\n const shouldCreateQueryRunner =\n queryRunner === undefined ||\n queryRunner?.getReplicationMode() === \"slave\"\n\n if (queryRunner === undefined || shouldCreateQueryRunner) {\n queryRunner = this.connection.createQueryRunner(\"master\")\n }\n\n let insertedValues: ObjectLiteral = options\n if (this.connection.driver.options.type === \"mssql\") {\n // todo: bad abstraction, re-implement this part, probably better if we create an entity metadata for cache table\n insertedValues = {\n identifier: new MssqlParameter(options.identifier, \"nvarchar\"),\n time: new MssqlParameter(options.time, \"bigint\"),\n duration: new MssqlParameter(options.duration, \"int\"),\n query: new MssqlParameter(options.query, \"nvarchar\"),\n result: new MssqlParameter(options.result, \"nvarchar\"),\n }\n }\n\n if (savedCache && savedCache.identifier) {\n // if exist then update\n const qb = queryRunner.manager\n .createQueryBuilder()\n .update(this.queryResultCacheTable)\n .set(insertedValues)\n\n qb.where(`${qb.escape(\"identifier\")} = :condition`, {\n condition: insertedValues.identifier,\n })\n await qb.execute()\n } else if (savedCache && savedCache.query) {\n // if exist then update\n const qb = queryRunner.manager\n .createQueryBuilder()\n .update(this.queryResultCacheTable)\n .set(insertedValues)\n\n if (this.connection.driver.options.type === \"oracle\") {\n qb.where(`dbms_lob.compare(\"query\", :condition) = 0`, {\n condition: insertedValues.query,\n })\n } else {\n qb.where(`${qb.escape(\"query\")} = :condition`, {\n condition: insertedValues.query,\n })\n }\n\n await qb.execute()\n } else {\n // Spanner does not support auto-generated columns\n if (\n this.connection.driver.options.type === \"spanner\" &&\n !insertedValues.id\n ) {\n insertedValues.id = uuidv4()\n }\n\n // otherwise insert\n await queryRunner.manager\n .createQueryBuilder()\n .insert()\n .into(this.queryResultCacheTable)\n .values(insertedValues)\n .execute()\n }\n\n if (shouldCreateQueryRunner) {\n await queryRunner.release()\n }\n }\n\n /**\n * Clears everything stored in the cache.\n */\n async clear(queryRunner: QueryRunner): Promise<void> {\n return this.getQueryRunner(queryRunner).clearTable(\n this.queryResultCacheTable,\n )\n }\n\n /**\n * Removes all cached results by given identifiers from cache.\n */\n async remove(\n identifiers: string[],\n queryRunner?: QueryRunner,\n ): Promise<void> {\n let _queryRunner: QueryRunner = queryRunner || this.getQueryRunner()\n await Promise.all(\n identifiers.map((identifier) => {\n const qb = _queryRunner.manager.createQueryBuilder()\n return qb\n .delete()\n .from(this.queryResultCacheTable)\n .where(`${qb.escape(\"identifier\")} = :identifier`, {\n identifier,\n })\n .execute()\n }),\n )\n\n if (!queryRunner) {\n await _queryRunner.release()\n }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets a query runner to work with.\n */\n protected getQueryRunner(queryRunner?: QueryRunner): QueryRunner {\n if (queryRunner) return queryRunner\n\n return this.connection.createQueryRunner()\n }\n}\n"],"sourceRoot":".."}
@@ -529,11 +529,12 @@ class CockroachDriver {
529
529
  */
530
530
  normalizeDefault(columnMetadata) {
531
531
  const defaultValue = columnMetadata.default;
532
+ if (defaultValue === undefined || defaultValue === null) {
533
+ return undefined;
534
+ }
532
535
  if ((columnMetadata.type === "enum" ||
533
536
  columnMetadata.type === "simple-enum") &&
534
537
  defaultValue !== undefined) {
535
- if (defaultValue === null)
536
- return "NULL";
537
538
  if (columnMetadata.isArray) {
538
539
  const enumName = this.buildEnumName(columnMetadata);
539
540
  let arrayValue = defaultValue;
@@ -581,9 +582,6 @@ class CockroachDriver {
581
582
  if (ObjectUtils_1.ObjectUtils.isObject(defaultValue) && defaultValue !== null) {
582
583
  return `'${JSON.stringify(defaultValue)}'`;
583
584
  }
584
- if (defaultValue === undefined || defaultValue === null) {
585
- return undefined;
586
- }
587
585
  return `${defaultValue}`;
588
586
  }
589
587
  /**
@@ -686,10 +684,19 @@ class CockroachDriver {
686
684
  const tableColumn = tableColumns.find((c) => c.name === columnMetadata.databaseName);
687
685
  if (!tableColumn)
688
686
  return false; // we don't need new columns, we only need exist and changed
689
- // console.log("table:", columnMetadata.entityMetadata.tableName);
690
- // console.log("name:", tableColumn.name, columnMetadata.databaseName);
691
- // console.log("type:", tableColumn.type, this.normalizeType(columnMetadata));
692
- // console.log("length:", tableColumn.length, columnMetadata.length);
687
+ // console.log("table:", columnMetadata.entityMetadata.tableName)
688
+ // console.log("name:", {
689
+ // tableColumn: tableColumn.name,
690
+ // columnMetadata: columnMetadata.databaseName,
691
+ // })
692
+ // console.log("type:", {
693
+ // tableColumn: tableColumn.type,
694
+ // columnMetadata: this.normalizeType(columnMetadata),
695
+ // })
696
+ // console.log("length:", {
697
+ // tableColumn: tableColumn.length,
698
+ // columnMetadata: columnMetadata.length,
699
+ // })
693
700
  // console.log("width:", tableColumn.width, columnMetadata.width);
694
701
  // console.log("precision:", tableColumn.precision, columnMetadata.precision);
695
702
  // console.log("scale:", tableColumn.scale, columnMetadata.scale);
@@ -699,7 +706,10 @@ class CockroachDriver {
699
706
  // console.log("isPrimary:", tableColumn.isPrimary, columnMetadata.isPrimary);
700
707
  // console.log("isNullable:", tableColumn.isNullable, columnMetadata.isNullable);
701
708
  // console.log("isUnique:", tableColumn.isUnique, this.normalizeIsUnique(columnMetadata));
702
- // console.log("isGenerated:", tableColumn.isGenerated, columnMetadata.isGenerated);
709
+ // console.log("asExpression:", {
710
+ // tableColumn: (tableColumn.asExpression || "").trim(),
711
+ // columnMetadata: (columnMetadata.asExpression || "").trim(),
712
+ // })
703
713
  // console.log("==========================================");
704
714
  return (tableColumn.name !== columnMetadata.databaseName ||
705
715
  tableColumn.type !== this.normalizeType(columnMetadata) ||