typeorm 0.3.6-dev.b84cb9b → 0.3.6-dev.cf3efec

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 (180) hide show
  1. package/README.md +1 -1
  2. package/browser/cache/RedisQueryResultCache.js +3 -0
  3. package/browser/cache/RedisQueryResultCache.js.map +1 -1
  4. package/browser/decorator/options/ColumnOptions.d.ts +10 -2
  5. package/browser/decorator/options/ColumnOptions.js.map +1 -1
  6. package/browser/decorator/options/JoinColumnOptions.d.ts +4 -0
  7. package/browser/decorator/options/JoinColumnOptions.js.map +1 -1
  8. package/browser/decorator/options/PrimaryGeneratedColumnIdentityOptions.d.ts +4 -0
  9. package/browser/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
  10. package/browser/decorator/options/PrimaryGeneratedColumnNumericOptions.d.ts +4 -0
  11. package/browser/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
  12. package/browser/decorator/options/PrimaryGeneratedColumnUUIDOptions.d.ts +4 -0
  13. package/browser/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
  14. package/browser/decorator/relations/JoinColumn.js +1 -0
  15. package/browser/decorator/relations/JoinColumn.js.map +1 -1
  16. package/browser/driver/cockroachdb/CockroachDriver.js +4 -1
  17. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  18. package/browser/driver/cockroachdb/CockroachQueryRunner.d.ts +3 -3
  19. package/browser/driver/cockroachdb/CockroachQueryRunner.js +233 -33
  20. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  21. package/browser/driver/mysql/MysqlDriver.d.ts +1 -0
  22. package/browser/driver/mysql/MysqlDriver.js +94 -23
  23. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  24. package/browser/driver/mysql/MysqlQueryRunner.js +219 -24
  25. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  26. package/browser/driver/oracle/OracleDriver.js +79 -15
  27. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  28. package/browser/driver/oracle/OracleQueryRunner.d.ts +3 -3
  29. package/browser/driver/oracle/OracleQueryRunner.js +216 -42
  30. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  31. package/browser/driver/postgres/PostgresDriver.js +95 -18
  32. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  33. package/browser/driver/postgres/PostgresQueryRunner.d.ts +3 -3
  34. package/browser/driver/postgres/PostgresQueryRunner.js +159 -59
  35. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  36. package/browser/driver/spanner/SpannerDriver.d.ts +1 -0
  37. package/browser/driver/spanner/SpannerDriver.js +52 -13
  38. package/browser/driver/spanner/SpannerDriver.js.map +1 -1
  39. package/browser/driver/spanner/SpannerQueryRunner.js +129 -43
  40. package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -1
  41. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +65 -16
  42. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  43. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +218 -32
  44. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  45. package/browser/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  46. package/browser/driver/sqlserver/SqlServerDriver.js +99 -26
  47. package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
  48. package/browser/driver/sqlserver/SqlServerQueryRunner.d.ts +3 -3
  49. package/browser/driver/sqlserver/SqlServerQueryRunner.js +251 -37
  50. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  51. package/browser/entity-schema/EntitySchemaColumnOptions.d.ts +6 -2
  52. package/browser/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  53. package/browser/entity-schema/EntitySchemaTransformer.js +2 -0
  54. package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
  55. package/browser/metadata/ColumnMetadata.d.ts +10 -2
  56. package/browser/metadata/ColumnMetadata.js +8 -0
  57. package/browser/metadata/ColumnMetadata.js.map +1 -1
  58. package/browser/metadata/ForeignKeyMetadata.d.ts +7 -0
  59. package/browser/metadata/ForeignKeyMetadata.js +4 -1
  60. package/browser/metadata/ForeignKeyMetadata.js.map +1 -1
  61. package/browser/metadata-args/JoinColumnMetadataArgs.d.ts +4 -0
  62. package/browser/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
  63. package/browser/metadata-builder/EntityMetadataValidator.js +17 -0
  64. package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
  65. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +5 -0
  66. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  67. package/browser/metadata-builder/RelationJoinColumnBuilder.js +2 -0
  68. package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  69. package/browser/query-builder/QueryBuilder.js +1 -3
  70. package/browser/query-builder/QueryBuilder.js.map +1 -1
  71. package/browser/query-runner/BaseQueryRunner.d.ts +10 -0
  72. package/browser/query-runner/BaseQueryRunner.js +25 -1
  73. package/browser/query-runner/BaseQueryRunner.js.map +1 -1
  74. package/browser/query-runner/QueryRunner.d.ts +2 -2
  75. package/browser/query-runner/QueryRunner.js.map +1 -1
  76. package/browser/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  77. package/browser/schema-builder/RdbmsSchemaBuilder.js +11 -5
  78. package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  79. package/browser/schema-builder/options/TableColumnOptions.d.ts +10 -2
  80. package/browser/schema-builder/options/TableColumnOptions.js.map +1 -1
  81. package/browser/schema-builder/table/TableColumn.d.ts +6 -2
  82. package/browser/schema-builder/table/TableColumn.js +2 -0
  83. package/browser/schema-builder/table/TableColumn.js.map +1 -1
  84. package/browser/schema-builder/util/TableUtils.js +1 -0
  85. package/browser/schema-builder/util/TableUtils.js.map +1 -1
  86. package/browser/util/escapeRegExp.d.ts +1 -0
  87. package/browser/util/escapeRegExp.js +6 -0
  88. package/browser/util/escapeRegExp.js.map +1 -0
  89. package/cache/RedisQueryResultCache.js +3 -0
  90. package/cache/RedisQueryResultCache.js.map +1 -1
  91. package/commands/InitCommand.js +1 -1
  92. package/commands/InitCommand.js.map +1 -1
  93. package/commands/MigrationGenerateCommand.js +3 -2
  94. package/commands/MigrationGenerateCommand.js.map +1 -1
  95. package/decorator/options/ColumnOptions.d.ts +10 -2
  96. package/decorator/options/ColumnOptions.js.map +1 -1
  97. package/decorator/options/JoinColumnOptions.d.ts +4 -0
  98. package/decorator/options/JoinColumnOptions.js.map +1 -1
  99. package/decorator/options/PrimaryGeneratedColumnIdentityOptions.d.ts +4 -0
  100. package/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
  101. package/decorator/options/PrimaryGeneratedColumnNumericOptions.d.ts +4 -0
  102. package/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
  103. package/decorator/options/PrimaryGeneratedColumnUUIDOptions.d.ts +4 -0
  104. package/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
  105. package/decorator/relations/JoinColumn.js +1 -0
  106. package/decorator/relations/JoinColumn.js.map +1 -1
  107. package/driver/cockroachdb/CockroachDriver.js +4 -1
  108. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  109. package/driver/cockroachdb/CockroachQueryRunner.d.ts +3 -3
  110. package/driver/cockroachdb/CockroachQueryRunner.js +233 -33
  111. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  112. package/driver/mysql/MysqlDriver.d.ts +1 -0
  113. package/driver/mysql/MysqlDriver.js +94 -23
  114. package/driver/mysql/MysqlDriver.js.map +1 -1
  115. package/driver/mysql/MysqlQueryRunner.js +219 -24
  116. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  117. package/driver/oracle/OracleDriver.js +79 -15
  118. package/driver/oracle/OracleDriver.js.map +1 -1
  119. package/driver/oracle/OracleQueryRunner.d.ts +3 -3
  120. package/driver/oracle/OracleQueryRunner.js +216 -42
  121. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  122. package/driver/postgres/PostgresDriver.js +95 -18
  123. package/driver/postgres/PostgresDriver.js.map +1 -1
  124. package/driver/postgres/PostgresQueryRunner.d.ts +3 -3
  125. package/driver/postgres/PostgresQueryRunner.js +159 -59
  126. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  127. package/driver/spanner/SpannerDriver.d.ts +1 -0
  128. package/driver/spanner/SpannerDriver.js +52 -13
  129. package/driver/spanner/SpannerDriver.js.map +1 -1
  130. package/driver/spanner/SpannerQueryRunner.js +129 -43
  131. package/driver/spanner/SpannerQueryRunner.js.map +1 -1
  132. package/driver/sqlite-abstract/AbstractSqliteDriver.js +65 -16
  133. package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  134. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +218 -32
  135. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  136. package/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  137. package/driver/sqlserver/SqlServerDriver.js +99 -26
  138. package/driver/sqlserver/SqlServerDriver.js.map +1 -1
  139. package/driver/sqlserver/SqlServerQueryRunner.d.ts +3 -3
  140. package/driver/sqlserver/SqlServerQueryRunner.js +251 -37
  141. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  142. package/entity-schema/EntitySchemaColumnOptions.d.ts +6 -2
  143. package/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  144. package/entity-schema/EntitySchemaTransformer.js +2 -0
  145. package/entity-schema/EntitySchemaTransformer.js.map +1 -1
  146. package/metadata/ColumnMetadata.d.ts +10 -2
  147. package/metadata/ColumnMetadata.js +8 -0
  148. package/metadata/ColumnMetadata.js.map +1 -1
  149. package/metadata/ForeignKeyMetadata.d.ts +7 -0
  150. package/metadata/ForeignKeyMetadata.js +4 -1
  151. package/metadata/ForeignKeyMetadata.js.map +1 -1
  152. package/metadata-args/JoinColumnMetadataArgs.d.ts +4 -0
  153. package/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
  154. package/metadata-builder/EntityMetadataValidator.js +17 -0
  155. package/metadata-builder/EntityMetadataValidator.js.map +1 -1
  156. package/metadata-builder/JunctionEntityMetadataBuilder.js +5 -0
  157. package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  158. package/metadata-builder/RelationJoinColumnBuilder.js +2 -0
  159. package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  160. package/package.json +1 -1
  161. package/query-builder/QueryBuilder.js +3 -5
  162. package/query-builder/QueryBuilder.js.map +1 -1
  163. package/query-runner/BaseQueryRunner.d.ts +10 -0
  164. package/query-runner/BaseQueryRunner.js +25 -1
  165. package/query-runner/BaseQueryRunner.js.map +1 -1
  166. package/query-runner/QueryRunner.d.ts +2 -2
  167. package/query-runner/QueryRunner.js.map +1 -1
  168. package/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  169. package/schema-builder/RdbmsSchemaBuilder.js +11 -5
  170. package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  171. package/schema-builder/options/TableColumnOptions.d.ts +10 -2
  172. package/schema-builder/options/TableColumnOptions.js.map +1 -1
  173. package/schema-builder/table/TableColumn.d.ts +6 -2
  174. package/schema-builder/table/TableColumn.js +2 -0
  175. package/schema-builder/table/TableColumn.js.map +1 -1
  176. package/schema-builder/util/TableUtils.js +1 -0
  177. package/schema-builder/util/TableUtils.js.map +1 -1
  178. package/util/escapeRegExp.d.ts +1 -0
  179. package/util/escapeRegExp.js +10 -0
  180. package/util/escapeRegExp.js.map +1 -0
@@ -224,6 +224,7 @@ export declare class SpannerDriver implements Driver {
224
224
  * Loads all driver dependencies.
225
225
  */
226
226
  protected loadDependencies(): void;
227
+ compareNullableValues(columnMetadata: ColumnMetadata, tableColumn: TableColumn): boolean;
227
228
  /**
228
229
  * Checks if "DEFAULT" values in the column metadata and in the database are equal.
229
230
  */
@@ -457,21 +457,53 @@ export class SpannerDriver {
457
457
  tableColumn.asExpression !== columnMetadata.asExpression ||
458
458
  tableColumn.generatedType !== columnMetadata.generatedType ||
459
459
  tableColumn.isPrimary !== columnMetadata.isPrimary ||
460
- tableColumn.isNullable !== columnMetadata.isNullable ||
460
+ !this.compareNullableValues(columnMetadata, tableColumn) ||
461
461
  tableColumn.isUnique !== this.normalizeIsUnique(columnMetadata);
462
462
  // DEBUG SECTION
463
- if (isColumnChanged) {
464
- console.log("table:", columnMetadata.entityMetadata.tableName);
465
- console.log("name:", tableColumn.name, columnMetadata.databaseName);
466
- console.log("type:", tableColumn.type, this.normalizeType(columnMetadata));
467
- console.log("length:", tableColumn.length, this.getColumnLength(columnMetadata));
468
- console.log("asExpression:", tableColumn.asExpression, columnMetadata.asExpression);
469
- console.log("generatedType:", tableColumn.generatedType, columnMetadata.generatedType);
470
- console.log("isPrimary:", tableColumn.isPrimary, columnMetadata.isPrimary);
471
- console.log("isNullable:", tableColumn.isNullable, columnMetadata.isNullable);
472
- console.log("isUnique:", tableColumn.isUnique, this.normalizeIsUnique(columnMetadata));
473
- console.log("==========================================");
474
- }
463
+ // if (isColumnChanged) {
464
+ // console.log("table:", columnMetadata.entityMetadata.tableName)
465
+ // console.log(
466
+ // "name:",
467
+ // tableColumn.name,
468
+ // columnMetadata.databaseName,
469
+ // )
470
+ // console.log(
471
+ // "type:",
472
+ // tableColumn.type,
473
+ // this.normalizeType(columnMetadata),
474
+ // )
475
+ // console.log(
476
+ // "length:",
477
+ // tableColumn.length,
478
+ // this.getColumnLength(columnMetadata),
479
+ // )
480
+ // console.log(
481
+ // "asExpression:",
482
+ // tableColumn.asExpression,
483
+ // columnMetadata.asExpression,
484
+ // )
485
+ // console.log(
486
+ // "generatedType:",
487
+ // tableColumn.generatedType,
488
+ // columnMetadata.generatedType,
489
+ // )
490
+ // console.log(
491
+ // "isPrimary:",
492
+ // tableColumn.isPrimary,
493
+ // columnMetadata.isPrimary,
494
+ // )
495
+ // console.log(
496
+ // "isNullable:",
497
+ // tableColumn.isNullable,
498
+ // columnMetadata.isNullable,
499
+ // )
500
+ // console.log(
501
+ // "isUnique:",
502
+ // tableColumn.isUnique,
503
+ // this.normalizeIsUnique(columnMetadata),
504
+ // )
505
+ // console.log("==========================================")
506
+ // }
475
507
  return isColumnChanged;
476
508
  });
477
509
  }
@@ -517,6 +549,13 @@ export class SpannerDriver {
517
549
  throw new DriverPackageNotInstalledError("Spanner", "@google-cloud/spanner");
518
550
  }
519
551
  }
552
+ compareNullableValues(columnMetadata, tableColumn) {
553
+ // Spanner does not support NULL/NOT NULL expressions for generated columns
554
+ if (columnMetadata.generatedType) {
555
+ return true;
556
+ }
557
+ return columnMetadata.isNullable === tableColumn.isNullable;
558
+ }
520
559
  /**
521
560
  * Checks if "DEFAULT" values in the column metadata and in the database are equal.
522
561
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../browser/src/driver/spanner/SpannerDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAA;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAGzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAM5E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAE1E,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAG5E;;GAEG;AACH,MAAM,OAAO,aAAa;IA8JtB,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAE5E,YAAY,UAAsB;QA3HlC;;WAEG;QACH,iBAAY,GAAY,KAAK,CAAA;QAE7B;;WAEG;QACH,gBAAW,GAAG,IAAI,CAAA;QAElB;;WAEG;QACH,uBAAkB,GAAG,MAAe,CAAA;QAEpC;;;;WAIG;QACH,uBAAkB,GAAiB;YAC/B,MAAM;YACN,OAAO;YACP,SAAS;YACT,SAAS;YACT,QAAQ;YACR,MAAM;YACN,OAAO;YACP,MAAM;YACN,WAAW;YACX,OAAO;SACV,CAAA;QAED;;WAEG;QACM,wBAAmB,GAAG,SAAS,CAAA;QAExC;;WAEG;QACH,iBAAY,GAAiB,EAAE,CAAA;QAE/B;;WAEG;QACH,0BAAqB,GAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAEzD;;WAEG;QACH,yBAAoB,GAAiB,EAAE,CAAA;QAEvC;;WAEG;QACH,6BAAwB,GAAiB,EAAE,CAAA;QAE3C;;WAEG;QACH,yBAAoB,GAAiB,EAAE,CAAA;QAEvC;;;WAGG;QACH,oBAAe,GAAsB;YACjC,UAAU,EAAE,WAAW;YACvB,iBAAiB,EAAE,EAAE;YACrB,UAAU,EAAE,WAAW;YACvB,iBAAiB,EAAE,EAAE;YACrB,UAAU,EAAE,WAAW;YACvB,kBAAkB,EAAE,IAAI;YACxB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,OAAO;YAClB,WAAW,EAAE,OAAO;YACpB,aAAa,EAAE,QAAQ;YACvB,kBAAkB,EAAE,OAAO;YAC3B,OAAO,EAAE,QAAQ;YACjB,eAAe,EAAE,QAAQ;YACzB,SAAS,EAAE,OAAO;YAClB,aAAa,EAAE,OAAO;YACtB,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,QAAQ;YACrB,YAAY,EAAE,QAAQ;YACtB,gBAAgB,EAAE,QAAQ;YAC1B,cAAc,EAAE,QAAQ;YACxB,aAAa,EAAE,QAAQ;YACvB,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,QAAQ;SAC1B,CAAA;QAED;;;WAGG;QACH,qBAAgB,GAAqB,EAAE,CAAA;QAEvC;;;WAGG;QACH,mBAAc,GAAG,EAAE,CAAA;QAEnB,oBAAe,GAAoB;YAC/B,OAAO,EAAE,IAAI;SAChB,CAAA;QAED;;WAEG;QACc,6BAAwB,GACrC;YACI,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK;SAChB,CAAA;QAOD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAmC,CAAA;QAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;QAE3D,qBAAqB;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAA;IAC3B,CAAC;IAED,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC9D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3E,CAAC;IAED;;OAEG;IACH,YAAY;QACR,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAA;IACjC,CAAC;IAED;;OAEG;IACH,mBAAmB;QACf,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAClD,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAAqB;QACnC,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC7C,CAAC;IAED;;;OAGG;IACH,yBAAyB,CACrB,GAAW,EACX,UAAyB,EACzB,gBAA+B;QAE/B,MAAM,iBAAiB,GAAU,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CACjC,CAAA;QACD,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM;YAC9C,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;QAEnC,GAAG,GAAG,GAAG,CAAC,OAAO,CACb,6BAA6B,EAC7B,CAAC,IAAI,EAAE,OAAe,EAAE,GAAW,EAAU,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;gBACjC,OAAO,IAAI,CAAA;aACd;YAED,IAAI,KAAK,GAAQ,UAAU,CAAC,GAAG,CAAC,CAAA;YAEhC,IAAI,KAAK,KAAK,IAAI,EAAE;gBAChB,OAAO,IAAI,CAAA;aACd;YAED,IAAI,OAAO,EAAE;gBACT,OAAO,KAAK;qBACP,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;oBACZ,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACzB,OAAO,IAAI,CAAC,eAAe,CACvB,GAAG,EACH,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAC/B,CAAA;gBACL,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC,CAAA;aAClB;YAED,IAAI,KAAK,YAAY,QAAQ,EAAE;gBAC3B,OAAO,KAAK,EAAE,CAAA;aACjB;YACD,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC7B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClE,CAAC,CACJ,CAAA,CAAC,kEAAkE;QAEpE,GAAG,GAAG,GAAG,CAAC,OAAO,CACb,4CAA4C,EAC5C,CACI,IAAI,EACJ,gBAAwB,EACxB,eAAuB,EACvB,OAAe,EACf,GAAW,EACL,EAAE;YACR,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;gBACjC,OAAO,IAAI,CAAA;aACd;YAED,IAAI,KAAK,GAAQ,UAAU,CAAC,GAAG,CAAC,CAAA;YAChC,IAAI,KAAK,KAAK,IAAI,EAAE;gBAChB,OAAO,UAAU,CAAA;aACpB;YAED,OAAO,IAAI,CAAA;QACf,CAAC,CACJ,CAAA;QACD,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAkB;QACrB,OAAO,KAAK,UAAU,IAAI,CAAA;IAC9B,CAAC;IAED;;;OAGG;IACH,cAAc,CACV,SAAiB,EACjB,MAAe,EACf,QAAiB;QAEjB,IAAI,SAAS,GAAG,CAAC,SAAS,CAAC,CAAA;QAE3B,IAAI,QAAQ,EAAE;YACV,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;SAC9B;QAED,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED;;OAEG;IACH,cAAc,CACV,MAAgE;QAEhE,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAA;QACpC,MAAM,YAAY,GAAG,SAAS,CAAA;QAE9B,IAAI,MAAM,YAAY,KAAK,IAAI,MAAM,YAAY,IAAI,EAAE;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAE/C,OAAO;gBACH,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,cAAc;gBAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,YAAY;gBACtD,SAAS,EAAE,MAAM,CAAC,SAAS;aAC9B,CAAA;SACJ;QAED,IAAI,MAAM,YAAY,eAAe,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAE9D,OAAO;gBACH,QAAQ,EACJ,MAAM,CAAC,kBAAkB;oBACzB,MAAM,CAAC,QAAQ;oBACf,cAAc;gBAClB,MAAM,EACF,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,IAAI,YAAY;gBAC5D,SAAS,EAAE,MAAM,CAAC,SAAS;aAC9B,CAAA;SACJ;QAED,IAAI,MAAM,YAAY,cAAc,EAAE;YAClC,2CAA2C;YAE3C,OAAO;gBACH,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,cAAc;gBAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,YAAY;gBACrC,SAAS,EAAE,MAAM,CAAC,SAAS;aAC9B,CAAA;SACJ;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAE/B,OAAO;YACH,QAAQ,EACJ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,cAAc;YAC/D,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;SACpD,CAAA;IACL,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,KAAU,EAAE,cAA8B;QAC7D,IAAI,cAAc,CAAC,WAAW;YAC1B,KAAK,GAAG,sBAAsB,CAAC,WAAW,CACtC,cAAc,CAAC,WAAW,EAC1B,KAAK,CACR,CAAA;QAEL,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QAEvD,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAChE,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;SACpC;aAAM,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EAAE;YACvC,OAAO,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAA;SAChD;aAAM,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EAAE;YACvC,OAAO,KAAK,CAAA;SACf;aAAM,IACH,cAAc,CAAC,IAAI,KAAK,WAAW;YACnC,cAAc,CAAC,IAAI,KAAK,IAAI,EAC9B;YACE,OAAO,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;SAC1C;QAED,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,KAAU,EAAE,cAA8B;QAC3D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YACrC,OAAO,cAAc,CAAC,WAAW;gBAC7B,CAAC,CAAC,sBAAsB,CAAC,aAAa,CAChC,cAAc,CAAC,WAAW,EAC1B,KAAK,CACR;gBACH,CAAC,CAAC,KAAK,CAAA;QAEf,IAAI,cAAc,CAAC,IAAI,KAAK,OAAO,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EAAE;YACnE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;SAC/B;aAAM,IACH,cAAc,CAAC,IAAI,KAAK,WAAW;YACnC,cAAc,CAAC,IAAI,KAAK,IAAI,EAC9B;YACE,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;SAC1B;aAAM,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE;YAC1C,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;SACtB;aAAM,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EAAE;YACvC,KAAK,GAAG,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAA;SACjD;aAAM,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EAAE;YACvC,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;SAChE;QAED,IAAI,cAAc,CAAC,WAAW;YAC1B,KAAK,GAAG,sBAAsB,CAAC,aAAa,CACxC,cAAc,CAAC,WAAW,EAC1B,KAAK,CACR,CAAA;QAEL,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAKb;QACG,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;YACxB,OAAO,OAAO,CAAA;SACjB;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;YACzD,OAAO,QAAQ,CAAA;SAClB;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;YAC7B,OAAO,WAAW,CAAA;SACrB;aAAM,IAAK,MAAM,CAAC,IAAY,KAAK,MAAM,EAAE;YACxC,OAAO,OAAO,CAAA;SACjB;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;YAChC,OAAO,MAAM,CAAA;SAChB;aAAM;YACH,OAAQ,MAAM,CAAC,IAAe,IAAI,EAAE,CAAA;SACvC;IACL,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,cAA8B;QAC3C,OAAO,cAAc,CAAC,OAAO,KAAK,EAAE;YAChC,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,GAAG;YAC/B,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAA;IACrC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAAsB;QACpC,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CACrC,CAAC,GAAG,EAAE,EAAE,CACJ,GAAG,CAAC,QAAQ;YACZ,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAChC,CAAA;IACL,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAoC;QAChD,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;QAClD,IAAI,MAAM,CAAC,kBAAkB,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QAErD,QAAQ,MAAM,CAAC,IAAI,EAAE;YACjB,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,OAAO;gBACR,OAAO,KAAK,CAAA;YAChB;gBACI,OAAO,EAAE,CAAA;SAChB;IACL,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAmB;QAC9B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QAEtB,8GAA8G;QAC9G,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;YAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAA;SAC9C;aAAM,IAAI,MAAM,CAAC,KAAK,EAAE;YACrB,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,CAAA;SAC9B;aAAM,IACH,MAAM,CAAC,SAAS,KAAK,IAAI;YACzB,MAAM,CAAC,SAAS,KAAK,SAAS;YAC9B,MAAM,CAAC,KAAK,KAAK,IAAI;YACrB,MAAM,CAAC,KAAK,KAAK,SAAS,EAC5B;YACE,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,GAAG,CAAA;SAClD;aAAM,IACH,MAAM,CAAC,SAAS,KAAK,IAAI;YACzB,MAAM,CAAC,SAAS,KAAK,SAAS,EAChC;YACE,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,GAAG,CAAA;SAClC;QAED,IAAI,MAAM,CAAC,OAAO;YAAE,IAAI,GAAG,SAAS,IAAI,GAAG,CAAA;QAE3C,OAAO,IAAI,CAAA;IACf,CAAC;IAED;;;;OAIG;IACH,sBAAsB;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAA;IAChC,CAAC;IAED;;;;OAIG;IACH,qBAAqB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,kBAAkB,CACd,QAAwB,EACxB,YAAiB,EACjB,WAAmB;QAEnB,IAAI,CAAC,YAAY,EAAE;YACf,OAAO,SAAS,CAAA;SACnB;QAED,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,EAAE;YACrC,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAA;gBACvD,IAAI,MAAM,EAAE;oBACR,QAAQ,CAAC,SAAS,CACd,GAAG,EACH,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAC3C,CAAA;oBACD,8KAA8K;iBACjL;gBACD,OAAO,GAAG,CAAA;YACd,CAAC,EAAE,EAAmB,CAAC,CAAA;SAC1B;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CACjD,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE;YACrB,IAAI,KAAU,CAAA;YACd,IACI,eAAe,CAAC,kBAAkB,KAAK,WAAW;gBAClD,YAAY,CAAC,QAAQ,EACvB;gBACE,qEAAqE;gBACrE,qEAAqE;gBACrE,KAAK,GAAG,YAAY,CAAC,QAAQ,GAAG,WAAW,CAAA;gBAC3C,8DAA8D;gBAC9D,sEAAsE;gBACtE,uDAAuD;aAC1D;YAED,OAAO,QAAQ,CAAC,SAAS,CACrB,GAAG,EACH,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CACxC,CAAA;QACL,CAAC,EACD,EAAmB,CACtB,CAAA;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1E,CAAC;IAED;;;OAGG;IACH,kBAAkB,CACd,YAA2B,EAC3B,eAAiC;QAEjC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,EAAE;YAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,YAAY,CAChD,CAAA;YACD,IAAI,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAA,CAAC,4DAA4D;YAE3F,MAAM,eAAe,GACjB,WAAW,CAAC,IAAI,KAAK,cAAc,CAAC,YAAY;gBAChD,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBACvD,WAAW,CAAC,MAAM,KAAK,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;gBAC3D,WAAW,CAAC,YAAY,KAAK,cAAc,CAAC,YAAY;gBACxD,WAAW,CAAC,aAAa,KAAK,cAAc,CAAC,aAAa;gBAC1D,WAAW,CAAC,SAAS,KAAK,cAAc,CAAC,SAAS;gBAClD,WAAW,CAAC,UAAU,KAAK,cAAc,CAAC,UAAU;gBACpD,WAAW,CAAC,QAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAA;YAEnE,gBAAgB;YAChB,IAAI,eAAe,EAAE;gBACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;gBAC9D,OAAO,CAAC,GAAG,CACP,OAAO,EACP,WAAW,CAAC,IAAI,EAChB,cAAc,CAAC,YAAY,CAC9B,CAAA;gBACD,OAAO,CAAC,GAAG,CACP,OAAO,EACP,WAAW,CAAC,IAAI,EAChB,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CACrC,CAAA;gBACD,OAAO,CAAC,GAAG,CACP,SAAS,EACT,WAAW,CAAC,MAAM,EAClB,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CACvC,CAAA;gBACD,OAAO,CAAC,GAAG,CACP,eAAe,EACf,WAAW,CAAC,YAAY,EACxB,cAAc,CAAC,YAAY,CAC9B,CAAA;gBACD,OAAO,CAAC,GAAG,CACP,gBAAgB,EAChB,WAAW,CAAC,aAAa,EACzB,cAAc,CAAC,aAAa,CAC/B,CAAA;gBACD,OAAO,CAAC,GAAG,CACP,YAAY,EACZ,WAAW,CAAC,SAAS,EACrB,cAAc,CAAC,SAAS,CAC3B,CAAA;gBACD,OAAO,CAAC,GAAG,CACP,aAAa,EACb,WAAW,CAAC,UAAU,EACtB,cAAc,CAAC,UAAU,CAC5B,CAAA;gBACD,OAAO,CAAC,GAAG,CACP,WAAW,EACX,WAAW,CAAC,QAAQ,EACpB,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CACzC,CAAA;gBACD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;aAC5D;YAED,OAAO,eAAe,CAAA;QAC1B,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,aAA4B;QAChD,OAAO,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAA;IACvD,CAAC;IAED;;OAEG;IACH,yBAAyB;QACrB,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,6BAA6B;QACzB,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,aAAqB,EAAE,KAAa;QAChD,OAAO,QAAQ,GAAG,KAAK,CAAA;IAC3B,CAAC;IAED,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAE5E;;OAEG;IACO,gBAAgB;QACtB,IAAI;YACA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAChE,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;gBAC3B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;aACpC,CAAC,CAAA;SACL;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAChB,MAAM,IAAI,8BAA8B,CACpC,SAAS,EACT,uBAAuB,CAC1B,CAAA;SACJ;IACL,CAAC;IAED;;OAEG;IACO,oBAAoB,CAC1B,mBAAuC,EACvC,aAAiC;QAEjC,IACI,OAAO,mBAAmB,KAAK,QAAQ;YACvC,OAAO,aAAa,KAAK,QAAQ,EACnC;YACE,qGAAqG;YACrG,0EAA0E;YAC1E,mBAAmB,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;YACjE,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;SACxD;QAED,OAAO,mBAAmB,KAAK,aAAa,CAAA;IAChD,CAAC;IAED;;;OAGG;IACO,yBAAyB,CAAC,KAAc;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QAExB,sCAAsC;QACtC,MAAM,kBAAkB,GACpB,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACvD,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAE7C,IAAI,kBAAkB,EAAE;YACpB,gCAAgC;YAChC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACxC,OAAO,SAAS;gBACZ,CAAC,CAAC,oBAAoB,SAAS,CAAC,CAAC,CAAC,EAAE;gBACpC,CAAC,CAAC,mBAAmB,CAAA;SAC5B;aAAM;YACH,OAAO,KAAK,CAAA;SACf;IACL,CAAC;IAED;;OAEG;IACO,aAAa,CAAC,OAAgB;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAA;QAE5B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA,CAAC,wCAAwC;QAEjF,OAAO,OAAO,CAAA;IAClB,CAAC;CACJ","file":"SpannerDriver.js","sourcesContent":["import { Driver, ReturningType } from \"../Driver\"\nimport { DriverPackageNotInstalledError } from \"../../error/DriverPackageNotInstalledError\"\nimport { SpannerQueryRunner } from \"./SpannerQueryRunner\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { ColumnMetadata } from \"../../metadata/ColumnMetadata\"\nimport { DateUtils } from \"../../util/DateUtils\"\nimport { PlatformTools } from \"../../platform/PlatformTools\"\nimport { Connection } from \"../../connection/Connection\"\nimport { RdbmsSchemaBuilder } from \"../../schema-builder/RdbmsSchemaBuilder\"\nimport { SpannerConnectionOptions } from \"./SpannerConnectionOptions\"\nimport { MappedColumnTypes } from \"../types/MappedColumnTypes\"\nimport { ColumnType } from \"../types/ColumnTypes\"\nimport { DataTypeDefaults } from \"../types/DataTypeDefaults\"\nimport { TableColumn } from \"../../schema-builder/table/TableColumn\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ApplyValueTransformers } from \"../../util/ApplyValueTransformers\"\nimport { ReplicationMode } from \"../types/ReplicationMode\"\nimport { Table } from \"../../schema-builder/table/Table\"\nimport { View } from \"../../schema-builder/view/View\"\nimport { TableForeignKey } from \"../../schema-builder/table/TableForeignKey\"\nimport { CteCapabilities } from \"../types/CteCapabilities\"\n\n/**\n * Organizes communication with Spanner DBMS.\n */\nexport class SpannerDriver implements Driver {\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * Connection used by driver.\n */\n connection: Connection\n\n /**\n * Cloud Spanner underlying library.\n */\n spanner: any\n\n /**\n * Cloud Spanner instance.\n */\n instance: any\n\n /**\n * Cloud Spanner database.\n */\n instanceDatabase: any\n\n /**\n * Database name.\n */\n database?: string\n\n // -------------------------------------------------------------------------\n // Public Implemented Properties\n // -------------------------------------------------------------------------\n\n /**\n * Connection options.\n */\n options: SpannerConnectionOptions\n\n /**\n * Indicates if replication is enabled.\n */\n isReplicated: boolean = false\n\n /**\n * Indicates if tree tables are supported by this driver.\n */\n treeSupport = true\n\n /**\n * Represent transaction support by this driver\n */\n transactionSupport = \"none\" as const\n\n /**\n * Gets list of supported column data types by a driver.\n *\n * @see https://cloud.google.com/spanner/docs/reference/standard-sql/data-types\n */\n supportedDataTypes: ColumnType[] = [\n \"bool\",\n \"int64\",\n \"float64\",\n \"numeric\",\n \"string\",\n \"json\",\n \"bytes\",\n \"date\",\n \"timestamp\",\n \"array\",\n ]\n\n /**\n * Returns type of upsert supported by driver if any\n */\n readonly supportedUpsertType = undefined\n\n /**\n * Gets list of spatial column data types.\n */\n spatialTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withLengthColumnTypes: ColumnType[] = [\"string\", \"bytes\"]\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withWidthColumnTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that support precision by a driver.\n */\n withPrecisionColumnTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that supports scale by a driver.\n */\n withScaleColumnTypes: ColumnType[] = []\n\n /**\n * ORM has special columns and we need to know what database column types should be for those columns.\n * Column types are driver dependant.\n */\n mappedDataTypes: MappedColumnTypes = {\n createDate: \"timestamp\",\n createDateDefault: \"\",\n updateDate: \"timestamp\",\n updateDateDefault: \"\",\n deleteDate: \"timestamp\",\n deleteDateNullable: true,\n version: \"int64\",\n treeLevel: \"int64\",\n migrationId: \"int64\",\n migrationName: \"string\",\n migrationTimestamp: \"int64\",\n cacheId: \"string\",\n cacheIdentifier: \"string\",\n cacheTime: \"int64\",\n cacheDuration: \"int64\",\n cacheQuery: \"string\",\n cacheResult: \"string\",\n metadataType: \"string\",\n metadataDatabase: \"string\",\n metadataSchema: \"string\",\n metadataTable: \"string\",\n metadataName: \"string\",\n metadataValue: \"string\",\n }\n\n /**\n * Default values of length, precision and scale depends on column data type.\n * Used in the cases when length/precision/scale is not specified by user.\n */\n dataTypeDefaults: DataTypeDefaults = {}\n\n /**\n * Max length allowed by MySQL for aliases.\n * @see https://dev.mysql.com/doc/refman/5.5/en/identifiers.html\n */\n maxAliasLength = 63\n\n cteCapabilities: CteCapabilities = {\n enabled: true,\n }\n\n /**\n * Supported returning types\n */\n private readonly _isReturningSqlSupported: Record<ReturningType, boolean> =\n {\n delete: false,\n insert: false,\n update: false,\n }\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(connection: Connection) {\n this.connection = connection\n this.options = connection.options as SpannerConnectionOptions\n this.isReplicated = this.options.replication ? true : false\n\n // load mysql package\n this.loadDependencies()\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Performs connection to the database.\n */\n async connect(): Promise<void> {\n this.instance = this.spanner.instance(this.options.instanceId)\n this.instanceDatabase = this.instance.database(this.options.databaseId)\n }\n\n /**\n * Makes any action after connection (e.g. create extensions in Postgres driver).\n */\n afterConnect(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Closes connection with the database.\n */\n async disconnect(): Promise<void> {\n this.instanceDatabase.close()\n }\n\n /**\n * Creates a schema builder used to build and sync a schema.\n */\n createSchemaBuilder() {\n return new RdbmsSchemaBuilder(this.connection)\n }\n\n /**\n * Creates a query runner used to execute database queries.\n */\n createQueryRunner(mode: ReplicationMode) {\n return new SpannerQueryRunner(this, mode)\n }\n\n /**\n * Replaces parameters in the given sql with special escaping character\n * and an array of parameter names to be passed to a query.\n */\n escapeQueryWithParameters(\n sql: string,\n parameters: ObjectLiteral,\n nativeParameters: ObjectLiteral,\n ): [string, any[]] {\n const escapedParameters: any[] = Object.keys(nativeParameters).map(\n (key) => nativeParameters[key],\n )\n if (!parameters || !Object.keys(parameters).length)\n return [sql, escapedParameters]\n\n sql = sql.replace(\n /:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (full, isArray: string, key: string): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n let value: any = parameters[key]\n\n if (value === null) {\n return full\n }\n\n if (isArray) {\n return value\n .map((v: any) => {\n escapedParameters.push(v)\n return this.createParameter(\n key,\n escapedParameters.length - 1,\n )\n })\n .join(\", \")\n }\n\n if (value instanceof Function) {\n return value()\n }\n escapedParameters.push(value)\n return this.createParameter(key, escapedParameters.length - 1)\n },\n ) // todo: make replace only in value statements, otherwise problems\n\n sql = sql.replace(\n /([ ]+)?=([ ]+)?:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (\n full,\n emptySpaceBefore: string,\n emptySpaceAfter: string,\n isArray: string,\n key: string,\n ): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n let value: any = parameters[key]\n if (value === null) {\n return \" IS NULL\"\n }\n\n return full\n },\n )\n return [sql, escapedParameters]\n }\n\n /**\n * Escapes a column name.\n */\n escape(columnName: string): string {\n return `\\`${columnName}\\``\n }\n\n /**\n * Build full table name with database name, schema name and table name.\n * E.g. myDB.mySchema.myTable\n */\n buildTableName(\n tableName: string,\n schema?: string,\n database?: string,\n ): string {\n let tablePath = [tableName]\n\n if (database) {\n tablePath.unshift(database)\n }\n\n return tablePath.join(\".\")\n }\n\n /**\n * Parse a target table name or other types and return a normalized table definition.\n */\n parseTableName(\n target: EntityMetadata | Table | View | TableForeignKey | string,\n ): { database?: string; schema?: string; tableName: string } {\n const driverDatabase = this.database\n const driverSchema = undefined\n\n if (target instanceof Table || target instanceof View) {\n const parsed = this.parseTableName(target.name)\n\n return {\n database: target.database || parsed.database || driverDatabase,\n schema: target.schema || parsed.schema || driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof TableForeignKey) {\n const parsed = this.parseTableName(target.referencedTableName)\n\n return {\n database:\n target.referencedDatabase ||\n parsed.database ||\n driverDatabase,\n schema:\n target.referencedSchema || parsed.schema || driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof EntityMetadata) {\n // EntityMetadata tableName is never a path\n\n return {\n database: target.database || driverDatabase,\n schema: target.schema || driverSchema,\n tableName: target.tableName,\n }\n }\n\n const parts = target.split(\".\")\n\n return {\n database:\n (parts.length > 1 ? parts[0] : undefined) || driverDatabase,\n schema: driverSchema,\n tableName: parts.length > 1 ? parts[1] : parts[0],\n }\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type and metadata.\n */\n preparePersistentValue(value: any, columnMetadata: ColumnMetadata): any {\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformTo(\n columnMetadata.transformer,\n value,\n )\n\n if (value === null || value === undefined) return value\n\n if (columnMetadata.type === \"numeric\") {\n const lib = this.options.driver || PlatformTools.load(\"spanner\")\n return lib.Spanner.numeric(value)\n } else if (columnMetadata.type === \"date\") {\n return DateUtils.mixedDateToDateString(value)\n } else if (columnMetadata.type === \"json\") {\n return value\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n return DateUtils.mixedDateToDate(value)\n }\n\n return value\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type or metadata.\n */\n prepareHydratedValue(value: any, columnMetadata: ColumnMetadata): any {\n if (value === null || value === undefined)\n return columnMetadata.transformer\n ? ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n : value\n\n if (columnMetadata.type === Boolean || columnMetadata.type === \"bool\") {\n value = value ? true : false\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n value = new Date(value)\n } else if (columnMetadata.type === \"numeric\") {\n value = value.value\n } else if (columnMetadata.type === \"date\") {\n value = DateUtils.mixedDateToDateString(value)\n } else if (columnMetadata.type === \"json\") {\n value = typeof value === \"string\" ? JSON.parse(value) : value\n }\n\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n\n return value\n }\n\n /**\n * Creates a database type from a given column metadata.\n */\n normalizeType(column: {\n type: ColumnType\n length?: number | string\n precision?: number | null\n scale?: number\n }): string {\n if (column.type === Number) {\n return \"int64\"\n } else if (column.type === String || column.type === \"uuid\") {\n return \"string\"\n } else if (column.type === Date) {\n return \"timestamp\"\n } else if ((column.type as any) === Buffer) {\n return \"bytes\"\n } else if (column.type === Boolean) {\n return \"bool\"\n } else {\n return (column.type as string) || \"\"\n }\n }\n\n /**\n * Normalizes \"default\" value of the column.\n *\n * Spanner does not support default values.\n */\n normalizeDefault(columnMetadata: ColumnMetadata): string | undefined {\n return columnMetadata.default === \"\"\n ? `\"${columnMetadata.default}\"`\n : `${columnMetadata.default}`\n }\n\n /**\n * Normalizes \"isUnique\" value of the column.\n */\n normalizeIsUnique(column: ColumnMetadata): boolean {\n return column.entityMetadata.indices.some(\n (idx) =>\n idx.isUnique &&\n idx.columns.length === 1 &&\n idx.columns[0] === column,\n )\n }\n\n /**\n * Returns default column lengths, which is required on column creation.\n */\n getColumnLength(column: ColumnMetadata | TableColumn): string {\n if (column.length) return column.length.toString()\n if (column.generationStrategy === \"uuid\") return \"36\"\n\n switch (column.type) {\n case String:\n case \"string\":\n case \"bytes\":\n return \"max\"\n default:\n return \"\"\n }\n }\n\n /**\n * Creates column type definition including length, precision and scale\n */\n createFullType(column: TableColumn): string {\n let type = column.type\n\n // used 'getColumnLength()' method, because Spanner requires column length for `string` and `bytes` data types\n if (this.getColumnLength(column)) {\n type += `(${this.getColumnLength(column)})`\n } else if (column.width) {\n type += `(${column.width})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined &&\n column.scale !== null &&\n column.scale !== undefined\n ) {\n type += `(${column.precision},${column.scale})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined\n ) {\n type += `(${column.precision})`\n }\n\n if (column.isArray) type = `array<${type}>`\n\n return type\n }\n\n /**\n * Obtains a new database connection to a master server.\n * Used for replication.\n * If replication is not setup then returns default connection's database connection.\n */\n obtainMasterConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Obtains a new database connection to a slave server.\n * Used for replication.\n * If replication is not setup then returns master (default) connection's database connection.\n */\n obtainSlaveConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Creates generated map of values generated or returned by database after INSERT query.\n */\n createGeneratedMap(\n metadata: EntityMetadata,\n insertResult: any,\n entityIndex: number,\n ) {\n if (!insertResult) {\n return undefined\n }\n\n if (insertResult.insertId === undefined) {\n return Object.keys(insertResult).reduce((map, key) => {\n const column = metadata.findColumnWithDatabaseName(key)\n if (column) {\n OrmUtils.mergeDeep(\n map,\n column.createValueMap(insertResult[key]),\n )\n // OrmUtils.mergeDeep(map, column.createValueMap(this.prepareHydratedValue(insertResult[key], column))); // TODO: probably should be like there, but fails on enums, fix later\n }\n return map\n }, {} as ObjectLiteral)\n }\n\n const generatedMap = metadata.generatedColumns.reduce(\n (map, generatedColumn) => {\n let value: any\n if (\n generatedColumn.generationStrategy === \"increment\" &&\n insertResult.insertId\n ) {\n // NOTE: When multiple rows is inserted by a single INSERT statement,\n // `insertId` is the value generated for the first inserted row only.\n value = insertResult.insertId + entityIndex\n // } else if (generatedColumn.generationStrategy === \"uuid\") {\n // console.log(\"getting db value:\", generatedColumn.databaseName);\n // value = generatedColumn.getEntityValue(uuidMap);\n }\n\n return OrmUtils.mergeDeep(\n map,\n generatedColumn.createValueMap(value),\n )\n },\n {} as ObjectLiteral,\n )\n\n return Object.keys(generatedMap).length > 0 ? generatedMap : undefined\n }\n\n /**\n * Differentiate columns of this table and columns from the given column metadatas columns\n * and returns only changed.\n */\n findChangedColumns(\n tableColumns: TableColumn[],\n columnMetadatas: ColumnMetadata[],\n ): ColumnMetadata[] {\n return columnMetadatas.filter((columnMetadata) => {\n const tableColumn = tableColumns.find(\n (c) => c.name === columnMetadata.databaseName,\n )\n if (!tableColumn) return false // we don't need new columns, we only need exist and changed\n\n const isColumnChanged =\n tableColumn.name !== columnMetadata.databaseName ||\n tableColumn.type !== this.normalizeType(columnMetadata) ||\n tableColumn.length !== this.getColumnLength(columnMetadata) ||\n tableColumn.asExpression !== columnMetadata.asExpression ||\n tableColumn.generatedType !== columnMetadata.generatedType ||\n tableColumn.isPrimary !== columnMetadata.isPrimary ||\n tableColumn.isNullable !== columnMetadata.isNullable ||\n tableColumn.isUnique !== this.normalizeIsUnique(columnMetadata)\n\n // DEBUG SECTION\n if (isColumnChanged) {\n console.log(\"table:\", columnMetadata.entityMetadata.tableName)\n console.log(\n \"name:\",\n tableColumn.name,\n columnMetadata.databaseName,\n )\n console.log(\n \"type:\",\n tableColumn.type,\n this.normalizeType(columnMetadata),\n )\n console.log(\n \"length:\",\n tableColumn.length,\n this.getColumnLength(columnMetadata),\n )\n console.log(\n \"asExpression:\",\n tableColumn.asExpression,\n columnMetadata.asExpression,\n )\n console.log(\n \"generatedType:\",\n tableColumn.generatedType,\n columnMetadata.generatedType,\n )\n console.log(\n \"isPrimary:\",\n tableColumn.isPrimary,\n columnMetadata.isPrimary,\n )\n console.log(\n \"isNullable:\",\n tableColumn.isNullable,\n columnMetadata.isNullable,\n )\n console.log(\n \"isUnique:\",\n tableColumn.isUnique,\n this.normalizeIsUnique(columnMetadata),\n )\n console.log(\"==========================================\")\n }\n\n return isColumnChanged\n })\n }\n\n /**\n * Returns true if driver supports RETURNING / OUTPUT statement.\n */\n isReturningSqlSupported(returningType: ReturningType): boolean {\n return this._isReturningSqlSupported[returningType]\n }\n\n /**\n * Returns true if driver supports uuid values generation on its own.\n */\n isUUIDGenerationSupported(): boolean {\n return false\n }\n\n /**\n * Returns true if driver supports fulltext indices.\n */\n isFullTextColumnTypeSupported(): boolean {\n return false\n }\n\n /**\n * Creates an escaped parameter.\n */\n createParameter(parameterName: string, index: number): string {\n return \"@param\" + index\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads all driver dependencies.\n */\n protected loadDependencies(): void {\n try {\n const lib = this.options.driver || PlatformTools.load(\"spanner\")\n this.spanner = new lib.Spanner({\n projectId: this.options.projectId,\n })\n } catch (e) {\n console.error(e)\n throw new DriverPackageNotInstalledError(\n \"Spanner\",\n \"@google-cloud/spanner\",\n )\n }\n }\n\n /**\n * Checks if \"DEFAULT\" values in the column metadata and in the database are equal.\n */\n protected compareDefaultValues(\n columnMetadataValue: string | undefined,\n databaseValue: string | undefined,\n ): boolean {\n if (\n typeof columnMetadataValue === \"string\" &&\n typeof databaseValue === \"string\"\n ) {\n // we need to cut out \"'\" because in mysql we can understand returned value is a string or a function\n // as result compare cannot understand if default is really changed or not\n columnMetadataValue = columnMetadataValue.replace(/^'+|'+$/g, \"\")\n databaseValue = databaseValue.replace(/^'+|'+$/g, \"\")\n }\n\n return columnMetadataValue === databaseValue\n }\n\n /**\n * If parameter is a datetime function, e.g. \"CURRENT_TIMESTAMP\", normalizes it.\n * Otherwise returns original input.\n */\n protected normalizeDatetimeFunction(value?: string) {\n if (!value) return value\n\n // check if input is datetime function\n const isDatetimeFunction =\n value.toUpperCase().indexOf(\"CURRENT_TIMESTAMP\") !== -1 ||\n value.toUpperCase().indexOf(\"NOW\") !== -1\n\n if (isDatetimeFunction) {\n // extract precision, e.g. \"(3)\"\n const precision = value.match(/\\(\\d+\\)/)\n return precision\n ? `CURRENT_TIMESTAMP${precision[0]}`\n : \"CURRENT_TIMESTAMP\"\n } else {\n return value\n }\n }\n\n /**\n * Escapes a given comment.\n */\n protected escapeComment(comment?: string) {\n if (!comment) return comment\n\n comment = comment.replace(/\\u0000/g, \"\") // Null bytes aren't allowed in comments\n\n return comment\n }\n}\n"],"sourceRoot":"../.."}
1
+ {"version":3,"sources":["../browser/src/driver/spanner/SpannerDriver.ts"],"names":[],"mappings":"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","file":"SpannerDriver.js","sourcesContent":["import { Driver, ReturningType } from \"../Driver\"\nimport { DriverPackageNotInstalledError } from \"../../error/DriverPackageNotInstalledError\"\nimport { SpannerQueryRunner } from \"./SpannerQueryRunner\"\nimport { ObjectLiteral } from \"../../common/ObjectLiteral\"\nimport { ColumnMetadata } from \"../../metadata/ColumnMetadata\"\nimport { DateUtils } from \"../../util/DateUtils\"\nimport { PlatformTools } from \"../../platform/PlatformTools\"\nimport { Connection } from \"../../connection/Connection\"\nimport { RdbmsSchemaBuilder } from \"../../schema-builder/RdbmsSchemaBuilder\"\nimport { SpannerConnectionOptions } from \"./SpannerConnectionOptions\"\nimport { MappedColumnTypes } from \"../types/MappedColumnTypes\"\nimport { ColumnType } from \"../types/ColumnTypes\"\nimport { DataTypeDefaults } from \"../types/DataTypeDefaults\"\nimport { TableColumn } from \"../../schema-builder/table/TableColumn\"\nimport { EntityMetadata } from \"../../metadata/EntityMetadata\"\nimport { OrmUtils } from \"../../util/OrmUtils\"\nimport { ApplyValueTransformers } from \"../../util/ApplyValueTransformers\"\nimport { ReplicationMode } from \"../types/ReplicationMode\"\nimport { Table } from \"../../schema-builder/table/Table\"\nimport { View } from \"../../schema-builder/view/View\"\nimport { TableForeignKey } from \"../../schema-builder/table/TableForeignKey\"\nimport { CteCapabilities } from \"../types/CteCapabilities\"\n\n/**\n * Organizes communication with Spanner DBMS.\n */\nexport class SpannerDriver implements Driver {\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * Connection used by driver.\n */\n connection: Connection\n\n /**\n * Cloud Spanner underlying library.\n */\n spanner: any\n\n /**\n * Cloud Spanner instance.\n */\n instance: any\n\n /**\n * Cloud Spanner database.\n */\n instanceDatabase: any\n\n /**\n * Database name.\n */\n database?: string\n\n // -------------------------------------------------------------------------\n // Public Implemented Properties\n // -------------------------------------------------------------------------\n\n /**\n * Connection options.\n */\n options: SpannerConnectionOptions\n\n /**\n * Indicates if replication is enabled.\n */\n isReplicated: boolean = false\n\n /**\n * Indicates if tree tables are supported by this driver.\n */\n treeSupport = true\n\n /**\n * Represent transaction support by this driver\n */\n transactionSupport = \"none\" as const\n\n /**\n * Gets list of supported column data types by a driver.\n *\n * @see https://cloud.google.com/spanner/docs/reference/standard-sql/data-types\n */\n supportedDataTypes: ColumnType[] = [\n \"bool\",\n \"int64\",\n \"float64\",\n \"numeric\",\n \"string\",\n \"json\",\n \"bytes\",\n \"date\",\n \"timestamp\",\n \"array\",\n ]\n\n /**\n * Returns type of upsert supported by driver if any\n */\n readonly supportedUpsertType = undefined\n\n /**\n * Gets list of spatial column data types.\n */\n spatialTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withLengthColumnTypes: ColumnType[] = [\"string\", \"bytes\"]\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withWidthColumnTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that support precision by a driver.\n */\n withPrecisionColumnTypes: ColumnType[] = []\n\n /**\n * Gets list of column data types that supports scale by a driver.\n */\n withScaleColumnTypes: ColumnType[] = []\n\n /**\n * ORM has special columns and we need to know what database column types should be for those columns.\n * Column types are driver dependant.\n */\n mappedDataTypes: MappedColumnTypes = {\n createDate: \"timestamp\",\n createDateDefault: \"\",\n updateDate: \"timestamp\",\n updateDateDefault: \"\",\n deleteDate: \"timestamp\",\n deleteDateNullable: true,\n version: \"int64\",\n treeLevel: \"int64\",\n migrationId: \"int64\",\n migrationName: \"string\",\n migrationTimestamp: \"int64\",\n cacheId: \"string\",\n cacheIdentifier: \"string\",\n cacheTime: \"int64\",\n cacheDuration: \"int64\",\n cacheQuery: \"string\",\n cacheResult: \"string\",\n metadataType: \"string\",\n metadataDatabase: \"string\",\n metadataSchema: \"string\",\n metadataTable: \"string\",\n metadataName: \"string\",\n metadataValue: \"string\",\n }\n\n /**\n * Default values of length, precision and scale depends on column data type.\n * Used in the cases when length/precision/scale is not specified by user.\n */\n dataTypeDefaults: DataTypeDefaults = {}\n\n /**\n * Max length allowed by MySQL for aliases.\n * @see https://dev.mysql.com/doc/refman/5.5/en/identifiers.html\n */\n maxAliasLength = 63\n\n cteCapabilities: CteCapabilities = {\n enabled: true,\n }\n\n /**\n * Supported returning types\n */\n private readonly _isReturningSqlSupported: Record<ReturningType, boolean> =\n {\n delete: false,\n insert: false,\n update: false,\n }\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(connection: Connection) {\n this.connection = connection\n this.options = connection.options as SpannerConnectionOptions\n this.isReplicated = this.options.replication ? true : false\n\n // load mysql package\n this.loadDependencies()\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Performs connection to the database.\n */\n async connect(): Promise<void> {\n this.instance = this.spanner.instance(this.options.instanceId)\n this.instanceDatabase = this.instance.database(this.options.databaseId)\n }\n\n /**\n * Makes any action after connection (e.g. create extensions in Postgres driver).\n */\n afterConnect(): Promise<void> {\n return Promise.resolve()\n }\n\n /**\n * Closes connection with the database.\n */\n async disconnect(): Promise<void> {\n this.instanceDatabase.close()\n }\n\n /**\n * Creates a schema builder used to build and sync a schema.\n */\n createSchemaBuilder() {\n return new RdbmsSchemaBuilder(this.connection)\n }\n\n /**\n * Creates a query runner used to execute database queries.\n */\n createQueryRunner(mode: ReplicationMode) {\n return new SpannerQueryRunner(this, mode)\n }\n\n /**\n * Replaces parameters in the given sql with special escaping character\n * and an array of parameter names to be passed to a query.\n */\n escapeQueryWithParameters(\n sql: string,\n parameters: ObjectLiteral,\n nativeParameters: ObjectLiteral,\n ): [string, any[]] {\n const escapedParameters: any[] = Object.keys(nativeParameters).map(\n (key) => nativeParameters[key],\n )\n if (!parameters || !Object.keys(parameters).length)\n return [sql, escapedParameters]\n\n sql = sql.replace(\n /:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (full, isArray: string, key: string): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n let value: any = parameters[key]\n\n if (value === null) {\n return full\n }\n\n if (isArray) {\n return value\n .map((v: any) => {\n escapedParameters.push(v)\n return this.createParameter(\n key,\n escapedParameters.length - 1,\n )\n })\n .join(\", \")\n }\n\n if (value instanceof Function) {\n return value()\n }\n escapedParameters.push(value)\n return this.createParameter(key, escapedParameters.length - 1)\n },\n ) // todo: make replace only in value statements, otherwise problems\n\n sql = sql.replace(\n /([ ]+)?=([ ]+)?:(\\.\\.\\.)?([A-Za-z0-9_.]+)/g,\n (\n full,\n emptySpaceBefore: string,\n emptySpaceAfter: string,\n isArray: string,\n key: string,\n ): string => {\n if (!parameters.hasOwnProperty(key)) {\n return full\n }\n\n let value: any = parameters[key]\n if (value === null) {\n return \" IS NULL\"\n }\n\n return full\n },\n )\n return [sql, escapedParameters]\n }\n\n /**\n * Escapes a column name.\n */\n escape(columnName: string): string {\n return `\\`${columnName}\\``\n }\n\n /**\n * Build full table name with database name, schema name and table name.\n * E.g. myDB.mySchema.myTable\n */\n buildTableName(\n tableName: string,\n schema?: string,\n database?: string,\n ): string {\n let tablePath = [tableName]\n\n if (database) {\n tablePath.unshift(database)\n }\n\n return tablePath.join(\".\")\n }\n\n /**\n * Parse a target table name or other types and return a normalized table definition.\n */\n parseTableName(\n target: EntityMetadata | Table | View | TableForeignKey | string,\n ): { database?: string; schema?: string; tableName: string } {\n const driverDatabase = this.database\n const driverSchema = undefined\n\n if (target instanceof Table || target instanceof View) {\n const parsed = this.parseTableName(target.name)\n\n return {\n database: target.database || parsed.database || driverDatabase,\n schema: target.schema || parsed.schema || driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof TableForeignKey) {\n const parsed = this.parseTableName(target.referencedTableName)\n\n return {\n database:\n target.referencedDatabase ||\n parsed.database ||\n driverDatabase,\n schema:\n target.referencedSchema || parsed.schema || driverSchema,\n tableName: parsed.tableName,\n }\n }\n\n if (target instanceof EntityMetadata) {\n // EntityMetadata tableName is never a path\n\n return {\n database: target.database || driverDatabase,\n schema: target.schema || driverSchema,\n tableName: target.tableName,\n }\n }\n\n const parts = target.split(\".\")\n\n return {\n database:\n (parts.length > 1 ? parts[0] : undefined) || driverDatabase,\n schema: driverSchema,\n tableName: parts.length > 1 ? parts[1] : parts[0],\n }\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type and metadata.\n */\n preparePersistentValue(value: any, columnMetadata: ColumnMetadata): any {\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformTo(\n columnMetadata.transformer,\n value,\n )\n\n if (value === null || value === undefined) return value\n\n if (columnMetadata.type === \"numeric\") {\n const lib = this.options.driver || PlatformTools.load(\"spanner\")\n return lib.Spanner.numeric(value)\n } else if (columnMetadata.type === \"date\") {\n return DateUtils.mixedDateToDateString(value)\n } else if (columnMetadata.type === \"json\") {\n return value\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n return DateUtils.mixedDateToDate(value)\n }\n\n return value\n }\n\n /**\n * Prepares given value to a value to be persisted, based on its column type or metadata.\n */\n prepareHydratedValue(value: any, columnMetadata: ColumnMetadata): any {\n if (value === null || value === undefined)\n return columnMetadata.transformer\n ? ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n : value\n\n if (columnMetadata.type === Boolean || columnMetadata.type === \"bool\") {\n value = value ? true : false\n } else if (\n columnMetadata.type === \"timestamp\" ||\n columnMetadata.type === Date\n ) {\n value = new Date(value)\n } else if (columnMetadata.type === \"numeric\") {\n value = value.value\n } else if (columnMetadata.type === \"date\") {\n value = DateUtils.mixedDateToDateString(value)\n } else if (columnMetadata.type === \"json\") {\n value = typeof value === \"string\" ? JSON.parse(value) : value\n }\n\n if (columnMetadata.transformer)\n value = ApplyValueTransformers.transformFrom(\n columnMetadata.transformer,\n value,\n )\n\n return value\n }\n\n /**\n * Creates a database type from a given column metadata.\n */\n normalizeType(column: {\n type: ColumnType\n length?: number | string\n precision?: number | null\n scale?: number\n }): string {\n if (column.type === Number) {\n return \"int64\"\n } else if (column.type === String || column.type === \"uuid\") {\n return \"string\"\n } else if (column.type === Date) {\n return \"timestamp\"\n } else if ((column.type as any) === Buffer) {\n return \"bytes\"\n } else if (column.type === Boolean) {\n return \"bool\"\n } else {\n return (column.type as string) || \"\"\n }\n }\n\n /**\n * Normalizes \"default\" value of the column.\n *\n * Spanner does not support default values.\n */\n normalizeDefault(columnMetadata: ColumnMetadata): string | undefined {\n return columnMetadata.default === \"\"\n ? `\"${columnMetadata.default}\"`\n : `${columnMetadata.default}`\n }\n\n /**\n * Normalizes \"isUnique\" value of the column.\n */\n normalizeIsUnique(column: ColumnMetadata): boolean {\n return column.entityMetadata.indices.some(\n (idx) =>\n idx.isUnique &&\n idx.columns.length === 1 &&\n idx.columns[0] === column,\n )\n }\n\n /**\n * Returns default column lengths, which is required on column creation.\n */\n getColumnLength(column: ColumnMetadata | TableColumn): string {\n if (column.length) return column.length.toString()\n if (column.generationStrategy === \"uuid\") return \"36\"\n\n switch (column.type) {\n case String:\n case \"string\":\n case \"bytes\":\n return \"max\"\n default:\n return \"\"\n }\n }\n\n /**\n * Creates column type definition including length, precision and scale\n */\n createFullType(column: TableColumn): string {\n let type = column.type\n\n // used 'getColumnLength()' method, because Spanner requires column length for `string` and `bytes` data types\n if (this.getColumnLength(column)) {\n type += `(${this.getColumnLength(column)})`\n } else if (column.width) {\n type += `(${column.width})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined &&\n column.scale !== null &&\n column.scale !== undefined\n ) {\n type += `(${column.precision},${column.scale})`\n } else if (\n column.precision !== null &&\n column.precision !== undefined\n ) {\n type += `(${column.precision})`\n }\n\n if (column.isArray) type = `array<${type}>`\n\n return type\n }\n\n /**\n * Obtains a new database connection to a master server.\n * Used for replication.\n * If replication is not setup then returns default connection's database connection.\n */\n obtainMasterConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Obtains a new database connection to a slave server.\n * Used for replication.\n * If replication is not setup then returns master (default) connection's database connection.\n */\n obtainSlaveConnection(): Promise<any> {\n return this.instanceDatabase\n }\n\n /**\n * Creates generated map of values generated or returned by database after INSERT query.\n */\n createGeneratedMap(\n metadata: EntityMetadata,\n insertResult: any,\n entityIndex: number,\n ) {\n if (!insertResult) {\n return undefined\n }\n\n if (insertResult.insertId === undefined) {\n return Object.keys(insertResult).reduce((map, key) => {\n const column = metadata.findColumnWithDatabaseName(key)\n if (column) {\n OrmUtils.mergeDeep(\n map,\n column.createValueMap(insertResult[key]),\n )\n // OrmUtils.mergeDeep(map, column.createValueMap(this.prepareHydratedValue(insertResult[key], column))); // TODO: probably should be like there, but fails on enums, fix later\n }\n return map\n }, {} as ObjectLiteral)\n }\n\n const generatedMap = metadata.generatedColumns.reduce(\n (map, generatedColumn) => {\n let value: any\n if (\n generatedColumn.generationStrategy === \"increment\" &&\n insertResult.insertId\n ) {\n // NOTE: When multiple rows is inserted by a single INSERT statement,\n // `insertId` is the value generated for the first inserted row only.\n value = insertResult.insertId + entityIndex\n // } else if (generatedColumn.generationStrategy === \"uuid\") {\n // console.log(\"getting db value:\", generatedColumn.databaseName);\n // value = generatedColumn.getEntityValue(uuidMap);\n }\n\n return OrmUtils.mergeDeep(\n map,\n generatedColumn.createValueMap(value),\n )\n },\n {} as ObjectLiteral,\n )\n\n return Object.keys(generatedMap).length > 0 ? generatedMap : undefined\n }\n\n /**\n * Differentiate columns of this table and columns from the given column metadatas columns\n * and returns only changed.\n */\n findChangedColumns(\n tableColumns: TableColumn[],\n columnMetadatas: ColumnMetadata[],\n ): ColumnMetadata[] {\n return columnMetadatas.filter((columnMetadata) => {\n const tableColumn = tableColumns.find(\n (c) => c.name === columnMetadata.databaseName,\n )\n if (!tableColumn) return false // we don't need new columns, we only need exist and changed\n\n const isColumnChanged =\n tableColumn.name !== columnMetadata.databaseName ||\n tableColumn.type !== this.normalizeType(columnMetadata) ||\n tableColumn.length !== this.getColumnLength(columnMetadata) ||\n tableColumn.asExpression !== columnMetadata.asExpression ||\n tableColumn.generatedType !== columnMetadata.generatedType ||\n tableColumn.isPrimary !== columnMetadata.isPrimary ||\n !this.compareNullableValues(columnMetadata, tableColumn) ||\n tableColumn.isUnique !== this.normalizeIsUnique(columnMetadata)\n\n // DEBUG SECTION\n // if (isColumnChanged) {\n // console.log(\"table:\", columnMetadata.entityMetadata.tableName)\n // console.log(\n // \"name:\",\n // tableColumn.name,\n // columnMetadata.databaseName,\n // )\n // console.log(\n // \"type:\",\n // tableColumn.type,\n // this.normalizeType(columnMetadata),\n // )\n // console.log(\n // \"length:\",\n // tableColumn.length,\n // this.getColumnLength(columnMetadata),\n // )\n // console.log(\n // \"asExpression:\",\n // tableColumn.asExpression,\n // columnMetadata.asExpression,\n // )\n // console.log(\n // \"generatedType:\",\n // tableColumn.generatedType,\n // columnMetadata.generatedType,\n // )\n // console.log(\n // \"isPrimary:\",\n // tableColumn.isPrimary,\n // columnMetadata.isPrimary,\n // )\n // console.log(\n // \"isNullable:\",\n // tableColumn.isNullable,\n // columnMetadata.isNullable,\n // )\n // console.log(\n // \"isUnique:\",\n // tableColumn.isUnique,\n // this.normalizeIsUnique(columnMetadata),\n // )\n // console.log(\"==========================================\")\n // }\n\n return isColumnChanged\n })\n }\n\n /**\n * Returns true if driver supports RETURNING / OUTPUT statement.\n */\n isReturningSqlSupported(returningType: ReturningType): boolean {\n return this._isReturningSqlSupported[returningType]\n }\n\n /**\n * Returns true if driver supports uuid values generation on its own.\n */\n isUUIDGenerationSupported(): boolean {\n return false\n }\n\n /**\n * Returns true if driver supports fulltext indices.\n */\n isFullTextColumnTypeSupported(): boolean {\n return false\n }\n\n /**\n * Creates an escaped parameter.\n */\n createParameter(parameterName: string, index: number): string {\n return \"@param\" + index\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Loads all driver dependencies.\n */\n protected loadDependencies(): void {\n try {\n const lib = this.options.driver || PlatformTools.load(\"spanner\")\n this.spanner = new lib.Spanner({\n projectId: this.options.projectId,\n })\n } catch (e) {\n console.error(e)\n throw new DriverPackageNotInstalledError(\n \"Spanner\",\n \"@google-cloud/spanner\",\n )\n }\n }\n\n compareNullableValues(\n columnMetadata: ColumnMetadata,\n tableColumn: TableColumn,\n ): boolean {\n // Spanner does not support NULL/NOT NULL expressions for generated columns\n if (columnMetadata.generatedType) {\n return true\n }\n\n return columnMetadata.isNullable === tableColumn.isNullable\n }\n\n /**\n * Checks if \"DEFAULT\" values in the column metadata and in the database are equal.\n */\n protected compareDefaultValues(\n columnMetadataValue: string | undefined,\n databaseValue: string | undefined,\n ): boolean {\n if (\n typeof columnMetadataValue === \"string\" &&\n typeof databaseValue === \"string\"\n ) {\n // we need to cut out \"'\" because in mysql we can understand returned value is a string or a function\n // as result compare cannot understand if default is really changed or not\n columnMetadataValue = columnMetadataValue.replace(/^'+|'+$/g, \"\")\n databaseValue = databaseValue.replace(/^'+|'+$/g, \"\")\n }\n\n return columnMetadataValue === databaseValue\n }\n\n /**\n * If parameter is a datetime function, e.g. \"CURRENT_TIMESTAMP\", normalizes it.\n * Otherwise returns original input.\n */\n protected normalizeDatetimeFunction(value?: string) {\n if (!value) return value\n\n // check if input is datetime function\n const isDatetimeFunction =\n value.toUpperCase().indexOf(\"CURRENT_TIMESTAMP\") !== -1 ||\n value.toUpperCase().indexOf(\"NOW\") !== -1\n\n if (isDatetimeFunction) {\n // extract precision, e.g. \"(3)\"\n const precision = value.match(/\\(\\d+\\)/)\n return precision\n ? `CURRENT_TIMESTAMP${precision[0]}`\n : \"CURRENT_TIMESTAMP\"\n } else {\n return value\n }\n }\n\n /**\n * Escapes a given comment.\n */\n protected escapeComment(comment?: string) {\n if (!comment) return comment\n\n comment = comment.replace(/\\u0000/g, \"\") // Null bytes aren't allowed in comments\n\n return comment\n }\n}\n"],"sourceRoot":"../.."}
@@ -349,6 +349,23 @@ export class SpannerQueryRunner extends BaseQueryRunner {
349
349
  downQueries.push(this.dropIndexSql(table, index));
350
350
  });
351
351
  }
352
+ // if table has column with generated type, we must add the expression to the metadata table
353
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
354
+ for (const column of generatedColumns) {
355
+ const insertQuery = this.insertTypeormMetadataSql({
356
+ table: table.name,
357
+ type: MetadataTableType.GENERATED_COLUMN,
358
+ name: column.name,
359
+ value: column.asExpression,
360
+ });
361
+ const deleteQuery = this.deleteTypeormMetadataSql({
362
+ table: table.name,
363
+ type: MetadataTableType.GENERATED_COLUMN,
364
+ name: column.name,
365
+ });
366
+ upQueries.push(insertQuery);
367
+ downQueries.push(deleteQuery);
368
+ }
352
369
  await this.executeQueries(upQueries, downQueries);
353
370
  }
354
371
  /**
@@ -378,6 +395,23 @@ export class SpannerQueryRunner extends BaseQueryRunner {
378
395
  table.foreignKeys.forEach((foreignKey) => upQueries.push(this.dropForeignKeySql(table, foreignKey)));
379
396
  upQueries.push(this.dropTableSql(table));
380
397
  downQueries.push(this.createTableSql(table, createForeignKeys));
398
+ // if table had columns with generated type, we must remove the expression from the metadata table
399
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
400
+ for (const column of generatedColumns) {
401
+ const deleteQuery = this.deleteTypeormMetadataSql({
402
+ table: table.name,
403
+ type: MetadataTableType.GENERATED_COLUMN,
404
+ name: column.name,
405
+ });
406
+ const insertQuery = this.insertTypeormMetadataSql({
407
+ table: table.name,
408
+ type: MetadataTableType.GENERATED_COLUMN,
409
+ name: column.name,
410
+ value: column.asExpression,
411
+ });
412
+ upQueries.push(deleteQuery);
413
+ downQueries.push(insertQuery);
414
+ }
381
415
  await this.executeQueries(upQueries, downQueries);
382
416
  }
383
417
  /**
@@ -447,6 +481,21 @@ export class SpannerQueryRunner extends BaseQueryRunner {
447
481
  upQueries.push(this.createIndexSql(table, uniqueIndex));
448
482
  downQueries.push(this.dropIndexSql(table, uniqueIndex));
449
483
  }
484
+ if (column.generatedType && column.asExpression) {
485
+ const insertQuery = this.insertTypeormMetadataSql({
486
+ table: table.name,
487
+ type: MetadataTableType.GENERATED_COLUMN,
488
+ name: column.name,
489
+ value: column.asExpression,
490
+ });
491
+ const deleteQuery = this.deleteTypeormMetadataSql({
492
+ table: table.name,
493
+ type: MetadataTableType.GENERATED_COLUMN,
494
+ name: column.name,
495
+ });
496
+ upQueries.push(insertQuery);
497
+ downQueries.push(deleteQuery);
498
+ }
450
499
  await this.executeQueries(upQueries, downQueries);
451
500
  clonedTable.addColumn(column);
452
501
  this.replaceCachedTable(table, clonedTable);
@@ -499,8 +548,9 @@ export class SpannerQueryRunner extends BaseQueryRunner {
499
548
  if (oldColumn.name !== newColumn.name ||
500
549
  oldColumn.type !== newColumn.type ||
501
550
  oldColumn.length !== newColumn.length ||
502
- newColumn.isArray !== oldColumn.isArray ||
503
- oldColumn.generatedType !== newColumn.generatedType) {
551
+ oldColumn.isArray !== newColumn.isArray ||
552
+ oldColumn.generatedType !== newColumn.generatedType ||
553
+ oldColumn.asExpression !== newColumn.asExpression) {
504
554
  // To avoid data conversion, we just recreate column
505
555
  await this.dropColumn(table, oldColumn);
506
556
  await this.addColumn(table, newColumn);
@@ -553,8 +603,6 @@ export class SpannerQueryRunner extends BaseQueryRunner {
553
603
  downQueries.push(this.createIndexSql(table, uniqueIndex));
554
604
  }
555
605
  }
556
- if (newColumn.generatedType !== oldColumn.generatedType) {
557
- }
558
606
  }
559
607
  await this.executeQueries(upQueries, downQueries);
560
608
  this.replaceCachedTable(table, clonedTable);
@@ -601,6 +649,21 @@ export class SpannerQueryRunner extends BaseQueryRunner {
601
649
  }
602
650
  upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} DROP COLUMN ${this.driver.escape(column.name)}`));
603
651
  downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ADD ${this.buildCreateColumnSql(column)}`));
652
+ if (column.generatedType && column.asExpression) {
653
+ const deleteQuery = this.deleteTypeormMetadataSql({
654
+ table: table.name,
655
+ type: MetadataTableType.GENERATED_COLUMN,
656
+ name: column.name,
657
+ });
658
+ const insertQuery = this.insertTypeormMetadataSql({
659
+ table: table.name,
660
+ type: MetadataTableType.GENERATED_COLUMN,
661
+ name: column.name,
662
+ value: column.asExpression,
663
+ });
664
+ upQueries.push(deleteQuery);
665
+ downQueries.push(insertQuery);
666
+ }
604
667
  await this.executeQueries(upQueries, downQueries);
605
668
  clonedTable.removeColumn(column);
606
669
  this.replaceCachedTable(table, clonedTable);
@@ -850,8 +913,10 @@ export class SpannerQueryRunner extends BaseQueryRunner {
850
913
  `WHERE \`TABLE_CATALOG\` = '' AND \`TABLE_SCHEMA\` = '' AND \`CONSTRAINT_TYPE\` = 'FOREIGN KEY'`;
851
914
  const dropFKQueries = await this.query(selectFKDropsQuery);
852
915
  // drop view queries
853
- const selectViewDropsQuery = `SELECT concat('DROP VIEW \`', TABLE_NAME, '\`') AS \`query\` FROM \`INFORMATION_SCHEMA\`.\`VIEWS\``;
854
- const dropViewQueries = await this.query(selectViewDropsQuery);
916
+ // const selectViewDropsQuery = `SELECT concat('DROP VIEW \`', TABLE_NAME, '\`') AS \`query\` FROM \`INFORMATION_SCHEMA\`.\`VIEWS\``
917
+ // const dropViewQueries: ObjectLiteral[] = await this.query(
918
+ // selectViewDropsQuery,
919
+ // )
855
920
  // drop table queries
856
921
  const dropTablesQuery = `SELECT concat('DROP TABLE \`', TABLE_NAME, '\`') AS \`query\` ` +
857
922
  `FROM \`INFORMATION_SCHEMA\`.\`TABLES\` ` +
@@ -859,7 +924,7 @@ export class SpannerQueryRunner extends BaseQueryRunner {
859
924
  const dropTableQueries = await this.query(dropTablesQuery);
860
925
  if (!dropIndexQueries.length &&
861
926
  !dropFKQueries.length &&
862
- !dropViewQueries.length &&
927
+ // !dropViewQueries.length &&
863
928
  !dropTableQueries.length)
864
929
  return;
865
930
  const isAnotherTransactionActive = this.isTransactionActive;
@@ -872,9 +937,9 @@ export class SpannerQueryRunner extends BaseQueryRunner {
872
937
  for (let query of dropFKQueries) {
873
938
  await this.updateDDL(query["query"]);
874
939
  }
875
- for (let query of dropViewQueries) {
876
- await this.updateDDL(query["query"]);
877
- }
940
+ // for (let query of dropViewQueries) {
941
+ // await this.updateDDL(query["query"])
942
+ // }
878
943
  for (let query of dropTableQueries) {
879
944
  await this.updateDDL(query["query"]);
880
945
  }
@@ -923,29 +988,38 @@ export class SpannerQueryRunner extends BaseQueryRunner {
923
988
  // Protected Methods
924
989
  // -------------------------------------------------------------------------
925
990
  async loadViews(viewNames) {
926
- const hasTable = await this.hasTable(this.getTypeormMetadataTableName());
927
- if (!hasTable) {
928
- return [];
929
- }
930
- if (!viewNames) {
931
- viewNames = [];
932
- }
933
- const escapedViewNames = viewNames
934
- .map((viewName) => `'${viewName}'`)
935
- .join(", ");
936
- const query = `SELECT \`T\`.*, \`V\`.\`VIEW_DEFINITION\` FROM ${this.escapePath(this.getTypeormMetadataTableName())} \`T\` ` +
937
- `INNER JOIN \`INFORMATION_SCHEMA\`.\`VIEWS\` \`V\` ON \`V\`.\`TABLE_NAME\` = \`T\`.\`NAME\` ` +
938
- `WHERE \`T\`.\`TYPE\` = '${MetadataTableType.VIEW}' ${viewNames.length
939
- ? ` AND \`T\`.\`NAME\` IN (${escapedViewNames})`
940
- : ""}`;
941
- const dbViews = await this.query(query);
942
- return dbViews.map((dbView) => {
943
- const view = new View();
944
- view.database = dbView["NAME"];
945
- view.name = this.driver.buildTableName(dbView["NAME"]);
946
- view.expression = dbView["NAME"];
947
- return view;
948
- });
991
+ // const hasTable = await this.hasTable(this.getTypeormMetadataTableName())
992
+ // if (!hasTable) {
993
+ // return []
994
+ // }
995
+ //
996
+ // if (!viewNames) {
997
+ // viewNames = []
998
+ // }
999
+ //
1000
+ // const escapedViewNames = viewNames
1001
+ // .map((viewName) => `'${viewName}'`)
1002
+ // .join(", ")
1003
+ //
1004
+ // const query =
1005
+ // `SELECT \`T\`.*, \`V\`.\`VIEW_DEFINITION\` FROM ${this.escapePath(
1006
+ // this.getTypeormMetadataTableName(),
1007
+ // )} \`T\` ` +
1008
+ // `INNER JOIN \`INFORMATION_SCHEMA\`.\`VIEWS\` \`V\` ON \`V\`.\`TABLE_NAME\` = \`T\`.\`NAME\` ` +
1009
+ // `WHERE \`T\`.\`TYPE\` = '${MetadataTableType.VIEW}' ${
1010
+ // viewNames.length
1011
+ // ? ` AND \`T\`.\`NAME\` IN (${escapedViewNames})`
1012
+ // : ""
1013
+ // }`
1014
+ // const dbViews = await this.query(query)
1015
+ // return dbViews.map((dbView: any) => {
1016
+ // const view = new View()
1017
+ // view.database = dbView["NAME"]
1018
+ // view.name = this.driver.buildTableName(dbView["NAME"])
1019
+ // view.expression = dbView["NAME"]
1020
+ // return view
1021
+ // })
1022
+ return Promise.resolve([]);
949
1023
  }
950
1024
  /**
951
1025
  * Loads all tables (with given names) from the database and creates a Table from them.
@@ -1017,9 +1091,10 @@ export class SpannerQueryRunner extends BaseQueryRunner {
1017
1091
  const table = new Table();
1018
1092
  table.name = this.driver.buildTableName(dbTable["TABLE_NAME"]);
1019
1093
  // create columns from the loaded columns
1020
- table.columns = dbColumns
1021
- .filter((dbColumn) => dbColumn["TABLE_NAME"] === dbTable["TABLE_NAME"])
1022
- .map((dbColumn) => {
1094
+ table.columns = await Promise.all(dbColumns
1095
+ .filter((dbColumn) => dbColumn["TABLE_NAME"] ===
1096
+ dbTable["TABLE_NAME"])
1097
+ .map(async (dbColumn) => {
1023
1098
  const columnUniqueIndices = dbIndices.filter((dbIndex) => {
1024
1099
  return (dbIndex["TABLE_NAME"] ===
1025
1100
  dbTable["TABLE_NAME"] &&
@@ -1063,10 +1138,20 @@ export class SpannerQueryRunner extends BaseQueryRunner {
1063
1138
  if (dbColumn["IS_GENERATED"] === "ALWAYS") {
1064
1139
  tableColumn.asExpression =
1065
1140
  dbColumn["GENERATION_EXPRESSION"];
1066
- tableColumn.generatedType =
1067
- dbColumn["IS_STORED"] === "YES"
1068
- ? "STORED"
1069
- : "VIRTUAL";
1141
+ tableColumn.generatedType = "STORED";
1142
+ // We cannot relay on information_schema.columns.generation_expression, because it is formatted different.
1143
+ const asExpressionQuery = await this.selectTypeormMetadataSql({
1144
+ table: dbTable["TABLE_NAME"],
1145
+ type: MetadataTableType.GENERATED_COLUMN,
1146
+ name: tableColumn.name,
1147
+ });
1148
+ const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
1149
+ if (results[0] && results[0].value) {
1150
+ tableColumn.asExpression = results[0].value;
1151
+ }
1152
+ else {
1153
+ tableColumn.asExpression = "";
1154
+ }
1070
1155
  }
1071
1156
  tableColumn.isUnique =
1072
1157
  columnUniqueIndices.length > 0 &&
@@ -1081,7 +1166,7 @@ export class SpannerQueryRunner extends BaseQueryRunner {
1081
1166
  dbColumn["COLUMN_NAME"]);
1082
1167
  });
1083
1168
  return tableColumn;
1084
- });
1169
+ }));
1085
1170
  const tableForeignKeys = dbForeignKeys.filter((dbForeignKey) => {
1086
1171
  return (dbForeignKey["TABLE_NAME"] === dbTable["TABLE_NAME"]);
1087
1172
  });
@@ -1318,8 +1403,9 @@ export class SpannerQueryRunner extends BaseQueryRunner {
1318
1403
  */
1319
1404
  buildCreateColumnSql(column) {
1320
1405
  let c = `${this.driver.escape(column.name)} ${this.connection.driver.createFullType(column)}`;
1321
- if (column.asExpression) {
1322
- c += ` AS (${column.asExpression}) ${column.generatedType ? column.generatedType : "STORED"}`;
1406
+ // Spanner supports only STORED generated column type
1407
+ if (column.generatedType === "STORED" && column.asExpression) {
1408
+ c += ` AS (${column.asExpression}) STORED`;
1323
1409
  }
1324
1410
  else {
1325
1411
  if (!column.isNullable)