diff --git a/packages/rulesets/CHANGELOG.md b/packages/rulesets/CHANGELOG.md index f4bb1a521..df8f5d01c 100644 --- a/packages/rulesets/CHANGELOG.md +++ b/packages/rulesets/CHANGELOG.md @@ -4,6 +4,7 @@ ### Patches +- [MutabilityWithReadOnly] Add null check to given clause filter - Reduce package size by 88% (6.3MB → 745KB unpacked) by excluding test files and source TypeScript files - Upgrade minimum required Node.js version from 18 to 20 diff --git a/packages/rulesets/generated/spectral/az-arm.js b/packages/rulesets/generated/spectral/az-arm.js index bb2146d44..5b1c4682b 100644 --- a/packages/rulesets/generated/spectral/az-arm.js +++ b/packages/rulesets/generated/spectral/az-arm.js @@ -1065,7 +1065,7 @@ const ruleset$1 = { severity: "error", resolved: true, formats: [oas2], - given: ["$[paths,'x-ms-paths']..*[?(@.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], + given: ["$[paths,'x-ms-paths']..*[?(@ != null && @.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], then: { function: mutabilityWithReadOnly, }, diff --git a/packages/rulesets/generated/spectral/az-common.js b/packages/rulesets/generated/spectral/az-common.js index 8626815ea..828f94750 100644 --- a/packages/rulesets/generated/spectral/az-common.js +++ b/packages/rulesets/generated/spectral/az-common.js @@ -819,7 +819,7 @@ const ruleset = { severity: "error", resolved: true, formats: [oas2], - given: ["$[paths,'x-ms-paths']..*[?(@.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], + given: ["$[paths,'x-ms-paths']..*[?(@ != null && @.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], then: { function: mutabilityWithReadOnly, }, diff --git a/packages/rulesets/generated/spectral/az-dataplane.js b/packages/rulesets/generated/spectral/az-dataplane.js index 9052b283a..63fd59ad0 100644 --- a/packages/rulesets/generated/spectral/az-dataplane.js +++ b/packages/rulesets/generated/spectral/az-dataplane.js @@ -849,7 +849,7 @@ const ruleset$1 = { severity: "error", resolved: true, formats: [oas2], - given: ["$[paths,'x-ms-paths']..*[?(@.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], + given: ["$[paths,'x-ms-paths']..*[?(@ != null && @.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], then: { function: mutabilityWithReadOnly, }, diff --git a/packages/rulesets/src/spectral/az-common.ts b/packages/rulesets/src/spectral/az-common.ts index 605e344cc..26a97f2dc 100644 --- a/packages/rulesets/src/spectral/az-common.ts +++ b/packages/rulesets/src/spectral/az-common.ts @@ -263,7 +263,7 @@ const ruleset: any = { severity: "error", resolved: true, formats: [oas2], - given: ["$[paths,'x-ms-paths']..*[?(@.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], + given: ["$[paths,'x-ms-paths']..*[?(@ != null && @.readOnly !== undefined && @['x-ms-mutability'] !== undefined)]"], then: { function: mutabilityWithReadOnly, }, diff --git a/packages/rulesets/src/spectral/test/mutability-with-read-only.test.ts b/packages/rulesets/src/spectral/test/mutability-with-read-only.test.ts index 9ccaced3f..69d8c5349 100644 --- a/packages/rulesets/src/spectral/test/mutability-with-read-only.test.ts +++ b/packages/rulesets/src/spectral/test/mutability-with-read-only.test.ts @@ -134,3 +134,19 @@ test("MutabilityWithReadOnly: properties ignored by given clause", () => { expect(results.length).toBe(0); }); }); + +test("MutabilityWithReadOnly: null property values are filtered by given clause", () => { + const myOpenApiDocument = createOpenApiDoc({ + nullProperty: null, + validProperty: { + type: "string", + readOnly: true, + "x-ms-mutability": ["read"], + }, + }); + return linter.run(myOpenApiDocument).then((results) => { + // Null property should be filtered out by the given clause (@ != null check) + // Only the valid property should pass through, and it's valid so 0 errors + expect(results.length).toBe(0); + }); +});