65 lines
8.6 KiB
JavaScript
65 lines
8.6 KiB
JavaScript
"use strict";
|
|||
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
|
exports.isRelationshipCollection = exports.relationshipCollection = exports.NO_RELATIONSHIPS = void 0;
|
||
|
|
const NO_RELATIONSHIPS = () => ({});
|
||
|
|
exports.NO_RELATIONSHIPS = NO_RELATIONSHIPS;
|
||
|
|
function relationshipCollection(fromField, toField) {
|
||
|
|
const forward = new Map();
|
||
|
|
const backward = new Map();
|
||
|
|
function add(fromId, toId, attrs) {
|
||
|
|
let f = forward.get(fromId);
|
||
|
|
if (!f) {
|
||
|
|
f = [];
|
||
|
|
forward.set(fromId, f);
|
||
|
|
}
|
||
|
|
let b = backward.get(toId);
|
||
|
|
if (!b) {
|
||
|
|
b = [];
|
||
|
|
backward.set(toId, b);
|
||
|
|
}
|
||
|
|
// Behaves like a set, only add new relationship if it is structurally distinct
|
||
|
|
const forwardRel = { $id: toId, ...attrs };
|
||
|
|
const forwardRelStr = JSON.stringify(forwardRel);
|
||
|
|
const existingRelationship = f.find((x) => JSON.stringify(x) === forwardRelStr);
|
||
|
|
if (!existingRelationship) {
|
||
|
|
f.push(forwardRel);
|
||
|
|
b.push({ $id: fromId, ...attrs });
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
type: 'rel',
|
||
|
|
fromColl: fromField,
|
||
|
|
toColl: toField,
|
||
|
|
forward,
|
||
|
|
backward,
|
||
|
|
add(from, to, attributes) {
|
||
|
|
add(from.$id, to.$id, attributes);
|
||
|
|
},
|
||
|
|
dehydrate() {
|
||
|
|
return {
|
||
|
|
type: 'rel',
|
||
|
|
forward: Object.fromEntries(forward.entries()),
|
||
|
|
};
|
||
|
|
},
|
||
|
|
hydrateFrom(x) {
|
||
|
|
forward.clear();
|
||
|
|
backward.clear();
|
||
|
|
for (const [fromId, targets] of Object.entries(x.forward)) {
|
||
|
|
for (const target of targets) {
|
||
|
|
add(fromId, target.$id, removeId(target));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|
||
|
|
exports.relationshipCollection = relationshipCollection;
|
||
|
|
function isRelationshipCollection(x) {
|
||
|
|
return typeof x === 'object' && !!x && x.type === 'rel';
|
||
|
|
}
|
||
|
|
exports.isRelationshipCollection = isRelationshipCollection;
|
||
|
|
function removeId(x) {
|
||
|
|
const ret = { ...x };
|
||
|
|
delete ret.$id;
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zaGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlbGF0aW9uc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2Qk8sTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQTlCLFFBQUEsZ0JBQWdCLG9CQUFjO0FBRTNDLFNBQWdCLHNCQUFzQixDQUNwQyxTQUF3QixFQUN4QixPQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUNuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUVwRCxTQUFTLEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDbkQsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ04sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ04sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO1FBRUQsK0VBQStFO1FBQy9FLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUs7UUFDWCxRQUFRLEVBQUUsU0FBUztRQUNuQixNQUFNLEVBQUUsT0FBTztRQUNmLE9BQU87UUFDUCxRQUFRO1FBQ1IsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsVUFBZTtZQUMzQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxTQUFTO1lBQ1AsT0FBTztnQkFDTCxJQUFJLEVBQUUsS0FBSztnQkFDWCxPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDL0MsQ0FBQztRQUNKLENBQUM7UUFDRCxXQUFXLENBQUMsQ0FBTTtZQUNoQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWpCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUEwQixFQUFFO29CQUMvQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUF4REQsd0RBd0RDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsQ0FBVTtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQVMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQ25FLENBQUM7QUFGRCw0REFFQztBQUVELFNBQVMsUUFBUSxDQUFtQixDQUFJO0lBQ3RDLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNyQixPQUFRLEdBQVcsQ0FBQyxHQUFHLENBQUM7SUFDeEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlDb2xsZWN0aW9uIH0gZnJvbSAnLi9lbnRpdHknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcDxGcm9tIGV4dGVuZHMgRW50aXR5LCBUbyBleHRlbmRzIEVudGl0eSwgQXR0cmlidXRlcyA9IHt9PiB7XG4gIHJlYWRvbmx5IGZyb206IEZyb207XG4gIHJlYWRvbmx5IHRvOiBUbztcbiAgcmVhZG9ubHkgYXR0cjogQXR0cmlidXRlcztcbn1cblxudHlwZSBGcm9tR2V0dGVyPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+ID0gKGlkOiBzdHJpbmcpID0+IFJbJ2Zyb20nXTtcbnR5cGUgVG9HZXR0ZXI8UiBleHRlbmRzIFJlbGF0aW9uc2hpcDxhbnksIGFueSwgYW55Pj4gPSAoaWQ6IHN0cmluZykgPT4gUlsndG8nXTtcblxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGlvbnNoaXBDb2xsZWN0aW9uPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+IHtcbiAgcmVhZG9ubHkgdHlwZTogJ3JlbCc7XG4gIHJlYWRvbmx5IGZyb21Db2xsOiBGcm9tR2V0dGVyPFI+O1xuICByZWFkb25seSB0b0NvbGw6IFRvR2V0dGVyPFI+O1xuICByZWFkb25seSBmb3J3YXJkOiBNYXA8c3RyaW5nLCBSZWw8UlsnYXR0ciddPltdPjtcbiAgcmVhZG9ubHkgYmFja3dhcmQ6IE1hcDxzdHJpbmcsIFJlbDxSWydhdHRyJ10+W10+O1xuXG4gIGFkZChmcm9tOiBSWydmcm9tJ10sIHRvOiBSWyd0byddLCBhdHRyaWJ1dGVzOiBSWydhdHRyJ10pOiB2b2lkO1xuICBkZWh5ZHJhdGUoKTogYW55O1xuICBoeWRyYXRlRnJvbSh4OiBhbnkpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBSZWw8QXR0cmlidXRlcz4gPSB7IHJlYWRvbmx5ICRpZDogc3RyaW5nIH0gJiBBdHRyaWJ1dGVzO1xuXG5leHBvcnQgdHlwZSBLZXlGb3JFbnRpdHlDb2xsZWN0aW9uPFMsIEUgZXh0ZW5kcyBFbnRpdHk+ID0ge1xuICBbSyBpbiBrZXlvZiBTXTogU1tLX
|