@strapi/database 5.12.0 → 5.12.2

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 (321) hide show
  1. package/dist/connection.js +43 -0
  2. package/dist/connection.js.map +1 -0
  3. package/dist/connection.mjs +41 -0
  4. package/dist/connection.mjs.map +1 -0
  5. package/dist/dialects/dialect.js +54 -0
  6. package/dist/dialects/dialect.js.map +1 -0
  7. package/dist/dialects/dialect.mjs +52 -0
  8. package/dist/dialects/dialect.mjs.map +1 -0
  9. package/dist/dialects/index.js +44 -0
  10. package/dist/dialects/index.js.map +1 -0
  11. package/dist/dialects/index.mjs +42 -0
  12. package/dist/dialects/index.mjs.map +1 -0
  13. package/dist/dialects/mysql/constants.js +8 -0
  14. package/dist/dialects/mysql/constants.js.map +1 -0
  15. package/dist/dialects/mysql/constants.mjs +5 -0
  16. package/dist/dialects/mysql/constants.mjs.map +1 -0
  17. package/dist/dialects/mysql/database-inspector.js +35 -0
  18. package/dist/dialects/mysql/database-inspector.js.map +1 -0
  19. package/dist/dialects/mysql/database-inspector.mjs +33 -0
  20. package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
  21. package/dist/dialects/mysql/index.js +75 -0
  22. package/dist/dialects/mysql/index.js.map +1 -0
  23. package/dist/dialects/mysql/index.mjs +73 -0
  24. package/dist/dialects/mysql/index.mjs.map +1 -0
  25. package/dist/dialects/mysql/schema-inspector.js +297 -0
  26. package/dist/dialects/mysql/schema-inspector.js.map +1 -0
  27. package/dist/dialects/mysql/schema-inspector.mjs +295 -0
  28. package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
  29. package/dist/dialects/postgresql/index.js +62 -0
  30. package/dist/dialects/postgresql/index.js.map +1 -0
  31. package/dist/dialects/postgresql/index.mjs +60 -0
  32. package/dist/dialects/postgresql/index.mjs.map +1 -0
  33. package/dist/dialects/postgresql/schema-inspector.js +316 -0
  34. package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
  35. package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
  36. package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
  37. package/dist/dialects/sqlite/index.js +82 -0
  38. package/dist/dialects/sqlite/index.js.map +1 -0
  39. package/dist/dialects/sqlite/index.mjs +80 -0
  40. package/dist/dialects/sqlite/index.mjs.map +1 -0
  41. package/dist/dialects/sqlite/schema-inspector.js +211 -0
  42. package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
  43. package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
  44. package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
  45. package/dist/entity-manager/entity-repository.js +139 -0
  46. package/dist/entity-manager/entity-repository.js.map +1 -0
  47. package/dist/entity-manager/entity-repository.mjs +137 -0
  48. package/dist/entity-manager/entity-repository.mjs.map +1 -0
  49. package/dist/entity-manager/index.js +1186 -0
  50. package/dist/entity-manager/index.js.map +1 -0
  51. package/dist/entity-manager/index.mjs +1184 -0
  52. package/dist/entity-manager/index.mjs.map +1 -0
  53. package/dist/entity-manager/morph-relations.js +73 -0
  54. package/dist/entity-manager/morph-relations.js.map +1 -0
  55. package/dist/entity-manager/morph-relations.mjs +69 -0
  56. package/dist/entity-manager/morph-relations.mjs.map +1 -0
  57. package/dist/entity-manager/regular-relations.js +247 -0
  58. package/dist/entity-manager/regular-relations.js.map +1 -0
  59. package/dist/entity-manager/regular-relations.mjs +242 -0
  60. package/dist/entity-manager/regular-relations.mjs.map +1 -0
  61. package/dist/entity-manager/relations-orderer.js +221 -0
  62. package/dist/entity-manager/relations-orderer.js.map +1 -0
  63. package/dist/entity-manager/relations-orderer.mjs +218 -0
  64. package/dist/entity-manager/relations-orderer.mjs.map +1 -0
  65. package/dist/errors/database.js +13 -0
  66. package/dist/errors/database.js.map +1 -0
  67. package/dist/errors/database.mjs +11 -0
  68. package/dist/errors/database.mjs.map +1 -0
  69. package/dist/errors/index.js +18 -0
  70. package/dist/errors/index.js.map +1 -0
  71. package/dist/errors/index.mjs +7 -0
  72. package/dist/errors/index.mjs.map +1 -0
  73. package/dist/errors/invalid-date.js +13 -0
  74. package/dist/errors/invalid-date.js.map +1 -0
  75. package/dist/errors/invalid-date.mjs +11 -0
  76. package/dist/errors/invalid-date.mjs.map +1 -0
  77. package/dist/errors/invalid-datetime.js +13 -0
  78. package/dist/errors/invalid-datetime.js.map +1 -0
  79. package/dist/errors/invalid-datetime.mjs +11 -0
  80. package/dist/errors/invalid-datetime.mjs.map +1 -0
  81. package/dist/errors/invalid-relation.js +13 -0
  82. package/dist/errors/invalid-relation.js.map +1 -0
  83. package/dist/errors/invalid-relation.mjs +11 -0
  84. package/dist/errors/invalid-relation.mjs.map +1 -0
  85. package/dist/errors/invalid-time.js +13 -0
  86. package/dist/errors/invalid-time.js.map +1 -0
  87. package/dist/errors/invalid-time.mjs +11 -0
  88. package/dist/errors/invalid-time.mjs.map +1 -0
  89. package/dist/errors/not-null.js +17 -0
  90. package/dist/errors/not-null.js.map +1 -0
  91. package/dist/errors/not-null.mjs +15 -0
  92. package/dist/errors/not-null.mjs.map +1 -0
  93. package/dist/fields/biginteger.js +9 -0
  94. package/dist/fields/biginteger.js.map +1 -0
  95. package/dist/fields/biginteger.mjs +7 -0
  96. package/dist/fields/biginteger.mjs.map +1 -0
  97. package/dist/fields/boolean.js +48 -0
  98. package/dist/fields/boolean.js.map +1 -0
  99. package/dist/fields/boolean.mjs +46 -0
  100. package/dist/fields/boolean.mjs.map +1 -0
  101. package/dist/fields/date.js +16 -0
  102. package/dist/fields/date.js.map +1 -0
  103. package/dist/fields/date.mjs +14 -0
  104. package/dist/fields/date.mjs.map +1 -0
  105. package/dist/fields/datetime.js +37 -0
  106. package/dist/fields/datetime.js.map +1 -0
  107. package/dist/fields/datetime.mjs +16 -0
  108. package/dist/fields/datetime.mjs.map +1 -0
  109. package/dist/fields/field.js +16 -0
  110. package/dist/fields/field.js.map +1 -0
  111. package/dist/fields/field.mjs +14 -0
  112. package/dist/fields/field.mjs.map +1 -0
  113. package/dist/fields/index.js +45 -0
  114. package/dist/fields/index.js.map +1 -0
  115. package/dist/fields/index.mjs +43 -0
  116. package/dist/fields/index.mjs.map +1 -0
  117. package/dist/fields/json.js +36 -0
  118. package/dist/fields/json.js.map +1 -0
  119. package/dist/fields/json.mjs +34 -0
  120. package/dist/fields/json.mjs.map +1 -0
  121. package/dist/fields/number.js +20 -0
  122. package/dist/fields/number.js.map +1 -0
  123. package/dist/fields/number.mjs +18 -0
  124. package/dist/fields/number.mjs.map +1 -0
  125. package/dist/fields/shared/parsers.js +91 -0
  126. package/dist/fields/shared/parsers.js.map +1 -0
  127. package/dist/fields/shared/parsers.mjs +68 -0
  128. package/dist/fields/shared/parsers.mjs.map +1 -0
  129. package/dist/fields/string.js +16 -0
  130. package/dist/fields/string.js.map +1 -0
  131. package/dist/fields/string.mjs +14 -0
  132. package/dist/fields/string.mjs.map +1 -0
  133. package/dist/fields/time.js +17 -0
  134. package/dist/fields/time.js.map +1 -0
  135. package/dist/fields/time.mjs +15 -0
  136. package/dist/fields/time.mjs.map +1 -0
  137. package/dist/fields/timestamp.js +37 -0
  138. package/dist/fields/timestamp.js.map +1 -0
  139. package/dist/fields/timestamp.mjs +16 -0
  140. package/dist/fields/timestamp.mjs.map +1 -0
  141. package/dist/index.js +33 -8569
  142. package/dist/index.js.map +1 -1
  143. package/dist/index.mjs +16 -8532
  144. package/dist/index.mjs.map +1 -1
  145. package/dist/lifecycles/index.js +73 -0
  146. package/dist/lifecycles/index.js.map +1 -0
  147. package/dist/lifecycles/index.mjs +71 -0
  148. package/dist/lifecycles/index.mjs.map +1 -0
  149. package/dist/lifecycles/subscribers/index.js +10 -0
  150. package/dist/lifecycles/subscribers/index.js.map +1 -0
  151. package/dist/lifecycles/subscribers/index.mjs +8 -0
  152. package/dist/lifecycles/subscribers/index.mjs.map +1 -0
  153. package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
  154. package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
  155. package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
  156. package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
  157. package/dist/lifecycles/subscribers/timestamps.js +55 -0
  158. package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
  159. package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
  160. package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
  161. package/dist/metadata/index.js +24 -0
  162. package/dist/metadata/index.js.map +1 -0
  163. package/dist/metadata/index.mjs +16 -0
  164. package/dist/metadata/index.mjs.map +1 -0
  165. package/dist/metadata/metadata.js +100 -0
  166. package/dist/metadata/metadata.js.map +1 -0
  167. package/dist/metadata/metadata.mjs +98 -0
  168. package/dist/metadata/metadata.mjs.map +1 -0
  169. package/dist/metadata/relations.js +545 -0
  170. package/dist/metadata/relations.js.map +1 -0
  171. package/dist/metadata/relations.mjs +536 -0
  172. package/dist/metadata/relations.mjs.map +1 -0
  173. package/dist/migrations/common.js +8 -0
  174. package/dist/migrations/common.js.map +1 -0
  175. package/dist/migrations/common.mjs +6 -0
  176. package/dist/migrations/common.mjs.map +1 -0
  177. package/dist/migrations/index.js +39 -0
  178. package/dist/migrations/index.js.map +1 -0
  179. package/dist/migrations/index.mjs +37 -0
  180. package/dist/migrations/index.mjs.map +1 -0
  181. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
  182. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
  183. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
  184. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
  185. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
  186. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
  187. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
  188. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
  189. package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
  190. package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
  191. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
  192. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
  193. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
  194. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
  195. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
  196. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
  197. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
  198. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
  199. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
  200. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
  201. package/dist/migrations/internal-migrations/index.js +26 -0
  202. package/dist/migrations/internal-migrations/index.js.map +1 -0
  203. package/dist/migrations/internal-migrations/index.mjs +24 -0
  204. package/dist/migrations/internal-migrations/index.mjs.map +1 -0
  205. package/dist/migrations/internal.js +63 -0
  206. package/dist/migrations/internal.js.map +1 -0
  207. package/dist/migrations/internal.mjs +61 -0
  208. package/dist/migrations/internal.mjs.map +1 -0
  209. package/dist/migrations/logger.js +24 -0
  210. package/dist/migrations/logger.js.map +1 -0
  211. package/dist/migrations/logger.mjs +22 -0
  212. package/dist/migrations/logger.mjs.map +1 -0
  213. package/dist/migrations/storage.js +39 -0
  214. package/dist/migrations/storage.js.map +1 -0
  215. package/dist/migrations/storage.mjs +37 -0
  216. package/dist/migrations/storage.mjs.map +1 -0
  217. package/dist/migrations/users.js +87 -0
  218. package/dist/migrations/users.js.map +1 -0
  219. package/dist/migrations/users.mjs +85 -0
  220. package/dist/migrations/users.mjs.map +1 -0
  221. package/dist/query/helpers/join.js +127 -0
  222. package/dist/query/helpers/join.js.map +1 -0
  223. package/dist/query/helpers/join.mjs +122 -0
  224. package/dist/query/helpers/join.mjs.map +1 -0
  225. package/dist/query/helpers/order-by.js +167 -0
  226. package/dist/query/helpers/order-by.js.map +1 -0
  227. package/dist/query/helpers/order-by.mjs +163 -0
  228. package/dist/query/helpers/order-by.mjs.map +1 -0
  229. package/dist/query/helpers/populate/apply.js +592 -0
  230. package/dist/query/helpers/populate/apply.js.map +1 -0
  231. package/dist/query/helpers/populate/apply.mjs +590 -0
  232. package/dist/query/helpers/populate/apply.mjs.map +1 -0
  233. package/dist/query/helpers/populate/process.js +92 -0
  234. package/dist/query/helpers/populate/process.js.map +1 -0
  235. package/dist/query/helpers/populate/process.mjs +90 -0
  236. package/dist/query/helpers/populate/process.mjs.map +1 -0
  237. package/dist/query/helpers/search.js +67 -0
  238. package/dist/query/helpers/search.js.map +1 -0
  239. package/dist/query/helpers/search.mjs +65 -0
  240. package/dist/query/helpers/search.mjs.map +1 -0
  241. package/dist/query/helpers/streams/readable.js +131 -0
  242. package/dist/query/helpers/streams/readable.js.map +1 -0
  243. package/dist/query/helpers/streams/readable.mjs +129 -0
  244. package/dist/query/helpers/streams/readable.mjs.map +1 -0
  245. package/dist/query/helpers/transform.js +77 -0
  246. package/dist/query/helpers/transform.js.map +1 -0
  247. package/dist/query/helpers/transform.mjs +73 -0
  248. package/dist/query/helpers/transform.mjs.map +1 -0
  249. package/dist/query/helpers/where.js +372 -0
  250. package/dist/query/helpers/where.js.map +1 -0
  251. package/dist/query/helpers/where.mjs +369 -0
  252. package/dist/query/helpers/where.mjs.map +1 -0
  253. package/dist/query/query-builder.js +507 -0
  254. package/dist/query/query-builder.js.map +1 -0
  255. package/dist/query/query-builder.mjs +505 -0
  256. package/dist/query/query-builder.mjs.map +1 -0
  257. package/dist/repairs/index.js +13 -0
  258. package/dist/repairs/index.js.map +1 -0
  259. package/dist/repairs/index.mjs +11 -0
  260. package/dist/repairs/index.mjs.map +1 -0
  261. package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
  262. package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
  263. package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
  264. package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
  265. package/dist/schema/builder.js +354 -0
  266. package/dist/schema/builder.js.map +1 -0
  267. package/dist/schema/builder.mjs +352 -0
  268. package/dist/schema/builder.mjs.map +1 -0
  269. package/dist/schema/diff.js +379 -0
  270. package/dist/schema/diff.js.map +1 -0
  271. package/dist/schema/diff.mjs +377 -0
  272. package/dist/schema/diff.mjs.map +1 -0
  273. package/dist/schema/index.js +93 -0
  274. package/dist/schema/index.js.map +1 -0
  275. package/dist/schema/index.mjs +91 -0
  276. package/dist/schema/index.mjs.map +1 -0
  277. package/dist/schema/schema.js +266 -0
  278. package/dist/schema/schema.js.map +1 -0
  279. package/dist/schema/schema.mjs +264 -0
  280. package/dist/schema/schema.mjs.map +1 -0
  281. package/dist/schema/storage.js +58 -0
  282. package/dist/schema/storage.js.map +1 -0
  283. package/dist/schema/storage.mjs +56 -0
  284. package/dist/schema/storage.mjs.map +1 -0
  285. package/dist/transaction-context.js +65 -0
  286. package/dist/transaction-context.js.map +1 -0
  287. package/dist/transaction-context.mjs +63 -0
  288. package/dist/transaction-context.mjs.map +1 -0
  289. package/dist/utils/async-curry.js +19 -0
  290. package/dist/utils/async-curry.js.map +1 -0
  291. package/dist/utils/async-curry.mjs +17 -0
  292. package/dist/utils/async-curry.mjs.map +1 -0
  293. package/dist/utils/identifiers/hash.js +30 -0
  294. package/dist/utils/identifiers/hash.js.map +1 -0
  295. package/dist/utils/identifiers/hash.mjs +28 -0
  296. package/dist/utils/identifiers/hash.mjs.map +1 -0
  297. package/dist/utils/identifiers/index.js +414 -0
  298. package/dist/utils/identifiers/index.js.map +1 -0
  299. package/dist/utils/identifiers/index.mjs +411 -0
  300. package/dist/utils/identifiers/index.mjs.map +1 -0
  301. package/dist/utils/knex.js +21 -0
  302. package/dist/utils/knex.js.map +1 -0
  303. package/dist/utils/knex.mjs +18 -0
  304. package/dist/utils/knex.mjs.map +1 -0
  305. package/dist/utils/types.js +51 -0
  306. package/dist/utils/types.js.map +1 -0
  307. package/dist/utils/types.mjs +44 -0
  308. package/dist/utils/types.mjs.map +1 -0
  309. package/dist/validations/index.js +12 -0
  310. package/dist/validations/index.js.map +1 -0
  311. package/dist/validations/index.mjs +10 -0
  312. package/dist/validations/index.mjs.map +1 -0
  313. package/dist/validations/relations/bidirectional.js +64 -0
  314. package/dist/validations/relations/bidirectional.js.map +1 -0
  315. package/dist/validations/relations/bidirectional.mjs +62 -0
  316. package/dist/validations/relations/bidirectional.mjs.map +1 -0
  317. package/dist/validations/relations/index.js +13 -0
  318. package/dist/validations/relations/index.js.map +1 -0
  319. package/dist/validations/relations/index.mjs +11 -0
  320. package/dist/validations/relations/index.mjs.map +1 -0
  321. package/package.json +4 -4
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ var assert = require('assert');
4
+ var index = require('./subscribers/index.js');
5
+ var timestamps = require('./subscribers/timestamps.js');
6
+ var modelsLifecycles = require('./subscribers/models-lifecycles.js');
7
+
8
+ const createLifecyclesProvider = (db)=>{
9
+ let subscribers = [
10
+ timestamps.timestampsLifecyclesSubscriber,
11
+ modelsLifecycles.modelsLifecyclesSubscriber
12
+ ];
13
+ let isLifecycleHooksDisabled = false;
14
+ return {
15
+ subscribe (subscriber) {
16
+ assert.strict(index.isValidSubscriber(subscriber), 'Invalid subscriber. Expected function or object');
17
+ subscribers.push(subscriber);
18
+ return ()=>subscribers.splice(subscribers.indexOf(subscriber), 1);
19
+ },
20
+ clear () {
21
+ subscribers = [];
22
+ },
23
+ disable () {
24
+ isLifecycleHooksDisabled = true;
25
+ },
26
+ enable () {
27
+ isLifecycleHooksDisabled = false;
28
+ },
29
+ createEvent (action, uid, properties, state) {
30
+ const model = db.metadata.get(uid);
31
+ return {
32
+ action,
33
+ model,
34
+ state,
35
+ ...properties
36
+ };
37
+ },
38
+ /**
39
+ * @param {string} action
40
+ * @param {string} uid
41
+ * @param {{ params?: any, result?: any }} properties
42
+ * @param {Map<any, any>} states
43
+ */ async run (action, uid, properties, states = new Map()) {
44
+ if (isLifecycleHooksDisabled) return states;
45
+ for(let i = 0; i < subscribers.length; i += 1){
46
+ const subscriber = subscribers[i];
47
+ if (typeof subscriber === 'function') {
48
+ const state = states.get(subscriber) || {};
49
+ const event = this.createEvent(action, uid, properties, state);
50
+ await subscriber(event);
51
+ if (event.state) {
52
+ states.set(subscriber, event.state || state);
53
+ }
54
+ continue;
55
+ }
56
+ const hasAction = action in subscriber;
57
+ const hasModel = !subscriber.models || subscriber.models.includes(uid);
58
+ if (hasAction && hasModel) {
59
+ const state = states.get(subscriber) || {};
60
+ const event = this.createEvent(action, uid, properties, state);
61
+ await subscriber[action]?.(event);
62
+ if (event.state) {
63
+ states.set(subscriber, event.state);
64
+ }
65
+ }
66
+ }
67
+ return states;
68
+ }
69
+ };
70
+ };
71
+
72
+ exports.createLifecyclesProvider = createLifecyclesProvider;
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { strict } from 'assert';
2
+ import { isValidSubscriber } from './subscribers/index.mjs';
3
+ import { timestampsLifecyclesSubscriber } from './subscribers/timestamps.mjs';
4
+ import { modelsLifecyclesSubscriber } from './subscribers/models-lifecycles.mjs';
5
+
6
+ const createLifecyclesProvider = (db)=>{
7
+ let subscribers = [
8
+ timestampsLifecyclesSubscriber,
9
+ modelsLifecyclesSubscriber
10
+ ];
11
+ let isLifecycleHooksDisabled = false;
12
+ return {
13
+ subscribe (subscriber) {
14
+ strict(isValidSubscriber(subscriber), 'Invalid subscriber. Expected function or object');
15
+ subscribers.push(subscriber);
16
+ return ()=>subscribers.splice(subscribers.indexOf(subscriber), 1);
17
+ },
18
+ clear () {
19
+ subscribers = [];
20
+ },
21
+ disable () {
22
+ isLifecycleHooksDisabled = true;
23
+ },
24
+ enable () {
25
+ isLifecycleHooksDisabled = false;
26
+ },
27
+ createEvent (action, uid, properties, state) {
28
+ const model = db.metadata.get(uid);
29
+ return {
30
+ action,
31
+ model,
32
+ state,
33
+ ...properties
34
+ };
35
+ },
36
+ /**
37
+ * @param {string} action
38
+ * @param {string} uid
39
+ * @param {{ params?: any, result?: any }} properties
40
+ * @param {Map<any, any>} states
41
+ */ async run (action, uid, properties, states = new Map()) {
42
+ if (isLifecycleHooksDisabled) return states;
43
+ for(let i = 0; i < subscribers.length; i += 1){
44
+ const subscriber = subscribers[i];
45
+ if (typeof subscriber === 'function') {
46
+ const state = states.get(subscriber) || {};
47
+ const event = this.createEvent(action, uid, properties, state);
48
+ await subscriber(event);
49
+ if (event.state) {
50
+ states.set(subscriber, event.state || state);
51
+ }
52
+ continue;
53
+ }
54
+ const hasAction = action in subscriber;
55
+ const hasModel = !subscriber.models || subscriber.models.includes(uid);
56
+ if (hasAction && hasModel) {
57
+ const state = states.get(subscriber) || {};
58
+ const event = this.createEvent(action, uid, properties, state);
59
+ await subscriber[action]?.(event);
60
+ if (event.state) {
61
+ states.set(subscriber, event.state);
62
+ }
63
+ }
64
+ }
65
+ return states;
66
+ }
67
+ };
68
+ };
69
+
70
+ export { createLifecyclesProvider };
71
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/lifecycles/index.ts"],"sourcesContent":["import { strict as assert } from 'assert';\n\nimport * as subscriberUtils from './subscribers';\n\nimport type { Action, Event, Params, Subscriber } from './types';\nimport type { Database } from '..';\n\nexport type * from './types';\n\nexport type State = Record<string, unknown>;\nexport type States = Map<Subscriber, State>;\n\nexport interface Properties {\n params: Params;\n result?: unknown;\n}\n\nexport interface LifecycleProvider {\n subscribe(subscriber: Subscriber): () => void;\n clear(): void;\n run(action: Action, uid: string, properties: Properties, states?: States): Promise<States>;\n createEvent(action: Action, uid: string, properties: Properties, state: State): Event;\n disable(): void;\n enable(): void;\n}\n\nexport const createLifecyclesProvider = (db: Database): LifecycleProvider => {\n let subscribers = [\n subscriberUtils.timestampsLifecyclesSubscriber,\n subscriberUtils.modelsLifecyclesSubscriber,\n ];\n\n let isLifecycleHooksDisabled = false;\n\n return {\n subscribe(subscriber) {\n assert(\n subscriberUtils.isValidSubscriber(subscriber),\n 'Invalid subscriber. Expected function or object'\n );\n\n subscribers.push(subscriber);\n\n return () => subscribers.splice(subscribers.indexOf(subscriber), 1);\n },\n\n clear() {\n subscribers = [];\n },\n\n disable() {\n isLifecycleHooksDisabled = true;\n },\n\n enable() {\n isLifecycleHooksDisabled = false;\n },\n\n createEvent(action, uid, properties, state): Event {\n const model = db.metadata.get(uid);\n\n return {\n action,\n model,\n state,\n ...properties,\n };\n },\n\n /**\n * @param {string} action\n * @param {string} uid\n * @param {{ params?: any, result?: any }} properties\n * @param {Map<any, any>} states\n */\n async run(action, uid, properties, states = new Map()) {\n if (isLifecycleHooksDisabled) return states;\n for (let i = 0; i < subscribers.length; i += 1) {\n const subscriber = subscribers[i];\n if (typeof subscriber === 'function') {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n await subscriber(event);\n if (event.state) {\n states.set(subscriber, event.state || state);\n }\n continue;\n }\n\n const hasAction = action in subscriber;\n const hasModel = !subscriber.models || subscriber.models.includes(uid);\n\n if (hasAction && hasModel) {\n const state = states.get(subscriber) || {};\n const event = this.createEvent(action, uid, properties, state);\n\n await subscriber[action]?.(event);\n if (event.state) {\n states.set(subscriber, event.state);\n }\n }\n }\n\n return states;\n },\n };\n};\n"],"names":["createLifecyclesProvider","db","subscribers","subscriberUtils","isLifecycleHooksDisabled","subscribe","subscriber","assert","push","splice","indexOf","clear","disable","enable","createEvent","action","uid","properties","state","model","metadata","get","run","states","Map","i","length","event","set","hasAction","hasModel","models","includes"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ require('lodash');
4
+
5
+ const isValidSubscriber = (subscriber)=>{
6
+ return typeof subscriber === 'function' || typeof subscriber === 'object' && subscriber !== null;
7
+ };
8
+
9
+ exports.isValidSubscriber = isValidSubscriber;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;;;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,UAAe,KAAA,UAAA,IAAe,OAAOA,UAAAA,KAAe,YAAYA,UAAe,KAAA,IAAA;AAE1F;;;;"}
@@ -0,0 +1,8 @@
1
+ import 'lodash';
2
+
3
+ const isValidSubscriber = (subscriber)=>{
4
+ return typeof subscriber === 'function' || typeof subscriber === 'object' && subscriber !== null;
5
+ };
6
+
7
+ export { isValidSubscriber };
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/lifecycles/subscribers/index.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\nexport const isValidSubscriber = (subscriber: Subscriber) => {\n return (\n typeof subscriber === 'function' || (typeof subscriber === 'object' && subscriber !== null)\n );\n};\n\nexport { modelsLifecyclesSubscriber } from './models-lifecycles';\nexport { timestampsLifecyclesSubscriber } from './timestamps';\n"],"names":["isValidSubscriber","subscriber"],"mappings":";;AAEO,MAAMA,oBAAoB,CAACC,UAAAA,GAAAA;AAChC,IAAA,OACE,OAAOA,UAAe,KAAA,UAAA,IAAe,OAAOA,UAAAA,KAAe,YAAYA,UAAe,KAAA,IAAA;AAE1F;;;;"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * For each model try to run it's lifecycles function if any is defined
5
+ */ const modelsLifecyclesSubscriber = async (event)=>{
6
+ const { model } = event;
7
+ if (model.lifecycles && event.action in model.lifecycles) {
8
+ await model.lifecycles[event.action]?.(event);
9
+ }
10
+ };
11
+
12
+ exports.modelsLifecyclesSubscriber = modelsLifecyclesSubscriber;
13
+ //# sourceMappingURL=models-lifecycles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-lifecycles.js","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":";;AAEA;;IAGaA,MAAAA,0BAAAA,GAAyC,OAAOC,KAAAA,GAAAA;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD,KAAAA;IAElB,IAAIC,KAAAA,CAAMC,UAAU,IAAIF,KAAAA,CAAMG,MAAM,IAAIF,KAAAA,CAAMC,UAAU,EAAE;AACxD,QAAA,MAAMD,MAAMC,UAAU,CAACF,KAAMG,CAAAA,MAAM,CAAC,GAAGH,KAAAA,CAAAA;AACzC;AACF;;;;"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * For each model try to run it's lifecycles function if any is defined
3
+ */ const modelsLifecyclesSubscriber = async (event)=>{
4
+ const { model } = event;
5
+ if (model.lifecycles && event.action in model.lifecycles) {
6
+ await model.lifecycles[event.action]?.(event);
7
+ }
8
+ };
9
+
10
+ export { modelsLifecyclesSubscriber };
11
+ //# sourceMappingURL=models-lifecycles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-lifecycles.mjs","sources":["../../../src/lifecycles/subscribers/models-lifecycles.ts"],"sourcesContent":["import type { Subscriber } from '../types';\n\n/**\n * For each model try to run it's lifecycles function if any is defined\n */\nexport const modelsLifecyclesSubscriber: Subscriber = async (event) => {\n const { model } = event;\n\n if (model.lifecycles && event.action in model.lifecycles) {\n await model.lifecycles[event.action]?.(event);\n }\n};\n"],"names":["modelsLifecyclesSubscriber","event","model","lifecycles","action"],"mappings":"AAEA;;IAGaA,MAAAA,0BAAAA,GAAyC,OAAOC,KAAAA,GAAAA;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD,KAAAA;IAElB,IAAIC,KAAAA,CAAMC,UAAU,IAAIF,KAAAA,CAAMG,MAAM,IAAIF,KAAAA,CAAMC,UAAU,EAAE;AACxD,QAAA,MAAMD,MAAMC,UAAU,CAACF,KAAMG,CAAAA,MAAM,CAAC,GAAGH,KAAAA,CAAAA;AACzC;AACF;;;;"}
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash');
4
+
5
+ // NOTE: we could add onCreate & onUpdate on field level to do this instead
6
+ const timestampsLifecyclesSubscriber = {
7
+ /**
8
+ * Init createdAt & updatedAt before create
9
+ */ beforeCreate (event) {
10
+ const { data } = event.params;
11
+ const now = new Date();
12
+ _.defaults(data, {
13
+ createdAt: now,
14
+ updatedAt: now
15
+ });
16
+ },
17
+ /**
18
+ * Init createdAt & updatedAt before create
19
+ * @param {Event} event
20
+ */ beforeCreateMany (event) {
21
+ const { data } = event.params;
22
+ const now = new Date();
23
+ if (_.isArray(data)) {
24
+ data.forEach((data)=>_.defaults(data, {
25
+ createdAt: now,
26
+ updatedAt: now
27
+ }));
28
+ }
29
+ },
30
+ /**
31
+ * Update updatedAt before update
32
+ * @param {Event} event
33
+ */ beforeUpdate (event) {
34
+ const { data } = event.params;
35
+ const now = new Date();
36
+ _.assign(data, {
37
+ updatedAt: now
38
+ });
39
+ },
40
+ /**
41
+ * Update updatedAt before update
42
+ * @param {Event} event
43
+ */ beforeUpdateMany (event) {
44
+ const { data } = event.params;
45
+ const now = new Date();
46
+ if (_.isArray(data)) {
47
+ data.forEach((data)=>_.assign(data, {
48
+ updatedAt: now
49
+ }));
50
+ }
51
+ }
52
+ };
53
+
54
+ exports.timestampsLifecyclesSubscriber = timestampsLifecyclesSubscriber;
55
+ //# sourceMappingURL=timestamps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamps.js","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;;;AAGA;MACaA,8BAA6C,GAAA;AACxD;;AAEC,MACDC,cAAaC,KAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;YAAEM,SAAWJ,EAAAA,GAAAA;YAAKK,SAAWL,EAAAA;AAAI,SAAA,CAAA;AACpD,KAAA;AAEA;;;AAGC,MACDM,kBAAiBT,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;oBAAEM,SAAWJ,EAAAA,GAAAA;oBAAKK,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AAC3E;AACF,KAAA;AAEA;;;AAGC,MACDS,cAAaZ,KAAK,EAAA;AAChB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;YAAEO,SAAWL,EAAAA;AAAI,SAAA,CAAA;AAClC,KAAA;AAEA;;;AAGC,MACDW,kBAAiBd,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;oBAAEO,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AACzD;AACF;AACF;;;;"}
@@ -0,0 +1,53 @@
1
+ import _ from 'lodash';
2
+
3
+ // NOTE: we could add onCreate & onUpdate on field level to do this instead
4
+ const timestampsLifecyclesSubscriber = {
5
+ /**
6
+ * Init createdAt & updatedAt before create
7
+ */ beforeCreate (event) {
8
+ const { data } = event.params;
9
+ const now = new Date();
10
+ _.defaults(data, {
11
+ createdAt: now,
12
+ updatedAt: now
13
+ });
14
+ },
15
+ /**
16
+ * Init createdAt & updatedAt before create
17
+ * @param {Event} event
18
+ */ beforeCreateMany (event) {
19
+ const { data } = event.params;
20
+ const now = new Date();
21
+ if (_.isArray(data)) {
22
+ data.forEach((data)=>_.defaults(data, {
23
+ createdAt: now,
24
+ updatedAt: now
25
+ }));
26
+ }
27
+ },
28
+ /**
29
+ * Update updatedAt before update
30
+ * @param {Event} event
31
+ */ beforeUpdate (event) {
32
+ const { data } = event.params;
33
+ const now = new Date();
34
+ _.assign(data, {
35
+ updatedAt: now
36
+ });
37
+ },
38
+ /**
39
+ * Update updatedAt before update
40
+ * @param {Event} event
41
+ */ beforeUpdateMany (event) {
42
+ const { data } = event.params;
43
+ const now = new Date();
44
+ if (_.isArray(data)) {
45
+ data.forEach((data)=>_.assign(data, {
46
+ updatedAt: now
47
+ }));
48
+ }
49
+ }
50
+ };
51
+
52
+ export { timestampsLifecyclesSubscriber };
53
+ //# sourceMappingURL=timestamps.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamps.mjs","sources":["../../../src/lifecycles/subscribers/timestamps.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Event, Subscriber } from '../types';\n\n// NOTE: we could add onCreate & onUpdate on field level to do this instead\nexport const timestampsLifecyclesSubscriber: Subscriber = {\n /**\n * Init createdAt & updatedAt before create\n */\n beforeCreate(event: Event) {\n const { data } = event.params;\n\n const now = new Date();\n _.defaults(data, { createdAt: now, updatedAt: now });\n },\n\n /**\n * Init createdAt & updatedAt before create\n * @param {Event} event\n */\n beforeCreateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.defaults(data, { createdAt: now, updatedAt: now }));\n }\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdate(event) {\n const { data } = event.params;\n\n const now = new Date();\n _.assign(data, { updatedAt: now });\n },\n\n /**\n * Update updatedAt before update\n * @param {Event} event\n */\n beforeUpdateMany(event) {\n const { data } = event.params;\n\n const now = new Date();\n if (_.isArray(data)) {\n data.forEach((data) => _.assign(data, { updatedAt: now }));\n }\n },\n};\n"],"names":["timestampsLifecyclesSubscriber","beforeCreate","event","data","params","now","Date","_","defaults","createdAt","updatedAt","beforeCreateMany","isArray","forEach","beforeUpdate","assign","beforeUpdateMany"],"mappings":";;AAGA;MACaA,8BAA6C,GAAA;AACxD;;AAEC,MACDC,cAAaC,KAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;YAAEM,SAAWJ,EAAAA,GAAAA;YAAKK,SAAWL,EAAAA;AAAI,SAAA,CAAA;AACpD,KAAA;AAEA;;;AAGC,MACDM,kBAAiBT,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEC,CAAAA,QAAQ,CAACL,IAAM,EAAA;oBAAEM,SAAWJ,EAAAA,GAAAA;oBAAKK,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AAC3E;AACF,KAAA;AAEA;;;AAGC,MACDS,cAAaZ,KAAK,EAAA;AAChB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChBC,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;YAAEO,SAAWL,EAAAA;AAAI,SAAA,CAAA;AAClC,KAAA;AAEA;;;AAGC,MACDW,kBAAiBd,KAAK,EAAA;AACpB,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAME,MAAM;AAE7B,QAAA,MAAMC,MAAM,IAAIC,IAAAA,EAAAA;QAChB,IAAIC,CAAAA,CAAEK,OAAO,CAACT,IAAO,CAAA,EAAA;AACnBA,YAAAA,IAAAA,CAAKU,OAAO,CAAC,CAACV,OAASI,CAAEQ,CAAAA,MAAM,CAACZ,IAAM,EAAA;oBAAEO,SAAWL,EAAAA;AAAI,iBAAA,CAAA,CAAA;AACzD;AACF;AACF;;;;"}
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var relations = require('./relations.js');
4
+ var metadata = require('./metadata.js');
5
+
6
+ // TODO: check if there isn't an attribute with an id already
7
+ /**
8
+ * Create Metadata from models configurations
9
+ */ const createMetadata = (models)=>{
10
+ const metadata$1 = new metadata.Metadata();
11
+ if (models.length) {
12
+ metadata$1.loadModels(models);
13
+ }
14
+ return metadata$1;
15
+ };
16
+
17
+ exports.hasInverseOrderColumn = relations.hasInverseOrderColumn;
18
+ exports.hasOrderColumn = relations.hasOrderColumn;
19
+ exports.isAnyToOne = relations.isAnyToOne;
20
+ exports.isBidirectional = relations.isBidirectional;
21
+ exports.isManyToAny = relations.isManyToAny;
22
+ exports.isOneToAny = relations.isOneToAny;
23
+ exports.createMetadata = createMetadata;
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;;;AAuBA;AACA;;IAGaA,MAAAA,cAAAA,GAAiB,CAACC,MAAAA,GAAAA;AAC7B,IAAA,MAAMC,aAAW,IAAIC,iBAAAA,EAAAA;IAErB,IAAIF,MAAAA,CAAOG,MAAM,EAAE;AACjBF,QAAAA,UAAAA,CAASG,UAAU,CAACJ,MAAAA,CAAAA;AACtB;IAEA,OAAOC,UAAAA;AACT;;;;;;;;;;"}
@@ -0,0 +1,16 @@
1
+ export { hasInverseOrderColumn, hasOrderColumn, isAnyToOne, isBidirectional, isManyToAny, isOneToAny } from './relations.mjs';
2
+ import { Metadata } from './metadata.mjs';
3
+
4
+ // TODO: check if there isn't an attribute with an id already
5
+ /**
6
+ * Create Metadata from models configurations
7
+ */ const createMetadata = (models)=>{
8
+ const metadata = new Metadata();
9
+ if (models.length) {
10
+ metadata.loadModels(models);
11
+ }
12
+ return metadata;
13
+ };
14
+
15
+ export { createMetadata };
16
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/metadata/index.ts"],"sourcesContent":["import {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n} from './relations';\nimport { Metadata, Meta } from './metadata';\nimport type { Model } from '../types';\n\nexport type { Metadata, Meta };\nexport {\n isPolymorphic,\n isBidirectional,\n isAnyToOne,\n isOneToAny,\n hasOrderColumn,\n hasInverseOrderColumn,\n isManyToAny,\n};\n\n// TODO: check if there isn't an attribute with an id already\n/**\n * Create Metadata from models configurations\n */\nexport const createMetadata = (models: Model[]): Metadata => {\n const metadata = new Metadata();\n\n if (models.length) {\n metadata.loadModels(models);\n }\n\n return metadata;\n};\n"],"names":["createMetadata","models","metadata","Metadata","length","loadModels"],"mappings":";;;AAuBA;AACA;;IAGaA,MAAAA,cAAAA,GAAiB,CAACC,MAAAA,GAAAA;AAC7B,IAAA,MAAMC,WAAW,IAAIC,QAAAA,EAAAA;IAErB,IAAIF,MAAAA,CAAOG,MAAM,EAAE;AACjBF,QAAAA,QAAAA,CAASG,UAAU,CAACJ,MAAAA,CAAAA;AACtB;IAEA,OAAOC,QAAAA;AACT;;;;"}
@@ -0,0 +1,100 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash/fp');
4
+ var index = require('../utils/identifiers/index.js');
5
+ var types = require('../utils/types.js');
6
+ var relations = require('./relations.js');
7
+
8
+ class Metadata extends Map {
9
+ // TODO: we expose the global identifiers in this way so that in the future we can instantiate our own
10
+ // However, it should NOT be done until all the methods used by metadata can be part of this metadata object
11
+ // and access this one; currently they all access the global identifiers directly.
12
+ get identifiers() {
13
+ return index.identifiers;
14
+ }
15
+ get(key) {
16
+ if (!super.has(key)) {
17
+ throw new Error(`Metadata for "${key}" not found`);
18
+ }
19
+ return super.get(key);
20
+ }
21
+ add(meta) {
22
+ return this.set(meta.uid, meta);
23
+ }
24
+ /**
25
+ * Validate the DB metadata, throwing an error if a duplicate DB table name is detected
26
+ */ validate() {
27
+ const seenTables = new Map();
28
+ for (const meta of this.values()){
29
+ if (seenTables.get(meta.tableName)) {
30
+ throw new Error(`DB table "${meta.tableName}" already exists. Change the collectionName of the related content type.`);
31
+ }
32
+ seenTables.set(meta.tableName, true);
33
+ }
34
+ }
35
+ loadModels(models) {
36
+ // init pass
37
+ for (const model of _.cloneDeep(models ?? [])){
38
+ const tableName = index.identifiers.getTableName(model.tableName);
39
+ this.add({
40
+ ...model,
41
+ tableName,
42
+ attributes: {
43
+ ...model.attributes
44
+ },
45
+ lifecycles: model.lifecycles ?? {},
46
+ indexes: model.indexes ?? [],
47
+ foreignKeys: model.foreignKeys ?? [],
48
+ columnToAttribute: {}
49
+ });
50
+ }
51
+ // build compos / relations
52
+ for (const meta of this.values()){
53
+ for (const [attributeName, attribute] of Object.entries(meta.attributes)){
54
+ try {
55
+ if (attribute.unstable_virtual) {
56
+ continue;
57
+ }
58
+ if (types.isRelationalAttribute(attribute)) {
59
+ relations.createRelation(attributeName, attribute, meta, this);
60
+ continue;
61
+ }
62
+ createAttribute(attributeName, attribute);
63
+ } catch (error) {
64
+ if (error instanceof Error) {
65
+ throw new Error(`Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ for (const meta of this.values()){
71
+ const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key)=>{
72
+ const attribute = meta.attributes[key];
73
+ if ('columnName' in attribute) {
74
+ return Object.assign(acc, {
75
+ [attribute.columnName || key]: key
76
+ });
77
+ }
78
+ return Object.assign(acc, {
79
+ [key]: key
80
+ });
81
+ }, {});
82
+ meta.columnToAttribute = columnToAttribute;
83
+ }
84
+ this.validate();
85
+ }
86
+ }
87
+ const createAttribute = (attributeName, attribute)=>{
88
+ // if the attribute has already set its own column name, use that
89
+ // this will prevent us from shortening a name twice
90
+ if ('columnName' in attribute && attribute.columnName) {
91
+ return;
92
+ }
93
+ const columnName = index.identifiers.getColumnName(_.snakeCase(attributeName));
94
+ Object.assign(attribute, {
95
+ columnName
96
+ });
97
+ };
98
+
99
+ exports.Metadata = Metadata;
100
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sources":["../../src/metadata/metadata.ts"],"sourcesContent":["import { cloneDeep, snakeCase } from 'lodash/fp';\nimport { identifiers } from '../utils/identifiers';\nimport * as types from '../utils/types';\nimport { createRelation } from './relations';\nimport type { Attribute, Model } from '../types';\nimport type { ForeignKey, Index } from '../schema/types';\nimport type { Action, SubscriberFn } from '../lifecycles';\n\nexport interface Meta extends Model {\n columnToAttribute: Record<string, string>;\n indexes: Index[];\n foreignKeys: ForeignKey[];\n lifecycles: Partial<Record<Action, SubscriberFn>>;\n}\n\nexport class Metadata extends Map<string, Meta> {\n // TODO: we expose the global identifiers in this way so that in the future we can instantiate our own\n // However, it should NOT be done until all the methods used by metadata can be part of this metadata object\n // and access this one; currently they all access the global identifiers directly.\n get identifiers() {\n return identifiers;\n }\n\n get(key: string): Meta {\n if (!super.has(key)) {\n throw new Error(`Metadata for \"${key}\" not found`);\n }\n\n return super.get(key) as Meta;\n }\n\n add(meta: Meta) {\n return this.set(meta.uid, meta);\n }\n\n /**\n * Validate the DB metadata, throwing an error if a duplicate DB table name is detected\n */\n validate() {\n const seenTables = new Map();\n for (const meta of this.values()) {\n if (seenTables.get(meta.tableName)) {\n throw new Error(\n `DB table \"${meta.tableName}\" already exists. Change the collectionName of the related content type.`\n );\n }\n seenTables.set(meta.tableName, true);\n }\n }\n\n loadModels(models: Model[]) {\n // init pass\n for (const model of cloneDeep(models ?? [])) {\n const tableName = identifiers.getTableName(model.tableName);\n this.add({\n ...model,\n tableName,\n attributes: {\n ...model.attributes,\n },\n lifecycles: model.lifecycles ?? {},\n indexes: model.indexes ?? [],\n foreignKeys: model.foreignKeys ?? [],\n columnToAttribute: {},\n });\n }\n\n // build compos / relations\n for (const meta of this.values()) {\n for (const [attributeName, attribute] of Object.entries(meta.attributes)) {\n try {\n if (attribute.unstable_virtual) {\n continue;\n }\n\n if (types.isRelationalAttribute(attribute)) {\n createRelation(attributeName, attribute, meta, this);\n continue;\n }\n\n createAttribute(attributeName, attribute);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`\n );\n }\n }\n }\n }\n\n for (const meta of this.values()) {\n const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key) => {\n const attribute = meta.attributes[key];\n if ('columnName' in attribute) {\n return Object.assign(acc, { [attribute.columnName || key]: key });\n }\n\n return Object.assign(acc, { [key]: key });\n }, {});\n\n meta.columnToAttribute = columnToAttribute;\n }\n\n this.validate();\n }\n}\n\nconst createAttribute = (attributeName: string, attribute: Attribute) => {\n // if the attribute has already set its own column name, use that\n // this will prevent us from shortening a name twice\n if ('columnName' in attribute && attribute.columnName) {\n return;\n }\n\n const columnName = identifiers.getColumnName(snakeCase(attributeName));\n\n Object.assign(attribute, { columnName });\n};\n"],"names":["Metadata","Map","identifiers","get","key","has","Error","add","meta","set","uid","validate","seenTables","values","tableName","loadModels","models","model","cloneDeep","getTableName","attributes","lifecycles","indexes","foreignKeys","columnToAttribute","attributeName","attribute","Object","entries","unstable_virtual","types","createRelation","createAttribute","error","singularName","message","keys","reduce","acc","assign","columnName","getColumnName","snakeCase"],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { cloneDeep, snakeCase } from 'lodash/fp';
2
+ import { identifiers } from '../utils/identifiers/index.mjs';
3
+ import { isRelationalAttribute } from '../utils/types.mjs';
4
+ import { createRelation } from './relations.mjs';
5
+
6
+ class Metadata extends Map {
7
+ // TODO: we expose the global identifiers in this way so that in the future we can instantiate our own
8
+ // However, it should NOT be done until all the methods used by metadata can be part of this metadata object
9
+ // and access this one; currently they all access the global identifiers directly.
10
+ get identifiers() {
11
+ return identifiers;
12
+ }
13
+ get(key) {
14
+ if (!super.has(key)) {
15
+ throw new Error(`Metadata for "${key}" not found`);
16
+ }
17
+ return super.get(key);
18
+ }
19
+ add(meta) {
20
+ return this.set(meta.uid, meta);
21
+ }
22
+ /**
23
+ * Validate the DB metadata, throwing an error if a duplicate DB table name is detected
24
+ */ validate() {
25
+ const seenTables = new Map();
26
+ for (const meta of this.values()){
27
+ if (seenTables.get(meta.tableName)) {
28
+ throw new Error(`DB table "${meta.tableName}" already exists. Change the collectionName of the related content type.`);
29
+ }
30
+ seenTables.set(meta.tableName, true);
31
+ }
32
+ }
33
+ loadModels(models) {
34
+ // init pass
35
+ for (const model of cloneDeep(models ?? [])){
36
+ const tableName = identifiers.getTableName(model.tableName);
37
+ this.add({
38
+ ...model,
39
+ tableName,
40
+ attributes: {
41
+ ...model.attributes
42
+ },
43
+ lifecycles: model.lifecycles ?? {},
44
+ indexes: model.indexes ?? [],
45
+ foreignKeys: model.foreignKeys ?? [],
46
+ columnToAttribute: {}
47
+ });
48
+ }
49
+ // build compos / relations
50
+ for (const meta of this.values()){
51
+ for (const [attributeName, attribute] of Object.entries(meta.attributes)){
52
+ try {
53
+ if (attribute.unstable_virtual) {
54
+ continue;
55
+ }
56
+ if (isRelationalAttribute(attribute)) {
57
+ createRelation(attributeName, attribute, meta, this);
58
+ continue;
59
+ }
60
+ createAttribute(attributeName, attribute);
61
+ } catch (error) {
62
+ if (error instanceof Error) {
63
+ throw new Error(`Error on attribute ${attributeName} in model ${meta.singularName}(${meta.uid}): ${error.message}`);
64
+ }
65
+ }
66
+ }
67
+ }
68
+ for (const meta of this.values()){
69
+ const columnToAttribute = Object.keys(meta.attributes).reduce((acc, key)=>{
70
+ const attribute = meta.attributes[key];
71
+ if ('columnName' in attribute) {
72
+ return Object.assign(acc, {
73
+ [attribute.columnName || key]: key
74
+ });
75
+ }
76
+ return Object.assign(acc, {
77
+ [key]: key
78
+ });
79
+ }, {});
80
+ meta.columnToAttribute = columnToAttribute;
81
+ }
82
+ this.validate();
83
+ }
84
+ }
85
+ const createAttribute = (attributeName, attribute)=>{
86
+ // if the attribute has already set its own column name, use that
87
+ // this will prevent us from shortening a name twice
88
+ if ('columnName' in attribute && attribute.columnName) {
89
+ return;
90
+ }
91
+ const columnName = identifiers.getColumnName(snakeCase(attributeName));
92
+ Object.assign(attribute, {
93
+ columnName
94
+ });
95
+ };
96
+
97
+ export { Metadata };
98
+ //# sourceMappingURL=metadata.mjs.map