css-blank-pseudo 3.0.2 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/README.md +141 -53
- package/dist/browser-global.js +1 -124
- package/dist/browser-global.js.map +1 -1
- package/dist/browser.cjs +1 -119
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.mjs +1 -119
- package/dist/browser.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.mjs +1 -1
- package/package.json +106 -83
- package/browser.js +0 -125
- package/dist/cli.cjs +0 -3
package/dist/browser.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.cjs","sources":["../src/browser.js"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"browser.cjs","sources":["../src/is-valid-replacement.mjs","../src/browser.js"],"sourcesContent":["const INVALID_SELECTOR_CHAR = [\n\t' ', // Can't use child selector\n\t'>', // Can't use direct child selector\n\t'~', // Can't use sibling selector\n\t':', // Can't use pseudo selector\n\t'+', // Can't use adjacent selector\n\t'@', // Can't use at\n\t'#', // Can't use id selector\n\t'(', // Can't use parenthesis\n\t')', // Can't use parenthesis\n];\n\nexport default function isValidReplacement(selector) {\n\tlet isValid = true;\n\n\t// Purposely archaic so it's interoperable in old browsers\n\tfor (let i = 0, length = INVALID_SELECTOR_CHAR.length; i < length && isValid; i++) {\n\t\tif (selector.indexOf(INVALID_SELECTOR_CHAR[i]) > -1) {\n\t\t\tisValid = false;\n\t\t}\n\t}\n\n\treturn isValid;\n}\n","/* global document,window,self,MutationObserver */\nimport isValidReplacement from './is-valid-replacement.mjs';\n\nconst CSS_CLASS_LOADED = 'js-blank-pseudo';\n\n// form control elements selector\nfunction isFormControlElement(element) {\n\tif (element.nodeName === 'INPUT' || element.nodeName === 'SELECT' || element.nodeName === 'TEXTAREA') {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction createNewEvent(eventName) {\n\tlet event;\n\n\tif (typeof(Event) === 'function') {\n\t\tevent = new Event(eventName, { bubbles: true });\n\t} else {\n\t\tevent = document.createEvent('Event');\n\t\tevent.initEvent(eventName, true, false);\n\t}\n\n\treturn event;\n}\n\nfunction generateHandler(replaceWith) {\n\tlet selector;\n\tlet remove;\n\tlet add;\n\n\tif (replaceWith[0] === '.') {\n\t\tselector = replaceWith.slice(1);\n\t\tremove = (el) => el.classList.remove(selector);\n\t\tadd = (el) => el.classList.add(selector);\n\t} else {\n\t\t// A bit naive\n\t\tselector = replaceWith.slice(1, -1);\n\t\tremove = (el) => el.removeAttribute(selector, '');\n\t\tadd = (el) => el.setAttribute(selector, '');\n\t}\n\n\treturn function handleInputOrChangeEvent(event) {\n\t\tconst element = event.target;\n\t\tif (!isFormControlElement(element)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isSelect = element.nodeName === 'SELECT';\n\t\tconst hasValue = isSelect\n\t\t\t? !!element.options[element.selectedIndex].value\n\t\t\t: !!element.value;\n\n\t\tif (hasValue) {\n\t\t\tremove(element);\n\t\t} else {\n\t\t\tadd(element);\n\t\t}\n\t};\n}\n\n// observe changes to the \"selected\" property on an HTML Element\nfunction observeSelectedOfHTMLElement(HTMLElement) {\n\tconst descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'selected');\n\tconst nativeSet = descriptor.set;\n\n\tdescriptor.set = function set(value) { // eslint-disable-line no-unused-vars\n\t\tnativeSet.apply(this, arguments);\n\n\t\tconst event = createNewEvent('change');\n\t\tthis.parentElement.dispatchEvent(event);\n\t};\n\n\tObject.defineProperty(HTMLElement.prototype, 'selected', descriptor);\n}\n\n// observe changes to the \"value\" property on an HTML Element\nfunction observeValueOfHTMLElement(HTMLElement, handler) {\n\tconst descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'value');\n\tconst nativeSet = descriptor.set;\n\n\tdescriptor.set = function set() {\n\t\tnativeSet.apply(this, arguments);\n\t\thandler({ target: this });\n\t};\n\n\tObject.defineProperty(HTMLElement.prototype, 'value', descriptor);\n}\n\nexport default function cssBlankPseudoInit(opts) {\n\t// configuration\n\tconst options = {\n\t\tforce: false,\n\t\treplaceWith: '[blank]',\n\t};\n\n\tif (typeof opts !== 'undefined' && 'force' in opts) {\n\t\toptions.force = opts.force;\n\t}\n\n\tif (typeof opts !== 'undefined' && 'replaceWith' in opts) {\n\t\toptions.replaceWith = opts.replaceWith;\n\t}\n\n\tif (!isValidReplacement(options.replaceWith)) {\n\t\tthrow new Error(`${options.replaceWith} is not a valid replacement since it can't be applied to single elements.`);\n\t}\n\n\ttry {\n\t\tdocument.querySelector(':blank');\n\n\t\tif (!options.force) {\n\t\t\treturn;\n\t\t}\n\t} catch (ignoredError) { /* do nothing and continue */ }\n\n\tconst handler = generateHandler(options.replaceWith);\n\tconst bindEvents = () => {\n\t\tif (document.body) {\n\t\t\tdocument.body.addEventListener('change', handler);\n\t\t\tdocument.body.addEventListener('input', handler);\n\t\t}\n\t};\n\tconst updateAllCandidates = () => {\n\t\tArray.prototype.forEach.call(\n\t\t\tdocument.querySelectorAll('input, select, textarea'),\n\t\t\tnode => {\n\t\t\t\thandler({ target: node });\n\t\t\t},\n\t\t);\n\t};\n\n\tif (document.body) {\n\t\tbindEvents();\n\t} else {\n\t\twindow.addEventListener('load', bindEvents);\n\t}\n\n\tif (document.documentElement.className.indexOf(CSS_CLASS_LOADED) === -1) {\n\t\tdocument.documentElement.className += ` ${CSS_CLASS_LOADED}`;\n\t}\n\n\tobserveValueOfHTMLElement(self.HTMLInputElement, handler);\n\tobserveValueOfHTMLElement(self.HTMLSelectElement, handler);\n\tobserveValueOfHTMLElement(self.HTMLTextAreaElement, handler);\n\tobserveSelectedOfHTMLElement(self.HTMLOptionElement, handler);\n\n\t// conditionally update all form control elements\n\tupdateAllCandidates();\n\n\tif (typeof self.MutationObserver !== 'undefined') {\n\t\t// conditionally observe added or unobserve removed form control elements\n\t\tnew MutationObserver(mutationsList => {\n\t\t\tmutationsList.forEach(mutation => {\n\t\t\t\tArray.prototype.forEach.call(\n\t\t\t\t\tmutation.addedNodes || [],\n\t\t\t\t\tnode => {\n\t\t\t\t\t\tif (node.nodeType === 1 && isFormControlElement(node)) {\n\t\t\t\t\t\t\thandler({ target: node });\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t}).observe(document, { childList: true, subtree: true });\n\t} else {\n\t\tconst handleOnLoad = () => updateAllCandidates();\n\n\t\twindow.addEventListener('load', handleOnLoad);\n\t\twindow.addEventListener('DOMContentLoaded', handleOnLoad);\n\t}\n}\n"],"names":["INVALID_SELECTOR_CHAR","isFormControlElement","element","nodeName","createNewEvent","eventName","event","Event","bubbles","document","createEvent","initEvent","observeValueOfHTMLElement","HTMLElement","handler","descriptor","Object","getOwnPropertyDescriptor","prototype","nativeSet","set","apply","this","arguments","target","defineProperty","opts","options","force","replaceWith","selector","isValid","i","length","indexOf","isValidReplacement","Error","querySelector","ignoredError","remove","add","slice","el","classList","removeAttribute","setAttribute","selectedIndex","value","bindEvents","body","addEventListener","updateAllCandidates","Array","forEach","call","querySelectorAll","node","window","documentElement","className","self","HTMLInputElement","HTMLSelectElement","HTMLTextAreaElement","HTMLOptionElement","parentElement","dispatchEvent","MutationObserver","mutationsList","mutation","addedNodes","nodeType","observe","childList","subtree","handleOnLoad"],"mappings":"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"}
|
package/dist/browser.mjs
CHANGED
|
@@ -1,120 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
function cssBlankPseudo(document, opts) {
|
|
3
|
-
// configuration
|
|
4
|
-
var className = Object(opts).className;
|
|
5
|
-
var attr = Object(opts).attr || 'blank';
|
|
6
|
-
var force = Object(opts).force;
|
|
7
|
-
|
|
8
|
-
try {
|
|
9
|
-
document.querySelector(':blank');
|
|
10
|
-
|
|
11
|
-
if (!force) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
} catch (ignoredError) {
|
|
15
|
-
/* do nothing and continue */
|
|
16
|
-
} // observe value changes on <input>, <select>, and <textarea>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
var window = (document.ownerDocument || document).defaultView;
|
|
20
|
-
observeValueOfHTMLElement(window.HTMLInputElement);
|
|
21
|
-
observeValueOfHTMLElement(window.HTMLSelectElement);
|
|
22
|
-
observeValueOfHTMLElement(window.HTMLTextAreaElement);
|
|
23
|
-
observeSelectedOfHTMLElement(window.HTMLOptionElement); // form control elements selector
|
|
24
|
-
|
|
25
|
-
var selector = 'INPUT,SELECT,TEXTAREA';
|
|
26
|
-
var selectorRegExp = /^(INPUT|SELECT|TEXTAREA)$/; // conditionally update all form control elements
|
|
27
|
-
|
|
28
|
-
Array.prototype.forEach.call(document.querySelectorAll(selector), function (node) {
|
|
29
|
-
if (node.nodeName === 'SELECT') {
|
|
30
|
-
node.addEventListener('change', configureCssBlankAttribute);
|
|
31
|
-
} else {
|
|
32
|
-
node.addEventListener('input', configureCssBlankAttribute);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
configureCssBlankAttribute.call(node);
|
|
36
|
-
}); // conditionally observe added or unobserve removed form control elements
|
|
37
|
-
|
|
38
|
-
new MutationObserver(function (mutationsList) {
|
|
39
|
-
mutationsList.forEach(function (mutation) {
|
|
40
|
-
Array.prototype.forEach.call(mutation.addedNodes || [], function (node) {
|
|
41
|
-
if (node.nodeType === 1 && selectorRegExp.test(node.nodeName)) {
|
|
42
|
-
if (node.nodeName === 'SELECT') {
|
|
43
|
-
node.addEventListener('change', configureCssBlankAttribute);
|
|
44
|
-
} else {
|
|
45
|
-
node.addEventListener('input', configureCssBlankAttribute);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
configureCssBlankAttribute.call(node);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
Array.prototype.forEach.call(mutation.removedNodes || [], function (node) {
|
|
52
|
-
if (node.nodeType === 1 && selectorRegExp.test(node.nodeName)) {
|
|
53
|
-
if (node.nodeName === 'SELECT') {
|
|
54
|
-
node.removeEventListener('change', configureCssBlankAttribute);
|
|
55
|
-
} else {
|
|
56
|
-
node.removeEventListener('input', configureCssBlankAttribute);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
}).observe(document, {
|
|
62
|
-
childList: true,
|
|
63
|
-
subtree: true
|
|
64
|
-
}); // update a form control element’s css-blank attribute
|
|
65
|
-
|
|
66
|
-
function configureCssBlankAttribute() {
|
|
67
|
-
if (this.value || this.nodeName === 'SELECT' && this.options[this.selectedIndex].value) {
|
|
68
|
-
if (attr) {
|
|
69
|
-
this.removeAttribute(attr);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (className) {
|
|
73
|
-
this.classList.remove(className);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
this.removeAttribute('blank');
|
|
77
|
-
} else {
|
|
78
|
-
if (attr) {
|
|
79
|
-
this.setAttribute('blank', attr);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (className) {
|
|
83
|
-
this.classList.add(className);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
} // observe changes to the "value" property on an HTML Element
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
function observeValueOfHTMLElement(HTMLElement) {
|
|
90
|
-
var descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'value');
|
|
91
|
-
var nativeSet = descriptor.set;
|
|
92
|
-
|
|
93
|
-
descriptor.set = function set(value) {
|
|
94
|
-
// eslint-disable-line no-unused-vars
|
|
95
|
-
nativeSet.apply(this, arguments);
|
|
96
|
-
configureCssBlankAttribute.apply(this);
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
Object.defineProperty(HTMLElement.prototype, 'value', descriptor);
|
|
100
|
-
} // observe changes to the "selected" property on an HTML Element
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
function observeSelectedOfHTMLElement(HTMLElement) {
|
|
104
|
-
var descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'selected');
|
|
105
|
-
var nativeSet = descriptor.set;
|
|
106
|
-
|
|
107
|
-
descriptor.set = function set(value) {
|
|
108
|
-
// eslint-disable-line no-unused-vars
|
|
109
|
-
nativeSet.apply(this, arguments);
|
|
110
|
-
var event = document.createEvent('Event');
|
|
111
|
-
event.initEvent('change', true, true);
|
|
112
|
-
this.dispatchEvent(event);
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
Object.defineProperty(HTMLElement.prototype, 'selected', descriptor);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export { cssBlankPseudo as default };
|
|
1
|
+
var e=[" ",">","~",":","+","@","#","(",")"];function t(e){return"INPUT"===e.nodeName||"SELECT"===e.nodeName||"TEXTAREA"===e.nodeName}function n(e){var t;return"function"==typeof Event?t=new Event(e,{bubbles:!0}):(t=document.createEvent("Event")).initEvent(e,!0,!1),t}function r(e,t){var n=Object.getOwnPropertyDescriptor(e.prototype,"value"),r=n.set;n.set=function(){r.apply(this,arguments),t({target:this})},Object.defineProperty(e.prototype,"value",n)}function o(o){var c={force:!1,replaceWith:"[blank]"};if(void 0!==o&&"force"in o&&(c.force=o.force),void 0!==o&&"replaceWith"in o&&(c.replaceWith=o.replaceWith),!function(t){for(var n=!0,r=0,o=e.length;r<o&&n;r++)t.indexOf(e[r])>-1&&(n=!1);return n}(c.replaceWith))throw new Error(c.replaceWith+" is not a valid replacement since it can't be applied to single elements.");try{if(document.querySelector(":blank"),!c.force)return}catch(e){}var i,a,d,l,u,s,p,f=("."===(i=c.replaceWith)[0]?(a=i.slice(1),d=function(e){return e.classList.remove(a)},l=function(e){return e.classList.add(a)}):(a=i.slice(1,-1),d=function(e){return e.removeAttribute(a,"")},l=function(e){return e.setAttribute(a,"")}),function(e){var n=e.target;t(n)&&(("SELECT"===n.nodeName?n.options[n.selectedIndex].value:n.value)?d(n):l(n))}),v=function(){document.body&&(document.body.addEventListener("change",f),document.body.addEventListener("input",f))},m=function(){Array.prototype.forEach.call(document.querySelectorAll("input, select, textarea"),(function(e){f({target:e})}))};if(document.body?v():window.addEventListener("load",v),-1===document.documentElement.className.indexOf("js-blank-pseudo")&&(document.documentElement.className+=" js-blank-pseudo"),r(self.HTMLInputElement,f),r(self.HTMLSelectElement,f),r(self.HTMLTextAreaElement,f),u=self.HTMLOptionElement,s=Object.getOwnPropertyDescriptor(u.prototype,"selected"),p=s.set,s.set=function(e){p.apply(this,arguments);var t=n("change");this.parentElement.dispatchEvent(t)},Object.defineProperty(u.prototype,"selected",s),m(),void 0!==self.MutationObserver)new MutationObserver((function(e){e.forEach((function(e){Array.prototype.forEach.call(e.addedNodes||[],(function(e){1===e.nodeType&&t(e)&&f({target:e})}))}))})).observe(document,{childList:!0,subtree:!0});else{var E=function(){return m()};window.addEventListener("load",E),window.addEventListener("DOMContentLoaded",E)}}export{o as default};
|
|
120
2
|
//# sourceMappingURL=browser.mjs.map
|
package/dist/browser.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.mjs","sources":["../src/browser.js"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"browser.mjs","sources":["../src/is-valid-replacement.mjs","../src/browser.js"],"sourcesContent":["const INVALID_SELECTOR_CHAR = [\n\t' ', // Can't use child selector\n\t'>', // Can't use direct child selector\n\t'~', // Can't use sibling selector\n\t':', // Can't use pseudo selector\n\t'+', // Can't use adjacent selector\n\t'@', // Can't use at\n\t'#', // Can't use id selector\n\t'(', // Can't use parenthesis\n\t')', // Can't use parenthesis\n];\n\nexport default function isValidReplacement(selector) {\n\tlet isValid = true;\n\n\t// Purposely archaic so it's interoperable in old browsers\n\tfor (let i = 0, length = INVALID_SELECTOR_CHAR.length; i < length && isValid; i++) {\n\t\tif (selector.indexOf(INVALID_SELECTOR_CHAR[i]) > -1) {\n\t\t\tisValid = false;\n\t\t}\n\t}\n\n\treturn isValid;\n}\n","/* global document,window,self,MutationObserver */\nimport isValidReplacement from './is-valid-replacement.mjs';\n\nconst CSS_CLASS_LOADED = 'js-blank-pseudo';\n\n// form control elements selector\nfunction isFormControlElement(element) {\n\tif (element.nodeName === 'INPUT' || element.nodeName === 'SELECT' || element.nodeName === 'TEXTAREA') {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction createNewEvent(eventName) {\n\tlet event;\n\n\tif (typeof(Event) === 'function') {\n\t\tevent = new Event(eventName, { bubbles: true });\n\t} else {\n\t\tevent = document.createEvent('Event');\n\t\tevent.initEvent(eventName, true, false);\n\t}\n\n\treturn event;\n}\n\nfunction generateHandler(replaceWith) {\n\tlet selector;\n\tlet remove;\n\tlet add;\n\n\tif (replaceWith[0] === '.') {\n\t\tselector = replaceWith.slice(1);\n\t\tremove = (el) => el.classList.remove(selector);\n\t\tadd = (el) => el.classList.add(selector);\n\t} else {\n\t\t// A bit naive\n\t\tselector = replaceWith.slice(1, -1);\n\t\tremove = (el) => el.removeAttribute(selector, '');\n\t\tadd = (el) => el.setAttribute(selector, '');\n\t}\n\n\treturn function handleInputOrChangeEvent(event) {\n\t\tconst element = event.target;\n\t\tif (!isFormControlElement(element)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isSelect = element.nodeName === 'SELECT';\n\t\tconst hasValue = isSelect\n\t\t\t? !!element.options[element.selectedIndex].value\n\t\t\t: !!element.value;\n\n\t\tif (hasValue) {\n\t\t\tremove(element);\n\t\t} else {\n\t\t\tadd(element);\n\t\t}\n\t};\n}\n\n// observe changes to the \"selected\" property on an HTML Element\nfunction observeSelectedOfHTMLElement(HTMLElement) {\n\tconst descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'selected');\n\tconst nativeSet = descriptor.set;\n\n\tdescriptor.set = function set(value) { // eslint-disable-line no-unused-vars\n\t\tnativeSet.apply(this, arguments);\n\n\t\tconst event = createNewEvent('change');\n\t\tthis.parentElement.dispatchEvent(event);\n\t};\n\n\tObject.defineProperty(HTMLElement.prototype, 'selected', descriptor);\n}\n\n// observe changes to the \"value\" property on an HTML Element\nfunction observeValueOfHTMLElement(HTMLElement, handler) {\n\tconst descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'value');\n\tconst nativeSet = descriptor.set;\n\n\tdescriptor.set = function set() {\n\t\tnativeSet.apply(this, arguments);\n\t\thandler({ target: this });\n\t};\n\n\tObject.defineProperty(HTMLElement.prototype, 'value', descriptor);\n}\n\nexport default function cssBlankPseudoInit(opts) {\n\t// configuration\n\tconst options = {\n\t\tforce: false,\n\t\treplaceWith: '[blank]',\n\t};\n\n\tif (typeof opts !== 'undefined' && 'force' in opts) {\n\t\toptions.force = opts.force;\n\t}\n\n\tif (typeof opts !== 'undefined' && 'replaceWith' in opts) {\n\t\toptions.replaceWith = opts.replaceWith;\n\t}\n\n\tif (!isValidReplacement(options.replaceWith)) {\n\t\tthrow new Error(`${options.replaceWith} is not a valid replacement since it can't be applied to single elements.`);\n\t}\n\n\ttry {\n\t\tdocument.querySelector(':blank');\n\n\t\tif (!options.force) {\n\t\t\treturn;\n\t\t}\n\t} catch (ignoredError) { /* do nothing and continue */ }\n\n\tconst handler = generateHandler(options.replaceWith);\n\tconst bindEvents = () => {\n\t\tif (document.body) {\n\t\t\tdocument.body.addEventListener('change', handler);\n\t\t\tdocument.body.addEventListener('input', handler);\n\t\t}\n\t};\n\tconst updateAllCandidates = () => {\n\t\tArray.prototype.forEach.call(\n\t\t\tdocument.querySelectorAll('input, select, textarea'),\n\t\t\tnode => {\n\t\t\t\thandler({ target: node });\n\t\t\t},\n\t\t);\n\t};\n\n\tif (document.body) {\n\t\tbindEvents();\n\t} else {\n\t\twindow.addEventListener('load', bindEvents);\n\t}\n\n\tif (document.documentElement.className.indexOf(CSS_CLASS_LOADED) === -1) {\n\t\tdocument.documentElement.className += ` ${CSS_CLASS_LOADED}`;\n\t}\n\n\tobserveValueOfHTMLElement(self.HTMLInputElement, handler);\n\tobserveValueOfHTMLElement(self.HTMLSelectElement, handler);\n\tobserveValueOfHTMLElement(self.HTMLTextAreaElement, handler);\n\tobserveSelectedOfHTMLElement(self.HTMLOptionElement, handler);\n\n\t// conditionally update all form control elements\n\tupdateAllCandidates();\n\n\tif (typeof self.MutationObserver !== 'undefined') {\n\t\t// conditionally observe added or unobserve removed form control elements\n\t\tnew MutationObserver(mutationsList => {\n\t\t\tmutationsList.forEach(mutation => {\n\t\t\t\tArray.prototype.forEach.call(\n\t\t\t\t\tmutation.addedNodes || [],\n\t\t\t\t\tnode => {\n\t\t\t\t\t\tif (node.nodeType === 1 && isFormControlElement(node)) {\n\t\t\t\t\t\t\thandler({ target: node });\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t}).observe(document, { childList: true, subtree: true });\n\t} else {\n\t\tconst handleOnLoad = () => updateAllCandidates();\n\n\t\twindow.addEventListener('load', handleOnLoad);\n\t\twindow.addEventListener('DOMContentLoaded', handleOnLoad);\n\t}\n}\n"],"names":["INVALID_SELECTOR_CHAR","isFormControlElement","element","nodeName","createNewEvent","eventName","event","Event","bubbles","document","createEvent","initEvent","observeValueOfHTMLElement","HTMLElement","handler","descriptor","Object","getOwnPropertyDescriptor","prototype","nativeSet","set","apply","this","arguments","target","defineProperty","cssBlankPseudoInit","opts","options","force","replaceWith","selector","isValid","i","length","indexOf","isValidReplacement","Error","querySelector","ignoredError","remove","add","slice","el","classList","removeAttribute","setAttribute","selectedIndex","value","bindEvents","body","addEventListener","updateAllCandidates","Array","forEach","call","querySelectorAll","node","window","documentElement","className","self","HTMLInputElement","HTMLSelectElement","HTMLTextAreaElement","HTMLOptionElement","parentElement","dispatchEvent","MutationObserver","mutationsList","mutation","addedNodes","nodeType","observe","childList","subtree","handleOnLoad"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var
|
|
1
|
+
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=e(require("postcss-selector-parser"));const l=[" ",">","~",":","+","@","#","(",")"];const n=e=>{const n=Object.assign({preserve:!0,replaceWith:"[blank]",disablePolyfillReadyClass:!1},e),t=s.default().astSync(n.replaceWith);return function(e){let s=!0;for(let n=0,t=l.length;n<t&&s;n++)e.indexOf(l[n])>-1&&(s=!1);return s}(n.replaceWith)?{postcssPlugin:"css-blank-pseudo",Rule(e,{result:l}){if(!e.selector.toLowerCase().includes(":blank"))return;const o=e.selectors.flatMap((o=>{if(!o.toLowerCase().includes(":blank"))return[o];let a;try{a=s.default().astSync(o)}catch(s){return e.warn(l,`Failed to parse selector : ${o}`),o}if(void 0===a)return[o];let r=!1;if(a.walkPseudos((e=>{":blank"===e.value.toLowerCase()&&(e.nodes&&e.nodes.length||(r=!0,e.replaceWith(t.clone({}))))})),!r)return[o];const d=a.clone();if(!n.disablePolyfillReadyClass){var u,c,i,p,f;if(null!=(u=a.nodes)&&null!=(c=u[0])&&null!=(i=c.nodes)&&i.length)for(let e=0;e<a.nodes[0].nodes.length;e++){const l=a.nodes[0].nodes[e];if("combinator"===l.type||s.default.isPseudoElement(l)){a.nodes[0].insertBefore(l,s.default.className({value:"js-blank-pseudo"}));break}if(e===a.nodes[0].nodes.length-1){a.nodes[0].append(s.default.className({value:"js-blank-pseudo"}));break}}null!=(p=a.nodes)&&null!=(f=p[0])&&f.nodes&&(d.nodes[0].prepend(s.default.combinator({value:" "})),d.nodes[0].prepend(s.default.className({value:"js-blank-pseudo"})))}return[a.toString(),d.toString()]}));o.join(",")!==e.selectors.join(",")&&(e.cloneBefore({selectors:o}),n.preserve||e.remove())}}:{postcssPlugin:"css-blank-pseudo",Once:(e,{result:s})=>{e.warn(s,`${n.replaceWith} is not a valid replacement since it can't be applied to single elements.`)}}};n.postcss=!0,module.exports=n;
|
package/dist/index.d.ts
ADDED
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"postcss-selector-parser";const
|
|
1
|
+
import e from"postcss-selector-parser";const s=[" ",">","~",":","+","@","#","(",")"];const n=n=>{const l=Object.assign({preserve:!0,replaceWith:"[blank]",disablePolyfillReadyClass:!1},n),o=e().astSync(l.replaceWith);return function(e){let n=!0;for(let l=0,o=s.length;l<o&&n;l++)e.indexOf(s[l])>-1&&(n=!1);return n}(l.replaceWith)?{postcssPlugin:"css-blank-pseudo",Rule(s,{result:n}){if(!s.selector.toLowerCase().includes(":blank"))return;const t=s.selectors.flatMap((t=>{if(!t.toLowerCase().includes(":blank"))return[t];let r;try{r=e().astSync(t)}catch(e){return s.warn(n,`Failed to parse selector : ${t}`),t}if(void 0===r)return[t];let a=!1;if(r.walkPseudos((e=>{":blank"===e.value.toLowerCase()&&(e.nodes&&e.nodes.length||(a=!0,e.replaceWith(o.clone({}))))})),!a)return[t];const c=r.clone();if(!l.disablePolyfillReadyClass){var i,d,u,p,f;if(null!=(i=r.nodes)&&null!=(d=i[0])&&null!=(u=d.nodes)&&u.length)for(let s=0;s<r.nodes[0].nodes.length;s++){const n=r.nodes[0].nodes[s];if("combinator"===n.type||e.isPseudoElement(n)){r.nodes[0].insertBefore(n,e.className({value:"js-blank-pseudo"}));break}if(s===r.nodes[0].nodes.length-1){r.nodes[0].append(e.className({value:"js-blank-pseudo"}));break}}null!=(p=r.nodes)&&null!=(f=p[0])&&f.nodes&&(c.nodes[0].prepend(e.combinator({value:" "})),c.nodes[0].prepend(e.className({value:"js-blank-pseudo"})))}return[r.toString(),c.toString()]}));t.join(",")!==s.selectors.join(",")&&(s.cloneBefore({selectors:t}),l.preserve||s.remove())}}:{postcssPlugin:"css-blank-pseudo",Once:(e,{result:s})=>{e.warn(s,`${l.replaceWith} is not a valid replacement since it can't be applied to single elements.`)}}};n.postcss=!0;export{n as default};
|
package/package.json
CHANGED
|
@@ -1,85 +1,108 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
2
|
+
"name": "css-blank-pseudo",
|
|
3
|
+
"description": "Style form elements when they are empty",
|
|
4
|
+
"version": "4.1.0",
|
|
5
|
+
"contributors": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Antonio Laguna",
|
|
8
|
+
"email": "antonio@laguna.es",
|
|
9
|
+
"url": "https://antonio.laguna.es"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "Romain Menke",
|
|
13
|
+
"email": "romainmenke@gmail.com"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "Jonathan Neal",
|
|
17
|
+
"email": "jonathantneal@hotmail.com"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"license": "CC0-1.0",
|
|
21
|
+
"funding": {
|
|
22
|
+
"type": "opencollective",
|
|
23
|
+
"url": "https://opencollective.com/csstools"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": "^12 || ^14 || >=16"
|
|
27
|
+
},
|
|
28
|
+
"main": "dist/index.cjs",
|
|
29
|
+
"module": "dist/index.mjs",
|
|
30
|
+
"types": "dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"import": "./dist/index.mjs",
|
|
34
|
+
"require": "./dist/index.cjs",
|
|
35
|
+
"default": "./dist/index.mjs"
|
|
36
|
+
},
|
|
37
|
+
"./browser": {
|
|
38
|
+
"import": "./dist/browser.mjs",
|
|
39
|
+
"require": "./dist/browser.cjs",
|
|
40
|
+
"default": "./dist/browser.mjs"
|
|
41
|
+
},
|
|
42
|
+
"./browser-global": {
|
|
43
|
+
"default": "./dist/browser-global.js"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"LICENSE.md",
|
|
49
|
+
"README.md",
|
|
50
|
+
"dist"
|
|
51
|
+
],
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"postcss-selector-parser": "^6.0.10"
|
|
54
|
+
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"postcss": "^8.2"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"puppeteer": "^15.5.0"
|
|
60
|
+
},
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "rollup -c ../../rollup/default.js",
|
|
63
|
+
"clean": "node -e \"fs.rmSync('./dist', { recursive: true, force: true });\"",
|
|
64
|
+
"docs": "node ../../.github/bin/generate-docs/install.mjs && node ../../.github/bin/generate-docs/readme.mjs",
|
|
65
|
+
"lint": "npm run lint:eslint && npm run lint:package-json",
|
|
66
|
+
"lint:eslint": "eslint ./src --ext .js --ext .ts --ext .mjs --no-error-on-unmatched-pattern",
|
|
67
|
+
"lint:package-json": "node ../../.github/bin/format-package-json.mjs",
|
|
68
|
+
"prepublishOnly": "npm run clean && npm run build && npm run test",
|
|
69
|
+
"test": "node .tape.mjs && npm run test:exports && npm run test:invalid-replacement",
|
|
70
|
+
"test:browser": "node ./test/_browser.mjs",
|
|
71
|
+
"test:exports": "node ./test/_import.mjs && node ./test/_require.cjs",
|
|
72
|
+
"test:invalid-replacement": "node ./test/_valid-replacements.mjs",
|
|
73
|
+
"test:rewrite-expects": "REWRITE_EXPECTS=true node .tape.mjs"
|
|
74
|
+
},
|
|
75
|
+
"homepage": "https://github.com/csstools/postcss-plugins/tree/main/plugins/css-blank-pseudo#readme",
|
|
76
|
+
"repository": {
|
|
77
|
+
"type": "git",
|
|
78
|
+
"url": "https://github.com/csstools/postcss-plugins.git",
|
|
79
|
+
"directory": "plugins/css-blank-pseudo"
|
|
80
|
+
},
|
|
81
|
+
"bugs": "https://github.com/csstools/postcss-plugins/issues",
|
|
82
|
+
"keywords": [
|
|
83
|
+
"a11y",
|
|
84
|
+
"accessibility",
|
|
85
|
+
"blank",
|
|
86
|
+
"css",
|
|
87
|
+
"empty",
|
|
88
|
+
"input",
|
|
89
|
+
"javascript",
|
|
90
|
+
"js",
|
|
91
|
+
"polyfill",
|
|
92
|
+
"postcss",
|
|
93
|
+
"postcss-plugin",
|
|
94
|
+
"pseudo",
|
|
95
|
+
"select",
|
|
96
|
+
"selectors",
|
|
97
|
+
"textarea"
|
|
98
|
+
],
|
|
99
|
+
"csstools": {
|
|
100
|
+
"cssdbId": "blank-pseudo-class",
|
|
101
|
+
"exportName": "postcssBlankPseudo",
|
|
102
|
+
"humanReadableName": "PostCSS Blank Pseudo",
|
|
103
|
+
"specUrl": "https://www.w3.org/TR/selectors-4/#blank"
|
|
104
|
+
},
|
|
105
|
+
"volta": {
|
|
106
|
+
"extends": "../../package.json"
|
|
107
|
+
}
|
|
85
108
|
}
|