@amplience/dc-cli
Version:
Dynamic Content CLI Tool
185 lines (184 loc) • 6.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseFacet = parseFacet;
exports.parseDateRange = parseDateRange;
exports.relativeDate = relativeDate;
exports.dateRangeMatch = dateRangeMatch;
exports.tryGetArray = tryGetArray;
exports.applyFacet = applyFacet;
exports.withOldFilters = withOldFilters;
const filter_1 = require("./filter");
const regex_1 = require("./regex");
function parseFacet(filter) {
const result = {};
let searchIndex = 0;
while (searchIndex < filter.length) {
const keyEnd = filter.indexOf(':', searchIndex);
if (keyEnd == -1)
break;
const key = filter.substring(searchIndex, keyEnd).trimLeft();
let valueEnd = filter.length;
let valueEndSearch = keyEnd;
while (valueEndSearch < filter.length) {
const potentialValueEnd = filter.indexOf(',', valueEndSearch);
if (potentialValueEnd == -1) {
break;
}
else if (filter[potentialValueEnd - 1] == '\\') {
valueEndSearch = potentialValueEnd + 1;
}
else {
valueEnd = potentialValueEnd;
break;
}
}
const value = filter.substring(keyEnd + 1, valueEnd).replace(/\\\,/g, ',');
result[key] = value;
searchIndex = valueEnd + 1;
}
return result;
}
function parseDateRange(range) {
if (typeof range === 'string') {
switch (range) {
case 'Last 7 days':
return { start: 'NOW', end: '-7:DAYS' };
case 'Last 14 days':
return { start: 'NOW', end: '-14:DAYS' };
case 'Last 30 days':
return { start: 'NOW', end: '-30:DAYS' };
case 'Last 60 days':
return { start: 'NOW', end: '-60:DAYS' };
case 'Over 60 days':
return { start: '-60:DAYS', end: '-100:YEARS' };
default:
throw new Error(`Unexpected date range string: ${range}`);
}
}
return range;
}
function relativeDate(relative) {
if (relative === 'NOW')
return new Date();
const date = new Date();
const split = relative.split(':');
if (split.length != 2) {
throw new Error(`Unexpected relative date format: ${relative}`);
}
const unit = split[1];
switch (unit) {
case 'DAYS':
date.setDate(date.getDate() + Number(split[0]));
return date;
default:
throw new Error(`Unexpected relative date units: ${unit}`);
}
}
function dateRangeMatch(dateString, range) {
const date = new Date(dateString);
range = parseDateRange(range);
const start = relativeDate(range.start);
const end = relativeDate(range.end);
const inverted = start > end;
const lower = inverted ? end : start;
const higher = inverted ? start : end;
return date > lower && date <= higher;
}
function tryGetArray(facetValue, onlyExact) {
if (facetValue == null) {
return null;
}
if ((0, regex_1.isRegexString)(facetValue)) {
const regex = facetValue.substr(1, facetValue.length - 2);
const split = regex.split(/((?:[^\\]|^)(?:\\\\)*)\|/);
for (let i = 0; i < split.length - 1; i++) {
split[i] = split[i] + split[i + 1];
split.splice(i + 1, 1);
}
const result = [];
for (let item of split) {
if (item.length > 2) {
const start = item[0];
const end = item[item.length - 1];
if ((start === '^' && end === '$') || (start === '(' && end === ')')) {
if (onlyExact && start !== '^') {
return null;
}
item = item.substr(1, item.length - 2);
}
else if (onlyExact) {
return null;
}
}
else if (onlyExact) {
return null;
}
if (!(0, regex_1.hasRegexSpecialCharacter)(item)) {
item = (0, regex_1.removeEscapes)(item);
}
else {
return null;
}
result.push(item);
}
return result;
}
return [facetValue];
}
function applyFacet(items, facetOrString) {
let facet;
if (typeof facetOrString === 'string') {
facet = parseFacet(facetOrString);
}
else {
facet = facetOrString;
}
return items.filter(item => {
if (facet.locale && (!item.locale || !(0, filter_1.equalsOrRegex)(item.locale, facet.locale)))
return false;
if (facet.name && !(0, filter_1.equalsOrRegex)(item.label, facet.name))
return false;
if (facet.schema &&
!(0, filter_1.equalsOrRegex)(item.schema || item.body._meta.schema, facet.schema))
return false;
if (facet.status && !(0, filter_1.equalsOrRegex)(item.status, facet.status))
return false;
if (facet.lastModifiedDate && !dateRangeMatch(item.lastModifiedDate, facet.lastModifiedDate))
return false;
return true;
});
}
function escapeForRegex(url) {
return url.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function combineFilters(filters) {
if (!Array.isArray(filters)) {
return filters;
}
const regexElements = [];
for (const filter of filters) {
if (filter.length > 2 && filter[0] === '/' && filter[filter.length - 1] === '/') {
regexElements.push(`(${filter.substr(1, filter.length - 2)})`);
}
else {
regexElements.push(`^${escapeForRegex(filter)}$`);
}
}
return `/${regexElements.join('|')}/`;
}
function getOldFilter(filters, name) {
return `${name}:${combineFilters(filters)}`;
}
function withOldFilters(facet, args) {
if (facet || !(args.name || args.schemaId)) {
return facet;
}
const resultFilters = [];
if (args.name) {
resultFilters.push(getOldFilter(args.name, 'name'));
}
if (args.schemaId) {
resultFilters.push(getOldFilter(args.schemaId, 'schema'));
}
return resultFilters.map(filter => filter.replace(/\,/g, '\\,')).join(',');
}