@freshguard/freshguard-core 0.11.2

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 (180) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +644 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +350 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/connectors/base-connector.d.ts +62 -0
  8. package/dist/connectors/base-connector.d.ts.map +1 -0
  9. package/dist/connectors/base-connector.js +549 -0
  10. package/dist/connectors/base-connector.js.map +1 -0
  11. package/dist/connectors/bigquery.d.ts +38 -0
  12. package/dist/connectors/bigquery.d.ts.map +1 -0
  13. package/dist/connectors/bigquery.js +406 -0
  14. package/dist/connectors/bigquery.js.map +1 -0
  15. package/dist/connectors/duckdb.d.ts +36 -0
  16. package/dist/connectors/duckdb.d.ts.map +1 -0
  17. package/dist/connectors/duckdb.js +364 -0
  18. package/dist/connectors/duckdb.js.map +1 -0
  19. package/dist/connectors/index.d.ts +7 -0
  20. package/dist/connectors/index.d.ts.map +1 -0
  21. package/dist/connectors/index.js +7 -0
  22. package/dist/connectors/index.js.map +1 -0
  23. package/dist/connectors/mysql.d.ts +32 -0
  24. package/dist/connectors/mysql.d.ts.map +1 -0
  25. package/dist/connectors/mysql.js +348 -0
  26. package/dist/connectors/mysql.js.map +1 -0
  27. package/dist/connectors/postgres.d.ts +31 -0
  28. package/dist/connectors/postgres.d.ts.map +1 -0
  29. package/dist/connectors/postgres.js +326 -0
  30. package/dist/connectors/postgres.js.map +1 -0
  31. package/dist/connectors/redshift.d.ts +32 -0
  32. package/dist/connectors/redshift.d.ts.map +1 -0
  33. package/dist/connectors/redshift.js +366 -0
  34. package/dist/connectors/redshift.js.map +1 -0
  35. package/dist/connectors/snowflake.d.ts +43 -0
  36. package/dist/connectors/snowflake.d.ts.map +1 -0
  37. package/dist/connectors/snowflake.js +442 -0
  38. package/dist/connectors/snowflake.js.map +1 -0
  39. package/dist/db/index.d.ts +9 -0
  40. package/dist/db/index.d.ts.map +1 -0
  41. package/dist/db/index.js +10 -0
  42. package/dist/db/index.js.map +1 -0
  43. package/dist/db/migrate.d.ts +12 -0
  44. package/dist/db/migrate.d.ts.map +1 -0
  45. package/dist/db/migrate.js +114 -0
  46. package/dist/db/migrate.js.map +1 -0
  47. package/dist/db/schema.d.ts +2053 -0
  48. package/dist/db/schema.d.ts.map +1 -0
  49. package/dist/db/schema.js +164 -0
  50. package/dist/db/schema.js.map +1 -0
  51. package/dist/errors/debug-factory.d.ts +23 -0
  52. package/dist/errors/debug-factory.d.ts.map +1 -0
  53. package/dist/errors/debug-factory.js +149 -0
  54. package/dist/errors/debug-factory.js.map +1 -0
  55. package/dist/errors/index.d.ts +119 -0
  56. package/dist/errors/index.d.ts.map +1 -0
  57. package/dist/errors/index.js +341 -0
  58. package/dist/errors/index.js.map +1 -0
  59. package/dist/index.d.ts +9 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +6 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/metadata/duckdb-storage.d.ts +31 -0
  64. package/dist/metadata/duckdb-storage.d.ts.map +1 -0
  65. package/dist/metadata/duckdb-storage.js +230 -0
  66. package/dist/metadata/duckdb-storage.js.map +1 -0
  67. package/dist/metadata/factory.d.ts +4 -0
  68. package/dist/metadata/factory.d.ts.map +1 -0
  69. package/dist/metadata/factory.js +23 -0
  70. package/dist/metadata/factory.js.map +1 -0
  71. package/dist/metadata/index.d.ts +6 -0
  72. package/dist/metadata/index.d.ts.map +1 -0
  73. package/dist/metadata/index.js +4 -0
  74. package/dist/metadata/index.js.map +1 -0
  75. package/dist/metadata/interface.d.ts +26 -0
  76. package/dist/metadata/interface.d.ts.map +1 -0
  77. package/dist/metadata/interface.js +2 -0
  78. package/dist/metadata/interface.js.map +1 -0
  79. package/dist/metadata/postgresql-storage.d.ts +32 -0
  80. package/dist/metadata/postgresql-storage.d.ts.map +1 -0
  81. package/dist/metadata/postgresql-storage.js +242 -0
  82. package/dist/metadata/postgresql-storage.js.map +1 -0
  83. package/dist/metadata/schema-config.d.ts +30 -0
  84. package/dist/metadata/schema-config.d.ts.map +1 -0
  85. package/dist/metadata/schema-config.js +94 -0
  86. package/dist/metadata/schema-config.js.map +1 -0
  87. package/dist/metadata/types.d.ts +35 -0
  88. package/dist/metadata/types.d.ts.map +1 -0
  89. package/dist/metadata/types.js +2 -0
  90. package/dist/metadata/types.js.map +1 -0
  91. package/dist/monitor/baseline-calculator.d.ts +30 -0
  92. package/dist/monitor/baseline-calculator.d.ts.map +1 -0
  93. package/dist/monitor/baseline-calculator.js +192 -0
  94. package/dist/monitor/baseline-calculator.js.map +1 -0
  95. package/dist/monitor/baseline-config.d.ts +37 -0
  96. package/dist/monitor/baseline-config.d.ts.map +1 -0
  97. package/dist/monitor/baseline-config.js +156 -0
  98. package/dist/monitor/baseline-config.js.map +1 -0
  99. package/dist/monitor/freshness.d.ts +5 -0
  100. package/dist/monitor/freshness.d.ts.map +1 -0
  101. package/dist/monitor/freshness.js +239 -0
  102. package/dist/monitor/freshness.js.map +1 -0
  103. package/dist/monitor/index.d.ts +5 -0
  104. package/dist/monitor/index.d.ts.map +1 -0
  105. package/dist/monitor/index.js +5 -0
  106. package/dist/monitor/index.js.map +1 -0
  107. package/dist/monitor/schema-baseline.d.ts +22 -0
  108. package/dist/monitor/schema-baseline.d.ts.map +1 -0
  109. package/dist/monitor/schema-baseline.js +211 -0
  110. package/dist/monitor/schema-baseline.js.map +1 -0
  111. package/dist/monitor/schema-changes.d.ts +5 -0
  112. package/dist/monitor/schema-changes.d.ts.map +1 -0
  113. package/dist/monitor/schema-changes.js +289 -0
  114. package/dist/monitor/schema-changes.js.map +1 -0
  115. package/dist/monitor/volume.d.ts +5 -0
  116. package/dist/monitor/volume.d.ts.map +1 -0
  117. package/dist/monitor/volume.js +262 -0
  118. package/dist/monitor/volume.js.map +1 -0
  119. package/dist/observability/logger.d.ts +63 -0
  120. package/dist/observability/logger.d.ts.map +1 -0
  121. package/dist/observability/logger.js +282 -0
  122. package/dist/observability/logger.js.map +1 -0
  123. package/dist/observability/metrics.d.ts +106 -0
  124. package/dist/observability/metrics.d.ts.map +1 -0
  125. package/dist/observability/metrics.js +441 -0
  126. package/dist/observability/metrics.js.map +1 -0
  127. package/dist/query-analyzer.js +526 -0
  128. package/dist/resilience/circuit-breaker.d.ts +94 -0
  129. package/dist/resilience/circuit-breaker.d.ts.map +1 -0
  130. package/dist/resilience/circuit-breaker.js +379 -0
  131. package/dist/resilience/circuit-breaker.js.map +1 -0
  132. package/dist/resilience/index.d.ts +7 -0
  133. package/dist/resilience/index.d.ts.map +1 -0
  134. package/dist/resilience/index.js +7 -0
  135. package/dist/resilience/index.js.map +1 -0
  136. package/dist/resilience/retry-policy.d.ts +87 -0
  137. package/dist/resilience/retry-policy.d.ts.map +1 -0
  138. package/dist/resilience/retry-policy.js +423 -0
  139. package/dist/resilience/retry-policy.js.map +1 -0
  140. package/dist/resilience/timeout-manager.d.ts +97 -0
  141. package/dist/resilience/timeout-manager.d.ts.map +1 -0
  142. package/dist/resilience/timeout-manager.js +339 -0
  143. package/dist/resilience/timeout-manager.js.map +1 -0
  144. package/dist/security/query-analyzer.d.ts +82 -0
  145. package/dist/security/query-analyzer.d.ts.map +1 -0
  146. package/dist/security/query-analyzer.js +381 -0
  147. package/dist/security/query-analyzer.js.map +1 -0
  148. package/dist/security/schema-cache.d.ts +95 -0
  149. package/dist/security/schema-cache.d.ts.map +1 -0
  150. package/dist/security/schema-cache.js +344 -0
  151. package/dist/security/schema-cache.js.map +1 -0
  152. package/dist/types/connector.d.ts +68 -0
  153. package/dist/types/connector.d.ts.map +1 -0
  154. package/dist/types/connector.js +26 -0
  155. package/dist/types/connector.js.map +1 -0
  156. package/dist/types.d.ts +244 -0
  157. package/dist/types.d.ts.map +1 -0
  158. package/dist/types.js +2 -0
  159. package/dist/types.js.map +1 -0
  160. package/dist/validation/index.d.ts +7 -0
  161. package/dist/validation/index.d.ts.map +1 -0
  162. package/dist/validation/index.js +5 -0
  163. package/dist/validation/index.js.map +1 -0
  164. package/dist/validation/runtime-validator.d.ts +70 -0
  165. package/dist/validation/runtime-validator.d.ts.map +1 -0
  166. package/dist/validation/runtime-validator.js +206 -0
  167. package/dist/validation/runtime-validator.js.map +1 -0
  168. package/dist/validation/sanitizers.d.ts +56 -0
  169. package/dist/validation/sanitizers.d.ts.map +1 -0
  170. package/dist/validation/sanitizers.js +264 -0
  171. package/dist/validation/sanitizers.js.map +1 -0
  172. package/dist/validation/schemas.d.ts +224 -0
  173. package/dist/validation/schemas.d.ts.map +1 -0
  174. package/dist/validation/schemas.js +263 -0
  175. package/dist/validation/schemas.js.map +1 -0
  176. package/dist/validators/index.d.ts +18 -0
  177. package/dist/validators/index.d.ts.map +1 -0
  178. package/dist/validators/index.js +209 -0
  179. package/dist/validators/index.js.map +1 -0
  180. package/package.json +91 -0
@@ -0,0 +1,442 @@
1
+ import * as snowflake from 'snowflake-sdk';
2
+ import { BaseConnector } from './base-connector.js';
3
+ import { ConnectionError, TimeoutError, QueryError, ConfigurationError, SecurityError, ErrorHandler } from '../errors/index.js';
4
+ import { validateDatabaseIdentifier } from '../validators/index.js';
5
+ export class SnowflakeConnector extends BaseConnector {
6
+ connection = null;
7
+ account = '';
8
+ warehouse = '';
9
+ database = '';
10
+ schema = 'PUBLIC';
11
+ connected = false;
12
+ constructor(config, securityConfig) {
13
+ SnowflakeConnector.validateSnowflakeConfig(config);
14
+ super(config, securityConfig);
15
+ this.account = this.extractAccount(config.host);
16
+ this.database = config.database;
17
+ }
18
+ static validateSnowflakeConfig(config) {
19
+ if (!config.host) {
20
+ throw new ConfigurationError('Host is required for Snowflake (format: account.snowflakecomputing.com)');
21
+ }
22
+ if (!config.username || !config.password) {
23
+ throw new ConfigurationError('Username and password are required for Snowflake');
24
+ }
25
+ if (!config.database) {
26
+ throw new ConfigurationError('Database is required for Snowflake');
27
+ }
28
+ if (!config.host.includes('.snowflakecomputing.com')) {
29
+ throw new ConfigurationError('Invalid Snowflake host format (expected: account.snowflakecomputing.com)');
30
+ }
31
+ }
32
+ extractAccount(host) {
33
+ const hostMatch = /^([^.]+)\.snowflakecomputing\.com$/.exec(host);
34
+ if (hostMatch?.[1]) {
35
+ return hostMatch[1];
36
+ }
37
+ throw new ConfigurationError('Could not extract Snowflake account from host');
38
+ }
39
+ async connect() {
40
+ if (this.connected && this.connection) {
41
+ return;
42
+ }
43
+ try {
44
+ const connectionOptions = {
45
+ account: this.account,
46
+ username: this.config.username,
47
+ password: this.config.password,
48
+ database: this.database,
49
+ schema: this.schema,
50
+ warehouse: this.warehouse || undefined,
51
+ authenticator: 'SNOWFLAKE',
52
+ timeout: this.connectionTimeout,
53
+ };
54
+ this.connection = snowflake.createConnection(connectionOptions);
55
+ await this.executeWithTimeout(() => new Promise((resolve, reject) => {
56
+ this.connection.connect((err) => {
57
+ if (err) {
58
+ reject(new Error(`Snowflake connection failed: ${err.message}`));
59
+ }
60
+ else {
61
+ resolve();
62
+ }
63
+ });
64
+ }), this.connectionTimeout);
65
+ this.connected = true;
66
+ }
67
+ catch (error) {
68
+ if (error instanceof TimeoutError) {
69
+ throw error;
70
+ }
71
+ throw new ConnectionError('Failed to connect to Snowflake', this.config.host, this.config.port, error instanceof Error ? error : undefined);
72
+ }
73
+ }
74
+ async executeParameterizedQuery(sql, parameters = []) {
75
+ await this.connect();
76
+ if (!this.connection) {
77
+ throw new ConnectionError('Snowflake connection not available');
78
+ }
79
+ try {
80
+ let finalSql = sql;
81
+ if (parameters.length > 0) {
82
+ for (let i = 0; i < parameters.length; i++) {
83
+ const placeholder = `$${i + 1}`;
84
+ finalSql = finalSql.replace(new RegExp(`\\${placeholder}\\b`, 'g'), '?');
85
+ }
86
+ }
87
+ const result = await this.executeWithTimeout(() => new Promise((resolve, reject) => {
88
+ const executeOptions = {
89
+ sqlText: finalSql,
90
+ complete: (err, _stmt, rows) => {
91
+ if (err) {
92
+ reject(new Error(`Query execution failed: ${err.message}`));
93
+ }
94
+ else {
95
+ resolve(rows || []);
96
+ }
97
+ }
98
+ };
99
+ if (parameters.length > 0) {
100
+ executeOptions.binds = parameters;
101
+ }
102
+ this.connection.execute(executeOptions);
103
+ }), this.queryTimeout);
104
+ this.validateResultSize(result);
105
+ return result;
106
+ }
107
+ catch (error) {
108
+ if (error instanceof TimeoutError) {
109
+ throw error;
110
+ }
111
+ throw new QueryError(ErrorHandler.getUserMessage(error), 'query_execution', undefined, error instanceof Error ? error : undefined);
112
+ }
113
+ }
114
+ async executeQuery(sql) {
115
+ return this.executeParameterizedQuery(sql, []);
116
+ }
117
+ async testConnection(debugConfig) {
118
+ const mergedDebugConfig = this.mergeDebugConfig(debugConfig);
119
+ const debugId = `sf-test-${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 5)}`;
120
+ const startTime = performance.now();
121
+ try {
122
+ this.logDebugInfo(mergedDebugConfig, debugId, 'Starting Snowflake connection test', {
123
+ account: this.account,
124
+ warehouse: this.warehouse,
125
+ database: this.database,
126
+ schema: this.schema
127
+ });
128
+ await this.connect();
129
+ if (!this.connection) {
130
+ this.logDebugError(mergedDebugConfig, debugId, 'Snowflake connection test', {
131
+ error: 'Connection not available after connect',
132
+ duration: performance.now() - startTime
133
+ });
134
+ return false;
135
+ }
136
+ const sql = 'SELECT 1 as test';
137
+ await this.executeQuery(sql);
138
+ const duration = performance.now() - startTime;
139
+ if (mergedDebugConfig?.enabled) {
140
+ console.log(`[DEBUG-${debugId}] Snowflake connection test completed:`, {
141
+ success: true,
142
+ duration,
143
+ account: this.account,
144
+ database: this.database,
145
+ warehouse: this.warehouse
146
+ });
147
+ }
148
+ return true;
149
+ }
150
+ catch (error) {
151
+ const duration = performance.now() - startTime;
152
+ this.logDebugError(mergedDebugConfig, debugId, 'Snowflake connection test', {
153
+ account: this.account,
154
+ warehouse: this.warehouse,
155
+ database: this.database,
156
+ schema: this.schema,
157
+ error: mergedDebugConfig?.exposeRawErrors && error instanceof Error ? error.message : 'Connection failed',
158
+ duration,
159
+ suggestion: this.generateSnowflakeConnectionSuggestion(error)
160
+ });
161
+ return false;
162
+ }
163
+ }
164
+ mergeDebugConfig(debugConfig) {
165
+ return {
166
+ enabled: debugConfig?.enabled ?? (process.env.NODE_ENV === 'development'),
167
+ exposeQueries: debugConfig?.exposeQueries ?? true,
168
+ exposeRawErrors: debugConfig?.exposeRawErrors ?? true,
169
+ logLevel: debugConfig?.logLevel ?? 'debug'
170
+ };
171
+ }
172
+ generateSnowflakeConnectionSuggestion(error) {
173
+ if (!(error instanceof Error)) {
174
+ return 'Check Snowflake connection configuration';
175
+ }
176
+ const message = error.message.toLowerCase();
177
+ if (message.includes('incorrect username or password')) {
178
+ return `Authentication failed for account '${this.account}'. Verify username and password are correct.`;
179
+ }
180
+ if (message.includes('account') && message.includes('not found')) {
181
+ return `Snowflake account '${this.account}' not found. Check account identifier and region (e.g., 'myorg-myaccount').`;
182
+ }
183
+ if (message.includes('warehouse') && message.includes('not exist')) {
184
+ return `Warehouse '${this.warehouse}' does not exist or is not accessible. Check warehouse name and permissions.`;
185
+ }
186
+ if (message.includes('database') && message.includes('not exist')) {
187
+ return `Database '${this.database}' does not exist or is not accessible. Check database name and permissions.`;
188
+ }
189
+ if (message.includes('schema') && message.includes('not exist')) {
190
+ return `Schema '${this.schema}' does not exist in database '${this.database}'. Check schema name and permissions.`;
191
+ }
192
+ if (message.includes('warehouse suspended') || message.includes('warehouse not running')) {
193
+ return `Warehouse '${this.warehouse}' is suspended or not running. Resume warehouse or check auto-suspend settings.`;
194
+ }
195
+ if (message.includes('network') || message.includes('timeout')) {
196
+ return `Network connectivity issue to Snowflake account '${this.account}'. Check firewall settings and network access policies.`;
197
+ }
198
+ if (message.includes('role') || message.includes('permission')) {
199
+ return `Permission denied. Check user roles and privileges for warehouse '${this.warehouse}' and database '${this.database}'.`;
200
+ }
201
+ if (message.includes('mfa') || message.includes('multi-factor')) {
202
+ return `MFA required but not provided. Configure MFA authentication for account '${this.account}'.`;
203
+ }
204
+ return `Snowflake connection failed to account '${this.account}'. Check account, credentials, and object permissions.`;
205
+ }
206
+ async listTables() {
207
+ const sql = `
208
+ SELECT table_name
209
+ FROM INFORMATION_SCHEMA.TABLES
210
+ WHERE table_schema = $1
211
+ AND table_type = 'BASE TABLE'
212
+ ORDER BY table_name
213
+ LIMIT $2
214
+ `;
215
+ this.validateQuery(sql);
216
+ try {
217
+ const result = await this.executeParameterizedQuery(sql, [this.schema.toUpperCase(), this.maxRows]);
218
+ return result.map((row) => row.TABLE_NAME).filter(Boolean);
219
+ }
220
+ catch (error) {
221
+ throw new QueryError('Failed to list tables', 'table_listing', undefined, error instanceof Error ? error : undefined);
222
+ }
223
+ }
224
+ async getTableSchema(table) {
225
+ const parsedTable = this.parseTableName(table);
226
+ const tableNameUpper = parsedTable.split('.').pop()?.toUpperCase();
227
+ if (!tableNameUpper) {
228
+ throw new QueryError('Invalid table name format', 'invalid_table_name');
229
+ }
230
+ const sql = `
231
+ SELECT
232
+ column_name,
233
+ data_type,
234
+ is_nullable
235
+ FROM INFORMATION_SCHEMA.COLUMNS
236
+ WHERE table_name = $1
237
+ AND table_schema = $2
238
+ ORDER BY ordinal_position
239
+ LIMIT $3
240
+ `;
241
+ this.validateQuery(sql);
242
+ try {
243
+ const result = await this.executeParameterizedQuery(sql, [tableNameUpper, this.schema.toUpperCase(), this.maxRows]);
244
+ if (result.length === 0) {
245
+ throw QueryError.tableNotFound(table);
246
+ }
247
+ return {
248
+ table,
249
+ columns: result.map(row => ({
250
+ name: row.COLUMN_NAME,
251
+ type: this.mapSnowflakeType(row.DATA_TYPE),
252
+ nullable: row.IS_NULLABLE === 'YES'
253
+ }))
254
+ };
255
+ }
256
+ catch (error) {
257
+ if (error instanceof QueryError) {
258
+ throw error;
259
+ }
260
+ throw new QueryError('Failed to get table schema', 'schema_query', table, error instanceof Error ? error : undefined);
261
+ }
262
+ }
263
+ async getLastModified(table) {
264
+ const timestampColumns = [
265
+ 'UPDATED_AT', 'MODIFIED_AT', 'LAST_MODIFIED', 'TIMESTAMP',
266
+ 'CREATED_AT', 'DATE_MODIFIED', 'LAST_UPDATE'
267
+ ];
268
+ for (const column of timestampColumns) {
269
+ try {
270
+ const result = await this.getMaxTimestamp(table, column);
271
+ if (result) {
272
+ return result;
273
+ }
274
+ }
275
+ catch {
276
+ continue;
277
+ }
278
+ }
279
+ return null;
280
+ }
281
+ async close() {
282
+ if (this.connection) {
283
+ try {
284
+ await new Promise((resolve) => {
285
+ this.connection.destroy((err) => {
286
+ if (err) {
287
+ console.warn('Warning: Error closing Snowflake connection:', ErrorHandler.getUserMessage(err));
288
+ }
289
+ resolve();
290
+ });
291
+ });
292
+ }
293
+ catch (error) {
294
+ console.warn('Warning: Error closing Snowflake connection:', ErrorHandler.getUserMessage(error));
295
+ }
296
+ finally {
297
+ this.connection = null;
298
+ this.connected = false;
299
+ }
300
+ }
301
+ }
302
+ mapSnowflakeType(snowflakeType) {
303
+ const typeMap = {
304
+ 'NUMBER': 'decimal',
305
+ 'DECIMAL': 'decimal',
306
+ 'NUMERIC': 'decimal',
307
+ 'INT': 'integer',
308
+ 'INTEGER': 'integer',
309
+ 'BIGINT': 'bigint',
310
+ 'SMALLINT': 'integer',
311
+ 'TINYINT': 'integer',
312
+ 'BYTEINT': 'integer',
313
+ 'FLOAT': 'float',
314
+ 'FLOAT4': 'float',
315
+ 'FLOAT8': 'float',
316
+ 'DOUBLE': 'float',
317
+ 'DOUBLE PRECISION': 'float',
318
+ 'REAL': 'float',
319
+ 'VARCHAR': 'text',
320
+ 'CHAR': 'text',
321
+ 'CHARACTER': 'text',
322
+ 'STRING': 'text',
323
+ 'TEXT': 'text',
324
+ 'BINARY': 'binary',
325
+ 'VARBINARY': 'binary',
326
+ 'BOOLEAN': 'boolean',
327
+ 'DATE': 'date',
328
+ 'DATETIME': 'timestamp',
329
+ 'TIME': 'time',
330
+ 'TIMESTAMP': 'timestamp',
331
+ 'TIMESTAMP_LTZ': 'timestamptz',
332
+ 'TIMESTAMP_NTZ': 'timestamp',
333
+ 'TIMESTAMP_TZ': 'timestamptz',
334
+ 'VARIANT': 'json',
335
+ 'OBJECT': 'json',
336
+ 'ARRAY': 'array',
337
+ 'GEOGRAPHY': 'geography',
338
+ 'GEOMETRY': 'geometry'
339
+ };
340
+ return typeMap[snowflakeType.toUpperCase()] || 'unknown';
341
+ }
342
+ parseTableName(tableName) {
343
+ validateDatabaseIdentifier(tableName, 'table');
344
+ const parts = tableName.split('.');
345
+ if (parts.length === 3) {
346
+ const [database, _schema, _table] = parts;
347
+ if (database && database.toUpperCase() !== this.database.toUpperCase()) {
348
+ throw new SecurityError('Table database does not match configured database');
349
+ }
350
+ return tableName.toUpperCase();
351
+ }
352
+ else if (parts.length === 2) {
353
+ return `${this.database}.${tableName}`.toUpperCase();
354
+ }
355
+ else if (parts.length === 1) {
356
+ return `${this.database}.${this.schema}.${tableName}`.toUpperCase();
357
+ }
358
+ else {
359
+ throw new QueryError('Invalid table name format', 'invalid_table_name');
360
+ }
361
+ }
362
+ async connectLegacy(credentials) {
363
+ console.warn('Warning: connectLegacy is deprecated. Use constructor with ConnectorConfig instead.');
364
+ if (!credentials.host || !credentials.username || !credentials.password) {
365
+ throw new ConfigurationError('Missing required Snowflake credentials');
366
+ }
367
+ const options = credentials.additionalOptions || {};
368
+ const config = {
369
+ host: credentials.host,
370
+ port: 443,
371
+ database: credentials.database || options.database || '',
372
+ username: credentials.username,
373
+ password: credentials.password,
374
+ ssl: true
375
+ };
376
+ this.warehouse = options.warehouse || '';
377
+ this.schema = options.schema || 'PUBLIC';
378
+ SnowflakeConnector.validateSnowflakeConfig(config);
379
+ this.config = { ...this.config, ...config };
380
+ this.account = this.extractAccount(config.host);
381
+ this.database = config.database;
382
+ await this.connect();
383
+ }
384
+ async testConnectionLegacy() {
385
+ console.warn('Warning: testConnectionLegacy is deprecated. Use testConnection() instead.');
386
+ try {
387
+ const success = await this.testConnection();
388
+ if (success) {
389
+ const tables = await this.listTables();
390
+ return {
391
+ success: true,
392
+ tableCount: tables.length
393
+ };
394
+ }
395
+ else {
396
+ return {
397
+ success: false,
398
+ error: 'Connection test failed'
399
+ };
400
+ }
401
+ }
402
+ catch (error) {
403
+ return {
404
+ success: false,
405
+ error: ErrorHandler.getUserMessage(error)
406
+ };
407
+ }
408
+ }
409
+ async getTableMetadata(tableName, timestampColumn = 'UPDATED_AT') {
410
+ console.warn('Warning: getTableMetadata is deprecated. Use getRowCount() and getMaxTimestamp() instead.');
411
+ try {
412
+ const rowCount = await this.getRowCount(tableName);
413
+ const lastUpdate = await this.getMaxTimestamp(tableName, timestampColumn);
414
+ return {
415
+ rowCount,
416
+ lastUpdate: lastUpdate || undefined
417
+ };
418
+ }
419
+ catch (error) {
420
+ throw new QueryError('Failed to get table metadata', 'metadata_query', tableName, error instanceof Error ? error : undefined);
421
+ }
422
+ }
423
+ async query(_sql) {
424
+ throw new Error('Direct SQL queries are not allowed for security reasons. Use specific methods like getRowCount(), getMaxTimestamp(), etc.');
425
+ }
426
+ getAccount() {
427
+ return this.account;
428
+ }
429
+ setWarehouse(warehouse) {
430
+ this.warehouse = warehouse;
431
+ }
432
+ getWarehouse() {
433
+ return this.warehouse;
434
+ }
435
+ setSchema(schema) {
436
+ this.schema = schema;
437
+ }
438
+ getSchema() {
439
+ return this.schema;
440
+ }
441
+ }
442
+ //# sourceMappingURL=snowflake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snowflake.js","sourceRoot":"","sources":["../../src/connectors/snowflake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import postgres from 'postgres';
2
+ import * as schema from './schema.js';
3
+ export { schema };
4
+ export declare function createDatabase(connectionString: string): import("drizzle-orm/postgres-js").PostgresJsDatabase<typeof schema> & {
5
+ $client: postgres.Sql<{}>;
6
+ };
7
+ export type Database = ReturnType<typeof createDatabase>;
8
+ export { runMigrations, getCurrentVersion, needsMigrations, initializeDatabase, getMigrationStatus } from './migrate.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAMA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,MAAM,EAAE,CAAC;AAOlB,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,MAAM;;EAGtD;AAKD,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAGzD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { drizzle } from 'drizzle-orm/postgres-js';
2
+ import postgres from 'postgres';
3
+ import * as schema from './schema.js';
4
+ export { schema };
5
+ export function createDatabase(connectionString) {
6
+ const client = postgres(connectionString);
7
+ return drizzle(client, { schema });
8
+ }
9
+ export { runMigrations, getCurrentVersion, needsMigrations, initializeDatabase, getMigrationStatus } from './migrate.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,MAAM,EAAE,CAAC;AAOlB,MAAM,UAAU,cAAc,CAAC,gBAAwB;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC;AAQD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Database } from './index.js';
2
+ export declare function runMigrations(db: Database, targetVersion?: number): Promise<void>;
3
+ export declare function getCurrentVersion(db: Database): Promise<number>;
4
+ export declare function needsMigrations(db: Database): Promise<boolean>;
5
+ export declare function initializeDatabase(db: Database): Promise<void>;
6
+ export declare function getMigrationStatus(db: Database): Promise<{
7
+ current: number;
8
+ latest: number;
9
+ pending: number;
10
+ needsMigration: boolean;
11
+ }>;
12
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwF3C,wBAAsB,aAAa,CACjC,EAAE,EAAE,QAAQ,EACZ,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAKD,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAUrE;AAKD,wBAAsB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpE;AAMD,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE;AAKD,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC,CAYD"}
@@ -0,0 +1,114 @@
1
+ import { readFile, readdir } from 'fs/promises';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { sql } from 'drizzle-orm';
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ const MIGRATIONS_DIR = join(__dirname, 'migrations');
7
+ async function getAvailableMigrations() {
8
+ const files = await readdir(MIGRATIONS_DIR);
9
+ const migrationFiles = files
10
+ .filter(file => file.endsWith('.sql'))
11
+ .sort();
12
+ const migrations = [];
13
+ for (const filename of migrationFiles) {
14
+ const match = /^(\d+)_(.+)\.sql$/.exec(filename);
15
+ if (!match?.[1] || !match[2])
16
+ continue;
17
+ const version = parseInt(match[1], 10);
18
+ const name = match[2].replace(/_/g, ' ');
19
+ const sqlContent = await readFile(join(MIGRATIONS_DIR, filename), 'utf-8');
20
+ migrations.push({ version, name, sql: sqlContent, filename });
21
+ }
22
+ return migrations;
23
+ }
24
+ async function getAppliedMigrations(db) {
25
+ try {
26
+ const result = await db.execute(sql `
27
+ SELECT version FROM schema_migrations
28
+ ORDER BY version
29
+ `);
30
+ return result.map((row) => row.version);
31
+ }
32
+ catch (error) {
33
+ return [];
34
+ }
35
+ }
36
+ async function applyMigration(db, migration) {
37
+ console.log(`Applying migration ${migration.version}: ${migration.name}`);
38
+ try {
39
+ console.log(`Migration SQL available at: ${migration.filename}`);
40
+ try {
41
+ await db.execute(sql `
42
+ INSERT INTO schema_migrations (version, name, applied_at)
43
+ VALUES (${migration.version}, ${migration.name}, NOW())
44
+ ON CONFLICT (version) DO NOTHING
45
+ `);
46
+ }
47
+ catch {
48
+ }
49
+ console.log(`✅ Migration ${migration.version} applied successfully`);
50
+ }
51
+ catch (error) {
52
+ console.error(`❌ Failed to apply migration ${migration.version}:`, error);
53
+ throw error;
54
+ }
55
+ }
56
+ export async function runMigrations(db, targetVersion) {
57
+ console.log('🚀 Starting database migrations...');
58
+ const available = await getAvailableMigrations();
59
+ const applied = await getAppliedMigrations(db);
60
+ console.log(`Found ${available.length} available migrations`);
61
+ console.log(`${applied.length} migrations already applied`);
62
+ const pending = available.filter(m => {
63
+ if (applied.includes(m.version))
64
+ return false;
65
+ if (targetVersion && m.version > targetVersion)
66
+ return false;
67
+ return true;
68
+ });
69
+ if (pending.length === 0) {
70
+ console.log('✅ Database is up to date');
71
+ return;
72
+ }
73
+ console.log(`Applying ${pending.length} pending migrations...`);
74
+ for (const migration of pending) {
75
+ await applyMigration(db, migration);
76
+ }
77
+ console.log('🎉 All migrations completed successfully!');
78
+ }
79
+ export async function getCurrentVersion(db) {
80
+ try {
81
+ const result = await db.execute(sql `
82
+ SELECT MAX(version) as max_version
83
+ FROM schema_migrations
84
+ `);
85
+ return result[0]?.max_version || 0;
86
+ }
87
+ catch {
88
+ return 0;
89
+ }
90
+ }
91
+ export async function needsMigrations(db) {
92
+ const available = await getAvailableMigrations();
93
+ const applied = await getAppliedMigrations(db);
94
+ const maxAvailable = Math.max(...available.map(m => m.version), 0);
95
+ const maxApplied = Math.max(...applied, 0);
96
+ return maxAvailable > maxApplied;
97
+ }
98
+ export async function initializeDatabase(db) {
99
+ console.log('🏗️ Initializing fresh database...');
100
+ await runMigrations(db);
101
+ }
102
+ export async function getMigrationStatus(db) {
103
+ const available = await getAvailableMigrations();
104
+ const current = await getCurrentVersion(db);
105
+ const latest = Math.max(...available.map(m => m.version), 0);
106
+ const pending = available.filter(m => m.version > current).length;
107
+ return {
108
+ current,
109
+ latest,
110
+ pending,
111
+ needsMigration: pending > 0
112
+ };
113
+ }
114
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"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"}