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.
- package/coverage/clover.xml +401 -322
- package/coverage/coverage-final.json +8 -2
- package/coverage/lcov-report/dist/src/core.js.html +152 -131
- package/coverage/lcov-report/dist/src/driver-integrations/index.html +1 -1
- package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +1 -1
- package/coverage/lcov-report/dist/src/index.html +18 -18
- package/coverage/lcov-report/dist/src/index.js.html +1 -1
- package/coverage/lcov-report/dist/src/orm.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +87 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/index.html +97 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +159 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +110 -0
- package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +138 -0
- package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
- package/coverage/lcov-report/index.html +77 -25
- package/coverage/lcov-report/src/core.ts.html +162 -141
- package/coverage/lcov-report/src/driver-integrations/index.html +1 -1
- package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +1 -1
- package/coverage/lcov-report/src/index.html +18 -18
- package/coverage/lcov-report/src/index.ts.html +1 -1
- package/coverage/lcov-report/src/orm.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/article.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/person.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/order.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +78 -0
- package/coverage/lcov-report/test-utils/fourteen/index.html +97 -0
- package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +177 -0
- package/coverage/lcov-report/test-utils/fourteen/models/index.html +110 -0
- package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +150 -0
- package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/order.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/product.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/customer.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/order.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +1 -1
- package/coverage/lcov-report/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +1 -1
- package/coverage/lcov-report/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
- package/coverage/lcov.info +754 -619
- package/dist/src/core.js +11 -4
- package/dist/src/core.spec.js +15 -0
- package/dist/test-utils/fourteen/entities.d.ts +6 -0
- package/dist/test-utils/fourteen/entities.js +6 -0
- package/dist/test-utils/fourteen/entities.ts +3 -0
- package/dist/test-utils/fourteen/models/customer.d.ts +19 -0
- package/dist/test-utils/fourteen/models/customer.js +30 -0
- package/dist/test-utils/fourteen/models/customer.ts +36 -0
- package/dist/test-utils/fourteen/models/person.d.ts +17 -0
- package/dist/test-utils/fourteen/models/person.js +23 -0
- package/dist/test-utils/fourteen/models/person.ts +27 -0
- package/dist/test-utils/fourteen/results.json +8 -0
- package/package.json +1 -1
- package/src/core.spec.ts +15 -0
- package/src/core.ts +15 -8
- package/test-utils/fourteen/entities.ts +3 -0
- package/test-utils/fourteen/models/customer.ts +36 -0
- package/test-utils/fourteen/models/person.ts +27 -0
- 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
|
|
142
|
-
|
|
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
|
|
146
|
-
|
|
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) {
|
package/dist/src/core.spec.js
CHANGED
|
@@ -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
|
+
"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,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
|
+
};
|
package/package.json
CHANGED
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
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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,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
|
+
};
|