UNPKG

@gent-js/gent

Version:

template-based data generator.

83 lines (82 loc) 2.89 kB
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; } }