![Oracle Drags Its Feet in the JavaScript Trademark Dispute](https://cdn.sanity.io/images/cgdhsj6q/production/919c3b22c24f93884c548d60cbb338e819ff2435-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Oracle Drags Its Feet in the JavaScript Trademark Dispute
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
@uql/mongo
Advanced tools
Querier for TypeScript, ES2015+. Supports MySQL, PostgreSQL, MariaDB, MongoDB databases.
{*}
uql = Universal Query Languageuql
is a plug & play ORM
, with a declarative JSON
syntax to query/update multiple data-sources. Essentially, you just declare what you want from the datasource, and then uql
will run efficient (and safe) SQL
(or Mongo
) queries.
Given uql
is just a small library with serializable JSON
syntax, the queries can be written in the client (web/mobile) and send to the backend; or just use uql
directly in the backend; or even use it in a mobile app with an embedded database.
populate
(at multiple levels), projection
of fields/columns (at multiple levels), complex filtering
(at multiple levels), sorting
, pagination
, and more.transactions
repositories
relations
between the entitiesinheritance
patterns between the entitiesInstall the core package:
npm install @uql/core --save
or
yarn add @uql/core
Install one of database packages according to your database:
for MySQL (or MariaDB)
npm install @uql/mysql --save
or with yarn
yarn add @uql/mysql
for PostgreSQL
npm install @uql/postgres --save
or with yarn
yarn add @uql/postgres
for SQLite
npm install @uql/sqlite --save
or with yarn
yarn add @uql/sqlite
for MongoDB
npm install @uql/mongo --save
or with yarn
yarn add @uql/mongo
Your tsconfig.json
needs the following flags:
"target": "es6", // or a more recent ecmascript version
"experimentalDecorators": true,
"emitDecoratorMetadata": true
uql
initialization should be done once (e.g. in one of the bootstrap files of your app).
import { setOptions } from '@uql/core';
import { PgQuerierPool } from '@uql/postgres';
setOptions({
querierPool: new PgQuerierPool({
host: 'localhost',
user: 'theUser',
password: 'thePassword',
database: 'theDatabase',
}),
logger: console.log,
debug: true,
});
Take any dump class (aka DTO) and annotate it with the decorators from '@uql/core/entity/decorator'.
Note: inheritance between entities is optional.
import { v4 as uuidv4 } from 'uuid';
import { Id, Property, OneToMany, OneToOne, ManyToOne, Entity } from '@uql/core/entity/decorator';
/**
* an abstract class can optionally be used as a template for the entities
* (so boilerplate code is reduced)
*/
export abstract class BaseEntity {
@Id({ onInsert: () => uuidv4() })
id?: string;
/**
* 'onInsert' callback can be used to specify a custom mechanism for
* obtaining the value of a property when inserting:
*/
@Property({ onInsert: () => Date.now() })
createdAt?: number;
/**
* 'onUpdate' callback can be used to specify a custom mechanism for
* obtaining the value of a property when updating:
*/
@Property({ onUpdate: () => Date.now() })
updatedAt?: number;
@Property()
status?: number;
}
@Entity()
export class Company extends BaseEntity {
@Property()
name?: string;
@Property()
description?: string;
}
/**
* a custom name can be specified for the corresponding table/document
*/
@Entity({ name: 'user_profile' })
export class Profile extends BaseEntity {
/**
* a custom name can be optionally specified for every property (this also overrides parent's class ID declaration)
*/
@Id({ name: 'pk' })
id?: string;
@Property({ name: 'image' })
picture?: string;
}
@Entity()
export class User extends BaseEntity {
@Property()
name?: string;
@Property()
email?: string;
@Property()
password?: string;
@OneToOne({ mappedBy: 'user' })
profile?: Profile;
}
@Entity()
export class TaxCategory extends BaseEntity {
/**
* Any entity can specify its own ID Property and still inherit the others
* columns/relations from its parent entity.
* 'onInsert' callback can be used to specify a custom mechanism for
* auto-generating the primary-key's value when inserting
*/
@Id({ onInsert: () => uuidv4() })
pk?: string;
@Property()
name?: string;
@Property()
description?: string;
}
@Entity()
export class Tax extends BaseEntity {
@Property()
name?: string;
@Property()
percentage?: number;
@ManyToOne()
category?: TaxCategory;
@Property()
description?: string;
}
uql
supports both, declarative and programmatic transactions, with the former you can just describe the scope of your transactions, with the later you have more flexibility (hence more responsibility).
Transactional()
decorator.@InjectQuerier()
.import { Querier } from '@uql/core/type';
import { Transactional, InjectQuerier } from '@uql/core/querier/decorator';
class ConfirmationService {
@Transactional()
async confirmAction(body: Confirmation,. @InjectQuerier() querier?: Querier): Promise<void> {
if (body.type === 'register') {
const newUser: User = {
name: body.name,
email: body.email,
password: body.password,
};
await querier.insertOne(User, newUser);
} else {
const userId = body.user as string;
await querier.updateOneById(User, userId, { password: body.password });
}
await querier.updateOneById(Confirmation, body.id, { status: CONFIRM_STATUS_VERIFIED });
}
}
export const confirmationService = new ConfirmationService();
// then you could just import the constant `confirmationService` in another file,
// and when you call `confirmAction` function, all the operations there
// will (automatically) run inside a single transaction
await confirmationService.confirmAction(data);
uql
supports both, declarative and programmatic transactions, with the former you can just describe the scope of your transactions, with the later you have more flexibility (hence more responsibility).
querier
object with await getQuerier()
try/catch/finally
blockawait querier.beginTransaction()
querier
await querier.commitTransaction()
catch
block, add await querier.rollbackTransaction()
querier
back to the pool with await querier.release()
in the finally
block.import { getQuerier } from '@uql/core';
async function confirmAction(confirmation: Confirmation): Promise<void> {
const querier = await getQuerier();
try {
await querier.beginTransaction();
if (confirmation.entity === 'register') {
const newUser: User = {
name: confirmation.name,
email: confirmation.email,
password: confirmation.password,
};
await querier.insertOne(User, newUser);
} else {
// confirm change password
const userId = confirmation.user as string;
await querier.updateOneById(User, userId, { password: confirmation.password });
}
await this.querier.updateOneById(Confirmation, body.id, { status: CONFIRM_STATUS_VERIFIED });
await querier.commitTransaction();
} catch (error) {
await querier.rollbackTransaction();
throw error;
} finally {
await querier.release();
}
}
uql
provides a express plugin to automatically generate REST APIs for your entities.
npm install @uql/express --save
or with yarn
yarn add @uql/express
express
middleware in your server code to generate CRUD REST APIs for your entitiesimport * as express from 'express';
import { entitiesMiddleware } from '@uql/express';
const app = express();
app
// ...other routes may go before and/or after (as usual)
.use(
'/api',
// this will generate CRUD REST APIs for the entities.
// all entities will be automatically exposed unless
// 'include' or 'exclude' options are provided
entitiesMiddleware({
exclude: [Confirmation],
})
);
uql provides a client plugin to consume the REST APIs from the frontend.
npm install @uql/client --save
or with yarn
yarn add @uql/client
uql
CRUD APIimport { querier } from '@uql/client';
// 'Item' is an entity class
const lastItems = await querier.find(Item, {
sort: { createdAt: -1 },
limit: 100,
});
GraphQL requires additional servers and also learning a new language; uql should allow same this, but without need to configure and maintaining additional components.
On the other hand, existing ORMs like TypeORM, Mikro-ORM, and Sequelize; are in one way or another, coupled to databases; uql uses a declarative JSON syntax (agnostic from the datasource) which can easily be serialized and send as messages (e.g. through the network) between different components of a system (e.g. micro-services), and then each one has the flexibility to decide how to process these messages.
At last but not at least, uql helps with the communication between the different tiers of your system, e.g. it allows the frontend to send dynamic requests to the backend (like GraphQL).
FAQs
flexible and efficient ORM, with declarative JSON syntax and smart type-safety
The npm package @uql/mongo receives a total of 15 weekly downloads. As such, @uql/mongo popularity was classified as not popular.
We found that @uql/mongo demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.