@ortoo/angular-resource
Version:
Magical CRUD resource management for angular
90 lines • 12.9 kB
JavaScript
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { EventEmitter } from './emitter';
const ArrayProto = Array.prototype;
export class ArrayEmitter extends Array {
constructor(...args) {
super(...args);
let arr = this;
// Non enumerable so that we can send the array over postMessage
Object.defineProperty(arr, '$emitter', {
enumerable: false,
value: new EventEmitter(),
});
Object.defineProperty(arr, '$subject', {
enumerable: false,
value: new BehaviorSubject(this),
});
this.$emitter.on('update', () => {
this.$subject.next(this);
});
// Generate our Array Emitter methods
let ArrayEmitterMethods = {};
['on', 'off', 'listen', 'once', 'addListener', 'removeListener'].forEach(key => {
ArrayEmitterMethods[key] = {
enumerable: false,
value: (...methodArgs) => {
return this.$emitter[key](...methodArgs);
},
};
});
// These methods create new arrays
['reverse', 'sort', 'splice'].forEach(key => {
ArrayEmitterMethods[key] = {
enumerable: false,
value: (...methodArgs) => {
let emitter = this.$emitter;
emitter.on('update', () => {
ArrayProto[key].apply(this, methodArgs);
});
ArrayProto[key].apply(this, methodArgs);
return this;
},
};
});
['filter', 'map', 'slice'].forEach(key => {
ArrayEmitterMethods[key] = {
enumerable: false,
value: (...methodArgs) => {
let newArr = new ArrayEmitter();
let emitter = this.$emitter;
emitter.on('update', () => {
updateNewArr(ArrayProto[key].apply(this, methodArgs));
newArr.$emitter.emit('update', newArr);
});
updateNewArr(ArrayProto[key].apply(this, methodArgs));
function updateNewArr(updatedArr) {
newArr.length = 0;
for (let i = 0; i < updatedArr.length; i++) {
newArr.push(updatedArr[i]);
}
}
return newArr;
},
};
});
ArrayEmitterMethods.concat = {
enumerable: false,
value: (...methodArgs) => {
let newArr = new ArrayEmitter();
let allArrs = [this, ...methodArgs];
let qries = allArrs.filter((obj) => (obj.$emitter && Array.isArray(obj)));
qries.forEach((qry) => {
let emitter = qry.$emitter;
emitter.on('update', () => {
updateConcat();
newArr.$emitter.emit('update', newArr);
});
});
updateConcat();
return newArr;
function updateConcat() {
let concatted = ArrayProto.concat.call(this, ...methodArgs);
newArr.length = 0;
newArr.push(...concatted);
}
},
};
Object.defineProperties(arr, ArrayEmitterMethods);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIvQG9ydG9vL2FuZ3VsYXItcmVzb3VyY2UvIiwic291cmNlcyI6WyJhcnJheS1lbWl0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsWUFBWSxFQUF3QixNQUFNLFdBQVcsQ0FBQztBQUc5RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0FBRW5DLE1BQU0sbUJBQXVCLFNBQVEsS0FBUTtJQVczQyxZQUFZLEdBQUcsSUFBVztRQUN4QixLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNmLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztRQUVmLGdFQUFnRTtRQUNoRSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUU7WUFDckMsVUFBVSxFQUFFLEtBQUs7WUFDakIsS0FBSyxFQUFFLElBQUksWUFBWSxFQUFFO1NBQzFCLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRTtZQUNyQyxVQUFVLEVBQUUsS0FBSztZQUNqQixLQUFLLEVBQUUsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUVILHFDQUFxQztRQUNyQyxJQUFJLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNsQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRztZQUMxRSxtQkFBbUIsQ0FBQyxHQUFH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QUFzQjtvQkFDbkMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUU7d0JBQ25CLFlBQVksRUFBRSxDQUFDO3dCQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDekMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsWUFBWSxFQUFFLENBQUM7Z0JBRWYsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFFZDtvQkFDRSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztvQkFDNUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMvQmVoYXZpb3JTdWJqZWN0JztcblxuaW1wb3J0IHtFdmVudEVtaXR0ZXIsIEhhbmRsZXIsIFN1YnNjcmlwdGlvbn0gZnJvbSAnLi9lbWl0dGVyJztcbmltcG9ydCB7QXJyYXlFbWl0dGVyIGFzIElBcnJheUVtaXR0ZXJ9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5leHBvcnQgY2xhc3MgQXJyYXlFbWl0dGVyPFQ+IGV4dGVuZHMgQXJyYXk8VD4gaW1wbGVtZW50cyBJQXJyYXlFbWl0dGVyPFQ+IHtcblxuICBwdWJsaWMgJGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjtcbiAgcHVibGljICRzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXJyYXlFbWl0dGVyPFQ+PjtcbiAgcHVibGljIG9uOiB7KG5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcik6IHZvaWR9O1xuICBwdWJsaWMgb2ZmOiB7KG5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcik6IHZvaWR9O1xuICBwdWJsaWMgbGlzdGVuOiB7KG5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcik6IFN1YnNjcmlwdGlvbn07XG4gIHB1YmxpYyBvbmNlOiB7KG5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcik6IHZvaWR9O1xuICBwdWJsaWMgYWRkTGlzdGVuZXI6IHsobmFtZTogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyKTogdm9pZH07XG4gIHB1YmxpYyByZW1vdmVMaXN0ZW5lcjogeyhuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXIpOiB2b2lkfTtcblxuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgIGxldCBhcnIgPSB0aGlzO1xuXG4gICAgLy8gTm9uIGVudW1lcmFibGUgc28gdGhhdCB3ZSBjYW4gc2VuZCB0aGUgYXJyYXkgb3ZlciBwb3N0TWVzc2FnZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnIsICckZW1pdHRlcicsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG5ldyBFdmVudEVtaXR0ZXIoKSxcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnIsICckc3ViamVjdCcsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcyksXG4gICAgfSk7XG5cbiAgICB0aGlzLiRlbWl0dGVyLm9uKCd1cGRhdGUnLCAoKSA9PiB7XG4gICAgICB0aGlzLiRzdWJqZWN0Lm5leHQodGhpcyk7XG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSBvdXIgQXJyYXkgRW1pdHRlciBtZXRob2RzXG4gICAgbGV0IEFycmF5RW1pdHRlck1ldGhvZHM6IGFueSA9IHt9O1xuICAgIFsnb24nLCAnb2ZmJywgJ2xpc3RlbicsICdvbmNlJywgJ2FkZExpc3RlbmVyJywgJ3JlbW92ZUxpc3RlbmVyJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgQXJyYXlFbWl0dGVyTWV0aG9kc1trZXldID0ge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6ICguLi5tZXRob2RBcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLiRlbWl0dGVyW2tleV0oLi4ubWV0aG9kQXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gVGhlc2UgbWV0aG9kcyBjcmVhdGUgbmV3IGFycmF5c1xuICAgIFsncmV2ZXJzZScsICdzb3J0JywgJ3NwbGljZSddLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIEFycmF5RW1pdHRlck1ldGhvZHNba2V5XSA9IHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiAoLi4ubWV0aG9kQXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBsZXQgZW1pdHRlciA9IHRoaXMuJGVtaXR0ZXI7XG4gICAgICAgICAgZW1pdHRlci5vbigndXBkYXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgQXJyYXlQcm90b1trZXldLmFwcGx5KHRoaXMsIG1ldGhvZEFyZ3MpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgQXJyYXlQcm90b1trZXldLmFwcGx5KHRoaXMsIG1ldGhvZEFyZ3MpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIFsnZmlsdGVyJywgJ21hcCcsICdzbGljZSddLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIEFycmF5RW1pdHRlck1ldGhvZHNba2V5XSA9IHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiAoLi4ubWV0aG9kQXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBsZXQgbmV3QXJyOiBhbnkgPSBuZXcgQXJyYXlFbWl0dGVyKCk7XG4gICAgICAgICAgbGV0IGVtaXR0ZXIgPSB0aGlzLiRlbWl0dGVyO1xuICAgICAgICAgIGVtaXR0ZXIub24oJ3VwZGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZU5ld0FycihBcnJheVByb3RvW2tleV0uYXBwbHkodGhpcywgbWV0aG9kQXJncykpO1xuICAgICAgICAgICAgbmV3QXJyLiRlbWl0dGVyLmVtaXQoJ3VwZGF0ZScsIG5ld0Fycik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB1cGRhdGVOZXdBcnIoQXJyYXlQcm90b1trZXldLmFwcGx5KHRoaXMsIG1ldGhvZEFyZ3MpKTtcblxuICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZU5ld0Fycih1cGRhdGVkQXJyOiBhbnlbXSkge1xuICAgICAgICAgICAgbmV3QXJyLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVwZGF0ZWRBcnIubGVuZ3RoOyBpKyspIHsgLy8gdHNsaW50OmRpc2FibGUtbGluZSBwcmVmZXItZm9yLW9mXG4gICAgICAgICAgICAgIG5ld0Fyci5wdXNoKHVwZGF0ZWRBcnJbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXdBcnI7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgQXJyYXlFbWl0dGVyTWV0aG9kcy5jb25jYXQgPSB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiAoLi4ubWV0aG9kQXJnczogYW55W10pID0+IHtcbiAgICAgICAgbGV0IG5ld0FyciA9IG5ldyBBcnJheUVtaXR0ZXIoKTtcbiAgICAgICAgbGV0IGFsbEFycnMgPSBbdGhpcywgLi4ubWV0aG9kQXJnc107XG4gICAgICAgIGxldCBxcmllcyA9IGFsbEFycnMuZmlsdGVyKChvYmo6IGFueSkgPT4gKG9iai4kZW1pdHRlciAmJiBBcnJheS5pc0FycmF5KG9iaikpKTtcbiAgICAgICAgcXJpZXMuZm9yRWFjaCgocXJ5OiBBcnJheUVtaXR0ZXI8YW55PikgPT4ge1xuICAgICAgICAgIGxldCBlbWl0dGVyID0gcXJ5LiRlbWl0dGVyO1xuICAgICAgICAgIGVtaXR0ZXIub24oJ3VwZGF0ZScsICgpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZUNvbmNhdCgpO1xuICAgICAgICAgICAgbmV3QXJyLiRlbWl0dGVyLmVtaXQoJ3VwZGF0ZScsIG5ld0Fycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHVwZGF0ZUNvbmNhdCgpO1xuXG4gICAgICAgIHJldHVybiBuZXdBcnI7XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ29uY2F0KCkge1xuICAgICAgICAgIGxldCBjb25jYXR0ZWQgPSBBcnJheVByb3RvLmNvbmNhdC5jYWxsKHRoaXMsIC4uLm1ldGhvZEFyZ3MpO1xuICAgICAgICAgIG5ld0Fyci5sZW5ndGggPSAwO1xuICAgICAgICAgIG5ld0Fyci5wdXNoKC4uLmNvbmNhdHRlZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFyciwgQXJyYXlFbWl0dGVyTWV0aG9kcyk7XG4gIH1cbn1cbiJdfQ==