zone4code-sdk 1.0.3 → 1.0.5

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.d.ts CHANGED
@@ -51,6 +51,8 @@ interface EntityRecord<T = Record<string, any>> {
51
51
  updated_at?: string;
52
52
  deleted_at?: string | null;
53
53
  data: T;
54
+ relations?: Record<string, any[]>;
55
+ [key: string]: any;
54
56
  }
55
57
  interface EntityListResponse<T = Record<string, any>> {
56
58
  data: Array<EntityRecord<T> | (T & {
@@ -100,14 +102,24 @@ interface EntityRevision<T = Record<string, any>> {
100
102
  created_at: string;
101
103
  }
102
104
  interface EntityRelationPayload {
103
- targetTypeName: string;
104
- targetId: string;
105
- relationName: string;
105
+ relationName?: string;
106
+ relation_name?: string;
107
+ targetId?: string;
108
+ target_id?: string;
109
+ child_id?: string;
110
+ childId?: string;
111
+ targetTypeName?: string;
112
+ target_type_name?: string;
113
+ [key: string]: any;
106
114
  }
107
115
  interface EntityReplaceRelationsPayload {
108
- targetTypeName: string;
109
- targetIds: string[];
110
- relationName: string;
116
+ targetTypeName?: string;
117
+ target_type_name?: string;
118
+ targetIds?: string[];
119
+ target_ids?: string[];
120
+ relationName?: string;
121
+ relation_name?: string;
122
+ [key: string]: any;
111
123
  }
112
124
  interface EntityRelationRecord {
113
125
  id?: string;
@@ -118,14 +130,6 @@ interface EntityRelationRecord {
118
130
  target?: EntityRecord<any>;
119
131
  }
120
132
 
121
- declare class MemoryStorage implements StorageAdapter {
122
- private store;
123
- getItem(key: string): string | null;
124
- setItem(key: string, value: string): void;
125
- removeItem(key: string): void;
126
- }
127
- declare function getDefaultStorage(): StorageAdapter;
128
-
129
133
  declare class AuthClient {
130
134
  private gatewayUrl;
131
135
  private tenantId;
@@ -228,27 +232,6 @@ declare class AuthClient {
228
232
  logout(): void;
229
233
  }
230
234
 
231
- declare class SchemaClient {
232
- private gatewayUrl;
233
- private tenantId;
234
- private getToken;
235
- private fetchFn;
236
- constructor(options: {
237
- gatewayUrl: string;
238
- tenantId: string;
239
- getToken: () => string | null;
240
- fetchFn?: typeof fetch;
241
- });
242
- private getHeaders;
243
- /**
244
- * Define a new JSON Schema or alter an existing schema for an entity type in real-time
245
- */
246
- define(definition: EntitySchemaDefinition): Promise<{
247
- success: boolean;
248
- version?: number;
249
- }>;
250
- }
251
-
252
235
  declare class EntityQueryBuilder<T = Record<string, any>> {
253
236
  private gatewayUrl;
254
237
  private tenantId;
@@ -284,6 +267,11 @@ declare class EntityQueryBuilder<T = Record<string, any>> {
284
267
  * Filter entities connected by graph relationship
285
268
  */
286
269
  related(relationName: string, entityIds: string | string[]): this;
270
+ /**
271
+ * Declaratively expand graph relations (Supabase-style join expansion)
272
+ * Example: .include('placed_by', 'payment', 'items')
273
+ */
274
+ include(...relations: string[]): this;
287
275
  orderBy(field: string, direction?: 'asc' | 'desc'): this;
288
276
  limit(limit: number): this;
289
277
  page(page: number, limit?: number): this;
@@ -295,9 +283,12 @@ declare class EntityQueryBuilder<T = Record<string, any>> {
295
283
  */
296
284
  list(): Promise<EntityListResponse<T>>;
297
285
  /**
298
- * Fetch a single entity by ID
286
+ * Fetch a single entity by ID with optional expansion and flattening
299
287
  */
300
- get(id: string): Promise<EntityRecord<T>>;
288
+ get(id: string, options?: {
289
+ flat?: boolean;
290
+ include?: string[];
291
+ }): Promise<EntityRecord<T>>;
301
292
  /**
302
293
  * Create a new entity record matching schema
303
294
  */
@@ -322,8 +313,12 @@ declare class EntityQueryBuilder<T = Record<string, any>> {
322
313
  getRelations(id: string, lang?: string): Promise<EntityRelationRecord[]>;
323
314
  /**
324
315
  * Link this record to another entity record
316
+ * Supports:
317
+ * .link(id, 'in_category', categoryId)
318
+ * .link(id, 'in_category', 'category', categoryId)
319
+ * .link(id, { relationName: 'in_category', targetId: categoryId, targetTypeName: 'category' })
325
320
  */
326
- link(id: string, payload: EntityRelationPayload): Promise<{
321
+ link(id: string, relationOrPayload: string | EntityRelationPayload, targetTypeNameOrId?: string, maybeTargetId?: string): Promise<{
327
322
  success: boolean;
328
323
  }>;
329
324
  /**
@@ -352,6 +347,27 @@ declare class EntityQueryBuilder<T = Record<string, any>> {
352
347
  exportCsv(): Promise<string>;
353
348
  }
354
349
 
350
+ declare class SchemaClient {
351
+ private gatewayUrl;
352
+ private tenantId;
353
+ private getToken;
354
+ private fetchFn;
355
+ constructor(options: {
356
+ gatewayUrl: string;
357
+ tenantId: string;
358
+ getToken: () => string | null;
359
+ fetchFn?: typeof fetch;
360
+ });
361
+ private getHeaders;
362
+ /**
363
+ * Define a new JSON Schema or alter an existing schema for an entity type in real-time
364
+ */
365
+ define(definition: EntitySchemaDefinition): Promise<{
366
+ success: boolean;
367
+ version?: number;
368
+ }>;
369
+ }
370
+
355
371
  declare class Zone4CodeClient {
356
372
  readonly gatewayUrl: string;
357
373
  readonly tenantId: string;
@@ -385,4 +401,12 @@ declare class Zone4CodeClient {
385
401
  */
386
402
  declare function createClient(config: Zone4CodeConfig): Zone4CodeClient;
387
403
 
404
+ declare class MemoryStorage implements StorageAdapter {
405
+ private store;
406
+ getItem(key: string): string | null;
407
+ setItem(key: string, value: string): void;
408
+ removeItem(key: string): void;
409
+ }
410
+ declare function getDefaultStorage(): StorageAdapter;
411
+
388
412
  export { AuthClient, type AuthResponse, type AuthUser, type EntityListResponse, EntityQueryBuilder, type EntityRecord, type EntityRelationPayload, type EntityRelationRecord, type EntityReplaceRelationsPayload, type EntityRevision, type EntitySchemaDefinition, type FilterOperator, MemoryStorage, SchemaClient, type SchemaProperty, type StorageAdapter, type UserProfileWithWallet, Zone4CodeClient, type Zone4CodeConfig, createClient, createClient as default, getDefaultStorage };
package/dist/index.js CHANGED
@@ -1,23 +1,3 @@
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
1
  // src/auth.ts
22
2
  function decodeJwtPayload(token) {
23
3
  try {
@@ -398,47 +378,6 @@ var AuthClient = class _AuthClient {
398
378
  }
399
379
  };
400
380
 
401
- // src/schema.ts
402
- var SchemaClient = class {
403
- gatewayUrl;
404
- tenantId;
405
- getToken;
406
- fetchFn;
407
- constructor(options) {
408
- this.gatewayUrl = options.gatewayUrl.replace(/\/+$/, "");
409
- this.tenantId = options.tenantId;
410
- this.getToken = options.getToken;
411
- this.fetchFn = options.fetchFn || (typeof fetch !== "undefined" ? fetch : globalThis.fetch);
412
- }
413
- getHeaders() {
414
- const headers = {
415
- "Content-Type": "application/json",
416
- "x-tenant-id": this.tenantId
417
- };
418
- const token = this.getToken();
419
- if (token) {
420
- headers["Authorization"] = `Bearer ${token}`;
421
- }
422
- return headers;
423
- }
424
- /**
425
- * Define a new JSON Schema or alter an existing schema for an entity type in real-time
426
- */
427
- async define(definition) {
428
- const url = `${this.gatewayUrl}/generic/${this.tenantId}/definition`;
429
- const res = await this.fetchFn(url, {
430
- method: "POST",
431
- headers: this.getHeaders(),
432
- body: JSON.stringify(definition)
433
- });
434
- if (!res.ok) {
435
- const err = await res.json().catch(() => ({ message: res.statusText }));
436
- throw new Error(err.message || `Failed to define schema for ${definition.typeName}`);
437
- }
438
- return res.json();
439
- }
440
- };
441
-
442
381
  // src/query-builder.ts
443
382
  var EntityQueryBuilder = class {
444
383
  gatewayUrl;
@@ -522,6 +461,19 @@ var EntityQueryBuilder = class {
522
461
  this.queryParams.append(`related[${relationName}]`, ids);
523
462
  return this;
524
463
  }
464
+ /**
465
+ * Declaratively expand graph relations (Supabase-style join expansion)
466
+ * Example: .include('placed_by', 'payment', 'items')
467
+ */
468
+ include(...relations) {
469
+ const existing = this.queryParams.get("include");
470
+ const existingList = existing ? existing.split(",").map((s) => s.trim()) : [];
471
+ const combined = Array.from(/* @__PURE__ */ new Set([...existingList, ...relations.map((s) => s.trim())])).filter(Boolean);
472
+ if (combined.length > 0) {
473
+ this.queryParams.set("include", combined.join(","));
474
+ }
475
+ return this;
476
+ }
525
477
  // ----------------------------------------------------
526
478
  // Sorting, Pagination & Modifiers
527
479
  // ----------------------------------------------------
@@ -570,10 +522,21 @@ var EntityQueryBuilder = class {
570
522
  return res.json();
571
523
  }
572
524
  /**
573
- * Fetch a single entity by ID
525
+ * Fetch a single entity by ID with optional expansion and flattening
574
526
  */
575
- async get(id) {
576
- const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}`;
527
+ async get(id, options) {
528
+ const params = new URLSearchParams(this.queryParams);
529
+ if (options?.flat !== void 0) {
530
+ params.set("flat", options.flat ? "true" : "false");
531
+ }
532
+ if (options?.include && options.include.length > 0) {
533
+ const existing = params.get("include");
534
+ const existingList = existing ? existing.split(",").map((s) => s.trim()) : [];
535
+ const combined = Array.from(/* @__PURE__ */ new Set([...existingList, ...options.include.map((s) => s.trim())])).filter(Boolean);
536
+ params.set("include", combined.join(","));
537
+ }
538
+ const qs = params.toString();
539
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}${qs ? `?${qs}` : ""}`;
577
540
  const res = await this.fetchFn(url, {
578
541
  headers: this.getHeaders()
579
542
  });
@@ -661,8 +624,34 @@ var EntityQueryBuilder = class {
661
624
  }
662
625
  /**
663
626
  * Link this record to another entity record
664
- */
665
- async link(id, payload) {
627
+ * Supports:
628
+ * .link(id, 'in_category', categoryId)
629
+ * .link(id, 'in_category', 'category', categoryId)
630
+ * .link(id, { relationName: 'in_category', targetId: categoryId, targetTypeName: 'category' })
631
+ */
632
+ async link(id, relationOrPayload, targetTypeNameOrId, maybeTargetId) {
633
+ let payload;
634
+ if (typeof relationOrPayload === "string") {
635
+ if (maybeTargetId) {
636
+ payload = {
637
+ relationName: relationOrPayload,
638
+ targetTypeName: targetTypeNameOrId,
639
+ targetId: maybeTargetId
640
+ };
641
+ } else {
642
+ payload = {
643
+ relationName: relationOrPayload,
644
+ targetId: targetTypeNameOrId
645
+ };
646
+ }
647
+ } else {
648
+ const p = relationOrPayload;
649
+ payload = {
650
+ relationName: p.relationName || p.relation_name || "",
651
+ targetId: p.targetId || p.target_id || p.child_id || p.childId || "",
652
+ targetTypeName: p.targetTypeName || p.target_type_name
653
+ };
654
+ }
666
655
  const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations`;
667
656
  const res = await this.fetchFn(url, {
668
657
  method: "POST",
@@ -758,6 +747,67 @@ var EntityQueryBuilder = class {
758
747
  }
759
748
  };
760
749
 
750
+ // src/schema.ts
751
+ var SchemaClient = class {
752
+ gatewayUrl;
753
+ tenantId;
754
+ getToken;
755
+ fetchFn;
756
+ constructor(options) {
757
+ this.gatewayUrl = options.gatewayUrl.replace(/\/+$/, "");
758
+ this.tenantId = options.tenantId;
759
+ this.getToken = options.getToken;
760
+ this.fetchFn = options.fetchFn || (typeof fetch !== "undefined" ? fetch : globalThis.fetch);
761
+ }
762
+ getHeaders() {
763
+ const headers = {
764
+ "Content-Type": "application/json",
765
+ "x-tenant-id": this.tenantId
766
+ };
767
+ const token = this.getToken();
768
+ if (token) {
769
+ headers["Authorization"] = `Bearer ${token}`;
770
+ }
771
+ return headers;
772
+ }
773
+ /**
774
+ * Define a new JSON Schema or alter an existing schema for an entity type in real-time
775
+ */
776
+ async define(definition) {
777
+ const url = `${this.gatewayUrl}/generic/${this.tenantId}/definition`;
778
+ const res = await this.fetchFn(url, {
779
+ method: "POST",
780
+ headers: this.getHeaders(),
781
+ body: JSON.stringify(definition)
782
+ });
783
+ if (!res.ok) {
784
+ const err = await res.json().catch(() => ({ message: res.statusText }));
785
+ throw new Error(err.message || `Failed to define schema for ${definition.typeName}`);
786
+ }
787
+ return res.json();
788
+ }
789
+ };
790
+
791
+ // src/storage.ts
792
+ var MemoryStorage = class {
793
+ store = /* @__PURE__ */ new Map();
794
+ getItem(key) {
795
+ return this.store.get(key) ?? null;
796
+ }
797
+ setItem(key, value) {
798
+ this.store.set(key, value);
799
+ }
800
+ removeItem(key) {
801
+ this.store.delete(key);
802
+ }
803
+ };
804
+ function getDefaultStorage() {
805
+ if (typeof window !== "undefined" && window.localStorage) {
806
+ return window.localStorage;
807
+ }
808
+ return new MemoryStorage();
809
+ }
810
+
761
811
  // src/client.ts
762
812
  var Zone4CodeClient = class {
763
813
  gatewayUrl;
package/dist/index.js.map CHANGED
@@ -1 +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\nfunction decodeJwtPayload(token: string): any {\n try {\n const base64Url = token.split('.')[1];\n if (!base64Url) return null;\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n if (typeof atob === 'function') {\n const jsonStr = decodeURIComponent(\n atob(base64)\n .split('')\n .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join('')\n );\n return JSON.parse(jsonStr);\n } else if (typeof globalThis !== 'undefined' && (globalThis as any).Buffer) {\n return JSON.parse((globalThis as any).Buffer.from(base64, 'base64').toString('utf8'));\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport class AuthClient {\n private gatewayUrl: string;\n private tenantId: string;\n private storage: StorageAdapter;\n private storageKey: string;\n private refreshStorageKey: string;\n private token: string | null = null;\n private refreshTokenValue: 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 storageKey?: string;\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.storageKey = options.storageKey || (AuthClient.TOKEN_KEY_PREFIX + this.tenantId);\n this.refreshStorageKey = this.storageKey + '_refresh';\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(this.storageKey))\n .then((stored) => {\n if (stored) this.token = stored;\n })\n .catch(() => {});\n\n Promise.resolve(this.storage.getItem(this.refreshStorageKey))\n .then((stored) => {\n if (stored) this.refreshTokenValue = stored;\n })\n .catch(() => {});\n }\n }\n\n public getToken(): string | null {\n return this.token;\n }\n\n public getRefreshToken(): string | null {\n return this.refreshTokenValue;\n }\n\n public setToken(token: string | null): void {\n this.token = token;\n if (token) {\n this.storage.setItem(this.storageKey, token);\n } else {\n this.storage.removeItem(this.storageKey);\n }\n }\n\n public setRefreshToken(token: string | null): void {\n this.refreshTokenValue = token;\n if (token) {\n this.storage.setItem(this.refreshStorageKey, token);\n } else {\n this.storage.removeItem(this.refreshStorageKey);\n }\n }\n\n public isAuthenticated(): boolean {\n return !!this.token;\n }\n\n /**\n * Synchronously parse and return current authenticated user from JWT token\n */\n public getUser(): AuthUser | null {\n if (!this.token) return null;\n const jwt = decodeJwtPayload(this.token);\n if (!jwt) return null;\n return {\n id: jwt.sub || '',\n email: jwt.email,\n username: jwt.preferred_username,\n name: jwt.name || `${jwt.given_name || ''} ${jwt.family_name || ''}`.trim() || undefined,\n firstName: jwt.given_name,\n lastName: jwt.family_name,\n roles: jwt.realm_access?.roles || [],\n attributes: jwt.attributes\n };\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 firstName?: string;\n lastName?: string;\n username?: string;\n attributes?: Record<string, any>;\n autoLogin?: boolean;\n }): Promise<AuthResponse> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user`;\n const [firstNameFromSplit, ...rest] = (data.name || '').trim().split(' ');\n const lastNameFromSplit = rest.join(' ');\n\n const payload = {\n username: data.username || data.email,\n email: data.email,\n firstName: data.firstName || firstNameFromSplit || '',\n lastName: data.lastName || lastNameFromSplit || '',\n enabled: true,\n credentials: [\n {\n type: 'password',\n value: data.password,\n temporary: false\n }\n ],\n attributes: data.attributes || {}\n };\n\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(payload)\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 created = await res.json();\n\n if (data.autoLogin !== false) {\n try {\n return await this.login({\n login: data.username || data.email,\n password: data.password\n });\n } catch {\n // Fall through to returning created user if auto-login encounters an issue\n }\n }\n\n return {\n token: '',\n user: {\n id: created.id || '',\n email: data.email,\n username: payload.username,\n name: data.name || `${payload.firstName} ${payload.lastName}`.trim(),\n firstName: payload.firstName,\n lastName: payload.lastName,\n attributes: data.attributes\n }\n };\n }\n\n /**\n * Log in an existing user and store their JWT token\n * Accepts { login, password }, { email, password }, or { username, password }\n */\n async login(credentials: {\n login?: string;\n email?: string;\n username?: string;\n password: string;\n }): Promise<AuthResponse> {\n const loginIdentifier = credentials.login || credentials.email || credentials.username;\n if (!loginIdentifier) {\n throw new Error('Missing login identifier: please provide email, username, or login');\n }\n\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({\n login: loginIdentifier,\n password: credentials.password\n })\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 if (json.refresh_token) {\n this.setRefreshToken(json.refresh_token);\n }\n\n const user = this.getUser() || json.user;\n\n return {\n token: token || '',\n refreshToken: json.refresh_token,\n user,\n ...json\n };\n }\n\n /**\n * Authenticate via Google OAuth ID token\n */\n async loginWithGoogle(token: string): Promise<AuthResponse> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/login/google`;\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({ token })\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || err.error || `Google login failed with HTTP ${res.status}`);\n }\n\n const json = await res.json();\n const jwt = json.token || json.access_token;\n if (jwt) {\n this.setToken(jwt);\n }\n if (json.refresh_token) {\n this.setRefreshToken(json.refresh_token);\n }\n\n const user = this.getUser() || json.user;\n\n return {\n token: jwt || '',\n refreshToken: json.refresh_token,\n user,\n ...json\n };\n }\n\n /**\n * Renew expired access token using stored or provided refresh token\n */\n async refreshToken(refreshToken?: string): Promise<AuthResponse> {\n const tokenToUse = refreshToken || this.getRefreshToken();\n if (!tokenToUse) {\n throw new Error('No refresh token available');\n }\n\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/refresh`;\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({ refresh_token: tokenToUse })\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || err.error || `Token refresh 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 if (json.refresh_token) {\n this.setRefreshToken(json.refresh_token);\n }\n\n const user = this.getUser() || json.user;\n\n return {\n token: token || '',\n refreshToken: json.refresh_token,\n user,\n ...json\n };\n }\n\n /**\n * Request password reset email\n */\n async forgotPassword(data: { email: string; frontendUrl?: string } | string): Promise<{ success: boolean; message: string }> {\n const payload = typeof data === 'string' ? { email: data } : data;\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/auth/forgot-password`;\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(payload)\n });\n\n const json = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(json.message || json.error || `Forgot password request failed with HTTP ${res.status}`);\n }\n return json;\n }\n\n /**\n * Complete password reset using action token\n */\n async resetPassword(data: { token: string; newPassword: string }): Promise<{ success: boolean; message: string }> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/auth/reset-password`;\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 const json = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(json.message || json.error || `Reset password failed with HTTP ${res.status}`);\n }\n return json;\n }\n\n /**\n * Change password for current or specified user\n */\n async changePassword(data: { oldPassword: string; newPassword: string }, userId?: string): Promise<{ success: boolean; message?: string }> {\n const targetUserId = userId || this.getUser()?.id;\n if (!targetUserId) {\n throw new Error('User ID required: user is not logged in and no userId was provided');\n }\n\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/${targetUserId}/change-password`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId,\n ...(this.token ? { 'Authorization': `Bearer ${this.token}` } : {})\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 || `Change password failed with HTTP ${res.status}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Update profile attributes for current or specified user\n */\n async updateProfile(data: Partial<AuthUser> & Record<string, any>, userId?: string): Promise<AuthUser> {\n const targetUserId = userId || this.getUser()?.id;\n if (!targetUserId) {\n throw new Error('User ID required: user is not logged in and no userId was provided');\n }\n\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/${targetUserId}`;\n const res = await this.fetchFn(url, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId,\n ...(this.token ? { 'Authorization': `Bearer ${this.token}` } : {})\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 || `Update profile failed with HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n /**\n * Fetch current authenticated user profile\n */\n async getProfile(): Promise<AuthUser> {\n const user = this.getUser();\n if (user && user.id) {\n return user;\n }\n\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 tokens\n */\n logout(): void {\n this.setToken(null);\n this.setRefreshToken(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 {\n EntityListResponse,\n EntityRecord,\n EntityRevision,\n EntityRelationPayload,\n EntityReplaceRelationsPayload,\n EntityRelationRecord,\n FilterOperator\n} 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 /**\n * Fetch revision history for an entity record\n */\n async revisions(id: string): Promise<EntityRevision<T>[]> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/revisions`;\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 revisions for ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Fetch all graph relations for this entity record\n */\n async getRelations(id: string, lang?: string): Promise<EntityRelationRecord[]> {\n const qs = lang ? `?lang=${encodeURIComponent(lang)}` : '';\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations${qs}`;\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 relations for ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Link this record to another entity record\n */\n async link(id: string, payload: EntityRelationPayload): Promise<{ success: boolean }> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(payload)\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 relation for ${this.typeName}/${id}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Replace the full set of relations of one relation name\n */\n async setLinks(id: string, payload: EntityReplaceRelationsPayload): Promise<{ success: boolean }> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations`;\n const res = await this.fetchFn(url, {\n method: 'PUT',\n headers: this.getHeaders(),\n body: JSON.stringify(payload)\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to replace relations for ${this.typeName}/${id}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Remove one graph link between two records\n */\n async unlink(id: string, relationName: string, targetId: string, targetTypeName: string): Promise<{ success: boolean }> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations/${encodeURIComponent(relationName)}/${encodeURIComponent(targetId)}?targetTypeName=${encodeURIComponent(targetTypeName)}`;\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 relation ${relationName} for ${this.typeName}/${id}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Execute a type-level workflow plugin action (e.g. checkout, batch-process)\n */\n async action<R = any>(actionName: string, payload?: object): Promise<R> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/actions/${actionName}`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload ? JSON.stringify(payload) : undefined\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Action ${actionName} failed on type ${this.typeName}`);\n }\n\n return res.json();\n }\n\n /**\n * Execute an instance-level workflow plugin action (e.g. cancel order, approve)\n */\n async instanceAction<R = any>(id: string, actionName: string, payload?: object): Promise<R> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/actions/${actionName}`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload ? JSON.stringify(payload) : undefined\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Action ${actionName} failed on ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Export matching entity records to CSV format with active filters\n */\n async exportCsv(): Promise<string> {\n const qs = this.queryParams.toString();\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/export/csv${qs ? `?${qs}` : ''}`;\n const res = await this.fetchFn(url, {\n headers: {\n ...this.getHeaders(),\n 'Accept': 'text/csv'\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 export CSV for ${this.typeName}`);\n }\n\n return res.text();\n }\n}\n","import { AuthClient } from './auth';\nimport { EntityQueryBuilder } from './query-builder';\nimport { SchemaClient } from './schema';\nimport { getDefaultStorage } from './storage';\nimport { StorageAdapter, UserProfileWithWallet, 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 storageKey: config.storageKey,\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 * Get current authenticated user profile and platform wallet\n */\n public async getMe(): Promise<UserProfileWithWallet> {\n const token = this.auth.getToken();\n if (!token) {\n throw new Error('Not authenticated: please call login() or setToken() first');\n }\n\n const res = await this.fetchFn(`${this.gatewayUrl}/generic/${this.tenantId}/me`, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${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 & wallet (HTTP ${res.status})`);\n }\n\n return res.json();\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":[]}
1
+ {"version":3,"sources":["../src/auth.ts","../src/query-builder.ts","../src/schema.ts","../src/storage.ts","../src/client.ts"],"sourcesContent":["import { AuthResponse, AuthUser, StorageAdapter } from './types';\n\nfunction decodeJwtPayload(token: string): any {\n try {\n const base64Url = token.split('.')[1];\n if (!base64Url) return null;\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n if (typeof atob === 'function') {\n const jsonStr = decodeURIComponent(\n atob(base64)\n .split('')\n .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join('')\n );\n return JSON.parse(jsonStr);\n } else if (typeof globalThis !== 'undefined' && (globalThis as any).Buffer) {\n return JSON.parse((globalThis as any).Buffer.from(base64, 'base64').toString('utf8'));\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport class AuthClient {\n private gatewayUrl: string;\n private tenantId: string;\n private storage: StorageAdapter;\n private storageKey: string;\n private refreshStorageKey: string;\n private token: string | null = null;\n private refreshTokenValue: 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 storageKey?: string;\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.storageKey = options.storageKey || (AuthClient.TOKEN_KEY_PREFIX + this.tenantId);\n this.refreshStorageKey = this.storageKey + '_refresh';\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(this.storageKey))\n .then((stored) => {\n if (stored) this.token = stored;\n })\n .catch(() => {});\n\n Promise.resolve(this.storage.getItem(this.refreshStorageKey))\n .then((stored) => {\n if (stored) this.refreshTokenValue = stored;\n })\n .catch(() => {});\n }\n }\n\n public getToken(): string | null {\n return this.token;\n }\n\n public getRefreshToken(): string | null {\n return this.refreshTokenValue;\n }\n\n public setToken(token: string | null): void {\n this.token = token;\n if (token) {\n this.storage.setItem(this.storageKey, token);\n } else {\n this.storage.removeItem(this.storageKey);\n }\n }\n\n public setRefreshToken(token: string | null): void {\n this.refreshTokenValue = token;\n if (token) {\n this.storage.setItem(this.refreshStorageKey, token);\n } else {\n this.storage.removeItem(this.refreshStorageKey);\n }\n }\n\n public isAuthenticated(): boolean {\n return !!this.token;\n }\n\n /**\n * Synchronously parse and return current authenticated user from JWT token\n */\n public getUser(): AuthUser | null {\n if (!this.token) return null;\n const jwt = decodeJwtPayload(this.token);\n if (!jwt) return null;\n return {\n id: jwt.sub || '',\n email: jwt.email,\n username: jwt.preferred_username,\n name: jwt.name || `${jwt.given_name || ''} ${jwt.family_name || ''}`.trim() || undefined,\n firstName: jwt.given_name,\n lastName: jwt.family_name,\n roles: jwt.realm_access?.roles || [],\n attributes: jwt.attributes\n };\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 firstName?: string;\n lastName?: string;\n username?: string;\n attributes?: Record<string, any>;\n autoLogin?: boolean;\n }): Promise<AuthResponse> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user`;\n const [firstNameFromSplit, ...rest] = (data.name || '').trim().split(' ');\n const lastNameFromSplit = rest.join(' ');\n\n const payload = {\n username: data.username || data.email,\n email: data.email,\n firstName: data.firstName || firstNameFromSplit || '',\n lastName: data.lastName || lastNameFromSplit || '',\n enabled: true,\n credentials: [\n {\n type: 'password',\n value: data.password,\n temporary: false\n }\n ],\n attributes: data.attributes || {}\n };\n\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(payload)\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 created = await res.json();\n\n if (data.autoLogin !== false) {\n try {\n return await this.login({\n login: data.username || data.email,\n password: data.password\n });\n } catch {\n // Fall through to returning created user if auto-login encounters an issue\n }\n }\n\n return {\n token: '',\n user: {\n id: created.id || '',\n email: data.email,\n username: payload.username,\n name: data.name || `${payload.firstName} ${payload.lastName}`.trim(),\n firstName: payload.firstName,\n lastName: payload.lastName,\n attributes: data.attributes\n }\n };\n }\n\n /**\n * Log in an existing user and store their JWT token\n * Accepts { login, password }, { email, password }, or { username, password }\n */\n async login(credentials: {\n login?: string;\n email?: string;\n username?: string;\n password: string;\n }): Promise<AuthResponse> {\n const loginIdentifier = credentials.login || credentials.email || credentials.username;\n if (!loginIdentifier) {\n throw new Error('Missing login identifier: please provide email, username, or login');\n }\n\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({\n login: loginIdentifier,\n password: credentials.password\n })\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 if (json.refresh_token) {\n this.setRefreshToken(json.refresh_token);\n }\n\n const user = this.getUser() || json.user;\n\n return {\n token: token || '',\n refreshToken: json.refresh_token,\n user,\n ...json\n };\n }\n\n /**\n * Authenticate via Google OAuth ID token\n */\n async loginWithGoogle(token: string): Promise<AuthResponse> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/login/google`;\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({ token })\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || err.error || `Google login failed with HTTP ${res.status}`);\n }\n\n const json = await res.json();\n const jwt = json.token || json.access_token;\n if (jwt) {\n this.setToken(jwt);\n }\n if (json.refresh_token) {\n this.setRefreshToken(json.refresh_token);\n }\n\n const user = this.getUser() || json.user;\n\n return {\n token: jwt || '',\n refreshToken: json.refresh_token,\n user,\n ...json\n };\n }\n\n /**\n * Renew expired access token using stored or provided refresh token\n */\n async refreshToken(refreshToken?: string): Promise<AuthResponse> {\n const tokenToUse = refreshToken || this.getRefreshToken();\n if (!tokenToUse) {\n throw new Error('No refresh token available');\n }\n\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/refresh`;\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({ refresh_token: tokenToUse })\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || err.error || `Token refresh 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 if (json.refresh_token) {\n this.setRefreshToken(json.refresh_token);\n }\n\n const user = this.getUser() || json.user;\n\n return {\n token: token || '',\n refreshToken: json.refresh_token,\n user,\n ...json\n };\n }\n\n /**\n * Request password reset email\n */\n async forgotPassword(data: { email: string; frontendUrl?: string } | string): Promise<{ success: boolean; message: string }> {\n const payload = typeof data === 'string' ? { email: data } : data;\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/auth/forgot-password`;\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(payload)\n });\n\n const json = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(json.message || json.error || `Forgot password request failed with HTTP ${res.status}`);\n }\n return json;\n }\n\n /**\n * Complete password reset using action token\n */\n async resetPassword(data: { token: string; newPassword: string }): Promise<{ success: boolean; message: string }> {\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/auth/reset-password`;\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 const json = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(json.message || json.error || `Reset password failed with HTTP ${res.status}`);\n }\n return json;\n }\n\n /**\n * Change password for current or specified user\n */\n async changePassword(data: { oldPassword: string; newPassword: string }, userId?: string): Promise<{ success: boolean; message?: string }> {\n const targetUserId = userId || this.getUser()?.id;\n if (!targetUserId) {\n throw new Error('User ID required: user is not logged in and no userId was provided');\n }\n\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/${targetUserId}/change-password`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId,\n ...(this.token ? { 'Authorization': `Bearer ${this.token}` } : {})\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 || `Change password failed with HTTP ${res.status}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Update profile attributes for current or specified user\n */\n async updateProfile(data: Partial<AuthUser> & Record<string, any>, userId?: string): Promise<AuthUser> {\n const targetUserId = userId || this.getUser()?.id;\n if (!targetUserId) {\n throw new Error('User ID required: user is not logged in and no userId was provided');\n }\n\n const url = `${this.gatewayUrl}/auth/${this.tenantId}/user/${targetUserId}`;\n const res = await this.fetchFn(url, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-id': this.tenantId,\n ...(this.token ? { 'Authorization': `Bearer ${this.token}` } : {})\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 || `Update profile failed with HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n /**\n * Fetch current authenticated user profile\n */\n async getProfile(): Promise<AuthUser> {\n const user = this.getUser();\n if (user && user.id) {\n return user;\n }\n\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 tokens\n */\n logout(): void {\n this.setToken(null);\n this.setRefreshToken(null);\n }\n}\n","import {\n EntityListResponse,\n EntityRecord,\n EntityRelationPayload,\n EntityRelationRecord,\n EntityReplaceRelationsPayload,\n EntityRevision,\n FilterOperator\n} 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 * Declaratively expand graph relations (Supabase-style join expansion)\n * Example: .include('placed_by', 'payment', 'items')\n */\n include(...relations: string[]): this {\n const existing = this.queryParams.get('include');\n const existingList = existing ? existing.split(',').map((s) => s.trim()) : [];\n const combined = Array.from(new Set([...existingList, ...relations.map((s) => s.trim())])).filter(Boolean);\n if (combined.length > 0) {\n this.queryParams.set('include', combined.join(','));\n }\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 with optional expansion and flattening\n */\n async get(id: string, options?: { flat?: boolean; include?: string[] }): Promise<EntityRecord<T>> {\n const params = new URLSearchParams(this.queryParams);\n if (options?.flat !== undefined) {\n params.set('flat', options.flat ? 'true' : 'false');\n }\n if (options?.include && options.include.length > 0) {\n const existing = params.get('include');\n const existingList = existing ? existing.split(',').map((s) => s.trim()) : [];\n const combined = Array.from(new Set([...existingList, ...options.include.map((s) => s.trim())])).filter(Boolean);\n params.set('include', combined.join(','));\n }\n const qs = params.toString();\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}${qs ? `?${qs}` : ''}`;\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 /**\n * Fetch revision history for an entity record\n */\n async revisions(id: string): Promise<EntityRevision<T>[]> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/revisions`;\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 revisions for ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Fetch all graph relations for this entity record\n */\n async getRelations(id: string, lang?: string): Promise<EntityRelationRecord[]> {\n const qs = lang ? `?lang=${encodeURIComponent(lang)}` : '';\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations${qs}`;\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 relations for ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Link this record to another entity record\n * Supports:\n * .link(id, 'in_category', categoryId)\n * .link(id, 'in_category', 'category', categoryId)\n * .link(id, { relationName: 'in_category', targetId: categoryId, targetTypeName: 'category' })\n */\n async link(\n id: string,\n relationOrPayload: string | EntityRelationPayload,\n targetTypeNameOrId?: string,\n maybeTargetId?: string\n ): Promise<{ success: boolean }> {\n let payload: EntityRelationPayload;\n if (typeof relationOrPayload === 'string') {\n if (maybeTargetId) {\n payload = {\n relationName: relationOrPayload,\n targetTypeName: targetTypeNameOrId,\n targetId: maybeTargetId,\n };\n } else {\n payload = {\n relationName: relationOrPayload,\n targetId: targetTypeNameOrId!,\n };\n }\n } else {\n const p = relationOrPayload;\n payload = {\n relationName: p.relationName || p.relation_name || '',\n targetId: p.targetId || p.target_id || p.child_id || p.childId || '',\n targetTypeName: p.targetTypeName || p.target_type_name,\n };\n }\n\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(payload)\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 relation for ${this.typeName}/${id}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Replace the full set of relations of one relation name\n */\n async setLinks(id: string, payload: EntityReplaceRelationsPayload): Promise<{ success: boolean }> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations`;\n const res = await this.fetchFn(url, {\n method: 'PUT',\n headers: this.getHeaders(),\n body: JSON.stringify(payload)\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Failed to replace relations for ${this.typeName}/${id}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Remove one graph link between two records\n */\n async unlink(id: string, relationName: string, targetId: string, targetTypeName: string): Promise<{ success: boolean }> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/relations/${encodeURIComponent(relationName)}/${encodeURIComponent(targetId)}?targetTypeName=${encodeURIComponent(targetTypeName)}`;\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 relation ${relationName} for ${this.typeName}/${id}`);\n }\n\n return res.json().catch(() => ({ success: true }));\n }\n\n /**\n * Execute a type-level workflow plugin action (e.g. checkout, batch-process)\n */\n async action<R = any>(actionName: string, payload?: object): Promise<R> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/actions/${actionName}`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload ? JSON.stringify(payload) : undefined\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Action ${actionName} failed on type ${this.typeName}`);\n }\n\n return res.json();\n }\n\n /**\n * Execute an instance-level workflow plugin action (e.g. cancel order, approve)\n */\n async instanceAction<R = any>(id: string, actionName: string, payload?: object): Promise<R> {\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/${id}/actions/${actionName}`;\n const res = await this.fetchFn(url, {\n method: 'POST',\n headers: this.getHeaders(),\n body: payload ? JSON.stringify(payload) : undefined\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ message: res.statusText }));\n throw new Error(err.message || `Action ${actionName} failed on ${this.typeName}/${id}`);\n }\n\n return res.json();\n }\n\n /**\n * Export matching entity records to CSV format with active filters\n */\n async exportCsv(): Promise<string> {\n const qs = this.queryParams.toString();\n const url = `${this.gatewayUrl}/generic/${this.tenantId}/${this.typeName}/export/csv${qs ? `?${qs}` : ''}`;\n const res = await this.fetchFn(url, {\n headers: {\n ...this.getHeaders(),\n 'Accept': 'text/csv'\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 export CSV for ${this.typeName}`);\n }\n\n return res.text();\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 { 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 { AuthClient } from './auth';\nimport { EntityQueryBuilder } from './query-builder';\nimport { SchemaClient } from './schema';\nimport { getDefaultStorage } from './storage';\nimport { StorageAdapter, UserProfileWithWallet, 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 storageKey: config.storageKey,\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 * Get current authenticated user profile and platform wallet\n */\n public async getMe(): Promise<UserProfileWithWallet> {\n const token = this.auth.getToken();\n if (!token) {\n throw new Error('Not authenticated: please call login() or setToken() first');\n }\n\n const res = await this.fetchFn(`${this.gatewayUrl}/generic/${this.tenantId}/me`, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${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 & wallet (HTTP ${res.status})`);\n }\n\n return res.json();\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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zone4code-sdk",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Official TypeScript & JavaScript Client SDK for the Zone4Code Platform",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",