UNPKG

sequelize

Version:

Sequelize is a promise-based Node.js ORM tool for Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server, Amazon Redshift and Snowflake’s Data Cloud. It features solid transaction support, relations, eager and lazy loading, read replication and more.

493 lines (461 loc) 14.7 kB
import { BulkCreateOptions, CreateOptions, Filterable, FindAttributeOptions, FindOptions, InstanceDestroyOptions, InstanceUpdateOptions, Model, ModelCtor, ModelType, Transactionable } from '../model'; import { Association, AssociationScope, ForeignKeyOptions, ManyToManyOptions, MultiAssociationAccessors } from './base'; /** * Used for a association table in n:m associations. */ export interface ThroughOptions { /** * The model used to join both sides of the N:M association. * Can be a string if you want the model to be generated by sequelize. */ model: ModelType | string; /** * If true the generated join table will be paranoid * @default false */ paranoid?: boolean; /** * A key/value set that will be used for association create and find defaults on the through model. * (Remember to add the attributes to the through model) */ scope?: AssociationScope; /** * If true a unique key will be generated from the foreign keys used (might want to turn this off and create * specific unique keys when using scopes) * * @default true */ unique?: boolean; } /** * Attributes for the join table */ export interface JoinTableAttributes { [attribute: string]: unknown; } /** * Options provided when associating models with belongsToMany relationship */ export interface BelongsToManyOptions extends ManyToManyOptions { /** * The name of the table that is used to join source and target in n:m associations. Can also be a * sequelize model if you want to define the junction table yourself and add extra attributes to it. */ through: ModelType | string | ThroughOptions; /** * The name of the foreign key in the join table (representing the target model) or an object representing * the type definition for the other column (see `Sequelize.define` for syntax). When using an object, you * can add a `name` property to set the name of the colum. Defaults to the name of target + primary key of * target */ otherKey?: string | ForeignKeyOptions; /** * The name of the field to use as the key for the association in the source table. Defaults to the primary * key of the source table */ sourceKey?: string; /** * The name of the field to use as the key for the association in the target table. Defaults to the primary * key of the target table */ targetKey?: string; /** * Should the join model have timestamps */ timestamps?: boolean; /** * The unique key name to override the autogenerated one when primary key is not present on through model */ uniqueKey?: string; } export class BelongsToMany<S extends Model = Model, T extends Model = Model> extends Association<S, T> { public otherKey: string; public sourceKey: string; public targetKey: string; public accessors: MultiAssociationAccessors; constructor(source: ModelCtor<S>, target: ModelCtor<T>, options: BelongsToManyOptions); } /** * The options for the getAssociations mixin of the belongsToMany association. * @see BelongsToManyGetAssociationsMixin */ export interface BelongsToManyGetAssociationsMixinOptions extends FindOptions<any> { /** * A list of the attributes from the join table that you want to select. */ joinTableAttributes?: FindAttributeOptions /** * Apply a scope on the related model, or remove its default scope by passing false. */ scope?: string | boolean; } /** * The getAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * getRoles: Sequelize.BelongsToManyGetAssociationsMixin<RoleInstance>; * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyGetAssociationsMixin<TModel> = ( options?: BelongsToManyGetAssociationsMixinOptions ) => Promise<TModel[]>; /** * The options for the setAssociations mixin of the belongsToMany association. * @see BelongsToManySetAssociationsMixin */ export interface BelongsToManySetAssociationsMixinOptions extends FindOptions<any>, BulkCreateOptions<any>, InstanceUpdateOptions<any>, InstanceDestroyOptions { through?: JoinTableAttributes; } /** * The setAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * setRoles: Sequelize.BelongsToManySetAssociationsMixin<RoleInstance, RoleId, UserRoleAttributes>; * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManySetAssociationsMixin<TModel, TModelPrimaryKey> = ( newAssociations?: (TModel | TModelPrimaryKey)[], options?: BelongsToManySetAssociationsMixinOptions ) => Promise<void>; /** * The options for the addAssociations mixin of the belongsToMany association. * @see BelongsToManyAddAssociationsMixin */ export interface BelongsToManyAddAssociationsMixinOptions extends FindOptions<any>, BulkCreateOptions<any>, InstanceUpdateOptions<any>, InstanceDestroyOptions { through?: JoinTableAttributes; } /** * The addAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * addRoles: Sequelize.BelongsToManyAddAssociationsMixin<RoleInstance, RoleId, UserRoleAttributes>; * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyAddAssociationsMixin<TModel, TModelPrimaryKey> = ( newAssociations?: (TModel | TModelPrimaryKey)[], options?: BelongsToManyAddAssociationsMixinOptions ) => Promise<void>; /** * The options for the addAssociation mixin of the belongsToMany association. * @see BelongsToManyAddAssociationMixin */ export interface BelongsToManyAddAssociationMixinOptions extends FindOptions<any>, BulkCreateOptions<any>, InstanceUpdateOptions<any>, InstanceDestroyOptions { through?: JoinTableAttributes; } /** * The addAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * addRole: Sequelize.BelongsToManyAddAssociationMixin<RoleInstance, RoleId, UserRoleAttributes>; * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyAddAssociationMixin<TModel, TModelPrimaryKey> = ( newAssociation?: TModel | TModelPrimaryKey, options?: BelongsToManyAddAssociationMixinOptions ) => Promise<void>; /** * The options for the createAssociation mixin of the belongsToMany association. * @see BelongsToManyCreateAssociationMixin */ export interface BelongsToManyCreateAssociationMixinOptions extends CreateOptions<any> { through?: JoinTableAttributes; } /** * The createAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * createRole: Sequelize.BelongsToManyCreateAssociationMixin<RoleAttributes, UserRoleAttributes>; * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyCreateAssociationMixin<TModel extends Model> = ( values?: TModel['_creationAttributes'], options?: BelongsToManyCreateAssociationMixinOptions ) => Promise<TModel>; /** * The options for the removeAssociation mixin of the belongsToMany association. * @see BelongsToManyRemoveAssociationMixin */ export interface BelongsToManyRemoveAssociationMixinOptions extends InstanceDestroyOptions {} /** * The removeAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * removeRole: Sequelize.BelongsToManyRemoveAssociationMixin<RoleInstance, RoleId>; * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyRemoveAssociationMixin<TModel, TModelPrimaryKey> = ( oldAssociated?: TModel | TModelPrimaryKey, options?: BelongsToManyRemoveAssociationMixinOptions ) => Promise<void>; /** * The options for the removeAssociations mixin of the belongsToMany association. * @see BelongsToManyRemoveAssociationsMixin */ export interface BelongsToManyRemoveAssociationsMixinOptions extends InstanceDestroyOptions, InstanceDestroyOptions {} /** * The removeAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * removeRoles: Sequelize.BelongsToManyRemoveAssociationsMixin<RoleInstance, RoleId>; * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyRemoveAssociationsMixin<TModel, TModelPrimaryKey> = ( oldAssociateds?: (TModel | TModelPrimaryKey)[], options?: BelongsToManyRemoveAssociationsMixinOptions ) => Promise<void>; /** * The options for the hasAssociation mixin of the belongsToMany association. * @see BelongsToManyHasAssociationMixin */ export interface BelongsToManyHasAssociationMixinOptions extends BelongsToManyGetAssociationsMixinOptions {} /** * The hasAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * hasRole: Sequelize.BelongsToManyHasAssociationMixin<RoleInstance, RoleId>; * // hasRoles... * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyHasAssociationMixin<TModel, TModelPrimaryKey> = ( target: TModel | TModelPrimaryKey, options?: BelongsToManyHasAssociationMixinOptions ) => Promise<boolean>; /** * The options for the hasAssociations mixin of the belongsToMany association. * @see BelongsToManyHasAssociationsMixin */ export interface BelongsToManyHasAssociationsMixinOptions extends BelongsToManyGetAssociationsMixinOptions {} /** * The removeAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles * // hasRole... * hasRoles: Sequelize.BelongsToManyHasAssociationsMixin<RoleInstance, RoleId>; * // countRoles... * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyHasAssociationsMixin<TModel, TModelPrimaryKey> = ( targets: (TModel | TModelPrimaryKey)[], options?: BelongsToManyHasAssociationsMixinOptions ) => Promise<boolean>; /** * The options for the countAssociations mixin of the belongsToMany association. * @see BelongsToManyCountAssociationsMixin */ export interface BelongsToManyCountAssociationsMixinOptions extends Transactionable, Filterable<any> { /** * Apply a scope on the related model, or remove its default scope by passing false. */ scope?: string | boolean; } /** * The countAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * countRoles: Sequelize.BelongsToManyCountAssociationsMixin; * } * ``` * * @see https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html * @see Instance */ export type BelongsToManyCountAssociationsMixin = ( options?: BelongsToManyCountAssociationsMixinOptions ) => Promise<number>;