@konker.dev/middleware-fp 0.8.0 → 0.10.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.
@@ -1,8 +1,10 @@
1
+ import type { FileSystem } from '@effect/platform';
1
2
  import type { SqlClient } from '@effect/sql/SqlClient';
2
3
  import type { SqlError } from '@effect/sql/SqlError';
3
- import type { ConfigError, Layer } from 'effect';
4
+ import { type ConfigError, type Layer } from 'effect';
4
5
  import type { Rec, RequestResponseHandler } from '../../index.js';
5
- export type Adapted<R> = Exclude<R, SqlClient>;
6
- export { SslConfigSchema, type SslConfig } from './lib.js';
7
- export declare const middleware: (pgSqlClientLayer?: Layer.Layer<SqlClient, ConfigError.ConfigError | SqlError>) => <I extends Rec, O extends Rec, E, R>(wrapped: RequestResponseHandler<I, O, E, R | SqlClient>) => RequestResponseHandler<I, O, E | ConfigError.ConfigError | SqlError, Adapted<R>>;
6
+ import { type CheckServerIdentityFunction } from './lib.js';
7
+ export type Adapted<R> = Exclude<R, SqlClient> | FileSystem.FileSystem;
8
+ export { type CheckServerIdentityFunction, ignoreCheckServerIdentity, SslConfigSchema, type SslConfig } from './lib.js';
9
+ export declare const middleware: (caBundleFilePath?: string, checkServerIdentityFunction?: CheckServerIdentityFunction, pgSqlClientLayer?: Layer.Layer<SqlClient, ConfigError.ConfigError | SqlError>) => <I extends Rec, O extends Rec, E, R>(wrapped: RequestResponseHandler<I, O, E, R | SqlClient>) => RequestResponseHandler<I, O, E | ConfigError.ConfigError | SqlError, Adapted<R>>;
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIjD,OAAO,KAAK,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAMlE,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAE3D,eAAO,MAAM,UAAU,GACpB,mBAAmB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,MAC7E,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,EACjC,SAAS,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KACtD,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,WAAW,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAKjF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,KAAK,EAAQ,MAAM,QAAQ,CAAC;AAG5D,OAAO,KAAK,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAAE,KAAK,2BAA2B,EAAiC,MAAM,UAAU,CAAC;AAI3F,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC;AAEvE,OAAO,EAAE,KAAK,2BAA2B,EAAE,yBAAyB,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAExH,eAAO,MAAM,UAAU,GAEnB,mBAAmB,MAAM,EACzB,8BAA8B,2BAA2B,EACzD,mBAAmB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,MAE9E,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,EACjC,SAAS,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KACtD,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,WAAW,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAWjF,CAAC"}
@@ -2,9 +2,11 @@ import { pipe } from 'effect';
2
2
  import * as Effect from 'effect/Effect';
3
3
  import { createDefaultPgSqlClientLayer } from './lib.js';
4
4
  const TAG = 'sqlClientInitPg';
5
- export { SslConfigSchema } from './lib.js';
6
- export const middleware = (pgSqlClientLayer) => (wrapped) => (i) => {
7
- const layer = pgSqlClientLayer ?? createDefaultPgSqlClientLayer();
8
- return pipe(wrapped(i), Effect.provide(layer), Effect.tap(Effect.logDebug(`[${TAG}] OUT`)));
5
+ export { ignoreCheckServerIdentity, SslConfigSchema } from './lib.js';
6
+ export const middleware = (caBundleFilePath, checkServerIdentityFunction, pgSqlClientLayer) => (wrapped) => (i) => {
7
+ if (pgSqlClientLayer) {
8
+ return pipe(wrapped(i), Effect.provide(pgSqlClientLayer), Effect.tap(Effect.logDebug(`[${TAG}] OUT`)));
9
+ }
10
+ return pipe(wrapped(i), Effect.provide(createDefaultPgSqlClientLayer(caBundleFilePath, checkServerIdentityFunction)), Effect.tap(Effect.logDebug(`[${TAG}] OUT`)));
9
11
  };
10
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAEzD,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAI9B,OAAO,EAAE,eAAe,EAAkB,MAAM,UAAU,CAAC;AAE3D,MAAM,CAAC,MAAM,UAAU,GACrB,CAAC,gBAA6E,EAAE,EAAE,CAClF,CACE,OAAuD,EAC2B,EAAE,CACtF,CAAC,CAAc,EAAE,EAAE;IACjB,MAAM,KAAK,GAAG,gBAAgB,IAAI,6BAA6B,EAAE,CAAC;IAElE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgC,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,EAAoC,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAE3F,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAI9B,OAAO,EAAoC,yBAAyB,EAAE,eAAe,EAAkB,MAAM,UAAU,CAAC;AAExH,MAAM,CAAC,MAAM,UAAU,GACrB,CACE,gBAAyB,EACzB,2BAAyD,EACzD,gBAA6E,EAC7E,EAAE,CACJ,CACE,OAAuD,EAC2B,EAAE,CACtF,CAAC,CAAc,EAAE,EAAE;IACjB,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,OAAO,IAAI,CACT,OAAO,CAAC,CAAC,CAAC,EACV,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC,EAC5F,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAC5C,CAAC;AACJ,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAQ,MAAM,QAAQ,CAAC;AAUrC,eAAO,MAAM,oBAAoB,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAQ,MAAM,QAAQ,CAAC;AAWrC,eAAO,MAAM,oBAAoB,sCAAsC,CAAC"}
@@ -1,18 +1,23 @@
1
+ import { NodeFileSystem } from '@effect/platform-node';
1
2
  import { SqlClient } from '@effect/sql/SqlClient';
2
3
  import { Layer, pipe } from 'effect';
3
4
  import * as Effect from 'effect/Effect';
4
- import { describe, expect, it, vi } from 'vitest';
5
+ import { afterEach, describe, expect, it, vi } from 'vitest';
5
6
  import { echoCoreIn200W } from '../../../test/test-common.js';
6
7
  import { EMPTY_REQUEST_W } from '../../RequestW.js';
7
8
  import * as unit from './index.js';
8
9
  import * as unitLib from './lib.js';
10
+ import { ignoreCheckServerIdentity } from './lib.js';
9
11
  // Create a mock PgDrizzle layer for testing
10
12
  export const MockPgSqlClientLayer = Layer.succeed(SqlClient, {});
11
13
  describe('middleware/sql-client-pg-init', () => {
12
14
  describe('middleware', () => {
13
- it('should work as expected', async () => {
14
- const egHandler = pipe(echoCoreIn200W, unit.middleware(MockPgSqlClientLayer));
15
- const result = await pipe(egHandler(EMPTY_REQUEST_W), Effect.runPromise);
15
+ afterEach(() => {
16
+ vi.restoreAllMocks();
17
+ });
18
+ it('should work as expected with custom layer', async () => {
19
+ const egHandler = pipe(echoCoreIn200W, unit.middleware(undefined, undefined, MockPgSqlClientLayer));
20
+ const result = await pipe(egHandler(EMPTY_REQUEST_W), Effect.provide(NodeFileSystem.layer), Effect.runPromise);
16
21
  expect(result).toMatchObject({
17
22
  body: 'OK',
18
23
  headers: {},
@@ -29,8 +34,47 @@ describe('middleware/sql-client-pg-init', () => {
29
34
  it('should work as expected with default layer', async () => {
30
35
  const spy = vi.spyOn(unitLib, 'createDefaultPgSqlClientLayer').mockReturnValue(MockPgSqlClientLayer);
31
36
  const egHandler = pipe(echoCoreIn200W, unit.middleware());
32
- const result = await pipe(egHandler(EMPTY_REQUEST_W), Effect.runPromise);
37
+ const result = await pipe(egHandler(EMPTY_REQUEST_W), Effect.provide(NodeFileSystem.layer), Effect.runPromise);
38
+ expect(spy).toHaveBeenCalledTimes(1);
39
+ expect(spy).toHaveBeenCalledWith(undefined, undefined);
40
+ expect(result).toMatchObject({
41
+ body: 'OK',
42
+ headers: {},
43
+ in: {
44
+ url: '/',
45
+ headers: {},
46
+ method: 'GET',
47
+ pathParameters: {},
48
+ queryStringParameters: {},
49
+ },
50
+ statusCode: 200,
51
+ });
52
+ });
53
+ it('should work as expected with ca bundle file path', async () => {
54
+ const spy = vi.spyOn(unitLib, 'createDefaultPgSqlClientLayer').mockReturnValue(MockPgSqlClientLayer);
55
+ const egHandler = pipe(echoCoreIn200W, unit.middleware('/path/to/ca-bundle.pem'));
56
+ const result = await pipe(egHandler(EMPTY_REQUEST_W), Effect.provide(NodeFileSystem.layer), Effect.runPromise);
57
+ expect(spy).toHaveBeenCalledTimes(1);
58
+ expect(spy).toHaveBeenCalledWith('/path/to/ca-bundle.pem', undefined);
59
+ expect(result).toMatchObject({
60
+ body: 'OK',
61
+ headers: {},
62
+ in: {
63
+ url: '/',
64
+ headers: {},
65
+ method: 'GET',
66
+ pathParameters: {},
67
+ queryStringParameters: {},
68
+ },
69
+ statusCode: 200,
70
+ });
71
+ });
72
+ it('should work as expected with ca bundle file path and CheckServerIdentityFunction', async () => {
73
+ const spy = vi.spyOn(unitLib, 'createDefaultPgSqlClientLayer').mockReturnValue(MockPgSqlClientLayer);
74
+ const egHandler = pipe(echoCoreIn200W, unit.middleware('/path/to/ca-bundle.pem', ignoreCheckServerIdentity));
75
+ const result = await pipe(egHandler(EMPTY_REQUEST_W), Effect.provide(NodeFileSystem.layer), Effect.runPromise);
33
76
  expect(spy).toHaveBeenCalledTimes(1);
77
+ expect(spy).toHaveBeenCalledWith('/path/to/ca-bundle.pem', ignoreCheckServerIdentity);
34
78
  expect(result).toMatchObject({
35
79
  body: 'OK',
36
80
  headers: {},
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,OAAO,MAAM,UAAU,CAAC;AAEpC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAS,CAAC,CAAC;AAExE,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAE9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;gBAC3B,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,EAAE;gBACX,EAAE,EAAE;oBACF,GAAG,EAAE,GAAG;oBACR,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,KAAK;oBACb,cAAc,EAAE,EAAE;oBAClB,qBAAqB,EAAE,EAAE;iBAC1B;gBACD,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;YACrG,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAEzE,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAErC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;gBAC3B,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,EAAE;gBACX,EAAE,EAAE;oBACF,GAAG,EAAE,GAAG;oBACR,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,KAAK;oBACb,cAAc,EAAE,EAAE;oBAClB,qBAAqB,EAAE,EAAE;iBAC1B;gBACD,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,16 @@
1
+ import type { PeerCertificate } from 'node:tls';
2
+ import { FileSystem } from '@effect/platform';
1
3
  import type { SqlClient } from '@effect/sql/SqlClient';
2
4
  import type { SqlError } from '@effect/sql/SqlError';
3
- import { Config, ConfigError, type Layer, Schema } from 'effect';
4
- export declare const SslConfigSchema: Schema.transform<Schema.SchemaClass<unknown, string, never>, Schema.Union<[typeof Schema.Boolean, Schema.Record$<typeof Schema.String, typeof Schema.Unknown>]>>;
5
+ import { PgClient } from '@effect/sql-pg';
6
+ import { Config, ConfigError, Effect, Layer, Schema } from 'effect';
7
+ export declare const SslConfigSchema: Schema.transform<Schema.SchemaClass<unknown, string, never>, Schema.Union<[typeof Schema.Boolean, Schema.Struct<{
8
+ ca: typeof Schema.String;
9
+ }>, Schema.Record$<typeof Schema.String, typeof Schema.Unknown>]>>;
5
10
  export type SslConfig = typeof SslConfigSchema.Type;
6
- /**
7
- * Resolves the SSL configuration for the database by reading and decoding the `DATABASE_SSL` environment variable.
8
- * If the variable is not set or cannot be decoded, a default value will be applied.
9
- *
10
- * @param {SslConfig} [defaultValue=false] - The default SSL configuration to use if no valid configuration is provided.
11
- * @return {Config.Config<SslConfig>} A configuration object for the SSL configuration, derived from the environment variable or fallback value.
12
- */
13
- export declare function resolveSslConfig(defaultValue: SslConfig): Config.Config<SslConfig>;
14
- /**
15
- * Creates a default postgresql client layer configured using environment variables.
16
- *
17
- * The configuration includes parameters such as host, port, username, password,
18
- * database name, and SSL settings. These values are retrieved from the environment
19
- * or configuration system.
20
- *
21
- * @return {Layer.Layer<SqlClient, ConfigError.ConfigError | SqlError>} A layer encapsulating the
22
- * postgresql client, which can potentially fail due to configuration or SQL-related errors.
23
- */
24
- export declare function createDefaultPgSqlClientLayer(): Layer.Layer<SqlClient, ConfigError.ConfigError | SqlError>;
11
+ export type CheckServerIdentityFunction = (_hostname: string, _cert: PeerCertificate) => Error | undefined;
12
+ export declare function ignoreCheckServerIdentity(_hostname: string, _cert: PeerCertificate): Error | undefined;
13
+ export declare function resolveSslConfigDirect(defaultValue: SslConfig): Effect.Effect<Config.Config<SslConfig>, ConfigError.ConfigError>;
14
+ export declare function resolveSslConfigCaBundle(caBundleFilePath: string, checkServerIdentityFunction?: CheckServerIdentityFunction): Effect.Effect<Config.Config<SslConfig>, ConfigError.ConfigError, FileSystem.FileSystem>;
15
+ export declare function createDefaultPgSqlClientLayer(caBundleFilePath?: string, checkServerIdentityFunction?: CheckServerIdentityFunction): Layer.Layer<SqlClient | PgClient.PgClient, SqlError | ConfigError.ConfigError, FileSystem.FileSystem>;
25
16
  //# sourceMappingURL=lib.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/lib.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAU,KAAK,KAAK,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AAK/E,eAAO,MAAM,eAAe,kKAE3B,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;AAGpD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAclF;AAGD;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,CAS1G"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/lib.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAU,KAAK,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIlF,eAAO,MAAM,eAAe;;kEAM3B,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;AAGpD,MAAM,MAAM,2BAA2B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,KAAK,GAAG,SAAS,CAAC;AAE3G,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,KAAK,GAAG,SAAS,CAEtG;AAGD,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,SAAS,GACtB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAelE;AAGD,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,MAAM,EACxB,2BAA2B,CAAC,EAAE,2BAA2B,GACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,CAAC,CAYzF;AAGD,wBAAgB,6BAA6B,CAC3C,gBAAgB,CAAC,EAAE,MAAM,EACzB,2BAA2B,CAAC,EAAE,2BAA2B,GACxD,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,CAAC,CAiBvG"}
@@ -1,40 +1,38 @@
1
+ import { FileSystem } from '@effect/platform';
1
2
  import { PgClient } from '@effect/sql-pg';
2
- import { Config, ConfigError, Either, pipe, Schema } from 'effect';
3
+ import { Config, ConfigError, Effect, Either, Layer, pipe, Schema } from 'effect';
3
4
  import { TreeFormatter } from 'effect/ParseResult';
4
5
  // --------------------------------------------------------------------------
5
- export const SslConfigSchema = Schema.parseJson(Schema.Union(Schema.Boolean, Schema.Record({ key: Schema.String, value: Schema.Unknown })));
6
+ export const SslConfigSchema = Schema.parseJson(Schema.Union(Schema.Boolean, Schema.Struct({ ca: Schema.String }), Schema.Record({ key: Schema.String, value: Schema.Unknown })));
7
+ export function ignoreCheckServerIdentity(_hostname, _cert) {
8
+ return undefined;
9
+ }
6
10
  // --------------------------------------------------------------------------
7
- /**
8
- * Resolves the SSL configuration for the database by reading and decoding the `DATABASE_SSL` environment variable.
9
- * If the variable is not set or cannot be decoded, a default value will be applied.
10
- *
11
- * @param {SslConfig} [defaultValue=false] - The default SSL configuration to use if no valid configuration is provided.
12
- * @return {Config.Config<SslConfig>} A configuration object for the SSL configuration, derived from the environment variable or fallback value.
13
- */
14
- export function resolveSslConfig(defaultValue) {
11
+ export function resolveSslConfigDirect(defaultValue) {
15
12
  return Config.string('DATABASE_SSL')
16
13
  .pipe(Config.mapOrFail((str) => pipe(str, Schema.decodeUnknownEither(SslConfigSchema), Either.mapLeft((err) => ConfigError.InvalidData([], `[${str}]` + TreeFormatter.formatErrorSync(err))))))
17
- .pipe(Config.withDefault(defaultValue));
14
+ .pipe(Config.withDefault(defaultValue))
15
+ .pipe(Effect.succeed);
16
+ }
17
+ // --------------------------------------------------------------------------
18
+ export function resolveSslConfigCaBundle(caBundleFilePath, checkServerIdentityFunction) {
19
+ return pipe(FileSystem.FileSystem, Effect.flatMap((fs) => fs.readFileString(caBundleFilePath, 'utf8')), Effect.mapError((err) => ConfigError.InvalidData([], err.message)), Effect.map((ca) => Config.succeed({
20
+ ca,
21
+ checkServerIdentity: checkServerIdentityFunction,
22
+ })));
18
23
  }
19
24
  // --------------------------------------------------------------------------
20
- /**
21
- * Creates a default postgresql client layer configured using environment variables.
22
- *
23
- * The configuration includes parameters such as host, port, username, password,
24
- * database name, and SSL settings. These values are retrieved from the environment
25
- * or configuration system.
26
- *
27
- * @return {Layer.Layer<SqlClient, ConfigError.ConfigError | SqlError>} A layer encapsulating the
28
- * postgresql client, which can potentially fail due to configuration or SQL-related errors.
29
- */
30
- export function createDefaultPgSqlClientLayer() {
31
- return PgClient.layerConfig({
25
+ export function createDefaultPgSqlClientLayer(caBundleFilePath, checkServerIdentityFunction) {
26
+ const sslConfigEffect = caBundleFilePath
27
+ ? resolveSslConfigCaBundle(caBundleFilePath, checkServerIdentityFunction)
28
+ : resolveSslConfigDirect(false);
29
+ return Layer.unwrapEffect(Effect.map(sslConfigEffect, (sslConfig) => PgClient.layerConfig({
32
30
  host: Config.string('DATABASE_HOST'),
33
31
  port: Config.number('DATABASE_PORT'),
34
32
  username: Config.string('DATABASE_USER'),
35
33
  password: Config.redacted('DATABASE_PASSWORD'),
36
34
  database: Config.string('DATABASE_NAME'),
37
- ssl: resolveSslConfig(false),
38
- });
35
+ ssl: sslConfig,
36
+ })));
39
37
  }
40
38
  //# sourceMappingURL=lib.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/lib.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAc,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAC3F,CAAC;AAGF,6EAA6E;AAC7E;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAuB;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;SACjC,IAAI,CACH,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CACvB,IAAI,CACF,GAAG,EACH,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAe,EAAE,EAAE,CACjC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAC7E,CACF,CACF,CACF;SACA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,6EAA6E;AAC7E;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO,QAAQ,CAAC,WAAW,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACxC,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC;KAC7B,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/lib.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClF,OAAO,EAAmB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEpE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAC7C,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EACpC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAC7D,CACF,CAAC;AAMF,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,KAAsB;IACjF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CACpC,YAAuB;IAEvB,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;SACjC,IAAI,CACH,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CACvB,IAAI,CACF,GAAG,EACH,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAe,EAAE,EAAE,CACjC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAC7E,CACF,CACF,CACF;SACA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;SACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CACtC,gBAAwB,EACxB,2BAAyD;IAEzD,OAAO,IAAI,CACT,UAAU,CAAC,UAAU,EACrB,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,EACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAkB,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EACjF,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,MAAM,CAAC,OAAO,CAAC;QACb,EAAE;QACF,mBAAmB,EAAE,2BAA2B;KACjD,CAAC,CACH,CACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,6BAA6B,CAC3C,gBAAyB,EACzB,2BAAyD;IAEzD,MAAM,eAAe,GAAG,gBAAgB;QACtC,CAAC,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;QACzE,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAElC,OAAO,KAAK,CAAC,YAAY,CACvB,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,EAAE,CACxC,QAAQ,CAAC,WAAW,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QACxC,GAAG,EAAE,SAAS;KACf,CAAC,CACH,CACF,CAAC;AACJ,CAAC"}
@@ -1,8 +1,16 @@
1
- import { Effect, pipe } from 'effect';
1
+ import { NodeFileSystem } from '@effect/platform-node';
2
+ import { Effect, Layer, pipe } from 'effect';
2
3
  import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest';
3
4
  import * as unit from './lib.js';
5
+ import { ignoreCheckServerIdentity } from './lib.js';
4
6
  describe('middleware/sql-client-pg-init/lib', () => {
5
- describe('resolveSslConfig', () => {
7
+ describe('ignoreCheckServerIdentity', () => {
8
+ it('should always return undefined', async () => {
9
+ const actual = unit.ignoreCheckServerIdentity('test-host', 'test-cert');
10
+ expect(actual).toStrictEqual(undefined);
11
+ });
12
+ });
13
+ describe('resolveSslConfigDirect', () => {
6
14
  let _oldEnv;
7
15
  beforeAll(() => {
8
16
  _oldEnv = process.env;
@@ -16,30 +24,78 @@ describe('middleware/sql-client-pg-init/lib', () => {
16
24
  });
17
25
  it('should work as expected with boolean value', async () => {
18
26
  process.env.DATABASE_SSL = 'true';
19
- const actual = await pipe(unit.resolveSslConfig(false), Effect.runPromise);
27
+ const actual = await pipe(unit.resolveSslConfigDirect(false), Effect.flatMap((config) => config), Effect.runPromise);
20
28
  expect(actual).toEqual(true);
21
29
  });
22
30
  it('should work as expected with record value', async () => {
23
31
  process.env.DATABASE_SSL = '{ "rejectUnauthorized": false }';
24
- const actual = await pipe(unit.resolveSslConfig(false), Effect.runPromise);
32
+ const actual = await pipe(unit.resolveSslConfigDirect(false), Effect.flatMap((config) => config), Effect.runPromise);
25
33
  expect(actual).toStrictEqual({ rejectUnauthorized: false });
26
34
  });
27
35
  it('should work as expected with default value', async () => {
28
- const actual = await pipe(unit.resolveSslConfig({ foo: 123 }), Effect.runPromise);
36
+ const actual = await pipe(unit.resolveSslConfigDirect({ foo: 123 }), Effect.flatMap((config) => config), Effect.runPromise);
29
37
  expect(actual).toStrictEqual({ foo: 123 });
30
38
  });
31
39
  it('should work as expected with an invalid value', async () => {
32
40
  process.env.DATABASE_SSL = '123';
33
- const actual = async () => pipe(unit.resolveSslConfig(false), Effect.runPromise);
41
+ const actual = async () => pipe(unit.resolveSslConfigDirect(false), Effect.flatMap((config) => config), Effect.runPromise);
34
42
  await expect(actual).rejects.toThrow('Invalid data at DATABASE_SSL');
35
43
  });
36
44
  });
45
+ describe('resolveSslConfigCaBundle', () => {
46
+ it('should work as expected with a valid file path', async () => {
47
+ const actual = await pipe(unit.resolveSslConfigCaBundle(`${__dirname}/fixtures/test-ca-bundle.pem`), Effect.flatMap((config) => config), Effect.provide(NodeFileSystem.layer), Effect.runPromise);
48
+ expect(actual).toStrictEqual({ ca: 'test-ca-bundle-content', checkServerIdentity: undefined });
49
+ });
50
+ it('should work as expected with a valid file path and a checkServerIdentity function', async () => {
51
+ const actual = await pipe(unit.resolveSslConfigCaBundle(`${__dirname}/fixtures/test-ca-bundle.pem`, ignoreCheckServerIdentity), Effect.flatMap((config) => config), Effect.provide(NodeFileSystem.layer), Effect.runPromise);
52
+ expect(actual).toStrictEqual({ ca: 'test-ca-bundle-content', checkServerIdentity: ignoreCheckServerIdentity });
53
+ });
54
+ it('should fail with a non-existent file path', async () => {
55
+ const actual = async () => pipe(unit.resolveSslConfigCaBundle('/non-existent-path/ca-bundle.pem'), Effect.flatMap((config) => config), Effect.provide(NodeFileSystem.layer), Effect.runPromise);
56
+ await expect(actual).rejects.toThrow('ENOENT');
57
+ });
58
+ });
37
59
  describe('createDefaultPgSqlClientLayer', () => {
60
+ let _oldEnv;
61
+ beforeAll(() => {
62
+ _oldEnv = process.env;
63
+ process.env = {};
64
+ });
65
+ afterEach(() => {
66
+ process.env = {};
67
+ });
68
+ afterAll(() => {
69
+ process.env = _oldEnv;
70
+ });
38
71
  it('should work as expected', async () => {
39
72
  const layer = unit.createDefaultPgSqlClientLayer();
40
- // TODO: better assertion?
41
73
  expect(layer).toBeDefined();
42
74
  });
75
+ it('should attempt to build layer with config', async () => {
76
+ process.env.DATABASE_HOST = 'localhost';
77
+ process.env.DATABASE_PORT = '5432';
78
+ process.env.DATABASE_USER = 'test';
79
+ process.env.DATABASE_PASSWORD = 'test';
80
+ process.env.DATABASE_NAME = 'test';
81
+ const layer = unit.createDefaultPgSqlClientLayer();
82
+ // Building the layer will fail because there's no actual database,
83
+ // but this covers the PgClient.layerConfig code path
84
+ const actual = async () => pipe(layer, Layer.build, Effect.scoped, Effect.provide(NodeFileSystem.layer), Effect.runPromise);
85
+ await expect(actual).rejects.toThrow();
86
+ });
87
+ it('should attempt to build layer with ca bundle', async () => {
88
+ process.env.DATABASE_HOST = 'localhost';
89
+ process.env.DATABASE_PORT = '5432';
90
+ process.env.DATABASE_USER = 'test';
91
+ process.env.DATABASE_PASSWORD = 'test';
92
+ process.env.DATABASE_NAME = 'test';
93
+ const layer = unit.createDefaultPgSqlClientLayer(`${__dirname}/fixtures/test-ca-bundle.pem`);
94
+ // Building the layer will fail because there's no actual database,
95
+ // but this covers the PgClient.layerConfig code path with CA bundle
96
+ const actual = async () => pipe(layer, Layer.build, Effect.scoped, Effect.provide(NodeFileSystem.layer), Effect.runPromise);
97
+ await expect(actual).rejects.toThrow();
98
+ });
43
99
  });
44
100
  });
45
101
  //# sourceMappingURL=lib.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.test.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/lib.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9E,OAAO,KAAK,IAAI,MAAM,UAAU,CAAC;AAEjC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,IAAI,OAA0B,CAAC;QAC/B,SAAS,CAAC,GAAG,EAAE;YACb,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YACtB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,EAAE;YACb,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE;YACZ,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,iCAAiC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAE3E,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAElF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC;YACjC,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAEjF,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;YAEnD,0BAA0B;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"lib.test.js","sourceRoot":"","sources":["../../../../src/http/contrib/sqlClientInitPg/lib.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konker.dev/middleware-fp",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "author": "Konrad Markus <mail@konker.dev>",
6
6
  "license": "ISC",
@@ -235,6 +235,8 @@
235
235
  ],
236
236
  "peerDependencies": {
237
237
  "@aws-sdk/client-dynamodb": "^3.637.0",
238
+ "@effect/platform": "^0.94.1",
239
+ "@effect/platform-node": "^0.104.0",
238
240
  "@effect/sql": "^0.49.0",
239
241
  "@effect/sql-pg": "^0.50.1",
240
242
  "@gomomento/sdk": "^1.102.0",
@@ -246,11 +248,11 @@
246
248
  "@effect/sql-pg": "^0.50.1",
247
249
  "effect": "^3.19.14",
248
250
  "lesslog": "^1.0.2",
249
- "@konker.dev/tiny-auth-utils-fp": "0.1.12",
251
+ "@konker.dev/momento-cache-client-effect": "0.1.12",
252
+ "@konker.dev/tiny-error-fp": "0.1.12",
250
253
  "@konker.dev/tiny-cache-fp": "0.1.13",
251
254
  "@konker.dev/tiny-utils-fp": "0.1.13",
252
- "@konker.dev/tiny-error-fp": "0.1.12",
253
- "@konker.dev/momento-cache-client-effect": "0.1.12"
255
+ "@konker.dev/tiny-auth-utils-fp": "0.1.12"
254
256
  },
255
257
  "devDependencies": {
256
258
  "@arethetypeswrong/cli": "^0.18.2",