@asamuzakjp/dom-selector 4.2.2 → 4.4.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.
@@ -1,3 +1,3 @@
1
- var g=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var A=(s,t)=>{for(var r in t)g(s,r,{get:t[r],enumerable:!0})},O=(s,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of x(t))!y.call(s,n)&&n!==r&&g(s,n,{get:()=>t[n],enumerable:!(i=S(t,n))||i.enumerable});return s};var T=s=>O(g({},"__esModule",{value:!0}),s);var L={};A(L,{filterSelector:()=>D,generateCSS:()=>u.generate,parseAstName:()=>I,parseSelector:()=>h,preprocess:()=>E,sortAST:()=>_,unescapeSelector:()=>$,walkAST:()=>m});module.exports=T(L);var d=require("css-tree"),e=require("./constant.js"),u=require("css-tree");const $=(s="")=>{if(typeof s=="string"&&s.indexOf("\\",0)>=0){const t=s.split("\\"),r=t.length;for(let i=1;i<r;i++){let n=t[i];if(n===""&&i===r-1)n=e.U_FFFD;else{const f=/^([\da-f]{1,6}\s?)/i.exec(n);if(f){const[,a]=f;let c;try{const o=parseInt("D800",e.HEX),p=parseInt("DFFF",e.HEX),w=parseInt(a,e.HEX);w===0||w>=o&&w<=p?c=e.U_FFFD:c=String.fromCodePoint(w)}catch{c=e.U_FFFD}let l="";n.length>a.length&&(l=n.substring(a.length)),n=`${c}${l}`}else/^[\n\r\f]/.test(n)&&(n="\\"+n)}t[i]=n}s=t.join("")}return s},E=(...s)=>{if(!s.length)throw new TypeError("1 argument required, but only 0 present.");let[t]=s;if(typeof t=="string"){let r=0;for(;r>=0&&(r=t.indexOf("#",r),!(r<0));){const i=t.substring(0,r+1);let n=t.substring(r+1);if(/^\d$/.test(n.substring(0,1)))throw new DOMException(`Invalid selector ${t}`,e.SYNTAX_ERR);const f=n.codePointAt(0);if(f===e.BIT_HYPHEN){if(/^\d$/.test(n.substring(1,2)))throw new DOMException(`Invalid selector ${t}`,e.SYNTAX_ERR)}else if(f>e.BIT_FFFF){const a=`\\${f.toString(e.HEX)} `;n.length===e.DUO?n=a:n=`${a}${n.substring(e.DUO)}`}t=`${i}${n}`,r++}t=t.replace(/\f|\r\n?/g,`
2
- `).replace(/[\0\uD800-\uDFFF]|\\$/g,e.U_FFFD)}else if(t==null)t=Object.prototype.toString.call(t).slice(e.TYPE_FROM,e.TYPE_TO).toLowerCase();else if(Array.isArray(t))t=t.join(",");else if(Object.prototype.hasOwnProperty.call(t,"toString"))t=t.toString();else throw new DOMException(`Invalid selector ${t}`,e.SYNTAX_ERR);return t},h=s=>{if(s=E(s),/^$|^\s*>|,\s*$/.test(s))throw new DOMException(`Invalid selector ${s}`,e.SYNTAX_ERR);let t;try{const r=(0,d.parse)(s,{context:"selectorList",parseCustomProperty:!0});t=(0,d.toPlainObject)(r)}catch(r){const{message:i}=r,n=/(:(is|where)\(\s*\))/,f=/(:lang\(\s*("[A-Za-z\d\-*]*")\s*\))/;if(i==="Identifier is expected"&&f.test(s)){const[,a,c]=f.exec(s),l=c.replaceAll("*","\\*").replace(/^"/,"").replace(/"$/,"");let o=a.replace(c,l);o===":lang()"&&(o=`:lang(${e.EMPTY})`),t=h(s.replace(a,o))}else if((i==="Identifier is expected"||i==="Selector is expected")&&n.test(s)){const[,a,c]=n.exec(s),l=`:${c}(${e.EMPTY})`;t=h(s.replace(a,l))}else if(i==='"]" is expected'&&!s.endsWith("]"))t=h(`${s}]`);else if(i==='")" is expected'&&!s.endsWith(")"))t=h(`${s})`);else throw new DOMException(i,e.SYNTAX_ERR)}return t},m=(s={})=>{const t=new Set;let r;return(0,d.walk)(s,{enter:n=>{n.type===e.SELECTOR?t.add(n.children):(n.type===e.SELECTOR_PSEUDO_CLASS&&e.REG_LOGICAL_PSEUDO.test(n.name)||n.type===e.SELECTOR_PSEUDO_ELEMENT&&e.REG_SHADOW_PSEUDO.test(n.name))&&(r=!0)}}),r&&(0,d.findAll)(s,(n,f,a)=>{if(a){if(n.type===e.SELECTOR_PSEUDO_CLASS&&e.REG_LOGICAL_PSEUDO.test(n.name)){const c=a.filter(l=>{const{name:o,type:p}=l;return p===e.SELECTOR_PSEUDO_CLASS&&e.REG_LOGICAL_PSEUDO.test(o)});for(const{children:l}of c)for(const{children:o}of l)for(const{children:p}of o)t.has(p)&&t.delete(p)}else if(n.type===e.SELECTOR_PSEUDO_ELEMENT&&e.REG_SHADOW_PSEUDO.test(n.name)){const c=a.filter(l=>{const{name:o,type:p}=l;return p===e.SELECTOR_PSEUDO_ELEMENT&&e.REG_SHADOW_PSEUDO.test(o)});for(const{children:l}of c)for(const{children:o}of l)t.has(o)&&t.delete(o)}}}),[...t]},_=s=>{const t=[...s];if(t.length>1){const r=new Map([[e.SELECTOR_PSEUDO_ELEMENT,e.BIT_01],[e.SELECTOR_ID,e.BIT_02],[e.SELECTOR_CLASS,e.BIT_04],[e.SELECTOR_TYPE,e.BIT_08],[e.SELECTOR_ATTR,e.BIT_16],[e.SELECTOR_PSEUDO_CLASS,e.BIT_32]]);t.sort((i,n)=>{const{type:f}=i,{type:a}=n,c=r.get(f),l=r.get(a);let o;return c===l?o=0:c>l?o=1:o=-1,o})}return t},I=s=>{let t,r;if(s&&typeof s=="string")s.indexOf("|")>-1?[t,r]=s.split("|"):(t="*",r=s);else throw new DOMException(`Invalid selector ${s}`,e.SYNTAX_ERR);return{prefix:t,localName:r}},D=s=>!(!s||typeof s!="string"||/\||::|\[\s*[\w$*=^|~-]+(?:(?:"[\w$*=^|~\s'-]+"|'[\w$*=^|~\s"-]+')?(?:\s+[\w$*=^|~-]+)+|"[^"\]]{1,255}|'[^'\]]{1,255})\s*\]/.test(s)||s.includes(":")&&/:(?!(?:first|last|only)-(?:child|of-type)|nth-(?:last-)?(?:child|of-type)\(\s*(?:even|odd|[+-]?(?:(?:0|[1-9]\d*)n?|n)|(?:[+-]?(?:0|[1-9]\d*))?n\s*[+-]\s*(?:0|[1-9]\d*))\s*\)|(?:is|not|where)\(\s*(?:\*|[A-Za-z][\w-]*|(?:\*|[A-Za-z][\w-]*)?(?:\[[^\]]+\]|[#.:][\w-]+|:(?:is|not|where)\(\s*(?:\*|[A-Za-z][\w-]*|(?:\*|[A-Za-z][\w-]*)?(?:\[[^\]]+\]|[#.:][\w-]+)+)(?:\s*,\s*(?:\*|[A-Za-z][\w-]*|(?:\*|[A-Za-z][\w-]*)?(?:\[[^\]]+\]|[#.:][\w-]+)+))*\s*\))+)(?:\s*,\s*(?:\*|[A-Za-z][\w-]*|(?:\*|[A-Za-z][\w-]*)?(?:\[[^\]]+\]|[#.:][\w-]+|:(?:is|not|where)\(\s*(?:\*|[A-Za-z][\w-]*|(?:\*|[A-Za-z][\w-]*)?(?:\[[^\]]+\]|[#.:][\w-]+)+)(?:\s*,\s*(?:\*|[A-Za-z][\w-]*|(?:\*|[A-Za-z][\w-]*)?(?:\[[^\]]+\]|[#.:][\w-]+)+))*\s*\))+))*\s*\))/.test(s));0&&(module.exports={filterSelector,generateCSS,parseAstName,parseSelector,preprocess,sortAST,unescapeSelector,walkAST});
1
+ var x=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var U=(s,t)=>{for(var n in t)x(s,n,{get:t[n],enumerable:!0})},X=(s,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of b(t))!F.call(s,r)&&r!==n&&x(s,r,{get:()=>t[r],enumerable:!(o=N(t,r))||o.enumerable});return s};var Y=s=>X(x({},"__esModule",{value:!0}),s);var oe={};U(oe,{filterSelector:()=>re,generateCSS:()=>B.generate,parseAstName:()=>k,parseSelector:()=>g,preprocess:()=>R,sortAST:()=>j,unescapeSelector:()=>H,walkAST:()=>v});module.exports=Y(oe);var O=require("css-tree"),e=require("./constant.js"),B=require("css-tree");const H=(s="")=>{if(typeof s=="string"&&s.indexOf("\\",0)>=0){const t=s.split("\\"),n=t.length;for(let o=1;o<n;o++){let r=t[o];if(r===""&&o===n-1)r=e.U_FFFD;else{const i=/^([\da-f]{1,6}\s?)/i.exec(r);if(i){const[,$]=i;let l;try{const c=parseInt("D800",e.HEX),f=parseInt("DFFF",e.HEX),p=parseInt($,e.HEX);p===0||p>=c&&p<=f?l=e.U_FFFD:l=String.fromCodePoint(p)}catch{l=e.U_FFFD}let a="";r.length>$.length&&(a=r.substring($.length)),r=`${l}${a}`}else/^[\n\r\f]/.test(r)&&(r="\\"+r)}t[o]=r}s=t.join("")}return s},R=(...s)=>{if(!s.length)throw new TypeError("1 argument required, but only 0 present.");let[t]=s;if(typeof t=="string"){let n=0;for(;n>=0&&(n=t.indexOf("#",n),!(n<0));){const o=t.substring(0,n+1);let r=t.substring(n+1);if(/^\d$/.test(r.substring(0,1)))throw new DOMException(`Invalid selector ${t}`,e.SYNTAX_ERR);const i=r.codePointAt(0);if(i===e.BIT_HYPHEN){if(/^\d$/.test(r.substring(1,2)))throw new DOMException(`Invalid selector ${t}`,e.SYNTAX_ERR)}else if(i>e.BIT_FFFF){const $=`\\${i.toString(e.HEX)} `;r.length===e.DUO?r=$:r=`${$}${r.substring(e.DUO)}`}t=`${o}${r}`,n++}t=t.replace(/\f|\r\n?/g,`
2
+ `).replace(/[\0\uD800-\uDFFF]|\\$/g,e.U_FFFD)}else if(t==null)t=Object.prototype.toString.call(t).slice(e.TYPE_FROM,e.TYPE_TO).toLowerCase();else if(Array.isArray(t))t=t.join(",");else if(Object.prototype.hasOwnProperty.call(t,"toString"))t=t.toString();else throw new DOMException(`Invalid selector ${t}`,e.SYNTAX_ERR);return t},g=s=>{if(s=R(s),/^$|^\s*>|,\s*$/.test(s))throw new DOMException(`Invalid selector ${s}`,e.SYNTAX_ERR);let t;try{const n=(0,O.parse)(s,{context:"selectorList",parseCustomProperty:!0});t=(0,O.toPlainObject)(n)}catch(n){const{message:o}=n,r=/(:(is|where)\(\s*\))/,i=/(:lang\(\s*("[A-Za-z\d\-*]*")\s*\))/;if(o==="Identifier is expected"&&i.test(s)){const[,$,l]=i.exec(s),a=l.replaceAll("*","\\*").replace(/^"/,"").replace(/"$/,"");let c=$.replace(l,a);c===":lang()"&&(c=`:lang(${e.EMPTY})`),t=g(s.replace($,c))}else if((o==="Identifier is expected"||o==="Selector is expected")&&r.test(s)){const[,$,l]=r.exec(s),a=`:${l}(${e.EMPTY})`;t=g(s.replace($,a))}else if(o==='"]" is expected'&&!s.endsWith("]"))t=g(`${s}]`);else if(o==='")" is expected'&&!s.endsWith(")"))t=g(`${s})`);else throw new DOMException(o,e.SYNTAX_ERR)}return t},v=(s={})=>{const t=new Set;let n,o;return(0,O.walk)(s,{enter:i=>{i.type===e.SELECTOR?t.add(i.children):(i.type===e.SELECTOR_PSEUDO_CLASS&&e.REG_LOGICAL_PSEUDO.test(i.name)||i.type===e.SELECTOR_PSEUDO_ELEMENT&&e.REG_SHADOW_PSEUDO.test(i.name))&&(n=!0)}}),n&&(0,O.findAll)(s,(i,$,l)=>{if(l){if(i.type===e.SELECTOR_PSEUDO_CLASS&&e.REG_LOGICAL_PSEUDO.test(i.name)){const a=l.filter(c=>{const{name:f,type:p}=c;return p===e.SELECTOR_PSEUDO_CLASS&&e.REG_LOGICAL_PSEUDO.test(f)});for(const{children:c}of a)for(const{children:f}of c)for(const{children:p}of f)if(t.has(p)){for(const S of p){const{type:G}=S;if(G===e.COMBINATOR){o=!0;break}}t.delete(p)}}else if(i.type===e.SELECTOR_PSEUDO_ELEMENT&&e.REG_SHADOW_PSEUDO.test(i.name)){const a=l.filter(c=>{const{name:f,type:p}=c;return p===e.SELECTOR_PSEUDO_ELEMENT&&e.REG_SHADOW_PSEUDO.test(f)});for(const{children:c}of a)for(const{children:f}of c)t.has(f)&&t.delete(f)}}}),{branches:[...t],complex:!!o}},j=s=>{const t=[...s];if(t.length>1){const n=new Map([[e.SELECTOR_PSEUDO_ELEMENT,e.BIT_01],[e.SELECTOR_ID,e.BIT_02],[e.SELECTOR_CLASS,e.BIT_04],[e.SELECTOR_TYPE,e.BIT_08],[e.SELECTOR_ATTR,e.BIT_16],[e.SELECTOR_PSEUDO_CLASS,e.BIT_32]]);t.sort((o,r)=>{const{type:i}=o,{type:$}=r,l=n.get(i),a=n.get($);let c;return l===a?c=0:l>a?c=1:c=-1,c})}return t},k=s=>{let t,n;if(s&&typeof s=="string")s.indexOf("|")>-1?[t,n]=s.split("|"):(t="*",n=s);else throw new DOMException(`Invalid selector ${s}`,e.SYNTAX_ERR);return{prefix:t,localName:n}},C="(?:first|last|only)-(?:child|of-type)",T="(?:0|[1-9]\\d*)",W=`[+-]?(?:${T}n?|n)|(?:[+-]?${T})?n\\s*[+-]\\s*${T}`,h=`nth-(?:last-)?(?:child|of-type)\\(\\s*(?:even|odd|${W})\\s*\\)`,E="\\*|[A-Za-z][\\w-]*",L="\\[[^\\]]+\\]|[#.:][\\w-]+",_="(?:is|not|where)",A="\\s?[\\s>~+]\\s?",u="\\s?[~+]\\s?",d=`(?:${E}|(?:${E})?(?:${L})+)`,w=`${d}(?:${A}${d})*`,I=`${d}(?:${u}${d})*`,z=`:${_}\\(\\s*${d}(?:\\s*,\\s*${d})*\\s*\\)`,K=`:${_}\\(\\s*${w}(?:\\s*,\\s*${w})*\\s*\\)`,Z=`:${_}\\(\\s*${I}(?:\\s*,\\s*${I})*\\s*\\)`,D=`(?:${E}|(?:${E})?(?:${L}|${z})+)`,y=`(?:${E}|(?:${E})?(?:${L}|${K})+)`,P=`(?:${E}|(?:${E})?(?:${L}|${Z})+)`,m=`${y}(?:${A}${y})*`,M=`${P}(?:${u}${P})*`,q=`${_}\\(\\s*${D}(?:\\s*,\\s*${D})*\\s*\\)`,J=`${_}\\(\\s*${m}(?:\\s*,\\s*${m})*\\s*\\)`,Q=`${_}\\(\\s*${M}(?:\\s*,\\s*${M})*\\s*\\)`,V=new RegExp(`:${_}\\(`),ee=new RegExp(`:(?!${C}|${h}|${J})`),te=new RegExp(`:(?!${C}|${h}|${Q})`),se=new RegExp(`:(?!${C}|${h}|${q})`),ne=new RegExp(`:(?!${C}|${h})`),re=(s,t={})=>{if(!s||typeof s!="string"||/\||::|\[\s*[\w$*=^|~-]+(?:(?:"[\w$*=^|~\s'-]+"|'[\w$*=^|~\s"-]+')?(?:\s+[\w$*=^|~-]+)+|"[^"\]]{1,255}|'[^'\]]{1,255})\s*\]/.test(s))return!1;if(s.includes(":")){let n;if(V.test(s)){const{complex:o,descendant:r}=t;o&&r?n=ee:o?n=te:n=se}else n=ne;if(n.test(s))return!1}return!0};0&&(module.exports={filterSelector,generateCSS,parseAstName,parseSelector,preprocess,sortAST,unescapeSelector,walkAST});
3
3
  //# sourceMappingURL=parser.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/js/parser.js"],
4
- "sourcesContent": ["/**\n * parser.js\n */\n\n/* import */\nimport { findAll, parse, toPlainObject, walk } from 'css-tree';\n\n/* constants */\nimport {\n BIT_01, BIT_02, BIT_04, BIT_08, BIT_16, BIT_32, BIT_FFFF, BIT_HYPHEN,\n DUO, EMPTY, HEX, REG_LOGICAL_PSEUDO, REG_SHADOW_PSEUDO, SELECTOR,\n SELECTOR_ATTR, SELECTOR_CLASS, SELECTOR_ID, SELECTOR_PSEUDO_CLASS,\n SELECTOR_PSEUDO_ELEMENT, SELECTOR_TYPE, SYNTAX_ERR, TYPE_FROM, TYPE_TO, U_FFFD\n} from './constant.js';\n\n/**\n * unescape selector\n * @param {string} selector - CSS selector\n * @returns {?string} - unescaped selector\n */\nexport const unescapeSelector = (selector = '') => {\n if (typeof selector === 'string' && selector.indexOf('\\\\', 0) >= 0) {\n const arr = selector.split('\\\\');\n const l = arr.length;\n for (let i = 1; i < l; i++) {\n let item = arr[i];\n if (item === '' && i === l - 1) {\n item = U_FFFD;\n } else {\n const hexExists = /^([\\da-f]{1,6}\\s?)/i.exec(item);\n if (hexExists) {\n const [, hex] = hexExists;\n let str;\n try {\n const low = parseInt('D800', HEX);\n const high = parseInt('DFFF', HEX);\n const deci = parseInt(hex, HEX);\n if (deci === 0 || (deci >= low && deci <= high)) {\n str = U_FFFD;\n } else {\n str = String.fromCodePoint(deci);\n }\n } catch (e) {\n str = U_FFFD;\n }\n let postStr = '';\n if (item.length > hex.length) {\n postStr = item.substring(hex.length);\n }\n item = `${str}${postStr}`;\n // whitespace\n } else if (/^[\\n\\r\\f]/.test(item)) {\n item = '\\\\' + item;\n }\n }\n arr[i] = item;\n }\n selector = arr.join('');\n }\n return selector;\n};\n\n/**\n * preprocess\n * @see https://drafts.csswg.org/css-syntax-3/#input-preprocessing\n * @param {...*} args - arguments\n * @returns {string} - filtered selector string\n */\nexport const preprocess = (...args) => {\n if (!args.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n }\n let [selector] = args;\n if (typeof selector === 'string') {\n let index = 0;\n while (index >= 0) {\n index = selector.indexOf('#', index);\n if (index < 0) {\n break;\n }\n const preHash = selector.substring(0, index + 1);\n let postHash = selector.substring(index + 1);\n // @see https://drafts.csswg.org/selectors/#id-selectors\n // @see https://drafts.csswg.org/css-syntax-3/#ident-token-diagram\n if (/^\\d$/.test(postHash.substring(0, 1))) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n const codePoint = postHash.codePointAt(0);\n if (codePoint === BIT_HYPHEN) {\n if (/^\\d$/.test(postHash.substring(1, 2))) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n // escape char above 0xFFFF\n } else if (codePoint > BIT_FFFF) {\n const str = `\\\\${codePoint.toString(HEX)} `;\n if (postHash.length === DUO) {\n postHash = str;\n } else {\n postHash = `${str}${postHash.substring(DUO)}`;\n }\n }\n selector = `${preHash}${postHash}`;\n index++;\n }\n selector = selector.replace(/\\f|\\r\\n?/g, '\\n')\n .replace(/[\\0\\uD800-\\uDFFF]|\\\\$/g, U_FFFD);\n } else if (selector === undefined || selector === null) {\n selector = Object.prototype.toString.call(selector)\n .slice(TYPE_FROM, TYPE_TO).toLowerCase();\n } else if (Array.isArray(selector)) {\n selector = selector.join(',');\n } else if (Object.prototype.hasOwnProperty.call(selector, 'toString')) {\n selector = selector.toString();\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return selector;\n};\n\n/**\n * create AST from CSS selector\n * @param {string} selector - CSS selector\n * @returns {object} - AST\n */\nexport const parseSelector = selector => {\n selector = preprocess(selector);\n // invalid selectors\n if (/^$|^\\s*>|,\\s*$/.test(selector)) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n let res;\n try {\n const ast = parse(selector, {\n context: 'selectorList',\n parseCustomProperty: true\n });\n res = toPlainObject(ast);\n } catch (e) {\n const { message } = e;\n const regEmptyIs = /(:(is|where)\\(\\s*\\))/;\n // workaround for https://github.com/csstree/csstree/issues/265\n const regLang = /(:lang\\(\\s*(\"[A-Za-z\\d\\-*]*\")\\s*\\))/;\n if (message === 'Identifier is expected' && regLang.test(selector)) {\n const [, lang, range] = regLang.exec(selector);\n const escapedRange =\n range.replaceAll('*', '\\\\*').replace(/^\"/, '').replace(/\"$/, '');\n let escapedLang = lang.replace(range, escapedRange);\n if (escapedLang === ':lang()') {\n escapedLang = `:lang(${EMPTY})`;\n }\n res = parseSelector(selector.replace(lang, escapedLang));\n } else if ((message === 'Identifier is expected' ||\n message === 'Selector is expected') &&\n regEmptyIs.test(selector)) {\n const [, logic, name] = regEmptyIs.exec(selector);\n const emptyIs = `:${name}(${EMPTY})`;\n res = parseSelector(selector.replace(logic, emptyIs));\n } else if (message === '\"]\" is expected' && !selector.endsWith(']')) {\n res = parseSelector(`${selector}]`);\n } else if (message === '\")\" is expected' && !selector.endsWith(')')) {\n res = parseSelector(`${selector})`);\n } else {\n throw new DOMException(message, SYNTAX_ERR);\n }\n }\n return res;\n};\n\n/**\n * walk AST\n * @param {object} ast - AST\n * @returns {Array.<object|undefined>} - collection of AST branches\n */\nexport const walkAST = (ast = {}) => {\n const branches = new Set();\n let hasPseudoFunc;\n const opt = {\n enter: node => {\n if (node.type === SELECTOR) {\n branches.add(node.children);\n } else if ((node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) ||\n (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name))) {\n hasPseudoFunc = true;\n }\n }\n };\n walk(ast, opt);\n if (hasPseudoFunc) {\n findAll(ast, (node, item, list) => {\n if (list) {\n if (node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_CLASS && REG_LOGICAL_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // SelectorList\n for (const { children: grandChildren } of children) {\n // Selector\n for (const { children: greatGrandChildren } of grandChildren) {\n if (branches.has(greatGrandChildren)) {\n branches.delete(greatGrandChildren);\n }\n }\n }\n }\n } else if (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_ELEMENT && REG_SHADOW_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // Selector\n for (const { children: grandChildren } of children) {\n if (branches.has(grandChildren)) {\n branches.delete(grandChildren);\n }\n }\n }\n }\n }\n });\n }\n return [...branches];\n};\n\n/**\n * sort AST\n * @param {Array.<object>} asts - collection of AST\n * @returns {Array.<object>} - collection of sorted AST\n */\nexport const sortAST = asts => {\n const arr = [...asts];\n if (arr.length > 1) {\n const order = new Map([\n [SELECTOR_PSEUDO_ELEMENT, BIT_01],\n [SELECTOR_ID, BIT_02],\n [SELECTOR_CLASS, BIT_04],\n [SELECTOR_TYPE, BIT_08],\n [SELECTOR_ATTR, BIT_16],\n [SELECTOR_PSEUDO_CLASS, BIT_32]\n ]);\n arr.sort((a, b) => {\n const { type: typeA } = a;\n const { type: typeB } = b;\n const bitA = order.get(typeA);\n const bitB = order.get(typeB);\n let res;\n if (bitA === bitB) {\n res = 0;\n } else if (bitA > bitB) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\n};\n\n/**\n * parse AST name - e.g. ns|E -> { prefix: ns, localName: E }\n * @param {string} selector - type selector\n * @returns {object} - node properties\n */\nexport const parseAstName = selector => {\n let prefix;\n let localName;\n if (selector && typeof selector === 'string') {\n if (selector.indexOf('|') > -1) {\n [prefix, localName] = selector.split('|');\n } else {\n prefix = '*';\n localName = selector;\n }\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return {\n prefix,\n localName\n };\n};\n\n/**\n * filter selector (for nwsapi)\n * @param {string} selector - selector\n * @returns {boolean} - result\n */\nexport const filterSelector = selector => {\n if (!selector || typeof selector !== 'string') {\n return false;\n }\n // filter namespaced selectors, e.g. ns|E, pseudo-element selectors and\n // attribute selectors with case flag, e.g. [attr i], and unclosed quotes\n if (/\\||::|\\[\\s*[\\w$*=^|~-]+(?:(?:\"[\\w$*=^|~\\s'-]+\"|'[\\w$*=^|~\\s\"-]+')?(?:\\s+[\\w$*=^|~-]+)+|\"[^\"\\]]{1,255}|'[^'\\]]{1,255})\\s*\\]/.test(selector)) {\n return false;\n }\n // filter pseudo-class selectors\n if (selector.includes(':')) {\n // digit:\n // `(?:0|[1-9]\\d*)`\n // anb:\n // `[+-]?(?:${digit}n?|n)|(?:[+-]?${digit})?n\\s*[+-]\\s*${digit}`\n // type: *, tag\n // `\\*|[A-Za-z][\\w-]*`\n // subclass: attr, id, class, pseudo-class (nst)\n // `\\[[^\\]]+\\]|[#.:][\\w-]+`\n // compound:\n // `(?:${type}|(?:${type})?(?:${subclass})+)`\n // nested logical:\n // `:(?:is|not|where)\\(\\s*${compound}(?:\\s*,\\s*${compound})*\\s*\\)`\n // compoundB:\n // `(?:${type}|(?:${type})?(?:${subclass}|${nestedLogical})+)`\n // nst:\n // `(?:first|last|only)-(?:child|of-type)`\n // nth: exclude An+B with selector list, e.g. :nth-child(2n+1 of .foo)\n // `nth-(?:last-)?(?:child|of-type)\\(\\s*(?:even|odd|${anb})\\s*\\)`\n // logical: exclude complex selector, e.g. :is(.foo > .bar)\n // `(?:is|not|where)\\(\\s*${compoundB}(?:\\s*,\\s*${compoundB})*\\s*\\)`\n // filter pseudos other than child-indexed and logical combination pseudos\n // `:(?!${nst}|${nth}|${logical})`\n if (/:(?!(?:first|last|only)-(?:child|of-type)|nth-(?:last-)?(?:child|of-type)\\(\\s*(?:even|odd|[+-]?(?:(?:0|[1-9]\\d*)n?|n)|(?:[+-]?(?:0|[1-9]\\d*))?n\\s*[+-]\\s*(?:0|[1-9]\\d*))\\s*\\)|(?:is|not|where)\\(\\s*(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^\\]]+\\]|[#.:][\\w-]+|:(?:is|not|where)\\(\\s*(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^\\]]+\\]|[#.:][\\w-]+)+)(?:\\s*,\\s*(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^\\]]+\\]|[#.:][\\w-]+)+))*\\s*\\))+)(?:\\s*,\\s*(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^\\]]+\\]|[#.:][\\w-]+|:(?:is|not|where)\\(\\s*(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^\\]]+\\]|[#.:][\\w-]+)+)(?:\\s*,\\s*(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^\\]]+\\]|[#.:][\\w-]+)+))*\\s*\\))+))*\\s*\\))/.test(selector)) {\n return false;\n }\n }\n return true;\n};\n\n/* export */\nexport { generate as generateCSS } from 'css-tree';\n"],
5
- "mappings": "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",
6
- "names": ["parser_exports", "__export", "filterSelector", "parseAstName", "parseSelector", "preprocess", "sortAST", "unescapeSelector", "walkAST", "__toCommonJS", "import_css_tree", "import_constant", "selector", "arr", "l", "item", "hexExists", "hex", "str", "low", "high", "deci", "postStr", "args", "index", "preHash", "postHash", "codePoint", "res", "ast", "e", "message", "regEmptyIs", "regLang", "lang", "range", "escapedRange", "escapedLang", "logic", "name", "emptyIs", "branches", "hasPseudoFunc", "node", "list", "itemList", "i", "type", "children", "grandChildren", "greatGrandChildren", "asts", "order", "a", "b", "typeA", "typeB", "bitA", "bitB", "prefix", "localName"]
4
+ "sourcesContent": ["/**\n * parser.js\n */\n\n/* import */\nimport { findAll, parse, toPlainObject, walk } from 'css-tree';\n\n/* constants */\nimport {\n BIT_01, BIT_02, BIT_04, BIT_08, BIT_16, BIT_32, BIT_FFFF, BIT_HYPHEN,\n COMBINATOR, DUO, EMPTY, HEX, REG_LOGICAL_PSEUDO, REG_SHADOW_PSEUDO, SELECTOR,\n SELECTOR_ATTR, SELECTOR_CLASS, SELECTOR_ID, SELECTOR_PSEUDO_CLASS,\n SELECTOR_PSEUDO_ELEMENT, SELECTOR_TYPE, SYNTAX_ERR, TYPE_FROM, TYPE_TO, U_FFFD\n} from './constant.js';\n\n/**\n * unescape selector\n * @param {string} selector - CSS selector\n * @returns {?string} - unescaped selector\n */\nexport const unescapeSelector = (selector = '') => {\n if (typeof selector === 'string' && selector.indexOf('\\\\', 0) >= 0) {\n const arr = selector.split('\\\\');\n const l = arr.length;\n for (let i = 1; i < l; i++) {\n let item = arr[i];\n if (item === '' && i === l - 1) {\n item = U_FFFD;\n } else {\n const hexExists = /^([\\da-f]{1,6}\\s?)/i.exec(item);\n if (hexExists) {\n const [, hex] = hexExists;\n let str;\n try {\n const low = parseInt('D800', HEX);\n const high = parseInt('DFFF', HEX);\n const deci = parseInt(hex, HEX);\n if (deci === 0 || (deci >= low && deci <= high)) {\n str = U_FFFD;\n } else {\n str = String.fromCodePoint(deci);\n }\n } catch (e) {\n str = U_FFFD;\n }\n let postStr = '';\n if (item.length > hex.length) {\n postStr = item.substring(hex.length);\n }\n item = `${str}${postStr}`;\n // whitespace\n } else if (/^[\\n\\r\\f]/.test(item)) {\n item = '\\\\' + item;\n }\n }\n arr[i] = item;\n }\n selector = arr.join('');\n }\n return selector;\n};\n\n/**\n * preprocess\n * @see https://drafts.csswg.org/css-syntax-3/#input-preprocessing\n * @param {...*} args - arguments\n * @returns {string} - filtered selector string\n */\nexport const preprocess = (...args) => {\n if (!args.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n }\n let [selector] = args;\n if (typeof selector === 'string') {\n let index = 0;\n while (index >= 0) {\n index = selector.indexOf('#', index);\n if (index < 0) {\n break;\n }\n const preHash = selector.substring(0, index + 1);\n let postHash = selector.substring(index + 1);\n // @see https://drafts.csswg.org/selectors/#id-selectors\n // @see https://drafts.csswg.org/css-syntax-3/#ident-token-diagram\n if (/^\\d$/.test(postHash.substring(0, 1))) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n const codePoint = postHash.codePointAt(0);\n if (codePoint === BIT_HYPHEN) {\n if (/^\\d$/.test(postHash.substring(1, 2))) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n // escape char above 0xFFFF\n } else if (codePoint > BIT_FFFF) {\n const str = `\\\\${codePoint.toString(HEX)} `;\n if (postHash.length === DUO) {\n postHash = str;\n } else {\n postHash = `${str}${postHash.substring(DUO)}`;\n }\n }\n selector = `${preHash}${postHash}`;\n index++;\n }\n selector = selector.replace(/\\f|\\r\\n?/g, '\\n')\n .replace(/[\\0\\uD800-\\uDFFF]|\\\\$/g, U_FFFD);\n } else if (selector === undefined || selector === null) {\n selector = Object.prototype.toString.call(selector)\n .slice(TYPE_FROM, TYPE_TO).toLowerCase();\n } else if (Array.isArray(selector)) {\n selector = selector.join(',');\n } else if (Object.prototype.hasOwnProperty.call(selector, 'toString')) {\n selector = selector.toString();\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return selector;\n};\n\n/**\n * create AST from CSS selector\n * @param {string} selector - CSS selector\n * @returns {object} - AST\n */\nexport const parseSelector = selector => {\n selector = preprocess(selector);\n // invalid selectors\n if (/^$|^\\s*>|,\\s*$/.test(selector)) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n let res;\n try {\n const ast = parse(selector, {\n context: 'selectorList',\n parseCustomProperty: true\n });\n res = toPlainObject(ast);\n } catch (e) {\n const { message } = e;\n const regEmptyIs = /(:(is|where)\\(\\s*\\))/;\n // workaround for https://github.com/csstree/csstree/issues/265\n const regLang = /(:lang\\(\\s*(\"[A-Za-z\\d\\-*]*\")\\s*\\))/;\n if (message === 'Identifier is expected' && regLang.test(selector)) {\n const [, lang, range] = regLang.exec(selector);\n const escapedRange =\n range.replaceAll('*', '\\\\*').replace(/^\"/, '').replace(/\"$/, '');\n let escapedLang = lang.replace(range, escapedRange);\n if (escapedLang === ':lang()') {\n escapedLang = `:lang(${EMPTY})`;\n }\n res = parseSelector(selector.replace(lang, escapedLang));\n } else if ((message === 'Identifier is expected' ||\n message === 'Selector is expected') &&\n regEmptyIs.test(selector)) {\n const [, logic, name] = regEmptyIs.exec(selector);\n const emptyIs = `:${name}(${EMPTY})`;\n res = parseSelector(selector.replace(logic, emptyIs));\n } else if (message === '\"]\" is expected' && !selector.endsWith(']')) {\n res = parseSelector(`${selector}]`);\n } else if (message === '\")\" is expected' && !selector.endsWith(')')) {\n res = parseSelector(`${selector})`);\n } else {\n throw new DOMException(message, SYNTAX_ERR);\n }\n }\n return res;\n};\n\n/**\n * walk AST\n * @param {object} ast - AST\n * @returns {object} - branches and complex\n */\nexport const walkAST = (ast = {}) => {\n const branches = new Set();\n let hasPseudoFunc;\n let hasComplexSelector;\n const opt = {\n enter: node => {\n if (node.type === SELECTOR) {\n branches.add(node.children);\n } else if ((node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) ||\n (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name))) {\n hasPseudoFunc = true;\n }\n }\n };\n walk(ast, opt);\n if (hasPseudoFunc) {\n findAll(ast, (node, item, list) => {\n if (list) {\n if (node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_CLASS && REG_LOGICAL_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // SelectorList\n for (const { children: grandChildren } of children) {\n // Selector\n for (const { children: greatGrandChildren } of grandChildren) {\n if (branches.has(greatGrandChildren)) {\n for (const greatGrandChild of greatGrandChildren) {\n const { type: greatGrandChildType } = greatGrandChild;\n if (greatGrandChildType === COMBINATOR) {\n hasComplexSelector = true;\n break;\n }\n }\n branches.delete(greatGrandChildren);\n }\n }\n }\n }\n } else if (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_ELEMENT && REG_SHADOW_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // Selector\n for (const { children: grandChildren } of children) {\n if (branches.has(grandChildren)) {\n branches.delete(grandChildren);\n }\n }\n }\n }\n }\n });\n }\n return {\n branches: [...branches],\n complex: !!hasComplexSelector\n };\n};\n\n/**\n * sort AST\n * @param {Array.<object>} asts - collection of AST\n * @returns {Array.<object>} - collection of sorted AST\n */\nexport const sortAST = asts => {\n const arr = [...asts];\n if (arr.length > 1) {\n const order = new Map([\n [SELECTOR_PSEUDO_ELEMENT, BIT_01],\n [SELECTOR_ID, BIT_02],\n [SELECTOR_CLASS, BIT_04],\n [SELECTOR_TYPE, BIT_08],\n [SELECTOR_ATTR, BIT_16],\n [SELECTOR_PSEUDO_CLASS, BIT_32]\n ]);\n arr.sort((a, b) => {\n const { type: typeA } = a;\n const { type: typeB } = b;\n const bitA = order.get(typeA);\n const bitB = order.get(typeB);\n let res;\n if (bitA === bitB) {\n res = 0;\n } else if (bitA > bitB) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\n};\n\n/**\n * parse AST name - e.g. ns|E -> { prefix: ns, localName: E }\n * @param {string} selector - type selector\n * @returns {object} - node properties\n */\nexport const parseAstName = selector => {\n let prefix;\n let localName;\n if (selector && typeof selector === 'string') {\n if (selector.indexOf('|') > -1) {\n [prefix, localName] = selector.split('|');\n } else {\n prefix = '*';\n localName = selector;\n }\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return {\n prefix,\n localName\n };\n};\n\n/* filter selector constants */\n// :first-child, :last-child etc.\nconst N_ST = '(?:first|last|only)-(?:child|of-type)';\nconst DIGIT = '(?:0|[1-9]\\\\d*)';\nconst ANB = `[+-]?(?:${DIGIT}n?|n)|(?:[+-]?${DIGIT})?n\\\\s*[+-]\\\\s*${DIGIT}`;\n// exclude An+B with selector list, e.g. :nth-child(2n+1 of .foo)\nconst N_TH = `nth-(?:last-)?(?:child|of-type)\\\\(\\\\s*(?:even|odd|${ANB})\\\\s*\\\\)`;\n// *, tag\nconst TAG_TYPE = '\\\\*|[A-Za-z][\\\\w-]*';\n// attr, id, class, pseudo-class\nconst SUB_CLASS = '\\\\[[^\\\\]]+\\\\]|[#.:][\\\\w-]+';\nconst LOGICAL_KEY = '(?:is|not|where)';\nconst COMBO_A = '\\\\s?[\\\\s>~+]\\\\s?';\nconst COMBO_B = '\\\\s?[~+]\\\\s?';\nconst COMPOUND_A = `(?:${TAG_TYPE}|(?:${TAG_TYPE})?(?:${SUB_CLASS})+)`;\nconst COMPLEX_A = `${COMPOUND_A}(?:${COMBO_A}${COMPOUND_A})*`;\nconst COMPLEX_B = `${COMPOUND_A}(?:${COMBO_B}${COMPOUND_A})*`;\nconst NESTED_LOGICAL_A =\n `:${LOGICAL_KEY}\\\\(\\\\s*${COMPOUND_A}(?:\\\\s*,\\\\s*${COMPOUND_A})*\\\\s*\\\\)`;\nconst NESTED_LOGICAL_B =\n `:${LOGICAL_KEY}\\\\(\\\\s*${COMPLEX_A}(?:\\\\s*,\\\\s*${COMPLEX_A})*\\\\s*\\\\)`;\nconst NESTED_LOGICAL_C =\n `:${LOGICAL_KEY}\\\\(\\\\s*${COMPLEX_B}(?:\\\\s*,\\\\s*${COMPLEX_B})*\\\\s*\\\\)`;\nconst COMPOUND_B =\n `(?:${TAG_TYPE}|(?:${TAG_TYPE})?(?:${SUB_CLASS}|${NESTED_LOGICAL_A})+)`;\nconst COMPOUND_C =\n `(?:${TAG_TYPE}|(?:${TAG_TYPE})?(?:${SUB_CLASS}|${NESTED_LOGICAL_B})+)`;\nconst COMPOUND_D =\n `(?:${TAG_TYPE}|(?:${TAG_TYPE})?(?:${SUB_CLASS}|${NESTED_LOGICAL_C})+)`;\nconst COMPLEX_C = `${COMPOUND_C}(?:${COMBO_A}${COMPOUND_C})*`;\nconst COMPLEX_D = `${COMPOUND_D}(?:${COMBO_B}${COMPOUND_D})*`;\nconst LOGICAL_COMPOUND =\n `${LOGICAL_KEY}\\\\(\\\\s*${COMPOUND_B}(?:\\\\s*,\\\\s*${COMPOUND_B})*\\\\s*\\\\)`;\nconst LOGICAL_COMPLEX_A =\n `${LOGICAL_KEY}\\\\(\\\\s*${COMPLEX_C}(?:\\\\s*,\\\\s*${COMPLEX_C})*\\\\s*\\\\)`;\nconst LOGICAL_COMPLEX_B =\n `${LOGICAL_KEY}\\\\(\\\\s*${COMPLEX_D}(?:\\\\s*,\\\\s*${COMPLEX_D})*\\\\s*\\\\)`;\nconst REG_LOGICAL_KEY = new RegExp(`:${LOGICAL_KEY}\\\\(`);\nconst REG_COMPLEX_A = new RegExp(`:(?!${N_ST}|${N_TH}|${LOGICAL_COMPLEX_A})`);\nconst REG_COMPLEX_B = new RegExp(`:(?!${N_ST}|${N_TH}|${LOGICAL_COMPLEX_B})`);\nconst REG_COMPOUND = new RegExp(`:(?!${N_ST}|${N_TH}|${LOGICAL_COMPOUND})`);\nconst REG_CHILD_INDEXED = new RegExp(`:(?!${N_ST}|${N_TH})`);\n\n/**\n * filter selector (for nwsapi)\n * @param {string} selector - selector\n * @param {object} opt - options\n * @returns {boolean} - result\n */\nexport const filterSelector = (selector, opt = {}) => {\n if (!selector || typeof selector !== 'string') {\n return false;\n }\n // filter namespaced selectors, e.g. ns|E, pseudo-element selectors and\n // attribute selectors with case flag, e.g. [attr i], and unclosed quotes\n if (/\\||::|\\[\\s*[\\w$*=^|~-]+(?:(?:\"[\\w$*=^|~\\s'-]+\"|'[\\w$*=^|~\\s\"-]+')?(?:\\s+[\\w$*=^|~-]+)+|\"[^\"\\]]{1,255}|'[^'\\]]{1,255})\\s*\\]/.test(selector)) {\n return false;\n }\n // filter pseudo-classes other than child-indexed and logical combination\n if (selector.includes(':')) {\n let reg;\n if (REG_LOGICAL_KEY.test(selector)) {\n const { complex, descendant } = opt;\n if (complex && descendant) {\n reg = REG_COMPLEX_A;\n } else if (complex) {\n reg = REG_COMPLEX_B;\n } else {\n reg = REG_COMPOUND;\n }\n } else {\n reg = REG_CHILD_INDEXED;\n }\n if (reg.test(selector)) {\n return false;\n }\n }\n return true;\n};\n\n/* export */\nexport { generate as generateCSS } from 'css-tree';\n"],
5
+ "mappings": "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",
6
+ "names": ["parser_exports", "__export", "filterSelector", "parseAstName", "parseSelector", "preprocess", "sortAST", "unescapeSelector", "walkAST", "__toCommonJS", "import_css_tree", "import_constant", "selector", "arr", "l", "i", "item", "hexExists", "hex", "str", "low", "high", "deci", "postStr", "args", "index", "preHash", "postHash", "codePoint", "res", "ast", "e", "message", "regEmptyIs", "regLang", "lang", "range", "escapedRange", "escapedLang", "logic", "name", "emptyIs", "branches", "hasPseudoFunc", "hasComplexSelector", "node", "list", "itemList", "type", "children", "grandChildren", "greatGrandChildren", "greatGrandChild", "greatGrandChildType", "asts", "order", "a", "b", "typeA", "typeB", "bitA", "bitB", "prefix", "localName", "N_ST", "DIGIT", "ANB", "N_TH", "TAG_TYPE", "SUB_CLASS", "LOGICAL_KEY", "COMBO_A", "COMBO_B", "COMPOUND_A", "COMPLEX_A", "COMPLEX_B", "NESTED_LOGICAL_A", "NESTED_LOGICAL_B", "NESTED_LOGICAL_C", "COMPOUND_B", "COMPOUND_C", "COMPOUND_D", "COMPLEX_C", "COMPLEX_D", "LOGICAL_COMPOUND", "LOGICAL_COMPLEX_A", "LOGICAL_COMPLEX_B", "REG_LOGICAL_KEY", "REG_COMPLEX_A", "REG_COMPLEX_B", "REG_COMPOUND", "REG_CHILD_INDEXED", "opt", "reg", "complex", "descendant"]
7
7
  }
package/package.json CHANGED
@@ -23,29 +23,29 @@
23
23
  },
24
24
  "types": "types/index.d.ts",
25
25
  "dependencies": {
26
+ "@asamuzakjp/nwsapi": "^2.2.2",
26
27
  "bidi-js": "^1.0.3",
27
28
  "css-tree": "^2.3.1",
28
- "is-potential-custom-element-name": "^1.0.1",
29
- "nwsapi": "2.2.2"
29
+ "is-potential-custom-element-name": "^1.0.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/css-tree": "^2.3.7",
33
33
  "benchmark": "^2.1.4",
34
34
  "c8": "^9.1.0",
35
- "chai": "^5.1.0",
36
- "commander": "^12.0.0",
37
- "esbuild": "^0.21.0",
35
+ "chai": "^5.1.1",
36
+ "commander": "^12.1.0",
37
+ "esbuild": "^0.21.4",
38
38
  "eslint": "^8.57.0",
39
39
  "eslint-config-standard": "^17.1.0",
40
40
  "eslint-plugin-import": "^2.29.1",
41
- "eslint-plugin-jsdoc": "^48.2.3",
42
- "eslint-plugin-regexp": "^2.5.0",
43
- "eslint-plugin-unicorn": "^52.0.0",
44
- "happy-dom": "^14.10.1",
45
- "jsdom": "^24.0.0",
46
- "linkedom": "^0.16.11",
41
+ "eslint-plugin-jsdoc": "^48.2.7",
42
+ "eslint-plugin-regexp": "^2.6.0",
43
+ "eslint-plugin-unicorn": "^53.0.0",
44
+ "happy-dom": "^14.12.0",
45
+ "jsdom": "^24.1.0",
46
+ "linkedom": "^0.18.0",
47
47
  "mocha": "^10.4.0",
48
- "sinon": "^17.0.2",
48
+ "sinon": "^18.0.0",
49
49
  "typescript": "^5.4.5",
50
50
  "wpt-runner": "^5.0.0"
51
51
  },
@@ -60,5 +60,5 @@
60
60
  "tsc": "node scripts/index clean --dir=types -i && npx tsc",
61
61
  "update-wpt": "git submodule update --init --recursive --remote"
62
62
  },
63
- "version": "4.2.2"
63
+ "version": "4.4.0"
64
64
  }
@@ -54,7 +54,7 @@ export const SHOW_ELEMENT = 1;
54
54
  export const WALKER_FILTER = 0x501;
55
55
 
56
56
  /* regexp */
57
- export const REG_LOGICAL_PSEUDO = /^(?:(?:ha|i)s|not|where)$/;
57
+ export const REG_LOGICAL_PSEUDO = /^(?:has|is|not|where)$/;
58
58
  export const REG_SHADOW_HOST = /^host(?:-context)?$/;
59
59
  export const REG_SHADOW_MODE = /^(?:close|open)$/;
60
60
  export const REG_SHADOW_PSEUDO = /^part|slotted$/;
@@ -139,9 +139,9 @@ export const getDirectionality = (node = {}) => {
139
139
  let text;
140
140
  switch (localName) {
141
141
  case 'input': {
142
- if (!node.type || /^(?:(?:butto|hidde)n|(?:emai|te|ur)l|(?:rese|submi|tex)t|password|search)$/.test(node.type)) {
142
+ if (!node.type || /^(?:button|email|hidden|password|reset|search|submit|tel|text|url)$/.test(node.type)) {
143
143
  text = node.value;
144
- } else if (/^(?:(?:ima|ran)ge|(?:dat|tim)e|c(?:olor|heckbox)|number|radio)$/.test(node.type)) {
144
+ } else if (/^(?:checkbox|color|date|image|number|radio|range|time)$/.test(node.type)) {
145
145
  res = 'ltr';
146
146
  }
147
147
  break;
@@ -164,7 +164,7 @@ export const getDirectionality = (node = {}) => {
164
164
  if (itemNodeType === TEXT_NODE) {
165
165
  text = itemTextContent.trim();
166
166
  } else if (itemNodeType === ELEMENT_NODE) {
167
- if (!/^(?:bdi|s(?:cript|tyle)|textarea)$/.test(itemLocalName) &&
167
+ if (!/^(?:bdi|script|style|textarea)$/.test(itemLocalName) &&
168
168
  (!itemDir || !regDir.test(itemDir))) {
169
169
  if (itemLocalName === 'slot') {
170
170
  text = getSlottedTextContent(item);
package/src/js/finder.js CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  /* import */
6
6
  import isCustomElementName from 'is-potential-custom-element-name';
7
- import nwsapi from 'nwsapi';
7
+ import nwsapi from '@asamuzakjp/nwsapi';
8
8
  import {
9
9
  isContentEditable, isInShadowTree, resolveContent, sortNodes
10
10
  } from './dom-util.js';
@@ -15,8 +15,8 @@ import {
15
15
 
16
16
  /* constants */
17
17
  import {
18
- COMBINATOR, DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE, ELEMENT_NODE, EMPTY,
19
- NOT_SUPPORTED_ERR, REG_LOGICAL_PSEUDO, REG_SHADOW_HOST, SELECTOR_CLASS,
18
+ BIT_01, COMBINATOR, DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE, ELEMENT_NODE,
19
+ EMPTY, NOT_SUPPORTED_ERR, REG_LOGICAL_PSEUDO, REG_SHADOW_HOST, SELECTOR_CLASS,
20
20
  SELECTOR_ID, SELECTOR_PSEUDO_CLASS, SELECTOR_PSEUDO_ELEMENT, SELECTOR_TYPE,
21
21
  SHOW_ALL, SYNTAX_ERR, TEXT_NODE, WALKER_FILTER
22
22
  } from './constant.js';
@@ -55,9 +55,11 @@ export class Finder {
55
55
  /* private fields */
56
56
  #ast;
57
57
  #cache;
58
+ #complex;
58
59
  #content;
59
60
  #descendant;
60
61
  #document;
62
+ #event;
61
63
  #node;
62
64
  #nodes;
63
65
  #noexcept;
@@ -120,14 +122,16 @@ export class Finder {
120
122
  * @param {string} selector - CSS selector
121
123
  * @param {object} node - Document, DocumentFragment, Element node
122
124
  * @param {object} opt - options
125
+ * @param {object} [opt.event] - MouseEvent, KeyboardEvent
123
126
  * @param {boolean} [opt.noexcept] - no exception
124
127
  * @param {boolean} [opt.warn] - console warn
125
128
  * @returns {object} - node
126
129
  */
127
130
  _setup(selector, node, opt = {}) {
128
- const { noexcept, warn } = opt;
131
+ const { event, noexcept, warn } = opt;
129
132
  this.#noexcept = !!noexcept;
130
133
  this.#warn = !!warn;
134
+ this.#event = this._setEvent(event);
131
135
  this.#node = node;
132
136
  [this.#content, this.#root, this.#walker] = resolveContent(node);
133
137
  this.#shadow = isInShadowTree(node);
@@ -136,6 +140,19 @@ export class Finder {
136
140
  return node;
137
141
  }
138
142
 
143
+ /**
144
+ * set event
145
+ * @private
146
+ * @param {object} event - instance of MouseEvent, KeyboardEvent
147
+ * @returns {object} - result
148
+ */
149
+ _setEvent(event) {
150
+ return (event instanceof this.#window.MouseEvent ||
151
+ event instanceof this.#window.KeyboardEvent)
152
+ ? event
153
+ : null;
154
+ }
155
+
139
156
  /**
140
157
  * correspond ast and nodes
141
158
  * @private
@@ -144,12 +161,14 @@ export class Finder {
144
161
  */
145
162
  _correspond(selector) {
146
163
  const nodes = [];
164
+ this.#complex = false;
147
165
  this.#descendant = false;
148
166
  let ast;
149
167
  if (this.#content) {
150
168
  const cachedItem = this.#cache.get(this.#content);
151
169
  if (cachedItem && cachedItem.has(`${selector}`)) {
152
170
  const item = cachedItem.get(`${selector}`);
171
+ this.#complex = item.complex;
153
172
  this.#descendant = item.descendant;
154
173
  ast = item.ast;
155
174
  }
@@ -170,7 +189,7 @@ export class Finder {
170
189
  } catch (e) {
171
190
  this._onError(e);
172
191
  }
173
- const branches = walkAST(cssAst);
192
+ const { branches, complex } = walkAST(cssAst);
174
193
  let descendant = false;
175
194
  let i = 0;
176
195
  ast = [];
@@ -239,10 +258,12 @@ export class Finder {
239
258
  }
240
259
  cachedItem.set(`${selector}`, {
241
260
  ast,
261
+ complex,
242
262
  descendant
243
263
  });
244
264
  this.#cache.set(this.#content, cachedItem);
245
265
  }
266
+ this.#complex = complex;
246
267
  this.#descendant = descendant;
247
268
  }
248
269
  return [
@@ -345,7 +366,8 @@ export class Finder {
345
366
  if (this.#cache.has(selector)) {
346
367
  selectorBranches = this.#cache.get(selector);
347
368
  } else {
348
- selectorBranches = walkAST(selector);
369
+ const { branches } = walkAST(selector);
370
+ selectorBranches = branches;
349
371
  this.#cache.set(selector, selectorBranches);
350
372
  }
351
373
  }
@@ -810,7 +832,7 @@ export class Finder {
810
832
  if (this.#cache.has(ast)) {
811
833
  astData = this.#cache.get(ast);
812
834
  } else {
813
- const branches = walkAST(ast);
835
+ const { branches } = walkAST(ast);
814
836
  const selectors = [];
815
837
  const twigBranches = [];
816
838
  for (const [...leaves] of branches) {
@@ -898,14 +920,14 @@ export class Finder {
898
920
  } else {
899
921
  const regAnchor = /^a(?:rea)?$/;
900
922
  const regFormCtrl =
901
- /^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;
902
- const regFormValidity = /^(?:(?:inpu|selec)t|button|form|textarea)$/;
903
- const regInteract = /^d(?:etails|ialog)$/;
923
+ /^(?:button|fieldset|input|optgroup|option|select|textarea)$/;
924
+ const regFormValidity = /^(?:button|form|input|select|textarea)$/;
925
+ const regInteract = /^(?:details|dialog)$/;
904
926
  const regTypeCheck = /^(?:checkbox|radio)$/;
905
927
  const regTypeDate = /^(?:date(?:time-local)?|month|time|week)$/;
906
928
  const regTypeRange =
907
- /(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/;
908
- const regTypeText = /^(?:(?:emai|te|ur)l|number|password|search|text)$/;
929
+ /(?:date(?:time-local)?|month|number|range|time|week)$/;
930
+ const regTypeText = /^(?:email|number|password|search|tel|text|url)$/;
909
931
  switch (astName) {
910
932
  case 'any-link':
911
933
  case 'link': {
@@ -928,6 +950,22 @@ export class Finder {
928
950
  // prevent fingerprinting
929
951
  break;
930
952
  }
953
+ case 'hover': {
954
+ const { target, type } = this.#event ?? {};
955
+ if ((type === 'mouseover' || type === 'pointerover') &&
956
+ node.contains(target)) {
957
+ matched.add(node);
958
+ }
959
+ break;
960
+ }
961
+ case 'active': {
962
+ const { buttons, target, type } = this.#event ?? {};
963
+ if ((type === 'mousedown' || type === 'pointerdown') &&
964
+ buttons & BIT_01 && node.contains(target)) {
965
+ matched.add(node);
966
+ }
967
+ break;
968
+ }
931
969
  case 'target': {
932
970
  const { hash } = new URL(this.#content.URL);
933
971
  if (node.id && hash === `#${node.id}` &&
@@ -961,8 +999,12 @@ export class Finder {
961
999
  }
962
1000
  break;
963
1001
  }
964
- case 'focus': {
965
- if (node === this.#content.activeElement && node.tabIndex >= 0) {
1002
+ case 'focus':
1003
+ case 'focus-visible': {
1004
+ const { target, type } = this.#event ?? {};
1005
+ if (node === this.#content.activeElement && node.tabIndex >= 0 &&
1006
+ (astName === 'focus' ||
1007
+ (type === 'keydown' && node.contains(target)))) {
966
1008
  let refNode = node;
967
1009
  let focus = true;
968
1010
  while (refNode) {
@@ -1511,6 +1553,15 @@ export class Finder {
1511
1553
  }
1512
1554
  break;
1513
1555
  }
1556
+ case 'popover-open': {
1557
+ if (node.popover) {
1558
+ const { display } = this.#window.getComputedStyle(node);
1559
+ if (display !== 'none') {
1560
+ matched.add(node);
1561
+ }
1562
+ }
1563
+ break;
1564
+ }
1514
1565
  case 'host':
1515
1566
  case 'host-context': {
1516
1567
  // ignore
@@ -1527,15 +1578,13 @@ export class Finder {
1527
1578
  }
1528
1579
  break;
1529
1580
  }
1530
- case 'active':
1581
+ // not supported
1531
1582
  case 'autofill':
1532
1583
  case 'blank':
1533
1584
  case 'buffering':
1534
1585
  case 'current':
1535
- case 'focus-visible':
1536
1586
  case 'fullscreen':
1537
1587
  case 'future':
1538
- case 'hover':
1539
1588
  case 'modal':
1540
1589
  case 'muted':
1541
1590
  case 'past':
@@ -1581,7 +1630,8 @@ export class Finder {
1581
1630
  const { children: astChildren, name: astName } = ast;
1582
1631
  let res;
1583
1632
  if (Array.isArray(astChildren)) {
1584
- const [branch] = walkAST(astChildren[0]);
1633
+ const { branches } = walkAST(astChildren[0]);
1634
+ const [branch] = branches;
1585
1635
  const [...leaves] = branch;
1586
1636
  const { host } = node;
1587
1637
  if (astName === 'host') {
@@ -2756,7 +2806,10 @@ export class Finder {
2756
2806
  const msg = `Unexpected node ${node?.nodeName}`;
2757
2807
  throw new TypeError(msg);
2758
2808
  }
2759
- if (filterSelector(selector)) {
2809
+ if (filterSelector(selector, {
2810
+ complex: this.#complex,
2811
+ descendant: true
2812
+ })) {
2760
2813
  res = this.#nwsapi.match(selector, node);
2761
2814
  } else {
2762
2815
  this._setup(selector, node, opt);
@@ -2783,7 +2836,10 @@ export class Finder {
2783
2836
  const msg = `Unexpected node ${node?.nodeName}`;
2784
2837
  throw new TypeError(msg);
2785
2838
  }
2786
- if (filterSelector(selector)) {
2839
+ if (filterSelector(selector, {
2840
+ complex: this.#complex,
2841
+ descendant: true
2842
+ })) {
2787
2843
  res = this.#nwsapi.closest(selector, node);
2788
2844
  } else {
2789
2845
  this._setup(selector, node, opt);
@@ -2817,7 +2873,10 @@ export class Finder {
2817
2873
  try {
2818
2874
  this._setup(selector, node, opt);
2819
2875
  if (this.#document === this.#content && !this.#descendant &&
2820
- filterSelector(selector)) {
2876
+ filterSelector(selector, {
2877
+ complex: this.#complex,
2878
+ descendant: false
2879
+ })) {
2821
2880
  res = this.#nwsapi.first(selector, node);
2822
2881
  } else {
2823
2882
  const nodes = this._find(TARGET_FIRST);
@@ -2845,7 +2904,10 @@ export class Finder {
2845
2904
  try {
2846
2905
  this._setup(selector, node, opt);
2847
2906
  if (this.#document === this.#content && !this.#descendant &&
2848
- filterSelector(selector)) {
2907
+ filterSelector(selector, {
2908
+ complex: this.#complex,
2909
+ descendant: false
2910
+ })) {
2849
2911
  res = this.#nwsapi.select(selector, node);
2850
2912
  } else {
2851
2913
  const nodes = this._find(TARGET_ALL);