zone4code-sdk 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/dist/index.js ADDED
@@ -0,0 +1,443 @@
1
+ // src/storage.ts
2
+ var MemoryStorage = class {
3
+ store = /* @__PURE__ */ new Map();
4
+ getItem(key) {
5
+ return this.store.get(key) ?? null;
6
+ }
7
+ setItem(key, value) {
8
+ this.store.set(key, value);
9
+ }
10
+ removeItem(key) {
11
+ this.store.delete(key);
12
+ }
13
+ };
14
+ function getDefaultStorage() {
15
+ if (typeof window !== "undefined" && window.localStorage) {
16
+ return window.localStorage;
17
+ }
18
+ return new MemoryStorage();
19
+ }
20
+
21
+ // src/auth.ts
22
+ var AuthClient = class _AuthClient {
23
+ gatewayUrl;
24
+ tenantId;
25
+ storage;
26
+ token = null;
27
+ fetchFn;
28
+ static TOKEN_KEY_PREFIX = "z4c_token_";
29
+ constructor(options) {
30
+ this.gatewayUrl = options.gatewayUrl.replace(/\/+$/, "");
31
+ this.tenantId = options.tenantId;
32
+ this.storage = options.storage;
33
+ this.fetchFn = options.fetchFn || (typeof fetch !== "undefined" ? fetch : globalThis.fetch);
34
+ if (options.initialToken) {
35
+ this.setToken(options.initialToken);
36
+ } else {
37
+ Promise.resolve(this.storage.getItem(_AuthClient.TOKEN_KEY_PREFIX + this.tenantId)).then((stored) => {
38
+ if (stored) this.token = stored;
39
+ }).catch(() => {
40
+ });
41
+ }
42
+ }
43
+ getToken() {
44
+ return this.token;
45
+ }
46
+ setToken(token) {
47
+ this.token = token;
48
+ const storageKey = _AuthClient.TOKEN_KEY_PREFIX + this.tenantId;
49
+ if (token) {
50
+ this.storage.setItem(storageKey, token);
51
+ } else {
52
+ this.storage.removeItem(storageKey);
53
+ }
54
+ }
55
+ isAuthenticated() {
56
+ return !!this.token;
57
+ }
58
+ /**
59
+ * Register a new user in the tenant realm
60
+ */
61
+ async register(data) {
62
+ const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/register`;
63
+ const res = await this.fetchFn(url, {
64
+ method: "POST",
65
+ headers: {
66
+ "Content-Type": "application/json",
67
+ "x-tenant-id": this.tenantId
68
+ },
69
+ body: JSON.stringify(data)
70
+ });
71
+ if (!res.ok) {
72
+ const err = await res.json().catch(() => ({ message: res.statusText }));
73
+ throw new Error(err.message || err.error || `Registration failed with HTTP ${res.status}`);
74
+ }
75
+ const json = await res.json();
76
+ const token = json.token || json.access_token;
77
+ if (token) {
78
+ this.setToken(token);
79
+ }
80
+ return json;
81
+ }
82
+ /**
83
+ * Log in an existing user and store their JWT token
84
+ */
85
+ async login(credentials) {
86
+ const url = `${this.gatewayUrl}/auth/${this.tenantId}/login`;
87
+ const res = await this.fetchFn(url, {
88
+ method: "POST",
89
+ headers: {
90
+ "Content-Type": "application/json",
91
+ "x-tenant-id": this.tenantId
92
+ },
93
+ body: JSON.stringify(credentials)
94
+ });
95
+ if (!res.ok) {
96
+ const err = await res.json().catch(() => ({ message: res.statusText }));
97
+ throw new Error(err.message || err.error || `Login failed with HTTP ${res.status}`);
98
+ }
99
+ const json = await res.json();
100
+ const token = json.token || json.access_token;
101
+ if (token) {
102
+ this.setToken(token);
103
+ }
104
+ return json;
105
+ }
106
+ /**
107
+ * Fetch current authenticated user profile
108
+ */
109
+ async getProfile() {
110
+ if (!this.token) {
111
+ throw new Error("Not authenticated: please call login() or setToken() first");
112
+ }
113
+ const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/profile`;
114
+ const res = await this.fetchFn(url, {
115
+ headers: {
116
+ "Authorization": `Bearer ${this.token}`,
117
+ "x-tenant-id": this.tenantId
118
+ }
119
+ });
120
+ if (!res.ok) {
121
+ const err = await res.json().catch(() => ({ message: res.statusText }));
122
+ throw new Error(err.message || `Failed to fetch profile (HTTP ${res.status})`);
123
+ }
124
+ return res.json();
125
+ }
126
+ /**
127
+ * Log out and clear saved token
128
+ */
129
+ logout() {
130
+ this.setToken(null);
131
+ }
132
+ };
133
+
134
+ // src/schema.ts
135
+ var SchemaClient = class {
136
+ gatewayUrl;
137
+ tenantId;
138
+ getToken;
139
+ fetchFn;
140
+ constructor(options) {
141
+ this.gatewayUrl = options.gatewayUrl.replace(/\/+$/, "");
142
+ this.tenantId = options.tenantId;
143
+ this.getToken = options.getToken;
144
+ this.fetchFn = options.fetchFn || (typeof fetch !== "undefined" ? fetch : globalThis.fetch);
145
+ }
146
+ getHeaders() {
147
+ const headers = {
148
+ "Content-Type": "application/json",
149
+ "x-tenant-id": this.tenantId
150
+ };
151
+ const token = this.getToken();
152
+ if (token) {
153
+ headers["Authorization"] = `Bearer ${token}`;
154
+ }
155
+ return headers;
156
+ }
157
+ /**
158
+ * Define a new JSON Schema or alter an existing schema for an entity type in real-time
159
+ */
160
+ async define(definition) {
161
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/definition`;
162
+ const res = await this.fetchFn(url, {
163
+ method: "POST",
164
+ headers: this.getHeaders(),
165
+ body: JSON.stringify(definition)
166
+ });
167
+ if (!res.ok) {
168
+ const err = await res.json().catch(() => ({ message: res.statusText }));
169
+ throw new Error(err.message || `Failed to define schema for ${definition.typeName}`);
170
+ }
171
+ return res.json();
172
+ }
173
+ };
174
+
175
+ // src/query-builder.ts
176
+ var EntityQueryBuilder = class {
177
+ gatewayUrl;
178
+ tenantId;
179
+ typeName;
180
+ getToken;
181
+ fetchFn;
182
+ queryParams = new URLSearchParams();
183
+ constructor(options) {
184
+ this.gatewayUrl = options.gatewayUrl.replace(/\/+$/, "");
185
+ this.tenantId = options.tenantId;
186
+ this.typeName = options.typeName;
187
+ this.getToken = options.getToken;
188
+ this.fetchFn = options.fetchFn || (typeof fetch !== "undefined" ? fetch : globalThis.fetch);
189
+ }
190
+ getHeaders() {
191
+ const headers = {
192
+ "Content-Type": "application/json",
193
+ "x-tenant-id": this.tenantId
194
+ };
195
+ const token = this.getToken();
196
+ if (token) {
197
+ headers["Authorization"] = `Bearer ${token}`;
198
+ }
199
+ return headers;
200
+ }
201
+ // ----------------------------------------------------
202
+ // Filter Operators
203
+ // ----------------------------------------------------
204
+ eq(field, value) {
205
+ this.queryParams.append(`${field}[eq]`, String(value));
206
+ return this;
207
+ }
208
+ ne(field, value) {
209
+ this.queryParams.append(`${field}[ne]`, String(value));
210
+ return this;
211
+ }
212
+ gt(field, value) {
213
+ this.queryParams.append(`${field}[gt]`, String(value));
214
+ return this;
215
+ }
216
+ gte(field, value) {
217
+ this.queryParams.append(`${field}[gte]`, String(value));
218
+ return this;
219
+ }
220
+ lt(field, value) {
221
+ this.queryParams.append(`${field}[lt]`, String(value));
222
+ return this;
223
+ }
224
+ lte(field, value) {
225
+ this.queryParams.append(`${field}[lte]`, String(value));
226
+ return this;
227
+ }
228
+ /**
229
+ * Case-insensitive substring search (ILIKE %substring%)
230
+ */
231
+ like(field, substring) {
232
+ this.queryParams.append(`${field}[like]`, substring);
233
+ return this;
234
+ }
235
+ /**
236
+ * Set membership: matches if field value is in the array
237
+ */
238
+ in(field, values) {
239
+ this.queryParams.append(`${field}[in]`, values.map(String).join(","));
240
+ return this;
241
+ }
242
+ isNull(field) {
243
+ this.queryParams.append(`${field}[null]`, "true");
244
+ return this;
245
+ }
246
+ isNotNull(field) {
247
+ this.queryParams.append(`${field}[null]`, "false");
248
+ return this;
249
+ }
250
+ /**
251
+ * Filter entities connected by graph relationship
252
+ */
253
+ related(relationName, entityIds) {
254
+ const ids = Array.isArray(entityIds) ? entityIds.join(",") : entityIds;
255
+ this.queryParams.append(`related[${relationName}]`, ids);
256
+ return this;
257
+ }
258
+ // ----------------------------------------------------
259
+ // Sorting, Pagination & Modifiers
260
+ // ----------------------------------------------------
261
+ orderBy(field, direction = "asc") {
262
+ const sortVal = direction === "desc" ? `-${field}` : field;
263
+ this.queryParams.append("sort", sortVal);
264
+ return this;
265
+ }
266
+ limit(limit) {
267
+ this.queryParams.set("limit", String(limit));
268
+ return this;
269
+ }
270
+ page(page, limit) {
271
+ this.queryParams.set("page", String(page));
272
+ if (limit) this.queryParams.set("limit", String(limit));
273
+ return this;
274
+ }
275
+ offset(offset) {
276
+ this.queryParams.set("offset", String(offset));
277
+ return this;
278
+ }
279
+ cursor(token) {
280
+ this.queryParams.set("cursor", token);
281
+ return this;
282
+ }
283
+ flat(enabled = true) {
284
+ this.queryParams.set("flat", enabled ? "true" : "false");
285
+ return this;
286
+ }
287
+ // ----------------------------------------------------
288
+ // Execution Methods
289
+ // ----------------------------------------------------
290
+ /**
291
+ * Execute query and list matching records with pagination metadata
292
+ */
293
+ async list() {
294
+ const qs = this.queryParams.toString();
295
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}${qs ? `?${qs}` : ""}`;
296
+ const res = await this.fetchFn(url, {
297
+ headers: this.getHeaders()
298
+ });
299
+ if (!res.ok) {
300
+ const err = await res.json().catch(() => ({ message: res.statusText }));
301
+ throw new Error(err.message || `Query failed with HTTP ${res.status}`);
302
+ }
303
+ return res.json();
304
+ }
305
+ /**
306
+ * Fetch a single entity by ID
307
+ */
308
+ async get(id) {
309
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}`;
310
+ const res = await this.fetchFn(url, {
311
+ headers: this.getHeaders()
312
+ });
313
+ if (!res.ok) {
314
+ const err = await res.json().catch(() => ({ message: res.statusText }));
315
+ throw new Error(err.message || `Failed to fetch ${this.typeName}/${id}`);
316
+ }
317
+ return res.json();
318
+ }
319
+ /**
320
+ * Create a new entity record matching schema
321
+ */
322
+ async create(data) {
323
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}`;
324
+ const res = await this.fetchFn(url, {
325
+ method: "POST",
326
+ headers: this.getHeaders(),
327
+ body: JSON.stringify(data)
328
+ });
329
+ if (!res.ok) {
330
+ const err = await res.json().catch(() => ({ message: res.statusText }));
331
+ throw new Error(err.message || `Failed to create record in ${this.typeName}`);
332
+ }
333
+ return res.json();
334
+ }
335
+ /**
336
+ * Update an existing entity record
337
+ */
338
+ async update(id, partialData) {
339
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}`;
340
+ const res = await this.fetchFn(url, {
341
+ method: "PATCH",
342
+ headers: this.getHeaders(),
343
+ body: JSON.stringify(partialData)
344
+ });
345
+ if (!res.ok) {
346
+ const err = await res.json().catch(() => ({ message: res.statusText }));
347
+ throw new Error(err.message || `Failed to update ${this.typeName}/${id}`);
348
+ }
349
+ return res.json();
350
+ }
351
+ /**
352
+ * Soft-delete an entity record
353
+ */
354
+ async delete(id) {
355
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}`;
356
+ const res = await this.fetchFn(url, {
357
+ method: "DELETE",
358
+ headers: this.getHeaders()
359
+ });
360
+ if (!res.ok) {
361
+ const err = await res.json().catch(() => ({ message: res.statusText }));
362
+ throw new Error(err.message || `Failed to delete ${this.typeName}/${id}`);
363
+ }
364
+ return { success: true };
365
+ }
366
+ };
367
+
368
+ // src/client.ts
369
+ var Zone4CodeClient = class {
370
+ gatewayUrl;
371
+ tenantId;
372
+ auth;
373
+ schema;
374
+ storage;
375
+ fetchFn;
376
+ constructor(config) {
377
+ if (!config.gatewayUrl) {
378
+ throw new Error("Zone4CodeClient requires a `gatewayUrl` (e.g., http://localhost:8080)");
379
+ }
380
+ if (!config.tenantId) {
381
+ throw new Error("Zone4CodeClient requires a `tenantId` (workspace identifier)");
382
+ }
383
+ this.gatewayUrl = config.gatewayUrl.replace(/\/+$/, "");
384
+ this.tenantId = config.tenantId;
385
+ this.storage = config.storage || getDefaultStorage();
386
+ this.fetchFn = config.fetch || (typeof fetch !== "undefined" ? fetch : globalThis.fetch);
387
+ this.auth = new AuthClient({
388
+ gatewayUrl: this.gatewayUrl,
389
+ tenantId: this.tenantId,
390
+ storage: this.storage,
391
+ initialToken: config.token,
392
+ fetchFn: this.fetchFn
393
+ });
394
+ this.schema = new SchemaClient({
395
+ gatewayUrl: this.gatewayUrl,
396
+ tenantId: this.tenantId,
397
+ getToken: () => this.auth.getToken(),
398
+ fetchFn: this.fetchFn
399
+ });
400
+ }
401
+ /**
402
+ * Access an entity collection with chainable query builder (like Supabase .from('orders'))
403
+ */
404
+ from(typeName) {
405
+ return new EntityQueryBuilder({
406
+ gatewayUrl: this.gatewayUrl,
407
+ tenantId: this.tenantId,
408
+ typeName,
409
+ getToken: () => this.auth.getToken(),
410
+ fetchFn: this.fetchFn
411
+ });
412
+ }
413
+ /**
414
+ * Alias for .from(typeName)
415
+ */
416
+ entities(typeName) {
417
+ return this.from(typeName);
418
+ }
419
+ /**
420
+ * Check gateway connectivity & health
421
+ */
422
+ async health() {
423
+ const res = await this.fetchFn(`${this.gatewayUrl}/health`);
424
+ if (!res.ok) {
425
+ throw new Error(`Gateway health check failed with HTTP ${res.status}`);
426
+ }
427
+ return res.json();
428
+ }
429
+ };
430
+ function createClient(config) {
431
+ return new Zone4CodeClient(config);
432
+ }
433
+ export {
434
+ AuthClient,
435
+ EntityQueryBuilder,
436
+ MemoryStorage,
437
+ SchemaClient,
438
+ Zone4CodeClient,
439
+ createClient,
440
+ createClient as default,
441
+ getDefaultStorage
442
+ };
443
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage.ts","../src/auth.ts","../src/schema.ts","../src/query-builder.ts","../src/client.ts"],"sourcesContent":["import { StorageAdapter } from './types';\n\nexport class MemoryStorage implements StorageAdapter {\n private store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n}\n\nexport function getDefaultStorage(): StorageAdapter {\n if (typeof window !== 'undefined' && window.localStorage) {\n return window.localStorage;\n }\n return new MemoryStorage();\n}\n","import { AuthResponse, AuthUser, StorageAdapter } from './types';\n\nexport class AuthClient {\n private gatewayUrl: string;\n private tenantId: string;\n private storage: StorageAdapter;\n private token: string | null = null;\n private fetchFn: typeof fetch;\n\n private static TOKEN_KEY_PREFIX = 'z4c_token_';\n\n constructor(options: {\n gatewayUrl: string;\n tenantId: string;\n storage: StorageAdapter;\n initialToken?: string;\n fetchFn?: typeof fetch;\n }) {\n this.gatewayUrl = options.gatewayUrl.replace(/\\/+$/, '');\n this.tenantId = options.tenantId;\n this.storage = options.storage;\n this.fetchFn = options.fetchFn || (typeof fetch !== 'undefined' ? fetch : (globalThis.fetch as any));\n\n if (options.initialToken) {\n this.setToken(options.initialToken);\n } else {\n // Attempt load from storage\n Promise.resolve(this.storage.getItem(AuthClient.TOKEN_KEY_PREFIX + this.tenantId))\n .then((stored) => {\n if (stored) this.token = stored;\n })\n .catch(() => {});\n }\n }\n\n public getToken(): string | null {\n return this.token;\n }\n\n public setToken(token: string | null): void {\n this.token = token;\n const storageKey = AuthClient.TOKEN_KEY_PREFIX + this.tenantId;\n if (token) {\n this.storage.setItem(storageKey, token);\n } else {\n this.storage.removeItem(storageKey);\n }\n }\n\n public isAuthenticated(): boolean {\n return !!this.token;\n }\n\n /**\n * Register a new user in the tenant realm\n */\n async register(data: {\n email: string;\n password: string;\n name?: string;\n username?: string;\n attributes?: Record<string, any>;\n }): Promise<AuthResponse> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/register`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId\n },\n body: JSON.stringify(data)\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || err.error || `Registration failed with HTTP ${res.status}`);\n }\n\n const json = await res.json();\n const token = json.token || json.access_token;\n if (token) {\n this.setToken(token);\n }\n return json;\n }\n\n /**\n * Log in an existing user and store their JWT token\n */\n async login(credentials: {\n email?: string;\n username?: string;\n password: string;\n }): Promise<AuthResponse> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/login`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId\n },\n body: JSON.stringify(credentials)\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || err.error || `Login failed with HTTP ${res.status}`);\n }\n\n const json = await res.json();\n const token = json.token || json.access_token;\n if (token) {\n this.setToken(token);\n }\n return json;\n }\n\n /**\n * Fetch current authenticated user profile\n */\n async getProfile(): Promise<AuthUser> {\n if (!this.token) {\n throw new Error('Not authenticated: please call login() or setToken() first');\n }\n\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/profile`;\n const res = await this.fetchFn(url, {\n headers: {\n 'Authorization': `Bearer ${this.token}`,\n 'x-tenant-id': this.tenantId\n }\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to fetch profile (HTTP ${res.status})`);\n }\n\n return res.json();\n }\n\n /**\n * Log out and clear saved token\n */\n logout(): void {\n this.setToken(null);\n }\n}\n","import { EntitySchemaDefinition } from './types';\n\nexport class SchemaClient {\n private gatewayUrl: string;\n private tenantId: string;\n private getToken: () => string | null;\n private fetchFn: typeof fetch;\n\n constructor(options: {\n gatewayUrl: string;\n tenantId: string;\n getToken: () => string | null;\n fetchFn?: typeof fetch;\n }) {\n this.gatewayUrl = options.gatewayUrl.replace(/\\/+$/, '');\n this.tenantId = options.tenantId;\n this.getToken = options.getToken;\n this.fetchFn = options.fetchFn || (typeof fetch !== 'undefined' ? fetch : (globalThis.fetch as any));\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId\n };\n const token = this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n }\n\n /**\n * Define a new JSON Schema or alter an existing schema for an entity type in real-time\n */\n async define(definition: EntitySchemaDefinition): Promise<{ success: boolean; version?: number }> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/definition`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(definition)\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to define schema for ${definition.typeName}`);\n }\n\n return res.json();\n }\n}\n","import { EntityListResponse, EntityRecord, FilterOperator } from './types';\n\nexport class EntityQueryBuilder<T = Record<string, any>> {\n private gatewayUrl: string;\n private tenantId: string;\n private typeName: string;\n private getToken: () => string | null;\n private fetchFn: typeof fetch;\n\n private queryParams = new URLSearchParams();\n\n constructor(options: {\n gatewayUrl: string;\n tenantId: string;\n typeName: string;\n getToken: () => string | null;\n fetchFn?: typeof fetch;\n }) {\n this.gatewayUrl = options.gatewayUrl.replace(/\\/+$/, '');\n this.tenantId = options.tenantId;\n this.typeName = options.typeName;\n this.getToken = options.getToken;\n this.fetchFn = options.fetchFn || (typeof fetch !== 'undefined' ? fetch : (globalThis.fetch as any));\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId\n };\n const token = this.getToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n }\n\n // ----------------------------------------------------\n // Filter Operators\n // ----------------------------------------------------\n\n eq(field: string, value: string | number | boolean): this {\n this.queryParams.append(`${field}[eq]`, String(value));\n return this;\n }\n\n ne(field: string, value: string | number | boolean): this {\n this.queryParams.append(`${field}[ne]`, String(value));\n return this;\n }\n\n gt(field: string, value: number): this {\n this.queryParams.append(`${field}[gt]`, String(value));\n return this;\n }\n\n gte(field: string, value: number): this {\n this.queryParams.append(`${field}[gte]`, String(value));\n return this;\n }\n\n lt(field: string, value: number): this {\n this.queryParams.append(`${field}[lt]`, String(value));\n return this;\n }\n\n lte(field: string, value: number): this {\n this.queryParams.append(`${field}[lte]`, String(value));\n return this;\n }\n\n /**\n * Case-insensitive substring search (ILIKE %substring%)\n */\n like(field: string, substring: string): this {\n this.queryParams.append(`${field}[like]`, substring);\n return this;\n }\n\n /**\n * Set membership: matches if field value is in the array\n */\n in(field: string, values: Array<string | number>): this {\n this.queryParams.append(`${field}[in]`, values.map(String).join(','));\n return this;\n }\n\n isNull(field: string): this {\n this.queryParams.append(`${field}[null]`, 'true');\n return this;\n }\n\n isNotNull(field: string): this {\n this.queryParams.append(`${field}[null]`, 'false');\n return this;\n }\n\n /**\n * Filter entities connected by graph relationship\n */\n related(relationName: string, entityIds: string | string[]): this {\n const ids = Array.isArray(entityIds) ? entityIds.join(',') : entityIds;\n this.queryParams.append(`related[${relationName}]`, ids);\n return this;\n }\n\n // ----------------------------------------------------\n // Sorting, Pagination & Modifiers\n // ----------------------------------------------------\n\n orderBy(field: string, direction: 'asc' | 'desc' = 'asc'): this {\n const sortVal = direction === 'desc' ? `-${field}` : field;\n this.queryParams.append('sort', sortVal);\n return this;\n }\n\n limit(limit: number): this {\n this.queryParams.set('limit', String(limit));\n return this;\n }\n\n page(page: number, limit?: number): this {\n this.queryParams.set('page', String(page));\n if (limit) this.queryParams.set('limit', String(limit));\n return this;\n }\n\n offset(offset: number): this {\n this.queryParams.set('offset', String(offset));\n return this;\n }\n\n cursor(token: string): this {\n this.queryParams.set('cursor', token);\n return this;\n }\n\n flat(enabled: boolean = true): this {\n this.queryParams.set('flat', enabled ? 'true' : 'false');\n return this;\n }\n\n // ----------------------------------------------------\n // Execution Methods\n // ----------------------------------------------------\n\n /**\n * Execute query and list matching records with pagination metadata\n */\n async list(): Promise<EntityListResponse<T>> {\n const qs = this.queryParams.toString();\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}${qs ? `?${qs}` : ''}`;\n \n const res = await this.fetchFn(url, {\n headers: this.getHeaders()\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Query failed with HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n /**\n * Fetch a single entity by ID\n */\n async get(id: string): Promise<EntityRecord<T>> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}`;\n const res = await this.fetchFn(url, {\n headers: this.getHeaders()\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to fetch ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Create a new entity record matching schema\n */\n async create(data: T): Promise<EntityRecord<T>> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(data)\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to create record in ${this.typeName}`);\n }\n\n return res.json();\n }\n\n /**\n * Update an existing entity record\n */\n async update(id: string, partialData: Partial<T>): Promise<EntityRecord<T>> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}`;\n const res = await this.fetchFn(url, {\n method: 'PATCH',\n headers: this.getHeaders(),\n body: JSON.stringify(partialData)\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to update ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Soft-delete an entity record\n */\n async delete(id: string): Promise<{ success: boolean }> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}`;\n const res = await this.fetchFn(url, {\n method: 'DELETE',\n headers: this.getHeaders()\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to delete ${this.typeName}/${id}`);\n }\n\n return { success: true };\n }\n}\n","import { AuthClient } from './auth';\nimport { EntityQueryBuilder } from './query-builder';\nimport { SchemaClient } from './schema';\nimport { getDefaultStorage } from './storage';\nimport { StorageAdapter, Zone4CodeConfig } from './types';\n\nexport class Zone4CodeClient {\n public readonly gatewayUrl: string;\n public readonly tenantId: string;\n public readonly auth: AuthClient;\n public readonly schema: SchemaClient;\n\n private storage: StorageAdapter;\n private fetchFn: typeof fetch;\n\n constructor(config: Zone4CodeConfig) {\n if (!config.gatewayUrl) {\n throw new Error('Zone4CodeClient requires a `gatewayUrl` (e.g., http://localhost:8080)');\n }\n if (!config.tenantId) {\n throw new Error('Zone4CodeClient requires a `tenantId` (workspace identifier)');\n }\n\n this.gatewayUrl = config.gatewayUrl.replace(/\\/+$/, '');\n this.tenantId = config.tenantId;\n this.storage = config.storage || getDefaultStorage();\n this.fetchFn = config.fetch || (typeof fetch !== 'undefined' ? fetch : (globalThis.fetch as any));\n\n this.auth = new AuthClient({\n gatewayUrl: this.gatewayUrl,\n tenantId: this.tenantId,\n storage: this.storage,\n initialToken: config.token,\n fetchFn: this.fetchFn\n });\n\n this.schema = new SchemaClient({\n gatewayUrl: this.gatewayUrl,\n tenantId: this.tenantId,\n getToken: () => this.auth.getToken(),\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Access an entity collection with chainable query builder (like Supabase .from('orders'))\n */\n public from<T = Record<string, any>>(typeName: string): EntityQueryBuilder<T> {\n return new EntityQueryBuilder<T>({\n gatewayUrl: this.gatewayUrl,\n tenantId: this.tenantId,\n typeName,\n getToken: () => this.auth.getToken(),\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Alias for .from(typeName)\n */\n public entities<T = Record<string, any>>(typeName: string): EntityQueryBuilder<T> {\n return this.from<T>(typeName);\n }\n\n /**\n * Check gateway connectivity & health\n */\n public async health(): Promise<{ status: string; licenseTier?: string }> {\n const res = await this.fetchFn(`${this.gatewayUrl}/health`);\n if (!res.ok) {\n throw new Error(`Gateway health check failed with HTTP ${res.status}`);\n }\n return res.json();\n }\n}\n\n/**\n * Factory function to instantiate a new Zone4Code client\n */\nexport function createClient(config: Zone4CodeConfig): Zone4CodeClient {\n return new Zone4CodeClient(config);\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "zone4code-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Official TypeScript & JavaScript Client SDK for the Zone4Code Platform",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch",
26
+ "test": "node test/test-live-sdk.mjs",
27
+ "typecheck": "tsc -p tsconfig.json --noEmit"
28
+ },
29
+ "keywords": [
30
+ "zone4code",
31
+ "singulary",
32
+ "sdk",
33
+ "aom",
34
+ "generic-api",
35
+ "auth-api",
36
+ "database"
37
+ ],
38
+ "author": "Zone4Code",
39
+ "license": "MIT",
40
+ "devDependencies": {
41
+ "tsup": "^8.0.2",
42
+ "typescript": "^5.4.5"
43
+ }
44
+ }