pure-orm 4.0.1 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/coverage/clover.xml +401 -322
  2. package/coverage/coverage-final.json +8 -2
  3. package/coverage/lcov-report/dist/src/core.js.html +152 -131
  4. package/coverage/lcov-report/dist/src/driver-integrations/index.html +1 -1
  5. package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +1 -1
  6. package/coverage/lcov-report/dist/src/index.html +18 -18
  7. package/coverage/lcov-report/dist/src/index.js.html +1 -1
  8. package/coverage/lcov-report/dist/src/orm.js.html +1 -1
  9. package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
  10. package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
  11. package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +1 -1
  12. package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +1 -1
  13. package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
  14. package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +1 -1
  15. package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +1 -1
  16. package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
  17. package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
  18. package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
  19. package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +1 -1
  20. package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +1 -1
  21. package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +1 -1
  22. package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +1 -1
  23. package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +1 -1
  24. package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +87 -0
  25. package/coverage/lcov-report/dist/test-utils/fourteen/index.html +97 -0
  26. package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +159 -0
  27. package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +110 -0
  28. package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +138 -0
  29. package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
  30. package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
  31. package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +1 -1
  32. package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
  33. package/coverage/lcov-report/dist/test-utils/order/entities.js.html +1 -1
  34. package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
  35. package/coverage/lcov-report/dist/test-utils/order/models/index.html +1 -1
  36. package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +1 -1
  37. package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +1 -1
  38. package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +1 -1
  39. package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +1 -1
  40. package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +1 -1
  41. package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
  42. package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
  43. package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +1 -1
  44. package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +1 -1
  45. package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +1 -1
  46. package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +1 -1
  47. package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +1 -1
  48. package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +1 -1
  49. package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +1 -1
  50. package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +1 -1
  51. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +1 -1
  52. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +1 -1
  53. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +1 -1
  54. package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +1 -1
  55. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +1 -1
  56. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +1 -1
  57. package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +1 -1
  58. package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +1 -1
  59. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +1 -1
  60. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +1 -1
  61. package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +1 -1
  62. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +1 -1
  63. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +1 -1
  64. package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
  65. package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
  66. package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +1 -1
  67. package/coverage/lcov-report/dist/test-utils/six/models/index.html +1 -1
  68. package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +1 -1
  69. package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +1 -1
  70. package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +1 -1
  71. package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +1 -1
  72. package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
  73. package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
  74. package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +1 -1
  75. package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +1 -1
  76. package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
  77. package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +1 -1
  78. package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +1 -1
  79. package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +1 -1
  80. package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +1 -1
  81. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +1 -1
  82. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +1 -1
  83. package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
  84. package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
  85. package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
  86. package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
  87. package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
  88. package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
  89. package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +1 -1
  90. package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
  91. package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
  92. package/coverage/lcov-report/index.html +77 -25
  93. package/coverage/lcov-report/src/core.ts.html +162 -141
  94. package/coverage/lcov-report/src/driver-integrations/index.html +1 -1
  95. package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +1 -1
  96. package/coverage/lcov-report/src/index.html +18 -18
  97. package/coverage/lcov-report/src/index.ts.html +1 -1
  98. package/coverage/lcov-report/src/orm.ts.html +1 -1
  99. package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
  100. package/coverage/lcov-report/test-utils/blog/index.html +1 -1
  101. package/coverage/lcov-report/test-utils/blog/models/article.ts.html +1 -1
  102. package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +1 -1
  103. package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
  104. package/coverage/lcov-report/test-utils/blog/models/person.ts.html +1 -1
  105. package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +1 -1
  106. package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
  107. package/coverage/lcov-report/test-utils/five/index.html +1 -1
  108. package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
  109. package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +1 -1
  110. package/coverage/lcov-report/test-utils/five/models/order.ts.html +1 -1
  111. package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +1 -1
  112. package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +1 -1
  113. package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +1 -1
  114. package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +78 -0
  115. package/coverage/lcov-report/test-utils/fourteen/index.html +97 -0
  116. package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +177 -0
  117. package/coverage/lcov-report/test-utils/fourteen/models/index.html +110 -0
  118. package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +150 -0
  119. package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
  120. package/coverage/lcov-report/test-utils/nine/index.html +1 -1
  121. package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +1 -1
  122. package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
  123. package/coverage/lcov-report/test-utils/order/entities.ts.html +1 -1
  124. package/coverage/lcov-report/test-utils/order/index.html +1 -1
  125. package/coverage/lcov-report/test-utils/order/models/index.html +1 -1
  126. package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +1 -1
  127. package/coverage/lcov-report/test-utils/order/models/order.ts.html +1 -1
  128. package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +1 -1
  129. package/coverage/lcov-report/test-utils/order/models/product.ts.html +1 -1
  130. package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +1 -1
  131. package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
  132. package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
  133. package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +1 -1
  134. package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +1 -1
  135. package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +1 -1
  136. package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +1 -1
  137. package/coverage/lcov-report/test-utils/order-more/models/index.html +1 -1
  138. package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +1 -1
  139. package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +1 -1
  140. package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +1 -1
  141. package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +1 -1
  142. package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +1 -1
  143. package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +1 -1
  144. package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +1 -1
  145. package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +1 -1
  146. package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +1 -1
  147. package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +1 -1
  148. package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +1 -1
  149. package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +1 -1
  150. package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +1 -1
  151. package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +1 -1
  152. package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +1 -1
  153. package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +1 -1
  154. package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
  155. package/coverage/lcov-report/test-utils/six/index.html +1 -1
  156. package/coverage/lcov-report/test-utils/six/models/customer.ts.html +1 -1
  157. package/coverage/lcov-report/test-utils/six/models/index.html +1 -1
  158. package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +1 -1
  159. package/coverage/lcov-report/test-utils/six/models/order.ts.html +1 -1
  160. package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +1 -1
  161. package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +1 -1
  162. package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
  163. package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
  164. package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +1 -1
  165. package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +1 -1
  166. package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
  167. package/coverage/lcov-report/test-utils/thirteen/models/index.html +1 -1
  168. package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +1 -1
  169. package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +1 -1
  170. package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +1 -1
  171. package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +1 -1
  172. package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +1 -1
  173. package/coverage/lcov-report/test-utils/three/index.html +1 -1
  174. package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
  175. package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
  176. package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
  177. package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
  178. package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
  179. package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +1 -1
  180. package/coverage/lcov-report/test-utils/two/index.html +1 -1
  181. package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
  182. package/coverage/lcov.info +754 -619
  183. package/dist/src/core.js +11 -4
  184. package/dist/src/core.spec.js +15 -0
  185. package/dist/test-utils/fourteen/entities.d.ts +6 -0
  186. package/dist/test-utils/fourteen/entities.js +6 -0
  187. package/dist/test-utils/fourteen/entities.ts +3 -0
  188. package/dist/test-utils/fourteen/models/customer.d.ts +19 -0
  189. package/dist/test-utils/fourteen/models/customer.js +30 -0
  190. package/dist/test-utils/fourteen/models/customer.ts +36 -0
  191. package/dist/test-utils/fourteen/models/person.d.ts +17 -0
  192. package/dist/test-utils/fourteen/models/person.js +23 -0
  193. package/dist/test-utils/fourteen/models/person.ts +27 -0
  194. package/dist/test-utils/fourteen/results.json +8 -0
  195. package/package.json +1 -1
  196. package/src/core.spec.ts +15 -0
  197. package/src/core.ts +15 -8
  198. package/test-utils/fourteen/entities.ts +3 -0
  199. package/test-utils/fourteen/models/customer.ts +36 -0
  200. package/test-utils/fourteen/models/person.ts +27 -0
  201. package/test-utils/fourteen/results.json +8 -0
package/dist/src/core.js CHANGED
@@ -138,12 +138,19 @@ const createCore = ({ entities: externalEntities }) => {
138
138
  ...nodes.slice(0, indexOfOldestParent + 1).reverse()
139
139
  ];
140
140
  const nodeItPointsTo = parentHeirarchy.find((parent) => {
141
- const index = Object.values(getEntityByModel(model).references).indexOf(parent.constructor);
142
- if (index === -1) {
141
+ const indexes = Object.values(getEntityByModel(model).references)
142
+ .map((x, i) => x === parent.constructor ? i : null)
143
+ .filter((x, i) => x != null);
144
+ if (!indexes.length) {
143
145
  return false;
144
146
  }
145
- const property = Object.keys(getEntityByModel(model).references)[index];
146
- return model[property] === parent.id;
147
+ for (const index of indexes) {
148
+ const property = Object.keys(getEntityByModel(model).references)[index];
149
+ if (model[property] === parent.id) {
150
+ return true;
151
+ }
152
+ }
153
+ return false;
147
154
  });
148
155
  if (isNodeAlreadySeen) {
149
156
  if (nodeItPointsTo && !nodePointingToIt) {
@@ -10,6 +10,7 @@ const entities_5 = require("../test-utils/five/entities");
10
10
  const entities_6 = require("../test-utils/six/entities");
11
11
  const entities_7 = require("../test-utils/twelve/entities");
12
12
  const entities_8 = require("../test-utils/thirteen/entities");
13
+ const entities_9 = require("../test-utils/fourteen/entities");
13
14
  const article_1 = require("../test-utils/blog/models/article");
14
15
  const two = require('../test-utils/two/results');
15
16
  const three = require('../test-utils/three/results');
@@ -24,6 +25,7 @@ const ten = require('../test-utils/ten/results.json');
24
25
  const eleven = require('../test-utils/eleven/results.json');
25
26
  const twelve = require('../test-utils/twelve/results.json');
26
27
  const thirteen = require('../test-utils/thirteen/results.json');
28
+ const fourteen = require('../test-utils/fourteen/results.json');
27
29
  describe('createFromDatabase', () => {
28
30
  test('multiple rows reduce to one nested object (with all one-to-one or one-to-many tables)', () => {
29
31
  const core = (0, core_1.createCore)({ entities: entities_1.entities });
@@ -575,6 +577,19 @@ describe('createFromDatabase', () => {
575
577
  expect(member === null || member === void 0 ? void 0 : member.recommendations.models[3].category.id).toEqual(4);
576
578
  expect(member === null || member === void 0 ? void 0 : member.recommendations.models[3].recommendationAudiences.models[0].audience.id).toEqual(1);
577
579
  });
580
+ // Issue occcurs in nestClump
581
+ // Problem when a table has two columns which reference the same other table
582
+ test('14', () => {
583
+ var _a;
584
+ const core = (0, core_1.createCore)({ entities: entities_9.entities });
585
+ const persons = core.createFromDatabase(fourteen);
586
+ expect(persons === null || persons === void 0 ? void 0 : persons.models.length).toEqual(1);
587
+ expect(persons.models[0].id).toEqual(67);
588
+ // Known issue: A reference always uses the model's name,
589
+ // instead of some version of the column's name
590
+ expect((_a = persons.models[0].customers) === null || _a === void 0 ? void 0 : _a.models.length).toEqual(1);
591
+ expect(persons.models[0].customers.models[0].id).toEqual(4);
592
+ });
578
593
  });
579
594
  describe('createOneFromDatabase', () => {
580
595
  test('reduces to one', () => {
@@ -0,0 +1,6 @@
1
+ export declare const entities: {
2
+ tableName: string;
3
+ columns: import("../../src/core").IColumn[];
4
+ Model: typeof import("./models/person").Person;
5
+ Collection: typeof import("./models/person").Persons;
6
+ }[];
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.entities = void 0;
4
+ const person_1 = require("./models/person");
5
+ const customer_1 = require("./models/customer");
6
+ exports.entities = [person_1.personEntity, customer_1.customerEntity];
@@ -0,0 +1,3 @@
1
+ import { personEntity } from './models/person';
2
+ import { customerEntity } from './models/customer';
3
+ export const entities = [personEntity, customerEntity];
@@ -0,0 +1,19 @@
1
+ import { IModel, ICollection, IColumns } from '../../../src/index';
2
+ export declare const tableName: string;
3
+ export declare const columns: IColumns;
4
+ export declare class Customer implements IModel {
5
+ id: number;
6
+ lockedToAffiliateId: number;
7
+ lockedToSalespersonId: number;
8
+ constructor(props: any);
9
+ }
10
+ export declare class Customers implements ICollection<Customer> {
11
+ models: Array<Customer>;
12
+ constructor({ models }: any);
13
+ }
14
+ export declare const customerEntity: {
15
+ tableName: string;
16
+ columns: import("../../../src/core").IColumn[];
17
+ Model: typeof Customer;
18
+ Collection: typeof Customers;
19
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.customerEntity = exports.Customers = exports.Customer = exports.columns = exports.tableName = void 0;
4
+ const person_1 = require("./person");
5
+ exports.tableName = 'customer';
6
+ exports.columns = [
7
+ 'id',
8
+ { column: 'locked_to_affiliate_id', references: person_1.Person },
9
+ { column: 'locked_to_salesperson_id', references: person_1.Person }
10
+ ];
11
+ class Customer {
12
+ constructor(props) {
13
+ this.id = props.id;
14
+ this.lockedToAffiliateId = props.lockedToAffiliateId;
15
+ this.lockedToSalespersonId = props.lockedToSalespersonId;
16
+ }
17
+ }
18
+ exports.Customer = Customer;
19
+ class Customers {
20
+ constructor({ models }) {
21
+ this.models = models;
22
+ }
23
+ }
24
+ exports.Customers = Customers;
25
+ exports.customerEntity = {
26
+ tableName: exports.tableName,
27
+ columns: exports.columns,
28
+ Model: Customer,
29
+ Collection: Customers
30
+ };
@@ -0,0 +1,36 @@
1
+ import { IModel, ICollection, IColumns } from '../../../src/index';
2
+ import { Person } from './person';
3
+
4
+ export const tableName: string = 'customer';
5
+
6
+ export const columns: IColumns = [
7
+ 'id',
8
+ { column: 'locked_to_affiliate_id', references: Person },
9
+ { column: 'locked_to_salesperson_id', references: Person }
10
+ ];
11
+
12
+ export class Customer implements IModel {
13
+ id: number;
14
+ lockedToAffiliateId: number;
15
+ lockedToSalespersonId: number;
16
+
17
+ constructor(props: any) {
18
+ this.id = props.id;
19
+ this.lockedToAffiliateId = props.lockedToAffiliateId;
20
+ this.lockedToSalespersonId = props.lockedToSalespersonId;
21
+ }
22
+ }
23
+
24
+ export class Customers implements ICollection<Customer> {
25
+ models: Array<Customer>;
26
+ constructor({ models }: any) {
27
+ this.models = models;
28
+ }
29
+ }
30
+
31
+ export const customerEntity = {
32
+ tableName,
33
+ columns,
34
+ Model: Customer,
35
+ Collection: Customers
36
+ };
@@ -0,0 +1,17 @@
1
+ import { IModel, ICollection, IColumns } from '../../../src/index';
2
+ export declare const tableName: string;
3
+ export declare const columns: IColumns;
4
+ export declare class Person implements IModel {
5
+ id: number;
6
+ constructor(props: any);
7
+ }
8
+ export declare class Persons implements ICollection<Person> {
9
+ models: Array<Person>;
10
+ constructor({ models }: any);
11
+ }
12
+ export declare const personEntity: {
13
+ tableName: string;
14
+ columns: import("../../../src/core").IColumn[];
15
+ Model: typeof Person;
16
+ Collection: typeof Persons;
17
+ };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.personEntity = exports.Persons = exports.Person = exports.columns = exports.tableName = void 0;
4
+ exports.tableName = 'person';
5
+ exports.columns = ['id'];
6
+ class Person {
7
+ constructor(props) {
8
+ this.id = props.id;
9
+ }
10
+ }
11
+ exports.Person = Person;
12
+ class Persons {
13
+ constructor({ models }) {
14
+ this.models = models;
15
+ }
16
+ }
17
+ exports.Persons = Persons;
18
+ exports.personEntity = {
19
+ tableName: exports.tableName,
20
+ columns: exports.columns,
21
+ Model: Person,
22
+ Collection: Persons
23
+ };
@@ -0,0 +1,27 @@
1
+ import { IModel, ICollection, IColumns } from '../../../src/index';
2
+
3
+ export const tableName: string = 'person';
4
+
5
+ export const columns: IColumns = ['id'];
6
+
7
+ export class Person implements IModel {
8
+ id: number;
9
+
10
+ constructor(props: any) {
11
+ this.id = props.id;
12
+ }
13
+ }
14
+
15
+ export class Persons implements ICollection<Person> {
16
+ models: Array<Person>;
17
+ constructor({ models }: any) {
18
+ this.models = models;
19
+ }
20
+ }
21
+
22
+ export const personEntity = {
23
+ tableName,
24
+ columns,
25
+ Model: Person,
26
+ Collection: Persons
27
+ };
@@ -0,0 +1,8 @@
1
+ [
2
+ {
3
+ "person#id": 67,
4
+ "customer#id": 4,
5
+ "customer#locked_to_affiliate_id": null,
6
+ "customer#locked_to_salesperson_id": 67
7
+ }
8
+ ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pure-orm",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "main": "dist/src/index.js",
5
5
  "types": "dist/src/index.d.ts",
6
6
  "engines": {
package/src/core.spec.ts CHANGED
@@ -8,6 +8,7 @@ import { entities as fiveEntities } from '../test-utils/five/entities';
8
8
  import { entities as sixEntities } from '../test-utils/six/entities';
9
9
  import { entities as twelveEntities } from '../test-utils/twelve/entities';
10
10
  import { entities as thirteenEntities } from '../test-utils/thirteen/entities';
11
+ import { entities as fourteenEntities } from '../test-utils/fourteen/entities';
11
12
  import { Articles } from '../test-utils/blog/models/article';
12
13
  const two = require('../test-utils/two/results');
13
14
  const three = require('../test-utils/three/results');
@@ -22,6 +23,7 @@ const ten = require('../test-utils/ten/results.json');
22
23
  const eleven = require('../test-utils/eleven/results.json');
23
24
  const twelve = require('../test-utils/twelve/results.json');
24
25
  const thirteen = require('../test-utils/thirteen/results.json');
26
+ const fourteen = require('../test-utils/fourteen/results.json');
25
27
 
26
28
  describe('createFromDatabase', () => {
27
29
  test('multiple rows reduce to one nested object (with all one-to-one or one-to-many tables)', () => {
@@ -1066,6 +1068,19 @@ describe('createFromDatabase', () => {
1066
1068
  .audience.id
1067
1069
  ).toEqual(1);
1068
1070
  });
1071
+
1072
+ // Issue occcurs in nestClump
1073
+ // Problem when a table has two columns which reference the same other table
1074
+ test('14', () => {
1075
+ const core = createCore({ entities: fourteenEntities });
1076
+ const persons = core.createFromDatabase(fourteen);
1077
+ expect(persons?.models.length).toEqual(1);
1078
+ expect(persons.models[0].id).toEqual(67);
1079
+ // Known issue: A reference always uses the model's name,
1080
+ // instead of some version of the column's name
1081
+ expect(persons.models[0].customers?.models.length).toEqual(1);
1082
+ expect(persons.models[0].customers.models[0].id).toEqual(4);
1083
+ });
1069
1084
  });
1070
1085
 
1071
1086
  describe('createOneFromDatabase', () => {
package/src/core.ts CHANGED
@@ -292,16 +292,23 @@ export const createCore = ({
292
292
  ...nodes.slice(0, indexOfOldestParent + 1).reverse()
293
293
  ];
294
294
  const nodeItPointsTo = parentHeirarchy.find((parent) => {
295
- const index = Object.values(
296
- getEntityByModel(model).references
297
- ).indexOf(parent.constructor);
298
- if (index === -1) {
295
+ const indexes = Object.values(getEntityByModel(model).references)
296
+ .map((x: IModelClass, i: number) =>
297
+ x === parent.constructor ? i : null
298
+ )
299
+ .filter((x: number | null, i) => x != null) as Array<number>;
300
+ if (!indexes.length) {
299
301
  return false;
300
302
  }
301
- const property = Object.keys(getEntityByModel(model).references)[
302
- index
303
- ];
304
- return model[property as keyof typeof model] === parent.id;
303
+ for (const index of indexes) {
304
+ const property = Object.keys(getEntityByModel(model).references)[
305
+ index
306
+ ];
307
+ if (model[property] === parent.id) {
308
+ return true;
309
+ }
310
+ }
311
+ return false;
305
312
  });
306
313
  if (isNodeAlreadySeen) {
307
314
  if (nodeItPointsTo && !nodePointingToIt) {
@@ -0,0 +1,3 @@
1
+ import { personEntity } from './models/person';
2
+ import { customerEntity } from './models/customer';
3
+ export const entities = [personEntity, customerEntity];
@@ -0,0 +1,36 @@
1
+ import { IModel, ICollection, IColumns } from '../../../src/index';
2
+ import { Person } from './person';
3
+
4
+ export const tableName: string = 'customer';
5
+
6
+ export const columns: IColumns = [
7
+ 'id',
8
+ { column: 'locked_to_affiliate_id', references: Person },
9
+ { column: 'locked_to_salesperson_id', references: Person }
10
+ ];
11
+
12
+ export class Customer implements IModel {
13
+ id: number;
14
+ lockedToAffiliateId: number;
15
+ lockedToSalespersonId: number;
16
+
17
+ constructor(props: any) {
18
+ this.id = props.id;
19
+ this.lockedToAffiliateId = props.lockedToAffiliateId;
20
+ this.lockedToSalespersonId = props.lockedToSalespersonId;
21
+ }
22
+ }
23
+
24
+ export class Customers implements ICollection<Customer> {
25
+ models: Array<Customer>;
26
+ constructor({ models }: any) {
27
+ this.models = models;
28
+ }
29
+ }
30
+
31
+ export const customerEntity = {
32
+ tableName,
33
+ columns,
34
+ Model: Customer,
35
+ Collection: Customers
36
+ };
@@ -0,0 +1,27 @@
1
+ import { IModel, ICollection, IColumns } from '../../../src/index';
2
+
3
+ export const tableName: string = 'person';
4
+
5
+ export const columns: IColumns = ['id'];
6
+
7
+ export class Person implements IModel {
8
+ id: number;
9
+
10
+ constructor(props: any) {
11
+ this.id = props.id;
12
+ }
13
+ }
14
+
15
+ export class Persons implements ICollection<Person> {
16
+ models: Array<Person>;
17
+ constructor({ models }: any) {
18
+ this.models = models;
19
+ }
20
+ }
21
+
22
+ export const personEntity = {
23
+ tableName,
24
+ columns,
25
+ Model: Person,
26
+ Collection: Persons
27
+ };
@@ -0,0 +1,8 @@
1
+ [
2
+ {
3
+ "person#id": 67,
4
+ "customer#id": 4,
5
+ "customer#locked_to_affiliate_id": null,
6
+ "customer#locked_to_salesperson_id": 67
7
+ }
8
+ ]