kysely 0.11.3 → 0.12.2

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 (250) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/dialect/dialect-adapter-base.d.ts +36 -0
  3. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +36 -0
  4. package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +16 -0
  5. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +29 -0
  6. package/dist/cjs/dialect/mysql/mysql-introspector.d.ts +3 -0
  7. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +36 -0
  8. package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +16 -0
  9. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +29 -0
  10. package/dist/cjs/dialect/postgres/postgres-introspector.d.ts +3 -0
  11. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +36 -0
  12. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +6 -2
  13. package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +16 -0
  14. package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +29 -0
  15. package/dist/cjs/dialect/sqlite/sqlite-introspector.d.ts +3 -0
  16. package/dist/cjs/driver/default-connection-provider.d.ts +4 -0
  17. package/dist/cjs/driver/runtime-driver.d.ts +29 -0
  18. package/dist/cjs/driver/single-connection-provider.d.ts +4 -0
  19. package/dist/cjs/dynamic/dynamic-reference-builder.d.ts +1 -0
  20. package/dist/cjs/dynamic/dynamic-reference-builder.js +9 -1
  21. package/dist/cjs/dynamic/dynamic.d.ts +6 -7
  22. package/dist/cjs/dynamic/dynamic.js +6 -7
  23. package/dist/cjs/index.d.ts +14 -3
  24. package/dist/cjs/index.js +12 -1
  25. package/dist/cjs/kysely.d.ts +170 -11
  26. package/dist/cjs/kysely.js +69 -9
  27. package/dist/cjs/migration/migration.d.ts +2 -2
  28. package/dist/cjs/operation-node/common-table-expression-name-node.d.ts +15 -0
  29. package/dist/cjs/operation-node/common-table-expression-name-node.js +23 -0
  30. package/dist/cjs/operation-node/common-table-expression-node.d.ts +3 -3
  31. package/dist/cjs/operation-node/create-table-node.d.ts +6 -2
  32. package/dist/cjs/operation-node/create-table-node.js +6 -6
  33. package/dist/cjs/operation-node/create-view-node.d.ts +1 -0
  34. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -4
  35. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  36. package/dist/cjs/operation-node/operation-node-transformer.js +20 -1
  37. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  38. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  39. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/query-node.d.ts +0 -2
  41. package/dist/cjs/operation-node/query-node.js +0 -10
  42. package/dist/cjs/operation-node/values-node.d.ts +15 -0
  43. package/dist/cjs/operation-node/values-node.js +18 -0
  44. package/dist/cjs/operation-node/with-node.d.ts +3 -1
  45. package/dist/cjs/operation-node/with-node.js +2 -1
  46. package/dist/cjs/package.json +1 -3
  47. package/dist/cjs/parser/complex-expression-parser.d.ts +9 -0
  48. package/dist/cjs/parser/complex-expression-parser.js +25 -0
  49. package/dist/cjs/parser/filter-parser.d.ts +13 -4
  50. package/dist/cjs/parser/filter-parser.js +21 -24
  51. package/dist/cjs/parser/insert-values-parser.d.ts +7 -10
  52. package/dist/cjs/parser/insert-values-parser.js +31 -39
  53. package/dist/cjs/parser/order-by-parser.d.ts +1 -1
  54. package/dist/cjs/parser/parse-context.d.ts +22 -8
  55. package/dist/cjs/parser/parse-context.js +10 -10
  56. package/dist/cjs/parser/reference-parser.d.ts +8 -7
  57. package/dist/cjs/parser/reference-parser.js +8 -17
  58. package/dist/cjs/parser/returning-parser.d.ts +1 -5
  59. package/dist/cjs/parser/select-parser.d.ts +12 -14
  60. package/dist/cjs/parser/select-parser.js +5 -9
  61. package/dist/cjs/parser/table-parser.d.ts +9 -11
  62. package/dist/cjs/parser/table-parser.js +2 -8
  63. package/dist/cjs/parser/union-parser.d.ts +2 -2
  64. package/dist/cjs/parser/union-parser.js +1 -6
  65. package/dist/cjs/parser/update-set-parser.d.ts +2 -8
  66. package/dist/cjs/parser/update-set-parser.js +6 -26
  67. package/dist/cjs/parser/value-parser.d.ts +9 -6
  68. package/dist/cjs/parser/value-parser.js +7 -30
  69. package/dist/cjs/parser/with-parser.d.ts +36 -6
  70. package/dist/cjs/parser/with-parser.js +13 -2
  71. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +34 -0
  72. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
  73. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  74. package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +34 -0
  75. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +8 -0
  76. package/dist/cjs/query-builder/delete-query-builder.d.ts +647 -0
  77. package/dist/cjs/query-builder/delete-query-builder.js +185 -0
  78. package/dist/cjs/query-builder/expression-builder.d.ts +8 -6
  79. package/dist/cjs/query-builder/expression-builder.js +3 -3
  80. package/dist/cjs/query-builder/function-builder.d.ts +2 -1
  81. package/dist/cjs/query-builder/function-builder.js +2 -1
  82. package/dist/cjs/query-builder/having-interface.d.ts +49 -0
  83. package/dist/cjs/query-builder/having-interface.js +2 -0
  84. package/dist/cjs/query-builder/insert-query-builder.d.ts +504 -0
  85. package/dist/cjs/query-builder/insert-query-builder.js +256 -0
  86. package/dist/cjs/query-builder/insert-result.d.ts +3 -2
  87. package/dist/cjs/query-builder/insert-result.js +3 -2
  88. package/dist/cjs/query-builder/join-builder.d.ts +19 -20
  89. package/dist/cjs/query-builder/join-builder.js +12 -12
  90. package/dist/cjs/query-builder/join-interface.d.ts +130 -0
  91. package/dist/cjs/query-builder/join-interface.js +2 -0
  92. package/dist/cjs/query-builder/no-result-error.d.ts +9 -0
  93. package/dist/cjs/query-builder/no-result-error.js +14 -0
  94. package/dist/cjs/query-builder/returning-interface.d.ts +73 -0
  95. package/dist/cjs/query-builder/returning-interface.js +2 -0
  96. package/dist/cjs/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -634
  97. package/dist/cjs/query-builder/select-query-builder.js +571 -0
  98. package/dist/cjs/query-builder/update-query-builder.d.ts +735 -0
  99. package/dist/cjs/query-builder/update-query-builder.js +279 -0
  100. package/dist/cjs/query-builder/where-interface.d.ts +378 -0
  101. package/dist/cjs/query-builder/where-interface.js +2 -0
  102. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
  103. package/dist/cjs/query-compiler/default-query-compiler.js +33 -5
  104. package/dist/cjs/query-creator.d.ts +69 -43
  105. package/dist/cjs/query-creator.js +66 -29
  106. package/dist/cjs/query-executor/default-query-executor.d.ts +19 -0
  107. package/dist/cjs/query-executor/noop-query-executor.d.ts +19 -0
  108. package/dist/cjs/query-executor/query-executor.d.ts +1 -1
  109. package/dist/cjs/query-executor/query-executor.js +1 -1
  110. package/dist/cjs/raw-builder/raw-builder.d.ts +2 -0
  111. package/dist/cjs/raw-builder/raw-builder.js +7 -1
  112. package/dist/cjs/schema/alter-table-builder.d.ts +218 -2
  113. package/dist/cjs/schema/column-definition-builder.d.ts +135 -20
  114. package/dist/cjs/schema/create-index-builder.d.ts +2 -1
  115. package/dist/cjs/schema/create-index-builder.js +2 -1
  116. package/dist/cjs/schema/create-table-builder.d.ts +26 -9
  117. package/dist/cjs/schema/create-table-builder.js +42 -9
  118. package/dist/cjs/schema/create-view-builder.d.ts +17 -3
  119. package/dist/cjs/schema/create-view-builder.js +25 -16
  120. package/dist/cjs/schema/schema.d.ts +18 -11
  121. package/dist/cjs/schema/schema.js +18 -11
  122. package/dist/cjs/util/log.d.ts +3 -2
  123. package/dist/cjs/util/log.js +8 -15
  124. package/dist/cjs/util/type-utils.d.ts +7 -7
  125. package/dist/esm/dialect/dialect-adapter-base.d.ts +36 -0
  126. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +36 -0
  127. package/dist/esm/dialect/mysql/mysql-dialect.d.ts +16 -0
  128. package/dist/esm/dialect/mysql/mysql-driver.d.ts +29 -0
  129. package/dist/esm/dialect/mysql/mysql-introspector.d.ts +3 -0
  130. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +36 -0
  131. package/dist/esm/dialect/postgres/postgres-dialect.d.ts +16 -0
  132. package/dist/esm/dialect/postgres/postgres-driver.d.ts +29 -0
  133. package/dist/esm/dialect/postgres/postgres-introspector.d.ts +3 -0
  134. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +36 -0
  135. package/dist/esm/dialect/sqlite/sqlite-adapter.js +6 -2
  136. package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +16 -0
  137. package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +29 -0
  138. package/dist/esm/dialect/sqlite/sqlite-introspector.d.ts +3 -0
  139. package/dist/esm/driver/default-connection-provider.d.ts +4 -0
  140. package/dist/esm/driver/runtime-driver.d.ts +29 -0
  141. package/dist/esm/driver/single-connection-provider.d.ts +4 -0
  142. package/dist/esm/dynamic/dynamic-reference-builder.d.ts +1 -0
  143. package/dist/esm/dynamic/dynamic-reference-builder.js +7 -0
  144. package/dist/esm/dynamic/dynamic.d.ts +6 -7
  145. package/dist/esm/dynamic/dynamic.js +6 -7
  146. package/dist/esm/index.d.ts +14 -3
  147. package/dist/esm/index.js +12 -1
  148. package/dist/esm/kysely.d.ts +170 -11
  149. package/dist/esm/kysely.js +69 -9
  150. package/dist/esm/migration/migration.d.ts +2 -2
  151. package/dist/esm/operation-node/common-table-expression-name-node.d.ts +15 -0
  152. package/dist/esm/operation-node/common-table-expression-name-node.js +20 -0
  153. package/dist/esm/operation-node/common-table-expression-node.d.ts +3 -3
  154. package/dist/esm/operation-node/create-table-node.d.ts +6 -2
  155. package/dist/esm/operation-node/create-table-node.js +6 -6
  156. package/dist/esm/operation-node/create-view-node.d.ts +1 -0
  157. package/dist/esm/operation-node/insert-query-node.d.ts +4 -4
  158. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  159. package/dist/esm/operation-node/operation-node-transformer.js +20 -1
  160. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  161. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  162. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  163. package/dist/esm/operation-node/query-node.d.ts +0 -2
  164. package/dist/esm/operation-node/query-node.js +0 -10
  165. package/dist/esm/operation-node/values-node.d.ts +15 -0
  166. package/dist/esm/operation-node/values-node.js +15 -0
  167. package/dist/esm/operation-node/with-node.d.ts +3 -1
  168. package/dist/esm/operation-node/with-node.js +2 -1
  169. package/dist/esm/package.json +1 -3
  170. package/dist/esm/parser/complex-expression-parser.d.ts +9 -0
  171. package/dist/esm/parser/complex-expression-parser.js +20 -0
  172. package/dist/esm/parser/filter-parser.d.ts +13 -4
  173. package/dist/esm/parser/filter-parser.js +21 -24
  174. package/dist/esm/parser/insert-values-parser.d.ts +7 -10
  175. package/dist/esm/parser/insert-values-parser.js +31 -38
  176. package/dist/esm/parser/order-by-parser.d.ts +1 -1
  177. package/dist/esm/parser/parse-context.d.ts +22 -8
  178. package/dist/esm/parser/parse-context.js +10 -10
  179. package/dist/esm/parser/reference-parser.d.ts +8 -7
  180. package/dist/esm/parser/reference-parser.js +9 -18
  181. package/dist/esm/parser/returning-parser.d.ts +1 -5
  182. package/dist/esm/parser/select-parser.d.ts +12 -14
  183. package/dist/esm/parser/select-parser.js +6 -10
  184. package/dist/esm/parser/table-parser.d.ts +9 -11
  185. package/dist/esm/parser/table-parser.js +3 -9
  186. package/dist/esm/parser/union-parser.d.ts +2 -2
  187. package/dist/esm/parser/union-parser.js +1 -6
  188. package/dist/esm/parser/update-set-parser.d.ts +2 -8
  189. package/dist/esm/parser/update-set-parser.js +5 -24
  190. package/dist/esm/parser/value-parser.d.ts +9 -6
  191. package/dist/esm/parser/value-parser.js +8 -31
  192. package/dist/esm/parser/with-parser.d.ts +36 -6
  193. package/dist/esm/parser/with-parser.js +13 -2
  194. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +34 -0
  195. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
  196. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  197. package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +34 -0
  198. package/dist/esm/plugin/with-schema/with-schema-transformer.js +8 -0
  199. package/dist/esm/query-builder/delete-query-builder.d.ts +647 -0
  200. package/dist/esm/query-builder/delete-query-builder.js +181 -0
  201. package/dist/esm/query-builder/expression-builder.d.ts +8 -6
  202. package/dist/esm/query-builder/expression-builder.js +3 -3
  203. package/dist/esm/query-builder/function-builder.d.ts +2 -1
  204. package/dist/esm/query-builder/function-builder.js +2 -1
  205. package/dist/esm/query-builder/having-interface.d.ts +49 -0
  206. package/dist/esm/query-builder/having-interface.js +1 -0
  207. package/dist/esm/query-builder/insert-query-builder.d.ts +504 -0
  208. package/dist/esm/query-builder/insert-query-builder.js +252 -0
  209. package/dist/esm/query-builder/insert-result.d.ts +3 -2
  210. package/dist/esm/query-builder/insert-result.js +3 -2
  211. package/dist/esm/query-builder/join-builder.d.ts +19 -20
  212. package/dist/esm/query-builder/join-builder.js +12 -12
  213. package/dist/esm/query-builder/join-interface.d.ts +130 -0
  214. package/dist/esm/query-builder/join-interface.js +1 -0
  215. package/dist/esm/query-builder/no-result-error.d.ts +9 -0
  216. package/dist/esm/query-builder/no-result-error.js +10 -0
  217. package/dist/esm/query-builder/returning-interface.d.ts +73 -0
  218. package/dist/esm/query-builder/returning-interface.js +1 -0
  219. package/dist/esm/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -634
  220. package/dist/esm/query-builder/select-query-builder.js +566 -0
  221. package/dist/esm/query-builder/update-query-builder.d.ts +735 -0
  222. package/dist/esm/query-builder/update-query-builder.js +275 -0
  223. package/dist/esm/query-builder/where-interface.d.ts +378 -0
  224. package/dist/esm/query-builder/where-interface.js +1 -0
  225. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
  226. package/dist/esm/query-compiler/default-query-compiler.js +33 -5
  227. package/dist/esm/query-creator.d.ts +69 -43
  228. package/dist/esm/query-creator.js +66 -29
  229. package/dist/esm/query-executor/default-query-executor.d.ts +19 -0
  230. package/dist/esm/query-executor/noop-query-executor.d.ts +19 -0
  231. package/dist/esm/query-executor/query-executor.d.ts +1 -1
  232. package/dist/esm/query-executor/query-executor.js +1 -1
  233. package/dist/esm/raw-builder/raw-builder.d.ts +2 -0
  234. package/dist/esm/raw-builder/raw-builder.js +7 -1
  235. package/dist/esm/schema/alter-table-builder.d.ts +218 -2
  236. package/dist/esm/schema/column-definition-builder.d.ts +135 -20
  237. package/dist/esm/schema/create-index-builder.d.ts +2 -1
  238. package/dist/esm/schema/create-index-builder.js +2 -1
  239. package/dist/esm/schema/create-table-builder.d.ts +26 -9
  240. package/dist/esm/schema/create-table-builder.js +43 -10
  241. package/dist/esm/schema/create-view-builder.d.ts +17 -3
  242. package/dist/esm/schema/create-view-builder.js +25 -16
  243. package/dist/esm/schema/schema.d.ts +18 -11
  244. package/dist/esm/schema/schema.js +18 -11
  245. package/dist/esm/util/log.d.ts +3 -2
  246. package/dist/esm/util/log.js +7 -14
  247. package/dist/esm/util/type-utils.d.ts +7 -7
  248. package/package.json +10 -8
  249. package/dist/cjs/query-builder/query-builder.js +0 -1067
  250. package/dist/esm/query-builder/query-builder.js +0 -1061
@@ -1,30 +1,28 @@
1
1
  import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
2
- import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
2
+ import { AliasedQueryBuilder, SelectQueryBuilder } from '../query-builder/select-query-builder.js';
3
3
  import { SelectionNode } from '../operation-node/selection-node.js';
4
- import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedColumn, AnyAliasedColumnWithTable, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnyColumn, AnyColumnWithTable, RowType, ValueType } from '../util/type-utils.js';
4
+ import { AnyAliasedColumn, AnyAliasedColumnWithTable, AnyColumn, AnyColumnWithTable, RowType, ValueType } from '../util/type-utils.js';
5
5
  import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
6
6
  import { ParseContext } from './parse-context.js';
7
- /**
8
- * A selection expression.
9
- */
10
- export declare type SelectExpression<DB, TB extends keyof DB> = AnyAliasedColumnWithTable<DB, TB> | AnyAliasedColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyColumn<DB, TB> | AnyAliasedRawBuilder | AliasedRawBuilderFactory<DB, TB> | AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
7
+ import { AliasedComplexExpression } from './complex-expression-parser.js';
8
+ export declare type SelectExpression<DB, TB extends keyof DB> = AnyAliasedColumnWithTable<DB, TB> | AnyAliasedColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyColumn<DB, TB> | DynamicReferenceBuilder<any> | AliasedComplexExpression<DB, TB>;
11
9
  export declare type SelectExpressionOrList<DB, TB extends keyof DB> = SelectExpression<DB, TB> | ReadonlyArray<SelectExpression<DB, TB>>;
12
10
  /**
13
11
  * Given a selection expression returns a query builder type that
14
12
  * has the selection.
15
13
  */
16
- export declare type QueryBuilderWithSelection<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O & Selection<DB, TB, S>>;
14
+ export declare type QueryBuilderWithSelection<DB, TB extends keyof DB, O, SE> = SelectQueryBuilder<DB, TB, O & Selection<DB, TB, SE>>;
17
15
  /**
18
16
  * `selectAll` output query builder type.
19
17
  */
20
- export declare type SelectAllQueryBuilder<DB, TB extends keyof DB, O, S extends keyof DB> = QueryBuilder<DB, TB, O & RowType<DB, S>>;
21
- export declare type Selection<DB, TB extends keyof DB, S> = {
22
- [A in ExtractAliasFromSelectExpression<S>]: ExtractTypeFromSelectExpression<DB, TB, S, A>;
18
+ export declare type SelectAllQueryBuilder<DB, TB extends keyof DB, O, S extends keyof DB> = SelectQueryBuilder<DB, TB, O & RowType<DB, S>>;
19
+ export declare type Selection<DB, TB extends keyof DB, SE> = {
20
+ [A in ExtractAliasFromSelectExpression<SE>]: ExtractTypeFromSelectExpression<DB, TB, SE, A>;
23
21
  };
24
- declare type ExtractAliasFromSelectExpression<S> = S extends string ? ExtractAliasFromStringSelectExpression<S> : S extends AliasedRawBuilder<any, infer RA> ? RA : S extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : S extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : S extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : S extends DynamicReferenceBuilder<infer RA> ? ExtractAliasFromStringSelectExpression<RA> : never;
25
- declare type ExtractAliasFromStringSelectExpression<S extends string> = S extends `${string}.${string}.${string} as ${infer A}` ? A : S extends `${string}.${string} as ${infer A}` ? A : S extends `${string} as ${infer A}` ? A : S extends `${string}.${string}.${infer C}` ? C : S extends `${string}.${infer C}` ? C : S;
26
- declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, S, A extends keyof any> = S extends string ? ExtractTypeFromStringSelectExpression<DB, TB, S, A> : S extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : S extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : S extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : S extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : S extends DynamicReferenceBuilder<infer RA> ? A extends ExtractAliasFromStringSelectExpression<RA> ? ExtractTypeFromStringSelectExpression<DB, TB, RA, A> | undefined : never : never;
27
- declare type ExtractTypeFromStringSelectExpression<DB, TB extends keyof DB, S extends string, A extends keyof any, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C} as ${infer RA}` ? RA extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : S extends `${infer T}.${infer C} as ${infer RA}` ? RA extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : S extends `${infer C} as ${infer RA}` ? RA extends A ? C extends keyof R ? R[C] : never : never : S extends `${infer SC}.${infer T}.${infer C}` ? C extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : S extends `${infer T}.${infer C}` ? C extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : S extends A ? S extends keyof R ? R[S] : never : never;
22
+ declare type ExtractAliasFromSelectExpression<SE> = SE extends string ? ExtractAliasFromStringSelectExpression<SE> : SE extends AliasedRawBuilder<any, infer RA> ? RA : SE extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : SE extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : SE extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : SE extends DynamicReferenceBuilder<infer RA> ? ExtractAliasFromStringSelectExpression<RA> : never;
23
+ declare type ExtractAliasFromStringSelectExpression<SE extends string> = SE extends `${string}.${string}.${string} as ${infer A}` ? A : SE extends `${string}.${string} as ${infer A}` ? A : SE extends `${string} as ${infer A}` ? A : SE extends `${string}.${string}.${infer C}` ? C : SE extends `${string}.${infer C}` ? C : SE;
24
+ declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, SE, A extends keyof any> = SE extends string ? ExtractTypeFromStringSelectExpression<DB, TB, SE, A> : SE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : SE extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : SE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : SE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : SE extends DynamicReferenceBuilder<infer RA> ? A extends ExtractAliasFromStringSelectExpression<RA> ? ExtractTypeFromStringSelectExpression<DB, TB, RA, A> | undefined : never : never;
25
+ declare type ExtractTypeFromStringSelectExpression<DB, TB extends keyof DB, SE extends string, A extends keyof any, R = RowType<DB, TB>> = SE extends `${infer SC}.${infer T}.${infer C} as ${infer RA}` ? RA extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : SE extends `${infer T}.${infer C} as ${infer RA}` ? RA extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : SE extends `${infer C} as ${infer RA}` ? RA extends A ? C extends keyof R ? R[C] : never : never : SE extends `${infer SC}.${infer T}.${infer C}` ? C extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : SE extends `${infer T}.${infer C}` ? C extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : SE extends A ? SE extends keyof R ? R[SE] : never : never;
28
26
  export declare function parseSelectExpressionOrList(ctx: ParseContext, selection: SelectExpressionOrList<any, any>): SelectionNode[];
29
27
  export declare function parseSelectAll(table?: string | string[]): SelectionNode[];
30
28
  export {};
@@ -1,7 +1,8 @@
1
- import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
2
- import { isFunction, isReadonlyArray, isString } from '../util/object-utils.js';
1
+ import { isReadonlyArray, isString } from '../util/object-utils.js';
3
2
  import { SelectionNode } from '../operation-node/selection-node.js';
4
3
  import { parseAliasedStringReference } from './reference-parser.js';
4
+ import { isDynamicReferenceBuilder, } from '../dynamic/dynamic-reference-builder.js';
5
+ import { parseAliasedComplexExpression, } from './complex-expression-parser.js';
5
6
  export function parseSelectExpressionOrList(ctx, selection) {
6
7
  if (isReadonlyArray(selection)) {
7
8
  return selection.map((it) => parseSelectExpression(ctx, it));
@@ -14,14 +15,11 @@ function parseSelectExpression(ctx, selection) {
14
15
  if (isString(selection)) {
15
16
  return SelectionNode.create(parseAliasedStringReference(selection));
16
17
  }
17
- else if (isOperationNodeSource(selection)) {
18
+ else if (isDynamicReferenceBuilder(selection)) {
18
19
  return SelectionNode.create(selection.toOperationNode());
19
20
  }
20
- else if (isFunction(selection)) {
21
- return SelectionNode.create(selection(ctx.createExpressionBuilder()).toOperationNode());
22
- }
23
21
  else {
24
- throw new Error(`invalid value passed to select method: ${JSON.stringify(selection)}`);
22
+ return SelectionNode.create(parseAliasedComplexExpression(ctx, selection));
25
23
  }
26
24
  }
27
25
  export function parseSelectAll(table) {
@@ -39,7 +37,5 @@ function parseSelectAllArg(table) {
39
37
  if (isString(table)) {
40
38
  return SelectionNode.createSelectAllFromTable(table);
41
39
  }
42
- else {
43
- throw new Error(`invalid value passed to selectAll method: ${JSON.stringify(table)}`);
44
- }
40
+ throw new Error(`invalid value selectAll expression: ${JSON.stringify(table)}`);
45
41
  }
@@ -1,32 +1,30 @@
1
- import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
1
+ import { AliasedQueryBuilder } from '../query-builder/select-query-builder.js';
2
2
  import { TableNode } from '../operation-node/table-node.js';
3
- import { AliasedQueryBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, Nullable } from '../util/type-utils.js';
3
+ import { AnyAliasedRawBuilder, Nullable } from '../util/type-utils.js';
4
4
  import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
5
5
  import { TableExpressionNode } from '../operation-node/operation-node-utils.js';
6
6
  import { ParseContext } from './parse-context.js';
7
- export declare type TableExpression<DB, TB extends keyof DB> = TableReference<DB> | AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB>;
7
+ import { AliasedComplexExpression } from './complex-expression-parser.js';
8
+ export declare type TableExpression<DB, TB extends keyof DB> = TableReference<DB> | AliasedComplexExpression<DB, TB>;
8
9
  export declare type TableExpressionOrList<DB, TB extends keyof DB> = TableExpression<DB, TB> | ReadonlyArray<TableExpression<DB, TB>>;
9
- export declare type TableReference<DB> = AnyAliasedTable<DB, any, any> | AnyTable<DB> | AnyAliasedRawBuilder;
10
- export declare type QueryBuilderWithTable<DB, TB extends keyof DB, O, TE> = QueryBuilder<TableExpressionDatabase<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
10
+ export declare type TableReference<DB> = AnyAliasedTable<DB> | AnyTable<DB> | AnyAliasedRawBuilder;
11
11
  export declare type TableExpressionDatabase<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
12
12
  [C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
13
13
  };
14
- export declare type QueryBuilderWithLeftJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<LeftJoinTableExpressionDatabase<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
15
14
  export declare type LeftJoinTableExpressionDatabase<DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
16
15
  [C in keyof DB | A]: C extends A ? Nullable<ExtractRowTypeFromTableExpression<DB, TE, C>> : C extends keyof DB ? DB[C] : never;
17
16
  };
18
- export declare type QueryBuilderWithRightJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<RightJoinTableExpressionDatabase<DB, TB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
19
17
  export declare type RightJoinTableExpressionDatabase<DB, TB extends keyof DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
20
18
  [C in keyof DB | A]: C extends A ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? C extends TB ? Nullable<DB[C]> : DB[C] : never;
21
19
  };
22
- export declare type QueryBuilderWithFullJoin<DB, TB extends keyof DB, O, TE> = QueryBuilder<FullJoinTableExpressionDatabase<DB, TB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
23
20
  export declare type FullJoinTableExpressionDatabase<DB, TB extends keyof DB, TE, A extends keyof any = ExtractAliasFromTableExpression<DB, TE>> = {
24
21
  [C in keyof DB | A]: C extends A ? Nullable<ExtractRowTypeFromTableExpression<DB, TE, C>> : C extends keyof DB ? C extends TB ? Nullable<DB[C]> : DB[C] : never;
25
22
  };
26
23
  export declare type ExtractAliasFromTableExpression<DB, TE> = TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : TE extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends AliasedRawBuilder<any, infer RA> ? RA : TE extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : never;
27
- declare type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
28
- declare type AnyAliasedTable<DB, TB extends keyof DB, A extends string> = TB extends string ? `${TB} as ${A}` : never;
29
- declare type AnyTable<DB> = keyof DB;
24
+ export declare type TableExpressionTables<DB, TB extends keyof DB, TE> = TB | ExtractAliasFromTableExpression<DB, TE>;
25
+ declare type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : TE extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : never;
26
+ declare type AnyAliasedTable<DB> = `${AnyTable<DB>} as ${string}`;
27
+ declare type AnyTable<DB> = keyof DB & string;
30
28
  export declare function parseTableExpressionOrList(ctx: ParseContext, table: TableExpressionOrList<any, any>): TableExpressionNode[];
31
29
  export declare function parseTableExpression(ctx: ParseContext, table: TableExpression<any, any>): TableExpressionNode;
32
30
  export declare function parseAliasedTable(from: string): TableExpressionNode;
@@ -1,7 +1,7 @@
1
- import { isFunction, isReadonlyArray, isString } from '../util/object-utils.js';
1
+ import { isReadonlyArray, isString } from '../util/object-utils.js';
2
2
  import { AliasNode } from '../operation-node/alias-node.js';
3
3
  import { TableNode } from '../operation-node/table-node.js';
4
- import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
4
+ import { parseAliasedComplexExpression, } from './complex-expression-parser.js';
5
5
  export function parseTableExpressionOrList(ctx, table) {
6
6
  if (isReadonlyArray(table)) {
7
7
  return table.map((it) => parseTableExpression(ctx, it));
@@ -14,14 +14,8 @@ export function parseTableExpression(ctx, table) {
14
14
  if (isString(table)) {
15
15
  return parseAliasedTable(table);
16
16
  }
17
- else if (isOperationNodeSource(table)) {
18
- return table.toOperationNode();
19
- }
20
- else if (isFunction(table)) {
21
- return table(ctx.createExpressionBuilder()).toOperationNode();
22
- }
23
17
  else {
24
- throw new Error(`invalid table expression ${JSON.stringify(table)}`);
18
+ return parseAliasedComplexExpression(ctx, table);
25
19
  }
26
20
  }
27
21
  export function parseAliasedTable(from) {
@@ -1,5 +1,5 @@
1
1
  import { UnionNode } from '../operation-node/union-node.js';
2
- import { QueryBuilder } from '../query-builder/query-builder.js';
2
+ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
3
3
  import { RawBuilder } from '../raw-builder/raw-builder.js';
4
- export declare type UnionExpression<DB, O> = QueryBuilder<DB, any, O> | RawBuilder<O>;
4
+ export declare type UnionExpression<DB, O> = SelectQueryBuilder<DB, any, O> | RawBuilder<O>;
5
5
  export declare function parseUnion(union: UnionExpression<any, any>, all: boolean): UnionNode;
@@ -1,9 +1,4 @@
1
- import { QueryNode } from '../operation-node/query-node.js';
2
1
  import { UnionNode } from '../operation-node/union-node.js';
3
2
  export function parseUnion(union, all) {
4
- const node = union.toOperationNode();
5
- if (QueryNode.isMutating(node)) {
6
- throw new Error("can't combine insert, update or delete queries using union");
7
- }
8
- return UnionNode.create(node, all);
3
+ return UnionNode.create(union.toOperationNode(), all);
9
4
  }
@@ -1,13 +1,7 @@
1
1
  import { ColumnUpdateNode } from '../operation-node/column-update-node.js';
2
- import { RawNode } from '../operation-node/raw-node.js';
3
- import { SelectQueryNode } from '../operation-node/select-query-node.js';
4
- import { ValueNode } from '../operation-node/value-node.js';
5
- import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
6
- import { PrimitiveValue } from '../util/object-utils.js';
7
2
  import { ParseContext } from './parse-context.js';
3
+ import { ValueExpression } from './value-parser.js';
8
4
  export declare type MutationObject<DB, TB extends keyof DB> = {
9
- [C in keyof DB[TB]]?: MutationValueExpression<DB, TB, DB[TB][C]>;
5
+ [C in keyof DB[TB]]?: ValueExpression<DB, TB, DB[TB][C]>;
10
6
  };
11
- export declare type MutationValueExpression<DB, TB extends keyof DB, T> = T | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
12
7
  export declare function parseUpdateObject(ctx: ParseContext, row: MutationObject<any, any>): ReadonlyArray<ColumnUpdateNode>;
13
- export declare function parseMutationValueExpression(ctx: ParseContext, value: MutationValueExpression<any, any, PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
@@ -1,29 +1,10 @@
1
1
  import { ColumnNode } from '../operation-node/column-node.js';
2
2
  import { ColumnUpdateNode } from '../operation-node/column-update-node.js';
3
- import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
4
- import { QueryNode } from '../operation-node/query-node.js';
5
- import { ValueNode } from '../operation-node/value-node.js';
6
- import { isFunction, isPrimitive, } from '../util/object-utils.js';
3
+ import { parseValueExpression } from './value-parser.js';
7
4
  export function parseUpdateObject(ctx, row) {
8
- return Object.entries(row).map(([key, value]) => {
9
- return ColumnUpdateNode.create(ColumnNode.create(key), parseMutationValueExpression(ctx, value));
5
+ return Object.entries(row)
6
+ .filter(([_, value]) => value !== undefined)
7
+ .map(([key, value]) => {
8
+ return ColumnUpdateNode.create(ColumnNode.create(key), parseValueExpression(ctx, value));
10
9
  });
11
10
  }
12
- export function parseMutationValueExpression(ctx, value) {
13
- if (isPrimitive(value)) {
14
- return ValueNode.create(value);
15
- }
16
- else if (isOperationNodeSource(value)) {
17
- const node = value.toOperationNode();
18
- if (!QueryNode.isMutating(node)) {
19
- return node;
20
- }
21
- }
22
- else if (isFunction(value)) {
23
- const node = value(ctx.createExpressionBuilder()).toOperationNode();
24
- if (!QueryNode.isMutating(node)) {
25
- return node;
26
- }
27
- }
28
- throw new Error(`unsupported value for mutation object ${JSON.stringify(value)}`);
29
- }
@@ -1,8 +1,11 @@
1
1
  import { ValueExpressionNode } from '../operation-node/operation-node-utils.js';
2
- import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
3
- import { ExtractTypeFromReferenceExpression } from './reference-parser.js';
2
+ import { ValueNode } from '../operation-node/value-node.js';
3
+ import { PrimitiveValue } from '../util/object-utils.js';
4
4
  import { ParseContext } from './parse-context.js';
5
- export declare type ValueExpression<DB, TB extends keyof DB, RE> = ExtractTypeFromReferenceExpression<DB, TB, RE> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
6
- export declare type ValueExpressionOrList<DB, TB extends keyof DB, RE> = ValueExpression<DB, TB, RE> | ReadonlyArray<ValueExpression<DB, TB, RE>>;
7
- export declare function parseValueExpressionOrList(ctx: ParseContext, arg: ValueExpressionOrList<any, any, any>): ValueExpressionNode;
8
- export declare function parseValueExpression(ctx: ParseContext, arg: ValueExpression<any, any, any>): ValueExpressionNode;
5
+ import { SelectQueryNode } from '../operation-node/select-query-node.js';
6
+ import { RawNode } from '../operation-node/raw-node.js';
7
+ import { ComplexExpression } from './complex-expression-parser.js';
8
+ export declare type ValueExpression<DB, TB extends keyof DB, V> = V | ComplexExpression<DB, TB>;
9
+ export declare type ValueExpressionOrList<DB, TB extends keyof DB, V> = ValueExpression<DB, TB, V> | ReadonlyArray<ValueExpression<DB, TB, V>>;
10
+ export declare function parseValueExpressionOrList(ctx: ParseContext, arg: ValueExpressionOrList<any, any, PrimitiveValue>): ValueExpressionNode;
11
+ export declare function parseValueExpression(ctx: ParseContext, exp: ValueExpression<any, any, PrimitiveValue>): ValueNode | SelectQueryNode | RawNode;
@@ -1,49 +1,26 @@
1
- import { ColumnNode } from '../operation-node/column-node.js';
2
- import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
3
1
  import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-node.js';
4
2
  import { ValueListNode } from '../operation-node/value-list-node.js';
5
3
  import { ValueNode } from '../operation-node/value-node.js';
6
- import { isFunction, isPrimitive } from '../util/object-utils.js';
7
- import { QueryNode } from '../operation-node/query-node.js';
4
+ import { isPrimitive, isReadonlyArray, } from '../util/object-utils.js';
5
+ import { parseComplexExpression, } from './complex-expression-parser.js';
8
6
  export function parseValueExpressionOrList(ctx, arg) {
9
- if (Array.isArray(arg)) {
7
+ if (isReadonlyArray(arg)) {
10
8
  return parseValueExpressionList(ctx, arg);
11
9
  }
12
10
  else {
13
11
  return parseValueExpression(ctx, arg);
14
12
  }
15
13
  }
16
- export function parseValueExpression(ctx, arg) {
17
- if (isPrimitive(arg)) {
18
- return ValueNode.create(arg);
14
+ export function parseValueExpression(ctx, exp) {
15
+ if (isPrimitive(exp)) {
16
+ return ValueNode.create(exp);
19
17
  }
20
- else if (isOperationNodeSource(arg)) {
21
- const node = arg.toOperationNode();
22
- if (!QueryNode.isMutating(node)) {
23
- return node;
24
- }
25
- }
26
- else if (isFunction(arg)) {
27
- const node = arg(ctx.createExpressionBuilder()).toOperationNode();
28
- if (!QueryNode.isMutating(node)) {
29
- return node;
30
- }
31
- }
32
- throw new Error(`invalid value expression ${JSON.stringify(arg)}`);
18
+ return parseComplexExpression(ctx, exp);
33
19
  }
34
20
  function parseValueExpressionList(ctx, arg) {
35
21
  if (arg.every(isPrimitive)) {
36
22
  // Optimization for large lists of primitive values.
37
23
  return PrimitiveValueListNode.create(arg);
38
24
  }
39
- return ValueListNode.create(arg.map((it) => {
40
- const node = parseValueExpression(ctx, it);
41
- if (ColumnNode.is(node)) {
42
- throw new Error('value lists cannot have column references');
43
- }
44
- if (ValueListNode.is(node) || PrimitiveValueListNode.is(node)) {
45
- throw new Error('value lists cannot have nested lists');
46
- }
47
- return node;
48
- }));
25
+ return ValueListNode.create(arg.map((it) => parseValueExpression(ctx, it)));
49
26
  }
@@ -1,11 +1,41 @@
1
+ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
2
+ import { UpdateQueryBuilder } from '../query-builder/update-query-builder.js';
3
+ import { DeleteQueryBuilder } from '../query-builder/delete-query-builder.js';
4
+ import { InsertQueryBuilder } from '../query-builder/insert-query-builder.js';
1
5
  import { CommonTableExpressionNode } from '../operation-node/common-table-expression-node.js';
2
- import { QueryBuilder } from '../query-builder/query-builder.js';
3
6
  import { QueryCreator } from '../query-creator.js';
4
7
  import { RawBuilder } from '../raw-builder/raw-builder.js';
5
- import { AnyRawBuilder } from '../util/type-utils.js';
6
8
  import { ParseContext } from './parse-context.js';
7
- export declare type CommonTableExpression<DB> = (creator: QueryCreator<DB>) => QueryBuilder<DB, any> | AnyRawBuilder;
8
- export declare type QueryCreatorWithCommonTableExpression<DB, N extends string, E extends CommonTableExpression<DB>> = QueryCreator<DB & Record<N, ExtractRowTypeFromCommonTableExpression<E>>>;
9
- declare type ExtractRowTypeFromCommonTableExpression<E> = E extends (creator: QueryCreator<any>) => infer Q ? Q extends QueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
10
- export declare function parseCommonTableExpression(ctx: ParseContext, name: string, expression: CommonTableExpression<any>): CommonTableExpressionNode;
9
+ export declare type CommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB>) => CommonTableExpressionOutput<DB, CN>;
10
+ export declare type RecursiveCommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpressionName<CN>>>) => CommonTableExpressionOutput<DB, CN>;
11
+ export declare type QueryCreatorWithCommonTableExpression<DB, CN extends string, CTE> = QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpression<CTE>>>;
12
+ declare type CommonTableExpressionOutput<DB, CN extends string> = SelectQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | RawBuilder<ExtractRowFromCommonTableExpressionName<CN>>;
13
+ /**
14
+ * Given a common CommonTableExpression CTE extracts the row type from it.
15
+ *
16
+ * For example a CTE `(db) => db.selectFrom('person').select(['id', 'first_name'])`
17
+ * would result in `Pick<Person, 'id' | 'first_name'>`.
18
+ */
19
+ declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
20
+ /**
21
+ * Extracts 'person' from a string like 'person(id, first_name)'.
22
+ */
23
+ declare type ExtractTableFromCommonTableExpressionName<CN extends string> = CN extends `${infer TB}(${string})` ? TB : CN;
24
+ /**
25
+ * Parses a string like 'person(id, first_name)' into a type:
26
+ *
27
+ * {
28
+ * id: any,
29
+ * first_name: any
30
+ * }
31
+ *
32
+ */
33
+ declare type ExtractRowFromCommonTableExpressionName<CN extends string> = CN extends `${string}(${infer CL})` ? {
34
+ [C in ExtractColumnNamesFromColumnList<CL>]: any;
35
+ } : Record<string, any>;
36
+ /**
37
+ * Parses a string like 'id, first_name' into a type 'id' | 'first_name'
38
+ */
39
+ declare type ExtractColumnNamesFromColumnList<R extends string> = R extends `${infer C}, ${infer RS}` ? C | ExtractColumnNamesFromColumnList<RS> : R;
40
+ export declare function parseCommonTableExpression(ctx: ParseContext, name: string, expression: CommonTableExpression<any, any>): CommonTableExpressionNode;
11
41
  export {};
@@ -1,6 +1,17 @@
1
- import { IdentifierNode } from '../operation-node/identifier-node.js';
2
1
  import { CommonTableExpressionNode } from '../operation-node/common-table-expression-node.js';
2
+ import { CommonTableExpressionNameNode } from '../operation-node/common-table-expression-name-node.js';
3
3
  export function parseCommonTableExpression(ctx, name, expression) {
4
4
  const builder = expression(ctx.createQueryCreator());
5
- return CommonTableExpressionNode.create(IdentifierNode.create(name), builder.toOperationNode());
5
+ return CommonTableExpressionNode.create(parseCommonTableExpressionName(name), builder.toOperationNode());
6
+ }
7
+ function parseCommonTableExpressionName(name) {
8
+ if (name.includes('(')) {
9
+ const parts = name.split(/[\(\)]/);
10
+ const table = parts[0];
11
+ const columns = parts[1].split(',').map((it) => it.trim());
12
+ return CommonTableExpressionNameNode.create(table, columns);
13
+ }
14
+ else {
15
+ return CommonTableExpressionNameNode.create(name);
16
+ }
6
17
  }
@@ -94,7 +94,41 @@ export interface CamelCasePluginOptions {
94
94
  export declare class CamelCasePlugin implements KyselyPlugin {
95
95
  #private;
96
96
  constructor(opt?: CamelCasePluginOptions);
97
+ /**
98
+ * This is called for each query before it is executed. You can modify the query by
99
+ * transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
100
+ * and returning the transformed tree. You'd usually want to use an {@link OperationNodeTransformer}
101
+ * for this.
102
+ *
103
+ * If you need to pass some query-related data between this method and `transformResult` you
104
+ * can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
105
+ *
106
+ * ```ts
107
+ * const plugin = {
108
+ * data: new WeakMap<QueryId, SomeData>(),
109
+ *
110
+ * transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
111
+ * this.data.set(args.queryId, something)
112
+ * return args.node
113
+ * },
114
+ *
115
+ * transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow> {
116
+ * const data = this.data.get(args.queryId)
117
+ * return args.result
118
+ * }
119
+ * }
120
+ * ```
121
+ *
122
+ * You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
123
+ * is not always matched by a call to `transformResult` which would leave orphaned items in the map
124
+ * and cause a memory leak.
125
+ */
97
126
  transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
127
+ /**
128
+ * This method is called for each query after it has been executed. The result
129
+ * of the query can be accessed through {@link PluginTransformResultArgs.result | args.result}.
130
+ * You can modify the result and return the modifier result.
131
+ */
98
132
  transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
99
133
  protected mapRow(row: UnknownRow): UnknownRow;
100
134
  protected snakeCase(str: string): string;
@@ -12,6 +12,40 @@ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } fro
12
12
  */
13
13
  export declare class ImmediateValuePlugin implements KyselyPlugin {
14
14
  #private;
15
+ /**
16
+ * This is called for each query before it is executed. You can modify the query by
17
+ * transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
18
+ * and returning the transformed tree. You'd usually want to use an {@link OperationNodeTransformer}
19
+ * for this.
20
+ *
21
+ * If you need to pass some query-related data between this method and `transformResult` you
22
+ * can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
23
+ *
24
+ * ```ts
25
+ * const plugin = {
26
+ * data: new WeakMap<QueryId, SomeData>(),
27
+ *
28
+ * transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
29
+ * this.data.set(args.queryId, something)
30
+ * return args.node
31
+ * },
32
+ *
33
+ * transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow> {
34
+ * const data = this.data.get(args.queryId)
35
+ * return args.result
36
+ * }
37
+ * }
38
+ * ```
39
+ *
40
+ * You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
41
+ * is not always matched by a call to `transformResult` which would leave orphaned items in the map
42
+ * and cause a memory leak.
43
+ */
15
44
  transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
45
+ /**
46
+ * This method is called for each query after it has been executed. The result
47
+ * of the query can be accessed through {@link PluginTransformResultArgs.result | args.result}.
48
+ * You can modify the result and return the modifier result.
49
+ */
16
50
  transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
17
51
  }
@@ -12,7 +12,7 @@ export class ImmediateValuePlugin {
12
12
  transformQuery(args) {
13
13
  return this.#transformer.transformNode(args.node);
14
14
  }
15
- async transformResult(args) {
16
- return args.result;
15
+ transformResult(args) {
16
+ return Promise.resolve(args.result);
17
17
  }
18
18
  }
@@ -5,6 +5,40 @@ import { UnknownRow } from '../../util/type-utils.js';
5
5
  export declare class WithSchemaPlugin implements KyselyPlugin {
6
6
  #private;
7
7
  constructor(schema: string);
8
+ /**
9
+ * This is called for each query before it is executed. You can modify the query by
10
+ * transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
11
+ * and returning the transformed tree. You'd usually want to use an {@link OperationNodeTransformer}
12
+ * for this.
13
+ *
14
+ * If you need to pass some query-related data between this method and `transformResult` you
15
+ * can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
16
+ *
17
+ * ```ts
18
+ * const plugin = {
19
+ * data: new WeakMap<QueryId, SomeData>(),
20
+ *
21
+ * transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
22
+ * this.data.set(args.queryId, something)
23
+ * return args.node
24
+ * },
25
+ *
26
+ * transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow> {
27
+ * const data = this.data.get(args.queryId)
28
+ * return args.result
29
+ * }
30
+ * }
31
+ * ```
32
+ *
33
+ * You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
34
+ * is not always matched by a call to `transformResult` which would leave orphaned items in the map
35
+ * and cause a memory leak.
36
+ */
8
37
  transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
38
+ /**
39
+ * This method is called for each query after it has been executed. The result
40
+ * of the query can be accessed through {@link PluginTransformResultArgs.result | args.result}.
41
+ * You can modify the result and return the modifier result.
42
+ */
9
43
  transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
10
44
  }
@@ -79,6 +79,9 @@ export class WithSchemaTransformer extends OperationNodeTransformer {
79
79
  if ('joins' in node && node.joins) {
80
80
  this.#collectTablesFromJoins(node.joins, tables);
81
81
  }
82
+ if ('with' in node && node.with) {
83
+ this.#removeCommonTableExpressionTables(node.with, tables);
84
+ }
82
85
  return tables;
83
86
  }
84
87
  #collectTablesFromTableExpressionNodes(nodes, tables) {
@@ -101,4 +104,9 @@ export class WithSchemaTransformer extends OperationNodeTransformer {
101
104
  tables.add(table.table.identifier);
102
105
  }
103
106
  }
107
+ #removeCommonTableExpressionTables(node, tables) {
108
+ for (const expr of node.expressions) {
109
+ tables.delete(expr.name.table.table.identifier);
110
+ }
111
+ }
104
112
  }