observability-toolkit 1.8.0 → 1.8.4
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 +81 -3
- package/dist/backends/index.d.ts +119 -0
- package/dist/backends/index.d.ts.map +1 -1
- package/dist/backends/index.js +57 -0
- package/dist/backends/index.js.map +1 -1
- package/dist/backends/index.test.d.ts +5 -0
- package/dist/backends/index.test.d.ts.map +1 -0
- package/dist/backends/index.test.js +156 -0
- package/dist/backends/index.test.js.map +1 -0
- package/dist/backends/local-jsonl-boolean-search.test.js +8 -27
- package/dist/backends/local-jsonl-boolean-search.test.js.map +1 -1
- package/dist/backends/local-jsonl-logs.test.d.ts +2 -0
- package/dist/backends/local-jsonl-logs.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-logs.test.js +603 -0
- package/dist/backends/local-jsonl-logs.test.js.map +1 -0
- package/dist/backends/local-jsonl-traces.test.d.ts +2 -0
- package/dist/backends/local-jsonl-traces.test.d.ts.map +1 -0
- package/dist/backends/local-jsonl-traces.test.js +1723 -0
- package/dist/backends/local-jsonl-traces.test.js.map +1 -0
- package/dist/backends/local-jsonl.d.ts +4 -1
- package/dist/backends/local-jsonl.d.ts.map +1 -1
- package/dist/backends/local-jsonl.js +185 -1
- package/dist/backends/local-jsonl.js.map +1 -1
- package/dist/backends/local-jsonl.test.js +723 -46
- package/dist/backends/local-jsonl.test.js.map +1 -1
- package/dist/backends/signoz-api.d.ts +32 -0
- package/dist/backends/signoz-api.d.ts.map +1 -1
- package/dist/backends/signoz-api.js +231 -33
- package/dist/backends/signoz-api.js.map +1 -1
- package/dist/backends/signoz-api.test.js +410 -63
- package/dist/backends/signoz-api.test.js.map +1 -1
- package/dist/lib/constants.d.ts +59 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +252 -6
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/constants.test.js +357 -21
- package/dist/lib/constants.test.js.map +1 -1
- package/dist/lib/edge-cases.test.d.ts +11 -0
- package/dist/lib/edge-cases.test.d.ts.map +1 -0
- package/dist/lib/edge-cases.test.js +634 -0
- package/dist/lib/edge-cases.test.js.map +1 -0
- package/dist/lib/error-sanitizer.d.ts +57 -0
- package/dist/lib/error-sanitizer.d.ts.map +1 -0
- package/dist/lib/error-sanitizer.js +207 -0
- package/dist/lib/error-sanitizer.js.map +1 -0
- package/dist/lib/error-sanitizer.test.d.ts +8 -0
- package/dist/lib/error-sanitizer.test.d.ts.map +1 -0
- package/dist/lib/error-sanitizer.test.js +369 -0
- package/dist/lib/error-sanitizer.test.js.map +1 -0
- package/dist/lib/file-utils.d.ts +134 -0
- package/dist/lib/file-utils.d.ts.map +1 -1
- package/dist/lib/file-utils.js +395 -9
- package/dist/lib/file-utils.js.map +1 -1
- package/dist/lib/file-utils.test.js +444 -3
- package/dist/lib/file-utils.test.js.map +1 -1
- package/dist/lib/indexer.d.ts +9 -1
- package/dist/lib/indexer.d.ts.map +1 -1
- package/dist/lib/indexer.js +51 -2
- package/dist/lib/indexer.js.map +1 -1
- package/dist/lib/indexer.test.js +138 -20
- package/dist/lib/indexer.test.js.map +1 -1
- package/dist/lib/input-validator.d.ts +103 -0
- package/dist/lib/input-validator.d.ts.map +1 -0
- package/dist/lib/input-validator.js +250 -0
- package/dist/lib/input-validator.js.map +1 -0
- package/dist/lib/input-validator.test.d.ts +2 -0
- package/dist/lib/input-validator.test.d.ts.map +1 -0
- package/dist/lib/input-validator.test.js +287 -0
- package/dist/lib/input-validator.test.js.map +1 -0
- package/dist/lib/query-sanitizer.d.ts +143 -0
- package/dist/lib/query-sanitizer.d.ts.map +1 -0
- package/dist/lib/query-sanitizer.js +261 -0
- package/dist/lib/query-sanitizer.js.map +1 -0
- package/dist/lib/query-sanitizer.test.d.ts +5 -0
- package/dist/lib/query-sanitizer.test.d.ts.map +1 -0
- package/dist/lib/query-sanitizer.test.js +400 -0
- package/dist/lib/query-sanitizer.test.js.map +1 -0
- package/dist/lib/server-utils.d.ts +80 -0
- package/dist/lib/server-utils.d.ts.map +1 -0
- package/dist/lib/server-utils.js +141 -0
- package/dist/lib/server-utils.js.map +1 -0
- package/dist/lib/shared-schemas.d.ts +59 -0
- package/dist/lib/shared-schemas.d.ts.map +1 -0
- package/dist/lib/shared-schemas.js +58 -0
- package/dist/lib/shared-schemas.js.map +1 -0
- package/dist/lib/shared-schemas.test.d.ts +5 -0
- package/dist/lib/shared-schemas.test.d.ts.map +1 -0
- package/dist/lib/shared-schemas.test.js +106 -0
- package/dist/lib/shared-schemas.test.js.map +1 -0
- package/dist/lib/toon-encoder.d.ts +21 -0
- package/dist/lib/toon-encoder.d.ts.map +1 -0
- package/dist/lib/toon-encoder.js +46 -0
- package/dist/lib/toon-encoder.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +155 -81
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +363 -0
- package/dist/server.test.js.map +1 -1
- package/dist/test-helpers/env-utils.d.ts +65 -0
- package/dist/test-helpers/env-utils.d.ts.map +1 -0
- package/dist/test-helpers/env-utils.js +94 -0
- package/dist/test-helpers/env-utils.js.map +1 -0
- package/dist/test-helpers/file-utils.d.ts +93 -0
- package/dist/test-helpers/file-utils.d.ts.map +1 -0
- package/dist/test-helpers/file-utils.js +206 -0
- package/dist/test-helpers/file-utils.js.map +1 -0
- package/dist/test-helpers/index.d.ts +10 -0
- package/dist/test-helpers/index.d.ts.map +1 -0
- package/dist/test-helpers/index.js +28 -0
- package/dist/test-helpers/index.js.map +1 -0
- package/dist/test-helpers/mock-backends.d.ts +139 -0
- package/dist/test-helpers/mock-backends.d.ts.map +1 -0
- package/dist/test-helpers/mock-backends.js +227 -0
- package/dist/test-helpers/mock-backends.js.map +1 -0
- package/dist/test-helpers/mock-backends.test.d.ts +5 -0
- package/dist/test-helpers/mock-backends.test.d.ts.map +1 -0
- package/dist/test-helpers/mock-backends.test.js +368 -0
- package/dist/test-helpers/mock-backends.test.js.map +1 -0
- package/dist/test-helpers/schema-validators.d.ts +32 -0
- package/dist/test-helpers/schema-validators.d.ts.map +1 -0
- package/dist/test-helpers/schema-validators.js +125 -0
- package/dist/test-helpers/schema-validators.js.map +1 -0
- package/dist/test-helpers/test-data-builders.d.ts +223 -0
- package/dist/test-helpers/test-data-builders.d.ts.map +1 -0
- package/dist/test-helpers/test-data-builders.js +288 -0
- package/dist/test-helpers/test-data-builders.js.map +1 -0
- package/dist/test-helpers/test-data-builders.test.d.ts +2 -0
- package/dist/test-helpers/test-data-builders.test.d.ts.map +1 -0
- package/dist/test-helpers/test-data-builders.test.js +306 -0
- package/dist/test-helpers/test-data-builders.test.js.map +1 -0
- package/dist/test-helpers/tool-validators.d.ts +28 -0
- package/dist/test-helpers/tool-validators.d.ts.map +1 -0
- package/dist/test-helpers/tool-validators.js +56 -0
- package/dist/test-helpers/tool-validators.js.map +1 -0
- package/dist/tools/context-stats.d.ts +1 -0
- package/dist/tools/context-stats.d.ts.map +1 -1
- package/dist/tools/context-stats.js +9 -5
- package/dist/tools/context-stats.js.map +1 -1
- package/dist/tools/context-stats.test.js +24 -10
- package/dist/tools/context-stats.test.js.map +1 -1
- package/dist/tools/get-trace-url.js +2 -2
- package/dist/tools/get-trace-url.js.map +1 -1
- package/dist/tools/health-check.js +2 -2
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/query-evaluations.d.ts +186 -0
- package/dist/tools/query-evaluations.d.ts.map +1 -0
- package/dist/tools/query-evaluations.js +351 -0
- package/dist/tools/query-evaluations.js.map +1 -0
- package/dist/tools/query-evaluations.test.d.ts +5 -0
- package/dist/tools/query-evaluations.test.d.ts.map +1 -0
- package/dist/tools/query-evaluations.test.js +733 -0
- package/dist/tools/query-evaluations.test.js.map +1 -0
- package/dist/tools/query-llm-events.d.ts +24 -18
- package/dist/tools/query-llm-events.d.ts.map +1 -1
- package/dist/tools/query-llm-events.js +103 -60
- package/dist/tools/query-llm-events.js.map +1 -1
- package/dist/tools/query-llm-events.test.js +271 -9
- package/dist/tools/query-llm-events.test.js.map +1 -1
- package/dist/tools/query-logs.d.ts +28 -20
- package/dist/tools/query-logs.d.ts.map +1 -1
- package/dist/tools/query-logs.js +85 -61
- package/dist/tools/query-logs.js.map +1 -1
- package/dist/tools/query-logs.test.js +74 -145
- package/dist/tools/query-logs.test.js.map +1 -1
- package/dist/tools/query-metrics.d.ts +20 -20
- package/dist/tools/query-metrics.d.ts.map +1 -1
- package/dist/tools/query-metrics.js +109 -61
- package/dist/tools/query-metrics.js.map +1 -1
- package/dist/tools/query-metrics.test.js +26 -61
- package/dist/tools/query-metrics.test.js.map +1 -1
- package/dist/tools/query-traces.d.ts +24 -22
- package/dist/tools/query-traces.d.ts.map +1 -1
- package/dist/tools/query-traces.js +95 -70
- package/dist/tools/query-traces.js.map +1 -1
- package/dist/tools/query-traces.test.js +294 -90
- package/dist/tools/query-traces.test.js.map +1 -1
- package/dist/tools/setup-claudeignore.js +7 -7
- package/dist/tools/setup-claudeignore.js.map +1 -1
- package/dist/tools/setup-claudeignore.test.js +4 -25
- package/dist/tools/setup-claudeignore.test.js.map +1 -1
- package/package.json +3 -4
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickHouse-specific query escaping and input validation
|
|
3
|
+
*
|
|
4
|
+
* Provides security utilities for sanitizing user inputs before
|
|
5
|
+
* including them in ClickHouse queries via SigNoz API.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Dangerous SQL/query patterns that should never appear in user input
|
|
9
|
+
* Case-insensitive matching is used
|
|
10
|
+
*/
|
|
11
|
+
export const DANGEROUS_PATTERNS = [
|
|
12
|
+
'DROP',
|
|
13
|
+
'DELETE',
|
|
14
|
+
'INSERT',
|
|
15
|
+
'UPDATE',
|
|
16
|
+
'ALTER',
|
|
17
|
+
'CREATE',
|
|
18
|
+
'TRUNCATE',
|
|
19
|
+
'--',
|
|
20
|
+
'/*',
|
|
21
|
+
'*/',
|
|
22
|
+
';',
|
|
23
|
+
'UNION',
|
|
24
|
+
'INTO OUTFILE',
|
|
25
|
+
'INTO DUMPFILE',
|
|
26
|
+
'LOAD_FILE',
|
|
27
|
+
'SYSTEM',
|
|
28
|
+
'ATTACH',
|
|
29
|
+
'DETACH',
|
|
30
|
+
'RENAME',
|
|
31
|
+
'OPTIMIZE',
|
|
32
|
+
'GRANT',
|
|
33
|
+
'REVOKE',
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Escape a string value for use in ClickHouse single-quoted strings
|
|
37
|
+
*
|
|
38
|
+
* ClickHouse uses backslash escaping for special characters.
|
|
39
|
+
* @see https://clickhouse.com/docs/en/sql-reference/syntax#string
|
|
40
|
+
*
|
|
41
|
+
* @param value - The string value to escape
|
|
42
|
+
* @returns Escaped string safe for use in single-quoted ClickHouse strings
|
|
43
|
+
*/
|
|
44
|
+
export function escapeClickHouseString(value) {
|
|
45
|
+
return value
|
|
46
|
+
// Escape backslashes first (must be first to avoid double-escaping)
|
|
47
|
+
.replace(/\\/g, '\\\\')
|
|
48
|
+
// Escape single quotes
|
|
49
|
+
.replace(/'/g, "\\'")
|
|
50
|
+
// Escape null bytes
|
|
51
|
+
.replace(/\0/g, '\\0')
|
|
52
|
+
// Escape newlines
|
|
53
|
+
.replace(/\n/g, '\\n')
|
|
54
|
+
// Escape carriage returns
|
|
55
|
+
.replace(/\r/g, '\\r')
|
|
56
|
+
// Escape tabs
|
|
57
|
+
.replace(/\t/g, '\\t');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Escape LIKE wildcard characters for use in ClickHouse LIKE patterns
|
|
61
|
+
*
|
|
62
|
+
* This escapes % and _ which have special meaning in LIKE patterns.
|
|
63
|
+
* Use this when the user's input should be treated as a literal string
|
|
64
|
+
* in a LIKE clause, not as a pattern.
|
|
65
|
+
*
|
|
66
|
+
* @param value - The string value to escape for LIKE
|
|
67
|
+
* @returns Escaped string with LIKE wildcards escaped
|
|
68
|
+
*/
|
|
69
|
+
export function escapeClickHouseLike(value) {
|
|
70
|
+
// First escape backslashes (used as escape character in LIKE)
|
|
71
|
+
// Then escape the LIKE wildcards
|
|
72
|
+
return value
|
|
73
|
+
.replace(/\\/g, '\\\\')
|
|
74
|
+
.replace(/%/g, '\\%')
|
|
75
|
+
.replace(/_/g, '\\_');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Sanitize an identifier (column name, table name, etc.)
|
|
79
|
+
*
|
|
80
|
+
* Only allows alphanumeric characters, underscores, and dots.
|
|
81
|
+
* Removes all other characters.
|
|
82
|
+
*
|
|
83
|
+
* @param name - The identifier to sanitize
|
|
84
|
+
* @returns Sanitized identifier containing only safe characters
|
|
85
|
+
*/
|
|
86
|
+
export function sanitizeIdentifier(name) {
|
|
87
|
+
return name.replace(/[^a-zA-Z0-9_.]/g, '');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Maximum length for query input validation
|
|
91
|
+
* Prevents performance issues with very long inputs
|
|
92
|
+
*/
|
|
93
|
+
export const MAX_QUERY_INPUT_LENGTH = 10000;
|
|
94
|
+
/**
|
|
95
|
+
* Special character patterns as array for index-based iteration
|
|
96
|
+
* Array iteration with for-loop is faster than Set iteration with for...of
|
|
97
|
+
* (avoids iterator object creation overhead)
|
|
98
|
+
*/
|
|
99
|
+
const SPECIAL_CHAR_PATTERNS = ['--', '/*', '*/', ';'];
|
|
100
|
+
/**
|
|
101
|
+
* SQL keywords from DANGEROUS_PATTERNS (excluding special chars)
|
|
102
|
+
* Pre-filtered at module load time
|
|
103
|
+
*/
|
|
104
|
+
const SQL_KEYWORDS = DANGEROUS_PATTERNS.filter(p => !SPECIAL_CHAR_PATTERNS.includes(p));
|
|
105
|
+
/**
|
|
106
|
+
* Escape regex metacharacters in a string for safe use in RegExp constructor
|
|
107
|
+
* Prevents ReDoS attacks when using user-influenced patterns
|
|
108
|
+
*/
|
|
109
|
+
function escapeRegexPattern(pattern) {
|
|
110
|
+
return pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Validate that escaped patterns don't contain unescaped alternation chars
|
|
114
|
+
* Prevents regex injection if patterns are incorrectly added to SQL_KEYWORDS
|
|
115
|
+
*/
|
|
116
|
+
function validateEscapedPatterns(escaped) {
|
|
117
|
+
for (const pattern of escaped) {
|
|
118
|
+
// After escaping, only \\| should exist (escaped pipe), not bare |
|
|
119
|
+
if (/(?<!\\)\|/.test(pattern)) {
|
|
120
|
+
throw new Error(`[SECURITY] Invalid pattern in SQL_KEYWORDS after escaping: contains unescaped alternation`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Pre-compiled regex for all SQL keywords with word boundaries
|
|
126
|
+
* Combined into single alternation pattern for O(1) matching
|
|
127
|
+
* Example: /\b(DROP|DELETE|INSERT|...)\b/i
|
|
128
|
+
*
|
|
129
|
+
* Security: Validates escaped patterns to prevent injection via malformed SQL_KEYWORDS
|
|
130
|
+
*/
|
|
131
|
+
const SQL_KEYWORDS_REGEX = (() => {
|
|
132
|
+
const escaped = SQL_KEYWORDS.map(escapeRegexPattern);
|
|
133
|
+
validateEscapedPatterns(escaped);
|
|
134
|
+
return new RegExp(`\\b(${escaped.join('|')})\\b`, 'i');
|
|
135
|
+
})();
|
|
136
|
+
/**
|
|
137
|
+
* Check if a string contains any dangerous SQL patterns
|
|
138
|
+
*
|
|
139
|
+
* Uses case-insensitive matching and word boundary detection
|
|
140
|
+
* for most patterns to reduce false positives.
|
|
141
|
+
*
|
|
142
|
+
* Performance: O(1) Set lookup for special chars + O(1) pre-compiled regex
|
|
143
|
+
* for SQL keywords (previously O(n) with n=22 patterns).
|
|
144
|
+
*
|
|
145
|
+
* Defense in depth: Rejects inputs exceeding MAX_QUERY_INPUT_LENGTH
|
|
146
|
+
* to prevent performance issues with very long strings.
|
|
147
|
+
*
|
|
148
|
+
* Security: Uses String() to freeze input as primitive, preventing TOCTOU
|
|
149
|
+
* race conditions with Proxy objects or getter-modified values.
|
|
150
|
+
*
|
|
151
|
+
* @param input - The input string to check
|
|
152
|
+
* @returns true if dangerous pattern found, false otherwise
|
|
153
|
+
*/
|
|
154
|
+
export function containsDangerousPattern(input) {
|
|
155
|
+
// Security: Freeze input as string primitive to prevent TOCTOU attacks
|
|
156
|
+
// where a Proxy or getter could return different values on each access
|
|
157
|
+
const frozenInput = String(input);
|
|
158
|
+
// Defense in depth: reject excessively long inputs
|
|
159
|
+
if (frozenInput.length > MAX_QUERY_INPUT_LENGTH) {
|
|
160
|
+
console.warn(`[SECURITY] Input length ${frozenInput.length} exceeds maximum ${MAX_QUERY_INPUT_LENGTH}`);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
// O(1) check for special character patterns via string.includes
|
|
164
|
+
// Using index-based loop to avoid iterator object creation overhead
|
|
165
|
+
for (let i = 0; i < SPECIAL_CHAR_PATTERNS.length; i++) {
|
|
166
|
+
if (frozenInput.includes(SPECIAL_CHAR_PATTERNS[i])) {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// O(1) check for SQL keywords via pre-compiled combined regex
|
|
171
|
+
return SQL_KEYWORDS_REGEX.test(frozenInput);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Validate that user input does not contain dangerous patterns
|
|
175
|
+
*
|
|
176
|
+
* Throws an error if dangerous patterns are detected, including
|
|
177
|
+
* the field name for better error messages.
|
|
178
|
+
*
|
|
179
|
+
* @param input - The input string to validate
|
|
180
|
+
* @param fieldName - Name of the field being validated (for error messages)
|
|
181
|
+
* @throws Error if dangerous pattern is found
|
|
182
|
+
*/
|
|
183
|
+
export function validateQueryInput(input, fieldName) {
|
|
184
|
+
if (containsDangerousPattern(input)) {
|
|
185
|
+
throw new Error(`Invalid ${fieldName}: contains potentially dangerous SQL pattern`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Composable value sanitizer with configurable validation and escaping
|
|
190
|
+
*
|
|
191
|
+
* Provides flexible control over which operations to apply:
|
|
192
|
+
* - validate: Check for dangerous SQL patterns
|
|
193
|
+
* - escapeString: Escape for ClickHouse string context
|
|
194
|
+
* - escapeLike: Escape LIKE wildcards (%, _)
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* // Validate only (no escaping)
|
|
198
|
+
* sanitizeValue(input, { escapeString: false, fieldName: 'search' });
|
|
199
|
+
*
|
|
200
|
+
* // Escape only (no validation) - use when input is already trusted
|
|
201
|
+
* sanitizeValue(input, { validate: false });
|
|
202
|
+
*
|
|
203
|
+
* // Full sanitization for LIKE clause
|
|
204
|
+
* sanitizeValue(input, { escapeLike: true, fieldName: 'search' });
|
|
205
|
+
*
|
|
206
|
+
* @param value - The value to sanitize
|
|
207
|
+
* @param options - Sanitization options
|
|
208
|
+
* @returns Sanitized string
|
|
209
|
+
* @throws Error if validation enabled and dangerous pattern found
|
|
210
|
+
*/
|
|
211
|
+
export function sanitizeValue(value, options = {}) {
|
|
212
|
+
const { validate = true, escapeString = true, escapeLike = false, fieldName = 'value', allowEmpty = true, } = options;
|
|
213
|
+
// Step 0: Check for empty string if not allowed
|
|
214
|
+
if (!allowEmpty && value === '') {
|
|
215
|
+
throw new Error(`Invalid ${fieldName}: empty string not allowed`);
|
|
216
|
+
}
|
|
217
|
+
// Step 1: Validate if enabled
|
|
218
|
+
if (validate) {
|
|
219
|
+
validateQueryInput(value, fieldName);
|
|
220
|
+
}
|
|
221
|
+
// Step 2: Apply escaping pipeline
|
|
222
|
+
let result = value;
|
|
223
|
+
if (escapeLike) {
|
|
224
|
+
result = escapeClickHouseLike(result);
|
|
225
|
+
}
|
|
226
|
+
if (escapeString) {
|
|
227
|
+
result = escapeClickHouseString(result);
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Escape and validate a string value for use in WHERE clause conditions
|
|
233
|
+
*
|
|
234
|
+
* @deprecated Use sanitizeValue() for more flexibility:
|
|
235
|
+
* sanitizeValue(value, { fieldName }) - same behavior
|
|
236
|
+
* sanitizeValue(value, { validate: false }) - escape only
|
|
237
|
+
*
|
|
238
|
+
* @param value - The value to escape
|
|
239
|
+
* @param fieldName - Name of the field (for error messages)
|
|
240
|
+
* @returns Escaped string safe for ClickHouse queries
|
|
241
|
+
* @throws Error if dangerous pattern is found
|
|
242
|
+
*/
|
|
243
|
+
export function escapeFilterValueSafe(value, fieldName) {
|
|
244
|
+
return sanitizeValue(value, { fieldName });
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Escape and validate a value for use in LIKE clauses
|
|
248
|
+
*
|
|
249
|
+
* @deprecated Use sanitizeValue() for more flexibility:
|
|
250
|
+
* sanitizeValue(value, { escapeLike: true, fieldName }) - same behavior
|
|
251
|
+
* sanitizeValue(value, { escapeLike: true, validate: false }) - escape only
|
|
252
|
+
*
|
|
253
|
+
* @param value - The value to escape
|
|
254
|
+
* @param fieldName - Name of the field (for error messages)
|
|
255
|
+
* @returns Escaped string safe for ClickHouse LIKE clauses
|
|
256
|
+
* @throws Error if dangerous pattern is found
|
|
257
|
+
*/
|
|
258
|
+
export function escapeLikeValueSafe(value, fieldName) {
|
|
259
|
+
return sanitizeValue(value, { escapeLike: true, fieldName });
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=query-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-sanitizer.js","sourceRoot":"","sources":["../../src/lib/query-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-sanitizer.test.d.ts","sourceRoot":"","sources":["../../src/lib/query-sanitizer.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|