query-selector-shadow-dom-modern 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # query-selector-shadow-dom-modern
2
+
3
+ Modern drop-in replacement for [query-selector-shadow-dom](https://www.npmjs.com/package/query-selector-shadow-dom). Zero dependencies, full TypeScript support.
4
+
5
+ querySelector that can pierce Shadow DOM roots without knowing the path through nested shadow roots. Useful for automated testing of Web Components (Selenium, Puppeteer, Playwright, etc.).
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install query-selector-shadow-dom-modern
11
+ # or
12
+ pnpm add query-selector-shadow-dom-modern
13
+ # or
14
+ yarn add query-selector-shadow-dom-modern
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```ts
20
+ import { querySelectorDeep, querySelectorAllDeep, collectAllElementsDeep } from 'query-selector-shadow-dom-modern';
21
+
22
+ // Find first matching element (pierces shadow roots)
23
+ const btn = querySelectorDeep('.btn-in-shadow-dom');
24
+
25
+ // Find all matching elements
26
+ const items = querySelectorAllDeep('my-component .item');
27
+
28
+ // Collect all elements on the page, including shadow DOM
29
+ const all = collectAllElementsDeep();
30
+ const filtered = collectAllElementsDeep('a[href]');
31
+ ```
32
+
33
+ ### UMD (browser)
34
+
35
+ ```html
36
+ <script src="node_modules/query-selector-shadow-dom-modern/dist/umd/index.js"></script>
37
+ <script>
38
+ const btn = querySelectorShadowDom.querySelectorDeep('.btn-in-shadow-dom');
39
+ </script>
40
+ ```
41
+
42
+ ## API
43
+
44
+ - `querySelectorDeep(selector, root?)` — Returns the first matching element, piercing shadow roots
45
+ - `querySelectorAllDeep(selector, root?)` — Returns an array of all matching elements, piercing shadow roots
46
+ - `collectAllElementsDeep(selector?, root?)` — Collects all elements on the page, including those within shadow roots. Optionally filters by a CSS selector
47
+
48
+ Both `root` defaults to `document`. Pass a custom root to scope the search (e.g., an iframe's `contentDocument`).
49
+
50
+ ## License
51
+
52
+ MIT
@@ -0,0 +1,49 @@
1
+ /**
2
+ * query-selector-shadow-dom-modern
3
+ *
4
+ * Drop-in replacement for https://www.npmjs.com/package/query-selector-shadow-dom
5
+ * with the same public API:
6
+ *
7
+ * - querySelectorDeep(selector, root?, allElements?)
8
+ * - querySelectorAllDeep(selector, root?, allElements?)
9
+ * - collectAllElementsDeep(selector?, root?, cachedElements?)
10
+ *
11
+ * but faster and safer:
12
+ * - Native `querySelector(All)` does the heavy lifting whenever possible
13
+ * (whole-selector fast path when no shadow roots are involved, and a
14
+ * per-root pre-filter on the right-most compound selector otherwise).
15
+ * - Selector parsing is memoized (strings are immutable — safe to cache).
16
+ * - No DOM caching: results are always computed from the live tree, so
17
+ * dynamic pages never see stale data.
18
+ * - Full combinator support across shadow boundaries: ` `, `>`, `+`, `~`.
19
+ * - Cross-realm safe (iframe documents): no `instanceof` on DOM classes.
20
+ */
21
+ export type QueryableNode = Document | DocumentFragment | Element;
22
+ /**
23
+ * Finds the first matching element on the page, piercing any number of nested
24
+ * shadow roots. Same signature and semantics as the original library.
25
+ */
26
+ export declare function querySelectorDeep<T extends Element = HTMLElement>(selector: string, root?: QueryableNode, allElements?: Element[] | null): T | null;
27
+ /**
28
+ * Finds all matching elements on the page, piercing any number of nested
29
+ * shadow roots. Same signature and semantics as the original library
30
+ * (results are additionally de-duplicated).
31
+ */
32
+ export declare function querySelectorAllDeep<T extends Element = HTMLElement>(selector: string, root?: QueryableNode, allElements?: Element[] | null): T[];
33
+ /**
34
+ * Finds all elements on the page, inclusive of those within shadow roots.
35
+ * Optionally filtered by a CSS selector.
36
+ * Same signature and semantics as the original library.
37
+ */
38
+ export declare function collectAllElementsDeep<T extends Element = HTMLElement>(selector?: string | null, root?: QueryableNode, cachedElements?: Element[] | null): T[];
39
+ /**
40
+ * Split a selector list on top-level commas (ignores commas inside quotes,
41
+ * attribute brackets and pseudo-class parentheses).
42
+ */
43
+ export declare function splitByComma(selector: string): string[];
44
+ /**
45
+ * Tokenize a CSS selector into compounds and combinators:
46
+ * 'div > p span' → ['div', '>', 'p', ' ', 'span'].
47
+ */
48
+ export declare function tokenizePath(selector: string): string[];
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAsOlE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAC7D,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,aAAwB,EAC9B,WAAW,GAAE,OAAO,EAAE,GAAG,IAAW,GACrC,CAAC,GAAG,IAAI,CAmDV;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAChE,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,aAAwB,EAC9B,WAAW,GAAE,OAAO,EAAE,GAAG,IAAW,GACrC,CAAC,EAAE,CA8DL;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EAClE,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,IAAI,GAAE,aAAwB,EAC9B,cAAc,GAAE,OAAO,EAAE,GAAG,IAAW,GACxC,CAAC,EAAE,CAQL;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0DvD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAmGvD"}
@@ -0,0 +1,527 @@
1
+ /**
2
+ * query-selector-shadow-dom-modern
3
+ *
4
+ * Drop-in replacement for https://www.npmjs.com/package/query-selector-shadow-dom
5
+ * with the same public API:
6
+ *
7
+ * - querySelectorDeep(selector, root?, allElements?)
8
+ * - querySelectorAllDeep(selector, root?, allElements?)
9
+ * - collectAllElementsDeep(selector?, root?, cachedElements?)
10
+ *
11
+ * but faster and safer:
12
+ * - Native `querySelector(All)` does the heavy lifting whenever possible
13
+ * (whole-selector fast path when no shadow roots are involved, and a
14
+ * per-root pre-filter on the right-most compound selector otherwise).
15
+ * - Selector parsing is memoized (strings are immutable — safe to cache).
16
+ * - No DOM caching: results are always computed from the live tree, so
17
+ * dynamic pages never see stale data.
18
+ * - Full combinator support across shadow boundaries: ` `, `>`, `+`, `~`.
19
+ * - Cross-realm safe (iframe documents): no `instanceof` on DOM classes.
20
+ */
21
+ const ELEMENT_NODE = 1;
22
+ const DOCUMENT_FRAGMENT_NODE = 11;
23
+ /** Cross-realm-safe Element check (`instanceof` fails across frames). */
24
+ function isElementNode(node) {
25
+ return !!node && node.nodeType === ELEMENT_NODE;
26
+ }
27
+ /** Cross-realm-safe ShadowRoot check. */
28
+ function isHostedFragment(node) {
29
+ return (!!node &&
30
+ node.nodeType === DOCUMENT_FRAGMENT_NODE &&
31
+ !!node.host);
32
+ }
33
+ /** `el.matches()` that never throws (context-dependent pseudo-classes etc.). */
34
+ function matchesSelector(el, compound) {
35
+ try {
36
+ return el.matches(compound);
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /**
43
+ * Parent in the composed (flat-ish) tree: crosses shadow boundaries towards
44
+ * the host, and stops at the boundary the search was scoped to.
45
+ * Matches the original library's findParentOrHost semantics.
46
+ */
47
+ function composedParent(el, boundary) {
48
+ if (el === boundary)
49
+ return null;
50
+ const parent = el.parentElement;
51
+ if (parent)
52
+ return parent;
53
+ const rootNode = el.getRootNode();
54
+ if (rootNode === el || rootNode === boundary)
55
+ return null;
56
+ if (isHostedFragment(rootNode))
57
+ return rootNode.host;
58
+ return null;
59
+ }
60
+ /**
61
+ * Verify that `el` (already known to match the right-most compound) satisfies
62
+ * the whole selector path, walking the composed tree right-to-left.
63
+ * `tokens` looks like: [compound, combinator, compound, ...].
64
+ */
65
+ function matchesComposedPath(el, tokens, boundary) {
66
+ let node = el;
67
+ let i = tokens.length - 1;
68
+ while (i > 0 && node) {
69
+ const combinator = tokens[i - 1];
70
+ const compound = tokens[i - 2];
71
+ if (combinator === '>') {
72
+ node = composedParent(node, boundary);
73
+ if (!node || !matchesSelector(node, compound))
74
+ return false;
75
+ }
76
+ else if (combinator === '+') {
77
+ node = node.previousElementSibling;
78
+ if (!node || !matchesSelector(node, compound))
79
+ return false;
80
+ }
81
+ else if (combinator === '~') {
82
+ node = node.previousElementSibling;
83
+ let found = false;
84
+ while (node) {
85
+ if (matchesSelector(node, compound)) {
86
+ found = true;
87
+ break;
88
+ }
89
+ node = node.previousElementSibling;
90
+ }
91
+ if (!found)
92
+ return false;
93
+ }
94
+ else {
95
+ // descendant combinator
96
+ node = composedParent(node, boundary);
97
+ let found = false;
98
+ while (node) {
99
+ if (matchesSelector(node, compound)) {
100
+ found = true;
101
+ break;
102
+ }
103
+ node = composedParent(node, boundary);
104
+ }
105
+ if (!found)
106
+ return false;
107
+ }
108
+ i -= 2;
109
+ }
110
+ return i <= 0;
111
+ }
112
+ /**
113
+ * All queryable roots below (and including) `root`: the root itself plus every
114
+ * open shadow root found underneath, in discovery order. Computed fresh on
115
+ * every call — never cached, so dynamic DOMs are always correct.
116
+ */
117
+ function collectRoots(root) {
118
+ const roots = [root];
119
+ const pending = [];
120
+ if (isElementNode(root) && root.shadowRoot) {
121
+ roots.push(root.shadowRoot);
122
+ pending.push(root.shadowRoot);
123
+ }
124
+ let scope = root;
125
+ while (scope) {
126
+ const all = scope.querySelectorAll('*');
127
+ for (let i = 0; i < all.length; i++) {
128
+ const shadowRoot = all[i].shadowRoot;
129
+ if (shadowRoot) {
130
+ roots.push(shadowRoot);
131
+ pending.push(shadowRoot);
132
+ }
133
+ }
134
+ scope = pending.pop();
135
+ }
136
+ return roots;
137
+ }
138
+ /**
139
+ * Collect every element under `root` in the original library's order
140
+ * (composed tree pre-order: a host's shadow content comes immediately after
141
+ * the host element). One native `querySelectorAll('*')` per root — the
142
+ * browser does the walking.
143
+ */
144
+ function collectAllElements(root, filter) {
145
+ const out = [];
146
+ collectInto(root, out, filter);
147
+ return out;
148
+ }
149
+ function collectInto(scope, out, filter) {
150
+ // A root element's own shadow content is listed first (original behavior).
151
+ if (isElementNode(scope) && scope.shadowRoot) {
152
+ collectList(scope.shadowRoot.querySelectorAll('*'), out, filter);
153
+ }
154
+ collectList(scope.querySelectorAll('*'), out, filter);
155
+ }
156
+ function collectList(list, out, filter) {
157
+ for (let i = 0; i < list.length; i++) {
158
+ const el = list[i];
159
+ if (!filter || matchesSelector(el, filter)) {
160
+ out.push(el);
161
+ }
162
+ const shadowRoot = el.shadowRoot;
163
+ if (shadowRoot) {
164
+ collectList(shadowRoot.querySelectorAll('*'), out, filter);
165
+ }
166
+ }
167
+ }
168
+ /**
169
+ * Generator variant of the same traversal, for callers that can stop early.
170
+ */
171
+ function* iterateDeep(root) {
172
+ const stack = [];
173
+ const pushChildren = (scope) => {
174
+ const kids = scope.children;
175
+ for (let i = kids.length - 1; i >= 0; i--)
176
+ stack.push(kids[i]);
177
+ };
178
+ if (isElementNode(root)) {
179
+ pushChildren(root);
180
+ if (root.shadowRoot)
181
+ pushChildren(root.shadowRoot);
182
+ }
183
+ else {
184
+ pushChildren(root);
185
+ }
186
+ while (stack.length > 0) {
187
+ const el = stack.pop();
188
+ yield el;
189
+ pushChildren(el);
190
+ if (el.shadowRoot)
191
+ pushChildren(el.shadowRoot);
192
+ }
193
+ }
194
+ const PARSE_CACHE_LIMIT = 512;
195
+ const parseCache = new Map();
196
+ /** Split into comma-separated parts, each tokenized as [compound, combinator, ...]. Memoized. */
197
+ function parseSelector(selector) {
198
+ const cached = parseCache.get(selector);
199
+ if (cached)
200
+ return cached;
201
+ const parts = [];
202
+ for (const part of splitByComma(selector)) {
203
+ const tokens = tokenizePath(part);
204
+ if (tokens.length > 0)
205
+ parts.push(tokens);
206
+ }
207
+ if (parseCache.size >= PARSE_CACHE_LIMIT)
208
+ parseCache.clear();
209
+ parseCache.set(selector, parts);
210
+ return parts;
211
+ }
212
+ /**
213
+ * Candidates for one tokenized selector part: elements matching the
214
+ * right-most compound, natively pre-filtered inside each root.
215
+ * Returns the candidates either as a single ordered list (when only one root
216
+ * produced hits) or as a Set plus a flag that a composed-order walk is needed.
217
+ */
218
+ function collectCandidates(roots, rightMostCompound) {
219
+ let list = null;
220
+ let set = null;
221
+ let rootsWithHits = 0;
222
+ for (const root of roots) {
223
+ let found;
224
+ try {
225
+ found = root.querySelectorAll(rightMostCompound);
226
+ }
227
+ catch {
228
+ continue; // selector not valid in this root's context
229
+ }
230
+ if (found.length === 0)
231
+ continue;
232
+ rootsWithHits++;
233
+ if (!list) {
234
+ list = Array.from(found);
235
+ }
236
+ else {
237
+ if (!set)
238
+ set = new Set(list);
239
+ for (let i = 0; i < found.length; i++)
240
+ set.add(found[i]);
241
+ }
242
+ }
243
+ return { list, set, rootsWithHits };
244
+ }
245
+ /**
246
+ * Finds the first matching element on the page, piercing any number of nested
247
+ * shadow roots. Same signature and semantics as the original library.
248
+ */
249
+ export function querySelectorDeep(selector, root = document, allElements = null) {
250
+ if (!selector || !selector.trim())
251
+ return null;
252
+ // Native fast path — identical to the original library: a plain
253
+ // light-DOM match always wins, no matter what lives in shadow roots.
254
+ const lightElement = root.querySelector(selector);
255
+ if (lightElement)
256
+ return lightElement;
257
+ const parts = parseSelector(selector);
258
+ if (parts.length === 0)
259
+ return null;
260
+ // Caller-supplied element list (original API's third argument).
261
+ if (allElements) {
262
+ for (const tokens of parts) {
263
+ const last = tokens[tokens.length - 1];
264
+ for (const el of allElements) {
265
+ if (matchesSelector(el, last) &&
266
+ (tokens.length === 1 || matchesComposedPath(el, tokens, root))) {
267
+ return el;
268
+ }
269
+ }
270
+ }
271
+ return null;
272
+ }
273
+ const roots = collectRoots(root);
274
+ if (roots.length === 1)
275
+ return null; // no shadow roots; native query already failed
276
+ for (const tokens of parts) {
277
+ const last = tokens[tokens.length - 1];
278
+ const { list, set, rootsWithHits } = collectCandidates(roots, last);
279
+ if (!list)
280
+ continue;
281
+ const verified = (el) => tokens.length === 1 || matchesComposedPath(el, tokens, root);
282
+ if (rootsWithHits === 1) {
283
+ // All candidates live in a single root → that root's native order is composed order.
284
+ for (const el of list) {
285
+ if (verified(el))
286
+ return el;
287
+ }
288
+ }
289
+ else {
290
+ const candidates = set ?? new Set(list);
291
+ for (const el of iterateDeep(root)) {
292
+ if (candidates.has(el) && verified(el))
293
+ return el;
294
+ }
295
+ }
296
+ }
297
+ return null;
298
+ }
299
+ /**
300
+ * Finds all matching elements on the page, piercing any number of nested
301
+ * shadow roots. Same signature and semantics as the original library
302
+ * (results are additionally de-duplicated).
303
+ */
304
+ export function querySelectorAllDeep(selector, root = document, allElements = null) {
305
+ if (!selector || !selector.trim())
306
+ return [];
307
+ const parts = parseSelector(selector);
308
+ if (parts.length === 0)
309
+ return [];
310
+ // Caller-supplied element list (original API's third argument).
311
+ if (allElements) {
312
+ const out = [];
313
+ const seen = new Set();
314
+ for (const tokens of parts) {
315
+ const last = tokens[tokens.length - 1];
316
+ for (const el of allElements) {
317
+ if (seen.has(el) || !matchesSelector(el, last))
318
+ continue;
319
+ if (tokens.length === 1 || matchesComposedPath(el, tokens, root)) {
320
+ seen.add(el);
321
+ out.push(el);
322
+ }
323
+ }
324
+ }
325
+ return out;
326
+ }
327
+ const roots = collectRoots(root);
328
+ // No shadow roots below `root` → hand everything to the browser.
329
+ if (roots.length === 1) {
330
+ return Array.from(root.querySelectorAll(selector));
331
+ }
332
+ const results = [];
333
+ const seen = new Set();
334
+ for (const tokens of parts) {
335
+ const last = tokens[tokens.length - 1];
336
+ const { list, set, rootsWithHits } = collectCandidates(roots, last);
337
+ if (!list)
338
+ continue;
339
+ if (rootsWithHits === 1) {
340
+ // All candidates live in a single root → its native order is composed order.
341
+ for (const el of list) {
342
+ if (seen.has(el))
343
+ continue;
344
+ if (tokens.length === 1 || matchesComposedPath(el, tokens, root)) {
345
+ seen.add(el);
346
+ results.push(el);
347
+ }
348
+ }
349
+ }
350
+ else {
351
+ // Candidates spread across roots → merge in composed tree order.
352
+ const candidates = set ?? new Set(list);
353
+ const all = collectAllElements(root);
354
+ for (let i = 0; i < all.length; i++) {
355
+ const el = all[i];
356
+ if (!candidates.has(el) || seen.has(el))
357
+ continue;
358
+ if (tokens.length === 1 || matchesComposedPath(el, tokens, root)) {
359
+ seen.add(el);
360
+ results.push(el);
361
+ }
362
+ }
363
+ }
364
+ }
365
+ return results;
366
+ }
367
+ /**
368
+ * Finds all elements on the page, inclusive of those within shadow roots.
369
+ * Optionally filtered by a CSS selector.
370
+ * Same signature and semantics as the original library.
371
+ */
372
+ export function collectAllElementsDeep(selector = null, root = document, cachedElements = null) {
373
+ if (cachedElements) {
374
+ const all = cachedElements;
375
+ return selector ? all.filter((el) => matchesSelector(el, selector)) : all;
376
+ }
377
+ // Single pass: elements are filtered while the tree is being walked.
378
+ return collectAllElements(root, selector ?? undefined);
379
+ }
380
+ /**
381
+ * Split a selector list on top-level commas (ignores commas inside quotes,
382
+ * attribute brackets and pseudo-class parentheses).
383
+ */
384
+ export function splitByComma(selector) {
385
+ if (!selector || !selector.trim())
386
+ return [];
387
+ const results = [];
388
+ let current = '';
389
+ let parenDepth = 0;
390
+ let bracketDepth = 0;
391
+ let inSingleQuote = false;
392
+ let inDoubleQuote = false;
393
+ let escaped = false;
394
+ for (let i = 0; i < selector.length; i++) {
395
+ const char = selector[i];
396
+ if (escaped) {
397
+ current += char;
398
+ escaped = false;
399
+ continue;
400
+ }
401
+ if (char === '\\') {
402
+ escaped = true;
403
+ current += char;
404
+ continue;
405
+ }
406
+ if (char === "'" && !inDoubleQuote) {
407
+ inSingleQuote = !inSingleQuote;
408
+ current += char;
409
+ continue;
410
+ }
411
+ if (char === '"' && !inSingleQuote) {
412
+ inDoubleQuote = !inDoubleQuote;
413
+ current += char;
414
+ continue;
415
+ }
416
+ if (!inSingleQuote && !inDoubleQuote) {
417
+ if (char === '(')
418
+ parenDepth++;
419
+ else if (char === ')')
420
+ parenDepth = Math.max(0, parenDepth - 1);
421
+ else if (char === '[')
422
+ bracketDepth++;
423
+ else if (char === ']')
424
+ bracketDepth = Math.max(0, bracketDepth - 1);
425
+ else if (char === ',' && parenDepth === 0 && bracketDepth === 0) {
426
+ results.push(current.trim());
427
+ current = '';
428
+ continue;
429
+ }
430
+ }
431
+ current += char;
432
+ }
433
+ if (current.trim()) {
434
+ results.push(current.trim());
435
+ }
436
+ return results;
437
+ }
438
+ /**
439
+ * Tokenize a CSS selector into compounds and combinators:
440
+ * 'div > p span' → ['div', '>', 'p', ' ', 'span'].
441
+ */
442
+ export function tokenizePath(selector) {
443
+ if (!selector || !selector.trim())
444
+ return [];
445
+ const tokens = [];
446
+ let current = '';
447
+ let parenDepth = 0;
448
+ let bracketDepth = 0;
449
+ let inSingleQuote = false;
450
+ let inDoubleQuote = false;
451
+ let escaped = false;
452
+ const pushCurrent = () => {
453
+ const trimmed = current.trim();
454
+ if (trimmed) {
455
+ tokens.push(trimmed);
456
+ }
457
+ current = '';
458
+ };
459
+ for (let i = 0; i < selector.length; i++) {
460
+ const char = selector[i];
461
+ if (escaped) {
462
+ current += char;
463
+ escaped = false;
464
+ continue;
465
+ }
466
+ if (char === '\\') {
467
+ escaped = true;
468
+ current += char;
469
+ continue;
470
+ }
471
+ if (char === "'" && !inDoubleQuote) {
472
+ inSingleQuote = !inSingleQuote;
473
+ current += char;
474
+ continue;
475
+ }
476
+ if (char === '"' && !inSingleQuote) {
477
+ inDoubleQuote = !inDoubleQuote;
478
+ current += char;
479
+ continue;
480
+ }
481
+ if (!inSingleQuote && !inDoubleQuote) {
482
+ if (char === '(')
483
+ parenDepth++;
484
+ else if (char === ')')
485
+ parenDepth = Math.max(0, parenDepth - 1);
486
+ else if (char === '[')
487
+ bracketDepth++;
488
+ else if (char === ']')
489
+ bracketDepth = Math.max(0, bracketDepth - 1);
490
+ if (parenDepth === 0 && bracketDepth === 0) {
491
+ if (char === '>' || char === '+' || char === '~') {
492
+ pushCurrent();
493
+ tokens.push(char);
494
+ continue;
495
+ }
496
+ if (/\s/.test(char)) {
497
+ pushCurrent();
498
+ while (i + 1 < selector.length && /\s/.test(selector[i + 1])) {
499
+ i++;
500
+ }
501
+ let nextChar = '';
502
+ for (let j = i + 1; j < selector.length; j++) {
503
+ if (!/\s/.test(selector[j])) {
504
+ nextChar = selector[j];
505
+ break;
506
+ }
507
+ }
508
+ const lastToken = tokens[tokens.length - 1];
509
+ const isLastCombinator = lastToken === ' ' || lastToken === '>' || lastToken === '+' || lastToken === '~';
510
+ if (tokens.length > 0 &&
511
+ !isLastCombinator &&
512
+ nextChar &&
513
+ nextChar !== '>' &&
514
+ nextChar !== '+' &&
515
+ nextChar !== '~') {
516
+ tokens.push(' ');
517
+ }
518
+ continue;
519
+ }
520
+ }
521
+ }
522
+ current += char;
523
+ }
524
+ pushCurrent();
525
+ return tokens;
526
+ }
527
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}