object-replace-mustache
Version:
replace placeholders of an object with a view like you would use mustache.render for strings
49 lines (44 loc) • 1.21 kB
text/typescript
import { isPlainObject } from "./utils";
import { replaceString } from "./replace-string";
export interface ObjectReplaceOptions {
/**
* The delimiters to use for replacing.
*
* @default ["{{", "}}"]
*/
delimiters?: [string, string];
/**
* Whether to throw or ignore errors.
*
* @default "ignore"
*/
handleError?: "throw" | "ignore";
}
export const replace = <T extends Record<string, any>>(
item: T,
view: Record<string, any>,
options?: ObjectReplaceOptions,
): Record<string, any> => {
return recursiveReplace(item, view, options);
};
const recursiveReplace = <T>(
item: T,
view: Record<string, any>,
options?: ObjectReplaceOptions,
): any => {
if (typeof item === "string") {
return replaceString(item, view, {
delimiters: options?.delimiters ?? ["{{", "}}"],
handleError: options?.handleError ?? "ignore",
});
} else if (isPlainObject(item)) {
const result: Record<string, any> = {};
for (const key in item) {
result[key] = recursiveReplace(item[key], view);
}
return result;
} else if (Array.isArray(item)) {
return [...item.map((subItem) => recursiveReplace(subItem, view))];
}
return item;
};