@onesy/utils
Version:
98 lines (97 loc) • 4.64 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const is_1 = __importDefault(require("./is"));
const isEnvironment_1 = __importDefault(require("./isEnvironment"));
const try_1 = __importDefault(require("./try"));
function element(value) {
const object = {};
object.value = value;
if ((0, is_1.default)('string', value))
object.value = window.document.querySelector(value);
if (!(0, is_1.default)('element', object.value))
delete object.value;
const matches = (value_ = object.value) => {
const method = (0, is_1.default)('element', value_) && (value_.matches || value_['webkitMatchesSelector'] || value_['mozMatchesSelector'] || value_['oMatchesSelector'] || value_['msMatchesSelector']);
if (!method)
return () => false;
return method.bind(value_);
};
// Parent
object.parent = function () {
if (this.value && (0, isEnvironment_1.default)('browser') && this.value.parentNode)
return this.value.parentNode;
};
// Parents
object.parents = function (selectors, arrayMethod = 'some') {
const parents = [];
let parent = this.value;
while (parent && parent !== document) {
parent = element(parent).parent();
if (parent &&
(!(selectors === null || selectors === void 0 ? void 0 : selectors.length) ||
selectors[arrayMethod] && selectors[arrayMethod](item => (0, try_1.default)(() => matches(parent)(item)))))
parents.push(parent);
}
return parents;
};
// Nearest
object.nearest = function (selectors, arrayMethod = 'some') {
// Value matches
// return itself in that use case
if (!(selectors === null || selectors === void 0 ? void 0 : selectors.length) ||
selectors[arrayMethod] && selectors[arrayMethod](item => (0, try_1.default)(() => matches(this.value)(item))))
return this.value;
let parent = this.value;
while (parent && parent !== document) {
parent = element(parent).parent();
if (parent &&
(!(selectors === null || selectors === void 0 ? void 0 : selectors.length) ||
selectors[arrayMethod] && selectors[arrayMethod](item => (0, try_1.default)(() => matches(parent)(item)))))
return parent;
}
};
// Furthest
object.furthest = function (selectors, arrayMethod = 'some') {
const parents = this.parents(selectors, arrayMethod);
return parents[parents.length - 1];
};
// hasParent
object.hasParent = function (selectors, grandparents = true, arrayMethod = 'some') {
let parent = this.value;
if (!grandparents)
return (!(selectors === null || selectors === void 0 ? void 0 : selectors.length) ||
selectors[arrayMethod] && selectors[arrayMethod](item => (0, try_1.default)(() => matches(this.parent())(item))));
while (parent && parent !== document) {
parent = element(parent).parent();
if (parent &&
(!(selectors === null || selectors === void 0 ? void 0 : selectors.length) ||
selectors[arrayMethod] && selectors[arrayMethod](item => (0, try_1.default)(() => matches(parent)(item)))))
return true;
}
return false;
};
// hasParents
// If unique is true, sort selectors argument by most specifc first
// and lowest specificty last for the most proper result
object.hasParents = function (selectors, unique = true, arrayMethod = 'some') {
if (!(selectors === null || selectors === void 0 ? void 0 : selectors.length))
return !!this.parent();
const parents = this.parents();
return !!(this.value &&
((selectors === null || selectors === void 0 ? void 0 : selectors.length) &&
(selectors[arrayMethod] && selectors[arrayMethod](selector => {
const index = parents.findIndex((item) => (0, is_1.default)('string', selector) ? (0, try_1.default)(() => matches(item)(selector)) : item === selector);
if (index > -1) {
if (unique)
parents.splice(index, 1);
return true;
}
return false;
}))));
};
return object;
}
exports.default = element;