UNPKG

@quenty/nevermore-template-helpers

Version:

Helpers to generate Nevermore package and game templates

111 lines (99 loc) 3.33 kB
/** * Helps with directory template creation */ import * as path from 'path'; import * as fs from 'fs'; import * as Handlebars from 'handlebars'; import * as util from 'util'; import { OutputHelper } from '@quenty/cli-output-helpers'; const existsAsync = util.promisify(fs.exists); /** * Helper class for handling folder templates */ export class TemplateHelper { /** * Makes the string upper camel case */ public static camelize(str: string): string { return str .replace(/-./g, (x) => x[1].toUpperCase()) .replace(/(?:^\w|[A-Z]|\b\w)/g, function (word: string, index: number) { return word.toUpperCase(); }) .replace(/\s+/g, ''); } /** * Ensures a folder exists or specifies a dryrun */ public static async ensureFolderAsync( folderName: string, dryrun: boolean ): Promise<void> { if (dryrun) { OutputHelper.info(`[DRYRUN]: Write folder ${folderName}`); } else { await fs.promises.mkdir(folderName); } } /** * Converts a template into a directory while replacing components with different names. */ public static async createDirectoryContentsAsync( templatePath: string, targetPath: string, input: any, dryrun: boolean ): Promise<void> { // read all files/folders (1 level) from template folder const filesToCreate = await fs.promises.readdir(templatePath); for (const originalName of filesToCreate) { const origFilePath = path.join(templatePath, originalName); if (originalName == 'ENSURE_FOLDER_CREATED') { continue; } const compiledName = (Handlebars as any).default.compile(originalName); let newName = compiledName(input); if (newName == 'gitignore') { newName = '.gitignore'; } const stats = await fs.promises.stat(origFilePath); if (stats.isFile()) { // read file content and transform it using template engine const contents = await fs.promises.readFile(origFilePath, 'utf8'); const compiled = (Handlebars as any).default.compile(contents); const result = compiled(input); const newFilePath = path.join(targetPath, newName); if (dryrun) { OutputHelper.info(`[DRYRUN]: Write file ${newFilePath}`); console.log(`${result}`); } else { if (!(await existsAsync(newFilePath))) { await fs.promises.writeFile(newFilePath, result, 'utf8'); OutputHelper.info(`Created '${newFilePath}'`); } else { OutputHelper.error( `File already exists ${newFilePath} will not overwrite` ); } } } else if (stats.isDirectory()) { const newDirPath = path.join(targetPath, originalName); if (dryrun) { OutputHelper.info(`[DRYRUN]: Write folder ${newDirPath}`); } else { // create folder in destination folder if (!(await existsAsync(newDirPath))) { await fs.promises.mkdir(newDirPath); } } // copy files/folder inside current folder recursively await TemplateHelper.createDirectoryContentsAsync( path.join(templatePath, originalName), path.join(targetPath, newName), input, dryrun ); } } } }