@querypanel/node-sdk 1.0.7 → 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.
Files changed (82) hide show
  1. package/README.md +174 -0
  2. package/dist/cjs/adapters/clickhouse.d.ts +36 -0
  3. package/dist/cjs/adapters/clickhouse.d.ts.map +1 -0
  4. package/dist/cjs/adapters/clickhouse.js +256 -0
  5. package/dist/cjs/adapters/clickhouse.js.map +1 -0
  6. package/dist/cjs/adapters/introspection.spec.d.ts +2 -0
  7. package/dist/cjs/adapters/introspection.spec.d.ts.map +1 -0
  8. package/dist/cjs/adapters/introspection.spec.js +201 -0
  9. package/dist/cjs/adapters/introspection.spec.js.map +1 -0
  10. package/dist/cjs/adapters/postgres.d.ts +29 -0
  11. package/dist/cjs/adapters/postgres.d.ts.map +1 -0
  12. package/dist/cjs/adapters/postgres.js +384 -0
  13. package/dist/cjs/adapters/postgres.js.map +1 -0
  14. package/dist/cjs/adapters/types.d.ts +34 -0
  15. package/dist/cjs/adapters/types.d.ts.map +1 -0
  16. package/dist/cjs/adapters/types.js +3 -0
  17. package/dist/cjs/adapters/types.js.map +1 -0
  18. package/dist/cjs/anonymize.spec.d.ts +2 -0
  19. package/dist/cjs/anonymize.spec.d.ts.map +1 -0
  20. package/dist/cjs/anonymize.spec.js +80 -0
  21. package/dist/cjs/anonymize.spec.js.map +1 -0
  22. package/dist/cjs/clickhouseClient.spec.d.ts +2 -0
  23. package/dist/cjs/clickhouseClient.spec.d.ts.map +1 -0
  24. package/dist/cjs/clickhouseClient.spec.js +286 -0
  25. package/dist/cjs/clickhouseClient.spec.js.map +1 -0
  26. package/dist/cjs/connectors/clickhouse.d.ts +4 -4
  27. package/dist/cjs/connectors/clickhouse.d.ts.map +1 -1
  28. package/dist/cjs/connectors/clickhouse.js +30 -23
  29. package/dist/cjs/connectors/clickhouse.js.map +1 -1
  30. package/dist/cjs/index.d.ts +69 -5
  31. package/dist/cjs/index.d.ts.map +1 -1
  32. package/dist/cjs/index.js +257 -50
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/cjs/index.test.d.ts +2 -0
  35. package/dist/cjs/index.test.d.ts.map +1 -0
  36. package/dist/cjs/index.test.js +112 -0
  37. package/dist/cjs/index.test.js.map +1 -0
  38. package/dist/cjs/multidb.spec.d.ts +2 -0
  39. package/dist/cjs/multidb.spec.d.ts.map +1 -0
  40. package/dist/cjs/multidb.spec.js +76 -0
  41. package/dist/cjs/multidb.spec.js.map +1 -0
  42. package/dist/esm/adapters/clickhouse.d.ts +36 -0
  43. package/dist/esm/adapters/clickhouse.d.ts.map +1 -0
  44. package/dist/esm/adapters/clickhouse.js +252 -0
  45. package/dist/esm/adapters/clickhouse.js.map +1 -0
  46. package/dist/esm/adapters/introspection.spec.d.ts +2 -0
  47. package/dist/esm/adapters/introspection.spec.d.ts.map +1 -0
  48. package/dist/esm/adapters/introspection.spec.js +199 -0
  49. package/dist/esm/adapters/introspection.spec.js.map +1 -0
  50. package/dist/esm/adapters/postgres.d.ts +29 -0
  51. package/dist/esm/adapters/postgres.d.ts.map +1 -0
  52. package/dist/esm/adapters/postgres.js +380 -0
  53. package/dist/esm/adapters/postgres.js.map +1 -0
  54. package/dist/esm/adapters/types.d.ts +34 -0
  55. package/dist/esm/adapters/types.d.ts.map +1 -0
  56. package/dist/esm/adapters/types.js +2 -0
  57. package/dist/esm/adapters/types.js.map +1 -0
  58. package/dist/esm/anonymize.spec.d.ts +2 -0
  59. package/dist/esm/anonymize.spec.d.ts.map +1 -0
  60. package/dist/esm/anonymize.spec.js +78 -0
  61. package/dist/esm/anonymize.spec.js.map +1 -0
  62. package/dist/esm/clickhouseClient.spec.d.ts +2 -0
  63. package/dist/esm/clickhouseClient.spec.d.ts.map +1 -0
  64. package/dist/esm/clickhouseClient.spec.js +281 -0
  65. package/dist/esm/clickhouseClient.spec.js.map +1 -0
  66. package/dist/esm/connectors/clickhouse.d.ts +4 -4
  67. package/dist/esm/connectors/clickhouse.d.ts.map +1 -1
  68. package/dist/esm/connectors/clickhouse.js +32 -25
  69. package/dist/esm/connectors/clickhouse.js.map +1 -1
  70. package/dist/esm/index.d.ts +69 -5
  71. package/dist/esm/index.d.ts.map +1 -1
  72. package/dist/esm/index.js +256 -50
  73. package/dist/esm/index.js.map +1 -1
  74. package/dist/esm/index.test.d.ts +2 -0
  75. package/dist/esm/index.test.d.ts.map +1 -0
  76. package/dist/esm/index.test.js +110 -0
  77. package/dist/esm/index.test.js.map +1 -0
  78. package/dist/esm/multidb.spec.d.ts +2 -0
  79. package/dist/esm/multidb.spec.d.ts.map +1 -0
  80. package/dist/esm/multidb.spec.js +74 -0
  81. package/dist/esm/multidb.spec.js.map +1 -0
  82. package/package.json +5 -2
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const clickhouse_js_1 = require("./clickhouse.js");
5
+ const postgres_js_1 = require("./postgres.js");
6
+ function createClickHouseResponse(rows) {
7
+ return {
8
+ json: async () => rows,
9
+ };
10
+ }
11
+ (0, vitest_1.describe)("Database adapter introspection", () => {
12
+ (0, vitest_1.it)("introspects ClickHouse tables", async () => {
13
+ const clientFn = vitest_1.vi.fn(async ({ query }) => {
14
+ if (query.includes("FROM system.tables")) {
15
+ return createClickHouseResponse([
16
+ {
17
+ name: "events",
18
+ engine: "MergeTree",
19
+ comment: "Main events table",
20
+ total_rows: "1000",
21
+ total_bytes: "2048",
22
+ is_view: "0",
23
+ primary_key: "(id)",
24
+ sorting_key: null,
25
+ },
26
+ ]);
27
+ }
28
+ if (query.includes("FROM system.columns")) {
29
+ return createClickHouseResponse([
30
+ {
31
+ table: "events",
32
+ name: "id",
33
+ type: "UInt64",
34
+ position: 1,
35
+ default_kind: null,
36
+ default_expression: null,
37
+ comment: "Primary identifier",
38
+ codec_expression: null,
39
+ ttl_expression: null,
40
+ is_in_primary_key: "1",
41
+ data_compressed_bytes: "128",
42
+ data_uncompressed_bytes: "256",
43
+ },
44
+ {
45
+ table: "events",
46
+ name: "name",
47
+ type: "Nullable(String)",
48
+ position: 2,
49
+ default_kind: null,
50
+ default_expression: null,
51
+ comment: null,
52
+ codec_expression: null,
53
+ ttl_expression: null,
54
+ is_in_primary_key: "0",
55
+ data_compressed_bytes: null,
56
+ data_uncompressed_bytes: null,
57
+ },
58
+ ]);
59
+ }
60
+ return createClickHouseResponse([]);
61
+ });
62
+ const adapter = new clickhouse_js_1.ClickHouseAdapter(clientFn, {
63
+ database: "analytics",
64
+ });
65
+ const result = await adapter.introspect();
66
+ (0, vitest_1.expect)(result.db.name).toBe("analytics");
67
+ (0, vitest_1.expect)(result.tables).toHaveLength(1);
68
+ const table = result.tables[0];
69
+ if (!table)
70
+ throw new Error("missing table");
71
+ (0, vitest_1.expect)(table.columns.map((c) => c.name)).toEqual(["id", "name"]);
72
+ const idColumn = table.columns.find((c) => c.name === "id");
73
+ (0, vitest_1.expect)(idColumn?.isPrimaryKey).toBe(true);
74
+ (0, vitest_1.expect)(table.indexes[0]?.name).toBe("primary_key");
75
+ });
76
+ (0, vitest_1.it)("introspects Postgres tables", async () => {
77
+ const responses = new Map();
78
+ responses.set("tables", () => ({
79
+ rows: [
80
+ {
81
+ table_name: "users",
82
+ schema_name: "public",
83
+ table_type: "BASE TABLE",
84
+ comment: "application users",
85
+ total_rows: 200,
86
+ total_bytes: 4096,
87
+ },
88
+ ],
89
+ fields: [],
90
+ }));
91
+ responses.set("columns", () => ({
92
+ rows: [
93
+ {
94
+ table_name: "users",
95
+ table_schema: "public",
96
+ column_name: "id",
97
+ data_type: "integer",
98
+ udt_name: "int4",
99
+ is_nullable: "NO",
100
+ column_default: "nextval('users_id_seq'::regclass)",
101
+ character_maximum_length: null,
102
+ numeric_precision: 32,
103
+ numeric_scale: 0,
104
+ ordinal_position: 1,
105
+ description: "primary key",
106
+ },
107
+ {
108
+ table_name: "users",
109
+ table_schema: "public",
110
+ column_name: "role_id",
111
+ data_type: "integer",
112
+ udt_name: "int4",
113
+ is_nullable: "YES",
114
+ column_default: null,
115
+ character_maximum_length: null,
116
+ numeric_precision: 32,
117
+ numeric_scale: 0,
118
+ ordinal_position: 2,
119
+ description: null,
120
+ },
121
+ ],
122
+ fields: [],
123
+ }));
124
+ responses.set("constraints", () => ({
125
+ rows: [
126
+ {
127
+ table_schema: "public",
128
+ table_name: "users",
129
+ constraint_name: "users_pkey",
130
+ constraint_type: "PRIMARY KEY",
131
+ column_name: "id",
132
+ foreign_table_schema: null,
133
+ foreign_table_name: null,
134
+ foreign_column_name: null,
135
+ },
136
+ {
137
+ table_schema: "public",
138
+ table_name: "users",
139
+ constraint_name: "users_role_id_fkey",
140
+ constraint_type: "FOREIGN KEY",
141
+ column_name: "role_id",
142
+ foreign_table_schema: "public",
143
+ foreign_table_name: "roles",
144
+ foreign_column_name: "id",
145
+ },
146
+ ],
147
+ fields: [],
148
+ }));
149
+ responses.set("indexes", () => ({
150
+ rows: [
151
+ {
152
+ schema_name: "public",
153
+ table_name: "users",
154
+ index_name: "users_pkey",
155
+ indisunique: true,
156
+ column_names: ["id"],
157
+ definition: "CREATE UNIQUE INDEX users_pkey ON public.users USING btree (id)",
158
+ },
159
+ ],
160
+ fields: [],
161
+ }));
162
+ let indexQuerySql = null;
163
+ let lastSql = null;
164
+ const clientFn = vitest_1.vi.fn(async (sql) => {
165
+ lastSql = sql;
166
+ if (/pg_index\s+idx/.test(sql)) {
167
+ indexQuerySql = sql;
168
+ return responses.get("indexes")?.() ?? { rows: [], fields: [] };
169
+ }
170
+ if (sql.includes("FROM pg_class c")) {
171
+ return responses.get("tables")?.() ?? { rows: [], fields: [] };
172
+ }
173
+ if (sql.includes("information_schema.columns")) {
174
+ return responses.get("columns")?.() ?? { rows: [], fields: [] };
175
+ }
176
+ if (sql.includes("table_constraints")) {
177
+ return responses.get("constraints")?.() ?? { rows: [], fields: [] };
178
+ }
179
+ return { rows: [], fields: [] };
180
+ });
181
+ const adapter = new postgres_js_1.PostgresAdapter(clientFn, {
182
+ database: "app",
183
+ defaultSchema: "public",
184
+ });
185
+ const result = await adapter.introspect();
186
+ if (!indexQuerySql) {
187
+ throw new Error(`index query not executed. last sql: ${lastSql}`);
188
+ }
189
+ (0, vitest_1.expect)(result.db.name).toBe("app");
190
+ const table = result.tables[0];
191
+ if (!table)
192
+ throw new Error("expected table");
193
+ (0, vitest_1.expect)(table.constraints).toHaveLength(2);
194
+ const fk = table.constraints.find((c) => c.type === "FOREIGN KEY");
195
+ (0, vitest_1.expect)(fk?.referencedTable).toBe("public.roles");
196
+ const roleColumn = table.columns.find((c) => c.name === "role_id");
197
+ (0, vitest_1.expect)(roleColumn?.isForeignKey).toBe(true);
198
+ (0, vitest_1.expect)(table.indexes[0]?.columns).toEqual(["id"]);
199
+ });
200
+ });
201
+ //# sourceMappingURL=introspection.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.spec.js","sourceRoot":"","sources":["../../../src/adapters/introspection.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { IntrospectOptions, SchemaIntrospection } from "../schema/types.js";
2
+ import type { DatabaseAdapter, DatabaseExecutionResult } from "./types.js";
3
+ export interface PostgresQueryResult {
4
+ rows: Array<Record<string, unknown>>;
5
+ fields: Array<{
6
+ name: string;
7
+ }>;
8
+ }
9
+ export type PostgresClientFn = (sql: string) => Promise<PostgresQueryResult>;
10
+ export interface PostgresAdapterOptions {
11
+ /** Logical database name used in introspection metadata. */
12
+ database?: string;
13
+ /** Schema to assume when a table is provided without qualification. */
14
+ defaultSchema?: string;
15
+ /** Optional database kind label. Defaults to "postgres". */
16
+ kind?: SchemaIntrospection["db"]["kind"];
17
+ }
18
+ export declare class PostgresAdapter implements DatabaseAdapter {
19
+ private readonly clientFn;
20
+ private readonly databaseName;
21
+ private readonly defaultSchema;
22
+ private readonly kind;
23
+ constructor(clientFn: PostgresClientFn, options?: PostgresAdapterOptions);
24
+ execute(sql: string): Promise<DatabaseExecutionResult>;
25
+ validate(sql: string): Promise<void>;
26
+ getDialect(): "postgres";
27
+ introspect(options?: IntrospectOptions): Promise<SchemaIntrospection>;
28
+ }
29
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../src/adapters/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE7E,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;CAC1C;AAmDD,qBAAa,eAAgB,YAAW,eAAe;IAMnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoC;gBAGtC,QAAQ,EAAE,gBAAgB,EAC3C,OAAO,GAAE,sBAA2B;IAOhC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAMtD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,UAAU,IACD,UAAU;IAGb,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA0K5E"}
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgresAdapter = void 0;
4
+ class PostgresAdapter {
5
+ constructor(clientFn, options = {}) {
6
+ this.clientFn = clientFn;
7
+ this.databaseName = options.database ?? "postgres";
8
+ this.defaultSchema = options.defaultSchema ?? "public";
9
+ this.kind = options.kind ?? "postgres";
10
+ }
11
+ async execute(sql) {
12
+ const result = await this.clientFn(sql);
13
+ const fields = result.fields.map((f) => f.name);
14
+ return { fields, rows: result.rows };
15
+ }
16
+ async validate(sql) {
17
+ await this.clientFn(`EXPLAIN ${sql}`);
18
+ }
19
+ getDialect() {
20
+ return "postgres";
21
+ }
22
+ async introspect(options) {
23
+ const normalizedTables = normalizeTableFilter(options?.tables, this.defaultSchema);
24
+ const tablesResult = await this.clientFn(buildTablesQuery(normalizedTables));
25
+ const tableRows = tablesResult.rows;
26
+ const columnsResult = await this.clientFn(buildColumnsQuery(normalizedTables));
27
+ const columnRows = columnsResult.rows;
28
+ const constraintsResult = await this.clientFn(buildConstraintsQuery(normalizedTables));
29
+ const constraintRows = constraintsResult.rows;
30
+ const indexesResult = await this.clientFn(buildIndexesQuery(normalizedTables));
31
+ const indexRows = indexesResult.rows;
32
+ const tablesByKey = new Map();
33
+ const columnsByKey = new Map();
34
+ for (const row of tableRows) {
35
+ const key = tableKey(row.schema_name, row.table_name);
36
+ const statistics = buildTableStatistics(toNumber(row.total_rows), toNumber(row.total_bytes));
37
+ const table = {
38
+ name: row.table_name,
39
+ schema: row.schema_name,
40
+ type: asTableType(row.table_type),
41
+ columns: [],
42
+ indexes: [],
43
+ constraints: [],
44
+ };
45
+ const comment = sanitize(row.comment);
46
+ if (comment !== undefined) {
47
+ table.comment = comment;
48
+ }
49
+ if (statistics) {
50
+ table.statistics = statistics;
51
+ }
52
+ tablesByKey.set(key, table);
53
+ columnsByKey.set(key, new Map());
54
+ }
55
+ for (const row of columnRows) {
56
+ const key = tableKey(row.table_schema, row.table_name);
57
+ const table = tablesByKey.get(key);
58
+ if (!table)
59
+ continue;
60
+ const column = {
61
+ name: row.column_name,
62
+ type: row.data_type,
63
+ nullable: row.is_nullable.toUpperCase() === "YES",
64
+ isPrimaryKey: false,
65
+ isForeignKey: false,
66
+ };
67
+ const rawType = row.udt_name ?? undefined;
68
+ if (rawType !== undefined)
69
+ column.rawType = rawType;
70
+ const defaultExpression = sanitize(row.column_default);
71
+ if (defaultExpression !== undefined)
72
+ column.defaultExpression = defaultExpression;
73
+ const comment = sanitize(row.description);
74
+ if (comment !== undefined)
75
+ column.comment = comment;
76
+ const maxLength = row.character_maximum_length ?? undefined;
77
+ if (maxLength !== undefined)
78
+ column.maxLength = maxLength;
79
+ const precision = row.numeric_precision ?? undefined;
80
+ if (precision !== undefined)
81
+ column.precision = precision;
82
+ const scale = row.numeric_scale ?? undefined;
83
+ if (scale !== undefined)
84
+ column.scale = scale;
85
+ table.columns.push(column);
86
+ columnsByKey.get(key)?.set(row.column_name, column);
87
+ }
88
+ const constraintGroups = groupConstraints(constraintRows);
89
+ for (const group of constraintGroups) {
90
+ const key = tableKey(group.table_schema, group.table_name);
91
+ const table = tablesByKey.get(key);
92
+ if (!table)
93
+ continue;
94
+ const constraint = {
95
+ name: group.constraint_name,
96
+ type: group.constraint_type,
97
+ columns: [...group.columns],
98
+ };
99
+ if (group.type === "FOREIGN KEY") {
100
+ if (group.foreign_table_name) {
101
+ const referencedTable = group.foreign_table_schema
102
+ ? `${group.foreign_table_schema}.${group.foreign_table_name}`
103
+ : group.foreign_table_name;
104
+ constraint.referencedTable = referencedTable;
105
+ }
106
+ if (group.foreign_columns.length) {
107
+ constraint.referencedColumns = [...group.foreign_columns];
108
+ }
109
+ }
110
+ table.constraints.push(constraint);
111
+ for (let index = 0; index < group.columns.length; index += 1) {
112
+ const columnName = group.columns[index];
113
+ if (!columnName)
114
+ continue;
115
+ const column = columnsByKey.get(key)?.get(columnName);
116
+ if (!column)
117
+ continue;
118
+ if (group.type === "PRIMARY KEY") {
119
+ column.isPrimaryKey = true;
120
+ }
121
+ if (group.type === "FOREIGN KEY") {
122
+ column.isForeignKey = true;
123
+ if (group.foreign_table_name) {
124
+ column.foreignKeyTable = group.foreign_table_schema
125
+ ? `${group.foreign_table_schema}.${group.foreign_table_name}`
126
+ : group.foreign_table_name;
127
+ }
128
+ const referencedColumn = group.foreign_columns[index];
129
+ if (referencedColumn) {
130
+ column.foreignKeyColumn = referencedColumn;
131
+ }
132
+ }
133
+ }
134
+ }
135
+ for (const row of indexRows) {
136
+ const key = tableKey(row.schema_name, row.table_name);
137
+ const table = tablesByKey.get(key);
138
+ if (!table)
139
+ continue;
140
+ const columns = coerceStringArray(row.column_names)
141
+ .map((c) => c.trim())
142
+ .filter(Boolean);
143
+ const index = {
144
+ name: row.index_name,
145
+ columns,
146
+ unique: Boolean(row.indisunique),
147
+ type: columns.length === 1 ? "INDEX" : "COMPOSITE INDEX",
148
+ };
149
+ const definition = sanitize(row.definition);
150
+ if (definition !== undefined)
151
+ index.definition = definition;
152
+ table.indexes.push(index);
153
+ }
154
+ const tables = Array.from(tablesByKey.values()).sort((a, b) => {
155
+ if (a.schema === b.schema) {
156
+ return a.name.localeCompare(b.name);
157
+ }
158
+ return a.schema.localeCompare(b.schema);
159
+ });
160
+ return {
161
+ db: {
162
+ kind: this.kind,
163
+ name: this.databaseName,
164
+ },
165
+ tables,
166
+ introspectedAt: new Date().toISOString(),
167
+ };
168
+ }
169
+ }
170
+ exports.PostgresAdapter = PostgresAdapter;
171
+ function groupConstraints(rows) {
172
+ const groups = new Map();
173
+ for (const row of rows) {
174
+ const key = `${row.table_schema}.${row.table_name}.${row.constraint_name}`;
175
+ let group = groups.get(key);
176
+ if (!group) {
177
+ group = {
178
+ table_schema: row.table_schema,
179
+ table_name: row.table_name,
180
+ constraint_name: row.constraint_name,
181
+ constraint_type: row.constraint_type,
182
+ columns: [],
183
+ foreign_columns: [],
184
+ type: row.constraint_type,
185
+ };
186
+ groups.set(key, group);
187
+ }
188
+ if (row.column_name) {
189
+ group.columns.push(row.column_name);
190
+ }
191
+ if (row.constraint_type === "FOREIGN KEY") {
192
+ group.foreign_table_schema = row.foreign_table_schema;
193
+ group.foreign_table_name = row.foreign_table_name;
194
+ if (row.foreign_column_name) {
195
+ group.foreign_columns.push(row.foreign_column_name);
196
+ }
197
+ }
198
+ }
199
+ return Array.from(groups.values());
200
+ }
201
+ function normalizeTableFilter(tables, defaultSchema) {
202
+ if (!tables?.length)
203
+ return [];
204
+ const normalized = [];
205
+ const seen = new Set();
206
+ for (const raw of tables) {
207
+ if (!raw)
208
+ continue;
209
+ const trimmed = raw.trim();
210
+ if (!trimmed)
211
+ continue;
212
+ const parts = trimmed.split(".");
213
+ const table = parts.pop() ?? "";
214
+ const schema = parts.pop() ?? defaultSchema;
215
+ if (!isSafeIdentifier(schema) || !isSafeIdentifier(table)) {
216
+ continue;
217
+ }
218
+ const key = tableKey(schema, table);
219
+ if (seen.has(key))
220
+ continue;
221
+ seen.add(key);
222
+ normalized.push({ schema, table });
223
+ }
224
+ return normalized;
225
+ }
226
+ function buildTablesQuery(tables) {
227
+ const filter = buildFilterClause(tables, "n.nspname", "c.relname");
228
+ return `SELECT
229
+ c.relname AS table_name,
230
+ n.nspname AS schema_name,
231
+ CASE c.relkind
232
+ WHEN 'r' THEN 'table'
233
+ WHEN 'v' THEN 'view'
234
+ WHEN 'm' THEN 'materialized_view'
235
+ ELSE c.relkind::text
236
+ END AS table_type,
237
+ obj_description(c.oid) AS comment,
238
+ c.reltuples AS total_rows,
239
+ pg_total_relation_size(c.oid) AS total_bytes
240
+ FROM pg_class c
241
+ JOIN pg_namespace n ON n.oid = c.relnamespace
242
+ WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
243
+ AND c.relkind IN ('r', 'v', 'm')
244
+ ${filter}
245
+ ORDER BY n.nspname, c.relname;`;
246
+ }
247
+ function buildColumnsQuery(tables) {
248
+ const filter = buildFilterClause(tables, "cols.table_schema", "cols.table_name");
249
+ return `SELECT
250
+ cols.table_name,
251
+ cols.table_schema,
252
+ cols.column_name,
253
+ cols.data_type,
254
+ cols.udt_name,
255
+ cols.is_nullable,
256
+ cols.column_default,
257
+ cols.character_maximum_length,
258
+ cols.numeric_precision,
259
+ cols.numeric_scale,
260
+ cols.ordinal_position,
261
+ pgd.description
262
+ FROM information_schema.columns cols
263
+ LEFT JOIN pg_catalog.pg_class c
264
+ ON c.relname = cols.table_name
265
+ AND c.relkind IN ('r', 'v', 'm')
266
+ LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
267
+ LEFT JOIN pg_catalog.pg_attribute attr
268
+ ON attr.attrelid = c.oid
269
+ AND attr.attname = cols.column_name
270
+ LEFT JOIN pg_catalog.pg_description pgd
271
+ ON pgd.objoid = attr.attrelid AND pgd.objsubid = attr.attnum
272
+ WHERE cols.table_schema NOT IN ('pg_catalog', 'information_schema')
273
+ ${filter}
274
+ ORDER BY cols.table_schema, cols.table_name, cols.ordinal_position;`;
275
+ }
276
+ function buildConstraintsQuery(tables) {
277
+ const filter = buildFilterClause(tables, "tc.table_schema", "tc.table_name");
278
+ return `SELECT
279
+ tc.table_schema,
280
+ tc.table_name,
281
+ tc.constraint_name,
282
+ tc.constraint_type,
283
+ kcu.column_name,
284
+ ccu.table_schema AS foreign_table_schema,
285
+ ccu.table_name AS foreign_table_name,
286
+ ccu.column_name AS foreign_column_name
287
+ FROM information_schema.table_constraints tc
288
+ LEFT JOIN information_schema.key_column_usage kcu
289
+ ON tc.constraint_name = kcu.constraint_name
290
+ AND tc.table_schema = kcu.table_schema
291
+ LEFT JOIN information_schema.constraint_column_usage ccu
292
+ ON ccu.constraint_name = tc.constraint_name
293
+ AND ccu.table_schema = tc.table_schema
294
+ WHERE tc.constraint_type IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY')
295
+ AND tc.table_schema NOT IN ('pg_catalog', 'information_schema')
296
+ ${filter}
297
+ ORDER BY tc.table_schema, tc.table_name, tc.constraint_name, kcu.ordinal_position;`;
298
+ }
299
+ function buildIndexesQuery(tables) {
300
+ const filter = buildFilterClause(tables, "n.nspname", "c.relname");
301
+ return `SELECT
302
+ n.nspname AS schema_name,
303
+ c.relname AS table_name,
304
+ ci.relname AS index_name,
305
+ idx.indisunique,
306
+ array_remove(
307
+ array_agg(pg_get_indexdef(idx.indexrelid, g.k, true) ORDER BY g.k),
308
+ NULL
309
+ ) AS column_names,
310
+ pg_get_indexdef(idx.indexrelid) AS definition
311
+ FROM pg_class c
312
+ JOIN pg_namespace n ON n.oid = c.relnamespace
313
+ JOIN pg_index idx ON idx.indrelid = c.oid
314
+ JOIN pg_class ci ON ci.oid = idx.indexrelid
315
+ JOIN LATERAL generate_subscripts(idx.indkey, 1) AS g(k) ON true
316
+ WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
317
+ ${filter}
318
+ GROUP BY n.nspname, c.relname, ci.relname, idx.indisunique, idx.indexrelid;`;
319
+ }
320
+ function buildFilterClause(tables, schemaExpr, tableExpr) {
321
+ if (!tables.length)
322
+ return "";
323
+ const clauses = tables.map(({ schema, table }) => {
324
+ return `(${schemaExpr} = '${schema}' AND ${tableExpr} = '${table}')`;
325
+ });
326
+ return `AND (${clauses.join(" OR ")})`;
327
+ }
328
+ function tableKey(schema, table) {
329
+ return `${schema}.${table}`;
330
+ }
331
+ function isSafeIdentifier(value) {
332
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
333
+ }
334
+ function asTableType(value) {
335
+ const normalized = value.toLowerCase();
336
+ if (normalized.includes("view")) {
337
+ return normalized.includes("materialized") ? "materialized_view" : "view";
338
+ }
339
+ return "table";
340
+ }
341
+ function buildTableStatistics(totalRows, totalBytes) {
342
+ if (totalRows === undefined && totalBytes === undefined)
343
+ return undefined;
344
+ const stats = {};
345
+ if (totalRows !== undefined)
346
+ stats.totalRows = totalRows;
347
+ if (totalBytes !== undefined)
348
+ stats.totalBytes = totalBytes;
349
+ return stats;
350
+ }
351
+ function sanitize(value) {
352
+ if (value === null || value === undefined)
353
+ return undefined;
354
+ const trimmed = String(value).trim();
355
+ return trimmed.length ? trimmed : undefined;
356
+ }
357
+ function toNumber(value) {
358
+ if (value === null || value === undefined)
359
+ return undefined;
360
+ if (typeof value === "number")
361
+ return value;
362
+ const parsed = Number.parseFloat(String(value));
363
+ return Number.isNaN(parsed) ? undefined : parsed;
364
+ }
365
+ function coerceStringArray(value) {
366
+ if (!value)
367
+ return [];
368
+ if (Array.isArray(value)) {
369
+ return value.map((entry) => String(entry));
370
+ }
371
+ const text = String(value).trim();
372
+ if (!text)
373
+ return [];
374
+ const withoutBraces = text.startsWith("{") && text.endsWith("}")
375
+ ? text.slice(1, -1)
376
+ : text;
377
+ if (!withoutBraces)
378
+ return [];
379
+ return withoutBraces
380
+ .split(",")
381
+ .map((part) => part.trim().replace(/^"(.+)"$/, "$1"))
382
+ .filter(Boolean);
383
+ }
384
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../src/adapters/postgres.ts"],"names":[],"mappings":";;;AA8EA,MAAa,eAAe;IAK1B,YACmB,QAA0B,EAC3C,UAAkC,EAAE;QADnB,aAAQ,GAAR,QAAQ,CAAkB;QAG3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,QAAQ,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,UAAU;QACR,OAAO,UAAmB,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA2B;QAC1C,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEnF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,IAAkB,CAAC;QAElD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CACvC,iBAAiB,CAAC,gBAAgB,CAAC,CACpC,CAAC;QACF,MAAM,UAAU,GAAG,aAAa,CAAC,IAAmB,CAAC;QAErD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAC3C,qBAAqB,CAAC,gBAAgB,CAAC,CACxC,CAAC;QACF,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAuB,CAAC;QAEjE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CACvC,iBAAiB,CAAC,gBAAgB,CAAC,CACpC,CAAC;QACF,MAAM,SAAS,GAAG,aAAa,CAAC,IAAkB,CAAC;QAEnD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqC,CAAC;QAElE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,oBAAoB,CACrC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EACxB,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAC1B,CAAC;YAEF,MAAM,KAAK,GAAgB;gBACzB,IAAI,EAAE,GAAG,CAAC,UAAU;gBACpB,MAAM,EAAE,GAAG,CAAC,WAAW;gBACvB,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;gBACjC,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE;aAChB,CAAC;YAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAC1B,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAChC,CAAC;YAED,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5B,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,MAAM,MAAM,GAAiB;gBAC3B,IAAI,EAAE,GAAG,CAAC,WAAW;gBACrB,IAAI,EAAE,GAAG,CAAC,SAAS;gBACnB,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,KAAK;gBACjD,YAAY,EAAE,KAAK;gBACnB,YAAY,EAAE,KAAK;aACpB,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC;YAC1C,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAEpD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACvD,IAAI,iBAAiB,KAAK,SAAS;gBAAE,MAAM,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAElF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAEpD,MAAM,SAAS,GAAG,GAAG,CAAC,wBAAwB,IAAI,SAAS,CAAC;YAC5D,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YAE1D,MAAM,SAAS,GAAG,GAAG,CAAC,iBAAiB,IAAI,SAAS,CAAC;YACrD,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;YAE1D,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,IAAI,SAAS,CAAC;YAC7C,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YAE9C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,MAAM,UAAU,GAAqB;gBACnC,IAAI,EAAE,KAAK,CAAC,eAAe;gBAC3B,IAAI,EAAE,KAAK,CAAC,eAAe;gBAC3B,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;aAC5B,CAAC;YAEF,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACjC,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;oBAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,oBAAoB;wBAChD,CAAC,CAAC,GAAG,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,kBAAkB,EAAE;wBAC7D,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;oBAC7B,UAAU,CAAC,eAAe,GAAG,eAAe,CAAC;gBAC/C,CAAC;gBACD,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;oBACjC,UAAU,CAAC,iBAAiB,GAAG,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YAED,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACtB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACjC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC7B,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACjC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;oBAC3B,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;wBAC7B,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,oBAAoB;4BACjD,CAAC,CAAC,GAAG,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,kBAAkB,EAAE;4BAC7D,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;oBAC/B,CAAC;oBACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;oBACtD,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;oBAC7C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,SAAS;YACvB,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC;iBAChD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACjB,MAAM,KAAK,GAAgB;gBACzB,IAAI,EAAE,GAAG,CAAC,UAAU;gBACpB,OAAO;gBACP,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;gBAChC,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB;aACzD,CAAC;YACF,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,UAAU,KAAK,SAAS;gBAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAC5D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,EAAE,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,YAAY;aACxB;YACD,MAAM;YACN,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACzC,CAAC;IACJ,CAAC;CACF;AAtMD,0CAsMC;AAcD,SAAS,gBAAgB,CAAC,IAAqB;IAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QAC3E,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,OAAO,EAAE,EAAE;gBACX,eAAe,EAAE,EAAE;gBACnB,IAAI,EAAE,GAAG,CAAC,eAAe;aAC1B,CAAC;YACF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,GAAG,CAAC,eAAe,KAAK,aAAa,EAAE,CAAC;YAC1C,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,oBAAoB,CAAC;YACtD,KAAK,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC;YAClD,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;gBAC5B,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAA4B,EAC5B,aAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC;QAC5C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAyB;IACjD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,OAAO;;;;;;;;;;;;;;;;MAgBH,MAAM;iCACqB,CAAC;AAClC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAyB;IAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IACjF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;MAwBH,MAAM;sEAC0D,CAAC;AACvE,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAyB;IACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;IAC7E,OAAO;;;;;;;;;;;;;;;;;;MAkBH,MAAM;qFACyE,CAAC;AACtF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAyB;IAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,OAAO;;;;;;;;;;;;;;;;MAgBH,MAAM;8EACkE,CAAC;AAC/E,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAyB,EACzB,UAAkB,EAClB,SAAiB;IAEjB,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC/C,OAAO,IAAI,UAAU,OAAO,MAAM,SAAS,SAAS,OAAO,KAAK,IAAI,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAa;IAC7C,OAAO,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAAkB,EAClB,UAAmB;IAEnB,IAAI,SAAS,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1E,MAAM,KAAK,GAA2C,EAAE,CAAC;IACzD,IAAI,SAAS,KAAK,SAAS;QAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACzD,IAAI,UAAU,KAAK,SAAS;QAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,aAAa;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;SACpD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC"}