tspace-mysql
Version:
Tspace MySQL is a promise-based ORM for Node.js, designed with modern TypeScript and providing type safety for schema databases.
95 lines • 3.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Nest = void 0;
require("reflect-metadata");
const __1 = require("..");
class Nest {
/**
* Factory function for creating a provider definition for a given model.
*
* This utility helps register either a repository instance or a model instance
* with a dependency injection system (e.g. NestJS). It returns an object
* compatible with DI containers expecting `{ provide, useValue }`.
*
* @template M - The type of the model extending `Model`.
* @param {Model} model - The constructor function of the model to provide.
* @param {{ pattern?: 'repository' | 'model' }} [options={ pattern: 'repository' }]
* The provider options:
* - `pattern: 'repository'` (default) → provide a repository wrapper for the model.
* - `pattern: 'model'` → provide a direct model instance.
*
* @returns {{ provide: string; useValue: unknown }}
* The provider definition object containing:
* - `provide`: The injection token, derived from the model name.
* - `useValue`: The repository or model instance.
*
* @example
* ```ts
* // src/app.module.ts;
*
* import { Module } from '@nestjs/common';
* import { AppController } from './app.controller';
* import { AppService } from './app.service';
* import { Nest } from 'tspace-mysql';
* import { User } from './entities/user.entity'
*
* @Module({
* controllers: [AppController],
* providers: [AppService, Nest.Provider(User)] // register this
* })
*
* export class AppModule {}
* ```
*/
static Provider = (model, options = { pattern: 'repository' }) => {
return {
provide: this._paramToken(model),
useValue: options.pattern === 'repository'
? (0, __1.Repository)(model)
: new __1.Model()
};
};
/**
* Parameter decorator factory for injecting a repository of a given model.
*
* This decorator is designed to work with dependency injection systems (e.g. NestJS).
* It records metadata about constructor parameter dependencies so they can later
* be resolved and injected automatically.
*
* @template M - The type of the model extending `Model`.
* @param {Model} model - The constructor function of the model to inject.
* @returns {Function}
* A parameter decorator function that attaches repository injection metadata.
*
* @example
* ```ts
* import { Nest, T } from 'tspace-mysql'
* class User extends Model {}
*
* class UserService {
* constructor(
* @Nest.InjectRepository(User)
* private readonly userRepo: T.Repository<User>
* ) {}
* }
* ```
*/
static InjectRepository = (model) => {
return (target, _, index) => {
const meta = Reflect.getMetadata('self:paramtypes', target) || [];
const param = this._paramToken(model);
const dependencies = [...meta, { index, param }];
Reflect.defineMetadata('self:paramtypes', dependencies, target);
};
};
static _nameOfModel = (model) => {
return `${new model().constructor?.name ?? Math.random().toString(36).slice(2)}@Repository`;
};
static _paramToken = (model) => {
return typeof model === 'string'
? model
: this._nameOfModel(model);
};
}
exports.Nest = Nest;
//# sourceMappingURL=index.js.map