@forgebase/database 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +470 -0
- package/dist/cjs/adapters/base.d.ts +20 -0
- package/dist/cjs/adapters/base.d.ts.map +1 -0
- package/dist/cjs/adapters/base.js +13 -0
- package/dist/cjs/adapters/base.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +6 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/index.js +24 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/postgres.d.ts +13 -0
- package/dist/cjs/adapters/postgres.d.ts.map +1 -0
- package/dist/cjs/adapters/postgres.js +51 -0
- package/dist/cjs/adapters/postgres.js.map +1 -0
- package/dist/cjs/adapters/sqlite.d.ts +13 -0
- package/dist/cjs/adapters/sqlite.d.ts.map +1 -0
- package/dist/cjs/adapters/sqlite.js +47 -0
- package/dist/cjs/adapters/sqlite.js.map +1 -0
- package/dist/cjs/adapters/types.d.ts +8 -0
- package/dist/cjs/adapters/types.d.ts.map +1 -0
- package/dist/cjs/adapters/types.js +3 -0
- package/dist/cjs/adapters/types.js.map +1 -0
- package/dist/cjs/database.d.ts +73 -0
- package/dist/cjs/database.d.ts.map +1 -0
- package/dist/cjs/database.js +673 -0
- package/dist/cjs/database.js.map +1 -0
- package/dist/cjs/errors.d.ts +37 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +64 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +16 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/kysely-hooks.d.ts +45 -0
- package/dist/cjs/kysely-hooks.d.ts.map +1 -0
- package/dist/cjs/kysely-hooks.js +93 -0
- package/dist/cjs/kysely-hooks.js.map +1 -0
- package/dist/cjs/libsql/example.d.ts +2 -0
- package/dist/cjs/libsql/example.d.ts.map +1 -0
- package/dist/cjs/libsql/example.js +44 -0
- package/dist/cjs/libsql/example.js.map +1 -0
- package/dist/cjs/libsql/index.d.ts +36 -0
- package/dist/cjs/libsql/index.d.ts.map +1 -0
- package/dist/cjs/libsql/index.js +155 -0
- package/dist/cjs/libsql/index.js.map +1 -0
- package/dist/cjs/permissionService.d.ts +20 -0
- package/dist/cjs/permissionService.d.ts.map +1 -0
- package/dist/cjs/permissionService.js +107 -0
- package/dist/cjs/permissionService.js.map +1 -0
- package/dist/cjs/rlsFunctionRegistry.d.ts +43 -0
- package/dist/cjs/rlsFunctionRegistry.d.ts.map +1 -0
- package/dist/cjs/rlsFunctionRegistry.js +63 -0
- package/dist/cjs/rlsFunctionRegistry.js.map +1 -0
- package/dist/cjs/rlsManager.d.ts +23 -0
- package/dist/cjs/rlsManager.d.ts.map +1 -0
- package/dist/cjs/rlsManager.js +371 -0
- package/dist/cjs/rlsManager.js.map +1 -0
- package/dist/cjs/schema.d.ts +15 -0
- package/dist/cjs/schema.d.ts.map +1 -0
- package/dist/cjs/schema.js +119 -0
- package/dist/cjs/schema.js.map +1 -0
- package/dist/cjs/sdk/client.d.ts +324 -0
- package/dist/cjs/sdk/client.d.ts.map +1 -0
- package/dist/cjs/sdk/client.js +554 -0
- package/dist/cjs/sdk/client.js.map +1 -0
- package/dist/cjs/sdk/examples.d.ts +68 -0
- package/dist/cjs/sdk/examples.d.ts.map +1 -0
- package/dist/cjs/sdk/examples.js +232 -0
- package/dist/cjs/sdk/examples.js.map +1 -0
- package/dist/cjs/sdk/server.d.ts +115 -0
- package/dist/cjs/sdk/server.d.ts.map +1 -0
- package/dist/cjs/sdk/server.js +140 -0
- package/dist/cjs/sdk/server.js.map +1 -0
- package/dist/cjs/types.d.ts +217 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/column-utils.d.ts +8 -0
- package/dist/cjs/utils/column-utils.d.ts.map +1 -0
- package/dist/cjs/utils/column-utils.js +131 -0
- package/dist/cjs/utils/column-utils.js.map +1 -0
- package/dist/cjs/utils/db.d.ts +2 -0
- package/dist/cjs/utils/db.d.ts.map +1 -0
- package/dist/cjs/utils/db.js +6 -0
- package/dist/cjs/utils/db.js.map +1 -0
- package/dist/cjs/utils/inspector.d.ts +39 -0
- package/dist/cjs/utils/inspector.d.ts.map +1 -0
- package/dist/cjs/utils/inspector.js +164 -0
- package/dist/cjs/utils/inspector.js.map +1 -0
- package/dist/cjs/utils/permission-initializer.d.ts +15 -0
- package/dist/cjs/utils/permission-initializer.d.ts.map +1 -0
- package/dist/cjs/utils/permission-initializer.js +173 -0
- package/dist/cjs/utils/permission-initializer.js.map +1 -0
- package/dist/cjs/websocket/RealtimeAdapter.d.ts +22 -0
- package/dist/cjs/websocket/RealtimeAdapter.d.ts.map +1 -0
- package/dist/cjs/websocket/RealtimeAdapter.js +3 -0
- package/dist/cjs/websocket/RealtimeAdapter.js.map +1 -0
- package/dist/cjs/websocket/SSEManager.d.ts +40 -0
- package/dist/cjs/websocket/SSEManager.d.ts.map +1 -0
- package/dist/cjs/websocket/SSEManager.js +268 -0
- package/dist/cjs/websocket/SSEManager.js.map +1 -0
- package/dist/cjs/websocket/WebSocketManager.d.ts +28 -0
- package/dist/cjs/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/cjs/websocket/WebSocketManager.js +156 -0
- package/dist/cjs/websocket/WebSocketManager.js.map +1 -0
- package/dist/cjs/websocket/index.d.ts +4 -0
- package/dist/cjs/websocket/index.d.ts.map +1 -0
- package/dist/cjs/websocket/index.js +20 -0
- package/dist/cjs/websocket/index.js.map +1 -0
- package/dist/esm/adapters/base.d.ts +20 -0
- package/dist/esm/adapters/base.d.ts.map +1 -0
- package/dist/esm/adapters/base.js +10 -0
- package/dist/esm/adapters/base.js.map +1 -0
- package/dist/esm/adapters/index.d.ts +6 -0
- package/dist/esm/adapters/index.d.ts.map +1 -0
- package/dist/esm/adapters/index.js +19 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/postgres.d.ts +13 -0
- package/dist/esm/adapters/postgres.d.ts.map +1 -0
- package/dist/esm/adapters/postgres.js +47 -0
- package/dist/esm/adapters/postgres.js.map +1 -0
- package/dist/esm/adapters/sqlite.d.ts +13 -0
- package/dist/esm/adapters/sqlite.d.ts.map +1 -0
- package/dist/esm/adapters/sqlite.js +43 -0
- package/dist/esm/adapters/sqlite.js.map +1 -0
- package/dist/esm/adapters/types.d.ts +8 -0
- package/dist/esm/adapters/types.d.ts.map +1 -0
- package/dist/esm/adapters/types.js +2 -0
- package/dist/esm/adapters/types.js.map +1 -0
- package/dist/esm/database.d.ts +73 -0
- package/dist/esm/database.d.ts.map +1 -0
- package/dist/esm/database.js +668 -0
- package/dist/esm/database.js.map +1 -0
- package/dist/esm/errors.d.ts +37 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +55 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/kysely-hooks.d.ts +45 -0
- package/dist/esm/kysely-hooks.d.ts.map +1 -0
- package/dist/esm/kysely-hooks.js +86 -0
- package/dist/esm/kysely-hooks.js.map +1 -0
- package/dist/esm/libsql/example.d.ts +2 -0
- package/dist/esm/libsql/example.d.ts.map +1 -0
- package/dist/esm/libsql/example.js +42 -0
- package/dist/esm/libsql/example.js.map +1 -0
- package/dist/esm/libsql/index.d.ts +36 -0
- package/dist/esm/libsql/index.d.ts.map +1 -0
- package/dist/esm/libsql/index.js +116 -0
- package/dist/esm/libsql/index.js.map +1 -0
- package/dist/esm/permissionService.d.ts +20 -0
- package/dist/esm/permissionService.d.ts.map +1 -0
- package/dist/esm/permissionService.js +103 -0
- package/dist/esm/permissionService.js.map +1 -0
- package/dist/esm/rlsFunctionRegistry.d.ts +43 -0
- package/dist/esm/rlsFunctionRegistry.d.ts.map +1 -0
- package/dist/esm/rlsFunctionRegistry.js +60 -0
- package/dist/esm/rlsFunctionRegistry.js.map +1 -0
- package/dist/esm/rlsManager.d.ts +23 -0
- package/dist/esm/rlsManager.d.ts.map +1 -0
- package/dist/esm/rlsManager.js +366 -0
- package/dist/esm/rlsManager.js.map +1 -0
- package/dist/esm/schema.d.ts +15 -0
- package/dist/esm/schema.d.ts.map +1 -0
- package/dist/esm/schema.js +113 -0
- package/dist/esm/schema.js.map +1 -0
- package/dist/esm/sdk/client.d.ts +324 -0
- package/dist/esm/sdk/client.d.ts.map +1 -0
- package/dist/esm/sdk/client.js +550 -0
- package/dist/esm/sdk/client.js.map +1 -0
- package/dist/esm/sdk/examples.d.ts +68 -0
- package/dist/esm/sdk/examples.d.ts.map +1 -0
- package/dist/esm/sdk/examples.js +229 -0
- package/dist/esm/sdk/examples.js.map +1 -0
- package/dist/esm/sdk/server.d.ts +115 -0
- package/dist/esm/sdk/server.d.ts.map +1 -0
- package/dist/esm/sdk/server.js +136 -0
- package/dist/esm/sdk/server.js.map +1 -0
- package/dist/esm/types.d.ts +217 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/column-utils.d.ts +8 -0
- package/dist/esm/utils/column-utils.d.ts.map +1 -0
- package/dist/esm/utils/column-utils.js +127 -0
- package/dist/esm/utils/column-utils.js.map +1 -0
- package/dist/esm/utils/db.d.ts +2 -0
- package/dist/esm/utils/db.d.ts.map +1 -0
- package/dist/esm/utils/db.js +3 -0
- package/dist/esm/utils/db.js.map +1 -0
- package/dist/esm/utils/inspector.d.ts +39 -0
- package/dist/esm/utils/inspector.d.ts.map +1 -0
- package/dist/esm/utils/inspector.js +160 -0
- package/dist/esm/utils/inspector.js.map +1 -0
- package/dist/esm/utils/permission-initializer.d.ts +15 -0
- package/dist/esm/utils/permission-initializer.d.ts.map +1 -0
- package/dist/esm/utils/permission-initializer.js +137 -0
- package/dist/esm/utils/permission-initializer.js.map +1 -0
- package/dist/esm/websocket/RealtimeAdapter.d.ts +22 -0
- package/dist/esm/websocket/RealtimeAdapter.d.ts.map +1 -0
- package/dist/esm/websocket/RealtimeAdapter.js +2 -0
- package/dist/esm/websocket/RealtimeAdapter.js.map +1 -0
- package/dist/esm/websocket/SSEManager.d.ts +40 -0
- package/dist/esm/websocket/SSEManager.d.ts.map +1 -0
- package/dist/esm/websocket/SSEManager.js +231 -0
- package/dist/esm/websocket/SSEManager.js.map +1 -0
- package/dist/esm/websocket/WebSocketManager.d.ts +28 -0
- package/dist/esm/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/esm/websocket/WebSocketManager.js +152 -0
- package/dist/esm/websocket/WebSocketManager.js.map +1 -0
- package/dist/esm/websocket/index.d.ts +4 -0
- package/dist/esm/websocket/index.d.ts.map +1 -0
- package/dist/esm/websocket/index.js +4 -0
- package/dist/esm/websocket/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import type { ColumnDataType, Kysely, Transaction } from 'kysely';
|
|
2
|
+
import type { KyselyHooks } from './kysely-hooks';
|
|
3
|
+
import type { PermissionService } from './permissionService';
|
|
4
|
+
import type { DatabaseSchema, TableInfo } from './utils/inspector';
|
|
5
|
+
import { QueryParams } from './sdk/server';
|
|
6
|
+
import { LibsqlDialectConfig } from './libsql';
|
|
7
|
+
export type { QueryParams } from './sdk/server';
|
|
8
|
+
export declare const FG_PERMISSION_TABLE = "fg_table_permissions";
|
|
9
|
+
export type Row = Record<string, any>;
|
|
10
|
+
export type ColumnType = ColumnDataType | 'increments' | 'enum';
|
|
11
|
+
export interface ColumnDefinition {
|
|
12
|
+
name: string;
|
|
13
|
+
type: ColumnType;
|
|
14
|
+
primary?: boolean;
|
|
15
|
+
unique?: boolean;
|
|
16
|
+
nullable: boolean;
|
|
17
|
+
enumValues?: string[];
|
|
18
|
+
foreignKeys?: ForeignKey;
|
|
19
|
+
default?: any;
|
|
20
|
+
}
|
|
21
|
+
export interface UpdateColumnDefinition {
|
|
22
|
+
currentName: string;
|
|
23
|
+
newName?: string;
|
|
24
|
+
type?: ColumnType;
|
|
25
|
+
currentType: ColumnType;
|
|
26
|
+
primary?: boolean;
|
|
27
|
+
unique?: boolean;
|
|
28
|
+
nullable?: boolean;
|
|
29
|
+
foreignKeys?: ForeignKey;
|
|
30
|
+
default?: any;
|
|
31
|
+
}
|
|
32
|
+
export interface ForeignKey {
|
|
33
|
+
columnName: string;
|
|
34
|
+
references: {
|
|
35
|
+
tableName: string;
|
|
36
|
+
columnName: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export type CustomRlsFunction = (userContext: UserContext, row: Record<string, unknown>, db?: Kysely<any>) => Promise<boolean> | boolean;
|
|
40
|
+
export type PermissionRule = {
|
|
41
|
+
allow: 'public' | 'private' | 'role' | 'auth' | 'guest' | 'labels' | 'teams' | 'static' | 'fieldCheck' | 'customSql' | 'customFunction';
|
|
42
|
+
labels?: string[];
|
|
43
|
+
teams?: string[];
|
|
44
|
+
static?: boolean;
|
|
45
|
+
customSql?: string;
|
|
46
|
+
customFunction?: string;
|
|
47
|
+
fieldCheck?: FieldCheck;
|
|
48
|
+
roles?: string[];
|
|
49
|
+
};
|
|
50
|
+
export type UserContextFields = keyof UserContext;
|
|
51
|
+
export type FieldCheck = {
|
|
52
|
+
field: string;
|
|
53
|
+
operator: '===' | '!==' | 'in' | 'notIn';
|
|
54
|
+
valueType: 'userContext' | 'static';
|
|
55
|
+
value: UserContextFields | any[];
|
|
56
|
+
};
|
|
57
|
+
export type UserContext = {
|
|
58
|
+
userId: number | string;
|
|
59
|
+
labels: string[];
|
|
60
|
+
teams: string[];
|
|
61
|
+
permissions?: string[];
|
|
62
|
+
role?: string;
|
|
63
|
+
};
|
|
64
|
+
export type TablePermissions = {
|
|
65
|
+
operations: {
|
|
66
|
+
SELECT?: PermissionRule[];
|
|
67
|
+
INSERT?: PermissionRule[];
|
|
68
|
+
UPDATE?: PermissionRule[];
|
|
69
|
+
DELETE?: PermissionRule[];
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Type of realtime adapter to use for database table broadcasts
|
|
74
|
+
*/
|
|
75
|
+
export type RealtimeAdapterType = 'websocket' | 'sse';
|
|
76
|
+
export interface ForgeDatabaseConfig {
|
|
77
|
+
db?: Kysely<any>;
|
|
78
|
+
libsql?: LibsqlDialectConfig;
|
|
79
|
+
hooks?: KyselyHooks;
|
|
80
|
+
permissionsService?: PermissionService;
|
|
81
|
+
prefix?: string;
|
|
82
|
+
enforceRls?: boolean;
|
|
83
|
+
realtime?: boolean;
|
|
84
|
+
/** Type of realtime adapter to use (default: 'websocket') */
|
|
85
|
+
realtimeAdapter?: RealtimeAdapterType;
|
|
86
|
+
defaultPermissions?: TablePermissions;
|
|
87
|
+
excludedTables?: string[];
|
|
88
|
+
websocketPort?: number;
|
|
89
|
+
/** Whether to automatically initialize permissions for all tables (default: false) */
|
|
90
|
+
initializePermissions?: boolean;
|
|
91
|
+
/** Path where the permission initialization report will be saved */
|
|
92
|
+
permissionReportPath?: string;
|
|
93
|
+
/** Callback function to be called when permission initialization is complete */
|
|
94
|
+
onPermissionInitComplete?: (report: PermissionInitializationReport) => void;
|
|
95
|
+
}
|
|
96
|
+
export type EndpointHandler = (request: Request) => Promise<any>;
|
|
97
|
+
export type SchemaHandler = (request: Request) => Promise<any>;
|
|
98
|
+
export type PermissionHandler = (request: Request) => Promise<any>;
|
|
99
|
+
export type DataHandler = (request: Request) => Promise<any>;
|
|
100
|
+
export interface ApiResponse<T = any> {
|
|
101
|
+
data?: T;
|
|
102
|
+
error?: string;
|
|
103
|
+
status?: number;
|
|
104
|
+
}
|
|
105
|
+
export interface SchemaCreateParams {
|
|
106
|
+
tableName: string;
|
|
107
|
+
columns: ColumnDefinition[];
|
|
108
|
+
}
|
|
109
|
+
export interface AddForeignKeyParams {
|
|
110
|
+
tableName: string;
|
|
111
|
+
column: string;
|
|
112
|
+
foreignTableName: string;
|
|
113
|
+
foreignColumn: string;
|
|
114
|
+
}
|
|
115
|
+
export interface DropForeignKeyParams {
|
|
116
|
+
tableName: string;
|
|
117
|
+
column: string;
|
|
118
|
+
}
|
|
119
|
+
export interface ModifySchemaParams {
|
|
120
|
+
tableName: string;
|
|
121
|
+
action: 'addColumn' | 'deleteColumn' | 'updateColumn';
|
|
122
|
+
columns: ColumnDefinition[] | UpdateColumnDefinition[];
|
|
123
|
+
}
|
|
124
|
+
export type DataQueryParams = QueryParams;
|
|
125
|
+
export interface DataMutationParams {
|
|
126
|
+
tableName: string;
|
|
127
|
+
data: Record<string, any> | Array<Record<string, any>>;
|
|
128
|
+
id?: string | number;
|
|
129
|
+
}
|
|
130
|
+
export interface AdvanceDataMutationParams {
|
|
131
|
+
tableName: string;
|
|
132
|
+
data: Record<string, any> | Array<Record<string, any>>;
|
|
133
|
+
query: DataQueryParams;
|
|
134
|
+
}
|
|
135
|
+
export interface DataDeleteParams {
|
|
136
|
+
tableName: string;
|
|
137
|
+
id: string | number;
|
|
138
|
+
}
|
|
139
|
+
export interface AdvanceDataDeleteParams {
|
|
140
|
+
tableName: string;
|
|
141
|
+
query: DataQueryParams;
|
|
142
|
+
}
|
|
143
|
+
export interface PermissionParams {
|
|
144
|
+
tableName: string;
|
|
145
|
+
permissions?: TablePermissions;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Report generated after permission initialization
|
|
149
|
+
*/
|
|
150
|
+
export interface PermissionInitializationReport {
|
|
151
|
+
/** Timestamp when the initialization started */
|
|
152
|
+
startTime: Date;
|
|
153
|
+
/** Timestamp when the initialization completed */
|
|
154
|
+
endTime: Date;
|
|
155
|
+
/** Total number of tables processed */
|
|
156
|
+
totalTables: number;
|
|
157
|
+
/** Number of tables that already had permissions */
|
|
158
|
+
tablesWithPermissions: number;
|
|
159
|
+
/** Number of tables that had permissions initialized */
|
|
160
|
+
tablesInitialized: number;
|
|
161
|
+
/** Number of tables excluded from initialization */
|
|
162
|
+
tablesExcluded: number;
|
|
163
|
+
/** List of tables that had permissions initialized */
|
|
164
|
+
initializedTables: string[];
|
|
165
|
+
/** List of tables that already had permissions */
|
|
166
|
+
existingPermissionTables: string[];
|
|
167
|
+
/** List of tables that were excluded */
|
|
168
|
+
excludedTables: string[];
|
|
169
|
+
/** Any errors that occurred during initialization */
|
|
170
|
+
errors: Array<{
|
|
171
|
+
table: string;
|
|
172
|
+
error: string;
|
|
173
|
+
}>;
|
|
174
|
+
}
|
|
175
|
+
export interface ForgeDatabaseEndpoints {
|
|
176
|
+
schema: {
|
|
177
|
+
get: () => Promise<DatabaseSchema>;
|
|
178
|
+
create: (params: SchemaCreateParams, trx?: Transaction<any>) => Promise<{
|
|
179
|
+
message: string;
|
|
180
|
+
tablename: string;
|
|
181
|
+
action: string;
|
|
182
|
+
}>;
|
|
183
|
+
delete: (tableName: string, trx?: Transaction<any>) => Promise<{
|
|
184
|
+
message: string;
|
|
185
|
+
tablename: string;
|
|
186
|
+
action: string;
|
|
187
|
+
}>;
|
|
188
|
+
modify: (params: ModifySchemaParams, trx?: Transaction<any>) => Promise<any>;
|
|
189
|
+
addForeingKey: (params: AddForeignKeyParams, trx?: Transaction<any>) => Promise<any>;
|
|
190
|
+
dropForeignKey: (params: DropForeignKeyParams, trx?: Transaction<any>) => Promise<any>;
|
|
191
|
+
truncateTable: (tableName: string, trx?: Transaction<any>) => Promise<any>;
|
|
192
|
+
getTables: () => Promise<string[]>;
|
|
193
|
+
getTableSchema: (tableName: string) => Promise<{
|
|
194
|
+
name: string;
|
|
195
|
+
info: TableInfo;
|
|
196
|
+
}>;
|
|
197
|
+
getTablePermissions: (tableName: string, trx?: Transaction<any>) => Promise<TablePermissions>;
|
|
198
|
+
getTableSchemaWithPermissions: (tableName: string, trx?: Transaction<any>) => Promise<{
|
|
199
|
+
name: string;
|
|
200
|
+
info: TableInfo;
|
|
201
|
+
permissions: TablePermissions;
|
|
202
|
+
}>;
|
|
203
|
+
};
|
|
204
|
+
data: {
|
|
205
|
+
query: <T>(tableName: string, params: DataQueryParams, user?: UserContext, isSystem?: boolean, trx?: Transaction<any>) => Promise<T[]>;
|
|
206
|
+
create: (params: DataMutationParams, user?: UserContext, isSystem?: boolean, trx?: Transaction<any>) => Promise<any>;
|
|
207
|
+
update: (params: DataMutationParams, user?: UserContext, isSystem?: boolean, trx?: Transaction<any>) => Promise<any>;
|
|
208
|
+
advanceUpdate: (params: AdvanceDataMutationParams, user?: UserContext, isSystem?: boolean, trx?: Transaction<any>) => Promise<any>;
|
|
209
|
+
delete: (params: DataDeleteParams, user?: UserContext, isSystem?: boolean, trx?: Transaction<any>) => Promise<any>;
|
|
210
|
+
advanceDelete: (params: AdvanceDataDeleteParams, user?: UserContext, isSystem?: boolean, trx?: Transaction<any>) => Promise<any>;
|
|
211
|
+
};
|
|
212
|
+
permissions: {
|
|
213
|
+
get: (params: PermissionParams, trx?: Transaction<any>) => Promise<TablePermissions | undefined>;
|
|
214
|
+
set: (params: PermissionParams, trx?: Transaction<any>) => Promise<any>;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAGtC,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,KACb,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EACD,QAAQ,GACR,SAAS,GACT,MAAM,GACN,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,gBAAgB,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;IACzC,SAAS,EAAE,aAAa,GAAG,QAAQ,CAAC;IACpC,KAAK,EAAE,iBAAiB,GAAG,GAAG,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE;QACV,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;QAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;QAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;QAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,KAAK,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,kBAAkB,CAAC,EAAE,gBAAgB,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gFAAgF;IAChF,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,IAAI,CAAC;CAC7E;AAGD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AACjE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AACnE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAG7D,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC;IACtD,OAAO,EAAE,gBAAgB,EAAE,GAAG,sBAAsB,EAAE,CAAC;CACxD;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,gDAAgD;IAChD,SAAS,EAAE,IAAI,CAAC;IAChB,kDAAkD;IAClD,OAAO,EAAE,IAAI,CAAC;IACd,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kDAAkD;IAClD,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,wCAAwC;IACxC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,qDAAqD;IACrD,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;QACnC,MAAM,EAAE,CACN,MAAM,EAAE,kBAAkB,EAC1B,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC;YACX,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC,CAAC;QACH,MAAM,EAAE,CACN,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC;YACX,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC,CAAC;QACH,MAAM,EAAE,CACN,MAAM,EAAE,kBAAkB,EAC1B,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,aAAa,EAAE,CACb,MAAM,EAAE,mBAAmB,EAC3B,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,cAAc,EAAE,CACd,MAAM,EAAE,oBAAoB,EAC5B,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3E,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACnC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;YAC7C,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,SAAS,CAAC;SACjB,CAAC,CAAC;QACH,mBAAmB,EAAE,CACnB,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/B,6BAA6B,EAAE,CAC7B,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,SAAS,CAAC;YAChB,WAAW,EAAE,gBAAgB,CAAC;SAC/B,CAAC,CAAC;KACJ,CAAC;IACF,IAAI,EAAE;QACJ,KAAK,EAAE,CAAC,CAAC,EACP,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,EAAE,CACN,MAAM,EAAE,kBAAkB,EAC1B,IAAI,CAAC,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,EAAE,CACN,MAAM,EAAE,kBAAkB,EAC1B,IAAI,CAAC,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,aAAa,EAAE,CACb,MAAM,EAAE,yBAAyB,EACjC,IAAI,CAAC,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,EAAE,CACN,MAAM,EAAE,gBAAgB,EACxB,IAAI,CAAC,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;QAClB,aAAa,EAAE,CACb,MAAM,EAAE,uBAAuB,EAC/B,IAAI,CAAC,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,GAAG,CAAC,CAAC;KACnB,CAAC;IACF,WAAW,EAAE;QACX,GAAG,EAAE,CACH,MAAM,EAAE,gBAAgB,EACxB,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KACnB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;QAC3C,GAAG,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;KACzE,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Kysely, type CreateTableBuilder, type AlterTableBuilder, type AlterTableColumnAlteringBuilder, type Transaction } from 'kysely';
|
|
2
|
+
import type { ColumnDefinition, UpdateColumnDefinition } from '../types';
|
|
3
|
+
type SchemaBuilder = CreateTableBuilder<any, any> | AlterTableBuilder | AlterTableColumnAlteringBuilder;
|
|
4
|
+
export declare function createColumn(builder: SchemaBuilder, // CreateTableBuilder or AlterTableBuilder
|
|
5
|
+
columnDef: ColumnDefinition, db: Kysely<any>): CreateTableBuilder<any, any> | AlterTableColumnAlteringBuilder;
|
|
6
|
+
export declare function updateColumn(db: Kysely<any>, tableName: string, columnDef: UpdateColumnDefinition, trx?: Transaction<any>): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=column-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-utils.d.ts","sourceRoot":"","sources":["../../../src/utils/column-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAEN,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,+BAA+B,EAIpC,KAAK,WAAW,EACjB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AASzE,KAAK,aAAa,GACd,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,GAC5B,iBAAiB,GACjB,+BAA+B,CAAC;AAEpC,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EAAE,0CAA0C;AAClE,SAAS,EAAE,gBAAgB,EAC3B,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,kEAsFhB;AA+BD,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,sBAAsB,EACjC,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,iBAmCvB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { sql, } from 'kysely';
|
|
2
|
+
// import { SchemaInspector } from '../knex-schema-inspector/lib/index'; // Removed
|
|
3
|
+
import { DBInspector } from './inspector'; // Use our new inspector
|
|
4
|
+
import { uuid } from './db';
|
|
5
|
+
export function createColumn(builder, // CreateTableBuilder or AlterTableBuilder
|
|
6
|
+
columnDef, db) {
|
|
7
|
+
const { name, type } = columnDef;
|
|
8
|
+
let dataType = 'text'; // Default to text to satisfy type, will be overwritten
|
|
9
|
+
let constraints = [];
|
|
10
|
+
// Map Knex types to Kysely/SQL types
|
|
11
|
+
switch (type) {
|
|
12
|
+
case 'increments':
|
|
13
|
+
dataType = 'integer';
|
|
14
|
+
break;
|
|
15
|
+
case 'enum':
|
|
16
|
+
// Enum handling in Kysely is dialect constants usually or separate createType
|
|
17
|
+
// For simplicity, we might fall back to text with check constraint or native enum if created
|
|
18
|
+
// adhering to existing logic:
|
|
19
|
+
if (!columnDef.enumValues) {
|
|
20
|
+
throw new Error('Enum values are required');
|
|
21
|
+
}
|
|
22
|
+
// For now, treat as text/varchar for SQLite compatibility or handle specifically
|
|
23
|
+
// Kysely doesnt have a direct 'enum' method on column builder that works everywhere without createType
|
|
24
|
+
dataType = 'text';
|
|
25
|
+
constraints.push((col) => col.check(sql `${sql.ref(name)} in (${sql.join(columnDef.enumValues)})`));
|
|
26
|
+
break;
|
|
27
|
+
case 'uuid':
|
|
28
|
+
// Basic uuid handling
|
|
29
|
+
dataType = 'uuid';
|
|
30
|
+
// We might need dialect check here if we want to support SQLite specifically as text(36)
|
|
31
|
+
break;
|
|
32
|
+
default:
|
|
33
|
+
// Try passing raw strings
|
|
34
|
+
dataType = type;
|
|
35
|
+
}
|
|
36
|
+
// SQLite uuid callback override simulation
|
|
37
|
+
// if (['Client_SQLite3', ...].includes(...)) ... -> Kysely: db.introspection.getMetadata() ...
|
|
38
|
+
// For now assuming standard types or relying on driver translation
|
|
39
|
+
return builder.addColumn(name, dataType, (col) => {
|
|
40
|
+
let c = col;
|
|
41
|
+
// Apply collected constraints (like enum checks)
|
|
42
|
+
for (const constraint of constraints) {
|
|
43
|
+
c = constraint(c);
|
|
44
|
+
}
|
|
45
|
+
if (columnDef.unique)
|
|
46
|
+
c = c.unique();
|
|
47
|
+
if (columnDef.nullable === false)
|
|
48
|
+
c = c.notNull();
|
|
49
|
+
if (columnDef.default !== undefined) {
|
|
50
|
+
c = c.defaultTo(columnDef.default);
|
|
51
|
+
}
|
|
52
|
+
// Auto timestamps
|
|
53
|
+
if (columnDef.name === 'created_at' || columnDef.name === 'updated_at') {
|
|
54
|
+
c = c.defaultTo(sql `now()`);
|
|
55
|
+
}
|
|
56
|
+
if (columnDef.type === 'uuid') {
|
|
57
|
+
const adapter = db.getExecutor().adapter;
|
|
58
|
+
const adapterName = adapter.constructor.name;
|
|
59
|
+
if (adapterName.includes('Postgres')) {
|
|
60
|
+
c = c.defaultTo(sql `gen_random_uuid()`);
|
|
61
|
+
}
|
|
62
|
+
else if (adapterName.includes('Sqlite')) {
|
|
63
|
+
c = c.defaultTo(uuid);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (columnDef.type === 'increments') {
|
|
67
|
+
c = c.autoIncrement();
|
|
68
|
+
}
|
|
69
|
+
if (columnDef.primary)
|
|
70
|
+
c = c.primaryKey();
|
|
71
|
+
if (columnDef.foreignKeys) {
|
|
72
|
+
c = c.references(`${columnDef.foreignKeys.references.tableName}.${columnDef.foreignKeys.references.columnName}`);
|
|
73
|
+
}
|
|
74
|
+
return c;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Helper function to check for foreign keys
|
|
78
|
+
async function dropExistingForeignKeys(db, tableName, columnName) {
|
|
79
|
+
const inspector = new DBInspector(db);
|
|
80
|
+
const tableInfo = await inspector.getTableInfo(tableName);
|
|
81
|
+
// Find FKs where the *source* column is the one we are modifying
|
|
82
|
+
// The inspector returns FKs for the table, showing which column points to what.
|
|
83
|
+
const fks = tableInfo.foreignKeys.filter((fk) => fk.column === columnName);
|
|
84
|
+
for (const fk of fks) {
|
|
85
|
+
if (fk.constraintName) {
|
|
86
|
+
await db.schema
|
|
87
|
+
.alterTable(tableName)
|
|
88
|
+
.dropConstraint(fk.constraintName)
|
|
89
|
+
.execute();
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.warn(`Could not drop FK for ${tableName}.${columnName} because constraint name is missing.`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Update column function using drop and recreate approach
|
|
97
|
+
export async function updateColumn(db, tableName, columnDef, trx) {
|
|
98
|
+
// Use transaction if provided, otherwise use the db instance
|
|
99
|
+
const executor = trx || db;
|
|
100
|
+
// 1. Check and drop existing FKs
|
|
101
|
+
// We use the 'db' instance for inspection even if inside a transaction for reading metadata if needed,
|
|
102
|
+
// but better to use executor if inspector supported it. Inspector currently takes 'Kysely<any>'.
|
|
103
|
+
// If 'trx' is passed, we might face issues if inspector expects Kysely instance.
|
|
104
|
+
// Ideally DBInspector should accept Kysely | Transaction.
|
|
105
|
+
// For now, we use 'db' for inspection as schema read usually doesn't need to be in the same trx unless strictly isolatedDDL.
|
|
106
|
+
await dropExistingForeignKeys(db, tableName, columnDef.currentName);
|
|
107
|
+
// 2. Drop existing column
|
|
108
|
+
await executor.schema
|
|
109
|
+
.alterTable(tableName)
|
|
110
|
+
.dropColumn(columnDef.currentName)
|
|
111
|
+
.execute();
|
|
112
|
+
// 3. Recreate column
|
|
113
|
+
let alterBuilder = executor.schema.alterTable(tableName);
|
|
114
|
+
// We need to map UpdateColumnDefinition to ColumnDefinition for createColumn
|
|
115
|
+
const newColDef = {
|
|
116
|
+
name: columnDef.newName || columnDef.currentName,
|
|
117
|
+
type: columnDef.type || columnDef.currentType,
|
|
118
|
+
nullable: columnDef.nullable ?? true,
|
|
119
|
+
primary: columnDef.primary,
|
|
120
|
+
unique: columnDef.unique,
|
|
121
|
+
foreignKeys: columnDef.foreignKeys,
|
|
122
|
+
default: columnDef.default,
|
|
123
|
+
enumValues: undefined, // Not present in UpdateColumnDefinition?
|
|
124
|
+
};
|
|
125
|
+
createColumn(alterBuilder, newColDef, db).execute();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=column-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-utils.js","sourceRoot":"","sources":["../../../src/utils/column-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,GAAG,GAQJ,MAAM,QAAQ,CAAC;AAEhB,mFAAmF;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC,CAAC,wBAAwB;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,MAAM,UAAU,YAAY,CAC1B,OAAsB,EAAE,0CAA0C;AAClE,SAA2B,EAC3B,EAAe;IAEf,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;IACjC,IAAI,QAAQ,GAAuB,MAAM,CAAC,CAAC,uDAAuD;IAClG,IAAI,WAAW,GAAU,EAAE,CAAC;IAE5B,qCAAqC;IACrC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,QAAQ,GAAG,SAAS,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,8EAA8E;YAC9E,6FAA6F;YAC7F,8BAA8B;YAC9B,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YACD,iFAAiF;YACjF,uGAAuG;YACvG,QAAQ,GAAG,MAAM,CAAC;YAClB,WAAW,CAAC,IAAI,CAAC,CAAC,GAA4B,EAAE,EAAE,CAChD,GAAG,CAAC,KAAK,CACP,GAAG,CAAA,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAW,CAAC,GAAG,CAC9D,CACF,CAAC;YACF,MAAM;QACR,KAAK,MAAM;YACT,sBAAsB;YACtB,QAAQ,GAAG,MAAM,CAAC;YAClB,yFAAyF;YACzF,MAAM;QACR;YACE,0BAA0B;YAC1B,QAAQ,GAAG,IAA0B,CAAC;IAC1C,CAAC;IAED,2CAA2C;IAC3C,+FAA+F;IAC/F,mEAAmE;IAEnE,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,GAA4B,EAAE,EAAE;QACxE,IAAI,CAAC,GAAG,GAAG,CAAC;QAEZ,iDAAiD;QACjD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,SAAS,CAAC,MAAM;YAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,SAAS,CAAC,QAAQ,KAAK,KAAK;YAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAElD,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACpC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,kBAAkB;QAClB,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACvE,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAA,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC;YACzC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;YAE7C,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAA,mBAAmB,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACpC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,SAAS,CAAC,OAAO;YAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;QAE1C,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;YAC1B,CAAC,GAAG,CAAC,CAAC,UAAU,CACd,GAAG,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,CAC/F,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4CAA4C;AAE5C,KAAK,UAAU,uBAAuB,CACpC,EAAe,EACf,SAAiB,EACjB,UAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAE1D,iEAAiE;IACjE,gFAAgF;IAChF,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAE3E,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;YACtB,MAAM,EAAE,CAAC,MAAM;iBACZ,UAAU,CAAC,SAAS,CAAC;iBACrB,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC;iBACjC,OAAO,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,yBAAyB,SAAS,IAAI,UAAU,sCAAsC,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAe,EACf,SAAiB,EACjB,SAAiC,EACjC,GAAsB;IAEtB,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,GAAG,IAAI,EAAE,CAAC;IAE3B,iCAAiC;IACjC,uGAAuG;IACvG,iGAAiG;IACjG,iFAAiF;IACjF,0DAA0D;IAC1D,6HAA6H;IAC7H,MAAM,uBAAuB,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAEpE,0BAA0B;IAC1B,MAAM,QAAQ,CAAC,MAAM;SAClB,UAAU,CAAC,SAAS,CAAC;SACrB,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC;SACjC,OAAO,EAAE,CAAC;IAEb,qBAAqB;IACrB,IAAI,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAEzD,6EAA6E;IAC7E,MAAM,SAAS,GAAqB;QAClC,IAAI,EAAE,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,WAAW;QAChD,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,WAAW;QAC7C,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,IAAI;QACpC,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,UAAU,EAAE,SAAS,EAAE,yCAAyC;KACjE,CAAC;IAEF,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/utils/db.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,sCAAmP,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { sql } from 'kysely';
|
|
2
|
+
export const uuid = sql `(lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6))))`;
|
|
3
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/utils/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAA,6OAA6O,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Kysely } from 'kysely';
|
|
2
|
+
export interface ColumnInfo {
|
|
3
|
+
name: string;
|
|
4
|
+
defaultValue: any;
|
|
5
|
+
dataType: string;
|
|
6
|
+
isNullable: boolean;
|
|
7
|
+
isPrimaryKey: boolean;
|
|
8
|
+
hasAutoIncrement: boolean;
|
|
9
|
+
foreignKeyReference?: {
|
|
10
|
+
table: string;
|
|
11
|
+
column: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface ForeignKeyInfo {
|
|
15
|
+
table: string;
|
|
16
|
+
column: string;
|
|
17
|
+
foreignTable: string;
|
|
18
|
+
foreignColumn: string;
|
|
19
|
+
constraintName?: string;
|
|
20
|
+
onDelete?: string;
|
|
21
|
+
onUpdate?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TableInfo {
|
|
24
|
+
columns: ColumnInfo[];
|
|
25
|
+
foreignKeys: ForeignKeyInfo[];
|
|
26
|
+
}
|
|
27
|
+
export interface DatabaseSchema {
|
|
28
|
+
[tableName: string]: TableInfo;
|
|
29
|
+
}
|
|
30
|
+
export declare class DBInspector {
|
|
31
|
+
private db;
|
|
32
|
+
constructor(db: Kysely<any>);
|
|
33
|
+
private getDialect;
|
|
34
|
+
getTables(): Promise<string[]>;
|
|
35
|
+
hasTable(tableName: string): Promise<boolean>;
|
|
36
|
+
getTableInfo(tableName: string): Promise<TableInfo>;
|
|
37
|
+
getDatabaseSchema(excludedTables: string[]): Promise<DatabaseSchema>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=inspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../../src/utils/inspector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,GAAG,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,cAAc,EAAE,CAAC;CAE/B;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAEnC,OAAO,CAAC,UAAU;IAYZ,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK9B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B7C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA8HnD,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;CAW3E"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { sql } from 'kysely';
|
|
2
|
+
export class DBInspector {
|
|
3
|
+
constructor(db) {
|
|
4
|
+
this.db = db;
|
|
5
|
+
}
|
|
6
|
+
getDialect() {
|
|
7
|
+
const adapter = this.db.getExecutor().adapter;
|
|
8
|
+
// Check adapter name or class
|
|
9
|
+
// Kysely adapters: PostgresAdapter, SqliteAdapter
|
|
10
|
+
const name = adapter.constructor.name;
|
|
11
|
+
if (name.includes('Postgres'))
|
|
12
|
+
return 'postgres';
|
|
13
|
+
if (name.includes('Sqlite'))
|
|
14
|
+
return 'sqlite';
|
|
15
|
+
// Fallback check if class name is minified or different
|
|
16
|
+
// We can check supportsTransactionalDdl as a heuristic? No.
|
|
17
|
+
return 'unknown';
|
|
18
|
+
}
|
|
19
|
+
async getTables() {
|
|
20
|
+
const tables = await this.db.introspection.getTables();
|
|
21
|
+
return tables.map((t) => t.name);
|
|
22
|
+
}
|
|
23
|
+
async hasTable(tableName) {
|
|
24
|
+
const dialect = this.getDialect();
|
|
25
|
+
try {
|
|
26
|
+
if (dialect === 'postgres') {
|
|
27
|
+
const result = await sql `
|
|
28
|
+
SELECT EXISTS (
|
|
29
|
+
SELECT FROM information_schema.tables
|
|
30
|
+
WHERE table_name = ${tableName}
|
|
31
|
+
) as "exists"
|
|
32
|
+
`.execute(this.db);
|
|
33
|
+
return !!result.rows[0]?.exists;
|
|
34
|
+
}
|
|
35
|
+
else if (dialect === 'sqlite') {
|
|
36
|
+
const result = await sql `
|
|
37
|
+
SELECT name FROM sqlite_master
|
|
38
|
+
WHERE type='table' AND name=${tableName}
|
|
39
|
+
`.execute(this.db);
|
|
40
|
+
return result.rows.length > 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
console.warn(`Failed to check table existence for ${tableName}:`, e);
|
|
45
|
+
}
|
|
46
|
+
// Fallback to introspection if optimized check fails
|
|
47
|
+
const tables = await this.db.introspection.getTables();
|
|
48
|
+
return tables.some((t) => t.name === tableName);
|
|
49
|
+
}
|
|
50
|
+
async getTableInfo(tableName) {
|
|
51
|
+
const tables = await this.db.introspection.getTables();
|
|
52
|
+
const tableMetadata = tables.find((t) => t.name === tableName);
|
|
53
|
+
if (!tableMetadata) {
|
|
54
|
+
throw new Error(`Table ${tableName} not found`);
|
|
55
|
+
}
|
|
56
|
+
const dialect = this.getDialect();
|
|
57
|
+
let primaryKeys = [];
|
|
58
|
+
let foreignKeys = [];
|
|
59
|
+
if (dialect === 'postgres') {
|
|
60
|
+
try {
|
|
61
|
+
// Get Primary Keys
|
|
62
|
+
const pkResult = await sql `
|
|
63
|
+
SELECT kcu.column_name
|
|
64
|
+
FROM information_schema.key_column_usage kcu
|
|
65
|
+
JOIN information_schema.table_constraints tc ON kcu.constraint_name = tc.constraint_name
|
|
66
|
+
WHERE kcu.table_name = ${tableName} AND tc.constraint_type = 'PRIMARY KEY'
|
|
67
|
+
`.execute(this.db);
|
|
68
|
+
primaryKeys = pkResult.rows.map((r) => r.column_name);
|
|
69
|
+
// Get Foreign Keys
|
|
70
|
+
const fkResult = await sql `
|
|
71
|
+
SELECT
|
|
72
|
+
kcu.column_name,
|
|
73
|
+
ccu.table_name AS foreign_table_name,
|
|
74
|
+
ccu.column_name AS foreign_column_name,
|
|
75
|
+
tc.constraint_name
|
|
76
|
+
FROM information_schema.table_constraints AS tc
|
|
77
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
78
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
79
|
+
AND tc.table_schema = kcu.table_schema
|
|
80
|
+
JOIN information_schema.constraint_column_usage AS ccu
|
|
81
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
82
|
+
AND ccu.table_schema = tc.table_schema
|
|
83
|
+
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = ${tableName}
|
|
84
|
+
`.execute(this.db);
|
|
85
|
+
foreignKeys = fkResult.rows.map((r) => ({
|
|
86
|
+
table: tableName,
|
|
87
|
+
column: r.column_name,
|
|
88
|
+
foreignTable: r.foreign_table_name,
|
|
89
|
+
foreignColumn: r.foreign_column_name,
|
|
90
|
+
constraintName: r.constraint_name,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
console.warn(`Failed to inspect Postgres constraints for ${tableName}:`, e);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (dialect === 'sqlite') {
|
|
98
|
+
try {
|
|
99
|
+
// Get Primary Keys
|
|
100
|
+
// PRAGMA table_info returns: cid, name, type, notnull, dflt_value, pk
|
|
101
|
+
const pkResult = await sql `
|
|
102
|
+
PRAGMA table_info(${sql.table(tableName)})
|
|
103
|
+
`.execute(this.db);
|
|
104
|
+
primaryKeys = pkResult.rows.filter((r) => r.pk > 0).map((r) => r.name);
|
|
105
|
+
// Get Foreign Keys
|
|
106
|
+
// PRAGMA foreign_key_list returns: id, seq, table, from, to, on_update, on_delete, match
|
|
107
|
+
const fkResult = await sql `
|
|
108
|
+
PRAGMA foreign_key_list(${sql.table(tableName)})
|
|
109
|
+
`.execute(this.db);
|
|
110
|
+
// SQLite foreign_key_list 'table' is the foreign table
|
|
111
|
+
// 'from' is the column in current table, 'to' is column in foreign table
|
|
112
|
+
foreignKeys = fkResult.rows.map((r) => ({
|
|
113
|
+
table: tableName,
|
|
114
|
+
column: r.from,
|
|
115
|
+
foreignTable: r.table,
|
|
116
|
+
foreignColumn: r.to,
|
|
117
|
+
onUpdate: r.on_update,
|
|
118
|
+
onDelete: r.on_delete,
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
console.warn(`Failed to inspect SQLite constraints for ${tableName}:`, e);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const columns = tableMetadata.columns.map((col) => {
|
|
126
|
+
const isPk = primaryKeys.includes(col.name);
|
|
127
|
+
// Find generic FK info if exists
|
|
128
|
+
const fk = foreignKeys.find((f) => f.column === col.name);
|
|
129
|
+
return {
|
|
130
|
+
name: col.name,
|
|
131
|
+
defaultValue: col.defaultValue,
|
|
132
|
+
dataType: col.dataType,
|
|
133
|
+
isNullable: col.isNullable,
|
|
134
|
+
isPrimaryKey: isPk,
|
|
135
|
+
hasAutoIncrement: col.isAutoIncrementing,
|
|
136
|
+
foreignKeyReference: fk
|
|
137
|
+
? {
|
|
138
|
+
table: fk.foreignTable,
|
|
139
|
+
column: fk.foreignColumn,
|
|
140
|
+
}
|
|
141
|
+
: undefined,
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
return {
|
|
145
|
+
columns,
|
|
146
|
+
foreignKeys,
|
|
147
|
+
//indexes,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async getDatabaseSchema(excludedTables) {
|
|
151
|
+
let tables = await this.getTables();
|
|
152
|
+
tables = tables.filter((t) => !excludedTables.includes(t));
|
|
153
|
+
const schema = {};
|
|
154
|
+
for (const table of tables) {
|
|
155
|
+
schema[table] = await this.getTableInfo(table);
|
|
156
|
+
}
|
|
157
|
+
return schema;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../../src/utils/inspector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { PermissionInitializationReport, TablePermissions } from '../types';
|
|
2
|
+
import { PermissionService } from '../permissionService';
|
|
3
|
+
import { DBInspector } from './inspector';
|
|
4
|
+
/**
|
|
5
|
+
* Initializes permissions for all tables in the database
|
|
6
|
+
* @param permissionService Permission service instance
|
|
7
|
+
* @param dbInspector Database inspector instance
|
|
8
|
+
* @param excludedTables List of tables to exclude from initialization
|
|
9
|
+
* @param defaultPermissions Default permissions to apply
|
|
10
|
+
* @param reportPath Path where to save the report file
|
|
11
|
+
* @param onComplete Callback function to call when initialization is complete
|
|
12
|
+
*/
|
|
13
|
+
import type { Kysely } from 'kysely';
|
|
14
|
+
export declare function initializePermissions(db: Kysely<any>, permissionService: PermissionService, dbInspector: DBInspector, excludedTables: string[], defaultPermissions: TablePermissions, reportPath?: string, onComplete?: (report: PermissionInitializationReport) => void): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=permission-initializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-initializer.d.ts","sourceRoot":"","sources":["../../../src/utils/permission-initializer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,8BAA8B,EAC9B,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,MAAM,EAAE,EACxB,kBAAkB,EAAE,gBAAgB,EACpC,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,IAAI,GAC5D,OAAO,CAAC,IAAI,CAAC,CAqFf"}
|