@promakeai/dbreact 1.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/SKILL.md ADDED
@@ -0,0 +1,311 @@
1
+ ---
2
+ name: dbreact
3
+ description: |
4
+ React hooks and providers for schema-driven multi-language databases (@promakeai/dbreact).
5
+ Use when: integrating React apps with SQLite database, using DbProvider setup,
6
+ data hooks (useDbList, useDbGet, useDbCreate, useDbUpdate, useDbDelete),
7
+ language switching (useDbLang), SqliteAdapter for browser, React Query patterns,
8
+ or any @promakeai/dbreact task.
9
+ ---
10
+
11
+ # dbreact - React Database Integration
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install @promakeai/dbreact @promakeai/orm @tanstack/react-query sql.js
17
+ ```
18
+
19
+ Peer dependencies: `react >= 18`, `react-dom >= 18`, `@tanstack/react-query >= 5`
20
+
21
+ ---
22
+
23
+ ## Quick Setup
24
+
25
+ ```tsx
26
+ import { DbProvider, SqliteAdapter, parseJSONSchema } from '@promakeai/dbreact';
27
+ import schema from './db/schema.json';
28
+
29
+ const adapter = new SqliteAdapter({
30
+ storageKey: 'myapp',
31
+ schema: parseJSONSchema(schema),
32
+ defaultLang: 'en',
33
+ });
34
+
35
+ function App() {
36
+ return (
37
+ <DbProvider adapter={adapter} lang="en" fallbackLang="en">
38
+ <YourApp />
39
+ </DbProvider>
40
+ );
41
+ }
42
+ ```
43
+
44
+ ---
45
+
46
+ ## DbProvider Props
47
+
48
+ ```tsx
49
+ interface DbProviderProps {
50
+ adapter: IDataAdapter; // Required: SqliteAdapter instance
51
+ lang?: string; // Current language (default: 'en')
52
+ fallbackLang?: string; // Fallback if translation missing (default: 'en')
53
+ autoConnect?: boolean; // Auto-connect on mount (default: true)
54
+ queryClient?: QueryClient; // Custom React Query client (optional)
55
+ }
56
+ ```
57
+
58
+ Language changes automatically invalidate all queries and refetch with new language.
59
+
60
+ ---
61
+
62
+ ## SqliteAdapter Config
63
+
64
+ ```tsx
65
+ const adapter = new SqliteAdapter({
66
+ storageKey: 'myapp', // localStorage key
67
+ schema: parsedSchema, // For translation support
68
+ defaultLang: 'en', // Default language
69
+ initialData?: Uint8Array, // Seed with existing DB
70
+ wasmPath?: string, // Custom sql.js WASM path
71
+ });
72
+ ```
73
+
74
+ ### Loading Existing Database
75
+
76
+ ```tsx
77
+ // Load from base64 file
78
+ const response = await fetch('/app.db.b64');
79
+ const base64 = await response.text();
80
+ const bytes = Uint8Array.from(atob(base64), c => c.charCodeAt(0));
81
+
82
+ const adapter = new SqliteAdapter({
83
+ storageKey: 'myapp',
84
+ initialData: bytes,
85
+ schema: parseJSONSchema(schema),
86
+ });
87
+ ```
88
+
89
+ ---
90
+
91
+ ## Data Hooks
92
+
93
+ ### useDbList<T>(table, options?)
94
+
95
+ Query multiple records.
96
+
97
+ ```tsx
98
+ interface ListOptions {
99
+ where?: Record<string, unknown>; // MongoDB-style filter
100
+ orderBy?: Array<{ field: string; direction: 'ASC' | 'DESC' }>;
101
+ limit?: number;
102
+ offset?: number;
103
+ enabled?: boolean; // Conditional query
104
+ }
105
+
106
+ function ProductList() {
107
+ const { data, isLoading, error } = useDbList<Product>('products', {
108
+ where: { stock: { $gt: 0 } },
109
+ orderBy: [{ field: 'name', direction: 'ASC' }],
110
+ limit: 10,
111
+ });
112
+
113
+ if (isLoading) return <div>Loading...</div>;
114
+ if (error) return <div>Error: {error.message}</div>;
115
+
116
+ return <ul>{data?.map(p => <li key={p.id}>{p.name}</li>)}</ul>;
117
+ }
118
+ ```
119
+
120
+ ### useDbGet<T>(table, id, options?)
121
+
122
+ Fetch single record by ID.
123
+
124
+ ```tsx
125
+ function ProductDetail({ id }: { id: number }) {
126
+ const { data: product, isLoading } = useDbGet<Product>('products', id);
127
+
128
+ if (isLoading) return <div>Loading...</div>;
129
+ if (!product) return <div>Not found</div>;
130
+
131
+ return <div>{product.name} - ${product.price}</div>;
132
+ }
133
+ ```
134
+
135
+ ### useDbCreate<T>(table)
136
+
137
+ Create new record.
138
+
139
+ ```tsx
140
+ function CreateProduct() {
141
+ const mutation = useDbCreate<Product>('products');
142
+
143
+ const handleCreate = () => {
144
+ mutation.mutate({ name: 'New Product', price: 99 });
145
+ };
146
+
147
+ return (
148
+ <button onClick={handleCreate} disabled={mutation.isPending}>
149
+ {mutation.isPending ? 'Creating...' : 'Create'}
150
+ </button>
151
+ );
152
+ }
153
+ ```
154
+
155
+ ### useDbUpdate<T>(table)
156
+
157
+ Update existing record.
158
+
159
+ ```tsx
160
+ function EditProduct({ id }: { id: number }) {
161
+ const mutation = useDbUpdate<Product>('products');
162
+
163
+ const handleUpdate = () => {
164
+ mutation.mutate({ id, data: { price: 149 } });
165
+ };
166
+
167
+ return <button onClick={handleUpdate}>Update Price</button>;
168
+ }
169
+ ```
170
+
171
+ ### useDbDelete(table)
172
+
173
+ Delete record by ID.
174
+
175
+ ```tsx
176
+ function DeleteProduct({ id }: { id: number }) {
177
+ const mutation = useDbDelete('products');
178
+
179
+ return (
180
+ <button onClick={() => mutation.mutate(id)}>
181
+ {mutation.isPending ? 'Deleting...' : 'Delete'}
182
+ </button>
183
+ );
184
+ }
185
+ ```
186
+
187
+ ---
188
+
189
+ ## Language Hook
190
+
191
+ ### useDbLang()
192
+
193
+ Access and change current language.
194
+
195
+ ```tsx
196
+ function LanguageSwitcher() {
197
+ const { lang, setLang } = useDbLang();
198
+
199
+ return (
200
+ <select value={lang} onChange={(e) => setLang(e.target.value)}>
201
+ <option value="en">English</option>
202
+ <option value="tr">Turkish</option>
203
+ <option value="de">German</option>
204
+ </select>
205
+ );
206
+ }
207
+ ```
208
+
209
+ When `setLang()` is called:
210
+ 1. Provider state updates
211
+ 2. All queries invalidated
212
+ 3. Queries refetch with new language
213
+ 4. UI updates automatically
214
+
215
+ ---
216
+
217
+ ## Context Hooks
218
+
219
+ ### useDb()
220
+
221
+ Access connection state.
222
+
223
+ ```tsx
224
+ const { adapter, isConnected, error } = useDb();
225
+ ```
226
+
227
+ ### useAdapter()
228
+
229
+ Direct adapter access for advanced operations.
230
+
231
+ ```tsx
232
+ const adapter = useAdapter();
233
+ await adapter.createWithTranslations('products', data, translations);
234
+ ```
235
+
236
+ ---
237
+
238
+ ## Query Operators
239
+
240
+ Same MongoDB-style operators as dbcli:
241
+
242
+ ```tsx
243
+ useDbList('products', {
244
+ where: {
245
+ $and: [
246
+ { price: { $between: [50, 500] } },
247
+ { stock: { $gt: 0 } },
248
+ { categoryId: { $in: [1, 5, 10] } },
249
+ { $or: [{ active: true }, { featured: true }] }
250
+ ]
251
+ }
252
+ });
253
+ ```
254
+
255
+ Operators: `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$like`, `$notLike`, `$between`, `$isNull`, `$and`, `$or`, `$nor`, `$not`
256
+
257
+ ---
258
+
259
+ ## Type Definitions
260
+
261
+ Use generated types from `dbcli generate`:
262
+
263
+ ```tsx
264
+ // src/db/types.ts (generated)
265
+ export interface DbProduct {
266
+ id: number;
267
+ name: string;
268
+ price: number;
269
+ stock: number;
270
+ }
271
+
272
+ // Usage
273
+ const { data } = useDbList<DbProduct>('products');
274
+ const mutation = useDbCreate<DbProduct>('products');
275
+ ```
276
+
277
+ ---
278
+
279
+ ## Best Practices
280
+
281
+ 1. **Single DbProvider at root** - Don't nest providers
282
+ 2. **Use generated types** - Type safety with `DbXxx` interfaces
283
+ 3. **Conditional queries** - Use `enabled: false` to prevent unwanted fetches
284
+ 4. **Handle all states** - Check `isLoading`, `error`, and empty data
285
+ 5. **Language via hook** - Use `setLang()` not prop changes for proper invalidation
286
+ 6. **Batch with adapter** - Use `adapter.createMany()` for bulk operations
287
+ 7. **Check connection** - Use `useDb().isConnected` before critical operations
288
+
289
+ ---
290
+
291
+ ## Exports
292
+
293
+ ```tsx
294
+ // Provider & Context
295
+ export { DbProvider, useDb, useAdapter, useDbLang };
296
+
297
+ // Data Hooks
298
+ export { useDbList, useDbGet, useDbCreate, useDbUpdate, useDbDelete };
299
+
300
+ // Adapter
301
+ export { SqliteAdapter };
302
+
303
+ // Schema
304
+ export { parseJSONSchema, defineSchema, f };
305
+
306
+ // Query Utilities
307
+ export { buildWhereClause };
308
+
309
+ // Types
310
+ export type { DbProviderConfig, DbContextValue, DbLangContextValue, ListOptions };
311
+ ```
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestAdapter.d.ts","sourceRoot":"","sources":["../../adapters/RestAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteAdapter.d.ts","sourceRoot":"","sources":["../../adapters/SqliteAdapter.ts"],"names":[],"mappings":"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"}