@querypanel/node-sdk 1.0.8 → 1.0.9
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 +174 -0
- package/dist/cjs/adapters/clickhouse.d.ts +36 -0
- package/dist/cjs/adapters/clickhouse.d.ts.map +1 -0
- package/dist/cjs/adapters/clickhouse.js +256 -0
- package/dist/cjs/adapters/clickhouse.js.map +1 -0
- package/dist/cjs/adapters/introspection.spec.d.ts +2 -0
- package/dist/cjs/adapters/introspection.spec.d.ts.map +1 -0
- package/dist/cjs/adapters/introspection.spec.js +201 -0
- package/dist/cjs/adapters/introspection.spec.js.map +1 -0
- package/dist/cjs/adapters/postgres.d.ts +29 -0
- package/dist/cjs/adapters/postgres.d.ts.map +1 -0
- package/dist/cjs/adapters/postgres.js +384 -0
- package/dist/cjs/adapters/postgres.js.map +1 -0
- package/dist/cjs/adapters/types.d.ts +34 -0
- package/dist/cjs/adapters/types.d.ts.map +1 -0
- package/dist/cjs/adapters/types.js +3 -0
- package/dist/cjs/adapters/types.js.map +1 -0
- package/dist/cjs/anonymize.spec.d.ts +2 -0
- package/dist/cjs/anonymize.spec.d.ts.map +1 -0
- package/dist/cjs/anonymize.spec.js +80 -0
- package/dist/cjs/anonymize.spec.js.map +1 -0
- package/dist/cjs/clickhouseClient.spec.d.ts +2 -0
- package/dist/cjs/clickhouseClient.spec.d.ts.map +1 -0
- package/dist/cjs/clickhouseClient.spec.js +286 -0
- package/dist/cjs/clickhouseClient.spec.js.map +1 -0
- package/dist/cjs/index.d.ts +46 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +221 -53
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.test.js +34 -7
- package/dist/cjs/index.test.js.map +1 -1
- package/dist/cjs/multidb.spec.d.ts +2 -0
- package/dist/cjs/multidb.spec.d.ts.map +1 -0
- package/dist/cjs/multidb.spec.js +76 -0
- package/dist/cjs/multidb.spec.js.map +1 -0
- package/dist/esm/adapters/clickhouse.d.ts +36 -0
- package/dist/esm/adapters/clickhouse.d.ts.map +1 -0
- package/dist/esm/adapters/clickhouse.js +252 -0
- package/dist/esm/adapters/clickhouse.js.map +1 -0
- package/dist/esm/adapters/introspection.spec.d.ts +2 -0
- package/dist/esm/adapters/introspection.spec.d.ts.map +1 -0
- package/dist/esm/adapters/introspection.spec.js +199 -0
- package/dist/esm/adapters/introspection.spec.js.map +1 -0
- package/dist/esm/adapters/postgres.d.ts +29 -0
- package/dist/esm/adapters/postgres.d.ts.map +1 -0
- package/dist/esm/adapters/postgres.js +380 -0
- package/dist/esm/adapters/postgres.js.map +1 -0
- package/dist/esm/adapters/types.d.ts +34 -0
- package/dist/esm/adapters/types.d.ts.map +1 -0
- package/dist/esm/adapters/types.js +2 -0
- package/dist/esm/adapters/types.js.map +1 -0
- package/dist/esm/anonymize.spec.d.ts +2 -0
- package/dist/esm/anonymize.spec.d.ts.map +1 -0
- package/dist/esm/anonymize.spec.js +78 -0
- package/dist/esm/anonymize.spec.js.map +1 -0
- package/dist/esm/clickhouseClient.spec.d.ts +2 -0
- package/dist/esm/clickhouseClient.spec.d.ts.map +1 -0
- package/dist/esm/clickhouseClient.spec.js +281 -0
- package/dist/esm/clickhouseClient.spec.js.map +1 -0
- package/dist/esm/index.d.ts +46 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +220 -53
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.test.js +34 -7
- package/dist/esm/index.test.js.map +1 -1
- package/dist/esm/multidb.spec.d.ts +2 -0
- package/dist/esm/multidb.spec.d.ts.map +1 -0
- package/dist/esm/multidb.spec.js +74 -0
- package/dist/esm/multidb.spec.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
export class PostgresAdapter {
|
|
2
|
+
constructor(clientFn, options = {}) {
|
|
3
|
+
this.clientFn = clientFn;
|
|
4
|
+
this.databaseName = options.database ?? "postgres";
|
|
5
|
+
this.defaultSchema = options.defaultSchema ?? "public";
|
|
6
|
+
this.kind = options.kind ?? "postgres";
|
|
7
|
+
}
|
|
8
|
+
async execute(sql) {
|
|
9
|
+
const result = await this.clientFn(sql);
|
|
10
|
+
const fields = result.fields.map((f) => f.name);
|
|
11
|
+
return { fields, rows: result.rows };
|
|
12
|
+
}
|
|
13
|
+
async validate(sql) {
|
|
14
|
+
await this.clientFn(`EXPLAIN ${sql}`);
|
|
15
|
+
}
|
|
16
|
+
getDialect() {
|
|
17
|
+
return "postgres";
|
|
18
|
+
}
|
|
19
|
+
async introspect(options) {
|
|
20
|
+
const normalizedTables = normalizeTableFilter(options?.tables, this.defaultSchema);
|
|
21
|
+
const tablesResult = await this.clientFn(buildTablesQuery(normalizedTables));
|
|
22
|
+
const tableRows = tablesResult.rows;
|
|
23
|
+
const columnsResult = await this.clientFn(buildColumnsQuery(normalizedTables));
|
|
24
|
+
const columnRows = columnsResult.rows;
|
|
25
|
+
const constraintsResult = await this.clientFn(buildConstraintsQuery(normalizedTables));
|
|
26
|
+
const constraintRows = constraintsResult.rows;
|
|
27
|
+
const indexesResult = await this.clientFn(buildIndexesQuery(normalizedTables));
|
|
28
|
+
const indexRows = indexesResult.rows;
|
|
29
|
+
const tablesByKey = new Map();
|
|
30
|
+
const columnsByKey = new Map();
|
|
31
|
+
for (const row of tableRows) {
|
|
32
|
+
const key = tableKey(row.schema_name, row.table_name);
|
|
33
|
+
const statistics = buildTableStatistics(toNumber(row.total_rows), toNumber(row.total_bytes));
|
|
34
|
+
const table = {
|
|
35
|
+
name: row.table_name,
|
|
36
|
+
schema: row.schema_name,
|
|
37
|
+
type: asTableType(row.table_type),
|
|
38
|
+
columns: [],
|
|
39
|
+
indexes: [],
|
|
40
|
+
constraints: [],
|
|
41
|
+
};
|
|
42
|
+
const comment = sanitize(row.comment);
|
|
43
|
+
if (comment !== undefined) {
|
|
44
|
+
table.comment = comment;
|
|
45
|
+
}
|
|
46
|
+
if (statistics) {
|
|
47
|
+
table.statistics = statistics;
|
|
48
|
+
}
|
|
49
|
+
tablesByKey.set(key, table);
|
|
50
|
+
columnsByKey.set(key, new Map());
|
|
51
|
+
}
|
|
52
|
+
for (const row of columnRows) {
|
|
53
|
+
const key = tableKey(row.table_schema, row.table_name);
|
|
54
|
+
const table = tablesByKey.get(key);
|
|
55
|
+
if (!table)
|
|
56
|
+
continue;
|
|
57
|
+
const column = {
|
|
58
|
+
name: row.column_name,
|
|
59
|
+
type: row.data_type,
|
|
60
|
+
nullable: row.is_nullable.toUpperCase() === "YES",
|
|
61
|
+
isPrimaryKey: false,
|
|
62
|
+
isForeignKey: false,
|
|
63
|
+
};
|
|
64
|
+
const rawType = row.udt_name ?? undefined;
|
|
65
|
+
if (rawType !== undefined)
|
|
66
|
+
column.rawType = rawType;
|
|
67
|
+
const defaultExpression = sanitize(row.column_default);
|
|
68
|
+
if (defaultExpression !== undefined)
|
|
69
|
+
column.defaultExpression = defaultExpression;
|
|
70
|
+
const comment = sanitize(row.description);
|
|
71
|
+
if (comment !== undefined)
|
|
72
|
+
column.comment = comment;
|
|
73
|
+
const maxLength = row.character_maximum_length ?? undefined;
|
|
74
|
+
if (maxLength !== undefined)
|
|
75
|
+
column.maxLength = maxLength;
|
|
76
|
+
const precision = row.numeric_precision ?? undefined;
|
|
77
|
+
if (precision !== undefined)
|
|
78
|
+
column.precision = precision;
|
|
79
|
+
const scale = row.numeric_scale ?? undefined;
|
|
80
|
+
if (scale !== undefined)
|
|
81
|
+
column.scale = scale;
|
|
82
|
+
table.columns.push(column);
|
|
83
|
+
columnsByKey.get(key)?.set(row.column_name, column);
|
|
84
|
+
}
|
|
85
|
+
const constraintGroups = groupConstraints(constraintRows);
|
|
86
|
+
for (const group of constraintGroups) {
|
|
87
|
+
const key = tableKey(group.table_schema, group.table_name);
|
|
88
|
+
const table = tablesByKey.get(key);
|
|
89
|
+
if (!table)
|
|
90
|
+
continue;
|
|
91
|
+
const constraint = {
|
|
92
|
+
name: group.constraint_name,
|
|
93
|
+
type: group.constraint_type,
|
|
94
|
+
columns: [...group.columns],
|
|
95
|
+
};
|
|
96
|
+
if (group.type === "FOREIGN KEY") {
|
|
97
|
+
if (group.foreign_table_name) {
|
|
98
|
+
const referencedTable = group.foreign_table_schema
|
|
99
|
+
? `${group.foreign_table_schema}.${group.foreign_table_name}`
|
|
100
|
+
: group.foreign_table_name;
|
|
101
|
+
constraint.referencedTable = referencedTable;
|
|
102
|
+
}
|
|
103
|
+
if (group.foreign_columns.length) {
|
|
104
|
+
constraint.referencedColumns = [...group.foreign_columns];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
table.constraints.push(constraint);
|
|
108
|
+
for (let index = 0; index < group.columns.length; index += 1) {
|
|
109
|
+
const columnName = group.columns[index];
|
|
110
|
+
if (!columnName)
|
|
111
|
+
continue;
|
|
112
|
+
const column = columnsByKey.get(key)?.get(columnName);
|
|
113
|
+
if (!column)
|
|
114
|
+
continue;
|
|
115
|
+
if (group.type === "PRIMARY KEY") {
|
|
116
|
+
column.isPrimaryKey = true;
|
|
117
|
+
}
|
|
118
|
+
if (group.type === "FOREIGN KEY") {
|
|
119
|
+
column.isForeignKey = true;
|
|
120
|
+
if (group.foreign_table_name) {
|
|
121
|
+
column.foreignKeyTable = group.foreign_table_schema
|
|
122
|
+
? `${group.foreign_table_schema}.${group.foreign_table_name}`
|
|
123
|
+
: group.foreign_table_name;
|
|
124
|
+
}
|
|
125
|
+
const referencedColumn = group.foreign_columns[index];
|
|
126
|
+
if (referencedColumn) {
|
|
127
|
+
column.foreignKeyColumn = referencedColumn;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
for (const row of indexRows) {
|
|
133
|
+
const key = tableKey(row.schema_name, row.table_name);
|
|
134
|
+
const table = tablesByKey.get(key);
|
|
135
|
+
if (!table)
|
|
136
|
+
continue;
|
|
137
|
+
const columns = coerceStringArray(row.column_names)
|
|
138
|
+
.map((c) => c.trim())
|
|
139
|
+
.filter(Boolean);
|
|
140
|
+
const index = {
|
|
141
|
+
name: row.index_name,
|
|
142
|
+
columns,
|
|
143
|
+
unique: Boolean(row.indisunique),
|
|
144
|
+
type: columns.length === 1 ? "INDEX" : "COMPOSITE INDEX",
|
|
145
|
+
};
|
|
146
|
+
const definition = sanitize(row.definition);
|
|
147
|
+
if (definition !== undefined)
|
|
148
|
+
index.definition = definition;
|
|
149
|
+
table.indexes.push(index);
|
|
150
|
+
}
|
|
151
|
+
const tables = Array.from(tablesByKey.values()).sort((a, b) => {
|
|
152
|
+
if (a.schema === b.schema) {
|
|
153
|
+
return a.name.localeCompare(b.name);
|
|
154
|
+
}
|
|
155
|
+
return a.schema.localeCompare(b.schema);
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
db: {
|
|
159
|
+
kind: this.kind,
|
|
160
|
+
name: this.databaseName,
|
|
161
|
+
},
|
|
162
|
+
tables,
|
|
163
|
+
introspectedAt: new Date().toISOString(),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function groupConstraints(rows) {
|
|
168
|
+
const groups = new Map();
|
|
169
|
+
for (const row of rows) {
|
|
170
|
+
const key = `${row.table_schema}.${row.table_name}.${row.constraint_name}`;
|
|
171
|
+
let group = groups.get(key);
|
|
172
|
+
if (!group) {
|
|
173
|
+
group = {
|
|
174
|
+
table_schema: row.table_schema,
|
|
175
|
+
table_name: row.table_name,
|
|
176
|
+
constraint_name: row.constraint_name,
|
|
177
|
+
constraint_type: row.constraint_type,
|
|
178
|
+
columns: [],
|
|
179
|
+
foreign_columns: [],
|
|
180
|
+
type: row.constraint_type,
|
|
181
|
+
};
|
|
182
|
+
groups.set(key, group);
|
|
183
|
+
}
|
|
184
|
+
if (row.column_name) {
|
|
185
|
+
group.columns.push(row.column_name);
|
|
186
|
+
}
|
|
187
|
+
if (row.constraint_type === "FOREIGN KEY") {
|
|
188
|
+
group.foreign_table_schema = row.foreign_table_schema;
|
|
189
|
+
group.foreign_table_name = row.foreign_table_name;
|
|
190
|
+
if (row.foreign_column_name) {
|
|
191
|
+
group.foreign_columns.push(row.foreign_column_name);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return Array.from(groups.values());
|
|
196
|
+
}
|
|
197
|
+
function normalizeTableFilter(tables, defaultSchema) {
|
|
198
|
+
if (!tables?.length)
|
|
199
|
+
return [];
|
|
200
|
+
const normalized = [];
|
|
201
|
+
const seen = new Set();
|
|
202
|
+
for (const raw of tables) {
|
|
203
|
+
if (!raw)
|
|
204
|
+
continue;
|
|
205
|
+
const trimmed = raw.trim();
|
|
206
|
+
if (!trimmed)
|
|
207
|
+
continue;
|
|
208
|
+
const parts = trimmed.split(".");
|
|
209
|
+
const table = parts.pop() ?? "";
|
|
210
|
+
const schema = parts.pop() ?? defaultSchema;
|
|
211
|
+
if (!isSafeIdentifier(schema) || !isSafeIdentifier(table)) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
const key = tableKey(schema, table);
|
|
215
|
+
if (seen.has(key))
|
|
216
|
+
continue;
|
|
217
|
+
seen.add(key);
|
|
218
|
+
normalized.push({ schema, table });
|
|
219
|
+
}
|
|
220
|
+
return normalized;
|
|
221
|
+
}
|
|
222
|
+
function buildTablesQuery(tables) {
|
|
223
|
+
const filter = buildFilterClause(tables, "n.nspname", "c.relname");
|
|
224
|
+
return `SELECT
|
|
225
|
+
c.relname AS table_name,
|
|
226
|
+
n.nspname AS schema_name,
|
|
227
|
+
CASE c.relkind
|
|
228
|
+
WHEN 'r' THEN 'table'
|
|
229
|
+
WHEN 'v' THEN 'view'
|
|
230
|
+
WHEN 'm' THEN 'materialized_view'
|
|
231
|
+
ELSE c.relkind::text
|
|
232
|
+
END AS table_type,
|
|
233
|
+
obj_description(c.oid) AS comment,
|
|
234
|
+
c.reltuples AS total_rows,
|
|
235
|
+
pg_total_relation_size(c.oid) AS total_bytes
|
|
236
|
+
FROM pg_class c
|
|
237
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
238
|
+
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
239
|
+
AND c.relkind IN ('r', 'v', 'm')
|
|
240
|
+
${filter}
|
|
241
|
+
ORDER BY n.nspname, c.relname;`;
|
|
242
|
+
}
|
|
243
|
+
function buildColumnsQuery(tables) {
|
|
244
|
+
const filter = buildFilterClause(tables, "cols.table_schema", "cols.table_name");
|
|
245
|
+
return `SELECT
|
|
246
|
+
cols.table_name,
|
|
247
|
+
cols.table_schema,
|
|
248
|
+
cols.column_name,
|
|
249
|
+
cols.data_type,
|
|
250
|
+
cols.udt_name,
|
|
251
|
+
cols.is_nullable,
|
|
252
|
+
cols.column_default,
|
|
253
|
+
cols.character_maximum_length,
|
|
254
|
+
cols.numeric_precision,
|
|
255
|
+
cols.numeric_scale,
|
|
256
|
+
cols.ordinal_position,
|
|
257
|
+
pgd.description
|
|
258
|
+
FROM information_schema.columns cols
|
|
259
|
+
LEFT JOIN pg_catalog.pg_class c
|
|
260
|
+
ON c.relname = cols.table_name
|
|
261
|
+
AND c.relkind IN ('r', 'v', 'm')
|
|
262
|
+
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
|
263
|
+
LEFT JOIN pg_catalog.pg_attribute attr
|
|
264
|
+
ON attr.attrelid = c.oid
|
|
265
|
+
AND attr.attname = cols.column_name
|
|
266
|
+
LEFT JOIN pg_catalog.pg_description pgd
|
|
267
|
+
ON pgd.objoid = attr.attrelid AND pgd.objsubid = attr.attnum
|
|
268
|
+
WHERE cols.table_schema NOT IN ('pg_catalog', 'information_schema')
|
|
269
|
+
${filter}
|
|
270
|
+
ORDER BY cols.table_schema, cols.table_name, cols.ordinal_position;`;
|
|
271
|
+
}
|
|
272
|
+
function buildConstraintsQuery(tables) {
|
|
273
|
+
const filter = buildFilterClause(tables, "tc.table_schema", "tc.table_name");
|
|
274
|
+
return `SELECT
|
|
275
|
+
tc.table_schema,
|
|
276
|
+
tc.table_name,
|
|
277
|
+
tc.constraint_name,
|
|
278
|
+
tc.constraint_type,
|
|
279
|
+
kcu.column_name,
|
|
280
|
+
ccu.table_schema AS foreign_table_schema,
|
|
281
|
+
ccu.table_name AS foreign_table_name,
|
|
282
|
+
ccu.column_name AS foreign_column_name
|
|
283
|
+
FROM information_schema.table_constraints tc
|
|
284
|
+
LEFT JOIN information_schema.key_column_usage kcu
|
|
285
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
286
|
+
AND tc.table_schema = kcu.table_schema
|
|
287
|
+
LEFT JOIN information_schema.constraint_column_usage ccu
|
|
288
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
289
|
+
AND ccu.table_schema = tc.table_schema
|
|
290
|
+
WHERE tc.constraint_type IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY')
|
|
291
|
+
AND tc.table_schema NOT IN ('pg_catalog', 'information_schema')
|
|
292
|
+
${filter}
|
|
293
|
+
ORDER BY tc.table_schema, tc.table_name, tc.constraint_name, kcu.ordinal_position;`;
|
|
294
|
+
}
|
|
295
|
+
function buildIndexesQuery(tables) {
|
|
296
|
+
const filter = buildFilterClause(tables, "n.nspname", "c.relname");
|
|
297
|
+
return `SELECT
|
|
298
|
+
n.nspname AS schema_name,
|
|
299
|
+
c.relname AS table_name,
|
|
300
|
+
ci.relname AS index_name,
|
|
301
|
+
idx.indisunique,
|
|
302
|
+
array_remove(
|
|
303
|
+
array_agg(pg_get_indexdef(idx.indexrelid, g.k, true) ORDER BY g.k),
|
|
304
|
+
NULL
|
|
305
|
+
) AS column_names,
|
|
306
|
+
pg_get_indexdef(idx.indexrelid) AS definition
|
|
307
|
+
FROM pg_class c
|
|
308
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
309
|
+
JOIN pg_index idx ON idx.indrelid = c.oid
|
|
310
|
+
JOIN pg_class ci ON ci.oid = idx.indexrelid
|
|
311
|
+
JOIN LATERAL generate_subscripts(idx.indkey, 1) AS g(k) ON true
|
|
312
|
+
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
313
|
+
${filter}
|
|
314
|
+
GROUP BY n.nspname, c.relname, ci.relname, idx.indisunique, idx.indexrelid;`;
|
|
315
|
+
}
|
|
316
|
+
function buildFilterClause(tables, schemaExpr, tableExpr) {
|
|
317
|
+
if (!tables.length)
|
|
318
|
+
return "";
|
|
319
|
+
const clauses = tables.map(({ schema, table }) => {
|
|
320
|
+
return `(${schemaExpr} = '${schema}' AND ${tableExpr} = '${table}')`;
|
|
321
|
+
});
|
|
322
|
+
return `AND (${clauses.join(" OR ")})`;
|
|
323
|
+
}
|
|
324
|
+
function tableKey(schema, table) {
|
|
325
|
+
return `${schema}.${table}`;
|
|
326
|
+
}
|
|
327
|
+
function isSafeIdentifier(value) {
|
|
328
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
|
|
329
|
+
}
|
|
330
|
+
function asTableType(value) {
|
|
331
|
+
const normalized = value.toLowerCase();
|
|
332
|
+
if (normalized.includes("view")) {
|
|
333
|
+
return normalized.includes("materialized") ? "materialized_view" : "view";
|
|
334
|
+
}
|
|
335
|
+
return "table";
|
|
336
|
+
}
|
|
337
|
+
function buildTableStatistics(totalRows, totalBytes) {
|
|
338
|
+
if (totalRows === undefined && totalBytes === undefined)
|
|
339
|
+
return undefined;
|
|
340
|
+
const stats = {};
|
|
341
|
+
if (totalRows !== undefined)
|
|
342
|
+
stats.totalRows = totalRows;
|
|
343
|
+
if (totalBytes !== undefined)
|
|
344
|
+
stats.totalBytes = totalBytes;
|
|
345
|
+
return stats;
|
|
346
|
+
}
|
|
347
|
+
function sanitize(value) {
|
|
348
|
+
if (value === null || value === undefined)
|
|
349
|
+
return undefined;
|
|
350
|
+
const trimmed = String(value).trim();
|
|
351
|
+
return trimmed.length ? trimmed : undefined;
|
|
352
|
+
}
|
|
353
|
+
function toNumber(value) {
|
|
354
|
+
if (value === null || value === undefined)
|
|
355
|
+
return undefined;
|
|
356
|
+
if (typeof value === "number")
|
|
357
|
+
return value;
|
|
358
|
+
const parsed = Number.parseFloat(String(value));
|
|
359
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
360
|
+
}
|
|
361
|
+
function coerceStringArray(value) {
|
|
362
|
+
if (!value)
|
|
363
|
+
return [];
|
|
364
|
+
if (Array.isArray(value)) {
|
|
365
|
+
return value.map((entry) => String(entry));
|
|
366
|
+
}
|
|
367
|
+
const text = String(value).trim();
|
|
368
|
+
if (!text)
|
|
369
|
+
return [];
|
|
370
|
+
const withoutBraces = text.startsWith("{") && text.endsWith("}")
|
|
371
|
+
? text.slice(1, -1)
|
|
372
|
+
: text;
|
|
373
|
+
if (!withoutBraces)
|
|
374
|
+
return [];
|
|
375
|
+
return withoutBraces
|
|
376
|
+
.split(",")
|
|
377
|
+
.map((part) => part.trim().replace(/^"(.+)"$/, "$1"))
|
|
378
|
+
.filter(Boolean);
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../src/adapters/postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IntrospectOptions, SchemaIntrospection } from "../schema/types.js";
|
|
2
|
+
export type DatabaseDialect = "clickhouse" | "postgres" | "mysql";
|
|
3
|
+
export interface DatabaseExecutionResult {
|
|
4
|
+
fields: string[];
|
|
5
|
+
rows: Array<Record<string, unknown>>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Database adapter interface for abstracting database-specific operations.
|
|
9
|
+
* Allows the SDK to work with multiple database types.
|
|
10
|
+
*/
|
|
11
|
+
export interface DatabaseAdapter {
|
|
12
|
+
/**
|
|
13
|
+
* Execute a SQL query and return results
|
|
14
|
+
*/
|
|
15
|
+
execute(sql: string): Promise<DatabaseExecutionResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Validate SQL query (e.g., using EXPLAIN)
|
|
18
|
+
* Throws an error if the SQL is invalid
|
|
19
|
+
*/
|
|
20
|
+
validate(sql: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Introspect database schema metadata
|
|
23
|
+
*/
|
|
24
|
+
introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
|
|
25
|
+
/**
|
|
26
|
+
* Get the database dialect/type
|
|
27
|
+
*/
|
|
28
|
+
getDialect(): DatabaseDialect;
|
|
29
|
+
/**
|
|
30
|
+
* Optional: Close/cleanup database connection
|
|
31
|
+
*/
|
|
32
|
+
close?(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEvD;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEtE;;OAEG;IACH,UAAU,IAAI,eAAe,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymize.spec.d.ts","sourceRoot":"","sources":["../../src/anonymize.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { anonymizeResults } from "./index.js";
|
|
3
|
+
describe("anonymizeResults", () => {
|
|
4
|
+
it("anonymizes numeric values", () => {
|
|
5
|
+
const input = [
|
|
6
|
+
{ year: 2025, transactionSum: 1000 },
|
|
7
|
+
{ year: 2024, transactionSum: 2000 },
|
|
8
|
+
];
|
|
9
|
+
const result = anonymizeResults(input);
|
|
10
|
+
expect(result).toEqual([
|
|
11
|
+
{ year: "number", transactionSum: "number" },
|
|
12
|
+
{ year: "number", transactionSum: "number" },
|
|
13
|
+
]);
|
|
14
|
+
});
|
|
15
|
+
it("anonymizes mixed types", () => {
|
|
16
|
+
const input = [
|
|
17
|
+
{
|
|
18
|
+
id: 1,
|
|
19
|
+
name: "John Doe",
|
|
20
|
+
active: true,
|
|
21
|
+
score: 95.5,
|
|
22
|
+
metadata: null,
|
|
23
|
+
tags: ["admin", "user"],
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
const result = anonymizeResults(input);
|
|
27
|
+
expect(result).toEqual([
|
|
28
|
+
{
|
|
29
|
+
id: "number",
|
|
30
|
+
name: "string",
|
|
31
|
+
active: "boolean",
|
|
32
|
+
score: "number",
|
|
33
|
+
metadata: "null",
|
|
34
|
+
tags: "array",
|
|
35
|
+
},
|
|
36
|
+
]);
|
|
37
|
+
});
|
|
38
|
+
it("handles empty arrays", () => {
|
|
39
|
+
const result = anonymizeResults([]);
|
|
40
|
+
expect(result).toEqual([]);
|
|
41
|
+
});
|
|
42
|
+
it("handles objects with nested structures", () => {
|
|
43
|
+
const input = [
|
|
44
|
+
{
|
|
45
|
+
user: { name: "Alice" },
|
|
46
|
+
count: 42,
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
const result = anonymizeResults(input);
|
|
50
|
+
expect(result).toEqual([
|
|
51
|
+
{
|
|
52
|
+
user: "object",
|
|
53
|
+
count: "number",
|
|
54
|
+
},
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
it("preserves column structure across multiple rows", () => {
|
|
58
|
+
const input = [
|
|
59
|
+
{ col1: "value1", col2: 100, col3: true },
|
|
60
|
+
{ col1: "value2", col2: 200, col3: false },
|
|
61
|
+
{ col1: "value3", col2: 300, col3: true },
|
|
62
|
+
];
|
|
63
|
+
const result = anonymizeResults(input);
|
|
64
|
+
expect(result).toEqual([
|
|
65
|
+
{ col1: "string", col2: "number", col3: "boolean" },
|
|
66
|
+
{ col1: "string", col2: "number", col3: "boolean" },
|
|
67
|
+
{ col1: "string", col2: "number", col3: "boolean" },
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
it("handles undefined values", () => {
|
|
71
|
+
const input = [{ defined: 123, undefined: undefined }];
|
|
72
|
+
const result = anonymizeResults(input);
|
|
73
|
+
expect(result).toEqual([
|
|
74
|
+
{ defined: "number", undefined: "undefined" },
|
|
75
|
+
]);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=anonymize.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymize.spec.js","sourceRoot":"","sources":["../../src/anonymize.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouseClient.spec.d.ts","sourceRoot":"","sources":["../../src/clickhouseClient.spec.ts"],"names":[],"mappings":""}
|