From 32fa5d43684d9418664a720ba0b7995315c0fbd9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 19:14:42 +0000 Subject: [PATCH 1/8] Initial plan From 7e9bf24513116af9c32bf98e490b0c7795ee8ea4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 19:20:30 +0000 Subject: [PATCH 2/8] Add null check to MutabilityWithReadOnly given clause and test Co-authored-by: mikeharder <9459391+mikeharder@users.noreply.github.com> --- packages/rulesets/generated/spectral/az-arm.js | 2 +- .../rulesets/generated/spectral/az-common.js | 2 +- .../rulesets/generated/spectral/az-dataplane.js | 2 +- packages/rulesets/src/spectral/az-common.ts | 2 +- .../test/mutability-with-read-only.test.ts | 16 ++++++++++++++++ 5 files changed, 20 insertions(+), 4 deletions(-) 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); + }); +}); From c585103f3f5788bc3874cb663934929e8ce9eee4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 19:22:23 +0000 Subject: [PATCH 3/8] Bump version to 2.2.3 and update CHANGELOG Co-authored-by: mikeharder <9459391+mikeharder@users.noreply.github.com> --- packages/rulesets/CHANGELOG.md | 6 ++++++ packages/rulesets/package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/rulesets/CHANGELOG.md b/packages/rulesets/CHANGELOG.md index f4bb1a521..6c0c29201 100644 --- a/packages/rulesets/CHANGELOG.md +++ b/packages/rulesets/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log - @microsoft.azure/openapi-validator-rulesets +## 2.2.3 + +### Patches + +- [MutabilityWithReadOnly] Add null check to given clause filter to prevent null property objects from being processed + ## 2.2.2 ### Patches diff --git a/packages/rulesets/package.json b/packages/rulesets/package.json index 7f49b0ffc..60594f4ab 100644 --- a/packages/rulesets/package.json +++ b/packages/rulesets/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft.azure/openapi-validator-rulesets", - "version": "2.2.2", + "version": "2.2.3", "description": "Azure OpenAPI Validator", "main": "dist/index.js", "files": [ From 2611e13fa5aa7f7bff2eb81566614bdb688c0a7b Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Mon, 2 Feb 2026 11:29:05 -0800 Subject: [PATCH 4/8] Apply suggestion from @mikeharder --- packages/rulesets/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rulesets/package.json b/packages/rulesets/package.json index 60594f4ab..7f49b0ffc 100644 --- a/packages/rulesets/package.json +++ b/packages/rulesets/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft.azure/openapi-validator-rulesets", - "version": "2.2.3", + "version": "2.2.2", "description": "Azure OpenAPI Validator", "main": "dist/index.js", "files": [ From ebc300f335f3fe36694e6e97f665c1e9a4e68fe1 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Mon, 2 Feb 2026 11:30:08 -0800 Subject: [PATCH 5/8] Apply suggestion from @mikeharder --- packages/rulesets/CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/rulesets/CHANGELOG.md b/packages/rulesets/CHANGELOG.md index 6c0c29201..394724ca6 100644 --- a/packages/rulesets/CHANGELOG.md +++ b/packages/rulesets/CHANGELOG.md @@ -13,7 +13,14 @@ - 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 -## 2.2.1 +## 2.2.2 + +### 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 + ### Patches From 784f044d905c25c324abb7c2c9e9003b20411de2 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Mon, 2 Feb 2026 11:30:58 -0800 Subject: [PATCH 6/8] Update CHANGELOG.md to remove version 2.2.3 Removed version 2.2.3 details and consolidated changelog entries. --- packages/rulesets/CHANGELOG.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/rulesets/CHANGELOG.md b/packages/rulesets/CHANGELOG.md index 394724ca6..df8f5d01c 100644 --- a/packages/rulesets/CHANGELOG.md +++ b/packages/rulesets/CHANGELOG.md @@ -1,18 +1,5 @@ # Change Log - @microsoft.azure/openapi-validator-rulesets -## 2.2.3 - -### Patches - -- [MutabilityWithReadOnly] Add null check to given clause filter to prevent null property objects from being processed - -## 2.2.2 - -### Patches - -- 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 - ## 2.2.2 ### Patches @@ -21,6 +8,7 @@ - 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 +## 2.2.1 ### Patches From ed59965f16d9ea46727ef776dbb766f765213f4c Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Mon, 2 Feb 2026 20:07:35 +0000 Subject: [PATCH 7/8] empty From 62b153df45d6f70998d55e2fa9185e04bdee06b8 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 3 Feb 2026 00:46:59 +0000 Subject: [PATCH 8/8] empty