supabase-dataobject-core 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.
- package/README.md +324 -0
- package/dist/dataObject.d.ts +30 -0
- package/dist/dataObject.d.ts.map +1 -0
- package/dist/dataObject.js +186 -0
- package/dist/dataObject.js.map +1 -0
- package/dist/dataObjectManager.d.ts +31 -0
- package/dist/dataObjectManager.d.ts.map +1 -0
- package/dist/dataObjectManager.js +189 -0
- package/dist/dataObjectManager.js.map +1 -0
- package/dist/eventEmitter.d.ts +23 -0
- package/dist/eventEmitter.d.ts.map +1 -0
- package/dist/eventEmitter.js +51 -0
- package/dist/eventEmitter.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# Supabase DataObject Core
|
|
2
|
+
|
|
3
|
+
A TypeScript library for creating reactive data objects from Supabase tables and views. This package provides a clean, type-safe way to interact with your Supabase data with built-in reactivity, CRUD operations, and advanced querying capabilities.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🔄 **Reactive Data Objects**: Automatically update when data changes
|
|
8
|
+
- 🛡️ **Type Safety**: Full TypeScript support with proper type definitions
|
|
9
|
+
- 🔍 **Advanced Querying**: Support for filtering, sorting, field selection, and pagination
|
|
10
|
+
- ✅ **CRUD Operations**: Built-in Create, Read, Update, Delete functionality
|
|
11
|
+
- 🎯 **Named Objects**: Create named data objects that can be accessed globally
|
|
12
|
+
- 🔧 **Configurable**: Flexible configuration options for different use cases
|
|
13
|
+
- 📦 **Zero Dependencies**: Only depends on @supabase/supabase-js
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install supabase-dataobject-core
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### Basic Usage
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import {
|
|
27
|
+
initializeDataObjectManager,
|
|
28
|
+
createDataObject,
|
|
29
|
+
getDataObjectById
|
|
30
|
+
} from 'supabase-dataobject-core';
|
|
31
|
+
|
|
32
|
+
// Initialize the manager with your Supabase config
|
|
33
|
+
initializeDataObjectManager({
|
|
34
|
+
supabaseConfig: {
|
|
35
|
+
url: 'https://your-project.supabase.co',
|
|
36
|
+
anonKey: 'your-anon-key'
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Create a data object
|
|
41
|
+
const userDataObject = await createDataObject('users', {
|
|
42
|
+
viewName: 'users',
|
|
43
|
+
canInsert: true,
|
|
44
|
+
canUpdate: true,
|
|
45
|
+
canDelete: false
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Listen for data changes
|
|
49
|
+
userDataObject?.onDataChanged((users) => {
|
|
50
|
+
console.log('Users updated:', users);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Access the data object from anywhere
|
|
54
|
+
const users = getDataObjectById('users');
|
|
55
|
+
if (users) {
|
|
56
|
+
const data = users.getData();
|
|
57
|
+
console.log('Current users:', data);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Advanced Configuration
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { createDataObject } from 'supabase-dataobject-core';
|
|
65
|
+
|
|
66
|
+
const ordersDataObject = await createDataObject('pendingOrders', {
|
|
67
|
+
viewName: 'orders',
|
|
68
|
+
fields: [
|
|
69
|
+
{ name: 'id', type: 'number' },
|
|
70
|
+
{ name: 'customer_name', type: 'string' },
|
|
71
|
+
{ name: 'total_amount', type: 'number' },
|
|
72
|
+
{ name: 'status', type: 'string' }
|
|
73
|
+
],
|
|
74
|
+
whereClauses: [
|
|
75
|
+
{ field: 'status', operator: 'equals', value: 'pending' },
|
|
76
|
+
{ field: 'total_amount', operator: 'greaterthan', value: 100 }
|
|
77
|
+
],
|
|
78
|
+
sort: { field: 'created_at', direction: 'desc' },
|
|
79
|
+
recordLimit: 50,
|
|
80
|
+
canInsert: true,
|
|
81
|
+
canUpdate: true,
|
|
82
|
+
canDelete: true
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## API Reference
|
|
87
|
+
|
|
88
|
+
### Core Functions
|
|
89
|
+
|
|
90
|
+
#### `initializeDataObjectManager(config)`
|
|
91
|
+
Initialize the global data object manager.
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
initializeDataObjectManager({
|
|
95
|
+
supabaseConfig: {
|
|
96
|
+
url: 'https://your-project.supabase.co',
|
|
97
|
+
anonKey: 'your-anon-key'
|
|
98
|
+
},
|
|
99
|
+
errorHandler: {
|
|
100
|
+
onError: (error) => console.error(error),
|
|
101
|
+
onWarning: (warning) => console.warn(warning),
|
|
102
|
+
onInfo: (info) => console.info(info)
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### `createDataObject(name, options)`
|
|
108
|
+
Create a new named data object.
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
const dataObject = await createDataObject('myData', {
|
|
112
|
+
viewName: 'table_name',
|
|
113
|
+
// ... other options
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### `getDataObjectById(id)`
|
|
118
|
+
Retrieve a data object by its name/ID.
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
const dataObject = getDataObjectById('myData');
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### `getAllDataObjects()`
|
|
125
|
+
Get all created data objects.
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
const allObjects = getAllDataObjects();
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### `removeDataObject(id)`
|
|
132
|
+
Remove a data object by its name/ID.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
const removed = removeDataObject('myData');
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### `refreshDataObject(id)`
|
|
139
|
+
Refresh a data object's data from Supabase.
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
await refreshDataObject('myData');
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### DataObject Class
|
|
146
|
+
|
|
147
|
+
#### Methods
|
|
148
|
+
|
|
149
|
+
- `getData()`: Get current data as an array
|
|
150
|
+
- `refresh()`: Manually refresh data from Supabase
|
|
151
|
+
- `insert(record)`: Insert a new record
|
|
152
|
+
- `update(id, updates)`: Update an existing record
|
|
153
|
+
- `delete(id)`: Delete a record
|
|
154
|
+
- `dispose()`: Clean up the data object
|
|
155
|
+
- `onDataChanged(callback)`: Listen for data changes
|
|
156
|
+
|
|
157
|
+
#### Example
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
const dataObject = getDataObjectById('users');
|
|
161
|
+
|
|
162
|
+
if (dataObject) {
|
|
163
|
+
// Get current data
|
|
164
|
+
const users = dataObject.getData();
|
|
165
|
+
|
|
166
|
+
// Insert new user
|
|
167
|
+
await dataObject.insert({
|
|
168
|
+
name: 'John Doe',
|
|
169
|
+
email: 'john@example.com'
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Update user
|
|
173
|
+
await dataObject.update(1, { name: 'Jane Doe' });
|
|
174
|
+
|
|
175
|
+
// Delete user
|
|
176
|
+
await dataObject.delete(1);
|
|
177
|
+
|
|
178
|
+
// Listen for changes
|
|
179
|
+
const unsubscribe = dataObject.onDataChanged((data) => {
|
|
180
|
+
console.log('Data updated:', data);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// Clean up listener
|
|
184
|
+
unsubscribe();
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Configuration Options
|
|
189
|
+
|
|
190
|
+
### DataObjectOptions
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
interface DataObjectOptions {
|
|
194
|
+
viewName: string; // Table or view name
|
|
195
|
+
fields?: DataObjectField[]; // Specific fields to select
|
|
196
|
+
whereClauses?: WhereClause[]; // Filter conditions
|
|
197
|
+
sort?: SortConfig; // Sorting configuration
|
|
198
|
+
recordLimit?: number; // Maximum records to fetch
|
|
199
|
+
canInsert?: boolean; // Allow insert operations
|
|
200
|
+
canUpdate?: boolean; // Allow update operations
|
|
201
|
+
canDelete?: boolean; // Allow delete operations
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### WhereClause
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
interface WhereClause {
|
|
209
|
+
field: string;
|
|
210
|
+
operator: 'equals' | 'notequals' | 'greaterthan' | 'lessthan';
|
|
211
|
+
value: any;
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### SortConfig
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
interface SortConfig {
|
|
219
|
+
field: string;
|
|
220
|
+
direction: 'asc' | 'desc';
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Error Handling
|
|
225
|
+
|
|
226
|
+
You can provide custom error handlers when initializing the manager:
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
initializeDataObjectManager({
|
|
230
|
+
supabaseConfig: { /* ... */ },
|
|
231
|
+
errorHandler: {
|
|
232
|
+
onError: (error) => {
|
|
233
|
+
// Handle errors (e.g., show toast notification)
|
|
234
|
+
console.error('DataObject Error:', error);
|
|
235
|
+
},
|
|
236
|
+
onWarning: (warning) => {
|
|
237
|
+
// Handle warnings
|
|
238
|
+
console.warn('DataObject Warning:', warning);
|
|
239
|
+
},
|
|
240
|
+
onInfo: (info) => {
|
|
241
|
+
// Handle info messages
|
|
242
|
+
console.info('DataObject Info:', info);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## TypeScript Support
|
|
249
|
+
|
|
250
|
+
This package is written in TypeScript and provides full type safety:
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
import type {
|
|
254
|
+
DataObjectOptions,
|
|
255
|
+
DataObjectRecord,
|
|
256
|
+
SupabaseConfig
|
|
257
|
+
} from 'supabase-dataobject-core';
|
|
258
|
+
|
|
259
|
+
// Your data will be properly typed
|
|
260
|
+
const users: DataObjectRecord[] = dataObject.getData();
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Examples
|
|
264
|
+
|
|
265
|
+
### Service Class Pattern
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
class UserService {
|
|
269
|
+
private getUserDataObject() {
|
|
270
|
+
return getDataObjectById('users');
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async getAllUsers() {
|
|
274
|
+
const dataObject = this.getUserDataObject();
|
|
275
|
+
return dataObject ? dataObject.getData() : [];
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
async createUser(userData: any) {
|
|
279
|
+
const dataObject = this.getUserDataObject();
|
|
280
|
+
return dataObject ? await dataObject.insert(userData) : false;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
async updateUser(id: number, updates: any) {
|
|
284
|
+
const dataObject = this.getUserDataObject();
|
|
285
|
+
return dataObject ? await dataObject.update(id, updates) : false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### React Hook Pattern
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
import { useEffect, useState } from 'react';
|
|
294
|
+
import { getDataObjectById } from 'supabase-dataobject-core';
|
|
295
|
+
|
|
296
|
+
function useDataObject(id: string) {
|
|
297
|
+
const [data, setData] = useState([]);
|
|
298
|
+
const [loading, setLoading] = useState(true);
|
|
299
|
+
|
|
300
|
+
useEffect(() => {
|
|
301
|
+
const dataObject = getDataObjectById(id);
|
|
302
|
+
if (dataObject) {
|
|
303
|
+
setData(dataObject.getData());
|
|
304
|
+
setLoading(false);
|
|
305
|
+
|
|
306
|
+
const unsubscribe = dataObject.onDataChanged((newData) => {
|
|
307
|
+
setData(newData);
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
return unsubscribe;
|
|
311
|
+
}
|
|
312
|
+
}, [id]);
|
|
313
|
+
|
|
314
|
+
return { data, loading };
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## License
|
|
319
|
+
|
|
320
|
+
MIT
|
|
321
|
+
|
|
322
|
+
## Contributing
|
|
323
|
+
|
|
324
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
import { DataObjectOptions, DataObjectRecord, SupabaseConfig } from './types';
|
|
3
|
+
export interface DataObjectErrorHandler {
|
|
4
|
+
onError?: (error: string) => void;
|
|
5
|
+
onWarning?: (warning: string) => void;
|
|
6
|
+
onInfo?: (info: string) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare class DataObject {
|
|
9
|
+
private supabase;
|
|
10
|
+
private options;
|
|
11
|
+
private data;
|
|
12
|
+
private eventEmitter;
|
|
13
|
+
private errorHandler?;
|
|
14
|
+
readonly onDataChanged: (listener: (data: DataObjectRecord[]) => void) => () => void;
|
|
15
|
+
constructor(supabaseConfig: SupabaseConfig, options: DataObjectOptions, errorHandler?: DataObjectErrorHandler);
|
|
16
|
+
private handleError;
|
|
17
|
+
private handleWarning;
|
|
18
|
+
private handleInfo;
|
|
19
|
+
private loadData;
|
|
20
|
+
getData(): DataObjectRecord[];
|
|
21
|
+
refresh(): Promise<void>;
|
|
22
|
+
insert(record: Partial<DataObjectRecord>): Promise<boolean>;
|
|
23
|
+
update(id: any, updates: Partial<DataObjectRecord>): Promise<boolean>;
|
|
24
|
+
delete(id: any): Promise<boolean>;
|
|
25
|
+
dispose(): void;
|
|
26
|
+
getOptions(): DataObjectOptions;
|
|
27
|
+
getSupabaseClient(): SupabaseClient;
|
|
28
|
+
}
|
|
29
|
+
export declare function createDataObject(supabaseConfig: SupabaseConfig, options: DataObjectOptions, errorHandler?: DataObjectErrorHandler): Promise<DataObject>;
|
|
30
|
+
//# sourceMappingURL=dataObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataObject.d.ts","sourceRoot":"","sources":["../src/dataObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAkC,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9G,MAAM,WAAW,sBAAsB;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,YAAY,CAAC,CAAyB;IAE9C,SAAgB,aAAa,+DAA2B;gBAE5C,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,sBAAsB;IAO7G,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,UAAU;YAQJ,QAAQ;IA2Df,OAAO,IAAI,gBAAgB,EAAE;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B3D,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BrE,MAAM,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BvC,OAAO,IAAI,IAAI;IAIf,UAAU,IAAI,iBAAiB;IAI/B,iBAAiB,IAAI,cAAc;CAG7C;AAED,wBAAsB,gBAAgB,CAClC,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,iBAAiB,EAC1B,YAAY,CAAC,EAAE,sBAAsB,GACtC,OAAO,CAAC,UAAU,CAAC,CAErB"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataObject = void 0;
|
|
4
|
+
exports.createDataObject = createDataObject;
|
|
5
|
+
const supabase_js_1 = require("@supabase/supabase-js");
|
|
6
|
+
const eventEmitter_1 = require("./eventEmitter");
|
|
7
|
+
class DataObject {
|
|
8
|
+
constructor(supabaseConfig, options, errorHandler) {
|
|
9
|
+
this.data = [];
|
|
10
|
+
this.eventEmitter = new eventEmitter_1.EventEmitter();
|
|
11
|
+
this.onDataChanged = this.eventEmitter.event;
|
|
12
|
+
this.supabase = (0, supabase_js_1.createClient)(supabaseConfig.url, supabaseConfig.anonKey);
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.errorHandler = errorHandler;
|
|
15
|
+
this.loadData();
|
|
16
|
+
}
|
|
17
|
+
handleError(message) {
|
|
18
|
+
if (this.errorHandler?.onError) {
|
|
19
|
+
this.errorHandler.onError(message);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error(message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
handleWarning(message) {
|
|
26
|
+
if (this.errorHandler?.onWarning) {
|
|
27
|
+
this.errorHandler.onWarning(message);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.warn(message);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
handleInfo(message) {
|
|
34
|
+
if (this.errorHandler?.onInfo) {
|
|
35
|
+
this.errorHandler.onInfo(message);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.info(message);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async loadData() {
|
|
42
|
+
try {
|
|
43
|
+
// Start with base query
|
|
44
|
+
let query = this.supabase.from(this.options.viewName);
|
|
45
|
+
// Apply select fields
|
|
46
|
+
if (this.options.fields && this.options.fields.length > 0) {
|
|
47
|
+
const fieldNames = this.options.fields.map(f => f.name).join(',');
|
|
48
|
+
query = query.select(fieldNames);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
query = query.select('*');
|
|
52
|
+
}
|
|
53
|
+
// Apply where clauses
|
|
54
|
+
if (this.options.whereClauses) {
|
|
55
|
+
for (const whereClause of this.options.whereClauses) {
|
|
56
|
+
switch (whereClause.operator) {
|
|
57
|
+
case 'equals':
|
|
58
|
+
query = query.eq(whereClause.field, whereClause.value);
|
|
59
|
+
break;
|
|
60
|
+
case 'notequals':
|
|
61
|
+
query = query.neq(whereClause.field, whereClause.value);
|
|
62
|
+
break;
|
|
63
|
+
case 'greaterthan':
|
|
64
|
+
query = query.gt(whereClause.field, whereClause.value);
|
|
65
|
+
break;
|
|
66
|
+
case 'lessthan':
|
|
67
|
+
query = query.lt(whereClause.field, whereClause.value);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Apply sorting
|
|
73
|
+
if (this.options.sort) {
|
|
74
|
+
query = query.order(this.options.sort.field, {
|
|
75
|
+
ascending: this.options.sort.direction === 'asc'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Apply record limit
|
|
79
|
+
if (this.options.recordLimit) {
|
|
80
|
+
query = query.limit(this.options.recordLimit);
|
|
81
|
+
}
|
|
82
|
+
const { data, error } = await query;
|
|
83
|
+
if (error) {
|
|
84
|
+
this.handleError(`Error loading data: ${error.message}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.data = data || [];
|
|
88
|
+
this.eventEmitter.fire(this.data);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
this.handleError(`Error loading data: ${error}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
getData() {
|
|
95
|
+
return [...this.data];
|
|
96
|
+
}
|
|
97
|
+
async refresh() {
|
|
98
|
+
await this.loadData();
|
|
99
|
+
}
|
|
100
|
+
async insert(record) {
|
|
101
|
+
if (!this.options.canInsert) {
|
|
102
|
+
this.handleWarning('Insert operation is not allowed for this data object');
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const { data, error } = await this.supabase
|
|
107
|
+
.from(this.options.viewName)
|
|
108
|
+
.insert(record)
|
|
109
|
+
.select();
|
|
110
|
+
if (error) {
|
|
111
|
+
this.handleError(`Error inserting record: ${error.message}`);
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
// Refresh data to get the latest state
|
|
115
|
+
await this.refresh();
|
|
116
|
+
this.handleInfo('Record inserted successfully');
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
this.handleError(`Error inserting record: ${error}`);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async update(id, updates) {
|
|
125
|
+
if (!this.options.canUpdate) {
|
|
126
|
+
this.handleWarning('Update operation is not allowed for this data object');
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const { error } = await this.supabase
|
|
131
|
+
.from(this.options.viewName)
|
|
132
|
+
.update(updates)
|
|
133
|
+
.eq('id', id);
|
|
134
|
+
if (error) {
|
|
135
|
+
this.handleError(`Error updating record: ${error.message}`);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// Refresh data to get the latest state
|
|
139
|
+
await this.refresh();
|
|
140
|
+
this.handleInfo('Record updated successfully');
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
this.handleError(`Error updating record: ${error}`);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async delete(id) {
|
|
149
|
+
if (!this.options.canDelete) {
|
|
150
|
+
this.handleWarning('Delete operation is not allowed for this data object');
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const { error } = await this.supabase
|
|
155
|
+
.from(this.options.viewName)
|
|
156
|
+
.delete()
|
|
157
|
+
.eq('id', id);
|
|
158
|
+
if (error) {
|
|
159
|
+
this.handleError(`Error deleting record: ${error.message}`);
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
// Refresh data to get the latest state
|
|
163
|
+
await this.refresh();
|
|
164
|
+
this.handleInfo('Record deleted successfully');
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
this.handleError(`Error deleting record: ${error}`);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
dispose() {
|
|
173
|
+
this.eventEmitter.dispose();
|
|
174
|
+
}
|
|
175
|
+
getOptions() {
|
|
176
|
+
return { ...this.options };
|
|
177
|
+
}
|
|
178
|
+
getSupabaseClient() {
|
|
179
|
+
return this.supabase;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.DataObject = DataObject;
|
|
183
|
+
async function createDataObject(supabaseConfig, options, errorHandler) {
|
|
184
|
+
return new DataObject(supabaseConfig, options, errorHandler);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=dataObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataObject.js","sourceRoot":"","sources":["../src/dataObject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DataObject, DataObjectErrorHandler } from './dataObject';
|
|
2
|
+
import { DataObjectOptions, SupabaseConfig, StoredDataObject } from './types';
|
|
3
|
+
export interface DataObjectManagerConfig {
|
|
4
|
+
supabaseConfig: SupabaseConfig;
|
|
5
|
+
errorHandler?: DataObjectErrorHandler;
|
|
6
|
+
}
|
|
7
|
+
export declare class DataObjectManager {
|
|
8
|
+
private static instance;
|
|
9
|
+
private dataObjects;
|
|
10
|
+
private config;
|
|
11
|
+
private eventEmitter;
|
|
12
|
+
readonly onDataObjectsChanged: (listener: (data: StoredDataObject[]) => void) => () => void;
|
|
13
|
+
private constructor();
|
|
14
|
+
static getInstance(config?: DataObjectManagerConfig): DataObjectManager;
|
|
15
|
+
static setConfig(config: DataObjectManagerConfig): void;
|
|
16
|
+
createDataObject(name: string, options: DataObjectOptions): Promise<DataObject | null>;
|
|
17
|
+
getDataObjectById(id: string): DataObject | null;
|
|
18
|
+
getAllDataObjects(): StoredDataObject[];
|
|
19
|
+
removeDataObject(id: string): boolean;
|
|
20
|
+
refreshDataObject(id: string): Promise<boolean>;
|
|
21
|
+
clearAllDataObjects(): void;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
updateConfig(config: DataObjectManagerConfig): void;
|
|
24
|
+
getConfig(): DataObjectManagerConfig;
|
|
25
|
+
}
|
|
26
|
+
export declare function getDataObjectById(id: string): DataObject | null;
|
|
27
|
+
export declare function createDataObject(name: string, options: DataObjectOptions): Promise<DataObject | null>;
|
|
28
|
+
export declare function getAllDataObjects(): StoredDataObject[];
|
|
29
|
+
export declare function removeDataObject(id: string): boolean;
|
|
30
|
+
export declare function refreshDataObject(id: string): Promise<boolean>;
|
|
31
|
+
//# sourceMappingURL=dataObjectManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataObjectManager.d.ts","sourceRoot":"","sources":["../src/dataObjectManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG9E,MAAM,WAAW,uBAAuB;IACpC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,CAAC,EAAE,sBAAsB,CAAC;CACzC;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAA0C;IAE9D,SAAgB,oBAAoB,+DAA2B;IAE/D,OAAO;WAIO,WAAW,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,iBAAiB;WAUhE,SAAS,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAMjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA4C5F,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAKhD,iBAAiB,IAAI,gBAAgB,EAAE;IAIvC,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAkB/B,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBrD,mBAAmB,IAAI,IAAI;IAQ3B,OAAO,IAAI,IAAI;IAKf,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAInD,SAAS,IAAI,uBAAuB;CAG9C;AAGD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAQ/D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ3G;AAED,wBAAgB,iBAAiB,IAAI,gBAAgB,EAAE,CAQtD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAQpD;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpE"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataObjectManager = void 0;
|
|
4
|
+
exports.getDataObjectById = getDataObjectById;
|
|
5
|
+
exports.createDataObject = createDataObject;
|
|
6
|
+
exports.getAllDataObjects = getAllDataObjects;
|
|
7
|
+
exports.removeDataObject = removeDataObject;
|
|
8
|
+
exports.refreshDataObject = refreshDataObject;
|
|
9
|
+
const dataObject_1 = require("./dataObject");
|
|
10
|
+
const eventEmitter_1 = require("./eventEmitter");
|
|
11
|
+
class DataObjectManager {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.dataObjects = new Map();
|
|
14
|
+
this.eventEmitter = new eventEmitter_1.EventEmitter();
|
|
15
|
+
this.onDataObjectsChanged = this.eventEmitter.event;
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
static getInstance(config) {
|
|
19
|
+
if (!DataObjectManager.instance) {
|
|
20
|
+
if (!config) {
|
|
21
|
+
throw new Error('DataObjectManager must be initialized with config first');
|
|
22
|
+
}
|
|
23
|
+
DataObjectManager.instance = new DataObjectManager(config);
|
|
24
|
+
}
|
|
25
|
+
return DataObjectManager.instance;
|
|
26
|
+
}
|
|
27
|
+
static setConfig(config) {
|
|
28
|
+
if (DataObjectManager.instance) {
|
|
29
|
+
DataObjectManager.instance.config = config;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async createDataObject(name, options) {
|
|
33
|
+
// Check if name already exists
|
|
34
|
+
if (this.dataObjects.has(name)) {
|
|
35
|
+
const errorMsg = `Data object with name '${name}' already exists. Please choose a different name.`;
|
|
36
|
+
if (this.config.errorHandler?.onError) {
|
|
37
|
+
this.config.errorHandler.onError(errorMsg);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.error(errorMsg);
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const dataObject = new dataObject_1.DataObject(this.config.supabaseConfig, options, this.config.errorHandler);
|
|
46
|
+
const storedDataObject = {
|
|
47
|
+
id: name,
|
|
48
|
+
name,
|
|
49
|
+
options,
|
|
50
|
+
dataObject,
|
|
51
|
+
createdAt: new Date()
|
|
52
|
+
};
|
|
53
|
+
this.dataObjects.set(name, storedDataObject);
|
|
54
|
+
this.eventEmitter.fire(Array.from(this.dataObjects.values()));
|
|
55
|
+
const successMsg = `Data object '${name}' created successfully!`;
|
|
56
|
+
if (this.config.errorHandler?.onInfo) {
|
|
57
|
+
this.config.errorHandler.onInfo(successMsg);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.info(successMsg);
|
|
61
|
+
}
|
|
62
|
+
return dataObject;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const errorMsg = `Error creating data object '${name}': ${error}`;
|
|
66
|
+
if (this.config.errorHandler?.onError) {
|
|
67
|
+
this.config.errorHandler.onError(errorMsg);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.error(errorMsg);
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
getDataObjectById(id) {
|
|
76
|
+
const storedDataObject = this.dataObjects.get(id);
|
|
77
|
+
return storedDataObject ? storedDataObject.dataObject : null;
|
|
78
|
+
}
|
|
79
|
+
getAllDataObjects() {
|
|
80
|
+
return Array.from(this.dataObjects.values());
|
|
81
|
+
}
|
|
82
|
+
removeDataObject(id) {
|
|
83
|
+
const storedDataObject = this.dataObjects.get(id);
|
|
84
|
+
if (storedDataObject) {
|
|
85
|
+
storedDataObject.dataObject.dispose();
|
|
86
|
+
this.dataObjects.delete(id);
|
|
87
|
+
this.eventEmitter.fire(Array.from(this.dataObjects.values()));
|
|
88
|
+
const successMsg = `Data object '${id}' removed successfully!`;
|
|
89
|
+
if (this.config.errorHandler?.onInfo) {
|
|
90
|
+
this.config.errorHandler.onInfo(successMsg);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.info(successMsg);
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
async refreshDataObject(id) {
|
|
100
|
+
const storedDataObject = this.dataObjects.get(id);
|
|
101
|
+
if (storedDataObject) {
|
|
102
|
+
try {
|
|
103
|
+
await storedDataObject.dataObject.refresh();
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const errorMsg = `Error refreshing data object '${id}': ${error}`;
|
|
108
|
+
if (this.config.errorHandler?.onError) {
|
|
109
|
+
this.config.errorHandler.onError(errorMsg);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.error(errorMsg);
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
clearAllDataObjects() {
|
|
120
|
+
this.dataObjects.forEach(storedDataObject => {
|
|
121
|
+
storedDataObject.dataObject.dispose();
|
|
122
|
+
});
|
|
123
|
+
this.dataObjects.clear();
|
|
124
|
+
this.eventEmitter.fire([]);
|
|
125
|
+
}
|
|
126
|
+
dispose() {
|
|
127
|
+
this.clearAllDataObjects();
|
|
128
|
+
this.eventEmitter.dispose();
|
|
129
|
+
}
|
|
130
|
+
updateConfig(config) {
|
|
131
|
+
this.config = config;
|
|
132
|
+
}
|
|
133
|
+
getConfig() {
|
|
134
|
+
return { ...this.config };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.DataObjectManager = DataObjectManager;
|
|
138
|
+
// Global functions that can be used anywhere
|
|
139
|
+
function getDataObjectById(id) {
|
|
140
|
+
try {
|
|
141
|
+
const manager = DataObjectManager.getInstance();
|
|
142
|
+
return manager.getDataObjectById(id);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error('DataObjectManager not initialized:', error);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function createDataObject(name, options) {
|
|
150
|
+
try {
|
|
151
|
+
const manager = DataObjectManager.getInstance();
|
|
152
|
+
return await manager.createDataObject(name, options);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('DataObjectManager not initialized:', error);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function getAllDataObjects() {
|
|
160
|
+
try {
|
|
161
|
+
const manager = DataObjectManager.getInstance();
|
|
162
|
+
return manager.getAllDataObjects();
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error('DataObjectManager not initialized:', error);
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function removeDataObject(id) {
|
|
170
|
+
try {
|
|
171
|
+
const manager = DataObjectManager.getInstance();
|
|
172
|
+
return manager.removeDataObject(id);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error('DataObjectManager not initialized:', error);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function refreshDataObject(id) {
|
|
180
|
+
try {
|
|
181
|
+
const manager = DataObjectManager.getInstance();
|
|
182
|
+
return await manager.refreshDataObject(id);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
console.error('DataObjectManager not initialized:', error);
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=dataObjectManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataObjectManager.js","sourceRoot":"","sources":["../src/dataObjectManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple event emitter implementation to replace VSCode's EventEmitter
|
|
3
|
+
*/
|
|
4
|
+
export declare class EventEmitter<T> {
|
|
5
|
+
private listeners;
|
|
6
|
+
/**
|
|
7
|
+
* Add a listener for the event
|
|
8
|
+
*/
|
|
9
|
+
on(listener: (data: T) => void): () => void;
|
|
10
|
+
/**
|
|
11
|
+
* Fire the event to all listeners
|
|
12
|
+
*/
|
|
13
|
+
fire(data: T): void;
|
|
14
|
+
/**
|
|
15
|
+
* Remove all listeners
|
|
16
|
+
*/
|
|
17
|
+
dispose(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get the event interface for external use
|
|
20
|
+
*/
|
|
21
|
+
get event(): (listener: (data: T) => void) => () => void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=eventEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventEmitter.d.ts","sourceRoot":"","sources":["../src/eventEmitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC;IACvB,OAAO,CAAC,SAAS,CAAgC;IAEjD;;OAEG;IACI,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAYlD;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAU1B;;OAEG;IACI,OAAO,IAAI,IAAI;IAItB;;OAEG;IACH,IAAW,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAE9D;CACJ"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventEmitter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Simple event emitter implementation to replace VSCode's EventEmitter
|
|
6
|
+
*/
|
|
7
|
+
class EventEmitter {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.listeners = [];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Add a listener for the event
|
|
13
|
+
*/
|
|
14
|
+
on(listener) {
|
|
15
|
+
this.listeners.push(listener);
|
|
16
|
+
// Return a dispose function
|
|
17
|
+
return () => {
|
|
18
|
+
const index = this.listeners.indexOf(listener);
|
|
19
|
+
if (index !== -1) {
|
|
20
|
+
this.listeners.splice(index, 1);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fire the event to all listeners
|
|
26
|
+
*/
|
|
27
|
+
fire(data) {
|
|
28
|
+
this.listeners.forEach(listener => {
|
|
29
|
+
try {
|
|
30
|
+
listener(data);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('Error in event listener:', error);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Remove all listeners
|
|
39
|
+
*/
|
|
40
|
+
dispose() {
|
|
41
|
+
this.listeners = [];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the event interface for external use
|
|
45
|
+
*/
|
|
46
|
+
get event() {
|
|
47
|
+
return this.on.bind(this);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.EventEmitter = EventEmitter;
|
|
51
|
+
//# sourceMappingURL=eventEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../src/eventEmitter.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,YAAY;IAAzB;QACY,cAAS,GAA6B,EAAE,CAAC;IA2CrD,CAAC;IAzCG;;OAEG;IACI,EAAE,CAAC,QAA2B;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9B,4BAA4B;QAC5B,OAAO,GAAG,EAAE;YACR,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;QACL,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,IAAO;QACf,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC9B,IAAI,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACrD,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACJ;AA5CD,oCA4CC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { DataObject, createDataObject as createDataObjectDirect } from './dataObject';
|
|
2
|
+
export { DataObjectManager, DataObjectManagerConfig } from './dataObjectManager';
|
|
3
|
+
export { EventEmitter } from './eventEmitter';
|
|
4
|
+
export { getDataObjectById, createDataObject, getAllDataObjects, removeDataObject, refreshDataObject } from './dataObjectManager';
|
|
5
|
+
export type { DataObjectFieldType, SupportedOperator, DataObjectField, SortConfig, WhereClause, DataObjectOptions, SupabaseConfig, DataObjectRecord, NamedDataObjectOptions, StoredDataObject } from './types';
|
|
6
|
+
export type { DataObjectErrorHandler } from './dataObject';
|
|
7
|
+
import { DataObjectManager, DataObjectManagerConfig } from './dataObjectManager';
|
|
8
|
+
export declare function initializeDataObjectManager(config: DataObjectManagerConfig): DataObjectManager;
|
|
9
|
+
export declare function updateDataObjectManagerConfig(config: DataObjectManagerConfig): void;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EACH,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACpB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACR,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EACnB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAG3D,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,uBAAuB,GAAG,iBAAiB,CAE9F;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAEnF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Main exports for the supabase-dataobject-core package
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.refreshDataObject = exports.removeDataObject = exports.getAllDataObjects = exports.createDataObject = exports.getDataObjectById = exports.EventEmitter = exports.DataObjectManager = exports.createDataObjectDirect = exports.DataObject = void 0;
|
|
5
|
+
exports.initializeDataObjectManager = initializeDataObjectManager;
|
|
6
|
+
exports.updateDataObjectManagerConfig = updateDataObjectManagerConfig;
|
|
7
|
+
// Core classes
|
|
8
|
+
var dataObject_1 = require("./dataObject");
|
|
9
|
+
Object.defineProperty(exports, "DataObject", { enumerable: true, get: function () { return dataObject_1.DataObject; } });
|
|
10
|
+
Object.defineProperty(exports, "createDataObjectDirect", { enumerable: true, get: function () { return dataObject_1.createDataObject; } });
|
|
11
|
+
var dataObjectManager_1 = require("./dataObjectManager");
|
|
12
|
+
Object.defineProperty(exports, "DataObjectManager", { enumerable: true, get: function () { return dataObjectManager_1.DataObjectManager; } });
|
|
13
|
+
var eventEmitter_1 = require("./eventEmitter");
|
|
14
|
+
Object.defineProperty(exports, "EventEmitter", { enumerable: true, get: function () { return eventEmitter_1.EventEmitter; } });
|
|
15
|
+
// Global convenience functions
|
|
16
|
+
var dataObjectManager_2 = require("./dataObjectManager");
|
|
17
|
+
Object.defineProperty(exports, "getDataObjectById", { enumerable: true, get: function () { return dataObjectManager_2.getDataObjectById; } });
|
|
18
|
+
Object.defineProperty(exports, "createDataObject", { enumerable: true, get: function () { return dataObjectManager_2.createDataObject; } });
|
|
19
|
+
Object.defineProperty(exports, "getAllDataObjects", { enumerable: true, get: function () { return dataObjectManager_2.getAllDataObjects; } });
|
|
20
|
+
Object.defineProperty(exports, "removeDataObject", { enumerable: true, get: function () { return dataObjectManager_2.removeDataObject; } });
|
|
21
|
+
Object.defineProperty(exports, "refreshDataObject", { enumerable: true, get: function () { return dataObjectManager_2.refreshDataObject; } });
|
|
22
|
+
// Utility functions for initialization
|
|
23
|
+
const dataObjectManager_3 = require("./dataObjectManager");
|
|
24
|
+
function initializeDataObjectManager(config) {
|
|
25
|
+
return dataObjectManager_3.DataObjectManager.getInstance(config);
|
|
26
|
+
}
|
|
27
|
+
function updateDataObjectManagerConfig(config) {
|
|
28
|
+
dataObjectManager_3.DataObjectManager.setConfig(config);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,wDAAwD;;;AAmCxD,kEAEC;AAED,sEAEC;AAvCD,eAAe;AACf,2CAAsF;AAA7E,wGAAA,UAAU,OAAA;AAAE,oHAAA,gBAAgB,OAA0B;AAC/D,yDAAiF;AAAxE,sHAAA,iBAAiB,OAAA;AAC1B,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AAErB,+BAA+B;AAC/B,yDAM6B;AALzB,sHAAA,iBAAiB,OAAA;AACjB,qHAAA,gBAAgB,OAAA;AAChB,sHAAA,iBAAiB,OAAA;AACjB,qHAAA,gBAAgB,OAAA;AAChB,sHAAA,iBAAiB,OAAA;AAmBrB,uCAAuC;AACvC,2DAAiF;AAEjF,SAAgB,2BAA2B,CAAC,MAA+B;IACvE,OAAO,qCAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,6BAA6B,CAAC,MAA+B;IACzE,qCAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type DataObjectFieldType = 'string' | 'bit' | 'Date' | 'number';
|
|
2
|
+
export type SupportedOperator = 'equals' | 'notequals' | 'greaterthan' | 'lessthan';
|
|
3
|
+
export interface DataObjectField {
|
|
4
|
+
name: string;
|
|
5
|
+
type: DataObjectFieldType;
|
|
6
|
+
}
|
|
7
|
+
export interface SortConfig {
|
|
8
|
+
field: string;
|
|
9
|
+
direction: 'asc' | 'desc';
|
|
10
|
+
}
|
|
11
|
+
export interface WhereClause {
|
|
12
|
+
field: string;
|
|
13
|
+
operator: SupportedOperator;
|
|
14
|
+
value: any;
|
|
15
|
+
}
|
|
16
|
+
export interface DataObjectOptions {
|
|
17
|
+
viewName: string;
|
|
18
|
+
fields?: DataObjectField[];
|
|
19
|
+
whereClauses?: WhereClause[];
|
|
20
|
+
sort?: SortConfig;
|
|
21
|
+
recordLimit?: number;
|
|
22
|
+
canInsert?: boolean;
|
|
23
|
+
canUpdate?: boolean;
|
|
24
|
+
canDelete?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface SupabaseConfig {
|
|
27
|
+
url: string;
|
|
28
|
+
anonKey: string;
|
|
29
|
+
projectName?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface DataObjectRecord {
|
|
32
|
+
[key: string]: any;
|
|
33
|
+
}
|
|
34
|
+
export interface NamedDataObjectOptions extends DataObjectOptions {
|
|
35
|
+
name: string;
|
|
36
|
+
}
|
|
37
|
+
export interface StoredDataObject {
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
options: DataObjectOptions;
|
|
41
|
+
dataObject: any;
|
|
42
|
+
createdAt: Date;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,GAAG,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC7D,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "supabase-dataobject-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Core library for creating reactive data objects from Supabase tables and views",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"watch": "tsc --watch",
|
|
10
|
+
"prepublishOnly": "npm run build",
|
|
11
|
+
"test": "jest",
|
|
12
|
+
"lint": "eslint src --ext .ts",
|
|
13
|
+
"clean": "rimraf dist"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"supabase",
|
|
17
|
+
"database",
|
|
18
|
+
"reactive",
|
|
19
|
+
"data",
|
|
20
|
+
"crud",
|
|
21
|
+
"typescript",
|
|
22
|
+
"orm"
|
|
23
|
+
],
|
|
24
|
+
"author": "BHDesign",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/Baileyhall3/supabase-dataobject-core"
|
|
29
|
+
},
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/Baileyhall3/supabase-dataobject-core/issues"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/Baileyhall3/supabase-dataobject-core#readme",
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"README.md",
|
|
37
|
+
"LICENSE"
|
|
38
|
+
],
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@supabase/supabase-js": "^2.50.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^20.0.0",
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
45
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
46
|
+
"eslint": "^8.0.0",
|
|
47
|
+
"jest": "^29.0.0",
|
|
48
|
+
"rimraf": "^5.0.0",
|
|
49
|
+
"typescript": "^5.0.0"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=16.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|