Socket
Socket
Sign inDemoInstall

@adrianhelvik/bind

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@adrianhelvik/bind - npm Package Compare versions

Comparing version 1.0.1 to 1.0.2

lib/track.spec.js

50

lib/observable.js

@@ -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'])
})
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc