@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.
Files changed (191) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +137 -0
  3. package/dist/audit-store.d.ts +56 -0
  4. package/dist/audit-store.d.ts.map +1 -0
  5. package/dist/audit-store.js +120 -0
  6. package/dist/audit-store.js.map +1 -0
  7. package/dist/client/index.d.ts +214 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +396 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/types.d.ts +109 -0
  12. package/dist/client/types.d.ts.map +1 -0
  13. package/dist/client/types.js +10 -0
  14. package/dist/client/types.js.map +1 -0
  15. package/dist/crypto.d.ts +27 -0
  16. package/dist/crypto.d.ts.map +1 -0
  17. package/dist/crypto.js +68 -0
  18. package/dist/crypto.js.map +1 -0
  19. package/dist/index.d.ts +29 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +31 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/log-transport.d.ts +20 -0
  24. package/dist/log-transport.d.ts.map +1 -0
  25. package/dist/log-transport.js +49 -0
  26. package/dist/log-transport.js.map +1 -0
  27. package/dist/pool.d.ts +36 -0
  28. package/dist/pool.d.ts.map +1 -0
  29. package/dist/pool.js +218 -0
  30. package/dist/pool.js.map +1 -0
  31. package/dist/queries/boards.d.ts +138 -0
  32. package/dist/queries/boards.d.ts.map +1 -0
  33. package/dist/queries/boards.js +87 -0
  34. package/dist/queries/boards.js.map +1 -0
  35. package/dist/queries/code-provenance.d.ts +250 -0
  36. package/dist/queries/code-provenance.d.ts.map +1 -0
  37. package/dist/queries/code-provenance.js +130 -0
  38. package/dist/queries/code-provenance.js.map +1 -0
  39. package/dist/queries/optimized-queries.d.ts +89 -0
  40. package/dist/queries/optimized-queries.d.ts.map +1 -0
  41. package/dist/queries/optimized-queries.js +371 -0
  42. package/dist/queries/optimized-queries.js.map +1 -0
  43. package/dist/queries/ticket-comments.d.ts +37 -0
  44. package/dist/queries/ticket-comments.d.ts.map +1 -0
  45. package/dist/queries/ticket-comments.js +52 -0
  46. package/dist/queries/ticket-comments.js.map +1 -0
  47. package/dist/queries/ticket-labels.d.ts +69 -0
  48. package/dist/queries/ticket-labels.d.ts.map +1 -0
  49. package/dist/queries/ticket-labels.js +51 -0
  50. package/dist/queries/ticket-labels.js.map +1 -0
  51. package/dist/queries/tickets.d.ts +301 -0
  52. package/dist/queries/tickets.d.ts.map +1 -0
  53. package/dist/queries/tickets.js +89 -0
  54. package/dist/queries/tickets.js.map +1 -0
  55. package/dist/queries/todos.d.ts +37 -0
  56. package/dist/queries/todos.d.ts.map +1 -0
  57. package/dist/queries/todos.js +37 -0
  58. package/dist/queries/todos.js.map +1 -0
  59. package/dist/schema/agents.d.ts +1413 -0
  60. package/dist/schema/agents.d.ts.map +1 -0
  61. package/dist/schema/agents.js +207 -0
  62. package/dist/schema/agents.js.map +1 -0
  63. package/dist/schema/api-keys.d.ts +298 -0
  64. package/dist/schema/api-keys.d.ts.map +1 -0
  65. package/dist/schema/api-keys.js +53 -0
  66. package/dist/schema/api-keys.js.map +1 -0
  67. package/dist/schema/app-logs.d.ts +168 -0
  68. package/dist/schema/app-logs.d.ts.map +1 -0
  69. package/dist/schema/app-logs.js +25 -0
  70. package/dist/schema/app-logs.js.map +1 -0
  71. package/dist/schema/audit-log.d.ts +174 -0
  72. package/dist/schema/audit-log.d.ts.map +1 -0
  73. package/dist/schema/audit-log.js +37 -0
  74. package/dist/schema/audit-log.js.map +1 -0
  75. package/dist/schema/cms.d.ts +1015 -0
  76. package/dist/schema/cms.d.ts.map +1 -0
  77. package/dist/schema/cms.js +137 -0
  78. package/dist/schema/cms.js.map +1 -0
  79. package/dist/schema/code-provenance.d.ts +488 -0
  80. package/dist/schema/code-provenance.d.ts.map +1 -0
  81. package/dist/schema/code-provenance.js +72 -0
  82. package/dist/schema/code-provenance.js.map +1 -0
  83. package/dist/schema/collab-edits.d.ts +165 -0
  84. package/dist/schema/collab-edits.d.ts.map +1 -0
  85. package/dist/schema/collab-edits.js +21 -0
  86. package/dist/schema/collab-edits.js.map +1 -0
  87. package/dist/schema/crdt-operations.d.ts +153 -0
  88. package/dist/schema/crdt-operations.d.ts.map +1 -0
  89. package/dist/schema/crdt-operations.js +30 -0
  90. package/dist/schema/crdt-operations.js.map +1 -0
  91. package/dist/schema/error-events.d.ts +223 -0
  92. package/dist/schema/error-events.d.ts.map +1 -0
  93. package/dist/schema/error-events.js +44 -0
  94. package/dist/schema/error-events.js.map +1 -0
  95. package/dist/schema/index.d.ts +130 -0
  96. package/dist/schema/index.d.ts.map +1 -0
  97. package/dist/schema/index.js +310 -0
  98. package/dist/schema/index.js.map +1 -0
  99. package/dist/schema/licenses.d.ts +189 -0
  100. package/dist/schema/licenses.d.ts.map +1 -0
  101. package/dist/schema/licenses.js +39 -0
  102. package/dist/schema/licenses.js.map +1 -0
  103. package/dist/schema/node-ids.d.ts +122 -0
  104. package/dist/schema/node-ids.d.ts.map +1 -0
  105. package/dist/schema/node-ids.js +25 -0
  106. package/dist/schema/node-ids.js.map +1 -0
  107. package/dist/schema/pages.d.ts +488 -0
  108. package/dist/schema/pages.d.ts.map +1 -0
  109. package/dist/schema/pages.js +70 -0
  110. package/dist/schema/pages.js.map +1 -0
  111. package/dist/schema/password-reset-tokens.d.ts +137 -0
  112. package/dist/schema/password-reset-tokens.d.ts.map +1 -0
  113. package/dist/schema/password-reset-tokens.js +26 -0
  114. package/dist/schema/password-reset-tokens.js.map +1 -0
  115. package/dist/schema/query.d.ts +11 -0
  116. package/dist/schema/query.d.ts.map +1 -0
  117. package/dist/schema/query.js +11 -0
  118. package/dist/schema/query.js.map +1 -0
  119. package/dist/schema/rate-limits.d.ts +212 -0
  120. package/dist/schema/rate-limits.d.ts.map +1 -0
  121. package/dist/schema/rate-limits.js +38 -0
  122. package/dist/schema/rate-limits.js.map +1 -0
  123. package/dist/schema/rest.d.ts +31 -0
  124. package/dist/schema/rest.d.ts.map +1 -0
  125. package/dist/schema/rest.js +37 -0
  126. package/dist/schema/rest.js.map +1 -0
  127. package/dist/schema/sites.d.ts +365 -0
  128. package/dist/schema/sites.d.ts.map +1 -0
  129. package/dist/schema/sites.js +62 -0
  130. package/dist/schema/sites.js.map +1 -0
  131. package/dist/schema/tickets.d.ts +1118 -0
  132. package/dist/schema/tickets.d.ts.map +1 -0
  133. package/dist/schema/tickets.js +150 -0
  134. package/dist/schema/tickets.js.map +1 -0
  135. package/dist/schema/todos.d.ts +98 -0
  136. package/dist/schema/todos.d.ts.map +1 -0
  137. package/dist/schema/todos.js +12 -0
  138. package/dist/schema/todos.js.map +1 -0
  139. package/dist/schema/users.d.ts +503 -0
  140. package/dist/schema/users.d.ts.map +1 -0
  141. package/dist/schema/users.js +75 -0
  142. package/dist/schema/users.js.map +1 -0
  143. package/dist/schema/vector.d.ts +9 -0
  144. package/dist/schema/vector.d.ts.map +1 -0
  145. package/dist/schema/vector.js +9 -0
  146. package/dist/schema/vector.js.map +1 -0
  147. package/dist/schema/waitlist.d.ts +151 -0
  148. package/dist/schema/waitlist.d.ts.map +1 -0
  149. package/dist/schema/waitlist.js +17 -0
  150. package/dist/schema/waitlist.js.map +1 -0
  151. package/dist/schema/yjs-documents.d.ts +116 -0
  152. package/dist/schema/yjs-documents.d.ts.map +1 -0
  153. package/dist/schema/yjs-documents.js +15 -0
  154. package/dist/schema/yjs-documents.js.map +1 -0
  155. package/dist/types/database.d.ts +740 -0
  156. package/dist/types/database.d.ts.map +1 -0
  157. package/dist/types/database.js +151 -0
  158. package/dist/types/database.js.map +1 -0
  159. package/dist/types/discover.d.ts +83 -0
  160. package/dist/types/discover.d.ts.map +1 -0
  161. package/dist/types/discover.js +271 -0
  162. package/dist/types/discover.js.map +1 -0
  163. package/dist/types/extract-relationships.d.ts +115 -0
  164. package/dist/types/extract-relationships.d.ts.map +1 -0
  165. package/dist/types/extract-relationships.js +455 -0
  166. package/dist/types/extract-relationships.js.map +1 -0
  167. package/dist/types/generate-contracts.d.ts +19 -0
  168. package/dist/types/generate-contracts.d.ts.map +1 -0
  169. package/dist/types/generate-contracts.js +128 -0
  170. package/dist/types/generate-contracts.js.map +1 -0
  171. package/dist/types/generate-zod-schemas.d.ts +20 -0
  172. package/dist/types/generate-zod-schemas.d.ts.map +1 -0
  173. package/dist/types/generate-zod-schemas.js +128 -0
  174. package/dist/types/generate-zod-schemas.js.map +1 -0
  175. package/dist/types/generate.d.ts +17 -0
  176. package/dist/types/generate.d.ts.map +1 -0
  177. package/dist/types/generate.js +298 -0
  178. package/dist/types/generate.js.map +1 -0
  179. package/dist/types/index.d.ts +19 -0
  180. package/dist/types/index.d.ts.map +1 -0
  181. package/dist/types/index.js +19 -0
  182. package/dist/types/index.js.map +1 -0
  183. package/dist/types/introspect.d.ts +75 -0
  184. package/dist/types/introspect.d.ts.map +1 -0
  185. package/dist/types/introspect.js +187 -0
  186. package/dist/types/introspect.js.map +1 -0
  187. package/dist/types/stripe-schema.d.ts +893 -0
  188. package/dist/types/stripe-schema.d.ts.map +1 -0
  189. package/dist/types/stripe-schema.js +112 -0
  190. package/dist/types/stripe-schema.js.map +1 -0
  191. package/package.json +154 -0
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Relationship Extraction Utility
4
+ *
5
+ * Automatically extracts relationships from Drizzle relations() calls.
6
+ * This eliminates the need to manually maintain hardcoded relationships.
7
+ * Uses TypeScript Compiler API for robust, semantic parsing.
8
+ */
9
+ import * as ts from 'typescript';
10
+ import type { DiscoveredTable } from './discover.js';
11
+ export interface ExtractedRelationship {
12
+ foreignKeyName: string;
13
+ columns: string[];
14
+ isOneToOne: boolean;
15
+ referencedRelation: string;
16
+ referencedColumns: string[];
17
+ }
18
+ export interface TableRelationships {
19
+ tableVariableName: string;
20
+ relationships: ExtractedRelationship[];
21
+ }
22
+ /**
23
+ * Parse error with location information
24
+ */
25
+ export interface ParseError {
26
+ file: string;
27
+ message: string;
28
+ position?: {
29
+ line: number;
30
+ column: number;
31
+ };
32
+ node?: string;
33
+ context?: string;
34
+ }
35
+ /**
36
+ * Result of relationship extraction with errors
37
+ */
38
+ export interface ExtractionResult {
39
+ relationships: TableRelationships[];
40
+ errors: ParseError[];
41
+ }
42
+ /**
43
+ * Converts camelCase to snake_case
44
+ * @internal Exported for testing purposes
45
+ */
46
+ export declare function camelToSnake(str: string): string;
47
+ /**
48
+ * Generates foreign key name from relationship
49
+ * Format: <table>_<column>_<referenced_table>_<referenced_column>_fk
50
+ * @internal Exported for testing purposes
51
+ */
52
+ export declare function generateForeignKeyName(tableName: string, column: string, referencedTable: string, referencedColumn: string): string;
53
+ /**
54
+ * Converts table variable name to database table name
55
+ * @internal Exported for testing purposes
56
+ */
57
+ export declare function getTableName(variableName: string, tables: DiscoveredTable[]): string;
58
+ /**
59
+ * Creates a ParseError with position information from source file
60
+ * @internal Exported for testing purposes
61
+ */
62
+ export declare function createParseError(sourceFile: ts.SourceFile, node: ts.Node | null, message: string, context?: string): ParseError;
63
+ /**
64
+ * Parses a TypeScript source file using TypeScript Compiler API
65
+ * @internal Exported for testing purposes
66
+ */
67
+ export declare function parseSourceFile(filePath: string): ts.SourceFile;
68
+ /**
69
+ * Resolves column name from a TypeScript property access expression
70
+ * Handles: sessions.userId -> userId -> user_id
71
+ * @internal Exported for testing purposes
72
+ */
73
+ export declare function resolveColumnName(expr: ts.Expression, expectedTableVar: string): string | null;
74
+ /**
75
+ * Extracts column names from an array literal expression
76
+ * Handles: [sessions.userId, sessions.otherColumn]
77
+ * Detects and warns about unsupported patterns (spreads, nested access, etc.)
78
+ * @internal Exported for testing purposes
79
+ */
80
+ export declare function extractArrayElements(arrayExpr: ts.ArrayLiteralExpression, expectedTableVar: string, sourceFile: ts.SourceFile, context: string, errors: ParseError[]): string[];
81
+ /**
82
+ * Finds all relations() calls in a single AST traversal
83
+ * Returns a map of table variable name to relations() call expression
84
+ *
85
+ * Performance: O(M) where M = AST nodes (single pass)
86
+ * @internal Exported for testing purposes
87
+ */
88
+ export declare function findAllRelationsCalls(sourceFile: ts.SourceFile): Map<string, ts.CallExpression>;
89
+ export declare function extractRelationsObject(relationsCall: ts.CallExpression): ts.ObjectLiteralExpression | null;
90
+ /**
91
+ * Parses a single one() relationship from a property assignment
92
+ * Handles: relationName: one(referencedTable, { fields: [...], references: [...] })
93
+ * Detects unsupported patterns (computed properties, spreads, etc.)
94
+ * @internal Exported for testing purposes
95
+ */
96
+ export declare function parseOneRelationship(prop: ts.PropertyAssignment, sourceTable: string, tables: DiscoveredTable[], sourceFile: ts.SourceFile, errors: ParseError[]): ExtractedRelationship | null;
97
+ /**
98
+ * Extracts all one() relationships from a relations object
99
+ * Detects unsupported patterns and collects errors
100
+ * @internal Exported for testing purposes
101
+ */
102
+ export declare function extractOneRelationships(relationsObj: ts.ObjectLiteralExpression, sourceTable: string, tables: DiscoveredTable[], sourceFile: ts.SourceFile, errors: ParseError[]): ExtractedRelationship[];
103
+ /**
104
+ * Validates extracted relationships against discovered tables
105
+ * @internal Exported for testing purposes
106
+ */
107
+ export declare function validateRelationships(relationships: TableRelationships[], tables: DiscoveredTable[]): ParseError[];
108
+ /**
109
+ * Extracts all relationships from core/index.ts using AST
110
+ *
111
+ * Performance: Single AST traversal (O(M)) instead of N traversals (O(N×M))
112
+ * Returns structured result with relationships and errors
113
+ */
114
+ export declare function extractRelationships(tables: DiscoveredTable[]): ExtractionResult;
115
+ //# sourceMappingURL=extract-relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-relationships.d.ts","sourceRoot":"","sources":["../../src/types/extract-relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,455 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Relationship Extraction Utility
4
+ *
5
+ * Automatically extracts relationships from Drizzle relations() calls.
6
+ * This eliminates the need to manually maintain hardcoded relationships.
7
+ * Uses TypeScript Compiler API for robust, semantic parsing.
8
+ */
9
+ import { readFileSync } from 'node:fs';
10
+ import { dirname, join } from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { logger } from '@revealui/utils/logger';
13
+ import * as ts from 'typescript';
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ /**
17
+ * Converts camelCase to snake_case
18
+ * @internal Exported for testing purposes
19
+ */
20
+ export function camelToSnake(str) {
21
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
22
+ }
23
+ /**
24
+ * Generates foreign key name from relationship
25
+ * Format: <table>_<column>_<referenced_table>_<referenced_column>_fk
26
+ * @internal Exported for testing purposes
27
+ */
28
+ export function generateForeignKeyName(tableName, column, referencedTable, referencedColumn) {
29
+ return `${tableName}_${column}_${referencedTable}_${referencedColumn}_fk`;
30
+ }
31
+ /**
32
+ * Converts table variable name to database table name
33
+ * @internal Exported for testing purposes
34
+ */
35
+ export function getTableName(variableName, tables) {
36
+ const table = tables.find((t) => t.variableName === variableName);
37
+ return table ? table.tableName : camelToSnake(variableName);
38
+ }
39
+ /**
40
+ * Creates a ParseError with position information from source file
41
+ * @internal Exported for testing purposes
42
+ */
43
+ export function createParseError(sourceFile, node, message, context) {
44
+ const error = {
45
+ file: sourceFile.fileName,
46
+ message,
47
+ };
48
+ if (context) {
49
+ error.context = context;
50
+ }
51
+ if (node) {
52
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
53
+ error.position = {
54
+ line: pos.line + 1, // 1-indexed
55
+ column: pos.character + 1, // 1-indexed
56
+ };
57
+ error.node = ts.SyntaxKind[node.kind];
58
+ }
59
+ return error;
60
+ }
61
+ /**
62
+ * Parses a TypeScript source file using TypeScript Compiler API
63
+ * @internal Exported for testing purposes
64
+ */
65
+ export function parseSourceFile(filePath) {
66
+ const content = readFileSync(filePath, 'utf-8');
67
+ return ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
68
+ }
69
+ /**
70
+ * Resolves column name from a TypeScript property access expression
71
+ * Handles: sessions.userId -> userId -> user_id
72
+ * @internal Exported for testing purposes
73
+ */
74
+ export function resolveColumnName(expr, expectedTableVar) {
75
+ // Check if it's a property access expression like sessions.userId
76
+ if (ts.isPropertyAccessExpression(expr)) {
77
+ // Check if the object is the expected table variable
78
+ if (ts.isIdentifier(expr.expression)) {
79
+ const tableVar = expr.expression.text;
80
+ if (tableVar === expectedTableVar) {
81
+ // Extract the property name (column name in camelCase)
82
+ const columnVar = expr.name.text;
83
+ // Convert camelCase to snake_case for database column name
84
+ return camelToSnake(columnVar);
85
+ }
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ /**
91
+ * Extracts column names from an array literal expression
92
+ * Handles: [sessions.userId, sessions.otherColumn]
93
+ * Detects and warns about unsupported patterns (spreads, nested access, etc.)
94
+ * @internal Exported for testing purposes
95
+ */
96
+ export function extractArrayElements(arrayExpr, expectedTableVar, sourceFile, context, errors) {
97
+ const columns = [];
98
+ for (const element of arrayExpr.elements) {
99
+ // Detect unsupported spread elements
100
+ if (ts.isSpreadElement(element)) {
101
+ errors.push(createParseError(sourceFile, element, `Spread operator in array is not supported`, context));
102
+ continue;
103
+ }
104
+ // Detect nested property access (e.g., sessions.user.profile)
105
+ if (ts.isPropertyAccessExpression(element)) {
106
+ let depth = 0;
107
+ let current = element;
108
+ while (ts.isPropertyAccessExpression(current)) {
109
+ depth++;
110
+ current = current.expression;
111
+ }
112
+ if (depth > 1) {
113
+ errors.push(createParseError(sourceFile, element, `Nested property access (depth ${depth}) is not supported - only direct table.column access`, context));
114
+ continue;
115
+ }
116
+ }
117
+ // Detect computed property access (e.g., sessions[someVar])
118
+ if (ts.isElementAccessExpression(element)) {
119
+ errors.push(createParseError(sourceFile, element, `Computed property access is not supported - only direct table.column access`, context));
120
+ continue;
121
+ }
122
+ const columnName = resolveColumnName(element, expectedTableVar);
123
+ if (columnName) {
124
+ columns.push(columnName);
125
+ }
126
+ else if (!ts.isIdentifier(element)) {
127
+ // Not a simple property access - warn
128
+ errors.push(createParseError(sourceFile, element, `Unsupported expression type in array - only table.column references are supported`, context));
129
+ }
130
+ }
131
+ return columns;
132
+ }
133
+ /**
134
+ * Finds all relations() calls in a single AST traversal
135
+ * Returns a map of table variable name to relations() call expression
136
+ *
137
+ * Performance: O(M) where M = AST nodes (single pass)
138
+ * @internal Exported for testing purposes
139
+ */
140
+ export function findAllRelationsCalls(sourceFile) {
141
+ const results = new Map();
142
+ function visit(node) {
143
+ // Look for VariableStatement with export modifier
144
+ if (ts.isVariableStatement(node)) {
145
+ if (node.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword)) {
146
+ node.declarationList.declarations.forEach((decl) => {
147
+ if (ts.isIdentifier(decl.name) && decl.initializer) {
148
+ // Check if initializer is a call to relations()
149
+ if (ts.isCallExpression(decl.initializer)) {
150
+ const callExpr = decl.initializer;
151
+ // Check if the function being called is 'relations'
152
+ if (ts.isIdentifier(callExpr.expression)) {
153
+ if (callExpr.expression.text === 'relations') {
154
+ // Extract table variable name from first argument
155
+ const firstArg = callExpr.arguments[0];
156
+ if (firstArg && ts.isIdentifier(firstArg)) {
157
+ const tableVar = firstArg.text;
158
+ results.set(tableVar, callExpr);
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ });
165
+ }
166
+ }
167
+ ts.forEachChild(node, visit);
168
+ }
169
+ ts.forEachChild(sourceFile, visit);
170
+ return results;
171
+ }
172
+ /**
173
+ * Extracts the object literal from the arrow function in relations() call
174
+ * Handles: relations(table, ({ one, many }) => ({ ... }))
175
+ * @internal Exported for testing purposes
176
+ */
177
+ /** Recursively unwrap parenthesized expressions to find an object literal */
178
+ function unwrapToObjectLiteral(node) {
179
+ if (ts.isObjectLiteralExpression(node))
180
+ return node;
181
+ if (ts.isParenthesizedExpression(node))
182
+ return unwrapToObjectLiteral(node.expression);
183
+ return null;
184
+ }
185
+ export function extractRelationsObject(relationsCall) {
186
+ // relations() call should have a second argument (the arrow function)
187
+ if (relationsCall.arguments.length < 2)
188
+ return null;
189
+ const secondArg = relationsCall.arguments[1];
190
+ if (!secondArg)
191
+ return null;
192
+ // Check if second argument is an arrow function
193
+ if (ts.isArrowFunction(secondArg)) {
194
+ // Recursively unwrap parenthesized expressions to find the object literal
195
+ return unwrapToObjectLiteral(secondArg.body);
196
+ }
197
+ return null;
198
+ }
199
+ /**
200
+ * Parses a single one() relationship from a property assignment
201
+ * Handles: relationName: one(referencedTable, { fields: [...], references: [...] })
202
+ * Detects unsupported patterns (computed properties, spreads, etc.)
203
+ * @internal Exported for testing purposes
204
+ */
205
+ export function parseOneRelationship(prop, sourceTable, tables, sourceFile, errors) {
206
+ // Detect computed property names (not supported)
207
+ if (ts.isComputedPropertyName(prop.name)) {
208
+ errors.push(createParseError(sourceFile, prop.name, `Computed property name is not supported - only literal property names are supported`, `Table: ${sourceTable}`));
209
+ return null;
210
+ }
211
+ // Check if the value is a call to one()
212
+ if (!ts.isCallExpression(prop.initializer))
213
+ return null;
214
+ const callExpr = prop.initializer;
215
+ // Check if the function being called is 'one'
216
+ if (!ts.isIdentifier(callExpr.expression))
217
+ return null;
218
+ if (callExpr.expression.text !== 'one')
219
+ return null;
220
+ const relationName = ts.isIdentifier(prop.name) ? prop.name.text : 'unknown';
221
+ // one() call should have two arguments: (referencedTable, { fields, references })
222
+ if (callExpr.arguments.length < 2)
223
+ return null;
224
+ // First argument should be the referenced table variable
225
+ const referencedTableArg = callExpr.arguments[0];
226
+ if (!(referencedTableArg && ts.isIdentifier(referencedTableArg)))
227
+ return null;
228
+ const referencedTableVar = referencedTableArg.text;
229
+ // Second argument should be an object literal with fields and references
230
+ const configArg = callExpr.arguments[1];
231
+ if (!(configArg && ts.isObjectLiteralExpression(configArg)))
232
+ return null;
233
+ // Extract fields array
234
+ let fieldsArray = null;
235
+ let referencesArray = null;
236
+ for (const prop of configArg.properties) {
237
+ if (ts.isPropertyAssignment(prop)) {
238
+ if (ts.isIdentifier(prop.name)) {
239
+ if (prop.name.text === 'fields' && ts.isArrayLiteralExpression(prop.initializer)) {
240
+ fieldsArray = prop.initializer;
241
+ }
242
+ else if (prop.name.text === 'references' &&
243
+ ts.isArrayLiteralExpression(prop.initializer)) {
244
+ referencesArray = prop.initializer;
245
+ }
246
+ }
247
+ }
248
+ }
249
+ if (!(fieldsArray && referencesArray))
250
+ return null;
251
+ // Extract column names from arrays with error tracking
252
+ const fieldsContext = `Table: ${sourceTable}, Relation: ${relationName}, fields`;
253
+ const referencesContext = `Table: ${sourceTable}, Relation: ${relationName}, references`;
254
+ const fieldColumns = extractArrayElements(fieldsArray, sourceTable, sourceFile, fieldsContext, errors);
255
+ const refColumns = extractArrayElements(referencesArray, referencedTableVar, sourceFile, referencesContext, errors);
256
+ if (fieldColumns.length === 0 || refColumns.length === 0)
257
+ return null;
258
+ // Build relationship object
259
+ const sourceTableName = getTableName(sourceTable, tables);
260
+ const referencedTableName = getTableName(referencedTableVar, tables);
261
+ const firstFieldColumn = fieldColumns[0];
262
+ const firstRefColumn = refColumns[0];
263
+ if (!(firstFieldColumn && firstRefColumn))
264
+ return null;
265
+ return {
266
+ foreignKeyName: generateForeignKeyName(sourceTableName, firstFieldColumn, referencedTableName, firstRefColumn),
267
+ columns: fieldColumns,
268
+ isOneToOne: true, // one() = isOneToOne: true
269
+ referencedRelation: referencedTableName,
270
+ referencedColumns: refColumns,
271
+ };
272
+ }
273
+ /**
274
+ * Extracts all one() relationships from a relations object
275
+ * Detects unsupported patterns and collects errors
276
+ * @internal Exported for testing purposes
277
+ */
278
+ export function extractOneRelationships(relationsObj, sourceTable, tables, sourceFile, errors) {
279
+ const relationships = [];
280
+ // Iterate through properties in the relations object
281
+ for (const prop of relationsObj.properties) {
282
+ if (ts.isPropertyAssignment(prop)) {
283
+ const relationship = parseOneRelationship(prop, sourceTable, tables, sourceFile, errors);
284
+ if (relationship) {
285
+ relationships.push(relationship);
286
+ }
287
+ }
288
+ else {
289
+ // Shorthand property or method signature - warn
290
+ errors.push(createParseError(sourceFile, prop, `Only property assignments are supported in relations object - shorthand or method signatures are not supported`, `Table: ${sourceTable}`));
291
+ }
292
+ }
293
+ return relationships;
294
+ }
295
+ /**
296
+ * Validates extracted relationships against discovered tables
297
+ * @internal Exported for testing purposes
298
+ */
299
+ export function validateRelationships(relationships, tables) {
300
+ const errors = [];
301
+ const tableNameMap = new Map(); // variableName -> tableName
302
+ for (const table of tables) {
303
+ tableNameMap.set(table.variableName, table.tableName);
304
+ }
305
+ const foreignKeyNames = new Set();
306
+ for (const tableRel of relationships) {
307
+ for (const rel of tableRel.relationships) {
308
+ // Validate referenced table exists
309
+ const referencedTableExists = Array.from(tableNameMap.values()).includes(rel.referencedRelation);
310
+ if (!referencedTableExists) {
311
+ errors.push({
312
+ file: 'core/index.ts', // Relationships come from core/index.ts
313
+ message: `Referenced table '${rel.referencedRelation}' does not exist`,
314
+ context: `Table: ${tableRel.tableVariableName}, FK: ${rel.foreignKeyName}`,
315
+ });
316
+ }
317
+ // Validate foreign key name uniqueness
318
+ if (foreignKeyNames.has(rel.foreignKeyName)) {
319
+ errors.push({
320
+ file: 'core/index.ts',
321
+ message: `Duplicate foreign key name: ${rel.foreignKeyName}`,
322
+ context: `Table: ${tableRel.tableVariableName}`,
323
+ });
324
+ }
325
+ foreignKeyNames.add(rel.foreignKeyName);
326
+ // Validate columns are not empty
327
+ if (rel.columns.length === 0) {
328
+ errors.push({
329
+ file: 'core/index.ts',
330
+ message: `Empty columns array in relationship`,
331
+ context: `Table: ${tableRel.tableVariableName}, FK: ${rel.foreignKeyName}`,
332
+ });
333
+ }
334
+ // Validate referenced columns are not empty
335
+ if (rel.referencedColumns.length === 0) {
336
+ errors.push({
337
+ file: 'core/index.ts',
338
+ message: `Empty referencedColumns array in relationship`,
339
+ context: `Table: ${tableRel.tableVariableName}, FK: ${rel.foreignKeyName}`,
340
+ });
341
+ }
342
+ // Validate column count matches
343
+ if (rel.columns.length !== rel.referencedColumns.length) {
344
+ errors.push({
345
+ file: 'core/index.ts',
346
+ message: `Column count mismatch: ${rel.columns.length} columns vs ${rel.referencedColumns.length} referenced columns`,
347
+ context: `Table: ${tableRel.tableVariableName}, FK: ${rel.foreignKeyName}`,
348
+ });
349
+ }
350
+ }
351
+ }
352
+ return errors;
353
+ }
354
+ /**
355
+ * Extracts all relationships from core/index.ts using AST
356
+ *
357
+ * Performance: Single AST traversal (O(M)) instead of N traversals (O(N×M))
358
+ * Returns structured result with relationships and errors
359
+ */
360
+ export function extractRelationships(tables) {
361
+ // Always resolve to src/schema/index.ts, regardless of whether running from src or dist
362
+ const packageRoot = join(__dirname, '../..');
363
+ const coreIndexPath = join(packageRoot, 'src/schema/index.ts');
364
+ const errors = [];
365
+ const results = [];
366
+ try {
367
+ const sourceFile = parseSourceFile(coreIndexPath);
368
+ // Single-pass extraction: find all relations() calls in one AST traversal
369
+ const relationsCallsMap = findAllRelationsCalls(sourceFile);
370
+ // Find all table variable names from tables list
371
+ const tableVars = tables.map((t) => t.variableName);
372
+ // Extract relationships from cached relations() calls
373
+ for (const tableVar of tableVars) {
374
+ const relationsCall = relationsCallsMap.get(tableVar);
375
+ if (relationsCall) {
376
+ const relationsObj = extractRelationsObject(relationsCall);
377
+ if (relationsObj) {
378
+ const relationships = extractOneRelationships(relationsObj, tableVar, tables, sourceFile, errors);
379
+ // Always create an entry, even if empty (for tables with no relationships)
380
+ results.push({
381
+ tableVariableName: tableVar,
382
+ relationships,
383
+ });
384
+ }
385
+ else {
386
+ // No relations object found - warn but don't fail
387
+ errors.push(createParseError(sourceFile, relationsCall, `No relations object found for table ${tableVar}`, `Table: ${tableVar}`));
388
+ results.push({
389
+ tableVariableName: tableVar,
390
+ relationships: [],
391
+ });
392
+ }
393
+ }
394
+ else {
395
+ // No relations() call found - not an error, just missing (some tables have no relations)
396
+ // Don't add error, just create empty entry
397
+ results.push({
398
+ tableVariableName: tableVar,
399
+ relationships: [],
400
+ });
401
+ }
402
+ }
403
+ // Note: We don't process many() relationships because:
404
+ // - many() relationships don't create FKs on the source table
405
+ // - They indicate the OTHER table has a FK pointing back
406
+ // - The relationship entry should only be on the table that HAS the FK
407
+ // - That relationship is already extracted from the one() call on the other table
408
+ // Validate extracted relationships
409
+ const validationErrors = validateRelationships(results, tables);
410
+ errors.push(...validationErrors);
411
+ return { relationships: results, errors };
412
+ }
413
+ catch (error) {
414
+ // Critical error - file couldn't be parsed at all
415
+ errors.push({
416
+ file: coreIndexPath,
417
+ message: `Failed to parse source file: ${error instanceof Error ? error.message : String(error)}`,
418
+ });
419
+ // Return empty results for all tables on critical error
420
+ return {
421
+ relationships: tables.map((t) => ({
422
+ tableVariableName: t.variableName,
423
+ relationships: [],
424
+ })),
425
+ errors,
426
+ };
427
+ }
428
+ }
429
+ // CLI interface for testing
430
+ if (import.meta.url === `file://${process.argv[1]}`) {
431
+ void import('./discover.js').then(({ discoverTables }) => {
432
+ const discoveryResult = discoverTables();
433
+ const { tables } = discoveryResult;
434
+ const extractionResult = extractRelationships(tables);
435
+ const { relationships } = extractionResult;
436
+ logger.info(`\n📊 Extracted relationships:\n`);
437
+ for (const tableRel of relationships) {
438
+ logger.info(` ${tableRel.tableVariableName}:`);
439
+ for (const rel of tableRel.relationships) {
440
+ logger.info(` - ${rel.foreignKeyName} (${rel.columns.join(', ')} → ${rel.referencedRelation}.${rel.referencedColumns.join(', ')}) [${rel.isOneToOne ? '1:1' : '1:N'}]`);
441
+ }
442
+ }
443
+ // Log errors if any
444
+ if (extractionResult.errors.length > 0) {
445
+ logger.warn('\n⚠️ Extraction errors:');
446
+ for (const error of extractionResult.errors) {
447
+ const location = error.position
448
+ ? `${error.file}:${error.position.line}:${error.position.column}`
449
+ : error.file;
450
+ logger.warn(` - ${location}: ${error.message}${error.context ? ` (${error.context})` : ''}`);
451
+ }
452
+ }
453
+ });
454
+ }
455
+ //# sourceMappingURL=extract-relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-relationships.js","sourceRoot":"","sources":["../../src/types/extract-relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Contract Wrapper Generator
4
+ *
5
+ * Generates Contract wrappers for all auto-generated Zod schemas.
6
+ * Contracts provide a unified interface combining TypeScript types,
7
+ * Zod schemas, and runtime validation.
8
+ *
9
+ * Generated contracts include:
10
+ * - RowContract: For database row types
11
+ * - InsertContract: For database insert types
12
+ *
13
+ * Output: packages/contracts/src/generated/contracts.ts
14
+ */
15
+ /**
16
+ * Generate Contract wrappers file from discovered tables
17
+ */
18
+ export declare function generateContracts(): void;
19
+ //# sourceMappingURL=generate-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-contracts.d.ts","sourceRoot":"","sources":["../../src/types/generate-contracts.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAuBH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAyFxC"}