@zmdb/mssql 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.ts ADDED
@@ -0,0 +1,131 @@
1
+ import { type DatabaseVertical, type TransactionalDriver } from '@zmdb/orm';
2
+ import {
3
+ defineSqlDialect,
4
+ UnsupportedFeatureError,
5
+ type DatabaseCapabilities,
6
+ type PaginationTail,
7
+ type ResolvedDialectTraits,
8
+ type SqlDialect,
9
+ } from '@zmdb/sql';
10
+
11
+ import { mssqlCompiler } from './compiler.js';
12
+ import {
13
+ createMssqlDriver,
14
+ type MssqlOptions,
15
+ type MssqlPool,
16
+ type MssqlRequest,
17
+ type MssqlTransaction,
18
+ } from './driver.js';
19
+ import { mssqlIntrospector } from './introspect.js';
20
+ import { mssqlMigrations } from './migrations.js';
21
+ import { MSSQL_TYPES } from './types.js';
22
+
23
+ export {
24
+ mssqlIntrospector,
25
+ type MssqlCatalogColumnSnapshot,
26
+ type MssqlCatalogForeignKeySnapshot,
27
+ type MssqlCatalogIndexSnapshot,
28
+ type MssqlCatalogSchemaSnapshot,
29
+ type MssqlCatalogSequenceSnapshot,
30
+ type MssqlCatalogTableSnapshot,
31
+ type MssqlComputedColumn,
32
+ type MssqlIdentity,
33
+ type MssqlIntrospector,
34
+ } from './introspect.js';
35
+ export type { MssqlOptions, MssqlPool, MssqlRequest, MssqlTransaction };
36
+ export { MSSQL_TYPES };
37
+
38
+ function paginate({ limit, offset, ordered }: PaginationTail): string {
39
+ if (limit === undefined && offset === undefined) return '';
40
+ if (!ordered) {
41
+ throw new UnsupportedFeatureError(
42
+ 'pagination without ORDER BY',
43
+ 'mssql',
44
+ 'Dialect "mssql" spells LIMIT as OFFSET … FETCH NEXT, which SQL Server allows only after an ORDER BY. ' +
45
+ 'Add .orderBy(...) — an unordered page is not reproducible on any dialect.',
46
+ );
47
+ }
48
+ let sql = ` OFFSET ${String(offset ?? 0)} ROWS`;
49
+ if (limit !== undefined) sql += ` FETCH NEXT ${String(limit)} ROWS ONLY`;
50
+ return sql;
51
+ }
52
+
53
+ const OPERATOR_TOKEN = /^(?!.*--)[A-Za-z@<>=!~*&|?-]{1,4}$/;
54
+
55
+ function acceptsOperator(operator: string): boolean {
56
+ return OPERATOR_TOKEN.test(operator) && !operator.includes('@') && operator !== '#>' && operator !== '#>>';
57
+ }
58
+
59
+ const traits: ResolvedDialectTraits = Object.freeze({
60
+ placeholder: 'named',
61
+ quote: Object.freeze(['[', ']'] as const),
62
+ paginate,
63
+ paginationRequiresOrder: true,
64
+ rowValueIn: false,
65
+ returning: Object.freeze({
66
+ insert: 'output',
67
+ upsert: 'output',
68
+ update: 'output',
69
+ delete: 'output',
70
+ }),
71
+ upsert: 'merge',
72
+ fts: 'none',
73
+ concat: 'function',
74
+ booleanNot: 'bitwise',
75
+ types: MSSQL_TYPES,
76
+ paramLimit: 2000,
77
+ retryableCodes: Object.freeze(['1205']),
78
+ acceptsOperator,
79
+ functions: false,
80
+ procedures: false,
81
+ tableFunctions: false,
82
+ vectorDistance: false,
83
+ spatialPredicates: false,
84
+ });
85
+
86
+ const capabilities: DatabaseCapabilities = Object.freeze({
87
+ returning: Object.freeze({
88
+ insert: true,
89
+ upsert: true,
90
+ update: true,
91
+ delete: true,
92
+ }),
93
+ transactionalDdl: true,
94
+ schemas: true,
95
+ sequences: true,
96
+ generatedColumns: true,
97
+ partialIndexes: true,
98
+ foreignKeys: true,
99
+ rowLevelSecurity: false,
100
+ streaming: false,
101
+ cancellation: false,
102
+ });
103
+
104
+ const outbox = Object.freeze({
105
+ createTable: 'CREATE TABLE',
106
+ pendingIndex: 'filtered' as const,
107
+ epochLiteral: "'1970-01-01T00:00:00.000+00:00'",
108
+ createdAtDefault: 'SYSDATETIMEOFFSET()',
109
+ boundedTextType: (length: number) => `NVARCHAR(${String(length)})`,
110
+ });
111
+
112
+ export const mssql: SqlDialect<'mssql'> = defineSqlDialect({
113
+ name: 'mssql',
114
+ family: 'mssql',
115
+ telemetrySystem: 'mssql',
116
+ traits,
117
+ capabilities,
118
+ migrations: mssqlMigrations,
119
+ introspector: mssqlIntrospector,
120
+ compiler: mssqlCompiler,
121
+ outbox,
122
+ });
123
+
124
+ export function mssqlDriver(pool: MssqlPool, options?: MssqlOptions): TransactionalDriver<'mssql'> {
125
+ return createMssqlDriver(mssql, pool, options);
126
+ }
127
+
128
+ export const mssqlVertical: DatabaseVertical<'mssql', MssqlPool, MssqlOptions> = Object.freeze({
129
+ dialect: mssql,
130
+ driver: mssqlDriver,
131
+ });