Registry / database / peculiar-orm

peculiar-orm

JSON →
library1.0.1jsnpmunverified

Peculiar ORM is a lightweight, active-record style ORM for PostgreSQL, built with TypeScript. Version 1.0.1 focuses on resilient connection management, explicit transaction control, and observability. It wraps the `pg` driver directly, offers decorator-based entity definitions, and follows the repository pattern. Key differentiators over heavier ORMs (like TypeORM or Sequelize) include zero bloat, built-in metrics for pool saturation and query performance, and first-class dependency injection via `inversify`. It is particularly suited for microservices due to its stateless-ready transaction manager and graceful handling of connection drops. The library ships TypeScript types and requires `pg`, `reflect-metadata`, and `inversify` as peer dependencies.

npm install peculiar-orm
INSTALL
IMPORT
SIG · PECULIAR-ORM
P
peculiar-orm
databasejavascriptv1.0.1
harness data pending
Install & Compatibility
Where this runs

No compatibility data collected yet for this library.

Code
Verified usage

Verified import paths — ran on the pinned version, not inferred.

Column
import { Column } from 'peculiar-orm'
import Column from 'peculiar-orm'
Column is a named export, not default. This is consistent across all decorators.
BaseRepository
import { BaseRepository } from 'peculiar-orm'
const { BaseRepository } = require('peculiar-orm')
Peculiar ORM is ESM-only; require will fail. Use ES module imports.
TransactionManager
import { TransactionManager } from 'peculiar-orm'
import { Transaction } from 'peculiar-orm'
No Transaction class exists. The correct symbol is TransactionManager.
ConnectionPoolManager
import { ConnectionPoolManager } from 'peculiar-orm'
import { PoolManager } from 'peculiar-orm'
Symbol name is ConnectionPoolManager, not PoolManager.
Index
import { Index } from 'peculiar-orm'
import { IndexDecorator } from 'peculiar-orm'
Use Index directly, not a wrapper.

Defines a User entity with decorators, creates a repository extending BaseRepository with CRUD methods, and sets up dependency injection with Inversify.

import { Container } from 'inversify'; import { ConnectionPoolManager, TransactionManager, Column, Index, BaseRepository } from 'peculiar-orm'; class User { @Column('uuid DEFAULT gen_random_uuid() PRIMARY KEY') id?: string; @Column('varchar(255) NOT NULL') @Index({ unique: true }) email!: string; @Column('varchar(255)') name?: string; @Column('timestamp with time zone DEFAULT now()') createdAt?: Date; } class UserRepository extends BaseRepository<User> { constructor(transactionManager: TransactionManager) { super(transactionManager, 'users'); } async create(user: User): Promise<User> { const { columns, values, placeholders } = this.getEntityColumns(user); const sql = `INSERT INTO ${this.tableName} (${columns.join(', ')}) VALUES (${placeholders.join(', ')}) RETURNING *`; const result = await this.executeQuery<User>(sql, values); return result.rows[0]; } async findById(id: string): Promise<User | null> { const result = await this.executeQuery<User>('SELECT * FROM users WHERE id = $1', [id]); return result.rows[0] || null; } } const container = new Container(); container.bind(ConnectionPoolManager).toDynamicValue(() => new ConnectionPoolManager({ host: process.env.DB_HOST ?? 'localhost', database: process.env.DB_NAME ?? 'my_db', user: process.env.DB_USER ?? 'postgres', password: process.env.DB_PASSWORD ?? 'password', max: 20, idleTimeoutMillis: 30000 })).inSingletonScope(); container.bind(TransactionManager).toSelf().inRequestScope(); container.bind(UserRepository).toSelf();
Debug
Known issues
gotchaESM only: Peculiar ORM uses ES modules; CommonJS require() will throw. Ensure your project is configured for ESM.
fix
Use ES module imports (import { ... } from 'peculiar-orm') and set "type": "module" in package.json or use .mjs extension.
affects: >=1.0.0
gotchaDecorators require TypeScript settings: @Column and @Index need experimentalDecorators and emitDecoratorMetadata enabled in tsconfig.json.
fix
"experimentalDecorators": true, "emitDecoratorMetadata": true in compilerOptions.
affects: >=1.0.0
gotchaPeer dependencies: pg, reflect-metadata, and inversify are required but not automatically installed. Missing them leads to runtime errors.
fix
npm install pg reflect-metadata inversify
affects: >=1.0.0
gotchaTransactionManager scope: For web applications, use inRequestScope (Inversify) to isolate transactions per request. Singleton scope can cause cross-request pollution.
fix
container.bind(TransactionManager).toSelf().inRequestScope();
affects: >=1.0.0
gotchaConnectionPoolManager singleton: Must be bound as singleton; otherwise, multiple pool instances will be created.
fix
container.bind(ConnectionPoolManager).to(ConnectionPoolManager).inSingletonScope();
affects: >=1.0.0
Errors
Common errors & fixes
Cannot find module 'peculiar-orm' or its corresponding type declarations.
Package not installed or typings not available. Peculiar ORM ships with TypeScript types; this error indicates missing package.
fix
npm install peculiar-orm
TypeError: Class extends value undefined is not a constructor or null
Missing required dependency (pg, reflect-metadata, or inversify) causing BaseRepository import to fail.
fix
npm install pg reflect-metadata inversify
ReflectDecorator: 'experimentalDecorators' is required for decorators to work.
tsconfig.json missing the required compiler options.
fix
Add "experimentalDecorators": true and "emitDecoratorMetadata": true to compilerOptions.
Pool is not a constructor
pg package is not installed or incorrect version (likely pg is missing).
fix
npm install pg
Upgrade
Version history
1.0.1latest on npm
Audit
Dependencies
pgrequiredPostgreSQL driver; used for all database connections and queries
reflect-metadatarequiredRequired for decorators to work (e.g., @Column, @Index)
inversifyrequiredDependency injection container; required for managing ConnectionPoolManager and TransactionManager singletons/scopes
Agent activity
4 hits · last 30 days
node
4
Resources
peculiar-orm — npm install peculiar-orm · libregistry