kysely 0.11.4 → 0.13.0

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 (262) hide show
  1. package/README.md +35 -11
  2. package/dist/cjs/dialect/dialect-adapter-base.d.ts +36 -0
  3. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +38 -2
  4. package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -1
  5. package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +16 -0
  6. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +29 -0
  7. package/dist/cjs/dialect/mysql/mysql-introspector.d.ts +3 -0
  8. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +38 -2
  9. package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -1
  10. package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +16 -0
  11. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +29 -0
  12. package/dist/cjs/dialect/postgres/postgres-introspector.d.ts +3 -0
  13. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +38 -2
  14. package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +16 -0
  15. package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +29 -0
  16. package/dist/cjs/dialect/sqlite/sqlite-introspector.d.ts +3 -0
  17. package/dist/cjs/driver/default-connection-provider.d.ts +4 -0
  18. package/dist/cjs/driver/runtime-driver.d.ts +29 -0
  19. package/dist/cjs/driver/single-connection-provider.d.ts +4 -0
  20. package/dist/cjs/dynamic/dynamic-reference-builder.d.ts +1 -0
  21. package/dist/cjs/dynamic/dynamic-reference-builder.js +9 -1
  22. package/dist/cjs/dynamic/dynamic.d.ts +6 -7
  23. package/dist/cjs/dynamic/dynamic.js +6 -7
  24. package/dist/cjs/index.d.ts +15 -4
  25. package/dist/cjs/index.js +12 -1
  26. package/dist/cjs/kysely.d.ts +170 -11
  27. package/dist/cjs/kysely.js +69 -9
  28. package/dist/cjs/migration/migration.d.ts +156 -13
  29. package/dist/cjs/migration/migration.js +256 -135
  30. package/dist/cjs/operation-node/column-definition-node.d.ts +6 -5
  31. package/dist/cjs/operation-node/column-definition-node.js +0 -4
  32. package/dist/cjs/operation-node/common-table-expression-name-node.d.ts +15 -0
  33. package/dist/cjs/operation-node/common-table-expression-name-node.js +23 -0
  34. package/dist/cjs/operation-node/common-table-expression-node.d.ts +3 -3
  35. package/dist/cjs/operation-node/create-table-node.d.ts +6 -2
  36. package/dist/cjs/operation-node/create-table-node.js +6 -6
  37. package/dist/cjs/operation-node/create-view-node.d.ts +1 -0
  38. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -4
  39. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  40. package/dist/cjs/operation-node/operation-node-transformer.js +22 -2
  41. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  42. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  43. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  44. package/dist/cjs/operation-node/query-node.d.ts +0 -2
  45. package/dist/cjs/operation-node/query-node.js +0 -10
  46. package/dist/cjs/operation-node/values-node.d.ts +15 -0
  47. package/dist/cjs/operation-node/values-node.js +18 -0
  48. package/dist/cjs/operation-node/with-node.d.ts +3 -1
  49. package/dist/cjs/operation-node/with-node.js +2 -1
  50. package/dist/cjs/package.json +1 -3
  51. package/dist/cjs/parser/complex-expression-parser.d.ts +9 -0
  52. package/dist/cjs/parser/complex-expression-parser.js +25 -0
  53. package/dist/cjs/parser/filter-parser.d.ts +13 -4
  54. package/dist/cjs/parser/filter-parser.js +21 -24
  55. package/dist/cjs/parser/insert-values-parser.d.ts +5 -9
  56. package/dist/cjs/parser/insert-values-parser.js +27 -41
  57. package/dist/cjs/parser/order-by-parser.d.ts +1 -1
  58. package/dist/cjs/parser/parse-context.d.ts +22 -8
  59. package/dist/cjs/parser/parse-context.js +10 -10
  60. package/dist/cjs/parser/reference-parser.d.ts +8 -7
  61. package/dist/cjs/parser/reference-parser.js +8 -17
  62. package/dist/cjs/parser/returning-parser.d.ts +1 -5
  63. package/dist/cjs/parser/select-parser.d.ts +12 -14
  64. package/dist/cjs/parser/select-parser.js +5 -9
  65. package/dist/cjs/parser/table-parser.d.ts +9 -11
  66. package/dist/cjs/parser/table-parser.js +2 -8
  67. package/dist/cjs/parser/union-parser.d.ts +2 -2
  68. package/dist/cjs/parser/union-parser.js +1 -6
  69. package/dist/cjs/parser/update-set-parser.d.ts +2 -8
  70. package/dist/cjs/parser/update-set-parser.js +6 -26
  71. package/dist/cjs/parser/value-parser.d.ts +9 -6
  72. package/dist/cjs/parser/value-parser.js +7 -30
  73. package/dist/cjs/parser/with-parser.d.ts +36 -6
  74. package/dist/cjs/parser/with-parser.js +13 -2
  75. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +36 -2
  76. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
  77. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  78. package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +34 -0
  79. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +8 -0
  80. package/dist/cjs/query-builder/delete-query-builder.d.ts +647 -0
  81. package/dist/cjs/query-builder/delete-query-builder.js +185 -0
  82. package/dist/cjs/query-builder/expression-builder.d.ts +8 -6
  83. package/dist/cjs/query-builder/expression-builder.js +3 -3
  84. package/dist/cjs/query-builder/function-builder.d.ts +2 -1
  85. package/dist/cjs/query-builder/function-builder.js +2 -1
  86. package/dist/cjs/query-builder/having-interface.d.ts +49 -0
  87. package/dist/cjs/query-builder/having-interface.js +2 -0
  88. package/dist/cjs/query-builder/insert-query-builder.d.ts +504 -0
  89. package/dist/cjs/query-builder/insert-query-builder.js +256 -0
  90. package/dist/cjs/query-builder/insert-result.d.ts +3 -2
  91. package/dist/cjs/query-builder/insert-result.js +3 -2
  92. package/dist/cjs/query-builder/join-builder.d.ts +19 -20
  93. package/dist/cjs/query-builder/join-builder.js +12 -12
  94. package/dist/cjs/query-builder/join-interface.d.ts +130 -0
  95. package/dist/cjs/query-builder/join-interface.js +2 -0
  96. package/dist/cjs/query-builder/no-result-error.d.ts +9 -0
  97. package/dist/cjs/query-builder/no-result-error.js +14 -0
  98. package/dist/cjs/query-builder/returning-interface.d.ts +73 -0
  99. package/dist/cjs/query-builder/returning-interface.js +2 -0
  100. package/dist/cjs/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -651
  101. package/dist/cjs/query-builder/select-query-builder.js +571 -0
  102. package/dist/cjs/query-builder/update-query-builder.d.ts +735 -0
  103. package/dist/cjs/query-builder/update-query-builder.js +279 -0
  104. package/dist/cjs/query-builder/where-interface.d.ts +378 -0
  105. package/dist/cjs/query-builder/where-interface.js +2 -0
  106. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
  107. package/dist/cjs/query-compiler/default-query-compiler.js +37 -6
  108. package/dist/cjs/query-creator.d.ts +69 -43
  109. package/dist/cjs/query-creator.js +66 -29
  110. package/dist/cjs/query-executor/default-query-executor.d.ts +19 -0
  111. package/dist/cjs/query-executor/noop-query-executor.d.ts +19 -0
  112. package/dist/cjs/query-executor/query-executor.d.ts +1 -1
  113. package/dist/cjs/query-executor/query-executor.js +1 -1
  114. package/dist/cjs/raw-builder/raw-builder.d.ts +2 -0
  115. package/dist/cjs/raw-builder/raw-builder.js +7 -1
  116. package/dist/cjs/schema/alter-table-builder.d.ts +230 -2
  117. package/dist/cjs/schema/alter-table-builder.js +12 -0
  118. package/dist/cjs/schema/column-definition-builder.d.ts +147 -20
  119. package/dist/cjs/schema/column-definition-builder.js +4 -1
  120. package/dist/cjs/schema/create-index-builder.d.ts +2 -1
  121. package/dist/cjs/schema/create-index-builder.js +2 -1
  122. package/dist/cjs/schema/create-table-builder.d.ts +26 -9
  123. package/dist/cjs/schema/create-table-builder.js +42 -9
  124. package/dist/cjs/schema/create-view-builder.d.ts +17 -3
  125. package/dist/cjs/schema/create-view-builder.js +25 -16
  126. package/dist/cjs/schema/schema.d.ts +18 -11
  127. package/dist/cjs/schema/schema.js +18 -11
  128. package/dist/cjs/util/log.d.ts +3 -2
  129. package/dist/cjs/util/log.js +8 -15
  130. package/dist/cjs/util/type-utils.d.ts +7 -7
  131. package/dist/esm/dialect/dialect-adapter-base.d.ts +36 -0
  132. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +38 -2
  133. package/dist/esm/dialect/mysql/mysql-adapter.js +2 -1
  134. package/dist/esm/dialect/mysql/mysql-dialect.d.ts +16 -0
  135. package/dist/esm/dialect/mysql/mysql-driver.d.ts +29 -0
  136. package/dist/esm/dialect/mysql/mysql-introspector.d.ts +3 -0
  137. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +38 -2
  138. package/dist/esm/dialect/postgres/postgres-adapter.js +2 -1
  139. package/dist/esm/dialect/postgres/postgres-dialect.d.ts +16 -0
  140. package/dist/esm/dialect/postgres/postgres-driver.d.ts +29 -0
  141. package/dist/esm/dialect/postgres/postgres-introspector.d.ts +3 -0
  142. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +38 -2
  143. package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +16 -0
  144. package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +29 -0
  145. package/dist/esm/dialect/sqlite/sqlite-introspector.d.ts +3 -0
  146. package/dist/esm/driver/default-connection-provider.d.ts +4 -0
  147. package/dist/esm/driver/runtime-driver.d.ts +29 -0
  148. package/dist/esm/driver/single-connection-provider.d.ts +4 -0
  149. package/dist/esm/dynamic/dynamic-reference-builder.d.ts +1 -0
  150. package/dist/esm/dynamic/dynamic-reference-builder.js +7 -0
  151. package/dist/esm/dynamic/dynamic.d.ts +6 -7
  152. package/dist/esm/dynamic/dynamic.js +6 -7
  153. package/dist/esm/index.d.ts +15 -4
  154. package/dist/esm/index.js +12 -1
  155. package/dist/esm/kysely.d.ts +170 -11
  156. package/dist/esm/kysely.js +69 -9
  157. package/dist/esm/migration/migration.d.ts +156 -13
  158. package/dist/esm/migration/migration.js +255 -134
  159. package/dist/esm/operation-node/column-definition-node.d.ts +6 -5
  160. package/dist/esm/operation-node/column-definition-node.js +0 -4
  161. package/dist/esm/operation-node/common-table-expression-name-node.d.ts +15 -0
  162. package/dist/esm/operation-node/common-table-expression-name-node.js +20 -0
  163. package/dist/esm/operation-node/common-table-expression-node.d.ts +3 -3
  164. package/dist/esm/operation-node/create-table-node.d.ts +6 -2
  165. package/dist/esm/operation-node/create-table-node.js +6 -6
  166. package/dist/esm/operation-node/create-view-node.d.ts +1 -0
  167. package/dist/esm/operation-node/insert-query-node.d.ts +4 -4
  168. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  169. package/dist/esm/operation-node/operation-node-transformer.js +22 -2
  170. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  171. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  172. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  173. package/dist/esm/operation-node/query-node.d.ts +0 -2
  174. package/dist/esm/operation-node/query-node.js +0 -10
  175. package/dist/esm/operation-node/values-node.d.ts +15 -0
  176. package/dist/esm/operation-node/values-node.js +15 -0
  177. package/dist/esm/operation-node/with-node.d.ts +3 -1
  178. package/dist/esm/operation-node/with-node.js +2 -1
  179. package/dist/esm/package.json +1 -3
  180. package/dist/esm/parser/complex-expression-parser.d.ts +9 -0
  181. package/dist/esm/parser/complex-expression-parser.js +20 -0
  182. package/dist/esm/parser/filter-parser.d.ts +13 -4
  183. package/dist/esm/parser/filter-parser.js +21 -24
  184. package/dist/esm/parser/insert-values-parser.d.ts +5 -9
  185. package/dist/esm/parser/insert-values-parser.js +27 -40
  186. package/dist/esm/parser/order-by-parser.d.ts +1 -1
  187. package/dist/esm/parser/parse-context.d.ts +22 -8
  188. package/dist/esm/parser/parse-context.js +10 -10
  189. package/dist/esm/parser/reference-parser.d.ts +8 -7
  190. package/dist/esm/parser/reference-parser.js +9 -18
  191. package/dist/esm/parser/returning-parser.d.ts +1 -5
  192. package/dist/esm/parser/select-parser.d.ts +12 -14
  193. package/dist/esm/parser/select-parser.js +6 -10
  194. package/dist/esm/parser/table-parser.d.ts +9 -11
  195. package/dist/esm/parser/table-parser.js +3 -9
  196. package/dist/esm/parser/union-parser.d.ts +2 -2
  197. package/dist/esm/parser/union-parser.js +1 -6
  198. package/dist/esm/parser/update-set-parser.d.ts +2 -8
  199. package/dist/esm/parser/update-set-parser.js +5 -24
  200. package/dist/esm/parser/value-parser.d.ts +9 -6
  201. package/dist/esm/parser/value-parser.js +8 -31
  202. package/dist/esm/parser/with-parser.d.ts +36 -6
  203. package/dist/esm/parser/with-parser.js +13 -2
  204. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +36 -2
  205. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
  206. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  207. package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +34 -0
  208. package/dist/esm/plugin/with-schema/with-schema-transformer.js +8 -0
  209. package/dist/esm/query-builder/delete-query-builder.d.ts +647 -0
  210. package/dist/esm/query-builder/delete-query-builder.js +181 -0
  211. package/dist/esm/query-builder/expression-builder.d.ts +8 -6
  212. package/dist/esm/query-builder/expression-builder.js +3 -3
  213. package/dist/esm/query-builder/function-builder.d.ts +2 -1
  214. package/dist/esm/query-builder/function-builder.js +2 -1
  215. package/dist/esm/query-builder/having-interface.d.ts +49 -0
  216. package/dist/esm/query-builder/having-interface.js +1 -0
  217. package/dist/esm/query-builder/insert-query-builder.d.ts +504 -0
  218. package/dist/esm/query-builder/insert-query-builder.js +252 -0
  219. package/dist/esm/query-builder/insert-result.d.ts +3 -2
  220. package/dist/esm/query-builder/insert-result.js +3 -2
  221. package/dist/esm/query-builder/join-builder.d.ts +19 -20
  222. package/dist/esm/query-builder/join-builder.js +12 -12
  223. package/dist/esm/query-builder/join-interface.d.ts +130 -0
  224. package/dist/esm/query-builder/join-interface.js +1 -0
  225. package/dist/esm/query-builder/no-result-error.d.ts +9 -0
  226. package/dist/esm/query-builder/no-result-error.js +10 -0
  227. package/dist/esm/query-builder/returning-interface.d.ts +73 -0
  228. package/dist/esm/query-builder/returning-interface.js +1 -0
  229. package/dist/esm/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -651
  230. package/dist/esm/query-builder/select-query-builder.js +566 -0
  231. package/dist/esm/query-builder/update-query-builder.d.ts +735 -0
  232. package/dist/esm/query-builder/update-query-builder.js +275 -0
  233. package/dist/esm/query-builder/where-interface.d.ts +378 -0
  234. package/dist/esm/query-builder/where-interface.js +1 -0
  235. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
  236. package/dist/esm/query-compiler/default-query-compiler.js +37 -6
  237. package/dist/esm/query-creator.d.ts +69 -43
  238. package/dist/esm/query-creator.js +66 -29
  239. package/dist/esm/query-executor/default-query-executor.d.ts +19 -0
  240. package/dist/esm/query-executor/noop-query-executor.d.ts +19 -0
  241. package/dist/esm/query-executor/query-executor.d.ts +1 -1
  242. package/dist/esm/query-executor/query-executor.js +1 -1
  243. package/dist/esm/raw-builder/raw-builder.d.ts +2 -0
  244. package/dist/esm/raw-builder/raw-builder.js +7 -1
  245. package/dist/esm/schema/alter-table-builder.d.ts +230 -2
  246. package/dist/esm/schema/alter-table-builder.js +12 -0
  247. package/dist/esm/schema/column-definition-builder.d.ts +147 -20
  248. package/dist/esm/schema/column-definition-builder.js +4 -1
  249. package/dist/esm/schema/create-index-builder.d.ts +2 -1
  250. package/dist/esm/schema/create-index-builder.js +2 -1
  251. package/dist/esm/schema/create-table-builder.d.ts +26 -9
  252. package/dist/esm/schema/create-table-builder.js +43 -10
  253. package/dist/esm/schema/create-view-builder.d.ts +17 -3
  254. package/dist/esm/schema/create-view-builder.js +25 -16
  255. package/dist/esm/schema/schema.d.ts +18 -11
  256. package/dist/esm/schema/schema.js +18 -11
  257. package/dist/esm/util/log.d.ts +3 -2
  258. package/dist/esm/util/log.js +7 -14
  259. package/dist/esm/util/type-utils.d.ts +7 -7
  260. package/package.json +10 -8
  261. package/dist/cjs/query-builder/query-builder.js +0 -1067
  262. package/dist/esm/query-builder/query-builder.js +0 -1061
@@ -1,9 +1,10 @@
1
1
  import * as path from 'path';
2
2
  import { promises as fs } from 'fs';
3
- import { getLast, isFunction, isObject, isString, } from '../util/object-utils.js';
3
+ import { freeze, getLast, isFunction, isObject, isString, } from '../util/object-utils.js';
4
4
  export const MIGRATION_TABLE = 'kysely_migration';
5
5
  export const MIGRATION_LOCK_TABLE = 'kysely_migration_lock';
6
6
  export const MIGRATION_LOCK_ID = 'migration_lock';
7
+ export const NO_MIGRATIONS = freeze({ __noMigrations__: true });
7
8
  export class MigrationModule {
8
9
  #db;
9
10
  #adapter;
@@ -12,170 +13,290 @@ export class MigrationModule {
12
13
  this.#adapter = adapter;
13
14
  }
14
15
  async migrateToLatest(migrationsOrFolderPath) {
15
- await ensureMigrationTablesExists(this.#db);
16
- const allMigrations = await this.#getAllMigrations(migrationsOrFolderPath);
17
- await this.#migrateToLatest(allMigrations);
16
+ return this.#migrate(migrationsOrFolderPath, ({ migrations }) => migrations.length - 1);
18
17
  }
19
- async #getAllMigrations(migrationsOrFolderPath) {
20
- return isString(migrationsOrFolderPath)
21
- ? await readMigrationsFromFolder(migrationsOrFolderPath)
22
- : migrationsOrFolderPath;
18
+ async migrateTo(migrationsOrFolderPath, targetMigrationName) {
19
+ return this.#migrate(migrationsOrFolderPath, ({ migrations }) => {
20
+ if (targetMigrationName === NO_MIGRATIONS) {
21
+ return -1;
22
+ }
23
+ const index = migrations.findIndex((it) => it.name === targetMigrationName);
24
+ if (index === -1) {
25
+ throw new Error(`migration "${targetMigrationName}" doesn't exist`);
26
+ }
27
+ return index;
28
+ });
29
+ }
30
+ async migrateUp(migrationsOrFolderPath) {
31
+ return this.#migrate(migrationsOrFolderPath, ({ currentIndex, migrations }) => Math.min(currentIndex + 1, migrations.length - 1));
32
+ }
33
+ async migrateDown(migrationsOrFolderPath) {
34
+ return this.#migrate(migrationsOrFolderPath, ({ currentIndex }) => Math.max(currentIndex - 1, -1));
35
+ }
36
+ async #migrate(migrationsOrFolderPath, getTargetMigration) {
37
+ try {
38
+ await this.#ensureMigrationTablesExists();
39
+ return await this.#runMigrations(migrationsOrFolderPath, getTargetMigration);
40
+ }
41
+ catch (error) {
42
+ if (error instanceof MigrationResultSetError) {
43
+ return error.resultSet;
44
+ }
45
+ return { error };
46
+ }
47
+ }
48
+ async #ensureMigrationTablesExists() {
49
+ await this.#ensureMigrationTableExists();
50
+ await this.#ensureMigrationLockTableExists();
51
+ await this.#ensureLockRowExists();
52
+ }
53
+ async #ensureMigrationTableExists() {
54
+ if (!(await this.#doesTableExists(MIGRATION_TABLE))) {
55
+ try {
56
+ await this.#db.schema
57
+ .createTable(MIGRATION_TABLE)
58
+ .ifNotExists()
59
+ .addColumn('name', 'varchar(255)', (col) => col.notNull().primaryKey())
60
+ // The migration run time as ISO string. This is not a real date type as we
61
+ // can't know which data type is supported by all future dialects.
62
+ .addColumn('timestamp', 'varchar(255)', (col) => col.notNull())
63
+ .execute();
64
+ }
65
+ catch (error) {
66
+ // At least on PostgreSQL, `if not exists` doesn't guarantee the `create table`
67
+ // query doesn't throw if the table already exits. That's why we check if
68
+ // the table exist here and ignore the error if it does.
69
+ if (!(await this.#doesTableExists(MIGRATION_TABLE))) {
70
+ throw error;
71
+ }
72
+ }
73
+ }
74
+ }
75
+ async #ensureMigrationLockTableExists() {
76
+ if (!(await this.#doesTableExists(MIGRATION_LOCK_TABLE))) {
77
+ try {
78
+ await this.#db.schema
79
+ .createTable(MIGRATION_LOCK_TABLE)
80
+ .ifNotExists()
81
+ .addColumn('id', 'varchar(255)', (col) => col.notNull().primaryKey())
82
+ .addColumn('is_locked', 'integer', (col) => col.notNull().defaultTo(0))
83
+ .execute();
84
+ }
85
+ catch (error) {
86
+ // At least on PostgreSQL, `if not exists` doesn't guarantee the `create table`
87
+ // query doesn't throw if the table already exits. That's why we check if
88
+ // the table exist here and ignore the error if it does.
89
+ if (!(await this.#doesTableExists(MIGRATION_LOCK_TABLE))) {
90
+ throw error;
91
+ }
92
+ }
93
+ }
23
94
  }
24
- async #migrateToLatest(allMigrations) {
95
+ async #ensureLockRowExists() {
96
+ if (!(await this.#doesLockRowExists())) {
97
+ try {
98
+ await this.#db
99
+ .insertInto(MIGRATION_LOCK_TABLE)
100
+ .values({ id: MIGRATION_LOCK_ID })
101
+ .execute();
102
+ }
103
+ catch (error) {
104
+ if (!(await this.#doesLockRowExists())) {
105
+ throw error;
106
+ }
107
+ }
108
+ }
109
+ }
110
+ async #doesTableExists(tableName) {
111
+ const metadata = await this.#db.introspection.getMetadata({
112
+ withInternalKyselyTables: true,
113
+ });
114
+ return !!metadata.tables.find((it) => it.name === tableName);
115
+ }
116
+ async #doesLockRowExists() {
117
+ const lockRow = await this.#db
118
+ .selectFrom(MIGRATION_LOCK_TABLE)
119
+ .where('id', '=', MIGRATION_LOCK_ID)
120
+ .select('id')
121
+ .executeTakeFirst();
122
+ return !!lockRow;
123
+ }
124
+ async #runMigrations(migrationsOrFolderPath, getTargetMigration) {
25
125
  const run = async (db) => {
26
126
  try {
27
127
  await this.#adapter.acquireMigrationLock(db);
28
- await runNewMigrations(db, allMigrations);
128
+ const state = await this.#getState(db, migrationsOrFolderPath);
129
+ if (state.migrations.length === 0) {
130
+ return { results: [] };
131
+ }
132
+ const targetIndex = getTargetMigration(state);
133
+ if (targetIndex === undefined) {
134
+ return { results: [] };
135
+ }
136
+ if (targetIndex < state.currentIndex) {
137
+ return await this.#migrateDown(db, state, targetIndex);
138
+ }
139
+ else if (targetIndex > state.currentIndex) {
140
+ return await this.#migrateUp(db, state, targetIndex);
141
+ }
142
+ return { results: [] };
29
143
  }
30
144
  finally {
31
145
  await this.#adapter.releaseMigrationLock(db);
32
146
  }
33
147
  };
34
148
  if (this.#adapter.supportsTransactionalDdl) {
35
- await this.#db.transaction().execute(run);
149
+ return this.#db.transaction().execute(run);
36
150
  }
37
151
  else {
38
- await this.#db.connection().execute(run);
152
+ return this.#db.connection().execute(run);
39
153
  }
40
154
  }
41
- }
42
- async function ensureMigrationTablesExists(db) {
43
- await ensureMigrationTableExists(db);
44
- await ensureMigrationLockTableExists(db);
45
- await ensureLockRowExists(db);
46
- }
47
- async function ensureMigrationTableExists(db) {
48
- if (!(await doesTableExists(db, MIGRATION_TABLE))) {
49
- try {
50
- await db.schema
51
- .createTable(MIGRATION_TABLE)
52
- .ifNotExists()
53
- .addColumn('name', 'varchar(255)', (col) => col.notNull().primaryKey())
54
- // The migration run time as ISO string. This is not a real date type as we
55
- // can't know which data type is supported by all future dialects.
56
- .addColumn('timestamp', 'varchar(255)', (col) => col.notNull())
57
- .execute();
58
- }
59
- catch (error) {
60
- // At least on PostgreSQL, `if not exists` doesn't guarantee the `create table`
61
- // query doesn't throw if the table already exits. That's why we check if
62
- // the table exist here and ignore the error if it does.
63
- if (!(await doesTableExists(db, MIGRATION_TABLE))) {
64
- throw error;
155
+ async #getState(db, migrationsOrFolderPath) {
156
+ const migrations = await this.#resolveMigrations(migrationsOrFolderPath);
157
+ const executedMigrations = await this.#getExecutedMigrations(db);
158
+ this.#ensureMigrationsNotCorrupted(migrations, executedMigrations);
159
+ return freeze({
160
+ migrations,
161
+ currentIndex: migrations.findIndex((it) => it.name === getLast(executedMigrations)),
162
+ });
163
+ }
164
+ async #resolveMigrations(migrationsOrFolderPath) {
165
+ const allMigrations = isString(migrationsOrFolderPath)
166
+ ? await this.#readMigrationsFromFolder(migrationsOrFolderPath)
167
+ : migrationsOrFolderPath;
168
+ return Object.keys(allMigrations)
169
+ .sort()
170
+ .map((name) => ({
171
+ ...allMigrations[name],
172
+ name,
173
+ }));
174
+ }
175
+ async #readMigrationsFromFolder(migrationsFolderPath) {
176
+ const files = await fs.readdir(migrationsFolderPath);
177
+ const migrations = {};
178
+ for (const file of files) {
179
+ if ((file.endsWith('.js') || file.endsWith('.ts')) &&
180
+ !file.endsWith('.d.ts')) {
181
+ const migration = await import(path.join(migrationsFolderPath, file));
182
+ if (isMigration(migration)) {
183
+ migrations[file.substring(0, file.length - 3)] = migration;
184
+ }
65
185
  }
66
186
  }
187
+ return migrations;
67
188
  }
68
- }
69
- async function ensureMigrationLockTableExists(db) {
70
- if (!(await doesTableExists(db, MIGRATION_LOCK_TABLE))) {
71
- try {
72
- await db.schema
73
- .createTable(MIGRATION_LOCK_TABLE)
74
- .ifNotExists()
75
- .addColumn('id', 'varchar(255)', (col) => col.notNull().primaryKey())
76
- .addColumn('is_locked', 'integer', (col) => col.notNull().defaultTo(0))
77
- .execute();
189
+ async #getExecutedMigrations(db) {
190
+ const executedMigrations = await db
191
+ .selectFrom(MIGRATION_TABLE)
192
+ .select('name')
193
+ .orderBy('name')
194
+ .execute();
195
+ return executedMigrations.map((it) => it.name);
196
+ }
197
+ #ensureMigrationsNotCorrupted(migrations, executedMigrations) {
198
+ for (const executed of executedMigrations) {
199
+ if (!migrations.some((it) => it.name === executed)) {
200
+ throw new Error(`corrupted migrations: previously executed migration ${executed} is missing`);
201
+ }
78
202
  }
79
- catch (error) {
80
- // At least on PostgreSQL, `if not exists` doesn't guarantee the `create table`
81
- // query doesn't throw if the table already exits. That's why we check if
82
- // the table exist here and ignore the error if it does.
83
- if (!(await doesTableExists(db, MIGRATION_LOCK_TABLE))) {
84
- throw error;
203
+ // Now we know all executed migrations exist in the `migrations` list.
204
+ // Next we need to make sure that the executed migrations are the first
205
+ // ones in the migration list.
206
+ for (let i = 0; i < executedMigrations.length; ++i) {
207
+ if (migrations[i].name !== executedMigrations[i]) {
208
+ throw new Error(`corrupted migrations: expected previously executed migration ${executedMigrations[i]} to be at index ${i} but ${migrations[i].name} was found in its place. New migrations must always have a name that comes alphabetically after the last executed migration.`);
85
209
  }
86
210
  }
87
211
  }
88
- }
89
- async function ensureLockRowExists(db) {
90
- if (!(await doesLockRowExists(db))) {
91
- try {
92
- await db
93
- .insertInto(MIGRATION_LOCK_TABLE)
94
- .values({ id: MIGRATION_LOCK_ID })
95
- .execute();
212
+ async #migrateDown(db, state, targetIndex) {
213
+ const results = [];
214
+ for (let i = state.currentIndex; i > targetIndex; --i) {
215
+ results.push({
216
+ migrationName: state.migrations[i].name,
217
+ direction: 'Down',
218
+ status: 'NotExecuted',
219
+ });
96
220
  }
97
- catch (error) {
98
- if (!(await doesLockRowExists(db))) {
99
- throw error;
221
+ for (let i = 0; i < results.length; ++i) {
222
+ const migration = state.migrations.find((it) => it.name === results[i].migrationName);
223
+ try {
224
+ if (migration.down) {
225
+ await migration.down(db);
226
+ await db
227
+ .deleteFrom(MIGRATION_TABLE)
228
+ .where('name', '=', migration.name)
229
+ .execute();
230
+ results[i] = {
231
+ migrationName: migration.name,
232
+ direction: 'Down',
233
+ status: 'Success',
234
+ };
235
+ }
236
+ }
237
+ catch (error) {
238
+ results[i] = {
239
+ migrationName: migration.name,
240
+ direction: 'Down',
241
+ status: 'Error',
242
+ };
243
+ throw new MigrationResultSetError({
244
+ error,
245
+ results,
246
+ });
100
247
  }
101
248
  }
249
+ return { results };
102
250
  }
103
- }
104
- async function doesTableExists(db, tableName) {
105
- const metadata = await db.introspection.getMetadata({
106
- withInternalKyselyTables: true,
107
- });
108
- return !!metadata.tables.find((it) => it.name === tableName);
109
- }
110
- async function doesLockRowExists(db) {
111
- const lockRow = await db
112
- .selectFrom(MIGRATION_LOCK_TABLE)
113
- .where('id', '=', MIGRATION_LOCK_ID)
114
- .select('id')
115
- .executeTakeFirst();
116
- return !!lockRow;
117
- }
118
- async function readMigrationsFromFolder(migrationsFolderPath) {
119
- const files = await fs.readdir(migrationsFolderPath);
120
- const migrations = {};
121
- for (const file of files) {
122
- if ((file.endsWith('.js') || file.endsWith('.ts')) &&
123
- !file.endsWith('.d.ts')) {
124
- const migration = await import(path.join(migrationsFolderPath, file));
125
- if (isMigration(migration)) {
126
- migrations[file.substring(0, file.length - 3)] = migration;
251
+ async #migrateUp(db, state, targetIndex) {
252
+ const results = [];
253
+ for (let i = state.currentIndex + 1; i <= targetIndex; ++i) {
254
+ results.push({
255
+ migrationName: state.migrations[i].name,
256
+ direction: 'Up',
257
+ status: 'NotExecuted',
258
+ });
259
+ }
260
+ for (let i = 0; i < results.length; ++i) {
261
+ const migration = state.migrations.find((it) => it.name === results[i].migrationName);
262
+ try {
263
+ await migration.up(db);
264
+ await db
265
+ .insertInto(MIGRATION_TABLE)
266
+ .values({
267
+ name: migration.name,
268
+ timestamp: new Date().toISOString(),
269
+ })
270
+ .execute();
271
+ results[i] = {
272
+ migrationName: migration.name,
273
+ direction: 'Up',
274
+ status: 'Success',
275
+ };
276
+ }
277
+ catch (error) {
278
+ results[i] = {
279
+ migrationName: migration.name,
280
+ direction: 'Up',
281
+ status: 'Error',
282
+ };
283
+ throw new MigrationResultSetError({
284
+ error,
285
+ results,
286
+ });
127
287
  }
128
288
  }
289
+ return { results };
129
290
  }
130
- return migrations;
131
291
  }
132
- async function runNewMigrations(db, allMigrations) {
133
- const sortedMigrations = Object.keys(allMigrations)
134
- .sort()
135
- .map((name) => ({
136
- ...allMigrations[name],
137
- name,
138
- }));
139
- const executedMigrations = await db
140
- .selectFrom(MIGRATION_TABLE)
141
- .select('name')
142
- .orderBy('name')
143
- .execute();
144
- const lastExecuted = getLast(executedMigrations);
145
- const lastExecutedIndex = sortedMigrations.findIndex((it) => it.name === lastExecuted?.name);
146
- if (lastExecuted && lastExecutedIndex === -1) {
147
- throw new Error(`corrupted migrations: previously executed migration ${lastExecuted.name} is missing`);
148
- }
149
- const oldMigrations = lastExecuted
150
- ? sortedMigrations.slice(0, lastExecutedIndex + 1)
151
- : [];
152
- const newMigrations = lastExecuted
153
- ? sortedMigrations.slice(lastExecutedIndex + 1)
154
- : sortedMigrations;
155
- ensureMigrationsAreNotCorrupted(executedMigrations.map((it) => it.name), oldMigrations.map((it) => it.name));
156
- for (const migration of newMigrations) {
157
- await migration.up(db);
158
- await db
159
- .insertInto(MIGRATION_TABLE)
160
- .values({
161
- name: migration.name,
162
- timestamp: new Date().toISOString(),
163
- })
164
- .execute();
292
+ class MigrationResultSetError extends Error {
293
+ #resultSet;
294
+ constructor(result) {
295
+ super();
296
+ this.#resultSet = result;
165
297
  }
166
- }
167
- function ensureMigrationsAreNotCorrupted(executedMigrationNames, oldMigrationNames) {
168
- const executedSet = new Set(executedMigrationNames);
169
- const oldMigrationSet = new Set(oldMigrationNames);
170
- for (const it of executedSet) {
171
- if (!oldMigrationSet.has(it)) {
172
- throw new Error(`corrupted migrations: previously executed migration ${it} is missing`);
173
- }
174
- }
175
- for (const it of oldMigrationSet) {
176
- if (!executedSet.has(it)) {
177
- throw new Error(`corrupted migrations: new migration ${it} comes alphabetically before the last executed migration. New migrations must always have a name that comes alphabetically after the last executed migration.`);
178
- }
298
+ get resultSet() {
299
+ return this.#resultSet;
179
300
  }
180
301
  }
181
302
  function isMigration(obj) {
@@ -6,20 +6,21 @@ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
6
6
  import { OperationNode } from './operation-node.js';
7
7
  import { RawNode } from './raw-node.js';
8
8
  import { ReferencesNode } from './references-node.js';
9
- export declare type ColumnDefinitionNodeProps = Omit<Partial<ColumnDefinitionNode>, 'kind'>;
9
+ export declare type ColumnDefinitionNodeProps = Omit<Partial<ColumnDefinitionNode>, 'kind' | 'dataType'>;
10
10
  export declare type ColumnDataTypeNode = DataTypeNode | RawNode;
11
11
  export interface ColumnDefinitionNode extends OperationNode {
12
12
  readonly kind: 'ColumnDefinitionNode';
13
13
  readonly column: ColumnNode;
14
14
  readonly dataType: ColumnDataTypeNode;
15
15
  readonly references?: ReferencesNode;
16
- readonly primaryKey: boolean;
17
- readonly autoIncrement: boolean;
18
- readonly unique: boolean;
19
- readonly nullable: boolean;
16
+ readonly primaryKey?: boolean;
17
+ readonly autoIncrement?: boolean;
18
+ readonly unique?: boolean;
19
+ readonly notNull?: boolean;
20
20
  readonly defaultTo?: DefaultValueNode;
21
21
  readonly check?: CheckConstraintNode;
22
22
  readonly generatedAlwaysAs?: GeneratedAlwaysAsNode;
23
+ readonly unsigned?: boolean;
23
24
  }
24
25
  /**
25
26
  * @internal
@@ -12,10 +12,6 @@ export const ColumnDefinitionNode = freeze({
12
12
  kind: 'ColumnDefinitionNode',
13
13
  column: ColumnNode.create(column),
14
14
  dataType,
15
- primaryKey: false,
16
- autoIncrement: false,
17
- unique: false,
18
- nullable: true,
19
15
  });
20
16
  },
21
17
  cloneWith(node, props) {
@@ -0,0 +1,15 @@
1
+ import { ColumnNode } from './column-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ import { TableNode } from './table-node.js';
4
+ export interface CommonTableExpressionNameNode extends OperationNode {
5
+ readonly kind: 'CommonTableExpressionNameNode';
6
+ readonly table: TableNode;
7
+ readonly columns?: ReadonlyArray<ColumnNode>;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const CommonTableExpressionNameNode: Readonly<{
13
+ is(node: OperationNode): node is CommonTableExpressionNameNode;
14
+ create(tableName: string, columnNames?: readonly string[] | undefined): CommonTableExpressionNameNode;
15
+ }>;
@@ -0,0 +1,20 @@
1
+ import { freeze } from '../util/object-utils.js';
2
+ import { ColumnNode } from './column-node.js';
3
+ import { TableNode } from './table-node.js';
4
+ /**
5
+ * @internal
6
+ */
7
+ export const CommonTableExpressionNameNode = freeze({
8
+ is(node) {
9
+ return node.kind === 'CommonTableExpressionNameNode';
10
+ },
11
+ create(tableName, columnNames) {
12
+ return freeze({
13
+ kind: 'CommonTableExpressionNameNode',
14
+ table: TableNode.create(tableName),
15
+ columns: columnNames
16
+ ? freeze(columnNames.map(ColumnNode.create))
17
+ : undefined,
18
+ });
19
+ },
20
+ });
@@ -1,10 +1,10 @@
1
- import { IdentifierNode } from './identifier-node.js';
1
+ import { CommonTableExpressionNameNode } from './common-table-expression-name-node.js';
2
2
  import { OperationNode } from './operation-node.js';
3
3
  import { QueryNode } from './query-node.js';
4
4
  import { RawNode } from './raw-node.js';
5
5
  export interface CommonTableExpressionNode extends OperationNode {
6
6
  readonly kind: 'CommonTableExpressionNode';
7
- readonly name: IdentifierNode;
7
+ readonly name: CommonTableExpressionNameNode;
8
8
  readonly expression: QueryNode | RawNode;
9
9
  }
10
10
  /**
@@ -12,5 +12,5 @@ export interface CommonTableExpressionNode extends OperationNode {
12
12
  */
13
13
  export declare const CommonTableExpressionNode: Readonly<{
14
14
  is(node: OperationNode): node is CommonTableExpressionNode;
15
- create(name: IdentifierNode, expression: QueryNode | RawNode): CommonTableExpressionNode;
15
+ create(name: CommonTableExpressionNameNode, expression: QueryNode | RawNode): CommonTableExpressionNode;
16
16
  }>;
@@ -2,12 +2,16 @@ import { OperationNode } from './operation-node.js';
2
2
  import { TableNode } from './table-node.js';
3
3
  import { ConstraintNode } from './constraint-node.js';
4
4
  import { ColumnDefinitionNode } from './column-definition-node.js';
5
+ export declare type OnCommitAction = 'preserve rows' | 'delete rows' | 'drop';
6
+ export declare type CreateTableNodeParams = Omit<CreateTableNode, 'kind' | 'table' | 'columns' | 'constraints'>;
5
7
  export interface CreateTableNode extends OperationNode {
6
8
  readonly kind: 'CreateTableNode';
7
9
  readonly table: TableNode;
8
10
  readonly columns: ReadonlyArray<ColumnDefinitionNode>;
9
- readonly ifNotExists?: boolean;
10
11
  readonly constraints?: ReadonlyArray<ConstraintNode>;
12
+ readonly temporary?: boolean;
13
+ readonly ifNotExists?: boolean;
14
+ readonly onCommit?: OnCommitAction;
11
15
  }
12
16
  /**
13
17
  * @internal
@@ -16,6 +20,6 @@ export declare const CreateTableNode: Readonly<{
16
20
  is(node: OperationNode): node is CreateTableNode;
17
21
  create(table: TableNode): CreateTableNode;
18
22
  cloneWithColumn(createTable: CreateTableNode, column: ColumnDefinitionNode): CreateTableNode;
19
- cloneWithIfNotExists(createTable: CreateTableNode, ifNotExists: boolean): CreateTableNode;
20
23
  cloneWithConstraint(createTable: CreateTableNode, constraint: ConstraintNode): CreateTableNode;
24
+ cloneWith(createTable: CreateTableNode, params: CreateTableNodeParams): CreateTableNode;
21
25
  }>;
@@ -19,12 +19,6 @@ export const CreateTableNode = freeze({
19
19
  columns: freeze([...createTable.columns, column]),
20
20
  });
21
21
  },
22
- cloneWithIfNotExists(createTable, ifNotExists) {
23
- return freeze({
24
- ...createTable,
25
- ifNotExists,
26
- });
27
- },
28
22
  cloneWithConstraint(createTable, constraint) {
29
23
  return freeze({
30
24
  ...createTable,
@@ -33,4 +27,10 @@ export const CreateTableNode = freeze({
33
27
  : freeze([constraint]),
34
28
  });
35
29
  },
30
+ cloneWith(createTable, params) {
31
+ return freeze({
32
+ ...createTable,
33
+ ...params,
34
+ });
35
+ },
36
36
  });
@@ -7,6 +7,7 @@ export declare type CreateViewNodeParams = Omit<Partial<CreateViewNode>, 'kind'
7
7
  export interface CreateViewNode extends OperationNode {
8
8
  readonly kind: 'CreateViewNode';
9
9
  readonly name: IdentifierNode;
10
+ readonly temporary?: boolean;
10
11
  readonly materialized?: boolean;
11
12
  readonly orReplace?: boolean;
12
13
  readonly ifNotExists?: boolean;
@@ -2,18 +2,18 @@ import { ColumnNode } from './column-node.js';
2
2
  import { OnConflictNode } from './on-conflict-node.js';
3
3
  import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
4
4
  import { OperationNode } from './operation-node.js';
5
- import { PrimitiveValueListNode } from './primitive-value-list-node.js';
5
+ import { RawNode } from './raw-node.js';
6
6
  import { ReturningNode } from './returning-node.js';
7
+ import { SelectQueryNode } from './select-query-node.js';
7
8
  import { TableNode } from './table-node.js';
8
- import { ValueListNode } from './value-list-node.js';
9
+ import { ValuesNode } from './values-node.js';
9
10
  import { WithNode } from './with-node.js';
10
- export declare type InsertValuesNode = ValueListNode | PrimitiveValueListNode;
11
11
  export declare type InsertQueryNodeProps = Omit<InsertQueryNode, 'kind' | 'into'>;
12
12
  export interface InsertQueryNode extends OperationNode {
13
13
  readonly kind: 'InsertQueryNode';
14
14
  readonly into: TableNode;
15
15
  readonly columns?: ReadonlyArray<ColumnNode>;
16
- readonly values?: ReadonlyArray<InsertValuesNode>;
16
+ readonly values?: ValuesNode | SelectQueryNode | RawNode;
17
17
  readonly returning?: ReturningNode;
18
18
  readonly onConflict?: OnConflictNode;
19
19
  readonly onDuplicateKey?: OnDuplicateKeyNode;
@@ -44,6 +44,7 @@ import { ReferencesNode } from './references-node.js';
44
44
  import { CheckConstraintNode } from './check-constraint-node.js';
45
45
  import { WithNode } from './with-node.js';
46
46
  import { CommonTableExpressionNode } from './common-table-expression-node.js';
47
+ import { CommonTableExpressionNameNode } from './common-table-expression-name-node.js';
47
48
  import { HavingNode } from './having-node.js';
48
49
  import { CreateSchemaNode } from './create-schema-node.js';
49
50
  import { DropSchemaNode } from './drop-schema-node.js';
@@ -63,6 +64,7 @@ import { DropViewNode } from './drop-view-node.js';
63
64
  import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
64
65
  import { DefaultValueNode } from './default-value-node.js';
65
66
  import { OnNode } from './on-node.js';
67
+ import { ValuesNode } from './values-node.js';
66
68
  /**
67
69
  * Transforms an operation node tree into another one.
68
70
  *
@@ -113,6 +115,7 @@ export declare class OperationNodeTransformer {
113
115
  protected transformRaw(node: RawNode): RawNode;
114
116
  protected transformWhere(node: WhereNode): WhereNode;
115
117
  protected transformInsertQuery(node: InsertQueryNode): InsertQueryNode;
118
+ protected transformValues(node: ValuesNode): ValuesNode;
116
119
  protected transformDeleteQuery(node: DeleteQueryNode): DeleteQueryNode;
117
120
  protected transformReturning(node: ReturningNode): ReturningNode;
118
121
  protected transformCreateTable(node: CreateTableNode): CreateTableNode;
@@ -140,6 +143,7 @@ export declare class OperationNodeTransformer {
140
143
  protected transformCheckConstraint(node: CheckConstraintNode): CheckConstraintNode;
141
144
  protected transformWith(node: WithNode): WithNode;
142
145
  protected transformCommonTableExpression(node: CommonTableExpressionNode): CommonTableExpressionNode;
146
+ protected transformCommonTableExpressionName(node: CommonTableExpressionNameNode): CommonTableExpressionNameNode;
143
147
  protected transformHaving(node: HavingNode): HavingNode;
144
148
  protected transformCreateSchema(node: CreateSchemaNode): CreateSchemaNode;
145
149
  protected transformDropSchema(node: DropSchemaNode): DropSchemaNode;