kysely 0.27.5 → 0.28.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.
- package/CODE_OF_CONDUCT.md +183 -0
- package/FUNDING.md +25 -0
- package/README.md +182 -3
- package/deno.check.d.ts +7 -0
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +26 -16
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +6 -3
- package/dist/cjs/dialect/mssql/mssql-driver.js +33 -19
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +2 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +11 -0
- package/dist/cjs/dialect/mysql/mysql-driver.d.ts +4 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +27 -12
- package/dist/cjs/dialect/postgres/postgres-driver.d.ts +4 -0
- package/dist/cjs/dialect/postgres/postgres-driver.js +28 -18
- package/dist/cjs/dialect/postgres/postgres-introspector.js +7 -17
- package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +4 -0
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +19 -13
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +66 -44
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +4 -0
- package/dist/cjs/driver/database-connection.d.ts +0 -4
- package/dist/cjs/driver/driver.d.ts +17 -0
- package/dist/cjs/driver/driver.js +13 -1
- package/dist/cjs/driver/dummy-driver.d.ts +3 -0
- package/dist/cjs/driver/dummy-driver.js +9 -0
- package/dist/cjs/driver/runtime-driver.d.ts +4 -0
- package/dist/cjs/driver/runtime-driver.js +43 -3
- package/dist/cjs/expression/expression-builder.d.ts +9 -10
- package/dist/cjs/helpers/postgres.d.ts +48 -0
- package/dist/cjs/helpers/postgres.js +50 -0
- package/dist/cjs/index.d.ts +13 -2
- package/dist/cjs/index.js +13 -2
- package/dist/cjs/kysely.d.ts +339 -2
- package/dist/cjs/kysely.js +465 -11
- package/dist/cjs/migration/migrator.d.ts +16 -1
- package/dist/cjs/migration/migrator.js +14 -4
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +2 -1
- package/dist/cjs/operation-node/aggregate-function-node.js +4 -3
- package/dist/cjs/operation-node/alter-table-node.d.ts +3 -1
- package/dist/cjs/operation-node/collate-node.d.ts +13 -0
- package/dist/cjs/operation-node/collate-node.js +19 -0
- package/dist/cjs/operation-node/constraint-node.d.ts +1 -1
- package/dist/cjs/operation-node/create-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/create-type-node.js +1 -1
- package/dist/cjs/operation-node/delete-query-node.d.ts +8 -2
- package/dist/cjs/operation-node/delete-query-node.js +11 -15
- package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/merge-query-node.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +106 -97
- package/dist/cjs/operation-node/operation-node-transformer.js +352 -312
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +9 -1
- package/dist/cjs/operation-node/operation-node-visitor.js +4 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/or-action-node.d.ts +12 -0
- package/dist/cjs/operation-node/or-action-node.js +18 -0
- package/dist/cjs/operation-node/order-by-item-node.d.ts +5 -0
- package/dist/cjs/operation-node/order-by-item-node.js +6 -0
- package/dist/cjs/operation-node/primary-key-constraint-node.d.ts +29 -0
- package/dist/cjs/operation-node/{primary-constraint-node.js → primary-key-constraint-node.js} +11 -2
- package/dist/cjs/operation-node/query-node.d.ts +7 -0
- package/dist/cjs/operation-node/query-node.js +15 -0
- package/dist/cjs/operation-node/refresh-materialized-view-node.d.ts +17 -0
- package/dist/cjs/operation-node/refresh-materialized-view-node.js +25 -0
- package/dist/cjs/operation-node/rename-constraint-node.d.ts +14 -0
- package/dist/cjs/operation-node/rename-constraint-node.js +20 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +8 -2
- package/dist/cjs/operation-node/select-query-node.js +11 -15
- package/dist/cjs/operation-node/unique-constraint-node.d.ts +2 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +3 -4
- package/dist/cjs/operation-node/update-query-node.js +5 -2
- package/dist/cjs/parser/collate-parser.d.ts +1 -0
- package/dist/cjs/parser/collate-parser.js +2 -0
- package/dist/cjs/parser/delete-from-parser.d.ts +5 -0
- package/dist/cjs/parser/delete-from-parser.js +2 -0
- package/dist/cjs/parser/insert-values-parser.js +3 -1
- package/dist/cjs/parser/join-parser.d.ts +1 -1
- package/dist/cjs/parser/join-parser.js +7 -1
- package/dist/cjs/parser/merge-into-parser.d.ts +5 -0
- package/dist/cjs/parser/merge-into-parser.js +2 -0
- package/dist/cjs/parser/order-by-parser.d.ts +18 -5
- package/dist/cjs/parser/order-by-parser.js +24 -14
- package/dist/cjs/parser/savepoint-parser.d.ts +4 -0
- package/dist/cjs/parser/savepoint-parser.js +11 -0
- package/dist/cjs/parser/select-from-parser.d.ts +4 -0
- package/dist/cjs/parser/select-from-parser.js +2 -0
- package/dist/cjs/parser/table-parser.d.ts +2 -5
- package/dist/cjs/parser/update-parser.d.ts +5 -0
- package/dist/cjs/parser/update-parser.js +2 -0
- package/dist/cjs/parser/update-set-parser.d.ts +7 -4
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +1 -1
- package/dist/cjs/plugin/camel-case/camel-case-transformer.d.ts +2 -1
- package/dist/cjs/plugin/camel-case/camel-case-transformer.js +2 -2
- package/dist/cjs/plugin/camel-case/camel-case.js +4 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +4 -3
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +6 -6
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.d.ts +211 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.js +162 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.d.ts +8 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.js +29 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists.d.ts +44 -0
- package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists.js +66 -0
- package/dist/cjs/plugin/immediate-value/immediate-value-plugin.js +1 -1
- package/dist/cjs/plugin/immediate-value/immediate-value-transformer.d.ts +2 -0
- package/dist/cjs/plugin/immediate-value/immediate-value-transformer.js +6 -4
- package/dist/cjs/plugin/with-schema/with-schema-plugin.js +1 -1
- package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +8 -3
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +45 -14
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +83 -5
- package/dist/cjs/query-builder/aggregate-function-builder.js +15 -27
- package/dist/cjs/query-builder/cte-builder.js +0 -2
- package/dist/cjs/query-builder/delete-query-builder.d.ts +36 -47
- package/dist/cjs/query-builder/delete-query-builder.js +12 -78
- package/dist/cjs/query-builder/function-module.d.ts +31 -4
- package/dist/cjs/query-builder/insert-query-builder.d.ts +161 -6
- package/dist/cjs/query-builder/insert-query-builder.js +197 -10
- package/dist/cjs/query-builder/join-builder.js +0 -2
- package/dist/cjs/query-builder/merge-query-builder.d.ts +145 -3
- package/dist/cjs/query-builder/merge-query-builder.js +28 -7
- package/dist/cjs/query-builder/on-conflict-builder.js +0 -4
- package/dist/cjs/query-builder/order-by-interface.d.ts +176 -0
- package/dist/cjs/query-builder/order-by-interface.js +2 -0
- package/dist/cjs/query-builder/order-by-item-builder.d.ts +43 -0
- package/dist/cjs/query-builder/order-by-item-builder.js +75 -0
- package/dist/cjs/query-builder/over-builder.d.ts +43 -6
- package/dist/cjs/query-builder/over-builder.js +8 -25
- package/dist/cjs/query-builder/returning-interface.d.ts +20 -3
- package/dist/cjs/query-builder/select-query-builder.d.ts +279 -98
- package/dist/cjs/query-builder/select-query-builder.js +26 -26
- package/dist/cjs/query-builder/update-query-builder.d.ts +88 -9
- package/dist/cjs/query-builder/update-query-builder.js +17 -15
- package/dist/cjs/query-compiler/compiled-query.d.ts +2 -0
- package/dist/cjs/query-compiler/compiled-query.js +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +17 -2
- package/dist/cjs/query-compiler/default-query-compiler.js +97 -2
- package/dist/cjs/query-compiler/query-compiler.d.ts +4 -2
- package/dist/cjs/query-creator.d.ts +23 -25
- package/dist/cjs/query-creator.js +280 -8
- package/dist/cjs/query-executor/default-query-executor.d.ts +2 -1
- package/dist/cjs/query-executor/default-query-executor.js +2 -2
- package/dist/cjs/query-executor/query-executor-base.js +7 -25
- package/dist/cjs/raw-builder/raw-builder.js +0 -3
- package/dist/cjs/raw-builder/sql.d.ts +4 -4
- package/dist/cjs/raw-builder/sql.js +1 -1
- package/dist/cjs/schema/alter-column-builder.js +0 -3
- package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.d.ts +4 -0
- package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.js +24 -2
- package/dist/cjs/schema/alter-table-add-index-builder.js +0 -2
- package/dist/cjs/schema/alter-table-builder.d.ts +7 -3
- package/dist/cjs/schema/alter-table-builder.js +21 -10
- package/dist/cjs/schema/alter-table-drop-constraint-builder.js +0 -2
- package/dist/cjs/schema/alter-table-executor.js +0 -2
- package/dist/cjs/schema/check-constraint-builder.d.ts +13 -0
- package/dist/cjs/schema/check-constraint-builder.js +20 -0
- package/dist/cjs/schema/column-definition-builder.js +0 -2
- package/dist/cjs/schema/create-index-builder.js +1 -3
- package/dist/cjs/schema/create-schema-builder.js +0 -2
- package/dist/cjs/schema/create-table-builder.d.ts +5 -4
- package/dist/cjs/schema/create-table-builder.js +9 -7
- package/dist/cjs/schema/create-type-builder.d.ts +1 -1
- package/dist/cjs/schema/create-type-builder.js +0 -2
- package/dist/cjs/schema/create-view-builder.js +0 -2
- package/dist/cjs/schema/drop-index-builder.js +0 -2
- package/dist/cjs/schema/drop-schema-builder.js +0 -2
- package/dist/cjs/schema/drop-table-builder.js +0 -2
- package/dist/cjs/schema/drop-type-builder.js +0 -2
- package/dist/cjs/schema/drop-view-builder.js +0 -2
- package/dist/cjs/schema/foreign-key-constraint-builder.d.ts +9 -0
- package/dist/cjs/schema/foreign-key-constraint-builder.js +16 -2
- package/dist/cjs/schema/primary-key-constraint-builder.d.ts +17 -0
- package/dist/cjs/schema/primary-key-constraint-builder.js +37 -0
- package/dist/cjs/schema/refresh-materialized-view-builder.d.ts +47 -0
- package/dist/cjs/schema/refresh-materialized-view-builder.js +75 -0
- package/dist/cjs/schema/schema.d.ts +14 -0
- package/dist/cjs/schema/schema.js +21 -0
- package/dist/cjs/schema/unique-constraint-builder.d.ts +10 -1
- package/dist/cjs/schema/unique-constraint-builder.js +26 -5
- package/dist/cjs/util/infer-result.d.ts +1 -1
- package/dist/cjs/util/log.d.ts +1 -0
- package/dist/cjs/util/log.js +3 -2
- package/dist/cjs/util/provide-controlled-connection.d.ts +7 -0
- package/dist/cjs/util/provide-controlled-connection.js +24 -0
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +26 -16
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +6 -3
- package/dist/esm/dialect/mssql/mssql-driver.js +33 -19
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +2 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +11 -0
- package/dist/esm/dialect/mysql/mysql-driver.d.ts +4 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +27 -12
- package/dist/esm/dialect/postgres/postgres-driver.d.ts +4 -0
- package/dist/esm/dialect/postgres/postgres-driver.js +28 -18
- package/dist/esm/dialect/postgres/postgres-introspector.js +7 -17
- package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +4 -0
- package/dist/esm/dialect/sqlite/sqlite-driver.js +19 -13
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +66 -44
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +4 -0
- package/dist/esm/driver/database-connection.d.ts +0 -4
- package/dist/esm/driver/driver.d.ts +17 -0
- package/dist/esm/driver/driver.js +11 -0
- package/dist/esm/driver/dummy-driver.d.ts +3 -0
- package/dist/esm/driver/dummy-driver.js +9 -0
- package/dist/esm/driver/runtime-driver.d.ts +4 -0
- package/dist/esm/driver/runtime-driver.js +43 -3
- package/dist/esm/expression/expression-builder.d.ts +9 -10
- package/dist/esm/helpers/postgres.d.ts +48 -0
- package/dist/esm/helpers/postgres.js +49 -0
- package/dist/esm/index.d.ts +13 -2
- package/dist/esm/index.js +11 -1
- package/dist/esm/kysely.d.ts +339 -2
- package/dist/esm/kysely.js +461 -10
- package/dist/esm/migration/migrator.d.ts +16 -1
- package/dist/esm/migration/migrator.js +14 -4
- package/dist/esm/operation-node/aggregate-function-node.d.ts +2 -1
- package/dist/esm/operation-node/aggregate-function-node.js +4 -3
- package/dist/esm/operation-node/alter-table-node.d.ts +3 -1
- package/dist/esm/operation-node/collate-node.d.ts +13 -0
- package/dist/esm/operation-node/collate-node.js +17 -0
- package/dist/esm/operation-node/constraint-node.d.ts +1 -1
- package/dist/esm/operation-node/create-type-node.d.ts +1 -1
- package/dist/esm/operation-node/create-type-node.js +1 -1
- package/dist/esm/operation-node/delete-query-node.d.ts +8 -2
- package/dist/esm/operation-node/delete-query-node.js +11 -15
- package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +3 -0
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/merge-query-node.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +106 -97
- package/dist/esm/operation-node/operation-node-transformer.js +352 -312
- package/dist/esm/operation-node/operation-node-visitor.d.ts +9 -1
- package/dist/esm/operation-node/operation-node-visitor.js +4 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/or-action-node.d.ts +12 -0
- package/dist/esm/operation-node/or-action-node.js +16 -0
- package/dist/esm/operation-node/order-by-item-node.d.ts +5 -0
- package/dist/esm/operation-node/order-by-item-node.js +6 -0
- package/dist/esm/operation-node/primary-key-constraint-node.d.ts +29 -0
- package/dist/esm/operation-node/{primary-constraint-node.js → primary-key-constraint-node.js} +11 -2
- package/dist/esm/operation-node/query-node.d.ts +7 -0
- package/dist/esm/operation-node/query-node.js +15 -0
- package/dist/esm/operation-node/refresh-materialized-view-node.d.ts +17 -0
- package/dist/esm/operation-node/refresh-materialized-view-node.js +23 -0
- package/dist/esm/operation-node/rename-constraint-node.d.ts +14 -0
- package/dist/esm/operation-node/rename-constraint-node.js +18 -0
- package/dist/esm/operation-node/select-query-node.d.ts +8 -2
- package/dist/esm/operation-node/select-query-node.js +11 -15
- package/dist/esm/operation-node/unique-constraint-node.d.ts +2 -0
- package/dist/esm/operation-node/update-query-node.d.ts +3 -4
- package/dist/esm/operation-node/update-query-node.js +5 -2
- package/dist/esm/parser/collate-parser.d.ts +1 -0
- package/dist/esm/parser/collate-parser.js +2 -0
- package/dist/esm/parser/delete-from-parser.d.ts +5 -0
- package/dist/esm/parser/delete-from-parser.js +2 -0
- package/dist/esm/parser/insert-values-parser.js +3 -1
- package/dist/esm/parser/join-parser.d.ts +1 -1
- package/dist/esm/parser/join-parser.js +7 -1
- package/dist/esm/parser/merge-into-parser.d.ts +5 -0
- package/dist/esm/parser/merge-into-parser.js +2 -0
- package/dist/esm/parser/order-by-parser.d.ts +18 -5
- package/dist/esm/parser/order-by-parser.js +27 -17
- package/dist/esm/parser/savepoint-parser.d.ts +4 -0
- package/dist/esm/parser/savepoint-parser.js +9 -0
- package/dist/esm/parser/select-from-parser.d.ts +4 -0
- package/dist/esm/parser/select-from-parser.js +2 -0
- package/dist/esm/parser/table-parser.d.ts +2 -5
- package/dist/esm/parser/update-parser.d.ts +5 -0
- package/dist/esm/parser/update-parser.js +2 -0
- package/dist/esm/parser/update-set-parser.d.ts +7 -4
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +1 -1
- package/dist/esm/plugin/camel-case/camel-case-transformer.d.ts +2 -1
- package/dist/esm/plugin/camel-case/camel-case-transformer.js +2 -2
- package/dist/esm/plugin/camel-case/camel-case.js +4 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +4 -3
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +6 -6
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.d.ts +211 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.js +159 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.d.ts +8 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.js +26 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists.d.ts +44 -0
- package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists.js +63 -0
- package/dist/esm/plugin/immediate-value/immediate-value-plugin.js +1 -1
- package/dist/esm/plugin/immediate-value/immediate-value-transformer.d.ts +2 -0
- package/dist/esm/plugin/immediate-value/immediate-value-transformer.js +6 -4
- package/dist/esm/plugin/with-schema/with-schema-plugin.js +1 -1
- package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +8 -3
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +45 -14
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +83 -5
- package/dist/esm/query-builder/aggregate-function-builder.js +15 -27
- package/dist/esm/query-builder/cte-builder.js +0 -2
- package/dist/esm/query-builder/delete-query-builder.d.ts +36 -47
- package/dist/esm/query-builder/delete-query-builder.js +12 -78
- package/dist/esm/query-builder/function-module.d.ts +31 -4
- package/dist/esm/query-builder/insert-query-builder.d.ts +161 -6
- package/dist/esm/query-builder/insert-query-builder.js +197 -10
- package/dist/esm/query-builder/join-builder.js +0 -2
- package/dist/esm/query-builder/merge-query-builder.d.ts +145 -3
- package/dist/esm/query-builder/merge-query-builder.js +29 -8
- package/dist/esm/query-builder/on-conflict-builder.js +0 -4
- package/dist/esm/query-builder/order-by-interface.d.ts +176 -0
- package/dist/esm/query-builder/order-by-interface.js +2 -0
- package/dist/esm/query-builder/order-by-item-builder.d.ts +43 -0
- package/dist/esm/query-builder/order-by-item-builder.js +72 -0
- package/dist/esm/query-builder/over-builder.d.ts +43 -6
- package/dist/esm/query-builder/over-builder.js +8 -25
- package/dist/esm/query-builder/returning-interface.d.ts +20 -3
- package/dist/esm/query-builder/select-query-builder.d.ts +279 -98
- package/dist/esm/query-builder/select-query-builder.js +26 -26
- package/dist/esm/query-builder/update-query-builder.d.ts +88 -9
- package/dist/esm/query-builder/update-query-builder.js +17 -15
- package/dist/esm/query-compiler/compiled-query.d.ts +2 -0
- package/dist/esm/query-compiler/compiled-query.js +2 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +17 -2
- package/dist/esm/query-compiler/default-query-compiler.js +97 -2
- package/dist/esm/query-compiler/query-compiler.d.ts +4 -2
- package/dist/esm/query-creator.d.ts +23 -25
- package/dist/esm/query-creator.js +281 -9
- package/dist/esm/query-executor/default-query-executor.d.ts +2 -1
- package/dist/esm/query-executor/default-query-executor.js +2 -2
- package/dist/esm/query-executor/query-executor-base.js +7 -25
- package/dist/esm/raw-builder/raw-builder.js +0 -3
- package/dist/esm/raw-builder/sql.d.ts +4 -4
- package/dist/esm/raw-builder/sql.js +1 -1
- package/dist/esm/schema/alter-column-builder.js +0 -3
- package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.ts +4 -0
- package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.js +24 -2
- package/dist/esm/schema/alter-table-add-index-builder.js +0 -2
- package/dist/esm/schema/alter-table-builder.d.ts +7 -3
- package/dist/esm/schema/alter-table-builder.js +22 -11
- package/dist/esm/schema/alter-table-drop-constraint-builder.js +0 -2
- package/dist/esm/schema/alter-table-executor.js +0 -2
- package/dist/esm/schema/check-constraint-builder.d.ts +13 -0
- package/dist/esm/schema/check-constraint-builder.js +17 -0
- package/dist/esm/schema/column-definition-builder.js +0 -2
- package/dist/esm/schema/create-index-builder.js +1 -3
- package/dist/esm/schema/create-schema-builder.js +0 -2
- package/dist/esm/schema/create-table-builder.d.ts +5 -4
- package/dist/esm/schema/create-table-builder.js +10 -8
- package/dist/esm/schema/create-type-builder.d.ts +1 -1
- package/dist/esm/schema/create-type-builder.js +0 -2
- package/dist/esm/schema/create-view-builder.js +0 -2
- package/dist/esm/schema/drop-index-builder.js +0 -2
- package/dist/esm/schema/drop-schema-builder.js +0 -2
- package/dist/esm/schema/drop-table-builder.js +0 -2
- package/dist/esm/schema/drop-type-builder.js +0 -2
- package/dist/esm/schema/drop-view-builder.js +0 -2
- package/dist/esm/schema/foreign-key-constraint-builder.d.ts +9 -0
- package/dist/esm/schema/foreign-key-constraint-builder.js +16 -2
- package/dist/esm/schema/primary-key-constraint-builder.d.ts +17 -0
- package/dist/esm/schema/primary-key-constraint-builder.js +34 -0
- package/dist/esm/schema/refresh-materialized-view-builder.d.ts +47 -0
- package/dist/esm/schema/refresh-materialized-view-builder.js +72 -0
- package/dist/esm/schema/schema.d.ts +14 -0
- package/dist/esm/schema/schema.js +21 -0
- package/dist/esm/schema/unique-constraint-builder.d.ts +10 -1
- package/dist/esm/schema/unique-constraint-builder.js +26 -5
- package/dist/esm/util/infer-result.d.ts +1 -1
- package/dist/esm/util/log.d.ts +1 -0
- package/dist/esm/util/log.js +3 -2
- package/dist/esm/util/provide-controlled-connection.d.ts +7 -0
- package/dist/esm/util/provide-controlled-connection.js +22 -0
- package/outdated-typescript.d.ts +5 -0
- package/package.json +16 -2
- package/CONTRIBUTING.md +0 -70
- package/dist/cjs/operation-node/primary-constraint-node.d.ts +0 -15
- package/dist/cjs/util/prevent-await.d.ts +0 -1
- package/dist/cjs/util/prevent-await.js +0 -13
- package/dist/esm/operation-node/primary-constraint-node.d.ts +0 -15
- package/dist/esm/util/prevent-await.d.ts +0 -1
- package/dist/esm/util/prevent-await.js +0 -11
package/dist/esm/kysely.js
CHANGED
|
@@ -7,8 +7,7 @@ import { DefaultQueryExecutor } from './query-executor/default-query-executor.js
|
|
|
7
7
|
import { freeze, isObject, isUndefined } from './util/object-utils.js';
|
|
8
8
|
import { RuntimeDriver } from './driver/runtime-driver.js';
|
|
9
9
|
import { SingleConnectionProvider } from './driver/single-connection-provider.js';
|
|
10
|
-
import {
|
|
11
|
-
import { preventAwait } from './util/prevent-await.js';
|
|
10
|
+
import { validateTransactionSettings, } from './driver/driver.js';
|
|
12
11
|
import { createFunctionModule, } from './query-builder/function-module.js';
|
|
13
12
|
import { Log } from './util/log.js';
|
|
14
13
|
import { createQueryId } from './util/query-id.js';
|
|
@@ -17,6 +16,9 @@ import { CaseBuilder } from './query-builder/case-builder.js';
|
|
|
17
16
|
import { CaseNode } from './operation-node/case-node.js';
|
|
18
17
|
import { parseExpression } from './parser/expression-parser.js';
|
|
19
18
|
import { WithSchemaPlugin } from './plugin/with-schema/with-schema-plugin.js';
|
|
19
|
+
import { provideControlledConnection, } from './util/provide-controlled-connection.js';
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose');
|
|
20
22
|
/**
|
|
21
23
|
* The main Kysely class.
|
|
22
24
|
*
|
|
@@ -173,6 +175,9 @@ export class Kysely extends QueryCreator {
|
|
|
173
175
|
* of type {@link Transaction} which inherits {@link Kysely}. Any query
|
|
174
176
|
* started through the transaction object is executed inside the transaction.
|
|
175
177
|
*
|
|
178
|
+
* To run a controlled transaction, allowing you to commit and rollback manually,
|
|
179
|
+
* use {@link startTransaction} instead.
|
|
180
|
+
*
|
|
176
181
|
* ### Examples
|
|
177
182
|
*
|
|
178
183
|
* <!-- siteExample("transactions", "Simple transaction", 10) -->
|
|
@@ -227,6 +232,120 @@ export class Kysely extends QueryCreator {
|
|
|
227
232
|
transaction() {
|
|
228
233
|
return new TransactionBuilder({ ...this.#props });
|
|
229
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Creates a {@link ControlledTransactionBuilder} that can be used to run queries inside a controlled transaction.
|
|
237
|
+
*
|
|
238
|
+
* The returned {@link ControlledTransactionBuilder} can be used to configure the transaction.
|
|
239
|
+
* The {@link ControlledTransactionBuilder.execute} method can then be called
|
|
240
|
+
* to start the transaction and return a {@link ControlledTransaction}.
|
|
241
|
+
*
|
|
242
|
+
* A {@link ControlledTransaction} allows you to commit and rollback manually,
|
|
243
|
+
* execute savepoint commands. It extends {@link Transaction} which extends {@link Kysely},
|
|
244
|
+
* so you can run queries inside the transaction. Once the transaction is committed,
|
|
245
|
+
* or rolled back, it can't be used anymore - all queries will throw an error.
|
|
246
|
+
* This is to prevent accidentally running queries outside the transaction - where
|
|
247
|
+
* atomicity is not guaranteed anymore.
|
|
248
|
+
*
|
|
249
|
+
* ### Examples
|
|
250
|
+
*
|
|
251
|
+
* <!-- siteExample("transactions", "Controlled transaction", 11) -->
|
|
252
|
+
*
|
|
253
|
+
* A controlled transaction allows you to commit and rollback manually, execute
|
|
254
|
+
* savepoint commands, and queries in general.
|
|
255
|
+
*
|
|
256
|
+
* In this example we start a transaction, use it to insert two rows and then commit
|
|
257
|
+
* the transaction. If an error is thrown, we catch it and rollback the transaction.
|
|
258
|
+
*
|
|
259
|
+
* ```ts
|
|
260
|
+
* const trx = await db.startTransaction().execute()
|
|
261
|
+
*
|
|
262
|
+
* try {
|
|
263
|
+
* const jennifer = await trx.insertInto('person')
|
|
264
|
+
* .values({
|
|
265
|
+
* first_name: 'Jennifer',
|
|
266
|
+
* last_name: 'Aniston',
|
|
267
|
+
* age: 40,
|
|
268
|
+
* })
|
|
269
|
+
* .returning('id')
|
|
270
|
+
* .executeTakeFirstOrThrow()
|
|
271
|
+
*
|
|
272
|
+
* const catto = await trx.insertInto('pet')
|
|
273
|
+
* .values({
|
|
274
|
+
* owner_id: jennifer.id,
|
|
275
|
+
* name: 'Catto',
|
|
276
|
+
* species: 'cat',
|
|
277
|
+
* is_favorite: false,
|
|
278
|
+
* })
|
|
279
|
+
* .returningAll()
|
|
280
|
+
* .executeTakeFirstOrThrow()
|
|
281
|
+
*
|
|
282
|
+
* await trx.commit().execute()
|
|
283
|
+
*
|
|
284
|
+
* // ...
|
|
285
|
+
* } catch (error) {
|
|
286
|
+
* await trx.rollback().execute()
|
|
287
|
+
* }
|
|
288
|
+
* ```
|
|
289
|
+
*
|
|
290
|
+
* <!-- siteExample("transactions", "Controlled transaction /w savepoints", 12) -->
|
|
291
|
+
*
|
|
292
|
+
* A controlled transaction allows you to commit and rollback manually, execute
|
|
293
|
+
* savepoint commands, and queries in general.
|
|
294
|
+
*
|
|
295
|
+
* In this example we start a transaction, insert a person, create a savepoint,
|
|
296
|
+
* try inserting a toy and a pet, and if an error is thrown, we rollback to the
|
|
297
|
+
* savepoint. Eventually we release the savepoint, insert an audit record and
|
|
298
|
+
* commit the transaction. If an error is thrown, we catch it and rollback the
|
|
299
|
+
* transaction.
|
|
300
|
+
*
|
|
301
|
+
* ```ts
|
|
302
|
+
* const trx = await db.startTransaction().execute()
|
|
303
|
+
*
|
|
304
|
+
* try {
|
|
305
|
+
* const jennifer = await trx
|
|
306
|
+
* .insertInto('person')
|
|
307
|
+
* .values({
|
|
308
|
+
* first_name: 'Jennifer',
|
|
309
|
+
* last_name: 'Aniston',
|
|
310
|
+
* age: 40,
|
|
311
|
+
* })
|
|
312
|
+
* .returning('id')
|
|
313
|
+
* .executeTakeFirstOrThrow()
|
|
314
|
+
*
|
|
315
|
+
* const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
|
|
316
|
+
*
|
|
317
|
+
* try {
|
|
318
|
+
* const catto = await trxAfterJennifer
|
|
319
|
+
* .insertInto('pet')
|
|
320
|
+
* .values({
|
|
321
|
+
* owner_id: jennifer.id,
|
|
322
|
+
* name: 'Catto',
|
|
323
|
+
* species: 'cat',
|
|
324
|
+
* })
|
|
325
|
+
* .returning('id')
|
|
326
|
+
* .executeTakeFirstOrThrow()
|
|
327
|
+
*
|
|
328
|
+
* await trxAfterJennifer
|
|
329
|
+
* .insertInto('toy')
|
|
330
|
+
* .values({ name: 'Bone', price: 1.99, pet_id: catto.id })
|
|
331
|
+
* .execute()
|
|
332
|
+
* } catch (error) {
|
|
333
|
+
* await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
|
|
334
|
+
* }
|
|
335
|
+
*
|
|
336
|
+
* await trxAfterJennifer.releaseSavepoint('after_jennifer').execute()
|
|
337
|
+
*
|
|
338
|
+
* await trx.insertInto('audit').values({ action: 'added Jennifer' }).execute()
|
|
339
|
+
*
|
|
340
|
+
* await trx.commit().execute()
|
|
341
|
+
* } catch (error) {
|
|
342
|
+
* await trx.rollback().execute()
|
|
343
|
+
* }
|
|
344
|
+
* ```
|
|
345
|
+
*/
|
|
346
|
+
startTransaction() {
|
|
347
|
+
return new ControlledTransactionBuilder({ ...this.#props });
|
|
348
|
+
}
|
|
230
349
|
/**
|
|
231
350
|
* Provides a kysely instance bound to a single database connection.
|
|
232
351
|
*
|
|
@@ -342,6 +461,9 @@ export class Kysely extends QueryCreator {
|
|
|
342
461
|
const compiledQuery = isCompilable(query) ? query.compile() : query;
|
|
343
462
|
return this.getExecutor().executeQuery(compiledQuery, queryId);
|
|
344
463
|
}
|
|
464
|
+
async [Symbol.asyncDispose]() {
|
|
465
|
+
await this.destroy();
|
|
466
|
+
}
|
|
345
467
|
}
|
|
346
468
|
export class Transaction extends Kysely {
|
|
347
469
|
#props;
|
|
@@ -409,12 +531,17 @@ export class ConnectionBuilder {
|
|
|
409
531
|
});
|
|
410
532
|
}
|
|
411
533
|
}
|
|
412
|
-
preventAwait(ConnectionBuilder, "don't await ConnectionBuilder instances directly. To execute the query you need to call the `execute` method");
|
|
413
534
|
export class TransactionBuilder {
|
|
414
535
|
#props;
|
|
415
536
|
constructor(props) {
|
|
416
537
|
this.#props = freeze(props);
|
|
417
538
|
}
|
|
539
|
+
setAccessMode(accessMode) {
|
|
540
|
+
return new TransactionBuilder({
|
|
541
|
+
...this.#props,
|
|
542
|
+
accessMode,
|
|
543
|
+
});
|
|
544
|
+
}
|
|
418
545
|
setIsolationLevel(isolationLevel) {
|
|
419
546
|
return new TransactionBuilder({
|
|
420
547
|
...this.#props,
|
|
@@ -422,8 +549,8 @@ export class TransactionBuilder {
|
|
|
422
549
|
});
|
|
423
550
|
}
|
|
424
551
|
async execute(callback) {
|
|
425
|
-
const { isolationLevel, ...kyselyProps } = this.#props;
|
|
426
|
-
const settings = { isolationLevel };
|
|
552
|
+
const { isolationLevel, accessMode, ...kyselyProps } = this.#props;
|
|
553
|
+
const settings = { isolationLevel, accessMode };
|
|
427
554
|
validateTransactionSettings(settings);
|
|
428
555
|
return this.#props.executor.provideConnection(async (connection) => {
|
|
429
556
|
const executor = this.#props.executor.withConnectionProvider(new SingleConnectionProvider(connection));
|
|
@@ -444,10 +571,334 @@ export class TransactionBuilder {
|
|
|
444
571
|
});
|
|
445
572
|
}
|
|
446
573
|
}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
574
|
+
export class ControlledTransactionBuilder {
|
|
575
|
+
#props;
|
|
576
|
+
constructor(props) {
|
|
577
|
+
this.#props = freeze(props);
|
|
578
|
+
}
|
|
579
|
+
setAccessMode(accessMode) {
|
|
580
|
+
return new ControlledTransactionBuilder({
|
|
581
|
+
...this.#props,
|
|
582
|
+
accessMode,
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
setIsolationLevel(isolationLevel) {
|
|
586
|
+
return new ControlledTransactionBuilder({
|
|
587
|
+
...this.#props,
|
|
588
|
+
isolationLevel,
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
async execute() {
|
|
592
|
+
const { isolationLevel, accessMode, ...props } = this.#props;
|
|
593
|
+
const settings = { isolationLevel, accessMode };
|
|
594
|
+
validateTransactionSettings(settings);
|
|
595
|
+
const connection = await provideControlledConnection(this.#props.executor);
|
|
596
|
+
await this.#props.driver.beginTransaction(connection.connection, settings);
|
|
597
|
+
return new ControlledTransaction({
|
|
598
|
+
...props,
|
|
599
|
+
connection,
|
|
600
|
+
executor: this.#props.executor.withConnectionProvider(new SingleConnectionProvider(connection.connection)),
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
export class ControlledTransaction extends Transaction {
|
|
605
|
+
#props;
|
|
606
|
+
#compileQuery;
|
|
607
|
+
#state;
|
|
608
|
+
constructor(props) {
|
|
609
|
+
const state = { isCommitted: false, isRolledBack: false };
|
|
610
|
+
props = {
|
|
611
|
+
...props,
|
|
612
|
+
executor: new NotCommittedOrRolledBackAssertingExecutor(props.executor, state),
|
|
613
|
+
};
|
|
614
|
+
const { connection, ...transactionProps } = props;
|
|
615
|
+
super(transactionProps);
|
|
616
|
+
this.#props = freeze(props);
|
|
617
|
+
this.#state = state;
|
|
618
|
+
const queryId = createQueryId();
|
|
619
|
+
this.#compileQuery = (node) => props.executor.compileQuery(node, queryId);
|
|
620
|
+
}
|
|
621
|
+
get isCommitted() {
|
|
622
|
+
return this.#state.isCommitted;
|
|
623
|
+
}
|
|
624
|
+
get isRolledBack() {
|
|
625
|
+
return this.#state.isRolledBack;
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Commits the transaction.
|
|
629
|
+
*
|
|
630
|
+
* See {@link rollback}.
|
|
631
|
+
*
|
|
632
|
+
* ### Examples
|
|
633
|
+
*
|
|
634
|
+
* ```ts
|
|
635
|
+
* import type { Kysely } from 'kysely'
|
|
636
|
+
* import type { Database } from 'type-editor' // imaginary module
|
|
637
|
+
*
|
|
638
|
+
* const trx = await db.startTransaction().execute()
|
|
639
|
+
*
|
|
640
|
+
* try {
|
|
641
|
+
* await doSomething(trx)
|
|
642
|
+
*
|
|
643
|
+
* await trx.commit().execute()
|
|
644
|
+
* } catch (error) {
|
|
645
|
+
* await trx.rollback().execute()
|
|
646
|
+
* }
|
|
647
|
+
*
|
|
648
|
+
* async function doSomething(kysely: Kysely<Database>) {}
|
|
649
|
+
* ```
|
|
650
|
+
*/
|
|
651
|
+
commit() {
|
|
652
|
+
assertNotCommittedOrRolledBack(this.#state);
|
|
653
|
+
return new Command(async () => {
|
|
654
|
+
await this.#props.driver.commitTransaction(this.#props.connection.connection);
|
|
655
|
+
this.#state.isCommitted = true;
|
|
656
|
+
this.#props.connection.release();
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* Rolls back the transaction.
|
|
661
|
+
*
|
|
662
|
+
* See {@link commit} and {@link rollbackToSavepoint}.
|
|
663
|
+
*
|
|
664
|
+
* ### Examples
|
|
665
|
+
*
|
|
666
|
+
* ```ts
|
|
667
|
+
* import type { Kysely } from 'kysely'
|
|
668
|
+
* import type { Database } from 'type-editor' // imaginary module
|
|
669
|
+
*
|
|
670
|
+
* const trx = await db.startTransaction().execute()
|
|
671
|
+
*
|
|
672
|
+
* try {
|
|
673
|
+
* await doSomething(trx)
|
|
674
|
+
*
|
|
675
|
+
* await trx.commit().execute()
|
|
676
|
+
* } catch (error) {
|
|
677
|
+
* await trx.rollback().execute()
|
|
678
|
+
* }
|
|
679
|
+
*
|
|
680
|
+
* async function doSomething(kysely: Kysely<Database>) {}
|
|
681
|
+
* ```
|
|
682
|
+
*/
|
|
683
|
+
rollback() {
|
|
684
|
+
assertNotCommittedOrRolledBack(this.#state);
|
|
685
|
+
return new Command(async () => {
|
|
686
|
+
await this.#props.driver.rollbackTransaction(this.#props.connection.connection);
|
|
687
|
+
this.#state.isRolledBack = true;
|
|
688
|
+
this.#props.connection.release();
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Creates a savepoint with a given name.
|
|
693
|
+
*
|
|
694
|
+
* See {@link rollbackToSavepoint} and {@link releaseSavepoint}.
|
|
695
|
+
*
|
|
696
|
+
* For a type-safe experience, you should use the returned instance from now on.
|
|
697
|
+
*
|
|
698
|
+
* ### Examples
|
|
699
|
+
*
|
|
700
|
+
* ```ts
|
|
701
|
+
* import type { Kysely } from 'kysely'
|
|
702
|
+
* import type { Database } from 'type-editor' // imaginary module
|
|
703
|
+
*
|
|
704
|
+
* const trx = await db.startTransaction().execute()
|
|
705
|
+
*
|
|
706
|
+
* await insertJennifer(trx)
|
|
707
|
+
*
|
|
708
|
+
* const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
|
|
709
|
+
*
|
|
710
|
+
* try {
|
|
711
|
+
* await doSomething(trxAfterJennifer)
|
|
712
|
+
* } catch (error) {
|
|
713
|
+
* await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
|
|
714
|
+
* }
|
|
715
|
+
*
|
|
716
|
+
* async function insertJennifer(kysely: Kysely<Database>) {}
|
|
717
|
+
* async function doSomething(kysely: Kysely<Database>) {}
|
|
718
|
+
* ```
|
|
719
|
+
*/
|
|
720
|
+
savepoint(savepointName) {
|
|
721
|
+
assertNotCommittedOrRolledBack(this.#state);
|
|
722
|
+
return new Command(async () => {
|
|
723
|
+
await this.#props.driver.savepoint?.(this.#props.connection.connection, savepointName, this.#compileQuery);
|
|
724
|
+
return new ControlledTransaction({ ...this.#props });
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Rolls back to a savepoint with a given name.
|
|
729
|
+
*
|
|
730
|
+
* See {@link savepoint} and {@link releaseSavepoint}.
|
|
731
|
+
*
|
|
732
|
+
* You must use the same instance returned by {@link savepoint}, or
|
|
733
|
+
* escape the type-check by using `as any`.
|
|
734
|
+
*
|
|
735
|
+
* ### Examples
|
|
736
|
+
*
|
|
737
|
+
* ```ts
|
|
738
|
+
* import type { Kysely } from 'kysely'
|
|
739
|
+
* import type { Database } from 'type-editor' // imaginary module
|
|
740
|
+
*
|
|
741
|
+
* const trx = await db.startTransaction().execute()
|
|
742
|
+
*
|
|
743
|
+
* await insertJennifer(trx)
|
|
744
|
+
*
|
|
745
|
+
* const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
|
|
746
|
+
*
|
|
747
|
+
* try {
|
|
748
|
+
* await doSomething(trxAfterJennifer)
|
|
749
|
+
* } catch (error) {
|
|
750
|
+
* await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
|
|
751
|
+
* }
|
|
752
|
+
*
|
|
753
|
+
* async function insertJennifer(kysely: Kysely<Database>) {}
|
|
754
|
+
* async function doSomething(kysely: Kysely<Database>) {}
|
|
755
|
+
* ```
|
|
756
|
+
*/
|
|
757
|
+
rollbackToSavepoint(savepointName) {
|
|
758
|
+
assertNotCommittedOrRolledBack(this.#state);
|
|
759
|
+
return new Command(async () => {
|
|
760
|
+
await this.#props.driver.rollbackToSavepoint?.(this.#props.connection.connection, savepointName, this.#compileQuery);
|
|
761
|
+
return new ControlledTransaction({ ...this.#props });
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* Releases a savepoint with a given name.
|
|
766
|
+
*
|
|
767
|
+
* See {@link savepoint} and {@link rollbackToSavepoint}.
|
|
768
|
+
*
|
|
769
|
+
* You must use the same instance returned by {@link savepoint}, or
|
|
770
|
+
* escape the type-check by using `as any`.
|
|
771
|
+
*
|
|
772
|
+
* ### Examples
|
|
773
|
+
*
|
|
774
|
+
* ```ts
|
|
775
|
+
* import type { Kysely } from 'kysely'
|
|
776
|
+
* import type { Database } from 'type-editor' // imaginary module
|
|
777
|
+
*
|
|
778
|
+
* const trx = await db.startTransaction().execute()
|
|
779
|
+
*
|
|
780
|
+
* await insertJennifer(trx)
|
|
781
|
+
*
|
|
782
|
+
* const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
|
|
783
|
+
*
|
|
784
|
+
* try {
|
|
785
|
+
* await doSomething(trxAfterJennifer)
|
|
786
|
+
* } catch (error) {
|
|
787
|
+
* await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
|
|
788
|
+
* }
|
|
789
|
+
*
|
|
790
|
+
* await trxAfterJennifer.releaseSavepoint('after_jennifer').execute()
|
|
791
|
+
*
|
|
792
|
+
* await doSomethingElse(trx)
|
|
793
|
+
*
|
|
794
|
+
* async function insertJennifer(kysely: Kysely<Database>) {}
|
|
795
|
+
* async function doSomething(kysely: Kysely<Database>) {}
|
|
796
|
+
* async function doSomethingElse(kysely: Kysely<Database>) {}
|
|
797
|
+
* ```
|
|
798
|
+
*/
|
|
799
|
+
releaseSavepoint(savepointName) {
|
|
800
|
+
assertNotCommittedOrRolledBack(this.#state);
|
|
801
|
+
return new Command(async () => {
|
|
802
|
+
await this.#props.driver.releaseSavepoint?.(this.#props.connection.connection, savepointName, this.#compileQuery);
|
|
803
|
+
return new ControlledTransaction({ ...this.#props });
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
withPlugin(plugin) {
|
|
807
|
+
return new ControlledTransaction({
|
|
808
|
+
...this.#props,
|
|
809
|
+
executor: this.#props.executor.withPlugin(plugin),
|
|
810
|
+
});
|
|
811
|
+
}
|
|
812
|
+
withoutPlugins() {
|
|
813
|
+
return new ControlledTransaction({
|
|
814
|
+
...this.#props,
|
|
815
|
+
executor: this.#props.executor.withoutPlugins(),
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
withSchema(schema) {
|
|
819
|
+
return new ControlledTransaction({
|
|
820
|
+
...this.#props,
|
|
821
|
+
executor: this.#props.executor.withPluginAtFront(new WithSchemaPlugin(schema)),
|
|
822
|
+
});
|
|
823
|
+
}
|
|
824
|
+
withTables() {
|
|
825
|
+
return new ControlledTransaction({ ...this.#props });
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
export class Command {
|
|
829
|
+
#cb;
|
|
830
|
+
constructor(cb) {
|
|
831
|
+
this.#cb = cb;
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* Executes the command.
|
|
835
|
+
*/
|
|
836
|
+
async execute() {
|
|
837
|
+
return await this.#cb();
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
function assertNotCommittedOrRolledBack(state) {
|
|
841
|
+
if (state.isCommitted) {
|
|
842
|
+
throw new Error('Transaction is already committed');
|
|
843
|
+
}
|
|
844
|
+
if (state.isRolledBack) {
|
|
845
|
+
throw new Error('Transaction is already rolled back');
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* An executor wrapper that asserts that the transaction state is not committed
|
|
850
|
+
* or rolled back when a query is executed.
|
|
851
|
+
*
|
|
852
|
+
* @internal
|
|
853
|
+
*/
|
|
854
|
+
class NotCommittedOrRolledBackAssertingExecutor {
|
|
855
|
+
#executor;
|
|
856
|
+
#state;
|
|
857
|
+
constructor(executor, state) {
|
|
858
|
+
if (executor instanceof NotCommittedOrRolledBackAssertingExecutor) {
|
|
859
|
+
this.#executor = executor.#executor;
|
|
860
|
+
}
|
|
861
|
+
else {
|
|
862
|
+
this.#executor = executor;
|
|
863
|
+
}
|
|
864
|
+
this.#state = state;
|
|
865
|
+
}
|
|
866
|
+
get adapter() {
|
|
867
|
+
return this.#executor.adapter;
|
|
868
|
+
}
|
|
869
|
+
get plugins() {
|
|
870
|
+
return this.#executor.plugins;
|
|
871
|
+
}
|
|
872
|
+
transformQuery(node, queryId) {
|
|
873
|
+
return this.#executor.transformQuery(node, queryId);
|
|
874
|
+
}
|
|
875
|
+
compileQuery(node, queryId) {
|
|
876
|
+
return this.#executor.compileQuery(node, queryId);
|
|
877
|
+
}
|
|
878
|
+
provideConnection(consumer) {
|
|
879
|
+
return this.#executor.provideConnection(consumer);
|
|
880
|
+
}
|
|
881
|
+
executeQuery(compiledQuery, queryId) {
|
|
882
|
+
assertNotCommittedOrRolledBack(this.#state);
|
|
883
|
+
return this.#executor.executeQuery(compiledQuery, queryId);
|
|
884
|
+
}
|
|
885
|
+
stream(compiledQuery, chunkSize, queryId) {
|
|
886
|
+
assertNotCommittedOrRolledBack(this.#state);
|
|
887
|
+
return this.#executor.stream(compiledQuery, chunkSize, queryId);
|
|
888
|
+
}
|
|
889
|
+
withConnectionProvider(connectionProvider) {
|
|
890
|
+
return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withConnectionProvider(connectionProvider), this.#state);
|
|
891
|
+
}
|
|
892
|
+
withPlugin(plugin) {
|
|
893
|
+
return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withPlugin(plugin), this.#state);
|
|
894
|
+
}
|
|
895
|
+
withPlugins(plugins) {
|
|
896
|
+
return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withPlugins(plugins), this.#state);
|
|
897
|
+
}
|
|
898
|
+
withPluginAtFront(plugin) {
|
|
899
|
+
return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withPluginAtFront(plugin), this.#state);
|
|
900
|
+
}
|
|
901
|
+
withoutPlugins() {
|
|
902
|
+
return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withoutPlugins(), this.#state);
|
|
452
903
|
}
|
|
453
904
|
}
|
|
@@ -271,7 +271,7 @@ export interface MigratorProps {
|
|
|
271
271
|
*
|
|
272
272
|
* When false, migrations must be run in their exact alpha-numeric order.
|
|
273
273
|
* This is checked against the migrations already run in the database
|
|
274
|
-
* (`migrationTableName
|
|
274
|
+
* (`migrationTableName`). This ensures your migrations are always run in
|
|
275
275
|
* the same order and is the safest option.
|
|
276
276
|
*
|
|
277
277
|
* When true, migrations are still run in alpha-numeric order, but
|
|
@@ -280,6 +280,21 @@ export interface MigratorProps {
|
|
|
280
280
|
* order.
|
|
281
281
|
*/
|
|
282
282
|
readonly allowUnorderedMigrations?: boolean;
|
|
283
|
+
/**
|
|
284
|
+
* A function that compares migration names, used when sorting migrations in
|
|
285
|
+
* ascending order.
|
|
286
|
+
*
|
|
287
|
+
* Default is `name0.localeCompare(name1)`.
|
|
288
|
+
*/
|
|
289
|
+
readonly nameComparator?: (name0: string, name1: string) => number;
|
|
290
|
+
/**
|
|
291
|
+
* When `true`, don't run migrations in transactions even if the dialect supports transactional DDL.
|
|
292
|
+
*
|
|
293
|
+
* Default is `false`.
|
|
294
|
+
*
|
|
295
|
+
* This is useful when some migrations include queries that would fail otherwise.
|
|
296
|
+
*/
|
|
297
|
+
readonly disableTransactions?: boolean;
|
|
283
298
|
}
|
|
284
299
|
/**
|
|
285
300
|
* All migration methods ({@link Migrator.migrateTo | migrateTo},
|
|
@@ -61,6 +61,7 @@ export class Migrator {
|
|
|
61
61
|
.withPlugin(this.#schemaPlugin)
|
|
62
62
|
.selectFrom(this.#migrationTable)
|
|
63
63
|
.select(['name', 'timestamp'])
|
|
64
|
+
.$narrowType()
|
|
64
65
|
.execute()
|
|
65
66
|
: [];
|
|
66
67
|
const migrations = await this.#resolveMigrations();
|
|
@@ -423,7 +424,7 @@ export class Migrator {
|
|
|
423
424
|
await adapter.releaseMigrationLock(db, lockOptions);
|
|
424
425
|
}
|
|
425
426
|
};
|
|
426
|
-
if (adapter.supportsTransactionalDdl) {
|
|
427
|
+
if (adapter.supportsTransactionalDdl && !this.#props.disableTransactions) {
|
|
427
428
|
return this.#props.db.transaction().execute(run);
|
|
428
429
|
}
|
|
429
430
|
else {
|
|
@@ -463,10 +464,19 @@ export class Migrator {
|
|
|
463
464
|
const executedMigrations = await db
|
|
464
465
|
.withPlugin(this.#schemaPlugin)
|
|
465
466
|
.selectFrom(this.#migrationTable)
|
|
466
|
-
.select('name')
|
|
467
|
-
|
|
467
|
+
.select(['name', 'timestamp'])
|
|
468
|
+
.$narrowType()
|
|
468
469
|
.execute();
|
|
469
|
-
|
|
470
|
+
const nameComparator = this.#props.nameComparator || ((a, b) => a.localeCompare(b));
|
|
471
|
+
return (executedMigrations
|
|
472
|
+
// https://github.com/kysely-org/kysely/issues/843
|
|
473
|
+
.sort((a, b) => {
|
|
474
|
+
if (a.timestamp === b.timestamp) {
|
|
475
|
+
return nameComparator(a.name, b.name);
|
|
476
|
+
}
|
|
477
|
+
return (new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
478
|
+
})
|
|
479
|
+
.map((it) => it.name));
|
|
470
480
|
}
|
|
471
481
|
#ensureNoMissingMigrations(migrations, executedMigrations) {
|
|
472
482
|
// Ensure all executed migrations exist in the `migrations` list.
|
|
@@ -9,6 +9,7 @@ export interface AggregateFunctionNode extends OperationNode {
|
|
|
9
9
|
readonly aggregated: readonly OperationNode[];
|
|
10
10
|
readonly distinct?: boolean;
|
|
11
11
|
readonly orderBy?: OrderByNode;
|
|
12
|
+
readonly withinGroup?: OrderByNode;
|
|
12
13
|
readonly filter?: WhereNode;
|
|
13
14
|
readonly over?: OverNode;
|
|
14
15
|
}
|
|
@@ -19,7 +20,7 @@ export declare const AggregateFunctionNode: Readonly<{
|
|
|
19
20
|
is(node: OperationNode): node is AggregateFunctionNode;
|
|
20
21
|
create(aggregateFunction: string, aggregated?: readonly OperationNode[]): AggregateFunctionNode;
|
|
21
22
|
cloneWithDistinct(aggregateFunctionNode: AggregateFunctionNode): AggregateFunctionNode;
|
|
22
|
-
cloneWithOrderBy(aggregateFunctionNode: AggregateFunctionNode, orderItems: ReadonlyArray<OrderByItemNode
|
|
23
|
+
cloneWithOrderBy(aggregateFunctionNode: AggregateFunctionNode, orderItems: ReadonlyArray<OrderByItemNode>, withinGroup?: boolean): AggregateFunctionNode;
|
|
23
24
|
cloneWithFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
|
|
24
25
|
cloneWithOrFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
|
|
25
26
|
cloneWithOver(aggregateFunctionNode: AggregateFunctionNode, over?: OverNode): AggregateFunctionNode;
|
|
@@ -22,11 +22,12 @@ export const AggregateFunctionNode = freeze({
|
|
|
22
22
|
distinct: true,
|
|
23
23
|
});
|
|
24
24
|
},
|
|
25
|
-
cloneWithOrderBy(aggregateFunctionNode, orderItems) {
|
|
25
|
+
cloneWithOrderBy(aggregateFunctionNode, orderItems, withinGroup = false) {
|
|
26
|
+
const prop = withinGroup ? 'withinGroup' : 'orderBy';
|
|
26
27
|
return freeze({
|
|
27
28
|
...aggregateFunctionNode,
|
|
28
|
-
|
|
29
|
-
? OrderByNode.cloneWithItems(aggregateFunctionNode
|
|
29
|
+
[prop]: aggregateFunctionNode[prop]
|
|
30
|
+
? OrderByNode.cloneWithItems(aggregateFunctionNode[prop], orderItems)
|
|
30
31
|
: OrderByNode.create(orderItems),
|
|
31
32
|
});
|
|
32
33
|
},
|
|
@@ -10,7 +10,8 @@ import { DropConstraintNode } from './drop-constraint-node.js';
|
|
|
10
10
|
import { ModifyColumnNode } from './modify-column-node.js';
|
|
11
11
|
import { DropIndexNode } from './drop-index-node.js';
|
|
12
12
|
import { AddIndexNode } from './add-index-node.js';
|
|
13
|
-
|
|
13
|
+
import { RenameConstraintNode } from './rename-constraint-node.js';
|
|
14
|
+
export type AlterTableNodeTableProps = Pick<AlterTableNode, 'renameTo' | 'setSchema' | 'addConstraint' | 'dropConstraint' | 'addIndex' | 'dropIndex' | 'renameConstraint'>;
|
|
14
15
|
export type AlterTableColumnAlterationNode = RenameColumnNode | AddColumnNode | DropColumnNode | AlterColumnNode | ModifyColumnNode;
|
|
15
16
|
export interface AlterTableNode extends OperationNode {
|
|
16
17
|
readonly kind: 'AlterTableNode';
|
|
@@ -20,6 +21,7 @@ export interface AlterTableNode extends OperationNode {
|
|
|
20
21
|
readonly columnAlterations?: ReadonlyArray<AlterTableColumnAlterationNode>;
|
|
21
22
|
readonly addConstraint?: AddConstraintNode;
|
|
22
23
|
readonly dropConstraint?: DropConstraintNode;
|
|
24
|
+
readonly renameConstraint?: RenameConstraintNode;
|
|
23
25
|
readonly addIndex?: AddIndexNode;
|
|
24
26
|
readonly dropIndex?: DropIndexNode;
|
|
25
27
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IdentifierNode } from './identifier-node.js';
|
|
2
|
+
import { OperationNode } from './operation-node.js';
|
|
3
|
+
export interface CollateNode extends OperationNode {
|
|
4
|
+
readonly kind: 'CollateNode';
|
|
5
|
+
readonly collation: IdentifierNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare const CollateNode: {
|
|
11
|
+
is(node: OperationNode): node is CollateNode;
|
|
12
|
+
create(collation: string): CollateNode;
|
|
13
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="./collate-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
import { IdentifierNode } from './identifier-node.js';
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export const CollateNode = {
|
|
8
|
+
is(node) {
|
|
9
|
+
return node.kind === 'CollateNode';
|
|
10
|
+
},
|
|
11
|
+
create(collation) {
|
|
12
|
+
return freeze({
|
|
13
|
+
kind: 'CollateNode',
|
|
14
|
+
collation: IdentifierNode.create(collation),
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CheckConstraintNode } from './check-constraint-node.js';
|
|
2
2
|
import { ForeignKeyConstraintNode } from './foreign-key-constraint-node.js';
|
|
3
|
-
import { PrimaryKeyConstraintNode } from './primary-constraint-node.js';
|
|
3
|
+
import { PrimaryKeyConstraintNode } from './primary-key-constraint-node.js';
|
|
4
4
|
import { UniqueConstraintNode } from './unique-constraint-node.js';
|
|
5
5
|
export type ConstraintNode = PrimaryKeyConstraintNode | UniqueConstraintNode | CheckConstraintNode | ForeignKeyConstraintNode;
|