Skip to content

Commit

Permalink
Add setData helper (mockoon#1531)
Browse files Browse the repository at this point in the history
  • Loading branch information
255kb authored Oct 4, 2024
1 parent ea2695b commit 5637145
Show file tree
Hide file tree
Showing 3 changed files with 616 additions and 13 deletions.
133 changes: 120 additions & 13 deletions packages/commons-server/src/libs/templating-helpers/data-helpers.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
import { ProcessedDatabucket } from '@mockoon/commons';
import { SafeString } from 'handlebars';
import { fromSafeString, getValueFromPath } from '../utils';
import {
del as objectDel,
get as objectGet,
push as objectPush,
set as objectSet
} from 'object-path';
import { convertPathToArray, fromSafeString, getValueFromPath } from '../utils';

const getDataBucket = function (
processedDatabuckets: ProcessedDatabucket[],
dataBucketName: string
) {
return processedDatabuckets.find(
(databucket) =>
databucket.id === dataBucketName ||
databucket.name.toLowerCase().includes(dataBucketName.toLowerCase())
);
};

export const DataHelpers = function (
processedDatabuckets: ProcessedDatabucket[]
Expand All @@ -9,15 +26,14 @@ export const DataHelpers = function (
data: function (...args: any[]) {
const parameters = args.slice(0, -1);

if (parameters.length <= 0) {
// at least the databucket name/id is required
if (parameters.length < 1) {
return;
}

const targetInfo = parameters[0];
const targetDatabucket = processedDatabuckets.find(
(databucket) =>
databucket.id === targetInfo ||
databucket.name.toLowerCase().includes(targetInfo.toLowerCase())
const targetDatabucket = getDataBucket(
processedDatabuckets,
fromSafeString(parameters[0])
);

if (targetDatabucket === undefined) {
Expand All @@ -39,15 +55,14 @@ export const DataHelpers = function (
dataRaw: function (...args: any[]) {
const parameters = args.slice(0, -1);

if (parameters.length <= 0) {
// at least the databucket name/id is required
if (parameters.length < 1) {
return;
}

const targetInfo = parameters[0];
const targetDatabucket = processedDatabuckets.find(
(databucket) =>
databucket.id === targetInfo ||
databucket.name.toLowerCase().includes(targetInfo.toLowerCase())
const targetDatabucket = getDataBucket(
processedDatabuckets,
fromSafeString(parameters[0])
);

if (targetDatabucket === undefined) {
Expand All @@ -59,6 +74,98 @@ export const DataHelpers = function (
fromSafeString(parameters[1]),
''
);
},
/**
* Update a databucket value
*
* Expect the following parameters:
* - operator, default is 'set', can be 'push', 'del', 'inc', 'dec', 'invert'
* - databucket name/id
* - path to the value to update, keep empty or null to replace the whole databucket value
* - value to set
* @param args
* @returns
*/
setData: function (...args: any[]) {
const parameters = args.slice(0, -1);

// at least the operator, databucket name/id, path and values can be ommited, especially for del and invert
if (parameters.length < 2) {
return;
}

const operators = ['push', 'del', 'inc', 'dec', 'invert', 'set'];
let operator = String(fromSafeString(parameters[0]));

// default operator is 'set'
if (!operators.includes(operator)) {
operator = 'set';
}

const targetDatabucket = getDataBucket(
processedDatabuckets,
fromSafeString(parameters[1])
);

if (targetDatabucket === undefined) {
return;
}

const path = convertPathToArray(
String(fromSafeString(parameters[2]) ?? '')
);
// new value can be of any type
const newValue = fromSafeString(parameters[3]);

if (operator === 'set') {
if (path) {
objectSet(targetDatabucket.value, path, newValue);
} else {
targetDatabucket.value = newValue;
}
} else if (operator === 'push') {
if (path && Array.isArray(objectGet(targetDatabucket.value, path))) {
objectPush(targetDatabucket.value, path, newValue);
} else if (!path && Array.isArray(targetDatabucket.value)) {
targetDatabucket.value.push(newValue);
}
} else if (operator === 'del') {
if (path) {
objectDel(targetDatabucket.value, path);
} else {
targetDatabucket.value = undefined;
}
} else if (
(operator === 'inc' || operator === 'dec') &&
(!newValue || !isNaN(Number(newValue)))
) {
const newValueNum = Number(newValue);
if (path && !isNaN(Number(objectGet(targetDatabucket.value, path)))) {
objectSet(
targetDatabucket.value,
path,
Number(objectGet(targetDatabucket.value, path)) +
(newValueNum ? newValueNum : 1) * (operator === 'inc' ? 1 : -1)
);
} else if (!path && !isNaN(Number(targetDatabucket.value))) {
targetDatabucket.value =
Number(targetDatabucket.value) +
(newValueNum ? newValueNum : 1) * (operator === 'inc' ? 1 : -1);
}
} else if (operator === 'invert') {
if (
path &&
typeof objectGet(targetDatabucket.value, path) === 'boolean'
) {
objectSet(
targetDatabucket.value,
path,
!objectGet(targetDatabucket.value, path)
);
} else if (!path && typeof targetDatabucket.value === 'boolean') {
targetDatabucket.value = !targetDatabucket.value;
}
}
}
};

Expand Down
Loading

0 comments on commit 5637145

Please sign in to comment.