nope-js-node
Version:
NoPE Runtime for Nodejs. For Browser-Support please use nope-browser
263 lines (262 loc) • 11.5 kB
JavaScript
;
/**
* 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);
}