mahameru 0.0.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.
Files changed (218) hide show
  1. package/README.md +28 -0
  2. package/dist/api.error.cjs +107 -0
  3. package/dist/api.error.cjs.map +1 -0
  4. package/dist/api.error.d.cts +65 -0
  5. package/dist/api.error.d.ts +65 -0
  6. package/dist/api.error.js +83 -0
  7. package/dist/api.error.js.map +1 -0
  8. package/dist/base-class/base.controller.cjs +148 -0
  9. package/dist/base-class/base.controller.cjs.map +1 -0
  10. package/dist/base-class/base.controller.d.cts +38 -0
  11. package/dist/base-class/base.controller.d.ts +38 -0
  12. package/dist/base-class/base.controller.js +126 -0
  13. package/dist/base-class/base.controller.js.map +1 -0
  14. package/dist/base-class/base.entity.cjs +79 -0
  15. package/dist/base-class/base.entity.cjs.map +1 -0
  16. package/dist/base-class/base.entity.d.cts +8 -0
  17. package/dist/base-class/base.entity.d.ts +8 -0
  18. package/dist/base-class/base.entity.js +57 -0
  19. package/dist/base-class/base.entity.js.map +1 -0
  20. package/dist/base-class/base.model.cjs +204 -0
  21. package/dist/base-class/base.model.cjs.map +1 -0
  22. package/dist/base-class/base.model.d.cts +68 -0
  23. package/dist/base-class/base.model.d.ts +68 -0
  24. package/dist/base-class/base.model.js +182 -0
  25. package/dist/base-class/base.model.js.map +1 -0
  26. package/dist/base-class/base.service.cjs +37 -0
  27. package/dist/base-class/base.service.cjs.map +1 -0
  28. package/dist/base-class/base.service.d.cts +5 -0
  29. package/dist/base-class/base.service.d.ts +5 -0
  30. package/dist/base-class/base.service.js +15 -0
  31. package/dist/base-class/base.service.js.map +1 -0
  32. package/dist/base-class/index.cjs +392 -0
  33. package/dist/base-class/index.cjs.map +1 -0
  34. package/dist/base-class/index.d.cts +6 -0
  35. package/dist/base-class/index.d.ts +6 -0
  36. package/dist/base-class/index.js +365 -0
  37. package/dist/base-class/index.js.map +1 -0
  38. package/dist/cli/index.cjs +706 -0
  39. package/dist/cli/index.cjs.map +1 -0
  40. package/dist/cli/index.d.cts +3 -0
  41. package/dist/cli/index.d.ts +3 -0
  42. package/dist/cli/index.js +681 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/cli/scripts/on-build.cjs +56 -0
  45. package/dist/cli/scripts/on-build.cjs.map +1 -0
  46. package/dist/cli/scripts/on-build.d.cts +3 -0
  47. package/dist/cli/scripts/on-build.d.ts +3 -0
  48. package/dist/cli/scripts/on-build.js +28 -0
  49. package/dist/cli/scripts/on-build.js.map +1 -0
  50. package/dist/cli/scripts/on-dev.cjs +483 -0
  51. package/dist/cli/scripts/on-dev.cjs.map +1 -0
  52. package/dist/cli/scripts/on-dev.d.cts +5 -0
  53. package/dist/cli/scripts/on-dev.d.ts +5 -0
  54. package/dist/cli/scripts/on-dev.js +449 -0
  55. package/dist/cli/scripts/on-dev.js.map +1 -0
  56. package/dist/cli/scripts/on-init.cjs +96 -0
  57. package/dist/cli/scripts/on-init.cjs.map +1 -0
  58. package/dist/cli/scripts/on-init.d.cts +3 -0
  59. package/dist/cli/scripts/on-init.d.ts +3 -0
  60. package/dist/cli/scripts/on-init.js +68 -0
  61. package/dist/cli/scripts/on-init.js.map +1 -0
  62. package/dist/cli/scripts/on-start.cjs +55 -0
  63. package/dist/cli/scripts/on-start.cjs.map +1 -0
  64. package/dist/cli/scripts/on-start.d.cts +3 -0
  65. package/dist/cli/scripts/on-start.d.ts +3 -0
  66. package/dist/cli/scripts/on-start.js +27 -0
  67. package/dist/cli/scripts/on-start.js.map +1 -0
  68. package/dist/client.cjs +405 -0
  69. package/dist/client.cjs.map +1 -0
  70. package/dist/client.d.cts +7 -0
  71. package/dist/client.d.ts +7 -0
  72. package/dist/client.js +371 -0
  73. package/dist/client.js.map +1 -0
  74. package/dist/constants.cjs +51 -0
  75. package/dist/constants.cjs.map +1 -0
  76. package/dist/constants.d.cts +7 -0
  77. package/dist/constants.d.ts +7 -0
  78. package/dist/constants.js +16 -0
  79. package/dist/constants.js.map +1 -0
  80. package/dist/database/column/index.cjs +34 -0
  81. package/dist/database/column/index.cjs.map +1 -0
  82. package/dist/database/column/index.d.cts +2 -0
  83. package/dist/database/column/index.d.ts +2 -0
  84. package/dist/database/column/index.js +8 -0
  85. package/dist/database/column/index.js.map +1 -0
  86. package/dist/database/index.cjs +83 -0
  87. package/dist/database/index.cjs.map +1 -0
  88. package/dist/database/index.d.cts +2 -0
  89. package/dist/database/index.d.ts +2 -0
  90. package/dist/database/index.js +60 -0
  91. package/dist/database/index.js.map +1 -0
  92. package/dist/database/snake-naming-strategy.class.cjs +78 -0
  93. package/dist/database/snake-naming-strategy.class.cjs.map +1 -0
  94. package/dist/database/snake-naming-strategy.class.d.cts +16 -0
  95. package/dist/database/snake-naming-strategy.class.d.ts +16 -0
  96. package/dist/database/snake-naming-strategy.class.js +56 -0
  97. package/dist/database/snake-naming-strategy.class.js.map +1 -0
  98. package/dist/error.cjs +46 -0
  99. package/dist/error.cjs.map +1 -0
  100. package/dist/error.d.cts +10 -0
  101. package/dist/error.d.ts +10 -0
  102. package/dist/error.js +28 -0
  103. package/dist/error.js.map +1 -0
  104. package/dist/express/app.cjs +233 -0
  105. package/dist/express/app.cjs.map +1 -0
  106. package/dist/express/app.d.cts +16 -0
  107. package/dist/express/app.d.ts +16 -0
  108. package/dist/express/app.js +205 -0
  109. package/dist/express/app.js.map +1 -0
  110. package/dist/express/index.cjs +239 -0
  111. package/dist/express/index.cjs.map +1 -0
  112. package/dist/express/index.d.cts +3 -0
  113. package/dist/express/index.d.ts +3 -0
  114. package/dist/express/index.js +205 -0
  115. package/dist/express/index.js.map +1 -0
  116. package/dist/express/middleware/cors.middleware.cjs +54 -0
  117. package/dist/express/middleware/cors.middleware.cjs.map +1 -0
  118. package/dist/express/middleware/cors.middleware.d.cts +9 -0
  119. package/dist/express/middleware/cors.middleware.d.ts +9 -0
  120. package/dist/express/middleware/cors.middleware.js +26 -0
  121. package/dist/express/middleware/cors.middleware.js.map +1 -0
  122. package/dist/express/middleware/error.middleware.cjs +136 -0
  123. package/dist/express/middleware/error.middleware.cjs.map +1 -0
  124. package/dist/express/middleware/error.middleware.d.cts +5 -0
  125. package/dist/express/middleware/error.middleware.d.ts +5 -0
  126. package/dist/express/middleware/error.middleware.js +116 -0
  127. package/dist/express/middleware/error.middleware.js.map +1 -0
  128. package/dist/express/middleware/filter.middleware.cjs +38 -0
  129. package/dist/express/middleware/filter.middleware.cjs.map +1 -0
  130. package/dist/express/middleware/filter.middleware.d.cts +5 -0
  131. package/dist/express/middleware/filter.middleware.d.ts +5 -0
  132. package/dist/express/middleware/filter.middleware.js +20 -0
  133. package/dist/express/middleware/filter.middleware.js.map +1 -0
  134. package/dist/express/middleware/index.cjs +206 -0
  135. package/dist/express/middleware/index.cjs.map +1 -0
  136. package/dist/express/middleware/index.d.cts +19 -0
  137. package/dist/express/middleware/index.d.ts +19 -0
  138. package/dist/express/middleware/index.js +169 -0
  139. package/dist/express/middleware/index.js.map +1 -0
  140. package/dist/express/middleware/not-found.middleware.cjs +79 -0
  141. package/dist/express/middleware/not-found.middleware.cjs.map +1 -0
  142. package/dist/express/middleware/not-found.middleware.d.cts +5 -0
  143. package/dist/express/middleware/not-found.middleware.d.ts +5 -0
  144. package/dist/express/middleware/not-found.middleware.js +59 -0
  145. package/dist/express/middleware/not-found.middleware.js.map +1 -0
  146. package/dist/generator.cjs +258 -0
  147. package/dist/generator.cjs.map +1 -0
  148. package/dist/generator.d.cts +10 -0
  149. package/dist/generator.d.ts +10 -0
  150. package/dist/generator.js +220 -0
  151. package/dist/generator.js.map +1 -0
  152. package/dist/http.cjs +82 -0
  153. package/dist/http.cjs.map +1 -0
  154. package/dist/http.d.cts +11 -0
  155. package/dist/http.d.ts +11 -0
  156. package/dist/http.js +64 -0
  157. package/dist/http.js.map +1 -0
  158. package/dist/index.cjs +831 -0
  159. package/dist/index.cjs.map +1 -0
  160. package/dist/index.d.cts +19 -0
  161. package/dist/index.d.ts +19 -0
  162. package/dist/index.js +783 -0
  163. package/dist/index.js.map +1 -0
  164. package/dist/lib/create-env-file.cjs +69 -0
  165. package/dist/lib/create-env-file.cjs.map +1 -0
  166. package/dist/lib/create-env-file.d.cts +3 -0
  167. package/dist/lib/create-env-file.d.ts +3 -0
  168. package/dist/lib/create-env-file.js +31 -0
  169. package/dist/lib/create-env-file.js.map +1 -0
  170. package/dist/lib/helper.cjs +94 -0
  171. package/dist/lib/helper.cjs.map +1 -0
  172. package/dist/lib/helper.d.cts +13 -0
  173. package/dist/lib/helper.d.ts +13 -0
  174. package/dist/lib/helper.js +62 -0
  175. package/dist/lib/helper.js.map +1 -0
  176. package/dist/lib/model.generator.cjs +212 -0
  177. package/dist/lib/model.generator.cjs.map +1 -0
  178. package/dist/lib/model.generator.d.cts +29 -0
  179. package/dist/lib/model.generator.d.ts +29 -0
  180. package/dist/lib/model.generator.js +174 -0
  181. package/dist/lib/model.generator.js.map +1 -0
  182. package/dist/lib/pre-init-dev-script.cjs +336 -0
  183. package/dist/lib/pre-init-dev-script.cjs.map +1 -0
  184. package/dist/lib/pre-init-dev-script.d.cts +2 -0
  185. package/dist/lib/pre-init-dev-script.d.ts +2 -0
  186. package/dist/lib/pre-init-dev-script.js +311 -0
  187. package/dist/lib/pre-init-dev-script.js.map +1 -0
  188. package/dist/mahameru.cjs +397 -0
  189. package/dist/mahameru.cjs.map +1 -0
  190. package/dist/mahameru.d.cts +78 -0
  191. package/dist/mahameru.d.ts +78 -0
  192. package/dist/mahameru.js +359 -0
  193. package/dist/mahameru.js.map +1 -0
  194. package/dist/request.cjs +35 -0
  195. package/dist/request.cjs.map +1 -0
  196. package/dist/request.d.cts +4 -0
  197. package/dist/request.d.ts +4 -0
  198. package/dist/request.js +13 -0
  199. package/dist/request.js.map +1 -0
  200. package/dist/response.cjs +35 -0
  201. package/dist/response.cjs.map +1 -0
  202. package/dist/response.d.cts +4 -0
  203. package/dist/response.d.ts +4 -0
  204. package/dist/response.js +13 -0
  205. package/dist/response.js.map +1 -0
  206. package/dist/types.cjs +1 -0
  207. package/dist/types.cjs.map +1 -0
  208. package/dist/types.d.cts +2 -0
  209. package/dist/types.d.ts +2 -0
  210. package/dist/types.js +1 -0
  211. package/dist/types.js.map +1 -0
  212. package/dist/utils/import-dynamic-module.cjs +34 -0
  213. package/dist/utils/import-dynamic-module.cjs.map +1 -0
  214. package/dist/utils/import-dynamic-module.d.cts +3 -0
  215. package/dist/utils/import-dynamic-module.d.ts +3 -0
  216. package/dist/utils/import-dynamic-module.js +12 -0
  217. package/dist/utils/import-dynamic-module.js.map +1 -0
  218. package/package.json +70 -0
@@ -0,0 +1,68 @@
1
+ import * as typeorm from 'typeorm';
2
+ import { ObjectLiteral, DataSource, EntityTarget, EntityManager, Repository, FindOptionsRelations, FindOptionsWhere, FindOptionsOrder, FindManyOptions, FindOneOptions, DeepPartial, QueryDeepPartialEntity } from 'typeorm';
3
+ import { ParsedListQuery } from './base.controller.js';
4
+ import 'express';
5
+ import './base.entity.js';
6
+
7
+ type CreateBatchOptions = {
8
+ chunkSize?: number;
9
+ };
10
+ type CreateBatchResult<T extends ObjectLiteral> = {
11
+ totalRecord: number;
12
+ totalAdded: number;
13
+ failed: {
14
+ data: DeepPartial<T>;
15
+ error: unknown;
16
+ }[];
17
+ };
18
+ type TransactionHandler<TResult> = (manager: EntityManager) => Promise<TResult>;
19
+ type BaseModelListOptions<TEntity extends ObjectLiteral> = {
20
+ parsedListQuery: ParsedListQuery<TEntity>;
21
+ searchFields?: (keyof TEntity)[];
22
+ relations?: FindOptionsRelations<TEntity>;
23
+ where?: FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[];
24
+ defaultOrder?: FindOptionsOrder<TEntity>;
25
+ };
26
+ declare abstract class BaseModel<TEntity extends ObjectLiteral & {
27
+ id: string;
28
+ }> {
29
+ protected readonly dataSource: DataSource;
30
+ protected readonly entityTarget: EntityTarget<TEntity>;
31
+ private static readonly defaultChunkSize;
32
+ constructor(dataSource: DataSource, entityTarget: EntityTarget<TEntity>);
33
+ protected getRepository(manager?: EntityManager): Repository<TEntity>;
34
+ transaction<TResult>(handler: TransactionHandler<TResult>): Promise<TResult>;
35
+ list(options: BaseModelListOptions<TEntity>, manager?: EntityManager): Promise<{
36
+ data: TEntity[];
37
+ meta: {
38
+ total: number;
39
+ limit: number;
40
+ offset: number;
41
+ hasNext: boolean;
42
+ };
43
+ }>;
44
+ find(options?: FindManyOptions<TEntity>, manager?: EntityManager): Promise<TEntity[]>;
45
+ findAndCount(options?: FindManyOptions<TEntity>, manager?: EntityManager): Promise<[TEntity[], number]>;
46
+ findOne(options: FindOneOptions<TEntity>, manager?: EntityManager): Promise<TEntity | null>;
47
+ findOneBy(where: FindOptionsWhere<TEntity>, manager?: EntityManager): Promise<TEntity | null>;
48
+ findOneById(id: TEntity['id'], manager?: EntityManager): Promise<TEntity | null>;
49
+ count(options?: FindManyOptions<TEntity>, manager?: EntityManager): Promise<number>;
50
+ countBy(where: FindOptionsWhere<TEntity>, manager?: EntityManager): Promise<number>;
51
+ exists(where: FindOptionsWhere<TEntity>, manager?: EntityManager): Promise<boolean>;
52
+ create(data: DeepPartial<TEntity>, manager?: EntityManager): TEntity;
53
+ save(data: DeepPartial<TEntity>, manager?: EntityManager): Promise<DeepPartial<TEntity> & TEntity>;
54
+ createAndSave(data: DeepPartial<TEntity>, manager?: EntityManager): Promise<TEntity>;
55
+ createBatch(data: DeepPartial<TEntity>[], options?: CreateBatchOptions, manager?: EntityManager): Promise<CreateBatchResult<TEntity>>;
56
+ update(where: FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[], data: DeepPartial<TEntity>, manager?: EntityManager): Promise<typeorm.UpdateResult>;
57
+ updateById(id: TEntity['id'], data: DeepPartial<TEntity>, manager?: EntityManager): Promise<typeorm.UpdateResult>;
58
+ updateByIds(ids: string[], data: QueryDeepPartialEntity<TEntity>, manager?: EntityManager): Promise<typeorm.UpdateResult>;
59
+ removeById(id: TEntity['id'], manager?: EntityManager): Promise<TEntity | null>;
60
+ softRemoveById(id: TEntity['id'], manager?: EntityManager): Promise<TEntity | null>;
61
+ restoreById(id: TEntity['id'], manager?: EntityManager): Promise<boolean>;
62
+ delete(where: FindOptionsWhere<TEntity>, manager?: EntityManager): Promise<boolean>;
63
+ private normalizeChunkSize;
64
+ saveBatch(data: DeepPartial<TEntity>[], manager?: EntityManager): Promise<TEntity[]>;
65
+ private saveBatchOneByOne;
66
+ }
67
+
68
+ export { BaseModel, type BaseModelListOptions, type CreateBatchOptions, type CreateBatchResult, type TransactionHandler };
@@ -0,0 +1,182 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/base-class/base.model.ts
5
+ import { Like } from "typeorm";
6
+ var BaseModel = class _BaseModel {
7
+ static {
8
+ __name(this, "BaseModel");
9
+ }
10
+ dataSource;
11
+ entityTarget;
12
+ static defaultChunkSize = 500;
13
+ constructor(dataSource, entityTarget) {
14
+ this.dataSource = dataSource;
15
+ this.entityTarget = entityTarget;
16
+ }
17
+ getRepository(manager) {
18
+ return (manager ?? this.dataSource.manager).getRepository(this.entityTarget);
19
+ }
20
+ transaction(handler) {
21
+ return this.dataSource.transaction(handler);
22
+ }
23
+ async list(options, manager) {
24
+ let where = options.where;
25
+ if (typeof options.parsedListQuery.query === "string" && options.parsedListQuery.query.trim().length > 0 && options.searchFields && options.searchFields.length > 0) {
26
+ const search = `%${options.parsedListQuery.query.trim()}%`;
27
+ where = options.searchFields.map((field) => ({
28
+ [field]: Like(search)
29
+ }));
30
+ }
31
+ const order = options.parsedListQuery.sortBy ? {
32
+ [options.parsedListQuery.sortBy]: options.parsedListQuery.sortDirection ?? "ASC"
33
+ } : options.defaultOrder;
34
+ const [data, total] = await this.getRepository(manager).findAndCount({
35
+ where,
36
+ take: options.parsedListQuery.limit,
37
+ skip: options.parsedListQuery.offset,
38
+ order,
39
+ relations: options.relations
40
+ });
41
+ return {
42
+ data,
43
+ meta: {
44
+ total,
45
+ limit: options.parsedListQuery.limit,
46
+ offset: options.parsedListQuery.offset,
47
+ hasNext: options.parsedListQuery.offset + data.length < total
48
+ }
49
+ };
50
+ }
51
+ find(options, manager) {
52
+ return this.getRepository(manager).find(options);
53
+ }
54
+ findAndCount(options, manager) {
55
+ return this.getRepository(manager).findAndCount(options);
56
+ }
57
+ findOne(options, manager) {
58
+ return this.getRepository(manager).findOne(options);
59
+ }
60
+ findOneBy(where, manager) {
61
+ return this.getRepository(manager).findOneBy(where);
62
+ }
63
+ findOneById(id, manager) {
64
+ return this.getRepository(manager).findOne({
65
+ where: {
66
+ id
67
+ }
68
+ });
69
+ }
70
+ count(options, manager) {
71
+ return this.getRepository(manager).count(options);
72
+ }
73
+ countBy(where, manager) {
74
+ return this.getRepository(manager).countBy(where);
75
+ }
76
+ async exists(where, manager) {
77
+ const total = await this.countBy(where, manager);
78
+ return total > 0;
79
+ }
80
+ create(data, manager) {
81
+ return this.getRepository(manager).create(data);
82
+ }
83
+ save(data, manager) {
84
+ return this.getRepository(manager).save(data);
85
+ }
86
+ async createAndSave(data, manager) {
87
+ const repository = this.getRepository(manager);
88
+ const entity = repository.create(data);
89
+ return repository.save(entity);
90
+ }
91
+ async createBatch(data, options = {}, manager) {
92
+ const chunkSize = this.normalizeChunkSize(options.chunkSize);
93
+ const result = {
94
+ totalRecord: data.length,
95
+ totalAdded: 0,
96
+ failed: []
97
+ };
98
+ for (let index = 0; index < data.length; index += chunkSize) {
99
+ const chunk = data.slice(index, index + chunkSize);
100
+ try {
101
+ const saved = await this.saveBatch(chunk, manager);
102
+ result.totalAdded += saved.length;
103
+ } catch {
104
+ await this.saveBatchOneByOne(chunk, result, manager);
105
+ }
106
+ }
107
+ return result;
108
+ }
109
+ async update(where, data, manager) {
110
+ const repository = this.getRepository(manager);
111
+ if (!data.updatedAt) data.updatedAt = /* @__PURE__ */ new Date();
112
+ return repository.update(where, data);
113
+ }
114
+ updateById(id, data, manager) {
115
+ const repository = this.getRepository(manager);
116
+ if (!data.updatedAt) data.updatedAt = /* @__PURE__ */ new Date();
117
+ return repository.update(id, data);
118
+ }
119
+ async updateByIds(ids, data, manager) {
120
+ const repository = this.getRepository(manager);
121
+ if (!data.updatedAt) data.updatedAt = /* @__PURE__ */ new Date();
122
+ return repository.update(ids, {
123
+ ...data
124
+ });
125
+ }
126
+ async removeById(id, manager) {
127
+ const repository = this.getRepository(manager);
128
+ const entity = await this.findOneById(id, manager);
129
+ if (!entity) {
130
+ return null;
131
+ }
132
+ await repository.remove(entity);
133
+ return entity;
134
+ }
135
+ async softRemoveById(id, manager) {
136
+ const repository = this.getRepository(manager);
137
+ const entity = await this.findOneById(id, manager);
138
+ if (!entity) {
139
+ return null;
140
+ }
141
+ await repository.softRemove(entity);
142
+ return entity;
143
+ }
144
+ async restoreById(id, manager) {
145
+ const result = await this.getRepository(manager).restore(id);
146
+ return Boolean(result.affected);
147
+ }
148
+ async delete(where, manager) {
149
+ const result = await this.getRepository(manager).delete(where);
150
+ return Boolean(result.affected);
151
+ }
152
+ normalizeChunkSize(chunkSize) {
153
+ if (!chunkSize || chunkSize < 1) return _BaseModel.defaultChunkSize;
154
+ return Math.floor(chunkSize);
155
+ }
156
+ async saveBatch(data, manager) {
157
+ const repo = this.getRepository(manager);
158
+ const objects = repo.create(data);
159
+ return repo.save(objects, {
160
+ chunk: data.length
161
+ });
162
+ }
163
+ async saveBatchOneByOne(data, result, manager) {
164
+ for (const item of data) {
165
+ try {
166
+ await this.saveBatch([
167
+ item
168
+ ], manager);
169
+ result.totalAdded += 1;
170
+ } catch (error) {
171
+ result.failed.push({
172
+ data: item,
173
+ error
174
+ });
175
+ }
176
+ }
177
+ }
178
+ };
179
+ export {
180
+ BaseModel
181
+ };
182
+ //# sourceMappingURL=base.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/base-class/base.model.ts"],"sourcesContent":["import {\r\n DataSource,\r\n DeepPartial,\r\n EntityManager,\r\n EntityTarget,\r\n FindManyOptions,\r\n FindOneOptions,\r\n FindOptionsOrder,\r\n FindOptionsRelations,\r\n FindOptionsWhere,\r\n Like,\r\n ObjectLiteral,\r\n QueryDeepPartialEntity,\r\n Repository\r\n} from 'typeorm'\r\nimport type { ParsedListQuery } from './base.controller.js'\r\n\r\nexport type CreateBatchOptions = {\r\n chunkSize?: number\r\n}\r\n\r\nexport type CreateBatchResult<T extends ObjectLiteral> = {\r\n totalRecord: number\r\n totalAdded: number\r\n failed: {\r\n data: DeepPartial<T>\r\n error: unknown\r\n }[]\r\n}\r\n\r\nexport type TransactionHandler<TResult> = (manager: EntityManager) => Promise<TResult>\r\n\r\nexport type BaseModelListOptions<TEntity extends ObjectLiteral> = {\r\n parsedListQuery: ParsedListQuery<TEntity>\r\n searchFields?: (keyof TEntity)[]\r\n relations?: FindOptionsRelations<TEntity>\r\n where?: FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[]\r\n defaultOrder?: FindOptionsOrder<TEntity>\r\n}\r\n\r\nexport abstract class BaseModel<TEntity extends ObjectLiteral & { id: string }> {\r\n private static readonly defaultChunkSize = 500\r\n\r\n constructor(\r\n protected readonly dataSource: DataSource,\r\n protected readonly entityTarget: EntityTarget<TEntity>\r\n ) { }\r\n\r\n protected getRepository(manager?: EntityManager): Repository<TEntity> {\r\n return (manager ?? this.dataSource.manager).getRepository(this.entityTarget)\r\n }\r\n\r\n transaction<TResult>(handler: TransactionHandler<TResult>): Promise<TResult> {\r\n return this.dataSource.transaction(handler)\r\n }\r\n\r\n async list(options: BaseModelListOptions<TEntity>, manager?: EntityManager) {\r\n let where = options.where\r\n\r\n if (\r\n typeof options.parsedListQuery.query === 'string' &&\r\n options.parsedListQuery.query.trim().length > 0 &&\r\n options.searchFields &&\r\n options.searchFields.length > 0\r\n ) {\r\n const search = `%${options.parsedListQuery.query.trim()}%`\r\n\r\n where = options.searchFields.map((field) => ({\r\n [field]: Like(search)\r\n })) as FindOptionsWhere<TEntity>[]\r\n }\r\n\r\n const order: FindOptionsOrder<TEntity> | undefined = options.parsedListQuery.sortBy\r\n ? {\r\n [options.parsedListQuery.sortBy]: options.parsedListQuery.sortDirection ?? 'ASC'\r\n } as FindOptionsOrder<TEntity>\r\n : options.defaultOrder\r\n\r\n const [data, total] = await this.getRepository(manager).findAndCount({\r\n where,\r\n take: options.parsedListQuery.limit,\r\n skip: options.parsedListQuery.offset,\r\n order,\r\n relations: options.relations\r\n })\r\n\r\n return {\r\n data,\r\n meta: {\r\n total,\r\n limit: options.parsedListQuery.limit,\r\n offset: options.parsedListQuery.offset,\r\n hasNext: options.parsedListQuery.offset + data.length < total\r\n }\r\n }\r\n }\r\n\r\n find(options?: FindManyOptions<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).find(options)\r\n }\r\n\r\n findAndCount(options?: FindManyOptions<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).findAndCount(options)\r\n }\r\n\r\n findOne(options: FindOneOptions<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).findOne(options)\r\n }\r\n\r\n findOneBy(where: FindOptionsWhere<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).findOneBy(where)\r\n }\r\n\r\n findOneById(id: TEntity['id'], manager?: EntityManager) {\r\n return this.getRepository(manager).findOne({\r\n where: {\r\n id\r\n } as FindOptionsWhere<TEntity>\r\n })\r\n }\r\n\r\n count(options?: FindManyOptions<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).count(options)\r\n }\r\n\r\n countBy(where: FindOptionsWhere<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).countBy(where)\r\n }\r\n\r\n async exists(where: FindOptionsWhere<TEntity>, manager?: EntityManager) {\r\n const total = await this.countBy(where, manager)\r\n\r\n return total > 0\r\n }\r\n\r\n create(data: DeepPartial<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).create(data)\r\n }\r\n\r\n save(data: DeepPartial<TEntity>, manager?: EntityManager) {\r\n return this.getRepository(manager).save(data)\r\n }\r\n\r\n async createAndSave(data: DeepPartial<TEntity>, manager?: EntityManager) {\r\n const repository = this.getRepository(manager)\r\n const entity = repository.create(data)\r\n\r\n return repository.save(entity)\r\n }\r\n\r\n async createBatch(data: DeepPartial<TEntity>[], options: CreateBatchOptions = {}, manager?: EntityManager): Promise<CreateBatchResult<TEntity>> {\r\n const chunkSize = this.normalizeChunkSize(options.chunkSize)\r\n const result: CreateBatchResult<TEntity> = {\r\n totalRecord: data.length,\r\n totalAdded: 0,\r\n failed: []\r\n }\r\n\r\n for (let index = 0; index < data.length; index += chunkSize) {\r\n const chunk = data.slice(index, index + chunkSize)\r\n\r\n try {\r\n const saved = await this.saveBatch(chunk, manager)\r\n result.totalAdded += saved.length\r\n } catch {\r\n await this.saveBatchOneByOne(chunk, result, manager)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n async update(where: FindOptionsWhere<TEntity> | FindOptionsWhere<TEntity>[], data: DeepPartial<TEntity>, manager?: EntityManager) {\r\n const repository = this.getRepository(manager)\r\n\r\n if (!data.updatedAt)\r\n (data as any).updatedAt = new Date()\r\n\r\n return repository.update(where, data)\r\n }\r\n\r\n updateById(\r\n id: TEntity['id'],\r\n data: DeepPartial<TEntity>,\r\n manager?: EntityManager\r\n ) {\r\n const repository = this.getRepository(manager)\r\n\r\n if (!data.updatedAt)\r\n (data as any).updatedAt = new Date()\r\n\r\n return repository.update(id, data)\r\n }\r\n\r\n async updateByIds(\r\n ids: string[],\r\n data: QueryDeepPartialEntity<TEntity>,\r\n manager?: EntityManager\r\n ) {\r\n const repository = this.getRepository(manager)\r\n\r\n if (!(data as any).updatedAt)\r\n (data as any).updatedAt = new Date()\r\n\r\n return repository.update(ids, { ...data })\r\n }\r\n\r\n async removeById(id: TEntity['id'], manager?: EntityManager) {\r\n const repository = this.getRepository(manager)\r\n\r\n const entity = await this.findOneById(id, manager)\r\n\r\n if (!entity) {\r\n return null\r\n }\r\n\r\n await repository.remove(entity)\r\n\r\n return entity\r\n }\r\n\r\n async softRemoveById(id: TEntity['id'], manager?: EntityManager) {\r\n const repository = this.getRepository(manager)\r\n\r\n const entity = await this.findOneById(id, manager)\r\n\r\n if (!entity) {\r\n return null\r\n }\r\n\r\n await repository.softRemove(entity)\r\n\r\n return entity\r\n }\r\n\r\n async restoreById(id: TEntity['id'], manager?: EntityManager) {\r\n const result = await this.getRepository(manager).restore(id)\r\n\r\n return Boolean(result.affected)\r\n }\r\n\r\n async delete(where: FindOptionsWhere<TEntity>, manager?: EntityManager) {\r\n const result = await this.getRepository(manager).delete(where)\r\n\r\n return Boolean(result.affected)\r\n }\r\n\r\n private normalizeChunkSize(chunkSize?: number) {\r\n if (!chunkSize || chunkSize < 1) return BaseModel.defaultChunkSize\r\n\r\n return Math.floor(chunkSize)\r\n }\r\n\r\n async saveBatch(data: DeepPartial<TEntity>[], manager?: EntityManager) {\r\n const repo = this.getRepository(manager)\r\n const objects = repo.create(data)\r\n\r\n return repo.save(objects, {\r\n chunk: data.length\r\n })\r\n }\r\n\r\n private async saveBatchOneByOne(data: DeepPartial<TEntity>[], result: CreateBatchResult<TEntity>, manager?: EntityManager) {\r\n for (const item of data) {\r\n try {\r\n await this.saveBatch([item], manager)\r\n result.totalAdded += 1\r\n } catch (error) {\r\n result.failed.push({\r\n data: item,\r\n error\r\n })\r\n }\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["Like","BaseModel","defaultChunkSize","dataSource","entityTarget","getRepository","manager","transaction","handler","list","options","where","parsedListQuery","query","trim","length","searchFields","search","map","field","Like","order","sortBy","sortDirection","defaultOrder","data","total","findAndCount","take","limit","skip","offset","relations","meta","hasNext","find","findOne","findOneBy","findOneById","id","count","countBy","exists","create","save","createAndSave","repository","entity","createBatch","chunkSize","normalizeChunkSize","result","totalRecord","totalAdded","failed","index","chunk","slice","saved","saveBatch","saveBatchOneByOne","update","updatedAt","Date","updateById","updateByIds","ids","removeById","remove","softRemoveById","softRemove","restoreById","restore","Boolean","affected","delete","Math","floor","repo","objects","item","error","push"]}
@@ -0,0 +1,37 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/base-class/base.service.ts
21
+ var base_service_exports = {};
22
+ __export(base_service_exports, {
23
+ BaseService: () => BaseService
24
+ });
25
+ module.exports = __toCommonJS(base_service_exports);
26
+ var BaseService = class {
27
+ static {
28
+ __name(this, "BaseService");
29
+ }
30
+ constructor() {
31
+ }
32
+ };
33
+ // Annotate the CommonJS export names for ESM import in node:
34
+ 0 && (module.exports = {
35
+ BaseService
36
+ });
37
+ //# sourceMappingURL=base.service.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/base-class/base.service.ts"],"sourcesContent":["export class BaseService {\r\n constructor() { }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAO,IAAMA,cAAN,MAAMA;EAAb,OAAaA;;;EACT,cAAc;EAAE;AACpB;","names":["BaseService"]}
@@ -0,0 +1,5 @@
1
+ declare class BaseService {
2
+ constructor();
3
+ }
4
+
5
+ export { BaseService };
@@ -0,0 +1,5 @@
1
+ declare class BaseService {
2
+ constructor();
3
+ }
4
+
5
+ export { BaseService };
@@ -0,0 +1,15 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/base-class/base.service.ts
5
+ var BaseService = class {
6
+ static {
7
+ __name(this, "BaseService");
8
+ }
9
+ constructor() {
10
+ }
11
+ };
12
+ export {
13
+ BaseService
14
+ };
15
+ //# sourceMappingURL=base.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/base-class/base.service.ts"],"sourcesContent":["export class BaseService {\r\n constructor() { }\r\n}\r\n"],"mappings":";;;;AAAO,IAAMA,cAAN,MAAMA;EAAb,OAAaA;;;EACT,cAAc;EAAE;AACpB;","names":["BaseService"]}