e22m4u 1 месяц назад
Родитель
Сommit
6a690c9eac
3 измененных файлов с 89 добавлено и 62 удалено
  1. 68 40
      src/filter/filter-clause.d.ts
  2. 20 19
      src/repository/repository.d.ts
  3. 1 3
      src/types.d.ts

+ 68 - 40
src/filter/filter-clause.d.ts

@@ -1,19 +1,24 @@
+import {ModelData} from '../types.js';
+
 /**
  * Filter clause.
  */
-export declare type FilterClause = {
-  where?: WhereClause;
-  order?: OrderClause;
+export declare type FilterClause<M extends object = ModelData> = {
+  where?: WhereClause<M>;
+  order?: OrderClause<M>;
   limit?: number;
   skip?: number;
-  fields?: FieldsClause;
-  include?: IncludeClause;
+  fields?: FieldsClause<M>;
+  include?: IncludeClause<M>;
 };
 
 /**
  * Item filter clause.
  */
-export declare type ItemFilterClause = Pick<FilterClause, 'fields' | 'include'>;
+export declare type ItemFilterClause<M extends object = ModelData> = Pick<
+  FilterClause<M>,
+  'fields' | 'include'
+>;
 
 /**
  * Where clause.
@@ -42,10 +47,21 @@ export declare type ItemFilterClause = Pick<FilterClause, 'fields' | 'include'>;
  * {or: [...]}
  * ```
  */
-export declare type WhereClause =
-  & Partial<AndClause>
-  & Partial<OrClause>
-  & PropertiesClause;
+export declare type WhereClause<M extends object = ModelData> = Partial<
+  AndClause<M>
+> &
+  Partial<OrClause<M>> &
+  PropertiesClause<M>;
+
+/**
+ * Primitive values.
+ */
+export declare type PrimitiveValue =
+  | string
+  | number
+  | boolean
+  | null
+  | undefined;
 
 /**
  * Properties clause.
@@ -59,16 +75,8 @@ export declare type WhereClause =
  * }
  * ```
  */
-export type PropertiesClause = {
-  [property: string]:
-    | OperatorClause
-    | string
-    | number
-    | boolean
-    | RegExp
-    | null
-    | undefined
-    | object;
+export declare type PropertiesClause<M extends object = ModelData> = {
+  [property in keyof M]?: OperatorClause | PrimitiveValue | RegExp;
 };
 
 /**
@@ -95,14 +103,14 @@ export type PropertiesClause = {
  * ```
  */
 export declare type OperatorClause = {
-  eq?: unknown;
-  neq?: unknown;
+  eq?: PrimitiveValue;
+  neq?: PrimitiveValue;
   gt?: string | number;
   gte?: string | number;
   lt?: string | number;
   lte?: string | number;
-  inq?: unknown[];
-  nin?: unknown[];
+  inq?: PrimitiveValue[];
+  nin?: PrimitiveValue[];
   between?: readonly [string | number, string | number];
   exists?: boolean;
   like?: string | RegExp;
@@ -123,8 +131,8 @@ export declare type OperatorClause = {
  * }
  * ```
  */
-export interface AndClause {
-  and: WhereClause[];
+export interface AndClause<M extends object = ModelData> {
+  and: WhereClause<M>[];
 }
 
 /**
@@ -137,10 +145,24 @@ export interface AndClause {
  * }
  * ```
  */
-export interface OrClause {
-  or: WhereClause[];
+export interface OrClause<M extends object = ModelData> {
+  or: WhereClause<M>[];
 }
 
+/**
+ * Order clause item.
+ *
+ * @example
+ * ```ts
+ * 'prop'
+ * 'prop ASC'
+ * 'prop DESC';
+ * ```
+ */
+export declare type OrderClauseItem<M extends object = ModelData> = {
+  [prop in keyof M]: prop | `${prop & string} ASC` | `${prop & string} DESC`;
+}[keyof M];
+
 /**
  * Order clause.
  *
@@ -153,7 +175,9 @@ export interface OrClause {
  * ['prop1 ASC', 'prop2 DESC'];
  * ```
  */
-export type OrderClause = string | string[];
+export declare type OrderClause<M extends object = ModelData> =
+  | OrderClauseItem<M>
+  | OrderClauseItem<M>[];
 
 /**
  * Fields.
@@ -164,7 +188,9 @@ export type OrderClause = string | string[];
  * ['prop1', 'prop2']
  * ```
  */
-export type FieldsClause = string | NormalizedFieldsClause;
+export declare type FieldsClause<M extends object = ModelData> =
+  | keyof M
+  | NormalizedFieldsClause<M>;
 
 /**
  * Normalized fields clause.
@@ -177,7 +203,8 @@ export type FieldsClause = string | NormalizedFieldsClause;
  * ]
  * ```
  */
-export type NormalizedFieldsClause = string[];
+export declare type NormalizedFieldsClause<M extends object = ModelData> =
+  (keyof M)[];
 
 /**
  * Include clause.
@@ -236,10 +263,11 @@ export type NormalizedFieldsClause = string[];
  * }
  * ```
  */
-export declare type IncludeClause =
-  | string
-  | NestedIncludeClause
-  | NormalizedIncludeClause
+export declare type IncludeClause<M extends object = ModelData> =
+  | keyof M
+  | (keyof M)[]
+  | NestedIncludeClause<M>
+  | NormalizedIncludeClause<M>
   | IncludeClause[];
 
 /**
@@ -286,8 +314,8 @@ export declare type IncludeClause =
  * }
  * ```
  */
-export declare type NestedIncludeClause = {
-  [property: string]: IncludeClause;
+export declare type NestedIncludeClause<M extends object = ModelData> = {
+  [property in keyof M]?: IncludeClause;
 };
 
 /**
@@ -315,7 +343,7 @@ export declare type NestedIncludeClause = {
  * }
  * ```
  */
-export declare type NormalizedIncludeClause = {
-  relation: string;
+export declare interface NormalizedIncludeClause<M extends object = ModelData> {
+  relation: keyof M;
   scope?: FilterClause;
-};
+}

+ 20 - 19
src/repository/repository.d.ts

@@ -17,7 +17,7 @@ export declare class Repository<
   Data extends object = ModelData,
   IdType extends ModelId = ModelId,
   IdName extends string = typeof DEFAULT_PRIMARY_KEY_PROPERTY_NAME,
-  FlatData extends ModelData = Flatten<Data>,
+  FlatData extends object = Flatten<Data>,
 > extends Service {
   // it fixes unused generic bug
   private _Data?: Data;
@@ -56,7 +56,7 @@ export declare class Repository<
    */
   create(
     data: OptionalUnlessRequiredId<IdName, FlatData>,
-    filter?: ItemFilterClause,
+    filter?: ItemFilterClause<FlatData>,
   ): Promise<FlatData>;
 
   /**
@@ -69,7 +69,7 @@ export declare class Repository<
   replaceById(
     id: IdType,
     data: WithoutId<FlatData, IdName>,
-    filter?: ItemFilterClause,
+    filter?: ItemFilterClause<FlatData>,
   ): Promise<FlatData>;
 
   /**
@@ -79,8 +79,8 @@ export declare class Repository<
    * @param filter
    */
   replaceOrCreate(
-    data: OptionalUnlessRequiredId<IdName, Data>,
-    filter?: ItemFilterClause,
+    data: OptionalUnlessRequiredId<IdName, FlatData>,
+    filter?: ItemFilterClause<FlatData>,
   ): Promise<FlatData>;
 
   /**
@@ -90,8 +90,8 @@ export declare class Repository<
    * @param where
    */
   patch(
-    data: PartialWithoutId<Data, IdName>,
-    where?: WhereClause,
+    data: PartialWithoutId<FlatData, IdName>,
+    where?: WhereClause<FlatData>,
   ): Promise<number>;
 
   /**
@@ -103,8 +103,8 @@ export declare class Repository<
    */
   patchById(
     id: IdType,
-    data: PartialWithoutId<Data, IdName>,
-    filter?: ItemFilterClause,
+    data: PartialWithoutId<FlatData, IdName>,
+    filter?: ItemFilterClause<FlatData>,
   ): Promise<FlatData>;
 
   /**
@@ -112,14 +112,14 @@ export declare class Repository<
    *
    * @param filter
    */
-  find(filter?: FilterClause): Promise<FlatData[]>;
+  find(filter?: FilterClause<FlatData>): Promise<FlatData[]>;
 
   /**
    * Find one.
    *
    * @param filter
    */
-  findOne(filter?: FilterClause): Promise<FlatData | undefined>;
+  findOne(filter?: FilterClause<FlatData>): Promise<FlatData | undefined>;
 
   /**
    * Find by id.
@@ -127,14 +127,14 @@ export declare class Repository<
    * @param id
    * @param filter
    */
-  findById(id: IdType, filter?: ItemFilterClause): Promise<FlatData>;
+  findById(id: IdType, filter?: ItemFilterClause<FlatData>): Promise<FlatData>;
 
   /**
    * Delete.
    *
    * @param where
    */
-  delete(where?: WhereClause): Promise<number>;
+  delete(where?: WhereClause<FlatData>): Promise<number>;
 
   /**
    * Delete by id.
@@ -155,20 +155,21 @@ export declare class Repository<
    *
    * @param where
    */
-  count(where?: WhereClause): Promise<number>;
+  count(where?: WhereClause<FlatData>): Promise<number>;
 }
 
 /**
  * Removes id field.
  */
-type WithoutId<Data extends object, IdName extends string = 'id'> = Flatten<
-  Omit<Data, IdName>
->;
+export declare type WithoutId<
+  Data extends object,
+  IdName extends string = 'id',
+> = Flatten<Omit<Data, IdName>>;
 
 /**
  * Makes fields as optional and remove id field.
  */
-type PartialWithoutId<
+export declare type PartialWithoutId<
   Data extends object,
   IdName extends string = 'id',
 > = Flatten<Partial<Omit<Data, IdName>>>;
@@ -176,7 +177,7 @@ type PartialWithoutId<
 /**
  * Makes the required id field as optional.
  */
-type OptionalUnlessRequiredId<
+export declare type OptionalUnlessRequiredId<
   IdName extends string,
   Data extends object,
 > = Flatten<Data extends {[K in IdName]: any} ? PartialBy<Data, IdName> : Data>;

+ 1 - 3
src/types.d.ts

@@ -14,9 +14,7 @@ export declare type PartialBy<T, K extends keyof T> = Omit<T, K> &
 /**
  * Model data.
  */
-export declare type ModelData = {
-  [property: string]: unknown;
-};
+export declare type ModelData = Record<string, unknown>;
 
 /**
  * Model id.