@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.
- package/README.md +34 -29
- package/dist/cjs/js/constant.js +1 -1
- package/dist/cjs/js/constant.js.map +2 -2
- package/dist/cjs/js/dom-util.js +1 -1
- package/dist/cjs/js/dom-util.js.map +2 -2
- package/dist/cjs/js/finder.js +1 -1
- package/dist/cjs/js/finder.js.map +3 -3
- package/dist/cjs/js/parser.js +2 -2
- package/dist/cjs/js/parser.js.map +3 -3
- package/package.json +13 -13
- package/src/js/constant.js +1 -1
- package/src/js/dom-util.js +3 -3
- package/src/js/finder.js +84 -22
- package/src/js/parser.js +74 -28
- package/types/js/finder.d.ts +1 -0
- package/types/js/parser.d.ts +2 -2
package/dist/cjs/js/parser.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
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},
|
|
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": "4ZAAA,IAAAA,
|
|
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", "
|
|
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.
|
|
36
|
-
"commander": "^12.
|
|
37
|
-
"esbuild": "^0.21.
|
|
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.
|
|
42
|
-
"eslint-plugin-regexp": "^2.
|
|
43
|
-
"eslint-plugin-unicorn": "^
|
|
44
|
-
"happy-dom": "^14.
|
|
45
|
-
"jsdom": "^24.
|
|
46
|
-
"linkedom": "^0.
|
|
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": "^
|
|
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.
|
|
63
|
+
"version": "4.4.0"
|
|
64
64
|
}
|
package/src/js/constant.js
CHANGED
|
@@ -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 = /^(?:
|
|
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$/;
|
package/src/js/dom-util.js
CHANGED
|
@@ -139,9 +139,9 @@ export const getDirectionality = (node = {}) => {
|
|
|
139
139
|
let text;
|
|
140
140
|
switch (localName) {
|
|
141
141
|
case 'input': {
|
|
142
|
-
if (!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 (/^(?:
|
|
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|
|
|
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,
|
|
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
|
-
|
|
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
|
-
/^(?:
|
|
902
|
-
const regFormValidity = /^(?:
|
|
903
|
-
const regInteract = /^
|
|
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
|
-
/(?:
|
|
908
|
-
const regTypeText = /^(?:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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);
|