@rationalbloks/frontblok-crud 0.1.0 → 0.1.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/README.md +11 -80
- package/dist/api.d.ts +0 -92
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +29 -104
- package/dist/api.js.map +1 -1
- package/dist/generator.d.ts +0 -11
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +11 -34
- package/dist/generator.js.map +1 -1
- package/dist/hooks.d.ts +0 -121
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +82 -114
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -35
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +0 -57
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -15
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +0 -69
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +35 -76
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,34 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Universal CRUD API Layer for RationalBloks Frontends**
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 🎯 Philosophy
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
┌─────────────────────────────────────────────────────────────────────────┐
|
|
13
|
-
│ THE BUILDERBLOK PATTERN │
|
|
14
|
-
├─────────────────────────────────────────────────────────────────────────┤
|
|
15
|
-
│ │
|
|
16
|
-
│ BACKEND (builderblok) FRONTEND (frontblok-crud) │
|
|
17
|
-
│ ═══════════════════ ════════════════════════ │
|
|
18
|
-
│ │
|
|
19
|
-
│ JSON Schema JSON Schema │
|
|
20
|
-
│ │ │ │
|
|
21
|
-
│ ▼ ▼ │
|
|
22
|
-
│ entities.py ◄── ONLY GENERATED entities.ts ◄── ONLY GENERATED │
|
|
23
|
-
│ │ │ │
|
|
24
|
-
│ ▼ ▼ │
|
|
25
|
-
│ models.py ─┐ api.ts ──────┐ │
|
|
26
|
-
│ crud.py ───┼── 100% GENERIC hooks.ts ────┼── 100% GENERIC │
|
|
27
|
-
│ routes.py ─┘ utils.ts ────┘ │
|
|
28
|
-
│ │
|
|
29
|
-
└─────────────────────────────────────────────────────────────────────────┘
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
**Only ONE file is generated** (`entities.ts`). Everything else is generic and works with ANY schema.
|
|
5
|
+
A generic API layer that works with any entity schema — define your types once, get full CRUD operations everywhere.
|
|
33
6
|
|
|
34
7
|
---
|
|
35
8
|
|
|
@@ -201,21 +174,13 @@ export type EntityName = keyof Entities;
|
|
|
201
174
|
|
|
202
175
|
### Files in this package:
|
|
203
176
|
|
|
204
|
-
| File | Purpose |
|
|
205
|
-
|
|
206
|
-
| `api.ts` | Universal CRUD API client |
|
|
207
|
-
| `hooks.ts` | React hooks for data fetching |
|
|
208
|
-
| `types.ts` | TypeScript type definitions |
|
|
209
|
-
| `utils.ts` | Helper functions |
|
|
210
|
-
| `generator.ts` | Generates entities.ts
|
|
211
|
-
|
|
212
|
-
### What gets generated in user's project:
|
|
213
|
-
|
|
214
|
-
| File | Purpose | Generated? |
|
|
215
|
-
|------|---------|------------|
|
|
216
|
-
| `entities.ts` | TypeScript interfaces + entity registry | ✅ YES |
|
|
217
|
-
|
|
218
|
-
**That's it. ONE file. ~50 lines.**
|
|
177
|
+
| File | Purpose |
|
|
178
|
+
|------|---------|
|
|
179
|
+
| `api.ts` | Universal CRUD API client |
|
|
180
|
+
| `hooks.ts` | React hooks for data fetching |
|
|
181
|
+
| `types.ts` | TypeScript type definitions |
|
|
182
|
+
| `utils.ts` | Helper functions |
|
|
183
|
+
| `generator.ts` | Generates entities.ts from schema |
|
|
219
184
|
|
|
220
185
|
---
|
|
221
186
|
|
|
@@ -223,43 +188,9 @@ export type EntityName = keyof Entities;
|
|
|
223
188
|
|
|
224
189
|
This package builds on top of `@rationalbloks/frontblok-auth`:
|
|
225
190
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
├─────────────────────────────────────────────────────────────────────────┤
|
|
230
|
-
│ │
|
|
231
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
232
|
-
│ │ UI LAYER (user's choice) │ │
|
|
233
|
-
│ │ - React components │ │
|
|
234
|
-
│ │ - Routing (react-router) │ │
|
|
235
|
-
│ │ - Styling (MUI, Tailwind, etc.) │ │
|
|
236
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
237
|
-
│ │ │
|
|
238
|
-
│ ▼ │
|
|
239
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
240
|
-
│ │ @rationalbloks/frontblok-crud │ │
|
|
241
|
-
│ │ - entities.ts (GENERATED - types + metadata) │ │
|
|
242
|
-
│ │ - api.ts (GENERIC - universal CRUD) │ │
|
|
243
|
-
│ │ - hooks.ts (GENERIC - React data hooks) │ │
|
|
244
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
245
|
-
│ │ │
|
|
246
|
-
│ ▼ │
|
|
247
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
248
|
-
│ │ @rationalbloks/frontblok-auth │ │
|
|
249
|
-
│ │ - BaseApi (HTTP client with auth) │ │
|
|
250
|
-
│ │ - Auth hooks │ │
|
|
251
|
-
│ │ - Token management │ │
|
|
252
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
253
|
-
│ │ │
|
|
254
|
-
└───────────────────────────────┼─────────────────────────────────────────┘
|
|
255
|
-
│
|
|
256
|
-
▼
|
|
257
|
-
┌──────────────────────┐
|
|
258
|
-
│ RationalBloks API │
|
|
259
|
-
│ (generated by │
|
|
260
|
-
│ builderblok) │
|
|
261
|
-
└──────────────────────┘
|
|
262
|
-
```
|
|
191
|
+
- **frontblok-auth** handles authentication, tokens, and HTTP requests
|
|
192
|
+
- **frontblok-crud** adds CRUD operations on top of that HTTP layer
|
|
193
|
+
- **entities.ts** in your project defines your data types and entity registry
|
|
263
194
|
|
|
264
195
|
---
|
|
265
196
|
|
package/dist/api.d.ts
CHANGED
|
@@ -1,115 +1,23 @@
|
|
|
1
1
|
import type { BaseEntity } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Minimal interface for the auth API client.
|
|
4
|
-
* Matches frontblok-auth's BaseApi.request() signature.
|
|
5
|
-
*/
|
|
6
2
|
export interface AuthApiClient {
|
|
7
3
|
request<T>(endpoint: string, options?: RequestInit): Promise<T>;
|
|
8
4
|
}
|
|
9
5
|
export declare class UniversalApi {
|
|
10
6
|
private authApi;
|
|
11
7
|
constructor(authApi: AuthApiClient);
|
|
12
|
-
/**
|
|
13
|
-
* Get all entities of a type.
|
|
14
|
-
*
|
|
15
|
-
* @param entityName - The entity/table name (e.g., 'tasks', 'projects')
|
|
16
|
-
* @param options - Optional query parameters
|
|
17
|
-
* @returns Array of entities
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* const tasks = await api.getAll<Task>('tasks');
|
|
21
|
-
* const activeTasks = await api.getAll<Task>('tasks', { status: 'active' });
|
|
22
|
-
*/
|
|
23
8
|
getAll<T extends BaseEntity>(entityName: string, options?: {
|
|
24
9
|
skip?: number;
|
|
25
10
|
limit?: number;
|
|
26
11
|
[key: string]: unknown;
|
|
27
12
|
}): Promise<T[]>;
|
|
28
|
-
/**
|
|
29
|
-
* Get a single entity by ID.
|
|
30
|
-
*
|
|
31
|
-
* @param entityName - The entity/table name
|
|
32
|
-
* @param id - Entity UUID
|
|
33
|
-
* @returns The entity or throws if not found
|
|
34
|
-
*
|
|
35
|
-
* @example
|
|
36
|
-
* const task = await api.getOne<Task>('tasks', 'uuid-here');
|
|
37
|
-
*/
|
|
38
13
|
getOne<T extends BaseEntity>(entityName: string, id: string): Promise<T>;
|
|
39
|
-
/**
|
|
40
|
-
* Create a new entity.
|
|
41
|
-
*
|
|
42
|
-
* @param entityName - The entity/table name
|
|
43
|
-
* @param data - Entity data (without id, created_at, updated_at)
|
|
44
|
-
* @returns The created entity with all fields
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* const task = await api.create<Task>('tasks', { title: 'New Task', status: 'pending' });
|
|
48
|
-
*/
|
|
49
14
|
create<T extends BaseEntity>(entityName: string, data: Partial<Omit<T, 'id' | 'created_at' | 'updated_at'>>): Promise<T>;
|
|
50
|
-
/**
|
|
51
|
-
* Update an existing entity.
|
|
52
|
-
*
|
|
53
|
-
* @param entityName - The entity/table name
|
|
54
|
-
* @param id - Entity UUID
|
|
55
|
-
* @param data - Partial entity data to update
|
|
56
|
-
* @returns The updated entity
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* const task = await api.update<Task>('tasks', 'uuid-here', { status: 'done' });
|
|
60
|
-
*/
|
|
61
15
|
update<T extends BaseEntity>(entityName: string, id: string, data: Partial<Omit<T, 'id' | 'created_at' | 'updated_at'>>): Promise<T>;
|
|
62
|
-
/**
|
|
63
|
-
* Delete an entity.
|
|
64
|
-
*
|
|
65
|
-
* @param entityName - The entity/table name
|
|
66
|
-
* @param id - Entity UUID
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* await api.remove('tasks', 'uuid-here');
|
|
70
|
-
*/
|
|
71
16
|
remove(entityName: string, id: string): Promise<void>;
|
|
72
|
-
/**
|
|
73
|
-
* Smart pluralization that matches builderblok's routes.py.
|
|
74
|
-
* Mirrors the Python `pluralize()` function exactly.
|
|
75
|
-
*/
|
|
76
17
|
private pluralize;
|
|
77
18
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Initialize the global CRUD API instance.
|
|
80
|
-
* Call this once at app startup (e.g., in main.tsx).
|
|
81
|
-
*
|
|
82
|
-
* @param authApi - The frontblok-auth BaseApi instance (from createAuthApi)
|
|
83
|
-
* @returns The initialized UniversalApi instance
|
|
84
|
-
*
|
|
85
|
-
* @example
|
|
86
|
-
* // In main.tsx or App.tsx
|
|
87
|
-
* import { createAuthApi } from '@rationalbloks/frontblok-auth';
|
|
88
|
-
* import { initApi } from '@rationalbloks/frontblok-crud';
|
|
89
|
-
*
|
|
90
|
-
* const authApi = createAuthApi(import.meta.env.VITE_DATABASE_API_URL);
|
|
91
|
-
* initApi(authApi);
|
|
92
|
-
*/
|
|
93
19
|
export declare function initApi(authApi: AuthApiClient): UniversalApi;
|
|
94
|
-
/**
|
|
95
|
-
* Get the global CRUD API instance.
|
|
96
|
-
* Throws if initApi hasn't been called.
|
|
97
|
-
*
|
|
98
|
-
* @returns The UniversalApi instance
|
|
99
|
-
*
|
|
100
|
-
* @example
|
|
101
|
-
* import { getApi } from '@rationalbloks/frontblok-crud';
|
|
102
|
-
*
|
|
103
|
-
* const tasks = await getApi().getAll<Task>('tasks';
|
|
104
|
-
*/
|
|
105
20
|
export declare function getApi(): UniversalApi;
|
|
106
|
-
/**
|
|
107
|
-
* Check if the API has been initialized.
|
|
108
|
-
* Useful for conditional rendering or lazy initialization.
|
|
109
|
-
*/
|
|
110
21
|
export declare function isApiInitialized(): boolean;
|
|
111
|
-
/**
|
|
112
|
-
* Reset the API instance (useful for testing).
|
|
113
|
-
*/
|
|
114
22
|
export declare function resetApi(): void;
|
|
115
23
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACjE;AAQD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;gBAEnB,OAAO,EAAE,aAAa;IAY5B,MAAM,CAAC,CAAC,SAAS,UAAU,EAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAClE,OAAO,CAAC,CAAC,EAAE,CAAC;IAqBT,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAMxE,MAAM,CAAC,CAAC,SAAS,UAAU,EAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,GACzD,OAAO,CAAC,CAAC,CAAC;IASP,MAAM,CAAC,CAAC,SAAS,UAAU,EAC/B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,GACzD,OAAO,CAAC,CAAC,CAAC;IASP,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3D,OAAO,CAAC,SAAS;CA2BlB;AAiBD,wBAAgB,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAG5D;AAMD,wBAAgB,MAAM,IAAI,YAAY,CAYrC;AAID,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAGD,wBAAgB,QAAQ,IAAI,IAAI,CAE/B"}
|
package/dist/api.js
CHANGED
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
// ============================================================================
|
|
2
2
|
// FRONTBLOK-CRUD - UNIVERSAL CRUD API CLIENT
|
|
3
3
|
// ============================================================================
|
|
4
|
-
// Single class that handles
|
|
5
|
-
// Uses frontblok-auth's BaseApi for HTTP requests
|
|
6
|
-
//
|
|
7
|
-
// ARCHITECTURE (THE ONE WAY):
|
|
8
|
-
// ┌─────────────────────────────────────────────────────────────────────────┐
|
|
9
|
-
// │ frontblok-auth.BaseApi → Auth + HTTP (the ONLY HTTP layer) │
|
|
10
|
-
// │ frontblok-crud.UniversalApi → CRUD methods using BaseApi │
|
|
11
|
-
// └─────────────────────────────────────────────────────────────────────────┘
|
|
12
|
-
//
|
|
13
|
-
// CHAIN OF EVENTS MANTRA:
|
|
14
|
-
// - Errors propagate up to the caller (hooks handle them)
|
|
15
|
-
// - No try/catch here - let errors bubble for consistent handling
|
|
16
|
-
// - Single path, single way, the right way
|
|
17
|
-
// - ONE WAY to make HTTP calls: through frontblok-auth's BaseApi
|
|
4
|
+
// Single class that handles all CRUD operations for any entity type.
|
|
5
|
+
// Uses frontblok-auth's BaseApi for HTTP requests.
|
|
18
6
|
//
|
|
19
7
|
// USAGE:
|
|
20
8
|
// ```typescript
|
|
@@ -42,19 +30,10 @@ export class UniversalApi {
|
|
|
42
30
|
// ==========================================================================
|
|
43
31
|
// UNIVERSAL CRUD OPERATIONS
|
|
44
32
|
// ==========================================================================
|
|
45
|
-
// These methods work with
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
*
|
|
50
|
-
* @param entityName - The entity/table name (e.g., 'tasks', 'projects')
|
|
51
|
-
* @param options - Optional query parameters
|
|
52
|
-
* @returns Array of entities
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* const tasks = await api.getAll<Task>('tasks');
|
|
56
|
-
* const activeTasks = await api.getAll<Task>('tasks', { status: 'active' });
|
|
57
|
-
*/
|
|
33
|
+
// These methods work with any entity - just pass the entity name.
|
|
34
|
+
// Get all entities of a type.
|
|
35
|
+
// const tasks = await api.getAll<Task>('tasks');
|
|
36
|
+
// const activeTasks = await api.getAll<Task>('tasks', { status: 'active' });
|
|
58
37
|
async getAll(entityName, options) {
|
|
59
38
|
// Build query string from options
|
|
60
39
|
let query = '';
|
|
@@ -72,61 +51,29 @@ export class UniversalApi {
|
|
|
72
51
|
}
|
|
73
52
|
return this.authApi.request(`/api/${this.pluralize(entityName)}/${query}`);
|
|
74
53
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
*
|
|
78
|
-
* @param entityName - The entity/table name
|
|
79
|
-
* @param id - Entity UUID
|
|
80
|
-
* @returns The entity or throws if not found
|
|
81
|
-
*
|
|
82
|
-
* @example
|
|
83
|
-
* const task = await api.getOne<Task>('tasks', 'uuid-here');
|
|
84
|
-
*/
|
|
54
|
+
// Get a single entity by ID.
|
|
55
|
+
// const task = await api.getOne<Task>('tasks', 'uuid-here');
|
|
85
56
|
async getOne(entityName, id) {
|
|
86
57
|
return this.authApi.request(`/api/${this.pluralize(entityName)}/${id}`);
|
|
87
58
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
*
|
|
91
|
-
* @param entityName - The entity/table name
|
|
92
|
-
* @param data - Entity data (without id, created_at, updated_at)
|
|
93
|
-
* @returns The created entity with all fields
|
|
94
|
-
*
|
|
95
|
-
* @example
|
|
96
|
-
* const task = await api.create<Task>('tasks', { title: 'New Task', status: 'pending' });
|
|
97
|
-
*/
|
|
59
|
+
// Create a new entity.
|
|
60
|
+
// const task = await api.create<Task>('tasks', { title: 'New Task', status: 'pending' });
|
|
98
61
|
async create(entityName, data) {
|
|
99
62
|
return this.authApi.request(`/api/${this.pluralize(entityName)}/`, {
|
|
100
63
|
method: 'POST',
|
|
101
64
|
body: JSON.stringify(data),
|
|
102
65
|
});
|
|
103
66
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
*
|
|
107
|
-
* @param entityName - The entity/table name
|
|
108
|
-
* @param id - Entity UUID
|
|
109
|
-
* @param data - Partial entity data to update
|
|
110
|
-
* @returns The updated entity
|
|
111
|
-
*
|
|
112
|
-
* @example
|
|
113
|
-
* const task = await api.update<Task>('tasks', 'uuid-here', { status: 'done' });
|
|
114
|
-
*/
|
|
67
|
+
// Update an existing entity.
|
|
68
|
+
// const task = await api.update<Task>('tasks', 'uuid-here', { status: 'done' });
|
|
115
69
|
async update(entityName, id, data) {
|
|
116
70
|
return this.authApi.request(`/api/${this.pluralize(entityName)}/${id}`, {
|
|
117
71
|
method: 'PATCH',
|
|
118
72
|
body: JSON.stringify(data),
|
|
119
73
|
});
|
|
120
74
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
*
|
|
124
|
-
* @param entityName - The entity/table name
|
|
125
|
-
* @param id - Entity UUID
|
|
126
|
-
*
|
|
127
|
-
* @example
|
|
128
|
-
* await api.remove('tasks', 'uuid-here');
|
|
129
|
-
*/
|
|
75
|
+
// Delete an entity.
|
|
76
|
+
// await api.remove('tasks', 'uuid-here');
|
|
130
77
|
async remove(entityName, id) {
|
|
131
78
|
await this.authApi.request(`/api/${this.pluralize(entityName)}/${id}`, {
|
|
132
79
|
method: 'DELETE',
|
|
@@ -135,10 +82,7 @@ export class UniversalApi {
|
|
|
135
82
|
// ==========================================================================
|
|
136
83
|
// UTILITY METHODS
|
|
137
84
|
// ==========================================================================
|
|
138
|
-
|
|
139
|
-
* Smart pluralization that matches builderblok's routes.py.
|
|
140
|
-
* Mirrors the Python `pluralize()` function exactly.
|
|
141
|
-
*/
|
|
85
|
+
// Smart pluralization for API endpoint paths.
|
|
142
86
|
pluralize(word) {
|
|
143
87
|
if (!word)
|
|
144
88
|
return word;
|
|
@@ -170,36 +114,21 @@ export class UniversalApi {
|
|
|
170
114
|
// Global API instance - initialized once, used everywhere.
|
|
171
115
|
// THE ONE WAY: initApi(authApi) with frontblok-auth's BaseApi instance.
|
|
172
116
|
let apiInstance = null;
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
* @example
|
|
181
|
-
* // In main.tsx or App.tsx
|
|
182
|
-
* import { createAuthApi } from '@rationalbloks/frontblok-auth';
|
|
183
|
-
* import { initApi } from '@rationalbloks/frontblok-crud';
|
|
184
|
-
*
|
|
185
|
-
* const authApi = createAuthApi(import.meta.env.VITE_DATABASE_API_URL);
|
|
186
|
-
* initApi(authApi);
|
|
187
|
-
*/
|
|
117
|
+
// Initialize the global CRUD API instance.
|
|
118
|
+
// Call this once at app startup (e.g., in main.tsx).
|
|
119
|
+
// // In main.tsx or App.tsx
|
|
120
|
+
// import { createAuthApi } from '@rationalbloks/frontblok-auth';
|
|
121
|
+
// import { initApi } from '@rationalbloks/frontblok-crud';
|
|
122
|
+
// const authApi = createAuthApi(import.meta.env.VITE_DATABASE_API_URL);
|
|
123
|
+
// initApi(authApi);
|
|
188
124
|
export function initApi(authApi) {
|
|
189
125
|
apiInstance = new UniversalApi(authApi);
|
|
190
126
|
return apiInstance;
|
|
191
127
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
* @returns The UniversalApi instance
|
|
197
|
-
*
|
|
198
|
-
* @example
|
|
199
|
-
* import { getApi } from '@rationalbloks/frontblok-crud';
|
|
200
|
-
*
|
|
201
|
-
* const tasks = await getApi().getAll<Task>('tasks';
|
|
202
|
-
*/
|
|
128
|
+
// Get the global CRUD API instance.
|
|
129
|
+
// Throws if initApi hasn't been called.
|
|
130
|
+
// import { getApi } from '@rationalbloks/frontblok-crud';
|
|
131
|
+
// const tasks = await getApi().getAll<Task>('tasks');
|
|
203
132
|
export function getApi() {
|
|
204
133
|
if (!apiInstance) {
|
|
205
134
|
throw new Error('API not initialized. Call initApi(authApi) first, typically in main.tsx or App.tsx.\n' +
|
|
@@ -211,16 +140,12 @@ export function getApi() {
|
|
|
211
140
|
}
|
|
212
141
|
return apiInstance;
|
|
213
142
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
* Useful for conditional rendering or lazy initialization.
|
|
217
|
-
*/
|
|
143
|
+
// Check if the API has been initialized.
|
|
144
|
+
// Useful for conditional rendering or lazy initialization.
|
|
218
145
|
export function isApiInitialized() {
|
|
219
146
|
return apiInstance !== null;
|
|
220
147
|
}
|
|
221
|
-
|
|
222
|
-
* Reset the API instance (useful for testing).
|
|
223
|
-
*/
|
|
148
|
+
// Reset the API instance (useful for testing).
|
|
224
149
|
export function resetApi() {
|
|
225
150
|
apiInstance = null;
|
|
226
151
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAC/E,qEAAqE;AACrE,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/generator.d.ts
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
1
|
import type { Schema } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Generate complete entities.ts content from a schema.
|
|
4
|
-
* This is THE ONLY generation function needed.
|
|
5
|
-
*
|
|
6
|
-
* @param schema - The database schema in FLAT format
|
|
7
|
-
* @returns Complete TypeScript file content
|
|
8
|
-
*/
|
|
9
2
|
export declare function generateEntitiesTs(schema: Schema): string;
|
|
10
|
-
/**
|
|
11
|
-
* Validate a schema before generation.
|
|
12
|
-
* Returns array of error messages (empty if valid).
|
|
13
|
-
*/
|
|
14
3
|
export declare function validateSchema(schema: Schema): string[];
|
|
15
4
|
//# sourceMappingURL=generator.d.ts.map
|
package/dist/generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAwC,MAAM,YAAY,CAAC;AAU/E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAyBzD;AAsID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAuDvD"}
|
package/dist/generator.js
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
// ============================================================================
|
|
2
2
|
// FRONTBLOK-CRUD - ENTITIES.TS GENERATOR
|
|
3
3
|
// ============================================================================
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// This module generates entities.ts from a JSON schema.
|
|
7
|
-
// Mirrors builderblok/scripts/customizer_entities.py exactly.
|
|
8
|
-
//
|
|
9
|
-
// PHILOSOPHY:
|
|
10
|
-
// - This is the ONLY code generation needed
|
|
11
|
-
// - Everything else (api.ts, hooks.ts) is GENERIC
|
|
12
|
-
// - The generated file is ~50 lines, not 500+
|
|
4
|
+
// Generates TypeScript interfaces and entity registry from a JSON schema.
|
|
13
5
|
//
|
|
14
6
|
// WHAT IT GENERATES:
|
|
15
7
|
// 1. TypeScript interfaces for each entity
|
|
@@ -26,13 +18,8 @@
|
|
|
26
18
|
// ```
|
|
27
19
|
// ============================================================================
|
|
28
20
|
import { toPascalCase, toSingular, toPlural, schemaTypeToTs, } from './utils.js';
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
* This is THE ONLY generation function needed.
|
|
32
|
-
*
|
|
33
|
-
* @param schema - The database schema in FLAT format
|
|
34
|
-
* @returns Complete TypeScript file content
|
|
35
|
-
*/
|
|
21
|
+
// Generate complete entities.ts content from a schema.
|
|
22
|
+
// This is THE ONLY generation function needed.
|
|
36
23
|
export function generateEntitiesTs(schema) {
|
|
37
24
|
const lines = [
|
|
38
25
|
'// ============================================================================',
|
|
@@ -56,9 +43,7 @@ export function generateEntitiesTs(schema) {
|
|
|
56
43
|
lines.push(...generateEntityRegistry(schema));
|
|
57
44
|
return lines.join('\n');
|
|
58
45
|
}
|
|
59
|
-
|
|
60
|
-
* Generate TypeScript interface for a single entity.
|
|
61
|
-
*/
|
|
46
|
+
// Generate TypeScript interface for a single entity.
|
|
62
47
|
function generateEntityInterface(tableName, fields) {
|
|
63
48
|
const typeName = toPascalCase(toSingular(tableName));
|
|
64
49
|
const lines = [];
|
|
@@ -86,10 +71,8 @@ function generateEntityInterface(tableName, fields) {
|
|
|
86
71
|
lines.push(`export type Update${typeName}Input = UpdateInput<${typeName}>;`);
|
|
87
72
|
return lines;
|
|
88
73
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
* Handles enums and basic types.
|
|
92
|
-
*/
|
|
74
|
+
// Get TypeScript type string for a field config.
|
|
75
|
+
// Handles enums and basic types.
|
|
93
76
|
function getTypeScriptType(fieldConfig) {
|
|
94
77
|
// Handle enum types
|
|
95
78
|
if (fieldConfig.enum && fieldConfig.enum.length > 0) {
|
|
@@ -98,9 +81,7 @@ function getTypeScriptType(fieldConfig) {
|
|
|
98
81
|
// Handle basic types
|
|
99
82
|
return schemaTypeToTs(fieldConfig.type);
|
|
100
83
|
}
|
|
101
|
-
|
|
102
|
-
* Generate entity registry for runtime use.
|
|
103
|
-
*/
|
|
84
|
+
// Generate entity registry for runtime use.
|
|
104
85
|
function generateEntityRegistry(schema) {
|
|
105
86
|
const lines = [
|
|
106
87
|
'// ============================================================================',
|
|
@@ -130,10 +111,8 @@ function generateEntityRegistry(schema) {
|
|
|
130
111
|
lines.push('export type EntityName = keyof Entities;');
|
|
131
112
|
return lines;
|
|
132
113
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
* Compact single-line format for readability.
|
|
136
|
-
*/
|
|
114
|
+
// Format fields object as TypeScript object literal.
|
|
115
|
+
// Compact single-line format for readability.
|
|
137
116
|
function formatFieldsAsTs(fields) {
|
|
138
117
|
const fieldEntries = [];
|
|
139
118
|
for (const [fieldName, fieldConfig] of Object.entries(fields)) {
|
|
@@ -168,10 +147,8 @@ function formatFieldsAsTs(fields) {
|
|
|
168
147
|
// ============================================================================
|
|
169
148
|
// VALIDATION
|
|
170
149
|
// ============================================================================
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
* Returns array of error messages (empty if valid).
|
|
174
|
-
*/
|
|
150
|
+
// Validate a schema before generation.
|
|
151
|
+
// Returns array of error messages (empty if valid).
|
|
175
152
|
export function validateSchema(schema) {
|
|
176
153
|
const errors = [];
|
|
177
154
|
if (!schema || typeof schema !== 'object') {
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|