@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/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # @zmdb/mssql
2
+
3
+ The SQL Server vertical owns the immutable `mssql` dialect, its migration hooks and catalog introspector, and the `mssqlDriver` adapter. The shared query compiler comes from `@zmdb/sql`; repository
4
+ and driver contracts come from `@zmdb/orm`. `mssqlVertical` pairs this dialect with its driver factory.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ yarn add @zmdb/mssql@1.0.0-beta.1 @zmdb/sql@1.0.0-beta.1 @zmdb/migrations@1.0.0-beta.1 mssql@^12.7.0
10
+ ```
11
+
12
+ For the TypeScript snippets, install the declaration inputs used by the packed consumer:
13
+
14
+ ```bash
15
+ yarn add --dev typescript@7.0.2 @types/node@26.4.1 @types/mssql@12.3.0
16
+ ```
17
+
18
+ Use Node.js 26+ and ESM. Keep the required `@zmdb/sql` and `@zmdb/orm` peers aligned with this package's version; npm resolves those peers. An application already using `zmdb` adds its selected
19
+ database package and client rather than replacing the product facade.
20
+
21
+ `mssql` is an optional peer in package metadata; install it explicitly for this recipe. Importing the vertical does not import the SDK or open a connection. Pass an already-connected pool to
22
+ `mssqlDriver`.
23
+
24
+ ## Configure
25
+
26
+ The snippets below are successive steps in one module.
27
+
28
+ ```ts
29
+ import sql from 'mssql';
30
+ import { mssql, mssqlDriver } from '@zmdb/mssql';
31
+
32
+ const address = process.env.DATABASE_URL;
33
+ if (address === undefined) throw new Error('DATABASE_URL is required');
34
+ const client = await new sql.ConnectionPool(address).connect();
35
+ const driver = mssqlDriver(client);
36
+ ```
37
+
38
+ The application owns the client and closes it with `await client.close()` in a `finally` block after its work. Hosted services that accept this client's protocol are connection recipes, not additional
39
+ official database packages or automatically qualified server variants.
40
+
41
+ ## Compile
42
+
43
+ ```ts
44
+ import { createQueryCompiler } from '@zmdb/sql';
45
+
46
+ const compiler = createQueryCompiler(mssql);
47
+ const query = compiler.selectFrom('users').where('id', '=', 7).compile();
48
+ ```
49
+
50
+ Compilation is pure: the result carries SQL text and a separate parameter array. It does not create the `users` table or open a connection.
51
+
52
+ ## Migrate
53
+
54
+ Use `mssql.migrations.emitUp(operation)` to obtain this database's DDL and `mssql.migrations.connection(driver)` to create its migration connection. Pass reviewed migration records to `up` and `down`
55
+ from `@zmdb/migrations`; transactional behavior follows the capability table below. The [complete installed workflow](../../fixtures/consumer-database-publication/runtime.mjs) creates a fresh table,
56
+ applies and rolls back its migration, and closes the supplied client.
57
+
58
+ ## Introspect
59
+
60
+ ```ts
61
+ const snapshot = await mssql.introspector.snapshot(driver);
62
+ ```
63
+
64
+ The snapshot comes from the selected database's real catalog through the same driver. `mssqlIntrospector` is also exported directly. Introspection and generated DDL use this vertical's semantics.
65
+
66
+ ## Execute
67
+
68
+ ```ts
69
+ const rows = await driver.execute(query);
70
+ ```
71
+
72
+ Run this after migrating or otherwise creating the table. Use `driver.transaction(async transaction => ...)` for a pinned transactional driver; the application decides whether to retry. Query values
73
+ travel as parameters, not SQL string interpolation.
74
+
75
+ ## Capabilities
76
+
77
+ These entries describe `mssql.capabilities`; a true entry can still require the client support described below.
78
+
79
+ | Capability | Advertised support |
80
+ | ------------------------------------- | --------------------- |
81
+ | INSERT/upsert/UPDATE/DELETE returning | yes, via OUTPUT |
82
+ | Transactional DDL | yes |
83
+ | Schemas | yes |
84
+ | Sequences | yes |
85
+ | Generated columns | yes |
86
+ | Partial indexes | yes, filtered indexes |
87
+ | Foreign keys | yes |
88
+ | Row-level security | no |
89
+ | Streaming | no |
90
+ | Server-side cancellation | no |
91
+
92
+ ## Refusals and ownership
93
+
94
+ Pagination requires `ORDER BY`; unordered `OFFSET`/`FETCH` fails before dispatch. Row-level-security declarations, streaming and server-side cancellation are not advertised. SQL Server-specific
95
+ identity, computed-column and filtered-index handling belongs to this vertical, rather than a generic SQL spelling.
96
+
97
+ SQL Server owns its T-SQL compiler overrides, migration hooks, introspector and structural node-mssql adapter. It is an independent vertical, with no PostgreSQL or MySQL parent.
98
+
99
+ ## Testing evidence
100
+
101
+ The [database publication qualification](../../fixtures/consumer-database-publication) builds real npm archives and installs this selected package in an independent consumer. Its public workflow
102
+ covers strict declarations, package/client ownership, parameterized CRUD, transaction rollback, migration application/rollback and catalog introspection. The
103
+ [SQL Server consumer](../../fixtures/database-mssql) adds the database-specific capability and refusal checks.
104
+
105
+ Issue [#676](https://github.com/ambasta/zmdb/issues/676) records the completed installed workflows. Those observations are scoped to their recorded clients and servers; they do not certify every
106
+ compatible hosted service. Qualification reports identify their source, archive and server inputs. See the [SQL Server guide](../../docs-site/content/dialect-mssql.md) for the detailed contract.
107
+
108
+ ## License
109
+
110
+ GNU General Public License v3.0 or later (GPL-3.0-or-later) — see [LICENSE](./LICENSE).
@@ -0,0 +1,3 @@
1
+ import { type DialectCompiler } from '@zmdb/sql';
2
+ export declare const mssqlCompiler: DialectCompiler;
3
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EAIrB,MAAM,WAAW,CAAC;AAgGnB,eAAO,MAAM,aAAa,EAAE,eAG1B,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { quoteColumn, quoteIdentifier, quoteTable, UnsupportedFeatureError, } from '@zmdb/sql';
2
+ function outputColumn(context, pseudoTable, column) {
3
+ if (typeof column === 'string') {
4
+ return column === '*' ? `${pseudoTable}.*` : `${pseudoTable}.${quoteColumn(context.dialect, column)}`;
5
+ }
6
+ return (`${pseudoTable}.${quoteColumn(context.dialect, column.column)} AS ` + quoteIdentifier(context.dialect, column.alias));
7
+ }
8
+ function returning(context) {
9
+ const pseudoTable = context.row === 'old' ? 'DELETED' : 'INSERTED';
10
+ // SQL Server rejects OUTPUT without INTO when the target has an enabled
11
+ // trigger for the statement's DML action. OUTPUT INTO would require a table
12
+ // variable plus a second statement, outside the one-statement compiler contract.
13
+ return Object.freeze({
14
+ inline: ` OUTPUT ${context.columns.map(column => outputColumn(context, pseudoTable, column)).join(', ')}`,
15
+ suffix: '',
16
+ });
17
+ }
18
+ function upsert(context) {
19
+ const target = context.conflict.target;
20
+ if (target === undefined || target.length === 0) {
21
+ throw new UnsupportedFeatureError('upsert without a conflict target', context.dialect.name, 'MERGE needs an explicit join predicate; pass the conflicting column(s) to onConflict(...).');
22
+ }
23
+ const keySet = new Set(context.columns);
24
+ for (const column of target) {
25
+ if (!keySet.has(column)) {
26
+ throw new TypeError(`MERGE conflict target ${JSON.stringify(column)} is not present in values()`);
27
+ }
28
+ }
29
+ const quoted = (column) => quoteIdentifier(context.dialect, column);
30
+ const source = (column) => `src.${quoted(column)}`;
31
+ const current = (column) => `tgt.${quoted(column)}`;
32
+ const sourceColumns = context.columns.map(quoted).join(', ');
33
+ const predicate = target.map(column => `${current(column)} = ${source(column)}`).join(' AND ');
34
+ let matched = '';
35
+ if (context.conflict.action === 'update') {
36
+ let setSql;
37
+ if (Array.isArray(context.conflict.updateFields)) {
38
+ for (const column of context.conflict.updateFields) {
39
+ if (!keySet.has(column)) {
40
+ throw new TypeError(`MERGE update field ${JSON.stringify(column)} is not present in values()`);
41
+ }
42
+ }
43
+ setSql = context.conflict.updateFields.map(column => `${quoted(column)} = ${source(column)}`).join(', ');
44
+ }
45
+ else if (context.conflict.updateFields !== undefined) {
46
+ const entries = Object.entries(context.conflict.updateFields);
47
+ if (entries.length === 0)
48
+ throw new TypeError('MERGE doUpdate() requires at least one update field');
49
+ setSql = entries
50
+ .map(([column, value]) => {
51
+ if (context.isProposedValue(value) && !keySet.has(column)) {
52
+ throw new TypeError(`MERGE proposed field ${JSON.stringify(column)} is not present in values()`);
53
+ }
54
+ return (`${quoted(column)} = ` +
55
+ context.renderUpdateValue(column, value, {
56
+ current: current(column),
57
+ proposed: source(column),
58
+ }));
59
+ })
60
+ .join(', ');
61
+ }
62
+ else {
63
+ const targetSet = new Set(target);
64
+ const nonTarget = context.columns.filter(column => !targetSet.has(column));
65
+ const updateColumns = nonTarget.length > 0 ? nonTarget : context.columns;
66
+ setSql = updateColumns.map(column => `${quoted(column)} = ${source(column)}`).join(', ');
67
+ }
68
+ matched = ` WHEN MATCHED THEN UPDATE SET ${setSql}`;
69
+ }
70
+ // HOLDLOCK supplies the serializable range lock that prevents concurrent
71
+ // upserts from both observing an absent key and racing into INSERT.
72
+ return (`MERGE ${quoteTable(context.dialect, context.table)} WITH (HOLDLOCK) AS tgt ` +
73
+ `USING (VALUES (${context.placeholders.join(', ')})) AS src (${sourceColumns}) ON ${predicate}` +
74
+ matched +
75
+ ` WHEN NOT MATCHED THEN INSERT (${sourceColumns}) VALUES (${context.columns.map(source).join(', ')})` +
76
+ `${context.returning.inline};`);
77
+ }
78
+ export const mssqlCompiler = Object.freeze({
79
+ returning,
80
+ upsert,
81
+ });
82
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type TransactionalDriver } from '@zmdb/orm';
2
+ import { type CompiledQuery, type SqlDialect } from '@zmdb/sql';
3
+ /** The node-mssql Request surface used by the adapter. */
4
+ export interface MssqlRequest {
5
+ input(name: string, value: unknown): MssqlRequest;
6
+ query(text: string): Promise<{
7
+ readonly recordset?: readonly Record<string, unknown>[];
8
+ }>;
9
+ }
10
+ /** The node-mssql Transaction surface used by the adapter. */
11
+ export interface MssqlTransaction {
12
+ begin(): Promise<unknown>;
13
+ commit(): Promise<unknown>;
14
+ rollback(): Promise<unknown>;
15
+ request(): MssqlRequest;
16
+ }
17
+ /** A connected node-mssql ConnectionPool, expressed structurally. */
18
+ export interface MssqlPool {
19
+ request(): MssqlRequest;
20
+ transaction(): MssqlTransaction;
21
+ }
22
+ /** Per-request customization without importing the node-mssql runtime. */
23
+ export interface MssqlOptions {
24
+ readonly queryTelemetry?: true;
25
+ readonly configureRequest?: (request: MssqlRequest, query: CompiledQuery) => void;
26
+ }
27
+ export declare function createMssqlDriver(dialect: SqlDialect<'mssql'>, pool: MssqlPool, options?: MssqlOptions): TransactionalDriver<'mssql'>;
28
+ //# sourceMappingURL=driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAEhE,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC;IAClD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;CACJ;AAED,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,YAAY,CAAC;CACzB;AAED,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,YAAY,CAAC;IACxB,WAAW,IAAI,gBAAgB,CAAC;CACjC;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CACnF;AA+BD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAC5B,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,YAAiB,GACzB,mBAAmB,CAAC,OAAO,CAAC,CAsB9B"}
package/dist/driver.js ADDED
@@ -0,0 +1,47 @@
1
+ import {} from '@zmdb/orm';
2
+ import {} from '@zmdb/sql';
3
+ function bindValue(value) {
4
+ return value instanceof Date ? value.toISOString() : value;
5
+ }
6
+ function requestDriver(dialect, source, options) {
7
+ return {
8
+ dialect,
9
+ ...(options.queryTelemetry === true ? { queryTelemetry: true } : {}),
10
+ async execute(query, executeOptions) {
11
+ executeOptions?.signal?.throwIfAborted();
12
+ const request = source.request();
13
+ options.configureRequest?.(request, query);
14
+ query.parameters.forEach((value, index) => {
15
+ request.input(`p${String(index + 1)}`, bindValue(value));
16
+ });
17
+ const result = await request.query(query.text);
18
+ return result.recordset ?? [];
19
+ },
20
+ };
21
+ }
22
+ export function createMssqlDriver(dialect, pool, options = {}) {
23
+ const driver = requestDriver(dialect, pool, options);
24
+ return {
25
+ ...driver,
26
+ dialect,
27
+ async transaction(run) {
28
+ const transaction = pool.transaction();
29
+ await transaction.begin();
30
+ try {
31
+ const result = await run(requestDriver(dialect, transaction, options));
32
+ await transaction.commit();
33
+ return result;
34
+ }
35
+ catch (error) {
36
+ try {
37
+ await transaction.rollback();
38
+ }
39
+ catch {
40
+ // Preserve the query or callback error: rollback failure is secondary.
41
+ }
42
+ throw error;
43
+ }
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAuC,MAAM,WAAW,CAAC;AAkChE,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CACpB,OAA4B,EAC5B,MAA0B,EAC1B,OAAqB;IAErB,OAAO;QACL,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc;YACjC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACxC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAA4B,EAC5B,IAAe,EACf,OAAO,GAAiB,EAAE;IAE1B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO;QACL,GAAG,MAAM;QACT,OAAO;QACP,KAAK,CAAC,WAAW,CAAS,GAAyD;YACjF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvE,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC3B,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,uEAAuE;gBACzE,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type DatabaseVertical, type TransactionalDriver } from '@zmdb/orm';
2
+ import { type SqlDialect } from '@zmdb/sql';
3
+ import { type MssqlOptions, type MssqlPool, type MssqlRequest, type MssqlTransaction } from './driver.js';
4
+ import { MSSQL_TYPES } from './types.js';
5
+ export { mssqlIntrospector, type MssqlCatalogColumnSnapshot, type MssqlCatalogForeignKeySnapshot, type MssqlCatalogIndexSnapshot, type MssqlCatalogSchemaSnapshot, type MssqlCatalogSequenceSnapshot, type MssqlCatalogTableSnapshot, type MssqlComputedColumn, type MssqlIdentity, type MssqlIntrospector, } from './introspect.js';
6
+ export type { MssqlOptions, MssqlPool, MssqlRequest, MssqlTransaction };
7
+ export { MSSQL_TYPES };
8
+ export declare const mssql: SqlDialect<'mssql'>;
9
+ export declare function mssqlDriver(pool: MssqlPool, options?: MssqlOptions): TransactionalDriver<'mssql'>;
10
+ export declare const mssqlVertical: DatabaseVertical<'mssql', MssqlPool, MssqlOptions>;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EACL,iBAAiB,EACjB,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,CAAC;AA4EvB,eAAO,MAAM,KAAK,EAAE,UAAU,CAAC,OAAO,CAUpC,CAAC;AAEH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAEjG;AAED,eAAO,MAAM,aAAa,EAAE,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAG3E,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,94 @@
1
+ import {} from '@zmdb/orm';
2
+ import { defineSqlDialect, UnsupportedFeatureError, } from '@zmdb/sql';
3
+ import { mssqlCompiler } from './compiler.js';
4
+ import { createMssqlDriver, } from './driver.js';
5
+ import { mssqlIntrospector } from './introspect.js';
6
+ import { mssqlMigrations } from './migrations.js';
7
+ import { MSSQL_TYPES } from './types.js';
8
+ export { mssqlIntrospector, } from './introspect.js';
9
+ export { MSSQL_TYPES };
10
+ function paginate({ limit, offset, ordered }) {
11
+ if (limit === undefined && offset === undefined)
12
+ return '';
13
+ if (!ordered) {
14
+ throw new UnsupportedFeatureError('pagination without ORDER BY', 'mssql', 'Dialect "mssql" spells LIMIT as OFFSET … FETCH NEXT, which SQL Server allows only after an ORDER BY. ' +
15
+ 'Add .orderBy(...) — an unordered page is not reproducible on any dialect.');
16
+ }
17
+ let sql = ` OFFSET ${String(offset ?? 0)} ROWS`;
18
+ if (limit !== undefined)
19
+ sql += ` FETCH NEXT ${String(limit)} ROWS ONLY`;
20
+ return sql;
21
+ }
22
+ const OPERATOR_TOKEN = /^(?!.*--)[A-Za-z@<>=!~*&|?-]{1,4}$/;
23
+ function acceptsOperator(operator) {
24
+ return OPERATOR_TOKEN.test(operator) && !operator.includes('@') && operator !== '#>' && operator !== '#>>';
25
+ }
26
+ const traits = Object.freeze({
27
+ placeholder: 'named',
28
+ quote: Object.freeze(['[', ']']),
29
+ paginate,
30
+ paginationRequiresOrder: true,
31
+ rowValueIn: false,
32
+ returning: Object.freeze({
33
+ insert: 'output',
34
+ upsert: 'output',
35
+ update: 'output',
36
+ delete: 'output',
37
+ }),
38
+ upsert: 'merge',
39
+ fts: 'none',
40
+ concat: 'function',
41
+ booleanNot: 'bitwise',
42
+ types: MSSQL_TYPES,
43
+ paramLimit: 2000,
44
+ retryableCodes: Object.freeze(['1205']),
45
+ acceptsOperator,
46
+ functions: false,
47
+ procedures: false,
48
+ tableFunctions: false,
49
+ vectorDistance: false,
50
+ spatialPredicates: false,
51
+ });
52
+ const capabilities = Object.freeze({
53
+ returning: Object.freeze({
54
+ insert: true,
55
+ upsert: true,
56
+ update: true,
57
+ delete: true,
58
+ }),
59
+ transactionalDdl: true,
60
+ schemas: true,
61
+ sequences: true,
62
+ generatedColumns: true,
63
+ partialIndexes: true,
64
+ foreignKeys: true,
65
+ rowLevelSecurity: false,
66
+ streaming: false,
67
+ cancellation: false,
68
+ });
69
+ const outbox = Object.freeze({
70
+ createTable: 'CREATE TABLE',
71
+ pendingIndex: 'filtered',
72
+ epochLiteral: "'1970-01-01T00:00:00.000+00:00'",
73
+ createdAtDefault: 'SYSDATETIMEOFFSET()',
74
+ boundedTextType: (length) => `NVARCHAR(${String(length)})`,
75
+ });
76
+ export const mssql = defineSqlDialect({
77
+ name: 'mssql',
78
+ family: 'mssql',
79
+ telemetrySystem: 'mssql',
80
+ traits,
81
+ capabilities,
82
+ migrations: mssqlMigrations,
83
+ introspector: mssqlIntrospector,
84
+ compiler: mssqlCompiler,
85
+ outbox,
86
+ });
87
+ export function mssqlDriver(pool, options) {
88
+ return createMssqlDriver(mssql, pool, options);
89
+ }
90
+ export const mssqlVertical = Object.freeze({
91
+ dialect: mssql,
92
+ driver: mssqlDriver,
93
+ });
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type CatalogColumnSnapshot, type CatalogForeignKeySnapshot, type CatalogIndexSnapshot, type CatalogSchemaSnapshot, type CatalogTableSnapshot } from '@zmdb/migrations/introspect/runtime';
2
+ import { type IntrospectionDriver, type Introspector, type IntrospectOptions } from '@zmdb/sql';
3
+ export interface MssqlIdentity {
4
+ readonly seed: string;
5
+ readonly increment: string;
6
+ }
7
+ export interface MssqlComputedColumn {
8
+ readonly expression: string;
9
+ readonly persisted: boolean;
10
+ }
11
+ export interface MssqlCatalogColumnSnapshot extends CatalogColumnSnapshot {
12
+ readonly identity?: MssqlIdentity;
13
+ readonly computed?: MssqlComputedColumn;
14
+ }
15
+ export interface MssqlCatalogForeignKeySnapshot extends CatalogForeignKeySnapshot {
16
+ readonly disabled: boolean;
17
+ readonly trusted: boolean;
18
+ }
19
+ export interface MssqlCatalogIndexSnapshot extends CatalogIndexSnapshot {
20
+ readonly clustered: boolean;
21
+ readonly includedColumns: readonly string[];
22
+ readonly disabled: boolean;
23
+ }
24
+ export interface MssqlCatalogTableSnapshot extends Omit<CatalogTableSnapshot, 'columns' | 'foreignKeys' | 'indexes'> {
25
+ readonly columns: readonly MssqlCatalogColumnSnapshot[];
26
+ readonly foreignKeys: readonly MssqlCatalogForeignKeySnapshot[];
27
+ readonly indexes: readonly MssqlCatalogIndexSnapshot[];
28
+ }
29
+ export interface MssqlCatalogSequenceSnapshot {
30
+ readonly name: string;
31
+ readonly schema?: string;
32
+ readonly catalogType: string;
33
+ readonly start: string;
34
+ readonly increment: string;
35
+ }
36
+ export interface MssqlCatalogSchemaSnapshot extends Omit<CatalogSchemaSnapshot, 'tables'> {
37
+ readonly tables: readonly MssqlCatalogTableSnapshot[];
38
+ readonly sequences: readonly MssqlCatalogSequenceSnapshot[];
39
+ }
40
+ export interface MssqlIntrospector extends Introspector<'mssql'> {
41
+ readonly dialect: 'mssql';
42
+ snapshot(driver: IntrospectionDriver, options?: IntrospectOptions): Promise<MssqlCatalogSchemaSnapshot>;
43
+ }
44
+ export declare const mssqlIntrospector: MssqlIntrospector;
45
+ //# sourceMappingURL=introspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../src/introspect.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAE9B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAG1B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAsB,KAAK,mBAAmB,EAAE,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEpH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CACzC;AAED,MAAM,WAAW,8BAA+B,SAAQ,yBAAyB;IAC/E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;IAClH,QAAQ,CAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAC;CACxD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA2B,SAAQ,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC;IACvF,QAAQ,CAAC,MAAM,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACtD,QAAQ,CAAC,SAAS,EAAE,SAAS,4BAA4B,EAAE,CAAC;CAC7D;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY,CAAC,OAAO,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;CACzG;AAitBD,eAAO,MAAM,iBAAiB,EAAE,iBAK9B,CAAC"}