lokicms-plugin-sql 1.0.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 (93) hide show
  1. package/dist/federation/cache-layer.d.ts +58 -0
  2. package/dist/federation/cache-layer.d.ts.map +1 -0
  3. package/dist/federation/cache-layer.js +210 -0
  4. package/dist/federation/cache-layer.js.map +1 -0
  5. package/dist/federation/index.d.ts +12 -0
  6. package/dist/federation/index.d.ts.map +1 -0
  7. package/dist/federation/index.js +9 -0
  8. package/dist/federation/index.js.map +1 -0
  9. package/dist/federation/source-manager.d.ts +57 -0
  10. package/dist/federation/source-manager.d.ts.map +1 -0
  11. package/dist/federation/source-manager.js +238 -0
  12. package/dist/federation/source-manager.js.map +1 -0
  13. package/dist/federation/sync-engine.d.ts +68 -0
  14. package/dist/federation/sync-engine.d.ts.map +1 -0
  15. package/dist/federation/sync-engine.js +288 -0
  16. package/dist/federation/sync-engine.js.map +1 -0
  17. package/dist/index.d.ts +80 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +79 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/plugin.d.ts +28 -0
  22. package/dist/plugin.d.ts.map +1 -0
  23. package/dist/plugin.js +798 -0
  24. package/dist/plugin.js.map +1 -0
  25. package/dist/providers/base.d.ts +142 -0
  26. package/dist/providers/base.d.ts.map +1 -0
  27. package/dist/providers/base.js +161 -0
  28. package/dist/providers/base.js.map +1 -0
  29. package/dist/providers/index.d.ts +22 -0
  30. package/dist/providers/index.d.ts.map +1 -0
  31. package/dist/providers/index.js +74 -0
  32. package/dist/providers/index.js.map +1 -0
  33. package/dist/providers/mariadb.d.ts +83 -0
  34. package/dist/providers/mariadb.d.ts.map +1 -0
  35. package/dist/providers/mariadb.js +293 -0
  36. package/dist/providers/mariadb.js.map +1 -0
  37. package/dist/providers/mysql.d.ts +78 -0
  38. package/dist/providers/mysql.d.ts.map +1 -0
  39. package/dist/providers/mysql.js +284 -0
  40. package/dist/providers/mysql.js.map +1 -0
  41. package/dist/providers/postgresql.d.ts +77 -0
  42. package/dist/providers/postgresql.d.ts.map +1 -0
  43. package/dist/providers/postgresql.js +296 -0
  44. package/dist/providers/postgresql.js.map +1 -0
  45. package/dist/providers/sqlite.d.ts +80 -0
  46. package/dist/providers/sqlite.d.ts.map +1 -0
  47. package/dist/providers/sqlite.js +283 -0
  48. package/dist/providers/sqlite.js.map +1 -0
  49. package/dist/query/builder.d.ts +74 -0
  50. package/dist/query/builder.d.ts.map +1 -0
  51. package/dist/query/builder.js +279 -0
  52. package/dist/query/builder.js.map +1 -0
  53. package/dist/query/index.d.ts +10 -0
  54. package/dist/query/index.d.ts.map +1 -0
  55. package/dist/query/index.js +8 -0
  56. package/dist/query/index.js.map +1 -0
  57. package/dist/query/transformer.d.ts +74 -0
  58. package/dist/query/transformer.d.ts.map +1 -0
  59. package/dist/query/transformer.js +236 -0
  60. package/dist/query/transformer.js.map +1 -0
  61. package/dist/types.d.ts +350 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +38 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/vectors/adapter.d.ts +128 -0
  66. package/dist/vectors/adapter.d.ts.map +1 -0
  67. package/dist/vectors/adapter.js +79 -0
  68. package/dist/vectors/adapter.js.map +1 -0
  69. package/dist/vectors/index.d.ts +41 -0
  70. package/dist/vectors/index.d.ts.map +1 -0
  71. package/dist/vectors/index.js +87 -0
  72. package/dist/vectors/index.js.map +1 -0
  73. package/dist/vectors/lokijs-vector.d.ts +112 -0
  74. package/dist/vectors/lokijs-vector.d.ts.map +1 -0
  75. package/dist/vectors/lokijs-vector.js +217 -0
  76. package/dist/vectors/lokijs-vector.js.map +1 -0
  77. package/dist/vectors/mariadb-vector.d.ts +56 -0
  78. package/dist/vectors/mariadb-vector.d.ts.map +1 -0
  79. package/dist/vectors/mariadb-vector.js +263 -0
  80. package/dist/vectors/mariadb-vector.js.map +1 -0
  81. package/dist/vectors/mysql-vector.d.ts +56 -0
  82. package/dist/vectors/mysql-vector.d.ts.map +1 -0
  83. package/dist/vectors/mysql-vector.js +235 -0
  84. package/dist/vectors/mysql-vector.js.map +1 -0
  85. package/dist/vectors/pgvector.d.ts +52 -0
  86. package/dist/vectors/pgvector.d.ts.map +1 -0
  87. package/dist/vectors/pgvector.js +190 -0
  88. package/dist/vectors/pgvector.js.map +1 -0
  89. package/dist/vectors/sqlite-vec.d.ts +80 -0
  90. package/dist/vectors/sqlite-vec.d.ts.map +1 -0
  91. package/dist/vectors/sqlite-vec.js +362 -0
  92. package/dist/vectors/sqlite-vec.js.map +1 -0
  93. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC7E,YAAY,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,4BAA4B,EAC5B,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,cAAc,EACd,YAAY,EACZ,aAAa,GACd,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Query Layer Index
3
+ *
4
+ * Query building and transformation utilities.
5
+ */
6
+ export { createQueryBuilder, createQueryBuilderForType } from './builder.js';
7
+ export { createRowTransformer, createAutoMapping, createEntryTransformer, createContentTypeTransformer, snakeCase, } from './transformer.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAW7E,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,4BAA4B,EAC5B,SAAS,GACV,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Row Transformer
3
+ *
4
+ * Transforms SQL rows to/from LokiJS documents.
5
+ */
6
+ import type { SQLProviderType } from '../types.js';
7
+ /**
8
+ * Field mapping
9
+ */
10
+ export interface FieldMapping {
11
+ /** SQL column name */
12
+ column: string;
13
+ /** Document field name */
14
+ field: string;
15
+ /** Transform function */
16
+ transform?: (value: unknown) => unknown;
17
+ /** Reverse transform function */
18
+ reverseTransform?: (value: unknown) => unknown;
19
+ }
20
+ /**
21
+ * Schema mapping
22
+ */
23
+ export interface SchemaMapping {
24
+ /** Table name */
25
+ table: string;
26
+ /** Collection name */
27
+ collection: string;
28
+ /** Primary key column */
29
+ primaryKey: string;
30
+ /** Field mappings */
31
+ fields: FieldMapping[];
32
+ /** Auto-generated fields (timestamps, etc.) */
33
+ autoFields?: string[];
34
+ }
35
+ /**
36
+ * Transformer interface
37
+ */
38
+ export interface RowTransformer {
39
+ /** Transform SQL row to document */
40
+ toDocument(row: Record<string, unknown>): Record<string, unknown>;
41
+ /** Transform document to SQL row */
42
+ toRow(doc: Record<string, unknown>): Record<string, unknown>;
43
+ /** Get column names */
44
+ getColumns(): string[];
45
+ /** Get field names */
46
+ getFields(): string[];
47
+ /** Get primary key column */
48
+ getPrimaryKey(): string;
49
+ }
50
+ /**
51
+ * Create row transformer
52
+ */
53
+ export declare function createRowTransformer(mapping: SchemaMapping, providerType: SQLProviderType): RowTransformer;
54
+ /**
55
+ * Create automatic field mapping from table info
56
+ */
57
+ export declare function createAutoMapping(table: string, collection: string, columns: Array<{
58
+ name: string;
59
+ type: string;
60
+ primaryKey: boolean;
61
+ }>): SchemaMapping;
62
+ /**
63
+ * Convert camelCase to snake_case
64
+ */
65
+ export declare function snakeCase(str: string): string;
66
+ /**
67
+ * Create transformer for LokiCMS entries
68
+ */
69
+ export declare function createEntryTransformer(providerType: SQLProviderType, tablePrefix?: string): RowTransformer;
70
+ /**
71
+ * Create transformer for LokiCMS content types
72
+ */
73
+ export declare function createContentTypeTransformer(providerType: SQLProviderType, tablePrefix?: string): RowTransformer;
74
+ //# sourceMappingURL=transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../src/query/transformer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACxC,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElE,oCAAoC;IACpC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7D,uBAAuB;IACvB,UAAU,IAAI,MAAM,EAAE,CAAC;IAEvB,sBAAsB;IACtB,SAAS,IAAI,MAAM,EAAE,CAAC;IAEtB,6BAA6B;IAC7B,aAAa,IAAI,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,eAAe,GAC5B,cAAc,CA2FhB;AA4FD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,GAClE,aAAa,CAgBf;AASD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,eAAe,EAC7B,WAAW,GAAE,MAAmB,GAC/B,cAAc,CAoBhB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,eAAe,EAC7B,WAAW,GAAE,MAAmB,GAC/B,cAAc,CAkBhB"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Row Transformer
3
+ *
4
+ * Transforms SQL rows to/from LokiJS documents.
5
+ */
6
+ /**
7
+ * Create row transformer
8
+ */
9
+ export function createRowTransformer(mapping, providerType) {
10
+ const columnToField = new Map();
11
+ const fieldToColumn = new Map();
12
+ // Build lookup maps
13
+ for (const field of mapping.fields) {
14
+ columnToField.set(field.column, field);
15
+ fieldToColumn.set(field.field, field);
16
+ }
17
+ /**
18
+ * Transform SQL row to document
19
+ */
20
+ function toDocument(row) {
21
+ const doc = {};
22
+ for (const [column, value] of Object.entries(row)) {
23
+ const mapping = columnToField.get(column);
24
+ if (mapping) {
25
+ const transformedValue = mapping.transform
26
+ ? mapping.transform(value)
27
+ : transformValue(value, providerType, 'toDocument');
28
+ doc[mapping.field] = transformedValue;
29
+ }
30
+ else {
31
+ // No mapping, use column name as field name
32
+ doc[column] = transformValue(value, providerType, 'toDocument');
33
+ }
34
+ }
35
+ return doc;
36
+ }
37
+ /**
38
+ * Transform document to SQL row
39
+ */
40
+ function toRow(doc) {
41
+ const row = {};
42
+ for (const [field, value] of Object.entries(doc)) {
43
+ // Skip LokiJS internal fields
44
+ if (field.startsWith('$') || field === 'meta') {
45
+ continue;
46
+ }
47
+ const mapping = fieldToColumn.get(field);
48
+ if (mapping) {
49
+ const transformedValue = mapping.reverseTransform
50
+ ? mapping.reverseTransform(value)
51
+ : transformValue(value, providerType, 'toRow');
52
+ row[mapping.column] = transformedValue;
53
+ }
54
+ else {
55
+ // No mapping, use field name as column name
56
+ row[field] = transformValue(value, providerType, 'toRow');
57
+ }
58
+ }
59
+ return row;
60
+ }
61
+ /**
62
+ * Get column names
63
+ */
64
+ function getColumns() {
65
+ return mapping.fields.map((f) => f.column);
66
+ }
67
+ /**
68
+ * Get field names
69
+ */
70
+ function getFields() {
71
+ return mapping.fields.map((f) => f.field);
72
+ }
73
+ /**
74
+ * Get primary key column
75
+ */
76
+ function getPrimaryKey() {
77
+ return mapping.primaryKey;
78
+ }
79
+ return {
80
+ toDocument,
81
+ toRow,
82
+ getColumns,
83
+ getFields,
84
+ getPrimaryKey,
85
+ };
86
+ }
87
+ /**
88
+ * Transform value based on type and direction
89
+ */
90
+ function transformValue(value, providerType, direction) {
91
+ if (value === null || value === undefined) {
92
+ return null;
93
+ }
94
+ if (direction === 'toDocument') {
95
+ // SQL → Document transformations
96
+ // Handle JSON strings
97
+ if (typeof value === 'string') {
98
+ // Try to parse as JSON if it looks like JSON
99
+ if ((value.startsWith('{') && value.endsWith('}')) ||
100
+ (value.startsWith('[') && value.endsWith(']'))) {
101
+ try {
102
+ return JSON.parse(value);
103
+ }
104
+ catch {
105
+ return value;
106
+ }
107
+ }
108
+ }
109
+ // Handle Buffer/Blob to base64
110
+ if (Buffer.isBuffer(value)) {
111
+ return value.toString('base64');
112
+ }
113
+ // Handle BigInt
114
+ if (typeof value === 'bigint') {
115
+ return Number(value);
116
+ }
117
+ // Handle Date
118
+ if (value instanceof Date) {
119
+ return value.toISOString();
120
+ }
121
+ return value;
122
+ }
123
+ else {
124
+ // Document → SQL transformations
125
+ // Handle objects/arrays to JSON
126
+ if (typeof value === 'object' && value !== null) {
127
+ if (Array.isArray(value) || Object.keys(value).length > 0) {
128
+ // PostgreSQL can use native JSONB
129
+ if (providerType === 'postgresql') {
130
+ return JSON.stringify(value);
131
+ }
132
+ // Other providers store as JSON string
133
+ return JSON.stringify(value);
134
+ }
135
+ }
136
+ // Handle ISO date strings
137
+ if (typeof value === 'string') {
138
+ // Check if it's an ISO date string
139
+ const dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
140
+ if (dateRegex.test(value)) {
141
+ // Keep as string for most providers
142
+ return value;
143
+ }
144
+ }
145
+ // Handle base64 to Buffer
146
+ if (typeof value === 'string' && isBase64(value)) {
147
+ // Only convert if explicitly needed
148
+ return value;
149
+ }
150
+ return value;
151
+ }
152
+ }
153
+ /**
154
+ * Check if string is base64 encoded
155
+ */
156
+ function isBase64(str) {
157
+ if (str.length < 16)
158
+ return false;
159
+ const base64Regex = /^[A-Za-z0-9+/]+=*$/;
160
+ return base64Regex.test(str);
161
+ }
162
+ /**
163
+ * Create automatic field mapping from table info
164
+ */
165
+ export function createAutoMapping(table, collection, columns) {
166
+ const primaryKey = columns.find((c) => c.primaryKey)?.name ?? 'id';
167
+ const fields = columns.map((col) => ({
168
+ column: col.name,
169
+ field: camelCase(col.name),
170
+ // Add type-specific transforms if needed
171
+ }));
172
+ return {
173
+ table,
174
+ collection,
175
+ primaryKey,
176
+ fields,
177
+ autoFields: ['created_at', 'updated_at'],
178
+ };
179
+ }
180
+ /**
181
+ * Convert snake_case to camelCase
182
+ */
183
+ function camelCase(str) {
184
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
185
+ }
186
+ /**
187
+ * Convert camelCase to snake_case
188
+ */
189
+ export function snakeCase(str) {
190
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
191
+ }
192
+ /**
193
+ * Create transformer for LokiCMS entries
194
+ */
195
+ export function createEntryTransformer(providerType, tablePrefix = 'lokicms_') {
196
+ const mapping = {
197
+ table: `${tablePrefix}entries`,
198
+ collection: 'entries',
199
+ primaryKey: 'id',
200
+ fields: [
201
+ { column: 'id', field: 'id' },
202
+ { column: 'content_type', field: 'contentType' },
203
+ { column: 'data', field: 'data' },
204
+ { column: 'status', field: 'status' },
205
+ { column: 'locale', field: 'locale' },
206
+ { column: 'created_at', field: 'createdAt' },
207
+ { column: 'updated_at', field: 'updatedAt' },
208
+ { column: 'published_at', field: 'publishedAt' },
209
+ { column: 'created_by', field: 'createdBy' },
210
+ { column: 'updated_by', field: 'updatedBy' },
211
+ ],
212
+ };
213
+ return createRowTransformer(mapping, providerType);
214
+ }
215
+ /**
216
+ * Create transformer for LokiCMS content types
217
+ */
218
+ export function createContentTypeTransformer(providerType, tablePrefix = 'lokicms_') {
219
+ const mapping = {
220
+ table: `${tablePrefix}content_types`,
221
+ collection: 'contentTypes',
222
+ primaryKey: 'id',
223
+ fields: [
224
+ { column: 'id', field: 'id' },
225
+ { column: 'name', field: 'name' },
226
+ { column: 'slug', field: 'slug' },
227
+ { column: 'description', field: 'description' },
228
+ { column: 'fields', field: 'fields' },
229
+ { column: 'options', field: 'options' },
230
+ { column: 'created_at', field: 'createdAt' },
231
+ { column: 'updated_at', field: 'updatedAt' },
232
+ ],
233
+ };
234
+ return createRowTransformer(mapping, providerType);
235
+ }
236
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/query/transformer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,350 @@
1
+ /**
2
+ * LokiCMS SQL Plugin - Type Definitions
3
+ */
4
+ /**
5
+ * Supported SQL providers
6
+ */
7
+ export type SQLProviderType = 'postgresql' | 'mysql' | 'mariadb' | 'sqlite';
8
+ /**
9
+ * Vector storage providers (includes lokijs for in-memory)
10
+ */
11
+ export type VectorProviderType = SQLProviderType | 'lokijs';
12
+ /**
13
+ * Connection mode
14
+ */
15
+ export type ConnectionMode = 'readwrite' | 'readonly';
16
+ /**
17
+ * PostgreSQL connection config
18
+ */
19
+ export interface PostgreSQLConnectionConfig {
20
+ connectionString?: string;
21
+ host?: string;
22
+ port?: number;
23
+ database?: string;
24
+ user?: string;
25
+ password?: string;
26
+ ssl?: boolean | {
27
+ rejectUnauthorized?: boolean;
28
+ };
29
+ }
30
+ /**
31
+ * MySQL/MariaDB connection config
32
+ */
33
+ export interface MySQLConnectionConfig {
34
+ host: string;
35
+ port?: number;
36
+ database: string;
37
+ user: string;
38
+ password: string;
39
+ ssl?: boolean | object;
40
+ }
41
+ /**
42
+ * SQLite connection config
43
+ */
44
+ export interface SQLiteConnectionConfig {
45
+ filename: string;
46
+ readonly?: boolean;
47
+ }
48
+ /**
49
+ * Union of all connection configs
50
+ */
51
+ export type ConnectionConfig = PostgreSQLConnectionConfig | MySQLConnectionConfig | SQLiteConnectionConfig;
52
+ /**
53
+ * Table to collection mapping
54
+ */
55
+ export interface TableMapping {
56
+ /** Target LokiJS collection name */
57
+ collection: string;
58
+ /** Sync interval in minutes (for readonly sources) */
59
+ syncInterval?: number;
60
+ /** Primary key column (default: 'id') */
61
+ primaryKey?: string;
62
+ /** Transform function for rows */
63
+ transform?: (row: Record<string, unknown>) => Record<string, unknown>;
64
+ /** Columns to select (default: all) */
65
+ columns?: string[];
66
+ /** WHERE clause for filtering */
67
+ where?: string;
68
+ }
69
+ /**
70
+ * Source configuration (for data federation)
71
+ */
72
+ export interface SourceConfig {
73
+ /** Unique source name */
74
+ name: string;
75
+ /** Provider type */
76
+ provider: SQLProviderType;
77
+ /** Connection mode (sources are typically readonly) */
78
+ mode: ConnectionMode;
79
+ /** Connection configuration */
80
+ connection: ConnectionConfig;
81
+ /** Table mappings */
82
+ tables: Record<string, TableMapping>;
83
+ /** Auto-sync enabled */
84
+ autoSync?: boolean;
85
+ }
86
+ /**
87
+ * Vector storage configuration
88
+ */
89
+ export interface VectorConfig {
90
+ /** Provider for vector storage */
91
+ provider: VectorProviderType;
92
+ /** Connection (if not lokijs) */
93
+ connection?: ConnectionConfig;
94
+ /** Vector dimensions */
95
+ dimensions?: number;
96
+ /** Enable vector indexing */
97
+ enableIndex?: boolean;
98
+ }
99
+ /**
100
+ * Cache configuration
101
+ */
102
+ export interface CacheConfig {
103
+ /** Enable caching */
104
+ enabled: boolean;
105
+ /** TTL in minutes */
106
+ ttlMinutes?: number;
107
+ /** Collections to cache (empty = all) */
108
+ collections?: string[];
109
+ }
110
+ /**
111
+ * Main plugin configuration
112
+ */
113
+ export interface SQLPluginConfig {
114
+ /** Primary data source */
115
+ primary?: {
116
+ provider: SQLProviderType;
117
+ mode: ConnectionMode;
118
+ connection: ConnectionConfig;
119
+ };
120
+ /** Additional readonly sources */
121
+ sources?: SourceConfig[];
122
+ /** Vector storage configuration */
123
+ vectors?: VectorConfig;
124
+ /** Cache configuration */
125
+ cache?: CacheConfig;
126
+ /** Table prefix for LokiCMS tables */
127
+ tablePrefix?: string;
128
+ /** Enable debug logging */
129
+ debug?: boolean;
130
+ }
131
+ /**
132
+ * Database capabilities
133
+ */
134
+ export interface ProviderCapabilities {
135
+ /** Supports JSONB/JSON columns */
136
+ json: boolean;
137
+ /** Supports vector data type */
138
+ vectors: boolean;
139
+ /** Vector extension/version info */
140
+ vectorInfo?: string;
141
+ /** Supports full-text search */
142
+ fullText: boolean;
143
+ /** Full-text method (tsvector, FULLTEXT, FTS5) */
144
+ fullTextMethod?: string;
145
+ /** Supports transactions */
146
+ transactions: boolean;
147
+ /** Max connections */
148
+ maxConnections?: number;
149
+ }
150
+ /**
151
+ * Query result
152
+ */
153
+ export interface QueryResult<T = Record<string, unknown>> {
154
+ rows: T[];
155
+ rowCount: number;
156
+ fields?: Array<{
157
+ name: string;
158
+ dataType: string;
159
+ }>;
160
+ }
161
+ /**
162
+ * Provider status
163
+ */
164
+ export interface ProviderStatus {
165
+ connected: boolean;
166
+ provider: SQLProviderType;
167
+ version?: string;
168
+ database?: string;
169
+ mode: ConnectionMode;
170
+ capabilities: ProviderCapabilities;
171
+ error?: string;
172
+ }
173
+ /**
174
+ * Vector entry
175
+ */
176
+ export interface VectorEntry {
177
+ id: string;
178
+ entryId: string;
179
+ collection: string;
180
+ vector: number[];
181
+ textHash: string;
182
+ createdAt: number;
183
+ updatedAt: number;
184
+ }
185
+ /**
186
+ * Vector search options
187
+ */
188
+ export interface VectorSearchOptions {
189
+ limit?: number;
190
+ collection?: string;
191
+ minSimilarity?: number;
192
+ }
193
+ /**
194
+ * Vector search result
195
+ */
196
+ export interface VectorSearchResult {
197
+ id: string;
198
+ entryId: string;
199
+ collection: string;
200
+ similarity: number;
201
+ }
202
+ /**
203
+ * Sync result
204
+ */
205
+ export interface SyncResult {
206
+ success: boolean;
207
+ source: string;
208
+ table: string;
209
+ collection: string;
210
+ inserted: number;
211
+ updated: number;
212
+ deleted: number;
213
+ errors: string[];
214
+ duration: number;
215
+ }
216
+ /**
217
+ * Import options
218
+ */
219
+ export interface ImportOptions {
220
+ /** Source name */
221
+ source: string;
222
+ /** Table to import */
223
+ table?: string;
224
+ /** Full refresh (delete existing) */
225
+ fullRefresh?: boolean;
226
+ /** Batch size */
227
+ batchSize?: number;
228
+ }
229
+ /**
230
+ * Cache entry
231
+ */
232
+ export interface CacheEntry {
233
+ key: string;
234
+ value: unknown;
235
+ expiresAt: number;
236
+ createdAt: number;
237
+ }
238
+ /**
239
+ * Cache stats
240
+ */
241
+ export interface CacheStats {
242
+ enabled: boolean;
243
+ entries: number;
244
+ size: number;
245
+ hits: number;
246
+ misses: number;
247
+ ttlMinutes: number;
248
+ }
249
+ /**
250
+ * Column info
251
+ */
252
+ export interface ColumnInfo {
253
+ name: string;
254
+ type: string;
255
+ nullable: boolean;
256
+ primaryKey: boolean;
257
+ defaultValue?: unknown;
258
+ }
259
+ /**
260
+ * Table info
261
+ */
262
+ export interface TableInfo {
263
+ name: string;
264
+ schema?: string;
265
+ columns: ColumnInfo[];
266
+ rowCount?: number;
267
+ }
268
+ /**
269
+ * Database schema
270
+ */
271
+ export interface DatabaseSchema {
272
+ tables: TableInfo[];
273
+ views?: string[];
274
+ }
275
+ /**
276
+ * Logger interface
277
+ */
278
+ export interface PluginLogger {
279
+ info(message: string, ...args: unknown[]): void;
280
+ warn(message: string, ...args: unknown[]): void;
281
+ error(message: string, ...args: unknown[]): void;
282
+ debug(message: string, ...args: unknown[]): void;
283
+ }
284
+ /**
285
+ * MCP Tool definition
286
+ */
287
+ export interface McpToolDefinition {
288
+ description: string;
289
+ inputSchema: unknown;
290
+ handler(input: unknown): Promise<unknown>;
291
+ }
292
+ /**
293
+ * MCP Tools registry
294
+ */
295
+ export interface McpTools {
296
+ registerTool(name: string, tool: McpToolDefinition): void;
297
+ }
298
+ /**
299
+ * Plugin hooks
300
+ */
301
+ export interface PluginHooks {
302
+ on(event: string, callback: (...args: unknown[]) => void): void;
303
+ emit(event: string, ...args: unknown[]): void;
304
+ }
305
+ /**
306
+ * Plugin API
307
+ */
308
+ export interface PluginAPI {
309
+ config: Record<string, unknown>;
310
+ logger: PluginLogger;
311
+ hooks: PluginHooks;
312
+ mcp: McpTools;
313
+ services: {
314
+ entries: unknown;
315
+ contentTypes: unknown;
316
+ [key: string]: unknown;
317
+ };
318
+ }
319
+ /**
320
+ * Plugin definition
321
+ */
322
+ export interface PluginDefinition {
323
+ name: string;
324
+ version: string;
325
+ description: string;
326
+ register(api: PluginAPI): Promise<void>;
327
+ }
328
+ /** Supported providers */
329
+ export declare const SQL_PROVIDERS: readonly SQLProviderType[];
330
+ /** Vector providers */
331
+ export declare const VECTOR_PROVIDERS: readonly VectorProviderType[];
332
+ /** Default table prefix */
333
+ export declare const DEFAULT_TABLE_PREFIX = "lokicms_";
334
+ /** Default vector dimensions */
335
+ export declare const DEFAULT_VECTOR_DIMENSIONS = 384;
336
+ /** Default cache TTL */
337
+ export declare const DEFAULT_CACHE_TTL = 60;
338
+ /**
339
+ * SQL error codes
340
+ */
341
+ export type SQLErrorCode = 'NOT_CONFIGURED' | 'CONNECTION_FAILED' | 'QUERY_FAILED' | 'PROVIDER_NOT_FOUND' | 'SOURCE_NOT_FOUND' | 'SYNC_FAILED' | 'VECTOR_NOT_SUPPORTED' | 'READONLY_SOURCE' | 'INVALID_CONFIG';
342
+ /**
343
+ * SQL error
344
+ */
345
+ export declare class SQLError extends Error {
346
+ code: SQLErrorCode;
347
+ details?: Record<string, unknown> | undefined;
348
+ constructor(message: string, code: SQLErrorCode, details?: Record<string, unknown> | undefined);
349
+ }
350
+ //# sourceMappingURL=types.d.ts.map