nicot 1.2.12 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ import { CrudBase } from '../crud-base';
2
2
  import { Repository } from 'typeorm';
3
3
  import { ClassType } from 'nesties';
4
4
  import { RelationDef } from '../utility/relation-def';
5
- export declare const RestfulMethods: readonly ["findOne", "findAll", "create", "update", "delete", "import"];
5
+ export declare const RestfulMethods: readonly ["findOne", "findAll", "create", "update", "upsert", "delete", "import"];
6
6
  export type RestfulMethods = typeof RestfulMethods[number];
7
7
  export type RestfulPaginateType = 'offset' | 'cursor' | 'none';
8
8
  export declare class BaseRestfulController<T extends {
@@ -23,6 +23,7 @@ export declare class BaseRestfulController<T extends {
23
23
  findAll(dto: Partial<T>): Promise<import("nesties").GenericPaginatedReturnMessageDto<T>> | Promise<import("../dto").GenericCursorPaginationReturnMessageDto<T>>;
24
24
  create(dto: T): Promise<import("nesties").GenericReturnMessageDto<T>>;
25
25
  update(id: number, dto: Partial<T>): Promise<import("nesties").BlankReturnMessageDto>;
26
+ upsert(dto: T): Promise<import("nesties").GenericReturnMessageDto<T>>;
26
27
  delete(id: number): Promise<import("nesties").BlankReturnMessageDto>;
27
28
  import(data: {
28
29
  data: T[];
@@ -17,6 +17,9 @@ export declare function IdBase(idOptions?: IdOptions): {
17
17
  afterGet(): Promise<void>;
18
18
  isValidInUpdate(): string | undefined;
19
19
  beforeUpdate(): Promise<void>;
20
+ isValidInUpsert(): string | undefined;
21
+ beforeUpsert(): Promise<void>;
22
+ afterUpsert(): Promise<void>;
20
23
  pageCount: number;
21
24
  recordsPerPage: number;
22
25
  getActualPageSettings(): import("nesties").PageSettingsWise;
@@ -44,6 +47,9 @@ export declare function StringIdBase(idOptions: StringIdOptions): {
44
47
  afterGet(): Promise<void>;
45
48
  isValidInUpdate(): string | undefined;
46
49
  beforeUpdate(): Promise<void>;
50
+ isValidInUpsert(): string | undefined;
51
+ beforeUpsert(): Promise<void>;
52
+ afterUpsert(): Promise<void>;
47
53
  pageCount: number;
48
54
  recordsPerPage: number;
49
55
  getActualPageSettings(): import("nesties").PageSettingsWise;
@@ -10,6 +10,9 @@ export interface EntityHooks {
10
10
  afterGet(): Promise<void>;
11
11
  isValidInUpdate(): string | undefined;
12
12
  beforeUpdate(): Promise<void>;
13
+ isValidInUpsert(): string | undefined;
14
+ beforeUpsert(): Promise<void>;
15
+ afterUpsert(): Promise<void>;
13
16
  }
14
17
  export declare class TimeBase extends PageSettingsDto implements DeletionWise, EntityHooks {
15
18
  createTime: Date;
@@ -22,4 +25,7 @@ export declare class TimeBase extends PageSettingsDto implements DeletionWise, E
22
25
  afterGet(): Promise<void>;
23
26
  isValidInUpdate(): string | undefined;
24
27
  beforeUpdate(): Promise<void>;
28
+ isValidInUpsert(): string | undefined;
29
+ beforeUpsert(): Promise<void>;
30
+ afterUpsert(): Promise<void>;
25
31
  }
@@ -1,5 +1,5 @@
1
1
  import { CursorPaginationDto } from './dto';
2
- import { FindOneOptions, FindOptionsWhere, Repository, SelectQueryBuilder } from 'typeorm';
2
+ import { EntityManager, FindOneOptions, FindOptionsWhere, Repository, SelectQueryBuilder } from 'typeorm';
3
3
  import { EntityHooks, PageSettingsDto, PageSettingsFactory, QueryWise } from './bases';
4
4
  import { ConsoleLogger } from '@nestjs/common';
5
5
  import { Awaitable, BlankReturnMessageDto, ClassType, GenericReturnMessageDto } from 'nesties';
@@ -21,6 +21,7 @@ export interface CrudOptions<T extends ValidCrudEntity<T>> {
21
21
  createOrUpdate?: boolean;
22
22
  keepEntityVersioningDates?: boolean;
23
23
  outputFieldsToOmit?: (keyof T)[];
24
+ upsertIncludeRelations?: boolean;
24
25
  }
25
26
  export declare class CrudBase<T extends ValidCrudEntity<T>> {
26
27
  entityClass: ClassType<T>;
@@ -61,6 +62,7 @@ export declare class CrudBase<T extends ValidCrudEntity<T>> {
61
62
  _freezeBindings(): BindingSnapshot;
62
63
  _restoreBindings(frozen: BindingSnapshot): this;
63
64
  beforeSuper<R>(fn: () => Promise<R>): Promise<R>;
65
+ _mayBeTransaction<R>(cb: (tdb: EntityManager, repo: Repository<T>) => Awaitable<R>, manager?: EntityManager): Promise<R>;
64
66
  _batchCreate(ents: T[], beforeCreate?: (repo: Repository<T>) => Promise<void>, skipErrors?: boolean): Promise<{
65
67
  results: T[];
66
68
  skipped: {
@@ -68,13 +70,14 @@ export declare class CrudBase<T extends ValidCrudEntity<T>> {
68
70
  entry: T;
69
71
  }[];
70
72
  }>;
71
- create(_ent: T, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<GenericReturnMessageDto<T>>;
73
+ create(_ent: Partial<T>, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<GenericReturnMessageDto<T>>;
72
74
  get entityAliasName(): string;
73
75
  _applyQueryRelation(qb: SelectQueryBuilder<T>, relation: RelationDef): void;
74
76
  _applyQueryRelations(qb: SelectQueryBuilder<T>): void;
75
77
  _applyQueryFilters(qb: SelectQueryBuilder<T>, ent: T): void;
76
78
  queryBuilder(): SelectQueryBuilder<T>;
77
79
  _applyQueryFromBinding(bindingEnt: Partial<T>, qb: SelectQueryBuilder<T>): void;
80
+ _applyQueryKeepEntityVersioningDates(qb: SelectQueryBuilder<T>): void;
78
81
  findOne(id: EntityId<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<GenericReturnMessageDto<T>>;
79
82
  _preFindAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<{
80
83
  query: SelectQueryBuilder<T>;
@@ -84,8 +87,9 @@ export declare class CrudBase<T extends ValidCrudEntity<T>> {
84
87
  findAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericPaginatedReturnMessageDto<T>>;
85
88
  findAllCursorPaginated(ent?: Partial<T & Partial<CursorPaginationDto>>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("./dto").GenericCursorPaginationReturnMessageDto<T>>;
86
89
  update(id: EntityId<T>, entPart: Partial<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
90
+ upsert(_ent: Partial<T>): Promise<GenericReturnMessageDto<T>>;
87
91
  delete(id: EntityId<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
88
- importEntities(_ents: T[], extraChecking?: (ent: T) => string | Promise<string>): Promise<GenericReturnMessageDto<{
92
+ importEntities(_ents: Partial<T>[], extraChecking?: (ent: T) => string | Promise<string>): Promise<GenericReturnMessageDto<{
89
93
  result: string;
90
94
  entry: T;
91
95
  }[]>>;
@@ -139,6 +143,7 @@ export declare function CrudService<T extends ValidCrudEntity<T>>(entityClass: C
139
143
  _freezeBindings(): BindingSnapshot;
140
144
  _restoreBindings(frozen: BindingSnapshot): /*elided*/ any;
141
145
  beforeSuper<R>(fn: () => Promise<R>): Promise<R>;
146
+ _mayBeTransaction<R>(cb: (tdb: EntityManager, repo: Repository<T>) => Awaitable<R>, manager?: EntityManager): Promise<R>;
142
147
  _batchCreate(ents: T[], beforeCreate?: (repo: Repository<T>) => Promise<void>, skipErrors?: boolean): Promise<{
143
148
  results: T[];
144
149
  skipped: {
@@ -146,13 +151,14 @@ export declare function CrudService<T extends ValidCrudEntity<T>>(entityClass: C
146
151
  entry: T;
147
152
  }[];
148
153
  }>;
149
- create(_ent: T, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<GenericReturnMessageDto<T>>;
154
+ create(_ent: Partial<T>, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<GenericReturnMessageDto<T>>;
150
155
  readonly entityAliasName: string;
151
156
  _applyQueryRelation(qb: SelectQueryBuilder<T>, relation: RelationDef): void;
152
157
  _applyQueryRelations(qb: SelectQueryBuilder<T>): void;
153
158
  _applyQueryFilters(qb: SelectQueryBuilder<T>, ent: T): void;
154
159
  queryBuilder(): SelectQueryBuilder<T>;
155
160
  _applyQueryFromBinding(bindingEnt: Partial<T>, qb: SelectQueryBuilder<T>): void;
161
+ _applyQueryKeepEntityVersioningDates(qb: SelectQueryBuilder<T>): void;
156
162
  findOne(id: EntityId<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<GenericReturnMessageDto<T>>;
157
163
  _preFindAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<{
158
164
  query: SelectQueryBuilder<T>;
@@ -162,8 +168,9 @@ export declare function CrudService<T extends ValidCrudEntity<T>>(entityClass: C
162
168
  findAll(ent?: Partial<T>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericPaginatedReturnMessageDto<T>>;
163
169
  findAllCursorPaginated(ent?: Partial<T & Partial<CursorPaginationDto>>, extraQuery?: (qb: SelectQueryBuilder<T>) => void): Promise<import("./dto").GenericCursorPaginationReturnMessageDto<T>>;
164
170
  update(id: EntityId<T>, entPart: Partial<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
171
+ upsert(_ent: Partial<T>): Promise<GenericReturnMessageDto<T>>;
165
172
  delete(id: EntityId<T>, cond?: FindOptionsWhere<T>): Promise<BlankReturnMessageDto>;
166
- importEntities(_ents: T[], extraChecking?: (ent: T) => string | Promise<string>): Promise<GenericReturnMessageDto<{
173
+ importEntities(_ents: Partial<T>[], extraChecking?: (ent: T) => string | Promise<string>): Promise<GenericReturnMessageDto<{
167
174
  result: string;
168
175
  entry: T;
169
176
  }[]>>;
@@ -1,7 +1,6 @@
1
1
  export declare const NotWritable: () => PropertyDecorator;
2
2
  export declare const NotCreatable: () => PropertyDecorator;
3
3
  export declare const NotChangeable: () => PropertyDecorator;
4
+ export declare const NotUpsertable: () => PropertyDecorator;
4
5
  export declare const NotQueryable: () => import("typed-reflector").AllDecorators;
5
- export declare const NotInResult: (options?: {
6
- entityVersioningDate?: boolean;
7
- }) => import("typed-reflector").AllDecorators;
6
+ export declare const NotInResult: () => import("typed-reflector").AllDecorators;
@@ -4,3 +4,4 @@ export * from './pipes';
4
4
  export * from './query';
5
5
  export * from './get-mutator';
6
6
  export * from './binding';
7
+ export * from './upsert';
@@ -54,6 +54,7 @@ export declare const StringJsonColumn: <C extends ClassOrArray>(definition: C, o
54
54
  }) => PropertyDecorator;
55
55
  export declare const NotColumn: (options?: OpenAPIOptions<any>, specials?: {
56
56
  keepInCreate?: boolean;
57
+ hideInUpsert?: boolean;
57
58
  }) => PropertyDecorator;
58
59
  export declare const QueryColumn: (options?: OpenAPIOptions<any>) => PropertyDecorator;
59
60
  export declare const InternalColumn: () => PropertyDecorator;
@@ -0,0 +1,5 @@
1
+ import { ClassType } from 'nesties';
2
+ export declare const UpsertColumn: () => PropertyDecorator;
3
+ export declare const UpsertableEntity: () => (cls: ClassType<{
4
+ id: string | number;
5
+ }>) => void;
@@ -6,11 +6,12 @@ import { CursorPaginationDto } from './dto';
6
6
  import { BaseRestfulController, RestfulMethods, RestfulPaginateType } from './bases/base-restful-controller';
7
7
  import { Repository } from 'typeorm';
8
8
  import { RelationDef } from './utility/relation-def';
9
- export interface RestfulFactoryOptions<T, O extends keyof T = never, W extends keyof T = never, C extends keyof T = never, U extends keyof T = never, F extends keyof T = never, R extends keyof T = never> {
9
+ export interface RestfulFactoryOptions<T, O extends keyof T = never, W extends keyof T = never, C extends keyof T = never, U extends keyof T = never, US extends keyof T = never, F extends keyof T = never, R extends keyof T = never> {
10
10
  fieldsToOmit?: O[];
11
11
  writeFieldsToOmit?: W[];
12
12
  createFieldsToOmit?: C[];
13
13
  updateFieldsToOmit?: U[];
14
+ upsertFieldsToOmit?: US[];
14
15
  findAllFieldsToOmit?: F[];
15
16
  outputFieldsToOmit?: R[];
16
17
  prefix?: string;
@@ -18,34 +19,38 @@ export interface RestfulFactoryOptions<T, O extends keyof T = never, W extends k
18
19
  entityClassName?: string;
19
20
  relations?: (string | RelationDef)[];
20
21
  skipNonQueryableFields?: boolean;
22
+ upsertIncludeRelations?: boolean;
21
23
  }
22
24
  export interface ResourceOptions extends Partial<OperationObject> {
23
25
  prefix?: string;
24
26
  }
25
27
  export declare class RestfulFactory<T extends {
26
28
  id: any;
27
- }, O extends keyof T = never, W extends keyof T = never, C extends keyof T = never, U extends keyof T = never, F extends keyof T = never, R extends keyof T = never> {
29
+ }, O extends keyof T = never, W extends keyof T = never, C extends keyof T = never, U extends keyof T = never, US extends keyof T = never, F extends keyof T = never, R extends keyof T = never> {
28
30
  readonly entityClass: ClassType<T>;
29
31
  private options;
30
32
  private __resolveVisited;
31
- constructor(entityClass: ClassType<T>, options?: RestfulFactoryOptions<T, O, W, C, U, F, R>, __resolveVisited?: Map<AnyClass, [AnyClass]>);
32
- omitInput<K extends keyof T>(...fields: K[]): RestfulFactory<T, O | K, W, C, U, F, R>;
33
- omitWrite<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W | K, C, U, F, R>;
34
- omitCreate<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C | K, U, F, R>;
35
- omitUpdate<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C, U | K, F, R>;
36
- omitFindAll<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C, U, F | K, R>;
37
- omitOutput<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C, U, F, R | K>;
38
- pathPrefix(prefix: string): RestfulFactory<T, O, W, C, U, F, R>;
39
- keepEntityVersioningDates(enable?: boolean): RestfulFactory<T, O, W, C, U, F, R>;
40
- skipNonQueryableFields(enable?: boolean): RestfulFactory<T, O, W, C, U, F, R>;
41
- renameEntityClass(name: string): RestfulFactory<T, O, W, C, U, F, R>;
42
- useRelations(...relations: (string | RelationDef)[]): RestfulFactory<T, O, W, C, U, F, R>;
33
+ constructor(entityClass: ClassType<T>, options?: RestfulFactoryOptions<T, O, W, C, U, US, F, R>, __resolveVisited?: Map<AnyClass, [AnyClass]>);
34
+ omitInput<K extends keyof T>(...fields: K[]): RestfulFactory<T, O | K, W, C, U, US, F, R>;
35
+ omitWrite<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W | K, C, U, US, F, R>;
36
+ omitCreate<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C | K, U, US, F, R>;
37
+ omitUpdate<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C, U | K, US, F, R>;
38
+ omitUpsert<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C, U, US | K, F, R>;
39
+ omitFindAll<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C, U, US, F | K, R>;
40
+ omitOutput<K extends keyof T>(...fields: K[]): RestfulFactory<T, O, W, C, U, US, F, R | K>;
41
+ pathPrefix(prefix: string): RestfulFactory<T, O, W, C, U, US, F, R>;
42
+ keepEntityVersioningDates(enable?: boolean): RestfulFactory<T, O, W, C, U, US, F, R>;
43
+ skipNonQueryableFields(enable?: boolean): RestfulFactory<T, O, W, C, U, US, F, R>;
44
+ renameEntityClass(name: string): RestfulFactory<T, O, W, C, U, US, F, R>;
45
+ useRelations(...relations: (string | RelationDef)[]): RestfulFactory<T, O, W, C, U, US, F, R>;
43
46
  get entityClassName(): string;
44
47
  get fieldsToOmit(): (keyof T)[];
45
48
  get fieldsInCreateToOmit(): (keyof T)[];
46
49
  get createDto(): ClassType<Omit<T, O | W | C>>;
47
50
  get fieldsInUpdateToOmit(): (keyof T)[];
48
51
  get updateDto(): ClassType<Omit<T, O | W | U>>;
52
+ get fieldsInUpsertToOmit(): (keyof T)[];
53
+ get upsertDto(): ClassType<Omit<T, O | W | US>>;
49
54
  get importDto(): new () => {
50
55
  data: Omit<T, O | W | C>[];
51
56
  };
@@ -55,6 +60,7 @@ export declare class RestfulFactory<T extends {
55
60
  get findAllCursorPaginatedDto(): ClassType<T>;
56
61
  get entityResultDto(): ClassType<Omit<T, R>>;
57
62
  get entityCreateResultDto(): ClassType<Omit<T, R>>;
63
+ get entityUpsertResultDto(): ClassType<Omit<T, R>>;
58
64
  get entityReturnMessageDto(): new (statusCode: number, message: string, data: Omit<T, R>) => import("nesties").GenericReturnMessageDto<Omit<T, R>>;
59
65
  get entityCreateReturnMessageDto(): new (statusCode: number, message: string, data: Omit<T, R>) => import("nesties").GenericReturnMessageDto<Omit<T, R>>;
60
66
  get entityArrayReturnMessageDto(): new (statusCode: number, message: string, data: Omit<T, R>[], total: number, pageSettings: import("nesties").PageSettingsWise) => import("nesties").GenericPaginatedReturnMessageDto<Omit<T, R>>;
@@ -70,6 +76,9 @@ export declare class RestfulFactory<T extends {
70
76
  private usePrefix;
71
77
  create(extras?: ResourceOptions): MethodDecorator;
72
78
  createParam(): ParameterDecorator;
79
+ isUpsertable(): boolean;
80
+ upsert(extras?: ResourceOptions): MethodDecorator;
81
+ upsertParam(): ParameterDecorator;
73
82
  findOne(extras?: ResourceOptions): MethodDecorator;
74
83
  idParam(): ParameterDecorator;
75
84
  findAll(extras?: ResourceOptions): MethodDecorator;
@@ -92,11 +101,11 @@ export declare class RestfulFactory<T extends {
92
101
  }>>>;
93
102
  }> = {}>(routeOptions?: Options): new (service: CrudBase<T> | Repository<T>) => ([{ [M in keyof NonNullable<Options["routes"]>]: NonNullable<Options["routes"]>[M] extends {
94
103
  enabled: true;
95
- } ? M : never; }[keyof NonNullable<Options["routes"]>] & ("update" | "create" | "delete" | "findOne" | "findAll" | "import")] extends [never] ? Omit<BaseRestfulController<T>, { [M_1 in keyof NonNullable<Options["routes"]>]: NonNullable<Options["routes"]>[M_1] extends {
104
+ } ? M : never; }[keyof NonNullable<Options["routes"]>] & ("update" | "create" | "delete" | "upsert" | "findOne" | "findAll" | "import")] extends [never] ? Omit<BaseRestfulController<T>, { [M_1 in keyof NonNullable<Options["routes"]>]: NonNullable<Options["routes"]>[M_1] extends {
96
105
  enabled: false;
97
- } ? M_1 : never; }[keyof NonNullable<Options["routes"]>] & ("update" | "create" | "delete" | "findOne" | "findAll" | "import")> : Pick<BaseRestfulController<T>, { [M in keyof NonNullable<Options["routes"]>]: NonNullable<Options["routes"]>[M] extends {
106
+ } ? M_1 : never; }[keyof NonNullable<Options["routes"]>] & ("update" | "create" | "delete" | "upsert" | "findOne" | "findAll" | "import")> : Pick<BaseRestfulController<T>, { [M in keyof NonNullable<Options["routes"]>]: NonNullable<Options["routes"]>[M] extends {
98
107
  enabled: true;
99
- } ? M : never; }[keyof NonNullable<Options["routes"]>] & ("update" | "create" | "delete" | "findOne" | "findAll" | "import")>) & {
108
+ } ? M : never; }[keyof NonNullable<Options["routes"]>] & ("update" | "create" | "delete" | "upsert" | "findOne" | "findAll" | "import")>) & {
100
109
  _service: CrudBase<T>;
101
110
  };
102
111
  crudService(options?: CrudOptions<T>): {
@@ -142,6 +151,7 @@ export declare class RestfulFactory<T extends {
142
151
  [x: string]: any;
143
152
  }): /*elided*/ any;
144
153
  beforeSuper<R_1>(fn: () => Promise<R_1>): Promise<R_1>;
154
+ _mayBeTransaction<R_1>(cb: (tdb: import("typeorm").EntityManager, repo: Repository<T>) => import("nesties").Awaitable<R_1>, manager?: import("typeorm").EntityManager): Promise<R_1>;
145
155
  _batchCreate(ents: T[], beforeCreate?: (repo: Repository<T>) => Promise<void>, skipErrors?: boolean): Promise<{
146
156
  results: T[];
147
157
  skipped: {
@@ -149,13 +159,14 @@ export declare class RestfulFactory<T extends {
149
159
  entry: T;
150
160
  }[];
151
161
  }>;
152
- create(_ent: T, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<import("nesties").GenericReturnMessageDto<T>>;
162
+ create(_ent: Partial<T>, beforeCreate?: (repo: Repository<T>) => Promise<void>): Promise<import("nesties").GenericReturnMessageDto<T>>;
153
163
  readonly entityAliasName: string;
154
164
  _applyQueryRelation(qb: import("typeorm").SelectQueryBuilder<T>, relation: RelationDef): void;
155
165
  _applyQueryRelations(qb: import("typeorm").SelectQueryBuilder<T>): void;
156
166
  _applyQueryFilters(qb: import("typeorm").SelectQueryBuilder<T>, ent: T): void;
157
167
  queryBuilder(): import("typeorm").SelectQueryBuilder<T>;
158
168
  _applyQueryFromBinding(bindingEnt: Partial<T>, qb: import("typeorm").SelectQueryBuilder<T>): void;
169
+ _applyQueryKeepEntityVersioningDates(qb: import("typeorm").SelectQueryBuilder<T>): void;
159
170
  findOne(id: import("./crud-base").EntityId<T>, extraQuery?: (qb: import("typeorm").SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericReturnMessageDto<T>>;
160
171
  _preFindAll(ent?: Partial<T>, extraQuery?: (qb: import("typeorm").SelectQueryBuilder<T>) => void): Promise<{
161
172
  query: import("typeorm").SelectQueryBuilder<T>;
@@ -165,8 +176,9 @@ export declare class RestfulFactory<T extends {
165
176
  findAll(ent?: Partial<T>, extraQuery?: (qb: import("typeorm").SelectQueryBuilder<T>) => void): Promise<import("nesties").GenericPaginatedReturnMessageDto<T>>;
166
177
  findAllCursorPaginated(ent?: Partial<T & Partial<CursorPaginationDto>>, extraQuery?: (qb: import("typeorm").SelectQueryBuilder<T>) => void): Promise<import("./dto").GenericCursorPaginationReturnMessageDto<T>>;
167
178
  update(id: import("./crud-base").EntityId<T>, entPart: Partial<T>, cond?: import("typeorm").FindOptionsWhere<T>): Promise<import("nesties").BlankReturnMessageDto>;
179
+ upsert(_ent: Partial<T>): Promise<import("nesties").GenericReturnMessageDto<T>>;
168
180
  delete(id: import("./crud-base").EntityId<T>, cond?: import("typeorm").FindOptionsWhere<T>): Promise<import("nesties").BlankReturnMessageDto>;
169
- importEntities(_ents: T[], extraChecking?: (ent: T) => string | Promise<string>): Promise<import("nesties").GenericReturnMessageDto<{
181
+ importEntities(_ents: Partial<T>[], extraChecking?: (ent: T) => string | Promise<string>): Promise<import("nesties").GenericReturnMessageDto<{
170
182
  result: string;
171
183
  entry: T;
172
184
  }[]>>;
@@ -0,0 +1,20 @@
1
+ import { DataSource, DataSourceOptions, EntityManager } from 'typeorm';
2
+ import { DynamicModule } from '@nestjs/common';
3
+ import { CallHandler } from '@nestjs/common/interfaces/features/nest-interceptor.interface';
4
+ import { ExecutionContext } from '@nestjs/common/interfaces/features/execution-context.interface';
5
+ import { Observable } from 'rxjs';
6
+ export declare const TransactionalTypeOrmInterceptor: (dataSource?: DataSource | DataSourceOptions | string) => {
7
+ new (entityManager: EntityManager): {
8
+ entityManager: EntityManager;
9
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
10
+ };
11
+ };
12
+ export declare const getTransactionalEntityManagerToken: (dataSource?: DataSource | DataSourceOptions | string) => string;
13
+ export declare const getTransactionalEntityManagerProvider: (dataSource?: DataSource | DataSourceOptions | string) => import("nesties").TypedFactoryProvider<[string | Function, "REQUEST"], EntityManager>;
14
+ export declare const InjectTransactionalEntityManager: (dataSource?: string | DataSource | DataSourceOptions) => PropertyDecorator & ParameterDecorator;
15
+ export declare const getTransactionalRepositoryToken: (entity: Function, dataSource?: DataSource | DataSourceOptions | string) => string;
16
+ export declare const getTransactionalRepositoryProvider: (entity: Function, dataSource?: DataSource | DataSourceOptions | string) => import("nesties").TypedFactoryProvider<[string | Function, "REQUEST"], import("typeorm").Repository<import("typeorm").ObjectLiteral>>;
17
+ export declare const InjectTransactionalRepository: (entity: Function, dataSource?: string | DataSource | DataSourceOptions) => PropertyDecorator & ParameterDecorator;
18
+ export declare class TransactionalTypeOrmModule {
19
+ static forFeature(entities: Function | Function[], dataSource?: DataSource | DataSourceOptions | string): DynamicModule;
20
+ }
@@ -0,0 +1 @@
1
+ export declare const createDynamicFetcherProxy: <T extends object>(initial: T, fetcher: () => T) => T;
@@ -0,0 +1,4 @@
1
+ import { Inject } from '@nestjs/common';
2
+ type InjectToken = Parameters<typeof Inject>[0];
3
+ export declare const createInjectFromTokenFactory: <P extends any[]>(factory: (...params: P) => InjectToken) => (...params: P) => PropertyDecorator & ParameterDecorator;
4
+ export {};
@@ -7,14 +7,15 @@ import { BindingValueMetadata } from '../decorators/binding';
7
7
  interface SpecificFields {
8
8
  notColumn: {
9
9
  keepInCreate?: boolean;
10
+ hideInUpsert?: boolean;
10
11
  };
11
12
  notWritable: boolean;
12
13
  notCreatable: boolean;
13
14
  notChangeable: boolean;
15
+ notUpsertable: boolean;
14
16
  notQueryable: boolean;
15
- notInResult: {
16
- entityVersioningDate?: boolean;
17
- };
17
+ notInResult: boolean;
18
+ entityVersioningDate: boolean;
18
19
  relationComputed: () => {
19
20
  entityClass: AnyClass;
20
21
  isArray: boolean;
@@ -26,13 +27,16 @@ interface SpecificFields {
26
27
  getMutator: GetMutatorOptions;
27
28
  bindingColumn: string;
28
29
  bindingValue: BindingValueMetadata;
30
+ upsertColumn: boolean;
31
+ }
32
+ interface MetadataMap extends SpecificFields {
33
+ upsertableEntity: boolean;
29
34
  }
30
- type MetadataMap = SpecificFields;
31
35
  type FieldsMap = {
32
36
  [K in keyof MetadataMap as `${K}Fields`]: string;
33
37
  };
34
- export declare const Metadata: MetadataSetter<SpecificFields, FieldsMap>;
35
- export declare const reflector: Reflector<SpecificFields, FieldsMap>;
38
+ export declare const Metadata: MetadataSetter<MetadataMap, FieldsMap>;
39
+ export declare const reflector: Reflector<MetadataMap, FieldsMap>;
36
40
  export declare function getSpecificFields<K extends keyof SpecificFields>(obj: any, type: K, filter?: (meta: SpecificFields[K], obj: any) => boolean): FieldsMap[`${K}Fields`][];
37
41
  export declare function getNotInResultFields(obj: any, keepEntityVersioningDates?: boolean): string[];
38
42
  export {};
package/index.ts CHANGED
@@ -5,3 +5,4 @@ export * from './src/bases';
5
5
  export * from './src/decorators';
6
6
  export * from './src/dto';
7
7
  export * from './src/utility';
8
+ export * from './src/transactional-typeorm.module';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nicot",
3
3
  "description": "Nest.js interacting with class-validator + OpenAPI + TypeORM for Nest.js Restful API development.",
4
- "version": "1.2.12",
4
+ "version": "1.3.0",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
@@ -81,6 +81,7 @@
81
81
  "jest": "^29.7.0",
82
82
  "pg": "^8.7.3",
83
83
  "prettier": "^2.7.1",
84
+ "rxjs": "^7.8.2",
84
85
  "supertest": "^6.2.4",
85
86
  "ts-jest": "^29.3.2",
86
87
  "typescript": "^5.8.3"
@@ -88,14 +89,16 @@
88
89
  "peerDependencies": {
89
90
  "@nestjs/common": "^11.0.0 || ^9.4.0 || ^10.0.0",
90
91
  "@nestjs/config": "^4.0.0 || ^3.0.0",
92
+ "@nestjs/core": "^11.0.0 || ^9.4.0 || ^10.0.0",
91
93
  "@nestjs/swagger": "^11.0.0 || ^7.1.8 || ^6.3.0",
92
94
  "class-transformer": "^0.5.1",
93
95
  "class-validator": "^0.14.0",
96
+ "rxjs": ">=7.0.0",
94
97
  "typeorm": "^0.3.27"
95
98
  },
96
99
  "dependencies": {
97
100
  "lodash": "^4.17.21",
98
- "nesties": "^1.1.16",
101
+ "nesties": "^1.1.23",
99
102
  "nfkit": "^1.0.13",
100
103
  "p-queue": "6.6.2",
101
104
  "superjson": "1.13.3",