Add sanitation of macro values

This commit is contained in:
Cohee 2024-06-25 22:15:40 +03:00
parent 01d38f9218
commit 24ae2b6fa6
1 changed files with 24 additions and 2 deletions

View File

@ -42,7 +42,8 @@ export class MacrosParser {
}
if (typeof value !== 'string' && typeof value !== 'function') {
throw new Error('Macro value must be a string or a function that returns a string');
console.warn(`Macro value for "${key}" will be converted to a string`);
value = this.sanitizeMacroValue(value);
}
if (this.#macros.has(key)) {
@ -72,6 +73,27 @@ export class MacrosParser {
env[key] = value;
}
}
/**
* Performs a type-check on the macro value and returns a sanitized version of it.
* @param {any} value Value returned by a macro
* @returns {string} Sanitized value
*/
static sanitizeMacroValue(value) {
if (typeof value === 'string') {
return value;
}
if (value === null || value === undefined) {
return '';
}
if (typeof value === 'object') {
return JSON.stringify(value);
}
return String(value);
}
}
/**
@ -384,7 +406,7 @@ export function evaluateMacros(content, env) {
if (!Object.hasOwn(env, varName)) continue;
const param = env[varName];
const value = typeof param === 'function' ? param() : param;
const value = MacrosParser.sanitizeMacroValue(typeof param === 'function' ? param() : param);
content = content.replace(new RegExp(`{{${escapeRegex(varName)}}}`, 'gi'), value);
}