bindra 2.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 (48) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/LICENSE +21 -0
  3. package/README.md +229 -0
  4. package/dist/core/Container.d.ts +88 -0
  5. package/dist/core/Container.d.ts.map +1 -0
  6. package/dist/core/Container.js +185 -0
  7. package/dist/core/Container.js.map +1 -0
  8. package/dist/core/DataSource.d.ts +272 -0
  9. package/dist/core/DataSource.d.ts.map +1 -0
  10. package/dist/core/DataSource.js +903 -0
  11. package/dist/core/DataSource.js.map +1 -0
  12. package/dist/core/Dispatcher.d.ts +6 -0
  13. package/dist/core/Dispatcher.d.ts.map +1 -0
  14. package/dist/core/Dispatcher.js +44 -0
  15. package/dist/core/Dispatcher.js.map +1 -0
  16. package/dist/core/EventEmitter.d.ts +11 -0
  17. package/dist/core/EventEmitter.d.ts.map +1 -0
  18. package/dist/core/EventEmitter.js +34 -0
  19. package/dist/core/EventEmitter.js.map +1 -0
  20. package/dist/core/MiddlewareManager.d.ts +47 -0
  21. package/dist/core/MiddlewareManager.d.ts.map +1 -0
  22. package/dist/core/MiddlewareManager.js +86 -0
  23. package/dist/core/MiddlewareManager.js.map +1 -0
  24. package/dist/core/Observable.d.ts +12 -0
  25. package/dist/core/Observable.d.ts.map +1 -0
  26. package/dist/core/Observable.js +43 -0
  27. package/dist/core/Observable.js.map +1 -0
  28. package/dist/core/errors.d.ts +124 -0
  29. package/dist/core/errors.d.ts.map +1 -0
  30. package/dist/core/errors.js +149 -0
  31. package/dist/core/errors.js.map +1 -0
  32. package/dist/core/validation.d.ts +100 -0
  33. package/dist/core/validation.d.ts.map +1 -0
  34. package/dist/core/validation.js +217 -0
  35. package/dist/core/validation.js.map +1 -0
  36. package/dist/examples.d.ts +52 -0
  37. package/dist/examples.d.ts.map +1 -0
  38. package/dist/examples.js +242 -0
  39. package/dist/examples.js.map +1 -0
  40. package/dist/index.d.ts +13 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +14 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/utils/performance.d.ts +49 -0
  45. package/dist/utils/performance.d.ts.map +1 -0
  46. package/dist/utils/performance.js +94 -0
  47. package/dist/utils/performance.js.map +1 -0
  48. package/package.json +64 -0
@@ -0,0 +1,272 @@
1
+ import { EventEmitter } from './EventEmitter';
2
+ import { MiddlewareManager } from './MiddlewareManager';
3
+ import { type Signal } from './Observable';
4
+ import { Validator, type FieldConfig } from './validation';
5
+ export interface RetryConfig {
6
+ maxRetries?: number;
7
+ retryDelay?: number;
8
+ backoffMultiplier?: number;
9
+ }
10
+ export interface CacheConfig {
11
+ enabled: boolean;
12
+ ttl?: number;
13
+ maxSize?: number;
14
+ }
15
+ export interface PaginationConfig {
16
+ pageSize: number;
17
+ currentPage: number;
18
+ totalRecords?: number;
19
+ totalPages?: number;
20
+ }
21
+ export interface RealtimeConfig {
22
+ enabled: boolean;
23
+ url?: string;
24
+ reconnect?: boolean;
25
+ reconnectInterval?: number;
26
+ }
27
+ export interface SecurityConfig {
28
+ csrfToken?: string;
29
+ csrfHeader?: string;
30
+ sanitizeFields?: (keyof any)[];
31
+ }
32
+ export interface DataSourceConfig<T extends Record<string, any> = any> {
33
+ url?: string | null;
34
+ data?: T[] | null;
35
+ retry?: RetryConfig;
36
+ fields?: FieldConfig<T>[];
37
+ cache?: CacheConfig;
38
+ pageSize?: number;
39
+ realtime?: RealtimeConfig;
40
+ security?: SecurityConfig;
41
+ }
42
+ export interface Field {
43
+ name: string;
44
+ type: string;
45
+ }
46
+ export interface Permissions {
47
+ allowInsert?: boolean;
48
+ allowUpdate?: boolean;
49
+ allowDelete?: boolean;
50
+ }
51
+ export interface QueryOptions<T = any> {
52
+ filter?: ((record: T) => boolean) | object | null;
53
+ sort?: string | ((a: T, b: T) => number) | null;
54
+ limit?: number | null;
55
+ }
56
+ /**
57
+ * DataSource - Type-safe reactive data management with CRUD operations
58
+ *
59
+ * @template T - The type of records managed by this DataSource
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * interface User {
64
+ * id: number;
65
+ * name: string;
66
+ * email: string;
67
+ * }
68
+ *
69
+ * const ds = new DataSource<User>({
70
+ * data: [{ id: 1, name: 'Alice', email: 'alice@example.com' }]
71
+ * });
72
+ * ```
73
+ */
74
+ export declare class DataSource<T extends Record<string, any> = any> extends EventEmitter {
75
+ url: string | null;
76
+ data: T[] | null;
77
+ fields: Field[];
78
+ fieldConfigs: FieldConfig<T>[];
79
+ validator: Validator<T> | null;
80
+ permissions: Permissions;
81
+ middleware: MiddlewareManager;
82
+ currentIndex: Signal<number>;
83
+ currentRecord: Signal<T | null>;
84
+ isLocal: boolean;
85
+ private retryConfig;
86
+ private cache;
87
+ private cacheConfig;
88
+ pagination: Signal<PaginationConfig>;
89
+ private ws?;
90
+ private realtimeConfig;
91
+ private securityConfig;
92
+ constructor({ url, data, retry, fields, cache, pageSize, realtime, security }?: DataSourceConfig<T>);
93
+ _initRemote(url: string): Promise<void>;
94
+ _initLocal(data: T[]): void;
95
+ /**
96
+ * Create a new record
97
+ *
98
+ * @param record - The record to create (can be partial)
99
+ * @returns Promise resolving to the created record
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const newUser = await ds.create({
104
+ * name: 'Alice',
105
+ * email: 'alice@example.com'
106
+ * });
107
+ * ```
108
+ */
109
+ create(record: Partial<T>): Promise<T>;
110
+ /**
111
+ * Update an existing record
112
+ *
113
+ * @param key - The key/id of the record to update
114
+ * @param changes - Partial changes to apply
115
+ * @returns Promise resolving to the updated record
116
+ */
117
+ update(key: any, changes: Partial<T>): Promise<T>;
118
+ /**
119
+ * Delete a record
120
+ *
121
+ * @param key - The key/id of the record to delete
122
+ * @returns Promise resolving to the deleted record
123
+ */
124
+ delete(key: any): Promise<T>;
125
+ /**
126
+ * Create multiple records in a single operation
127
+ *
128
+ * @param records - Array of partial records to create
129
+ * @returns Promise resolving to array of created records
130
+ */
131
+ createBatch(records: Partial<T>[]): Promise<T[]>;
132
+ /**
133
+ * Update multiple records in a single operation
134
+ *
135
+ * @param updates - Array of { key, changes } objects
136
+ * @returns Promise resolving to array of updated records
137
+ */
138
+ updateBatch(updates: Array<{
139
+ key: any;
140
+ changes: Partial<T>;
141
+ }>): Promise<T[]>;
142
+ /**
143
+ * Delete multiple records in a single operation
144
+ *
145
+ * @param keys - Array of keys/ids to delete
146
+ * @returns Promise resolving to array of deleted records
147
+ */
148
+ deleteBatch(keys: any[]): Promise<T[]>;
149
+ /**
150
+ * Optimistic update - immediately update UI, rollback on error
151
+ *
152
+ * @param key - The key/id of the record to update
153
+ * @param changes - Partial changes to apply
154
+ * @returns Promise resolving to the updated record
155
+ */
156
+ updateOptimistic(key: any, changes: Partial<T>): Promise<T>;
157
+ /**
158
+ * Query records with filtering, sorting, and limiting
159
+ *
160
+ * @param options - Query options
161
+ * @returns Promise resolving to array of matching records
162
+ */
163
+ query({ filter, sort, limit }?: QueryOptions<T>): Promise<T[]>;
164
+ /**
165
+ * Find a record by its key (local mode only)
166
+ *
167
+ * @param key - The key/id to search for
168
+ * @returns The found record or undefined
169
+ */
170
+ findByKey(key: any): T | undefined;
171
+ /**
172
+ * Fetch with automatic retry and exponential backoff
173
+ *
174
+ * @param url - The URL to fetch
175
+ * @param options - Fetch options
176
+ * @returns Promise resolving to Response
177
+ */
178
+ private _fetchWithRetry;
179
+ next(): void;
180
+ prev(): void;
181
+ goto(index: number): void;
182
+ private getCacheKey;
183
+ /**
184
+ * Get a record from cache (internal use)
185
+ * @internal
186
+ */
187
+ getFromCache(key: any): T | null;
188
+ private setCache;
189
+ /**
190
+ * Clear all cached records
191
+ */
192
+ clearCache(): void;
193
+ /**
194
+ * Invalidate a specific cached record
195
+ */
196
+ invalidateCache(key: any): void;
197
+ /**
198
+ * Load a specific page of data
199
+ *
200
+ * @param page - Page number (1-indexed)
201
+ * @returns Array of records for the requested page
202
+ */
203
+ loadPage(page: number): Promise<T[]>;
204
+ /**
205
+ * Load the next page
206
+ */
207
+ nextPage(): Promise<T[]>;
208
+ /**
209
+ * Load the previous page
210
+ */
211
+ prevPage(): Promise<T[]>;
212
+ /**
213
+ * Set page size
214
+ */
215
+ setPageSize(size: number): void;
216
+ /**
217
+ * Connect to WebSocket for real-time updates
218
+ */
219
+ connectWebSocket(): void;
220
+ /**
221
+ * Handle incoming WebSocket messages
222
+ */
223
+ private handleRealtimeUpdate;
224
+ /**
225
+ * Disconnect WebSocket
226
+ */
227
+ disconnectWebSocket(): void;
228
+ /**
229
+ * Send a message through WebSocket
230
+ */
231
+ sendWebSocketMessage(message: any): void;
232
+ /**
233
+ * Sanitize string to prevent XSS attacks
234
+ */
235
+ private sanitize;
236
+ /**
237
+ * Sanitize a record's fields that are marked for sanitization
238
+ */
239
+ private sanitizeRecord;
240
+ /**
241
+ * Get headers with CSRF token if configured
242
+ */
243
+ private getSecurityHeaders;
244
+ /**
245
+ * Validate a single field
246
+ *
247
+ * @param fieldName - Name of the field to validate
248
+ * @param value - Value to validate
249
+ * @param record - Optional full record for context
250
+ * @returns Error message if invalid, null if valid
251
+ */
252
+ validateField(fieldName: keyof T, value: any, record?: Partial<T>): Promise<string | null>;
253
+ /**
254
+ * Validate a complete record
255
+ *
256
+ * @param record - Record to validate
257
+ * @returns Object with field errors, or null if valid
258
+ */
259
+ validateRecord(record: Partial<T>): Promise<Record<string, string> | null>;
260
+ /**
261
+ * Get field configuration by name
262
+ *
263
+ * @param name - Field name
264
+ * @returns Field configuration or undefined
265
+ */
266
+ getFieldConfig(name: keyof T): FieldConfig<T> | undefined;
267
+ /**
268
+ * Check if validation is enabled
269
+ */
270
+ hasValidation(): boolean;
271
+ }
272
+ //# sourceMappingURL=DataSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataSource.d.ts","sourceRoot":"","sources":["../../src/core/DataSource.ts"],"names":[],"mappings":"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"}