Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
65 lines
1.5 KiB
Text
65 lines
1.5 KiB
Text
/**
|
|
* @license
|
|
* Copyright 2022 Google Inc.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
export const pierceQuerySelector = (
|
|
root: Node,
|
|
selector: string,
|
|
): Element | null => {
|
|
let found: Node | null = null;
|
|
const search = (root: Node) => {
|
|
const iter = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
|
|
do {
|
|
const currentNode = iter.currentNode as Element;
|
|
if (currentNode.shadowRoot) {
|
|
search(currentNode.shadowRoot);
|
|
}
|
|
if (currentNode instanceof ShadowRoot) {
|
|
continue;
|
|
}
|
|
if (currentNode !== root && !found && currentNode.matches(selector)) {
|
|
found = currentNode;
|
|
}
|
|
} while (!found && iter.nextNode());
|
|
};
|
|
if (root instanceof Document) {
|
|
root = root.documentElement;
|
|
}
|
|
search(root);
|
|
return found;
|
|
};
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
export const pierceQuerySelectorAll = (
|
|
element: Node,
|
|
selector: string,
|
|
): Element[] => {
|
|
const result: Element[] = [];
|
|
const collect = (root: Node) => {
|
|
const iter = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
|
|
do {
|
|
const currentNode = iter.currentNode as Element;
|
|
if (currentNode.shadowRoot) {
|
|
collect(currentNode.shadowRoot);
|
|
}
|
|
if (currentNode instanceof ShadowRoot) {
|
|
continue;
|
|
}
|
|
if (currentNode !== root && currentNode.matches(selector)) {
|
|
result.push(currentNode);
|
|
}
|
|
} while (iter.nextNode());
|
|
};
|
|
if (element instanceof Document) {
|
|
element = element.documentElement;
|
|
}
|
|
collect(element);
|
|
return result;
|
|
};
|