Skip to content

Commit

Permalink
Merge pull request alpinejs#767 from ryangjchandler/feature/allow-mag…
Browse files Browse the repository at this point in the history
…ic-props-in-watchers

feature(allow watching for changes on magic properties)
  • Loading branch information
calebporzio authored Sep 15, 2020
2 parents 41d3b35 + 4876cb3 commit c91704c
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 26 deletions.
28 changes: 6 additions & 22 deletions dist/alpine-ie11.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,10 @@
return module = { exports: {} }, fn(module, module.exports), module.exports;
}

(function(){function n(){function v(){return null}function l(a){return a?"object"===typeof a||"function"===typeof a:!1}function p(a){if(null!==a&&!l(a))throw new TypeError("Object prototype may only be an Object or null: "+a);}var q=null,e=Object,w=!!e.create||!({__proto__:null}instanceof e),A=e.create||(w?function(a){p(a);return {__proto__:a}}:function(a){function c(){}p(a);if(null===a)throw new SyntaxError("Native Object.create is required to create objects with null prototype");c.prototype=a;return new c}),
B=e.getPrototypeOf||([].__proto__===Array.prototype?function(a){a=a.__proto__;return l(a)?a:null}:v);var m=function(a,c){function k(){}if(void 0===(this&&this instanceof m?this.constructor:void 0))throw new TypeError("Constructor Proxy requires 'new'");if(!l(a)||!l(c))throw new TypeError("Cannot create proxy with a non-object as target or handler");q=function(){a=null;k=function(b){throw new TypeError("Cannot perform '"+b+"' on a proxy that has been revoked");};};setTimeout(function(){q=null;},0);var g=
c;c={get:null,set:null,apply:null,construct:null};for(var h in g){if(!(h in c))throw new TypeError("Proxy polyfill does not support trap '"+h+"'");c[h]=g[h];}"function"===typeof g&&(c.apply=g.apply.bind(g));g=B(a);var r=!1,t=!1;if("function"===typeof a){var f=function(){var b=this&&this.constructor===f,d=Array.prototype.slice.call(arguments);k(b?"construct":"apply");return b&&c.construct?c.construct.call(this,a,d):!b&&c.apply?c.apply(a,this,d):b?(d.unshift(a),new (a.bind.apply(a,d))):a.apply(this,
d)};r=!0;}else a instanceof Array?(f=[],t=!0):f=w||null!==g?A(g):{};var x=c.get?function(b){k("get");return c.get(this,b,f)}:function(b){k("get");return this[b]},C=c.set?function(b,d){k("set");c.set(this,b,d,f);}:function(b,d){k("set");this[b]=d;},y={};e.getOwnPropertyNames(a).forEach(function(b){if(!((r||t)&&b in f)){var d=e.getOwnPropertyDescriptor(a,b);e.defineProperty(f,b,{enumerable:!!d.enumerable,get:x.bind(a,b),set:C.bind(a,b)});y[b]=!0;}});h=!0;if(r||t){var D=e.setPrototypeOf||([].__proto__===
Array.prototype?function(b,d){p(d);b.__proto__=d;return b}:v);g&&D(f,g)||(h=!1);}if(c.get||!h)for(var u in a)y[u]||e.defineProperty(f,u,{get:x.bind(a,u)});e.seal(a);e.seal(f);return f};m.revocable=function(a,c){return {proxy:new m(a,c),revoke:q}};return m}var z="undefined"!==typeof process&&"[object process]"==={}.toString.call(process)||"undefined"!==typeof navigator&&"ReactNative"===navigator.product?commonjsGlobal:self;z.Proxy||(z.Proxy=n(),z.Proxy.revocable=z.Proxy.revocable);})();
(function(){function k(){function p(a){return a?"object"===typeof a||"function"===typeof a:!1}var l=null;var n=function(a,c){function g(){}if(!p(a)||!p(c))throw new TypeError("Cannot create proxy with a non-object as target or handler");l=function(){a=null;g=function(b){throw new TypeError("Cannot perform '"+b+"' on a proxy that has been revoked");};};setTimeout(function(){l=null;},0);var f=c;c={get:null,set:null,apply:null,construct:null};for(var h in f){if(!(h in c))throw new TypeError("Proxy polyfill does not support trap '"+
h+"'");c[h]=f[h];}"function"===typeof f&&(c.apply=f.apply.bind(f));var d=this,q=!1,r=!1;"function"===typeof a?(d=function(){var b=this&&this.constructor===d,e=Array.prototype.slice.call(arguments);g(b?"construct":"apply");return b&&c.construct?c.construct.call(this,a,e):!b&&c.apply?c.apply(a,this,e):b?(e.unshift(a),new (a.bind.apply(a,e))):a.apply(this,e)},q=!0):a instanceof Array&&(d=[],r=!0);var t=c.get?function(b){g("get");return c.get(this,b,d)}:function(b){g("get");return this[b]},w=c.set?function(b,
e){g("set");c.set(this,b,e,d);}:function(b,e){g("set");this[b]=e;},u={};Object.getOwnPropertyNames(a).forEach(function(b){if(!((q||r)&&b in d)){var e={enumerable:!!Object.getOwnPropertyDescriptor(a,b).enumerable,get:t.bind(a,b),set:w.bind(a,b)};Object.defineProperty(d,b,e);u[b]=!0;}});f=!0;Object.setPrototypeOf?Object.setPrototypeOf(d,Object.getPrototypeOf(a)):d.__proto__?d.__proto__=a.__proto__:f=!1;if(c.get||!f)for(var m in a)u[m]||Object.defineProperty(d,m,{get:t.bind(a,m)});Object.seal(a);Object.seal(d);
return d};n.revocable=function(a,c){return {proxy:new n(a,c),revoke:l}};return n}var v="undefined"!==typeof process&&"[object process]"==={}.toString.call(process)||"undefined"!==typeof navigator&&"ReactNative"===navigator.product?commonjsGlobal:self;v.Proxy||(v.Proxy=k(),v.Proxy.revocable=v.Proxy.revocable);})();

!function(e){var t=e.Element.prototype;"function"!=typeof t.matches&&(t.matches=t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||function(e){for(var t=(this.document||this.ownerDocument).querySelectorAll(e),o=0;t[o]&&t[o]!==this;)++o;return Boolean(t[o])}),"function"!=typeof t.closest&&(t.closest=function(e){for(var t=this;t&&1===t.nodeType;){if(t.matches(e))return t;t=t.parentNode;}return null});}(window);

Expand Down Expand Up @@ -3613,21 +3612,6 @@
}
});

var nativeReverse = [].reverse;
var test$1 = [1, 2];

// `Array.prototype.reverse` method
// https://tc39.github.io/ecma262/#sec-array.prototype.reverse
// fix for Safari 12.0 bug
// https://bugs.webkit.org/show_bug.cgi?id=188794
_export({ target: 'Array', proto: true, forced: String(test$1) === String(test$1.reverse()) }, {
reverse: function reverse() {
// eslint-disable-next-line no-self-assign
if (isArray(this)) this.length = this.length;
return nativeReverse.call(this);
}
});

var $some = arrayIteration.some;


Expand Down Expand Up @@ -7260,7 +7244,7 @@
}

return comparisonData[part];
}.bind(this), self.getUnobservedData());
}.bind(this), self.unobservedData);
}.bind(this));
} else {
// Let's walk through the watchers with "dot-notation" (foo.bar) and see
Expand Down Expand Up @@ -7295,7 +7279,7 @@
}

return comparisonData[part];
}.bind(this), self.getUnobservedData());
}.bind(this), self.unobservedData);
}.bind(this));
} // Don't react to data changes for cases like the `x-created` hook.

Expand Down
4 changes: 2 additions & 2 deletions dist/alpine.js
Original file line number Diff line number Diff line change
Expand Up @@ -1500,7 +1500,7 @@
}

return comparisonData[part];
}, self.getUnobservedData());
}, self.unobservedData);
});
} else {
// Let's walk through the watchers with "dot-notation" (foo.bar) and see
Expand All @@ -1519,7 +1519,7 @@
}

return comparisonData[part];
}, self.getUnobservedData());
}, self.unobservedData);
});
} // Don't react to data changes for cases like the `x-created` hook.

Expand Down
5 changes: 3 additions & 2 deletions src/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ export default class Component {
}

return comparisonData[part]
}, self.getUnobservedData())
}, self.unobservedData)
})
} else {
// Let's walk through the watchers with "dot-notation" (foo.bar) and see
Expand All @@ -155,8 +155,9 @@ export default class Component {
// Run the watchers.
self.watchers[fullDotNotationKey].forEach(callback => callback(target[key]))
}

return comparisonData[part]
}, self.getUnobservedData())
}, self.unobservedData)
})
}

Expand Down
24 changes: 24 additions & 0 deletions test/watch.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,27 @@ test('$watch nested arrays', async () => {
expect(document.querySelector('h2').textContent).toEqual('one,two')
})
})

test('$watch with magic properties', async () => {
document.body.innerHTML = `
<div x-data="{ foo: 'bar', bob: 'car' }" x-init="$watch('$self.foo', value => bob = value)">
<span x-text="bob"></span>
<button x-on:click="$self.foo = 'far'"></button>
</div>
`

Alpine.addMagicProperty('self', function (el) {
return el.__x.$data
})

Alpine.start()

expect(document.querySelector('span').textContent).toEqual('car')

document.querySelector('button').click()

await wait(() => {
expect(document.querySelector('span').textContent).toEqual('far')
})
})

0 comments on commit c91704c

Please sign in to comment.