From c7015e47e9f78b0e6cad571b825eda09f2706b55 Mon Sep 17 00:00:00 2001 From: Philipp Bosch Date: Thu, 5 Mar 2020 13:14:31 +0100 Subject: [PATCH 1/4] Add failing test (and fix minor typos) --- test/constructor.spec.js | 2 +- test/on.spec.js | 6 +++--- test/xattrs.spec.js | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 test/xattrs.spec.js diff --git a/test/constructor.spec.js b/test/constructor.spec.js index 4e98778bb..7d539c334 100644 --- a/test/constructor.spec.js +++ b/test/constructor.spec.js @@ -34,7 +34,7 @@ test('auto-detect new components at the top level', async () => { await wait(() => { expect(document.querySelector('span').innerText).toEqual('bar') }) }) -test('auto-detect newsted new components at the top level', async () => { +test('auto-detect nested new components at the top level', async () => { var runObservers = [] global.MutationObserver = class { diff --git a/test/on.spec.js b/test/on.spec.js index 15a50b0e6..4b774db43 100644 --- a/test/on.spec.js +++ b/test/on.spec.js @@ -6,7 +6,7 @@ global.MutationObserver = class { observe() {} } -test('data modified in event listener updates effected attribute bindings', async () => { +test('data modified in event listener updates affected attribute bindings', async () => { document.body.innerHTML = `
@@ -24,7 +24,7 @@ test('data modified in event listener updates effected attribute bindings', asyn await wait(() => { expect(document.querySelector('span').getAttribute('foo')).toEqual('baz') }) }) -test('nested data modified in event listener updates effected attribute bindings', async () => { +test('nested data modified in event listener updates affected attribute bindings', async () => { document.body.innerHTML = `
@@ -161,7 +161,7 @@ test('.once modifier', async () => { expect(document.querySelector('span').getAttribute('foo')).toEqual('1') }) -test('.once modifier doest remove listener if false is returned', async () => { +test('.once modifier does not remove listener if false is returned', async () => { document.body.innerHTML = `
diff --git a/test/xattrs.spec.js b/test/xattrs.spec.js new file mode 100644 index 000000000..3ec2ef910 --- /dev/null +++ b/test/xattrs.spec.js @@ -0,0 +1,22 @@ +import Alpine from 'alpinejs' +import { wait } from '@testing-library/dom' + +global.MutationObserver = class { + observe() {} +} + +test('x-attributes are matched exactly', async () => { + document.body.innerHTML = ` +
+
+
+
+
+ ` + + Alpine.start() + + expect(document.getElementById('el1').style.display).toEqual('none') + expect(document.getElementById('el2').style.display).not.toEqual('none') + await wait(() => { expect(document.getElementById('el3').style.display).not.toEqual('none') }) +}) From c8c8d02e8d44ba419f133c77174a50d0c96d1d72 Mon Sep 17 00:00:00 2001 From: Philipp Bosch Date: Thu, 5 Mar 2020 13:37:50 +0100 Subject: [PATCH 2/4] Make x-attr regexp stricter to not match e.g. 'xxx-show' or 'x-showsomething'. --- dist/alpine-ie11.js | 2 +- dist/alpine-ie11.js.map | 2 +- dist/alpine.js | 4 ++-- dist/alpine.js.map | 2 +- package-lock.json | 2 +- src/utils.js | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/alpine-ie11.js b/dist/alpine-ie11.js index 2f124821a..d893d9a60 100644 --- a/dist/alpine-ie11.js +++ b/dist/alpine-ie11.js @@ -10,5 +10,5 @@ * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ -function(){var needsTemplate="undefined"==typeof HTMLTemplateElement,brokenDocFragment=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),needsDocFrag=!1;/Trident/.test(navigator.userAgent)&&function(){needsDocFrag=!0;var origCloneNode=Node.prototype.cloneNode;Node.prototype.cloneNode=function(deep){var newDom=origCloneNode.call(this,deep);return this instanceof DocumentFragment&&(newDom.__proto__=DocumentFragment.prototype),newDom},DocumentFragment.prototype.querySelectorAll=HTMLElement.prototype.querySelectorAll,DocumentFragment.prototype.querySelector=HTMLElement.prototype.querySelector,Object.defineProperties(DocumentFragment.prototype,{nodeType:{get:function(){return Node.DOCUMENT_FRAGMENT_NODE},configurable:!0},localName:{get:function(){},configurable:!0},nodeName:{get:function(){return"#document-fragment"},configurable:!0}});var origInsertBefore=Node.prototype.insertBefore;function insertBefore(newNode,refNode){if(newNode instanceof DocumentFragment)for(var child;child=newNode.firstChild;)origInsertBefore.call(this,child,refNode);else origInsertBefore.call(this,newNode,refNode);return newNode}Node.prototype.insertBefore=insertBefore;var origAppendChild=Node.prototype.appendChild;Node.prototype.appendChild=function(child){return child instanceof DocumentFragment?insertBefore.call(this,child,null):origAppendChild.call(this,child),child};var origRemoveChild=Node.prototype.removeChild,origReplaceChild=Node.prototype.replaceChild;Node.prototype.replaceChild=function(newChild,oldChild){return newChild instanceof DocumentFragment?(insertBefore.call(this,newChild,oldChild),origRemoveChild.call(this,oldChild)):origReplaceChild.call(this,newChild,oldChild),oldChild},Document.prototype.createDocumentFragment=function(){var frag=this.createElement("df");return frag.__proto__=DocumentFragment.prototype,frag};var origImportNode=Document.prototype.importNode;Document.prototype.importNode=function(impNode,deep){deep=deep||!1;var newNode=origImportNode.call(this,impNode,deep);return impNode instanceof DocumentFragment&&(newNode.__proto__=DocumentFragment.prototype),newNode}}();var capturedCloneNode=Node.prototype.cloneNode,capturedCreateElement=Document.prototype.createElement,capturedImportNode=Document.prototype.importNode,capturedRemoveChild=Node.prototype.removeChild,capturedAppendChild=Node.prototype.appendChild,capturedReplaceChild=Node.prototype.replaceChild,capturedParseFromString=DOMParser.prototype.parseFromString,capturedHTMLElementInnerHTML=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML")||{get:function(){return this.innerHTML},set:function(text){this.innerHTML=text}},capturedChildNodes=Object.getOwnPropertyDescriptor(window.Node.prototype,"childNodes")||{get:function(){return this.childNodes}},elementQuerySelectorAll=Element.prototype.querySelectorAll,docQuerySelectorAll=Document.prototype.querySelectorAll,fragQuerySelectorAll=DocumentFragment.prototype.querySelectorAll;function QSA(node,selector){if(!node.childNodes.length)return[];switch(node.nodeType){case Node.DOCUMENT_NODE:return docQuerySelectorAll.call(node,selector);case Node.DOCUMENT_FRAGMENT_NODE:return fragQuerySelectorAll.call(node,selector);default:return elementQuerySelectorAll.call(node,selector)}}var needsCloning=function(){if(!needsTemplate){var t=document.createElement("template"),t2=document.createElement("template");t2.content.appendChild(document.createElement("div")),t.content.appendChild(t2);var clone=t.cloneNode(!0);return 0===clone.content.childNodes.length||0===clone.content.firstChild.content.childNodes.length||brokenDocFragment}}(),PolyfilledHTMLTemplateElement=function(){};if(needsTemplate){var contentDoc=document.implementation.createHTMLDocument("template"),canDecorate=!0,templateStyle=document.createElement("style");templateStyle.textContent="template{display:none;}";var head=document.head;head.insertBefore(templateStyle,head.firstElementChild),PolyfilledHTMLTemplateElement.prototype=Object.create(HTMLElement.prototype);var canProtoPatch=!document.createElement("div").hasOwnProperty("innerHTML");PolyfilledHTMLTemplateElement.decorate=function(template){if(!template.content&&template.namespaceURI===document.documentElement.namespaceURI){var child;for(template.content=contentDoc.createDocumentFragment();child=template.firstChild;)capturedAppendChild.call(template.content,child);if(canProtoPatch)template.__proto__=PolyfilledHTMLTemplateElement.prototype;else if(template.cloneNode=function(deep){return PolyfilledHTMLTemplateElement._cloneNode(this,deep)},canDecorate)try{defineInnerHTML(template),defineOuterHTML(template)}catch(err){canDecorate=!1}PolyfilledHTMLTemplateElement.bootstrap(template.content)}};var topLevelWrappingMap={option:["select"],thead:["table"],col:["colgroup","table"],tr:["tbody","table"],th:["tr","tbody","table"],td:["tr","tbody","table"]},defineInnerHTML=function(obj){Object.defineProperty(obj,"innerHTML",{get:function(){return getInnerHTML(this)},set:function(text){var wrap=topLevelWrappingMap[function(text){return(/<([a-z][^/\0>\x20\t\r\n\f]+)/i.exec(text)||["",""])[1].toLowerCase()}(text)];if(wrap)for(var i=0;i"+text+"";for(contentDoc.body.innerHTML=text,PolyfilledHTMLTemplateElement.bootstrap(contentDoc);this.content.firstChild;)capturedRemoveChild.call(this.content,this.content.firstChild);var body=contentDoc.body;if(wrap)for(var j=0;j"+this.innerHTML+""},set:function(innerHTML){if(!this.parentNode)throw new Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");contentDoc.body.innerHTML=innerHTML;for(var docFrag=this.ownerDocument.createDocumentFragment();contentDoc.body.firstChild;)capturedAppendChild.call(docFrag,contentDoc.body.firstChild);capturedReplaceChild.call(this.parentNode,docFrag,this)},configurable:!0})};defineInnerHTML(PolyfilledHTMLTemplateElement.prototype),defineOuterHTML(PolyfilledHTMLTemplateElement.prototype),PolyfilledHTMLTemplateElement.bootstrap=function(doc){for(var t,templates=QSA(doc,"template"),i=0,l=templates.length;i]/g,escapeReplace=function(c){switch(c){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";case" ":return" "}},escapeAttr=function(s){return s.replace(escapeAttrRegExp,escapeReplace)},makeSet=function(arr){for(var set={},i=0;i";case Node.TEXT_NODE:var data=node.data;return parentNode&&plaintextParents[parentNode.localName]?data:function(s){return s.replace(escapeDataRegExp,escapeReplace)}(data);case Node.COMMENT_NODE:return"\x3c!--"+node.data+"--\x3e";default:throw window.console.error(node),new Error("not implemented")}},getInnerHTML=function(node,callback){"template"===node.localName&&(node=node.content);for(var child,s="",c$=callback?callback(node):capturedChildNodes.get.call(node),i=0,l=c$.length;i0?floor:ceil)(argument)},min=Math.min,toLength=function(argument){return argument>0?min(toInteger(argument),9007199254740991):0},max=Math.max,min$1=Math.min,toAbsoluteIndex=function(index,length){var integer=toInteger(index);return integer<0?max(integer+length,0):min$1(integer,length)},createMethod=function(IS_INCLUDES){return function($this,el,fromIndex){var value,O=toIndexedObject($this),length=toLength(O.length),index=toAbsoluteIndex(fromIndex,length);if(IS_INCLUDES&&el!=el){for(;length>index;)if((value=O[index++])!=value)return!0}else for(;length>index;index++)if((IS_INCLUDES||index in O)&&O[index]===el)return IS_INCLUDES||index||0;return!IS_INCLUDES&&-1}},arrayIncludes={includes:createMethod(!0),indexOf:createMethod(!1)},indexOf=arrayIncludes.indexOf,objectKeysInternal=function(object,names){var key,O=toIndexedObject(object),i=0,result=[];for(key in O)!has(hiddenKeys,key)&&has(O,key)&&result.push(key);for(;names.length>i;)has(O,key=names[i++])&&(~indexOf(result,key)||result.push(key));return result},enumBugKeys=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],hiddenKeys$1=enumBugKeys.concat("length","prototype"),objectGetOwnPropertyNames={f:Object.getOwnPropertyNames||function(O){return objectKeysInternal(O,hiddenKeys$1)}},objectGetOwnPropertySymbols={f:Object.getOwnPropertySymbols},ownKeys=getBuiltIn("Reflect","ownKeys")||function(it){var keys=objectGetOwnPropertyNames.f(anObject(it)),getOwnPropertySymbols=objectGetOwnPropertySymbols.f;return getOwnPropertySymbols?keys.concat(getOwnPropertySymbols(it)):keys},copyConstructorProperties=function(target,source){for(var keys=ownKeys(source),defineProperty=objectDefineProperty.f,getOwnPropertyDescriptor=objectGetOwnPropertyDescriptor.f,i=0;iindex;index++)if((NO_HOLES||index in self)&&(result=boundFunction(value=self[index],index,O),TYPE))if(IS_MAP)target[index]=result;else if(result)switch(TYPE){case 3:return!0;case 5:return value;case 6:return index;case 2:push.call(target,value)}else if(IS_EVERY)return!1;return IS_FIND_INDEX?-1:IS_SOME||IS_EVERY?IS_EVERY:target}},arrayIteration={forEach:createMethod$1(0),map:createMethod$1(1),filter:createMethod$1(2),some:createMethod$1(3),every:createMethod$1(4),find:createMethod$1(5),findIndex:createMethod$1(6)},engineUserAgent=getBuiltIn("navigator","userAgent")||"",process$1=global_1.process,versions=process$1&&process$1.versions,v8=versions&&versions.v8;v8?version=(match=v8.split("."))[0]+match[1]:engineUserAgent&&(!(match=engineUserAgent.match(/Edge\/(\d+)/))||match[1]>=74)&&(match=engineUserAgent.match(/Chrome\/(\d+)/))&&(version=match[1]);var engineV8Version=version&&+version,SPECIES$1=wellKnownSymbol("species"),arrayMethodHasSpeciesSupport=function(METHOD_NAME){return engineV8Version>=51||!fails((function(){var array=[];return(array.constructor={})[SPECIES$1]=function(){return{foo:1}},1!==array[METHOD_NAME](Boolean).foo}))},defineProperty=Object.defineProperty,cache={},thrower=function(it){throw it},arrayMethodUsesToLength=function(METHOD_NAME,options){if(has(cache,METHOD_NAME))return cache[METHOD_NAME];options||(options={});var method=[][METHOD_NAME],ACCESSORS=!!has(options,"ACCESSORS")&&options.ACCESSORS,argument0=has(options,0)?options[0]:thrower,argument1=has(options,1)?options[1]:void 0;return cache[METHOD_NAME]=!!method&&!fails((function(){if(ACCESSORS&&!descriptors)return!0;var O={length:-1};ACCESSORS?defineProperty(O,1,{enumerable:!0,get:thrower}):O[1]=1,method.call(O,argument0,argument1)}))},$filter=arrayIteration.filter,HAS_SPECIES_SUPPORT=arrayMethodHasSpeciesSupport("filter"),USES_TO_LENGTH=arrayMethodUsesToLength("filter");_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT||!USES_TO_LENGTH},{filter:function(callbackfn){return $filter(this,callbackfn,arguments.length>1?arguments[1]:void 0)}});var arrayMethodIsStrict=function(METHOD_NAME,argument){var method=[][METHOD_NAME];return!!method&&fails((function(){method.call(null,argument||function(){throw 1},1)}))},$forEach=arrayIteration.forEach,STRICT_METHOD=arrayMethodIsStrict("forEach"),USES_TO_LENGTH$1=arrayMethodUsesToLength("forEach"),arrayForEach=STRICT_METHOD&&USES_TO_LENGTH$1?[].forEach:function(callbackfn){return $forEach(this,callbackfn,arguments.length>1?arguments[1]:void 0)};_export({target:"Array",proto:!0,forced:[].forEach!=arrayForEach},{forEach:arrayForEach});var callWithSafeIterationClosing=function(iterator,fn,value,ENTRIES){try{return ENTRIES?fn(anObject(value)[0],value[1]):fn(value)}catch(error){var returnMethod=iterator.return;throw void 0!==returnMethod&&anObject(returnMethod.call(iterator)),error}},iterators={},ITERATOR=wellKnownSymbol("iterator"),ArrayPrototype=Array.prototype,isArrayIteratorMethod=function(it){return void 0!==it&&(iterators.Array===it||ArrayPrototype[ITERATOR]===it)},createProperty=function(object,key,value){var propertyKey=toPrimitive(key);propertyKey in object?objectDefineProperty.f(object,propertyKey,createPropertyDescriptor(0,value)):object[propertyKey]=value},test={};test[wellKnownSymbol("toStringTag")]="z";var toStringTagSupport="[object z]"===String(test),TO_STRING_TAG$1=wellKnownSymbol("toStringTag"),CORRECT_ARGUMENTS="Arguments"==classofRaw(function(){return arguments}()),classof=toStringTagSupport?classofRaw:function(it){var O,tag,result;return void 0===it?"Undefined":null===it?"Null":"string"==typeof(tag=function(it,key){try{return it[key]}catch(error){}}(O=Object(it),TO_STRING_TAG$1))?tag:CORRECT_ARGUMENTS?classofRaw(O):"Object"==(result=classofRaw(O))&&"function"==typeof O.callee?"Arguments":result},ITERATOR$1=wellKnownSymbol("iterator"),getIteratorMethod=function(it){if(null!=it)return it[ITERATOR$1]||it["@@iterator"]||iterators[classof(it)]},ITERATOR$2=wellKnownSymbol("iterator"),SAFE_CLOSING=!1;try{var called=0,iteratorWithReturn={next:function(){return{done:!!called++}},return:function(){SAFE_CLOSING=!0}};iteratorWithReturn[ITERATOR$2]=function(){return this},Array.from(iteratorWithReturn,(function(){throw 2}))}catch(error){}var checkCorrectnessOfIteration=function(exec,SKIP_CLOSING){if(!SKIP_CLOSING&&!SAFE_CLOSING)return!1;var ITERATION_SUPPORT=!1;try{var object={};object[ITERATOR$2]=function(){return{next:function(){return{done:ITERATION_SUPPORT=!0}}}},exec(object)}catch(error){}return ITERATION_SUPPORT},INCORRECT_ITERATION=!checkCorrectnessOfIteration((function(iterable){Array.from(iterable)}));_export({target:"Array",stat:!0,forced:INCORRECT_ITERATION},{from:function(arrayLike){var length,result,step,iterator,next,value,O=toObject(arrayLike),C="function"==typeof this?this:Array,argumentsLength=arguments.length,mapfn=argumentsLength>1?arguments[1]:void 0,mapping=void 0!==mapfn,iteratorMethod=getIteratorMethod(O),index=0;if(mapping&&(mapfn=functionBindContext(mapfn,argumentsLength>2?arguments[2]:void 0,2)),null==iteratorMethod||C==Array&&isArrayIteratorMethod(iteratorMethod))for(result=new C(length=toLength(O.length));length>index;index++)value=mapping?mapfn(O[index],index):O[index],createProperty(result,index,value);else for(next=(iterator=iteratorMethod.call(O)).next,result=new C;!(step=next.call(iterator)).done;index++)value=mapping?callWithSafeIterationClosing(iterator,mapfn,[step.value,index],!0):step.value,createProperty(result,index,value);return result.length=index,result}});var IteratorPrototype,PrototypeOfArrayIteratorPrototype,arrayIterator,createMethod$2=function(CONVERT_TO_STRING){return function($this,pos){var first,second,S=String(requireObjectCoercible($this)),position=toInteger(pos),size=S.length;return position<0||position>=size?CONVERT_TO_STRING?"":void 0:(first=S.charCodeAt(position))<55296||first>56319||position+1===size||(second=S.charCodeAt(position+1))<56320||second>57343?CONVERT_TO_STRING?S.charAt(position):first:CONVERT_TO_STRING?S.slice(position,position+2):second-56320+(first-55296<<10)+65536}},stringMultibyte={codeAt:createMethod$2(!1),charAt:createMethod$2(!0)},correctPrototypeGetter=!fails((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype})),IE_PROTO=sharedKey("IE_PROTO"),ObjectPrototype=Object.prototype,objectGetPrototypeOf=correctPrototypeGetter?Object.getPrototypeOf:function(O){return O=toObject(O),has(O,IE_PROTO)?O[IE_PROTO]:"function"==typeof O.constructor&&O instanceof O.constructor?O.constructor.prototype:O instanceof Object?ObjectPrototype:null},ITERATOR$3=wellKnownSymbol("iterator"),BUGGY_SAFARI_ITERATORS=!1;[].keys&&("next"in(arrayIterator=[].keys())?(PrototypeOfArrayIteratorPrototype=objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator)))!==Object.prototype&&(IteratorPrototype=PrototypeOfArrayIteratorPrototype):BUGGY_SAFARI_ITERATORS=!0),null==IteratorPrototype&&(IteratorPrototype={}),has(IteratorPrototype,ITERATOR$3)||createNonEnumerableProperty(IteratorPrototype,ITERATOR$3,(function(){return this}));var activeXDocument,iteratorsCore={IteratorPrototype:IteratorPrototype,BUGGY_SAFARI_ITERATORS:BUGGY_SAFARI_ITERATORS},objectKeys=Object.keys||function(O){return objectKeysInternal(O,enumBugKeys)},objectDefineProperties=descriptors?Object.defineProperties:function(O,Properties){anObject(O);for(var key,keys=objectKeys(Properties),length=keys.length,index=0;length>index;)objectDefineProperty.f(O,key=keys[index++],Properties[key]);return O},html=getBuiltIn("document","documentElement"),IE_PROTO$1=sharedKey("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(content){return"