json-property-filter
Version:
JavaScript library and application to filter a JSON object by including and excluding properties.
68 lines (67 loc) • 3.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.filter = exports.extract = void 0;
var util = require("./util");
var debug_1 = require("debug");
var log = debug_1.default("json-property-filter:exclusion");
function extract(filters) {
debug_1.default("Extract filters");
var extractDebug = log.extend("extract");
var exclusionFilters = [];
for (var i = filters.length; i--;) {
var value = filters[i];
var firstCharacter = value[0];
if (value.length && firstCharacter === "-") {
extractDebug("Extracting filter: %s", value);
var filterWithoutSymbol = firstCharacter === "-" ? value.substring(1) : value;
exclusionFilters.push(filterWithoutSymbol);
}
}
return exclusionFilters;
}
exports.extract = extract;
function filter(source, filters) {
log("Apply filters: %o", filters);
var destination = Array.isArray(source) ? [] : {};
apply(source, filters, destination, util.EMPTY_CONTEXT);
return destination;
}
exports.filter = filter;
function apply(source, filters, destination, context) {
var applyDebug = log.extend(context.absolutePath);
for (var propertyName in source) {
if (source.hasOwnProperty(propertyName)) {
applyDebug("Read property: %s", propertyName);
var propertyValue = source[propertyName];
if (!isFiltered(filters, context, propertyName)) {
var value = source[propertyName];
if (typeof propertyValue === "object") {
var newContext = util.createContext(context, source, propertyName);
value = Array.isArray(propertyValue) ? [] : {};
apply(propertyValue, filters, value, newContext);
}
applyDebug("Add property: %s", propertyName);
var index = +propertyName;
if (Array.isArray(destination) && !isNaN(index)) {
destination.splice(index, 0, value);
}
else {
destination[propertyName] = value;
}
}
}
}
}
function isFiltered(filters, context, propertyName) {
var expectedRootPropertiesFilter = context.relativePath !== "" ? context.relativePath + ".*" : "*";
var expectedAllPropertiesFilter = context.relativePath !== "" ? context.relativePath + ".**" : "**";
var relativePath = context.relativePath ? context.relativePath + "." + propertyName : propertyName;
var segments = context.segments ? context.segments.concat(propertyName) : [propertyName];
var absolutePath = segments.join(".");
return (filters.includes(absolutePath) ||
filters.includes(relativePath) ||
filters.includes(context.absolutePath) ||
filters.includes(context.relativePath) ||
filters.includes(expectedAllPropertiesFilter) ||
filters.includes(expectedRootPropertiesFilter));
}