@typetron/framework 0.3.17 → 0.4.0-rc1

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 (509) hide show
  1. package/Cache/Cache.d.ts +9 -0
  2. package/Cache/Cache.d.ts.map +1 -0
  3. package/Cache/Cache.js +7 -0
  4. package/Cache/Cache.js.map +1 -0
  5. package/Cache/Stores/DatabaseStore.d.ts +16 -0
  6. package/Cache/Stores/DatabaseStore.d.ts.map +1 -0
  7. package/Cache/Stores/DatabaseStore.js +104 -0
  8. package/Cache/Stores/DatabaseStore.js.map +1 -0
  9. package/Cache/Stores/FileStore.d.ts +16 -0
  10. package/Cache/Stores/FileStore.d.ts.map +1 -0
  11. package/Cache/Stores/FileStore.js +63 -0
  12. package/Cache/Stores/FileStore.js.map +1 -0
  13. package/Cache/Stores/MemoryStore.d.ts +13 -0
  14. package/Cache/Stores/MemoryStore.d.ts.map +1 -0
  15. package/Cache/Stores/MemoryStore.js +60 -0
  16. package/Cache/Stores/MemoryStore.js.map +1 -0
  17. package/Cache/index.d.ts +6 -0
  18. package/Cache/index.d.ts.map +1 -0
  19. package/Cache/index.js +18 -0
  20. package/Cache/index.js.map +1 -0
  21. package/Cache/types.d.ts +5 -0
  22. package/Cache/types.d.ts.map +1 -0
  23. package/Cache/types.js +3 -0
  24. package/Cache/types.js.map +1 -0
  25. package/Container/ClassResolver.d.ts +8 -8
  26. package/Container/ClassResolver.d.ts.map +1 -1
  27. package/Container/ClassResolver.js +92 -87
  28. package/Container/ClassResolver.js.map +1 -1
  29. package/Container/Container.d.ts +24 -24
  30. package/Container/Container.d.ts.map +1 -1
  31. package/Container/Container.js +119 -118
  32. package/Container/Container.js.map +1 -1
  33. package/Container/Contracts.d.ts +2 -2
  34. package/Container/Contracts.js +2 -2
  35. package/Container/Decorators.d.ts +4 -4
  36. package/Container/Decorators.js +21 -21
  37. package/Container/Decorators.js.map +1 -1
  38. package/Container/Metadata.d.ts +20 -20
  39. package/Container/Metadata.js +18 -18
  40. package/Container/Resolver.d.ts +18 -18
  41. package/Container/Resolver.js +15 -15
  42. package/Container/index.d.ts +5 -5
  43. package/Container/index.js +17 -17
  44. package/Database/Clauses/Where.js +1 -1
  45. package/Database/Connection.d.ts +20 -20
  46. package/Database/Connection.js +42 -42
  47. package/Database/Decorators.d.ts +36 -36
  48. package/Database/Decorators.js +115 -116
  49. package/Database/Decorators.js.map +1 -1
  50. package/Database/Drivers/DatabaseDriver.d.ts +28 -28
  51. package/Database/Drivers/DatabaseDriver.js +6 -6
  52. package/Database/Drivers/MySQL/Alter/index.d.ts +33 -33
  53. package/Database/Drivers/MySQL/Alter/index.js +61 -61
  54. package/Database/Drivers/MySQL/ColumnDefinition.d.ts +6 -6
  55. package/Database/Drivers/MySQL/ColumnDefinition.js +17 -17
  56. package/Database/Drivers/MySQL/Create.d.ts +9 -9
  57. package/Database/Drivers/MySQL/Create.js +37 -37
  58. package/Database/Drivers/MySQL/MysqlDriver.d.ts +41 -41
  59. package/Database/Drivers/MySQL/MysqlDriver.js +75 -76
  60. package/Database/Drivers/MySQL/MysqlDriver.js.map +1 -1
  61. package/Database/Drivers/MySQL/Schema.d.ts +15 -15
  62. package/Database/Drivers/MySQL/Schema.js +66 -65
  63. package/Database/Drivers/MySQL/Schema.js.map +1 -1
  64. package/Database/Drivers/MySQL/index.d.ts +1 -1
  65. package/Database/Drivers/MySQL/index.js +15 -15
  66. package/Database/Drivers/SQL/Schema.d.ts +6 -6
  67. package/Database/Drivers/SQL/Schema.js +57 -57
  68. package/Database/Drivers/SQL/Statements/Alter.d.ts +7 -7
  69. package/Database/Drivers/SQL/Statements/Alter.js +17 -17
  70. package/Database/Drivers/SQL/Statements/BaseStatement.d.ts +12 -12
  71. package/Database/Drivers/SQL/Statements/BaseStatement.js +45 -46
  72. package/Database/Drivers/SQL/Statements/BaseStatement.js.map +1 -1
  73. package/Database/Drivers/SQL/Statements/Delete.d.ts +5 -5
  74. package/Database/Drivers/SQL/Statements/Delete.js +16 -16
  75. package/Database/Drivers/SQL/Statements/Insert.d.ts +6 -6
  76. package/Database/Drivers/SQL/Statements/Insert.js +22 -23
  77. package/Database/Drivers/SQL/Statements/Insert.js.map +1 -1
  78. package/Database/Drivers/SQL/Statements/Select.d.ts +7 -7
  79. package/Database/Drivers/SQL/Statements/Select.js +44 -44
  80. package/Database/Drivers/SQL/Statements/Update.d.ts +6 -6
  81. package/Database/Drivers/SQL/Statements/Update.js +27 -27
  82. package/Database/Drivers/SQL/index.d.ts +8 -8
  83. package/Database/Drivers/SQL/index.js +2 -2
  84. package/Database/Drivers/SQLite/Create.d.ts +9 -9
  85. package/Database/Drivers/SQLite/Create.js +36 -36
  86. package/Database/Drivers/SQLite/Schema.d.ts +15 -15
  87. package/Database/Drivers/SQLite/Schema.js +46 -44
  88. package/Database/Drivers/SQLite/Schema.js.map +1 -1
  89. package/Database/Drivers/SQLite/SqliteDriver.d.ts +42 -42
  90. package/Database/Drivers/SQLite/SqliteDriver.d.ts.map +1 -1
  91. package/Database/Drivers/SQLite/SqliteDriver.js +102 -102
  92. package/Database/Drivers/SQLite/SqliteDriver.js.map +1 -1
  93. package/Database/Drivers/SQLite/index.d.ts +2 -2
  94. package/Database/Drivers/SQLite/index.js +26 -26
  95. package/Database/Drivers/SchemaContract.d.ts +8 -8
  96. package/Database/Drivers/SchemaContract.js +9 -9
  97. package/Database/Drivers/Statement.d.ts +9 -9
  98. package/Database/Drivers/Statement.js +15 -15
  99. package/Database/Drivers/index.d.ts +4 -4
  100. package/Database/Drivers/index.js +16 -16
  101. package/Database/Entity.d.ts +64 -64
  102. package/Database/Entity.d.ts.map +1 -1
  103. package/Database/Entity.js +251 -252
  104. package/Database/Entity.js.map +1 -1
  105. package/Database/EntityNotFoundError.d.ts +5 -5
  106. package/Database/EntityNotFoundError.js +10 -10
  107. package/Database/EntityProxyHandler.d.ts +5 -5
  108. package/Database/EntityProxyHandler.js +30 -30
  109. package/Database/EntityQuery.d.ts +28 -28
  110. package/Database/EntityQuery.js +156 -156
  111. package/Database/Expression.d.ts +3 -3
  112. package/Database/Expression.js +6 -6
  113. package/Database/Fields.d.ts +155 -155
  114. package/Database/Fields.js +544 -548
  115. package/Database/Fields.js.map +1 -1
  116. package/Database/Helpers.d.ts +1 -1
  117. package/Database/Helpers.js +16 -16
  118. package/Database/List.d.ts +24 -24
  119. package/Database/List.d.ts.map +1 -1
  120. package/Database/List.js +49 -49
  121. package/Database/List.js.map +1 -1
  122. package/Database/Migrations/Migration.d.ts +7 -7
  123. package/Database/Migrations/Migration.js +9 -9
  124. package/Database/Migrations/MigrationHistory.d.ts +8 -8
  125. package/Database/Migrations/MigrationHistory.js +38 -38
  126. package/Database/Migrations/Migrator.d.ts +20 -20
  127. package/Database/Migrations/Migrator.js +117 -118
  128. package/Database/Migrations/Migrator.js.map +1 -1
  129. package/Database/Migrations/index.d.ts +3 -3
  130. package/Database/Migrations/index.js +15 -15
  131. package/Database/ORM/BaseRelationship.d.ts +7 -7
  132. package/Database/ORM/BaseRelationship.js +10 -10
  133. package/Database/Query.d.ts +62 -62
  134. package/Database/Query.d.ts.map +1 -1
  135. package/Database/Query.js +265 -264
  136. package/Database/Query.js.map +1 -1
  137. package/Database/Seeders/Seeder.d.ts +3 -3
  138. package/Database/Seeders/Seeder.js +6 -6
  139. package/Database/Seeders/SeederManager.d.ts +8 -8
  140. package/Database/Seeders/SeederManager.js +24 -24
  141. package/Database/Seeders/index.d.ts +2 -2
  142. package/Database/Seeders/index.js +14 -14
  143. package/Database/StringExpression.d.ts +6 -6
  144. package/Database/StringExpression.js +14 -14
  145. package/Database/Types.d.ts +117 -117
  146. package/Database/Types.d.ts.map +1 -1
  147. package/Database/Types.js +94 -94
  148. package/Database/Types.js.map +1 -1
  149. package/Database/index.d.ts +20 -20
  150. package/Database/index.js +20 -20
  151. package/Encryption/index.d.ts +15 -15
  152. package/Encryption/index.js +53 -53
  153. package/Encryption/index.js.map +1 -1
  154. package/Forms/Decorators.d.ts +6 -6
  155. package/Forms/Decorators.js +28 -28
  156. package/Forms/Form.d.ts +17 -17
  157. package/Forms/Form.js +69 -69
  158. package/Forms/FormFields.d.ts +9 -9
  159. package/Forms/FormFields.js +35 -35
  160. package/Forms/index.d.ts +3 -3
  161. package/Forms/index.js +15 -15
  162. package/Framework/App.d.ts +6 -6
  163. package/Framework/App.js +9 -9
  164. package/Framework/Application.d.ts +17 -17
  165. package/Framework/Application.d.ts.map +1 -1
  166. package/Framework/Application.js +93 -93
  167. package/Framework/Application.js.map +1 -1
  168. package/Framework/Auth/Auth.d.ts +24 -24
  169. package/Framework/Auth/Auth.js +108 -108
  170. package/Framework/Auth/Authenticatable.d.ts +6 -6
  171. package/Framework/Auth/Authenticatable.js +2 -2
  172. package/Framework/Auth/User.d.ts +10 -10
  173. package/Framework/Auth/User.js +37 -37
  174. package/Framework/Auth/index.d.ts +5 -5
  175. package/Framework/Auth/index.d.ts.map +1 -1
  176. package/Framework/Auth/index.js +45 -45
  177. package/Framework/Auth/index.js.map +1 -1
  178. package/Framework/Config/AppConfig.d.ts +19 -18
  179. package/Framework/Config/AppConfig.d.ts.map +1 -1
  180. package/Framework/Config/AppConfig.js +12 -11
  181. package/Framework/Config/AppConfig.js.map +1 -1
  182. package/Framework/Config/AuthConfig.d.ts +8 -8
  183. package/Framework/Config/AuthConfig.js +7 -7
  184. package/Framework/Config/BaseConfig.d.ts +6 -6
  185. package/Framework/Config/BaseConfig.js +12 -12
  186. package/Framework/Config/CacheConfig.d.ts +16 -0
  187. package/Framework/Config/CacheConfig.d.ts.map +1 -0
  188. package/Framework/Config/CacheConfig.js +22 -0
  189. package/Framework/Config/CacheConfig.js.map +1 -0
  190. package/Framework/Config/DatabaseConfig.d.ts +10 -10
  191. package/Framework/Config/DatabaseConfig.js +24 -25
  192. package/Framework/Config/DatabaseConfig.js.map +1 -1
  193. package/Framework/Config/MailConfig.d.ts +19 -0
  194. package/Framework/Config/MailConfig.d.ts.map +1 -0
  195. package/Framework/Config/MailConfig.js +12 -0
  196. package/Framework/Config/MailConfig.js.map +1 -0
  197. package/Framework/Config/index.d.ts +6 -4
  198. package/Framework/Config/index.d.ts.map +1 -1
  199. package/Framework/Config/index.js +18 -16
  200. package/Framework/Config/index.js.map +1 -1
  201. package/Framework/Middleware/AuthMiddleware.d.ts +7 -7
  202. package/Framework/Middleware/AuthMiddleware.js +62 -63
  203. package/Framework/Middleware/AuthMiddleware.js.map +1 -1
  204. package/Framework/Middleware/CorsMiddleware.d.ts +6 -6
  205. package/Framework/Middleware/CorsMiddleware.d.ts.map +1 -1
  206. package/Framework/Middleware/CorsMiddleware.js +44 -43
  207. package/Framework/Middleware/CorsMiddleware.js.map +1 -1
  208. package/Framework/Middleware/StaticAssetsMiddleware.d.ts +14 -14
  209. package/Framework/Middleware/StaticAssetsMiddleware.js +103 -104
  210. package/Framework/Middleware/StaticAssetsMiddleware.js.map +1 -1
  211. package/Framework/Middleware/index.d.ts +2 -2
  212. package/Framework/Middleware/index.js +14 -14
  213. package/Framework/Provider.d.ts +5 -5
  214. package/Framework/Provider.js +20 -20
  215. package/Framework/Providers/CacheProvider.d.ts +7 -0
  216. package/Framework/Providers/CacheProvider.d.ts.map +1 -0
  217. package/Framework/Providers/CacheProvider.js +39 -0
  218. package/Framework/Providers/CacheProvider.js.map +1 -0
  219. package/Framework/Providers/DatabaseProvider.d.ts +9 -9
  220. package/Framework/Providers/DatabaseProvider.js +63 -63
  221. package/Framework/Providers/MailProvider.d.ts +7 -0
  222. package/Framework/Providers/MailProvider.d.ts.map +1 -0
  223. package/Framework/Providers/MailProvider.js +40 -0
  224. package/Framework/Providers/MailProvider.js.map +1 -0
  225. package/Framework/Providers/WebsocketsProvider.d.ts +12 -12
  226. package/Framework/Providers/WebsocketsProvider.d.ts.map +1 -1
  227. package/Framework/Providers/WebsocketsProvider.js +118 -122
  228. package/Framework/Providers/WebsocketsProvider.js.map +1 -1
  229. package/Framework/Resolvers/AuthResolver.d.ts +5 -5
  230. package/Framework/Resolvers/AuthResolver.js +14 -14
  231. package/Framework/Resolvers/EntityResolver.d.ts +9 -9
  232. package/Framework/Resolvers/EntityResolver.js +39 -40
  233. package/Framework/Resolvers/EntityResolver.js.map +1 -1
  234. package/Framework/Resolvers/FormResolver.d.ts +9 -9
  235. package/Framework/Resolvers/FormResolver.js +32 -32
  236. package/Framework/RootDir.d.ts +2 -2
  237. package/Framework/RootDir.js +6 -6
  238. package/Framework/index.d.ts +8 -6
  239. package/Framework/index.d.ts.map +1 -1
  240. package/Framework/index.js +20 -18
  241. package/Framework/index.js.map +1 -1
  242. package/Frontend/Angular/index.d.ts +8 -0
  243. package/Frontend/Angular/index.d.ts.map +1 -0
  244. package/Frontend/Angular/index.js +20 -0
  245. package/Frontend/Angular/index.js.map +1 -0
  246. package/Frontend/Websockets/index.js +76 -0
  247. package/Frontend/Websockets/index.js.map +1 -0
  248. package/LICENSE.md +20 -20
  249. package/Mail/MailAddress.d.ts +5 -0
  250. package/Mail/MailAddress.d.ts.map +1 -0
  251. package/Mail/MailAddress.js +3 -0
  252. package/Mail/MailAddress.js.map +1 -0
  253. package/Mail/MailTransport.d.ts +6 -0
  254. package/Mail/MailTransport.d.ts.map +1 -0
  255. package/Mail/MailTransport.js +7 -0
  256. package/Mail/MailTransport.js.map +1 -0
  257. package/Mail/Mailable.d.ts +18 -0
  258. package/Mail/Mailable.d.ts.map +1 -0
  259. package/Mail/Mailable.js +10 -0
  260. package/Mail/Mailable.js.map +1 -0
  261. package/Mail/Mailer.d.ts +12 -0
  262. package/Mail/Mailer.d.ts.map +1 -0
  263. package/Mail/Mailer.js +25 -0
  264. package/Mail/Mailer.js.map +1 -0
  265. package/Mail/PendingMail.d.ts +30 -0
  266. package/Mail/PendingMail.d.ts.map +1 -0
  267. package/Mail/PendingMail.js +53 -0
  268. package/Mail/PendingMail.js.map +1 -0
  269. package/Mail/SentMessage.d.ts +16 -0
  270. package/Mail/SentMessage.d.ts.map +1 -0
  271. package/Mail/SentMessage.js +13 -0
  272. package/Mail/SentMessage.js.map +1 -0
  273. package/Mail/Transports/MemoryTransport.d.ts +8 -0
  274. package/Mail/Transports/MemoryTransport.d.ts.map +1 -0
  275. package/Mail/Transports/MemoryTransport.js +18 -0
  276. package/Mail/Transports/MemoryTransport.js.map +1 -0
  277. package/Mail/Transports/SendGridTransport.d.ts +11 -0
  278. package/Mail/Transports/SendGridTransport.d.ts.map +1 -0
  279. package/Mail/Transports/SendGridTransport.js +59 -0
  280. package/Mail/Transports/SendGridTransport.js.map +1 -0
  281. package/Mail/index.d.ts +4 -0
  282. package/Mail/index.d.ts.map +1 -0
  283. package/Mail/index.js +16 -0
  284. package/Mail/index.js.map +1 -0
  285. package/Models/Model.d.ts +9 -9
  286. package/Models/Model.js +35 -35
  287. package/Models/Model.js.map +1 -1
  288. package/Models/index.d.ts +21 -21
  289. package/Models/index.d.ts.map +1 -1
  290. package/Models/index.js +58 -58
  291. package/Models/index.js.map +1 -1
  292. package/Router/BaseController.d.ts +4 -4
  293. package/Router/BaseController.js +20 -20
  294. package/Router/Decorators.d.ts +21 -21
  295. package/Router/Decorators.js +170 -170
  296. package/Router/Guard.d.ts +4 -4
  297. package/Router/Guard.js +10 -10
  298. package/Router/Http/Contracts.d.ts +3 -3
  299. package/Router/Http/Contracts.js +2 -2
  300. package/Router/Http/ErrorHandler.d.ts +9 -9
  301. package/Router/Http/ErrorHandler.js +51 -51
  302. package/Router/Http/ErrorHandlerInterface.d.ts +5 -5
  303. package/Router/Http/ErrorHandlerInterface.js +6 -6
  304. package/Router/Http/Errors/HttpError.d.ts +7 -7
  305. package/Router/Http/Errors/HttpError.js +15 -15
  306. package/Router/Http/Handler.d.ts +15 -15
  307. package/Router/Http/Handler.d.ts.map +1 -1
  308. package/Router/Http/Handler.js +131 -131
  309. package/Router/Http/Handler.js.map +1 -1
  310. package/Router/Http/Request.d.ts +27 -22
  311. package/Router/Http/Request.d.ts.map +1 -1
  312. package/Router/Http/Request.js +185 -151
  313. package/Router/Http/Request.js.map +1 -1
  314. package/Router/Http/Response.d.ts +18 -17
  315. package/Router/Http/Response.d.ts.map +1 -1
  316. package/Router/Http/Response.js +42 -51
  317. package/Router/Http/Response.js.map +1 -1
  318. package/Router/Http/index.d.ts +83 -83
  319. package/Router/Http/index.js +99 -99
  320. package/Router/Metadata.d.ts +31 -31
  321. package/Router/Metadata.js +25 -25
  322. package/Router/Middleware.d.ts +5 -5
  323. package/Router/Middleware.js +2 -2
  324. package/Router/Route.d.ts +23 -23
  325. package/Router/Route.js +110 -110
  326. package/Router/RouteNotFoundError.d.ts +3 -3
  327. package/Router/RouteNotFoundError.js +9 -9
  328. package/Router/Router.d.ts +12 -12
  329. package/Router/Router.js +32 -32
  330. package/Router/Servers/index.d.ts +5 -0
  331. package/Router/Servers/index.d.ts.map +1 -0
  332. package/Router/Servers/index.js +15 -0
  333. package/Router/Servers/index.js.map +1 -0
  334. package/Router/Servers/node.d.ts +3 -0
  335. package/Router/Servers/node.d.ts.map +1 -0
  336. package/Router/Servers/node.js +15 -0
  337. package/Router/Servers/node.js.map +1 -0
  338. package/Router/Servers/uNetworking.d.ts +3 -0
  339. package/Router/Servers/uNetworking.d.ts.map +1 -0
  340. package/Router/Servers/uNetworking.js +33 -0
  341. package/Router/Servers/uNetworking.js.map +1 -0
  342. package/Router/Websockets/Handler.d.ts +12 -12
  343. package/Router/Websockets/Handler.d.ts.map +1 -1
  344. package/Router/Websockets/Handler.js +59 -59
  345. package/Router/Websockets/Handler.js.map +1 -1
  346. package/Router/Websockets/WebsocketEvent.d.ts +15 -15
  347. package/Router/Websockets/WebsocketEvent.js +52 -53
  348. package/Router/Websockets/WebsocketEvent.js.map +1 -1
  349. package/Router/Websockets/index.d.ts +16 -16
  350. package/Router/Websockets/index.d.ts.map +1 -1
  351. package/Router/Websockets/index.js +57 -57
  352. package/Router/Websockets/index.js.map +1 -1
  353. package/Router/Websockets/types.d.ts +20 -20
  354. package/Router/Websockets/types.d.ts.map +1 -1
  355. package/Router/Websockets/types.js +8 -8
  356. package/Router/index.d.ts +6 -6
  357. package/Router/index.js +18 -18
  358. package/Router/micro.d.ts +3 -0
  359. package/Router/micro.d.ts.map +1 -0
  360. package/Router/micro.js +44 -0
  361. package/Router/micro.js.map +1 -0
  362. package/Storage/File.d.ts +11 -11
  363. package/Storage/File.js +46 -46
  364. package/Storage/Image.d.ts +3 -3
  365. package/Storage/Image.js +7 -7
  366. package/Storage/InvalidImage.d.ts +3 -3
  367. package/Storage/InvalidImage.js +7 -7
  368. package/Storage/Storage.d.ts +13 -12
  369. package/Storage/Storage.d.ts.map +1 -1
  370. package/Storage/Storage.js +104 -110
  371. package/Storage/Storage.js.map +1 -1
  372. package/Storage/index.d.ts +4 -4
  373. package/Storage/index.js +16 -16
  374. package/Storage/utils.d.ts +5 -5
  375. package/Storage/utils.js +20 -20
  376. package/Support/Array.d.ts +28 -28
  377. package/Support/Array.d.ts.map +1 -1
  378. package/Support/Array.js +111 -108
  379. package/Support/Array.js.map +1 -1
  380. package/Support/Math.d.ts +6 -6
  381. package/Support/Math.js +7 -7
  382. package/Support/Metadata.d.ts +15 -14
  383. package/Support/Metadata.d.ts.map +1 -1
  384. package/Support/Metadata.js +31 -20
  385. package/Support/Metadata.js.map +1 -1
  386. package/Support/String.d.ts +11 -11
  387. package/Support/String.js +23 -23
  388. package/Support/index.d.ts +14 -13
  389. package/Support/index.d.ts.map +1 -1
  390. package/Support/index.js +6 -5
  391. package/Support/index.js.map +1 -1
  392. package/Support/utils.d.ts +2 -0
  393. package/Support/utils.d.ts.map +1 -0
  394. package/Support/utils.js +13 -0
  395. package/Support/utils.js.map +1 -0
  396. package/Testing/TestCase.d.ts +32 -32
  397. package/Testing/TestCase.js +129 -130
  398. package/Testing/TestCase.js.map +1 -1
  399. package/Validation/Rule.d.ts +6 -6
  400. package/Validation/Rule.js +6 -6
  401. package/Validation/RuleInterface.d.ts +6 -6
  402. package/Validation/RuleInterface.js +2 -2
  403. package/Validation/Rules/Email.d.ts +3 -3
  404. package/Validation/Rules/Email.js +20 -20
  405. package/Validation/Rules/Email.js.map +1 -1
  406. package/Validation/Rules/FileExtension.d.ts +3 -3
  407. package/Validation/Rules/FileExtension.js +22 -22
  408. package/Validation/Rules/FileExtension.js.map +1 -1
  409. package/Validation/Rules/MaxLength.d.ts +3 -3
  410. package/Validation/Rules/MaxLength.js +19 -19
  411. package/Validation/Rules/MaxLength.js.map +1 -1
  412. package/Validation/Rules/MinLength.d.ts +3 -3
  413. package/Validation/Rules/MinLength.js +19 -19
  414. package/Validation/Rules/MinLength.js.map +1 -1
  415. package/Validation/Rules/Optional.d.ts +3 -3
  416. package/Validation/Rules/Optional.js +19 -19
  417. package/Validation/Rules/Required.d.ts +3 -3
  418. package/Validation/Rules/Required.js +26 -26
  419. package/Validation/Rules/Required.js.map +1 -1
  420. package/Validation/Validator.d.ts +11 -11
  421. package/Validation/Validator.js +10 -10
  422. package/Validation/index.d.ts +9 -9
  423. package/Validation/index.js +21 -21
  424. package/benchmark-index.js.map +1 -0
  425. package/benchmark.js.map +1 -0
  426. package/index.d.ts +2 -0
  427. package/index.d.ts.map +1 -0
  428. package/index.js +41 -0
  429. package/index.js.map +1 -0
  430. package/package.json +70 -64
  431. package/test.js.map +1 -0
  432. package/tests/Cache/DatabaseStoreTest.d.ts +2 -0
  433. package/tests/Cache/DatabaseStoreTest.d.ts.map +1 -0
  434. package/tests/Cache/DatabaseStoreTest.js +137 -0
  435. package/tests/Cache/DatabaseStoreTest.js.map +1 -0
  436. package/tests/Cache/FileStoreTest.d.ts +2 -0
  437. package/tests/Cache/FileStoreTest.d.ts.map +1 -0
  438. package/tests/Cache/FileStoreTest.js +142 -0
  439. package/tests/Cache/FileStoreTest.js.map +1 -0
  440. package/tests/Cache/MemoryStoreTest.d.ts +2 -0
  441. package/tests/Cache/MemoryStoreTest.d.ts.map +1 -0
  442. package/tests/Cache/MemoryStoreTest.js +141 -0
  443. package/tests/Cache/MemoryStoreTest.js.map +1 -0
  444. package/tests/Container/ContainerTest.d.ts +1 -1
  445. package/tests/Container/ContainerTest.js +395 -395
  446. package/tests/Database/Drivers/MySQL/AlterTest.d.ts +1 -1
  447. package/tests/Database/Drivers/MySQL/AlterTest.js +135 -135
  448. package/tests/Database/Drivers/MySQL/CreateTest.d.ts +1 -1
  449. package/tests/Database/Drivers/MySQL/CreateTest.js +57 -57
  450. package/tests/Database/Drivers/MysqlDriverTest.d.ts +1 -1
  451. package/tests/Database/Drivers/MysqlDriverTest.js +149 -149
  452. package/tests/Database/Drivers/SqliteDriverTest.d.ts +1 -1
  453. package/tests/Database/Drivers/SqliteDriverTest.js +135 -135
  454. package/tests/Database/Entities/Article.d.ts +10 -10
  455. package/tests/Database/Entities/Article.js +42 -42
  456. package/tests/Database/Entities/Profile.d.ts +10 -10
  457. package/tests/Database/Entities/Profile.js +38 -38
  458. package/tests/Database/Entities/Role.d.ts +8 -8
  459. package/tests/Database/Entities/Role.js +30 -30
  460. package/tests/Database/Entities/User.d.ts +15 -15
  461. package/tests/Database/Entities/User.js +57 -57
  462. package/tests/Database/EntityRelationshipsTest.d.ts +1 -1
  463. package/tests/Database/EntityRelationshipsTest.js +547 -552
  464. package/tests/Database/EntityRelationshipsTest.js.map +1 -1
  465. package/tests/Database/EntityTest.d.ts +1 -1
  466. package/tests/Database/EntityTest.js +233 -233
  467. package/tests/Database/Migrations/RunnerTest.d.ts +1 -1
  468. package/tests/Database/Migrations/RunnerTest.js +111 -111
  469. package/tests/Database/Migrations/migrations/1.createUserTable.d.ts +5 -5
  470. package/tests/Database/Migrations/migrations/1.createUserTable.js +13 -13
  471. package/tests/Database/Migrations/migrations/2.createArticlesTable.d.ts +5 -5
  472. package/tests/Database/Migrations/migrations/2.createArticlesTable.js +13 -13
  473. package/tests/Database/QueryTest.d.ts +1 -1
  474. package/tests/Database/QueryTest.js +622 -622
  475. package/tests/Database/SchemaTest.d.ts +1 -1
  476. package/tests/Database/SchemaTest.js +45 -45
  477. package/tests/Database/Seeders/RunnerTest.d.ts +1 -1
  478. package/tests/Database/Seeders/RunnerTest.js +43 -43
  479. package/tests/Database/Seeders/RunnerTest.js.map +1 -1
  480. package/tests/Database/Seeders/seeders/RandomSeeder.d.ts +4 -4
  481. package/tests/Database/Seeders/seeders/RandomSeeder.js +13 -13
  482. package/tests/Database/utils.d.ts +5 -5
  483. package/tests/Database/utils.js +18 -18
  484. package/tests/Forms/FormsTest.d.ts +1 -1
  485. package/tests/Forms/FormsTest.js +79 -79
  486. package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.d.ts +1 -1
  487. package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.js +165 -165
  488. package/tests/Framework/Resolvers/EntityResolverTest.d.ts +1 -1
  489. package/tests/Framework/Resolvers/EntityResolverTest.js +59 -59
  490. package/tests/Mail/MailerTest.d.ts +2 -0
  491. package/tests/Mail/MailerTest.d.ts.map +1 -0
  492. package/tests/Mail/MailerTest.js +98 -0
  493. package/tests/Mail/MailerTest.js.map +1 -0
  494. package/tests/Model/ModelTest.d.ts +1 -1
  495. package/tests/Model/ModelTest.js +233 -233
  496. package/tests/Router/HttpHandlerTest.d.ts +1 -1
  497. package/tests/Router/HttpHandlerTest.js +36 -36
  498. package/tests/Router/WebSocketsHandlerTest.d.ts +1 -1
  499. package/tests/Router/WebSocketsHandlerTest.js +35 -35
  500. package/tests/Support/ArrayTest.d.ts +1 -1
  501. package/tests/Support/ArrayTest.js +258 -258
  502. package/tests/Support/StringTest.d.ts +1 -1
  503. package/tests/Support/StringTest.js +38 -38
  504. package/tests/Validation/RulesTest.d.ts +1 -1
  505. package/tests/Validation/RulesTest.js +67 -67
  506. package/Database/Drivers/SQL/Statements/Create.d.ts +0 -7
  507. package/Database/Drivers/SQL/Statements/Create.d.ts.map +0 -1
  508. package/Database/Drivers/SQL/Statements/Create.js +0 -22
  509. package/Database/Drivers/SQL/Statements/Create.js.map +0 -1
@@ -1,549 +1,545 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BelongsToMany = exports.HasMany = exports.HasOne = exports.BelongsTo = exports.BelongsToManyField = exports.BelongsToField = exports.HasManyField = exports.HasOneField = exports.InverseRelationship = exports.RelationshipField = exports.PrimaryField = exports.InverseField = exports.JSONField = exports.ColumnField = void 0;
4
- const Entity_1 = require("./Entity");
5
- const index_1 = require("./index");
6
- const List_1 = require("./List");
7
- const BaseRelationship_1 = require("./ORM/BaseRelationship");
8
- const Helpers_1 = require("./Helpers");
9
- class ColumnField {
10
- constructor(entity, property, type, column) {
11
- this.entity = entity;
12
- this.property = property;
13
- this.type = type;
14
- this.column = column;
15
- }
16
- value(entity, key) {
17
- return entity[key];
18
- }
19
- set(target, value) {
20
- target[this.property] = value;
21
- }
22
- }
23
- exports.ColumnField = ColumnField;
24
- class JSONField extends ColumnField {
25
- value(entity, key) {
26
- return JSON.stringify(entity[key]);
27
- }
28
- set(target, value) {
29
- target[this.property] = typeof value === 'string' ? JSON.parse(value) : undefined;
30
- }
31
- }
32
- exports.JSONField = JSONField;
33
- class InverseField {
34
- constructor(entity, property, type) {
35
- this.entity = entity;
36
- this.property = property;
37
- this.type = type;
38
- }
39
- value(entity, key) {
40
- return entity[key];
41
- }
42
- }
43
- exports.InverseField = InverseField;
44
- class PrimaryField extends ColumnField {
45
- }
46
- exports.PrimaryField = PrimaryField;
47
- class RelationshipField extends ColumnField {
48
- constructor(entity, property, type, inverseBy, column) {
49
- super(entity, property, type, column);
50
- this.type = type;
51
- this.inverseBy = inverseBy;
52
- }
53
- get related() {
54
- return this.type();
55
- }
56
- }
57
- exports.RelationshipField = RelationshipField;
58
- class InverseRelationship extends InverseField {
59
- constructor(entity, property, type, inverseBy) {
60
- super(entity, property, type);
61
- this.type = type;
62
- this.inverseBy = inverseBy;
63
- }
64
- get related() {
65
- return this.type();
66
- }
67
- }
68
- exports.InverseRelationship = InverseRelationship;
69
- class HasOneField extends InverseRelationship {
70
- constructor(entity, property, type, inverseBy // TODO make it key of R
71
- ) {
72
- super(entity, property, type, inverseBy);
73
- this.relationClass = HasOne;
74
- }
75
- set(target, value) {
76
- target[this.property].set(value);
77
- }
78
- async getRelatedValue(relatedEntities, eagerLoad, customQuery) {
79
- const parentIds = relatedEntities.pluck(this.entity.getPrimaryKey());
80
- const inverseByField = this.related.metadata.relationships[this.inverseBy];
81
- const query = this.related.with(...eagerLoad).whereIn(inverseByField.column, parentIds);
82
- customQuery === null || customQuery === void 0 ? void 0 : customQuery(query);
83
- return await query.get();
84
- }
85
- async getRelatedCount(relatedEntities, customQuery) {
86
- const relatedField = this.related.metadata.relationships[this.inverseBy];
87
- const query = this.related.newQuery()
88
- .whereIn(relatedField.column, relatedEntities.pluck(this.entity.getPrimaryKey()))
89
- .select(relatedField.column)
90
- .groupBy(relatedField.column);
91
- customQuery === null || customQuery === void 0 ? void 0 : customQuery(query);
92
- return await query
93
- .selectCount()
94
- .get();
95
- }
96
- match(entities, relatedEntities) {
97
- entities.forEach(entity => {
98
- const inverseField = this.related.metadata.relationships[this.inverseBy];
99
- const relatedEntity = relatedEntities.find(related => related.original[inverseField.column] === entity[this.entity.getPrimaryKey()]);
100
- // TODO fix these weird types. Get rid of `unknown`
101
- entity[this.property].set(relatedEntity);
102
- });
103
- return entities;
104
- }
105
- matchCounts(entities, counts) {
106
- const relatedField = this.related.metadata.relationships[this.inverseBy];
107
- entities.forEach(entity => {
108
- var _a;
109
- const count = counts.find(item => item.original[relatedField.column] === entity[this.entity.getPrimaryKey()]);
110
- entity[this.property + 'Count'] = ((_a = count === null || count === void 0 ? void 0 : count.original.aggregate) !== null && _a !== void 0 ? _a : 0);
111
- });
112
- return entities;
113
- }
114
- }
115
- exports.HasOneField = HasOneField;
116
- class HasManyField extends InverseRelationship {
117
- constructor(entity, property, type, inverseBy) {
118
- super(entity, property, type, inverseBy);
119
- this.inverseBy = inverseBy;
120
- this.relationClass = HasMany;
121
- }
122
- set(target, value) {
123
- }
124
- async getRelatedValue(relatedEntities, eagerLoad, customQuery) {
125
- const parentIds = relatedEntities.pluck(this.entity.getPrimaryKey());
126
- const inverseByField = this.related.metadata.relationships[this.inverseBy];
127
- const query = this.related.with(...eagerLoad).whereIn(inverseByField.column, parentIds);
128
- customQuery === null || customQuery === void 0 ? void 0 : customQuery(query);
129
- return await query.get();
130
- }
131
- async getRelatedCount(relatedEntities, customQuery) {
132
- const relatedField = this.related.metadata.relationships[this.inverseBy];
133
- const query = this.related.newQuery()
134
- .whereIn(relatedField.column, relatedEntities.pluck(this.entity.getPrimaryKey()))
135
- .select(relatedField.column)
136
- .groupBy(relatedField.column);
137
- customQuery === null || customQuery === void 0 ? void 0 : customQuery(query);
138
- return await query
139
- .selectCount()
140
- .get();
141
- }
142
- match(entities, relatedEntities) {
143
- entities.forEach(entity => {
144
- const inverseField = this.related.metadata.relationships[this.inverseBy];
145
- const relatedEntity = relatedEntities.filter(related => related.original[inverseField.column] === entity[this.entity.getPrimaryKey()]);
146
- // TODO fix these weird types. Get rid of `unknown`
147
- entity[this.property].items = relatedEntity;
148
- });
149
- return entities;
150
- }
151
- matchCounts(entities, counts) {
152
- const relatedField = this.related.metadata.relationships[this.inverseBy];
153
- entities.forEach(entity => {
154
- var _a;
155
- const count = counts.find(item => item.original[relatedField.column] === entity[this.entity.getPrimaryKey()]);
156
- entity[this.property + 'Count'] = ((_a = count === null || count === void 0 ? void 0 : count.original.aggregate) !== null && _a !== void 0 ? _a : 0);
157
- });
158
- return entities;
159
- }
160
- async save(items, parent) {
161
- const entities = [];
162
- for await (const item of items) {
163
- const entity = item instanceof Entity_1.Entity ? item : this.type().new(item);
164
- entity.fill({
165
- [this.inverseBy]: parent
166
- });
167
- await entity.save();
168
- entities.push(entity);
169
- }
170
- return entities;
171
- }
172
- getQuery(parent) {
173
- const inverseField = this.related.metadata.relationships[this.inverseBy];
174
- return this.type().newQuery().where(inverseField.column, parent[parent.getPrimaryKey()]);
175
- }
176
- }
177
- exports.HasManyField = HasManyField;
178
- class BelongsToField extends RelationshipField {
179
- constructor(entity, property, type, inverseBy, column) {
180
- super(entity, property, type, inverseBy, column || property + entity.getPrimaryKey().capitalize());
181
- this.relationClass = BelongsTo;
182
- }
183
- set(target, value) {
184
- target[this.property].set(value);
185
- }
186
- update(target) {
187
- target[this.property].update();
188
- }
189
- value(entity, key) {
190
- const field = entity[key];
191
- const instance = field.get();
192
- if (instance) {
193
- return instance[this.related.getPrimaryKey()];
194
- }
195
- // return new this.related({
196
- // [this.related.getPrimaryKey()]: entity[key as K]
197
- // }) as unknown as T[K]; // TODO get rid of `unknown`
198
- // if (key === this.column) {
199
- // return new this.related({
200
- // [this.related.getPrimaryKey()]: entity[key as K]
201
- // }) as unknown as T[K]; // TODO get rid of `unknown`
202
- // }
203
- // return entity[this.property as keyof T] as unknown as T[K];
204
- }
205
- async getRelatedValue(parents, eagerLoad, customQuery) {
206
- const relationIds = parents
207
- .map(parent => {
208
- const relation = parent[this.property].get();
209
- return relation === null || relation === void 0 ? void 0 : relation[relation.getPrimaryKey()];
210
- })
211
- .filter(Boolean);
212
- if (relationIds.length) {
213
- const query = this.related.with(...eagerLoad).whereIn(this.related.getPrimaryKey(), relationIds);
214
- if (customQuery) {
215
- customQuery(query);
216
- }
217
- return await query.get();
218
- }
219
- return [];
220
- }
221
- async getRelatedCount(relatedEntities, customQuery) {
222
- return [];
223
- }
224
- match(entities, relatedEntities) {
225
- return entities.map(entity => {
226
- // TODO fix these weird types. Get rid of `unknown`
227
- const related = entity[this.property].get();
228
- const value = related === null || related === void 0 ? void 0 : related[related.getPrimaryKey()];
229
- if (value) {
230
- const instance = relatedEntities.findWhere(this.related.getPrimaryKey(), value);
231
- if (instance) {
232
- this.set(entity, instance);
233
- }
234
- }
235
- return entity;
236
- });
237
- }
238
- matchCounts(entities, counts) {
239
- return entities;
240
- }
241
- getQuery(parent) {
242
- return this.entity.newQuery().where(this.column, parent[parent.getPrimaryKey()]);
243
- }
244
- async save(items, parent) {
245
- const entities = [];
246
- for await (const item of items) {
247
- const entity = item instanceof Entity_1.Entity ? item : this.entity.new(item);
248
- entity.fill({
249
- [this.property]: parent
250
- });
251
- await entity.save();
252
- entities.push(entity);
253
- }
254
- return entities;
255
- }
256
- }
257
- exports.BelongsToField = BelongsToField;
258
- class BelongsToManyField extends InverseRelationship {
259
- constructor(entity, property, type, inverseBy, table, parentColumn, relatedColumn) {
260
- super(entity, property, type, inverseBy);
261
- this.table = table;
262
- this.parentColumn = parentColumn;
263
- this.relatedColumn = relatedColumn;
264
- this.relationClass = BelongsToMany;
265
- }
266
- set(target, value) {
267
- }
268
- async getRelatedValue(parents, eagerLoad, customQuery) {
269
- const parentIds = parents.pluck(this.entity.getPrimaryKey());
270
- const relatedForeignKey = `${Helpers_1.wrap(this.getPivotTable())}.${this.getRelatedForeignKey()}`;
271
- const parentForeignKey = `${Helpers_1.wrap(this.getPivotTable())}.${this.getParentForeignKey()}`;
272
- const relatedKey = `${Helpers_1.wrap(this.related.getTable())}.${this.related.getPrimaryKey()}`;
273
- const query = this.related
274
- .with(...eagerLoad)
275
- .addSelect(new index_1.StringExpression(`${Helpers_1.wrap(this.related.getTable())}.*`), new index_1.StringExpression(relatedForeignKey), new index_1.StringExpression(parentForeignKey))
276
- .join(this.getPivotTable(), relatedForeignKey, '=', relatedKey)
277
- .whereIn(parentForeignKey, parentIds.unique());
278
- customQuery === null || customQuery === void 0 ? void 0 : customQuery(query);
279
- const results = await query.get();
280
- return results.map(entity => {
281
- entity.original.pivot = {
282
- [this.getParentForeignKey()]: entity.original[this.getParentForeignKey()],
283
- [this.getRelatedForeignKey()]: entity.original[this.getRelatedForeignKey()],
284
- };
285
- delete entity.original[this.getParentForeignKey()];
286
- delete entity.original[this.getRelatedForeignKey()];
287
- return entity;
288
- });
289
- }
290
- getParentForeignKey() {
291
- return this.parentColumn || `${this.entity.name.toLocaleLowerCase()}${this.entity.getPrimaryKey().capitalize()}`;
292
- }
293
- getRelatedForeignKey() {
294
- return this.relatedColumn || `${this.related.name.toLocaleLowerCase()}${this.related.getPrimaryKey().capitalize()}`;
295
- }
296
- async getRelatedCount(relatedEntities, customQuery) {
297
- const query = index_1.Query.table(this.getPivotTable())
298
- .select(this.getParentForeignKey())
299
- .groupBy(this.getParentForeignKey())
300
- .whereIn(this.getParentForeignKey(), relatedEntities.pluck(this.related.getPrimaryKey()));
301
- customQuery === null || customQuery === void 0 ? void 0 : customQuery(query);
302
- return await query.selectCount().get();
303
- }
304
- match(entities, relatedEntities) {
305
- return entities.map(entity => {
306
- const entityPrimaryKey = entity[this.entity.getPrimaryKey()];
307
- entity[this.property].items = relatedEntities
308
- .filter(related => related.original.pivot[this.getParentForeignKey()] === entityPrimaryKey);
309
- return entity;
310
- });
311
- }
312
- matchCounts(entities, counts) {
313
- entities.forEach(entity => {
314
- const foreignKey = this.getParentForeignKey();
315
- const count = counts.find(item => { var _a; return (((_a = item === null || item === void 0 ? void 0 : item.original) === null || _a === void 0 ? void 0 : _a[foreignKey]) || item[foreignKey]) === entity[this.entity.getPrimaryKey()]; });
316
- // @ts-ignore
317
- const aggregateValue = (count === null || count === void 0 ? void 0 : count.aggregate) || (count === null || count === void 0 ? void 0 : count.original.aggregate);
318
- entity[this.property + 'Count'] = (aggregateValue !== null && aggregateValue !== void 0 ? aggregateValue : 0);
319
- });
320
- return entities;
321
- }
322
- getPivotTable() {
323
- return this.table || [this.entity.getTable(), this.related.getTable()].sort().join('_');
324
- }
325
- value(entity, key) {
326
- const value = entity[key];
327
- if (value instanceof Array) {
328
- return value.map(related => {
329
- if (related instanceof Entity_1.Entity) {
330
- return related;
331
- }
332
- const instance = new this.related();
333
- instance[instance.getPrimaryKey()] = related;
334
- return instance;
335
- });
336
- }
337
- return value;
338
- }
339
- async add(items, parent) {
340
- const entities = [];
341
- // tslint:disable-next-line:no-any
342
- const dataToInsert = [];
343
- for await (const item of items) {
344
- dataToInsert.push({
345
- [this.getRelatedForeignKey()]: item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item,
346
- [this.getParentForeignKey()]: parent.getPrimaryKeyValue(),
347
- });
348
- entities.push(this.related.new({ [this.related.getPrimaryKey()]: item }));
349
- }
350
- if (dataToInsert.length) {
351
- await index_1.Query.table(this.getPivotTable()).insert(dataToInsert);
352
- }
353
- return entities;
354
- }
355
- getQuery(parent) {
356
- return this.related.newQuery().whereIn(this.related.getPrimaryKey(), query => {
357
- query.select(this.getRelatedForeignKey())
358
- .table(this.getPivotTable())
359
- .where(this.getParentForeignKey(), parent[parent.getPrimaryKey()]);
360
- });
361
- }
362
- }
363
- exports.BelongsToManyField = BelongsToManyField;
364
- class BelongsTo extends BaseRelationship_1.BaseRelationship {
365
- constructor(relationship, parent) {
366
- super(relationship, parent);
367
- this.update();
368
- }
369
- update() {
370
- const parentId = this.parent.original[this.relationship.column];
371
- if (parentId && !this.instance) {
372
- this.setById(parentId);
373
- }
374
- }
375
- static relationship(metadata, entityClass, property, type, inverseBy, options) {
376
- metadata.relationships[property] = new BelongsToField(entityClass, property, type, inverseBy, options === null || options === void 0 ? void 0 : options.column);
377
- return metadata;
378
- }
379
- get() {
380
- return this.instance;
381
- }
382
- set(instance) {
383
- if (instance instanceof Entity_1.Entity) {
384
- this.instance = instance;
385
- }
386
- else {
387
- this.setById(instance);
388
- }
389
- }
390
- setById(id) {
391
- this.set(this.relationship.related.new({ [this.relationship.related.getPrimaryKey()]: id }));
392
- }
393
- async save(data = {}) {
394
- if (!this.instance) {
395
- return;
396
- }
397
- this.instance.fill({
398
- ...data,
399
- });
400
- await this.instance.save();
401
- return this.instance;
402
- }
403
- toJSON() {
404
- var _a;
405
- return (_a = this.instance) === null || _a === void 0 ? void 0 : _a.toJSON();
406
- }
407
- }
408
- exports.BelongsTo = BelongsTo;
409
- class HasOne extends BaseRelationship_1.BaseRelationship {
410
- static relationship(metadata, entityClass, property, type, inverseBy, options) {
411
- metadata.inverseRelationships[property] = new HasOneField(entityClass, property, type, inverseBy);
412
- return metadata;
413
- }
414
- get() {
415
- return this.instance;
416
- }
417
- set(instance) {
418
- if (!instance) {
419
- return;
420
- }
421
- if (instance instanceof Entity_1.Entity) {
422
- this.instance = instance;
423
- }
424
- else {
425
- this.setById(instance);
426
- }
427
- }
428
- setById(id) {
429
- this.set(this.relationship.related.new({ [this.relationship.related.getPrimaryKey()]: id }));
430
- }
431
- async save(instance = this.instance) {
432
- this.set(instance);
433
- if (instance) {
434
- instance[this.relationship.inverseBy].set(this.parent);
435
- await instance.save();
436
- }
437
- return this.instance;
438
- }
439
- toJSON() {
440
- var _a;
441
- return (_a = this.instance) === null || _a === void 0 ? void 0 : _a.toJSON();
442
- }
443
- }
444
- exports.HasOne = HasOne;
445
- class HasMany extends List_1.List {
446
- constructor(relationship, parent) {
447
- super(relationship, parent);
448
- this.relationship = relationship;
449
- }
450
- static relationship(metadata, entityClass, property, type, inverseBy, options) {
451
- metadata.inverseRelationships[property] = new HasManyField(entityClass, property, type, inverseBy);
452
- return metadata;
453
- }
454
- async save(item) {
455
- const instances = await this.saveMany(item);
456
- return instances.first();
457
- }
458
- async saveMany(...items) {
459
- if (!this.parent.exists) {
460
- await this.parent.save();
461
- }
462
- const instances = await this.relationship.save(items, this.parent);
463
- this.items.push(...instances);
464
- return instances;
465
- }
466
- async clear() {
467
- }
468
- }
469
- exports.HasMany = HasMany;
470
- class BelongsToMany extends List_1.List {
471
- constructor(relationship, parent) {
472
- super(relationship, parent);
473
- this.relationship = relationship;
474
- }
475
- static relationship(metadata, entityClass, property, type, inverseBy, options) {
476
- // options.column = options.column || (property as string) + (entityClass.getPrimaryKey() as string).capitalize();
477
- const inverseField = metadata.inverseRelationships[inverseBy];
478
- metadata.inverseRelationships[property] = new BelongsToManyField(entityClass, property, type, inverseBy, (options === null || options === void 0 ? void 0 : options.table) || (inverseField === null || inverseField === void 0 ? void 0 : inverseField.table), (options === null || options === void 0 ? void 0 : options.foreignColumn) || (inverseField === null || inverseField === void 0 ? void 0 : inverseField.parentColumn), (options === null || options === void 0 ? void 0 : options.column) || (inverseField === null || inverseField === void 0 ? void 0 : inverseField.relatedColumn));
479
- return metadata;
480
- }
481
- async has(item) {
482
- if (item instanceof Entity_1.Entity) {
483
- item = item.getPrimaryKeyValue();
484
- }
485
- const relatedForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getRelatedForeignKey()}`;
486
- const parentForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getParentForeignKey()}`;
487
- return Boolean(await index_1.Query.table(this.relationship.getPivotTable())
488
- .where(parentForeignKey, this.parent[this.parent.getPrimaryKey()])
489
- .andWhere(relatedForeignKey, item)
490
- .first());
491
- }
492
- async add(...items) {
493
- const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
494
- if (!this.parent.exists) {
495
- await this.parent.save();
496
- }
497
- for await (const id of ids) {
498
- if (!(await this.has(id))) {
499
- this.items = this.items.concat(await this.relationship.add(items, this.parent));
500
- }
501
- }
502
- return this.items;
503
- }
504
- async remove(...items) {
505
- const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
506
- const relatedForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getRelatedForeignKey()}`;
507
- const parentForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getParentForeignKey()}`;
508
- await index_1.Query.table(this.relationship.getPivotTable())
509
- .where(parentForeignKey, this.parent[this.parent.getPrimaryKey()])
510
- .whereIn(relatedForeignKey, ids)
511
- .delete();
512
- this.items = this.items.filter(item => !ids.includes(item.getPrimaryKeyValue()));
513
- }
514
- async toggle(...items) {
515
- const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
516
- const attachedEntities = await this.relationship.getQuery(this.parent).get();
517
- const entitiesToDetach = ids.filter(item => attachedEntities.some(entity => entity.getPrimaryKeyValue() === item));
518
- const entitiesToAttach = ids.filter(item => attachedEntities.some(entity => entity.getPrimaryKeyValue() !== item));
519
- await this.add(...entitiesToAttach);
520
- await this.remove(...entitiesToDetach);
521
- }
522
- async clear() {
523
- const relatedForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getRelatedForeignKey()}`;
524
- const parentForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getParentForeignKey()}`;
525
- await index_1.Query.table(this.relationship.getPivotTable())
526
- .where(parentForeignKey, this.parent[this.parent.getPrimaryKey()])
527
- .whereIn(relatedForeignKey, this.items.pluck(this.relationship.related.getPrimaryKey()))
528
- .delete();
529
- this.items = [];
530
- }
531
- async sync(...items) {
532
- const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
533
- const existingItems = await this.get();
534
- const primaryKey = this.relationship.type().getPrimaryKey();
535
- const itemsToRemove = existingItems.filter(item => !ids.includes(item[primaryKey])).pluck(primaryKey);
536
- const restOfItemsToAdd = ids.filter(item => !existingItems.findWhere(primaryKey, item));
537
- await this.remove(...itemsToRemove);
538
- await this.add(...restOfItemsToAdd);
539
- }
540
- async syncWithoutDetaching(...items) {
541
- const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
542
- const existingItems = await this.get();
543
- const primaryKey = this.relationship.type().getPrimaryKey();
544
- const restOfItemsToAdd = ids.filter(item => !existingItems.findWhere(primaryKey, item));
545
- await this.add(...restOfItemsToAdd);
546
- }
547
- }
548
- exports.BelongsToMany = BelongsToMany;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BelongsToMany = exports.HasMany = exports.HasOne = exports.BelongsTo = exports.BelongsToManyField = exports.BelongsToField = exports.HasManyField = exports.HasOneField = exports.InverseRelationship = exports.RelationshipField = exports.PrimaryField = exports.InverseField = exports.JSONField = exports.ColumnField = void 0;
4
+ const Entity_1 = require("./Entity");
5
+ const index_1 = require("./index");
6
+ const List_1 = require("./List");
7
+ const BaseRelationship_1 = require("./ORM/BaseRelationship");
8
+ const Helpers_1 = require("./Helpers");
9
+ class ColumnField {
10
+ constructor(entity, property, type, column) {
11
+ this.entity = entity;
12
+ this.property = property;
13
+ this.type = type;
14
+ this.column = column;
15
+ }
16
+ value(entity, key) {
17
+ return entity[key];
18
+ }
19
+ set(target, value) {
20
+ target[this.property] = value;
21
+ }
22
+ }
23
+ exports.ColumnField = ColumnField;
24
+ class JSONField extends ColumnField {
25
+ value(entity, key) {
26
+ return JSON.stringify(entity[key]);
27
+ }
28
+ set(target, value) {
29
+ target[this.property] = typeof value === 'string' ? JSON.parse(value) : undefined;
30
+ }
31
+ }
32
+ exports.JSONField = JSONField;
33
+ class InverseField {
34
+ constructor(entity, property, type) {
35
+ this.entity = entity;
36
+ this.property = property;
37
+ this.type = type;
38
+ }
39
+ value(entity, key) {
40
+ return entity[key];
41
+ }
42
+ }
43
+ exports.InverseField = InverseField;
44
+ class PrimaryField extends ColumnField {
45
+ }
46
+ exports.PrimaryField = PrimaryField;
47
+ class RelationshipField extends ColumnField {
48
+ constructor(entity, property, type, inverseBy, column) {
49
+ super(entity, property, type, column);
50
+ this.type = type;
51
+ this.inverseBy = inverseBy;
52
+ }
53
+ get related() {
54
+ return this.type();
55
+ }
56
+ }
57
+ exports.RelationshipField = RelationshipField;
58
+ class InverseRelationship extends InverseField {
59
+ constructor(entity, property, type, inverseBy) {
60
+ super(entity, property, type);
61
+ this.type = type;
62
+ this.inverseBy = inverseBy;
63
+ }
64
+ get related() {
65
+ return this.type();
66
+ }
67
+ }
68
+ exports.InverseRelationship = InverseRelationship;
69
+ class HasOneField extends InverseRelationship {
70
+ constructor(entity, property, type, inverseBy // TODO make it key of R
71
+ ) {
72
+ super(entity, property, type, inverseBy);
73
+ this.relationClass = HasOne;
74
+ }
75
+ set(target, value) {
76
+ target[this.property].set(value);
77
+ }
78
+ async getRelatedValue(relatedEntities, eagerLoad, customQuery) {
79
+ const parentIds = relatedEntities.pluck(this.entity.getPrimaryKey());
80
+ const inverseByField = this.related.metadata.relationships[this.inverseBy];
81
+ const query = this.related.with(...eagerLoad).whereIn(inverseByField.column, parentIds);
82
+ customQuery?.(query);
83
+ return await query.get();
84
+ }
85
+ async getRelatedCount(relatedEntities, customQuery) {
86
+ const relatedField = this.related.metadata.relationships[this.inverseBy];
87
+ const query = this.related.newQuery()
88
+ .whereIn(relatedField.column, relatedEntities.pluck(this.entity.getPrimaryKey()))
89
+ .select(relatedField.column)
90
+ .groupBy(relatedField.column);
91
+ customQuery?.(query);
92
+ return await query
93
+ .selectCount()
94
+ .get();
95
+ }
96
+ match(entities, relatedEntities) {
97
+ entities.forEach(entity => {
98
+ const inverseField = this.related.metadata.relationships[this.inverseBy];
99
+ const relatedEntity = relatedEntities.find(related => related.original[inverseField.column] === entity[this.entity.getPrimaryKey()]);
100
+ // TODO fix these weird types. Get rid of `unknown`
101
+ entity[this.property].set(relatedEntity);
102
+ });
103
+ return entities;
104
+ }
105
+ matchCounts(entities, counts) {
106
+ const relatedField = this.related.metadata.relationships[this.inverseBy];
107
+ entities.forEach(entity => {
108
+ const count = counts.find(item => item.original[relatedField.column] === entity[this.entity.getPrimaryKey()]);
109
+ entity[this.property + 'Count'] = (count?.original.aggregate ?? 0);
110
+ });
111
+ return entities;
112
+ }
113
+ }
114
+ exports.HasOneField = HasOneField;
115
+ class HasManyField extends InverseRelationship {
116
+ constructor(entity, property, type, inverseBy) {
117
+ super(entity, property, type, inverseBy);
118
+ this.inverseBy = inverseBy;
119
+ this.relationClass = HasMany;
120
+ }
121
+ set(target, value) {
122
+ }
123
+ async getRelatedValue(relatedEntities, eagerLoad, customQuery) {
124
+ const parentIds = relatedEntities.pluck(this.entity.getPrimaryKey());
125
+ const inverseByField = this.related.metadata.relationships[this.inverseBy];
126
+ const query = this.related.with(...eagerLoad).whereIn(inverseByField.column, parentIds);
127
+ customQuery?.(query);
128
+ return await query.get();
129
+ }
130
+ async getRelatedCount(relatedEntities, customQuery) {
131
+ const relatedField = this.related.metadata.relationships[this.inverseBy];
132
+ const query = this.related.newQuery()
133
+ .whereIn(relatedField.column, relatedEntities.pluck(this.entity.getPrimaryKey()))
134
+ .select(relatedField.column)
135
+ .groupBy(relatedField.column);
136
+ customQuery?.(query);
137
+ return await query
138
+ .selectCount()
139
+ .get();
140
+ }
141
+ match(entities, relatedEntities) {
142
+ entities.forEach(entity => {
143
+ const inverseField = this.related.metadata.relationships[this.inverseBy];
144
+ const relatedEntity = relatedEntities.filter(related => related.original[inverseField.column] === entity[this.entity.getPrimaryKey()]);
145
+ // TODO fix these weird types. Get rid of `unknown`
146
+ entity[this.property].items = relatedEntity;
147
+ });
148
+ return entities;
149
+ }
150
+ matchCounts(entities, counts) {
151
+ const relatedField = this.related.metadata.relationships[this.inverseBy];
152
+ entities.forEach(entity => {
153
+ const count = counts.find(item => item.original[relatedField.column] === entity[this.entity.getPrimaryKey()]);
154
+ entity[this.property + 'Count'] = (count?.original.aggregate ?? 0);
155
+ });
156
+ return entities;
157
+ }
158
+ async save(items, parent) {
159
+ const entities = [];
160
+ for await (const item of items) {
161
+ const entity = item instanceof Entity_1.Entity ? item : this.type().new(item);
162
+ entity.fill({
163
+ [this.inverseBy]: parent
164
+ });
165
+ await entity.save();
166
+ entities.push(entity);
167
+ }
168
+ return entities;
169
+ }
170
+ getQuery(parent) {
171
+ const inverseField = this.related.metadata.relationships[this.inverseBy];
172
+ return this.type().newQuery().where(inverseField.column, parent[parent.getPrimaryKey()]);
173
+ }
174
+ }
175
+ exports.HasManyField = HasManyField;
176
+ class BelongsToField extends RelationshipField {
177
+ constructor(entity, property, type, inverseBy, column) {
178
+ super(entity, property, type, inverseBy, column || property + entity.getPrimaryKey().capitalize());
179
+ this.relationClass = BelongsTo;
180
+ }
181
+ set(target, value) {
182
+ target[this.property].set(value);
183
+ }
184
+ update(target) {
185
+ target[this.property].update();
186
+ }
187
+ value(entity, key) {
188
+ const field = entity[key];
189
+ const instance = field.get();
190
+ if (instance) {
191
+ return instance[this.related.getPrimaryKey()];
192
+ }
193
+ // return new this.related({
194
+ // [this.related.getPrimaryKey()]: entity[key as K]
195
+ // }) as unknown as T[K]; // TODO get rid of `unknown`
196
+ // if (key === this.column) {
197
+ // return new this.related({
198
+ // [this.related.getPrimaryKey()]: entity[key as K]
199
+ // }) as unknown as T[K]; // TODO get rid of `unknown`
200
+ // }
201
+ // return entity[this.property as keyof T] as unknown as T[K];
202
+ }
203
+ async getRelatedValue(parents, eagerLoad, customQuery) {
204
+ const relationIds = parents
205
+ .map(parent => {
206
+ const relation = parent[this.property].get();
207
+ return relation?.[relation.getPrimaryKey()];
208
+ })
209
+ .filter(Boolean);
210
+ if (relationIds.length) {
211
+ const query = this.related.with(...eagerLoad).whereIn(this.related.getPrimaryKey(), relationIds);
212
+ if (customQuery) {
213
+ customQuery(query);
214
+ }
215
+ return await query.get();
216
+ }
217
+ return [];
218
+ }
219
+ async getRelatedCount(relatedEntities, customQuery) {
220
+ return [];
221
+ }
222
+ match(entities, relatedEntities) {
223
+ return entities.map(entity => {
224
+ // TODO fix these weird types. Get rid of `unknown`
225
+ const related = entity[this.property].get();
226
+ const value = related?.[related.getPrimaryKey()];
227
+ if (value) {
228
+ const instance = relatedEntities.findWhere(this.related.getPrimaryKey(), value);
229
+ if (instance) {
230
+ this.set(entity, instance);
231
+ }
232
+ }
233
+ return entity;
234
+ });
235
+ }
236
+ matchCounts(entities, counts) {
237
+ return entities;
238
+ }
239
+ getQuery(parent) {
240
+ return this.entity.newQuery().where(this.column, parent[parent.getPrimaryKey()]);
241
+ }
242
+ async save(items, parent) {
243
+ const entities = [];
244
+ for await (const item of items) {
245
+ const entity = item instanceof Entity_1.Entity ? item : this.entity.new(item);
246
+ entity.fill({
247
+ [this.property]: parent
248
+ });
249
+ await entity.save();
250
+ entities.push(entity);
251
+ }
252
+ return entities;
253
+ }
254
+ }
255
+ exports.BelongsToField = BelongsToField;
256
+ class BelongsToManyField extends InverseRelationship {
257
+ constructor(entity, property, type, inverseBy, table, parentColumn, relatedColumn) {
258
+ super(entity, property, type, inverseBy);
259
+ this.table = table;
260
+ this.parentColumn = parentColumn;
261
+ this.relatedColumn = relatedColumn;
262
+ this.relationClass = BelongsToMany;
263
+ }
264
+ set(target, value) {
265
+ }
266
+ async getRelatedValue(parents, eagerLoad, customQuery) {
267
+ const parentIds = parents.pluck(this.entity.getPrimaryKey());
268
+ const relatedForeignKey = `${Helpers_1.wrap(this.getPivotTable())}.${this.getRelatedForeignKey()}`;
269
+ const parentForeignKey = `${Helpers_1.wrap(this.getPivotTable())}.${this.getParentForeignKey()}`;
270
+ const relatedKey = `${Helpers_1.wrap(this.related.getTable())}.${this.related.getPrimaryKey()}`;
271
+ const query = this.related
272
+ .with(...eagerLoad)
273
+ .addSelect(new index_1.StringExpression(`${Helpers_1.wrap(this.related.getTable())}.*`), new index_1.StringExpression(relatedForeignKey), new index_1.StringExpression(parentForeignKey))
274
+ .join(this.getPivotTable(), relatedForeignKey, '=', relatedKey)
275
+ .whereIn(parentForeignKey, parentIds.unique());
276
+ customQuery?.(query);
277
+ const results = await query.get();
278
+ return results.map(entity => {
279
+ entity.original.pivot = {
280
+ [this.getParentForeignKey()]: entity.original[this.getParentForeignKey()],
281
+ [this.getRelatedForeignKey()]: entity.original[this.getRelatedForeignKey()],
282
+ };
283
+ delete entity.original[this.getParentForeignKey()];
284
+ delete entity.original[this.getRelatedForeignKey()];
285
+ return entity;
286
+ });
287
+ }
288
+ getParentForeignKey() {
289
+ return this.parentColumn || `${this.entity.name.toLocaleLowerCase()}${this.entity.getPrimaryKey().capitalize()}`;
290
+ }
291
+ getRelatedForeignKey() {
292
+ return this.relatedColumn || `${this.related.name.toLocaleLowerCase()}${this.related.getPrimaryKey().capitalize()}`;
293
+ }
294
+ async getRelatedCount(relatedEntities, customQuery) {
295
+ const query = index_1.Query.table(this.getPivotTable())
296
+ .select(this.getParentForeignKey())
297
+ .groupBy(this.getParentForeignKey())
298
+ .whereIn(this.getParentForeignKey(), relatedEntities.pluck(this.related.getPrimaryKey()));
299
+ customQuery?.(query);
300
+ return await query.selectCount().get();
301
+ }
302
+ match(entities, relatedEntities) {
303
+ return entities.map(entity => {
304
+ const entityPrimaryKey = entity[this.entity.getPrimaryKey()];
305
+ entity[this.property].items = relatedEntities
306
+ .filter(related => related.original.pivot[this.getParentForeignKey()] === entityPrimaryKey);
307
+ return entity;
308
+ });
309
+ }
310
+ matchCounts(entities, counts) {
311
+ entities.forEach(entity => {
312
+ const foreignKey = this.getParentForeignKey();
313
+ const count = counts.find(item => (item?.original?.[foreignKey] || item[foreignKey]) === entity[this.entity.getPrimaryKey()]);
314
+ // @ts-ignore
315
+ const aggregateValue = count?.aggregate || count?.original.aggregate;
316
+ entity[this.property + 'Count'] = (aggregateValue ?? 0);
317
+ });
318
+ return entities;
319
+ }
320
+ getPivotTable() {
321
+ return this.table || [this.entity.getTable(), this.related.getTable()].sort().join('_');
322
+ }
323
+ value(entity, key) {
324
+ const value = entity[key];
325
+ if (value instanceof Array) {
326
+ return value.map(related => {
327
+ if (related instanceof Entity_1.Entity) {
328
+ return related;
329
+ }
330
+ const instance = new this.related();
331
+ instance[instance.getPrimaryKey()] = related;
332
+ return instance;
333
+ });
334
+ }
335
+ return value;
336
+ }
337
+ async add(items, parent) {
338
+ const entities = [];
339
+ // tslint:disable-next-line:no-any
340
+ const dataToInsert = [];
341
+ for await (const item of items) {
342
+ dataToInsert.push({
343
+ [this.getRelatedForeignKey()]: item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item,
344
+ [this.getParentForeignKey()]: parent.getPrimaryKeyValue(),
345
+ });
346
+ entities.push(this.related.new({ [this.related.getPrimaryKey()]: item }));
347
+ }
348
+ if (dataToInsert.length) {
349
+ await index_1.Query.table(this.getPivotTable()).insert(dataToInsert);
350
+ }
351
+ return entities;
352
+ }
353
+ getQuery(parent) {
354
+ return this.related.newQuery().whereIn(this.related.getPrimaryKey(), query => {
355
+ query.select(this.getRelatedForeignKey())
356
+ .table(this.getPivotTable())
357
+ .where(this.getParentForeignKey(), parent[parent.getPrimaryKey()]);
358
+ });
359
+ }
360
+ }
361
+ exports.BelongsToManyField = BelongsToManyField;
362
+ class BelongsTo extends BaseRelationship_1.BaseRelationship {
363
+ constructor(relationship, parent) {
364
+ super(relationship, parent);
365
+ this.update();
366
+ }
367
+ update() {
368
+ const parentId = this.parent.original[this.relationship.column];
369
+ if (parentId && !this.instance) {
370
+ this.setById(parentId);
371
+ }
372
+ }
373
+ static relationship(metadata, entityClass, property, type, inverseBy, options) {
374
+ metadata.relationships[property] = new BelongsToField(entityClass, property, type, inverseBy, options?.column);
375
+ return metadata;
376
+ }
377
+ get() {
378
+ return this.instance;
379
+ }
380
+ set(instance) {
381
+ if (instance instanceof Entity_1.Entity) {
382
+ this.instance = instance;
383
+ }
384
+ else {
385
+ this.setById(instance);
386
+ }
387
+ }
388
+ setById(id) {
389
+ this.set(this.relationship.related.new({ [this.relationship.related.getPrimaryKey()]: id }));
390
+ }
391
+ async save(data = {}) {
392
+ if (!this.instance) {
393
+ return;
394
+ }
395
+ this.instance.fill({
396
+ ...data,
397
+ });
398
+ await this.instance.save();
399
+ return this.instance;
400
+ }
401
+ toJSON() {
402
+ return this.instance?.toJSON();
403
+ }
404
+ }
405
+ exports.BelongsTo = BelongsTo;
406
+ class HasOne extends BaseRelationship_1.BaseRelationship {
407
+ static relationship(metadata, entityClass, property, type, inverseBy, options) {
408
+ metadata.inverseRelationships[property] = new HasOneField(entityClass, property, type, inverseBy);
409
+ return metadata;
410
+ }
411
+ get() {
412
+ return this.instance;
413
+ }
414
+ set(instance) {
415
+ if (!instance) {
416
+ return;
417
+ }
418
+ if (instance instanceof Entity_1.Entity) {
419
+ this.instance = instance;
420
+ }
421
+ else {
422
+ this.setById(instance);
423
+ }
424
+ }
425
+ setById(id) {
426
+ this.set(this.relationship.related.new({ [this.relationship.related.getPrimaryKey()]: id }));
427
+ }
428
+ async save(instance = this.instance) {
429
+ this.set(instance);
430
+ if (instance) {
431
+ instance[this.relationship.inverseBy].set(this.parent);
432
+ await instance.save();
433
+ }
434
+ return this.instance;
435
+ }
436
+ toJSON() {
437
+ return this.instance?.toJSON();
438
+ }
439
+ }
440
+ exports.HasOne = HasOne;
441
+ class HasMany extends List_1.List {
442
+ constructor(relationship, parent) {
443
+ super(relationship, parent);
444
+ this.relationship = relationship;
445
+ }
446
+ static relationship(metadata, entityClass, property, type, inverseBy, options) {
447
+ metadata.inverseRelationships[property] = new HasManyField(entityClass, property, type, inverseBy);
448
+ return metadata;
449
+ }
450
+ async save(item) {
451
+ const instances = await this.saveMany(item);
452
+ return instances.first();
453
+ }
454
+ async saveMany(...items) {
455
+ if (!this.parent.exists) {
456
+ await this.parent.save();
457
+ }
458
+ const instances = await this.relationship.save(items, this.parent);
459
+ this.items.push(...instances);
460
+ return instances;
461
+ }
462
+ async clear() {
463
+ }
464
+ }
465
+ exports.HasMany = HasMany;
466
+ class BelongsToMany extends List_1.List {
467
+ constructor(relationship, parent) {
468
+ super(relationship, parent);
469
+ this.relationship = relationship;
470
+ }
471
+ static relationship(metadata, entityClass, property, type, inverseBy, options) {
472
+ // options.column = options.column || (property as string) + (entityClass.getPrimaryKey() as string).capitalize();
473
+ const inverseField = metadata.inverseRelationships[inverseBy];
474
+ metadata.inverseRelationships[property] = new BelongsToManyField(entityClass, property, type, inverseBy, options?.table || inverseField?.table, options?.foreignColumn || inverseField?.parentColumn, options?.column || inverseField?.relatedColumn);
475
+ return metadata;
476
+ }
477
+ async has(item) {
478
+ if (item instanceof Entity_1.Entity) {
479
+ item = item.getPrimaryKeyValue();
480
+ }
481
+ const relatedForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getRelatedForeignKey()}`;
482
+ const parentForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getParentForeignKey()}`;
483
+ return Boolean(await index_1.Query.table(this.relationship.getPivotTable())
484
+ .where(parentForeignKey, this.parent[this.parent.getPrimaryKey()])
485
+ .andWhere(relatedForeignKey, item)
486
+ .first());
487
+ }
488
+ async add(...items) {
489
+ const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
490
+ if (!this.parent.exists) {
491
+ await this.parent.save();
492
+ }
493
+ for await (const id of ids) {
494
+ if (!(await this.has(id))) {
495
+ this.items = this.items.concat(await this.relationship.add(items, this.parent));
496
+ }
497
+ }
498
+ return this.items;
499
+ }
500
+ async remove(...items) {
501
+ const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
502
+ const relatedForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getRelatedForeignKey()}`;
503
+ const parentForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getParentForeignKey()}`;
504
+ await index_1.Query.table(this.relationship.getPivotTable())
505
+ .where(parentForeignKey, this.parent[this.parent.getPrimaryKey()])
506
+ .whereIn(relatedForeignKey, ids)
507
+ .delete();
508
+ this.items = this.items.filter(item => !ids.includes(item.getPrimaryKeyValue()));
509
+ }
510
+ async toggle(...items) {
511
+ const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
512
+ const attachedEntities = await this.relationship.getQuery(this.parent).get();
513
+ const entitiesToDetach = ids.filter(item => attachedEntities.some(entity => entity.getPrimaryKeyValue() === item));
514
+ const entitiesToAttach = ids.filter(item => attachedEntities.some(entity => entity.getPrimaryKeyValue() !== item));
515
+ await this.add(...entitiesToAttach);
516
+ await this.remove(...entitiesToDetach);
517
+ }
518
+ async clear() {
519
+ const relatedForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getRelatedForeignKey()}`;
520
+ const parentForeignKey = `${this.relationship.getPivotTable()}.${this.relationship.getParentForeignKey()}`;
521
+ await index_1.Query.table(this.relationship.getPivotTable())
522
+ .where(parentForeignKey, this.parent[this.parent.getPrimaryKey()])
523
+ .whereIn(relatedForeignKey, this.items.pluck(this.relationship.related.getPrimaryKey()))
524
+ .delete();
525
+ this.items = [];
526
+ }
527
+ async sync(...items) {
528
+ const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
529
+ const existingItems = await this.get();
530
+ const primaryKey = this.relationship.type().getPrimaryKey();
531
+ const itemsToRemove = existingItems.filter(item => !ids.includes(item[primaryKey])).pluck(primaryKey);
532
+ const restOfItemsToAdd = ids.filter(item => !existingItems.findWhere(primaryKey, item));
533
+ await this.remove(...itemsToRemove);
534
+ await this.add(...restOfItemsToAdd);
535
+ }
536
+ async syncWithoutDetaching(...items) {
537
+ const ids = items.map(item => item instanceof Entity_1.Entity ? item.getPrimaryKeyValue() : item);
538
+ const existingItems = await this.get();
539
+ const primaryKey = this.relationship.type().getPrimaryKey();
540
+ const restOfItemsToAdd = ids.filter(item => !existingItems.findWhere(primaryKey, item));
541
+ await this.add(...restOfItemsToAdd);
542
+ }
543
+ }
544
+ exports.BelongsToMany = BelongsToMany;
549
545
  //# sourceMappingURL=Fields.js.map