@nocobase/database 0.7.0-alpha.9 → 0.7.1-alpha.6

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 (325) hide show
  1. package/lib/collection-importer.js +85 -68
  2. package/lib/collection.d.ts +6 -2
  3. package/lib/collection.js +371 -210
  4. package/lib/database.d.ts +23 -4
  5. package/lib/database.js +599 -273
  6. package/lib/fields/array-field.js +45 -25
  7. package/lib/fields/belongs-to-field.js +101 -54
  8. package/lib/fields/belongs-to-many-field.js +98 -53
  9. package/lib/fields/boolean-field.js +24 -9
  10. package/lib/fields/context-field.js +77 -45
  11. package/lib/fields/date-field.js +24 -9
  12. package/lib/fields/field.d.ts +4 -1
  13. package/lib/fields/field.js +231 -75
  14. package/lib/fields/formula-field.d.ts +19 -0
  15. package/lib/fields/formula-field.js +184 -0
  16. package/lib/fields/has-inverse-field.js +4 -2
  17. package/lib/fields/has-many-field.js +105 -56
  18. package/lib/fields/has-one-field.js +105 -54
  19. package/lib/fields/index.d.ts +5 -1
  20. package/lib/fields/index.js +290 -32
  21. package/lib/fields/json-field.js +36 -16
  22. package/lib/fields/number-field.js +53 -26
  23. package/lib/fields/password-field.js +120 -73
  24. package/lib/fields/radio-field.js +75 -47
  25. package/lib/fields/relation-field.js +41 -28
  26. package/lib/fields/sort-field.js +165 -89
  27. package/lib/fields/string-field.js +24 -9
  28. package/lib/fields/text-field.js +24 -9
  29. package/lib/fields/time-field.js +24 -9
  30. package/lib/fields/uid-field.js +57 -28
  31. package/lib/fields/uuid-field.d.ts +9 -0
  32. package/lib/fields/uuid-field.js +39 -0
  33. package/lib/fields/virtual-field.js +24 -9
  34. package/lib/filter-parser.js +288 -179
  35. package/lib/index.d.ts +1 -0
  36. package/lib/index.js +224 -29
  37. package/lib/magic-attribute-model.js +123 -71
  38. package/lib/migration.d.ts +35 -0
  39. package/lib/migration.js +90 -0
  40. package/lib/mock-database.d.ts +1 -0
  41. package/lib/mock-database.js +69 -34
  42. package/lib/model-hook.d.ts +5 -5
  43. package/lib/model-hook.js +109 -60
  44. package/lib/model.js +116 -81
  45. package/lib/operators/array.js +136 -96
  46. package/lib/operators/association.js +30 -14
  47. package/lib/operators/boolean.d.ts +13 -0
  48. package/lib/operators/boolean.js +35 -0
  49. package/lib/operators/date.js +78 -34
  50. package/lib/operators/empty.js +113 -75
  51. package/lib/operators/index.js +15 -3
  52. package/lib/operators/ne.js +27 -12
  53. package/{esm/operators/ne.d.ts → lib/operators/notIn.d.ts} +2 -2
  54. package/lib/operators/notIn.js +29 -0
  55. package/lib/operators/string.js +56 -35
  56. package/lib/operators/utils.js +18 -10
  57. package/lib/options-parser.js +345 -215
  58. package/lib/playground.js +66 -53
  59. package/lib/relation-repository/belongs-to-many-repository.js +281 -198
  60. package/lib/relation-repository/belongs-to-repository.js +10 -6
  61. package/lib/relation-repository/hasmany-repository.js +168 -121
  62. package/lib/relation-repository/hasone-repository.js +10 -6
  63. package/lib/relation-repository/multiple-relation-repository.d.ts +3 -3
  64. package/lib/relation-repository/multiple-relation-repository.js +263 -148
  65. package/lib/relation-repository/relation-repository.d.ts +1 -1
  66. package/lib/relation-repository/relation-repository.js +163 -93
  67. package/lib/relation-repository/single-relation-repository.d.ts +6 -6
  68. package/lib/relation-repository/single-relation-repository.js +145 -99
  69. package/lib/relation-repository/types.js +4 -2
  70. package/lib/repository.d.ts +4 -7
  71. package/lib/repository.js +473 -291
  72. package/lib/transaction-decorator.js +80 -67
  73. package/lib/update-associations.d.ts +1 -2
  74. package/lib/update-associations.js +525 -321
  75. package/lib/update-guard.js +160 -117
  76. package/package.json +9 -9
  77. package/src/__tests__/collection.test.ts +27 -0
  78. package/src/__tests__/database.test.ts +47 -0
  79. package/src/__tests__/fields/formula-field.test.ts +69 -0
  80. package/src/__tests__/fields/uuid-field.test.ts +30 -0
  81. package/src/__tests__/fixtures/migrations/m1.ts +7 -0
  82. package/src/__tests__/fixtures/migrations/m2.ts +7 -0
  83. package/src/__tests__/hooks/afterCreateWithAssociations.test.ts +33 -0
  84. package/src/__tests__/migrator.test.ts +70 -0
  85. package/src/__tests__/model-hook.test.ts +54 -0
  86. package/src/__tests__/operator/notIn.test.ts +33 -0
  87. package/src/__tests__/option-parser.test.ts +30 -6
  88. package/src/__tests__/relation-repository/belongs-to-many-repository.test.ts +1 -1
  89. package/src/__tests__/sequelize-hooks.test.ts +69 -0
  90. package/src/__tests__/sort.test.ts +51 -0
  91. package/src/__tests__/update-associations.test.ts +3 -3
  92. package/src/collection-importer.ts +12 -20
  93. package/src/collection.ts +26 -2
  94. package/src/database.ts +144 -14
  95. package/src/fields/field.ts +88 -1
  96. package/src/fields/formula-field.ts +106 -0
  97. package/src/fields/index.ts +6 -0
  98. package/src/fields/password-field.ts +2 -0
  99. package/src/fields/uuid-field.ts +21 -0
  100. package/src/index.ts +1 -0
  101. package/src/migration.ts +76 -0
  102. package/src/mock-database.ts +2 -1
  103. package/src/model-hook.ts +26 -22
  104. package/src/operators/boolean.ts +18 -0
  105. package/src/operators/index.ts +2 -0
  106. package/src/operators/notIn.ts +12 -0
  107. package/src/options-parser.ts +14 -10
  108. package/src/relation-repository/multiple-relation-repository.ts +14 -6
  109. package/src/relation-repository/relation-repository.ts +12 -6
  110. package/src/relation-repository/single-relation-repository.ts +11 -7
  111. package/src/repository.ts +20 -10
  112. package/src/update-associations.ts +2 -3
  113. package/esm/collection-importer.d.ts +0 -7
  114. package/esm/collection-importer.js +0 -49
  115. package/esm/collection-importer.js.map +0 -1
  116. package/esm/collection.d.ts +0 -73
  117. package/esm/collection.js +0 -224
  118. package/esm/collection.js.map +0 -1
  119. package/esm/database.d.ts +0 -101
  120. package/esm/database.js +0 -275
  121. package/esm/database.js.map +0 -1
  122. package/esm/fields/array-field.d.ts +0 -11
  123. package/esm/fields/array-field.js +0 -26
  124. package/esm/fields/array-field.js.map +0 -1
  125. package/esm/fields/belongs-to-field.d.ts +0 -12
  126. package/esm/fields/belongs-to-field.js +0 -57
  127. package/esm/fields/belongs-to-field.js.map +0 -1
  128. package/esm/fields/belongs-to-many-field.d.ts +0 -11
  129. package/esm/fields/belongs-to-many-field.js +0 -55
  130. package/esm/fields/belongs-to-many-field.js.map +0 -1
  131. package/esm/fields/boolean-field.d.ts +0 -8
  132. package/esm/fields/boolean-field.js +0 -8
  133. package/esm/fields/boolean-field.js.map +0 -1
  134. package/esm/fields/context-field.d.ts +0 -13
  135. package/esm/fields/context-field.js +0 -43
  136. package/esm/fields/context-field.js.map +0 -1
  137. package/esm/fields/date-field.d.ts +0 -8
  138. package/esm/fields/date-field.js +0 -8
  139. package/esm/fields/date-field.js.map +0 -1
  140. package/esm/fields/field.d.ts +0 -37
  141. package/esm/fields/field.js +0 -74
  142. package/esm/fields/field.js.map +0 -1
  143. package/esm/fields/has-inverse-field.d.ts +0 -4
  144. package/esm/fields/has-inverse-field.js +0 -2
  145. package/esm/fields/has-inverse-field.js.map +0 -1
  146. package/esm/fields/has-many-field.d.ts +0 -64
  147. package/esm/fields/has-many-field.js +0 -58
  148. package/esm/fields/has-many-field.js.map +0 -1
  149. package/esm/fields/has-one-field.d.ts +0 -64
  150. package/esm/fields/has-one-field.js +0 -57
  151. package/esm/fields/has-one-field.js.map +0 -1
  152. package/esm/fields/index.d.ts +0 -40
  153. package/esm/fields/index.js +0 -21
  154. package/esm/fields/index.js.map +0 -1
  155. package/esm/fields/json-field.d.ts +0 -14
  156. package/esm/fields/json-field.js +0 -17
  157. package/esm/fields/json-field.js.map +0 -1
  158. package/esm/fields/number-field.d.ts +0 -32
  159. package/esm/fields/number-field.js +0 -28
  160. package/esm/fields/number-field.js.map +0 -1
  161. package/esm/fields/password-field.d.ts +0 -21
  162. package/esm/fields/password-field.js +0 -71
  163. package/esm/fields/password-field.js.map +0 -1
  164. package/esm/fields/radio-field.d.ts +0 -14
  165. package/esm/fields/radio-field.js +0 -49
  166. package/esm/fields/radio-field.js.map +0 -1
  167. package/esm/fields/relation-field.d.ts +0 -20
  168. package/esm/fields/relation-field.js +0 -27
  169. package/esm/fields/relation-field.js.map +0 -1
  170. package/esm/fields/sort-field.d.ts +0 -16
  171. package/esm/fields/sort-field.js +0 -90
  172. package/esm/fields/sort-field.js.map +0 -1
  173. package/esm/fields/string-field.d.ts +0 -8
  174. package/esm/fields/string-field.js +0 -8
  175. package/esm/fields/string-field.js.map +0 -1
  176. package/esm/fields/text-field.d.ts +0 -8
  177. package/esm/fields/text-field.js +0 -8
  178. package/esm/fields/text-field.js.map +0 -1
  179. package/esm/fields/time-field.d.ts +0 -8
  180. package/esm/fields/time-field.js +0 -8
  181. package/esm/fields/time-field.js.map +0 -1
  182. package/esm/fields/uid-field.d.ts +0 -10
  183. package/esm/fields/uid-field.js +0 -27
  184. package/esm/fields/uid-field.js.map +0 -1
  185. package/esm/fields/virtual-field.d.ts +0 -8
  186. package/esm/fields/virtual-field.js +0 -8
  187. package/esm/fields/virtual-field.js.map +0 -1
  188. package/esm/filter-parser.d.ts +0 -27
  189. package/esm/filter-parser.js +0 -185
  190. package/esm/filter-parser.js.map +0 -1
  191. package/esm/index.d.ts +0 -15
  192. package/esm/index.js +0 -16
  193. package/esm/index.js.map +0 -1
  194. package/esm/magic-attribute-model.d.ts +0 -7
  195. package/esm/magic-attribute-model.js +0 -70
  196. package/esm/magic-attribute-model.js.map +0 -1
  197. package/esm/mock-database.d.ts +0 -22
  198. package/esm/mock-database.js +0 -34
  199. package/esm/mock-database.js.map +0 -1
  200. package/esm/model-hook.d.ts +0 -12
  201. package/esm/model-hook.js +0 -61
  202. package/esm/model-hook.js.map +0 -1
  203. package/esm/model.d.ts +0 -15
  204. package/esm/model.js +0 -80
  205. package/esm/model.js.map +0 -1
  206. package/esm/operators/array.d.ts +0 -26
  207. package/esm/operators/array.js +0 -105
  208. package/esm/operators/array.js.map +0 -1
  209. package/esm/operators/association.d.ts +0 -10
  210. package/esm/operators/association.js +0 -14
  211. package/esm/operators/association.js.map +0 -1
  212. package/esm/operators/date.d.ts +0 -34
  213. package/esm/operators/date.js +0 -35
  214. package/esm/operators/date.js.map +0 -1
  215. package/esm/operators/empty.d.ts +0 -28
  216. package/esm/operators/empty.js +0 -58
  217. package/esm/operators/empty.js.map +0 -1
  218. package/esm/operators/index.d.ts +0 -2
  219. package/esm/operators/index.js +0 -2
  220. package/esm/operators/index.js.map +0 -1
  221. package/esm/operators/ne.js +0 -12
  222. package/esm/operators/ne.js.map +0 -1
  223. package/esm/operators/string.d.ts +0 -21
  224. package/esm/operators/string.js +0 -35
  225. package/esm/operators/string.js.map +0 -1
  226. package/esm/operators/utils.d.ts +0 -4
  227. package/esm/operators/utils.js +0 -11
  228. package/esm/operators/utils.js.map +0 -1
  229. package/esm/options-parser.d.ts +0 -31
  230. package/esm/options-parser.js +0 -225
  231. package/esm/options-parser.js.map +0 -1
  232. package/esm/playground.d.ts +0 -1
  233. package/esm/playground.js +0 -53
  234. package/esm/playground.js.map +0 -1
  235. package/esm/relation-repository/belongs-to-many-repository.d.ts +0 -36
  236. package/esm/relation-repository/belongs-to-many-repository.js +0 -199
  237. package/esm/relation-repository/belongs-to-many-repository.js.map +0 -1
  238. package/esm/relation-repository/belongs-to-repository.d.ts +0 -17
  239. package/esm/relation-repository/belongs-to-repository.js +0 -4
  240. package/esm/relation-repository/belongs-to-repository.js.map +0 -1
  241. package/esm/relation-repository/hasmany-repository.d.ts +0 -23
  242. package/esm/relation-repository/hasmany-repository.js +0 -125
  243. package/esm/relation-repository/hasmany-repository.js.map +0 -1
  244. package/esm/relation-repository/hasone-repository.d.ts +0 -17
  245. package/esm/relation-repository/hasone-repository.js +0 -4
  246. package/esm/relation-repository/hasone-repository.js.map +0 -1
  247. package/esm/relation-repository/multiple-relation-repository.d.ts +0 -23
  248. package/esm/relation-repository/multiple-relation-repository.js +0 -149
  249. package/esm/relation-repository/multiple-relation-repository.js.map +0 -1
  250. package/esm/relation-repository/relation-repository.d.ts +0 -32
  251. package/esm/relation-repository/relation-repository.js +0 -93
  252. package/esm/relation-repository/relation-repository.js.map +0 -1
  253. package/esm/relation-repository/single-relation-repository.d.ts +0 -23
  254. package/esm/relation-repository/single-relation-repository.js +0 -96
  255. package/esm/relation-repository/single-relation-repository.js.map +0 -1
  256. package/esm/relation-repository/types.d.ts +0 -7
  257. package/esm/relation-repository/types.js +0 -2
  258. package/esm/relation-repository/types.js.map +0 -1
  259. package/esm/repository.d.ts +0 -165
  260. package/esm/repository.js +0 -276
  261. package/esm/repository.js.map +0 -1
  262. package/esm/transaction-decorator.d.ts +0 -1
  263. package/esm/transaction-decorator.js +0 -63
  264. package/esm/transaction-decorator.js.map +0 -1
  265. package/esm/update-associations.d.ts +0 -60
  266. package/esm/update-associations.js +0 -362
  267. package/esm/update-associations.js.map +0 -1
  268. package/esm/update-guard.d.ts +0 -26
  269. package/esm/update-guard.js +0 -122
  270. package/esm/update-guard.js.map +0 -1
  271. package/lib/collection-importer.js.map +0 -1
  272. package/lib/collection.js.map +0 -1
  273. package/lib/database.js.map +0 -1
  274. package/lib/fields/array-field.js.map +0 -1
  275. package/lib/fields/belongs-to-field.js.map +0 -1
  276. package/lib/fields/belongs-to-many-field.js.map +0 -1
  277. package/lib/fields/boolean-field.js.map +0 -1
  278. package/lib/fields/context-field.js.map +0 -1
  279. package/lib/fields/date-field.js.map +0 -1
  280. package/lib/fields/field.js.map +0 -1
  281. package/lib/fields/has-inverse-field.js.map +0 -1
  282. package/lib/fields/has-many-field.js.map +0 -1
  283. package/lib/fields/has-one-field.js.map +0 -1
  284. package/lib/fields/index.js.map +0 -1
  285. package/lib/fields/json-field.js.map +0 -1
  286. package/lib/fields/number-field.js.map +0 -1
  287. package/lib/fields/password-field.js.map +0 -1
  288. package/lib/fields/radio-field.js.map +0 -1
  289. package/lib/fields/relation-field.js.map +0 -1
  290. package/lib/fields/sort-field.js.map +0 -1
  291. package/lib/fields/string-field.js.map +0 -1
  292. package/lib/fields/text-field.js.map +0 -1
  293. package/lib/fields/time-field.js.map +0 -1
  294. package/lib/fields/uid-field.js.map +0 -1
  295. package/lib/fields/virtual-field.js.map +0 -1
  296. package/lib/filter-parser.js.map +0 -1
  297. package/lib/index.js.map +0 -1
  298. package/lib/magic-attribute-model.js.map +0 -1
  299. package/lib/mock-database.js.map +0 -1
  300. package/lib/model-hook.js.map +0 -1
  301. package/lib/model.js.map +0 -1
  302. package/lib/operators/array.js.map +0 -1
  303. package/lib/operators/association.js.map +0 -1
  304. package/lib/operators/date.js.map +0 -1
  305. package/lib/operators/empty.js.map +0 -1
  306. package/lib/operators/index.js.map +0 -1
  307. package/lib/operators/ne.js.map +0 -1
  308. package/lib/operators/string.js.map +0 -1
  309. package/lib/operators/utils.js.map +0 -1
  310. package/lib/options-parser.js.map +0 -1
  311. package/lib/playground.js.map +0 -1
  312. package/lib/relation-repository/belongs-to-many-repository.js.map +0 -1
  313. package/lib/relation-repository/belongs-to-repository.js.map +0 -1
  314. package/lib/relation-repository/hasmany-repository.js.map +0 -1
  315. package/lib/relation-repository/hasone-repository.js.map +0 -1
  316. package/lib/relation-repository/multiple-relation-repository.js.map +0 -1
  317. package/lib/relation-repository/relation-repository.js.map +0 -1
  318. package/lib/relation-repository/single-relation-repository.js.map +0 -1
  319. package/lib/relation-repository/types.js.map +0 -1
  320. package/lib/repository.js.map +0 -1
  321. package/lib/transaction-decorator.js.map +0 -1
  322. package/lib/update-associations.js.map +0 -1
  323. package/lib/update-guard.js.map +0 -1
  324. package/tsconfig.build.json +0 -9
  325. package/tsconfig.json +0 -5
@@ -1,24 +1,24 @@
1
1
  import lodash from 'lodash';
2
- import { SingleAssociationAccessors } from 'sequelize';
2
+ import { SingleAssociationAccessors, Transactionable } from 'sequelize';
3
3
  import { Model } from '../model';
4
- import { Appends, Except, Fields, Filter, TargetKey, TransactionAble, UpdateOptions } from '../repository';
4
+ import { Appends, Except, Fields, Filter, TargetKey, UpdateOptions } from '../repository';
5
5
  import { updateModelByValues } from '../update-associations';
6
6
  import { RelationRepository, transaction } from './relation-repository';
7
7
 
8
- export interface SingleRelationFindOption extends TransactionAble {
8
+ export interface SingleRelationFindOption extends Transactionable {
9
9
  fields?: Fields;
10
10
  except?: Except;
11
11
  appends?: Appends;
12
12
  filter?: Filter;
13
13
  }
14
14
 
15
- interface SetOption extends TransactionAble {
15
+ interface SetOption extends Transactionable {
16
16
  tk?: TargetKey;
17
17
  }
18
18
 
19
19
  export abstract class SingleRelationRepository extends RelationRepository {
20
20
  @transaction()
21
- async remove(options?: TransactionAble): Promise<void> {
21
+ async remove(options?: Transactionable): Promise<void> {
22
22
  const transaction = await this.getTransaction(options);
23
23
  const sourceModel = await this.getSourceModel(transaction);
24
24
  return await sourceModel[this.accessors().set](null, {
@@ -59,11 +59,11 @@ export abstract class SingleRelationRepository extends RelationRepository {
59
59
  }
60
60
 
61
61
  async findOne(options?: SingleRelationFindOption): Promise<Model<any>> {
62
- return this.find(options);
62
+ return this.find({ ...options, filterByTk: null } as any);
63
63
  }
64
64
 
65
65
  @transaction()
66
- async destroy(options?: TransactionAble): Promise<Boolean> {
66
+ async destroy(options?: Transactionable): Promise<Boolean> {
67
67
  const transaction = await this.getTransaction(options);
68
68
 
69
69
  const target = await this.find({
@@ -85,6 +85,10 @@ export abstract class SingleRelationRepository extends RelationRepository {
85
85
  transaction,
86
86
  });
87
87
 
88
+ if (!target) {
89
+ throw new Error('The record does not exist');
90
+ }
91
+
88
92
  await updateModelByValues(target, options?.values, {
89
93
  ...lodash.omit(options, 'values'),
90
94
  transaction,
package/src/repository.ts CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  FindOptions as SequelizeFindOptions,
9
9
  ModelCtor,
10
10
  Op,
11
- Transaction,
11
+ Transactionable,
12
12
  UpdateOptions as SequelizeUpdateOptions
13
13
  } from 'sequelize';
14
14
  import { Collection } from './collection';
@@ -34,9 +34,7 @@ interface CreateManyOptions extends BulkCreateOptions {
34
34
  records: Values[];
35
35
  }
36
36
 
37
- export interface TransactionAble {
38
- transaction?: Transaction;
39
- }
37
+ export { Transactionable } from 'sequelize';
40
38
 
41
39
  export interface FilterAble {
42
40
  filter: Filter;
@@ -57,7 +55,7 @@ export type AssociationKeysToBeUpdate = string[];
57
55
 
58
56
  export type Values = any;
59
57
 
60
- export interface CountOptions extends Omit<SequelizeCreateOptions, 'distinct' | 'where' | 'include'>, TransactionAble {
58
+ export interface CountOptions extends Omit<SequelizeCreateOptions, 'distinct' | 'where' | 'include'>, Transactionable {
61
59
  fields?: Fields;
62
60
  filter?: Filter;
63
61
  }
@@ -68,7 +66,7 @@ export interface FilterByTk {
68
66
 
69
67
  export interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {}
70
68
 
71
- export interface CommonFindOptions {
69
+ export interface CommonFindOptions extends Transactionable {
72
70
  filter?: Filter;
73
71
  fields?: Fields;
74
72
  appends?: Appends;
@@ -309,8 +307,14 @@ export class Repository<TModelAttributes extends {} = any, TCreationAttributes e
309
307
  });
310
308
 
311
309
  if (options.hooks !== false) {
312
- await this.database.emitAsync(`${this.collection.name}.afterCreateWithAssociations`, instance, options);
313
- await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);
310
+ await this.database.emitAsync(`${this.collection.name}.afterCreateWithAssociations`, instance, {
311
+ ...options,
312
+ transaction,
313
+ });
314
+ await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, {
315
+ ...options,
316
+ transaction,
317
+ });
314
318
  }
315
319
 
316
320
  return instance;
@@ -364,8 +368,14 @@ export class Repository<TModelAttributes extends {} = any, TCreationAttributes e
364
368
 
365
369
  if (options.hooks !== false) {
366
370
  for (const instance of instances) {
367
- await this.database.emitAsync(`${this.collection.name}.afterUpdateWithAssociations`, instance, options);
368
- await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);
371
+ await this.database.emitAsync(`${this.collection.name}.afterUpdateWithAssociations`, instance, {
372
+ ...options,
373
+ transaction,
374
+ });
375
+ await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, {
376
+ ...options,
377
+ transaction,
378
+ });
369
379
  }
370
380
  }
371
381
 
@@ -9,7 +9,6 @@ import {
9
9
  Transactionable,
10
10
  } from 'sequelize';
11
11
  import { Model } from './model';
12
- import { TransactionAble } from './repository';
13
12
  import { UpdateGuard } from './update-guard';
14
13
 
15
14
  function isUndefinedOrNull(value: any) {
@@ -46,7 +45,7 @@ export function modelAssociationByKey(instance: Model, key: string): Association
46
45
 
47
46
  type UpdateValue = { [key: string]: any };
48
47
 
49
- interface UpdateOptions extends TransactionAble {
48
+ interface UpdateOptions extends Transactionable {
50
49
  filter?: any;
51
50
  filterByTk?: number | string;
52
51
  // 字段白名单
@@ -298,7 +297,7 @@ export async function updateSingleAssociation(
298
297
  // @ts-ignore
299
298
  dataKey = association.targetKey;
300
299
  } else {
301
- M = association.source as ModelCtor<Model>;
300
+ M = association.target as ModelCtor<Model>;
302
301
  dataKey = M.primaryKeyAttribute;
303
302
  }
304
303
 
@@ -1,7 +0,0 @@
1
- export declare type ImportFileExtension = 'js' | 'ts' | 'json';
2
- export declare class ImporterReader {
3
- directory: string;
4
- extensions: Set<string>;
5
- constructor(directory: string, extensions?: ImportFileExtension[]);
6
- read(): Promise<any[]>;
7
- }
@@ -1,49 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import * as fs from 'fs';
11
- import lodash from 'lodash';
12
- import path from 'path';
13
- function requireModule(module) {
14
- return __awaiter(this, void 0, void 0, function* () {
15
- if (typeof module === 'string') {
16
- module = require(module);
17
- }
18
- if (typeof module !== 'object') {
19
- return module;
20
- }
21
- return module.__esModule ? module.default : module;
22
- });
23
- }
24
- export class ImporterReader {
25
- constructor(directory, extensions) {
26
- this.directory = directory;
27
- if (!extensions) {
28
- extensions = ['js', 'ts', 'json'];
29
- }
30
- this.extensions = new Set(extensions);
31
- }
32
- read() {
33
- return __awaiter(this, void 0, void 0, function* () {
34
- const modules = (yield fs.promises.readdir(this.directory, {
35
- encoding: 'utf-8',
36
- }))
37
- .filter((fileName) => {
38
- if (fileName.endsWith('.d.ts')) {
39
- return false;
40
- }
41
- const ext = path.parse(fileName).ext.replace('.', '');
42
- return this.extensions.has(ext);
43
- })
44
- .map((fileName) => __awaiter(this, void 0, void 0, function* () { return yield requireModule(path.join(this.directory, fileName)); }));
45
- return (yield Promise.all(modules)).filter((module) => lodash.isPlainObject(module));
46
- });
47
- }
48
- }
49
- //# sourceMappingURL=collection-importer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collection-importer.js","sourceRoot":"","sources":["../src/collection-importer.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,SAAe,aAAa,CAAC,MAAW;;QACtC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YAC9B,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;SAC1B;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YAC9B,OAAO,MAAM,CAAC;SACf;QACD,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACrD,CAAC;CAAA;AAED,MAAM,OAAO,cAAc;IAIzB,YAAY,SAAiB,EAAE,UAAkC;QAC/D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,UAAU,EAAE;YACf,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;SACnC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAEK,IAAI;;YACR,MAAM,OAAO,GAAG,CACd,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;gBACxC,QAAQ,EAAE,OAAO;aAClB,CAAC,CACH;iBACE,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACnB,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;oBAC9B,OAAO,KAAK,CAAC;iBACd;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC;iBACD,GAAG,CAAC,CAAO,QAAQ,EAAE,EAAE,gDAAC,OAAA,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA,GAAA,CAAC,CAAC;YAErF,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACvF,CAAC;KAAA;CACF","sourcesContent":["import * as fs from 'fs';\nimport lodash from 'lodash';\nimport path from 'path';\n\nexport type ImportFileExtension = 'js' | 'ts' | 'json';\n\nasync function requireModule(module: any) {\n if (typeof module === 'string') {\n module = require(module);\n }\n\n if (typeof module !== 'object') {\n return module;\n }\n return module.__esModule ? module.default : module;\n}\n\nexport class ImporterReader {\n directory: string;\n extensions: Set<string>;\n\n constructor(directory: string, extensions?: ImportFileExtension[]) {\n this.directory = directory;\n\n if (!extensions) {\n extensions = ['js', 'ts', 'json'];\n }\n\n this.extensions = new Set(extensions);\n }\n\n async read() {\n const modules = (\n await fs.promises.readdir(this.directory, {\n encoding: 'utf-8',\n })\n )\n .filter((fileName) => {\n if (fileName.endsWith('.d.ts')) {\n return false;\n }\n const ext = path.parse(fileName).ext.replace('.', '');\n return this.extensions.has(ext);\n })\n .map(async (fileName) => await requireModule(path.join(this.directory, fileName)));\n\n return (await Promise.all(modules)).filter((module) => lodash.isPlainObject(module));\n }\n}\n"]}
@@ -1,73 +0,0 @@
1
- /// <reference types="node" />
2
- import { EventEmitter } from 'events';
3
- import { ModelCtor, ModelOptions, SyncOptions } from 'sequelize';
4
- import { Database } from './database';
5
- import { Field, FieldOptions } from './fields';
6
- import { Model } from './model';
7
- import { Repository } from './repository';
8
- export declare type RepositoryType = typeof Repository;
9
- export declare type CollectionSortable = string | boolean | {
10
- name?: string;
11
- scopeKey?: string;
12
- };
13
- export interface CollectionOptions extends Omit<ModelOptions, 'name' | 'hooks'> {
14
- name: string;
15
- tableName?: string;
16
- filterTargetKey?: string;
17
- fields?: FieldOptions[];
18
- model?: string | ModelCtor<Model>;
19
- repository?: string | RepositoryType;
20
- sortable?: CollectionSortable;
21
- /**
22
- * @default true
23
- */
24
- autoGenId?: boolean;
25
- /**
26
- * @default 'options'
27
- */
28
- magicAttribute?: string;
29
- [key: string]: any;
30
- }
31
- export interface CollectionContext {
32
- database: Database;
33
- }
34
- export declare class Collection<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes> extends EventEmitter {
35
- options: CollectionOptions;
36
- context: CollectionContext;
37
- isThrough?: boolean;
38
- fields: Map<string, any>;
39
- model: ModelCtor<Model>;
40
- repository: Repository<TModelAttributes, TCreationAttributes>;
41
- get filterTargetKey(): string;
42
- get name(): string;
43
- constructor(options: CollectionOptions, context?: CollectionContext);
44
- private sequelizeModelOptions;
45
- /**
46
- * TODO
47
- */
48
- modelInit(): void;
49
- setRepository(repository?: RepositoryType | string): void;
50
- private bindFieldEventListener;
51
- forEachField(callback: (field: Field) => void): void;
52
- findField(callback: (field: Field) => boolean): any;
53
- hasField(name: string): boolean;
54
- getField<F extends Field>(name: string): F;
55
- addField(name: string, options: FieldOptions): Field;
56
- setField(name: string, options: FieldOptions): Field;
57
- setFields(fields: FieldOptions[], resetFields?: boolean): void;
58
- resetFields(): void;
59
- removeField(name: any): boolean;
60
- /**
61
- * TODO
62
- */
63
- updateOptions(options: CollectionOptions, mergeOptions?: any): this;
64
- setSortable(sortable: any): void;
65
- /**
66
- * TODO
67
- *
68
- * @param name
69
- * @param options
70
- */
71
- updateField(name: string, options: FieldOptions): void;
72
- sync(syncOptions?: SyncOptions): Promise<void>;
73
- }
package/esm/collection.js DELETED
@@ -1,224 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __rest = (this && this.__rest) || function (s, e) {
11
- var t = {};
12
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
13
- t[p] = s[p];
14
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
15
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
16
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17
- t[p[i]] = s[p[i]];
18
- }
19
- return t;
20
- };
21
- import merge from 'deepmerge';
22
- import { EventEmitter } from 'events';
23
- import { default as lodash, default as _ } from 'lodash';
24
- import { Model } from './model';
25
- import { Repository } from './repository';
26
- export class Collection extends EventEmitter {
27
- constructor(options, context) {
28
- super();
29
- this.fields = new Map();
30
- this.context = context;
31
- this.options = options;
32
- this.bindFieldEventListener();
33
- this.modelInit();
34
- this.setFields(options.fields);
35
- this.setRepository(options.repository);
36
- this.setSortable(options.sortable);
37
- }
38
- get filterTargetKey() {
39
- return lodash.get(this.options, 'filterTargetKey', this.model.primaryKeyAttribute);
40
- }
41
- get name() {
42
- return this.options.name;
43
- }
44
- sequelizeModelOptions() {
45
- const { name, tableName } = this.options;
46
- return Object.assign(Object.assign({}, _.omit(this.options, ['name', 'fields', 'model', 'targetKey'])), { modelName: name, sequelize: this.context.database.sequelize, tableName: tableName || name });
47
- }
48
- /**
49
- * TODO
50
- */
51
- modelInit() {
52
- if (this.model) {
53
- return;
54
- }
55
- const { name, model, autoGenId = true } = this.options;
56
- let M = Model;
57
- if (this.context.database.sequelize.isDefined(name)) {
58
- const m = this.context.database.sequelize.model(name);
59
- if (m.isThrough) {
60
- // @ts-ignore
61
- this.model = m;
62
- // @ts-ignore
63
- this.model.database = this.context.database;
64
- // @ts-ignore
65
- this.model.collection = this;
66
- return;
67
- }
68
- }
69
- if (typeof model === 'string') {
70
- M = this.context.database.models.get(model) || Model;
71
- }
72
- else if (model) {
73
- M = model;
74
- }
75
- // @ts-ignore
76
- this.model = class extends M {
77
- };
78
- this.model.init(null, this.sequelizeModelOptions());
79
- if (!autoGenId) {
80
- this.model.removeAttribute('id');
81
- }
82
- // @ts-ignore
83
- this.model.database = this.context.database;
84
- // @ts-ignore
85
- this.model.collection = this;
86
- }
87
- setRepository(repository) {
88
- let repo = Repository;
89
- if (typeof repository === 'string') {
90
- repo = this.context.database.repositories.get(repository) || Repository;
91
- }
92
- this.repository = new repo(this);
93
- }
94
- bindFieldEventListener() {
95
- this.on('field.afterAdd', (field) => {
96
- field.bind();
97
- });
98
- this.on('field.afterRemove', (field) => field.unbind());
99
- }
100
- forEachField(callback) {
101
- return [...this.fields.values()].forEach(callback);
102
- }
103
- findField(callback) {
104
- return [...this.fields.values()].find(callback);
105
- }
106
- hasField(name) {
107
- return this.fields.has(name);
108
- }
109
- getField(name) {
110
- return this.fields.get(name);
111
- }
112
- addField(name, options) {
113
- return this.setField(name, options);
114
- }
115
- setField(name, options) {
116
- const { database } = this.context;
117
- const field = database.buildField(Object.assign({ name }, options), Object.assign(Object.assign({}, this.context), { collection: this }));
118
- this.removeField(name);
119
- this.fields.set(name, field);
120
- this.emit('field.afterAdd', field);
121
- return field;
122
- }
123
- setFields(fields, resetFields = true) {
124
- if (!Array.isArray(fields)) {
125
- return;
126
- }
127
- if (resetFields) {
128
- this.resetFields();
129
- }
130
- for (let _a of fields) {
131
- const { name } = _a, options = __rest(_a, ["name"]);
132
- this.addField(name, options);
133
- }
134
- }
135
- resetFields() {
136
- const fieldNames = this.fields.keys();
137
- for (const fieldName of fieldNames) {
138
- this.removeField(fieldName);
139
- }
140
- }
141
- removeField(name) {
142
- if (!this.fields.has(name)) {
143
- return;
144
- }
145
- const field = this.fields.get(name);
146
- const bool = this.fields.delete(name);
147
- if (bool) {
148
- this.emit('field.afterRemove', field);
149
- }
150
- return bool;
151
- }
152
- /**
153
- * TODO
154
- */
155
- updateOptions(options, mergeOptions) {
156
- let newOptions = lodash.cloneDeep(options);
157
- newOptions = merge(this.options, newOptions, mergeOptions);
158
- this.context.database.emit('beforeUpdateCollection', this, newOptions);
159
- this.setFields(options.fields, false);
160
- this.setRepository(options.repository);
161
- this.context.database.emit('afterUpdateCollection', this);
162
- return this;
163
- }
164
- setSortable(sortable) {
165
- if (!sortable) {
166
- return;
167
- }
168
- if (sortable === true) {
169
- this.setField('sort', {
170
- type: 'sort',
171
- hidden: true,
172
- });
173
- }
174
- if (typeof sortable === 'string') {
175
- this.setField(sortable, {
176
- type: 'sort',
177
- hidden: true,
178
- });
179
- }
180
- else if (typeof sortable === 'object') {
181
- const { name } = sortable, opts = __rest(sortable, ["name"]);
182
- this.setField(name || 'sort', Object.assign({ type: 'sort', hidden: true }, opts));
183
- }
184
- }
185
- /**
186
- * TODO
187
- *
188
- * @param name
189
- * @param options
190
- */
191
- updateField(name, options) {
192
- if (!this.hasField(name)) {
193
- throw new Error(`field ${name} not exists`);
194
- }
195
- if (options.name && options.name !== name) {
196
- this.removeField(name);
197
- }
198
- this.setField(options.name || name, options);
199
- }
200
- sync(syncOptions) {
201
- return __awaiter(this, void 0, void 0, function* () {
202
- const modelNames = [this.model.name];
203
- const associations = this.model.associations;
204
- for (const associationKey in associations) {
205
- const association = associations[associationKey];
206
- modelNames.push(association.target.name);
207
- if (association.through) {
208
- modelNames.push(association.through.model.name);
209
- }
210
- }
211
- const models = [];
212
- // @ts-ignore
213
- this.context.database.sequelize.modelManager.forEachModel((model) => {
214
- if (modelNames.includes(model.name)) {
215
- models.push(model);
216
- }
217
- });
218
- for (const model of models) {
219
- yield model.sync(syncOptions);
220
- }
221
- });
222
- }
223
- }
224
- //# sourceMappingURL=collection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collection.js","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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","sourcesContent":["import merge from 'deepmerge';\nimport { EventEmitter } from 'events';\nimport { default as lodash, default as _ } from 'lodash';\nimport { col, ModelCtor, ModelOptions, SyncOptions } from 'sequelize';\nimport { Database } from './database';\nimport { Field, FieldOptions } from './fields';\nimport { Model } from './model';\nimport { Repository } from './repository';\n\nexport type RepositoryType = typeof Repository;\n\nexport type CollectionSortable = string | boolean | { name?: string; scopeKey?: string };\n\nexport interface CollectionOptions extends Omit<ModelOptions, 'name' | 'hooks'> {\n name: string;\n tableName?: string;\n filterTargetKey?: string;\n fields?: FieldOptions[];\n model?: string | ModelCtor<Model>;\n repository?: string | RepositoryType;\n sortable?: CollectionSortable;\n /**\n * @default true\n */\n autoGenId?: boolean;\n /**\n * @default 'options'\n */\n magicAttribute?: string;\n [key: string]: any;\n}\n\nexport interface CollectionContext {\n database: Database;\n}\n\nexport class Collection<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes,\n> extends EventEmitter {\n options: CollectionOptions;\n context: CollectionContext;\n isThrough?: boolean;\n fields: Map<string, any> = new Map<string, any>();\n model: ModelCtor<Model>;\n repository: Repository<TModelAttributes, TCreationAttributes>;\n\n get filterTargetKey() {\n return lodash.get(this.options, 'filterTargetKey', this.model.primaryKeyAttribute);\n }\n\n get name() {\n return this.options.name;\n }\n\n constructor(options: CollectionOptions, context?: CollectionContext) {\n super();\n this.context = context;\n this.options = options;\n this.bindFieldEventListener();\n this.modelInit();\n this.setFields(options.fields);\n this.setRepository(options.repository);\n this.setSortable(options.sortable);\n }\n\n private sequelizeModelOptions() {\n const { name, tableName } = this.options;\n return {\n ..._.omit(this.options, ['name', 'fields', 'model', 'targetKey']),\n modelName: name,\n sequelize: this.context.database.sequelize,\n tableName: tableName || name,\n };\n }\n\n /**\n * TODO\n */\n modelInit() {\n if (this.model) {\n return;\n }\n const { name, model, autoGenId = true } = this.options;\n let M: ModelCtor<Model> = Model;\n if (this.context.database.sequelize.isDefined(name)) {\n const m = this.context.database.sequelize.model(name);\n if ((m as any).isThrough) {\n // @ts-ignore\n this.model = m;\n // @ts-ignore\n this.model.database = this.context.database;\n // @ts-ignore\n this.model.collection = this;\n return;\n }\n }\n if (typeof model === 'string') {\n M = this.context.database.models.get(model) || Model;\n } else if (model) {\n M = model;\n }\n // @ts-ignore\n this.model = class extends M {};\n this.model.init(null, this.sequelizeModelOptions());\n\n if (!autoGenId) {\n this.model.removeAttribute('id');\n }\n\n // @ts-ignore\n this.model.database = this.context.database;\n // @ts-ignore\n this.model.collection = this;\n }\n\n setRepository(repository?: RepositoryType | string) {\n let repo = Repository;\n if (typeof repository === 'string') {\n repo = this.context.database.repositories.get(repository) || Repository;\n }\n this.repository = new repo(this);\n }\n\n private bindFieldEventListener() {\n this.on('field.afterAdd', (field: Field) => {\n field.bind();\n });\n this.on('field.afterRemove', (field) => field.unbind());\n }\n\n forEachField(callback: (field: Field) => void) {\n return [...this.fields.values()].forEach(callback);\n }\n\n findField(callback: (field: Field) => boolean) {\n return [...this.fields.values()].find(callback);\n }\n\n hasField(name: string) {\n return this.fields.has(name);\n }\n\n getField<F extends Field>(name: string): F {\n return this.fields.get(name);\n }\n\n addField(name: string, options: FieldOptions): Field {\n return this.setField(name, options);\n }\n\n setField(name: string, options: FieldOptions): Field {\n const { database } = this.context;\n\n const field = database.buildField(\n { name, ...options },\n {\n ...this.context,\n collection: this,\n },\n );\n this.removeField(name);\n this.fields.set(name, field);\n this.emit('field.afterAdd', field);\n return field;\n }\n\n setFields(fields: FieldOptions[], resetFields = true) {\n if (!Array.isArray(fields)) {\n return;\n }\n\n if (resetFields) {\n this.resetFields();\n }\n\n for (const { name, ...options } of fields) {\n this.addField(name, options);\n }\n }\n\n resetFields() {\n const fieldNames = this.fields.keys();\n for (const fieldName of fieldNames) {\n this.removeField(fieldName);\n }\n }\n\n removeField(name) {\n if (!this.fields.has(name)) {\n return;\n }\n const field = this.fields.get(name);\n const bool = this.fields.delete(name);\n if (bool) {\n this.emit('field.afterRemove', field);\n }\n return bool;\n }\n\n /**\n * TODO\n */\n updateOptions(options: CollectionOptions, mergeOptions?: any) {\n let newOptions = lodash.cloneDeep(options);\n newOptions = merge(this.options, newOptions, mergeOptions);\n\n this.context.database.emit('beforeUpdateCollection', this, newOptions);\n\n this.setFields(options.fields, false);\n this.setRepository(options.repository);\n\n this.context.database.emit('afterUpdateCollection', this);\n\n return this;\n }\n\n setSortable(sortable) {\n if (!sortable) {\n return;\n }\n if (sortable === true) {\n this.setField('sort', {\n type: 'sort',\n hidden: true,\n });\n }\n if (typeof sortable === 'string') {\n this.setField(sortable, {\n type: 'sort',\n hidden: true,\n });\n } else if (typeof sortable === 'object') {\n const { name, ...opts } = sortable;\n this.setField(name || 'sort', { type: 'sort', hidden: true, ...opts });\n }\n }\n\n /**\n * TODO\n *\n * @param name\n * @param options\n */\n updateField(name: string, options: FieldOptions) {\n if (!this.hasField(name)) {\n throw new Error(`field ${name} not exists`);\n }\n\n if (options.name && options.name !== name) {\n this.removeField(name);\n }\n\n this.setField(options.name || name, options);\n }\n\n async sync(syncOptions?: SyncOptions) {\n const modelNames = [this.model.name];\n\n const associations = this.model.associations;\n\n for (const associationKey in associations) {\n const association = associations[associationKey];\n modelNames.push(association.target.name);\n if ((<any>association).through) {\n modelNames.push((<any>association).through.model.name);\n }\n }\n\n const models: ModelCtor<Model>[] = [];\n // @ts-ignore\n this.context.database.sequelize.modelManager.forEachModel((model) => {\n if (modelNames.includes(model.name)) {\n models.push(model);\n }\n });\n\n for (const model of models) {\n await model.sync(syncOptions);\n }\n }\n}\n"]}
package/esm/database.d.ts DELETED
@@ -1,101 +0,0 @@
1
- /// <reference types="node" />
2
- import { AsyncEmitter } from '@nocobase/utils';
3
- import merge from 'deepmerge';
4
- import { EventEmitter } from 'events';
5
- import { ModelCtor, Options, QueryInterfaceDropAllTablesOptions, Sequelize, SyncOptions } from 'sequelize';
6
- import { Collection, CollectionOptions, RepositoryType } from './collection';
7
- import { ImportFileExtension } from './collection-importer';
8
- import * as FieldTypes from './fields';
9
- import { Field, FieldContext, RelationField } from './fields';
10
- import { Model } from './model';
11
- import { ModelHook } from './model-hook';
12
- import { RelationRepository } from './relation-repository/relation-repository';
13
- import { Repository } from './repository';
14
- export interface MergeOptions extends merge.Options {
15
- }
16
- export interface PendingOptions {
17
- field: RelationField;
18
- model: ModelCtor<Model>;
19
- }
20
- interface MapOf<T> {
21
- [key: string]: T;
22
- }
23
- export interface IDatabaseOptions extends Options {
24
- tablePrefix?: string;
25
- }
26
- export declare type DatabaseOptions = IDatabaseOptions | Sequelize;
27
- interface RegisterOperatorsContext {
28
- db?: Database;
29
- path?: string;
30
- field?: Field;
31
- app?: any;
32
- }
33
- export interface CleanOptions extends QueryInterfaceDropAllTablesOptions {
34
- drop?: boolean;
35
- }
36
- declare type OperatorFunc = (value: any, ctx?: RegisterOperatorsContext) => any;
37
- export declare class Database extends EventEmitter implements AsyncEmitter {
38
- sequelize: Sequelize;
39
- fieldTypes: Map<any, any>;
40
- options: IDatabaseOptions;
41
- models: Map<string, ModelCtor<Model<any, any>>>;
42
- repositories: Map<string, typeof Repository>;
43
- operators: Map<any, any>;
44
- collections: Map<string, Collection<any, any>>;
45
- pendingFields: Map<string, FieldTypes.RelationField[]>;
46
- modelCollection: Map<ModelCtor<any>, Collection<any, any>>;
47
- modelHook: ModelHook;
48
- delayCollectionExtend: Map<string, {
49
- collectionOptions: CollectionOptions;
50
- mergeOptions?: any;
51
- }[]>;
52
- constructor(options: DatabaseOptions);
53
- /**
54
- * Add collection to database
55
- * @param options
56
- */
57
- collection<Attributes = any, CreateAttributes = Attributes>(options: CollectionOptions): Collection<Attributes, CreateAttributes>;
58
- getTablePrefix(): string;
59
- /**
60
- * get exists collection by its name
61
- * @param name
62
- */
63
- getCollection(name: string): Collection;
64
- hasCollection(name: string): boolean;
65
- removeCollection(name: string): void;
66
- getModel<M extends Model>(name: string): ModelCtor<M>;
67
- getRepository<R extends Repository>(name: string): R;
68
- getRepository<R extends RelationRepository>(name: string, relationId: string | number): R;
69
- addPendingField(field: RelationField): void;
70
- removePendingField(field: RelationField): void;
71
- registerFieldTypes(fieldTypes: MapOf<typeof Field>): void;
72
- registerModels(models: MapOf<ModelCtor<any>>): void;
73
- registerRepositories(repositories: MapOf<RepositoryType>): void;
74
- initOperators(): void;
75
- registerOperators(operators: MapOf<OperatorFunc>): void;
76
- buildField(options: any, context: FieldContext): any;
77
- sync(options?: SyncOptions): Promise<Sequelize>;
78
- clean(options: CleanOptions): Promise<void>;
79
- isSqliteMemory(): boolean;
80
- reconnect(): Promise<void>;
81
- closed(): any;
82
- close(): Promise<void>;
83
- on(event: string | symbol, listener: (...args: any[]) => void): this;
84
- import(options: {
85
- directory: string;
86
- extensions?: ImportFileExtension[];
87
- }): Promise<Map<string, Collection>>;
88
- emitAsync: (event: string | symbol, ...args: any[]) => Promise<boolean>;
89
- }
90
- export declare function extend(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions): {
91
- collectionOptions: CollectionOptions;
92
- mergeOptions: MergeOptions;
93
- extend: boolean;
94
- };
95
- export declare const defineCollection: (collectionOptions: CollectionOptions) => CollectionOptions;
96
- export declare const extendCollection: (collectionOptions: CollectionOptions, mergeOptions?: MergeOptions) => {
97
- collectionOptions: CollectionOptions;
98
- mergeOptions: MergeOptions;
99
- extend: boolean;
100
- };
101
- export default Database;