Package Exports
- nukak-postgres
- nukak-postgres/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (nukak-postgres) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
nukak ·

Learn more of nukak on its website https://nukak.org
Quick Start
nukak is a flexible and efficient ORM, with declarative JSON syntax and really smart type-safety.
The nukak queries can be safely written in the frontend (browser/mobile) and sent to the backend; or only use nukak in the backend, or even in a mobile app with an embedded database (like sqlite).
Features
JSON(serializable) syntax for all the queries.- uses the power of
TypeScriptto get smart type-safety everywhere. - the generated queries are performant, safe, and human-readable.
$project,$filter,$sort,$limitworks at multiple levels (including deep relations and their fields).- declarative and imperative
transactions. - soft-delete, virtual fields, repositories,
connection pooling. - transparent support for inheritance between entities.
- supports
Postgres,MySQL,MariaDB,SQLite,MongoDB.
Installation
- Install the
nukakmain package:
npm install nukak --saveor
yarn add nukak- Install one of the specific adapters for your database:
| Database | Package |
|---|---|
PostgreSQL |
nukak-postgres |
MySQL |
nukak-mysql |
MariaDB |
nukak-maria |
MongoDB |
nukak-mongo |
SQLite |
nukak-sqlite |
E.g. use nukak-postres driver for Postgres
npm install nukak-postgres --save- Additionally, your
tsconfig.jsonmay need the following flags:
"target": "es2020",
"experimentalDecorators": true,
"emitDecoratorMetadata": trueConfiguration
A default querier-pool can be set in any of the bootstrap files of your app (e.g. in the server.ts).
import { setQuerierPool } from 'nukak';
import { PgQuerierPool } from 'nukak-postgres';
const querierPool = new PgQuerierPool(
{
host: 'localhost',
user: 'theUser',
password: 'thePassword',
database: 'theDatabase',
},
// a logger can optionally be passed so the SQL queries are logged
console.log
);
setQuerierPool(querierPool);Definition of Entities
Take any dump class (aka DTO) and annotate it with the decorators from nukak/entity.
import { v4 as uuidv4 } from 'uuid';
import { Field, ManyToOne, Id, OneToMany, Entity, OneToOne, ManyToMany } from 'nukak/entity';
@Entity()
export class Profile {
/**
* primary-key.
* the `onInsert` callback can be used to specify a custom mechanism for auto-generating
* the default value of a field when inserting a new record.
*/
@Id({ onInsert: uuidv4 })
id?: string;
@Field()
picture?: string;
/**
* foreign-keys are really simple to specify.
*/
@Field({ reference: () => User })
creatorId?: string;
}
@Entity()
export class User {
@Id({ onInsert: uuidv4 })
id?: string;
@Field()
name?: string;
@Field()
email?: string;
@Field()
password?: string;
/**
* `mappedBy` can be a callback or a string (callback is useful for auto-refactoring).
*/
@OneToOne({ entity: () => Profile, mappedBy: (profile) => profile.creatorId, cascade: true })
profile?: Profile;
}
@Entity()
export class MeasureUnitCategory {
@Id({ onInsert: uuidv4 })
id?: string;
@Field()
name?: string;
@OneToMany({ entity: () => MeasureUnit, mappedBy: (measureUnit) => measureUnit.category })
measureUnits?: MeasureUnit[];
}
@Entity()
export class MeasureUnit {
@Id({ onInsert: uuidv4 })
id?: string;
@Field()
name?: string;
@Field({ reference: () => MeasureUnitCategory })
categoryId?: string;
@ManyToOne({ cascade: 'persist' })
category?: MeasureUnitCategory;
}Query the data
import { getQuerier } from 'nukak';
import { Transactional, InjectQuerier } from 'nukak/querier';
import { User } from './shared/models.js';
export class UserService {
@Transactional()
async getUsers(@InjectQuerier() querier?: Querier): Promise<User[]> {
return querier.findMany(User, {
$project: { id: true, email: true, profile: ['picture'] },
$filter: { email: { $iendsWith: '@google.com' } },
$sort: { createdAt: -1 },
$limit: 100,
});
}
}See more in https://nukak.org 🔆