diff --git a/src/cli.ts b/src/cli.ts index c5def8bf..a6c6902e 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -29,9 +29,9 @@ import { getNodeMetaInformationMap, } from './routes'; import {Converter, getValidatableTypesFromReflection} from './schema'; -import {createDiagram, createDiagramFromString} from './uml/createDiagram'; -import {readDefinitions} from './uml/readDefinitions'; -import {UMLConfig} from './uml/umlConfig'; +import {createDiagram, createDiagramFromString} from './uml/create-diagram'; +import {readDefinitions} from './uml/read-definitions'; +import {UMLConfig} from './uml/uml-config'; import {validateFiles, writeReport} from './validate'; // handle unhandled promise rejections @@ -169,9 +169,11 @@ commander } }); -commander.command('pack').action(async () => { - await pack(); -}); +commander + .command('pack') + .action(async () => { + await pack(); + }); commander .command('plantuml ') @@ -250,7 +252,8 @@ commander commander .command('plantuml-file [outputFile]') .action(async (file: string, plantumlserver: string, outputFile: string) => { - const fileContent = readFileSync(resolve(file)).toString(); + const fileContent = readFileSync(resolve(file)) + .toString(); await createDiagramFromString(fileContent, plantumlserver, outputFile); }); diff --git a/src/common.ts b/src/common.ts index ca2d954b..87ca1fee 100644 --- a/src/common.ts +++ b/src/common.ts @@ -21,7 +21,7 @@ import {join, sep} from 'path'; import {Definition} from 'ts-json-schema-generator'; import {Application, ProjectReflection} from 'typedoc'; import {promisify} from 'util'; -import {LightweightType} from './uml/model/LightweightType'; +import {LightweightType} from './uml/model/lightweight-type'; export const globPromisified = promisify(glob); export const mkdirPromisified = promisify(mkdir); @@ -143,7 +143,7 @@ export interface ExpectableValidationErrors { * * @param srcPath Path to get reflection from */ -export function getProjectReflection(srcPath: PathLike, excludeExternals: boolean = true): ProjectReflection { +export function getProjectReflection(srcPath: PathLike, excludeExternals = true): ProjectReflection { Logger.info(`Generating project reflection for ${srcPath.toString()}.`); const tsconfigPath = getTsconfigPath(srcPath.toString()); @@ -254,13 +254,14 @@ export function getFullTypeName(type: LightweightType): string { } if (type.isLiteral) { // literals are a sink - return "'" + fullName + "'"; + return `'${fullName}'`; } if (type.isUnion && type.specificationTypes.length > 0) { const tempNames: string[] = []; for (const easyType of type.specificationTypes) { tempNames.push(getFullTypeName(easyType)); } + // since unions can't be applied to other types, it is a sink. return tempNames.join(' | '); } @@ -270,11 +271,12 @@ export function getFullTypeName(type: LightweightType): string { for (const easyType of type.genericsTypes) { tempNames.push(getFullTypeName(easyType)); } - fullName += '<' + tempNames.join(', ') + '>'; + fullName = `${fullName}<${tempNames.join(', ')}>`; } // check if type is array if (type.isArray) { fullName += '[]'; } + return fullName; } diff --git a/src/uml/createDiagram.ts b/src/uml/create-diagram.ts similarity index 88% rename from src/uml/createDiagram.ts rename to src/uml/create-diagram.ts index d2a8c5df..94d0ff78 100644 --- a/src/uml/createDiagram.ts +++ b/src/uml/create-diagram.ts @@ -16,12 +16,12 @@ import {Logger} from '@openstapps/logger'; import {createWriteStream} from 'fs'; import * as request from 'got'; import {getFullTypeName} from '../common'; -import {LightweightClassDefinition} from './model/LightweightClassDefinition'; -import {LightweightDefinition} from './model/LightweightDefinition'; -import {LightweightEnumDefinition} from './model/LightweightEnumDefinition'; -import {LightweightProperty} from './model/LightweightProperty'; -import {LightweightType} from './model/LightweightType'; -import {UMLConfig} from './umlConfig'; +import {LightweightClassDefinition} from './model/lightweight-class-definition'; +import {LightweightDefinition} from './model/lightweight-definition'; +import {LightweightEnumDefinition} from './model/lightweight-enum-definition'; +import {LightweightProperty} from './model/lightweight-property'; +import {LightweightType} from './model/lightweight-type'; +import {UMLConfig} from './uml-config'; /** * Converts the lightweight class/enum definitions according to the configuration, @@ -57,7 +57,7 @@ export async function createDiagram( config.definitions = config.definitions.concat(inheritedDefinitions); } - let modelPlantUMLCode: string = ''; + let modelPlantUMLCode = ''; // creates a UML definition for every specified definition name // however if no definitions were provided all definitions will be transformed for (const definition of definitions) { @@ -70,7 +70,7 @@ export async function createDiagram( } // either the definitions are empty or the definition was specified, proceed - let definitionPlantUMLCode: string = ''; + let definitionPlantUMLCode = ''; if (definition instanceof LightweightClassDefinition) { definitionPlantUMLCode = createPlantUMLCodeForClass(config, definition); } else if (definition instanceof LightweightEnumDefinition) { @@ -81,14 +81,16 @@ export async function createDiagram( modelPlantUMLCode += definitionPlantUMLCode; } - return await createDiagramFromString(modelPlantUMLCode, plantUmlBaseURL, config.outputFileName); + return createDiagramFromString(modelPlantUMLCode, plantUmlBaseURL, config.outputFileName); } /** * This will encode the plantuml code and post the code to the plantuml server * The server will then parse the code and create a corresponding diagram * - * @param modelPlantUMLCode + * @param modelPlantUMLCode raw PlantUML code + * @param plantUmlBaseURL PlantUML server address that shall be used + * @param outputFile filename of the output file without file extension */ export async function createDiagramFromString( modelPlantUMLCode: string, @@ -101,7 +103,8 @@ export async function createDiagramFromString( let response; try { response = await request(url); - if (response.statusCode !== 200) { + const httpOK = 200; + if (response.statusCode !== httpOK) { Logger.error(`Plantuml Server responded with an error.\n${response.statusMessage}`); throw new Error('Response not okay'); } @@ -112,11 +115,13 @@ export async function createDiagramFromString( // attach file extension const fileName = `${outputFile}.svg`; try { - createWriteStream(fileName).write(response.body); + createWriteStream(fileName) + .write(response.body); Logger.log(`Writen data to file: ${fileName}`); } catch (e) { throw new Error('Could not write file. Are you missing permissions?'); } + return fileName; } @@ -146,6 +151,7 @@ function gatherTypeAssociations( ); } } + return abstractions; } @@ -178,6 +184,7 @@ function getReferenceTypes(type: LightweightType): string[] { } } } + return types; } @@ -192,7 +199,7 @@ function createPlantUMLCodeForClass( readerClass: LightweightClassDefinition, ): string { // create the definition header, what type the definition is, it's name and it's inheritance - let model: string = `${readerClass.type} ${readerClass.name}`; + let model = `${readerClass.type} ${readerClass.name}`; if (readerClass.typeParameters.length > 0) { model += `<${readerClass.typeParameters.join(', ')}>`; @@ -253,7 +260,7 @@ function createPlantUMLCodeForEnum( readerEnum: LightweightEnumDefinition, ): string { // create enum header - let model: string = `enum ${readerEnum.name} {`; + let model = `enum ${readerEnum.name} {`; // add values if (config.showEnumValues) { for (const value of readerEnum.values) { @@ -269,11 +276,7 @@ function createPlantUMLCodeForEnum( * Creates a property PlantUML Line */ function createPropertyLine(property: LightweightProperty): string { - return ( - (property.inherited ? '/ ' : '') + - (property.optional ? '?' : '') + - property.name + - ' : ' + - getFullTypeName(property.type) - ); + const prefix = `${(property.inherited ? '/ ' : '')}${(property.optional ? '? ' : '')}`; + + return `${prefix}${property.name} : ${getFullTypeName(property.type)}`; } diff --git a/src/uml/model/LightweightClassDefinition.ts b/src/uml/model/lightweight-class-definition.ts similarity index 92% rename from src/uml/model/LightweightClassDefinition.ts rename to src/uml/model/lightweight-class-definition.ts index 59662fdd..b6746a70 100644 --- a/src/uml/model/LightweightClassDefinition.ts +++ b/src/uml/model/lightweight-class-definition.ts @@ -13,8 +13,8 @@ * this program. If not, see . */ -import {LightweightDefinition} from './LightweightDefinition'; -import {LightweightProperty} from './LightweightProperty'; +import {LightweightDefinition} from './lightweight-definition'; +import {LightweightProperty} from './lightweight-property'; /** * Represents a class definition */ diff --git a/src/uml/model/LightweightDefinition.ts b/src/uml/model/lightweight-definition.ts similarity index 100% rename from src/uml/model/LightweightDefinition.ts rename to src/uml/model/lightweight-definition.ts diff --git a/src/uml/model/LightweightEnumDefinition.ts b/src/uml/model/lightweight-enum-definition.ts similarity index 93% rename from src/uml/model/LightweightEnumDefinition.ts rename to src/uml/model/lightweight-enum-definition.ts index 61592bf2..4ce22cd2 100644 --- a/src/uml/model/LightweightEnumDefinition.ts +++ b/src/uml/model/lightweight-enum-definition.ts @@ -13,7 +13,7 @@ * this program. If not, see . */ -import {LightweightDefinition} from './LightweightDefinition'; +import {LightweightDefinition} from './lightweight-definition'; /** * Represents an enum definition */ diff --git a/src/uml/model/LightweightProperty.ts b/src/uml/model/lightweight-property.ts similarity index 90% rename from src/uml/model/LightweightProperty.ts rename to src/uml/model/lightweight-property.ts index c309623f..5f8a12fb 100644 --- a/src/uml/model/LightweightProperty.ts +++ b/src/uml/model/lightweight-property.ts @@ -12,7 +12,7 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ -import {LightweightType} from './LightweightType'; +import {LightweightType} from './lightweight-type'; /** * Represents a property definition @@ -45,7 +45,7 @@ export class LightweightProperty { * @param type Type of the property * @param optional Is the property optional */ - constructor(name: string, type: LightweightType, optional: boolean = true) { + constructor(name: string, type: LightweightType, optional = true) { this.name = name; this.optional = optional; this.inherited = false; diff --git a/src/uml/model/LightweightType.ts b/src/uml/model/lightweight-type.ts similarity index 84% rename from src/uml/model/LightweightType.ts rename to src/uml/model/lightweight-type.ts index 98dae5e1..c4467b00 100644 --- a/src/uml/model/LightweightType.ts +++ b/src/uml/model/lightweight-type.ts @@ -25,47 +25,47 @@ export class LightweightType { /** * Does the type have generic-parameters */ - hasTypeInformation: boolean = false; + hasTypeInformation = false; /** * Does the type represent an array type */ - isArray: boolean = false; + isArray = false; /** * Does the type represent a literal type */ - isLiteral: boolean = false; + isLiteral = false; /** * Does the type represent a primitive type */ - isPrimitive: boolean = false; + isPrimitive = false; /** * Does the type contain a reference to */ - isReference: boolean = false; + isReference = false; /** * Is the type a reflection and not avaiblabe at compile time */ - isReflection: boolean = false; + isReflection = false; /** * Does the type have type parameters */ - isTyped: boolean = false; + isTyped = false; /** * Is the type a typed parameter */ - isTypeParameter: boolean = false; + isTypeParameter = false; /** * Is the type a union type */ - isUnion: boolean = false; + isUnion = false; /** * Name of the type diff --git a/src/uml/readDefinitions.ts b/src/uml/read-definitions.ts similarity index 93% rename from src/uml/readDefinitions.ts rename to src/uml/read-definitions.ts index c847d15f..5714af35 100644 --- a/src/uml/readDefinitions.ts +++ b/src/uml/read-definitions.ts @@ -28,11 +28,11 @@ import { UnionType, } from 'typedoc/dist/lib/models'; import {getFullTypeName} from '../common'; -import {LightweightClassDefinition} from './model/LightweightClassDefinition'; -import {LightweightDefinition} from './model/LightweightDefinition'; -import {LightweightEnumDefinition} from './model/LightweightEnumDefinition'; -import {LightweightProperty} from './model/LightweightProperty'; -import {LightweightType} from './model/LightweightType'; +import {LightweightClassDefinition} from './model/lightweight-class-definition'; +import {LightweightDefinition} from './model/lightweight-definition'; +import {LightweightEnumDefinition} from './model/lightweight-enum-definition'; +import {LightweightProperty} from './model/lightweight-property'; +import {LightweightType} from './model/lightweight-type'; /** * Reads the reflection model from typedoc and converts it into a flatter, easier to handle model @@ -142,6 +142,7 @@ function getTypeInformation(type: LightweightType): string[] { } else { values.push(type.name); } + return values; } @@ -225,23 +226,30 @@ export function readAsClassDefinition( function readTypeInformation(declarationType: Type): LightweightType { if (declarationType instanceof ReflectionType) { return readAsReflectionType(declarationType); - } else if (declarationType instanceof TypeOperatorType) { - return readAsTypeOperatorType(declarationType); - } else if (declarationType instanceof TypeParameterType) { - return readAsTypeParameterType(declarationType); - } else if (declarationType instanceof IntrinsicType) { - return readAsIntrinsicType(declarationType); - } else if (declarationType instanceof StringLiteralType) { - return readAsStringLiteralType(declarationType); - } else if (declarationType instanceof ReferenceType) { - return readAsReferenceType(declarationType); - } else if (declarationType instanceof ArrayType) { - return readAsArrayType(declarationType); - } else if (declarationType instanceof UnionType) { - return readAsUnionType(declarationType); - } else { - throw new Error(`Could not read type ${declarationType.type}`); } + if (declarationType instanceof TypeOperatorType) { + return readAsTypeOperatorType(declarationType); + } + if (declarationType instanceof TypeParameterType) { + return readAsTypeParameterType(declarationType); + } + if (declarationType instanceof IntrinsicType) { + return readAsIntrinsicType(declarationType); + } + if (declarationType instanceof StringLiteralType) { + return readAsStringLiteralType(declarationType); + } + if (declarationType instanceof ReferenceType) { + return readAsReferenceType(declarationType); + } + if (declarationType instanceof ArrayType) { + return readAsArrayType(declarationType); + } + if (declarationType instanceof UnionType) { + return readAsUnionType(declarationType); + } + + throw new Error(`Could not read type ${declarationType.type}`); } /** @@ -256,6 +264,7 @@ function readAsIntrinsicType(type: IntrinsicType): LightweightType { easyType.name = type.name; easyType.isPrimitive = true; easyType.hasTypeInformation = true; + return easyType; } @@ -271,6 +280,7 @@ function readAsStringLiteralType(type: StringLiteralType): LightweightType { returnType.name = type.value; returnType.isLiteral = true; returnType.hasTypeInformation = true; + return returnType; } @@ -333,6 +343,7 @@ function readAsArrayType(type: ArrayType): LightweightType { returnType.name = getFullTypeName(typeOfArray); returnType.specificationTypes = [typeOfArray]; returnType.isArray = true; + return returnType; } @@ -355,6 +366,7 @@ function readAsUnionType(type: UnionType): LightweightType { returnType.specificationTypes = typesOfUnion; returnType.name = getFullTypeName(returnType); returnType.isUnion = true; + return returnType; } @@ -379,6 +391,7 @@ function readAsReflectionType(type: ReflectionType): LightweightType { } returnType.name = 'object'; returnType.isReflection = true; + return returnType; } @@ -399,6 +412,7 @@ function readAsTypeOperatorType(type: TypeOperatorType): LightweightType { // can't be traced deeper! so might as well be a primitive returnType.isPrimitive = true; returnType.hasTypeInformation = true; + return returnType; } @@ -419,5 +433,6 @@ function readAsTypeParameterType(type: TypeParameterType): LightweightType { returnType.name = type.name; returnType.isTypeParameter = true; returnType.hasTypeInformation = true; + return returnType; } diff --git a/src/uml/umlConfig.ts b/src/uml/uml-config.ts similarity index 100% rename from src/uml/umlConfig.ts rename to src/uml/uml-config.ts