UNPKG

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
"use strict"; 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)); }