@revealui/db 0.2.0
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 +22 -0
- package/README.md +137 -0
- package/dist/audit-store.d.ts +56 -0
- package/dist/audit-store.d.ts.map +1 -0
- package/dist/audit-store.js +120 -0
- package/dist/audit-store.js.map +1 -0
- package/dist/client/index.d.ts +214 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +396 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +109 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +10 -0
- package/dist/client/types.js.map +1 -0
- package/dist/crypto.d.ts +27 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +68 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/log-transport.d.ts +20 -0
- package/dist/log-transport.d.ts.map +1 -0
- package/dist/log-transport.js +49 -0
- package/dist/log-transport.js.map +1 -0
- package/dist/pool.d.ts +36 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +218 -0
- package/dist/pool.js.map +1 -0
- package/dist/queries/boards.d.ts +138 -0
- package/dist/queries/boards.d.ts.map +1 -0
- package/dist/queries/boards.js +87 -0
- package/dist/queries/boards.js.map +1 -0
- package/dist/queries/code-provenance.d.ts +250 -0
- package/dist/queries/code-provenance.d.ts.map +1 -0
- package/dist/queries/code-provenance.js +130 -0
- package/dist/queries/code-provenance.js.map +1 -0
- package/dist/queries/optimized-queries.d.ts +89 -0
- package/dist/queries/optimized-queries.d.ts.map +1 -0
- package/dist/queries/optimized-queries.js +371 -0
- package/dist/queries/optimized-queries.js.map +1 -0
- package/dist/queries/ticket-comments.d.ts +37 -0
- package/dist/queries/ticket-comments.d.ts.map +1 -0
- package/dist/queries/ticket-comments.js +52 -0
- package/dist/queries/ticket-comments.js.map +1 -0
- package/dist/queries/ticket-labels.d.ts +69 -0
- package/dist/queries/ticket-labels.d.ts.map +1 -0
- package/dist/queries/ticket-labels.js +51 -0
- package/dist/queries/ticket-labels.js.map +1 -0
- package/dist/queries/tickets.d.ts +301 -0
- package/dist/queries/tickets.d.ts.map +1 -0
- package/dist/queries/tickets.js +89 -0
- package/dist/queries/tickets.js.map +1 -0
- package/dist/queries/todos.d.ts +37 -0
- package/dist/queries/todos.d.ts.map +1 -0
- package/dist/queries/todos.js +37 -0
- package/dist/queries/todos.js.map +1 -0
- package/dist/schema/agents.d.ts +1413 -0
- package/dist/schema/agents.d.ts.map +1 -0
- package/dist/schema/agents.js +207 -0
- package/dist/schema/agents.js.map +1 -0
- package/dist/schema/api-keys.d.ts +298 -0
- package/dist/schema/api-keys.d.ts.map +1 -0
- package/dist/schema/api-keys.js +53 -0
- package/dist/schema/api-keys.js.map +1 -0
- package/dist/schema/app-logs.d.ts +168 -0
- package/dist/schema/app-logs.d.ts.map +1 -0
- package/dist/schema/app-logs.js +25 -0
- package/dist/schema/app-logs.js.map +1 -0
- package/dist/schema/audit-log.d.ts +174 -0
- package/dist/schema/audit-log.d.ts.map +1 -0
- package/dist/schema/audit-log.js +37 -0
- package/dist/schema/audit-log.js.map +1 -0
- package/dist/schema/cms.d.ts +1015 -0
- package/dist/schema/cms.d.ts.map +1 -0
- package/dist/schema/cms.js +137 -0
- package/dist/schema/cms.js.map +1 -0
- package/dist/schema/code-provenance.d.ts +488 -0
- package/dist/schema/code-provenance.d.ts.map +1 -0
- package/dist/schema/code-provenance.js +72 -0
- package/dist/schema/code-provenance.js.map +1 -0
- package/dist/schema/collab-edits.d.ts +165 -0
- package/dist/schema/collab-edits.d.ts.map +1 -0
- package/dist/schema/collab-edits.js +21 -0
- package/dist/schema/collab-edits.js.map +1 -0
- package/dist/schema/crdt-operations.d.ts +153 -0
- package/dist/schema/crdt-operations.d.ts.map +1 -0
- package/dist/schema/crdt-operations.js +30 -0
- package/dist/schema/crdt-operations.js.map +1 -0
- package/dist/schema/error-events.d.ts +223 -0
- package/dist/schema/error-events.d.ts.map +1 -0
- package/dist/schema/error-events.js +44 -0
- package/dist/schema/error-events.js.map +1 -0
- package/dist/schema/index.d.ts +130 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +310 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/licenses.d.ts +189 -0
- package/dist/schema/licenses.d.ts.map +1 -0
- package/dist/schema/licenses.js +39 -0
- package/dist/schema/licenses.js.map +1 -0
- package/dist/schema/node-ids.d.ts +122 -0
- package/dist/schema/node-ids.d.ts.map +1 -0
- package/dist/schema/node-ids.js +25 -0
- package/dist/schema/node-ids.js.map +1 -0
- package/dist/schema/pages.d.ts +488 -0
- package/dist/schema/pages.d.ts.map +1 -0
- package/dist/schema/pages.js +70 -0
- package/dist/schema/pages.js.map +1 -0
- package/dist/schema/password-reset-tokens.d.ts +137 -0
- package/dist/schema/password-reset-tokens.d.ts.map +1 -0
- package/dist/schema/password-reset-tokens.js +26 -0
- package/dist/schema/password-reset-tokens.js.map +1 -0
- package/dist/schema/query.d.ts +11 -0
- package/dist/schema/query.d.ts.map +1 -0
- package/dist/schema/query.js +11 -0
- package/dist/schema/query.js.map +1 -0
- package/dist/schema/rate-limits.d.ts +212 -0
- package/dist/schema/rate-limits.d.ts.map +1 -0
- package/dist/schema/rate-limits.js +38 -0
- package/dist/schema/rate-limits.js.map +1 -0
- package/dist/schema/rest.d.ts +31 -0
- package/dist/schema/rest.d.ts.map +1 -0
- package/dist/schema/rest.js +37 -0
- package/dist/schema/rest.js.map +1 -0
- package/dist/schema/sites.d.ts +365 -0
- package/dist/schema/sites.d.ts.map +1 -0
- package/dist/schema/sites.js +62 -0
- package/dist/schema/sites.js.map +1 -0
- package/dist/schema/tickets.d.ts +1118 -0
- package/dist/schema/tickets.d.ts.map +1 -0
- package/dist/schema/tickets.js +150 -0
- package/dist/schema/tickets.js.map +1 -0
- package/dist/schema/todos.d.ts +98 -0
- package/dist/schema/todos.d.ts.map +1 -0
- package/dist/schema/todos.js +12 -0
- package/dist/schema/todos.js.map +1 -0
- package/dist/schema/users.d.ts +503 -0
- package/dist/schema/users.d.ts.map +1 -0
- package/dist/schema/users.js +75 -0
- package/dist/schema/users.js.map +1 -0
- package/dist/schema/vector.d.ts +9 -0
- package/dist/schema/vector.d.ts.map +1 -0
- package/dist/schema/vector.js +9 -0
- package/dist/schema/vector.js.map +1 -0
- package/dist/schema/waitlist.d.ts +151 -0
- package/dist/schema/waitlist.d.ts.map +1 -0
- package/dist/schema/waitlist.js +17 -0
- package/dist/schema/waitlist.js.map +1 -0
- package/dist/schema/yjs-documents.d.ts +116 -0
- package/dist/schema/yjs-documents.d.ts.map +1 -0
- package/dist/schema/yjs-documents.js +15 -0
- package/dist/schema/yjs-documents.js.map +1 -0
- package/dist/types/database.d.ts +740 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/database.js +151 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/discover.d.ts +83 -0
- package/dist/types/discover.d.ts.map +1 -0
- package/dist/types/discover.js +271 -0
- package/dist/types/discover.js.map +1 -0
- package/dist/types/extract-relationships.d.ts +115 -0
- package/dist/types/extract-relationships.d.ts.map +1 -0
- package/dist/types/extract-relationships.js +455 -0
- package/dist/types/extract-relationships.js.map +1 -0
- package/dist/types/generate-contracts.d.ts +19 -0
- package/dist/types/generate-contracts.d.ts.map +1 -0
- package/dist/types/generate-contracts.js +128 -0
- package/dist/types/generate-contracts.js.map +1 -0
- package/dist/types/generate-zod-schemas.d.ts +20 -0
- package/dist/types/generate-zod-schemas.d.ts.map +1 -0
- package/dist/types/generate-zod-schemas.js +128 -0
- package/dist/types/generate-zod-schemas.js.map +1 -0
- package/dist/types/generate.d.ts +17 -0
- package/dist/types/generate.d.ts.map +1 -0
- package/dist/types/generate.js +298 -0
- package/dist/types/generate.js.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/introspect.d.ts +75 -0
- package/dist/types/introspect.d.ts.map +1 -0
- package/dist/types/introspect.js +187 -0
- package/dist/types/introspect.js.map +1 -0
- package/dist/types/stripe-schema.d.ts +893 -0
- package/dist/types/stripe-schema.d.ts.map +1 -0
- package/dist/types/stripe-schema.js +112 -0
- package/dist/types/stripe-schema.js.map +1 -0
- package/package.json +154 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @revealui/db/types - Database Type Exports
|
|
3
|
+
*
|
|
4
|
+
* Centralized type exports for NeonDB database.
|
|
5
|
+
* Provides feature parity with Supabase's Database type structure.
|
|
6
|
+
*
|
|
7
|
+
* ## Usage
|
|
8
|
+
*
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import type { Database } from '@revealui/db/types'
|
|
11
|
+
*
|
|
12
|
+
* // Extract table types
|
|
13
|
+
* type User = Database['public']['Tables']['users']['Row']
|
|
14
|
+
* type NewUser = Database['public']['Tables']['users']['Insert']
|
|
15
|
+
* type UserUpdate = Database['public']['Tables']['users']['Update']
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Database Introspection System
|
|
4
|
+
*
|
|
5
|
+
* Validates Drizzle schemas against the actual database structure.
|
|
6
|
+
* Can optionally generate types from the database for validation.
|
|
7
|
+
*
|
|
8
|
+
* This provides:
|
|
9
|
+
* 1. Schema validation - ensures Drizzle schemas match database
|
|
10
|
+
* 2. Type generation from DB - generates types from actual database (for comparison)
|
|
11
|
+
* 3. Migration validation - ensures migrations are applied correctly
|
|
12
|
+
*/
|
|
13
|
+
interface IntrospectionOptions {
|
|
14
|
+
/** Database connection string */
|
|
15
|
+
connectionString?: string;
|
|
16
|
+
/** Whether to generate types from database */
|
|
17
|
+
generateTypes?: boolean;
|
|
18
|
+
/** Whether to validate schema matches */
|
|
19
|
+
validateSchema?: boolean;
|
|
20
|
+
/** Output file for generated types (if generateTypes is true) */
|
|
21
|
+
outputFile?: string;
|
|
22
|
+
}
|
|
23
|
+
interface IntrospectionResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
tables: string[];
|
|
26
|
+
mismatches?: Array<{
|
|
27
|
+
table: string;
|
|
28
|
+
issue: string;
|
|
29
|
+
}>;
|
|
30
|
+
errors?: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Introspect the database and validate against Drizzle schemas
|
|
34
|
+
*
|
|
35
|
+
* Connects to the database and queries information_schema to validate
|
|
36
|
+
* that Drizzle schemas match the actual database structure.
|
|
37
|
+
*/
|
|
38
|
+
export declare function introspectDatabase(options?: IntrospectionOptions): Promise<IntrospectionResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Generate types from actual database structure
|
|
41
|
+
*
|
|
42
|
+
* Note: This is a placeholder for future enhancement. Currently, we use
|
|
43
|
+
* schema-based type generation (generate.ts) which automatically discovers
|
|
44
|
+
* tables and relationships from Drizzle schemas. This approach is preferred
|
|
45
|
+
* because:
|
|
46
|
+
* - It keeps types in sync with code
|
|
47
|
+
* - It's faster and doesn't require database connection
|
|
48
|
+
* - It provides better type safety with Drizzle's inference
|
|
49
|
+
*
|
|
50
|
+
* If database-first type generation is needed in the future, this would:
|
|
51
|
+
* 1. Connect to database using Drizzle Kit introspection API
|
|
52
|
+
* 2. Query information_schema for tables, columns, and relationships
|
|
53
|
+
* 3. Generate TypeScript types matching the Database type structure
|
|
54
|
+
* 4. Write to outputFile
|
|
55
|
+
*
|
|
56
|
+
* @param connectionString - Database connection string
|
|
57
|
+
* @param outputFile - Output file path
|
|
58
|
+
*/
|
|
59
|
+
export declare function generateTypesFromDatabase(connectionString: string, outputFile: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Validate that Drizzle schemas match the database
|
|
62
|
+
*
|
|
63
|
+
* Compares schema definitions with actual database structure.
|
|
64
|
+
*
|
|
65
|
+
* @param connectionString - Database connection string
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateSchemaMatch(connectionString: string): Promise<{
|
|
68
|
+
success: boolean;
|
|
69
|
+
mismatches: Array<{
|
|
70
|
+
table: string;
|
|
71
|
+
issue: string;
|
|
72
|
+
}>;
|
|
73
|
+
}>;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=introspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.d.ts","sourceRoot":"","sources":["../../src/types/introspect.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAMH,UAAU,oBAAoB;IAC5B,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,yCAAyC;IACzC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;IACF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAoF9B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,wBAAsB,yBAAyB,CAC7C,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3E,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACpD,CAAC,CAUD"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Database Introspection System
|
|
4
|
+
*
|
|
5
|
+
* Validates Drizzle schemas against the actual database structure.
|
|
6
|
+
* Can optionally generate types from the database for validation.
|
|
7
|
+
*
|
|
8
|
+
* This provides:
|
|
9
|
+
* 1. Schema validation - ensures Drizzle schemas match database
|
|
10
|
+
* 2. Type generation from DB - generates types from actual database (for comparison)
|
|
11
|
+
* 3. Migration validation - ensures migrations are applied correctly
|
|
12
|
+
*/
|
|
13
|
+
import { neon } from '@neondatabase/serverless';
|
|
14
|
+
import { logger } from '@revealui/utils/logger';
|
|
15
|
+
import { discoverTables } from './discover.js';
|
|
16
|
+
/**
|
|
17
|
+
* Introspect the database and validate against Drizzle schemas
|
|
18
|
+
*
|
|
19
|
+
* Connects to the database and queries information_schema to validate
|
|
20
|
+
* that Drizzle schemas match the actual database structure.
|
|
21
|
+
*/
|
|
22
|
+
export async function introspectDatabase(options = {}) {
|
|
23
|
+
const { validateSchema = true } = options;
|
|
24
|
+
// Only use environment fallback if connectionString is not in options at all
|
|
25
|
+
// If explicitly set to undefined, treat as missing
|
|
26
|
+
const connectionString = 'connectionString' in options
|
|
27
|
+
? options.connectionString
|
|
28
|
+
: process.env.POSTGRES_URL || process.env.DATABASE_URL;
|
|
29
|
+
if (!connectionString) {
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
tables: [],
|
|
33
|
+
errors: ['Database connection string not provided'],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
// Connect to database
|
|
38
|
+
const sql = neon(connectionString);
|
|
39
|
+
// Query information_schema for tables in public schema
|
|
40
|
+
const dbTables = (await sql `
|
|
41
|
+
SELECT table_name
|
|
42
|
+
FROM information_schema.tables
|
|
43
|
+
WHERE table_schema = 'public'
|
|
44
|
+
AND table_type = 'BASE TABLE'
|
|
45
|
+
ORDER BY table_name
|
|
46
|
+
`);
|
|
47
|
+
const tableNames = dbTables.map((row) => row.table_name);
|
|
48
|
+
// Discover tables from Drizzle schemas
|
|
49
|
+
const discoveryResult = discoverTables();
|
|
50
|
+
const { tables: schemaTables } = discoveryResult;
|
|
51
|
+
// Explicitly type the Set to ensure proper type inference
|
|
52
|
+
const schemaTableNames = new Set(schemaTables.map((t) => t.tableName));
|
|
53
|
+
const mismatches = [];
|
|
54
|
+
if (validateSchema) {
|
|
55
|
+
// Check for tables in database but not in schema
|
|
56
|
+
for (const dbTable of tableNames) {
|
|
57
|
+
if (!schemaTableNames.has(dbTable)) {
|
|
58
|
+
mismatches.push({
|
|
59
|
+
table: dbTable,
|
|
60
|
+
issue: `Table exists in database but not in Drizzle schema`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Check for tables in schema but not in database
|
|
65
|
+
// schemaTableNames is Set<string>, so iteration yields string directly
|
|
66
|
+
for (const schemaTable of schemaTableNames) {
|
|
67
|
+
// TypeScript now correctly infers schemaTable as string
|
|
68
|
+
if (!tableNames.includes(schemaTable)) {
|
|
69
|
+
mismatches.push({
|
|
70
|
+
table: schemaTable,
|
|
71
|
+
issue: `Table defined in Drizzle schema but not in database`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const result = {
|
|
77
|
+
success: mismatches.length === 0,
|
|
78
|
+
tables: tableNames,
|
|
79
|
+
};
|
|
80
|
+
if (validateSchema) {
|
|
81
|
+
result.mismatches = mismatches;
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
tables: [],
|
|
89
|
+
errors: [
|
|
90
|
+
`Database introspection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
91
|
+
],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Generate types from actual database structure
|
|
97
|
+
*
|
|
98
|
+
* Note: This is a placeholder for future enhancement. Currently, we use
|
|
99
|
+
* schema-based type generation (generate.ts) which automatically discovers
|
|
100
|
+
* tables and relationships from Drizzle schemas. This approach is preferred
|
|
101
|
+
* because:
|
|
102
|
+
* - It keeps types in sync with code
|
|
103
|
+
* - It's faster and doesn't require database connection
|
|
104
|
+
* - It provides better type safety with Drizzle's inference
|
|
105
|
+
*
|
|
106
|
+
* If database-first type generation is needed in the future, this would:
|
|
107
|
+
* 1. Connect to database using Drizzle Kit introspection API
|
|
108
|
+
* 2. Query information_schema for tables, columns, and relationships
|
|
109
|
+
* 3. Generate TypeScript types matching the Database type structure
|
|
110
|
+
* 4. Write to outputFile
|
|
111
|
+
*
|
|
112
|
+
* @param connectionString - Database connection string
|
|
113
|
+
* @param outputFile - Output file path
|
|
114
|
+
*/
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
116
|
+
export async function generateTypesFromDatabase(connectionString, outputFile) {
|
|
117
|
+
void connectionString;
|
|
118
|
+
void outputFile;
|
|
119
|
+
throw new Error('Database introspection type generation not yet implemented. ' +
|
|
120
|
+
'Use the schema-based type generator (generate.ts) instead. ' +
|
|
121
|
+
'Run: pnpm --filter @revealui/db generate:types');
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate that Drizzle schemas match the database
|
|
125
|
+
*
|
|
126
|
+
* Compares schema definitions with actual database structure.
|
|
127
|
+
*
|
|
128
|
+
* @param connectionString - Database connection string
|
|
129
|
+
*/
|
|
130
|
+
export async function validateSchemaMatch(connectionString) {
|
|
131
|
+
const result = await introspectDatabase({
|
|
132
|
+
connectionString,
|
|
133
|
+
validateSchema: true,
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
success: result.success,
|
|
137
|
+
mismatches: result.mismatches || [],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// CLI interface
|
|
141
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
142
|
+
const args = process.argv.slice(2);
|
|
143
|
+
const connectionString = process.env.POSTGRES_URL || process.env.DATABASE_URL;
|
|
144
|
+
if (!connectionString) {
|
|
145
|
+
logger.error('POSTGRES_URL or DATABASE_URL environment variable is required', new Error('Missing database connection string'));
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
if (args.includes('--validate')) {
|
|
149
|
+
introspectDatabase({ connectionString, validateSchema: true })
|
|
150
|
+
.then((result) => {
|
|
151
|
+
if (result.success) {
|
|
152
|
+
logger.info('Schema validation passed', {
|
|
153
|
+
tablesFound: result.tables.length,
|
|
154
|
+
mismatches: result.mismatches?.length || 0,
|
|
155
|
+
});
|
|
156
|
+
if (result.mismatches && result.mismatches.length > 0) {
|
|
157
|
+
logger.warn(`${result.mismatches.length} mismatches found`, {
|
|
158
|
+
mismatches: result.mismatches.map((m) => `${m.table}: ${m.issue}`),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
logger.error('Schema validation failed', undefined, {
|
|
164
|
+
errors: result.errors,
|
|
165
|
+
});
|
|
166
|
+
if (result.errors) {
|
|
167
|
+
result.errors.forEach((error) => {
|
|
168
|
+
logger.error('Validation error', undefined, { error });
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
})
|
|
174
|
+
.catch((error) => {
|
|
175
|
+
logger.error('Error during introspection', error instanceof Error ? error : new Error(String(error)));
|
|
176
|
+
process.exit(1);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
logger.info('Database introspection system');
|
|
181
|
+
logger.info('Usage: tsx introspect.ts --validate');
|
|
182
|
+
logger.info('Options: --validate Validate schemas against database');
|
|
183
|
+
logger.info('Note: Full introspection requires database connection.');
|
|
184
|
+
logger.info('Set POSTGRES_URL or DATABASE_URL environment variable.');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../src/types/introspect.ts"],"names":[],"mappings":"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"}
|