@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.
- package/LICENSE +21 -0
- package/README.md +644 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +350 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/connectors/base-connector.d.ts +62 -0
- package/dist/connectors/base-connector.d.ts.map +1 -0
- package/dist/connectors/base-connector.js +549 -0
- package/dist/connectors/base-connector.js.map +1 -0
- package/dist/connectors/bigquery.d.ts +38 -0
- package/dist/connectors/bigquery.d.ts.map +1 -0
- package/dist/connectors/bigquery.js +406 -0
- package/dist/connectors/bigquery.js.map +1 -0
- package/dist/connectors/duckdb.d.ts +36 -0
- package/dist/connectors/duckdb.d.ts.map +1 -0
- package/dist/connectors/duckdb.js +364 -0
- package/dist/connectors/duckdb.js.map +1 -0
- package/dist/connectors/index.d.ts +7 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +7 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/mysql.d.ts +32 -0
- package/dist/connectors/mysql.d.ts.map +1 -0
- package/dist/connectors/mysql.js +348 -0
- package/dist/connectors/mysql.js.map +1 -0
- package/dist/connectors/postgres.d.ts +31 -0
- package/dist/connectors/postgres.d.ts.map +1 -0
- package/dist/connectors/postgres.js +326 -0
- package/dist/connectors/postgres.js.map +1 -0
- package/dist/connectors/redshift.d.ts +32 -0
- package/dist/connectors/redshift.d.ts.map +1 -0
- package/dist/connectors/redshift.js +366 -0
- package/dist/connectors/redshift.js.map +1 -0
- package/dist/connectors/snowflake.d.ts +43 -0
- package/dist/connectors/snowflake.d.ts.map +1 -0
- package/dist/connectors/snowflake.js +442 -0
- package/dist/connectors/snowflake.js.map +1 -0
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +12 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +114 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema.d.ts +2053 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +164 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/errors/debug-factory.d.ts +23 -0
- package/dist/errors/debug-factory.d.ts.map +1 -0
- package/dist/errors/debug-factory.js +149 -0
- package/dist/errors/debug-factory.js.map +1 -0
- package/dist/errors/index.d.ts +119 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +341 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata/duckdb-storage.d.ts +31 -0
- package/dist/metadata/duckdb-storage.d.ts.map +1 -0
- package/dist/metadata/duckdb-storage.js +230 -0
- package/dist/metadata/duckdb-storage.js.map +1 -0
- package/dist/metadata/factory.d.ts +4 -0
- package/dist/metadata/factory.d.ts.map +1 -0
- package/dist/metadata/factory.js +23 -0
- package/dist/metadata/factory.js.map +1 -0
- package/dist/metadata/index.d.ts +6 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +4 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/interface.d.ts +26 -0
- package/dist/metadata/interface.d.ts.map +1 -0
- package/dist/metadata/interface.js +2 -0
- package/dist/metadata/interface.js.map +1 -0
- package/dist/metadata/postgresql-storage.d.ts +32 -0
- package/dist/metadata/postgresql-storage.d.ts.map +1 -0
- package/dist/metadata/postgresql-storage.js +242 -0
- package/dist/metadata/postgresql-storage.js.map +1 -0
- package/dist/metadata/schema-config.d.ts +30 -0
- package/dist/metadata/schema-config.d.ts.map +1 -0
- package/dist/metadata/schema-config.js +94 -0
- package/dist/metadata/schema-config.js.map +1 -0
- package/dist/metadata/types.d.ts +35 -0
- package/dist/metadata/types.d.ts.map +1 -0
- package/dist/metadata/types.js +2 -0
- package/dist/metadata/types.js.map +1 -0
- package/dist/monitor/baseline-calculator.d.ts +30 -0
- package/dist/monitor/baseline-calculator.d.ts.map +1 -0
- package/dist/monitor/baseline-calculator.js +192 -0
- package/dist/monitor/baseline-calculator.js.map +1 -0
- package/dist/monitor/baseline-config.d.ts +37 -0
- package/dist/monitor/baseline-config.d.ts.map +1 -0
- package/dist/monitor/baseline-config.js +156 -0
- package/dist/monitor/baseline-config.js.map +1 -0
- package/dist/monitor/freshness.d.ts +5 -0
- package/dist/monitor/freshness.d.ts.map +1 -0
- package/dist/monitor/freshness.js +239 -0
- package/dist/monitor/freshness.js.map +1 -0
- package/dist/monitor/index.d.ts +5 -0
- package/dist/monitor/index.d.ts.map +1 -0
- package/dist/monitor/index.js +5 -0
- package/dist/monitor/index.js.map +1 -0
- package/dist/monitor/schema-baseline.d.ts +22 -0
- package/dist/monitor/schema-baseline.d.ts.map +1 -0
- package/dist/monitor/schema-baseline.js +211 -0
- package/dist/monitor/schema-baseline.js.map +1 -0
- package/dist/monitor/schema-changes.d.ts +5 -0
- package/dist/monitor/schema-changes.d.ts.map +1 -0
- package/dist/monitor/schema-changes.js +289 -0
- package/dist/monitor/schema-changes.js.map +1 -0
- package/dist/monitor/volume.d.ts +5 -0
- package/dist/monitor/volume.d.ts.map +1 -0
- package/dist/monitor/volume.js +262 -0
- package/dist/monitor/volume.js.map +1 -0
- package/dist/observability/logger.d.ts +63 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +282 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +106 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +441 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/query-analyzer.js +526 -0
- package/dist/resilience/circuit-breaker.d.ts +94 -0
- package/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/resilience/circuit-breaker.js +379 -0
- package/dist/resilience/circuit-breaker.js.map +1 -0
- package/dist/resilience/index.d.ts +7 -0
- package/dist/resilience/index.d.ts.map +1 -0
- package/dist/resilience/index.js +7 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/resilience/retry-policy.d.ts +87 -0
- package/dist/resilience/retry-policy.d.ts.map +1 -0
- package/dist/resilience/retry-policy.js +423 -0
- package/dist/resilience/retry-policy.js.map +1 -0
- package/dist/resilience/timeout-manager.d.ts +97 -0
- package/dist/resilience/timeout-manager.d.ts.map +1 -0
- package/dist/resilience/timeout-manager.js +339 -0
- package/dist/resilience/timeout-manager.js.map +1 -0
- package/dist/security/query-analyzer.d.ts +82 -0
- package/dist/security/query-analyzer.d.ts.map +1 -0
- package/dist/security/query-analyzer.js +381 -0
- package/dist/security/query-analyzer.js.map +1 -0
- package/dist/security/schema-cache.d.ts +95 -0
- package/dist/security/schema-cache.d.ts.map +1 -0
- package/dist/security/schema-cache.js +344 -0
- package/dist/security/schema-cache.js.map +1 -0
- package/dist/types/connector.d.ts +68 -0
- package/dist/types/connector.d.ts.map +1 -0
- package/dist/types/connector.js +26 -0
- package/dist/types/connector.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/index.d.ts +7 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/runtime-validator.d.ts +70 -0
- package/dist/validation/runtime-validator.d.ts.map +1 -0
- package/dist/validation/runtime-validator.js +206 -0
- package/dist/validation/runtime-validator.js.map +1 -0
- package/dist/validation/sanitizers.d.ts +56 -0
- package/dist/validation/sanitizers.d.ts.map +1 -0
- package/dist/validation/sanitizers.js +264 -0
- package/dist/validation/sanitizers.js.map +1 -0
- package/dist/validation/schemas.d.ts +224 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +263 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/validators/index.d.ts +18 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +209 -0
- package/dist/validators/index.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const SQL_RESERVED_KEYWORDS = [
|
|
3
|
+
'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'DROP', 'ALTER', 'CREATE',
|
|
4
|
+
'TABLE', 'FROM', 'WHERE', 'AND', 'OR', 'NOT', 'NULL', 'TRUE', 'FALSE',
|
|
5
|
+
'COUNT', 'MAX', 'MIN', 'SUM', 'AVG', 'DISTINCT', 'ORDER', 'GROUP', 'BY',
|
|
6
|
+
'EXEC', 'EXECUTE', 'TRUNCATE', 'GRANT', 'REVOKE', 'UNION', 'MERGE',
|
|
7
|
+
'CALL', 'DECLARE', 'SET', 'USE', 'SHOW', 'DESCRIBE', 'EXPLAIN',
|
|
8
|
+
'XP_', 'SP_', 'SYS', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA'
|
|
9
|
+
];
|
|
10
|
+
const DANGEROUS_SQL_PATTERNS = [
|
|
11
|
+
/drop\s+table/i,
|
|
12
|
+
/delete\s+from/i,
|
|
13
|
+
/insert\s+into/i,
|
|
14
|
+
/update\s+set/i,
|
|
15
|
+
/;\s*drop/i,
|
|
16
|
+
/;\s*delete/i,
|
|
17
|
+
/--/,
|
|
18
|
+
/\/\*/,
|
|
19
|
+
/\*\//,
|
|
20
|
+
/xp_/i,
|
|
21
|
+
/sp_/i
|
|
22
|
+
];
|
|
23
|
+
const BaseIdentifierSchema = z.string()
|
|
24
|
+
.min(1, 'Identifier cannot be empty')
|
|
25
|
+
.max(256, 'Identifier too long (max 256 characters)')
|
|
26
|
+
.regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, 'Identifier must start with letter or underscore, contain only alphanumeric characters and underscores');
|
|
27
|
+
export const TableNameSchema = z.string()
|
|
28
|
+
.min(1, 'Table name cannot be empty')
|
|
29
|
+
.max(256, 'Table name too long (max 256 characters)')
|
|
30
|
+
.regex(/^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)?$/, 'Table name must be a valid identifier or schema.table format')
|
|
31
|
+
.refine((name) => {
|
|
32
|
+
const parts = name.split('.');
|
|
33
|
+
return !parts.some(part => SQL_RESERVED_KEYWORDS.includes(part.toUpperCase()));
|
|
34
|
+
}, {
|
|
35
|
+
message: "Table name contains reserved SQL keywords"
|
|
36
|
+
})
|
|
37
|
+
.refine((name) => {
|
|
38
|
+
return !(/[;\/\*\x00-\x1F\x7F]|--/.exec(name));
|
|
39
|
+
}, 'Table name contains dangerous characters');
|
|
40
|
+
export const ColumnNameSchema = BaseIdentifierSchema
|
|
41
|
+
.refine((name) => {
|
|
42
|
+
return !SQL_RESERVED_KEYWORDS.includes(name.toUpperCase());
|
|
43
|
+
}, {
|
|
44
|
+
message: "Column name is a reserved SQL keyword"
|
|
45
|
+
});
|
|
46
|
+
export const DatabaseIdentifierSchema = z.object({
|
|
47
|
+
identifier: z.string(),
|
|
48
|
+
type: z.enum(['table', 'column']).default('table')
|
|
49
|
+
}).transform(({ identifier, type }) => {
|
|
50
|
+
if (type === 'table') {
|
|
51
|
+
return TableNameSchema.parse(identifier);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return ColumnNameSchema.parse(identifier);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
export const HostnameSchema = z.string()
|
|
58
|
+
.min(1, 'Host is required')
|
|
59
|
+
.max(255, 'Host name too long (max 255 characters)')
|
|
60
|
+
.regex(/^[a-zA-Z0-9\-\.]+$/, 'Invalid host name format')
|
|
61
|
+
.refine((host) => {
|
|
62
|
+
const isLocalhost = /^(localhost|127\.|::1|0\.0\.0\.0)/.test(host);
|
|
63
|
+
return !isLocalhost || process.env.NODE_ENV !== 'production';
|
|
64
|
+
}, 'Localhost connections not allowed in production');
|
|
65
|
+
export const PortSchema = z.number()
|
|
66
|
+
.int('Port must be an integer')
|
|
67
|
+
.min(1, 'Port must be at least 1')
|
|
68
|
+
.max(65535, 'Port must be at most 65535')
|
|
69
|
+
.refine((port) => {
|
|
70
|
+
const dangerousPorts = [21, 23, 25, 53, 69, 135, 139, 445];
|
|
71
|
+
return !dangerousPorts.includes(port);
|
|
72
|
+
}, 'Port number may be unsafe for database connections');
|
|
73
|
+
export const TimeoutSchema = z.number()
|
|
74
|
+
.int('Timeout must be an integer')
|
|
75
|
+
.min(1000, 'Timeout must be at least 1000ms (1 second)')
|
|
76
|
+
.max(300000, 'Timeout cannot exceed 300000ms (5 minutes)');
|
|
77
|
+
export const QueryTimeoutSchema = z.number()
|
|
78
|
+
.int('Query timeout must be an integer')
|
|
79
|
+
.min(1000, 'Query timeout must be at least 1000ms (1 second)')
|
|
80
|
+
.max(60000, 'Query timeout cannot exceed 60000ms (1 minute)');
|
|
81
|
+
export const MaxRowsSchema = z.number()
|
|
82
|
+
.int('Max rows must be an integer')
|
|
83
|
+
.min(1, 'Max rows must be at least 1')
|
|
84
|
+
.max(10000, 'Max rows cannot exceed 10000');
|
|
85
|
+
export const DatabaseCredentialsSchema = z.object({
|
|
86
|
+
username: z.string()
|
|
87
|
+
.min(1, 'Username is required')
|
|
88
|
+
.max(64, 'Username too long (max 64 characters)')
|
|
89
|
+
.refine((username) => {
|
|
90
|
+
return !(/[;\/\*\x00-\x1F\x7F]|--/.exec(username));
|
|
91
|
+
}, 'Username contains invalid characters'),
|
|
92
|
+
password: z.string()
|
|
93
|
+
.min(1, 'Password is required')
|
|
94
|
+
.max(256, 'Password too long (max 256 characters)')
|
|
95
|
+
});
|
|
96
|
+
export const DatabaseNameSchema = z.string()
|
|
97
|
+
.min(1, 'Database name is required')
|
|
98
|
+
.max(64, 'Database name too long (max 64 characters)')
|
|
99
|
+
.regex(/^[a-zA-Z0-9_\-]+$/, 'Database name contains invalid characters (only alphanumeric, underscore, and hyphen allowed)')
|
|
100
|
+
.refine((name) => {
|
|
101
|
+
return !SQL_RESERVED_KEYWORDS.includes(name.toUpperCase());
|
|
102
|
+
}, 'Database name cannot be a reserved SQL keyword');
|
|
103
|
+
export const BaseConnectorConfigSchema = z.object({
|
|
104
|
+
host: HostnameSchema,
|
|
105
|
+
port: PortSchema.optional(),
|
|
106
|
+
database: DatabaseNameSchema,
|
|
107
|
+
username: z.string().min(1),
|
|
108
|
+
password: z.string().min(1),
|
|
109
|
+
ssl: z.boolean().default(true),
|
|
110
|
+
timeout: TimeoutSchema.optional(),
|
|
111
|
+
queryTimeout: QueryTimeoutSchema.optional(),
|
|
112
|
+
maxRows: MaxRowsSchema.optional(),
|
|
113
|
+
applicationName: z.string().max(64).optional()
|
|
114
|
+
}).refine((config) => {
|
|
115
|
+
if (config.timeout && config.queryTimeout && config.queryTimeout >= config.timeout) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}, {
|
|
120
|
+
message: 'Query timeout must be less than connection timeout',
|
|
121
|
+
path: ['queryTimeout']
|
|
122
|
+
});
|
|
123
|
+
export const PostgresConnectorConfigSchema = BaseConnectorConfigSchema.extend({
|
|
124
|
+
schema: z.string().max(64).optional(),
|
|
125
|
+
sslMode: z.enum(['disable', 'allow', 'prefer', 'require', 'verify-ca', 'verify-full']).default('require')
|
|
126
|
+
});
|
|
127
|
+
export const DuckDBConnectorConfigSchema = z.object({
|
|
128
|
+
database: z.string()
|
|
129
|
+
.min(1, 'Database path is required')
|
|
130
|
+
.max(1024, 'Database path too long')
|
|
131
|
+
.refine((path) => {
|
|
132
|
+
if (path === ':memory:')
|
|
133
|
+
return true;
|
|
134
|
+
return !path.includes('..') && !path.includes('//');
|
|
135
|
+
}, 'Invalid database path')
|
|
136
|
+
.refine((path) => {
|
|
137
|
+
const systemDirs = ['/etc/', '/sys/', '/proc/', '/dev/', '/var/'];
|
|
138
|
+
return path === ':memory:' || !systemDirs.some(dir => path.startsWith(dir));
|
|
139
|
+
}, 'Cannot access system directories'),
|
|
140
|
+
readOnly: z.boolean().default(true),
|
|
141
|
+
timeout: TimeoutSchema.optional(),
|
|
142
|
+
queryTimeout: QueryTimeoutSchema.optional(),
|
|
143
|
+
maxRows: MaxRowsSchema.optional()
|
|
144
|
+
});
|
|
145
|
+
export const BigQueryConnectorConfigSchema = z.object({
|
|
146
|
+
projectId: z.string()
|
|
147
|
+
.min(1, 'Project ID is required')
|
|
148
|
+
.max(63, 'Project ID too long')
|
|
149
|
+
.regex(/^[a-z0-9\-]+$/, 'Project ID must contain only lowercase letters, numbers, and hyphens'),
|
|
150
|
+
keyFilename: z.string().optional(),
|
|
151
|
+
credentials: z.object({}).passthrough().optional(),
|
|
152
|
+
dataset: z.string().max(1024).optional(),
|
|
153
|
+
location: z.string().max(64).optional(),
|
|
154
|
+
timeout: TimeoutSchema.optional(),
|
|
155
|
+
queryTimeout: QueryTimeoutSchema.optional(),
|
|
156
|
+
maxRows: MaxRowsSchema.optional()
|
|
157
|
+
}).refine((config) => {
|
|
158
|
+
return config.keyFilename || config.credentials;
|
|
159
|
+
}, {
|
|
160
|
+
message: 'Either keyFilename or credentials must be provided',
|
|
161
|
+
path: ['credentials']
|
|
162
|
+
});
|
|
163
|
+
export const SnowflakeConnectorConfigSchema = z.object({
|
|
164
|
+
account: z.string()
|
|
165
|
+
.min(1, 'Account is required')
|
|
166
|
+
.max(64, 'Account name too long'),
|
|
167
|
+
username: z.string()
|
|
168
|
+
.min(1, 'Username is required')
|
|
169
|
+
.max(64, 'Username too long'),
|
|
170
|
+
password: z.string()
|
|
171
|
+
.min(1, 'Password is required'),
|
|
172
|
+
warehouse: z.string().max(64).optional(),
|
|
173
|
+
database: DatabaseNameSchema,
|
|
174
|
+
schema: z.string().max(64).optional(),
|
|
175
|
+
role: z.string().max(64).optional(),
|
|
176
|
+
timeout: TimeoutSchema.optional(),
|
|
177
|
+
queryTimeout: QueryTimeoutSchema.optional(),
|
|
178
|
+
maxRows: MaxRowsSchema.optional()
|
|
179
|
+
});
|
|
180
|
+
export const SanitizedStringSchema = z.string()
|
|
181
|
+
.min(1, 'Input cannot be empty')
|
|
182
|
+
.max(256, 'Input too long (max 256 characters)')
|
|
183
|
+
.transform((input) => input.trim())
|
|
184
|
+
.refine((input) => input.length > 0, 'Input is empty after sanitization')
|
|
185
|
+
.transform((input) => {
|
|
186
|
+
return input.replace(/[;\/\*\x00-\x1F\x7F]|--/g, '');
|
|
187
|
+
})
|
|
188
|
+
.refine((input) => input.length > 0, 'Input is empty after removing dangerous characters');
|
|
189
|
+
export const LimitSchema = z.union([
|
|
190
|
+
z.number().int().min(1).max(10000),
|
|
191
|
+
z.string().transform((val) => {
|
|
192
|
+
const num = parseInt(val, 10);
|
|
193
|
+
if (isNaN(num)) {
|
|
194
|
+
throw new Error('LIMIT must be a valid number');
|
|
195
|
+
}
|
|
196
|
+
return num;
|
|
197
|
+
}).refine((num) => num >= 1 && num <= 10000, 'LIMIT must be between 1 and 10000')
|
|
198
|
+
]);
|
|
199
|
+
export const ConnectionStringSchema = z.string()
|
|
200
|
+
.min(1, 'Connection string cannot be empty')
|
|
201
|
+
.max(2048, 'Connection string too long (max 2048 characters)')
|
|
202
|
+
.refine((connStr) => {
|
|
203
|
+
return /(?:host|server|hostname)=/i.test(connStr);
|
|
204
|
+
}, 'Connection string must contain host/server specification')
|
|
205
|
+
.refine((connStr) => {
|
|
206
|
+
return !DANGEROUS_SQL_PATTERNS.some(pattern => pattern.test(connStr));
|
|
207
|
+
}, 'Connection string contains dangerous SQL patterns');
|
|
208
|
+
export const FreshnessRuleSchema = z.object({
|
|
209
|
+
id: z.string().uuid().optional(),
|
|
210
|
+
sourceId: z.string().uuid(),
|
|
211
|
+
tableName: TableNameSchema,
|
|
212
|
+
columnName: ColumnNameSchema,
|
|
213
|
+
toleranceMinutes: z.number()
|
|
214
|
+
.int('Tolerance must be an integer')
|
|
215
|
+
.min(1, 'Tolerance must be at least 1 minute')
|
|
216
|
+
.max(10080, 'Tolerance cannot exceed 10080 minutes (1 week)'),
|
|
217
|
+
checkIntervalMinutes: z.number()
|
|
218
|
+
.int('Check interval must be an integer')
|
|
219
|
+
.min(1, 'Check interval must be at least 1 minute')
|
|
220
|
+
.max(1440, 'Check interval cannot exceed 1440 minutes (1 day)'),
|
|
221
|
+
isActive: z.boolean().default(true)
|
|
222
|
+
});
|
|
223
|
+
export const VolumeRuleSchema = z.object({
|
|
224
|
+
id: z.string().uuid().optional(),
|
|
225
|
+
sourceId: z.string().uuid(),
|
|
226
|
+
tableName: TableNameSchema,
|
|
227
|
+
baselineWindowDays: z.number()
|
|
228
|
+
.int('Baseline window must be an integer')
|
|
229
|
+
.min(1, 'Baseline window must be at least 1 day')
|
|
230
|
+
.max(365, 'Baseline window cannot exceed 365 days'),
|
|
231
|
+
deviationThreshold: z.number()
|
|
232
|
+
.min(0, 'Deviation threshold must be non-negative')
|
|
233
|
+
.max(10, 'Deviation threshold cannot exceed 1000%')
|
|
234
|
+
.transform((val) => val / 100),
|
|
235
|
+
checkIntervalMinutes: z.number()
|
|
236
|
+
.int('Check interval must be an integer')
|
|
237
|
+
.min(15, 'Check interval must be at least 15 minutes')
|
|
238
|
+
.max(1440, 'Check interval cannot exceed 1440 minutes (1 day)'),
|
|
239
|
+
isActive: z.boolean().default(true)
|
|
240
|
+
});
|
|
241
|
+
export const schemas = {
|
|
242
|
+
TableNameSchema,
|
|
243
|
+
ColumnNameSchema,
|
|
244
|
+
DatabaseIdentifierSchema,
|
|
245
|
+
HostnameSchema,
|
|
246
|
+
PortSchema,
|
|
247
|
+
TimeoutSchema,
|
|
248
|
+
QueryTimeoutSchema,
|
|
249
|
+
MaxRowsSchema,
|
|
250
|
+
BaseConnectorConfigSchema,
|
|
251
|
+
PostgresConnectorConfigSchema,
|
|
252
|
+
DuckDBConnectorConfigSchema,
|
|
253
|
+
BigQueryConnectorConfigSchema,
|
|
254
|
+
SnowflakeConnectorConfigSchema,
|
|
255
|
+
DatabaseCredentialsSchema,
|
|
256
|
+
DatabaseNameSchema,
|
|
257
|
+
SanitizedStringSchema,
|
|
258
|
+
LimitSchema,
|
|
259
|
+
ConnectionStringSchema,
|
|
260
|
+
FreshnessRuleSchema,
|
|
261
|
+
VolumeRuleSchema
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/validation/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ConnectorConfig } from '../types/connector.js';
|
|
2
|
+
export declare function validateTableName(name: string): boolean;
|
|
3
|
+
export declare function validateColumnName(name: string): boolean;
|
|
4
|
+
export declare function validateDatabaseIdentifier(identifier: string, type?: 'table' | 'column'): boolean;
|
|
5
|
+
export declare function validateConnectorConfig(config: Partial<ConnectorConfig>): void;
|
|
6
|
+
export declare function sanitizeString(input: string, maxLength?: number): string;
|
|
7
|
+
export declare function validateLimit(limit: number | string): number;
|
|
8
|
+
export declare function validateConnectionString(connectionString: string): boolean;
|
|
9
|
+
export declare const validators: {
|
|
10
|
+
readonly validateTableName: typeof validateTableName;
|
|
11
|
+
readonly validateColumnName: typeof validateColumnName;
|
|
12
|
+
readonly validateDatabaseIdentifier: typeof validateDatabaseIdentifier;
|
|
13
|
+
readonly validateConnectorConfig: typeof validateConnectorConfig;
|
|
14
|
+
readonly sanitizeString: typeof sanitizeString;
|
|
15
|
+
readonly validateLimit: typeof validateLimit;
|
|
16
|
+
readonly validateConnectionString: typeof validateConnectionString;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAa7D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkCvD;AASD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmCxD;AASD,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,GAAG,QAAkB,GAAG,OAAO,CAM1G;AAYD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAqG9E;AAaD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,MAAM,CAsBrE;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA0B5D;AAYD,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAmC1E;AAMD,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
export function validateTableName(name) {
|
|
2
|
+
if (typeof name !== 'string') {
|
|
3
|
+
throw new Error('Table name must be a string');
|
|
4
|
+
}
|
|
5
|
+
if (name.length === 0) {
|
|
6
|
+
throw new Error('Table name cannot be empty');
|
|
7
|
+
}
|
|
8
|
+
if (name.length > 256) {
|
|
9
|
+
throw new Error('Table name too long (max 256 characters)');
|
|
10
|
+
}
|
|
11
|
+
if (!/^[a-zA-Z0-9_\.]+$/.test(name)) {
|
|
12
|
+
throw new Error('Table name contains invalid characters (only alphanumeric, underscore, and dot allowed)');
|
|
13
|
+
}
|
|
14
|
+
if (/^[0-9]/.test(name)) {
|
|
15
|
+
throw new Error('Table name cannot start with a number');
|
|
16
|
+
}
|
|
17
|
+
const reservedKeywords = [
|
|
18
|
+
'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'DROP', 'ALTER', 'CREATE',
|
|
19
|
+
'TABLE', 'FROM', 'WHERE', 'AND', 'OR', 'NOT', 'NULL', 'TRUE', 'FALSE'
|
|
20
|
+
];
|
|
21
|
+
if (reservedKeywords.includes(name.toUpperCase())) {
|
|
22
|
+
throw new Error(`Table name "${name}" is a reserved SQL keyword`);
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
export function validateColumnName(name) {
|
|
27
|
+
if (typeof name !== 'string') {
|
|
28
|
+
throw new Error('Column name must be a string');
|
|
29
|
+
}
|
|
30
|
+
if (name.length === 0) {
|
|
31
|
+
throw new Error('Column name cannot be empty');
|
|
32
|
+
}
|
|
33
|
+
if (name.length > 256) {
|
|
34
|
+
throw new Error('Column name too long (max 256 characters)');
|
|
35
|
+
}
|
|
36
|
+
if (!/^[a-zA-Z0-9_]+$/.test(name)) {
|
|
37
|
+
throw new Error('Column name contains invalid characters (only alphanumeric and underscore allowed)');
|
|
38
|
+
}
|
|
39
|
+
if (/^[0-9]/.test(name)) {
|
|
40
|
+
throw new Error('Column name cannot start with a number');
|
|
41
|
+
}
|
|
42
|
+
const reservedKeywords = [
|
|
43
|
+
'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'DROP', 'ALTER', 'CREATE',
|
|
44
|
+
'TABLE', 'FROM', 'WHERE', 'AND', 'OR', 'NOT', 'NULL', 'TRUE', 'FALSE',
|
|
45
|
+
'COUNT', 'MAX', 'MIN', 'SUM', 'AVG', 'DISTINCT', 'ORDER', 'GROUP', 'BY'
|
|
46
|
+
];
|
|
47
|
+
if (reservedKeywords.includes(name.toUpperCase())) {
|
|
48
|
+
throw new Error(`Column name "${name}" is a reserved SQL keyword`);
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
export function validateDatabaseIdentifier(identifier, type = 'table') {
|
|
53
|
+
if (type === 'table') {
|
|
54
|
+
return validateTableName(identifier);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return validateColumnName(identifier);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function validateConnectorConfig(config) {
|
|
61
|
+
if (!config) {
|
|
62
|
+
throw new Error('Configuration object is required');
|
|
63
|
+
}
|
|
64
|
+
if (!config.host || typeof config.host !== 'string') {
|
|
65
|
+
throw new Error('Host is required and must be a string');
|
|
66
|
+
}
|
|
67
|
+
if (!config.database || typeof config.database !== 'string') {
|
|
68
|
+
throw new Error('Database name is required and must be a string');
|
|
69
|
+
}
|
|
70
|
+
if (!config.username || typeof config.username !== 'string') {
|
|
71
|
+
throw new Error('Username is required and must be a string');
|
|
72
|
+
}
|
|
73
|
+
if (!config.password || typeof config.password !== 'string') {
|
|
74
|
+
throw new Error('Password is required and must be a string');
|
|
75
|
+
}
|
|
76
|
+
if (config.host.length > 255) {
|
|
77
|
+
throw new Error('Host name too long (max 255 characters)');
|
|
78
|
+
}
|
|
79
|
+
if (!/^[a-zA-Z0-9\-\.]+$/.test(config.host)) {
|
|
80
|
+
throw new Error('Invalid host name format');
|
|
81
|
+
}
|
|
82
|
+
if (config.port !== undefined) {
|
|
83
|
+
if (typeof config.port !== 'number' || !Number.isInteger(config.port)) {
|
|
84
|
+
throw new Error('Port must be an integer');
|
|
85
|
+
}
|
|
86
|
+
if (config.port < 1 || config.port > 65535) {
|
|
87
|
+
throw new Error('Port must be between 1 and 65535');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (config.timeout !== undefined) {
|
|
91
|
+
if (typeof config.timeout !== 'number' || !Number.isInteger(config.timeout)) {
|
|
92
|
+
throw new Error('Timeout must be an integer');
|
|
93
|
+
}
|
|
94
|
+
if (config.timeout < 1000) {
|
|
95
|
+
throw new Error('Timeout must be at least 1000ms');
|
|
96
|
+
}
|
|
97
|
+
if (config.timeout > 300000) {
|
|
98
|
+
throw new Error('Timeout cannot exceed 300000ms (5 minutes)');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (config.queryTimeout !== undefined) {
|
|
102
|
+
if (typeof config.queryTimeout !== 'number' || !Number.isInteger(config.queryTimeout)) {
|
|
103
|
+
throw new Error('Query timeout must be an integer');
|
|
104
|
+
}
|
|
105
|
+
if (config.queryTimeout < 1000) {
|
|
106
|
+
throw new Error('Query timeout must be at least 1000ms');
|
|
107
|
+
}
|
|
108
|
+
if (config.queryTimeout > 60000) {
|
|
109
|
+
throw new Error('Query timeout cannot exceed 60000ms (1 minute)');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (config.maxRows !== undefined) {
|
|
113
|
+
if (typeof config.maxRows !== 'number' || !Number.isInteger(config.maxRows)) {
|
|
114
|
+
throw new Error('Max rows must be an integer');
|
|
115
|
+
}
|
|
116
|
+
if (config.maxRows < 1) {
|
|
117
|
+
throw new Error('Max rows must be at least 1');
|
|
118
|
+
}
|
|
119
|
+
if (config.maxRows > 10000) {
|
|
120
|
+
throw new Error('Max rows cannot exceed 10000');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (config.username.includes(';') || config.username.includes('--') || config.username.includes('/*')) {
|
|
124
|
+
throw new Error('Username contains invalid characters');
|
|
125
|
+
}
|
|
126
|
+
if (config.database.length > 64) {
|
|
127
|
+
throw new Error('Database name too long (max 64 characters)');
|
|
128
|
+
}
|
|
129
|
+
if (!/^[a-zA-Z0-9_\-]+$/.test(config.database)) {
|
|
130
|
+
throw new Error('Database name contains invalid characters');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function sanitizeString(input, maxLength = 256) {
|
|
134
|
+
if (typeof input !== 'string') {
|
|
135
|
+
throw new Error('Input must be a string');
|
|
136
|
+
}
|
|
137
|
+
let sanitized = input.trim();
|
|
138
|
+
if (sanitized.length > maxLength) {
|
|
139
|
+
throw new Error(`Input too long (max ${maxLength} characters)`);
|
|
140
|
+
}
|
|
141
|
+
sanitized = sanitized.replace(/[;\/\*\x00-\x1F\x7F]|--/g, '');
|
|
142
|
+
if (sanitized.length === 0) {
|
|
143
|
+
throw new Error('Input is empty after sanitization');
|
|
144
|
+
}
|
|
145
|
+
return sanitized;
|
|
146
|
+
}
|
|
147
|
+
export function validateLimit(limit) {
|
|
148
|
+
let numLimit;
|
|
149
|
+
if (typeof limit === 'string') {
|
|
150
|
+
numLimit = parseInt(limit, 10);
|
|
151
|
+
if (isNaN(numLimit)) {
|
|
152
|
+
throw new Error('LIMIT must be a valid number');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (typeof limit === 'number') {
|
|
156
|
+
if (!Number.isInteger(limit)) {
|
|
157
|
+
throw new Error('LIMIT must be an integer');
|
|
158
|
+
}
|
|
159
|
+
numLimit = limit;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
throw new Error('LIMIT must be a number or string');
|
|
163
|
+
}
|
|
164
|
+
if (numLimit < 1) {
|
|
165
|
+
throw new Error('LIMIT must be at least 1');
|
|
166
|
+
}
|
|
167
|
+
if (numLimit > 10000) {
|
|
168
|
+
throw new Error('LIMIT cannot exceed 10000');
|
|
169
|
+
}
|
|
170
|
+
return numLimit;
|
|
171
|
+
}
|
|
172
|
+
export function validateConnectionString(connectionString) {
|
|
173
|
+
if (typeof connectionString !== 'string') {
|
|
174
|
+
throw new Error('Connection string must be a string');
|
|
175
|
+
}
|
|
176
|
+
if (connectionString.length === 0) {
|
|
177
|
+
throw new Error('Connection string cannot be empty');
|
|
178
|
+
}
|
|
179
|
+
if (connectionString.length > 2048) {
|
|
180
|
+
throw new Error('Connection string too long (max 2048 characters)');
|
|
181
|
+
}
|
|
182
|
+
if (!/(?:host|server|hostname)=/i.test(connectionString)) {
|
|
183
|
+
throw new Error('Connection string must contain host/server specification');
|
|
184
|
+
}
|
|
185
|
+
const dangerousPatterns = [
|
|
186
|
+
/drop\s+table/i,
|
|
187
|
+
/delete\s+from/i,
|
|
188
|
+
/insert\s+into/i,
|
|
189
|
+
/update\s+set/i,
|
|
190
|
+
/;\s*drop/i,
|
|
191
|
+
/;\s*delete/i
|
|
192
|
+
];
|
|
193
|
+
for (const pattern of dangerousPatterns) {
|
|
194
|
+
if (pattern.test(connectionString)) {
|
|
195
|
+
throw new Error('Connection string contains dangerous SQL patterns');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
export const validators = {
|
|
201
|
+
validateTableName,
|
|
202
|
+
validateColumnName,
|
|
203
|
+
validateDatabaseIdentifier,
|
|
204
|
+
validateConnectorConfig,
|
|
205
|
+
sanitizeString,
|
|
206
|
+
validateLimit,
|
|
207
|
+
validateConnectionString,
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validators/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@freshguard/freshguard-core",
|
|
3
|
+
"version": "0.11.2",
|
|
4
|
+
"description": "Open source data freshness monitoring engine",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./cli": {
|
|
14
|
+
"types": "./dist/cli/index.d.ts",
|
|
15
|
+
"default": "./dist/cli/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"freshguard": "./dist/cli/index.js"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"LICENSE",
|
|
24
|
+
"README.md",
|
|
25
|
+
"CHANGELOG.md"
|
|
26
|
+
],
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@duckdb/node-api": "1.4.3-r.3",
|
|
29
|
+
"@google-cloud/bigquery": "^8.1.1",
|
|
30
|
+
"drizzle-orm": "^0.45.1",
|
|
31
|
+
"mysql2": "^3.6.0",
|
|
32
|
+
"pg": "^8.17.2",
|
|
33
|
+
"pino": "^10.3.0",
|
|
34
|
+
"postgres": "^3.4.8",
|
|
35
|
+
"snowflake-sdk": "^2.3.3",
|
|
36
|
+
"zod": "^4.3.6"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@eslint/js": "^9.39.2",
|
|
40
|
+
"@types/big.js": "^6.2.2",
|
|
41
|
+
"@types/duplexify": "^3.6.5",
|
|
42
|
+
"@types/eslint": "^9.6.1",
|
|
43
|
+
"@types/extend": "^3.0.4",
|
|
44
|
+
"@types/is": "^0.0.25",
|
|
45
|
+
"@types/pg": "^8.16.0",
|
|
46
|
+
"@types/uuid": "^10.0.0",
|
|
47
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
48
|
+
"eslint": "^9.39.2",
|
|
49
|
+
"pnpm": "^10.28.2",
|
|
50
|
+
"typescript": "^5.9.3",
|
|
51
|
+
"typescript-eslint": "^8.53.1",
|
|
52
|
+
"vitest": "^4.0.18"
|
|
53
|
+
},
|
|
54
|
+
"optionalDependencies": {
|
|
55
|
+
"pino-pretty": "^13.1.3"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">20.0.0",
|
|
59
|
+
"pnpm": ">=10.0.0"
|
|
60
|
+
},
|
|
61
|
+
"license": "MIT",
|
|
62
|
+
"repository": {
|
|
63
|
+
"type": "git",
|
|
64
|
+
"url": "https://github.com/freshguard-dev/freshguard-core.git"
|
|
65
|
+
},
|
|
66
|
+
"publishConfig": {
|
|
67
|
+
"access": "public"
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"build": "tsc",
|
|
71
|
+
"type-check": "tsc --noEmit",
|
|
72
|
+
"lint": "eslint src tests --fix",
|
|
73
|
+
"lint:check": "eslint src tests",
|
|
74
|
+
"lint:fix": "eslint src tests --fix",
|
|
75
|
+
"test": "vitest",
|
|
76
|
+
"test:unit": "vitest --run --testNamePattern='(?!.*integration)'",
|
|
77
|
+
"test:integration": "vitest --run tests/*integration*.test.ts",
|
|
78
|
+
"test:integration:improved": "vitest --run tests/connectors.integration.improved.test.ts",
|
|
79
|
+
"test:coverage": "vitest --coverage",
|
|
80
|
+
"test:services:start": "docker compose -f docker-compose.test.yml up -d",
|
|
81
|
+
"test:services:stop": "docker compose -f docker-compose.test.yml down",
|
|
82
|
+
"test:services:logs": "docker compose -f docker-compose.test.yml logs -f",
|
|
83
|
+
"test:db:setup": "node test-setup/setup-duckdb.js",
|
|
84
|
+
"test:db:setup:all": "pnpm test:services:start && sleep 15 && pnpm test:db:setup",
|
|
85
|
+
"test:integration:full": "pnpm test:db:setup:all && pnpm test:integration:improved",
|
|
86
|
+
"test:full": "pnpm test:services:start && sleep 10 && pnpm test:coverage && pnpm test:services:stop",
|
|
87
|
+
"test:full:complete": "pnpm test:db:setup:all && pnpm test:coverage && pnpm test:services:stop",
|
|
88
|
+
"clean": "rm -rf dist",
|
|
89
|
+
"pre-commit": "pnpm lint:check && pnpm build && pnpm type-check && pnpm test:coverage"
|
|
90
|
+
}
|
|
91
|
+
}
|