reactive-di
Advanced tools
Comparing version 4.0.9 to 4.0.10
@@ -5,2 +5,7 @@ # Change Log | ||
<a name="4.0.10"></a> | ||
## [4.0.10](https://github.com/zerkalica/reactive-di/compare/v4.0.9...v4.0.10) (2017-09-06) | ||
<a name="4.0.9"></a> | ||
@@ -7,0 +12,0 @@ ## [4.0.9](https://github.com/zerkalica/reactive-di/compare/v4.0.8...v4.0.9) (2017-08-27) |
@@ -125,12 +125,13 @@ import { defaultContext, detached, memkey } from 'lom_atom'; | ||
function empty() {} | ||
var Injector = function () { | ||
function Injector(items, sheetProcessor, parent, displayName) { | ||
function Injector(items, sheetProcessor, state, parent, displayName, instance) { | ||
this._resolved = false; | ||
this._listeners = undefined; | ||
this._instance = instance || 0; | ||
this._state = state || null; | ||
this.parent = parent; | ||
this.displayName = displayName || 'Injector'; | ||
this.displayName = displayName || '$'; | ||
this._sheetManager = sheetProcessor instanceof SheetManager ? sheetProcessor : new SheetManager(sheetProcessor, this); | ||
var map = this._map = new WeakMap(); | ||
var map = this._cache = new Map(); | ||
var sticked = undefined; | ||
@@ -144,3 +145,7 @@ if (items !== undefined) { | ||
} else if (typeof item === 'function') { | ||
map.set(item, empty); | ||
if (sticked === undefined) { | ||
sticked = new Set(); | ||
} | ||
sticked.add(item); | ||
} else { | ||
@@ -151,22 +156,26 @@ map.set(item.constructor, item); | ||
} | ||
this._sticked = sticked; | ||
} | ||
Injector.prototype.value = function value(key) { | ||
var value = this._map.get(key); | ||
var value = this._cache.get(key); | ||
if (value === undefined) { | ||
var current = this.parent; | ||
if (this._sticked === undefined || !this._sticked.has(key)) { | ||
var current = this.parent; | ||
if (current !== undefined) { | ||
do { | ||
value = current._map.get(key); | ||
if (current !== undefined) { | ||
do { | ||
value = current._cache.get(key); | ||
if (value !== undefined) { | ||
this._map.set(key, value); | ||
if (value !== undefined) { | ||
this._cache.set(key, value); | ||
return value; | ||
} | ||
return value; | ||
} | ||
current = current.parent; | ||
} while (current !== undefined); | ||
current = current.parent; | ||
} while (current !== undefined); | ||
} | ||
} | ||
@@ -176,7 +185,15 @@ | ||
this._map.set(key, value); | ||
} else if (value === empty) { | ||
value = this._fastNew(key); | ||
this._cache.set(key, value); | ||
this._map.set(key, value); | ||
var keyName = (key.displayName || key.name) + (this._instance > 0 ? '[' + this._instance + ']' : ''); | ||
value.displayName = this.displayName + '.' + keyName; | ||
var state = this._state; | ||
if (state && value.__lom_state !== undefined) { | ||
if (state[keyName] === undefined) { | ||
state[keyName] = Object.create(value.__lom_state); | ||
} | ||
defaultContext.setState(value, state[keyName], true); | ||
} | ||
} | ||
@@ -188,2 +205,4 @@ | ||
Injector.prototype.destroy = function destroy() { | ||
this._state = undefined; | ||
this._cache = undefined; | ||
this.parent = undefined; | ||
@@ -195,5 +214,5 @@ this._listeners = undefined; | ||
Injector.prototype._fastNew = function _fastNew(key) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -203,21 +222,21 @@ return new key(); | ||
case 1: | ||
return new key(args[0]); | ||
return new key(a[0]); | ||
case 2: | ||
return new key(args[0], args[1]); | ||
return new key(a[0], a[1]); | ||
case 3: | ||
return new key(args[0], args[1], args[2]); | ||
return new key(a[0], a[1], a[2]); | ||
case 4: | ||
return new key(args[0], args[1], args[2], args[3]); | ||
return new key(a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return new key(args[0], args[1], args[2], args[3], args[4]); | ||
return new key(a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return new key(args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return new key(a[0], a[1], a[2], a[3], a[4], a[5]); | ||
default: | ||
return new (Function.prototype.bind.apply(key, [null].concat(args)))(); | ||
return new (Function.prototype.bind.apply(key, [null].concat(a)))(); | ||
} | ||
@@ -227,5 +246,5 @@ }; | ||
Injector.prototype.invoke = function invoke(key) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -235,24 +254,28 @@ return key(); | ||
case 1: | ||
return key(args[0]); | ||
return key(a[0]); | ||
case 2: | ||
return key(args[0], args[1]); | ||
return key(a[0], a[1]); | ||
case 3: | ||
return key(args[0], args[1], args[2]); | ||
return key(a[0], a[1], a[2]); | ||
case 4: | ||
return key(args[0], args[1], args[2], args[3]); | ||
return key(a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return key(args[0], args[1], args[2], args[3], args[4]); | ||
return key(a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return key(args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return key(a[0], a[1], a[2], a[3], a[4], a[5]); | ||
default: | ||
return key.apply(undefined, args); | ||
return key.apply(undefined, a); | ||
} | ||
}; | ||
Injector.prototype.alias = function alias(key) { | ||
return this._cache.get(key) || key; | ||
}; | ||
Injector.prototype.invokeWithProps = function invokeWithProps(key, props, propsChanged) { | ||
@@ -263,3 +286,3 @@ if (key.deps === undefined) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
@@ -279,3 +302,3 @@ if (propsChanged === true) { | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -285,29 +308,29 @@ return key(props); | ||
case 1: | ||
return key(props, args[0]); | ||
return key(props, a[0]); | ||
case 2: | ||
return key(props, args[0], args[1]); | ||
return key(props, a[0], a[1]); | ||
case 3: | ||
return key(props, args[0], args[1], args[2]); | ||
return key(props, a[0], a[1], a[2]); | ||
case 4: | ||
return key(props, args[0], args[1], args[2], args[3]); | ||
return key(props, a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return key(props, args[0], args[1], args[2], args[3], args[4]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return key(props, args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4], a[5]); | ||
case 7: | ||
return key(props, args[0], args[1], args[2], args[3], args[4], args[5], args[6]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4], a[5], a[6]); | ||
default: | ||
return key.apply(undefined, [props].concat(args)); | ||
return key.apply(undefined, [props].concat(a)); | ||
} | ||
}; | ||
Injector.prototype.copy = function copy(items, displayName) { | ||
return new Injector(items, this._sheetManager, this, this.displayName + '_' + displayName); | ||
Injector.prototype.copy = function copy(items, displayName, instance) { | ||
return new Injector(items, this._sheetManager, this._state, this, this.displayName + '.' + displayName, instance); | ||
}; | ||
@@ -317,3 +340,3 @@ | ||
var result = []; | ||
var map = this._map; | ||
var map = this._cache; | ||
@@ -468,3 +491,2 @@ if (argDeps !== undefined) { | ||
var rootInjector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Injector(); | ||
var useContext = arguments[3]; | ||
var AtomizedComponent = (_class = function (_BaseComponent) { | ||
@@ -479,6 +501,19 @@ inheritsLoose(AtomizedComponent, _BaseComponent); | ||
_this._el = undefined; | ||
var render = _this.constructor.render; | ||
var injector = props.__lom_ctx || rootInjector; | ||
_this._keys = Object.keys(props); | ||
_this._injector = (props.__lom_ctx || rootInjector).copy(undefined, _this.constructor.displayName); | ||
var cns = _this.constructor; | ||
var parentInjector = props.__lom_ctx || rootInjector; | ||
var render = parentInjector._cache.get(cns.render); | ||
if (render === null) { | ||
_this._el = null; | ||
_this._keys = undefined; | ||
_this._render = undefined; | ||
} else { | ||
_this._render = render === undefined ? cns.render : render; | ||
var injectorName = cns.displayName + (cns.instance ? '[' + cns.instance + ']' : ''); | ||
_this._injector = parentInjector.copy(_this._render.provides, injectorName, cns.instance); | ||
cns.instance++; | ||
} | ||
return _this; | ||
@@ -489,2 +524,3 @@ } | ||
var keys = this._keys; | ||
if (this._render === undefined) return false; | ||
var oldProps = this.props; | ||
@@ -507,3 +543,3 @@ | ||
AtomizedComponent.prototype.componentWillUnmount = function componentWillUnmount() { | ||
defaultContext.getAtom('r$', this).destroyed(true); | ||
defaultContext.getAtom('r', this).destroyed(true); | ||
}; | ||
@@ -513,4 +549,12 @@ | ||
this._el = undefined; | ||
this._keys = undefined; | ||
this.props = undefined; | ||
this._injector = undefined; | ||
if (this._render !== undefined) { | ||
this.constructor.instance--; | ||
this._injector.destroy(); | ||
this._injector = undefined; | ||
} | ||
}; | ||
@@ -520,3 +564,3 @@ | ||
var data = void 0; | ||
var render = this.constructor.render; | ||
var render = this._render; | ||
var prevContext = parentContext; | ||
@@ -560,2 +604,3 @@ parentContext = this._injector; | ||
WrappedComponent.instance = 0; | ||
WrappedComponent.render = render; | ||
@@ -569,3 +614,51 @@ WrappedComponent.displayName = render.displayName || render.name; | ||
export { createReactWrapper, createCreateElement, Injector }; | ||
function dn(fn) { | ||
if (!fn) return 'null'; | ||
if (_typeof(fn) === 'object') { | ||
var cons = fn.constructor; | ||
return cons.displayName || cons.name; | ||
} | ||
if (typeof fn === 'function') { | ||
return fn.displayName || fn.name; | ||
} | ||
return String(fn); | ||
} | ||
function provideMap(item) { | ||
return item instanceof Array ? "[" + dn(item[0]) + ", " + dn(item[1]) + "]" : dn(item); | ||
} | ||
function cloneComponent(fn, items, name) { | ||
var cloned = function cloned() { | ||
switch (arguments.length) { | ||
case 1: | ||
return fn(arguments[0]); | ||
case 2: | ||
return fn(arguments[0], arguments[1]); | ||
case 3: | ||
return fn(arguments[0], arguments[1], arguments[2]); | ||
case 4: | ||
return fn(arguments[0], arguments[1], arguments[2], arguments[3]); | ||
case 5: | ||
return fn(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); | ||
default: | ||
return fn.apply(null, arguments); | ||
} | ||
}; | ||
cloned.deps = fn.deps; | ||
cloned.provides = items; | ||
cloned.displayName = name || "cloneComponent(" + dn(fn) + ", [" + items.map(provideMap).join(', ') + "])"; | ||
return cloned; | ||
} | ||
export { createReactWrapper, createCreateElement, Injector, cloneComponent }; | ||
//# sourceMappingURL=reactive-di.es.js.map |
@@ -129,12 +129,13 @@ 'use strict'; | ||
function empty() {} | ||
var Injector = function () { | ||
function Injector(items, sheetProcessor, parent, displayName) { | ||
function Injector(items, sheetProcessor, state, parent, displayName, instance) { | ||
this._resolved = false; | ||
this._listeners = undefined; | ||
this._instance = instance || 0; | ||
this._state = state || null; | ||
this.parent = parent; | ||
this.displayName = displayName || 'Injector'; | ||
this.displayName = displayName || '$'; | ||
this._sheetManager = sheetProcessor instanceof SheetManager ? sheetProcessor : new SheetManager(sheetProcessor, this); | ||
var map = this._map = new WeakMap(); | ||
var map = this._cache = new Map(); | ||
var sticked = undefined; | ||
@@ -148,3 +149,7 @@ if (items !== undefined) { | ||
} else if (typeof item === 'function') { | ||
map.set(item, empty); | ||
if (sticked === undefined) { | ||
sticked = new Set(); | ||
} | ||
sticked.add(item); | ||
} else { | ||
@@ -155,22 +160,26 @@ map.set(item.constructor, item); | ||
} | ||
this._sticked = sticked; | ||
} | ||
Injector.prototype.value = function value(key) { | ||
var value = this._map.get(key); | ||
var value = this._cache.get(key); | ||
if (value === undefined) { | ||
var current = this.parent; | ||
if (this._sticked === undefined || !this._sticked.has(key)) { | ||
var current = this.parent; | ||
if (current !== undefined) { | ||
do { | ||
value = current._map.get(key); | ||
if (current !== undefined) { | ||
do { | ||
value = current._cache.get(key); | ||
if (value !== undefined) { | ||
this._map.set(key, value); | ||
if (value !== undefined) { | ||
this._cache.set(key, value); | ||
return value; | ||
} | ||
return value; | ||
} | ||
current = current.parent; | ||
} while (current !== undefined); | ||
current = current.parent; | ||
} while (current !== undefined); | ||
} | ||
} | ||
@@ -180,7 +189,15 @@ | ||
this._map.set(key, value); | ||
} else if (value === empty) { | ||
value = this._fastNew(key); | ||
this._cache.set(key, value); | ||
this._map.set(key, value); | ||
var keyName = (key.displayName || key.name) + (this._instance > 0 ? '[' + this._instance + ']' : ''); | ||
value.displayName = this.displayName + '.' + keyName; | ||
var state = this._state; | ||
if (state && value.__lom_state !== undefined) { | ||
if (state[keyName] === undefined) { | ||
state[keyName] = Object.create(value.__lom_state); | ||
} | ||
lom_atom.defaultContext.setState(value, state[keyName], true); | ||
} | ||
} | ||
@@ -192,2 +209,4 @@ | ||
Injector.prototype.destroy = function destroy() { | ||
this._state = undefined; | ||
this._cache = undefined; | ||
this.parent = undefined; | ||
@@ -199,5 +218,5 @@ this._listeners = undefined; | ||
Injector.prototype._fastNew = function _fastNew(key) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -207,21 +226,21 @@ return new key(); | ||
case 1: | ||
return new key(args[0]); | ||
return new key(a[0]); | ||
case 2: | ||
return new key(args[0], args[1]); | ||
return new key(a[0], a[1]); | ||
case 3: | ||
return new key(args[0], args[1], args[2]); | ||
return new key(a[0], a[1], a[2]); | ||
case 4: | ||
return new key(args[0], args[1], args[2], args[3]); | ||
return new key(a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return new key(args[0], args[1], args[2], args[3], args[4]); | ||
return new key(a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return new key(args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return new key(a[0], a[1], a[2], a[3], a[4], a[5]); | ||
default: | ||
return new (Function.prototype.bind.apply(key, [null].concat(args)))(); | ||
return new (Function.prototype.bind.apply(key, [null].concat(a)))(); | ||
} | ||
@@ -231,5 +250,5 @@ }; | ||
Injector.prototype.invoke = function invoke(key) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -239,24 +258,28 @@ return key(); | ||
case 1: | ||
return key(args[0]); | ||
return key(a[0]); | ||
case 2: | ||
return key(args[0], args[1]); | ||
return key(a[0], a[1]); | ||
case 3: | ||
return key(args[0], args[1], args[2]); | ||
return key(a[0], a[1], a[2]); | ||
case 4: | ||
return key(args[0], args[1], args[2], args[3]); | ||
return key(a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return key(args[0], args[1], args[2], args[3], args[4]); | ||
return key(a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return key(args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return key(a[0], a[1], a[2], a[3], a[4], a[5]); | ||
default: | ||
return key.apply(undefined, args); | ||
return key.apply(undefined, a); | ||
} | ||
}; | ||
Injector.prototype.alias = function alias(key) { | ||
return this._cache.get(key) || key; | ||
}; | ||
Injector.prototype.invokeWithProps = function invokeWithProps(key, props, propsChanged) { | ||
@@ -267,3 +290,3 @@ if (key.deps === undefined) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
@@ -283,3 +306,3 @@ if (propsChanged === true) { | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -289,29 +312,29 @@ return key(props); | ||
case 1: | ||
return key(props, args[0]); | ||
return key(props, a[0]); | ||
case 2: | ||
return key(props, args[0], args[1]); | ||
return key(props, a[0], a[1]); | ||
case 3: | ||
return key(props, args[0], args[1], args[2]); | ||
return key(props, a[0], a[1], a[2]); | ||
case 4: | ||
return key(props, args[0], args[1], args[2], args[3]); | ||
return key(props, a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return key(props, args[0], args[1], args[2], args[3], args[4]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return key(props, args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4], a[5]); | ||
case 7: | ||
return key(props, args[0], args[1], args[2], args[3], args[4], args[5], args[6]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4], a[5], a[6]); | ||
default: | ||
return key.apply(undefined, [props].concat(args)); | ||
return key.apply(undefined, [props].concat(a)); | ||
} | ||
}; | ||
Injector.prototype.copy = function copy(items, displayName) { | ||
return new Injector(items, this._sheetManager, this, this.displayName + '_' + displayName); | ||
Injector.prototype.copy = function copy(items, displayName, instance) { | ||
return new Injector(items, this._sheetManager, this._state, this, this.displayName + '.' + displayName, instance); | ||
}; | ||
@@ -321,3 +344,3 @@ | ||
var result = []; | ||
var map = this._map; | ||
var map = this._cache; | ||
@@ -472,3 +495,2 @@ if (argDeps !== undefined) { | ||
var rootInjector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Injector(); | ||
var useContext = arguments[3]; | ||
var AtomizedComponent = (_class = function (_BaseComponent) { | ||
@@ -483,6 +505,19 @@ inheritsLoose(AtomizedComponent, _BaseComponent); | ||
_this._el = undefined; | ||
var render = _this.constructor.render; | ||
var injector = props.__lom_ctx || rootInjector; | ||
_this._keys = Object.keys(props); | ||
_this._injector = (props.__lom_ctx || rootInjector).copy(undefined, _this.constructor.displayName); | ||
var cns = _this.constructor; | ||
var parentInjector = props.__lom_ctx || rootInjector; | ||
var render = parentInjector._cache.get(cns.render); | ||
if (render === null) { | ||
_this._el = null; | ||
_this._keys = undefined; | ||
_this._render = undefined; | ||
} else { | ||
_this._render = render === undefined ? cns.render : render; | ||
var injectorName = cns.displayName + (cns.instance ? '[' + cns.instance + ']' : ''); | ||
_this._injector = parentInjector.copy(_this._render.provides, injectorName, cns.instance); | ||
cns.instance++; | ||
} | ||
return _this; | ||
@@ -493,2 +528,3 @@ } | ||
var keys = this._keys; | ||
if (this._render === undefined) return false; | ||
var oldProps = this.props; | ||
@@ -511,3 +547,3 @@ | ||
AtomizedComponent.prototype.componentWillUnmount = function componentWillUnmount() { | ||
lom_atom.defaultContext.getAtom('r$', this).destroyed(true); | ||
lom_atom.defaultContext.getAtom('r', this).destroyed(true); | ||
}; | ||
@@ -517,4 +553,12 @@ | ||
this._el = undefined; | ||
this._keys = undefined; | ||
this.props = undefined; | ||
this._injector = undefined; | ||
if (this._render !== undefined) { | ||
this.constructor.instance--; | ||
this._injector.destroy(); | ||
this._injector = undefined; | ||
} | ||
}; | ||
@@ -524,3 +568,3 @@ | ||
var data = void 0; | ||
var render = this.constructor.render; | ||
var render = this._render; | ||
var prevContext = parentContext; | ||
@@ -564,2 +608,3 @@ parentContext = this._injector; | ||
WrappedComponent.instance = 0; | ||
WrappedComponent.render = render; | ||
@@ -573,5 +618,54 @@ WrappedComponent.displayName = render.displayName || render.name; | ||
function dn(fn) { | ||
if (!fn) return 'null'; | ||
if (_typeof(fn) === 'object') { | ||
var cons = fn.constructor; | ||
return cons.displayName || cons.name; | ||
} | ||
if (typeof fn === 'function') { | ||
return fn.displayName || fn.name; | ||
} | ||
return String(fn); | ||
} | ||
function provideMap(item) { | ||
return item instanceof Array ? "[" + dn(item[0]) + ", " + dn(item[1]) + "]" : dn(item); | ||
} | ||
function cloneComponent(fn, items, name) { | ||
var cloned = function cloned() { | ||
switch (arguments.length) { | ||
case 1: | ||
return fn(arguments[0]); | ||
case 2: | ||
return fn(arguments[0], arguments[1]); | ||
case 3: | ||
return fn(arguments[0], arguments[1], arguments[2]); | ||
case 4: | ||
return fn(arguments[0], arguments[1], arguments[2], arguments[3]); | ||
case 5: | ||
return fn(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); | ||
default: | ||
return fn.apply(null, arguments); | ||
} | ||
}; | ||
cloned.deps = fn.deps; | ||
cloned.provides = items; | ||
cloned.displayName = name || "cloneComponent(" + dn(fn) + ", [" + items.map(provideMap).join(', ') + "])"; | ||
return cloned; | ||
} | ||
exports.createReactWrapper = createReactWrapper; | ||
exports.createCreateElement = createCreateElement; | ||
exports.Injector = Injector; | ||
exports.cloneComponent = cloneComponent; | ||
//# sourceMappingURL=reactive-di.js.map |
@@ -129,12 +129,13 @@ (function (global, factory) { | ||
function empty() {} | ||
var Injector = function () { | ||
function Injector(items, sheetProcessor, parent, displayName) { | ||
function Injector(items, sheetProcessor, state, parent, displayName, instance) { | ||
this._resolved = false; | ||
this._listeners = undefined; | ||
this._instance = instance || 0; | ||
this._state = state || null; | ||
this.parent = parent; | ||
this.displayName = displayName || 'Injector'; | ||
this.displayName = displayName || '$'; | ||
this._sheetManager = sheetProcessor instanceof SheetManager ? sheetProcessor : new SheetManager(sheetProcessor, this); | ||
var map = this._map = new WeakMap(); | ||
var map = this._cache = new Map(); | ||
var sticked = undefined; | ||
@@ -148,3 +149,7 @@ if (items !== undefined) { | ||
} else if (typeof item === 'function') { | ||
map.set(item, empty); | ||
if (sticked === undefined) { | ||
sticked = new Set(); | ||
} | ||
sticked.add(item); | ||
} else { | ||
@@ -155,22 +160,26 @@ map.set(item.constructor, item); | ||
} | ||
this._sticked = sticked; | ||
} | ||
Injector.prototype.value = function value(key) { | ||
var value = this._map.get(key); | ||
var value = this._cache.get(key); | ||
if (value === undefined) { | ||
var current = this.parent; | ||
if (this._sticked === undefined || !this._sticked.has(key)) { | ||
var current = this.parent; | ||
if (current !== undefined) { | ||
do { | ||
value = current._map.get(key); | ||
if (current !== undefined) { | ||
do { | ||
value = current._cache.get(key); | ||
if (value !== undefined) { | ||
this._map.set(key, value); | ||
if (value !== undefined) { | ||
this._cache.set(key, value); | ||
return value; | ||
} | ||
return value; | ||
} | ||
current = current.parent; | ||
} while (current !== undefined); | ||
current = current.parent; | ||
} while (current !== undefined); | ||
} | ||
} | ||
@@ -180,7 +189,15 @@ | ||
this._map.set(key, value); | ||
} else if (value === empty) { | ||
value = this._fastNew(key); | ||
this._cache.set(key, value); | ||
this._map.set(key, value); | ||
var keyName = (key.displayName || key.name) + (this._instance > 0 ? '[' + this._instance + ']' : ''); | ||
value.displayName = this.displayName + '.' + keyName; | ||
var state = this._state; | ||
if (state && value.__lom_state !== undefined) { | ||
if (state[keyName] === undefined) { | ||
state[keyName] = Object.create(value.__lom_state); | ||
} | ||
lom_atom.defaultContext.setState(value, state[keyName], true); | ||
} | ||
} | ||
@@ -192,2 +209,4 @@ | ||
Injector.prototype.destroy = function destroy() { | ||
this._state = undefined; | ||
this._cache = undefined; | ||
this.parent = undefined; | ||
@@ -199,5 +218,5 @@ this._listeners = undefined; | ||
Injector.prototype._fastNew = function _fastNew(key) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -207,21 +226,21 @@ return new key(); | ||
case 1: | ||
return new key(args[0]); | ||
return new key(a[0]); | ||
case 2: | ||
return new key(args[0], args[1]); | ||
return new key(a[0], a[1]); | ||
case 3: | ||
return new key(args[0], args[1], args[2]); | ||
return new key(a[0], a[1], a[2]); | ||
case 4: | ||
return new key(args[0], args[1], args[2], args[3]); | ||
return new key(a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return new key(args[0], args[1], args[2], args[3], args[4]); | ||
return new key(a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return new key(args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return new key(a[0], a[1], a[2], a[3], a[4], a[5]); | ||
default: | ||
return new (Function.prototype.bind.apply(key, [null].concat(args)))(); | ||
return new (Function.prototype.bind.apply(key, [null].concat(a)))(); | ||
} | ||
@@ -231,5 +250,5 @@ }; | ||
Injector.prototype.invoke = function invoke(key) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -239,24 +258,28 @@ return key(); | ||
case 1: | ||
return key(args[0]); | ||
return key(a[0]); | ||
case 2: | ||
return key(args[0], args[1]); | ||
return key(a[0], a[1]); | ||
case 3: | ||
return key(args[0], args[1], args[2]); | ||
return key(a[0], a[1], a[2]); | ||
case 4: | ||
return key(args[0], args[1], args[2], args[3]); | ||
return key(a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return key(args[0], args[1], args[2], args[3], args[4]); | ||
return key(a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return key(args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return key(a[0], a[1], a[2], a[3], a[4], a[5]); | ||
default: | ||
return key.apply(undefined, args); | ||
return key.apply(undefined, a); | ||
} | ||
}; | ||
Injector.prototype.alias = function alias(key) { | ||
return this._cache.get(key) || key; | ||
}; | ||
Injector.prototype.invokeWithProps = function invokeWithProps(key, props, propsChanged) { | ||
@@ -267,3 +290,3 @@ if (key.deps === undefined) { | ||
var args = this.resolve(key.deps); | ||
var a = this.resolve(key.deps); | ||
@@ -283,3 +306,3 @@ if (propsChanged === true) { | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: | ||
@@ -289,29 +312,29 @@ return key(props); | ||
case 1: | ||
return key(props, args[0]); | ||
return key(props, a[0]); | ||
case 2: | ||
return key(props, args[0], args[1]); | ||
return key(props, a[0], a[1]); | ||
case 3: | ||
return key(props, args[0], args[1], args[2]); | ||
return key(props, a[0], a[1], a[2]); | ||
case 4: | ||
return key(props, args[0], args[1], args[2], args[3]); | ||
return key(props, a[0], a[1], a[2], a[3]); | ||
case 5: | ||
return key(props, args[0], args[1], args[2], args[3], args[4]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4]); | ||
case 6: | ||
return key(props, args[0], args[1], args[2], args[3], args[4], args[5]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4], a[5]); | ||
case 7: | ||
return key(props, args[0], args[1], args[2], args[3], args[4], args[5], args[6]); | ||
return key(props, a[0], a[1], a[2], a[3], a[4], a[5], a[6]); | ||
default: | ||
return key.apply(undefined, [props].concat(args)); | ||
return key.apply(undefined, [props].concat(a)); | ||
} | ||
}; | ||
Injector.prototype.copy = function copy(items, displayName) { | ||
return new Injector(items, this._sheetManager, this, this.displayName + '_' + displayName); | ||
Injector.prototype.copy = function copy(items, displayName, instance) { | ||
return new Injector(items, this._sheetManager, this._state, this, this.displayName + '.' + displayName, instance); | ||
}; | ||
@@ -321,3 +344,3 @@ | ||
var result = []; | ||
var map = this._map; | ||
var map = this._cache; | ||
@@ -472,3 +495,2 @@ if (argDeps !== undefined) { | ||
var rootInjector = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Injector(); | ||
var useContext = arguments[3]; | ||
var AtomizedComponent = (_class = function (_BaseComponent) { | ||
@@ -483,6 +505,19 @@ inheritsLoose(AtomizedComponent, _BaseComponent); | ||
_this._el = undefined; | ||
var render = _this.constructor.render; | ||
var injector = props.__lom_ctx || rootInjector; | ||
_this._keys = Object.keys(props); | ||
_this._injector = (props.__lom_ctx || rootInjector).copy(undefined, _this.constructor.displayName); | ||
var cns = _this.constructor; | ||
var parentInjector = props.__lom_ctx || rootInjector; | ||
var render = parentInjector._cache.get(cns.render); | ||
if (render === null) { | ||
_this._el = null; | ||
_this._keys = undefined; | ||
_this._render = undefined; | ||
} else { | ||
_this._render = render === undefined ? cns.render : render; | ||
var injectorName = cns.displayName + (cns.instance ? '[' + cns.instance + ']' : ''); | ||
_this._injector = parentInjector.copy(_this._render.provides, injectorName, cns.instance); | ||
cns.instance++; | ||
} | ||
return _this; | ||
@@ -493,2 +528,3 @@ } | ||
var keys = this._keys; | ||
if (this._render === undefined) return false; | ||
var oldProps = this.props; | ||
@@ -511,3 +547,3 @@ | ||
AtomizedComponent.prototype.componentWillUnmount = function componentWillUnmount() { | ||
lom_atom.defaultContext.getAtom('r$', this).destroyed(true); | ||
lom_atom.defaultContext.getAtom('r', this).destroyed(true); | ||
}; | ||
@@ -517,4 +553,12 @@ | ||
this._el = undefined; | ||
this._keys = undefined; | ||
this.props = undefined; | ||
this._injector = undefined; | ||
if (this._render !== undefined) { | ||
this.constructor.instance--; | ||
this._injector.destroy(); | ||
this._injector = undefined; | ||
} | ||
}; | ||
@@ -524,3 +568,3 @@ | ||
var data = void 0; | ||
var render = this.constructor.render; | ||
var render = this._render; | ||
var prevContext = parentContext; | ||
@@ -564,2 +608,3 @@ parentContext = this._injector; | ||
WrappedComponent.instance = 0; | ||
WrappedComponent.render = render; | ||
@@ -573,5 +618,54 @@ WrappedComponent.displayName = render.displayName || render.name; | ||
function dn(fn) { | ||
if (!fn) return 'null'; | ||
if (_typeof(fn) === 'object') { | ||
var cons = fn.constructor; | ||
return cons.displayName || cons.name; | ||
} | ||
if (typeof fn === 'function') { | ||
return fn.displayName || fn.name; | ||
} | ||
return String(fn); | ||
} | ||
function provideMap(item) { | ||
return item instanceof Array ? "[" + dn(item[0]) + ", " + dn(item[1]) + "]" : dn(item); | ||
} | ||
function cloneComponent(fn, items, name) { | ||
var cloned = function cloned() { | ||
switch (arguments.length) { | ||
case 1: | ||
return fn(arguments[0]); | ||
case 2: | ||
return fn(arguments[0], arguments[1]); | ||
case 3: | ||
return fn(arguments[0], arguments[1], arguments[2]); | ||
case 4: | ||
return fn(arguments[0], arguments[1], arguments[2], arguments[3]); | ||
case 5: | ||
return fn(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); | ||
default: | ||
return fn.apply(null, arguments); | ||
} | ||
}; | ||
cloned.deps = fn.deps; | ||
cloned.provides = items; | ||
cloned.displayName = name || "cloneComponent(" + dn(fn) + ", [" + items.map(provideMap).join(', ') + "])"; | ||
return cloned; | ||
} | ||
exports.createReactWrapper = createReactWrapper; | ||
exports.createCreateElement = createCreateElement; | ||
exports.Injector = Injector; | ||
exports.cloneComponent = cloneComponent; | ||
@@ -578,0 +672,0 @@ Object.defineProperty(exports, '__esModule', { value: true }); |
{ | ||
"name": "reactive-di", | ||
"version": "4.0.9", | ||
"version": "4.0.10", | ||
"description": "Reactive dependency injection", | ||
@@ -64,3 +64,3 @@ "publishConfig": { | ||
"chokidar-cli": "^1.2.0", | ||
"flow-bin": "^0.53.1", | ||
"flow-bin": "^0.54.0", | ||
"mocha": "^3.5.0", | ||
@@ -77,4 +77,4 @@ "rimraf": "^2.6.1", | ||
"dependencies": { | ||
"lom_atom": "^1.0.14" | ||
"lom_atom": "^1.1.1" | ||
} | ||
} |
@@ -14,3 +14,3 @@ // @flow | ||
interface IRenderFn<IElement, State> { | ||
export interface IRenderFn<IElement, State> { | ||
(props: IPropsWithContext, state?: State): IElement; | ||
@@ -20,4 +20,4 @@ __lom?: Class<IReactComponent<IElement>>; | ||
deps?: IArg[]; | ||
props?: Function; | ||
onError?: IFromError<IElement>; | ||
provides?: IProvideItem[]; | ||
} | ||
@@ -60,3 +60,3 @@ | ||
return function lomCreateElement() { | ||
const el = arguments[0] | ||
let el = arguments[0] | ||
let attrs = arguments[1] | ||
@@ -117,4 +117,3 @@ | ||
defaultFromError: IFromError<IElement>, | ||
rootInjector?: Injector = new Injector(), | ||
useContext?: boolean | ||
rootInjector?: Injector = new Injector() | ||
): IAtomize<IElement, *> { | ||
@@ -128,4 +127,6 @@ class AtomizedComponent<State> extends BaseComponent { | ||
static render: IRenderFn<IElement, State> | ||
static instance: number | ||
_keys: string[] | ||
_render: IRenderFn<IElement, State> | ||
@@ -137,9 +138,22 @@ constructor( | ||
super(props, reactContext) | ||
const render = this.constructor.render | ||
const injector: Injector = props.__lom_ctx || rootInjector | ||
this._keys = Object.keys(props) | ||
this._injector = (props.__lom_ctx || rootInjector).copy( | ||
undefined, | ||
this.constructor.displayName | ||
) | ||
const cns = this.constructor | ||
const parentInjector = props.__lom_ctx || rootInjector | ||
const render = parentInjector._cache.get(cns.render) | ||
if (render === null) { | ||
this._el = null | ||
this._keys = (undefined: any) | ||
this._render = (undefined: any) | ||
} else { | ||
this._render = render === undefined ? cns.render : render | ||
const injectorName = cns.displayName + (cns.instance ? ('[' + cns.instance + ']') : '') | ||
this._injector = parentInjector.copy( | ||
this._render.provides, | ||
injectorName, | ||
cns.instance | ||
) | ||
cns.instance++ | ||
} | ||
} | ||
@@ -149,2 +163,3 @@ | ||
const keys = this._keys | ||
if (this._render === undefined) return false | ||
const oldProps = this.props | ||
@@ -165,3 +180,3 @@ for (let i = 0; i < keys.length; i++) { // eslint-disable-line | ||
componentWillUnmount() { | ||
defaultContext.getAtom('r$', this).destroyed(true) | ||
defaultContext.getAtom('r', this).destroyed(true) | ||
} | ||
@@ -171,7 +186,12 @@ | ||
this._el = undefined | ||
this._keys = (undefined: any) | ||
this.props = (undefined: any) | ||
this._injector = (undefined: any) | ||
if (this._render !== undefined) { | ||
this.constructor.instance-- | ||
this._injector.destroy() | ||
this._injector = (undefined: any) | ||
} | ||
} | ||
_el: IElement | void = undefined | ||
_el: ?(IElement | void) = undefined | ||
@@ -182,3 +202,3 @@ @detached | ||
const render = this.constructor.render | ||
const render = this._render | ||
@@ -221,2 +241,3 @@ const prevContext = parentContext | ||
} | ||
WrappedComponent.instance = 0 | ||
WrappedComponent.render = render | ||
@@ -223,0 +244,0 @@ WrappedComponent.displayName = render.displayName || render.name |
@@ -5,2 +5,3 @@ // @flow | ||
export {default as Injector} from './Injector' | ||
export {default as cloneComponent} from './cloneComponent' | ||
@@ -7,0 +8,0 @@ export type { |
// @flow | ||
import {memkey} from 'lom_atom' | ||
import {defaultContext, memkey} from 'lom_atom' | ||
@@ -77,4 +77,2 @@ export type IArg = Function | {+[id: string]: Function} | ||
function empty() {} | ||
type IListener = Object | ||
@@ -86,11 +84,26 @@ | ||
_sheetManager: SheetManager | ||
_map: WeakMap<Function, any> | ||
_cache: Map<Function, any> | ||
_instance: number | ||
constructor(items?: IProvideItem[], sheetProcessor?: IProcessor | SheetManager, parent?: Injector, displayName?: string) { | ||
_state: ?Object | ||
_sticked: Set<Function> | void | ||
constructor( | ||
items?: IProvideItem[], | ||
sheetProcessor?: IProcessor | SheetManager, | ||
state?: ?Object, | ||
parent?: Injector, | ||
displayName?: string, | ||
instance?: number | ||
) { | ||
this._instance = instance || 0 | ||
this._state = state || null | ||
this.parent = parent | ||
this.displayName = displayName || 'Injector' | ||
this.displayName = displayName || '$' | ||
this._sheetManager = sheetProcessor instanceof SheetManager | ||
? sheetProcessor | ||
: new SheetManager(sheetProcessor, this) | ||
const map = this._map = new WeakMap() | ||
const map = this._cache = new Map() | ||
let sticked: Set<Function> | void = undefined | ||
if (items !== undefined) { | ||
@@ -102,3 +115,6 @@ for (let i = 0; i < items.length; i++) { | ||
} else if (typeof item === 'function') { | ||
map.set(item, empty) | ||
if (sticked === undefined) { | ||
sticked = new Set() | ||
} | ||
sticked.add(item) | ||
} else { | ||
@@ -109,24 +125,33 @@ map.set(item.constructor, item) | ||
} | ||
this._sticked = sticked | ||
} | ||
value<V>(key: Function): V { | ||
let value = this._map.get(key) | ||
let value = this._cache.get(key) | ||
if (value === undefined) { | ||
let current = this.parent | ||
if (current !== undefined) { | ||
do { | ||
value = current._map.get(key) | ||
if (value !== undefined) { | ||
this._map.set(key, value) | ||
return value | ||
} | ||
current = current.parent | ||
} while (current !== undefined) | ||
if (this._sticked === undefined || !this._sticked.has(key)) { | ||
let current = this.parent | ||
if (current !== undefined) { | ||
do { | ||
value = current._cache.get(key) | ||
if (value !== undefined) { | ||
this._cache.set(key, value) | ||
return value | ||
} | ||
current = current.parent | ||
} while (current !== undefined) | ||
} | ||
} | ||
value = this._fastNew(key) | ||
this._map.set(key, value) | ||
} else if (value === empty) { | ||
value = this._fastNew(key) | ||
this._map.set(key, value) | ||
this._cache.set(key, value) | ||
const keyName = (key.displayName || key.name) + (this._instance > 0 ? ('[' + this._instance + ']') : '') | ||
value.displayName = this.displayName + '.' + keyName | ||
const state = this._state | ||
if (state && value.__lom_state !== undefined) { | ||
if (state[keyName] === undefined) { | ||
state[keyName] = Object.create(value.__lom_state) | ||
} | ||
defaultContext.setState(value, state[keyName], true) | ||
} | ||
} | ||
@@ -138,2 +163,4 @@ | ||
destroy() { | ||
this._state = undefined | ||
this._cache = (undefined: any) | ||
this.parent = undefined | ||
@@ -145,12 +172,12 @@ this._listeners = undefined | ||
_fastNew<V>(key: any): V { | ||
const args = this.resolve(key.deps) | ||
switch (args.length) { | ||
const a = this.resolve(key.deps) | ||
switch (a.length) { | ||
case 0: return new key() | ||
case 1: return new key(args[0]) | ||
case 2: return new key(args[0], args[1]) | ||
case 3: return new key(args[0], args[1], args[2]) | ||
case 4: return new key(args[0], args[1], args[2], args[3]) | ||
case 5: return new key(args[0], args[1], args[2], args[3], args[4]) | ||
case 6: return new key(args[0], args[1], args[2], args[3], args[4], args[5]) | ||
default: return new key(...args) | ||
case 1: return new key(a[0]) | ||
case 2: return new key(a[0], a[1]) | ||
case 3: return new key(a[0], a[1], a[2]) | ||
case 4: return new key(a[0], a[1], a[2], a[3]) | ||
case 5: return new key(a[0], a[1], a[2], a[3], a[4]) | ||
case 6: return new key(a[0], a[1], a[2], a[3], a[4], a[5]) | ||
default: return new key(...a) | ||
} | ||
@@ -160,12 +187,12 @@ } | ||
invoke<V>(key: Function): V { | ||
const args = this.resolve(key.deps) | ||
switch (args.length) { | ||
const a = this.resolve(key.deps) | ||
switch (a.length) { | ||
case 0: return key() | ||
case 1: return key(args[0]) | ||
case 2: return key(args[0], args[1]) | ||
case 3: return key(args[0], args[1], args[2]) | ||
case 4: return key(args[0], args[1], args[2], args[3]) | ||
case 5: return key(args[0], args[1], args[2], args[3], args[4]) | ||
case 6: return key(args[0], args[1], args[2], args[3], args[4], args[5]) | ||
default: return key(...args) | ||
case 1: return key(a[0]) | ||
case 2: return key(a[0], a[1]) | ||
case 3: return key(a[0], a[1], a[2]) | ||
case 4: return key(a[0], a[1], a[2], a[3]) | ||
case 5: return key(a[0], a[1], a[2], a[3], a[4]) | ||
case 6: return key(a[0], a[1], a[2], a[3], a[4], a[5]) | ||
default: return key(...a) | ||
} | ||
@@ -177,2 +204,6 @@ } | ||
alias(key: Function) { | ||
return this._cache.get(key) || key | ||
} | ||
invokeWithProps<V>(key: Function, props?: Object, propsChanged?: boolean): V { | ||
@@ -182,3 +213,3 @@ if (key.deps === undefined) { | ||
} | ||
const args = this.resolve(key.deps) | ||
const a = this.resolve(key.deps) | ||
if (propsChanged === true) { | ||
@@ -194,23 +225,29 @@ const listeners = this._listeners | ||
this._resolved = true | ||
switch (args.length) { | ||
switch (a.length) { | ||
case 0: return key(props) | ||
case 1: return key(props, args[0]) | ||
case 2: return key(props, args[0], args[1]) | ||
case 3: return key(props, args[0], args[1], args[2]) | ||
case 4: return key(props, args[0], args[1], args[2], args[3]) | ||
case 5: return key(props, args[0], args[1], args[2], args[3], args[4]) | ||
case 6: return key(props, args[0], args[1], args[2], args[3], args[4], args[5]) | ||
case 7: return key(props, args[0], args[1], args[2], args[3], args[4], args[5], args[6]) | ||
default: return key(props, ...args) | ||
case 1: return key(props, a[0]) | ||
case 2: return key(props, a[0], a[1]) | ||
case 3: return key(props, a[0], a[1], a[2]) | ||
case 4: return key(props, a[0], a[1], a[2], a[3]) | ||
case 5: return key(props, a[0], a[1], a[2], a[3], a[4]) | ||
case 6: return key(props, a[0], a[1], a[2], a[3], a[4], a[5]) | ||
case 7: return key(props, a[0], a[1], a[2], a[3], a[4], a[5], a[6]) | ||
default: return key(props, ...a) | ||
} | ||
} | ||
copy(items?: IProvideItem[], displayName: string): Injector { | ||
return new Injector(items, this._sheetManager, this, this.displayName + '_' + displayName) | ||
copy(items?: IProvideItem[], displayName: string, instance?: number): Injector { | ||
return new Injector( | ||
items, | ||
this._sheetManager, | ||
this._state, | ||
this, | ||
this.displayName + '.' + displayName, | ||
instance | ||
) | ||
} | ||
resolve(argDeps?: IArg[]): any[] { | ||
const result = [] | ||
const map = this._map | ||
const map = this._cache | ||
if (argDeps !== undefined) { | ||
@@ -217,0 +254,0 @@ const resolved = this._resolved |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
178101
20
1990
Updatedlom_atom@^1.1.1