From e7e8a42f0d66759294353dbf535c34f213478ca0 Mon Sep 17 00:00:00 2001 From: Maximilian Taeschner Date: Sun, 7 Jul 2019 09:54:13 +0200 Subject: [PATCH] fix: build valid names for resouces with dashes --- .../ResourcesGenerator/ResourcesGenerator.ts | 12 +++++++----- .../ResourcesGenerator/ResponseTypeFactory.ts | 4 ++-- codegen/src/typescript/ModuleResolver.ts | 3 ++- codegen/src/typescript/TSFile.ts | 4 ++-- codegen/src/typescript/utils.ts | 8 +++++++- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/codegen/src/generators/ResourcesGenerator/ResourcesGenerator.ts b/codegen/src/generators/ResourcesGenerator/ResourcesGenerator.ts index 39369ab49..0630a9670 100644 --- a/codegen/src/generators/ResourcesGenerator/ResourcesGenerator.ts +++ b/codegen/src/generators/ResourcesGenerator/ResourcesGenerator.ts @@ -2,7 +2,7 @@ import { groupBy } from 'lodash' import { OpenAPIV3 } from 'openapi-types' import * as fsPath from 'path' import { TSModule } from '../../typescript/TSModule' -import { capitalize } from '../../typescript/utils' +import { camelCaseify, capitalize } from '../../typescript/utils' import { ComponentSchemaResponsesGenerator } from '../ComponentSchemaResponsesGenerator' import { ComponentSchemaTypesGenerator } from '../ComponentSchemaTypesGenerator' import { Generator } from '../Generator' @@ -100,15 +100,17 @@ export class ResourcesGenerator implements Generator { /** * For a given path create a resource name. * @example - * / -> Index - * /pets -> Pets - * /pets/:id -> Pets + * / -> Index + * /pets -> Pets + * /pets/:id -> Pets + * /pets-test -> PetsTest */ private getResourceNameForPath(path: string): string { const [, prefix] = path.split('/') if (!prefix || prefix.startsWith('{')) { return capitalize('index') } - return capitalize(prefix) + const normalizedPrefix = camelCaseify(prefix) + return capitalize(normalizedPrefix) } } diff --git a/codegen/src/generators/ResourcesGenerator/ResponseTypeFactory.ts b/codegen/src/generators/ResourcesGenerator/ResponseTypeFactory.ts index 51e347fd8..247d382e6 100644 --- a/codegen/src/generators/ResourcesGenerator/ResponseTypeFactory.ts +++ b/codegen/src/generators/ResourcesGenerator/ResponseTypeFactory.ts @@ -11,7 +11,7 @@ import { import { StatusCodeClassNames } from '../../StatusCodesClassNames' import { TSClassBuilder } from '../../typescript/TSClassBuilder' import { TSFile } from '../../typescript/TSFile' -import { capitalize, isReferenceObject } from '../../typescript/utils' +import { camelCaseify, capitalize, isReferenceObject } from '../../typescript/utils' /** * Creates a resource operation response. @@ -84,7 +84,7 @@ export class ResponseTypeFactory { throw new Error('A status code reference must point to #/components/responses/') } - const responseType = `${response.$ref.replace('#/components/responses/', '')}Response` + const responseType = `${camelCaseify(response.$ref.replace('#/components/responses/', ''))}Response` tsFile.import(responseType) responseClassBuilder.addConstructorParameter({ name: 'payload', diff --git a/codegen/src/typescript/ModuleResolver.ts b/codegen/src/typescript/ModuleResolver.ts index fa79ba432..81126f864 100644 --- a/codegen/src/typescript/ModuleResolver.ts +++ b/codegen/src/typescript/ModuleResolver.ts @@ -1,5 +1,6 @@ import { OpenAPIV3 } from 'openapi-types' import { capitalize } from '../utils' +import { camelCaseify } from './utils' export interface ResolvedReference { path: string @@ -17,7 +18,7 @@ export class ModuleResolver { ) } - const symbol = capitalize(schema.$ref.replace('#/components/schemas/', '')) + const symbol = capitalize(camelCaseify(schema.$ref.replace('#/components/schemas/', ''))) const path = './types' return { diff --git a/codegen/src/typescript/TSFile.ts b/codegen/src/typescript/TSFile.ts index 8be642ae3..4f25ead13 100644 --- a/codegen/src/typescript/TSFile.ts +++ b/codegen/src/typescript/TSFile.ts @@ -5,7 +5,7 @@ import * as prettier from 'prettier' import ts from 'typescript' import { IdentifierImport } from './IdentifierImport' import { IdentifierRegistry } from './IdentifierRegistry' -import { capitalize, isReferenceObject } from './utils' +import { capitalize, isReferenceObject, camelCaseify } from './utils' export class TSFile { private readonly imports: IdentifierImport[] = [] @@ -136,7 +136,7 @@ export class TSFile { ) } - const identifier = capitalize(schema.$ref.replace('#/components/schemas/', '')) + const identifier = capitalize(camelCaseify(schema.$ref.replace('#/components/schemas/', ''))) return identifier } diff --git a/codegen/src/typescript/utils.ts b/codegen/src/typescript/utils.ts index 07e611bb6..d4ab6d696 100644 --- a/codegen/src/typescript/utils.ts +++ b/codegen/src/typescript/utils.ts @@ -4,6 +4,12 @@ export function isReferenceObject(maybe: unknown): maybe is OpenAPIV3.ReferenceO return typeof maybe === 'object' && maybe != null && !!(maybe as OpenAPIV3.ReferenceObject).$ref } -export function capitalize(s: string) { +export function capitalize(s: string): string { return s.charAt(0).toUpperCase() + s.slice(1) } + +export function camelCaseify(s: string): string { + return s.replace(/[\-\._]{1,}([a-zA-Z])?/g, (...values) => { + return (values[1] || '').toUpperCase() + }) +}