@ztl-uwu/nuxt-content
Version:
Write your content inside your Nuxt app
66 lines (65 loc) • 2.35 kB
JavaScript
export const get = (obj, path) => path.split(".").reduce((acc, part) => acc && acc[part], obj);
const _pick = (obj, condition) => Object.keys(obj).filter(condition).reduce((newObj, key) => Object.assign(newObj, { [key]: obj[key] }), {});
export const pick = (keys) => (obj) => keys && keys.length ? _pick(obj, (key) => keys.includes(key)) : obj;
export const omit = (keys) => (obj) => keys && keys.length ? _pick(obj, (key) => !keys.includes(key)) : obj;
export const apply = (fn) => (data) => Array.isArray(data) ? data.map((item) => fn(item)) : fn(data);
export const detectProperties = (keys) => {
const prefixes = [];
const properties = [];
for (const key of keys) {
if (["$", "_"].includes(key)) {
prefixes.push(key);
} else {
properties.push(key);
}
}
return { prefixes, properties };
};
export const withoutKeys = (keys = []) => (obj) => {
if (keys.length === 0 || !obj) {
return obj;
}
const { prefixes, properties } = detectProperties(keys);
return _pick(obj, (key) => !properties.includes(key) && !prefixes.includes(key[0]));
};
export const withKeys = (keys = []) => (obj) => {
if (keys.length === 0 || !obj) {
return obj;
}
const { prefixes, properties } = detectProperties(keys);
return _pick(obj, (key) => properties.includes(key) || prefixes.includes(key[0]));
};
export const sortList = (data, params) => {
const comperable = new Intl.Collator(params.$locale, {
numeric: params.$numeric,
caseFirst: params.$caseFirst,
sensitivity: params.$sensitivity
});
const keys = Object.keys(params).filter((key) => !key.startsWith("$"));
for (const key of keys) {
data = data.sort((a, b) => {
const values = [get(a, key), get(b, key)].map((value) => {
if (value === null) {
return void 0;
}
if (value instanceof Date) {
return value.toISOString();
}
return value;
});
if (params[key] === -1) {
values.reverse();
}
return comperable.compare(values[0], values[1]);
});
}
return data;
};
export const assertArray = (value, message = "Expected an array") => {
if (!Array.isArray(value)) {
throw new TypeError(message);
}
};
export const ensureArray = (value) => {
return Array.isArray(value) ? value : [void 0, null].includes(value) ? [] : [value];
};