@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,381 @@
1
+ const DEFAULT_CONFIG = {
2
+ maxRiskScore: 70,
3
+ maxComplexityScore: 80,
4
+ maxEstimatedCost: 1000000,
5
+ maxResultSetSize: 10000,
6
+ enablePerformanceAnalysis: true,
7
+ enableSecurityAnalysis: true,
8
+ customRiskFactors: []
9
+ };
10
+ const DEFAULT_RISK_FACTORS = [
11
+ {
12
+ pattern: /union\s+all|union\s+select/i,
13
+ riskScore: 30,
14
+ description: 'UNION operations can be expensive and may indicate injection attempts',
15
+ blocking: false
16
+ },
17
+ {
18
+ pattern: /\bor\s+1\s*=\s*1\b/i,
19
+ riskScore: 90,
20
+ description: 'Classic SQL injection pattern detected',
21
+ blocking: true
22
+ },
23
+ {
24
+ pattern: /\bor\s+\'.*?\'\s*=\s*\'.*?\'/i,
25
+ riskScore: 85,
26
+ description: 'Potential SQL injection with string comparison',
27
+ blocking: true
28
+ },
29
+ {
30
+ pattern: /;\s*drop\s+table/i,
31
+ riskScore: 100,
32
+ description: 'SQL injection attempt to drop table',
33
+ blocking: true
34
+ },
35
+ {
36
+ pattern: /;\s*delete\s+from/i,
37
+ riskScore: 100,
38
+ description: 'SQL injection attempt to delete data',
39
+ blocking: true
40
+ },
41
+ {
42
+ pattern: /select\s+\*\s+from\s+information_schema/i,
43
+ riskScore: 40,
44
+ description: 'Information schema access - potentially sensitive',
45
+ blocking: false
46
+ },
47
+ {
48
+ pattern: /select\s+.*\s+from\s+.*\s+where\s+1\s*=\s*1/i,
49
+ riskScore: 70,
50
+ description: 'Suspicious WHERE clause that always evaluates to true',
51
+ blocking: false
52
+ },
53
+ {
54
+ pattern: /\/\*.*?\*\//,
55
+ riskScore: 20,
56
+ description: 'SQL comments detected - review for injection attempts',
57
+ blocking: false
58
+ },
59
+ {
60
+ pattern: /--.*$/m,
61
+ riskScore: 25,
62
+ description: 'SQL line comments detected - review for injection attempts',
63
+ blocking: false
64
+ }
65
+ ];
66
+ class SimpleSQLParser {
67
+ static parseQuery(sql) {
68
+ const normalizedSql = sql.trim().toLowerCase();
69
+ const queryType = this.getQueryType(normalizedSql);
70
+ const tableCount = this.countTables(normalizedSql);
71
+ const joinCount = this.countJoins(normalizedSql);
72
+ const hasSubqueries = /\(\s*select\b/.test(normalizedSql);
73
+ const hasAggregations = /\b(count|sum|avg|max|min|group_concat)\s*\(/.test(normalizedSql);
74
+ const hasWildcards = /select\s+\*\s+from\b/.test(normalizedSql);
75
+ const hasWhere = /\bwhere\b/.test(normalizedSql);
76
+ const hasOrderBy = /\border\s+by\b/.test(normalizedSql);
77
+ const hasGroupBy = /\bgroup\s+by\b/.test(normalizedSql);
78
+ const hasHaving = /\bhaving\b/.test(normalizedSql);
79
+ const limitMatch = /\blimit\s+(\d+)/.exec(normalizedSql);
80
+ const hasLimit = !!limitMatch;
81
+ const limitValue = limitMatch?.[1] ? parseInt(limitMatch[1], 10) : undefined;
82
+ const estimatedResultSize = this.estimateResultSize(tableCount, hasWhere, hasLimit, limitValue);
83
+ return {
84
+ queryType,
85
+ tableCount,
86
+ joinCount,
87
+ hasSubqueries,
88
+ hasAggregations,
89
+ hasWildcards,
90
+ hasLimit,
91
+ limitValue,
92
+ hasWhere,
93
+ hasOrderBy,
94
+ hasGroupBy,
95
+ hasHaving,
96
+ estimatedResultSize
97
+ };
98
+ }
99
+ static getQueryType(sql) {
100
+ if (sql.startsWith('select'))
101
+ return 'SELECT';
102
+ if (sql.startsWith('insert'))
103
+ return 'INSERT';
104
+ if (sql.startsWith('update'))
105
+ return 'UPDATE';
106
+ if (sql.startsWith('delete'))
107
+ return 'DELETE';
108
+ if (sql.startsWith('create'))
109
+ return 'CREATE';
110
+ if (sql.startsWith('drop'))
111
+ return 'DROP';
112
+ if (sql.startsWith('alter'))
113
+ return 'ALTER';
114
+ if (sql.startsWith('show'))
115
+ return 'SHOW';
116
+ if (sql.startsWith('describe') || sql.startsWith('desc'))
117
+ return 'DESCRIBE';
118
+ return 'UNKNOWN';
119
+ }
120
+ static countTables(sql) {
121
+ const fromMatches = sql.match(/\bfrom\s+[\w\.]+/g) || [];
122
+ const joinMatches = sql.match(/\bjoin\s+[\w\.]+/g) || [];
123
+ return fromMatches.length + joinMatches.length;
124
+ }
125
+ static countJoins(sql) {
126
+ const joinMatches = sql.match(/\b(inner\s+join|left\s+join|right\s+join|full\s+join|join)\b/g) || [];
127
+ return joinMatches.length;
128
+ }
129
+ static estimateResultSize(tableCount, hasWhere, hasLimit, limitValue) {
130
+ if (hasLimit && limitValue) {
131
+ return Math.min(limitValue, 10000);
132
+ }
133
+ let estimate = Math.pow(1000, tableCount);
134
+ if (hasWhere) {
135
+ estimate = Math.floor(estimate * 0.1);
136
+ }
137
+ return Math.min(estimate, 100000);
138
+ }
139
+ }
140
+ export class QueryComplexityAnalyzer {
141
+ config;
142
+ riskFactors;
143
+ constructor(config = {}) {
144
+ this.config = { ...DEFAULT_CONFIG, ...config };
145
+ this.riskFactors = [
146
+ ...DEFAULT_RISK_FACTORS,
147
+ ...(config.customRiskFactors || [])
148
+ ];
149
+ }
150
+ analyzeQuery(sql, tableMetadata = []) {
151
+ const details = SimpleSQLParser.parseQuery(sql);
152
+ const complexityScore = this.calculateComplexityScore(details, tableMetadata);
153
+ const riskScore = this.calculateRiskScore(sql, details);
154
+ const estimatedCost = this.calculateEstimatedCost(details, tableMetadata);
155
+ const securityWarnings = this.generateSecurityWarnings(sql, details);
156
+ const performanceWarnings = this.generatePerformanceWarnings(details, tableMetadata);
157
+ const recommendations = this.generateRecommendations(details, securityWarnings, performanceWarnings);
158
+ const allowExecution = this.shouldAllowExecution(sql, riskScore, complexityScore, estimatedCost, details);
159
+ return {
160
+ allowExecution,
161
+ riskScore,
162
+ complexityScore,
163
+ estimatedCost,
164
+ securityWarnings,
165
+ performanceWarnings,
166
+ recommendations,
167
+ details
168
+ };
169
+ }
170
+ calculateComplexityScore(details, _tableMetadata) {
171
+ let score = 0;
172
+ switch (details.queryType) {
173
+ case 'SELECT':
174
+ score += 5;
175
+ break;
176
+ case 'INSERT':
177
+ score += 15;
178
+ break;
179
+ case 'UPDATE':
180
+ score += 20;
181
+ break;
182
+ case 'DELETE':
183
+ score += 25;
184
+ break;
185
+ case 'CREATE':
186
+ score += 30;
187
+ break;
188
+ case 'DROP':
189
+ score += 50;
190
+ break;
191
+ case 'ALTER':
192
+ score += 40;
193
+ break;
194
+ default: score += 10;
195
+ }
196
+ score += Math.min(details.tableCount * 10, 30);
197
+ score += Math.min(details.joinCount * 15, 40);
198
+ if (details.hasSubqueries)
199
+ score += 20;
200
+ if (details.hasAggregations)
201
+ score += 10;
202
+ if (details.hasWildcards)
203
+ score += 15;
204
+ if (details.tableCount > 1 && !details.hasWhere)
205
+ score += 25;
206
+ if (details.estimatedResultSize > 1000)
207
+ score += 10;
208
+ if (details.estimatedResultSize > 10000)
209
+ score += 20;
210
+ if (!details.hasLimit && details.estimatedResultSize > 1000)
211
+ score += 15;
212
+ return Math.min(score, 100);
213
+ }
214
+ calculateRiskScore(sql, details) {
215
+ let score = 0;
216
+ if (!this.config.enableSecurityAnalysis) {
217
+ return 0;
218
+ }
219
+ for (const factor of this.riskFactors) {
220
+ if (factor.pattern.test(sql)) {
221
+ score += factor.riskScore;
222
+ }
223
+ }
224
+ if (details.queryType !== 'SELECT' && details.queryType !== 'SHOW' && details.queryType !== 'DESCRIBE') {
225
+ score += 30;
226
+ }
227
+ const statementCount = sql.split(';').filter(s => s.trim()).length;
228
+ if (statementCount > 1) {
229
+ score += 40;
230
+ }
231
+ return Math.min(score, 100);
232
+ }
233
+ calculateEstimatedCost(details, tableMetadata) {
234
+ let cost = 1;
235
+ cost += details.estimatedResultSize * 0.1;
236
+ if (details.joinCount > 0) {
237
+ cost *= Math.pow(10, details.joinCount);
238
+ }
239
+ for (let i = 0; i < details.tableCount; i++) {
240
+ const metadata = tableMetadata[i];
241
+ if (metadata) {
242
+ cost += metadata.estimatedRows * 0.01;
243
+ }
244
+ else {
245
+ cost += 10000;
246
+ }
247
+ }
248
+ if (details.hasSubqueries) {
249
+ cost *= 5;
250
+ }
251
+ if (details.hasAggregations) {
252
+ cost *= 2;
253
+ }
254
+ if (details.hasOrderBy && !details.hasLimit) {
255
+ cost *= 3;
256
+ }
257
+ return Math.floor(cost);
258
+ }
259
+ generateSecurityWarnings(sql, details) {
260
+ const warnings = [];
261
+ if (!this.config.enableSecurityAnalysis) {
262
+ return warnings;
263
+ }
264
+ for (const factor of this.riskFactors) {
265
+ if (factor.pattern.test(sql)) {
266
+ warnings.push(factor.description);
267
+ }
268
+ }
269
+ if (details.queryType !== 'SELECT' && details.queryType !== 'SHOW' && details.queryType !== 'DESCRIBE') {
270
+ warnings.push('Non-read operation detected - ensure proper authorization');
271
+ }
272
+ if (sql.includes(';') && sql.split(';').filter(s => s.trim()).length > 1) {
273
+ warnings.push('Multiple SQL statements detected - potential injection risk');
274
+ }
275
+ if (details.hasWildcards && details.tableCount > 0) {
276
+ warnings.push('SELECT * detected - may expose sensitive columns');
277
+ }
278
+ return warnings;
279
+ }
280
+ generatePerformanceWarnings(details, tableMetadata) {
281
+ const warnings = [];
282
+ if (!this.config.enablePerformanceAnalysis) {
283
+ return warnings;
284
+ }
285
+ if (details.estimatedResultSize > 1000 && !details.hasLimit) {
286
+ warnings.push(`Large result set estimated (${details.estimatedResultSize}) without LIMIT clause`);
287
+ }
288
+ if (details.joinCount > 1 && !details.hasWhere) {
289
+ warnings.push('Multiple JOINs without WHERE clause may produce Cartesian product');
290
+ }
291
+ if (details.hasWildcards && tableMetadata.some(t => t.estimatedRows > 10000)) {
292
+ warnings.push('SELECT * on large table(s) - consider selecting specific columns');
293
+ }
294
+ if (details.hasOrderBy && !details.hasLimit && details.estimatedResultSize > 1000) {
295
+ warnings.push('ORDER BY without LIMIT on large result set - consider adding LIMIT');
296
+ }
297
+ if (details.hasSubqueries) {
298
+ warnings.push('Subqueries detected - consider using JOINs for better performance');
299
+ }
300
+ return warnings;
301
+ }
302
+ generateRecommendations(details, securityWarnings, performanceWarnings) {
303
+ const recommendations = [];
304
+ if (securityWarnings.length > 0) {
305
+ recommendations.push('Review security warnings and validate query source');
306
+ }
307
+ if (details.hasWildcards) {
308
+ recommendations.push('Replace SELECT * with specific column names');
309
+ }
310
+ if (!details.hasLimit && details.estimatedResultSize > 1000) {
311
+ recommendations.push('Add LIMIT clause to prevent large result sets');
312
+ }
313
+ if (details.joinCount > 0 && !details.hasWhere) {
314
+ recommendations.push('Add WHERE clause to filter results and improve performance');
315
+ }
316
+ if (details.hasOrderBy && details.estimatedResultSize > 1000) {
317
+ recommendations.push('Consider adding indexes on ORDER BY columns');
318
+ }
319
+ if (details.hasSubqueries) {
320
+ recommendations.push('Consider rewriting subqueries as JOINs');
321
+ }
322
+ if (performanceWarnings.length > 2) {
323
+ recommendations.push('Query complexity is high - consider breaking into smaller queries');
324
+ }
325
+ return recommendations;
326
+ }
327
+ shouldAllowExecution(sql, riskScore, complexityScore, estimatedCost, details) {
328
+ if (riskScore > this.config.maxRiskScore) {
329
+ return false;
330
+ }
331
+ if (complexityScore > this.config.maxComplexityScore) {
332
+ return false;
333
+ }
334
+ if (estimatedCost > this.config.maxEstimatedCost) {
335
+ return false;
336
+ }
337
+ if (details.estimatedResultSize > this.config.maxResultSetSize) {
338
+ return false;
339
+ }
340
+ for (const factor of this.riskFactors) {
341
+ if (factor.blocking && factor.pattern.test(sql)) {
342
+ return false;
343
+ }
344
+ }
345
+ return true;
346
+ }
347
+ updateConfig(config) {
348
+ this.config = { ...this.config, ...config };
349
+ }
350
+ addRiskFactor(factor) {
351
+ this.riskFactors.push(factor);
352
+ }
353
+ getConfig() {
354
+ return { ...this.config };
355
+ }
356
+ }
357
+ export function createQueryAnalyzer(config) {
358
+ return new QueryComplexityAnalyzer(config);
359
+ }
360
+ export function createSecurityAnalyzer() {
361
+ return new QueryComplexityAnalyzer({
362
+ maxRiskScore: 30,
363
+ maxComplexityScore: 50,
364
+ maxEstimatedCost: 100000,
365
+ maxResultSetSize: 1000,
366
+ enableSecurityAnalysis: true,
367
+ enablePerformanceAnalysis: false
368
+ });
369
+ }
370
+ export function createPerformanceAnalyzer() {
371
+ return new QueryComplexityAnalyzer({
372
+ maxRiskScore: 100,
373
+ maxComplexityScore: 60,
374
+ maxEstimatedCost: 500000,
375
+ maxResultSetSize: 5000,
376
+ enableSecurityAnalysis: false,
377
+ enablePerformanceAnalysis: true
378
+ });
379
+ }
380
+ export const defaultQueryAnalyzer = createQueryAnalyzer();
381
+ //# sourceMappingURL=query-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-analyzer.js","sourceRoot":"","sources":["../../src/security/query-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { StructuredLogger } from '../observability/logger.js';
2
+ import type { MetricsCollector } from '../observability/metrics.js';
3
+ export interface CachedTableSchema {
4
+ tableName: string;
5
+ database: string;
6
+ columns: CachedColumnInfo[];
7
+ indexes: CachedIndexInfo[];
8
+ estimatedRows: number;
9
+ sizeBytes?: number;
10
+ cachedAt: Date;
11
+ expiresAt: Date;
12
+ structureHash: string;
13
+ }
14
+ export interface CachedColumnInfo {
15
+ name: string;
16
+ type: string;
17
+ nullable: boolean;
18
+ indexed: boolean;
19
+ isPrimaryKey: boolean;
20
+ foreignKey?: {
21
+ referencedTable: string;
22
+ referencedColumn: string;
23
+ };
24
+ estimatedCardinality?: number;
25
+ }
26
+ export interface CachedIndexInfo {
27
+ name: string;
28
+ columns: string[];
29
+ unique: boolean;
30
+ type: string;
31
+ isPrimary: boolean;
32
+ sizeBytes?: number;
33
+ }
34
+ export interface CacheStats {
35
+ totalEntries: number;
36
+ hits: number;
37
+ misses: number;
38
+ hitRate: number;
39
+ evictions: number;
40
+ memoryUsage: number;
41
+ averageAge: number;
42
+ lastResetTime: Date;
43
+ }
44
+ export interface SchemaCacheConfig {
45
+ defaultTTL: number;
46
+ maxEntries: number;
47
+ cleanupInterval: number;
48
+ enableAutoRefresh: boolean;
49
+ autoRefreshThreshold: number;
50
+ enableCompression: boolean;
51
+ enableStats: boolean;
52
+ logger?: StructuredLogger;
53
+ metrics?: MetricsCollector;
54
+ }
55
+ export declare class SchemaCache {
56
+ private readonly cache;
57
+ private readonly config;
58
+ private readonly logger;
59
+ private cleanupTimer?;
60
+ private stats;
61
+ constructor(config?: Partial<SchemaCacheConfig>);
62
+ get(database: string, tableName: string): CachedTableSchema | null;
63
+ set(schema: Omit<CachedTableSchema, 'cachedAt' | 'expiresAt'>): void;
64
+ delete(database: string, tableName: string): boolean;
65
+ has(database: string, tableName: string): boolean;
66
+ getEntriesNeedingRefresh(): {
67
+ database: string;
68
+ tableName: string;
69
+ }[];
70
+ markAsRefreshed(database: string, tableName: string): void;
71
+ getTablesForDatabase(database: string): string[];
72
+ clear(): void;
73
+ clearExpired(): number;
74
+ getStats(): CacheStats;
75
+ resetStats(): void;
76
+ stop(): void;
77
+ export(): CachedTableSchema[];
78
+ import(schemas: CachedTableSchema[]): number;
79
+ private makeKey;
80
+ private parseKey;
81
+ private recordHit;
82
+ private recordMiss;
83
+ private updateHitRate;
84
+ private evictLRU;
85
+ private updateStats;
86
+ private estimateMemoryUsage;
87
+ private calculateAverageAge;
88
+ private startCleanupTimer;
89
+ }
90
+ export declare function generateStructureHash(columns: CachedColumnInfo[], indexes: CachedIndexInfo[]): string;
91
+ export declare function createSchemaCache(config?: Partial<SchemaCacheConfig>): SchemaCache;
92
+ export declare function createHighCapacityCache(): SchemaCache;
93
+ export declare function createFastCache(): SchemaCache;
94
+ export declare const defaultSchemaCache: SchemaCache;
95
+ //# sourceMappingURL=schema-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-cache.d.ts","sourceRoot":"","sources":["../../src/security/schema-cache.ts"],"names":[],"mappings":"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"}