@gent-js/gent
Version:
template-based data generator.
83 lines (82 loc) • 2.89 kB
JavaScript
import { faker } from "@faker-js/faker";
import { parseNonNaNInteger, parseString } from "../../utils.js";
import { GlobalOption_Escape, GlobalOption_Variations } from "../consts.js";
import { isEscapeStyle } from "../utils.js";
class CommandManagerImpl {
commandMap = new Map();
setCommand(command) {
this.commandMap.set(command.name, command);
return this;
}
getCommand(commandName) {
const command = this.commandMap.get(commandName);
if (command !== undefined) {
return command;
}
return createUnsupportedCommand(commandName);
}
getCommandContextualStringOut(commandName, commandOptions, documentOptions) {
const staticOrNormalCommand = this.getCommand(commandName);
let contextualStringOut;
if ("build" in staticOrNormalCommand) {
contextualStringOut = staticOrNormalCommand.build(commandOptions, documentOptions);
}
else {
contextualStringOut = staticOrNormalCommand.run;
}
// process global options
const variations = parseNonNaNInteger(commandOptions?.[GlobalOption_Variations]);
if (variations !== undefined) {
contextualStringOut = createVariationStringOut(contextualStringOut, variations);
}
const escape = parseString(commandOptions?.[GlobalOption_Escape]);
if (isEscapeStyle(escape)) {
contextualStringOut = createEscapeStringOut(contextualStringOut, escape);
}
return contextualStringOut;
}
}
export const commandManager = new CommandManagerImpl();
function createUnsupportedCommand(commandName) {
return {
name: commandName,
run: () => {
return "{{UNSUPPORTED_COMMAND}}";
},
};
}
function createVariationStringOut(baseContextualStringOut, variations) {
const valueArray = [];
const maxIndex = variations - 1;
return (context) => {
const index = faker.number.int({
min: 0,
max: maxIndex,
});
let value = valueArray[index];
if (value === undefined) {
value = baseContextualStringOut(context);
if (valueArray.length < variations) {
if (!valueArray.includes(value)) {
valueArray.push(value);
}
}
}
return value;
};
}
function createEscapeStringOut(baseContextualStringOut, style) {
if (style === "json") {
return (context) => JSON.stringify(baseContextualStringOut(context));
}
else if (style === "doubleQuote") {
return (context) => {
const output = baseContextualStringOut(context);
return `"${output.replaceAll('"', '""')}"`;
};
}
else {
console.log(`unsupported escape style: ${style}`);
return baseContextualStringOut;
}
}