hazo_connect 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.
Files changed (53) hide show
  1. package/dist/__tests__/factory.test.d.ts +2 -0
  2. package/dist/__tests__/factory.test.d.ts.map +1 -0
  3. package/dist/__tests__/factory.test.js +45 -0
  4. package/dist/__tests__/factory.test.js.map +1 -0
  5. package/dist/__tests__/postgrest_adapter.test.d.ts +2 -0
  6. package/dist/__tests__/postgrest_adapter.test.d.ts.map +1 -0
  7. package/dist/__tests__/postgrest_adapter.test.js +32 -0
  8. package/dist/__tests__/postgrest_adapter.test.js.map +1 -0
  9. package/dist/__tests__/query_builder.test.d.ts +2 -0
  10. package/dist/__tests__/query_builder.test.d.ts.map +1 -0
  11. package/dist/__tests__/query_builder.test.js +35 -0
  12. package/dist/__tests__/query_builder.test.js.map +1 -0
  13. package/dist/adapters/base-adapter.d.ts +69 -0
  14. package/dist/adapters/base-adapter.d.ts.map +1 -0
  15. package/dist/adapters/base-adapter.js +121 -0
  16. package/dist/adapters/base-adapter.js.map +1 -0
  17. package/dist/adapters/file-adapter.d.ts +50 -0
  18. package/dist/adapters/file-adapter.d.ts.map +1 -0
  19. package/dist/adapters/file-adapter.js +62 -0
  20. package/dist/adapters/file-adapter.js.map +1 -0
  21. package/dist/adapters/postgrest-adapter.d.ts +60 -0
  22. package/dist/adapters/postgrest-adapter.d.ts.map +1 -0
  23. package/dist/adapters/postgrest-adapter.js +252 -0
  24. package/dist/adapters/postgrest-adapter.js.map +1 -0
  25. package/dist/adapters/sqlite-adapter.d.ts +49 -0
  26. package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
  27. package/dist/adapters/sqlite-adapter.js +61 -0
  28. package/dist/adapters/sqlite-adapter.js.map +1 -0
  29. package/dist/adapters/supabase-adapter.d.ts +50 -0
  30. package/dist/adapters/supabase-adapter.d.ts.map +1 -0
  31. package/dist/adapters/supabase-adapter.js +62 -0
  32. package/dist/adapters/supabase-adapter.js.map +1 -0
  33. package/dist/factory.d.ts +15 -0
  34. package/dist/factory.d.ts.map +1 -0
  35. package/dist/factory.js +89 -0
  36. package/dist/factory.js.map +1 -0
  37. package/dist/helpers.d.ts +76 -0
  38. package/dist/helpers.d.ts.map +1 -0
  39. package/dist/helpers.js +151 -0
  40. package/dist/helpers.js.map +1 -0
  41. package/dist/index.d.ts +15 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +30 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/query-builder.d.ts +143 -0
  46. package/dist/query-builder.d.ts.map +1 -0
  47. package/dist/query-builder.js +216 -0
  48. package/dist/query-builder.js.map +1 -0
  49. package/dist/types.d.ts +117 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +33 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +73 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=factory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.test.d.ts","sourceRoot":"","sources":["../../src/lib/__tests__/factory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // factory.test.ts verifies the createHazoConnect factory behavior across configuration inputs.
4
+ const factory_1 = require("../factory");
5
+ const postgrest_adapter_1 = require("../adapters/postgrest-adapter");
6
+ describe("createHazoConnect", () => {
7
+ it("returns a PostgrestAdapter when using a config provider", async () => {
8
+ const base_url = process.env.POSTGREST_URL;
9
+ const config_provider = {
10
+ get: (section, key) => {
11
+ if (section === "postgrest" && key === "base_url") {
12
+ return base_url;
13
+ }
14
+ return undefined;
15
+ },
16
+ getSection: (section) => {
17
+ if (section === "postgrest") {
18
+ return { base_url };
19
+ }
20
+ return undefined;
21
+ }
22
+ };
23
+ const adapter = (0, factory_1.createHazoConnect)({
24
+ type: "postgrest",
25
+ configProvider: config_provider
26
+ });
27
+ expect(adapter).toBeInstanceOf(postgrest_adapter_1.PostgrestAdapter);
28
+ const adapter_config = await adapter.getConfig();
29
+ expect(adapter_config.base_url).toBe(base_url);
30
+ expect(adapter_config.api_key).toBe(process.env.POSTGREST_API_KEY);
31
+ });
32
+ it("merges direct config with environment API key", async () => {
33
+ const base_url = process.env.POSTGREST_URL;
34
+ const adapter = (0, factory_1.createHazoConnect)({
35
+ type: "postgrest",
36
+ postgrest: {
37
+ base_url
38
+ }
39
+ });
40
+ const adapter_config = await adapter.getConfig();
41
+ expect(adapter_config.base_url).toBe(base_url);
42
+ expect(adapter_config.api_key).toBe(process.env.POSTGREST_API_KEY);
43
+ });
44
+ });
45
+ //# sourceMappingURL=factory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.test.js","sourceRoot":"","sources":["../../src/lib/__tests__/factory.test.ts"],"names":[],"mappings":";;AAAA,+FAA+F;AAC/F,wCAA+C;AAC/C,qEAAiE;AAEjE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAuB,CAAC;QAErD,MAAM,eAAe,GAAG;YACtB,GAAG,EAAE,CAAC,OAAe,EAAE,GAAW,EAAE,EAAE;gBACpC,IAAI,OAAO,KAAK,WAAW,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBAClD,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE;gBAC9B,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC5B,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACtB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,IAAA,2BAAiB,EAAC;YAChC,IAAI,EAAE,WAAW;YACjB,cAAc,EAAE,eAAsB;SACvC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,oCAAgB,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAuB,CAAC;QAErD,MAAM,OAAO,GAAG,IAAA,2BAAiB,EAAC;YAChC,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=postgrest_adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgrest_adapter.test.d.ts","sourceRoot":"","sources":["../../src/lib/__tests__/postgrest_adapter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // postgrest_adapter.test.ts ensures PostgREST adapter surfaces helpful error messages.
4
+ const postgrest_adapter_1 = require("../adapters/postgrest-adapter");
5
+ const originalFetch = global.fetch;
6
+ const buildAdapter = () => new postgrest_adapter_1.PostgrestAdapter({
7
+ postgrest: {
8
+ base_url: "https://example.supabase.co/rest/v1",
9
+ api_key: "valid-key"
10
+ }
11
+ });
12
+ describe("PostgrestAdapter error handling", () => {
13
+ afterEach(() => {
14
+ global.fetch = originalFetch;
15
+ });
16
+ it("produces a descriptive message when the table is missing", async () => {
17
+ const mockResponse = {
18
+ ok: false,
19
+ status: 404,
20
+ statusText: "Not Found",
21
+ text: jest.fn().mockResolvedValue(JSON.stringify({
22
+ message: "relation \"missing_table\" does not exist"
23
+ }))
24
+ };
25
+ const fetchMock = jest.fn().mockResolvedValue(mockResponse);
26
+ global.fetch = fetchMock;
27
+ const adapter = buildAdapter();
28
+ await expect(adapter.rawQuery("/missing_table", { method: "GET" })).rejects.toThrow("PostgREST could not find resource 'missing_table'");
29
+ expect(fetchMock).toHaveBeenCalledTimes(1);
30
+ });
31
+ });
32
+ //# sourceMappingURL=postgrest_adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgrest_adapter.test.js","sourceRoot":"","sources":["../../src/lib/__tests__/postgrest_adapter.test.ts"],"names":[],"mappings":";;AAAA,uFAAuF;AACvF,qEAAiE;AAEjE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;AAEnC,MAAM,YAAY,GAAG,GAAG,EAAE,CACxB,IAAI,oCAAgB,CAAC;IACnB,SAAS,EAAE;QACT,QAAQ,EAAE,qCAAqC;QAC/C,OAAO,EAAE,WAAW;KACrB;CACF,CAAC,CAAC;AAEL,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,WAAW;YACvB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAC/B,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,2CAA2C;aACrD,CAAC,CACH;SACF,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAmB,CAAC,CAAC;QAClE,MAAc,CAAC,KAAK,GAAG,SAAS,CAAC;QAElC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAE/B,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACjF,mDAAmD,CACpD,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query_builder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_builder.test.d.ts","sourceRoot":"","sources":["../../src/lib/__tests__/query_builder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // query_builder.test.ts validates QueryBuilder behaviors for select and join configuration.
4
+ const query_builder_1 = require("../query-builder");
5
+ const query_settings_1 = require("../../../tests/config/query_settings");
6
+ describe("QueryBuilder", () => {
7
+ it("persists the configured table and selection values", () => {
8
+ const tableName = query_settings_1.test_table_name || "example_table";
9
+ const builder = new query_builder_1.QueryBuilder()
10
+ .from(tableName)
11
+ .select(["id", "name"])
12
+ .limit(25)
13
+ .offset(5);
14
+ expect(builder.getTable()).toBe(tableName);
15
+ expect(builder.getSelectFields()).toEqual(["id", "name"]);
16
+ expect(builder.getLimit()).toBe(25);
17
+ expect(builder.getOffset()).toBe(5);
18
+ });
19
+ it("records join metadata using the configured values", () => {
20
+ const tableName = query_settings_1.test_table_name || "example_table";
21
+ const joinTable = query_settings_1.test_join_table || "related_items";
22
+ const joinCondition = query_settings_1.test_join_condition || `${joinTable}.parent_id=${tableName}.id`;
23
+ const builder = new query_builder_1.QueryBuilder()
24
+ .from(tableName)
25
+ .join(joinTable, joinCondition, "left");
26
+ const joins = builder.getJoins();
27
+ expect(joins).toHaveLength(1);
28
+ expect(joins[0]).toEqual({
29
+ table: joinTable,
30
+ on: joinCondition,
31
+ type: "left"
32
+ });
33
+ });
34
+ });
35
+ //# sourceMappingURL=query_builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_builder.test.js","sourceRoot":"","sources":["../../src/lib/__tests__/query_builder.test.ts"],"names":[],"mappings":";;AAAA,4FAA4F;AAC5F,oDAAgD;AAChD,yEAA6G;AAE7G,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,SAAS,GAAG,gCAAe,IAAI,eAAe,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,4BAAY,EAAE;aAC/B,IAAI,CAAC,SAAS,CAAC;aACf,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aACtB,KAAK,CAAC,EAAE,CAAC;aACT,MAAM,CAAC,CAAC,CAAC,CAAC;QAEb,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,SAAS,GAAG,gCAAe,IAAI,eAAe,CAAC;QACrD,MAAM,SAAS,GAAG,gCAAe,IAAI,eAAe,CAAC;QACrD,MAAM,aAAa,GACjB,oCAAmB,IAAI,GAAG,SAAS,cAAc,SAAS,KAAK,CAAC;QAElE,MAAM,OAAO,GAAG,IAAI,4BAAY,EAAE;aAC/B,IAAI,CAAC,SAAS,CAAC;aACf,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvB,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Purpose: Abstract base adapter class with common error handling
3
+ *
4
+ * This file provides a base class for all database adapters.
5
+ * Includes common error handling and optional logger support.
6
+ * Zero dependencies - only Node.js built-ins and types.
7
+ */
8
+ import type { Logger, HazoConnectError } from '../types';
9
+ import { ErrorCode } from '../types';
10
+ /**
11
+ * Abstract base adapter class
12
+ * All adapters should extend this class
13
+ */
14
+ export declare abstract class BaseAdapter {
15
+ protected logger: Logger;
16
+ protected config: any;
17
+ /**
18
+ * Constructor
19
+ * @param config - Adapter-specific configuration
20
+ * @param logger - Optional logger instance
21
+ */
22
+ constructor(config: any, logger?: Logger);
23
+ /**
24
+ * Create a standardized error object
25
+ * @param code - Error code
26
+ * @param message - Error message
27
+ * @param statusCode - Optional HTTP status code
28
+ * @param originalError - Optional original error
29
+ * @returns HazoConnectError object
30
+ */
31
+ protected createError(code: ErrorCode, message: string, statusCode?: number, originalError?: any): HazoConnectError;
32
+ /**
33
+ * Throw a standardized error
34
+ * @param code - Error code
35
+ * @param message - Error message
36
+ * @param statusCode - Optional HTTP status code
37
+ * @param originalError - Optional original error
38
+ */
39
+ protected throwError(code: ErrorCode, message: string, statusCode?: number, originalError?: any): never;
40
+ /**
41
+ * Detect if an error is a connection failure
42
+ * @param error - Error to check
43
+ * @returns True if connection failure
44
+ */
45
+ protected isConnectionError(error: any): boolean;
46
+ /**
47
+ * Handle connection errors
48
+ * @param error - Error to handle
49
+ */
50
+ protected handleConnectionError(error: any): never;
51
+ /**
52
+ * Validate configuration
53
+ * @param requiredFields - Array of required field names
54
+ * @throws Error if validation fails
55
+ */
56
+ protected validateConfig(requiredFields: string[]): void;
57
+ /**
58
+ * Log a query operation
59
+ * @param operation - Operation name
60
+ * @param details - Operation details
61
+ */
62
+ protected logQuery(operation: string, details: any): void;
63
+ /**
64
+ * Get the adapter's configuration
65
+ * @returns Promise with adapter-specific config
66
+ */
67
+ abstract getConfig(): Promise<any>;
68
+ }
69
+ //# sourceMappingURL=base-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EAAc,SAAS,EAAE,MAAM,UAAU,CAAA;AAEhD;;;GAGG;AACH,8BAAsB,WAAW;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,MAAM,EAAE,GAAG,CAAA;IAErB;;;;OAIG;gBACS,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAKxC;;;;;;;OAOG;IACH,SAAS,CAAC,WAAW,CACnB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,GAAG,GAClB,gBAAgB;IAsBnB;;;;;;OAMG;IACH,SAAS,CAAC,UAAU,CAClB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,GAAG,GAClB,KAAK;IAaR;;;;OAIG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAahD;;;OAGG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK;IAYlD;;;;OAIG;IACH,SAAS,CAAC,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI;IAWxD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI;IAOzD;;;OAGG;IACH,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;CACnC"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Purpose: Abstract base adapter class with common error handling
4
+ *
5
+ * This file provides a base class for all database adapters.
6
+ * Includes common error handling and optional logger support.
7
+ * Zero dependencies - only Node.js built-ins and types.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BaseAdapter = void 0;
11
+ const types_1 = require("../types");
12
+ /**
13
+ * Abstract base adapter class
14
+ * All adapters should extend this class
15
+ */
16
+ class BaseAdapter {
17
+ /**
18
+ * Constructor
19
+ * @param config - Adapter-specific configuration
20
+ * @param logger - Optional logger instance
21
+ */
22
+ constructor(config, logger) {
23
+ this.config = config;
24
+ this.logger = logger || types_1.noOpLogger;
25
+ }
26
+ /**
27
+ * Create a standardized error object
28
+ * @param code - Error code
29
+ * @param message - Error message
30
+ * @param statusCode - Optional HTTP status code
31
+ * @param originalError - Optional original error
32
+ * @returns HazoConnectError object
33
+ */
34
+ createError(code, message, statusCode, originalError) {
35
+ // Convert enum to string to ensure it's serializable
36
+ const codeString = String(code);
37
+ const error = {
38
+ code: codeString,
39
+ message,
40
+ statusCode,
41
+ originalError
42
+ };
43
+ // Log the error
44
+ this.logger.error(`[${codeString}] ${message}`, {
45
+ code: codeString,
46
+ message,
47
+ statusCode,
48
+ originalError: originalError instanceof Error ? originalError.message : String(originalError)
49
+ });
50
+ return error;
51
+ }
52
+ /**
53
+ * Throw a standardized error
54
+ * @param code - Error code
55
+ * @param message - Error message
56
+ * @param statusCode - Optional HTTP status code
57
+ * @param originalError - Optional original error
58
+ */
59
+ throwError(code, message, statusCode, originalError) {
60
+ const error = this.createError(code, message, statusCode, originalError);
61
+ const err = new Error(message);
62
+ // Convert enum to string to ensure it's serializable
63
+ err.code = String(code);
64
+ err.statusCode = statusCode;
65
+ // Only include serializable error info
66
+ err.originalError = originalError instanceof Error
67
+ ? originalError.message
68
+ : (typeof originalError === 'object' ? JSON.stringify(originalError) : String(originalError));
69
+ throw err;
70
+ }
71
+ /**
72
+ * Detect if an error is a connection failure
73
+ * @param error - Error to check
74
+ * @returns True if connection failure
75
+ */
76
+ isConnectionError(error) {
77
+ if (!error)
78
+ return false;
79
+ const message = error.message || String(error);
80
+ return (message.includes('fetch failed') ||
81
+ message.includes('ECONNREFUSED') ||
82
+ message.includes('ENOTFOUND') ||
83
+ message.includes('ETIMEDOUT') ||
84
+ message.includes('Lost connection'));
85
+ }
86
+ /**
87
+ * Handle connection errors
88
+ * @param error - Error to handle
89
+ */
90
+ handleConnectionError(error) {
91
+ if (this.isConnectionError(error)) {
92
+ this.throwError(types_1.ErrorCode.CONNECTION_FAILED, 'Lost connection to database', undefined, error);
93
+ }
94
+ throw error;
95
+ }
96
+ /**
97
+ * Validate configuration
98
+ * @param requiredFields - Array of required field names
99
+ * @throws Error if validation fails
100
+ */
101
+ validateConfig(requiredFields) {
102
+ for (const field of requiredFields) {
103
+ if (!this.config || !this.config[field]) {
104
+ this.throwError(types_1.ErrorCode.CONFIG_ERROR, `Missing required configuration field: ${field}`);
105
+ }
106
+ }
107
+ }
108
+ /**
109
+ * Log a query operation
110
+ * @param operation - Operation name
111
+ * @param details - Operation details
112
+ */
113
+ logQuery(operation, details) {
114
+ this.logger.info(`[Query] ${operation}`, {
115
+ operation,
116
+ ...details
117
+ });
118
+ }
119
+ }
120
+ exports.BaseAdapter = BaseAdapter;
121
+ //# sourceMappingURL=base-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../../src/lib/adapters/base-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Purpose: File-based storage adapter stub
3
+ *
4
+ * This adapter will support file-based storage (JSON files).
5
+ * Currently returns NotImplementedError.
6
+ *
7
+ * Expected config structure:
8
+ * {
9
+ * file: {
10
+ * base_path: string, // Base directory for data files
11
+ * file_format: 'json', // File format (currently only JSON)
12
+ * table_to_file?: (table: string) => string // Optional function to map table to filename
13
+ * }
14
+ * }
15
+ */
16
+ import type { HazoConnectAdapter, Logger } from '../types';
17
+ import { BaseAdapter } from './base-adapter';
18
+ import { QueryBuilder } from '../query-builder';
19
+ /**
20
+ * File adapter implementation (stub)
21
+ */
22
+ export declare class FileAdapter extends BaseAdapter implements HazoConnectAdapter {
23
+ /**
24
+ * Constructor
25
+ * @param config - File storage configuration
26
+ * @param logger - Optional logger instance
27
+ */
28
+ constructor(config: any, logger?: Logger);
29
+ /**
30
+ * Execute a query using the query builder
31
+ * @param builder - QueryBuilder instance
32
+ * @param method - HTTP method
33
+ * @param body - Request body
34
+ * @returns Promise with query results
35
+ */
36
+ query(builder: QueryBuilder, method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', body?: any): Promise<any>;
37
+ /**
38
+ * Execute a raw query
39
+ * @param endpoint - Raw endpoint string (not applicable for file storage)
40
+ * @param options - Request options
41
+ * @returns Promise with query results
42
+ */
43
+ rawQuery(endpoint: string, options?: RequestInit): Promise<any>;
44
+ /**
45
+ * Get the adapter's configuration
46
+ * @returns Promise with adapter-specific config
47
+ */
48
+ getConfig(): Promise<any>;
49
+ }
50
+ //# sourceMappingURL=file-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/file-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAY,YAAW,kBAAkB;IACxE;;;;OAIG;gBACS,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAKxC;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAgB,EAC3D,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,GAAG,CAAC;IAOf;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IAOzE;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;CAGhC"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * Purpose: File-based storage adapter stub
4
+ *
5
+ * This adapter will support file-based storage (JSON files).
6
+ * Currently returns NotImplementedError.
7
+ *
8
+ * Expected config structure:
9
+ * {
10
+ * file: {
11
+ * base_path: string, // Base directory for data files
12
+ * file_format: 'json', // File format (currently only JSON)
13
+ * table_to_file?: (table: string) => string // Optional function to map table to filename
14
+ * }
15
+ * }
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.FileAdapter = void 0;
19
+ const base_adapter_1 = require("./base-adapter");
20
+ const types_1 = require("../types");
21
+ /**
22
+ * File adapter implementation (stub)
23
+ */
24
+ class FileAdapter extends base_adapter_1.BaseAdapter {
25
+ /**
26
+ * Constructor
27
+ * @param config - File storage configuration
28
+ * @param logger - Optional logger instance
29
+ */
30
+ constructor(config, logger) {
31
+ super(config, logger);
32
+ // TODO: Validate file config when implemented
33
+ }
34
+ /**
35
+ * Execute a query using the query builder
36
+ * @param builder - QueryBuilder instance
37
+ * @param method - HTTP method
38
+ * @param body - Request body
39
+ * @returns Promise with query results
40
+ */
41
+ async query(builder, method = 'GET', body) {
42
+ this.throwError(types_1.ErrorCode.NOT_IMPLEMENTED, 'File adapter is not yet implemented. Please use PostgREST adapter for now.');
43
+ }
44
+ /**
45
+ * Execute a raw query
46
+ * @param endpoint - Raw endpoint string (not applicable for file storage)
47
+ * @param options - Request options
48
+ * @returns Promise with query results
49
+ */
50
+ async rawQuery(endpoint, options = {}) {
51
+ this.throwError(types_1.ErrorCode.NOT_IMPLEMENTED, 'File adapter is not yet implemented. Please use PostgREST adapter for now.');
52
+ }
53
+ /**
54
+ * Get the adapter's configuration
55
+ * @returns Promise with adapter-specific config
56
+ */
57
+ async getConfig() {
58
+ return Promise.resolve(this.config.file || this.config);
59
+ }
60
+ }
61
+ exports.FileAdapter = FileAdapter;
62
+ //# sourceMappingURL=file-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-adapter.js","sourceRoot":"","sources":["../../src/lib/adapters/file-adapter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAGH,iDAA4C;AAE5C,oCAAoC;AAEpC;;GAEG;AACH,MAAa,WAAY,SAAQ,0BAAW;IAC1C;;;;OAIG;IACH,YAAY,MAAW,EAAE,MAAe;QACtC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACrB,8CAA8C;IAChD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CACT,OAAqB,EACrB,SAAsD,KAAK,EAC3D,IAAU;QAEV,IAAI,CAAC,UAAU,CACb,iBAAS,CAAC,eAAe,EACzB,4EAA4E,CAC7E,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,UAAuB,EAAE;QACxD,IAAI,CAAC,UAAU,CACb,iBAAS,CAAC,eAAe,EACzB,4EAA4E,CAC7E,CAAA;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;IACzD,CAAC;CACF;AAjDD,kCAiDC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Purpose: PostgREST adapter implementation
3
+ *
4
+ * This adapter converts QueryBuilder to PostgREST URL format and executes queries.
5
+ * Uses injected config and logger (no file reading or project dependencies).
6
+ * Zero dependencies - only Node.js built-ins (fetch) and types.
7
+ */
8
+ import type { HazoConnectAdapter, Logger } from '../types';
9
+ import { BaseAdapter } from './base-adapter';
10
+ import { QueryBuilder } from '../query-builder';
11
+ /**
12
+ * PostgREST adapter configuration
13
+ */
14
+ interface PostgrestConfig {
15
+ base_url: string;
16
+ api_key: string;
17
+ }
18
+ /**
19
+ * PostgREST adapter implementation
20
+ */
21
+ export declare class PostgrestAdapter extends BaseAdapter implements HazoConnectAdapter {
22
+ private postgrestConfig;
23
+ /**
24
+ * Constructor
25
+ * @param config - PostgREST configuration (must include postgrest.base_url and postgrest.api_key)
26
+ * @param logger - Optional logger instance
27
+ */
28
+ constructor(config: any, logger?: Logger);
29
+ /**
30
+ * Convert QueryBuilder to PostgREST URL
31
+ * @param builder - QueryBuilder instance
32
+ * @returns PostgREST endpoint URL with query parameters
33
+ */
34
+ private buildPostgrestUrl;
35
+ /**
36
+ * Execute a query using the query builder
37
+ * @param builder - QueryBuilder instance
38
+ * @param method - HTTP method
39
+ * @param body - Request body for POST/PUT/PATCH
40
+ * @returns Promise with query results
41
+ */
42
+ query(builder: QueryBuilder, method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', body?: any): Promise<any>;
43
+ /**
44
+ * Execute a raw query (for backward compatibility)
45
+ * @param endpoint - Raw endpoint string (e.g., '/table?id=eq.123')
46
+ * @param options - Request options
47
+ * @returns Promise with query results
48
+ */
49
+ rawQuery(endpoint: string, options?: RequestInit): Promise<any>;
50
+ /**
51
+ * Get the adapter's configuration
52
+ * @returns Promise with adapter-specific config
53
+ */
54
+ getConfig(): Promise<PostgrestConfig>;
55
+ private parseErrorPayload;
56
+ private buildFriendlyErrorMessage;
57
+ private sanitizeUrl;
58
+ }
59
+ export {};
60
+ //# sourceMappingURL=postgrest-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgrest-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapters/postgrest-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C;;GAEG;AACH,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,WAAY,YAAW,kBAAkB;IAC7E,OAAO,CAAC,eAAe,CAAiB;IAExC;;;;OAIG;gBACS,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM;IAoBxC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAoGzB;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAgB,EAC3D,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,GAAG,CAAC;IAoBf;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,GAAG,CAAC;IAwFzE;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAG3C,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,WAAW;CAKpB"}