mirror of
https://github.com/github/codeql-action.git
synced 2025-12-27 09:40:17 +08:00
32 lines
783 B
JavaScript
32 lines
783 B
JavaScript
export function isLikeSelector(selector) {
|
|
return selector !== null
|
|
&& typeof selector === 'object'
|
|
&& Reflect.getPrototypeOf(selector) === Object.prototype
|
|
&& Reflect.ownKeys(selector).length > 0;
|
|
}
|
|
|
|
export const CIRCULAR_SELECTOR = new Error('Encountered a circular selector');
|
|
|
|
export function selectComparable(lhs, selector, circular = new Set()) {
|
|
if (circular.has(selector)) {
|
|
throw CIRCULAR_SELECTOR;
|
|
}
|
|
|
|
circular.add(selector);
|
|
|
|
if (lhs === null || typeof lhs !== 'object') {
|
|
return lhs;
|
|
}
|
|
|
|
const comparable = {};
|
|
for (const [key, rhs] of Object.entries(selector)) {
|
|
if (isLikeSelector(rhs)) {
|
|
comparable[key] = selectComparable(Reflect.get(lhs, key), rhs, circular);
|
|
} else {
|
|
comparable[key] = Reflect.get(lhs, key);
|
|
}
|
|
}
|
|
|
|
return comparable;
|
|
}
|