pure-orm 4.0.2 → 4.1.4

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 (209) hide show
  1. package/.benchmarks/bench-core-baseline.json +303 -0
  2. package/.eslintrc.json +20 -10
  3. package/README.md +0 -7
  4. package/coverage/clover.xml +1493 -1232
  5. package/coverage/coverage-final.json +103 -103
  6. package/coverage/lcov-report/dist/src/core.js.html +590 -383
  7. package/coverage/lcov-report/dist/src/driver-integrations/index.html +20 -20
  8. package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +52 -52
  9. package/coverage/lcov-report/dist/src/index.html +28 -28
  10. package/coverage/lcov-report/dist/src/index.js.html +2 -2
  11. package/coverage/lcov-report/dist/src/orm.js.html +392 -209
  12. package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
  13. package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
  14. package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +15 -15
  15. package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +2 -2
  16. package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
  17. package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +13 -13
  18. package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +1 -1
  19. package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
  20. package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
  21. package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
  22. package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +4 -4
  23. package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +3 -3
  24. package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +6 -6
  25. package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +7 -7
  26. package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +2 -2
  27. package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +1 -1
  28. package/coverage/lcov-report/dist/test-utils/fourteen/index.html +1 -1
  29. package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +1 -1
  30. package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +1 -1
  31. package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +1 -1
  32. package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
  33. package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
  34. package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +6 -6
  35. package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
  36. package/coverage/lcov-report/dist/test-utils/order/entities.js.html +9 -9
  37. package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
  38. package/coverage/lcov-report/dist/test-utils/order/models/index.html +14 -14
  39. package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +11 -11
  40. package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +41 -41
  41. package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +18 -18
  42. package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +17 -17
  43. package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +12 -12
  44. package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
  45. package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
  46. package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +3 -3
  47. package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +6 -6
  48. package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +3 -3
  49. package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +4 -4
  50. package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +23 -23
  51. package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +11 -11
  52. package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +15 -15
  53. package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +39 -39
  54. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +6 -6
  55. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +7 -7
  56. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +2 -2
  57. package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +12 -12
  58. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +7 -7
  59. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +22 -22
  60. package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +11 -11
  61. package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +11 -11
  62. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +9 -9
  63. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +4 -4
  64. package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +4 -4
  65. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +15 -15
  66. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +17 -17
  67. package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
  68. package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
  69. package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +3 -3
  70. package/coverage/lcov-report/dist/test-utils/six/models/index.html +21 -21
  71. package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +10 -10
  72. package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +13 -13
  73. package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +2 -2
  74. package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +2 -2
  75. package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
  76. package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
  77. package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +2 -2
  78. package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +2 -2
  79. package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
  80. package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +14 -14
  81. package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +2 -2
  82. package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +2 -2
  83. package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +10 -10
  84. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +2 -2
  85. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +2 -2
  86. package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
  87. package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
  88. package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
  89. package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
  90. package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
  91. package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
  92. package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +2 -2
  93. package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
  94. package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
  95. package/coverage/lcov-report/index.html +103 -103
  96. package/coverage/lcov-report/src/core.ts.html +841 -415
  97. package/coverage/lcov-report/src/driver-integrations/index.html +20 -20
  98. package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +63 -63
  99. package/coverage/lcov-report/src/index.html +28 -28
  100. package/coverage/lcov-report/src/index.ts.html +1 -1
  101. package/coverage/lcov-report/src/orm.ts.html +388 -298
  102. package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
  103. package/coverage/lcov-report/test-utils/blog/index.html +1 -1
  104. package/coverage/lcov-report/test-utils/blog/models/article.ts.html +15 -15
  105. package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +2 -2
  106. package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
  107. package/coverage/lcov-report/test-utils/blog/models/person.ts.html +13 -13
  108. package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +1 -1
  109. package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
  110. package/coverage/lcov-report/test-utils/five/index.html +1 -1
  111. package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
  112. package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +4 -4
  113. package/coverage/lcov-report/test-utils/five/models/order.ts.html +3 -3
  114. package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +6 -6
  115. package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +7 -7
  116. package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +2 -2
  117. package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +1 -1
  118. package/coverage/lcov-report/test-utils/fourteen/index.html +1 -1
  119. package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +1 -1
  120. package/coverage/lcov-report/test-utils/fourteen/models/index.html +1 -1
  121. package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +1 -1
  122. package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
  123. package/coverage/lcov-report/test-utils/nine/index.html +1 -1
  124. package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +8 -8
  125. package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
  126. package/coverage/lcov-report/test-utils/order/entities.ts.html +2 -2
  127. package/coverage/lcov-report/test-utils/order/index.html +1 -1
  128. package/coverage/lcov-report/test-utils/order/models/index.html +14 -14
  129. package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +5 -5
  130. package/coverage/lcov-report/test-utils/order/models/order.ts.html +36 -36
  131. package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +13 -13
  132. package/coverage/lcov-report/test-utils/order/models/product.ts.html +13 -13
  133. package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +8 -8
  134. package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
  135. package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
  136. package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +3 -3
  137. package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +6 -6
  138. package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +3 -3
  139. package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +4 -4
  140. package/coverage/lcov-report/test-utils/order-more/models/index.html +23 -23
  141. package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +11 -11
  142. package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +15 -15
  143. package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +45 -45
  144. package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +6 -6
  145. package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +7 -7
  146. package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +2 -2
  147. package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +12 -12
  148. package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +7 -7
  149. package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +22 -22
  150. package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +11 -11
  151. package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +11 -11
  152. package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +9 -9
  153. package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +4 -4
  154. package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +4 -4
  155. package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +15 -15
  156. package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +17 -17
  157. package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
  158. package/coverage/lcov-report/test-utils/six/index.html +1 -1
  159. package/coverage/lcov-report/test-utils/six/models/customer.ts.html +3 -3
  160. package/coverage/lcov-report/test-utils/six/models/index.html +21 -21
  161. package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +10 -10
  162. package/coverage/lcov-report/test-utils/six/models/order.ts.html +13 -13
  163. package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +2 -2
  164. package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +2 -2
  165. package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
  166. package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
  167. package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +2 -2
  168. package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +2 -2
  169. package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
  170. package/coverage/lcov-report/test-utils/thirteen/models/index.html +14 -14
  171. package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +2 -2
  172. package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +2 -2
  173. package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +10 -10
  174. package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +2 -2
  175. package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +2 -2
  176. package/coverage/lcov-report/test-utils/three/index.html +1 -1
  177. package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
  178. package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
  179. package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
  180. package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
  181. package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
  182. package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +2 -2
  183. package/coverage/lcov-report/test-utils/two/index.html +1 -1
  184. package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
  185. package/coverage/lcov.info +2136 -1991
  186. package/dist/example/data-access/person.d.ts +1 -1
  187. package/dist/src/core.d.ts +13 -7
  188. package/dist/src/core.js +258 -189
  189. package/dist/src/core.spec.js +413 -0
  190. package/dist/src/driver-integrations/index.d.ts +5 -5
  191. package/dist/src/driver-integrations/pgp.spec.d.ts +1 -0
  192. package/dist/src/driver-integrations/pgp.spec.js +376 -0
  193. package/dist/src/orm.d.ts +9 -9
  194. package/dist/src/orm.js +137 -76
  195. package/dist/src/orm.spec.js +535 -85
  196. package/dist/test-utils/nine/models/feature-switch.d.ts +2 -2
  197. package/dist/test-utils/nine/models/feature-switch.ts +2 -2
  198. package/example/data-access/person.ts +1 -1
  199. package/package.json +9 -6
  200. package/scripts/bench-core.js +636 -0
  201. package/scripts/check-bench-scenarios.js +47 -0
  202. package/src/core.spec.ts +485 -2
  203. package/src/core.ts +369 -227
  204. package/src/driver-integrations/index.ts +5 -5
  205. package/src/driver-integrations/pgp.spec.ts +444 -0
  206. package/src/driver-integrations/pgp.ts +5 -5
  207. package/src/orm.spec.ts +592 -88
  208. package/src/orm.ts +173 -143
  209. package/test-utils/nine/models/feature-switch.ts +2 -2
@@ -12,6 +12,9 @@ const entities_7 = require("../test-utils/twelve/entities");
12
12
  const entities_8 = require("../test-utils/thirteen/entities");
13
13
  const entities_9 = require("../test-utils/fourteen/entities");
14
14
  const article_1 = require("../test-utils/blog/models/article");
15
+ const order_1 = require("../test-utils/order/models/order");
16
+ const utm_source_1 = require("../test-utils/order/models/utm-source");
17
+ const feature_switch_1 = require("../test-utils/nine/models/feature-switch");
15
18
  const two = require('../test-utils/two/results');
16
19
  const three = require('../test-utils/three/results');
17
20
  const one = require('../test-utils/one/results.json');
@@ -680,3 +683,413 @@ test('tables', () => {
680
683
  expect(core.tables.productVariant.columns).toEqual('"product_variant".id as "product_variant#id", "product_variant".product_id as "product_variant#product_id", "product_variant".actual_product_variant_id as "product_variant#actual_product_variant_id", "product_variant".color_id as "product_variant#color_id", "product_variant".gender_id as "product_variant#gender_id", "product_variant".size_id as "product_variant#size_id", "product_variant".barcode as "product_variant#barcode", "product_variant".price as "product_variant#price", "product_variant".compare_at_price as "product_variant#compare_at_price", "product_variant".created_date as "product_variant#created_date", "product_variant".updated_date as "product_variant#updated_date", "product_variant".grams as "product_variant#grams", "product_variant".requires_shipping as "product_variant#requires_shipping"');
681
684
  expect(core.tables.product.columns).toEqual('"product".id as "product#id", "product".vendor_id as "product#vendor_id", "product".value as "product#value", "product".label as "product#label", "product".product_type as "product#product_type", "product".created_date as "product#created_date", "product".updated_date as "product#updated_date", "product".published_date as "product#published_date", "product".category as "product#category"');
682
685
  });
686
+ /* -------------------------------------------------------------------------*/
687
+ /* getEntityByModel --------------------------------------------------------*/
688
+ /* -------------------------------------------------------------------------*/
689
+ describe('getEntityByModel', () => {
690
+ test('returns entity for a model instance', () => {
691
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
692
+ const order = new order_1.Order({ id: 1, email: 'x@x.com' });
693
+ const entity = core.getEntityByModel(order);
694
+ expect(entity.tableName).toEqual('order');
695
+ expect(entity.displayName).toEqual('order');
696
+ expect(entity.Model).toBe(order_1.Order);
697
+ expect(entity.Collection).toBe(order_1.Orders);
698
+ });
699
+ test('returns correct entity among multiple registered entities', () => {
700
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
701
+ const utm = new utm_source_1.UtmSource({
702
+ id: 1,
703
+ value: 'google',
704
+ label: 'Google',
705
+ internal: 'false'
706
+ });
707
+ const entity = core.getEntityByModel(utm);
708
+ expect(entity.tableName).toEqual('utm_source');
709
+ expect(entity.displayName).toEqual('utmSource');
710
+ });
711
+ test('throws for an unregistered model class', () => {
712
+ const core = (0, core_1.createCore)({ entities: entities_4.entities });
713
+ const order = new order_1.Order({ id: 1 });
714
+ expect(() => core.getEntityByModel(order)).toThrow('Could not find entity for class');
715
+ });
716
+ test('entity has correct propertyNames derived from columns', () => {
717
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
718
+ const order = new order_1.Order({ id: 1 });
719
+ const entity = core.getEntityByModel(order);
720
+ expect(entity.propertyNames).toContain('id');
721
+ expect(entity.propertyNames).toContain('email');
722
+ expect(entity.propertyNames).toContain('browserIP');
723
+ expect(entity.propertyNames).toContain('utmSourceId');
724
+ });
725
+ test('entity has correct columnNames derived from columns', () => {
726
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
727
+ const order = new order_1.Order({ id: 1 });
728
+ const entity = core.getEntityByModel(order);
729
+ expect(entity.columnNames).toContain('id');
730
+ expect(entity.columnNames).toContain('email');
731
+ expect(entity.columnNames).toContain('browser_ip');
732
+ expect(entity.columnNames).toContain('utm_source_id');
733
+ });
734
+ test('entity has correct prefixedColumnNames', () => {
735
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
736
+ const order = new order_1.Order({ id: 1 });
737
+ const entity = core.getEntityByModel(order);
738
+ expect(entity.prefixedColumnNames).toContain('order#id');
739
+ expect(entity.prefixedColumnNames).toContain('order#email');
740
+ expect(entity.prefixedColumnNames).toContain('order#browser_ip');
741
+ });
742
+ test('entity has correct references', () => {
743
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
744
+ const order = new order_1.Order({ id: 1 });
745
+ const entity = core.getEntityByModel(order);
746
+ expect(entity.references).toEqual({ utmSourceId: utm_source_1.UtmSource });
747
+ });
748
+ test('entity defaults primaryKeys to [id] when none specified', () => {
749
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
750
+ const order = new order_1.Order({ id: 1 });
751
+ const entity = core.getEntityByModel(order);
752
+ expect(entity.primaryKeys).toEqual(['id']);
753
+ });
754
+ test('entity selectColumnsClause is correctly formed', () => {
755
+ const core = (0, core_1.createCore)({ entities: entities_4.entities });
756
+ const fs = new feature_switch_1.FeatureSwitch({ id: 'x', label: 'x', on: true });
757
+ const entity = core.getEntityByModel(fs);
758
+ expect(entity.selectColumnsClause).toEqual('"feature_switch".id as "feature_switch#id", "feature_switch".label as "feature_switch#label", "feature_switch".on as "feature_switch#on"');
759
+ });
760
+ });
761
+ /* -------------------------------------------------------------------------*/
762
+ /* getEntityByTableName ----------------------------------------------------*/
763
+ /* -------------------------------------------------------------------------*/
764
+ describe('getEntityByTableName', () => {
765
+ test('returns entity for a valid table name', () => {
766
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
767
+ const entity = core.getEntityByTableName('order');
768
+ expect(entity.tableName).toEqual('order');
769
+ expect(entity.Model).toBe(order_1.Order);
770
+ });
771
+ test('returns correct entity among multiple registered entities', () => {
772
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
773
+ const entity = core.getEntityByTableName('utm_source');
774
+ expect(entity.tableName).toEqual('utm_source');
775
+ expect(entity.displayName).toEqual('utmSource');
776
+ expect(entity.Model).toBe(utm_source_1.UtmSource);
777
+ });
778
+ test('throws for a non-existent table name', () => {
779
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
780
+ expect(() => core.getEntityByTableName('nonexistent')).toThrow('Could not find entity for table nonexistent');
781
+ });
782
+ });
783
+ /* -------------------------------------------------------------------------*/
784
+ /* Entity configuration edge cases -----------------------------------------*/
785
+ /* -------------------------------------------------------------------------*/
786
+ describe('entity configuration', () => {
787
+ test('custom displayName is used instead of camelCase tableName', () => {
788
+ class Widget {
789
+ constructor(props) {
790
+ this.id = props.id;
791
+ }
792
+ }
793
+ class Widgets {
794
+ constructor({ models }) {
795
+ this.models = models;
796
+ }
797
+ }
798
+ const core = (0, core_1.createCore)({
799
+ entities: [
800
+ {
801
+ tableName: 'widget_thing',
802
+ displayName: 'myWidget',
803
+ columns: ['id'],
804
+ Model: Widget,
805
+ Collection: Widgets
806
+ }
807
+ ]
808
+ });
809
+ expect(core.tables.myWidget).toBeDefined();
810
+ expect(core.tables.myWidget.columns).toEqual('"widget_thing".id as "widget_thing#id"');
811
+ });
812
+ test('custom collectionDisplayName is used', () => {
813
+ class Goose {
814
+ constructor(props) {
815
+ this.id = props.id;
816
+ }
817
+ }
818
+ class Geese {
819
+ constructor({ models }) {
820
+ this.models = models;
821
+ }
822
+ }
823
+ const core = (0, core_1.createCore)({
824
+ entities: [
825
+ {
826
+ tableName: 'goose',
827
+ collectionDisplayName: 'geese',
828
+ columns: ['id'],
829
+ Model: Goose,
830
+ Collection: Geese
831
+ }
832
+ ]
833
+ });
834
+ const entity = core.getEntityByTableName('goose');
835
+ expect(entity.collectionDisplayName).toEqual('geese');
836
+ });
837
+ test('default collectionDisplayName appends "s" to displayName', () => {
838
+ const core = (0, core_1.createCore)({ entities: entities_1.entities });
839
+ const entity = core.getEntityByTableName('order');
840
+ expect(entity.collectionDisplayName).toEqual('orders');
841
+ });
842
+ test('function-based columns are resolved', () => {
843
+ class Item {
844
+ constructor(props) {
845
+ this.id = props.id;
846
+ this.name = props.name;
847
+ }
848
+ }
849
+ class Items {
850
+ constructor({ models }) {
851
+ this.models = models;
852
+ }
853
+ }
854
+ const columnsFn = () => ['id', 'name'];
855
+ const core = (0, core_1.createCore)({
856
+ entities: [
857
+ {
858
+ tableName: 'item',
859
+ columns: columnsFn,
860
+ Model: Item,
861
+ Collection: Items
862
+ }
863
+ ]
864
+ });
865
+ const entity = core.getEntityByTableName('item');
866
+ expect(entity.columnNames).toEqual(['id', 'name']);
867
+ expect(entity.propertyNames).toEqual(['id', 'name']);
868
+ });
869
+ test('custom primary key is used', () => {
870
+ class Tenant {
871
+ constructor(props) {
872
+ this.slug = props.slug;
873
+ this.name = props.name;
874
+ }
875
+ }
876
+ class Tenants {
877
+ constructor({ models }) {
878
+ this.models = models;
879
+ }
880
+ }
881
+ const core = (0, core_1.createCore)({
882
+ entities: [
883
+ {
884
+ tableName: 'tenant',
885
+ columns: [{ column: 'slug', primaryKey: true }, 'name'],
886
+ Model: Tenant,
887
+ Collection: Tenants
888
+ }
889
+ ]
890
+ });
891
+ const entity = core.getEntityByTableName('tenant');
892
+ expect(entity.primaryKeys).toEqual(['slug']);
893
+ });
894
+ test('composite primary keys', () => {
895
+ class Mapping {
896
+ constructor(props) {
897
+ this.aId = props.aId;
898
+ this.bId = props.bId;
899
+ }
900
+ }
901
+ class Mappings {
902
+ constructor({ models }) {
903
+ this.models = models;
904
+ }
905
+ }
906
+ const core = (0, core_1.createCore)({
907
+ entities: [
908
+ {
909
+ tableName: 'mapping',
910
+ columns: [
911
+ { column: 'a_id', primaryKey: true },
912
+ { column: 'b_id', primaryKey: true }
913
+ ],
914
+ Model: Mapping,
915
+ Collection: Mappings
916
+ }
917
+ ]
918
+ });
919
+ const entity = core.getEntityByTableName('mapping');
920
+ expect(entity.primaryKeys).toEqual(['a_id', 'b_id']);
921
+ });
922
+ test('column with explicit property name overrides camelCase', () => {
923
+ class Thing {
924
+ constructor(props) {
925
+ this.myIP = props.myIP;
926
+ }
927
+ }
928
+ class Things {
929
+ constructor({ models }) {
930
+ this.models = models;
931
+ }
932
+ }
933
+ const core = (0, core_1.createCore)({
934
+ entities: [
935
+ {
936
+ tableName: 'thing',
937
+ columns: [{ column: 'ip_address', property: 'myIP' }],
938
+ Model: Thing,
939
+ Collection: Things
940
+ }
941
+ ]
942
+ });
943
+ const entity = core.getEntityByTableName('thing');
944
+ expect(entity.propertyNames).toEqual(['myIP']);
945
+ expect(entity.columnNames).toEqual(['ip_address']);
946
+ });
947
+ test('getPkId returns concatenated primary key values', () => {
948
+ class Mapping {
949
+ constructor(props) {
950
+ this.a_id = props.aId;
951
+ this.b_id = props.bId;
952
+ }
953
+ }
954
+ class Mappings {
955
+ constructor({ models }) {
956
+ this.models = models;
957
+ }
958
+ }
959
+ const core = (0, core_1.createCore)({
960
+ entities: [
961
+ {
962
+ tableName: 'mapping',
963
+ columns: [
964
+ { column: 'a_id', primaryKey: true },
965
+ { column: 'b_id', primaryKey: true }
966
+ ],
967
+ Model: Mapping,
968
+ Collection: Mappings
969
+ }
970
+ ]
971
+ });
972
+ const entity = core.getEntityByTableName('mapping');
973
+ const m = new Mapping({ aId: 5, bId: 10 });
974
+ expect(entity.getPkId(m)).toEqual('510');
975
+ });
976
+ test('entity with no columns other than id', () => {
977
+ class Simple {
978
+ constructor(props) {
979
+ this.id = props.id;
980
+ }
981
+ }
982
+ class Simples {
983
+ constructor({ models }) {
984
+ this.models = models;
985
+ }
986
+ }
987
+ const core = (0, core_1.createCore)({
988
+ entities: [
989
+ {
990
+ tableName: 'simple',
991
+ columns: ['id'],
992
+ Model: Simple,
993
+ Collection: Simples
994
+ }
995
+ ]
996
+ });
997
+ const entity = core.getEntityByTableName('simple');
998
+ expect(entity.columnNames).toEqual(['id']);
999
+ expect(entity.propertyNames).toEqual(['id']);
1000
+ expect(entity.primaryKeys).toEqual(['id']);
1001
+ expect(entity.references).toEqual({});
1002
+ });
1003
+ });
1004
+ /* -------------------------------------------------------------------------*/
1005
+ /* createFromDatabase error/edge cases -------------------------------------*/
1006
+ /* -------------------------------------------------------------------------*/
1007
+ describe('createFromDatabase edge cases', () => {
1008
+ test('handles a single row (not an array)', () => {
1009
+ const core = (0, core_1.createCore)({ entities: entities_4.entities });
1010
+ const row = {
1011
+ 'feature_switch#id': 'test_switch',
1012
+ 'feature_switch#label': 'Test',
1013
+ 'feature_switch#on': true
1014
+ };
1015
+ const result = core.createFromDatabase(row);
1016
+ expect(result.models.length).toEqual(1);
1017
+ expect(result.models[0].id).toEqual('test_switch');
1018
+ });
1019
+ test('throws when column names are not namespaced', () => {
1020
+ const core = (0, core_1.createCore)({ entities: entities_4.entities });
1021
+ expect(() => core.createFromDatabase([{ id: 1, label: 'test', on: true }])).toThrow('Column names must be namespaced to table');
1022
+ });
1023
+ test('handles meta_ prefixed columns', () => {
1024
+ class Widget {
1025
+ constructor(props) {
1026
+ this.id = props.id;
1027
+ Object.assign(this, props);
1028
+ }
1029
+ }
1030
+ class Widgets {
1031
+ constructor({ models }) {
1032
+ this.models = models;
1033
+ }
1034
+ }
1035
+ const core = (0, core_1.createCore)({
1036
+ entities: [
1037
+ {
1038
+ tableName: 'widget',
1039
+ columns: ['id'],
1040
+ Model: Widget,
1041
+ Collection: Widgets
1042
+ }
1043
+ ]
1044
+ });
1045
+ const result = core.createFromDatabase([
1046
+ { 'widget#id': 1, 'widget#meta_count': 42 }
1047
+ ]);
1048
+ expect(result.models[0].id).toEqual(1);
1049
+ expect(result.models[0].metaCount).toEqual(42);
1050
+ });
1051
+ test('throws for non-meta unrecognized columns', () => {
1052
+ class Widget {
1053
+ constructor(props) {
1054
+ this.id = props.id;
1055
+ }
1056
+ }
1057
+ class Widgets {
1058
+ constructor({ models }) {
1059
+ this.models = models;
1060
+ }
1061
+ }
1062
+ const core = (0, core_1.createCore)({
1063
+ entities: [
1064
+ {
1065
+ tableName: 'widget',
1066
+ columns: ['id'],
1067
+ Model: Widget,
1068
+ Collection: Widgets
1069
+ }
1070
+ ]
1071
+ });
1072
+ expect(() => core.createFromDatabase([{ 'widget#id': 1, 'widget#unknown_col': 'x' }])).toThrow('No property name for "unknown_col"');
1073
+ });
1074
+ });
1075
+ /* -------------------------------------------------------------------------*/
1076
+ /* tables property ---------------------------------------------------------*/
1077
+ /* -------------------------------------------------------------------------*/
1078
+ describe('tables property', () => {
1079
+ test('uses displayName as key', () => {
1080
+ const core = (0, core_1.createCore)({ entities: entities_2.entities });
1081
+ expect(core.tables.article).toBeDefined();
1082
+ expect(core.tables.person).toBeDefined();
1083
+ expect(core.tables.articleTag).toBeDefined();
1084
+ expect(core.tables.tag).toBeDefined();
1085
+ });
1086
+ test('each table entry has a columns string', () => {
1087
+ const core = (0, core_1.createCore)({ entities: entities_4.entities });
1088
+ expect(typeof core.tables.featureSwitch.columns).toBe('string');
1089
+ expect(core.tables.featureSwitch.columns).toContain('feature_switch');
1090
+ });
1091
+ test('single entity produces single table entry', () => {
1092
+ const core = (0, core_1.createCore)({ entities: entities_4.entities });
1093
+ expect(Object.keys(core.tables).length).toEqual(1);
1094
+ });
1095
+ });
@@ -6,9 +6,9 @@ export interface ICreateForDriverOptions {
6
6
  }
7
7
  export interface ICoreIntegratedDriver extends ICore {
8
8
  db: any;
9
- one: <T extends IModel>(query: string, values?: object, errorHandler?: (err: Error) => never) => T;
10
- oneOrNone: <T extends IModel>(query: string, values?: object, errorHandler?: (err: Error) => never) => T | void;
11
- many: <T extends ICollection<IModel>>(query: string, values?: object, errorHandler?: (err: Error) => never) => T;
12
- any: <T extends ICollection<IModel>>(query: string, values?: object, errorHandler?: (err: Error) => never) => T | void;
13
- none: (query: string, values?: object, errorHandler?: (err: Error) => never) => void;
9
+ one: <T extends IModel>(query: string, values?: object, errorHandler?: (err: Error) => never) => Promise<T>;
10
+ oneOrNone: <T extends IModel>(query: string, values?: object, errorHandler?: (err: Error) => never) => Promise<T | void>;
11
+ many: <T extends ICollection<IModel>>(query: string, values?: object, errorHandler?: (err: Error) => never) => Promise<T>;
12
+ any: <T extends ICollection<IModel>>(query: string, values?: object, errorHandler?: (err: Error) => never) => Promise<T | void>;
13
+ none: (query: string, values?: object, errorHandler?: (err: Error) => never) => Promise<void>;
14
14
  }
@@ -0,0 +1 @@
1
+ export {};