All files observable.js

0% Statements 0/77
0% Branches 0/40
0% Functions 0/8
0% Lines 0/76

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142                                                                                                                                                                                                                                                                                           
"use strict";
exports.__esModule = true;
/*
 * @Author: lijianzhang
 * @Date: 2018-03-31 21:04:00
 * @Last Modified by: lijianzhang
 * @Last Modified time: 2018-08-30 02:07:32
 * @flow
 */
var store_1 = require("./store");
var event_1 = require("./event");
var constant_1 = require("./constant");
var utils_1 = require("./utils");
/**
 * 设计流程:
 * observable 函数传入一个待观察的对象, 对改对象进行Proxy的封装
 * 主要在get, set, delete该对象的时候出来
 * get: 当处于observer执行的时候对
 *
 */
function onGet(target, key, receiver) {
    if (typeof key === 'symbol')
        return target;
    var value = Reflect.get(target, key, receiver);
    if (utils_1.isFunction(value)) {
        return value;
    }
    else if (typeof value === 'object') {
        if (utils_1.isObservableObject(value)) {
            value = toObservable(value); //eslint-disable-line
        }
    }
    if (store_1["default"].currentObserver) {
        if (!target[constant_1.OBSERVER_KEY]) {
            Object.defineProperty(target, constant_1.OBSERVER_KEY, {
                value: new Map(),
                writable: false,
                enumerable: false,
                configurable: false
            });
        }
        var observers = target[constant_1.OBSERVER_KEY].get(key);
        if (!observers) {
            observers = new Set();
            target[constant_1.OBSERVER_KEY].set(key, observers);
        }
        observers.add(store_1["default"].currentObserver);
        store_1["default"].currentObserver.bindObservers.add(observers);
    }
    return value;
}
function onSet(target, key, value, receiver) {
    var oldValue = Reflect.get(target, key, receiver);
    if (oldValue === value && key !== 'length')
        return true;
    event_1["default"].emit('set', { target: target, key: key, oldValue: oldValue, value: value });
    Reflect.set(target, key, value, receiver);
    if (target[constant_1.OBSERVER_KEY]) {
        var observers = target[constant_1.OBSERVER_KEY].get(key);
        if (observers) {
            store_1["default"].pushQueue(observers);
        }
    }
    return true;
}
function onDelete(target, key) {
    var result = Reflect.deleteProperty(target, key);
    if (target[constant_1.OBSERVER_KEY]) {
        var observers = target[constant_1.OBSERVER_KEY].get(key);
        if (observers) {
            store_1["default"].pushQueue(observers);
        }
    }
    return result;
}
function toObservable(store) {
    if (utils_1.isPrimitive(store))
        return store;
    var proxy = store[constant_1.PROXY_KEY];
    if (proxy)
        return proxy;
    proxy = new Proxy(store, {
        get: onGet,
        set: onSet,
        deleteProperty: onDelete
    });
    Object.defineProperty(store, constant_1.PROXY_KEY, {
        value: proxy,
        writable: false,
        enumerable: false,
        configurable: false
    });
    Object.defineProperty(store, constant_1.RAW_KEY, {
        value: store,
        writable: false,
        enumerable: false,
        configurable: false
    });
    return proxy;
}
exports.toObservable = toObservable;
function observable(target, key, descriptor) {
    if (key && descriptor) {
        var value_1 = descriptor.value, initializer_1 = descriptor.initializer;
        if (value_1) {
            utils_1.invariant(typeof value_1 === 'object', 'observable must a object');
            descriptor.value = function wrapAction() {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return toObservable.call.apply(toObservable, [this, value_1].concat(args));
            };
        }
        else if (initializer_1) {
            descriptor.value = function wrapAction() {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                var value = initializer_1();
                utils_1.invariant(typeof value === 'object', 'observable must a object');
                return toObservable.call.apply(toObservable, [this, value].concat(args));
            };
            delete descriptor.initializer;
        }
        return descriptor;
    }
    else if (typeof target === 'function') {
        var proxy = new Proxy(target, {
            construct: function (Cls, argumentsList) {
                var ob = new (Cls.bind.apply(Cls, [void 0].concat(argumentsList)))();
                var proxy = toObservable(ob);
                return proxy;
            }
        });
        return proxy;
    }
    return toObservable(target);
}
exports["default"] = observable;