UNPKG

@ortoo/angular-resource

Version:

Magical CRUD resource management for angular

90 lines 12.9 kB
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==