@adrianhelvik/bind
Advanced tools
Comparing version 1.0.1 to 1.0.2
@@ -20,5 +20,11 @@ "use strict"; | ||
exports.GET_BINDING = GET_BINDING; | ||
var observables = new WeakMap(); | ||
function observable() { | ||
var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
if (observables.has(source)) { | ||
return observables.get(source); | ||
} | ||
var bindings = new Map(); | ||
@@ -36,16 +42,26 @@ | ||
if (!bindings.has(property)) bindings.set(property, new _Binding["default"](property)); | ||
if (!bindings.has(property)) { | ||
bindings.set(property, new _Binding["default"](property)); | ||
} | ||
bindings.get(property).accessed(); | ||
var value = Reflect.get(target, property, receiver); | ||
if (value && _typeof(value) === 'object') return observable(value); | ||
if (typeof value === 'function') return function batchedMethod() { | ||
var _this = this, | ||
_arguments = arguments; | ||
var result; | ||
(0, _batch["default"])(function () { | ||
result = value.apply(_this, _arguments); | ||
}); | ||
return result; | ||
}; | ||
if (value && _typeof(value) === 'object') { | ||
return observable(value); | ||
} | ||
if (typeof value === 'function') { | ||
return function batchedMethod() { | ||
var _this = this, | ||
_arguments = arguments; | ||
var result; | ||
(0, _batch["default"])(function () { | ||
result = value.apply(_this, _arguments); | ||
}); | ||
return result; | ||
}; | ||
} | ||
return value; | ||
@@ -55,3 +71,7 @@ }, | ||
var isNew = !Object.prototype.hasOwnProperty.call(target, property); | ||
if (!bindings.has(property)) bindings.set(property, new _Binding["default"](property)); | ||
if (!bindings.has(property)) { | ||
bindings.set(property, new _Binding["default"](property)); | ||
} | ||
var result; | ||
@@ -64,7 +84,2 @@ var previous; | ||
binding.updated(); | ||
if (_state.manager.debugging) { | ||
console.log("[debug]: Updated observable property '".concat(property, "' to:"), value); | ||
} | ||
var _iteratorNormalCompletion = true; | ||
@@ -103,2 +118,3 @@ var _didIteratorError = false; | ||
}); | ||
observables.set(source, proxy); | ||
return proxy; | ||
@@ -105,0 +121,0 @@ } |
@@ -13,2 +13,8 @@ "use strict"; | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
it('can react to an updated binding', function () { | ||
@@ -40,2 +46,61 @@ var binding = new _Binding["default"](); | ||
expect(updated).toBe(1); | ||
}); | ||
test('update bug', function () { | ||
var Todo = | ||
/*#__PURE__*/ | ||
function () { | ||
function Todo(values) { | ||
_classCallCheck(this, Todo); | ||
this.done = false; | ||
this.text = ''; | ||
Object.assign(this, values); | ||
} | ||
_createClass(Todo, [{ | ||
key: "toggle", | ||
value: function toggle() { | ||
this.done = !this.done; | ||
} | ||
}]); | ||
return Todo; | ||
}(); | ||
var state = (0, _observable["default"])({ | ||
todos: [new Todo({ | ||
text: 'make todo list', | ||
done: true | ||
})] | ||
}); | ||
var result = []; | ||
var i = 0; | ||
(0, _reaction["default"])(function () { | ||
result.push("reaction ".concat(++i)); | ||
var _iteratorNormalCompletion = true; | ||
var _didIteratorError = false; | ||
var _iteratorError = undefined; | ||
try { | ||
for (var _iterator = state.todos[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
var todo = _step.value; | ||
todo.done; | ||
} | ||
} catch (err) { | ||
_didIteratorError = true; | ||
_iteratorError = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion && _iterator["return"] != null) { | ||
_iterator["return"](); | ||
} | ||
} finally { | ||
if (_didIteratorError) { | ||
throw _iteratorError; | ||
} | ||
} | ||
} | ||
}); | ||
state.todos[0].done = false; | ||
expect(result).toEqual(['reaction 1', 'reaction 2']); | ||
}); |
{ | ||
"name": "@adrianhelvik/bind", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"main": "lib/index.js", | ||
@@ -5,0 +5,0 @@ "module": "src/index.js", |
@@ -6,4 +6,9 @@ import { manager } from './state.js' | ||
export const GET_BINDING = Symbol('GET_BINDING') | ||
const observables = new WeakMap() | ||
function observable(source = {}) { | ||
if (observables.has(source)) { | ||
return observables.get(source) | ||
} | ||
const bindings = new Map() | ||
@@ -17,7 +22,16 @@ const getBinding = key => bindings.get(key) | ||
} | ||
if (!bindings.has(property)) bindings.set(property, new Binding(property)) | ||
if (!bindings.has(property)) { | ||
bindings.set(property, new Binding(property)) | ||
} | ||
bindings.get(property).accessed() | ||
const value = Reflect.get(target, property, receiver) | ||
if (value && typeof value === 'object') return observable(value) | ||
if (typeof value === 'function') | ||
if (value && typeof value === 'object') { | ||
return observable(value) | ||
} | ||
if (typeof value === 'function') { | ||
return function batchedMethod() { | ||
@@ -30,2 +44,3 @@ let result | ||
} | ||
} | ||
return value | ||
@@ -35,3 +50,7 @@ }, | ||
const isNew = !Object.prototype.hasOwnProperty.call(target, property) | ||
if (!bindings.has(property)) bindings.set(property, new Binding(property)) | ||
if (!bindings.has(property)) { | ||
bindings.set(property, new Binding(property)) | ||
} | ||
let result | ||
@@ -44,8 +63,2 @@ let previous | ||
binding.updated() | ||
if (manager.debugging) { | ||
console.log( | ||
`[debug]: Updated observable property '${property}' to:`, | ||
value, | ||
) | ||
} | ||
for (const transaction of manager.transactions) { | ||
@@ -65,2 +78,4 @@ transaction.push({ | ||
observables.set(source, proxy) | ||
return proxy | ||
@@ -67,0 +82,0 @@ } |
@@ -34,1 +34,39 @@ import observable from './observable.js' | ||
}) | ||
test('update bug', () => { | ||
class Todo { | ||
constructor(values) { | ||
this.done = false | ||
this.text = '' | ||
Object.assign(this, values) | ||
} | ||
toggle() { | ||
this.done = !this.done | ||
} | ||
} | ||
const state = observable({ | ||
todos: [ | ||
new Todo({ | ||
text: 'make todo list', | ||
done: true, | ||
}), | ||
], | ||
}) | ||
const result = [] | ||
let i = 0 | ||
reaction(() => { | ||
result.push(`reaction ${++i}`) | ||
for (const todo of state.todos) { | ||
todo.done | ||
} | ||
}) | ||
state.todos[0].done = false | ||
expect(result).toEqual(['reaction 1', 'reaction 2']) | ||
}) |
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
81988
45
2409