@rineex/pg-slonik 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,6 +12,7 @@
12
12
 
13
13
  - [Overview](#overview)
14
14
  - [Installation](#installation)
15
+ - [Slonik version and third-party interceptors](#slonik-version-and-third-party-interceptors)
15
16
  - [Quick Start](#quick-start)
16
17
  - [API Reference](#api-reference)
17
18
  - [Examples](#examples)
@@ -41,20 +42,66 @@ shutdown handling.
41
42
 
42
43
  ## Installation
43
44
 
45
+ Install the package and its **peer dependencies** (slonik and NestJS). Using the
46
+ same major version of slonik as this package avoids type errors with
47
+ interceptors (see
48
+ [Slonik version and third-party interceptors](#slonik-version-and-third-party-interceptors)).
49
+
44
50
  ```bash
45
- npm install @rineex/pg-slonik
46
- # or
47
- pnpm add @rineex/pg-slonik
48
- # or
49
- yarn add @rineex/pg-slonik
51
+ # npm
52
+ npm install @rineex/pg-slonik slonik@^48 @nestjs/common@^11
53
+
54
+ # pnpm
55
+ pnpm add @rineex/pg-slonik slonik@^48 @nestjs/common@^11
56
+
57
+ # yarn
58
+ yarn add @rineex/pg-slonik slonik@^48 @nestjs/common@^11
50
59
  ```
51
60
 
61
+ If you already have `@nestjs/common` and `slonik` in your app, ensure they
62
+ satisfy the peer ranges (`@nestjs/common` ^11.0.0, `slonik` ^48.0.0). Your
63
+ package manager will warn if versions are incompatible.
64
+
52
65
  ### Requirements
53
66
 
54
67
  - **Node.js**: 18.0 or higher
55
68
  - **TypeScript**: 5.0 or higher (recommended: 5.9+)
56
69
  - **PostgreSQL**: 12.0 or higher
57
70
  - **@nestjs/common**: 11.0 or higher
71
+ - **slonik**: ^48.0.0 (this package pins slonik 48.x)
72
+
73
+ ### Slonik version and third-party interceptors
74
+
75
+ This package depends on **slonik ^48**. If you use third-party interceptors
76
+ (e.g.
77
+ [slonik-interceptor-field-name-transformation](https://www.npmjs.com/package/slonik-interceptor-field-name-transformation)),
78
+ they **must** target the same slonik major version.
79
+
80
+ If your app or another dependency pulls in a different slonik major (e.g. 39.x),
81
+ you will see a TypeScript error like:
82
+
83
+ ```text
84
+ Type 'Interceptor' is not assignable to type 'Interceptor'.
85
+ Types of property 'afterPoolConnection' are incompatible.
86
+ ...
87
+ Type 'QuerySqlToken<T>' is not assignable to type 'QuerySqlToken<ZodType<...>>'.
88
+ ```
89
+
90
+ That happens because `Interceptor` and `CommonQueryMethods` changed between
91
+ slonik 39 (Zod-based) and 48 (different schema types). Two copies of slonik
92
+ means two incompatible `Interceptor` types.
93
+
94
+ **Fix:** Use a single slonik 48 everywhere. Install slonik and any slonik-based
95
+ interceptors with the same major as this package:
96
+
97
+ ```bash
98
+ pnpm add slonik@^48 slonik-interceptor-field-name-transformation@^48
99
+ ```
100
+
101
+ In a pnpm/yarn workspace, ensure the app that uses `@rineex/pg-slonik` and the
102
+ interceptors resolves to one slonik 48 (e.g. list the example app in the
103
+ workspace and use `slonik: "^48.0.0"` in that app’s `package.json` so the
104
+ lockfile deduplicates to a single version).
58
105
 
59
106
  ## Quick Start
60
107
 
package/dist/index.d.mts CHANGED
@@ -2,31 +2,66 @@ import * as _nestjs_common from '@nestjs/common';
2
2
  import { OnApplicationShutdown, DynamicModule } from '@nestjs/common';
3
3
  import { ClientConfigurationInput } from 'slonik';
4
4
 
5
+ /**
6
+ * Parameter decorator that injects the Slonik DatabasePool for the given connection name.
7
+ *
8
+ * @param name - Connection name (default: 'DEFAULT'). Must match a name in SlonikModule.register().
9
+ * @returns Nest parameter decorator that injects DatabasePool.
10
+ *
11
+ * @example
12
+ * constructor(@InjectPool() private readonly pool: DatabasePool) {}
13
+ * constructor(@InjectPool('replica') private readonly replica: DatabasePool) {}
14
+ */
5
15
  declare function InjectPool(name?: string): PropertyDecorator & ParameterDecorator;
6
16
 
17
+ /** Connection name used for DI token and logging. Uppercased in token. */
7
18
  type SlonikConnectionName = string;
19
+ /** Tag type for connection metadata. */
8
20
  type SlonikConnectionTags = string;
21
+ /**
22
+ * Configuration for a single Slonik connection.
23
+ * Passed to Slonik's createPool(dsn, options).
24
+ */
9
25
  interface SlonikConnectionConfig {
26
+ /** Unique name for this connection (used for InjectPool and token). */
10
27
  name: SlonikConnectionName;
28
+ /** Slonik client options (interceptors, typeParsers, timeouts, etc.). */
11
29
  options?: ClientConfigurationInput;
30
+ /** PostgreSQL connection URI (DSN). */
12
31
  dsn: string;
32
+ /** Optional tags for connection metadata. */
13
33
  tags?: SlonikConnectionTags[];
14
34
  }
35
+ /** Options for SlonikModule.register(); requires at least one connection. */
15
36
  interface SlonikModuleOptions {
16
37
  connections: SlonikConnectionConfig[];
17
38
  }
39
+ /** Extra options for configurable module (e.g. global registration). */
18
40
  interface SlonikModuleExtraOptions {
19
41
  isGlobal?: boolean;
20
42
  }
21
43
 
44
+ /** Configurable module builder: base class, options token, and option types for register/registerAsync. */
22
45
  declare const SlonikCoreModule: _nestjs_common.ConfigurableModuleCls<SlonikModuleOptions, "register", "create", SlonikModuleExtraOptions>;
23
46
  declare const MODULE_OPTIONS_TOKEN: string | symbol;
24
47
  declare const OPTIONS_TYPE: SlonikModuleOptions & Partial<SlonikModuleExtraOptions>;
25
48
  declare const ASYNC_OPTIONS_TYPE: _nestjs_common.ConfigurableModuleAsyncOptions<SlonikModuleOptions, "create"> & Partial<SlonikModuleExtraOptions>;
26
49
 
50
+ /**
51
+ * NestJS module that provides one or more Slonik PostgreSQL pools as injectable providers.
52
+ * Each connection is created with retries; pools are closed on application shutdown.
53
+ */
27
54
  declare class SlonikModule extends SlonikCoreModule implements OnApplicationShutdown {
28
55
  private static pools;
56
+ /**
57
+ * Registers the module with the given connections. One provider (pool) per connection;
58
+ * inject via InjectPool(name).
59
+ *
60
+ * @param options - Module options; must include connections array.
61
+ * @returns DynamicModule with providers and exports for each connection token.
62
+ */
29
63
  static register(options: typeof OPTIONS_TYPE): DynamicModule;
64
+ /** Ends all pools created by this module. Called by Nest on shutdown. */
30
65
  onApplicationShutdown(): Promise<void>;
31
66
  }
32
67
 
package/dist/index.d.ts CHANGED
@@ -2,31 +2,66 @@ import * as _nestjs_common from '@nestjs/common';
2
2
  import { OnApplicationShutdown, DynamicModule } from '@nestjs/common';
3
3
  import { ClientConfigurationInput } from 'slonik';
4
4
 
5
+ /**
6
+ * Parameter decorator that injects the Slonik DatabasePool for the given connection name.
7
+ *
8
+ * @param name - Connection name (default: 'DEFAULT'). Must match a name in SlonikModule.register().
9
+ * @returns Nest parameter decorator that injects DatabasePool.
10
+ *
11
+ * @example
12
+ * constructor(@InjectPool() private readonly pool: DatabasePool) {}
13
+ * constructor(@InjectPool('replica') private readonly replica: DatabasePool) {}
14
+ */
5
15
  declare function InjectPool(name?: string): PropertyDecorator & ParameterDecorator;
6
16
 
17
+ /** Connection name used for DI token and logging. Uppercased in token. */
7
18
  type SlonikConnectionName = string;
19
+ /** Tag type for connection metadata. */
8
20
  type SlonikConnectionTags = string;
21
+ /**
22
+ * Configuration for a single Slonik connection.
23
+ * Passed to Slonik's createPool(dsn, options).
24
+ */
9
25
  interface SlonikConnectionConfig {
26
+ /** Unique name for this connection (used for InjectPool and token). */
10
27
  name: SlonikConnectionName;
28
+ /** Slonik client options (interceptors, typeParsers, timeouts, etc.). */
11
29
  options?: ClientConfigurationInput;
30
+ /** PostgreSQL connection URI (DSN). */
12
31
  dsn: string;
32
+ /** Optional tags for connection metadata. */
13
33
  tags?: SlonikConnectionTags[];
14
34
  }
35
+ /** Options for SlonikModule.register(); requires at least one connection. */
15
36
  interface SlonikModuleOptions {
16
37
  connections: SlonikConnectionConfig[];
17
38
  }
39
+ /** Extra options for configurable module (e.g. global registration). */
18
40
  interface SlonikModuleExtraOptions {
19
41
  isGlobal?: boolean;
20
42
  }
21
43
 
44
+ /** Configurable module builder: base class, options token, and option types for register/registerAsync. */
22
45
  declare const SlonikCoreModule: _nestjs_common.ConfigurableModuleCls<SlonikModuleOptions, "register", "create", SlonikModuleExtraOptions>;
23
46
  declare const MODULE_OPTIONS_TOKEN: string | symbol;
24
47
  declare const OPTIONS_TYPE: SlonikModuleOptions & Partial<SlonikModuleExtraOptions>;
25
48
  declare const ASYNC_OPTIONS_TYPE: _nestjs_common.ConfigurableModuleAsyncOptions<SlonikModuleOptions, "create"> & Partial<SlonikModuleExtraOptions>;
26
49
 
50
+ /**
51
+ * NestJS module that provides one or more Slonik PostgreSQL pools as injectable providers.
52
+ * Each connection is created with retries; pools are closed on application shutdown.
53
+ */
27
54
  declare class SlonikModule extends SlonikCoreModule implements OnApplicationShutdown {
28
55
  private static pools;
56
+ /**
57
+ * Registers the module with the given connections. One provider (pool) per connection;
58
+ * inject via InjectPool(name).
59
+ *
60
+ * @param options - Module options; must include connections array.
61
+ * @returns DynamicModule with providers and exports for each connection token.
62
+ */
29
63
  static register(options: typeof OPTIONS_TYPE): DynamicModule;
64
+ /** Ends all pools created by this module. Called by Nest on shutdown. */
30
65
  onApplicationShutdown(): Promise<void>;
31
66
  }
32
67
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var u=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var y=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable;var S=(t,o,e)=>o in t?u(t,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[o]=e,E=(t,o)=>{for(var e in o||(o={}))y.call(o,e)&&S(t,e,o[e]);if(b)for(var e of b(o))D.call(o,e)&&S(t,e,o[e]);return t};var I=(t,o)=>{for(var e in o)u(t,e,{get:o[e],enumerable:!0})},h=(t,o,e,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of w(o))!y.call(t,r)&&r!==e&&u(t,r,{get:()=>o[r],enumerable:!(n=_(o,r))||n.enumerable});return t};var F=t=>h(u({},"__esModule",{value:!0}),t),g=(t,o,e,n)=>{for(var r=n>1?void 0:n?_(o,e):o,l=t.length-1,i;l>=0;l--)(i=t[l])&&(r=(n?i(o,e,r):i(r))||r);return n&&r&&u(o,e,r),r};var d=(t,o,e)=>new Promise((n,r)=>{var l=a=>{try{s(e.next(a))}catch(O){r(O)}},i=a=>{try{s(e.throw(a))}catch(O){r(O)}},s=a=>a.done?n(a.value):Promise.resolve(a.value).then(l,i);s((e=e.apply(t,o)).next())});var G={};I(G,{ASYNC_OPTIONS_TYPE:()=>$,InjectPool:()=>U,MODULE_OPTIONS_TOKEN:()=>Y,OPTIONS_TYPE:()=>j,SlonikCoreModule:()=>T,SlonikModule:()=>m});module.exports=F(G);var N=require("@nestjs/common");var k="__SLONIK_%s_POOL__",c="DEFAULT";var x=require("@nestjs/common"),P=require("util"),p=require("rxjs"),L=require("slonik");var f=(t=c)=>(0,P.format)(k,t.toUpperCase()),v=new x.Logger("SlonikModule");function C({dsn:t,name:o,options:e}){let n=f(o);return(0,p.lastValueFrom)((0,p.defer)(()=>d(null,null,function*(){let r=yield(0,L.createPool)(t,e);return yield r.connect(()=>Promise.resolve()).then(()=>{v.log(`Connected to database ${n}`)}),r})).pipe(K()))}function K(t=9,o=3e3,e=c,n=!1,r){return l=>l.pipe((0,p.retry)({count:t,delay:(i,s)=>{if(r&&!r(i))return(0,p.throwError)(()=>i);let a=e===c?"":` (${e})`,O=n?` Message: ${i.message}.`:"";return v.error((0,P.format)("unable to connect to the database#%s.%s Retrying (%s)",a,O,s),i.stack),(0,p.of)(null).pipe((0,p.delay)(o))}}))}function U(t=c){return(0,N.Inject)(f(t))}var A=require("@nestjs/common");var M=require("@nestjs/common");var{ConfigurableModuleClass:T,MODULE_OPTIONS_TOKEN:Y,OPTIONS_TYPE:j,ASYNC_OPTIONS_TYPE:$}=new M.ConfigurableModuleBuilder().setExtras({isGlobal:!0},(t,o)=>E({global:o.isGlobal},t)).build();var m=class extends T{static register(o){var l,i;let{connections:e}=o,n=super.register(o);(l=n.providers)!=null||(n.providers=[]),(i=n.exports)!=null||(n.exports=[]);let r=e.map(s=>({provide:f(s.name),useFactory:()=>d(this,null,function*(){let a=yield C({dsn:s.dsn,options:s.options,name:s.name});return this.pools.set(s.name,a),a})}));return n.providers.push(...r),n.exports.push(...e.map(s=>f(s.name))),n}onApplicationShutdown(){return d(this,null,function*(){yield Promise.allSettled(Array.from(m.pools.values()).map(o=>o.end()))})}};m.pools=new Map,m=g([(0,A.Module)({})],m);0&&(module.exports={ASYNC_OPTIONS_TYPE,InjectPool,MODULE_OPTIONS_TOKEN,OPTIONS_TYPE,SlonikCoreModule,SlonikModule});
1
+ var u=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames,S=Object.getOwnPropertySymbols;var g=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var E=(t,o,e)=>o in t?u(t,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[o]=e,k=(t,o)=>{for(var e in o||(o={}))g.call(o,e)&&E(t,e,o[e]);if(S)for(var e of S(o))I.call(o,e)&&E(t,e,o[e]);return t};var h=(t,o)=>{for(var e in o)u(t,e,{get:o[e],enumerable:!0})},F=(t,o,e,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of D(o))!g.call(t,r)&&r!==e&&u(t,r,{get:()=>o[r],enumerable:!(n=_(o,r))||n.enumerable});return t};var K=t=>F(u({},"__esModule",{value:!0}),t),y=(t,o,e,n)=>{for(var r=n>1?void 0:n?_(o,e):o,l=t.length-1,s;l>=0;l--)(s=t[l])&&(r=(n?s(o,e,r):s(r))||r);return n&&r&&u(o,e,r),r};var d=(t,o,e)=>new Promise((n,r)=>{var l=a=>{try{i(e.next(a))}catch(c){r(c)}},s=a=>{try{i(e.throw(a))}catch(c){r(c)}},i=a=>a.done?n(a.value):Promise.resolve(a.value).then(l,s);i((e=e.apply(t,o)).next())});var B={};h(B,{ASYNC_OPTIONS_TYPE:()=>G,InjectPool:()=>Y,MODULE_OPTIONS_TOKEN:()=>j,OPTIONS_TYPE:()=>$,SlonikCoreModule:()=>T,SlonikModule:()=>m});module.exports=K(B);var N=require("@nestjs/common");var x="__SLONIK_%s_POOL__",f="DEFAULT";var L=require("@nestjs/common"),P=require("util"),p=require("rxjs"),v=require("slonik");var O=(t=f)=>(0,P.format)(x,t.toUpperCase()),C=new L.Logger("SlonikModule");function M({dsn:t,name:o,options:e}){let n=O(o);return(0,p.lastValueFrom)((0,p.defer)(()=>d(null,null,function*(){let r=yield(0,v.createPool)(t,e);return yield r.connect(()=>Promise.resolve()).then(()=>{C.log(`Connected to database ${n}`)}),r})).pipe(U()))}function U(t=9,o=3e3,e=f,n=!1,r){return l=>l.pipe((0,p.retry)({count:t,delay:(s,i)=>{if(r&&!r(s))return(0,p.throwError)(()=>s);let a=e===f?"":` (${e})`,c=s instanceof Error?s.message:String(s),b=n?` Message: ${c}.`:"";return C.error((0,P.format)("unable to connect to the database#%s.%s Retrying (%s)%s",a,b,i,b?"":` Error: ${c}`)),(0,p.of)(null).pipe((0,p.delay)(o))}}))}function Y(t=f){return(0,N.Inject)(O(t))}var A=require("@nestjs/common");var w=require("@nestjs/common");var{ConfigurableModuleClass:T,MODULE_OPTIONS_TOKEN:j,OPTIONS_TYPE:$,ASYNC_OPTIONS_TYPE:G}=new w.ConfigurableModuleBuilder().setExtras({isGlobal:!0},(t,o)=>k({global:o.isGlobal},t)).build();var m=class extends T{static register(o){var l,s;let{connections:e}=o,n=super.register(o);(l=n.providers)!=null||(n.providers=[]),(s=n.exports)!=null||(n.exports=[]);let r=e.map(i=>({provide:O(i.name),useFactory:()=>d(this,null,function*(){let a=yield M({dsn:i.dsn,options:i.options,name:i.name});return this.pools.set(i.name,a),a})}));return n.providers.push(...r),n.exports.push(...e.map(i=>O(i.name))),n}onApplicationShutdown(){return d(this,null,function*(){yield Promise.allSettled(Array.from(m.pools.values()).map(o=>o.end()))})}};m.pools=new Map,m=y([(0,A.Module)({})],m);0&&(module.exports={ASYNC_OPTIONS_TYPE,InjectPool,MODULE_OPTIONS_TOKEN,OPTIONS_TYPE,SlonikCoreModule,SlonikModule});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/slonik.decorator.ts","../src/constants/index.ts","../src/slonik.util.ts","../src/slonik.module.ts","../src/slonik.module-definition.ts"],"sourcesContent":["export * from './slonik.decorator';\nexport * from './slonik.module';\nexport * from './slonik.module-definition';\n","import { Inject } from '@nestjs/common';\n\nimport { DEFAULT_POOL_NAME } from './constants';\nimport { createSlonikToken } from './slonik.util';\n\nexport function InjectPool(name = DEFAULT_POOL_NAME) {\n return Inject(createSlonikToken(name));\n}\n","/**\n * The token for the Slonik pool\n * @example `createSlonikToken('DEFAULT')` will return '__SLONIK_DEFAULT_POOL__'\n */\nexport const SLONIK_POOL_TOKEN = '__SLONIK_%s_POOL__';\n\n/**\n * The default name for the Slonik pool\n */\nexport const DEFAULT_POOL_NAME = 'DEFAULT';\n","import type { Observable } from 'rxjs';\nimport type { DatabasePool } from 'slonik';\n\nimport { Logger } from '@nestjs/common';\nimport { format } from 'node:util';\nimport { defer, delay, lastValueFrom, of, retry, throwError } from 'rxjs';\nimport { createPool } from 'slonik';\n\nimport type { SlonikConnectionConfig } from './slonik.interface';\n\nimport { DEFAULT_POOL_NAME, SLONIK_POOL_TOKEN } from './constants';\n\nexport const createSlonikToken = (name: string = DEFAULT_POOL_NAME) =>\n format(SLONIK_POOL_TOKEN, name.toUpperCase());\n\nconst logger = new Logger('SlonikModule');\n\nexport function createSlonikConnection({\n dsn,\n name,\n options,\n}: SlonikConnectionConfig): Promise<DatabasePool> {\n const token = createSlonikToken(name);\n\n return lastValueFrom(\n defer(async () => {\n const pool = await createPool(dsn, options);\n\n await pool\n .connect(() => Promise.resolve())\n .then(() => {\n logger.log(`Connected to database ${token}`);\n });\n return pool;\n }).pipe(handleRetry()),\n );\n}\n\nexport function handleRetry(\n retryAttempts = 9,\n retryDelay = 3000,\n poolName = DEFAULT_POOL_NAME,\n verboseRetryLog = false,\n toRetry?: (err: any) => boolean,\n): <T>(source: Observable<T>) => Observable<T> {\n return <T>(source: Observable<T>) =>\n source.pipe(\n retry({\n count: retryAttempts,\n delay: (error, retryCount) => {\n if (toRetry && !toRetry(error)) {\n return throwError(() => error);\n }\n\n const poolInfo =\n poolName === DEFAULT_POOL_NAME ? '' : ` (${poolName})`;\n const verboseMessage = verboseRetryLog\n ? ` Message: ${error.message}.`\n : '';\n\n logger.error(\n format(\n 'unable to connect to the database#%s.%s Retrying (%s)',\n poolInfo,\n verboseMessage,\n retryCount,\n ),\n error.stack,\n );\n\n return of(null).pipe(delay(retryDelay));\n },\n }),\n );\n}\n","import type {\n DynamicModule,\n OnApplicationShutdown,\n Provider,\n} from '@nestjs/common';\nimport type { DatabasePool } from 'slonik';\n\nimport { Module } from '@nestjs/common';\n\nimport type { OPTIONS_TYPE } from './slonik.module-definition';\n\nimport { SlonikCoreModule } from './slonik.module-definition';\nimport { createSlonikConnection, createSlonikToken } from './slonik.util';\n\n@Module({})\nexport class SlonikModule\n extends SlonikCoreModule\n implements OnApplicationShutdown\n{\n private static pools = new Map<string, DatabasePool>();\n\n static register(options: typeof OPTIONS_TYPE): DynamicModule {\n const { connections } = options;\n\n const module = super.register(options);\n\n module.providers ??= [];\n module.exports ??= [];\n\n const providers: Provider[] = connections.map(conn => ({\n provide: createSlonikToken(conn.name),\n useFactory: async () => {\n const connection = await createSlonikConnection({\n dsn: conn.dsn,\n options: conn.options,\n name: conn.name,\n });\n this.pools.set(conn.name, connection);\n return connection;\n },\n }));\n\n module.providers.push(...providers);\n module.exports.push(...connections.map(c => createSlonikToken(c.name)));\n\n return module;\n }\n\n async onApplicationShutdown() {\n await Promise.allSettled(\n Array.from(SlonikModule.pools.values()).map(pool => pool.end()),\n );\n }\n}\n","import { ConfigurableModuleBuilder } from '@nestjs/common';\n\nimport type {\n SlonikModuleExtraOptions,\n SlonikModuleOptions,\n} from './slonik.interface';\n\nexport const {\n ConfigurableModuleClass: SlonikCoreModule,\n MODULE_OPTIONS_TOKEN,\n OPTIONS_TYPE,\n ASYNC_OPTIONS_TYPE,\n} = new ConfigurableModuleBuilder<SlonikModuleOptions>()\n .setExtras<SlonikModuleExtraOptions>(\n {\n isGlobal: true,\n },\n (definition, extra) => {\n return { global: extra.isGlobal, ...definition };\n },\n )\n .build();\n"],"mappings":"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","names":["index_exports","__export","ASYNC_OPTIONS_TYPE","InjectPool","MODULE_OPTIONS_TOKEN","OPTIONS_TYPE","SlonikCoreModule","SlonikModule","__toCommonJS","import_common","SLONIK_POOL_TOKEN","DEFAULT_POOL_NAME","import_common","import_node_util","import_rxjs","import_slonik","createSlonikToken","name","DEFAULT_POOL_NAME","SLONIK_POOL_TOKEN","logger","createSlonikConnection","dsn","options","token","__async","pool","handleRetry","retryAttempts","retryDelay","poolName","verboseRetryLog","toRetry","source","error","retryCount","poolInfo","verboseMessage","InjectPool","name","DEFAULT_POOL_NAME","createSlonikToken","import_common","import_common","SlonikCoreModule","MODULE_OPTIONS_TOKEN","OPTIONS_TYPE","ASYNC_OPTIONS_TYPE","definition","extra","__spreadValues","SlonikModule","SlonikCoreModule","options","_a","_b","connections","module","providers","conn","createSlonikToken","__async","connection","createSlonikConnection","c","pool","__decorateClass"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/slonik.decorator.ts","../src/constants/index.ts","../src/slonik.util.ts","../src/slonik.module.ts","../src/slonik.module-definition.ts"],"sourcesContent":["export * from './slonik.decorator';\nexport * from './slonik.module';\nexport * from './slonik.module-definition';\n","import { Inject } from '@nestjs/common';\n\nimport { DEFAULT_POOL_NAME } from './constants';\nimport { createSlonikToken } from './slonik.util';\n\n/**\n * Parameter decorator that injects the Slonik DatabasePool for the given connection name.\n *\n * @param name - Connection name (default: 'DEFAULT'). Must match a name in SlonikModule.register().\n * @returns Nest parameter decorator that injects DatabasePool.\n *\n * @example\n * constructor(@InjectPool() private readonly pool: DatabasePool) {}\n * constructor(@InjectPool('replica') private readonly replica: DatabasePool) {}\n */\nexport function InjectPool(name = DEFAULT_POOL_NAME) {\n return Inject(createSlonikToken(name));\n}\n","/**\n * The token for the Slonik pool\n * @example `createSlonikToken('DEFAULT')` will return '__SLONIK_DEFAULT_POOL__'\n */\nexport const SLONIK_POOL_TOKEN = '__SLONIK_%s_POOL__';\n\n/**\n * The default name for the Slonik pool\n */\nexport const DEFAULT_POOL_NAME = 'DEFAULT';\n","import type { Observable } from 'rxjs';\nimport type { DatabasePool } from 'slonik';\n\nimport { Logger } from '@nestjs/common';\nimport { format } from 'node:util';\nimport { defer, delay, lastValueFrom, of, retry, throwError } from 'rxjs';\nimport { createPool } from 'slonik';\n\nimport type { SlonikConnectionConfig } from './slonik.interface';\n\nimport { DEFAULT_POOL_NAME, SLONIK_POOL_TOKEN } from './constants';\n\n/**\n * Builds the Nest injection token for a named Slonik pool.\n *\n * @param name - Connection name (default: DEFAULT_POOL_NAME). Normalized to uppercase in token.\n * @returns Token string, e.g. '__SLONIK_DEFAULT_POOL__'.\n */\nexport const createSlonikToken = (name: string = DEFAULT_POOL_NAME) =>\n format(SLONIK_POOL_TOKEN, name.toUpperCase());\n\nconst logger = new Logger('SlonikModule');\n\n/**\n * Creates a Slonik pool, verifies connectivity with pool.connect(), and retries on failure.\n * Options (including interceptors) are passed through to createPool.\n *\n * @param config - Connection config (name, dsn, optional options).\n * @returns Promise resolving to the Slonik DatabasePool.\n * @throws If connection or verification fails after all retries.\n */\nexport function createSlonikConnection({\n dsn,\n name,\n options,\n}: SlonikConnectionConfig): Promise<DatabasePool> {\n const token = createSlonikToken(name);\n\n return lastValueFrom(\n defer(async () => {\n const pool = await createPool(dsn, options);\n\n await pool\n .connect(() => Promise.resolve())\n .then(() => {\n logger.log(`Connected to database ${token}`);\n });\n return pool;\n }).pipe(handleRetry()),\n );\n}\n\n/**\n * RxJS operator that retries the source observable on error (e.g. connection failure).\n * Logs each retry via SlonikModule logger. Optional predicate controls which errors are retried.\n *\n * @param retryAttempts - Max retry count (default 9).\n * @param retryDelay - Delay in ms between retries (default 3000).\n * @param poolName - Name used in log messages (default DEFAULT_POOL_NAME).\n * @param verboseRetryLog - If true, include error message in logs.\n * @param toRetry - Optional (err) => boolean; retry only when true. Omit to retry all errors.\n * @returns RxJS operator function.\n */\nexport function handleRetry(\n retryAttempts = 9,\n retryDelay = 3000,\n poolName = DEFAULT_POOL_NAME,\n verboseRetryLog = false,\n toRetry?: (err: unknown) => boolean,\n): <T>(source: Observable<T>) => Observable<T> {\n return <T>(source: Observable<T>) =>\n source.pipe(\n retry({\n count: retryAttempts,\n delay: (error: unknown, retryCount) => {\n if (toRetry && !toRetry(error)) {\n return throwError(() => error);\n }\n\n const poolInfo =\n poolName === DEFAULT_POOL_NAME ? '' : ` (${poolName})`;\n const errMessage =\n error instanceof Error ? error.message : String(error);\n const verboseMessage = verboseRetryLog\n ? ` Message: ${errMessage}.`\n : '';\n\n logger.error(\n format(\n 'unable to connect to the database#%s.%s Retrying (%s)%s',\n poolInfo,\n verboseMessage,\n retryCount,\n verboseMessage ? '' : ` Error: ${errMessage}`,\n ),\n );\n\n return of(null).pipe(delay(retryDelay));\n },\n }),\n );\n}\n","import type {\n DynamicModule,\n OnApplicationShutdown,\n Provider,\n} from '@nestjs/common';\nimport type { DatabasePool } from 'slonik';\n\nimport { Module } from '@nestjs/common';\n\nimport type { OPTIONS_TYPE } from './slonik.module-definition';\n\nimport { SlonikCoreModule } from './slonik.module-definition';\nimport { createSlonikConnection, createSlonikToken } from './slonik.util';\n\n/**\n * NestJS module that provides one or more Slonik PostgreSQL pools as injectable providers.\n * Each connection is created with retries; pools are closed on application shutdown.\n */\n@Module({})\nexport class SlonikModule\n extends SlonikCoreModule\n implements OnApplicationShutdown\n{\n private static pools = new Map<string, DatabasePool>();\n\n /**\n * Registers the module with the given connections. One provider (pool) per connection;\n * inject via InjectPool(name).\n *\n * @param options - Module options; must include connections array.\n * @returns DynamicModule with providers and exports for each connection token.\n */\n static register(options: typeof OPTIONS_TYPE): DynamicModule {\n const { connections } = options;\n\n const module = super.register(options);\n\n module.providers ??= [];\n module.exports ??= [];\n\n const providers: Provider[] = connections.map(conn => ({\n provide: createSlonikToken(conn.name),\n useFactory: async () => {\n const connection = await createSlonikConnection({\n dsn: conn.dsn,\n options: conn.options,\n name: conn.name,\n });\n this.pools.set(conn.name, connection);\n return connection;\n },\n }));\n\n module.providers.push(...providers);\n module.exports.push(...connections.map(c => createSlonikToken(c.name)));\n\n return module;\n }\n\n /** Ends all pools created by this module. Called by Nest on shutdown. */\n async onApplicationShutdown() {\n await Promise.allSettled(\n Array.from(SlonikModule.pools.values()).map(pool => pool.end()),\n );\n }\n}\n","import { ConfigurableModuleBuilder } from '@nestjs/common';\n\nimport type {\n SlonikModuleExtraOptions,\n SlonikModuleOptions,\n} from './slonik.interface';\n\n/** Configurable module builder: base class, options token, and option types for register/registerAsync. */\nexport const {\n ConfigurableModuleClass: SlonikCoreModule,\n MODULE_OPTIONS_TOKEN,\n OPTIONS_TYPE,\n ASYNC_OPTIONS_TYPE,\n} = new ConfigurableModuleBuilder<SlonikModuleOptions>()\n .setExtras<SlonikModuleExtraOptions>(\n {\n isGlobal: true,\n },\n (definition, extra) => {\n return { global: extra.isGlobal, ...definition };\n },\n )\n .build();\n"],"mappings":"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","names":["index_exports","__export","ASYNC_OPTIONS_TYPE","InjectPool","MODULE_OPTIONS_TOKEN","OPTIONS_TYPE","SlonikCoreModule","SlonikModule","__toCommonJS","import_common","SLONIK_POOL_TOKEN","DEFAULT_POOL_NAME","import_common","import_node_util","import_rxjs","import_slonik","createSlonikToken","name","DEFAULT_POOL_NAME","SLONIK_POOL_TOKEN","logger","createSlonikConnection","dsn","options","token","__async","pool","handleRetry","retryAttempts","retryDelay","poolName","verboseRetryLog","toRetry","source","error","retryCount","poolInfo","errMessage","verboseMessage","InjectPool","name","DEFAULT_POOL_NAME","createSlonikToken","import_common","import_common","SlonikCoreModule","MODULE_OPTIONS_TOKEN","OPTIONS_TYPE","ASYNC_OPTIONS_TYPE","definition","extra","__spreadValues","SlonikModule","SlonikCoreModule","options","_a","_b","connections","module","providers","conn","createSlonikToken","__async","connection","createSlonikConnection","c","pool","__decorateClass"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var P=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertySymbols;var x=Object.prototype.hasOwnProperty,L=Object.prototype.propertyIsEnumerable;var d=(t,o,e)=>o in t?P(t,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[o]=e,T=(t,o)=>{for(var e in o||(o={}))x.call(o,e)&&d(t,e,o[e]);if(u)for(var e of u(o))L.call(o,e)&&d(t,e,o[e]);return t};var b=(t,o,e,r)=>{for(var n=r>1?void 0:r?k(o,e):o,p=t.length-1,i;p>=0;p--)(i=t[p])&&(n=(r?i(o,e,n):i(n))||n);return r&&n&&P(o,e,n),n};var O=(t,o,e)=>new Promise((r,n)=>{var p=a=>{try{s(e.next(a))}catch(f){n(f)}},i=a=>{try{s(e.throw(a))}catch(f){n(f)}},s=a=>a.done?r(a.value):Promise.resolve(a.value).then(p,i);s((e=e.apply(t,o)).next())});import{Inject as F}from"@nestjs/common";var S="__SLONIK_%s_POOL__",m="DEFAULT";import{Logger as v}from"@nestjs/common";import{format as _}from"util";import{defer as C,delay as N,lastValueFrom as M,of as A,retry as w,throwError as D}from"rxjs";import{createPool as I}from"slonik";var c=(t=m)=>_(S,t.toUpperCase()),y=new v("SlonikModule");function E({dsn:t,name:o,options:e}){let r=c(o);return M(C(()=>O(null,null,function*(){let n=yield I(t,e);return yield n.connect(()=>Promise.resolve()).then(()=>{y.log(`Connected to database ${r}`)}),n})).pipe(h()))}function h(t=9,o=3e3,e=m,r=!1,n){return p=>p.pipe(w({count:t,delay:(i,s)=>{if(n&&!n(i))return D(()=>i);let a=e===m?"":` (${e})`,f=r?` Message: ${i.message}.`:"";return y.error(_("unable to connect to the database#%s.%s Retrying (%s)",a,f,s),i.stack),A(null).pipe(N(o))}}))}function W(t=m){return F(c(t))}import{Module as U}from"@nestjs/common";import{ConfigurableModuleBuilder as K}from"@nestjs/common";var{ConfigurableModuleClass:g,MODULE_OPTIONS_TOKEN:oo,OPTIONS_TYPE:eo,ASYNC_OPTIONS_TYPE:to}=new K().setExtras({isGlobal:!0},(t,o)=>T({global:o.isGlobal},t)).build();var l=class extends g{static register(o){var p,i;let{connections:e}=o,r=super.register(o);(p=r.providers)!=null||(r.providers=[]),(i=r.exports)!=null||(r.exports=[]);let n=e.map(s=>({provide:c(s.name),useFactory:()=>O(this,null,function*(){let a=yield E({dsn:s.dsn,options:s.options,name:s.name});return this.pools.set(s.name,a),a})}));return r.providers.push(...n),r.exports.push(...e.map(s=>c(s.name))),r}onApplicationShutdown(){return O(this,null,function*(){yield Promise.allSettled(Array.from(l.pools.values()).map(o=>o.end()))})}};l.pools=new Map,l=b([U({})],l);export{to as ASYNC_OPTIONS_TYPE,W as InjectPool,oo as MODULE_OPTIONS_TOKEN,eo as OPTIONS_TYPE,g as SlonikCoreModule,l as SlonikModule};
1
+ var T=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertySymbols;var L=Object.prototype.hasOwnProperty,v=Object.prototype.propertyIsEnumerable;var P=(t,o,e)=>o in t?T(t,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[o]=e,b=(t,o)=>{for(var e in o||(o={}))L.call(o,e)&&P(t,e,o[e]);if(d)for(var e of d(o))v.call(o,e)&&P(t,e,o[e]);return t};var S=(t,o,e,r)=>{for(var n=r>1?void 0:r?x(o,e):o,p=t.length-1,s;p>=0;p--)(s=t[p])&&(n=(r?s(o,e,n):s(n))||n);return r&&n&&T(o,e,n),n};var O=(t,o,e)=>new Promise((r,n)=>{var p=a=>{try{i(e.next(a))}catch(m){n(m)}},s=a=>{try{i(e.throw(a))}catch(m){n(m)}},i=a=>a.done?r(a.value):Promise.resolve(a.value).then(p,s);i((e=e.apply(t,o)).next())});import{Inject as K}from"@nestjs/common";var E="__SLONIK_%s_POOL__",c="DEFAULT";import{Logger as C}from"@nestjs/common";import{format as _}from"util";import{defer as M,delay as N,lastValueFrom as w,of as A,retry as D,throwError as I}from"rxjs";import{createPool as h}from"slonik";var f=(t=c)=>_(E,t.toUpperCase()),g=new C("SlonikModule");function k({dsn:t,name:o,options:e}){let r=f(o);return w(M(()=>O(null,null,function*(){let n=yield h(t,e);return yield n.connect(()=>Promise.resolve()).then(()=>{g.log(`Connected to database ${r}`)}),n})).pipe(F()))}function F(t=9,o=3e3,e=c,r=!1,n){return p=>p.pipe(D({count:t,delay:(s,i)=>{if(n&&!n(s))return I(()=>s);let a=e===c?"":` (${e})`,m=s instanceof Error?s.message:String(s),u=r?` Message: ${m}.`:"";return g.error(_("unable to connect to the database#%s.%s Retrying (%s)%s",a,u,i,u?"":` Error: ${m}`)),A(null).pipe(N(o))}}))}function X(t=c){return K(f(t))}import{Module as Y}from"@nestjs/common";import{ConfigurableModuleBuilder as U}from"@nestjs/common";var{ConfigurableModuleClass:y,MODULE_OPTIONS_TOKEN:eo,OPTIONS_TYPE:to,ASYNC_OPTIONS_TYPE:ro}=new U().setExtras({isGlobal:!0},(t,o)=>b({global:o.isGlobal},t)).build();var l=class extends y{static register(o){var p,s;let{connections:e}=o,r=super.register(o);(p=r.providers)!=null||(r.providers=[]),(s=r.exports)!=null||(r.exports=[]);let n=e.map(i=>({provide:f(i.name),useFactory:()=>O(this,null,function*(){let a=yield k({dsn:i.dsn,options:i.options,name:i.name});return this.pools.set(i.name,a),a})}));return r.providers.push(...n),r.exports.push(...e.map(i=>f(i.name))),r}onApplicationShutdown(){return O(this,null,function*(){yield Promise.allSettled(Array.from(l.pools.values()).map(o=>o.end()))})}};l.pools=new Map,l=S([Y({})],l);export{ro as ASYNC_OPTIONS_TYPE,X as InjectPool,eo as MODULE_OPTIONS_TOKEN,to as OPTIONS_TYPE,y as SlonikCoreModule,l as SlonikModule};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/slonik.decorator.ts","../src/constants/index.ts","../src/slonik.util.ts","../src/slonik.module.ts","../src/slonik.module-definition.ts"],"sourcesContent":["import { Inject } from '@nestjs/common';\n\nimport { DEFAULT_POOL_NAME } from './constants';\nimport { createSlonikToken } from './slonik.util';\n\nexport function InjectPool(name = DEFAULT_POOL_NAME) {\n return Inject(createSlonikToken(name));\n}\n","/**\n * The token for the Slonik pool\n * @example `createSlonikToken('DEFAULT')` will return '__SLONIK_DEFAULT_POOL__'\n */\nexport const SLONIK_POOL_TOKEN = '__SLONIK_%s_POOL__';\n\n/**\n * The default name for the Slonik pool\n */\nexport const DEFAULT_POOL_NAME = 'DEFAULT';\n","import type { Observable } from 'rxjs';\nimport type { DatabasePool } from 'slonik';\n\nimport { Logger } from '@nestjs/common';\nimport { format } from 'node:util';\nimport { defer, delay, lastValueFrom, of, retry, throwError } from 'rxjs';\nimport { createPool } from 'slonik';\n\nimport type { SlonikConnectionConfig } from './slonik.interface';\n\nimport { DEFAULT_POOL_NAME, SLONIK_POOL_TOKEN } from './constants';\n\nexport const createSlonikToken = (name: string = DEFAULT_POOL_NAME) =>\n format(SLONIK_POOL_TOKEN, name.toUpperCase());\n\nconst logger = new Logger('SlonikModule');\n\nexport function createSlonikConnection({\n dsn,\n name,\n options,\n}: SlonikConnectionConfig): Promise<DatabasePool> {\n const token = createSlonikToken(name);\n\n return lastValueFrom(\n defer(async () => {\n const pool = await createPool(dsn, options);\n\n await pool\n .connect(() => Promise.resolve())\n .then(() => {\n logger.log(`Connected to database ${token}`);\n });\n return pool;\n }).pipe(handleRetry()),\n );\n}\n\nexport function handleRetry(\n retryAttempts = 9,\n retryDelay = 3000,\n poolName = DEFAULT_POOL_NAME,\n verboseRetryLog = false,\n toRetry?: (err: any) => boolean,\n): <T>(source: Observable<T>) => Observable<T> {\n return <T>(source: Observable<T>) =>\n source.pipe(\n retry({\n count: retryAttempts,\n delay: (error, retryCount) => {\n if (toRetry && !toRetry(error)) {\n return throwError(() => error);\n }\n\n const poolInfo =\n poolName === DEFAULT_POOL_NAME ? '' : ` (${poolName})`;\n const verboseMessage = verboseRetryLog\n ? ` Message: ${error.message}.`\n : '';\n\n logger.error(\n format(\n 'unable to connect to the database#%s.%s Retrying (%s)',\n poolInfo,\n verboseMessage,\n retryCount,\n ),\n error.stack,\n );\n\n return of(null).pipe(delay(retryDelay));\n },\n }),\n );\n}\n","import type {\n DynamicModule,\n OnApplicationShutdown,\n Provider,\n} from '@nestjs/common';\nimport type { DatabasePool } from 'slonik';\n\nimport { Module } from '@nestjs/common';\n\nimport type { OPTIONS_TYPE } from './slonik.module-definition';\n\nimport { SlonikCoreModule } from './slonik.module-definition';\nimport { createSlonikConnection, createSlonikToken } from './slonik.util';\n\n@Module({})\nexport class SlonikModule\n extends SlonikCoreModule\n implements OnApplicationShutdown\n{\n private static pools = new Map<string, DatabasePool>();\n\n static register(options: typeof OPTIONS_TYPE): DynamicModule {\n const { connections } = options;\n\n const module = super.register(options);\n\n module.providers ??= [];\n module.exports ??= [];\n\n const providers: Provider[] = connections.map(conn => ({\n provide: createSlonikToken(conn.name),\n useFactory: async () => {\n const connection = await createSlonikConnection({\n dsn: conn.dsn,\n options: conn.options,\n name: conn.name,\n });\n this.pools.set(conn.name, connection);\n return connection;\n },\n }));\n\n module.providers.push(...providers);\n module.exports.push(...connections.map(c => createSlonikToken(c.name)));\n\n return module;\n }\n\n async onApplicationShutdown() {\n await Promise.allSettled(\n Array.from(SlonikModule.pools.values()).map(pool => pool.end()),\n );\n }\n}\n","import { ConfigurableModuleBuilder } from '@nestjs/common';\n\nimport type {\n SlonikModuleExtraOptions,\n SlonikModuleOptions,\n} from './slonik.interface';\n\nexport const {\n ConfigurableModuleClass: SlonikCoreModule,\n MODULE_OPTIONS_TOKEN,\n OPTIONS_TYPE,\n ASYNC_OPTIONS_TYPE,\n} = new ConfigurableModuleBuilder<SlonikModuleOptions>()\n .setExtras<SlonikModuleExtraOptions>(\n {\n isGlobal: true,\n },\n (definition, extra) => {\n return { global: extra.isGlobal, ...definition };\n },\n )\n .build();\n"],"mappings":"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","names":["Inject","SLONIK_POOL_TOKEN","DEFAULT_POOL_NAME","Logger","format","defer","delay","lastValueFrom","of","retry","throwError","createPool","createSlonikToken","name","DEFAULT_POOL_NAME","format","SLONIK_POOL_TOKEN","logger","Logger","createSlonikConnection","dsn","options","token","lastValueFrom","defer","__async","pool","createPool","handleRetry","retryAttempts","retryDelay","poolName","verboseRetryLog","toRetry","source","retry","error","retryCount","throwError","poolInfo","verboseMessage","of","delay","InjectPool","name","DEFAULT_POOL_NAME","Inject","createSlonikToken","Module","ConfigurableModuleBuilder","SlonikCoreModule","MODULE_OPTIONS_TOKEN","OPTIONS_TYPE","ASYNC_OPTIONS_TYPE","ConfigurableModuleBuilder","definition","extra","__spreadValues","SlonikModule","SlonikCoreModule","options","_a","_b","connections","module","providers","conn","createSlonikToken","__async","connection","createSlonikConnection","c","pool","__decorateClass","Module"]}
1
+ {"version":3,"sources":["../src/slonik.decorator.ts","../src/constants/index.ts","../src/slonik.util.ts","../src/slonik.module.ts","../src/slonik.module-definition.ts"],"sourcesContent":["import { Inject } from '@nestjs/common';\n\nimport { DEFAULT_POOL_NAME } from './constants';\nimport { createSlonikToken } from './slonik.util';\n\n/**\n * Parameter decorator that injects the Slonik DatabasePool for the given connection name.\n *\n * @param name - Connection name (default: 'DEFAULT'). Must match a name in SlonikModule.register().\n * @returns Nest parameter decorator that injects DatabasePool.\n *\n * @example\n * constructor(@InjectPool() private readonly pool: DatabasePool) {}\n * constructor(@InjectPool('replica') private readonly replica: DatabasePool) {}\n */\nexport function InjectPool(name = DEFAULT_POOL_NAME) {\n return Inject(createSlonikToken(name));\n}\n","/**\n * The token for the Slonik pool\n * @example `createSlonikToken('DEFAULT')` will return '__SLONIK_DEFAULT_POOL__'\n */\nexport const SLONIK_POOL_TOKEN = '__SLONIK_%s_POOL__';\n\n/**\n * The default name for the Slonik pool\n */\nexport const DEFAULT_POOL_NAME = 'DEFAULT';\n","import type { Observable } from 'rxjs';\nimport type { DatabasePool } from 'slonik';\n\nimport { Logger } from '@nestjs/common';\nimport { format } from 'node:util';\nimport { defer, delay, lastValueFrom, of, retry, throwError } from 'rxjs';\nimport { createPool } from 'slonik';\n\nimport type { SlonikConnectionConfig } from './slonik.interface';\n\nimport { DEFAULT_POOL_NAME, SLONIK_POOL_TOKEN } from './constants';\n\n/**\n * Builds the Nest injection token for a named Slonik pool.\n *\n * @param name - Connection name (default: DEFAULT_POOL_NAME). Normalized to uppercase in token.\n * @returns Token string, e.g. '__SLONIK_DEFAULT_POOL__'.\n */\nexport const createSlonikToken = (name: string = DEFAULT_POOL_NAME) =>\n format(SLONIK_POOL_TOKEN, name.toUpperCase());\n\nconst logger = new Logger('SlonikModule');\n\n/**\n * Creates a Slonik pool, verifies connectivity with pool.connect(), and retries on failure.\n * Options (including interceptors) are passed through to createPool.\n *\n * @param config - Connection config (name, dsn, optional options).\n * @returns Promise resolving to the Slonik DatabasePool.\n * @throws If connection or verification fails after all retries.\n */\nexport function createSlonikConnection({\n dsn,\n name,\n options,\n}: SlonikConnectionConfig): Promise<DatabasePool> {\n const token = createSlonikToken(name);\n\n return lastValueFrom(\n defer(async () => {\n const pool = await createPool(dsn, options);\n\n await pool\n .connect(() => Promise.resolve())\n .then(() => {\n logger.log(`Connected to database ${token}`);\n });\n return pool;\n }).pipe(handleRetry()),\n );\n}\n\n/**\n * RxJS operator that retries the source observable on error (e.g. connection failure).\n * Logs each retry via SlonikModule logger. Optional predicate controls which errors are retried.\n *\n * @param retryAttempts - Max retry count (default 9).\n * @param retryDelay - Delay in ms between retries (default 3000).\n * @param poolName - Name used in log messages (default DEFAULT_POOL_NAME).\n * @param verboseRetryLog - If true, include error message in logs.\n * @param toRetry - Optional (err) => boolean; retry only when true. Omit to retry all errors.\n * @returns RxJS operator function.\n */\nexport function handleRetry(\n retryAttempts = 9,\n retryDelay = 3000,\n poolName = DEFAULT_POOL_NAME,\n verboseRetryLog = false,\n toRetry?: (err: unknown) => boolean,\n): <T>(source: Observable<T>) => Observable<T> {\n return <T>(source: Observable<T>) =>\n source.pipe(\n retry({\n count: retryAttempts,\n delay: (error: unknown, retryCount) => {\n if (toRetry && !toRetry(error)) {\n return throwError(() => error);\n }\n\n const poolInfo =\n poolName === DEFAULT_POOL_NAME ? '' : ` (${poolName})`;\n const errMessage =\n error instanceof Error ? error.message : String(error);\n const verboseMessage = verboseRetryLog\n ? ` Message: ${errMessage}.`\n : '';\n\n logger.error(\n format(\n 'unable to connect to the database#%s.%s Retrying (%s)%s',\n poolInfo,\n verboseMessage,\n retryCount,\n verboseMessage ? '' : ` Error: ${errMessage}`,\n ),\n );\n\n return of(null).pipe(delay(retryDelay));\n },\n }),\n );\n}\n","import type {\n DynamicModule,\n OnApplicationShutdown,\n Provider,\n} from '@nestjs/common';\nimport type { DatabasePool } from 'slonik';\n\nimport { Module } from '@nestjs/common';\n\nimport type { OPTIONS_TYPE } from './slonik.module-definition';\n\nimport { SlonikCoreModule } from './slonik.module-definition';\nimport { createSlonikConnection, createSlonikToken } from './slonik.util';\n\n/**\n * NestJS module that provides one or more Slonik PostgreSQL pools as injectable providers.\n * Each connection is created with retries; pools are closed on application shutdown.\n */\n@Module({})\nexport class SlonikModule\n extends SlonikCoreModule\n implements OnApplicationShutdown\n{\n private static pools = new Map<string, DatabasePool>();\n\n /**\n * Registers the module with the given connections. One provider (pool) per connection;\n * inject via InjectPool(name).\n *\n * @param options - Module options; must include connections array.\n * @returns DynamicModule with providers and exports for each connection token.\n */\n static register(options: typeof OPTIONS_TYPE): DynamicModule {\n const { connections } = options;\n\n const module = super.register(options);\n\n module.providers ??= [];\n module.exports ??= [];\n\n const providers: Provider[] = connections.map(conn => ({\n provide: createSlonikToken(conn.name),\n useFactory: async () => {\n const connection = await createSlonikConnection({\n dsn: conn.dsn,\n options: conn.options,\n name: conn.name,\n });\n this.pools.set(conn.name, connection);\n return connection;\n },\n }));\n\n module.providers.push(...providers);\n module.exports.push(...connections.map(c => createSlonikToken(c.name)));\n\n return module;\n }\n\n /** Ends all pools created by this module. Called by Nest on shutdown. */\n async onApplicationShutdown() {\n await Promise.allSettled(\n Array.from(SlonikModule.pools.values()).map(pool => pool.end()),\n );\n }\n}\n","import { ConfigurableModuleBuilder } from '@nestjs/common';\n\nimport type {\n SlonikModuleExtraOptions,\n SlonikModuleOptions,\n} from './slonik.interface';\n\n/** Configurable module builder: base class, options token, and option types for register/registerAsync. */\nexport const {\n ConfigurableModuleClass: SlonikCoreModule,\n MODULE_OPTIONS_TOKEN,\n OPTIONS_TYPE,\n ASYNC_OPTIONS_TYPE,\n} = new ConfigurableModuleBuilder<SlonikModuleOptions>()\n .setExtras<SlonikModuleExtraOptions>(\n {\n isGlobal: true,\n },\n (definition, extra) => {\n return { global: extra.isGlobal, ...definition };\n },\n )\n .build();\n"],"mappings":"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","names":["Inject","SLONIK_POOL_TOKEN","DEFAULT_POOL_NAME","Logger","format","defer","delay","lastValueFrom","of","retry","throwError","createPool","createSlonikToken","name","DEFAULT_POOL_NAME","format","SLONIK_POOL_TOKEN","logger","Logger","createSlonikConnection","dsn","options","token","lastValueFrom","defer","__async","pool","createPool","handleRetry","retryAttempts","retryDelay","poolName","verboseRetryLog","toRetry","source","retry","error","retryCount","throwError","poolInfo","errMessage","verboseMessage","of","delay","InjectPool","name","DEFAULT_POOL_NAME","Inject","createSlonikToken","Module","ConfigurableModuleBuilder","SlonikCoreModule","MODULE_OPTIONS_TOKEN","OPTIONS_TYPE","ASYNC_OPTIONS_TYPE","ConfigurableModuleBuilder","definition","extra","__spreadValues","SlonikModule","SlonikCoreModule","options","_a","_b","connections","module","providers","conn","createSlonikToken","__async","connection","createSlonikConnection","c","pool","__decorateClass","Module"]}
package/package.json CHANGED
@@ -1,14 +1,29 @@
1
1
  {
2
2
  "name": "@rineex/pg-slonik",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "PostgreSQL adapter using Slonik for Rineex core modules",
5
5
  "author": "Rineex Team",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
8
8
  "types": "./dist/index.d.ts",
9
+ "engines": {
10
+ "node": ">=18.0.0"
11
+ },
9
12
  "files": [
10
13
  "dist/**"
11
14
  ],
15
+ "peerDependencies": {
16
+ "@nestjs/common": "^11.0.0",
17
+ "slonik": "^48.0.0"
18
+ },
19
+ "peerDependenciesMeta": {
20
+ "@nestjs/common": {
21
+ "optional": false
22
+ },
23
+ "slonik": {
24
+ "optional": false
25
+ }
26
+ },
12
27
  "sideEffects": false,
13
28
  "devDependencies": {
14
29
  "@changesets/cli": "2.29.8",
@@ -19,13 +34,13 @@
19
34
  "typescript": "5.9.3",
20
35
  "vite-tsconfig-paths": "6.0.2",
21
36
  "vitest": "4.0.16",
22
- "@rineex/eslint-config": "0.0.0",
23
- "@rineex/typescript-config": "0.0.0"
37
+ "@rineex/eslint-config": "0.0.1",
38
+ "@rineex/typescript-config": "0.0.1"
24
39
  },
25
40
  "dependencies": {
26
41
  "@nestjs/common": "11.1.11",
27
42
  "rxjs": "7.8.2",
28
- "slonik": "^39.0.0"
43
+ "slonik": "^48.0.0"
29
44
  },
30
45
  "keywords": [
31
46
  "rineex",
@@ -45,6 +60,7 @@
45
60
  "url": "https://github.com/rineex/core.git",
46
61
  "directory": "packages/pg-slonik"
47
62
  },
63
+ "homepage": "https://github.com/rineex/core/tree/main/packages/pg-slonik",
48
64
  "scripts": {
49
65
  "test": "vitest run",
50
66
  "lint": "eslint 'src/**/*.ts'",