@loopback/repository 4.0.0-alpha.8 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +93 -389
  3. package/dist/common-types.d.ts +96 -0
  4. package/dist/common-types.js +24 -0
  5. package/dist/common-types.js.map +1 -0
  6. package/dist/connectors/connector.d.ts +48 -0
  7. package/{lib → dist/connectors}/connector.js +1 -1
  8. package/dist/connectors/connector.js.map +1 -0
  9. package/{lib/crud-connector.d.ts → dist/connectors/crud.connector.d.ts} +51 -51
  10. package/{lib/common-types.js → dist/connectors/crud.connector.js} +2 -2
  11. package/dist/connectors/crud.connector.js.map +1 -0
  12. package/dist/connectors/index.d.ts +3 -0
  13. package/dist/connectors/index.js +11 -0
  14. package/dist/connectors/index.js.map +1 -0
  15. package/{lib6/kv-connector.d.ts → dist/connectors/kv.connector.d.ts} +28 -28
  16. package/{lib/datasource.js → dist/connectors/kv.connector.js} +2 -2
  17. package/dist/connectors/kv.connector.js.map +1 -0
  18. package/dist/datasource.d.ts +27 -0
  19. package/{lib6 → dist}/datasource.js +1 -1
  20. package/dist/datasource.js.map +1 -0
  21. package/dist/decorators/index.d.ts +3 -0
  22. package/dist/decorators/index.js +11 -0
  23. package/dist/decorators/index.js.map +1 -0
  24. package/dist/decorators/metadata.d.ts +12 -0
  25. package/dist/decorators/metadata.js +51 -0
  26. package/dist/decorators/metadata.js.map +1 -0
  27. package/dist/decorators/model.decorator.d.ts +40 -0
  28. package/dist/decorators/model.decorator.js +112 -0
  29. package/dist/decorators/model.decorator.js.map +1 -0
  30. package/dist/decorators/repository.decorator.d.ts +106 -0
  31. package/dist/decorators/repository.decorator.js +114 -0
  32. package/dist/decorators/repository.decorator.js.map +1 -0
  33. package/dist/define-model-class.d.ts +55 -0
  34. package/dist/define-model-class.js +57 -0
  35. package/dist/define-model-class.js.map +1 -0
  36. package/dist/define-repository-class.d.ts +119 -0
  37. package/dist/define-repository-class.js +98 -0
  38. package/dist/define-repository-class.js.map +1 -0
  39. package/dist/errors/entity-not-found.error.d.ts +8 -0
  40. package/dist/errors/entity-not-found.error.js +28 -0
  41. package/dist/errors/entity-not-found.error.js.map +1 -0
  42. package/dist/errors/index.d.ts +2 -0
  43. package/dist/errors/index.js +10 -0
  44. package/dist/errors/index.js.map +1 -0
  45. package/dist/errors/invalid-relation.error.d.ts +10 -0
  46. package/dist/errors/invalid-relation.error.js +28 -0
  47. package/dist/errors/invalid-relation.error.js.map +1 -0
  48. package/dist/index.d.ts +30 -0
  49. package/dist/index.js +39 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/keys.d.ts +34 -0
  52. package/dist/keys.js +44 -0
  53. package/dist/keys.js.map +1 -0
  54. package/dist/mixins/index.d.ts +1 -0
  55. package/dist/mixins/index.js +9 -0
  56. package/dist/mixins/index.js.map +1 -0
  57. package/dist/mixins/repository.mixin.d.ts +377 -0
  58. package/dist/mixins/repository.mixin.js +405 -0
  59. package/dist/mixins/repository.mixin.js.map +1 -0
  60. package/dist/model.d.ts +232 -0
  61. package/dist/model.js +367 -0
  62. package/dist/model.js.map +1 -0
  63. package/dist/relations/belongs-to/belongs-to.accessor.d.ts +17 -0
  64. package/dist/relations/belongs-to/belongs-to.accessor.js +40 -0
  65. package/dist/relations/belongs-to/belongs-to.accessor.js.map +1 -0
  66. package/dist/relations/belongs-to/belongs-to.decorator.d.ts +11 -0
  67. package/dist/relations/belongs-to/belongs-to.decorator.js +64 -0
  68. package/dist/relations/belongs-to/belongs-to.decorator.js.map +1 -0
  69. package/dist/relations/belongs-to/belongs-to.helpers.d.ts +17 -0
  70. package/dist/relations/belongs-to/belongs-to.helpers.js +63 -0
  71. package/dist/relations/belongs-to/belongs-to.helpers.js.map +1 -0
  72. package/dist/relations/belongs-to/belongs-to.inclusion-resolver.d.ts +14 -0
  73. package/dist/relations/belongs-to/belongs-to.inclusion-resolver.js +36 -0
  74. package/dist/relations/belongs-to/belongs-to.inclusion-resolver.js.map +1 -0
  75. package/dist/relations/belongs-to/belongs-to.repository.d.ts +28 -0
  76. package/dist/relations/belongs-to/belongs-to.repository.js +33 -0
  77. package/dist/relations/belongs-to/belongs-to.repository.js.map +1 -0
  78. package/dist/relations/belongs-to/index.d.ts +4 -0
  79. package/dist/relations/belongs-to/index.js +12 -0
  80. package/dist/relations/belongs-to/index.js.map +1 -0
  81. package/dist/relations/has-many/has-many-through.helpers.d.ts +182 -0
  82. package/dist/relations/has-many/has-many-through.helpers.js +282 -0
  83. package/dist/relations/has-many/has-many-through.helpers.js.map +1 -0
  84. package/dist/relations/has-many/has-many-through.inclusion-resolver.d.ts +16 -0
  85. package/dist/relations/has-many/has-many-through.inclusion-resolver.js +78 -0
  86. package/dist/relations/has-many/has-many-through.inclusion-resolver.js.map +1 -0
  87. package/dist/relations/has-many/has-many-through.repository-factory.d.ts +17 -0
  88. package/dist/relations/has-many/has-many-through.repository-factory.js +37 -0
  89. package/dist/relations/has-many/has-many-through.repository-factory.js.map +1 -0
  90. package/dist/relations/has-many/has-many-through.repository.d.ts +114 -0
  91. package/dist/relations/has-many/has-many-through.repository.js +103 -0
  92. package/dist/relations/has-many/has-many-through.repository.js.map +1 -0
  93. package/dist/relations/has-many/has-many.decorator.d.ts +11 -0
  94. package/dist/relations/has-many/has-many.decorator.js +36 -0
  95. package/dist/relations/has-many/has-many.decorator.js.map +1 -0
  96. package/dist/relations/has-many/has-many.helpers.d.ts +26 -0
  97. package/dist/relations/has-many/has-many.helpers.js +78 -0
  98. package/dist/relations/has-many/has-many.helpers.js.map +1 -0
  99. package/dist/relations/has-many/has-many.inclusion-resolver.d.ts +14 -0
  100. package/dist/relations/has-many/has-many.inclusion-resolver.js +45 -0
  101. package/dist/relations/has-many/has-many.inclusion-resolver.js.map +1 -0
  102. package/dist/relations/has-many/has-many.repository-factory.d.ts +28 -0
  103. package/dist/relations/has-many/has-many.repository-factory.js +39 -0
  104. package/dist/relations/has-many/has-many.repository-factory.js.map +1 -0
  105. package/dist/relations/has-many/has-many.repository.d.ts +54 -0
  106. package/dist/relations/has-many/has-many.repository.js +38 -0
  107. package/dist/relations/has-many/has-many.repository.js.map +1 -0
  108. package/dist/relations/has-many/index.d.ts +6 -0
  109. package/dist/relations/has-many/index.js +14 -0
  110. package/dist/relations/has-many/index.js.map +1 -0
  111. package/dist/relations/has-one/has-one.decorator.d.ts +3 -0
  112. package/dist/relations/has-one/has-one.decorator.js +37 -0
  113. package/dist/relations/has-one/has-one.decorator.js.map +1 -0
  114. package/dist/relations/has-one/has-one.helpers.d.ts +17 -0
  115. package/dist/relations/has-one/has-one.helpers.js +64 -0
  116. package/dist/relations/has-one/has-one.helpers.js.map +1 -0
  117. package/dist/relations/has-one/has-one.inclusion-resolver.d.ts +14 -0
  118. package/dist/relations/has-one/has-one.inclusion-resolver.js +35 -0
  119. package/dist/relations/has-one/has-one.inclusion-resolver.js.map +1 -0
  120. package/dist/relations/has-one/has-one.repository-factory.d.ts +28 -0
  121. package/dist/relations/has-one/has-one.repository-factory.js +39 -0
  122. package/dist/relations/has-one/has-one.repository-factory.js.map +1 -0
  123. package/dist/relations/has-one/has-one.repository.d.ts +53 -0
  124. package/dist/relations/has-one/has-one.repository.js +45 -0
  125. package/dist/relations/has-one/has-one.repository.js.map +1 -0
  126. package/dist/relations/has-one/index.d.ts +3 -0
  127. package/dist/relations/has-one/index.js +11 -0
  128. package/dist/relations/has-one/index.js.map +1 -0
  129. package/dist/relations/index.d.ts +6 -0
  130. package/dist/relations/index.js +14 -0
  131. package/dist/relations/index.js.map +1 -0
  132. package/dist/relations/relation.decorator.d.ts +39 -0
  133. package/dist/relations/relation.decorator.js +88 -0
  134. package/dist/relations/relation.decorator.js.map +1 -0
  135. package/dist/relations/relation.helpers.d.ts +105 -0
  136. package/dist/relations/relation.helpers.js +304 -0
  137. package/dist/relations/relation.helpers.js.map +1 -0
  138. package/dist/relations/relation.types.d.ts +142 -0
  139. package/dist/relations/relation.types.js +21 -0
  140. package/dist/relations/relation.types.js.map +1 -0
  141. package/dist/repositories/constraint-utils.d.ts +49 -0
  142. package/dist/repositories/constraint-utils.js +87 -0
  143. package/dist/repositories/constraint-utils.js.map +1 -0
  144. package/dist/repositories/index.d.ts +5 -0
  145. package/dist/repositories/index.js +13 -0
  146. package/dist/repositories/index.js.map +1 -0
  147. package/dist/repositories/kv.repository.bridge.d.ts +30 -0
  148. package/dist/repositories/kv.repository.bridge.js +76 -0
  149. package/dist/repositories/kv.repository.bridge.js.map +1 -0
  150. package/dist/repositories/kv.repository.d.ts +74 -0
  151. package/{lib/crud-connector.js → dist/repositories/kv.repository.js} +2 -2
  152. package/dist/repositories/kv.repository.js.map +1 -0
  153. package/dist/repositories/legacy-juggler-bridge.d.ts +305 -0
  154. package/dist/repositories/legacy-juggler-bridge.js +452 -0
  155. package/dist/repositories/legacy-juggler-bridge.js.map +1 -0
  156. package/dist/repositories/repository.d.ts +223 -0
  157. package/dist/repositories/repository.js +157 -0
  158. package/dist/repositories/repository.js.map +1 -0
  159. package/dist/transaction.d.ts +30 -0
  160. package/dist/transaction.js +18 -0
  161. package/dist/transaction.js.map +1 -0
  162. package/dist/type-resolver.d.ts +42 -0
  163. package/dist/type-resolver.js +61 -0
  164. package/dist/type-resolver.js.map +1 -0
  165. package/{lib → dist}/types/any.d.ts +1 -1
  166. package/{lib6 → dist}/types/any.js +3 -2
  167. package/dist/types/any.js.map +1 -0
  168. package/{lib6 → dist}/types/array.d.ts +4 -4
  169. package/{lib → dist}/types/array.js +6 -4
  170. package/dist/types/array.js.map +1 -0
  171. package/{lib → dist}/types/boolean.d.ts +1 -1
  172. package/{lib6 → dist}/types/boolean.js +3 -2
  173. package/dist/types/boolean.js.map +1 -0
  174. package/{lib6 → dist}/types/buffer.d.ts +2 -2
  175. package/{lib → dist}/types/buffer.js +8 -6
  176. package/dist/types/buffer.js.map +1 -0
  177. package/{lib → dist}/types/date.d.ts +1 -1
  178. package/{lib → dist}/types/date.js +6 -4
  179. package/dist/types/date.js.map +1 -0
  180. package/{lib → dist}/types/index.d.ts +11 -9
  181. package/dist/types/index.js +49 -0
  182. package/dist/types/index.js.map +1 -0
  183. package/{lib6 → dist}/types/model.d.ts +2 -1
  184. package/{lib6 → dist}/types/model.js +2 -2
  185. package/dist/types/model.js.map +1 -0
  186. package/dist/types/null.d.ts +12 -0
  187. package/{lib/types/boolean.js → dist/types/null.js} +12 -11
  188. package/dist/types/null.js.map +1 -0
  189. package/{lib6 → dist}/types/number.d.ts +1 -1
  190. package/{lib → dist}/types/number.js +6 -4
  191. package/dist/types/number.js.map +1 -0
  192. package/{lib → dist}/types/object.d.ts +1 -1
  193. package/{lib → dist}/types/object.js +7 -6
  194. package/dist/types/object.js.map +1 -0
  195. package/{lib → dist}/types/string.d.ts +1 -1
  196. package/{lib → dist}/types/string.js +3 -2
  197. package/dist/types/string.js.map +1 -0
  198. package/{lib6 → dist}/types/type.d.ts +7 -7
  199. package/{lib6 → dist}/types/type.js +1 -1
  200. package/dist/types/type.js.map +1 -0
  201. package/{lib → dist}/types/union.d.ts +1 -1
  202. package/{lib → dist}/types/union.js +6 -4
  203. package/dist/types/union.js.map +1 -0
  204. package/package.json +49 -33
  205. package/src/common-types.ts +123 -0
  206. package/src/connectors/connector.ts +70 -0
  207. package/src/connectors/crud.connector.ts +208 -0
  208. package/src/connectors/index.ts +8 -0
  209. package/src/connectors/kv.connector.ts +113 -0
  210. package/src/datasource.ts +37 -0
  211. package/src/decorators/index.ts +8 -0
  212. package/src/decorators/metadata.ts +84 -0
  213. package/src/decorators/model.decorator.ts +166 -0
  214. package/src/decorators/repository.decorator.ts +223 -0
  215. package/src/define-model-class.ts +90 -0
  216. package/src/define-repository-class.ts +170 -0
  217. package/src/errors/entity-not-found.error.ts +40 -0
  218. package/src/errors/index.ts +7 -0
  219. package/src/errors/invalid-relation.error.ts +39 -0
  220. package/src/index.ts +36 -0
  221. package/src/keys.ts +40 -0
  222. package/{index.d.ts → src/mixins/index.ts} +2 -2
  223. package/src/mixins/repository.mixin.ts +499 -0
  224. package/src/model.ts +539 -0
  225. package/src/relations/belongs-to/belongs-to.accessor.ts +74 -0
  226. package/src/relations/belongs-to/belongs-to.decorator.ts +81 -0
  227. package/src/relations/belongs-to/belongs-to.helpers.ts +78 -0
  228. package/src/relations/belongs-to/belongs-to.inclusion-resolver.ts +71 -0
  229. package/src/relations/belongs-to/belongs-to.repository.ts +55 -0
  230. package/src/relations/belongs-to/index.ts +9 -0
  231. package/src/relations/has-many/has-many-through.helpers.ts +361 -0
  232. package/src/relations/has-many/has-many-through.inclusion-resolver.ts +135 -0
  233. package/src/relations/has-many/has-many-through.repository-factory.ts +121 -0
  234. package/src/relations/has-many/has-many-through.repository.ts +318 -0
  235. package/src/relations/has-many/has-many.decorator.ts +38 -0
  236. package/src/relations/has-many/has-many.helpers.ts +100 -0
  237. package/src/relations/has-many/has-many.inclusion-resolver.ts +88 -0
  238. package/src/relations/has-many/has-many.repository-factory.ts +76 -0
  239. package/src/relations/has-many/has-many.repository.ts +118 -0
  240. package/src/relations/has-many/index.ts +11 -0
  241. package/src/relations/has-one/has-one.decorator.ts +40 -0
  242. package/src/relations/has-one/has-one.helpers.ts +84 -0
  243. package/src/relations/has-one/has-one.inclusion-resolver.ts +65 -0
  244. package/src/relations/has-one/has-one.repository-factory.ts +72 -0
  245. package/src/relations/has-one/has-one.repository.ts +127 -0
  246. package/src/relations/has-one/index.ts +8 -0
  247. package/src/relations/index.ts +11 -0
  248. package/src/relations/relation.decorator.ts +90 -0
  249. package/src/relations/relation.helpers.ts +373 -0
  250. package/src/relations/relation.types.ts +180 -0
  251. package/src/repositories/constraint-utils.ts +98 -0
  252. package/src/repositories/index.ts +10 -0
  253. package/src/repositories/kv.repository.bridge.ts +97 -0
  254. package/src/repositories/kv.repository.ts +87 -0
  255. package/src/repositories/legacy-juggler-bridge.ts +788 -0
  256. package/src/repositories/repository.ts +441 -0
  257. package/src/transaction.ts +39 -0
  258. package/src/type-resolver.ts +98 -0
  259. package/src/types/any.ts +38 -0
  260. package/src/types/array.ts +53 -0
  261. package/src/types/boolean.ts +35 -0
  262. package/src/types/buffer.ts +53 -0
  263. package/src/types/date.ts +61 -0
  264. package/src/types/index.ts +52 -0
  265. package/src/types/model.ts +24 -0
  266. package/src/types/null.ts +35 -0
  267. package/src/types/number.ts +42 -0
  268. package/src/types/object.ts +53 -0
  269. package/src/types/string.ts +42 -0
  270. package/src/types/type.ts +51 -0
  271. package/src/types/union.ts +55 -0
  272. package/api-docs/apple-touch-icon-114x114-precomposed.png +0 -0
  273. package/api-docs/apple-touch-icon-144x144-precomposed.png +0 -0
  274. package/api-docs/apple-touch-icon-57x57-precomposed.png +0 -0
  275. package/api-docs/apple-touch-icon-72x72-precomposed.png +0 -0
  276. package/api-docs/apple-touch-icon-precomposed.png +0 -0
  277. package/api-docs/apple-touch-icon.png +0 -0
  278. package/api-docs/css/bootstrap.min.css +0 -9
  279. package/api-docs/css/code-themes/arta.css +0 -158
  280. package/api-docs/css/code-themes/ascetic.css +0 -50
  281. package/api-docs/css/code-themes/brown_paper.css +0 -104
  282. package/api-docs/css/code-themes/brown_papersq.png +0 -0
  283. package/api-docs/css/code-themes/dark.css +0 -103
  284. package/api-docs/css/code-themes/default.css +0 -135
  285. package/api-docs/css/code-themes/far.css +0 -111
  286. package/api-docs/css/code-themes/github.css +0 -127
  287. package/api-docs/css/code-themes/googlecode.css +0 -144
  288. package/api-docs/css/code-themes/idea.css +0 -121
  289. package/api-docs/css/code-themes/ir_black.css +0 -104
  290. package/api-docs/css/code-themes/magula.css +0 -121
  291. package/api-docs/css/code-themes/monokai.css +0 -114
  292. package/api-docs/css/code-themes/pojoaque.css +0 -104
  293. package/api-docs/css/code-themes/pojoaque.jpg +0 -0
  294. package/api-docs/css/code-themes/rainbow.css +0 -114
  295. package/api-docs/css/code-themes/school_book.css +0 -111
  296. package/api-docs/css/code-themes/school_book.png +0 -0
  297. package/api-docs/css/code-themes/sl-theme.css +0 -45
  298. package/api-docs/css/code-themes/solarized_dark.css +0 -88
  299. package/api-docs/css/code-themes/solarized_light.css +0 -88
  300. package/api-docs/css/code-themes/sunburst.css +0 -158
  301. package/api-docs/css/code-themes/tomorrow-night-blue.css +0 -52
  302. package/api-docs/css/code-themes/tomorrow-night-bright.css +0 -51
  303. package/api-docs/css/code-themes/tomorrow-night-eighties.css +0 -51
  304. package/api-docs/css/code-themes/tomorrow-night.css +0 -52
  305. package/api-docs/css/code-themes/tomorrow.css +0 -49
  306. package/api-docs/css/code-themes/vs.css +0 -86
  307. package/api-docs/css/code-themes/xcode.css +0 -154
  308. package/api-docs/css/code-themes/zenburn.css +0 -115
  309. package/api-docs/css/main.css +0 -139
  310. package/api-docs/favicon.ico +0 -0
  311. package/api-docs/fonts/0ihfXUL2emPh0ROJezvraLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
  312. package/api-docs/fonts/OsJ2DjdpjqFRVUSto6IffLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
  313. package/api-docs/fonts/_aijTyevf54tkVDLy-dlnLO3LdcAZYWl9Si6vvxL-qU.woff +0 -0
  314. package/api-docs/index.html +0 -18017
  315. package/api-docs/js/main.js +0 -19
  316. package/api-docs/js/vendor/bootstrap.min.js +0 -6
  317. package/api-docs/js/vendor/jquery-1.10.1.min.js +0 -6
  318. package/api-docs/js/vendor/jquery.scrollTo-1.4.3.1.js +0 -218
  319. package/api-docs/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js +0 -11
  320. package/index.js +0 -9
  321. package/lib/common-types.d.ts +0 -44
  322. package/lib/common-types.js.map +0 -1
  323. package/lib/connector.d.ts +0 -12
  324. package/lib/connector.js.map +0 -1
  325. package/lib/crud-connector.js.map +0 -1
  326. package/lib/datasource.d.ts +0 -11
  327. package/lib/datasource.js.map +0 -1
  328. package/lib/decorators/model.d.ts +0 -17
  329. package/lib/decorators/model.js +0 -55
  330. package/lib/decorators/model.js.map +0 -1
  331. package/lib/decorators/relation.d.ts +0 -65
  332. package/lib/decorators/relation.js +0 -126
  333. package/lib/decorators/relation.js.map +0 -1
  334. package/lib/decorators/repository.d.ts +0 -61
  335. package/lib/decorators/repository.js +0 -107
  336. package/lib/decorators/repository.js.map +0 -1
  337. package/lib/index.d.ts +0 -17
  338. package/lib/index.js +0 -21
  339. package/lib/index.js.map +0 -1
  340. package/lib/kv-connector.d.ts +0 -77
  341. package/lib/kv-connector.js +0 -7
  342. package/lib/kv-connector.js.map +0 -1
  343. package/lib/kv-repository.d.ts +0 -78
  344. package/lib/kv-repository.js +0 -7
  345. package/lib/kv-repository.js.map +0 -1
  346. package/lib/legacy-juggler-bridge.d.ts +0 -53
  347. package/lib/legacy-juggler-bridge.js +0 -142
  348. package/lib/legacy-juggler-bridge.js.map +0 -1
  349. package/lib/loopback-datasource-juggler.d.ts +0 -666
  350. package/lib/loopback-datasource-juggler.js +0 -8
  351. package/lib/loopback-datasource-juggler.js.map +0 -1
  352. package/lib/mixin.d.ts +0 -43
  353. package/lib/mixin.js +0 -34
  354. package/lib/mixin.js.map +0 -1
  355. package/lib/model.d.ts +0 -137
  356. package/lib/model.js +0 -182
  357. package/lib/model.js.map +0 -1
  358. package/lib/query.d.ts +0 -112
  359. package/lib/query.js +0 -25
  360. package/lib/query.js.map +0 -1
  361. package/lib/repository-mixin.d.ts +0 -20
  362. package/lib/repository-mixin.js +0 -111
  363. package/lib/repository-mixin.js.map +0 -1
  364. package/lib/repository.d.ts +0 -172
  365. package/lib/repository.js +0 -127
  366. package/lib/repository.js.map +0 -1
  367. package/lib/types/any.js +0 -35
  368. package/lib/types/any.js.map +0 -1
  369. package/lib/types/array.d.ts +0 -14
  370. package/lib/types/array.js.map +0 -1
  371. package/lib/types/boolean.js.map +0 -1
  372. package/lib/types/buffer.d.ts +0 -14
  373. package/lib/types/buffer.js.map +0 -1
  374. package/lib/types/date.js.map +0 -1
  375. package/lib/types/index.js +0 -33
  376. package/lib/types/index.js.map +0 -1
  377. package/lib/types/model.d.ts +0 -11
  378. package/lib/types/model.js +0 -25
  379. package/lib/types/model.js.map +0 -1
  380. package/lib/types/number.d.ts +0 -12
  381. package/lib/types/number.js.map +0 -1
  382. package/lib/types/object.js.map +0 -1
  383. package/lib/types/string.js.map +0 -1
  384. package/lib/types/type.d.ts +0 -38
  385. package/lib/types/type.js +0 -7
  386. package/lib/types/type.js.map +0 -1
  387. package/lib/types/union.js.map +0 -1
  388. package/lib6/common-types.d.ts +0 -44
  389. package/lib6/common-types.js +0 -7
  390. package/lib6/common-types.js.map +0 -1
  391. package/lib6/connector.d.ts +0 -12
  392. package/lib6/connector.js +0 -7
  393. package/lib6/connector.js.map +0 -1
  394. package/lib6/crud-connector.d.ts +0 -130
  395. package/lib6/crud-connector.js +0 -7
  396. package/lib6/crud-connector.js.map +0 -1
  397. package/lib6/datasource.d.ts +0 -11
  398. package/lib6/datasource.js.map +0 -1
  399. package/lib6/decorators/model.d.ts +0 -17
  400. package/lib6/decorators/model.js +0 -55
  401. package/lib6/decorators/model.js.map +0 -1
  402. package/lib6/decorators/relation.d.ts +0 -65
  403. package/lib6/decorators/relation.js +0 -126
  404. package/lib6/decorators/relation.js.map +0 -1
  405. package/lib6/decorators/repository.d.ts +0 -61
  406. package/lib6/decorators/repository.js +0 -117
  407. package/lib6/decorators/repository.js.map +0 -1
  408. package/lib6/index.d.ts +0 -17
  409. package/lib6/index.js +0 -21
  410. package/lib6/index.js.map +0 -1
  411. package/lib6/kv-connector.js +0 -7
  412. package/lib6/kv-connector.js.map +0 -1
  413. package/lib6/kv-repository.d.ts +0 -78
  414. package/lib6/kv-repository.js +0 -7
  415. package/lib6/kv-repository.js.map +0 -1
  416. package/lib6/legacy-juggler-bridge.d.ts +0 -53
  417. package/lib6/legacy-juggler-bridge.js +0 -158
  418. package/lib6/legacy-juggler-bridge.js.map +0 -1
  419. package/lib6/loopback-datasource-juggler.d.ts +0 -666
  420. package/lib6/loopback-datasource-juggler.js +0 -8
  421. package/lib6/loopback-datasource-juggler.js.map +0 -1
  422. package/lib6/mixin.d.ts +0 -43
  423. package/lib6/mixin.js +0 -34
  424. package/lib6/mixin.js.map +0 -1
  425. package/lib6/model.d.ts +0 -137
  426. package/lib6/model.js +0 -182
  427. package/lib6/model.js.map +0 -1
  428. package/lib6/query.d.ts +0 -112
  429. package/lib6/query.js +0 -25
  430. package/lib6/query.js.map +0 -1
  431. package/lib6/repository-mixin.d.ts +0 -20
  432. package/lib6/repository-mixin.js +0 -111
  433. package/lib6/repository-mixin.js.map +0 -1
  434. package/lib6/repository.d.ts +0 -172
  435. package/lib6/repository.js +0 -127
  436. package/lib6/repository.js.map +0 -1
  437. package/lib6/types/any.d.ts +0 -12
  438. package/lib6/types/any.js.map +0 -1
  439. package/lib6/types/array.js +0 -53
  440. package/lib6/types/array.js.map +0 -1
  441. package/lib6/types/boolean.d.ts +0 -12
  442. package/lib6/types/boolean.js.map +0 -1
  443. package/lib6/types/buffer.js +0 -57
  444. package/lib6/types/buffer.js.map +0 -1
  445. package/lib6/types/date.d.ts +0 -12
  446. package/lib6/types/date.js +0 -60
  447. package/lib6/types/date.js.map +0 -1
  448. package/lib6/types/index.d.ts +0 -30
  449. package/lib6/types/index.js +0 -33
  450. package/lib6/types/index.js.map +0 -1
  451. package/lib6/types/model.js.map +0 -1
  452. package/lib6/types/number.js +0 -40
  453. package/lib6/types/number.js.map +0 -1
  454. package/lib6/types/object.d.ts +0 -15
  455. package/lib6/types/object.js +0 -49
  456. package/lib6/types/object.js.map +0 -1
  457. package/lib6/types/string.d.ts +0 -12
  458. package/lib6/types/string.js +0 -40
  459. package/lib6/types/string.js.map +0 -1
  460. package/lib6/types/type.js.map +0 -1
  461. package/lib6/types/union.d.ts +0 -14
  462. package/lib6/types/union.js +0 -51
  463. package/lib6/types/union.js.map +0 -1
@@ -0,0 +1,166 @@
1
+ // Copyright IBM Corp. 2018,2020. All Rights Reserved.
2
+ // Node module: @loopback/repository
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {
7
+ ClassDecoratorFactory,
8
+ MetadataAccessor,
9
+ MetadataInspector,
10
+ MetadataMap,
11
+ PropertyDecoratorFactory,
12
+ } from '@loopback/core';
13
+ import {
14
+ ModelDefinition,
15
+ ModelDefinitionSyntax,
16
+ PropertyDefinition,
17
+ PropertyType,
18
+ RelationDefinitionMap,
19
+ } from '../model';
20
+ import {RELATIONS_KEY} from '../relations/relation.decorator';
21
+
22
+ export const MODEL_KEY = MetadataAccessor.create<
23
+ Partial<ModelDefinitionSyntax>,
24
+ ClassDecorator
25
+ >('loopback:model');
26
+ export const MODEL_PROPERTIES_KEY = MetadataAccessor.create<
27
+ PropertyDefinition,
28
+ PropertyDecorator
29
+ >('loopback:model-properties');
30
+ export const MODEL_WITH_PROPERTIES_KEY = MetadataAccessor.create<
31
+ ModelDefinition,
32
+ ClassDecorator
33
+ >('loopback:model-and-properties');
34
+
35
+ export type PropertyMap = MetadataMap<Partial<PropertyDefinition>>;
36
+
37
+ /**
38
+ * Decorator for model definitions
39
+ * @param definition
40
+ * @returns A class decorator for `model`
41
+ */
42
+ export function model(definition?: Partial<ModelDefinitionSyntax>) {
43
+ return function (target: Function & {definition?: ModelDefinition}) {
44
+ definition = definition ?? {};
45
+ const def: ModelDefinitionSyntax = Object.assign(definition, {
46
+ name: definition.name ?? target.name,
47
+ });
48
+ const decorator = ClassDecoratorFactory.createDecorator(
49
+ MODEL_KEY,
50
+ definition,
51
+ {decoratorName: '@model'},
52
+ );
53
+
54
+ decorator(target);
55
+
56
+ // Build "ModelDefinition" and store it on model constructor
57
+ buildModelDefinition(target, def);
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Build model definition from decorations
63
+ * @param target - Target model class
64
+ * @param def - Model definition spec
65
+ */
66
+ export function buildModelDefinition(
67
+ target: Function & {definition?: ModelDefinition | undefined},
68
+ def?: ModelDefinitionSyntax,
69
+ ) {
70
+ // Check if the definition for this class has been built (not from the super
71
+ // class)
72
+ const baseClass = Object.getPrototypeOf(target);
73
+ if (
74
+ !def &&
75
+ target.definition &&
76
+ baseClass &&
77
+ target.definition !== baseClass.definition
78
+ ) {
79
+ return target.definition;
80
+ }
81
+ const modelDef = new ModelDefinition(def ?? {name: target.name});
82
+ const prototype = target.prototype;
83
+ const propertyMap: PropertyMap =
84
+ MetadataInspector.getAllPropertyMetadata(MODEL_PROPERTIES_KEY, prototype) ??
85
+ {};
86
+ for (const [propName, propDef] of Object.entries(propertyMap)) {
87
+ const designType =
88
+ propDef.type ??
89
+ MetadataInspector.getDesignTypeForProperty(prototype, propName);
90
+ if (!designType) {
91
+ const err: Error & {code?: string} = new Error(
92
+ `The definition of model property ${modelDef.name}.${propName} is missing ` +
93
+ '`type` field and TypeScript did not provide any design-time type. ' +
94
+ 'Learn more at https://loopback.io/doc/en/lb4/Error-codes.html#cannot_infer_property_type',
95
+ );
96
+ err.code = 'CANNOT_INFER_PROPERTY_TYPE';
97
+ throw err;
98
+ }
99
+
100
+ if (propDef.hidden) {
101
+ modelDef.settings.hiddenProperties =
102
+ modelDef.settings.hiddenProperties ?? [];
103
+ modelDef.settings.hiddenProperties.push(propName);
104
+ }
105
+ propDef.type = designType;
106
+ modelDef.addProperty(propName, propDef);
107
+ }
108
+ target.definition = modelDef;
109
+ const relationMeta: RelationDefinitionMap =
110
+ MetadataInspector.getAllPropertyMetadata(RELATIONS_KEY, prototype) ?? {};
111
+ const relations: RelationDefinitionMap = {};
112
+ // Build an object keyed by relation names
113
+ Object.values(relationMeta).forEach(r => {
114
+ relations[r.name] = r;
115
+ });
116
+ target.definition.relations = relations;
117
+ return modelDef;
118
+ }
119
+
120
+ /**
121
+ * Decorator for model properties
122
+ * @param definition
123
+ * @returns A property decorator
124
+ */
125
+ export function property(definition?: Partial<PropertyDefinition>) {
126
+ return PropertyDecoratorFactory.createDecorator(
127
+ MODEL_PROPERTIES_KEY,
128
+ Object.assign({}, definition),
129
+ {decoratorName: '@property'},
130
+ );
131
+ }
132
+
133
+ export namespace property {
134
+ export const ERR_PROP_NOT_ARRAY =
135
+ '@property.array can only decorate array properties!';
136
+ export const ERR_NO_ARGS = 'decorator received less than two parameters';
137
+
138
+ /**
139
+ *
140
+ * @param itemType - The type of array items.
141
+ * Examples: `number`, `Product`, `() => Order`.
142
+ * @param definition - Optional PropertyDefinition object for additional
143
+ * metadata
144
+ */
145
+ export function array(
146
+ itemType: PropertyType,
147
+ definition?: Partial<PropertyDefinition>,
148
+ ) {
149
+ return function (target: object, propertyName: string) {
150
+ const propType = MetadataInspector.getDesignTypeForProperty(
151
+ target,
152
+ propertyName,
153
+ );
154
+ if (propType !== Array) {
155
+ throw new Error(ERR_PROP_NOT_ARRAY);
156
+ } else {
157
+ property(
158
+ Object.assign(
159
+ {type: Array, itemType} as Partial<PropertyDefinition>,
160
+ definition,
161
+ ),
162
+ )(target, propertyName);
163
+ }
164
+ };
165
+ }
166
+ }
@@ -0,0 +1,223 @@
1
+ // Copyright IBM Corp. 2018,2020. All Rights Reserved.
2
+ // Node module: @loopback/repository
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {Context, inject, Injection} from '@loopback/core';
7
+ import assert from 'assert';
8
+ import {Class} from '../common-types';
9
+ import {DataSource} from '../datasource';
10
+ import {Entity, Model} from '../model';
11
+ import {DefaultCrudRepository, Repository} from '../repositories';
12
+ import {juggler} from '../repositories/legacy-juggler-bridge';
13
+
14
+ /**
15
+ * Type definition for decorators returned by `@repository` decorator factory
16
+ */
17
+ export type RepositoryDecorator = (
18
+ target: Object,
19
+ key?: string,
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ descriptorOrIndex?: TypedPropertyDescriptor<any> | number,
22
+ ) => void;
23
+
24
+ /**
25
+ * Metadata for a repository
26
+ */
27
+ export class RepositoryMetadata {
28
+ /**
29
+ * Name of the predefined repository
30
+ */
31
+ name?: string;
32
+ /**
33
+ * Name of the model
34
+ */
35
+ modelName?: string;
36
+ /**
37
+ * Class of the model
38
+ */
39
+ modelClass?: typeof Entity;
40
+ /**
41
+ * Name of the data source
42
+ */
43
+ dataSourceName?: string;
44
+ /**
45
+ * Instance of the data source
46
+ */
47
+ dataSource?: juggler.DataSource | DataSource;
48
+
49
+ /**
50
+ * Constructor for RepositoryMetadata
51
+ *
52
+ * @param modelOrRepo - Name or class of the model. If the value is a string and
53
+ * `dataSource` is not present, it will treated as the name of a predefined
54
+ * repository
55
+ * @param dataSource - Name or instance of the data source
56
+ *
57
+ * For example:
58
+ *
59
+ * - new RepositoryMetadata(repoName);
60
+ * - new RepositoryMetadata(modelName, dataSourceName);
61
+ * - new RepositoryMetadata(modelClass, dataSourceInstance);
62
+ * - new RepositoryMetadata(modelName, dataSourceInstance);
63
+ * - new RepositoryMetadata(modelClass, dataSourceName);
64
+ */
65
+ constructor(
66
+ modelOrRepo: string | typeof Entity,
67
+ dataSource?: string | juggler.DataSource | DataSource,
68
+ ) {
69
+ this.name =
70
+ typeof modelOrRepo === 'string' && dataSource === undefined
71
+ ? modelOrRepo
72
+ : undefined;
73
+ this.modelName =
74
+ typeof modelOrRepo === 'string' && dataSource != null
75
+ ? modelOrRepo
76
+ : undefined;
77
+ this.modelClass =
78
+ typeof modelOrRepo === 'function' ? modelOrRepo : undefined;
79
+ this.dataSourceName =
80
+ typeof dataSource === 'string' ? dataSource : undefined;
81
+ this.dataSource = typeof dataSource === 'object' ? dataSource : undefined;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Decorator for repository injections on properties or method arguments
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * class CustomerController {
91
+ * @repository(CustomerRepository) public custRepo: CustomerRepository;
92
+ *
93
+ * constructor(
94
+ * @repository(ProductRepository) public prodRepo: ProductRepository,
95
+ * ) {}
96
+ * // ...
97
+ * }
98
+ * ```
99
+ *
100
+ * @param repositoryName - Name of the repo
101
+ */
102
+ export function repository(
103
+ repositoryName: string | Class<Repository<Model>>,
104
+ ): RepositoryDecorator;
105
+
106
+ /**
107
+ * Decorator for DefaultCrudRepository generation and injection on properties
108
+ * or method arguments based on the given model and dataSource (or their names)
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * class CustomerController {
113
+ * @repository('Customer', 'mySqlDataSource')
114
+ * public custRepo: DefaultCrudRepository<
115
+ * Customer,
116
+ * typeof Customer.prototype.id
117
+ * >;
118
+ *
119
+ * constructor(
120
+ * @repository(Product, mySqlDataSource)
121
+ * public prodRepo: DefaultCrudRepository<
122
+ * Product,
123
+ * typeof Product.prototype.id
124
+ * >,
125
+ * ) {}
126
+ * // ...
127
+ * }
128
+ * ```
129
+ *
130
+ * @param model - Name/class of the model
131
+ * @param dataSource - Name/instance of the dataSource
132
+ */
133
+ export function repository(
134
+ model: string | typeof Entity,
135
+ dataSource: string | juggler.DataSource,
136
+ ): RepositoryDecorator;
137
+
138
+ export function repository(
139
+ modelOrRepo: string | Class<Repository<Model>> | typeof Entity,
140
+ dataSource?: string | juggler.DataSource,
141
+ ) {
142
+ // if string, repository or not a model ctor,
143
+ // keep it a string / assign to ctor's name (string) for DI
144
+ const stringOrModel =
145
+ typeof modelOrRepo !== 'string' && !modelOrRepo.prototype.getId
146
+ ? modelOrRepo.name
147
+ : (modelOrRepo as typeof Entity);
148
+ const meta = new RepositoryMetadata(stringOrModel, dataSource);
149
+ return function (
150
+ target: Object,
151
+ key?: string,
152
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
+ descriptorOrIndex?: TypedPropertyDescriptor<any> | number,
154
+ ) {
155
+ if (key || typeof descriptorOrIndex === 'number') {
156
+ if (meta.name) {
157
+ // Make it shortcut to `@inject('repositories.MyRepo')`
158
+ // Please note key is undefined for constructor. If strictNullChecks
159
+ // is true, the compiler will complain as reflect-metadata won't
160
+ // accept undefined or null for key. Use ! to fool the compiler.
161
+ inject('repositories.' + meta.name, meta)(
162
+ target,
163
+ key!,
164
+ descriptorOrIndex,
165
+ );
166
+ } else {
167
+ // Use repository-factory to create a repository from model + dataSource
168
+ inject('', meta, resolve)(target, key!, descriptorOrIndex);
169
+ }
170
+ return;
171
+ }
172
+ // Mixin repository into the class
173
+ throw new Error('Class level @repository is not implemented');
174
+ };
175
+ }
176
+
177
+ export namespace repository {
178
+ /**
179
+ * Decorator used to inject a Getter for a repository
180
+ * Mainly intended for usage with repository injections on relation repository
181
+ * factory
182
+ * @param nameOrClass - The repository class (ProductRepository) or a string name ('ProductRepository').
183
+ */
184
+ export function getter(nameOrClass: string | Class<Repository<Model>>) {
185
+ const name =
186
+ typeof nameOrClass === 'string' ? nameOrClass : nameOrClass.name;
187
+ return inject.getter(`repositories.${name}`);
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Resolve the @repository injection
193
+ * @param ctx - Context
194
+ * @param injection - Injection metadata
195
+ */
196
+ async function resolve(ctx: Context, injection: Injection) {
197
+ const meta = injection.metadata as RepositoryMetadata;
198
+ let modelClass = meta.modelClass;
199
+ if (meta.modelName) {
200
+ modelClass = (await ctx.get('models.' + meta.modelName)) as typeof Entity;
201
+ }
202
+ if (!modelClass) {
203
+ throw new Error(
204
+ 'Invalid repository config: ' +
205
+ ' neither modelClass nor modelName was specified.',
206
+ );
207
+ }
208
+
209
+ let dataSource = meta.dataSource;
210
+ if (meta.dataSourceName) {
211
+ dataSource = await ctx.get<DataSource>(
212
+ 'datasources.' + meta.dataSourceName,
213
+ );
214
+ }
215
+ assert(
216
+ dataSource instanceof juggler.DataSource,
217
+ 'DataSource must be provided',
218
+ );
219
+ return new DefaultCrudRepository(
220
+ modelClass,
221
+ dataSource! as juggler.DataSource,
222
+ );
223
+ }
@@ -0,0 +1,90 @@
1
+ // Copyright IBM Corp. 2019,2020. All Rights Reserved.
2
+ // Node module: @loopback/repository
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import * as assert from 'assert';
7
+ import {DataObject, PrototypeOf} from './common-types';
8
+ import {model} from './decorators';
9
+ import {Model, ModelDefinition} from './model';
10
+
11
+ /**
12
+ * Create (define) a new model class with the given name and definition.
13
+ *
14
+ * @remarks
15
+ *
16
+ * ```ts
17
+ * const Product = defineModelClass(Entity, new ModelDefinition('Product'));
18
+ * ```
19
+ *
20
+ * To enable type safety, you should describe properties of your model:
21
+ *
22
+ * ```ts
23
+ * const Product = defineModelClass<
24
+ * typeof Entity,
25
+ * {id: number, name: string}
26
+ * >(Entity, new ModelDefinition('Product'));
27
+ * ```
28
+ *
29
+ * If your model allows arbitrary (free-form) properties, then add `AnyObject`
30
+ * to the type describing model properties.
31
+ *
32
+ * ```ts
33
+ * const Product = defineModelClass<
34
+ * typeof Entity,
35
+ * AnyObject & {id: number},
36
+ * >(Entity, new ModelDefinition('Product'));
37
+ * ```
38
+ *
39
+ * @param base The base model to extend, typically Model or Entity.
40
+ * You can also use your own base class, e.g. `User`.
41
+ * @param definition Definition of the model to create.
42
+ * @typeParam BaseCtor Constructor type of the base class,
43
+ * e.g `typeof Model` or `typeof Entity`
44
+ * @typeParam Props Interface describing model properties,
45
+ * e.g. `{title: string}` or `AnyObject & {id: number}`.
46
+ */
47
+ export function defineModelClass<
48
+ BaseCtor extends typeof Model,
49
+ Props extends object = {},
50
+ >(
51
+ base: BaseCtor /* Model or Entity */,
52
+ definition: ModelDefinition,
53
+ ): DynamicModelCtor<BaseCtor, Props> {
54
+ const modelName = definition.name;
55
+ const defineNamedModelClass = new Function(
56
+ base.name,
57
+ `return class ${modelName} extends ${base.name} {}`,
58
+ );
59
+ const modelClass = defineNamedModelClass(base) as DynamicModelCtor<
60
+ BaseCtor,
61
+ Props
62
+ >;
63
+ assert.equal(modelClass.name, modelName);
64
+
65
+ // Apply `@model(definition)` to the generated class
66
+ model(definition)(modelClass);
67
+ return modelClass;
68
+ }
69
+
70
+ /**
71
+ * A type describing a model class created via `defineModelClass`.
72
+ *
73
+ * Assuming template arguments `BaseCtor` and `Props`, this type describes
74
+ * a class constructor with the following properties:
75
+ * - a constructor function accepting `DataObject<Props>` as the only argument,
76
+ * this argument is optional
77
+ * - all static fields (properties, methods) from `BaseCtor` are inherited and
78
+ * available as static fields on the dynamic class
79
+ * - all prototype fields from `BaseCtor` prototype are inherited and available
80
+ * as prototype fields on the dynamic class
81
+ */
82
+ export type DynamicModelCtor<
83
+ BaseCtor extends typeof Model,
84
+ Props extends object,
85
+ > = {
86
+ /** Model constructor accepting partial model data. */
87
+ new (
88
+ data?: DataObject<PrototypeOf<BaseCtor> & Props>,
89
+ ): PrototypeOf<BaseCtor> & Props;
90
+ } & BaseCtor;
@@ -0,0 +1,170 @@
1
+ // Copyright IBM Corp. 2020. All Rights Reserved.
2
+ // Node module: @loopback/repository
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import assert from 'assert';
7
+ import {PrototypeOf} from './common-types';
8
+ import {Entity, Model} from './model';
9
+ import {
10
+ DefaultCrudRepository,
11
+ DefaultKeyValueRepository,
12
+ juggler,
13
+ Repository,
14
+ } from './repositories';
15
+
16
+ /**
17
+ * Signature for a Repository class bound to a given model. The constructor
18
+ * accepts only the dataSource to use for persistence.
19
+ *
20
+ * `define*` functions return a class implementing this interface.
21
+ *
22
+ * @typeParam M - Model class
23
+ * @typeParam R - Repository class/interface
24
+ */
25
+ export interface ModelRepositoryClass<
26
+ M extends Model,
27
+ R extends Repository<M>,
28
+ > {
29
+ /**
30
+ * The constructor for the generated repository class
31
+ * @param dataSource - DataSource object
32
+ */
33
+ new (dataSource: juggler.DataSource): R;
34
+ prototype: R;
35
+ }
36
+
37
+ /**
38
+ * Signature for repository classes that can be used as the base class for
39
+ * `define*` functions. The constructor of a base repository class accepts
40
+ * the target model constructor and the datasource to use.
41
+ *
42
+ * `define*` functions require a class implementing this interface on input.
43
+ *
44
+ * @typeParam M - Model class constructor, e.g `typeof Model`.
45
+ * **❗️IMPORTANT: The type argument `M` is describing the model constructor type
46
+ * (e.g. `typeof Model`), not the model instance type (`Model`) as is the case
47
+ * in other repository-related types. The constructor type is required
48
+ * to support custom repository classes requiring a Model subclass in the
49
+ * constructor arguments, e.g. `Entity` or a user-provided model.**
50
+ *
51
+ * @typeParam R - Repository class/interface
52
+ */
53
+ export interface BaseRepositoryClass<
54
+ M extends typeof Model,
55
+ R extends Repository<PrototypeOf<M>>,
56
+ > {
57
+ /**
58
+ * The constructor for the generated repository class
59
+ * @param modelClass - Model class
60
+ * @param dataSource - DataSource object
61
+ */
62
+ new (modelClass: M, dataSource: juggler.DataSource): R;
63
+ prototype: R;
64
+ }
65
+
66
+ /**
67
+ * Create (define) a repository class for the given model.
68
+ *
69
+ * See also `defineCrudRepositoryClass` and `defineKeyValueRepositoryClass`
70
+ * for convenience wrappers providing repository class factory for the default
71
+ * CRUD and KeyValue implementations.
72
+ *
73
+ * **❗️IMPORTANT: The compiler (TypeScript 3.8) is not able to correctly infer
74
+ * generic arguments `M` and `R` from the class constructors provided in
75
+ * function arguments. You must always provide both M and R types explicitly.**
76
+ *
77
+ * @example
78
+ *
79
+ * ```ts
80
+ * const AddressRepository = defineRepositoryClass<
81
+ * typeof Address,
82
+ * DefaultEntityCrudRepository<
83
+ * Address,
84
+ * typeof Address.prototype.id,
85
+ * AddressRelations
86
+ * >,
87
+ * >(Address, DefaultCrudRepository);
88
+ * ```
89
+ *
90
+ * @param modelClass - A model class such as `Address`.
91
+ * @param baseRepositoryClass - Repository implementation to use as the base,
92
+ * e.g. `DefaultCrudRepository`.
93
+ *
94
+ * @typeParam M - Model class constructor (e.g. `typeof Address`)
95
+ * @typeParam R - Repository class (e.g. `DefaultCrudRepository<Address, number>`)
96
+ */
97
+ export function defineRepositoryClass<
98
+ M extends typeof Model,
99
+ R extends Repository<PrototypeOf<M>>,
100
+ >(
101
+ modelClass: M,
102
+ baseRepositoryClass: BaseRepositoryClass<M, R>,
103
+ ): ModelRepositoryClass<PrototypeOf<M>, R> {
104
+ const repoName = modelClass.name + 'Repository';
105
+ const defineNamedRepo = new Function(
106
+ 'ModelCtor',
107
+ 'BaseRepository',
108
+ `return class ${repoName} extends BaseRepository {
109
+ constructor(dataSource) {
110
+ super(ModelCtor, dataSource);
111
+ }
112
+ };`,
113
+ );
114
+
115
+ const repo = defineNamedRepo(modelClass, baseRepositoryClass);
116
+ assert.equal(repo.name, repoName);
117
+ return repo;
118
+ }
119
+
120
+ /**
121
+ * Create (define) an entity CRUD repository class for the given model.
122
+ * This function always uses `DefaultCrudRepository` as the base class,
123
+ * use `defineRepositoryClass` if you want to use your own base repository.
124
+ *
125
+ * @example
126
+ *
127
+ * ```ts
128
+ * const ProductRepository = defineCrudRepositoryClass<
129
+ * Product,
130
+ * typeof Product.prototype.id,
131
+ * ProductRelations
132
+ * >(Product);
133
+ * ```
134
+ *
135
+ * @param entityClass - An entity class such as `Product`.
136
+ *
137
+ * @typeParam E - An entity class
138
+ * @typeParam IdType - ID type for the entity
139
+ * @typeParam Relations - Relations for the entity
140
+ */
141
+ export function defineCrudRepositoryClass<
142
+ E extends Entity,
143
+ IdType,
144
+ Relations extends object,
145
+ >(
146
+ entityClass: typeof Entity & {prototype: E},
147
+ ): ModelRepositoryClass<E, DefaultCrudRepository<E, IdType, Relations>> {
148
+ return defineRepositoryClass(entityClass, DefaultCrudRepository);
149
+ }
150
+
151
+ /**
152
+ * Create (define) a KeyValue repository class for the given entity.
153
+ * This function always uses `DefaultKeyValueRepository` as the base class,
154
+ * use `defineRepositoryClass` if you want to use your own base repository.
155
+ *
156
+ * @example
157
+ *
158
+ * ```ts
159
+ * const ProductKeyValueRepository = defineKeyValueRepositoryClass(Product);
160
+ * ```
161
+ *
162
+ * @param modelClass - An entity class such as `Product`.
163
+ *
164
+ * @typeParam M - Model class
165
+ */
166
+ export function defineKeyValueRepositoryClass<M extends Model>(
167
+ modelClass: typeof Model & {prototype: M},
168
+ ): ModelRepositoryClass<M, DefaultKeyValueRepository<M>> {
169
+ return defineRepositoryClass(modelClass, DefaultKeyValueRepository);
170
+ }
@@ -0,0 +1,40 @@
1
+ // Copyright IBM Corp. 2018,2019. All Rights Reserved.
2
+ // Node module: @loopback/repository
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {Entity} from '../model';
7
+
8
+ export class EntityNotFoundError<ID, Props extends object = {}> extends Error {
9
+ code: string;
10
+ entityName: string;
11
+ entityId: ID;
12
+
13
+ constructor(
14
+ entityOrName: typeof Entity | string,
15
+ entityId: ID,
16
+ extraProperties?: Props,
17
+ ) {
18
+ const entityName =
19
+ typeof entityOrName === 'string'
20
+ ? entityOrName
21
+ : entityOrName.modelName || entityOrName.name;
22
+
23
+ const quotedId = JSON.stringify(entityId);
24
+
25
+ super(`Entity not found: ${entityName} with id ${quotedId}`);
26
+
27
+ Error.captureStackTrace(this, this.constructor);
28
+
29
+ this.code = 'ENTITY_NOT_FOUND';
30
+ this.entityName = entityName;
31
+ this.entityId = entityId;
32
+
33
+ Object.assign(this, extraProperties);
34
+ }
35
+ }
36
+
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ export function isEntityNotFoundError(e: any): e is EntityNotFoundError<any> {
39
+ return e instanceof EntityNotFoundError;
40
+ }
@@ -0,0 +1,7 @@
1
+ // Copyright IBM Corp. 2018. All Rights Reserved.
2
+ // Node module: @loopback/repository
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ export * from './entity-not-found.error';
7
+ export * from './invalid-relation.error';