Spaces:
Build error
Build error
File size: 2,132 Bytes
d9494a5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | import { evalFromContext } from '@/utils/evalFromContext';
import { isDefined } from '@/utils/validation';
const isString = (value: unknown): value is string => {
return typeof value === 'string';
};
const VARIABLE_PATTERN = RegExp('\\{\\{([^{}]+)\\}\\}', 'g');
export const resolveInput = (
unresolvedInput: unknown,
context: Record<string, unknown>,
): unknown => {
if (!isDefined(unresolvedInput)) {
return unresolvedInput;
}
if (isString(unresolvedInput)) {
return resolveString(unresolvedInput, context);
}
if (Array.isArray(unresolvedInput)) {
return resolveArray(unresolvedInput, context);
}
if (typeof unresolvedInput === 'object' && unresolvedInput !== null) {
return resolveObject(unresolvedInput, context);
}
return unresolvedInput;
};
const resolveArray = (
input: unknown[],
context: Record<string, unknown>,
): unknown[] => {
const resolvedArray = input;
for (let i = 0; i < input.length; ++i) {
resolvedArray[i] = resolveInput(input[i], context);
}
return resolvedArray;
};
const resolveObject = (
input: object,
context: Record<string, unknown>,
): object => {
return Object.entries(input).reduce<Record<string, unknown>>(
(resolvedObject, [key, value]) => {
const resolvedKey = resolveInput(key, context);
resolvedObject[
typeof resolvedKey === 'string' ? resolvedKey : String(resolvedKey)
] = resolveInput(value, context);
return resolvedObject;
},
{},
);
};
const resolveString = (
input: string,
context: Record<string, unknown>,
): string => {
const matchedTokens = input.match(VARIABLE_PATTERN);
if (!matchedTokens || matchedTokens.length === 0) {
return input;
}
if (matchedTokens.length === 1 && matchedTokens[0] === input) {
return evalFromContext(input, context);
}
return input.replace(VARIABLE_PATTERN, (matchedToken, _) => {
const processedToken = evalFromContext(matchedToken, context);
if (typeof processedToken === 'object' && processedToken !== null) {
return JSON.stringify(processedToken);
}
return processedToken;
});
};
|