jsonblade
Version:
A powerful and modular JSON template engine with extensible filters
104 lines • 3.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.arrayFilters = void 0;
exports.registerArrayFilters = registerArrayFilters;
const filter_registry_1 = require("../filter-registry");
const arrayFilters = {
join: (v, ...args) => {
const separator = args[0] || ",";
return Array.isArray(v) ? v.join(separator) : String(v);
},
length: (v) => {
if (Array.isArray(v) || typeof v === "string")
return v.length;
if (v && typeof v === "object")
return Object.keys(v).length;
return 0;
},
first: (v) => {
if (Array.isArray(v))
return v[0];
if (typeof v === "string")
return v.charAt(0);
return null;
},
last: (v) => {
if (Array.isArray(v))
return v[v.length - 1];
if (typeof v === "string")
return v.charAt(v.length - 1);
return null;
},
map: (v, ...args) => {
if (!Array.isArray(v))
return v;
const prop = args[0];
return v.map((item) => {
if (item && typeof item === "object" && prop) {
return item[prop];
}
return item;
});
},
filter: (v, ...args) => {
if (!Array.isArray(v))
return v;
const [prop, val] = args;
if (!prop)
return v;
return v.filter((item) => {
if (item && typeof item === "object") {
const itemVal = item[prop];
// Handle boolean comparisons
if (val === "true")
return itemVal === true;
if (val === "false")
return itemVal === false;
if (val === true)
return itemVal === true;
if (val === false)
return itemVal === false;
// Handle numeric comparisons
if (!isNaN(Number(val)) && !isNaN(Number(itemVal))) {
return Number(itemVal) === Number(val);
}
// Handle direct equality
return itemVal === val;
}
return item === prop;
});
},
reverse: (v) => {
if (Array.isArray(v))
return [...v].reverse();
if (typeof v === "string")
return v.split("").reverse().join("");
return v;
},
sort: (v, ...args) => {
if (!Array.isArray(v))
return v;
const prop = args[0];
const sortedArray = [...v];
if (prop) {
return sortedArray.sort((a, b) => {
const aVal = a && typeof a === "object" ? a[prop] : a;
const bVal = b && typeof b === "object" ? b[prop] : b;
return aVal > bVal ? 1 : aVal < bVal ? -1 : 0;
});
}
return sortedArray.sort();
},
unique: (v) => {
if (!Array.isArray(v))
return v;
return [...new Set(v)];
},
};
exports.arrayFilters = arrayFilters;
function registerArrayFilters() {
Object.entries(arrayFilters).forEach(([name, fn]) => {
(0, filter_registry_1.registerFilter)(name, fn);
});
}
//# sourceMappingURL=array-filters.js.map