swagger-typescript-api-nextgen
Version:
Nextgen TypeScript/JavaScript API generator from Swagger schema
133 lines (107 loc) • 3.87 kB
JavaScript
const _ = require("lodash");
const Eta = require("eta");
const { getFileContent, pathIsExist } = require("./files");
const { config } = require("./config");
const { resolve } = require("path");
const { logger } = require("./logger");
/**
* name - project template name,
* fileName - template file name,
*/
const TEMPLATE_INFOS = [
{ name: "api", fileName: "api.eta" },
{ name: "dataContracts", fileName: "data-contracts.eta" },
{ name: "httpClient", fileName: "http-client.eta" },
{ name: "routeTypes", fileName: "route-types.eta" },
{ name: "routeName", fileName: "route-name.eta" },
];
const getTemplatePaths = ({ templates, modular }) => {
const baseTemplatesPath = resolve(__dirname, "../templates/base");
const defaultTemplatesPath = resolve(__dirname, "../templates/default");
const modularTemplatesPath = resolve(__dirname, "../templates/modular");
const originalTemplatesPath = modular ? modularTemplatesPath : defaultTemplatesPath;
const customTemplatesPath = templates ? resolve(process.cwd(), templates) : originalTemplatesPath;
return {
/** `templates/base` */
base: baseTemplatesPath,
/** `templates/default` */
default: defaultTemplatesPath,
/** `templates/modular` */
modular: modularTemplatesPath,
/** usage path if `--templates` option is not set */
original: originalTemplatesPath,
/** custom path to templates (`--templates`) */
custom: customTemplatesPath,
};
};
const getTemplate = ({ fileName, name, path }) => {
const { templatePaths } = config;
if (path) {
return getFileContent(path);
}
if (!fileName) return "";
const customFullPath = resolve(templatePaths.custom, "./", fileName);
let fileContent = pathIsExist(customFullPath) && getFileContent(customFullPath);
if (!fileContent) {
const baseFullPath = resolve(templatePaths.base, "./", fileName);
const originalFullPath = resolve(templatePaths.original, "./", fileName);
if (pathIsExist(baseFullPath)) {
fileContent = getFileContent(baseFullPath);
} else {
logger.warn(
`${_.lowerCase(name)} template not found in ${customFullPath}`,
`\nCode generator will use the default template`,
);
}
if (pathIsExist(originalFullPath)) {
fileContent = getFileContent(originalFullPath);
}
}
return fileContent;
};
const getTemplates = ({ templatePaths }) => {
logger.log(`try to read templates from directory "${templatePaths.custom}"`);
const templatesMap = _.reduce(
TEMPLATE_INFOS,
(acc, { fileName, name }) => ({
...acc,
[name]: getTemplate({ fileName, name }),
}),
{},
);
return templatesMap;
};
const getTemplateContent = (path) => {
let fixedPath = _.endsWith(path, ".eta") ? path : `${path}.eta`;
_.keys(config.templatePaths).forEach((key) => {
if (_.startsWith(fixedPath, `@${key}`)) {
fixedPath = resolve(_.replace(fixedPath, `@${key}`, config.templatePaths[key]));
}
});
if (pathIsExist(fixedPath)) {
return getFileContent(fixedPath);
}
const customPath = resolve(config.templatePaths.custom, fixedPath);
if (pathIsExist(customPath)) {
return getFileContent(customPath);
}
const originalPath = resolve(config.templatePaths.original, fixedPath);
if (pathIsExist(originalPath)) {
return getFileContent(originalPath);
}
return "";
};
const renderTemplate = (template, configuration, options) => {
if (!template) return "";
return Eta.render(template, configuration, {
async: false,
...(options || {}),
includeFile: (path, payload) => renderTemplate(getTemplateContent(path), payload),
});
};
module.exports = {
getTemplate,
getTemplates,
getTemplatePaths,
renderTemplate,
};