diff --git a/.changeset/fresh-cheetahs-love.md b/.changeset/fresh-cheetahs-love.md new file mode 100644 index 00000000..8d897114 --- /dev/null +++ b/.changeset/fresh-cheetahs-love.md @@ -0,0 +1,6 @@ +--- +"@redocly/openapi-core": patch +"@redocly/cli": patch +--- + +Fixed `camelCase` assertion for single-letter values. diff --git a/packages/core/src/rules/common/assertions/__tests__/asserts.test.ts b/packages/core/src/rules/common/assertions/__tests__/asserts.test.ts index 45f8bf0c..4367ba93 100644 --- a/packages/core/src/rules/common/assertions/__tests__/asserts.test.ts +++ b/packages/core/src/rules/common/assertions/__tests__/asserts.test.ts @@ -317,6 +317,14 @@ describe('oas3 assertions', () => { expect(asserts.casing(['testExample', 'fooBar'], 'camelCase', assertionProperties)).toEqual( [] ); + expect(asserts.casing(['f'], 'camelCase', assertionProperties)).toEqual([]); + expect(asserts.casing(['Q'], 'camelCase', assertionProperties)).toEqual([ + { + message: '"Q" should use camelCase', + location: baseLocation.child('Q').key(), + }, + ]); + expect(asserts.casing(['fQ'], 'camelCase', assertionProperties)).toEqual([]); expect(asserts.casing(['testExample', 'FooBar'], 'camelCase', assertionProperties)).toEqual( [ { diff --git a/packages/core/src/rules/common/assertions/asserts.ts b/packages/core/src/rules/common/assertions/asserts.ts index 6794f989..87eb2767 100644 --- a/packages/core/src/rules/common/assertions/asserts.ts +++ b/packages/core/src/rules/common/assertions/asserts.ts @@ -243,7 +243,7 @@ export const asserts: Asserts = { if (typeof value === 'undefined' || isPlainObject(value)) return []; // property doesn't exist or is an object, no need to lint it with this assert const values = Array.isArray(value) ? value : [value]; const casingRegexes: Record = { - camelCase: /^[a-z][a-zA-Z0-9]+$/g, + camelCase: /^[a-z][a-zA-Z0-9]*$/g, 'kebab-case': /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/g, snake_case: /^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/g, PascalCase: /^[A-Z][a-zA-Z0-9]+$/g,