@asamuzakjp/dom-selector 8.1.1 → 8.1.2

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/package.json CHANGED
@@ -86,5 +86,5 @@
86
86
  "engines": {
87
87
  "node": "^22.13.0 || >=24.0.0"
88
88
  },
89
- "version": "8.1.1"
89
+ "version": "8.1.2"
90
90
  }
@@ -81,7 +81,6 @@ export const TAG_TYPE = `\\*|${TAG_TYPE_WO_UNIVERSAL}`;
81
81
  export const TAG_TYPE_I = '\\*|[A-Z][\\w-]*';
82
82
  export const COMPOUND = `(?:${TAG_TYPE}|(?:${TAG_TYPE})?(?:${SUB_TYPE})+)`;
83
83
  export const COMPOUND_L = `(?:${TAG_TYPE}|(?:${TAG_TYPE})?(?:${SUB_TYPE}|${LOGIC_IS})+)`;
84
- export const COMPOUND_L_I = `(?:(?:${TAG_TYPE_I})?(?:${SUB_TYPE}|${LOGIC_IS})+)`;
85
84
  export const COMPOUND_I = `(?:${TAG_TYPE_I}|(?:${TAG_TYPE_I})?(?:${SUB_TYPE})+)`;
86
85
  export const COMPOUND_WO_PSEUDO = `(?:${TAG_TYPE}|(?:${TAG_TYPE})?(?:${SUB_TYPE_WO_PSEUDO})+)`;
87
86
  export const COMPLEX = `${COMPOUND}(?:${COMBO}${COMPOUND})*`;
@@ -11,7 +11,6 @@ import {
11
11
  COMBINATOR,
12
12
  COMBO,
13
13
  COMPOUND_I,
14
- COMPOUND_L_I,
15
14
  DESCEND,
16
15
  HAS_COMPOUND,
17
16
  KEYS_LOGICAL,
@@ -30,9 +29,11 @@ import {
30
29
  /* regexp */
31
30
  const REG_EXCLUDE_BASIC =
32
31
  /[|\\]|::|[^\u0021-\u007F\s]|\[\s*[\w$*=^|~-]+(?:(?:"[\w$*=^|~\s'-]+"|'[\w$*=^|~\s"-]+')?(?:\s+[\w$*=^|~-]+)+|"[^"\]]{1,255}|'[^'\]]{1,255})\s*\]|:(?:is|where)\(\s*\)/;
32
+ const REG_EXCLUDE_QSA = new RegExp(
33
+ `(?:^(?:[A-Z]|\\.)[\\w-]*$|${COMPOUND_I}${DESCEND}${COMPOUND_I})`,
34
+ 'i'
35
+ );
33
36
  const REG_COMPLEX = new RegExp(`${COMPOUND_I}${COMBO}${COMPOUND_I}`, 'i');
34
- const REG_COMPOUND = new RegExp(`^${COMPOUND_L_I}$`, 'i');
35
- const REG_DESCEND = new RegExp(`${COMPOUND_I}${DESCEND}${COMPOUND_I}`, 'i');
36
37
  const REG_LOGIC_COMPLEX = new RegExp(
37
38
  `:(?!${PSEUDO_CLASS}|${N_TH}|${LOGIC_COMPLEX})`
38
39
  );
@@ -264,7 +265,6 @@ export const extractSubjectsRegExp = (selector, caseSensitive) => {
264
265
  * @returns {boolean} - True if the selector is valid for nwsapi.
265
266
  */
266
267
  export const filterSelector = (selector, target) => {
267
- const isQuerySelectorAll = target === TARGET_ALL;
268
268
  // Basic validation and fast-fail for null/undefined/non-string values.
269
269
  if (
270
270
  !selector ||
@@ -277,6 +277,10 @@ export const filterSelector = (selector, target) => {
277
277
  if (REG_INVALID_SYNTAX.test(selector)) {
278
278
  return false;
279
279
  }
280
+ // Target-specific early exits.
281
+ if (target === TARGET_ALL && REG_EXCLUDE_QSA.test(selector)) {
282
+ return false;
283
+ }
280
284
  // Exclude various complex or unsupported selectors early.
281
285
  // i.e. non-ASCII, escaped selectors, namespaced selectors, pseudo-elements.
282
286
  if (selector.includes('/') || REG_EXCLUDE_BASIC.test(selector)) {
@@ -289,18 +293,11 @@ export const filterSelector = (selector, target) => {
289
293
  return false;
290
294
  }
291
295
  }
292
- // Target-specific early exits.
293
- if (target === TARGET_ALL && !REG_COMPOUND.test(selector)) {
294
- return false;
295
- }
296
296
  // Logic for pseudo-classes.
297
297
  if (selector.includes(':')) {
298
- // Exclude descendant combinators in logical selectors for querySelectorAll.
299
- if (isQuerySelectorAll && REG_DESCEND.test(selector)) {
300
- return false;
301
- }
302
298
  // Determine if the selector has complex logical structures.
303
- const isComplex = isQuerySelectorAll ? false : REG_COMPLEX.test(selector);
299
+ const isComplex =
300
+ target === TARGET_ALL ? false : REG_COMPLEX.test(selector);
304
301
  // Handle :has() specifically.
305
302
  if (selector.includes(':has(')) {
306
303
  if (!isComplex || REG_LOGIC_HAS_COMPOUND.test(selector)) {
@@ -62,7 +62,6 @@ export const TAG_TYPE: "\\*|[A-Za-z][\\w-]*";
62
62
  export const TAG_TYPE_I: "\\*|[A-Z][\\w-]*";
63
63
  export const COMPOUND: "(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^|\\]]+\\]|[#.:][\\w-]+)+)";
64
64
  export const COMPOUND_L: "(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^|\\]]+\\]|[#.:][\\w-]+|:is\\(\\s*[^)]+\\s*\\))+)";
65
- export const COMPOUND_L_I: "(?:(?:\\*|[A-Z][\\w-]*)?(?:\\[[^|\\]]+\\]|[#.:][\\w-]+|:is\\(\\s*[^)]+\\s*\\))+)";
66
65
  export const COMPOUND_I: "(?:\\*|[A-Z][\\w-]*|(?:\\*|[A-Z][\\w-]*)?(?:\\[[^|\\]]+\\]|[#.:][\\w-]+)+)";
67
66
  export const COMPOUND_WO_PSEUDO: "(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^|\\]]+\\]|[#.][\\w-]+)+)";
68
67
  export const COMPLEX: "(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^|\\]]+\\]|[#.:][\\w-]+)+)(?:\\s?[\\s>~+]\\s?(?:\\*|[A-Za-z][\\w-]*|(?:\\*|[A-Za-z][\\w-]*)?(?:\\[[^|\\]]+\\]|[#.:][\\w-]+)+))*";