UNPKG

nope-js-node

Version:

NoPE Runtime for Nodejs. For Browser-Support please use nope-browser

263 lines (262 loc) 11.5 kB
"use strict"; /** * Helper file to perform all releated task to create a project, * add services and modules to it. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.addModuleToProject = exports.addServiceToProject = exports.createProject = exports.generateDefaultProject = void 0; const index_nodejs_1 = require("../helpers/index.nodejs"); const promises_1 = require("fs/promises"); const fs_1 = require("fs"); const path_1 = require("path"); const handlebars = require("handlebars"); const fs_2 = require("fs"); const index_browser_1 = require("../index.browser"); const simple_git_1 = require("simple-git"); const dirName = (0, path_1.join)(__dirname, "..", "..", "lib", "templates"); const INSERT_MARKER = " !! Insert-Marker: Don't remove this line !!"; const packageDirName = (0, path_1.join)(__dirname, "..", ".."); const packageJson = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(packageDirName, "package.json")).toString("utf-8")); const currentNopeVersion = packageJson.version; function firstup(str) { str = (0, index_nodejs_1.camelize)(str); return str[0].toUpperCase() + str.slice(1); } function toService(str) { str = firstup(str); if (str.endsWith("Service")) { return str; } return str + "Service"; } function toModule(str) { str = firstup(str); if (str.endsWith("Module")) { return str; } return str + "Module"; } function toInterface(str) { str = toModule(str); return "I" + str; } handlebars.registerHelper("underscore", function (str) { return (0, index_nodejs_1.underscore)(str, true); }); handlebars.registerHelper("firstup", firstup); handlebars.registerHelper("now", function () { const now = new Date(); return (now.getDay().toString() + "." + now.getMonth().toString() + "." + now.getFullYear().toString()); }); handlebars.registerHelper("toService", toService); handlebars.registerHelper("toModule", toModule); handlebars.registerHelper("toInterface", toInterface); function generateDefaultProject() { return { type: "python", version: "1.0", name: "name", dirName: "", path: "", modules: [], services: [], description: "", author: { forename: "", surename: "", mail: "", }, depencies: [], currentNopeVersion: currentNopeVersion, }; } exports.generateDefaultProject = generateDefaultProject; /** * Helper to define the relevant project files. * @returns */ async function _getProjectTemplates(type) { const files = await (0, index_nodejs_1.listFiles)((0, path_1.join)(dirName, "projects", type), ".handlebars"); return files; } async function _getProjectFilesToCopy(type) { const files = await (0, index_nodejs_1.listFiles)((0, path_1.join)(dirName, "projects", type)); const filesToCopy = files.filter((item) => { const isTemplate = item.includes(".handlebars"); return !isTemplate; }); return filesToCopy; } function _relativePath(settings, type, path, dataForTemplate) { const templatePath = dirName + index_nodejs_1.FOLDER_SPLIT + type + index_nodejs_1.FOLDER_SPLIT + settings.type; const file = path.slice(templatePath.length); const fileTemplate = (0, index_nodejs_1.replaceAll)(file, index_nodejs_1.FOLDER_SPLIT, "__FOLDER_SPLITTING_CHAR__"); const render = handlebars.compile(fileTemplate); const result = render(dataForTemplate); const ret = (0, index_nodejs_1.replaceAll)(result, "__FOLDER_SPLITTING_CHAR__", index_nodejs_1.FOLDER_SPLIT); return ret; } async function _writeTemplate(path, templateFile, projectSettings, type, dataForTemplate, logger = null) { const render = handlebars.compile(await (0, promises_1.readFile)(templateFile, { encoding: "utf-8" })); let filePath = path + _relativePath(projectSettings, type, templateFile, dataForTemplate); if (templateFile.endsWith(".extend.handlebars")) { filePath = filePath.slice(0, filePath.length - ".extend".length); } filePath = filePath.slice(0, filePath.length - ".handlebars".length); const content = render(dataForTemplate); if (templateFile.endsWith(".extend.handlebars") && (0, fs_2.existsSync)(filePath)) { const text = await (0, promises_1.readFile)(filePath, { encoding: "utf-8" }); const idxToInsert = text.includes(INSERT_MARKER) ? text.indexOf(INSERT_MARKER) + INSERT_MARKER.length : text.length; const contentToStore = (0, index_nodejs_1.insert)(text, idxToInsert, "\n".repeat(1) + content); await (0, index_nodejs_1.createFile)(filePath, contentToStore); if (logger) logger.info("updated\t", filePath); } else { await (0, index_nodejs_1.createFile)((0, path_1.join)(filePath), content); if (logger) logger.info("created\t", filePath); } } async function createProject(projectSettings, dir, logger = null) { var _a; const path = await (0, index_nodejs_1.createPath)((0, path_1.join)(dir, projectSettings.name)); const filesToCopy = await _getProjectFilesToCopy(projectSettings.type); const promises = filesToCopy.map(async (file) => { const dest = await (0, index_nodejs_1.createFile)(path + _relativePath(projectSettings, "projects", file, projectSettings), ""); await (0, promises_1.copyFile)(file, dest); if (logger) logger.info("created\t", dest); }); await promises; // now we render the files. for (const templateFile of await _getProjectTemplates(projectSettings.type)) { await _writeTemplate(path, templateFile, projectSettings, "projects", projectSettings, logger); } projectSettings.path = (0, path_1.resolve)(process.cwd(), path); await (0, index_nodejs_1.createFile)((0, path_1.join)(path, "nope.json"), JSON.stringify(projectSettings, undefined, 4)); const git = (0, simple_git_1.simpleGit)(path); // or await each step individually await git.init(); const files = await (0, index_nodejs_1.listFiles)(path); const filesToCommit = files .filter((file) => !file.includes(index_nodejs_1.FOLDER_SPLIT + ".git" + index_nodejs_1.FOLDER_SPLIT)) .map((file) => (0, path_1.relative)(path, file)); // await git.add(files); await git.add(filesToCommit); await git.commit("initial commit"); if ((_a = projectSettings.git) === null || _a === void 0 ? void 0 : _a.repo) { await git.addRemote("origin", projectSettings.git.repo); } if (logger) logger.info("created\t", (0, path_1.join)(path, "nope.json")); } exports.createProject = createProject; async function addServiceToProject(projectSettings, service, logger = null) { let path = (0, path_1.join)(projectSettings.path, projectSettings.name); // List the relevant templates. const templates = await (0, index_nodejs_1.listFiles)((0, path_1.join)(dirName, "services", projectSettings.type), ".handlebars"); const settings = Object.assign({}, service, { project: projectSettings }); for (const templateFile of templates) { await _writeTemplate(path, templateFile, projectSettings, "services", settings, logger); } const files = await (0, index_nodejs_1.listFiles)((0, path_1.join)(dirName, "services", projectSettings.type)); const filesToCopy = files.filter((item) => { const isTemplate = item.includes(".handlebars"); return !isTemplate; }); const promises = filesToCopy.map(async (file) => { const dest = await (0, index_nodejs_1.createFile)(path + _relativePath(projectSettings, "services", file, settings), ""); await (0, promises_1.copyFile)(file, dest); if (logger) logger.info("created\t", dest); }); await promises; projectSettings.services.push(service); await (0, index_nodejs_1.createFile)((0, path_1.join)(projectSettings.path, "nope.json"), JSON.stringify(projectSettings, undefined, 4)); } exports.addServiceToProject = addServiceToProject; async function addModuleToProject(projectSettings, module, logger = null) { let path = (0, path_1.join)(projectSettings.path, projectSettings.name); // List the relevant templates. const templates = await (0, index_nodejs_1.listFiles)((0, path_1.join)(dirName, "modules", projectSettings.type), ".handlebars"); const settings = Object.assign({}, module, { project: projectSettings, }); for (const templateFile of templates) { await _writeTemplate(path, templateFile, projectSettings, "modules", settings, logger); } const files = await (0, index_nodejs_1.listFiles)((0, path_1.join)(dirName, "modules", projectSettings.type)); const filesToCopy = files.filter((item) => { const isTemplate = item.includes(".handlebars"); return !isTemplate; }); const promises = filesToCopy.map(async (file) => { const dest = await (0, index_nodejs_1.createFile)(path + _relativePath(projectSettings, "modules", file, settings), ""); await (0, promises_1.copyFile)(file, dest); if (logger) logger.info("created\t", dest); }); await promises; projectSettings.modules.push(module); await (0, index_nodejs_1.createFile)((0, path_1.join)(projectSettings.path, "nope.json"), JSON.stringify(projectSettings, undefined, 4)); } exports.addModuleToProject = addModuleToProject; if (require.main === module) { const logger = (0, index_browser_1.getNopeLogger)("tool"); async function main() { const settings = { author: { mail: "m.karkowski@zema.de", forename: "Martin", surename: "Karkowski", }, depencies: [], description: "Minimal Description for the Test", modules: [], path: "./temp/", services: [ { name: "createDatabase", }, ], name: "testPython", dirName: "test_python", version: "1.0", type: "python", currentNopeVersion: currentNopeVersion, }; await createProject(settings, "../temp", logger); await addServiceToProject(settings, { name: "deleteDatabase", }, logger); await addModuleToProject(settings, { methods: ["sayHello", "getTime"], name: "HelloWorld", events: [], properties: ["lastGreetingMessage"], }, logger); // Now create a Typescript folder: settings.type = "typescript"; settings.name = "testNodejs"; settings.name = "testNodejs"; settings.path = "./temp/"; await createProject(settings, "./temp", logger); await addServiceToProject(settings, { name: "deleteDatabase", }, logger); await addModuleToProject(settings, { methods: ["sayHello", "getTime"], name: "HelloWorld", events: [], properties: ["lastGreetingMessage"], }, logger); } main().catch(console.error); }