Browse Source

chore: builds as cjs

e22m4u 2 years ago
parent
commit
df0d15e6de
8 changed files with 1745 additions and 7 deletions
  1. 1 0
      .husky/pre-commit
  2. 0 0
      dist/225.main.js
  3. 1711 0
      dist/main.d.ts
  4. 0 0
      dist/main.js
  5. 12 6
      package.json
  6. 1 1
      src/definition/model/relations/index.d.ts
  7. 6 0
      tsconfig.json
  8. 14 0
      webpack.config.cjs

+ 1 - 0
.husky/pre-commit

@@ -5,5 +5,6 @@ npm run lint:fix
 npm run format
 
 npm run test
+npm run build
 
 git add -A

File diff suppressed because it is too large
+ 0 - 0
dist/225.main.js


+ 1711 - 0
dist/main.d.ts

@@ -0,0 +1,1711 @@
+// Generated by dts-bundle-generator v8.0.1
+
+import { Constructor, Service, ServiceContainer } from '@e22m4u/service';
+import { Errorf } from '@e22m4u/util-format';
+
+/**
+ * Free-form object with open properties.
+ */
+export declare type AnyObject = {
+	[property: string]: unknown;
+};
+/**
+ * Makes specific field as optional.
+ */
+export declare type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
+/**
+ * Model data.
+ */
+export declare type ModelData = {
+	[property: string]: unknown;
+};
+/**
+ * Model id.
+ */
+export declare type ModelId = unknown;
+/**
+ * Flatten.
+ */
+export type Identity<T> = T;
+export declare type Flatten<T> = Identity<{
+	[k in keyof T]: T[k];
+}>;
+/**
+ * Is ctor.
+ *
+ * @param {*} value
+ * @returns {boolean}
+ */
+export declare function isCtor(value: unknown): boolean;
+/**
+ * Capitalize.
+ *
+ * @param string
+ */
+export declare function capitalize(string: string): string;
+/**
+ * Clone deep.
+ *
+ * @param value
+ */
+export declare function cloneDeep<T>(value: T): T;
+/**
+ * Singularize.
+ *
+ * @param noun
+ */
+export declare function singularize(noun: string): string;
+/**
+ * Get ctor name.
+ *
+ * @param value
+ */
+export declare function getCtorName(value: unknown): string | undefined;
+/**
+ * Is pure object.
+ *
+ * @param value
+ */
+export declare function isPureObject(value: unknown): boolean;
+/**
+ * String to regexp.
+ *
+ * @param pattern
+ * @param flags
+ */
+export declare function stringToRegexp(pattern: string | RegExp, flags?: string): RegExp;
+/**
+ * Get value by path.
+ *
+ * @param obj
+ * @param path
+ * @param orElse
+ */
+export declare function getValueByPath(obj: object, path: string, orElse?: unknown): unknown;
+/**
+ * Select object keys.
+ *
+ * @param obj
+ * @param keys
+ */
+export declare function selectObjectKeys<T extends object>(obj: T, keys: string[]): Partial<T>;
+/**
+ * Exclude object keys.
+ *
+ * @param obj
+ * @param keys
+ */
+export declare function excludeObjectKeys<T extends object>(obj: T, keys: string | string[]): Partial<T>;
+/**
+ * Filter.
+ */
+export declare type Filter = {
+	where?: WhereClause;
+	order?: OrderClause;
+	limit?: number;
+	skip?: number;
+	fields?: FieldsClause;
+	include?: IncludeClause;
+};
+/**
+ * Item filter.
+ */
+export declare type ItemFilter = Pick<Filter, "fields" | "include">;
+/**
+ * Where clause.
+ *
+ * @example
+ * ```ts
+ * value => value.featured === true
+ * {foo: 'bar'}
+ * {foo: {eq: 'bar'}}
+ * {foo: {neq: 'bar'}}
+ * {foo: {gt: 5}}
+ * {foo: {lt: 10}}
+ * {foo: {gte: 5}}
+ * {foo: {lte: 10}}
+ * {foo: {inq: ['bar', 'baz']}}
+ * {foo: {nin: ['bar', 'baz']}}
+ * {foo: {between: [5, 10]}}
+ * {foo: {exists: true}}
+ * {foo: {like: 'bar'}}
+ * {foo: {ilike: 'BaR'}}
+ * {foo: {nlike: 'bar'}}
+ * {foo: {nilike: 'BaR'}}
+ * {foo: {regexp: 'ba.+'}}
+ * {foo: {regexp: 'ba.+', flags: 'i'}}
+ * {and: [...]}
+ * {or: [...]}
+ * ```
+ */
+export declare type WhereClause = FunctionClause | PropertiesClause | AndClause | OrClause;
+/**
+ * Function clause.
+ *
+ * @example
+ * ```ts
+ * (value) => value.featured === true;
+ * ```
+ */
+export type FunctionClause = (value: ModelData) => boolean;
+/**
+ * Properties clause.
+ *
+ * @example
+ * ```ts
+ * {
+ *   name: {inq: ['John', 'Mary']},
+ *   status: 'ACTIVE',
+ *   age: {gte: 40}
+ * }
+ * ```
+ */
+export type PropertiesClause = {
+	[property: string]: OperatorClause | string | number | boolean | RegExp | null | undefined;
+};
+/**
+ * Operator clause.
+ *
+ * @example
+ * ```ts
+ * {eq: 'bar'}
+ * {neq: 'bar'}
+ * {gt: 5}
+ * {lt: 10}
+ * {gte: 5}
+ * {lte: 10}
+ * {inq: ['bar', 'baz']}
+ * {nin: ['bar', 'baz']}
+ * {between: [5, 10]}
+ * {exists: true}
+ * {like: 'bar'}
+ * {ilike: 'BaR'}
+ * {nlike: 'bar'}
+ * {nilike: 'BaR'}
+ * {regexp: 'ba.+'}
+ * {regexp: 'ba.+', flags: 'i'}
+ * ```
+ */
+export declare type OperatorClause = {
+	eq?: unknown;
+	neq?: unknown;
+	gt?: string | number;
+	gte?: string | number;
+	lt?: string | number;
+	lte?: string | number;
+	inq?: unknown[];
+	nin?: unknown[];
+	between?: readonly [
+		string | number,
+		string | number
+	];
+	exists?: boolean;
+	like?: string | RegExp;
+	nlike?: string | RegExp;
+	ilike?: string | RegExp;
+	nilike?: string | RegExp;
+	regexp?: string | RegExp;
+	flags?: string;
+};
+/**
+ * And clause.
+ *
+ * @example
+ * ```ts
+ * {
+ *   and: [...],
+ * }
+ * ```
+ */
+export interface AndClause {
+	and: WhereClause[];
+}
+/**
+ * Or clause.
+ *
+ * @example
+ * ```ts
+ * {
+ *   or: [...],
+ * }
+ * ```
+ */
+export interface OrClause {
+	or: WhereClause[];
+}
+/**
+ * Order clause.
+ *
+ * @example
+ * ```ts
+ * 'prop'
+ * 'prop ASC'
+ * 'prop DESC';
+ * ['prop1', 'prop2'];
+ * ['prop1 ASC', 'prop2 DESC'];
+ * ```
+ */
+export type OrderClause = string | string[];
+/**
+ * Fields.
+ *
+ * @example
+ * ```ts
+ * 'prop'
+ * ['prop1', 'prop2']
+ * ```
+ */
+export type FieldsClause = string | NormalizedFieldsClause;
+/**
+ * Normalized fields clause.
+ *
+ * @example
+ * ```ts
+ * [
+ *   'prop1',
+ *   'prop2',
+ * ]
+ * ```
+ */
+export type NormalizedFieldsClause = string[];
+/**
+ * Include clause.
+ *
+ * @example
+ * ```ts
+ * 'customers'
+ * ```
+ *
+ * @example
+ * ```ts
+ * [
+ *   'customers',
+ *   'orders',
+ * ]
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   customer: 'orders'
+ * }
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   customer: {
+ *     address: 'city',
+ *   },
+ * }
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   customer: [
+ *     'orders',
+ *     {address: 'city'},
+ *   ],
+ * }
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   relation: 'customer',
+ *   scope: {
+ *     where: {removed: false},
+ *     order: 'createdAt DESC',
+ *     skip: 0,
+ *     limit: 16,
+ *     fields: ['id', 'name', 'removed'],
+ *     include: 'address',
+ *   }
+ * }
+ * ```
+ */
+export declare type IncludeClause = string | string[] | NestedIncludeClause | NestedIncludeClause[] | NormalizedIncludeClause | NormalizedIncludeClause[];
+/**
+ * Nested include clause.
+ *
+ * @example
+ * ```ts
+ * {
+ *   customer: 'orders'
+ * }
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   customer: {
+ *     address: 'city',
+ *   },
+ * }
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   customer: [
+ *     'orders',
+ *     {address: 'city'},
+ *   ],
+ * }
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   relation: 'customer',
+ *   scope: {
+ *     where: {removed: false},
+ *     order: 'createdAt DESC',
+ *     skip: 0,
+ *     limit: 16,
+ *     fields: ['id', 'name', 'removed'],
+ *     include: 'address',
+ *   }
+ * }
+ * ```
+ */
+export declare type NestedIncludeClause = {
+	[property: string]: IncludeClause;
+};
+/**
+ * Inclusion.
+ *
+ * @example
+ * ```ts
+ * {
+ *   relation: 'customer',
+ * }
+ * ```
+ *
+ * @example
+ * ```ts
+ * {
+ *   relation: 'customer',
+ *   scope: {
+ *     where: {removed: false},
+ *     order: 'createdAt DESC',
+ *     skip: 0,
+ *     limit: 16,
+ *     fields: ['id', 'name', 'removed'],
+ *     include: 'address',
+ *   }
+ * }
+ * ```
+ */
+export declare type NormalizedIncludeClause = {
+	relation: string;
+	scope?: Filter;
+};
+/**
+ * Slice clause tool.
+ */
+export declare class SliceClauseTool extends Service {
+	/**
+	 * Slice.
+	 *
+	 * @param entities
+	 * @param skip
+	 * @param limit
+	 */
+	slice(entities: ModelData[], skip?: number, limit?: number): ModelData[];
+	/**
+	 * Validate skip clause.
+	 *
+	 * @param skip
+	 */
+	static validateSkipClause(skip: number | undefined): void;
+	/**
+	 * Validate limit clause.
+	 *
+	 * @param limit
+	 */
+	static validateLimitClause(limit: number | undefined): void;
+}
+/**
+ * Order clause tool.
+ */
+export declare class OrderClauseTool extends Service {
+	/**
+	 * Sort.
+	 *
+	 * @param entities
+	 * @param clause
+	 */
+	sort(entities: ModelData[], clause: OrderClause | undefined): void;
+	/**
+	 * Validate order clause.
+	 *
+	 * @param clause
+	 */
+	static validateOrderClause(clause: OrderClause | undefined): void;
+	/**
+	 * Normalize order clause.
+	 *
+	 * @param clause
+	 */
+	static normalizeOrderClause(clause: OrderClause | undefined): string[] | undefined;
+}
+/**
+ * Where clause tool.
+ */
+export declare class WhereClauseTool extends Service {
+	/**
+	 * Filter.
+	 *
+	 * @param entities
+	 * @param where
+	 */
+	filter(entities: ModelData[], where: WhereClause | undefined): ModelData[];
+	/**
+	 * Validate where clause.
+	 *
+	 * @param clause
+	 */
+	static validateWhereClause(clause: WhereClause | undefined): void;
+}
+/**
+ * Field clause tool.
+ */
+export declare class FieldsClauseTool extends Service {
+	/**
+	 * Filter.
+	 *
+	 * @param entities
+	 * @param modelName
+	 * @param clause
+	 */
+	filter<T extends ModelData | ModelData[]>(entities: T, modelName: string, clause: FieldsClause | undefined): T;
+	/**
+	 * Validate fields clause.
+	 *
+	 * @param clause
+	 */
+	static validateFieldsClause(clause: FieldsClause | undefined): void;
+	/**
+	 * Normalize fields clause.
+	 *
+	 * @param clause
+	 */
+	static normalizeFieldsClause(clause: FieldsClause | undefined): NormalizedFieldsClause | undefined;
+}
+/**
+ * Include clause tool.
+ */
+export declare class IncludeClauseTool extends Service {
+	/**
+	 * Include to.
+	 *
+	 * @param entities
+	 * @param modelName
+	 * @param clause
+	 */
+	includeTo(entities: ModelData[], modelName: string, clause: IncludeClause | undefined): Promise<void>;
+	/**
+	 * Validate include clause.
+	 *
+	 * @param clause
+	 */
+	static validateIncludeClause(clause: IncludeClause | undefined): void;
+	/**
+	 * Validate scope clause.
+	 *
+	 * @param clause
+	 */
+	static validateScopeClause(clause: Filter | undefined): void;
+	/**
+	 * Normalize include clause.
+	 *
+	 * @param clause
+	 */
+	static normalizeIncludeClause(clause: IncludeClause | undefined): NormalizedIncludeClause[];
+	/**
+	 * Normalize scope clause.
+	 *
+	 * @param clause
+	 */
+	static normalizeScopeClause(clause: Filter | undefined): Filter | undefined;
+}
+/**
+ * Operator clause tool.
+ */
+export declare class OperatorClauseTool extends Service {
+	/**
+	 * Compare.
+	 *
+	 * @param val1
+	 * @param val2
+	 */
+	compare(val1: unknown, val2: unknown): number;
+	/**
+	 * Test all operators.
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testAll(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test eq/neq operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   eq: 'foo',
+	 * }
+	 * ```
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   neq: 'foo',
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testEqNeq(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test lt/gt/lte/gte operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   lt: 10,
+	 * }
+	 * ```
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   lte: 10,
+	 * }
+	 * ```
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   gt: 10,
+	 * }
+	 * ```
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   gte: 10,
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testGtLt(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test inc operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   inc: ['foo', 'bar'],
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testInq(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test nin operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   nin: ['foo', 'bar'],
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testNin(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test between operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   between: [10, 20],
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testBetween(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test exists operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   exists: true,
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testExists(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test like operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   like: 'foo',
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testLike(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test nlike operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   nlike: 'foo',
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testNlike(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test ilike operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   ilike: 'foo',
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testIlike(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test nilike operator.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   nilike: 'foo',
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testNilike(clause: object, value: unknown): boolean | undefined;
+	/**
+	 * Test regexp.
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   regexp: 'foo.*',
+	 * }
+	 * ```
+	 *
+	 * @example
+	 * ```ts
+	 * {
+	 *   regexp: 'foo.*',
+	 *   flags: 'i',
+	 * }
+	 * ```
+	 *
+	 * @param clause
+	 * @param value
+	 */
+	testRegexp(clause: object, value: unknown): boolean | undefined;
+}
+/**
+ * Adapter.
+ */
+export declare class Adapter extends Service {
+	/**
+	 * Settings.
+	 */
+	get settings(): AnyObject | undefined;
+	/**
+	 * Constructor.
+	 *
+	 * @param container
+	 * @param settings
+	 */
+	constructor(container?: ServiceContainer, settings?: AnyObject);
+	/**
+	 * Create.
+	 *
+	 * @param modelName
+	 * @param modelData
+	 * @param filter
+	 */
+	create(modelName: string, modelData: ModelData, filter?: ItemFilter): Promise<ModelData>;
+	/**
+	 * Replace by id.
+	 *
+	 * @param modelName
+	 * @param id
+	 * @param modelData
+	 * @param filter
+	 */
+	replaceById(modelName: string, id: ModelId, modelData: ModelData, filter?: ItemFilter): Promise<ModelData>;
+	/**
+	 * Patch by id.
+	 *
+	 * @param modelName
+	 * @param id
+	 * @param modelData
+	 * @param filter
+	 */
+	patchById(modelName: string, id: ModelId, modelData: ModelData, filter?: ItemFilter): Promise<ModelData>;
+	/**
+	 * Find.
+	 *
+	 * @param modelName
+	 * @param filter
+	 */
+	find(modelName: string, filter?: Filter): Promise<ModelData[]>;
+	/**
+	 * Find by id.
+	 *
+	 * @param modelName
+	 * @param id
+	 * @param filter
+	 */
+	findById(modelName: string, id: ModelId, filter?: Filter): Promise<ModelData>;
+	/**
+	 * Delete.
+	 *
+	 * @param modelName
+	 * @param where
+	 */
+	delete(modelName: string, where?: WhereClause): Promise<number>;
+	/**
+	 * Delete by id.
+	 *
+	 * @param modelName
+	 * @param id
+	 */
+	deleteById(modelName: string, id: ModelId): Promise<boolean>;
+	/**
+	 * Exists.
+	 *
+	 * @param modelName
+	 * @param id
+	 */
+	exists(modelName: string, id: ModelId): Promise<boolean>;
+	/**
+	 * Count.
+	 *
+	 * @param modelName
+	 * @param where
+	 */
+	count(modelName: string, where?: WhereClause): Promise<number>;
+}
+/**
+ * Adapter loader.
+ */
+export declare class AdapterLoader extends Service {
+	/**
+	 * Load by name.
+	 *
+	 * @param adapterName
+	 * @param settings
+	 */
+	loadByName(adapterName: string, settings?: AnyObject): Promise<Adapter>;
+}
+/**
+ * Adapter registry.
+ */
+export declare class AdapterRegistry extends Service {
+	/**
+	 * Get adapter.
+	 *
+	 * @param datasourceName
+	 */
+	getAdapter(datasourceName: string): Promise<Adapter>;
+}
+/**
+ * Relation type.
+ */
+export declare enum RelationType {
+	BELONGS_TO = "belongsTo",
+	HAS_ONE = "hasOne",
+	HAS_MANY = "hasMany",
+	REFERENCES_MANY = "referencesMany"
+}
+/**
+ * Relation definition.
+ *
+ * @example Available options.
+ * ```ts
+ * {
+ *   type: RelationType;
+ *   model?: string;
+ *   foreignKey?: string;
+ *   polymorphic?: boolean | string;
+ *   discriminator?: string;
+ * }
+ * ```
+ */
+export declare type RelationDefinition = 
+// belongsTo
+BelongsToDefinition | PolyBelongsToDefinition
+// hasOne
+ | HasOneDefinition | PolyHasOneDefinitionWithTargetRelationName | PolyHasOneDefinitionWithTargetKeys
+// hasMany
+ | HasManyDefinition | PolyHasManyDefinitionWithTargetRelationName | PolyHasManyDefinitionWithTargetKeys
+// referencesMany
+ | ReferencesManyDefinition;
+/**
+ * The regular "belongsTo" relation.
+ *
+ * @example Required options only.
+ * ```
+ * {
+ *   type: RelationType.BELONGS_TO,
+ *   model: 'model',
+ * }
+ * ```
+ *
+ * @example Verbose definition.
+ * ```
+ * {
+ *   type: RelationType.BELONGS_TO,
+ *   model: 'model',
+ *   foreignKey: 'modelId',
+ * }
+ * ```
+ */
+export declare type BelongsToDefinition = {
+	type: RelationType.BELONGS_TO;
+	polymorphic?: false;
+	model: string;
+	foreignKey?: string;
+};
+/**
+ * The polymorphic "belongsTo" relation.
+ *
+ * @example Required fields only.
+ * ```
+ * {
+ *   type: RelationType.BELONGS_TO,
+ *   polymorphic: true,
+ * }
+ * ```
+ *
+ * @example Verbose definition.
+ * ```
+ * {
+ *   type: RelationType.BELONGS_TO,
+ *   polymorphic: true,
+ *   foreignKey: 'referenceId',
+ *   discriminator: 'referenceType,
+ * }
+ * ```
+ */
+export declare type PolyBelongsToDefinition = {
+	type: RelationType.BELONGS_TO;
+	polymorphic: true;
+	foreignKey?: string;
+	discriminator?: string;
+};
+/**
+ * The regular "hasOne" relation.
+ *
+ * @example
+ * ```ts
+ * {
+ *   type: RelationType.HAS_ONE,
+ *   model: 'model',
+ *   foreignKey: 'modelId',
+ * }
+ * ```
+ */
+export declare type HasOneDefinition = {
+	type: RelationType.HAS_ONE;
+	model: string;
+	polymorphic?: false;
+	foreignKey?: string;
+	discriminator?: undefined;
+};
+/**
+ * The polymorphic "hasOne" relation with a target relation name.
+ *
+ * @example
+ * ```ts
+ * {
+ *   type: RelationType.HAS_ONE,
+ *   model: 'model',
+ *   polymorphic: 'reference',
+ * }
+ * ```
+ */
+export declare type PolyHasOneDefinitionWithTargetRelationName = {
+	type: RelationType.HAS_ONE;
+	model: string;
+	polymorphic: string;
+	foreignKey?: undefined;
+	discriminator?: undefined;
+};
+/**
+ * The polymorphic "hasOne" relation with target relation keys.
+ *
+ * @example Required options only.
+ * ```
+ * {
+ *   type: RelationType.HAS_ONE,
+ *   model: 'model',
+ *   polymorphic: true,
+ * }
+ * ```
+ *
+ * @example Verbose definition.
+ * ```
+ * {
+ *   type: RelationType.HAS_ONE,
+ *   model: 'model',
+ *   polymorphic: true,
+ *   foreignKey: 'referenceId',
+ *   discriminator: 'referenceType,
+ * }
+ * ```
+ */
+export declare type PolyHasOneDefinitionWithTargetKeys = {
+	type: RelationType.HAS_ONE;
+	model: string;
+	polymorphic: true;
+	foreignKey?: string;
+	discriminator?: string;
+};
+/**
+ * The regular "hasMany" relation.
+ *
+ * @example
+ * ```ts
+ * {
+ *   type: RelationType.HAS_MANY,
+ *   model: 'model',
+ *   foreignKey: 'modelId',
+ * }
+ * ```
+ */
+export declare type HasManyDefinition = {
+	type: RelationType.HAS_MANY;
+	model: string;
+	polymorphic?: false;
+	foreignKey?: string;
+	discriminator?: undefined;
+};
+/**
+ * The polymorphic "hasMany" relation with a target relation name.
+ *
+ * @example
+ * ```ts
+ * {
+ *   type: RelationType.HAS_MANY,
+ *   model: 'model',
+ *   polymorphic: 'reference',
+ * }
+ * ```
+ */
+export declare type PolyHasManyDefinitionWithTargetRelationName = {
+	type: RelationType.HAS_MANY;
+	model: string;
+	polymorphic: string;
+	foreignKey?: undefined;
+	discriminator?: undefined;
+};
+/**
+ * The polymorphic "hasMany" relation with target relation keys.
+ *
+ * @example Required options only.
+ * ```
+ * {
+ *   type: RelationType.HAS_MANY,
+ *   model: 'model',
+ *   polymorphic: true,
+ * }
+ * ```
+ *
+ * @example Verbose definition.
+ * ```
+ * {
+ *   type: RelationType.HAS_MANY,
+ *   model: 'model',
+ *   polymorphic: true,
+ *   foreignKey: 'referenceId',
+ *   discriminator: 'referenceType,
+ * }
+ * ```
+ */
+export declare type PolyHasManyDefinitionWithTargetKeys = {
+	type: RelationType.HAS_MANY;
+	model: string;
+	polymorphic: true;
+	foreignKey?: string;
+	discriminator?: string;
+};
+/**
+ * The regular "referencesMany" relation.
+ *
+ * @example Required options only.
+ * ```
+ * {
+ *   type: RelationType.REFERENCES_MANY,
+ *   model: 'model',
+ * }
+ * ```
+ *
+ * @example Verbose definition.
+ * ```
+ * {
+ *   type: RelationType.REFERENCES_MANY,
+ *   model: 'model',
+ *   foreignKey: 'modelIds',
+ * }
+ * ```
+ */
+export declare type ReferencesManyDefinition = {
+	type: RelationType.REFERENCES_MANY;
+	model: string;
+	foreignKey?: string;
+	discriminator?: undefined;
+};
+/**
+ * Data type.
+ */
+export declare enum DataType {
+	ANY = "any",
+	STRING = "string",
+	NUMBER = "number",
+	BOOLEAN = "boolean",
+	ARRAY = "array",
+	OBJECT = "object"
+}
+/**
+ * Full property definition.
+ */
+export declare type FullPropertyDefinition = {
+	type: DataType;
+	itemType?: DataType;
+	model?: string;
+	primaryKey?: boolean;
+	columnName?: string;
+	columnType?: string;
+	required?: boolean;
+	default?: unknown;
+};
+/**
+ * Property definition.
+ */
+export declare type PropertyDefinition = DataType | FullPropertyDefinition;
+/**
+ * Properties definition validator.
+ */
+export declare class PropertiesDefinitionValidator extends Service {
+	/**
+	 * Validate.
+	 *
+	 * @param modelName
+	 * @param propDefs
+	 */
+	validate(modelName: string, propDefs: PropertyDefinitionMap): void;
+}
+/**
+ * Primary keys definition validator.
+ */
+export declare class PrimaryKeysDefinitionValidator extends Service {
+	/**
+	 * Validate.
+	 *
+	 * @param modelName
+	 * @param propDefs
+	 */
+	validate(modelName: string, propDefs: PropertyDefinitionMap): void;
+}
+/**
+ * Default values definition validator.
+ */
+export declare class DefaultValuesDefinitionValidator extends Service {
+	/**
+	 * Validate.
+	 *
+	 * @param modelName
+	 * @param propDefs
+	 */
+	validate(modelName: string, propDefs: PropertyDefinitionMap): void;
+}
+/**
+ * Property definition map.
+ */
+export declare type PropertyDefinitionMap = {
+	[name: string]: PropertyDefinition;
+};
+/**
+ * Relation definition map.
+ */
+export declare type RelationDefinitionMap = {
+	[name: string]: RelationDefinition;
+};
+/**
+ * Model definition.
+ */
+export declare type ModelDefinition = {
+	name: string;
+	datasource?: string;
+	base?: string;
+	tableName?: string;
+	properties?: PropertyDefinitionMap;
+	relations?: RelationDefinitionMap;
+};
+/**
+ * Relations definition validator.
+ */
+export declare class RelationsDefinitionValidator extends Service {
+	/**
+	 * Validate.
+	 *
+	 * @param modelName
+	 * @param relDefs
+	 */
+	validate(modelName: string, relDefs: RelationDefinitionMap): void;
+}
+/**
+ * Model data validator.
+ */
+export declare class ModelDataValidator extends Service {
+	/**
+	 * Validate.
+	 *
+	 * @param modelName
+	 * @param modelData
+	 * @param isPartial
+	 */
+	validate(modelName: string, modelData: ModelData, isPartial?: boolean): void;
+	/**
+	 * Validate property value.
+	 *
+	 * @param modelName
+	 * @param propName
+	 * @param propDef
+	 * @param propValue
+	 */
+	validatePropertyValue(modelName: string, propName: string, propDef: PropertyDefinition, propValue: unknown): void;
+}
+/**
+ * Model data sanitizer.
+ */
+export declare class ModelDataSanitizer extends Service {
+	/**
+	 * Sanitize.
+	 *
+	 * @param modelName
+	 * @param modelData
+	 */
+	sanitize(modelName: string, modelData: ModelData): ModelData;
+}
+/**
+ * Default primary key property name.
+ */
+export type DEFAULT_PRIMARY_KEY_PROPERTY_NAME = "id";
+/**
+ * Model definition utils.
+ */
+export declare class ModelDefinitionUtils extends Service {
+	/**
+	 * Get primary key as property name.
+	 *
+	 * @param modelName
+	 */
+	getPrimaryKeyAsPropertyName(modelName: string): string;
+	/**
+	 * Get primary key as column name.
+	 *
+	 * @param modelName
+	 */
+	getPrimaryKeyAsColumnName(modelName: string): string;
+	/**
+	 * Get table name by model name.
+	 *
+	 * @param modelName
+	 */
+	getTableNameByModelName(modelName: string): string;
+	/**
+	 * Get column name by property name.
+	 *
+	 * @param modelName
+	 * @param propertyName
+	 */
+	getColumnNameByPropertyName(modelName: string, propertyName: string): string;
+	/**
+	 * Get default property value.
+	 *
+	 * @param modelName
+	 * @param propertyName
+	 */
+	getDefaultPropertyValue(modelName: string, propertyName: string): unknown;
+	/**
+	 * Set default values to empty properties.
+	 *
+	 * @param modelName
+	 * @param modelData
+	 * @param onlyProvidedProperties
+	 */
+	setDefaultValuesToEmptyProperties<T extends ModelData>(modelName: string, modelData: T, onlyProvidedProperties?: boolean): T;
+	/**
+	 * Convert property names to column names.
+	 *
+	 * @param modelName
+	 * @param modelData
+	 */
+	convertPropertyNamesToColumnNames(modelName: string, modelData: ModelData): ModelData;
+	/**
+	 * Convert column names to property names.
+	 *
+	 * @param modelName
+	 * @param tableData
+	 */
+	convertColumnNamesToPropertyNames(modelName: string, tableData: ModelData): ModelData;
+	/**
+	 * Get data type by property name.
+	 *
+	 * @param modelName
+	 * @param propertyName
+	 */
+	getDataTypeByPropertyName(modelName: string, propertyName: string): DataType;
+	/**
+	 * Get own properties definition of primary keys.
+	 *
+	 * @param modelName
+	 */
+	getOwnPropertiesDefinitionOfPrimaryKeys(modelName: string): PropertyDefinitionMap;
+	/**
+	 * Get own properties definition without primary keys.
+	 *
+	 * @param modelName
+	 */
+	getOwnPropertiesDefinitionWithoutPrimaryKeys(modelName: string): PropertyDefinitionMap;
+	/**
+	 * Get properties definition in base model hierarchy.
+	 *
+	 * @param modelName
+	 */
+	getPropertiesDefinitionInBaseModelHierarchy(modelName: string): PropertyDefinitionMap;
+	/**
+	 * Get own relations definition.
+	 *
+	 * @param modelName
+	 */
+	getOwnRelationsDefinition(modelName: string): RelationDefinitionMap;
+	/**
+	 * Get relations definition in base model hierarchy.
+	 *
+	 * @param modelName
+	 */
+	getRelationsDefinitionInBaseModelHierarchy(modelName: string): RelationDefinitionMap;
+	/**
+	 * Get relation definition by name.
+	 *
+	 * @param modelName
+	 * @param relationName
+	 */
+	getRelationDefinitionByName(modelName: string, relationName: string): RelationDefinition;
+	/**
+	 * Exclude object keys by relation names.
+	 *
+	 * @param modelName
+	 * @param modelData
+	 */
+	excludeObjectKeysByRelationNames<T extends ModelData>(modelName: string, modelData: T): Partial<T>;
+}
+/**
+ * Model definition validator.
+ */
+export declare class ModelDefinitionValidator extends Service {
+	/**
+	 * Validate.
+	 *
+	 * @param modelDef
+	 */
+	validate(modelDef: ModelDefinition): void;
+}
+/**
+ * Datasource definition.
+ */
+export declare type DatasourceDefinition = {
+	name: string;
+	adapter: string;
+};
+/**
+ * Datasource definition validator.
+ */
+export declare class DatasourceDefinitionValidator extends Service {
+	/**
+	 * Validate.
+	 *
+	 * @param datasourceDef
+	 */
+	validate(datasourceDef: DatasourceDefinition): void;
+}
+/**
+ * Definition registry.
+ */
+export declare class DefinitionRegistry extends Service {
+	/**
+	 * Add datasource.
+	 *
+	 * @param datasourceDef
+	 */
+	addDatasource(datasourceDef: DatasourceDefinition): void;
+	/**
+	 * Has datasource.
+	 *
+	 * @param name
+	 */
+	hasDatasource(name: string): boolean;
+	/**
+	 * Get datasource.
+	 *
+	 * @param name
+	 */
+	getDatasource(name: string): DatasourceDefinition;
+	/**
+	 * Add model.
+	 *
+	 * @param modelDef
+	 */
+	addModel(modelDef: ModelDefinition): void;
+	/**
+	 * Has model.
+	 *
+	 * @param name
+	 */
+	hasModel(name: string): boolean;
+	/**
+	 * Get model.
+	 *
+	 * @param name
+	 */
+	getModel(name: string): ModelDefinition;
+}
+/**
+ * Repository.
+ */
+export declare class Repository<Data extends ModelData = ModelData, IdType extends ModelId = ModelId, IdName extends string = DEFAULT_PRIMARY_KEY_PROPERTY_NAME, FlatData extends ModelData = Flatten<Data>> extends Service {
+	/**
+	 * Model name.
+	 */
+	get modelName(): string;
+	/**
+	 * Datasource name.
+	 */
+	get datasourceName(): string;
+	/**
+	 * Constructor.
+	 *
+	 * @param container
+	 * @param modelName
+	 */
+	constructor(container: ServiceContainer, modelName: string);
+	/**
+	 * Get adapter.
+	 */
+	getAdapter(): Promise<Adapter>;
+	/**
+	 * Create.
+	 *
+	 * @param data
+	 * @param filter
+	 */
+	create(data: OptionalUnlessRequiredId<IdName, FlatData>, filter?: ItemFilter): Promise<FlatData>;
+	/**
+	 * Replace by id.
+	 *
+	 * @param id
+	 * @param data
+	 * @param filter
+	 */
+	replaceById(id: IdType, data: WithoutId<IdName, FlatData>, filter?: ItemFilter): Promise<FlatData>;
+	/**
+	 * Replace or create.
+	 *
+	 * @param data
+	 * @param filter
+	 */
+	replaceOrCreate(data: OptionalUnlessRequiredId<IdName, Data>, filter?: ItemFilter): Promise<FlatData>;
+	/**
+	 * Patch by id.
+	 *
+	 * @param id
+	 * @param data
+	 * @param filter
+	 */
+	patchById(id: IdType, data: PartialWithoutId<IdName, Data>, filter?: ItemFilter): Promise<FlatData>;
+	/**
+	 * Find.
+	 *
+	 * @param filter
+	 */
+	find(filter?: Filter): Promise<FlatData[]>;
+	/**
+	 * Find one.
+	 *
+	 * @param filter
+	 */
+	findOne(filter?: ItemFilter): Promise<FlatData | undefined>;
+	/**
+	 * Find by id.
+	 *
+	 * @param id
+	 * @param filter
+	 */
+	findById(id: IdType, filter?: ItemFilter): Promise<FlatData>;
+	/**
+	 * Delete.
+	 *
+	 * @param where
+	 */
+	delete(where?: WhereClause): Promise<number>;
+	/**
+	 * Delete by id.
+	 *
+	 * @param id
+	 */
+	deleteById(id: IdType): Promise<boolean>;
+	/**
+	 * Exists.
+	 *
+	 * @param id
+	 */
+	exists(id: IdType): Promise<boolean>;
+	/**
+	 * Count.
+	 *
+	 * @param where
+	 */
+	count(where?: WhereClause): Promise<number>;
+}
+/**
+ * Removes id field.
+ */
+export type WithoutId<IdName extends string, Data extends ModelData> = Flatten<Omit<Data, IdName>>;
+/**
+ * Makes fields as optional and remove id field.
+ */
+export type PartialWithoutId<IdName extends string, Data extends ModelData> = Flatten<Partial<Omit<Data, IdName>>>;
+/**
+ * Makes the required id field as optional.
+ */
+export type OptionalUnlessRequiredId<IdName extends string, Data extends ModelData> = Flatten<Data extends {
+	[K in IdName]: any;
+} ? PartialBy<Data, IdName> : Data>;
+/**
+ * Repository registry.
+ */
+export declare class RepositoryRegistry extends Service {
+	/**
+	 * Set repository registry.
+	 *
+	 * @param ctor
+	 */
+	setRepositoryCtor(ctor: Constructor<Repository<any, any, any>>): void;
+	/**
+	 * Get repository.
+	 *
+	 * @param modelName
+	 */
+	getRepository<Data extends ModelData = ModelData, IdType extends ModelId = ModelId, IdName extends string = DEFAULT_PRIMARY_KEY_PROPERTY_NAME>(modelName: string): Repository<Data, IdType, IdName>;
+}
+/**
+ * Schema.
+ */
+export declare class Schema extends Service {
+	/**
+	 * Define datasource.
+	 *
+	 * @param datasourceDef
+	 */
+	defineDatasource(datasourceDef: DatasourceDefinition): this;
+	/**
+	 * Define model.
+	 *
+	 * @param modelDef
+	 */
+	defineModel(modelDef: ModelDefinition): this;
+	/**
+	 * Get repository.
+	 *
+	 * @param modelName
+	 */
+	getRepository<Data extends ModelData = ModelData, IdType extends ModelId = ModelId, IdName extends string = DEFAULT_PRIMARY_KEY_PROPERTY_NAME>(modelName: string): Repository<Data, IdType, IdName>;
+}
+/**
+ * Not implemented error.
+ */
+export declare class NotImplementedError extends Errorf {
+}
+/**
+ * Invalid argument error.
+ */
+export declare class InvalidArgumentError extends Errorf {
+}
+/**
+ * Invalid operator value error.
+ */
+export declare class InvalidOperatorValueError extends Error {
+	/**
+	 * Constructor.
+	 *
+	 * @param operator
+	 * @param expects
+	 * @param value
+	 */
+	constructor(operator: string, expects: string, value: unknown);
+}
+/**
+ * Has one resolver.
+ */
+export declare class HasOneResolver extends Service {
+	/**
+	 * Include to.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param foreignKey
+	 * @param scope
+	 */
+	includeTo(entities: ModelData[], sourceName: string, targetName: string, relationName: string, foreignKey: string, scope?: Filter): Promise<void>;
+	/**
+	 * Include polymorphic to.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param foreignKey
+	 * @param discriminator
+	 * @param scope
+	 */
+	includePolymorphicTo(entities: ModelData[], sourceName: string, targetName: string, relationName: string, foreignKey: string, discriminator: string, scope?: Filter): Promise<void>;
+	/**
+	 * Include polymorphic by relation name.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param targetRelationName
+	 * @param scope
+	 */
+	includePolymorphicByRelationName(entities: ModelData[], sourceName: string, targetName: string, relationName: string, targetRelationName: string, scope?: Filter): Promise<void>;
+}
+/**
+ * Has many resolver.
+ */
+export declare class HasManyResolver extends Service {
+	/**
+	 * Include to.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param foreignKey
+	 * @param scope
+	 */
+	includeTo(entities: ModelData[], sourceName: string, targetName: string, relationName: string, foreignKey: string, scope?: Filter): Promise<void>;
+	/**
+	 * Include polymorphic to.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param foreignKey
+	 * @param discriminator
+	 * @param scope
+	 */
+	includePolymorphicTo(entities: ModelData[], sourceName: string, targetName: string, relationName: string, foreignKey: string, discriminator: string, scope?: Filter): Promise<void>;
+	/**
+	 * Include polymorphic by relation name.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param targetRelationName
+	 * @param scope
+	 */
+	includePolymorphicByRelationName(entities: ModelData[], sourceName: string, targetName: string, relationName: string, targetRelationName: string, scope?: Filter): Promise<void>;
+}
+/**
+ * Belongs to resolver.
+ */
+export declare class BelongsToResolver extends Service {
+	/**
+	 * Include to.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param foreignKey
+	 * @param scope
+	 */
+	includeTo(entities: ModelData[], sourceName: string, targetName: string, relationName: string, foreignKey?: string, scope?: Filter): Promise<void>;
+	/**
+	 * Include polymorphic to.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param relationName
+	 * @param foreignKey
+	 * @param discriminator
+	 * @param scope
+	 */
+	includePolymorphicTo(entities: ModelData[], sourceName: string, relationName: string, foreignKey?: string, discriminator?: string, scope?: Filter): Promise<void>;
+}
+/**
+ * References many resolver.
+ */
+export declare class ReferencesManyResolver extends Service {
+	/**
+	 * Include to.
+	 *
+	 * @param entities
+	 * @param sourceName
+	 * @param targetName
+	 * @param relationName
+	 * @param foreignKey
+	 * @param scope
+	 */
+	includeTo(entities: ModelData[], sourceName: string, targetName: string, relationName: string, foreignKey?: string, scope?: Filter): Promise<void>;
+}
+
+export {};

File diff suppressed because it is too large
+ 0 - 0
dist/main.js


+ 12 - 6
package.json

@@ -3,16 +3,19 @@
   "version": "0.0.30",
   "description": "Абстракция для работы с базами данных для Node.js",
   "type": "module",
-  "main": "src/index.js",
+  "main": "dist/main.js",
   "engines": {
     "node": ">=14"
   },
   "scripts": {
-    "lint": "eslint .",
-    "lint:fix": "eslint . --fix",
+    "build": "npm run build:cjs && npm run build:dts",
+    "build:cjs": "npx webpack --config webpack.config.cjs",
+    "build:dts": "npx dts-bundle-generator -o ./dist/main.d.ts ./src/index.d.ts",
+    "lint": "eslint ./src",
+    "lint:fix": "eslint ./src --fix",
     "format": "prettier --write \"./src/**/*.{js,ts}\"",
-    "test": "eslint . && c8 --reporter=text-summary mocha",
-    "test:coverage": "eslint . && c8 --reporter=text mocha",
+    "test": "npm run lint && c8 --reporter=text-summary mocha",
+    "test:coverage": "npm run lint && c8 --reporter=text mocha",
     "prepare": "npx husky install"
   },
   "repository": {
@@ -44,6 +47,7 @@
     "chai-as-promised": "^7.1.1",
     "chai-spies": "^1.0.0",
     "chai-subset": "^1.6.0",
+    "dts-bundle-generator": "^8.0.1",
     "eslint": "^8.47.0",
     "eslint-config-prettier": "^9.0.0",
     "eslint-plugin-chai-expect": "^3.0.0",
@@ -51,6 +55,8 @@
     "eslint-plugin-mocha": "^10.1.0",
     "husky": "^8.0.3",
     "mocha": "^10.2.0",
-    "prettier": "^3.0.1"
+    "prettier": "^3.0.1",
+    "webpack": "^5.88.2",
+    "webpack-cli": "^5.1.4"
   }
 }

+ 1 - 1
src/definition/model/relations/index.d.ts

@@ -1,3 +1,3 @@
 export * from './relation-type';
 export * from './relation-definition';
-export * from './relation-definition-validator';
+export * from './relations-definition-validator';

+ 6 - 0
tsconfig.json

@@ -0,0 +1,6 @@
+{
+  "compilerOptions": {
+    "rootDir": "src",
+    "noEmit": true
+  }
+}

+ 14 - 0
webpack.config.cjs

@@ -0,0 +1,14 @@
+const path = require('path');
+
+module.exports = {
+  mode: 'production',
+  entry: './src/index.js',
+  output: {
+    path: path.resolve(__dirname, 'dist'),
+    filename: "main.js",
+    library: {
+      type: 'commonjs',
+    },
+    clean: true,
+  },
+};

Some files were not shown because too many files changed in this diff