Merge pull request #31490 from rferreira98/fix-propertyNaming-ignored-on-hyphen-usage

feat: preserve hyphenated property names in OpenAPI generators when u…
This commit is contained in:
Ben Lambert
2025-11-25 11:03:10 +01:00
committed by GitHub
9 changed files with 27 additions and 15 deletions
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/repo-tools': patch
---
Updates OpenAPI generator templates to preserve original property names (like 'group-name', 'user-id') from OpenAPI specs when propertyNaming=original is specified. Previously, these were always converted to camelCase regardless of the propertyNaming setting.
- Updates modelGeneric.mustache templates in both client and server generators
- Updates modelTaggedUnion.mustache templates in both client and server generators
- Uses {{baseName}} when available, falls back to {{name}} for backward compatibility
- Maintains backward compatibility - no changes when propertyNaming=original is not used
@@ -14,21 +14,21 @@
* limitations under the License.
*/
import { resolvePackagePath } from '@backstage/backend-plugin-api';
import chalk from 'chalk';
import fs from 'fs-extra';
import { resolve } from 'path';
import { exec } from '../../../../../lib/exec';
import {
OPENAPI_IGNORE_FILES,
OUTPUT_PATH,
} from '../../../../../lib/openapi/constants';
import { paths as cliPaths } from '../../../../../lib/paths';
import fs from 'fs-extra';
import { exec } from '../../../../../lib/exec';
import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { deduplicateImports } from '../../../../../lib/openapi/dedupe-imports';
import {
getPathToCurrentOpenApiSpec,
toGeneratorAdditionalProperties,
} from '../../../../../lib/openapi/helpers';
import { deduplicateImports } from '../../../../../lib/openapi/dedupe-imports';
import { paths as cliPaths } from '../../../../../lib/paths';
async function generate(
outputDirectory: string,
@@ -68,6 +68,8 @@ async function lint(directoryPath: string, config?: { strict: boolean }) {
'operation-tags': 'off',
'hosts-https-only-oas3': 'off',
'no-unknown-error-format': 'off',
// Disabled as it currently gives false positives when 'example' is used as a property name.
'oas3-valid-media-example': 'off',
},
},
],
@@ -18,7 +18,7 @@ export {{#isNullable}}type{{/isNullable}}{{^isNullable}}interface{{/isNullable}}
* {{{.}}}
*/
{{/description}}
'{{name}}'{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}} | null{{/isNullable}};
'{{#baseName}}{{baseName}}{{/baseName}}{{^baseName}}{{name}}{{/baseName}}'{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}} | null{{/isNullable}};
{{/vars}}
}{{#isNullable}} | null{{/isNullable}}
@@ -12,7 +12,7 @@ export interface {{classname}} { {{>modelGenericAdditionalProperties}}
* {{{.}}}
*/
{{/description}}
{{name}}{{^required}}?{{/required}}: {{#discriminatorValue}}'{{.}}'{{/discriminatorValue}}{{^discriminatorValue}}{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{/discriminatorValue}}{{#isNullable}} | null{{/isNullable}};
'{{#baseName}}{{baseName}}{{/baseName}}{{^baseName}}{{name}}{{/baseName}}'{{^required}}?{{/required}}: {{#discriminatorValue}}'{{.}}'{{/discriminatorValue}}{{^discriminatorValue}}{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{/discriminatorValue}}{{#isNullable}} | null{{/isNullable}};
{{/allVars}}
}
{{>modelGenericEnums}}
@@ -18,7 +18,7 @@ export {{#isNullable}}type{{/isNullable}}{{^isNullable}}interface{{/isNullable}}
* {{{.}}}
*/
{{/description}}
'{{name}}'{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}} | null{{/isNullable}};
'{{#baseName}}{{baseName}}{{/baseName}}{{^baseName}}{{name}}{{/baseName}}'{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}} | null{{/isNullable}};
{{/vars}}
}{{#isNullable}} | null{{/isNullable}}
@@ -12,7 +12,7 @@ export interface {{classname}} { {{>modelGenericAdditionalProperties}}
* {{{.}}}
*/
{{/description}}
{{name}}{{^required}}?{{/required}}: {{#discriminatorValue}}'{{.}}'{{/discriminatorValue}}{{^discriminatorValue}}{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{/discriminatorValue}}{{#isNullable}} | null{{/isNullable}};
'{{#baseName}}{{baseName}}{{/baseName}}{{^baseName}}{{name}}{{/baseName}}'{{^required}}?{{/required}}: {{#discriminatorValue}}'{{.}}'{{/discriminatorValue}}{{^discriminatorValue}}{{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{/discriminatorValue}}{{#isNullable}} | null{{/isNullable}};
{{/allVars}}
}
{{>modelGenericEnums}}
@@ -113,7 +113,7 @@ components:
type: string
description:
type: string
"'examples'":
examples:
type: array
items:
$ref: '#/components/schemas/ActionExample'
@@ -417,7 +417,7 @@ components:
$ref: '#/components/schemas/JsonObject'
output:
$ref: '#/components/schemas/JsonObject'
"'examples'":
examples:
type: array
items:
$ref: '#/components/schemas/ScaffolderUsageExample'
@@ -449,7 +449,7 @@ components:
$ref: '#/components/schemas/JsonObject'
output:
$ref: '#/components/schemas/JsonObject'
"'examples'":
examples:
type: array
items:
$ref: '#/components/schemas/ScaffolderUsageExample'
@@ -173,7 +173,7 @@ export const spec = {
description: {
type: 'string',
},
"'examples'": {
examples: {
type: 'array',
items: {
$ref: '#/components/schemas/ActionExample',
@@ -588,7 +588,7 @@ export const spec = {
},
},
},
"'examples'": {
examples: {
type: 'array',
items: {
$ref: '#/components/schemas/ScaffolderUsageExample',
@@ -636,7 +636,7 @@ export const spec = {
},
},
},
"'examples'": {
examples: {
type: 'array',
items: {
$ref: '#/components/schemas/ScaffolderUsageExample',