n8n-nodes-base
Version:
Base nodes of n8n
213 lines • 8.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultEndDate = exports.defaultStartDate = void 0;
exports.simplify = simplify;
exports.merge = merge;
exports.simplifyGA4 = simplifyGA4;
exports.processFilters = processFilters;
exports.prepareDateRange = prepareDateRange;
exports.checkDuplicates = checkDuplicates;
exports.sortLoadOptions = sortLoadOptions;
const luxon_1 = require("luxon");
const n8n_workflow_1 = require("n8n-workflow");
// tslint:disable-next-line:no-any
function simplify(responseData) {
const returnData = [];
for (const { columnHeader: { dimensions, metricHeader }, data: { rows }, } of responseData) {
if (rows === undefined) {
// Do not error if there is no data
continue;
}
const metrics = metricHeader.metricHeaderEntries.map((entry) => entry.name);
for (const row of rows) {
const rowDimensions = {};
const rowMetrics = {};
if (dimensions) {
for (let i = 0; i < dimensions.length; i++) {
rowDimensions[dimensions[i]] = row.dimensions[i];
for (const [index, metric] of metrics.entries()) {
rowMetrics[metric] = row.metrics[0].values[index];
}
}
}
else {
for (const [index, metric] of metrics.entries()) {
rowMetrics[metric] = row.metrics[0].values[index];
}
}
returnData.push({ ...rowDimensions, ...rowMetrics });
}
}
return returnData;
}
// tslint:disable-next-line:no-any
function merge(responseData) {
const response = {
columnHeader: responseData[0].columnHeader,
data: responseData[0].data,
};
const allRows = [];
for (const { data: { rows }, } of responseData) {
allRows.push(...rows);
}
response.data.rows = allRows;
return [response];
}
function simplifyGA4(response) {
if (!response.rows)
return [];
const dimensionHeaders = (response.dimensionHeaders || []).map((header) => header.name);
const metricHeaders = (response.metricHeaders || []).map((header) => header.name);
const returnData = [];
response.rows.forEach((row) => {
if (!row)
return;
const rowDimensions = {};
const rowMetrics = {};
dimensionHeaders.forEach((dimension, index) => {
rowDimensions[dimension] = row.dimensionValues[index].value;
});
metricHeaders.forEach((metric, index) => {
rowMetrics[metric] = row.metricValues[index].value;
});
returnData.push({ ...rowDimensions, ...rowMetrics });
});
return returnData;
}
function processFilters(expression) {
const processedFilters = [];
Object.entries(expression).forEach((entry) => {
const [filterType, filters] = entry;
filters.forEach((filter) => {
let fieldName = '';
switch (filter.listName) {
case 'other':
fieldName = filter.name;
delete filter.name;
break;
case 'custom':
fieldName = filter.name;
delete filter.name;
break;
default:
fieldName = filter.listName;
}
delete filter.listName;
if (filterType === 'inListFilter') {
filter.values = filter.values.split(',');
}
if (filterType === 'numericFilter') {
filter.value = {
[filter.valueType]: filter.value,
};
delete filter.valueType;
}
if (filterType === 'betweenFilter') {
filter.fromValue = {
[filter.valueType]: filter.fromValue,
};
filter.toValue = {
[filter.valueType]: filter.toValue,
};
delete filter.valueType;
}
processedFilters.push({
filter: {
fieldName,
[filterType]: filter,
},
});
});
});
return processedFilters;
}
function prepareDateRange(period, itemIndex) {
const dateRanges = [];
switch (period) {
case 'today':
dateRanges.push({
startDate: luxon_1.DateTime.local().startOf('day').toISODate(),
endDate: luxon_1.DateTime.now().toISODate(),
});
break;
case 'yesterday':
dateRanges.push({
startDate: luxon_1.DateTime.local().startOf('day').minus({ days: 1 }).toISODate(),
endDate: luxon_1.DateTime.local().endOf('day').minus({ days: 1 }).toISODate(),
});
break;
case 'lastCalendarWeek':
const begginingOfLastWeek = luxon_1.DateTime.local().startOf('week').minus({ weeks: 1 }).toISODate();
const endOfLastWeek = luxon_1.DateTime.local().endOf('week').minus({ weeks: 1 }).toISODate();
dateRanges.push({
startDate: begginingOfLastWeek,
endDate: endOfLastWeek,
});
break;
case 'lastCalendarMonth':
const begginingOfLastMonth = luxon_1.DateTime.local()
.startOf('month')
.minus({ months: 1 })
.toISODate();
const endOfLastMonth = luxon_1.DateTime.local().endOf('month').minus({ months: 1 }).toISODate();
dateRanges.push({
startDate: begginingOfLastMonth,
endDate: endOfLastMonth,
});
break;
case 'last7days':
dateRanges.push({
startDate: luxon_1.DateTime.now().minus({ days: 7 }).toISODate(),
endDate: luxon_1.DateTime.now().toISODate(),
});
break;
case 'last30days':
dateRanges.push({
startDate: luxon_1.DateTime.now().minus({ days: 30 }).toISODate(),
endDate: luxon_1.DateTime.now().toISODate(),
});
break;
case 'custom':
const start = luxon_1.DateTime.fromISO(this.getNodeParameter('startDate', itemIndex, ''));
const end = luxon_1.DateTime.fromISO(this.getNodeParameter('endDate', itemIndex, ''));
if (start > end) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Parameter Start: ${start.toISO()} cannot be after End: ${end.toISO()}`);
}
dateRanges.push({
startDate: start.toISODate(),
endDate: end.toISODate(),
});
break;
default:
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `The period '${period}' is not supported, to specify own period use 'custom' option`);
}
return dateRanges;
}
const defaultStartDate = () => luxon_1.DateTime.now().startOf('day').minus({ days: 8 }).toISO();
exports.defaultStartDate = defaultStartDate;
const defaultEndDate = () => luxon_1.DateTime.now().startOf('day').minus({ days: 1 }).toISO();
exports.defaultEndDate = defaultEndDate;
function checkDuplicates(data, key, type) {
const fields = data.map((item) => item[key]);
const duplicates = fields.filter((field, i) => fields.indexOf(field) !== i);
const unique = Array.from(new Set(duplicates));
if (unique.length) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `A ${type} is specified more than once (${unique.join(', ')})`);
}
}
function sortLoadOptions(data) {
const returnData = [...data];
returnData.sort((a, b) => {
const aName = a.name.toLowerCase();
const bName = b.name.toLowerCase();
if (aName < bName) {
return -1;
}
if (aName > bName) {
return 1;
}
return 0;
});
return returnData;
}
//# sourceMappingURL=utils.js.map