From 527b486885ac5c2897b4b435f78655124ee2ac20 Mon Sep 17 00:00:00 2001 From: jianyexi Date: Wed, 9 Nov 2022 17:33:36 +0800 Subject: [PATCH 1/4] update doc files --- docs/rules.md | 98 ++++++++++--------- ...ubscriptions-and-resource-group-casing.md} | 0 ...es.md => un-supported-patch-properties.md} | 0 3 files changed, 53 insertions(+), 45 deletions(-) rename docs/{subscriptions-and-resourcegroup-casing.md => subscriptions-and-resource-group-casing.md} (100%) rename docs/{unsupported-patch-properties.md => un-supported-patch-properties.md} (100%) diff --git a/docs/rules.md b/docs/rules.md index 7dd4ba390..e24376fa2 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -56,14 +56,13 @@ Please refer to [api-version-parameter-required.md](./api-version-parameter-requ ### APIVersionPattern -The API Version parameter MUST be in the Year-Month-Date format (i.e. 2016-07-04.) NOTE that this is the en-US ordering of month and date. +The API Version parameter MUST be in the Year-Month-Date format (i.e. 2016-07-04.) NOTE that this is the en-US ordering of month and date. The date MAY optionally be followed by one of: - -- -preview - Indicates the API version is in (public) preview -- -alpha -- -beta -- -rc (release candidate) -- -privatepreview +* -preview - Indicates the API version is in (public) preview +* -alpha +* -beta +* -rc (release candidate) +* -privatepreview Please refer to [api-version-pattern.md](./api-version-pattern.md) for details. @@ -173,6 +172,12 @@ The default error response schema SHOULD correspond to the schema documented at Please refer to [default-error-response-schema.md](./default-error-response-schema.md) for details. +### DefaultInEnum + +This rule applies when the default value specified by the property does not appear in the enum constraint for a schema. + +Please refer to [default-in-enum.md](./default-in-enum.md) for details. + ### DefaultMustBeInEnum The value assigned as a default for an enum property must be present in the enums' list. @@ -188,10 +193,10 @@ Please refer to [default-response.md](./default-response.md) for details. ### DefinitionsPropertiesNamesCamelCase Property names must use lowerCamelCase style. -If the property is a single word (ex: foo, bar, etc.) it will be all lowercase. -Two-letter acronyms (ex: ID, IO, IP, etc.) should be capitalized. -Three-letter acronyms (ex: API, URL, etc.) should only have the first letter capitalized (ex: Api, Url, etc.) -For more capitalization guidance, see: [https://msdn.microsoft.com/en-us/library/141e06ef(v=vs.71).aspx]() +If the property is a single word (ex: foo, bar, etc.) it will be all lowercase. +Two-letter acronyms (ex: ID, IO, IP, etc.) should be capitalized. +Three-letter acronyms (ex: API, URL, etc.) should only have the first letter capitalized (ex: Api, Url, etc.) +For more capitalization guidance, see: [https://msdn.microsoft.com/en-us/library/141e06ef(v=vs.71).aspx](https://msdn.microsoft.com/en-us/library/141e06ef(v=vs.71).aspx) Please refer to [definitions-properties-names-camel-case.md](./definitions-properties-names-camel-case.md) for details. @@ -344,7 +349,6 @@ Please refer to [header-disallowed.md](./header-disallowed.md) for details. ### HostParametersValidation This is to validate if parameters in the 'x-ms-parameterized-host' follow the following rules:: - 1. If a parameter matches belows, therefore it must be called 'endpoint' and be typed 'type:string, format:url'. - Client level (x-ms-parameter-location: client) - A path component (in: path) @@ -423,6 +427,13 @@ Please refer to [long-running-operations-with-long-running-extension.md](./long- For ARM spec, the allowed response status codes for a long DELETE operation are "200" & "204"; the allowed response status codes for a POST operation are "200", "201" ,"202", & "204"; the allowed response status codes for a PUT/PATCH operation are "200" & "201". For Data plane spec, the allowed response status codes for a long DELETE operation are "200","202", & "204"; the allowed response status codes for a POST operation are "200", "201" ,"202", & "204"; the allowed response status codes for a PUT/PATCH operation are "200","201", & "202". +Please refer to [long-running-response-status-code-data-plane.md](./long-running-response-status-code-data-plane.md) for details. + +### LongRunningResponseStatusCode + +For ARM spec, the allowed response status codes for a long DELETE operation are "200" & "204"; the allowed response status codes for a POST operation are "200", "201" ,"202", & "204"; the allowed response status codes for a PUT/PATCH operation are "200" & "201". +For Data plane spec, the allowed response status codes for a long DELETE operation are "200","202", & "204"; the allowed response status codes for a POST operation are "200", "201" ,"202", & "204"; the allowed response status codes for a PUT/PATCH operation are "200","201", & "202". + Please refer to [long-running-response-status-code.md](./long-running-response-status-code.md) for details. ### LroExtension @@ -681,7 +692,7 @@ Please refer to [patch-sku-property.md](./patch-sku-property.md) for details. ### PathCharacters Path should contain only recommended characters. -The recommended characters are 0-9, A-Z, a-z, -, ., \_, ~, and :. +The recommended characters are 0-9, A-Z, a-z, -, ., _, ~, and :. Please refer to [path-characters.md](./path-characters.md) for details. @@ -695,7 +706,6 @@ Please refer to [path-contains-resource-group.md](./path-contains-resource-group Per ARM RPC,Uri for resource CRUD methods MUST contain a resource type. Uri path starts with \/providers/\/\ format, where - - \ is one of: 1. Tenant/Global: '/' 2. Subscription: "/subscriptions/{subscriptionId}" @@ -771,7 +781,7 @@ Using post for a create operation is discouraged. Please refer to [post-201-response.md](./post-201-response.md) for details. -### PostLongRunningOperation202Only +### PostOperationAsyncResponseValidation An async POST operation response include status code 202 with 'Location' header. Must support status code 200 if operation can be completed synchronously. Operation must also add "x-ms-long-running-operation and x-ms-long-running-operation-options" to mark that it is a long running operation (in case of 202) and how it is tracked (Location header). @@ -792,7 +802,6 @@ Please refer to [preview-version-over-one-year.md](./preview-version-over-one-ye ### PrivateEndpointResourceSchemaValidation This rule is to check if the schemas used by private endpoint conform to the common [privateLink](https://github.com/Azure/azure-rest-api-specs/blob/main/specification/common-types/resource-management/v1/privatelinks.json). The rule will check the schemas of following models and their properties: - 1. PrivateEndpointConnection 2. PrivateEndpointConnectionProperties 3. PrivateEndpointConnectionListResult @@ -930,34 +939,34 @@ Every schema should specify a well-defined combination of `type` and `format`. and not allowed for any other types. The well-defined type/format combinations are: **type: integer** -| format | description | comments | +| format | description | comments | | -------- | --------------- | ------------------------- | -| int32 | signed 32 bits | from [oas2][oas2] | -| int64 | signed 64 bits | from [oas2][oas2] | +| int32 | signed 32 bits | from [oas2][oas2] | +| int64 | signed 64 bits | from [oas2][oas2] | | unixtime | Unix time stamp | from [autorest][autorest] | **type: number** -| format | description | comments | +| format | description | comments | | ------- | ---------------------- | ------------------------- | -| float | 32 bit floating point | from [oas2][oas2] | -| int64 | 64 bit floating point | from [oas2][oas2] | +| float | 32 bit floating point | from [oas2][oas2] | +| int64 | 64 bit floating point | from [oas2][oas2] | | decimal | 128 bit floating point | from [autorest][autorest] | **type: string** -| format | description | comments | +| format | description | comments | | ----------------- | ---------------------------- | ------------------------- | -| byte | base64 encoded characters | from [oas2][oas2] | -| binary | any sequence of octets | from [oas2][oas2] | -| date | [RFC3339][rfc3339] full-date | from [oas2][oas2] | -| date-time | [RFC3339][rfc3339] date-time | from [oas2][oas2] | -| password | sensitive value | from [oas2][oas2] | -| char | | from [autorest][autorest] | -| time | | from [autorest][autorest] | -| date-time-rfc1123 | | from [autorest][autorest] | -| duration | | from [autorest][autorest] | -| uuid | | from [autorest][autorest] | -| base64url | | from [autorest][autorest] | -| url | | from [autorest][autorest] | -| odata-query | | from [autorest][autorest] | -| certificate | | from [autorest][autorest] | +| byte | base64 encoded characters | from [oas2][oas2] | +| binary | any sequence of octets | from [oas2][oas2] | +| date | [RFC3339][rfc3339] full-date | from [oas2][oas2] | +| date-time | [RFC3339][rfc3339] date-time | from [oas2][oas2] | +| password | sensitive value | from [oas2][oas2] | +| char | | from [autorest][autorest] | +| time | | from [autorest][autorest] | +| date-time-rfc1123 | | from [autorest][autorest] | +| duration | | from [autorest][autorest] | +| uuid | | from [autorest][autorest] | +| base64url | | from [autorest][autorest] | +| url | | from [autorest][autorest] | +| odata-query | | from [autorest][autorest] | +| certificate | | from [autorest][autorest] | oas2: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md#data-types autorest: https://github.com/Azure/autorest/blob/main/packages/libs/openapi/src/v3/formats.ts rfc3339: https://xml2rfc.tools.ietf.org/public/rfc/ @@ -986,7 +995,7 @@ Please refer to [subscription-id-parameter-in-operations.md](./subscription-id-p The URLs should be checked for consistency. It is easy to type "resourcegroups" instead of "resourceGroups". The current rules allow that through, which causes an issue at the resource provider registration step. When that happens, the APIs get split into two sets in the swagger. The RPaaS registration is very strict and requires the same resource to have all APIs in one set. The pipeline needs to be aware of this kind of behavior and provider URL validation. -Please refer to [subscriptions-and-resourcegroup-casing.md](./subscriptions-and-resourcegroup-casing.md) for details. +Please refer to [subscriptions-and-resource-group-casing.md](./subscriptions-and-resource-group-casing.md) for details. ### SuccessResponseBody @@ -1059,6 +1068,12 @@ Tracked resources must have put operation. Please refer to [tracked-resources-must-have-put.md](./tracked-resources-must-have-put.md) for details. +### UnSupportedPatchProperties + +Patch may not change the name, location, or type of the resource. + +Please refer to [un-supported-patch-properties.md](./un-supported-patch-properties.md) for details. + ### UniqueClientParameterName This may cause a problem when different swagger files come together. If two APIs with different client name have the same client parameter subscriptionId, but with different reference name in swaggers, the generated model will also have two clients with two client parameters subscriptionId and subscriptionId1 (the latter one has been renamed to avoid collision). We should ensure that the client parameters are all unique in the same API version. @@ -1075,7 +1090,6 @@ Please refer to [unique-model-name.md](./unique-model-name.md) for details. This rule will check all the swagger files with the same api-version, and ensure there is no duplicate x-ms-enum name. The following cases are deemed as violation: - 1. if two enums have the same x-ms-enum name , but types are different. 2. if two enums have the same x-ms-enum name , but 'modelAsString' are different. 3. if two enums have the same x-ms-enum name , but include different values. @@ -1089,12 +1103,6 @@ x-ms-example name should be unique in the same API version. Please refer to [unique-xms-example.md](./unique-xms-example.md) for details. -### UnSupportedPatchProperties - -Patch may not change the name, location, or type of the resource. - -Please refer to [unsupported-patch-properties.md](./unsupported-patch-properties.md) for details. - ### ValidFormats Only valid types are allowed for properties. diff --git a/docs/subscriptions-and-resourcegroup-casing.md b/docs/subscriptions-and-resource-group-casing.md similarity index 100% rename from docs/subscriptions-and-resourcegroup-casing.md rename to docs/subscriptions-and-resource-group-casing.md diff --git a/docs/unsupported-patch-properties.md b/docs/un-supported-patch-properties.md similarity index 100% rename from docs/unsupported-patch-properties.md rename to docs/un-supported-patch-properties.md From 3aae12cd1395847f4a2fe9206ef1ec70629ed4f4 Mon Sep 17 00:00:00 2001 From: jianyexi Date: Thu, 10 Nov 2022 15:50:43 +0800 Subject: [PATCH 2/4] fixes for tenant resources --- packages/rulesets/package.json | 2 +- .../functions/arm-resource-validation.ts | 7 ++--- .../CreateOperationAsyncResponseValidation.ts | 1 - .../TopLevelResourcesListBySubscription.ts | 8 +++-- packages/rulesets/src/native/rulesets/arm.ts | 2 +- .../native/tests/individual-azure-tests.ts | 2 +- .../src/native/utilities/arm-helper.ts | 5 +++ .../src/native/utilities/rules-helper.ts | 31 ++++++++++--------- 8 files changed, 33 insertions(+), 25 deletions(-) diff --git a/packages/rulesets/package.json b/packages/rulesets/package.json index a456bd4a1..57aeba086 100644 --- a/packages/rulesets/package.json +++ b/packages/rulesets/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft.azure/openapi-validator-rulesets", - "version": "1.0.0", + "version": "1.0.1", "description": "Azure OpenAPI Validator", "main": "dist/index.js", "scripts": { diff --git a/packages/rulesets/src/native/functions/arm-resource-validation.ts b/packages/rulesets/src/native/functions/arm-resource-validation.ts index cd2ca5c01..0b6c9619e 100644 --- a/packages/rulesets/src/native/functions/arm-resource-validation.ts +++ b/packages/rulesets/src/native/functions/arm-resource-validation.ts @@ -33,9 +33,8 @@ export function* trackedResourceBeyondsThirdLevel(openapiSection: any, options: // support delete operation for all tracked resource , and all top level proxy resources. export function* allResourcesHaveDelete(openapiSection: any, options: {}, ctx: RuleContext) { const armHelper = new ArmHelper(ctx?.document, ctx?.specPath, ctx?.inventory!) - const allTrackedResources = armHelper.getTrackedResources() - const allTopLevelResource = armHelper.getTopLevelResources() - const allResources = _.uniq(allTrackedResources.concat(allTopLevelResource)) + const allTrackedResources = armHelper.getTrackedResources().filter((re) => !armHelper.isTenantResource(re)) + const allResources = _.uniq(allTrackedResources) for (const re of allResources) { const apiPath = re.operations.find((op) => op.apiPath)?.apiPath if (apiPath) { @@ -170,7 +169,7 @@ export function* resourcesHaveRequiredProperties(openapiSection: any, options: { export function* xmsPageableListByRGAndSubscriptions(openapiSection: any, options: {}, ctx: RuleContext) { const armHelper = new ArmHelper(ctx?.document, ctx?.specPath, ctx?.inventory!) - const trackedResources = armHelper.getTrackedResources() + const trackedResources = armHelper.getTrackedResources().filter((re) => !armHelper.isTenantResource(re)) const collectionApiInfos = armHelper.getCollectionApiInfo() function isListByRgAndSubscription(apiPaths: string[]) { return apiPaths.some((p) => armHelper.isPathByResourceGroup(p)) && apiPaths.some((p) => armHelper.isPathBySubscription(p)) diff --git a/packages/rulesets/src/native/legacyRules/CreateOperationAsyncResponseValidation.ts b/packages/rulesets/src/native/legacyRules/CreateOperationAsyncResponseValidation.ts index 3a666a168..ecc5b3521 100644 --- a/packages/rulesets/src/native/legacyRules/CreateOperationAsyncResponseValidation.ts +++ b/packages/rulesets/src/native/legacyRules/CreateOperationAsyncResponseValidation.ts @@ -20,7 +20,6 @@ rules.push({ location: path.concat(["responses", "202"]), } } - const isAsyncOperation = (node["x-ms-long-running-operation"] && node["x-ms-long-running-operation"] === true) || node["x-ms-long-running-operation-options"] diff --git a/packages/rulesets/src/native/legacyRules/TopLevelResourcesListBySubscription.ts b/packages/rulesets/src/native/legacyRules/TopLevelResourcesListBySubscription.ts index b8b2ebfaf..7d399b1c4 100644 --- a/packages/rulesets/src/native/legacyRules/TopLevelResourcesListBySubscription.ts +++ b/packages/rulesets/src/native/legacyRules/TopLevelResourcesListBySubscription.ts @@ -1,6 +1,7 @@ import { JsonPath, rules, MergeStates, OpenApiTypes } from "@microsoft.azure/openapi-validator-core" import { ArmHelper } from "../utilities/arm-helper" +import { isLikeTenantResourcePath } from "../utilities/rules-helper" export const TopLevelResourcesListBySubscription = "TopLevelResourcesListBySubscription" rules.push({ @@ -14,15 +15,16 @@ rules.push({ *run(doc, node, path, ctx) { const msg = 'The top-level resource "{0}" does not have list by subscription operation, please add it.' const utils = new ArmHelper(doc, ctx?.specPath!, ctx?.inventory!) - const topLevelResources = utils.getTopLevelResourceNames() + const topLevelResources = utils.getTopLevelResources().filter((re) => !re.operations.some((op) => isLikeTenantResourcePath(op.apiPath))) const allCollectionApis = utils.getCollectionApiInfo() for (const resource of topLevelResources) { const hasMatched = allCollectionApis.some( - (collection) => resource === collection.childModelName && collection.collectionGetPath.some((p) => utils.isPathBySubscription(p)) + (collection) => + resource.modelName === collection.childModelName && collection.collectionGetPath.some((p) => utils.isPathBySubscription(p)) ) if (!hasMatched) { yield { - message: msg.replace("{0}", resource), + message: msg.replace("{0}", resource.modelName), location: ["$", "definitions", resource] as JsonPath, } } diff --git a/packages/rulesets/src/native/rulesets/arm.ts b/packages/rulesets/src/native/rulesets/arm.ts index 319e9af6e..a20b52420 100644 --- a/packages/rulesets/src/native/rulesets/arm.ts +++ b/packages/rulesets/src/native/rulesets/arm.ts @@ -33,7 +33,7 @@ export const armRuleset: IRuleSet = { }, }, // https://github.com/Azure/azure-openapi-validator/issues/329 - AllResourcesMustHaveDelete: { + TrackedResourcesMustHaveDelete: { category: "ARMViolation", openapiType: OpenApiTypes.arm, severity: "error", diff --git a/packages/rulesets/src/native/tests/individual-azure-tests.ts b/packages/rulesets/src/native/tests/individual-azure-tests.ts index 94d8a82e4..0d47914d4 100644 --- a/packages/rulesets/src/native/tests/individual-azure-tests.ts +++ b/packages/rulesets/src/native/tests/individual-azure-tests.ts @@ -410,7 +410,7 @@ describe("IndividualAzureTests", () => { test("no delete in for tracked resource", async () => { const fileNames = ["armResource/trackedResourceNoDelete.json", "armResource/trackedResourceCommon.json"] - const ruleName = "AllResourcesMustHaveDelete" + const ruleName = "TrackedResourcesMustHaveDelete" const messages: LintResultMessage[] = await collectTestMessagesFromValidator(fileNames, OpenApiTypes.arm, ruleName) assertValidationRuleCount(messages, ruleName, 1) }) diff --git a/packages/rulesets/src/native/utilities/arm-helper.ts b/packages/rulesets/src/native/utilities/arm-helper.ts index 2f05ff4b7..cb5c2e250 100644 --- a/packages/rulesets/src/native/utilities/arm-helper.ts +++ b/packages/rulesets/src/native/utilities/arm-helper.ts @@ -5,6 +5,7 @@ import { ISwaggerInventory, parseJsonRef } from "@microsoft.azure/openapi-validator-core" import _ from "lodash" import { nodes } from "./jsonpath" +import { isLikeTenantResourcePath } from "./rules-helper" import { SwaggerHelper } from "./swagger-helper" import { SwaggerWalker } from "./swagger-walker" import { Workspace } from "./swagger-workspace" @@ -299,6 +300,10 @@ export class ArmHelper { return allTrackedResources } + public isTenantResource(re: ResourceInfo) { + return re.operations.some((op) => isLikeTenantResourcePath(op.apiPath)) + } + public getAllResourceNames() { const fullResources = this.getAllResources() const resources = new Set() diff --git a/packages/rulesets/src/native/utilities/rules-helper.ts b/packages/rulesets/src/native/utilities/rules-helper.ts index 754e32571..e4c04563f 100644 --- a/packages/rulesets/src/native/utilities/rules-helper.ts +++ b/packages/rulesets/src/native/utilities/rules-helper.ts @@ -56,7 +56,7 @@ export function getAllResourceProvidersFromPath(path: string): string[] { return Array.from(matchAll(path, resourceProviderRegex), (m: any) => m[1]) } -export function getProviderNamespace(apiPath:string) { +export function getProviderNamespace(apiPath: string) { const matches = getAllResourceProvidersFromPath(apiPath) if (matches.length) { return matches.pop() @@ -64,19 +64,18 @@ export function getProviderNamespace(apiPath:string) { return undefined } -export function getProviderNamespaceFromPath(filePath:string) { +export function getProviderNamespaceFromPath(filePath: string) { if (!filePath) { return undefined } const resourceProviderRegex = new RegExp(/\/(Microsoft\.\w+)\//i, "g") - const match = Array.from(matchAll(filePath.replace(/\\/g,"/"),resourceProviderRegex), (m: any) => m[1]) + const match = Array.from(matchAll(filePath.replace(/\\/g, "/"), resourceProviderRegex), (m: any) => m[1]) if (match) { return match[0] } return undefined } - export function getAllWordsFromPath(path: string): string[] { const wordRegex = new RegExp(/([\w.]+)/, "g") return Array.from(matchAll(path, wordRegex), (m: any) => m[1]) @@ -138,14 +137,18 @@ export function stringify(path: string[]) { return JSONPath.toPathString(pathWithRoot) } -export function getResourceProvider(inventory:ISwaggerInventory) { +export function getResourceProvider(inventory: ISwaggerInventory) { const walker = new SwaggerWalker(inventory) - let result: string[] = [] - walker.warkAll(["$.paths.*"], (path: string[]) => { - const apiPath = path[2] as string - if (result.length === 0) { - result = [...getAllResourceProvidersFromPath(apiPath)] - } - }) - return result.length ? result.pop() || "" : "" -} \ No newline at end of file + let result: string[] = [] + walker.warkAll(["$.paths.*"], (path: string[]) => { + const apiPath = path[2] as string + if (result.length === 0) { + result = [...getAllResourceProvidersFromPath(apiPath)] + } + }) + return result.length ? result.pop() || "" : "" +} + +export function isLikeTenantResourcePath(path: string) { + return path.toLowerCase().startsWith("/providers/") +} From 858b281054bca368bb70c83f6b7239da0f11302f Mon Sep 17 00:00:00 2001 From: jianyexi Date: Thu, 10 Nov 2022 15:50:59 +0800 Subject: [PATCH 3/4] fix default error response schema rule --- .../src/native/legacyRules/DefaultErrorResponseSchema.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/rulesets/src/native/legacyRules/DefaultErrorResponseSchema.ts b/packages/rulesets/src/native/legacyRules/DefaultErrorResponseSchema.ts index 44e7e4293..2af9aacd7 100644 --- a/packages/rulesets/src/native/legacyRules/DefaultErrorResponseSchema.ts +++ b/packages/rulesets/src/native/legacyRules/DefaultErrorResponseSchema.ts @@ -20,9 +20,8 @@ rules.push({ "the default error response schema does not correspond to the schema documented at https://github.com/Azure/azure-resource-manager-rpc/blob/master/v1.0/common-api-details.md#error-response-content." const response: any = node + const paths = path.concat(["default"]) if (response.default && response.default.schema) { - const paths = path.concat(["default"]) - const schema: any = Workspace.jsonPath(paths.concat("schema"), doc) if (schema) { const errorDefinition = Workspace.getProperty({ file: ctx?.specPath!, value: schema }, "error", ctx?.inventory! as SwaggerInventory) @@ -34,6 +33,8 @@ rules.push({ } } } + } + if (response.default) { yield { message: `${msg}`, location: paths } } }, From b90c3a361baceb8b24d187fbf9bbcc4d6619ce0b Mon Sep 17 00:00:00 2001 From: jianyexi Date: Thu, 10 Nov 2022 16:15:55 +0800 Subject: [PATCH 4/4] add changelog --- .../tenant-resource-fix_2022-11-10-08-15.json | 10 ++++++++++ rush.json | 9 ++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 common/changes/@microsoft.azure/openapi-validator-rulesets/tenant-resource-fix_2022-11-10-08-15.json diff --git a/common/changes/@microsoft.azure/openapi-validator-rulesets/tenant-resource-fix_2022-11-10-08-15.json b/common/changes/@microsoft.azure/openapi-validator-rulesets/tenant-resource-fix_2022-11-10-08-15.json new file mode 100644 index 000000000..2d69ec453 --- /dev/null +++ b/common/changes/@microsoft.azure/openapi-validator-rulesets/tenant-resource-fix_2022-11-10-08-15.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@microsoft.azure/openapi-validator-rulesets", + "comment": "fix tenant resource '", + "type": "patch" + } + ], + "packageName": "@microsoft.azure/openapi-validator-rulesets" +} \ No newline at end of file diff --git a/rush.json b/rush.json index 117b4feb5..b2a152c41 100644 --- a/rush.json +++ b/rush.json @@ -18,15 +18,18 @@ "projects": [ { "packageName": "@microsoft.azure/openapi-validator-core", - "projectFolder": "packages/azure-openapi-validator/core" + "projectFolder": "packages/azure-openapi-validator/core", + "shouldPublish": true }, { "packageName": "@microsoft.azure/openapi-validator", - "projectFolder": "packages/azure-openapi-validator/autorest" + "projectFolder": "packages/azure-openapi-validator/autorest", + "shouldPublish": true }, { "packageName": "@microsoft.azure/openapi-validator-rulesets", - "projectFolder": "packages/rulesets" + "projectFolder": "packages/rulesets", + "shouldPublish": true }, { "packageName": "openapi-validator-regression",