swagger-ts-generator
Version:
Given a swagger.json file, generates a number of TypeScript files which can be used as models and model-driven forms in Angular 2 (and above)
147 lines (130 loc) • 4.22 kB
JavaScript
;
/* global __dirname */
let fs = require('fs');
let path = require('path');
let handlebars = require('handlebars');
let moment = require('moment');
let _ = require('lodash');
const TEMPLATE_FOLDER = '../templates';
const ENCODING = 'utf8';
module.exports = {
ENCODING: ENCODING,
readAndCompileTemplateFile: readAndCompileTemplateFile,
readFile: readFile,
writeFile: writeFile,
writeFileIfContentsIsChanged: writeFileIfContentsIsChanged,
ensureFile: ensureFile,
ensureFolder: ensureFolder,
getDirectories: getDirectories,
removeFolder: removeFolder,
getPathToRoot: getPathToRoot,
convertNamespaceToPath: convertNamespaceToPath,
getTypeFromDescription: getTypeFromDescription,
hasTypeFromDescription: hasTypeFromDescription,
getSortedObjectProperties: getSortedObjectProperties,
isInTypesToFilter: isInTypesToFilter,
log: log,
}
function readAndCompileTemplateFile(templateFileName) {
let templateSource = fs.readFileSync(path.resolve(__dirname, TEMPLATE_FOLDER, templateFileName), ENCODING);
let template = handlebars.compile(templateSource);
return template;
}
function readFile(outputFileName) {
let file = fs.readFileSync(outputFileName, ENCODING);
return file;
}
function writeFile(outputFileName, contents) {
fs.writeFileSync(outputFileName, contents, { flag: 'w', encoding: ENCODING });
}
function writeFileIfContentsIsChanged(outputFileName, contents) {
let isChanged = true;
if (fs.existsSync(outputFileName)) {
let oldContents = readFile(outputFileName);
isChanged = oldContents !== contents;
}
if (isChanged) {
writeFile(outputFileName, contents);
}
return isChanged;
}
function ensureFile(outputFileName, contents) {
ensureFolder(path.dirname(outputFileName));
if (!fs.existsSync(outputFileName)) {
fs.writeFileSync(outputFileName, contents, ENCODING);
}
}
function ensureFolder(folder) {
if (!fs.existsSync(folder)) {
fs.mkdirSync(folder);
}
}
function getDirectories(srcpath) {
return fs.readdirSync(srcpath).filter((file) => {
return fs.statSync(path.join(srcpath, file)).isDirectory();
});
}
function removeFolder(folder) {
if (fs.existsSync(folder)) {
fs.readdirSync(folder).forEach((file, index) => {
let curPath = folder + "/" + file;
if (fs.lstatSync(curPath).isDirectory()) { // recurse
removeFolder(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(folder);
}
}
function getPathToRoot(namespace) {
let path = './';
if (namespace) {
path = '';
let namespaceLength = namespace.split('.').length;
for (let i = 0; i < namespaceLength; ++i) {
path += '../';
}
}
return path;
}
function convertNamespaceToPath(namespace) {
let parts = namespace.split('.');
for (let index = 0; index < parts.length; index++) {
parts[index] =_.kebabCase(parts[index]);
}
let result = parts.join('/');
// let result = namespace.replace(/\./g, '/');
return result;
}
function getTypeFromDescription(description) {
if (hasTypeFromDescription(description)) {
description = description.replace('ts-type', '');
return description.replace('type', '').trim();
}
return description;
}
function hasTypeFromDescription(description) {
if (description) {
return (description.startsWith('ts-type') || description.startsWith('type'));
}
return false;
}
function getSortedObjectProperties(object) {
const result = _(object).toPairs().sortBy(0).fromPairs().value();
return result;
}
function isInTypesToFilter(item, key, options) {
if (options && options.typesToFilter) {
const result = !!_.find(options.typesToFilter, element => { return element === key; });
// if (result) {
// console.log('item in typesToFilter', key, result);
// }
return result;
}
return false;
}
function log(message) {
let time = moment().format('HH:mm:SS');
console.log(`[${time}] ${message}`);
}