From 186930b7b15af3f0abc84deab1d4553b9adcb178 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 7 Nov 2024 15:18:25 +0800 Subject: [PATCH 01/13] errors on invalid parameter keys --- packages/openapi/src/helpers.ts | 16 +++++++++ packages/openapi/src/lib.ts | 7 ++++ packages/openapi3/test/parameters.test.ts | 41 +++++++++++++---------- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/packages/openapi/src/helpers.ts b/packages/openapi/src/helpers.ts index 7bc1b1fe6ce..6937cce0988 100644 --- a/packages/openapi/src/helpers.ts +++ b/packages/openapi/src/helpers.ts @@ -65,10 +65,24 @@ export function getOpenAPITypeName( ): string { const name = getFriendlyName(program, type) ?? getTypeName(type, options); + checkAvailableTypeName(program, type, name); checkDuplicateTypeName(program, type, name, existing); return name; } +function checkAvailableTypeName(program: Program, type: Type, name: string) { + const pattern = /^[a-zA-Z0-9.-_]+$/; + if (!pattern.test(name)) { + reportDiagnostic(program, { + code: "invalid-type-name", + format: { + value: name, + }, + target: type, + }); + } +} + /** * Check the given name is not already specific in the existing map. Report a diagnostic if it is. * @param program Program @@ -110,6 +124,8 @@ export function getParameterKey( key += `.${property.name}`; } + checkAvailableTypeName(program, property, key); + if (existingParams[key]) { reportDiagnostic(program, { code: "duplicate-type-name", diff --git a/packages/openapi/src/lib.ts b/packages/openapi/src/lib.ts index 889d282b313..bfba4e9a12d 100644 --- a/packages/openapi/src/lib.ts +++ b/packages/openapi/src/lib.ts @@ -34,6 +34,13 @@ export const $lib = createTypeSpecLibrary({ default: paramMessage`@tagMetadata must be used on the service namespace. Did you mean to annotate '${"namespace"}' with '@service'?`, }, }, + "invalid-type-name": { + severity: "error", + messages: { + default: paramMessage`Invalid type name: '${"value"}'. Check @friendlyName decorators and overlap with types in TypeSpec or service namespace.`, + parameter: paramMessage`Invalid parameter key: '${"value"}'. Check @friendlyName decorators and overlap with types in TypeSpec or service namespace.`, + }, + }, }, state: { tagsMetadata: { description: "State for the @tagMetadata decorator." }, diff --git a/packages/openapi3/test/parameters.test.ts b/packages/openapi3/test/parameters.test.ts index 4f7454f78a6..9b28b577dc5 100644 --- a/packages/openapi3/test/parameters.test.ts +++ b/packages/openapi3/test/parameters.test.ts @@ -301,27 +301,32 @@ describe("query parameters", () => { ]); }); - it("encodes parameter keys in references", async () => { - const oapi = await openApiFor(` - model Pet extends Pet$Id { - name: string; + it("errors on invalid parameter keys", async () => { + const diagnostics = await diagnoseOpenApiFor( + ` + model Pet { + @query() + $take?: int32; + + @query() + $top?: int32; } - model Pet$Id { - @path - petId: string; + @service + namespace Endpoints { + op list(...Pet): void; } - - @route("/Pets") - @get() - op get(... Pet$Id): Pet; - `); - - ok(oapi.paths["/Pets/{petId}"].get); - strictEqual( - oapi.paths["/Pets/{petId}"].get.parameters[0]["$ref"], - "#/components/parameters/Pet%24Id", + `, + { "omit-unreachable-types": true }, ); - strictEqual(oapi.components.parameters["Pet$Id"].name, "petId"); + + expectDiagnostics(diagnostics, [ + { + code: "@typespec/openapi/invalid-type-name", + }, + { + code: "@typespec/openapi/invalid-type-name", + }, + ]); }); it("inline spread of parameters from anonymous model", async () => { From e9a1e974aba31e12a76f22979c89723093e683ff Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 7 Nov 2024 15:22:41 +0800 Subject: [PATCH 02/13] update change log --- .../changes/checkAvailableTypeName-2024-10-7-15-22-31.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md diff --git a/.chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md b/.chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md new file mode 100644 index 00000000000..c966f073f8f --- /dev/null +++ b/.chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/openapi" +--- + +Illegal characters in component keys \ No newline at end of file From 31aa2c8598032a057db88d17dbcec35b0cf233c0 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 7 Nov 2024 15:37:53 +0800 Subject: [PATCH 03/13] up --- packages/openapi/src/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi/src/helpers.ts b/packages/openapi/src/helpers.ts index 6937cce0988..2dff04cac5b 100644 --- a/packages/openapi/src/helpers.ts +++ b/packages/openapi/src/helpers.ts @@ -71,7 +71,7 @@ export function getOpenAPITypeName( } function checkAvailableTypeName(program: Program, type: Type, name: string) { - const pattern = /^[a-zA-Z0-9.-_]+$/; + const pattern = /^[a-zA-Z0-9._-]+$/; if (!pattern.test(name)) { reportDiagnostic(program, { code: "invalid-type-name", From a2e75fe01564e2176ecf079c4f44c1ea28b57c87 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 7 Nov 2024 16:14:22 +0800 Subject: [PATCH 04/13] revert --- packages/openapi/src/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi/src/helpers.ts b/packages/openapi/src/helpers.ts index 2dff04cac5b..6937cce0988 100644 --- a/packages/openapi/src/helpers.ts +++ b/packages/openapi/src/helpers.ts @@ -71,7 +71,7 @@ export function getOpenAPITypeName( } function checkAvailableTypeName(program: Program, type: Type, name: string) { - const pattern = /^[a-zA-Z0-9._-]+$/; + const pattern = /^[a-zA-Z0-9.-_]+$/; if (!pattern.test(name)) { reportDiagnostic(program, { code: "invalid-type-name", From bc15a4cfeea3fb551ea5759454b36873b8274469 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 7 Nov 2024 16:27:55 +0800 Subject: [PATCH 05/13] up --- packages/openapi/src/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi/src/helpers.ts b/packages/openapi/src/helpers.ts index 6937cce0988..6a45ccee670 100644 --- a/packages/openapi/src/helpers.ts +++ b/packages/openapi/src/helpers.ts @@ -71,7 +71,7 @@ export function getOpenAPITypeName( } function checkAvailableTypeName(program: Program, type: Type, name: string) { - const pattern = /^[a-zA-Z0-9.-_]+$/; + const pattern = /^[\w\\.\\-\\<\\>]+$/; if (!pattern.test(name)) { reportDiagnostic(program, { code: "invalid-type-name", From cee12e4f8a2104749f6fdf75927b9a3ddaaa472b Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 7 Nov 2024 18:10:37 +0800 Subject: [PATCH 06/13] move to openapi3 --- ...eckAvailableTypeName-2024-10-7-15-22-31.md | 4 +- packages/openapi/src/helpers.ts | 16 ------ packages/openapi/src/lib.ts | 7 --- packages/openapi3/src/lib.ts | 6 ++ packages/openapi3/src/openapi.ts | 18 ++++++ packages/openapi3/test/models.test.ts | 55 +++++++++++++++++++ packages/openapi3/test/parameters.test.ts | 4 +- 7 files changed, 83 insertions(+), 27 deletions(-) diff --git a/.chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md b/.chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md index c966f073f8f..ca3ef477717 100644 --- a/.chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md +++ b/.chronus/changes/checkAvailableTypeName-2024-10-7-15-22-31.md @@ -1,7 +1,7 @@ --- changeKind: fix packages: - - "@typespec/openapi" + - "@typespec/openapi3" --- -Illegal characters in component keys \ No newline at end of file +Illegal characters in component keys diff --git a/packages/openapi/src/helpers.ts b/packages/openapi/src/helpers.ts index 6a45ccee670..7bc1b1fe6ce 100644 --- a/packages/openapi/src/helpers.ts +++ b/packages/openapi/src/helpers.ts @@ -65,24 +65,10 @@ export function getOpenAPITypeName( ): string { const name = getFriendlyName(program, type) ?? getTypeName(type, options); - checkAvailableTypeName(program, type, name); checkDuplicateTypeName(program, type, name, existing); return name; } -function checkAvailableTypeName(program: Program, type: Type, name: string) { - const pattern = /^[\w\\.\\-\\<\\>]+$/; - if (!pattern.test(name)) { - reportDiagnostic(program, { - code: "invalid-type-name", - format: { - value: name, - }, - target: type, - }); - } -} - /** * Check the given name is not already specific in the existing map. Report a diagnostic if it is. * @param program Program @@ -124,8 +110,6 @@ export function getParameterKey( key += `.${property.name}`; } - checkAvailableTypeName(program, property, key); - if (existingParams[key]) { reportDiagnostic(program, { code: "duplicate-type-name", diff --git a/packages/openapi/src/lib.ts b/packages/openapi/src/lib.ts index bfba4e9a12d..889d282b313 100644 --- a/packages/openapi/src/lib.ts +++ b/packages/openapi/src/lib.ts @@ -34,13 +34,6 @@ export const $lib = createTypeSpecLibrary({ default: paramMessage`@tagMetadata must be used on the service namespace. Did you mean to annotate '${"namespace"}' with '@service'?`, }, }, - "invalid-type-name": { - severity: "error", - messages: { - default: paramMessage`Invalid type name: '${"value"}'. Check @friendlyName decorators and overlap with types in TypeSpec or service namespace.`, - parameter: paramMessage`Invalid parameter key: '${"value"}'. Check @friendlyName decorators and overlap with types in TypeSpec or service namespace.`, - }, - }, }, state: { tagsMetadata: { description: "State for the @tagMetadata decorator." }, diff --git a/packages/openapi3/src/lib.ts b/packages/openapi3/src/lib.ts index b8a8c9e0bcc..88f496acd41 100644 --- a/packages/openapi3/src/lib.ts +++ b/packages/openapi3/src/lib.ts @@ -275,6 +275,12 @@ export const libDef = { default: paramMessage`XML \`@unwrapped\` can only used on array properties or primitive ones in the OpenAPI 3 emitter, Property '${"name"}' will be ignored.`, }, }, + "invalid-type-name": { + severity: "error", + messages: { + default: paramMessage`Invalid component name: '${"value"}'. Component names can only contain the characters 'A-Z a-z 0-9 - . _'.`, + }, + }, }, emitter: { options: EmitterOptionsSchema as JSONSchemaType, diff --git a/packages/openapi3/src/openapi.ts b/packages/openapi3/src/openapi.ts index 6659ccdb194..4bf7cdc5a40 100644 --- a/packages/openapi3/src/openapi.ts +++ b/packages/openapi3/src/openapi.ts @@ -1540,6 +1540,21 @@ function createOAPIEmitter( } } + function checkAvailableComponentName(type: Type, name: string) { + const pattern = /^[\w\\.\\-]+$/; + if (!pattern.test(name)) { + program.reportDiagnostic( + createDiagnostic({ + code: "invalid-type-name", + format: { + value: name, + }, + target: type, + }), + ); + } + } + function emitParameters() { for (const [property, param] of params) { const key = getParameterKey( @@ -1549,6 +1564,7 @@ function createOAPIEmitter( root.components!.parameters!, typeNameOptions, ); + checkAvailableComponentName(property, key); root.components!.parameters![key] = { ...param }; for (const key of Object.keys(param)) { @@ -1573,6 +1589,8 @@ function createOAPIEmitter( const schemas = root.components!.schemas!; const declarations = files[0].globalScope.declarations; for (const declaration of declarations) { + checkAvailableComponentName(serviceNamespace, declaration.name); + schemas[declaration.name] = declaration.value as any; } } diff --git a/packages/openapi3/test/models.test.ts b/packages/openapi3/test/models.test.ts index 70c198105fe..b7ab0b29567 100644 --- a/packages/openapi3/test/models.test.ts +++ b/packages/openapi3/test/models.test.ts @@ -102,6 +102,61 @@ describe("openapi3: models", () => { ]); }); + describe("errors on invalid model names", () => { + const symbols = [ + "!", + "@", + "#", + "$", + "%", + "^", + "&", + "*", + "(", + ")", + "=", + "+", + "[", + "]", + "{", + "}", + "|", + ";", + ":", + "<", + ">", + ",", + "/", + "?", + "~", + ]; + it.each(symbols)("%sName01", async (model) => { + const diagnostics = await diagnoseOpenApiFor( + ` + model \`${model}Name01\` { name: string; } + `, + ); + expectDiagnostics(diagnostics, [ + { + code: "@typespec/openapi3/invalid-type-name", + message: /type/, + }, + ]); + }); + }); + + describe("no errors on valid model names", () => { + const symbols = [".", "-", "_"]; + it.each(symbols)("%sName01", async (model) => { + const diagnostics = await diagnoseOpenApiFor( + ` + model \`${model}Name01\` { name: string; } + `, + ); + expectDiagnostics(diagnostics, []); + }); + }); + it("doesn't define anonymous models", async () => { const res = await oapiForModel("{ x: int32 }", ""); diff --git a/packages/openapi3/test/parameters.test.ts b/packages/openapi3/test/parameters.test.ts index 9b28b577dc5..c01cf87ecde 100644 --- a/packages/openapi3/test/parameters.test.ts +++ b/packages/openapi3/test/parameters.test.ts @@ -321,10 +321,10 @@ describe("query parameters", () => { expectDiagnostics(diagnostics, [ { - code: "@typespec/openapi/invalid-type-name", + code: "@typespec/openapi3/invalid-type-name", }, { - code: "@typespec/openapi/invalid-type-name", + code: "@typespec/openapi3/invalid-type-name", }, ]); }); From 1f6e75e82569f744bdff6c3760ddfc796a654eb9 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 7 Nov 2024 18:23:13 +0800 Subject: [PATCH 07/13] update cases --- packages/openapi3/test/models.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/openapi3/test/models.test.ts b/packages/openapi3/test/models.test.ts index b7ab0b29567..d60dc505506 100644 --- a/packages/openapi3/test/models.test.ts +++ b/packages/openapi3/test/models.test.ts @@ -139,7 +139,6 @@ describe("openapi3: models", () => { expectDiagnostics(diagnostics, [ { code: "@typespec/openapi3/invalid-type-name", - message: /type/, }, ]); }); From f0c3b03f8bac49cf1af0825b5a4513059f262915 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Mon, 11 Nov 2024 11:56:50 +0800 Subject: [PATCH 08/13] update --- packages/openapi3/src/lib.ts | 4 ++-- packages/openapi3/src/openapi.ts | 8 ++++---- packages/openapi3/test/models.test.ts | 2 +- packages/openapi3/test/parameters.test.ts | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/openapi3/src/lib.ts b/packages/openapi3/src/lib.ts index 88f496acd41..e7144178be5 100644 --- a/packages/openapi3/src/lib.ts +++ b/packages/openapi3/src/lib.ts @@ -275,10 +275,10 @@ export const libDef = { default: paramMessage`XML \`@unwrapped\` can only used on array properties or primitive ones in the OpenAPI 3 emitter, Property '${"name"}' will be ignored.`, }, }, - "invalid-type-name": { + "invalid-component-fixed-field-key": { severity: "error", messages: { - default: paramMessage`Invalid component name: '${"value"}'. Component names can only contain the characters 'A-Z a-z 0-9 - . _'.`, + default: paramMessage`Invalid key '${"value"}' used in fixed fields of Component object. Only keys matching the regular expression to ^[a-zA-Z0-9.-_]+$ are allowed.`, }, }, }, diff --git a/packages/openapi3/src/openapi.ts b/packages/openapi3/src/openapi.ts index 4bf7cdc5a40..21fe65a5e89 100644 --- a/packages/openapi3/src/openapi.ts +++ b/packages/openapi3/src/openapi.ts @@ -1540,12 +1540,12 @@ function createOAPIEmitter( } } - function checkAvailableComponentName(type: Type, name: string) { + function validateComponentFixedFieldKey(type: Type, name: string) { const pattern = /^[\w\\.\\-]+$/; if (!pattern.test(name)) { program.reportDiagnostic( createDiagnostic({ - code: "invalid-type-name", + code: "invalid-component-fixed-field-key", format: { value: name, }, @@ -1564,7 +1564,7 @@ function createOAPIEmitter( root.components!.parameters!, typeNameOptions, ); - checkAvailableComponentName(property, key); + validateComponentFixedFieldKey(property, key); root.components!.parameters![key] = { ...param }; for (const key of Object.keys(param)) { @@ -1589,7 +1589,7 @@ function createOAPIEmitter( const schemas = root.components!.schemas!; const declarations = files[0].globalScope.declarations; for (const declaration of declarations) { - checkAvailableComponentName(serviceNamespace, declaration.name); + validateComponentFixedFieldKey(serviceNamespace, declaration.name); schemas[declaration.name] = declaration.value as any; } diff --git a/packages/openapi3/test/models.test.ts b/packages/openapi3/test/models.test.ts index d60dc505506..774c7deec96 100644 --- a/packages/openapi3/test/models.test.ts +++ b/packages/openapi3/test/models.test.ts @@ -138,7 +138,7 @@ describe("openapi3: models", () => { ); expectDiagnostics(diagnostics, [ { - code: "@typespec/openapi3/invalid-type-name", + code: "@typespec/openapi3/invalid-component-fixed-field-key", }, ]); }); diff --git a/packages/openapi3/test/parameters.test.ts b/packages/openapi3/test/parameters.test.ts index c01cf87ecde..d646df97bbb 100644 --- a/packages/openapi3/test/parameters.test.ts +++ b/packages/openapi3/test/parameters.test.ts @@ -321,10 +321,10 @@ describe("query parameters", () => { expectDiagnostics(diagnostics, [ { - code: "@typespec/openapi3/invalid-type-name", + code: "@typespec/openapi3/invalid-component-fixed-field-key", }, { - code: "@typespec/openapi3/invalid-type-name", + code: "@typespec/openapi3/invalid-component-fixed-field-key", }, ]); }); From ea7f36e62487c4dd561f7e2d47f545204f0622dd Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Tue, 12 Nov 2024 17:47:48 +0800 Subject: [PATCH 09/13] update --- packages/openapi3/src/openapi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi3/src/openapi.ts b/packages/openapi3/src/openapi.ts index 21fe65a5e89..e57c9aa467d 100644 --- a/packages/openapi3/src/openapi.ts +++ b/packages/openapi3/src/openapi.ts @@ -1541,7 +1541,7 @@ function createOAPIEmitter( } function validateComponentFixedFieldKey(type: Type, name: string) { - const pattern = /^[\w\\.\\-]+$/; + const pattern = /^[a-zA-Z0-9\\.\-\\_]+$/; if (!pattern.test(name)) { program.reportDiagnostic( createDiagnostic({ From 0ed014c82a50599f48d5f53d9521988ce99b535b Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Wed, 13 Nov 2024 14:21:20 +0800 Subject: [PATCH 10/13] update --- packages/openapi3/src/openapi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi3/src/openapi.ts b/packages/openapi3/src/openapi.ts index e57c9aa467d..9078cf20ba5 100644 --- a/packages/openapi3/src/openapi.ts +++ b/packages/openapi3/src/openapi.ts @@ -1541,7 +1541,7 @@ function createOAPIEmitter( } function validateComponentFixedFieldKey(type: Type, name: string) { - const pattern = /^[a-zA-Z0-9\\.\-\\_]+$/; + const pattern = /^[a-zA-Z0-9\.\-_]+$/; if (!pattern.test(name)) { program.reportDiagnostic( createDiagnostic({ From 3e807011a666a81715932956b2e2f599f574a900 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Wed, 13 Nov 2024 14:31:43 +0800 Subject: [PATCH 11/13] disable error --- packages/openapi3/src/openapi.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/openapi3/src/openapi.ts b/packages/openapi3/src/openapi.ts index 9078cf20ba5..1365537dcbf 100644 --- a/packages/openapi3/src/openapi.ts +++ b/packages/openapi3/src/openapi.ts @@ -1541,6 +1541,7 @@ function createOAPIEmitter( } function validateComponentFixedFieldKey(type: Type, name: string) { + // eslint-disable-next-line no-useless-escape const pattern = /^[a-zA-Z0-9\.\-_]+$/; if (!pattern.test(name)) { program.reportDiagnostic( From 249ef2f91038310d63499e44be6da0aa179b688d Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Wed, 13 Nov 2024 17:19:35 +0800 Subject: [PATCH 12/13] up --- packages/openapi3/src/lib.ts | 2 +- packages/openapi3/src/openapi.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/openapi3/src/lib.ts b/packages/openapi3/src/lib.ts index e7144178be5..3098074aa95 100644 --- a/packages/openapi3/src/lib.ts +++ b/packages/openapi3/src/lib.ts @@ -278,7 +278,7 @@ export const libDef = { "invalid-component-fixed-field-key": { severity: "error", messages: { - default: paramMessage`Invalid key '${"value"}' used in fixed fields of Component object. Only keys matching the regular expression to ^[a-zA-Z0-9.-_]+$ are allowed.`, + default: paramMessage`Invalid key '${"value"}' used in fixed fields of Component object. Only keys matching the regular expression to ^[a-zA-Z0-9.\-_]+$ are allowed.`, }, }, }, diff --git a/packages/openapi3/src/openapi.ts b/packages/openapi3/src/openapi.ts index 1365537dcbf..fa533c0e0c1 100644 --- a/packages/openapi3/src/openapi.ts +++ b/packages/openapi3/src/openapi.ts @@ -1541,8 +1541,7 @@ function createOAPIEmitter( } function validateComponentFixedFieldKey(type: Type, name: string) { - // eslint-disable-next-line no-useless-escape - const pattern = /^[a-zA-Z0-9\.\-_]+$/; + const pattern = /^[a-zA-Z0-9.\-_]+$/; if (!pattern.test(name)) { program.reportDiagnostic( createDiagnostic({ From 748f88837c77c2ff6c05e376a0e73ecfcb5c39f2 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 14 Nov 2024 11:55:01 +0800 Subject: [PATCH 13/13] Update packages/openapi3/src/lib.ts Co-authored-by: Mark Cowlishaw --- packages/openapi3/src/lib.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi3/src/lib.ts b/packages/openapi3/src/lib.ts index 3098074aa95..bd994c9a85c 100644 --- a/packages/openapi3/src/lib.ts +++ b/packages/openapi3/src/lib.ts @@ -278,7 +278,7 @@ export const libDef = { "invalid-component-fixed-field-key": { severity: "error", messages: { - default: paramMessage`Invalid key '${"value"}' used in fixed fields of Component object. Only keys matching the regular expression to ^[a-zA-Z0-9.\-_]+$ are allowed.`, + default: paramMessage`Invalid key '${"value"}' used in a fixed field of the Component object. Only alphanumerics, dot (.), hyphen (-), and underscore (_) characters are allowed in keys.`, }, }, },