@prismicio/client
Version:
The official JavaScript + TypeScript client library for Prismic
104 lines (102 loc) • 3.3 kB
JavaScript
//#region src/filter.ts
/**
* Formats the value of a filter element to a stringified version accepted by
* the Prismic REST API.
*
* @param value - Value to format.
*
* @returns `value` formatted for the Prismic REST API.
*/
const formatValue = (value) => {
if (Array.isArray(value)) return `[${value.map(formatValue).join(", ")}]`;
if (typeof value === "string") return `"${value.replace(/"/g, "\\\"")}"`;
if (value instanceof Date) return `${value.getTime()}`;
return `${value}`;
};
/**
* Creates a filter builder function for filters with a path and arguments.
*
* @typeParam Args - Arguments for the filter.
*
* @param name - Name of the filter used in the resulting string.
*
* @returns Filter builder function for the given name.
*/
const pathWithArgsFilter = (name) => {
/**
* @param path - Path to the value to be compared.
*/
const fn = (path, ...args) => {
const formattedArgs = args.map(formatValue).join(", ");
return `[${name}(${path}${path && args.length ? ", " : ""}${formattedArgs})]`;
};
return fn;
};
/**
* Creates a filter builder function for filters with only a path.
*
* @param name - Name of the filter used in the resulting string.
*
* @returns Filter builder function for the given name.
*/
const pathFilter = (name) => {
const filterFn = pathWithArgsFilter(name);
/**
* @param path - Path for the filter.
*/
const fn = (path) => {
return filterFn(path);
};
return fn;
};
/**
* Creates a filter builder function for filters with only arguments and no
* path.
*
* @param name - Name of the filter used in the resulting string.
*
* @returns Filter builder function for the given name.
*/
const argsFilter = (name) => {
const filterFn = pathWithArgsFilter(name);
/**
* @param args - Arguments for the filter.
*/
const fn = (...args) => {
return filterFn("", ...args);
};
return fn;
};
const filter = {
at: pathWithArgsFilter("at"),
not: pathWithArgsFilter("not"),
any: pathWithArgsFilter("any"),
in: pathWithArgsFilter("in"),
fulltext: pathWithArgsFilter("fulltext"),
has: pathFilter("has"),
missing: pathFilter("missing"),
similar: argsFilter("similar"),
geopointNear: pathWithArgsFilter("geopoint.near"),
numberLessThan: pathWithArgsFilter("number.lt"),
numberGreaterThan: pathWithArgsFilter("number.gt"),
numberInRange: pathWithArgsFilter("number.inRange"),
dateAfter: pathWithArgsFilter("date.after"),
dateBefore: pathWithArgsFilter("date.before"),
dateBetween: pathWithArgsFilter("date.between"),
dateDayOfMonth: pathWithArgsFilter("date.day-of-month"),
dateDayOfMonthAfter: pathWithArgsFilter("date.day-of-month-after"),
dateDayOfMonthBefore: pathWithArgsFilter("date.day-of-month-before"),
dateDayOfWeek: pathWithArgsFilter("date.day-of-week"),
dateDayOfWeekAfter: pathWithArgsFilter("date.day-of-week-after"),
dateDayOfWeekBefore: pathWithArgsFilter("date.day-of-week-before"),
dateMonth: pathWithArgsFilter("date.month"),
dateMonthAfter: pathWithArgsFilter("date.month-after"),
dateMonthBefore: pathWithArgsFilter("date.month-before"),
dateYear: pathWithArgsFilter("date.year"),
dateHour: pathWithArgsFilter("date.hour"),
dateHourAfter: pathWithArgsFilter("date.hour-after"),
dateHourBefore: pathWithArgsFilter("date.hour-before")
};
//#endregion
exports.filter = filter;
//# sourceMappingURL=filter.cjs.map