kysely 0.26.1 → 0.26.3

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 (226) hide show
  1. package/README.md +6 -6
  2. package/dist/cjs/dialect/dialect-adapter-base.d.ts +3 -3
  3. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +3 -2
  4. package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
  5. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +3 -2
  6. package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -2
  7. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +2 -2
  8. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +4 -2
  9. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -2
  10. package/dist/cjs/driver/runtime-driver.js +17 -2
  11. package/dist/cjs/expression/expression-builder.d.ts +300 -27
  12. package/dist/cjs/expression/expression-builder.js +36 -26
  13. package/dist/cjs/expression/expression-wrapper.d.ts +177 -8
  14. package/dist/cjs/expression/expression-wrapper.js +4 -4
  15. package/dist/cjs/expression/expression.d.ts +64 -1
  16. package/dist/cjs/helpers/mysql.d.ts +14 -11
  17. package/dist/cjs/helpers/mysql.js +21 -32
  18. package/dist/cjs/helpers/postgres.d.ts +8 -5
  19. package/dist/cjs/helpers/postgres.js +8 -5
  20. package/dist/cjs/helpers/sqlite.d.ts +164 -0
  21. package/dist/cjs/helpers/sqlite.js +180 -0
  22. package/dist/cjs/index.d.ts +5 -3
  23. package/dist/cjs/index.js +1 -0
  24. package/dist/cjs/kysely.d.ts +4 -3
  25. package/dist/cjs/kysely.js +1 -1
  26. package/dist/cjs/operation-node/common-table-expression-node.d.ts +4 -0
  27. package/dist/cjs/operation-node/common-table-expression-node.js +6 -0
  28. package/dist/cjs/operation-node/delete-query-node.d.ts +1 -1
  29. package/dist/cjs/operation-node/delete-query-node.js +3 -3
  30. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  31. package/dist/cjs/operation-node/operation-node-transformer.js +8 -0
  32. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  33. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  34. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  35. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  36. package/dist/cjs/operation-node/operator-node.js +3 -0
  37. package/dist/cjs/operation-node/order-by-node.d.ts +2 -2
  38. package/dist/cjs/operation-node/order-by-node.js +4 -4
  39. package/dist/cjs/operation-node/over-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/over-node.js +3 -3
  41. package/dist/cjs/operation-node/select-query-node.d.ts +5 -4
  42. package/dist/cjs/operation-node/select-query-node.js +13 -7
  43. package/dist/cjs/operation-node/tuple-node.d.ts +12 -0
  44. package/dist/cjs/operation-node/tuple-node.js +18 -0
  45. package/dist/cjs/parser/binary-operation-parser.d.ts +11 -7
  46. package/dist/cjs/parser/binary-operation-parser.js +35 -46
  47. package/dist/cjs/parser/expression-parser.d.ts +10 -5
  48. package/dist/cjs/parser/join-parser.d.ts +2 -2
  49. package/dist/cjs/parser/join-parser.js +2 -3
  50. package/dist/cjs/parser/order-by-parser.d.ts +6 -2
  51. package/dist/cjs/parser/order-by-parser.js +41 -7
  52. package/dist/cjs/parser/parse-utils.js +2 -2
  53. package/dist/cjs/parser/reference-parser.d.ts +2 -2
  54. package/dist/cjs/parser/reference-parser.js +1 -1
  55. package/dist/cjs/parser/returning-parser.d.ts +2 -1
  56. package/dist/cjs/parser/select-parser.d.ts +20 -9
  57. package/dist/cjs/parser/set-operation-parser.d.ts +3 -1
  58. package/dist/cjs/parser/set-operation-parser.js +13 -4
  59. package/dist/cjs/parser/tuple-parser.d.ts +47 -0
  60. package/dist/cjs/parser/tuple-parser.js +2 -0
  61. package/dist/cjs/parser/value-parser.d.ts +5 -3
  62. package/dist/cjs/parser/value-parser.js +12 -1
  63. package/dist/cjs/parser/with-parser.d.ts +3 -2
  64. package/dist/cjs/parser/with-parser.js +16 -4
  65. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +3 -3
  66. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +4 -8
  67. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
  68. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +50 -14
  69. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +5 -5
  70. package/dist/cjs/query-builder/aggregate-function-builder.js +2 -2
  71. package/dist/cjs/query-builder/case-builder.js +8 -4
  72. package/dist/cjs/query-builder/cte-builder.d.ts +20 -0
  73. package/dist/cjs/query-builder/cte-builder.js +39 -0
  74. package/dist/cjs/query-builder/delete-query-builder.d.ts +39 -10
  75. package/dist/cjs/query-builder/delete-query-builder.js +3 -3
  76. package/dist/cjs/query-builder/function-module.d.ts +41 -6
  77. package/dist/cjs/query-builder/function-module.js +3 -0
  78. package/dist/cjs/query-builder/having-interface.d.ts +2 -5
  79. package/dist/cjs/query-builder/insert-query-builder.d.ts +5 -3
  80. package/dist/cjs/query-builder/join-builder.d.ts +2 -6
  81. package/dist/cjs/query-builder/join-builder.js +2 -2
  82. package/dist/cjs/query-builder/json-path-builder.d.ts +59 -3
  83. package/dist/cjs/query-builder/on-conflict-builder.d.ts +65 -12
  84. package/dist/cjs/query-builder/on-conflict-builder.js +4 -4
  85. package/dist/cjs/query-builder/over-builder.js +1 -1
  86. package/dist/cjs/query-builder/returning-interface.d.ts +3 -2
  87. package/dist/cjs/query-builder/select-query-builder-expression.d.ts +20 -0
  88. package/dist/cjs/query-builder/select-query-builder-expression.js +2 -0
  89. package/dist/cjs/query-builder/select-query-builder.d.ts +206 -67
  90. package/dist/cjs/query-builder/select-query-builder.js +75 -924
  91. package/dist/cjs/query-builder/update-query-builder.d.ts +39 -10
  92. package/dist/cjs/query-builder/update-query-builder.js +2 -2
  93. package/dist/cjs/query-builder/where-interface.d.ts +32 -8
  94. package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
  95. package/dist/cjs/query-compiler/default-query-compiler.js +39 -7
  96. package/dist/cjs/query-creator.d.ts +76 -2
  97. package/dist/cjs/query-creator.js +36 -6
  98. package/dist/cjs/raw-builder/raw-builder.d.ts +87 -51
  99. package/dist/cjs/raw-builder/raw-builder.js +18 -45
  100. package/dist/cjs/raw-builder/sql.js +8 -8
  101. package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
  102. package/dist/cjs/schema/alter-table-builder.js +12 -0
  103. package/dist/cjs/schema/create-index-builder.d.ts +1 -1
  104. package/dist/cjs/schema/create-index-builder.js +1 -1
  105. package/dist/cjs/schema/create-view-builder.d.ts +2 -2
  106. package/dist/cjs/util/column-type.d.ts +7 -6
  107. package/dist/cjs/util/infer-result.d.ts +2 -1
  108. package/dist/cjs/util/json-object-args.d.ts +3 -0
  109. package/dist/cjs/util/json-object-args.js +35 -0
  110. package/dist/cjs/util/object-utils.d.ts +1 -0
  111. package/dist/cjs/util/object-utils.js +9 -1
  112. package/dist/cjs/util/type-utils.d.ts +16 -17
  113. package/dist/esm/dialect/dialect-adapter-base.d.ts +3 -3
  114. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +3 -2
  115. package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
  116. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +3 -2
  117. package/dist/esm/dialect/postgres/postgres-adapter.js +2 -2
  118. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +2 -2
  119. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +4 -2
  120. package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -2
  121. package/dist/esm/driver/runtime-driver.js +17 -2
  122. package/dist/esm/expression/expression-builder.d.ts +300 -27
  123. package/dist/esm/expression/expression-builder.js +40 -30
  124. package/dist/esm/expression/expression-wrapper.d.ts +177 -8
  125. package/dist/esm/expression/expression-wrapper.js +5 -5
  126. package/dist/esm/expression/expression.d.ts +64 -1
  127. package/dist/esm/helpers/mysql.d.ts +14 -11
  128. package/dist/esm/helpers/mysql.js +21 -32
  129. package/dist/esm/helpers/postgres.d.ts +8 -5
  130. package/dist/esm/helpers/postgres.js +8 -5
  131. package/dist/esm/helpers/sqlite.d.ts +164 -0
  132. package/dist/esm/helpers/sqlite.js +175 -0
  133. package/dist/esm/index.d.ts +5 -3
  134. package/dist/esm/index.js +1 -0
  135. package/dist/esm/kysely.d.ts +4 -3
  136. package/dist/esm/kysely.js +1 -1
  137. package/dist/esm/operation-node/common-table-expression-node.d.ts +4 -0
  138. package/dist/esm/operation-node/common-table-expression-node.js +6 -0
  139. package/dist/esm/operation-node/delete-query-node.d.ts +1 -1
  140. package/dist/esm/operation-node/delete-query-node.js +3 -3
  141. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  142. package/dist/esm/operation-node/operation-node-transformer.js +8 -0
  143. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  144. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  145. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  146. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  147. package/dist/esm/operation-node/operator-node.js +3 -0
  148. package/dist/esm/operation-node/order-by-node.d.ts +2 -2
  149. package/dist/esm/operation-node/order-by-node.js +4 -4
  150. package/dist/esm/operation-node/over-node.d.ts +1 -1
  151. package/dist/esm/operation-node/over-node.js +3 -3
  152. package/dist/esm/operation-node/select-query-node.d.ts +5 -4
  153. package/dist/esm/operation-node/select-query-node.js +13 -7
  154. package/dist/esm/operation-node/tuple-node.d.ts +12 -0
  155. package/dist/esm/operation-node/tuple-node.js +16 -0
  156. package/dist/esm/parser/binary-operation-parser.d.ts +11 -7
  157. package/dist/esm/parser/binary-operation-parser.js +36 -47
  158. package/dist/esm/parser/expression-parser.d.ts +10 -5
  159. package/dist/esm/parser/join-parser.d.ts +2 -2
  160. package/dist/esm/parser/join-parser.js +3 -4
  161. package/dist/esm/parser/order-by-parser.d.ts +6 -2
  162. package/dist/esm/parser/order-by-parser.js +40 -7
  163. package/dist/esm/parser/parse-utils.js +3 -3
  164. package/dist/esm/parser/reference-parser.d.ts +2 -2
  165. package/dist/esm/parser/reference-parser.js +1 -1
  166. package/dist/esm/parser/returning-parser.d.ts +2 -1
  167. package/dist/esm/parser/select-parser.d.ts +20 -9
  168. package/dist/esm/parser/set-operation-parser.d.ts +3 -1
  169. package/dist/esm/parser/set-operation-parser.js +11 -2
  170. package/dist/esm/parser/tuple-parser.d.ts +47 -0
  171. package/dist/esm/parser/tuple-parser.js +2 -0
  172. package/dist/esm/parser/value-parser.d.ts +5 -3
  173. package/dist/esm/parser/value-parser.js +10 -1
  174. package/dist/esm/parser/with-parser.d.ts +3 -2
  175. package/dist/esm/parser/with-parser.js +16 -4
  176. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +3 -3
  177. package/dist/esm/plugin/camel-case/camel-case-plugin.js +5 -9
  178. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
  179. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +51 -15
  180. package/dist/esm/query-builder/aggregate-function-builder.d.ts +5 -5
  181. package/dist/esm/query-builder/aggregate-function-builder.js +3 -3
  182. package/dist/esm/query-builder/case-builder.js +10 -6
  183. package/dist/esm/query-builder/cte-builder.d.ts +20 -0
  184. package/dist/esm/query-builder/cte-builder.js +36 -0
  185. package/dist/esm/query-builder/delete-query-builder.d.ts +39 -10
  186. package/dist/esm/query-builder/delete-query-builder.js +4 -4
  187. package/dist/esm/query-builder/function-module.d.ts +41 -6
  188. package/dist/esm/query-builder/function-module.js +3 -0
  189. package/dist/esm/query-builder/having-interface.d.ts +2 -5
  190. package/dist/esm/query-builder/insert-query-builder.d.ts +5 -3
  191. package/dist/esm/query-builder/join-builder.d.ts +2 -6
  192. package/dist/esm/query-builder/join-builder.js +3 -3
  193. package/dist/esm/query-builder/json-path-builder.d.ts +59 -3
  194. package/dist/esm/query-builder/on-conflict-builder.d.ts +65 -12
  195. package/dist/esm/query-builder/on-conflict-builder.js +5 -5
  196. package/dist/esm/query-builder/over-builder.js +1 -1
  197. package/dist/esm/query-builder/returning-interface.d.ts +3 -2
  198. package/dist/esm/query-builder/select-query-builder-expression.d.ts +20 -0
  199. package/dist/esm/query-builder/select-query-builder-expression.js +2 -0
  200. package/dist/esm/query-builder/select-query-builder.d.ts +206 -67
  201. package/dist/esm/query-builder/select-query-builder.js +75 -923
  202. package/dist/esm/query-builder/update-query-builder.d.ts +39 -10
  203. package/dist/esm/query-builder/update-query-builder.js +3 -3
  204. package/dist/esm/query-builder/where-interface.d.ts +32 -8
  205. package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
  206. package/dist/esm/query-compiler/default-query-compiler.js +39 -7
  207. package/dist/esm/query-creator.d.ts +76 -2
  208. package/dist/esm/query-creator.js +37 -7
  209. package/dist/esm/raw-builder/raw-builder.d.ts +87 -51
  210. package/dist/esm/raw-builder/raw-builder.js +17 -42
  211. package/dist/esm/raw-builder/sql.js +9 -9
  212. package/dist/esm/schema/alter-table-builder.d.ts +4 -0
  213. package/dist/esm/schema/alter-table-builder.js +12 -0
  214. package/dist/esm/schema/create-index-builder.d.ts +1 -1
  215. package/dist/esm/schema/create-index-builder.js +2 -2
  216. package/dist/esm/schema/create-view-builder.d.ts +2 -2
  217. package/dist/esm/util/column-type.d.ts +7 -6
  218. package/dist/esm/util/infer-result.d.ts +2 -1
  219. package/dist/esm/util/json-object-args.d.ts +3 -0
  220. package/dist/esm/util/json-object-args.js +32 -0
  221. package/dist/esm/util/object-utils.d.ts +1 -0
  222. package/dist/esm/util/object-utils.js +7 -0
  223. package/dist/esm/util/type-utils.d.ts +16 -17
  224. package/helpers/sqlite.d.ts +1 -0
  225. package/helpers/sqlite.js +1 -0
  226. package/package.json +7 -4
@@ -1,38 +1,18 @@
1
1
  import { QueryResult } from '../driver/database-connection.js';
2
- import { AliasNode } from '../operation-node/alias-node.js';
3
2
  import { RawNode } from '../operation-node/raw-node.js';
4
3
  import { CompiledQuery } from '../query-compiler/compiled-query.js';
5
4
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
6
5
  import { QueryExecutorProvider } from '../query-executor/query-executor-provider.js';
7
6
  import { QueryId } from '../util/query-id.js';
8
- import { AliasedExpression, Expression } from '../expression/expression.js';
7
+ import { AliasableExpression, AliasedExpression, Expression } from '../expression/expression.js';
9
8
  /**
10
9
  * An instance of this class can be used to create raw SQL snippets or queries.
11
10
  *
12
11
  * You shouldn't need to create `RawBuilder` instances directly. Instead you should
13
12
  * use the {@link sql} template tag.
14
13
  */
15
- export declare class RawBuilder<O> implements Expression<O> {
16
- #private;
17
- constructor(props: RawBuilderProps);
18
- /** @private */
19
- /**
20
- * All expressions need to have this getter for complicated type-related reasons.
21
- * Simply add this getter for your expression and always return `undefined` from it:
22
- *
23
- * ```ts
24
- * class SomeExpression<T> implements Expression<T> {
25
- * get expressionType(): T | undefined {
26
- * return undefined
27
- * }
28
- * }
29
- * ```
30
- *
31
- * The getter is needed to make the expression assignable to another expression only
32
- * if the types `T` are assignable. Without this property (or some other property
33
- * that references `T`), you could assing `Expression<string>` to `Expression<number>`.
34
- */
35
- get expressionType(): O | undefined;
14
+ export interface RawBuilder<O> extends AliasableExpression<O> {
15
+ get isRawBuilder(): true;
36
16
  /**
37
17
  * Returns an aliased version of the SQL expression.
38
18
  *
@@ -87,6 +67,62 @@ export declare class RawBuilder<O> implements Expression<O> {
87
67
  * ```
88
68
  */
89
69
  as<A extends string>(alias: A): AliasedRawBuilder<O, A>;
70
+ /**
71
+ * Returns an aliased version of the expression.
72
+ *
73
+ * In addition to slapping `as "the_alias"` at the end of the expression,
74
+ * this method also provides strict typing:
75
+ *
76
+ * ```ts
77
+ * const result = await db
78
+ * .selectFrom('person')
79
+ * .select((eb) =>
80
+ * // `eb.fn<string>` returns an AliasableExpression<string>
81
+ * eb.fn<string>('concat', ['first_name' eb.val(' '), 'last_name']).as('full_name')
82
+ * )
83
+ * .executeTakeFirstOrThrow()
84
+ *
85
+ * // `full_name: string` field exists in the result type.
86
+ * console.log(result.full_name)
87
+ * ```
88
+ *
89
+ * The generated SQL (PostgreSQL):
90
+ *
91
+ * ```ts
92
+ * select
93
+ * concat("first_name", $1, "last_name") as "full_name"
94
+ * from
95
+ * "person"
96
+ * ```
97
+ *
98
+ * You can also pass in a raw SQL snippet (or any expression) but in that case you must
99
+ * provide the alias as the only type argument:
100
+ *
101
+ * ```ts
102
+ * const values = sql<{ a: number, b: string }>`(values (1, 'foo'))`
103
+ *
104
+ * // The alias is `t(a, b)` which specifies the column names
105
+ * // in addition to the table name. We must tell kysely that
106
+ * // columns of the table can be referenced through `t`
107
+ * // by providing an explicit type argument.
108
+ * const aliasedValues = values.as<'t'>(sql`t(a, b)`)
109
+ *
110
+ * await db
111
+ * .insertInto('person')
112
+ * .columns(['first_name', 'last_name'])
113
+ * .expression(
114
+ * db.selectFrom(aliasedValues).select(['t.a', 't.b'])
115
+ * )
116
+ * ```
117
+ *
118
+ * The generated SQL (PostgreSQL):
119
+ *
120
+ * ```ts
121
+ * insert into "person" ("first_name", "last_name")
122
+ * from (values (1, 'foo')) as t(a, b)
123
+ * select "t"."a", "t"."b"
124
+ * ```
125
+ */
90
126
  as<A extends string>(alias: Expression<any>): AliasedRawBuilder<O, A>;
91
127
  /**
92
128
  * Change the output type of the raw expression.
@@ -95,14 +131,31 @@ export declare class RawBuilder<O> implements Expression<O> {
95
131
  * returns a copy of this `RawBuilder` with a new output type.
96
132
  */
97
133
  $castTo<T>(): RawBuilder<T>;
98
- /**
99
- * @deprecated Use `$castTo` instead.
100
- */
101
- castTo<T>(): RawBuilder<T>;
102
134
  /**
103
135
  * Adds a plugin for this SQL snippet.
104
136
  */
105
137
  withPlugin(plugin: KyselyPlugin): RawBuilder<O>;
138
+ /**
139
+ * Compiles the builder to a `CompiledQuery`.
140
+ *
141
+ * ### Examples
142
+ *
143
+ * ```ts
144
+ * const { sql } = sql`select * from ${sql.table('person')}`.compile(db)
145
+ * console.log(sql)
146
+ * ```
147
+ */
148
+ compile(executorProvider: QueryExecutorProvider): CompiledQuery<O>;
149
+ /**
150
+ * Executes the raw query.
151
+ *
152
+ * ### Examples
153
+ *
154
+ * ```ts
155
+ * const result = await sql`select * from ${sql.table('person')}`.execute(db)
156
+ * ```
157
+ */
158
+ execute(executorProvider: QueryExecutorProvider): Promise<QueryResult<O>>;
106
159
  /**
107
160
  * Creates the OperationNode that describes how to compile this expression into SQL.
108
161
  *
@@ -118,33 +171,16 @@ export declare class RawBuilder<O> implements Expression<O> {
118
171
  * ```
119
172
  */
120
173
  toOperationNode(): RawNode;
121
- compile(executorProvider: QueryExecutorProvider): CompiledQuery<O>;
122
- execute(executorProvider: QueryExecutorProvider): Promise<QueryResult<O>>;
123
- }
124
- export declare function isRawBuilder(obj: unknown): obj is RawBuilder<unknown>;
125
- /**
126
- * {@link RawBuilder} with an alias. The result of calling {@link RawBuilder.as}.
127
- */
128
- export declare class AliasedRawBuilder<O = unknown, A extends string = never> implements AliasedExpression<O, A> {
129
- #private;
130
- constructor(rawBuilder: RawBuilder<O>, alias: A | Expression<unknown>);
131
- /** @private */
132
- /**
133
- * Returns the aliased expression.
134
- */
135
- get expression(): Expression<O>;
136
- /** @private */
137
- /**
138
- * Returns the alias.
139
- */
140
- get alias(): A | Expression<unknown>;
141
- /**
142
- * Creates the OperationNode that describes how to compile this expression into SQL.
143
- */
144
- toOperationNode(): AliasNode;
145
174
  }
146
175
  export interface RawBuilderProps {
147
176
  readonly queryId: QueryId;
148
177
  readonly rawNode: RawNode;
149
178
  readonly plugins?: ReadonlyArray<KyselyPlugin>;
150
179
  }
180
+ export declare function createRawBuilder<O>(props: RawBuilderProps): RawBuilder<O>;
181
+ /**
182
+ * {@link RawBuilder} with an alias. The result of calling {@link RawBuilder.as}.
183
+ */
184
+ export interface AliasedRawBuilder<O = unknown, A extends string = never> extends AliasedExpression<O, A> {
185
+ get rawBuilder(): RawBuilder<O>;
186
+ }
@@ -1,48 +1,29 @@
1
1
  /// <reference types="./raw-builder.d.ts" />
2
2
  import { AliasNode } from '../operation-node/alias-node.js';
3
3
  import { preventAwait } from '../util/prevent-await.js';
4
- import { freeze, isFunction, isObject } from '../util/object-utils.js';
4
+ import { freeze } from '../util/object-utils.js';
5
5
  import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
6
6
  import { IdentifierNode } from '../operation-node/identifier-node.js';
7
7
  import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
8
- /**
9
- * An instance of this class can be used to create raw SQL snippets or queries.
10
- *
11
- * You shouldn't need to create `RawBuilder` instances directly. Instead you should
12
- * use the {@link sql} template tag.
13
- */
14
- export class RawBuilder {
8
+ class RawBuilderImpl {
15
9
  #props;
16
10
  constructor(props) {
17
11
  this.#props = freeze(props);
18
12
  }
19
- /** @private */
20
13
  get expressionType() {
21
14
  return undefined;
22
15
  }
16
+ get isRawBuilder() {
17
+ return true;
18
+ }
23
19
  as(alias) {
24
- return new AliasedRawBuilder(this, alias);
25
- }
26
- /**
27
- * Change the output type of the raw expression.
28
- *
29
- * This method call doesn't change the SQL in any way. This methods simply
30
- * returns a copy of this `RawBuilder` with a new output type.
31
- */
32
- $castTo() {
33
- return new RawBuilder({ ...this.#props });
20
+ return new AliasedRawBuilderImpl(this, alias);
34
21
  }
35
- /**
36
- * @deprecated Use `$castTo` instead.
37
- */
38
- castTo() {
39
- return this.$castTo();
22
+ $castTo() {
23
+ return new RawBuilderImpl({ ...this.#props });
40
24
  }
41
- /**
42
- * Adds a plugin for this SQL snippet.
43
- */
44
25
  withPlugin(plugin) {
45
- return new RawBuilder({
26
+ return new RawBuilderImpl({
46
27
  ...this.#props,
47
28
  plugins: this.#props.plugins !== undefined
48
29
  ? freeze([...this.#props.plugins, plugin])
@@ -74,36 +55,30 @@ export class RawBuilder {
74
55
  return executor.compileQuery(this.#toOperationNode(executor), this.#props.queryId);
75
56
  }
76
57
  }
77
- export function isRawBuilder(obj) {
78
- return (isObject(obj) &&
79
- isFunction(obj.as) &&
80
- isFunction(obj.$castTo) &&
81
- isFunction(obj.withPlugin) &&
82
- isFunction(obj.toOperationNode) &&
83
- isFunction(obj.execute));
58
+ export function createRawBuilder(props) {
59
+ return new RawBuilderImpl(props);
84
60
  }
85
- preventAwait(RawBuilder, "don't await RawBuilder instances directly. To execute the query you need to call `execute`");
86
- /**
87
- * {@link RawBuilder} with an alias. The result of calling {@link RawBuilder.as}.
88
- */
89
- export class AliasedRawBuilder {
61
+ preventAwait(RawBuilderImpl, "don't await RawBuilder instances directly. To execute the query you need to call `execute`");
62
+ class AliasedRawBuilderImpl {
90
63
  #rawBuilder;
91
64
  #alias;
92
65
  constructor(rawBuilder, alias) {
93
66
  this.#rawBuilder = rawBuilder;
94
67
  this.#alias = alias;
95
68
  }
96
- /** @private */
97
69
  get expression() {
98
70
  return this.#rawBuilder;
99
71
  }
100
- /** @private */
101
72
  get alias() {
102
73
  return this.#alias;
103
74
  }
75
+ get rawBuilder() {
76
+ return this.#rawBuilder;
77
+ }
104
78
  toOperationNode() {
105
79
  return AliasNode.create(this.#rawBuilder.toOperationNode(), isOperationNodeSource(this.#alias)
106
80
  ? this.#alias.toOperationNode()
107
81
  : IdentifierNode.create(this.#alias));
108
82
  }
109
83
  }
84
+ preventAwait(AliasedRawBuilderImpl, "don't await AliasedRawBuilder instances directly. AliasedRawBuilder should never be executed directly since it's always a part of another query.");
@@ -6,21 +6,21 @@ import { parseStringReference } from '../parser/reference-parser.js';
6
6
  import { parseTable } from '../parser/table-parser.js';
7
7
  import { parseValueExpression } from '../parser/value-parser.js';
8
8
  import { createQueryId } from '../util/query-id.js';
9
- import { RawBuilder } from './raw-builder.js';
9
+ import { createRawBuilder } from './raw-builder.js';
10
10
  export const sql = Object.assign((sqlFragments, ...parameters) => {
11
- return new RawBuilder({
11
+ return createRawBuilder({
12
12
  queryId: createQueryId(),
13
13
  rawNode: RawNode.create(sqlFragments, parameters?.map(parseValueExpression) ?? []),
14
14
  });
15
15
  }, {
16
16
  ref(columnReference) {
17
- return new RawBuilder({
17
+ return createRawBuilder({
18
18
  queryId: createQueryId(),
19
19
  rawNode: RawNode.createWithChild(parseStringReference(columnReference)),
20
20
  });
21
21
  },
22
22
  val(value) {
23
- return new RawBuilder({
23
+ return createRawBuilder({
24
24
  queryId: createQueryId(),
25
25
  rawNode: RawNode.createWithChild(parseValueExpression(value)),
26
26
  });
@@ -29,7 +29,7 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
29
29
  return this.val(value);
30
30
  },
31
31
  table(tableReference) {
32
- return new RawBuilder({
32
+ return createRawBuilder({
33
33
  queryId: createQueryId(),
34
34
  rawNode: RawNode.createWithChild(parseTable(tableReference)),
35
35
  });
@@ -38,13 +38,13 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
38
38
  const fragments = new Array(ids.length + 1).fill('.');
39
39
  fragments[0] = '';
40
40
  fragments[fragments.length - 1] = '';
41
- return new RawBuilder({
41
+ return createRawBuilder({
42
42
  queryId: createQueryId(),
43
43
  rawNode: RawNode.create(fragments, ids.map(IdentifierNode.create)),
44
44
  });
45
45
  },
46
46
  lit(value) {
47
- return new RawBuilder({
47
+ return createRawBuilder({
48
48
  queryId: createQueryId(),
49
49
  rawNode: RawNode.createWithChild(ValueNode.createImmediate(value)),
50
50
  });
@@ -53,7 +53,7 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
53
53
  return this.lit(value);
54
54
  },
55
55
  raw(sql) {
56
- return new RawBuilder({
56
+ return createRawBuilder({
57
57
  queryId: createQueryId(),
58
58
  rawNode: RawNode.createWithSql(sql),
59
59
  });
@@ -67,7 +67,7 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
67
67
  nodes[2 * i + 1] = sep;
68
68
  }
69
69
  }
70
- return new RawBuilder({
70
+ return createRawBuilder({
71
71
  queryId: createQueryId(),
72
72
  rawNode: RawNode.createWithChildren(nodes),
73
73
  });
@@ -48,6 +48,10 @@ export declare class AlterTableBuilder implements ColumnAlteringInterface {
48
48
  * is because you can only add one column per `ALTER TABLE` query.
49
49
  */
50
50
  addForeignKeyConstraint(constraintName: string, columns: string[], targetTable: string, targetColumns: string[]): AlterTableAddForeignKeyConstraintBuilder;
51
+ /**
52
+ * See {@link CreateTableBuilder.addPrimaryKeyConstraint}
53
+ */
54
+ addPrimaryKeyConstraint(constraintName: string, columns: string[]): AlterTableExecutor;
51
55
  dropConstraint(constraintName: string): AlterTableDropConstraintBuilder;
52
56
  /**
53
57
  * Calls the given function passing `this` as the only argument.
@@ -22,6 +22,7 @@ import { AlterColumnBuilder, } from './alter-column-builder.js';
22
22
  import { AlterTableExecutor } from './alter-table-executor.js';
23
23
  import { AlterTableAddForeignKeyConstraintBuilder } from './alter-table-add-foreign-key-constraint-builder.js';
24
24
  import { AlterTableDropConstraintBuilder } from './alter-table-drop-constraint-builder.js';
25
+ import { PrimaryConstraintNode } from '../operation-node/primary-constraint-node.js';
25
26
  /**
26
27
  * This builder can be used to create a `alter table` query.
27
28
  */
@@ -114,6 +115,17 @@ export class AlterTableBuilder {
114
115
  constraintBuilder: new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName)),
115
116
  });
116
117
  }
118
+ /**
119
+ * See {@link CreateTableBuilder.addPrimaryKeyConstraint}
120
+ */
121
+ addPrimaryKeyConstraint(constraintName, columns) {
122
+ return new AlterTableExecutor({
123
+ ...this.#props,
124
+ node: AlterTableNode.cloneWithTableProps(this.#props.node, {
125
+ addConstraint: AddConstraintNode.create(PrimaryConstraintNode.create(columns, constraintName)),
126
+ }),
127
+ });
128
+ }
117
129
  dropConstraint(constraintName) {
118
130
  return new AlterTableDropConstraintBuilder({
119
131
  ...this.#props,
@@ -133,7 +133,7 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
133
133
  */
134
134
  where(lhs: C | Expression<any>, op: ComparisonOperatorExpression, rhs: unknown): CreateIndexBuilder<C>;
135
135
  where(factory: (qb: ExpressionBuilder<ShallowRecord<string, ShallowRecord<C & string, any>>, string>) => Expression<SqlBool>): CreateIndexBuilder<C>;
136
- where(expression: Expression<any>): CreateIndexBuilder<C>;
136
+ where(expression: Expression<SqlBool>): CreateIndexBuilder<C>;
137
137
  /**
138
138
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
139
139
  * what the provided function returns.
@@ -5,7 +5,7 @@ import { parseOrderedColumnName, } from '../parser/reference-parser.js';
5
5
  import { parseTable } from '../parser/table-parser.js';
6
6
  import { preventAwait } from '../util/prevent-await.js';
7
7
  import { freeze } from '../util/object-utils.js';
8
- import { parseFilter, } from '../parser/binary-operation-parser.js';
8
+ import { parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
9
9
  import { QueryNode } from '../operation-node/query-node.js';
10
10
  import { ImmediateValueTransformer } from '../plugin/immediate-value/immediate-value-transformer.js';
11
11
  export class CreateIndexBuilder {
@@ -148,7 +148,7 @@ export class CreateIndexBuilder {
148
148
  const transformer = new ImmediateValueTransformer();
149
149
  return new CreateIndexBuilder({
150
150
  ...this.#props,
151
- node: QueryNode.cloneWithWhere(this.#props.node, transformer.transformNode(parseFilter(args))),
151
+ node: QueryNode.cloneWithWhere(this.#props.node, transformer.transformNode(parseValueBinaryOperationOrExpression(args))),
152
152
  });
153
153
  }
154
154
  /**
@@ -4,8 +4,8 @@ import { Compilable } from '../util/compilable.js';
4
4
  import { QueryExecutor } from '../query-executor/query-executor.js';
5
5
  import { QueryId } from '../util/query-id.js';
6
6
  import { CreateViewNode } from '../operation-node/create-view-node.js';
7
- import { AnySelectQueryBuilder } from '../util/type-utils.js';
8
7
  import { RawBuilder } from '../raw-builder/raw-builder.js';
8
+ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
9
9
  export declare class CreateViewBuilder implements OperationNodeSource, Compilable {
10
10
  #private;
11
11
  constructor(props: CreateViewBuilderProps);
@@ -31,7 +31,7 @@ export declare class CreateViewBuilder implements OperationNodeSource, Compilabl
31
31
  * string opening an SQL injection vulnerability. DO NOT pass unchecked user input
32
32
  * into the query or raw expression passed to this method!
33
33
  */
34
- as(query: AnySelectQueryBuilder | RawBuilder<any>): CreateViewBuilder;
34
+ as(query: SelectQueryBuilder<any, any, any> | RawBuilder<any>): CreateViewBuilder;
35
35
  /**
36
36
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
37
37
  * what the provided function returns.
@@ -1,3 +1,4 @@
1
+ import { DrainOuterGeneric } from './type-utils.js';
1
2
  /**
2
3
  * This type can be used to specify a different type for
3
4
  * select, insert and update operations.
@@ -123,9 +124,9 @@ export type UpdateKeys<R> = {
123
124
  * // }
124
125
  * ```
125
126
  */
126
- export type Selectable<R> = {
127
+ export type Selectable<R> = DrainOuterGeneric<{
127
128
  [K in NonNeverSelectKeys<R>]: SelectType<R[K]>;
128
- };
129
+ }>;
129
130
  /**
130
131
  * Given a table interface, extracts the insert type from all
131
132
  * {@link ColumnType} types.
@@ -147,11 +148,11 @@ export type Selectable<R> = {
147
148
  * // }
148
149
  * ```
149
150
  */
150
- export type Insertable<R> = {
151
+ export type Insertable<R> = DrainOuterGeneric<{
151
152
  [K in NonNullableInsertKeys<R>]: InsertType<R[K]>;
152
153
  } & {
153
154
  [K in NullableInsertKeys<R>]?: InsertType<R[K]>;
154
- };
155
+ }>;
155
156
  /**
156
157
  * Given a table interface, extracts the update type from all
157
158
  * {@link ColumnType} types.
@@ -172,7 +173,7 @@ export type Insertable<R> = {
172
173
  * // }
173
174
  * ```
174
175
  */
175
- export type Updateable<R> = {
176
+ export type Updateable<R> = DrainOuterGeneric<{
176
177
  [K in UpdateKeys<R>]?: UpdateType<R[K]>;
177
- };
178
+ }>;
178
179
  export {};
@@ -3,6 +3,7 @@ import { InsertResult } from '../query-builder/insert-result.js';
3
3
  import { UpdateResult } from '../query-builder/update-result.js';
4
4
  import { CompiledQuery } from '../query-compiler/compiled-query.js';
5
5
  import { Compilable } from './compilable.js';
6
+ import { Simplify } from './type-utils.js';
6
7
  /**
7
8
  * A helper type that allows inferring a select/insert/update/delete query's result
8
9
  * type from a query builder or compiled query.
@@ -42,5 +43,5 @@ import { Compilable } from './compilable.js';
42
43
  * ```
43
44
  */
44
45
  export type InferResult<C extends Compilable<any> | CompiledQuery<any>> = C extends Compilable<infer O> ? ResolveResult<O> : C extends CompiledQuery<infer O> ? ResolveResult<O> : never;
45
- type ResolveResult<O> = O extends InsertResult | UpdateResult | DeleteResult ? O : O[];
46
+ type ResolveResult<O> = O extends InsertResult | UpdateResult | DeleteResult ? O : Simplify<O>[];
46
47
  export {};
@@ -0,0 +1,3 @@
1
+ import { Expression } from '../expression/expression.js';
2
+ import { SelectQueryNode } from '../operation-node/select-query-node.js';
3
+ export declare function getJsonObjectArgs(node: SelectQueryNode, table: string): Expression<unknown>[];
@@ -0,0 +1,32 @@
1
+ /// <reference types="./json-object-args.d.ts" />
2
+ import { ExpressionWrapper } from '../expression/expression-wrapper.js';
3
+ import { AliasNode } from '../operation-node/alias-node.js';
4
+ import { ColumnNode } from '../operation-node/column-node.js';
5
+ import { IdentifierNode } from '../operation-node/identifier-node.js';
6
+ import { ReferenceNode } from '../operation-node/reference-node.js';
7
+ import { TableNode } from '../operation-node/table-node.js';
8
+ import { ValueNode } from '../operation-node/value-node.js';
9
+ export function getJsonObjectArgs(node, table) {
10
+ const args = [];
11
+ for (const { selection: s } of node.selections ?? []) {
12
+ if (ReferenceNode.is(s) && ColumnNode.is(s.column)) {
13
+ args.push(colName(s.column.column.name), colRef(table, s.column.column.name));
14
+ }
15
+ else if (ColumnNode.is(s)) {
16
+ args.push(colName(s.column.name), colRef(table, s.column.name));
17
+ }
18
+ else if (AliasNode.is(s) && IdentifierNode.is(s.alias)) {
19
+ args.push(colName(s.alias.name), colRef(table, s.alias.name));
20
+ }
21
+ else {
22
+ throw new Error(`can't extract column names from the select query node`);
23
+ }
24
+ }
25
+ return args;
26
+ }
27
+ function colName(col) {
28
+ return new ExpressionWrapper(ValueNode.createImmediate(col));
29
+ }
30
+ function colRef(table, col) {
31
+ return new ExpressionWrapper(ReferenceNode.create(ColumnNode.create(col), TableNode.create(table)));
32
+ }
@@ -13,6 +13,7 @@ export declare function isBuffer(obj: unknown): obj is {
13
13
  export declare function isFunction(obj: unknown): obj is Function;
14
14
  export declare function isObject(obj: unknown): obj is ShallowRecord<string, unknown>;
15
15
  export declare function isArrayBufferOrView(obj: unknown): obj is ArrayBuffer | ArrayBufferView;
16
+ export declare function isPlainObject(obj: unknown): obj is Record<string, unknown>;
16
17
  export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
17
18
  export declare function freeze<T>(obj: T): Readonly<T>;
18
19
  export declare function asArray<T>(arg: T | T[]): T[];
@@ -43,6 +43,13 @@ export function isObject(obj) {
43
43
  export function isArrayBufferOrView(obj) {
44
44
  return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);
45
45
  }
46
+ export function isPlainObject(obj) {
47
+ return (isObject(obj) &&
48
+ !Array.isArray(obj) &&
49
+ !isDate(obj) &&
50
+ !isBuffer(obj) &&
51
+ !isArrayBufferOrView(obj));
52
+ }
46
53
  export function getLast(arr) {
47
54
  return arr[arr.length - 1];
48
55
  }
@@ -1,4 +1,3 @@
1
- import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
2
1
  import { InsertResult } from '../query-builder/insert-result.js';
3
2
  import { DeleteResult } from '../query-builder/delete-result.js';
4
3
  import { UpdateResult } from '../query-builder/update-result.js';
@@ -34,15 +33,19 @@ import { KyselyTypeError } from './type-error.js';
34
33
  * // Columns == 'id' | 'name' | 'species'
35
34
  * ```
36
35
  */
37
- export type AnyColumn<DB, TB extends keyof DB> = DrainOuterGeneric<{
36
+ export type AnyColumn<DB, TB extends keyof DB> = [
37
+ DB
38
+ ] extends [unknown] ? {
38
39
  [T in TB]: keyof DB[T];
39
- }[TB] & string>;
40
+ }[TB] & string : never;
40
41
  /**
41
42
  * Extracts a column type.
42
43
  */
43
- export type ExtractColumnType<DB, TB extends keyof DB, C> = {
44
+ export type ExtractColumnType<DB, TB extends keyof DB, C> = [
45
+ DB
46
+ ] extends [unknown] ? {
44
47
  [T in TB]: C extends keyof DB[T] ? DB[T][C] : never;
45
- }[TB];
48
+ }[TB] : never;
46
49
  /**
47
50
  * Given a database type and a union of table names in that db, returns
48
51
  * a union type with all possible `table`.`column` combinations.
@@ -74,29 +77,25 @@ export type ExtractColumnType<DB, TB extends keyof DB, C> = {
74
77
  * // Columns == 'person.id' | 'pet.name' | 'pet.species'
75
78
  * ```
76
79
  */
77
- export type AnyColumnWithTable<DB, TB extends keyof DB> = {
80
+ export type AnyColumnWithTable<DB, TB extends keyof DB> = DrainOuterGeneric<{
78
81
  [T in TB]: T extends string ? keyof DB[T] extends string ? `${T}.${keyof DB[T]}` : never : never;
79
- }[TB];
82
+ }[TB]>;
80
83
  /**
81
84
  * Just like {@link AnyColumn} but with a ` as <string>` suffix.
82
85
  */
83
- export type AnyAliasedColumn<DB, TB extends keyof DB> = {
86
+ export type AnyAliasedColumn<DB, TB extends keyof DB> = DrainOuterGeneric<{
84
87
  [T in TB]: T extends string ? keyof DB[T] extends string ? `${keyof DB[T]} as ${string}` : never : never;
85
- }[TB];
88
+ }[TB]>;
86
89
  /**
87
90
  * Just like {@link AnyColumnWithTable} but with a ` as <string>` suffix.
88
91
  */
89
- export type AnyAliasedColumnWithTable<DB, TB extends keyof DB> = {
92
+ export type AnyAliasedColumnWithTable<DB, TB extends keyof DB> = DrainOuterGeneric<{
90
93
  [T in TB]: T extends string ? keyof DB[T] extends string ? `${T}.${keyof DB[T]} as ${string}` : never : never;
91
- }[TB];
94
+ }[TB]>;
92
95
  /**
93
96
  * Extracts the item type of an array.
94
97
  */
95
98
  export type ArrayItemType<T> = T extends ReadonlyArray<infer I> ? I : never;
96
- /**
97
- * Any select query builder.
98
- */
99
- export type AnySelectQueryBuilder = SelectQueryBuilder<any, any, any>;
100
99
  export type SimplifySingleResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : Simplify<O> | undefined;
101
100
  export type SimplifyResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : Simplify<O>;
102
101
  export type Simplify<T> = DrainOuterGeneric<{
@@ -124,9 +123,9 @@ export type IsAny<T> = 0 extends T & 1 ? true : false;
124
123
  * Evaluates to `true` if the types `T` and `U` are equal.
125
124
  */
126
125
  export type Equals<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U ? 1 : 2 ? true : false;
127
- export type NarrowPartial<S, T> = DrainOuterGeneric<{
126
+ export type NarrowPartial<S, T> = DrainOuterGeneric<T extends object ? {
128
127
  [K in keyof S & string]: K extends keyof T ? T[K] extends S[K] ? T[K] : KyselyTypeError<`$narrowType() call failed: passed type does not exist in '${K}'s type union`> : S[K];
129
- }>;
128
+ } : never>;
130
129
  export type SqlBool = boolean | 0 | 1;
131
130
  /**
132
131
  * Utility to reduce depth of TypeScript's internal type instantiation stack.
@@ -0,0 +1 @@
1
+ export * from '../dist/cjs/helpers/sqlite.js'
@@ -0,0 +1 @@
1
+ module.exports = require('../dist/cjs/helpers/sqlite.js')