@freshguard/freshguard-core 0.13.2 → 0.14.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.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![npm version](https://img.shields.io/npm/v/@freshguard/freshguard-core.svg)](https://www.npmjs.com/package/@freshguard/freshguard-core)
7
7
  [![Docs](https://img.shields.io/badge/docs-website-blue)](https://freshguard-dev.github.io/freshguard-core)
8
8
 
9
- Monitor when your data pipelines go stale. Supports PostgreSQL, DuckDB, BigQuery, Snowflake, MySQL, and Redshift. Self-hosted. Free forever.
9
+ Monitor when your data pipelines go stale. Supports PostgreSQL, DuckDB, BigQuery, Snowflake, MySQL, Redshift, SQL Server, Azure SQL, and Azure Synapse. Self-hosted. Free forever.
10
10
 
11
11
  ## Install
12
12
 
@@ -75,6 +75,9 @@ if (result.status === 'alert') {
75
75
  | Snowflake | `SnowflakeConnector` | 0.2.0 |
76
76
  | MySQL | `MySQLConnector` | 0.11.0 |
77
77
  | Redshift | `RedshiftConnector` | 0.11.0 |
78
+ | SQL Server | `MSSQLConnector` | 0.14.0 |
79
+ | Azure SQL Database | `AzureSQLConnector` | 0.14.0 |
80
+ | Azure Synapse Analytics | `SynapseConnector` | 0.14.0 |
78
81
 
79
82
  ## CLI
80
83
 
@@ -0,0 +1,33 @@
1
+ import { BaseConnector } from './base-connector.js';
2
+ import type { ConnectorConfig, TableSchema, SecurityConfig } from '../types/connector.js';
3
+ import { type QueryResultRow } from '../types/driver-results.js';
4
+ import type { SourceCredentials } from '../types.js';
5
+ export declare class AzureSQLConnector extends BaseConnector {
6
+ private pool;
7
+ private connected;
8
+ constructor(config: ConnectorConfig, securityConfig?: Partial<SecurityConfig>);
9
+ private connect;
10
+ protected executeQuery(sql: string): Promise<QueryResultRow[]>;
11
+ protected executeParameterizedQuery(sql: string, parameters?: unknown[]): Promise<QueryResultRow[]>;
12
+ testConnection(debugConfig?: import('../types.js').DebugConfig): Promise<boolean>;
13
+ private mergeDebugConfig;
14
+ private generateConnectionSuggestion;
15
+ listTables(): Promise<string[]>;
16
+ getTableSchema(table: string): Promise<TableSchema>;
17
+ getLastModified(table: string): Promise<Date | null>;
18
+ close(): Promise<void>;
19
+ private mapMSSQLType;
20
+ protected escapeIdentifier(identifier: string): string;
21
+ connectLegacy(credentials: SourceCredentials): Promise<void>;
22
+ testConnectionLegacy(): Promise<{
23
+ success: boolean;
24
+ tableCount?: number;
25
+ error?: string;
26
+ }>;
27
+ getTableMetadata(tableName: string, timestampColumn?: string): Promise<{
28
+ rowCount: number;
29
+ lastUpdate?: Date;
30
+ }>;
31
+ query<T = unknown>(_sql: string): Promise<T[]>;
32
+ }
33
+ //# sourceMappingURL=azure-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-sql.d.ts","sourceRoot":"","sources":["../../src/connectors/azure-sql.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAa,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoBrD,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;YAS/D,OAAO;cA4CL,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;cAOpD,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuDvG,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAmEvF,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,4BAA4B;IAyC9B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA8B/B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkDnD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAyCpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,OAAO,CAAC,YAAY;IAsDpB,SAAS,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAuBhD,aAAa,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB5D,oBAAoB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B1F,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,eAAe,SAAe,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IA0B7C,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAKrD"}
@@ -0,0 +1,371 @@
1
+ import * as mssql from 'mssql';
2
+ import { BaseConnector } from './base-connector.js';
3
+ import { rowString } from '../types/driver-results.js';
4
+ import { ConnectionError, TimeoutError, QueryError, ErrorHandler } from '../errors/index.js';
5
+ import { validateConnectorConfig } from '../validators/index.js';
6
+ export class AzureSQLConnector extends BaseConnector {
7
+ pool = null;
8
+ connected = false;
9
+ constructor(config, securityConfig) {
10
+ validateConnectorConfig(config);
11
+ super(config, securityConfig);
12
+ }
13
+ async connect() {
14
+ if (this.connected && this.pool) {
15
+ return;
16
+ }
17
+ try {
18
+ const poolConfig = {
19
+ server: this.config.host,
20
+ port: this.config.port ?? 1433,
21
+ database: this.config.database,
22
+ user: this.config.username,
23
+ password: this.config.password,
24
+ options: {
25
+ encrypt: true,
26
+ trustServerCertificate: false,
27
+ connectTimeout: this.connectionTimeout,
28
+ requestTimeout: this.queryTimeout,
29
+ appName: this.config.applicationName ?? 'freshguard-core'
30
+ },
31
+ pool: {
32
+ max: 1,
33
+ min: 0,
34
+ idleTimeoutMillis: 30000
35
+ }
36
+ };
37
+ this.pool = new mssql.ConnectionPool(poolConfig);
38
+ await this.pool.connect();
39
+ this.connected = true;
40
+ }
41
+ catch (error) {
42
+ throw new ConnectionError('Failed to connect to Azure SQL Database', this.config.host, this.config.port, error instanceof Error ? error : undefined);
43
+ }
44
+ }
45
+ async executeQuery(sql) {
46
+ return this.executeParameterizedQuery(sql, []);
47
+ }
48
+ async executeParameterizedQuery(sql, parameters = []) {
49
+ await this.connect();
50
+ if (!this.pool) {
51
+ throw new ConnectionError('Database connection not available');
52
+ }
53
+ try {
54
+ const result = await this.executeWithTimeout(async () => {
55
+ if (!this.pool)
56
+ throw new ConnectionError('Database connection not available');
57
+ const request = this.pool.request();
58
+ for (let i = 0; i < parameters.length; i++) {
59
+ request.input(`p${i + 1}`, parameters[i]);
60
+ }
61
+ let mssqlSql = sql;
62
+ for (let i = parameters.length; i >= 1; i--) {
63
+ mssqlSql = mssqlSql.replace(new RegExp(`\\$${i}`, 'g'), `@p${i}`);
64
+ }
65
+ let paramIndex = 0;
66
+ mssqlSql = mssqlSql.replace(/\?/g, () => `@p${++paramIndex}`);
67
+ const res = await request.query(mssqlSql);
68
+ return (res.recordset ?? []);
69
+ }, this.queryTimeout);
70
+ this.validateResultSize(result);
71
+ return result;
72
+ }
73
+ catch (error) {
74
+ if (error instanceof TimeoutError) {
75
+ throw error;
76
+ }
77
+ throw new QueryError(ErrorHandler.getUserMessage(error), 'query_execution', undefined, error instanceof Error ? error : undefined);
78
+ }
79
+ }
80
+ async testConnection(debugConfig) {
81
+ const mergedDebugConfig = this.mergeDebugConfig(debugConfig);
82
+ const debugId = `azuresql-test-${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 5)}`;
83
+ const startTime = performance.now();
84
+ try {
85
+ this.logDebugInfo(mergedDebugConfig, debugId, 'Starting connection test', {
86
+ host: this.config.host,
87
+ port: this.config.port,
88
+ database: this.config.database,
89
+ ssl: this.config.ssl
90
+ });
91
+ await this.connect();
92
+ if (!this.pool) {
93
+ this.logDebugError(mergedDebugConfig, debugId, 'Connection test', {
94
+ error: 'Connection not available after connect',
95
+ duration: performance.now() - startTime
96
+ });
97
+ return false;
98
+ }
99
+ const sql = 'SELECT 1 AS test';
100
+ await this.executeWithTimeout(async () => {
101
+ if (!this.pool)
102
+ throw new ConnectionError('Database connection not available');
103
+ const request = this.pool.request();
104
+ return request.query(sql);
105
+ }, this.connectionTimeout);
106
+ const duration = performance.now() - startTime;
107
+ if (mergedDebugConfig?.enabled) {
108
+ console.log(`[DEBUG-${debugId}] Connection test completed:`, {
109
+ success: true,
110
+ duration,
111
+ host: this.config.host,
112
+ database: this.config.database
113
+ });
114
+ }
115
+ return true;
116
+ }
117
+ catch (error) {
118
+ const duration = performance.now() - startTime;
119
+ this.logDebugError(mergedDebugConfig, debugId, 'Connection test', {
120
+ host: this.config.host,
121
+ port: this.config.port,
122
+ database: this.config.database,
123
+ error: mergedDebugConfig?.exposeRawErrors && error instanceof Error ? error.message : 'Connection failed',
124
+ duration,
125
+ suggestion: this.generateConnectionSuggestion(error)
126
+ });
127
+ return false;
128
+ }
129
+ }
130
+ mergeDebugConfig(debugConfig) {
131
+ return {
132
+ enabled: debugConfig?.enabled ?? (process.env.NODE_ENV === 'development'),
133
+ exposeQueries: debugConfig?.exposeQueries ?? true,
134
+ exposeRawErrors: debugConfig?.exposeRawErrors ?? true,
135
+ logLevel: debugConfig?.logLevel ?? 'debug'
136
+ };
137
+ }
138
+ generateConnectionSuggestion(error) {
139
+ if (!(error instanceof Error)) {
140
+ return 'Check database connection configuration';
141
+ }
142
+ const message = error.message.toLowerCase();
143
+ if (message.includes('connect econnrefused') || message.includes('connection refused')) {
144
+ return `Azure SQL Database at ${this.config.host}:${this.config.port} is not accepting connections. Verify the server name and check Azure SQL firewall rules.`;
145
+ }
146
+ if (message.includes('timeout') || message.includes('connect timeout')) {
147
+ return `Connection timeout to ${this.config.host}:${this.config.port}. Check Azure SQL firewall rules, network connectivity, and ensure your IP is allowed.`;
148
+ }
149
+ if (message.includes('login failed') || message.includes('authentication failed')) {
150
+ return `Authentication failed for database '${this.config.database}'. Verify username, password, and Azure AD configuration if using AAD auth.`;
151
+ }
152
+ if (message.includes('cannot open database') || (message.includes('database') && message.includes('not exist'))) {
153
+ return `Database '${this.config.database}' not found. Check database name on your Azure SQL server.`;
154
+ }
155
+ if (message.includes('ssl') || message.includes('tls') || message.includes('encrypt')) {
156
+ return `SSL/TLS connection issue. Azure SQL requires encryption - check SSL certificate configuration.`;
157
+ }
158
+ if (message.includes('firewall')) {
159
+ return `Connection blocked by Azure SQL firewall. Add your client IP address to the server's firewall rules in the Azure portal.`;
160
+ }
161
+ if (message.includes('azure active directory') || message.includes('aad')) {
162
+ return `Azure AD authentication issue. Verify Azure AD admin is configured and the user has proper permissions.`;
163
+ }
164
+ return `Connection failed to ${this.config.host}:${this.config.port}. Check host, port, credentials, firewall rules, and network connectivity.`;
165
+ }
166
+ async listTables() {
167
+ const sql = `
168
+ SELECT TABLE_NAME as table_name
169
+ FROM INFORMATION_SCHEMA.TABLES
170
+ WHERE TABLE_TYPE = 'BASE TABLE'
171
+ AND TABLE_SCHEMA = 'dbo'
172
+ ORDER BY TABLE_NAME
173
+ `;
174
+ await this.validateQuery(sql);
175
+ try {
176
+ const result = await this.executeQuery(sql);
177
+ return result
178
+ .slice(0, this.maxRows)
179
+ .map((row) => rowString(row.table_name ?? row.TABLE_NAME ?? row.tablename))
180
+ .filter(Boolean);
181
+ }
182
+ catch (error) {
183
+ throw new QueryError('Failed to list tables', 'table_listing', undefined, error instanceof Error ? error : undefined);
184
+ }
185
+ }
186
+ async getTableSchema(table) {
187
+ this.escapeIdentifier(table);
188
+ const sql = `
189
+ SELECT
190
+ COLUMN_NAME as column_name,
191
+ DATA_TYPE as data_type,
192
+ IS_NULLABLE as is_nullable
193
+ FROM INFORMATION_SCHEMA.COLUMNS
194
+ WHERE TABLE_SCHEMA = 'dbo'
195
+ AND TABLE_NAME = '${table}'
196
+ ORDER BY ORDINAL_POSITION
197
+ `;
198
+ await this.validateQuery(sql);
199
+ try {
200
+ const result = await this.executeQuery(sql);
201
+ const limited = result.slice(0, this.maxRows);
202
+ if (limited.length === 0) {
203
+ throw QueryError.tableNotFound(table);
204
+ }
205
+ return {
206
+ table,
207
+ columns: limited.map(row => ({
208
+ name: rowString(row.column_name ?? row.COLUMN_NAME),
209
+ type: this.mapMSSQLType(rowString(row.data_type ?? row.DATA_TYPE)),
210
+ nullable: (row.is_nullable ?? row.IS_NULLABLE) === 'YES'
211
+ }))
212
+ };
213
+ }
214
+ catch (error) {
215
+ if (error instanceof QueryError) {
216
+ throw error;
217
+ }
218
+ throw new QueryError('Failed to get table schema', 'schema_query', table, error instanceof Error ? error : undefined);
219
+ }
220
+ }
221
+ async getLastModified(table) {
222
+ const timestampColumns = ['updated_at', 'modified_at', 'last_modified', 'timestamp'];
223
+ for (const column of timestampColumns) {
224
+ try {
225
+ const result = await this.getMaxTimestamp(table, column);
226
+ if (result) {
227
+ return result;
228
+ }
229
+ }
230
+ catch {
231
+ continue;
232
+ }
233
+ }
234
+ try {
235
+ const sql = `
236
+ SELECT MAX(last_user_update) as last_modified
237
+ FROM sys.dm_db_index_usage_stats
238
+ WHERE database_id = DB_ID()
239
+ AND object_id = OBJECT_ID('dbo.${this.escapeIdentifier(table).replace(/\[|\]/g, '')}')
240
+ `;
241
+ await this.validateQuery(sql);
242
+ const result = await this.executeQuery(sql);
243
+ if (result.length > 0 && result[0]?.last_modified) {
244
+ return new Date(rowString(result[0].last_modified));
245
+ }
246
+ }
247
+ catch {
248
+ }
249
+ return null;
250
+ }
251
+ async close() {
252
+ if (this.pool) {
253
+ try {
254
+ await this.pool.close();
255
+ }
256
+ catch (error) {
257
+ console.warn('Warning: Error closing Azure SQL connection:', ErrorHandler.getUserMessage(error));
258
+ }
259
+ finally {
260
+ this.pool = null;
261
+ this.connected = false;
262
+ }
263
+ }
264
+ }
265
+ mapMSSQLType(mssqlType) {
266
+ const typeMap = {
267
+ 'tinyint': 'integer',
268
+ 'smallint': 'integer',
269
+ 'int': 'integer',
270
+ 'integer': 'integer',
271
+ 'bigint': 'bigint',
272
+ 'decimal': 'decimal',
273
+ 'numeric': 'decimal',
274
+ 'money': 'decimal',
275
+ 'smallmoney': 'decimal',
276
+ 'float': 'float',
277
+ 'real': 'float',
278
+ 'bit': 'boolean',
279
+ 'char': 'text',
280
+ 'varchar': 'text',
281
+ 'text': 'text',
282
+ 'nchar': 'text',
283
+ 'nvarchar': 'text',
284
+ 'ntext': 'text',
285
+ 'date': 'date',
286
+ 'time': 'time',
287
+ 'datetime': 'timestamp',
288
+ 'datetime2': 'timestamp',
289
+ 'smalldatetime': 'timestamp',
290
+ 'datetimeoffset': 'timestamptz',
291
+ 'binary': 'text',
292
+ 'varbinary': 'text',
293
+ 'image': 'text',
294
+ 'uniqueidentifier': 'text',
295
+ 'xml': 'text',
296
+ 'sql_variant': 'text',
297
+ 'hierarchyid': 'text',
298
+ 'geometry': 'text',
299
+ 'geography': 'text',
300
+ 'timestamp': 'text',
301
+ 'rowversion': 'text'
302
+ };
303
+ return typeMap[mssqlType.toLowerCase()] ?? 'unknown';
304
+ }
305
+ escapeIdentifier(identifier) {
306
+ if (!/^[a-zA-Z0-9_.]+$/.test(identifier)) {
307
+ throw new Error(`Invalid identifier: ${identifier}`);
308
+ }
309
+ if (identifier.length > 256) {
310
+ throw new Error('Identifier too long');
311
+ }
312
+ return `[${identifier}]`;
313
+ }
314
+ async connectLegacy(credentials) {
315
+ console.warn('Warning: connectLegacy is deprecated. Use constructor with ConnectorConfig instead.');
316
+ const config = {
317
+ host: credentials.host ?? '',
318
+ port: credentials.port ?? 1433,
319
+ database: credentials.database ?? '',
320
+ username: credentials.username ?? '',
321
+ password: credentials.password ?? '',
322
+ ssl: credentials.sslMode !== 'disable'
323
+ };
324
+ validateConnectorConfig(config);
325
+ this.config = { ...this.config, ...config };
326
+ await this.connect();
327
+ }
328
+ async testConnectionLegacy() {
329
+ console.warn('Warning: testConnectionLegacy is deprecated. Use testConnection() instead.');
330
+ try {
331
+ const success = await this.testConnection();
332
+ if (success) {
333
+ const tables = await this.listTables();
334
+ return {
335
+ success: true,
336
+ tableCount: tables.length
337
+ };
338
+ }
339
+ else {
340
+ return {
341
+ success: false,
342
+ error: 'Connection test failed'
343
+ };
344
+ }
345
+ }
346
+ catch (error) {
347
+ return {
348
+ success: false,
349
+ error: ErrorHandler.getUserMessage(error)
350
+ };
351
+ }
352
+ }
353
+ async getTableMetadata(tableName, timestampColumn = 'updated_at') {
354
+ console.warn('Warning: getTableMetadata is deprecated. Use getRowCount() and getMaxTimestamp() instead.');
355
+ try {
356
+ const rowCount = await this.getRowCount(tableName);
357
+ const lastUpdate = await this.getMaxTimestamp(tableName, timestampColumn);
358
+ return {
359
+ rowCount,
360
+ lastUpdate: lastUpdate ?? undefined
361
+ };
362
+ }
363
+ catch (error) {
364
+ throw new QueryError('Failed to get table metadata', 'metadata_query', tableName, error instanceof Error ? error : undefined);
365
+ }
366
+ }
367
+ async query(_sql) {
368
+ throw new Error('Direct SQL queries are not allowed for security reasons. Use specific methods like getRowCount(), getMaxTimestamp(), etc.');
369
+ }
370
+ }
371
+ //# sourceMappingURL=azure-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-sql.js","sourceRoot":"","sources":["../../src/connectors/azure-sql.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,7 @@ export { BigQueryConnector } from './bigquery.js';
4
4
  export { SnowflakeConnector } from './snowflake.js';
5
5
  export { MySQLConnector } from './mysql.js';
6
6
  export { RedshiftConnector } from './redshift.js';
7
+ export { MSSQLConnector } from './mssql.js';
8
+ export { AzureSQLConnector } from './azure-sql.js';
9
+ export { SynapseConnector } from './synapse.js';
7
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -4,4 +4,7 @@ export { BigQueryConnector } from './bigquery.js';
4
4
  export { SnowflakeConnector } from './snowflake.js';
5
5
  export { MySQLConnector } from './mysql.js';
6
6
  export { RedshiftConnector } from './redshift.js';
7
+ export { MSSQLConnector } from './mssql.js';
8
+ export { AzureSQLConnector } from './azure-sql.js';
9
+ export { SynapseConnector } from './synapse.js';
7
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { BaseConnector } from './base-connector.js';
2
+ import type { ConnectorConfig, TableSchema, SecurityConfig } from '../types/connector.js';
3
+ import { type QueryResultRow } from '../types/driver-results.js';
4
+ import type { SourceCredentials } from '../types.js';
5
+ export declare class MSSQLConnector extends BaseConnector {
6
+ private pool;
7
+ private connected;
8
+ constructor(config: ConnectorConfig, securityConfig?: Partial<SecurityConfig>);
9
+ private connect;
10
+ protected executeQuery(sql: string): Promise<QueryResultRow[]>;
11
+ protected executeParameterizedQuery(sql: string, parameters?: unknown[]): Promise<QueryResultRow[]>;
12
+ testConnection(debugConfig?: import('../types.js').DebugConfig): Promise<boolean>;
13
+ private mergeDebugConfig;
14
+ private generateConnectionSuggestion;
15
+ listTables(): Promise<string[]>;
16
+ getTableSchema(table: string): Promise<TableSchema>;
17
+ getLastModified(table: string): Promise<Date | null>;
18
+ close(): Promise<void>;
19
+ private mapMSSQLType;
20
+ protected escapeIdentifier(identifier: string): string;
21
+ connectLegacy(credentials: SourceCredentials): Promise<void>;
22
+ testConnectionLegacy(): Promise<{
23
+ success: boolean;
24
+ tableCount?: number;
25
+ error?: string;
26
+ }>;
27
+ getTableMetadata(tableName: string, timestampColumn?: string): Promise<{
28
+ rowCount: number;
29
+ lastUpdate?: Date;
30
+ }>;
31
+ query<T = unknown>(_sql: string): Promise<T[]>;
32
+ }
33
+ //# sourceMappingURL=mssql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mssql.d.ts","sourceRoot":"","sources":["../../src/connectors/mssql.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAAa,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoBrD,qBAAa,cAAe,SAAQ,aAAa;IAC/C,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;YAS/D,OAAO;cA2CL,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;cAOpD,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuDvG,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAmEvF,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,4BAA4B;IAqC9B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA8B/B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkDnD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAyCpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,OAAO,CAAC,YAAY;IAsDpB,SAAS,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAuBhD,aAAa,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB5D,oBAAoB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B1F,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,eAAe,SAAe,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IA0B7C,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;CAKrD"}