kysely 0.26.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/dist/cjs/dialect/dialect-adapter-base.d.ts +8 -0
  2. package/dist/cjs/dialect/dialect-adapter-base.js +3 -0
  3. package/dist/cjs/dialect/dialect-adapter.d.ts +8 -0
  4. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +78 -0
  5. package/dist/cjs/dialect/mssql/mssql-adapter.js +30 -0
  6. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +143 -0
  7. package/dist/cjs/dialect/mssql/mssql-dialect-config.js +2 -0
  8. package/dist/cjs/dialect/mssql/mssql-dialect.d.ts +70 -0
  9. package/dist/cjs/dialect/mssql/mssql-dialect.js +65 -0
  10. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +54 -0
  11. package/dist/cjs/dialect/mssql/mssql-driver.js +268 -0
  12. package/dist/cjs/dialect/mssql/mssql-introspector.d.ts +20 -0
  13. package/dist/cjs/dialect/mssql/mssql-introspector.js +97 -0
  14. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +11 -0
  15. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +64 -0
  16. package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +2 -0
  17. package/dist/cjs/dialect/mysql/mysql-query-compiler.js +28 -0
  18. package/dist/cjs/dialect/postgres/postgres-driver.js +1 -1
  19. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +1 -1
  20. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -1
  21. package/dist/cjs/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
  22. package/dist/cjs/dialect/sqlite/sqlite-driver.js +15 -2
  23. package/dist/cjs/driver/driver.d.ts +1 -1
  24. package/dist/cjs/driver/driver.js +1 -0
  25. package/dist/cjs/driver/runtime-driver.js +5 -1
  26. package/dist/cjs/driver/single-connection-provider.js +7 -8
  27. package/dist/cjs/expression/expression-builder.d.ts +66 -73
  28. package/dist/cjs/expression/expression-builder.js +8 -17
  29. package/dist/cjs/expression/expression-wrapper.d.ts +8 -8
  30. package/dist/cjs/helpers/mssql.d.ts +152 -0
  31. package/dist/cjs/helpers/mssql.js +160 -0
  32. package/dist/cjs/helpers/mysql.d.ts +3 -3
  33. package/dist/cjs/helpers/sqlite.d.ts +3 -3
  34. package/dist/cjs/index.d.ts +8 -2
  35. package/dist/cjs/index.js +6 -0
  36. package/dist/cjs/migration/migrator.js +12 -16
  37. package/dist/cjs/operation-node/add-index-node.d.ts +21 -0
  38. package/dist/cjs/operation-node/add-index-node.js +31 -0
  39. package/dist/cjs/operation-node/alter-table-node.d.ts +5 -1
  40. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  41. package/dist/cjs/operation-node/column-update-node.d.ts +2 -3
  42. package/dist/cjs/operation-node/create-index-node.d.ts +1 -0
  43. package/dist/cjs/operation-node/create-table-node.d.ts +1 -0
  44. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  45. package/dist/cjs/operation-node/operation-node-transformer.js +17 -0
  46. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  47. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  48. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  49. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  50. package/dist/cjs/operation-node/operator-node.js +2 -0
  51. package/dist/cjs/operation-node/unique-constraint-node.d.ts +4 -1
  52. package/dist/cjs/operation-node/unique-constraint-node.js +8 -1
  53. package/dist/cjs/parser/binary-operation-parser.js +1 -1
  54. package/dist/cjs/parser/coalesce-parser.d.ts +12 -2
  55. package/dist/cjs/parser/expression-parser.d.ts +2 -2
  56. package/dist/cjs/parser/reference-parser.d.ts +3 -2
  57. package/dist/cjs/parser/returning-parser.d.ts +2 -1
  58. package/dist/cjs/parser/select-parser.d.ts +20 -9
  59. package/dist/cjs/parser/update-set-parser.d.ts +5 -2
  60. package/dist/cjs/parser/update-set-parser.js +13 -3
  61. package/dist/cjs/parser/value-parser.d.ts +2 -2
  62. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +4 -4
  63. package/dist/cjs/query-builder/case-builder.d.ts +5 -4
  64. package/dist/cjs/query-builder/delete-query-builder.d.ts +8 -6
  65. package/dist/cjs/query-builder/function-module.d.ts +98 -27
  66. package/dist/cjs/query-builder/function-module.js +17 -3
  67. package/dist/cjs/query-builder/having-interface.d.ts +3 -5
  68. package/dist/cjs/query-builder/insert-query-builder.d.ts +32 -12
  69. package/dist/cjs/query-builder/insert-query-builder.js +3 -3
  70. package/dist/cjs/query-builder/insert-result.d.ts +8 -1
  71. package/dist/cjs/query-builder/insert-result.js +8 -1
  72. package/dist/cjs/query-builder/json-path-builder.d.ts +3 -2
  73. package/dist/cjs/query-builder/json-path-builder.js +6 -3
  74. package/dist/cjs/query-builder/on-conflict-builder.d.ts +58 -16
  75. package/dist/cjs/query-builder/on-conflict-builder.js +1 -6
  76. package/dist/cjs/query-builder/over-builder.d.ts +2 -2
  77. package/dist/cjs/query-builder/returning-interface.d.ts +3 -2
  78. package/dist/cjs/query-builder/select-query-builder-expression.d.ts +20 -0
  79. package/dist/cjs/query-builder/select-query-builder-expression.js +2 -0
  80. package/dist/cjs/query-builder/select-query-builder.d.ts +48 -29
  81. package/dist/cjs/query-builder/select-query-builder.js +5 -2
  82. package/dist/cjs/query-builder/update-query-builder.d.ts +25 -7
  83. package/dist/cjs/query-builder/update-query-builder.js +2 -2
  84. package/dist/cjs/query-builder/where-interface.d.ts +3 -3
  85. package/dist/cjs/query-compiler/default-query-compiler.d.ts +9 -1
  86. package/dist/cjs/query-compiler/default-query-compiler.js +65 -12
  87. package/dist/cjs/query-creator.d.ts +5 -3
  88. package/dist/cjs/query-creator.js +0 -47
  89. package/dist/cjs/raw-builder/raw-builder.d.ts +0 -3
  90. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +104 -0
  91. package/dist/cjs/schema/alter-table-add-index-builder.js +146 -0
  92. package/dist/cjs/schema/alter-table-builder.d.ts +41 -1
  93. package/dist/cjs/schema/alter-table-builder.js +59 -2
  94. package/dist/cjs/schema/column-definition-builder.d.ts +25 -0
  95. package/dist/cjs/schema/column-definition-builder.js +27 -0
  96. package/dist/cjs/schema/create-index-builder.d.ts +23 -0
  97. package/dist/cjs/schema/create-index-builder.js +30 -0
  98. package/dist/cjs/schema/create-table-builder.d.ts +28 -2
  99. package/dist/cjs/schema/create-table-builder.js +38 -3
  100. package/dist/cjs/schema/create-view-builder.d.ts +2 -2
  101. package/dist/cjs/schema/unique-constraint-builder.d.ts +14 -0
  102. package/dist/cjs/schema/unique-constraint-builder.js +24 -0
  103. package/dist/cjs/util/infer-result.d.ts +2 -1
  104. package/dist/cjs/util/log.js +5 -1
  105. package/dist/cjs/util/object-utils.d.ts +1 -1
  106. package/dist/cjs/util/type-utils.d.ts +27 -20
  107. package/dist/esm/dialect/dialect-adapter-base.d.ts +8 -0
  108. package/dist/esm/dialect/dialect-adapter-base.js +3 -0
  109. package/dist/esm/dialect/dialect-adapter.d.ts +8 -0
  110. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +78 -0
  111. package/dist/esm/dialect/mssql/mssql-adapter.js +27 -0
  112. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +143 -0
  113. package/dist/esm/dialect/mssql/mssql-dialect-config.js +2 -0
  114. package/dist/esm/dialect/mssql/mssql-dialect.d.ts +70 -0
  115. package/dist/esm/dialect/mssql/mssql-dialect.js +62 -0
  116. package/dist/esm/dialect/mssql/mssql-driver.d.ts +54 -0
  117. package/dist/esm/dialect/mssql/mssql-driver.js +265 -0
  118. package/dist/esm/dialect/mssql/mssql-introspector.d.ts +20 -0
  119. package/dist/esm/dialect/mssql/mssql-introspector.js +94 -0
  120. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +11 -0
  121. package/dist/esm/dialect/mssql/mssql-query-compiler.js +61 -0
  122. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +2 -0
  123. package/dist/esm/dialect/mysql/mysql-query-compiler.js +28 -0
  124. package/dist/esm/dialect/postgres/postgres-driver.js +1 -1
  125. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +1 -1
  126. package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -1
  127. package/dist/esm/dialect/sqlite/sqlite-dialect-config.d.ts +1 -0
  128. package/dist/esm/dialect/sqlite/sqlite-driver.js +15 -2
  129. package/dist/esm/driver/driver.d.ts +1 -1
  130. package/dist/esm/driver/driver.js +1 -0
  131. package/dist/esm/driver/runtime-driver.js +5 -1
  132. package/dist/esm/driver/single-connection-provider.js +7 -8
  133. package/dist/esm/expression/expression-builder.d.ts +66 -73
  134. package/dist/esm/expression/expression-builder.js +10 -19
  135. package/dist/esm/expression/expression-wrapper.d.ts +8 -8
  136. package/dist/esm/helpers/mssql.d.ts +152 -0
  137. package/dist/esm/helpers/mssql.js +155 -0
  138. package/dist/esm/helpers/mysql.d.ts +3 -3
  139. package/dist/esm/helpers/sqlite.d.ts +3 -3
  140. package/dist/esm/index.d.ts +8 -2
  141. package/dist/esm/index.js +6 -0
  142. package/dist/esm/migration/migrator.js +12 -16
  143. package/dist/esm/operation-node/add-index-node.d.ts +21 -0
  144. package/dist/esm/operation-node/add-index-node.js +29 -0
  145. package/dist/esm/operation-node/alter-table-node.d.ts +5 -1
  146. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  147. package/dist/esm/operation-node/column-update-node.d.ts +2 -3
  148. package/dist/esm/operation-node/create-index-node.d.ts +1 -0
  149. package/dist/esm/operation-node/create-table-node.d.ts +1 -0
  150. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  151. package/dist/esm/operation-node/operation-node-transformer.js +17 -0
  152. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  153. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  154. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  155. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  156. package/dist/esm/operation-node/operator-node.js +2 -0
  157. package/dist/esm/operation-node/unique-constraint-node.d.ts +4 -1
  158. package/dist/esm/operation-node/unique-constraint-node.js +8 -1
  159. package/dist/esm/parser/binary-operation-parser.js +1 -1
  160. package/dist/esm/parser/coalesce-parser.d.ts +12 -2
  161. package/dist/esm/parser/expression-parser.d.ts +2 -2
  162. package/dist/esm/parser/reference-parser.d.ts +3 -2
  163. package/dist/esm/parser/returning-parser.d.ts +2 -1
  164. package/dist/esm/parser/select-parser.d.ts +20 -9
  165. package/dist/esm/parser/update-set-parser.d.ts +5 -2
  166. package/dist/esm/parser/update-set-parser.js +10 -1
  167. package/dist/esm/parser/value-parser.d.ts +2 -2
  168. package/dist/esm/query-builder/aggregate-function-builder.d.ts +4 -4
  169. package/dist/esm/query-builder/case-builder.d.ts +5 -4
  170. package/dist/esm/query-builder/delete-query-builder.d.ts +8 -6
  171. package/dist/esm/query-builder/function-module.d.ts +98 -27
  172. package/dist/esm/query-builder/function-module.js +17 -3
  173. package/dist/esm/query-builder/having-interface.d.ts +3 -5
  174. package/dist/esm/query-builder/insert-query-builder.d.ts +32 -12
  175. package/dist/esm/query-builder/insert-query-builder.js +4 -4
  176. package/dist/esm/query-builder/insert-result.d.ts +8 -1
  177. package/dist/esm/query-builder/insert-result.js +8 -1
  178. package/dist/esm/query-builder/json-path-builder.d.ts +3 -2
  179. package/dist/esm/query-builder/json-path-builder.js +6 -3
  180. package/dist/esm/query-builder/on-conflict-builder.d.ts +58 -16
  181. package/dist/esm/query-builder/on-conflict-builder.js +2 -7
  182. package/dist/esm/query-builder/over-builder.d.ts +2 -2
  183. package/dist/esm/query-builder/returning-interface.d.ts +3 -2
  184. package/dist/esm/query-builder/select-query-builder-expression.d.ts +20 -0
  185. package/dist/esm/query-builder/select-query-builder-expression.js +2 -0
  186. package/dist/esm/query-builder/select-query-builder.d.ts +48 -29
  187. package/dist/esm/query-builder/select-query-builder.js +5 -2
  188. package/dist/esm/query-builder/update-query-builder.d.ts +25 -7
  189. package/dist/esm/query-builder/update-query-builder.js +3 -3
  190. package/dist/esm/query-builder/where-interface.d.ts +3 -3
  191. package/dist/esm/query-compiler/default-query-compiler.d.ts +9 -1
  192. package/dist/esm/query-compiler/default-query-compiler.js +65 -12
  193. package/dist/esm/query-creator.d.ts +5 -3
  194. package/dist/esm/query-creator.js +0 -47
  195. package/dist/esm/raw-builder/raw-builder.d.ts +0 -3
  196. package/dist/esm/schema/alter-table-add-index-builder.d.ts +104 -0
  197. package/dist/esm/schema/alter-table-add-index-builder.js +143 -0
  198. package/dist/esm/schema/alter-table-builder.d.ts +41 -1
  199. package/dist/esm/schema/alter-table-builder.js +59 -2
  200. package/dist/esm/schema/column-definition-builder.d.ts +25 -0
  201. package/dist/esm/schema/column-definition-builder.js +27 -0
  202. package/dist/esm/schema/create-index-builder.d.ts +23 -0
  203. package/dist/esm/schema/create-index-builder.js +30 -0
  204. package/dist/esm/schema/create-table-builder.d.ts +28 -2
  205. package/dist/esm/schema/create-table-builder.js +38 -3
  206. package/dist/esm/schema/create-view-builder.d.ts +2 -2
  207. package/dist/esm/schema/unique-constraint-builder.d.ts +14 -0
  208. package/dist/esm/schema/unique-constraint-builder.js +21 -0
  209. package/dist/esm/util/infer-result.d.ts +2 -1
  210. package/dist/esm/util/log.js +5 -1
  211. package/dist/esm/util/object-utils.d.ts +1 -1
  212. package/dist/esm/util/type-utils.d.ts +27 -20
  213. package/helpers/mssql.d.ts +1 -0
  214. package/helpers/mssql.js +1 -0
  215. package/package.json +17 -6
@@ -0,0 +1,143 @@
1
+ export interface MssqlDialectConfig {
2
+ /**
3
+ * This dialect uses the `tarn` package to manage the connection pool to your
4
+ * database. To use it as a peer dependency and not bundle it with Kysely's code,
5
+ * you need to pass the `tarn` package itself. You also need to pass some pool options
6
+ * (excluding `create`, `destroy` and `validate` functions which are controlled by this dialect),
7
+ * `min` & `max` connections at the very least.
8
+ *
9
+ * Example:
10
+ *
11
+ * ```ts
12
+ * import * as Tarn from 'tarn'
13
+ *
14
+ * const dialect = new MssqlDialect({
15
+ * // ...
16
+ * tarn: {
17
+ * ...Tarn,
18
+ * options: {
19
+ * // ...
20
+ * min: 0,
21
+ * max: 10,
22
+ * },
23
+ * },
24
+ * })
25
+ * ```
26
+ */
27
+ tarn: Tarn;
28
+ /**
29
+ * This dialect uses the `tedious` package to communicate with your MS SQL Server
30
+ * database. To use it as a peer dependency and not bundle it with Kysely's code,
31
+ * you need to pass the `tedious` package itself. You also need to pass a factory
32
+ * function that creates new `tedious` `Connection` instances on demand.
33
+ *
34
+ * Example:
35
+ *
36
+ * ```ts
37
+ * import * as Tedious from 'tedious'
38
+ *
39
+ * const dialect = new MssqlDialect({
40
+ * // ...
41
+ * tedious: {
42
+ * ...Tedious,
43
+ * connectionFactory: () => new Tedious.Connection({ ... }),
44
+ * },
45
+ * })
46
+ * ```
47
+ */
48
+ tedious: Tedious;
49
+ }
50
+ export interface Tedious {
51
+ connectionFactory: () => TediousConnection | Promise<TediousConnection>;
52
+ ISOLATION_LEVEL: TediousIsolationLevel;
53
+ Request: typeof TediousRequest;
54
+ TYPES: TediousTypes;
55
+ }
56
+ export type TediousIsolationLevel = Record<'NO_CHANGE' | 'READ_UNCOMMITTED' | 'READ_COMMITTED' | 'REPEATABLE_READ' | 'SERIALIZABLE' | 'SNAPSHOT', number>;
57
+ export type TediousTypes = Record<'BigInt' | 'Binary' | 'Bit' | 'Char' | 'Date' | 'DateTime' | 'DateTime2' | 'DateTimeOffset' | 'Decimal' | 'Float' | 'Image' | 'Int' | 'Money' | 'NChar' | 'NText' | 'Null' | 'Numeric' | 'NVarChar' | 'Real' | 'SmallDateTime' | 'SmallInt' | 'SmallMoney' | 'Text' | 'Time' | 'TinyInt' | 'TVP' | 'UDT' | 'UniqueIdentifier' | 'VarBinary' | 'VarChar' | 'Xml', {
58
+ name: string;
59
+ type: string;
60
+ }>;
61
+ export interface TediousType {
62
+ name: string;
63
+ type: string;
64
+ }
65
+ export interface TediousConnection {
66
+ beginTransaction(callback: (error?: Error) => void, transactionId?: string | undefined, isolationLevel?: number | undefined): void;
67
+ cancel(): void;
68
+ close(): void;
69
+ commitTransaction(callback: (error?: Error) => void): void;
70
+ connect(callback: (error?: Error) => void): void;
71
+ execSql(request: TediousRequest): void;
72
+ reset(callback: (error?: Error) => void): void;
73
+ rollbackTransaction(callback: (error?: Error) => void): void;
74
+ once(event: 'end', listener: () => void): void;
75
+ }
76
+ export declare class TediousRequest {
77
+ constructor(sql: string, callback: (error: Error, rowCount: number, rows: any[]) => void);
78
+ addParameter(name: string, type: TediousType, value: any, options?: {
79
+ length?: number | 'max' | undefined;
80
+ precision?: number | undefined;
81
+ scale?: number | undefined;
82
+ }): void;
83
+ off(event: 'row', listener: (...args: any[]) => void): void;
84
+ on(event: 'row', listener: (columns: TediousColumnValue[]) => void): void;
85
+ once(event: 'requestCompleted', listener: (...args: any[]) => void): void;
86
+ }
87
+ export interface TediousColumnValue {
88
+ metadata: {
89
+ colName: string;
90
+ };
91
+ value: any;
92
+ }
93
+ export interface Tarn {
94
+ /**
95
+ * Tarn.js' pool options, excluding `create`, `destroy` and `validate` functions,
96
+ * which must be implemented by this dialect.
97
+ */
98
+ options: Omit<TarnPoolOptions<any>, 'create' | 'destroy' | 'validate'>;
99
+ /**
100
+ * Tarn.js' Pool class.
101
+ *
102
+ * Example:
103
+ *
104
+ * ```ts
105
+ * import { Pool } from 'tarn'
106
+ *
107
+ * const dialect = new MssqlDialect({
108
+ * // ...
109
+ * tarn: {
110
+ * // ...
111
+ * Pool,
112
+ * },
113
+ * })
114
+ * ```
115
+ */
116
+ Pool: typeof TarnPool;
117
+ }
118
+ export declare class TarnPool<R> {
119
+ constructor(opt: TarnPoolOptions<R>);
120
+ acquire(): TarnPendingRequest<R>;
121
+ destroy(): any;
122
+ release(resource: R): void;
123
+ }
124
+ export interface TarnPoolOptions<R> {
125
+ acquireTimeoutMillis?: number;
126
+ create(cb: (err: Error | null, resource: R) => void): any | (() => Promise<R>);
127
+ createRetryIntervalMillis?: number;
128
+ createTimeoutMillis?: number;
129
+ destroy(resource: R): any;
130
+ destroyTimeoutMillis?: number;
131
+ idleTimeoutMillis?: number;
132
+ log?(msg: string): any;
133
+ max: number;
134
+ min: number;
135
+ propagateCreateError?: boolean;
136
+ reapIntervalMillis?: number;
137
+ validate(resource: R): boolean;
138
+ }
139
+ export interface TarnPendingRequest<R> {
140
+ promise: Promise<R>;
141
+ resolve: (resource: R) => void;
142
+ reject: (err: Error) => void;
143
+ }
@@ -0,0 +1,2 @@
1
+ /// <reference types="./mssql-dialect-config.d.ts" />
2
+ export {};
@@ -0,0 +1,70 @@
1
+ import { Driver } from '../../driver/driver.js';
2
+ import { Kysely } from '../../kysely.js';
3
+ import { QueryCompiler } from '../../query-compiler/query-compiler.js';
4
+ import { DatabaseIntrospector } from '../database-introspector.js';
5
+ import { DialectAdapter } from '../dialect-adapter.js';
6
+ import { Dialect } from '../dialect.js';
7
+ import { MssqlDialectConfig } from './mssql-dialect-config.js';
8
+ /**
9
+ * MS SQL Server dialect that uses the [tedious](https://tediousjs.github.io/tedious)
10
+ * library.
11
+ *
12
+ * The constructor takes an instance of {@link MssqlDialectConfig}.
13
+ *
14
+ * ```ts
15
+ * import * as Tedious from 'tedious'
16
+ * import * as Tarn from 'tarn'
17
+ *
18
+ * const dialect = new MssqlDialect({
19
+ * tarn: {
20
+ * ...Tarn,
21
+ * options: {
22
+ * min: 0,
23
+ * max: 10,
24
+ * },
25
+ * },
26
+ * tedious: {
27
+ * ...Tedious,
28
+ * connectionFactory: () => new Tedious.Connection({
29
+ * authentication: {
30
+ * options: {
31
+ * password: 'password',
32
+ * userName: 'username',
33
+ * },
34
+ * type: 'default',
35
+ * },
36
+ * options: {
37
+ * database: 'some_db',
38
+ * port: 1433,
39
+ * trustServerCertificate: true,
40
+ * },
41
+ * server: 'localhost',
42
+ * }),
43
+ * },
44
+ * })
45
+ * ```
46
+ */
47
+ export declare class MssqlDialect implements Dialect {
48
+ #private;
49
+ constructor(config: MssqlDialectConfig);
50
+ /**
51
+ * Creates a driver for the dialect.
52
+ */
53
+ createDriver(): Driver;
54
+ /**
55
+ * Creates a query compiler for the dialect.
56
+ */
57
+ createQueryCompiler(): QueryCompiler;
58
+ /**
59
+ * Creates an adapter for the dialect.
60
+ */
61
+ createAdapter(): DialectAdapter;
62
+ /**
63
+ * Creates a database introspector that can be used to get database metadata
64
+ * such as the table names and column names of those tables.
65
+ *
66
+ * `db` never has any plugins installed. It's created using
67
+ * {@link Kysely.withoutPlugins}.
68
+ */
69
+ createIntrospector(db: Kysely<any>): DatabaseIntrospector;
70
+ }
@@ -0,0 +1,62 @@
1
+ /// <reference types="./mssql-dialect.d.ts" />
2
+ import { MssqlAdapter } from './mssql-adapter.js';
3
+ import { MssqlDriver } from './mssql-driver.js';
4
+ import { MssqlIntrospector } from './mssql-introspector.js';
5
+ import { MssqlQueryCompiler } from './mssql-query-compiler.js';
6
+ /**
7
+ * MS SQL Server dialect that uses the [tedious](https://tediousjs.github.io/tedious)
8
+ * library.
9
+ *
10
+ * The constructor takes an instance of {@link MssqlDialectConfig}.
11
+ *
12
+ * ```ts
13
+ * import * as Tedious from 'tedious'
14
+ * import * as Tarn from 'tarn'
15
+ *
16
+ * const dialect = new MssqlDialect({
17
+ * tarn: {
18
+ * ...Tarn,
19
+ * options: {
20
+ * min: 0,
21
+ * max: 10,
22
+ * },
23
+ * },
24
+ * tedious: {
25
+ * ...Tedious,
26
+ * connectionFactory: () => new Tedious.Connection({
27
+ * authentication: {
28
+ * options: {
29
+ * password: 'password',
30
+ * userName: 'username',
31
+ * },
32
+ * type: 'default',
33
+ * },
34
+ * options: {
35
+ * database: 'some_db',
36
+ * port: 1433,
37
+ * trustServerCertificate: true,
38
+ * },
39
+ * server: 'localhost',
40
+ * }),
41
+ * },
42
+ * })
43
+ * ```
44
+ */
45
+ export class MssqlDialect {
46
+ #config;
47
+ constructor(config) {
48
+ this.#config = config;
49
+ }
50
+ createDriver() {
51
+ return new MssqlDriver(this.#config);
52
+ }
53
+ createQueryCompiler() {
54
+ return new MssqlQueryCompiler();
55
+ }
56
+ createAdapter() {
57
+ return new MssqlAdapter();
58
+ }
59
+ createIntrospector(db) {
60
+ return new MssqlIntrospector(db);
61
+ }
62
+ }
@@ -0,0 +1,54 @@
1
+ import { DatabaseConnection, QueryResult } from '../../driver/database-connection.js';
2
+ import { Driver, TransactionSettings } from '../../driver/driver.js';
3
+ import { MssqlDialectConfig, Tedious, TediousConnection } from './mssql-dialect-config.js';
4
+ import { CompiledQuery } from '../../query-compiler/compiled-query.js';
5
+ declare const PRIVATE_RELEASE_METHOD: unique symbol;
6
+ declare const PRIVATE_DESTROY_METHOD: unique symbol;
7
+ export declare class MssqlDriver implements Driver {
8
+ #private;
9
+ constructor(config: MssqlDialectConfig);
10
+ /**
11
+ * Initializes the driver.
12
+ *
13
+ * After calling this method the driver should be usable and `acquireConnection` etc.
14
+ * methods should be callable.
15
+ */
16
+ init(): Promise<void>;
17
+ /**
18
+ * Acquires a new connection from the pool.
19
+ */
20
+ acquireConnection(): Promise<DatabaseConnection>;
21
+ /**
22
+ * Begins a transaction.
23
+ */
24
+ beginTransaction(connection: MssqlConnection, settings: TransactionSettings): Promise<void>;
25
+ /**
26
+ * Commits a transaction.
27
+ */
28
+ commitTransaction(connection: MssqlConnection): Promise<void>;
29
+ /**
30
+ * Rolls back a transaction.
31
+ */
32
+ rollbackTransaction(connection: MssqlConnection): Promise<void>;
33
+ /**
34
+ * Releases a connection back to the pool.
35
+ */
36
+ releaseConnection(connection: MssqlConnection): Promise<void>;
37
+ /**
38
+ * Destroys the driver and releases all resources.
39
+ */
40
+ destroy(): Promise<void>;
41
+ }
42
+ declare class MssqlConnection implements DatabaseConnection {
43
+ #private;
44
+ constructor(connection: TediousConnection, tedious: Tedious);
45
+ beginTransaction(settings: TransactionSettings): Promise<void>;
46
+ commitTransaction(): Promise<void>;
47
+ executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>>;
48
+ rollbackTransaction(): Promise<void>;
49
+ streamQuery<O>(compiledQuery: CompiledQuery, chunkSize: number): AsyncIterableIterator<QueryResult<O>>;
50
+ validate(): Promise<boolean>;
51
+ [PRIVATE_RELEASE_METHOD](): Promise<void>;
52
+ [PRIVATE_DESTROY_METHOD](): Promise<void>;
53
+ }
54
+ export {};
@@ -0,0 +1,265 @@
1
+ /// <reference types="./mssql-driver.d.ts" />
2
+ import { freeze, isBigInt, isBoolean, isBuffer, isDate, isNull, isNumber, isString, isUndefined, } from '../../util/object-utils.js';
3
+ import { CompiledQuery } from '../../query-compiler/compiled-query.js';
4
+ import { extendStackTrace } from '../../util/stack-trace-utils.js';
5
+ import { randomString } from '../../util/random-string.js';
6
+ import { Deferred } from '../../util/deferred.js';
7
+ const PRIVATE_RELEASE_METHOD = Symbol();
8
+ const PRIVATE_DESTROY_METHOD = Symbol();
9
+ export class MssqlDriver {
10
+ #config;
11
+ #pool;
12
+ constructor(config) {
13
+ this.#config = freeze({ ...config });
14
+ this.#pool = new this.#config.tarn.Pool({
15
+ ...this.#config.tarn.options,
16
+ create: async () => {
17
+ const connection = await this.#config.tedious.connectionFactory();
18
+ await new Promise((resolve, reject) => connection.connect((error) => {
19
+ if (error)
20
+ reject(error);
21
+ else
22
+ resolve(undefined);
23
+ }));
24
+ return new MssqlConnection(connection, this.#config.tedious);
25
+ },
26
+ destroy: async (connection) => {
27
+ await connection[PRIVATE_DESTROY_METHOD]();
28
+ },
29
+ // @ts-ignore `tarn` accepts a function that returns a promise here, but
30
+ // the types are not aligned and it type errors.
31
+ validate: (connection) => connection.validate(),
32
+ });
33
+ }
34
+ async init() {
35
+ // noop
36
+ }
37
+ async acquireConnection() {
38
+ return await this.#pool.acquire().promise;
39
+ }
40
+ async beginTransaction(connection, settings) {
41
+ await connection.beginTransaction(settings);
42
+ }
43
+ async commitTransaction(connection) {
44
+ await connection.commitTransaction();
45
+ }
46
+ async rollbackTransaction(connection) {
47
+ await connection.rollbackTransaction();
48
+ }
49
+ async releaseConnection(connection) {
50
+ await connection[PRIVATE_RELEASE_METHOD]();
51
+ this.#pool.release(connection);
52
+ }
53
+ async destroy() {
54
+ await this.#pool.destroy();
55
+ }
56
+ }
57
+ class MssqlConnection {
58
+ #connection;
59
+ #tedious;
60
+ constructor(connection, tedious) {
61
+ this.#connection = connection;
62
+ this.#tedious = tedious;
63
+ }
64
+ async beginTransaction(settings) {
65
+ const { isolationLevel } = settings;
66
+ await new Promise((resolve, reject) => this.#connection.beginTransaction((error) => {
67
+ if (error)
68
+ reject(error);
69
+ else
70
+ resolve(undefined);
71
+ }, isolationLevel ? randomString(8) : undefined, isolationLevel
72
+ ? this.#getTediousIsolationLevel(isolationLevel)
73
+ : undefined));
74
+ }
75
+ async commitTransaction() {
76
+ await new Promise((resolve, reject) => this.#connection.commitTransaction((error) => {
77
+ if (error)
78
+ reject(error);
79
+ else
80
+ resolve(undefined);
81
+ }));
82
+ }
83
+ async executeQuery(compiledQuery) {
84
+ try {
85
+ const deferred = new Deferred();
86
+ const request = new MssqlRequest(this.#tedious, compiledQuery, deferred);
87
+ this.#connection.execSql(request.request);
88
+ const { rowCount, rows } = await deferred.promise;
89
+ return {
90
+ numAffectedRows: rowCount !== undefined ? BigInt(rowCount) : undefined,
91
+ rows,
92
+ };
93
+ }
94
+ catch (err) {
95
+ throw extendStackTrace(err, new Error());
96
+ }
97
+ }
98
+ async rollbackTransaction() {
99
+ await new Promise((resolve, reject) => this.#connection.rollbackTransaction((error) => {
100
+ if (error)
101
+ reject(error);
102
+ else
103
+ resolve(undefined);
104
+ }));
105
+ }
106
+ async *streamQuery(compiledQuery, chunkSize) {
107
+ if (!Number.isInteger(chunkSize) || chunkSize <= 0) {
108
+ throw new Error('chunkSize must be a positive integer');
109
+ }
110
+ const request = new MssqlRequest(this.#tedious, compiledQuery);
111
+ this.#connection.execSql(request.request);
112
+ try {
113
+ while (true) {
114
+ const rows = await request.readChunk(chunkSize);
115
+ if (rows.length === 0) {
116
+ break;
117
+ }
118
+ yield { rows };
119
+ if (rows.length < chunkSize) {
120
+ break;
121
+ }
122
+ }
123
+ }
124
+ finally {
125
+ this.#connection.cancel();
126
+ }
127
+ }
128
+ async validate() {
129
+ try {
130
+ const deferred = new Deferred();
131
+ const request = new MssqlRequest(this.#tedious, CompiledQuery.raw('select 1'), deferred);
132
+ this.#connection.execSql(request.request);
133
+ await deferred.promise;
134
+ return true;
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ }
140
+ #getTediousIsolationLevel(isolationLevel) {
141
+ const { ISOLATION_LEVEL } = this.#tedious;
142
+ const mapper = {
143
+ 'read committed': ISOLATION_LEVEL.READ_COMMITTED,
144
+ 'read uncommitted': ISOLATION_LEVEL.READ_UNCOMMITTED,
145
+ 'repeatable read': ISOLATION_LEVEL.REPEATABLE_READ,
146
+ serializable: ISOLATION_LEVEL.SERIALIZABLE,
147
+ snapshot: ISOLATION_LEVEL.SNAPSHOT,
148
+ };
149
+ const tediousIsolationLevel = mapper[isolationLevel];
150
+ if (tediousIsolationLevel === undefined) {
151
+ throw new Error(`Unknown isolation level: ${isolationLevel}`);
152
+ }
153
+ return tediousIsolationLevel;
154
+ }
155
+ [PRIVATE_RELEASE_METHOD]() {
156
+ return new Promise((resolve, reject) => {
157
+ this.#connection.reset((error) => {
158
+ if (error)
159
+ reject(error);
160
+ else
161
+ resolve(undefined);
162
+ });
163
+ });
164
+ }
165
+ [PRIVATE_DESTROY_METHOD]() {
166
+ return new Promise((resolve) => {
167
+ this.#connection.once('end', () => {
168
+ resolve(undefined);
169
+ });
170
+ this.#connection.close();
171
+ });
172
+ }
173
+ }
174
+ class MssqlRequest {
175
+ #request;
176
+ #rows;
177
+ #tedious;
178
+ #completed;
179
+ #error;
180
+ #rowCount;
181
+ constructor(tedious, compiledQuery, onDone) {
182
+ this.#completed = false;
183
+ this.#rows = [];
184
+ this.#tedious = tedious;
185
+ const { parameters, sql } = compiledQuery;
186
+ this.#request = new this.#tedious.Request(sql, (err, rowCount) => {
187
+ if (err) {
188
+ this.#error = err instanceof AggregateError ? err.errors : err;
189
+ onDone?.reject(this.#error);
190
+ }
191
+ else {
192
+ this.#rowCount = rowCount;
193
+ }
194
+ });
195
+ this.#addParametersToRequest(parameters);
196
+ this.#attachListeners(onDone);
197
+ }
198
+ get request() {
199
+ return this.#request;
200
+ }
201
+ readChunk(chunkSize) {
202
+ return new Promise((resolve, reject) => {
203
+ const interval = setInterval(() => {
204
+ if (this.#error) {
205
+ clearInterval(interval);
206
+ reject(this.#error);
207
+ }
208
+ else if (this.#completed || this.#rows.length >= chunkSize) {
209
+ clearInterval(interval);
210
+ resolve(this.#rows.splice(0, chunkSize));
211
+ }
212
+ }, 0);
213
+ });
214
+ }
215
+ #addParametersToRequest(parameters) {
216
+ for (let i = 0; i < parameters.length; i++) {
217
+ const parameter = parameters[i];
218
+ this.#request.addParameter(String(i + 1), this.#getTediousDataType(parameter), parameter);
219
+ }
220
+ }
221
+ #attachListeners(onDone) {
222
+ const rowListener = (columns) => {
223
+ const row = {};
224
+ for (const column of columns) {
225
+ row[column.metadata.colName] = column.value;
226
+ }
227
+ this.#rows.push(row);
228
+ };
229
+ this.#request.on('row', rowListener);
230
+ this.#request.once('requestCompleted', () => {
231
+ this.#completed = true;
232
+ this.#request.off('row', rowListener);
233
+ onDone?.resolve({
234
+ rowCount: this.#rowCount,
235
+ rows: this.#rows,
236
+ });
237
+ });
238
+ }
239
+ #getTediousDataType(value) {
240
+ if (isNull(value) || isUndefined(value) || isString(value)) {
241
+ return this.#tedious.TYPES.NVarChar;
242
+ }
243
+ if (isBigInt(value) || (isNumber(value) && value % 1 === 0)) {
244
+ if (value < -2147483648 || value > 2147483647) {
245
+ return this.#tedious.TYPES.BigInt;
246
+ }
247
+ else {
248
+ return this.#tedious.TYPES.Int;
249
+ }
250
+ }
251
+ if (isNumber(value)) {
252
+ return this.#tedious.TYPES.Float;
253
+ }
254
+ if (isBoolean(value)) {
255
+ return this.#tedious.TYPES.Bit;
256
+ }
257
+ if (isDate(value)) {
258
+ return this.#tedious.TYPES.DateTime;
259
+ }
260
+ if (isBuffer(value)) {
261
+ return this.#tedious.TYPES.VarBinary;
262
+ }
263
+ return this.#tedious.TYPES.NVarChar;
264
+ }
265
+ }
@@ -0,0 +1,20 @@
1
+ import { Kysely } from '../../kysely.js';
2
+ import { DatabaseIntrospector, DatabaseMetadata, DatabaseMetadataOptions, SchemaMetadata, TableMetadata } from '../database-introspector.js';
3
+ export declare class MssqlIntrospector implements DatabaseIntrospector {
4
+ #private;
5
+ constructor(db: Kysely<any>);
6
+ /**
7
+ * Get schema metadata.
8
+ */
9
+ getSchemas(): Promise<SchemaMetadata[]>;
10
+ /**
11
+ * Get tables and views metadata.
12
+ */
13
+ getTables(options?: DatabaseMetadataOptions): Promise<TableMetadata[]>;
14
+ /**
15
+ * Get the database metadata such as table and column names.
16
+ *
17
+ * @deprecated Use getTables() instead.
18
+ */
19
+ getMetadata(options?: DatabaseMetadataOptions): Promise<DatabaseMetadata>;
20
+ }