@azure-tools/typespec-azure-resource-manager 0.41.0-dev.7 → 0.41.0-dev.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/linter.d.ts.map +1 -1
- package/dist/src/linter.js +4 -0
- package/dist/src/linter.js.map +1 -1
- package/dist/src/rules/arm-delete-response-codes.d.ts.map +1 -1
- package/dist/src/rules/arm-delete-response-codes.js +17 -16
- package/dist/src/rules/arm-delete-response-codes.js.map +1 -1
- package/dist/src/rules/arm-resource-name-pattern.d.ts +7 -0
- package/dist/src/rules/arm-resource-name-pattern.d.ts.map +1 -0
- package/dist/src/rules/arm-resource-name-pattern.js +64 -0
- package/dist/src/rules/arm-resource-name-pattern.js.map +1 -0
- package/dist/src/rules/lro-location-header.d.ts +7 -0
- package/dist/src/rules/lro-location-header.d.ts.map +1 -0
- package/dist/src/rules/lro-location-header.js +47 -0
- package/dist/src/rules/lro-location-header.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -40,6 +40,7 @@ Available ruleSets:
|
|
|
40
40
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-envelope-property` | Check for invalid resource envelope properties. |
|
|
41
41
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-version-format` | Check for valid versions. |
|
|
42
42
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-key-invalid-chars` | Arm resource key must contain only alphanumeric characters. |
|
|
43
|
+
| [`@azure-tools/typespec-azure-resource-manager/arm-resource-name-pattern`](https://azure.github.io/typespec-azure/docs/libraries/azure-resource-manager/rules/resource-name-pattern) | The resource name parameter should be defined with a 'pattern' restriction. |
|
|
43
44
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response` | [RPC 008]: PUT, GET, PATCH & LIST must return the same resource schema. |
|
|
44
45
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-path-segment-invalid-chars` | Arm resource name must contain only alphanumeric characters. |
|
|
45
46
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state` | Check for properly configured provisioningState property. |
|
|
@@ -50,6 +51,7 @@ Available ruleSets:
|
|
|
50
51
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator` | Each resource interface must have an @armResourceOperations decorator. |
|
|
51
52
|
| `@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-action-verb` | Actions must be HTTP Post operations. |
|
|
52
53
|
| `@azure-tools/typespec-azure-resource-manager/improper-subscription-list-operation` | Tenant and Extension resources should not define a list by subscription operation. |
|
|
54
|
+
| [`@azure-tools/typespec-azure-resource-manager/lro-location-header`](https://azure.github.io/typespec-azure/docs/libraries/azure-resource-manager/rules/lro-location-header) | A 202 response should include a Location response header. |
|
|
53
55
|
| [`@azure-tools/typespec-azure-resource-manager/missing-x-ms-identifiers`](https://azure.github.io/typespec-azure/docs/libraries/azure-resource-manager/rules/missing-x-ms-identifiers) | Azure services should not use enums. |
|
|
54
56
|
| `@azure-tools/typespec-azure-resource-manager/no-response-body` | The body of 202 response should be empty. |
|
|
55
57
|
| `@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint` | Check for missing Operations interface. |
|
package/dist/src/linter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"AAqEA,eAAO,MAAM,OAAO,+CAmBlB,CAAC"}
|
package/dist/src/linter.js
CHANGED
|
@@ -11,6 +11,7 @@ import { invalidActionVerbRule } from "./rules/arm-resource-invalid-action-verb.
|
|
|
11
11
|
import { armResourceEnvelopeProperties } from "./rules/arm-resource-invalid-envelope-property.js";
|
|
12
12
|
import { armResourceInvalidVersionFormatRule } from "./rules/arm-resource-invalid-version-format.js";
|
|
13
13
|
import { armResourceKeyInvalidCharsRule } from "./rules/arm-resource-key-invalid-chars.js";
|
|
14
|
+
import { armResourceNamePatternRule } from "./rules/arm-resource-name-pattern.js";
|
|
14
15
|
import { armResourceOperationsRule } from "./rules/arm-resource-operation-response.js";
|
|
15
16
|
import { patchOperationsRule } from "./rules/arm-resource-patch.js";
|
|
16
17
|
import { armResourcePathInvalidCharsRule } from "./rules/arm-resource-path-invalid-chars.js";
|
|
@@ -20,6 +21,7 @@ import { coreOperationsRule } from "./rules/core-operations.js";
|
|
|
20
21
|
import { deleteOperationMissingRule } from "./rules/delete-operation.js";
|
|
21
22
|
import { envelopePropertiesRules } from "./rules/envelope-properties.js";
|
|
22
23
|
import { listBySubscriptionRule } from "./rules/list-operation.js";
|
|
24
|
+
import { lroLocationHeaderRule } from "./rules/lro-location-header.js";
|
|
23
25
|
import { missingXmsIdentifiersRule } from "./rules/missing-x-ms-identifiers.js";
|
|
24
26
|
import { noResponseBodyRule } from "./rules/no-response-body.js";
|
|
25
27
|
import { operationsInterfaceMissingRule } from "./rules/operations-interface-missing.js";
|
|
@@ -38,6 +40,7 @@ const rules = [
|
|
|
38
40
|
armResourceEnvelopeProperties,
|
|
39
41
|
armResourceInvalidVersionFormatRule,
|
|
40
42
|
armResourceKeyInvalidCharsRule,
|
|
43
|
+
armResourceNamePatternRule,
|
|
41
44
|
armResourceOperationsRule,
|
|
42
45
|
armResourcePathInvalidCharsRule,
|
|
43
46
|
armResourceProvisioningStateRule,
|
|
@@ -48,6 +51,7 @@ const rules = [
|
|
|
48
51
|
interfacesRule,
|
|
49
52
|
invalidActionVerbRule,
|
|
50
53
|
listBySubscriptionRule,
|
|
54
|
+
lroLocationHeaderRule,
|
|
51
55
|
missingXmsIdentifiersRule,
|
|
52
56
|
noResponseBodyRule,
|
|
53
57
|
operationsInterfaceMissingRule,
|
package/dist/src/linter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arm-delete-response-codes.d.ts","sourceRoot":"","sources":["../../../src/rules/arm-delete-response-codes.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;
|
|
1
|
+
{"version":3,"file":"arm-delete-response-codes.d.ts","sourceRoot":"","sources":["../../../src/rules/arm-delete-response-codes.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;EAqCrC,CAAC"}
|
|
@@ -15,22 +15,23 @@ export const armDeleteResponseCodesRule = createRule({
|
|
|
15
15
|
},
|
|
16
16
|
create(context) {
|
|
17
17
|
return {
|
|
18
|
-
|
|
19
|
-
const resources = getArmResources(
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
18
|
+
root: (program) => {
|
|
19
|
+
const resources = getArmResources(program);
|
|
20
|
+
for (const resource of resources) {
|
|
21
|
+
if (resource.operations.lifecycle.delete) {
|
|
22
|
+
const deleteOperation = resource.operations.lifecycle.delete;
|
|
23
|
+
const isAsync = getLroMetadata(context.program, deleteOperation.operation) !== undefined;
|
|
24
|
+
const httpOp = deleteOperation.httpOperation;
|
|
25
|
+
const statusCodes = new Set([...httpOp.responses.map((r) => r.statusCodes.toString())]);
|
|
26
|
+
const expected = new Set(["204", "*"]);
|
|
27
|
+
expected.add(isAsync ? "202" : "200");
|
|
28
|
+
if (statusCodes.size !== expected.size ||
|
|
29
|
+
![...statusCodes].every((v) => expected.has(v))) {
|
|
30
|
+
context.reportDiagnostic({
|
|
31
|
+
target: deleteOperation.operation,
|
|
32
|
+
messageId: isAsync ? "async" : "sync",
|
|
33
|
+
});
|
|
34
|
+
}
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arm-delete-response-codes.js","sourceRoot":"","sources":["../../../src/rules/arm-delete-response-codes.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"arm-delete-response-codes.js","sourceRoot":"","sources":["../../../src/rules/arm-delete-response-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC;IACnD,IAAI,EAAE,qCAAqC;IAC3C,QAAQ,EAAE,SAAS;IACnB,GAAG,EAAE,oHAAoH;IACzH,WAAW,EAAE,6DAA6D;IAC1E,QAAQ,EAAE;QACR,IAAI,EAAE,sKAAsK;QAC5K,KAAK,EAAE,iLAAiL;KACzL;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,IAAI,EAAE,CAAC,OAAgB,EAAE,EAAE;gBACzB,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;wBACzC,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;wBAC7D,MAAM,OAAO,GACX,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC;wBAC3E,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC;wBAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;wBACxF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;wBACvC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBAEtC,IACE,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;4BAClC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAC/C,CAAC;4BACD,OAAO,CAAC,gBAAgB,CAAC;gCACvB,MAAM,EAAE,eAAe,CAAC,SAAS;gCACjC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;6BACtC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verify that a delete operation only
|
|
3
|
+
*/
|
|
4
|
+
export declare const armResourceNamePatternRule: import("@typespec/compiler").LinterRuleDefinition<"arm-resource-name-pattern", {
|
|
5
|
+
readonly default: "The resource name parameter should be defined with a 'pattern' restriction. Decorate the \"name\" property in the resource definition using the @pattern decorator, with a regular expression indicating the allowed characters in the resource name.";
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=arm-resource-name-pattern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arm-resource-name-pattern.d.ts","sourceRoot":"","sources":["../../../src/rules/arm-resource-name-pattern.ts"],"names":[],"mappings":"AA0CA;;GAEG;AACH,eAAO,MAAM,0BAA0B;;EA4BrC,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createRule, defineCodeFix, getPattern, getSourceLocation, } from "@typespec/compiler";
|
|
2
|
+
import { getArmResources } from "../resource.js";
|
|
3
|
+
// TODO: Replace this with a reusable implementation from the compiler package when implemented.
|
|
4
|
+
// Issue: https://github.com/microsoft/typespec/issues/3044
|
|
5
|
+
function createPatternCodeFix(diagnosticTarget) {
|
|
6
|
+
return defineCodeFix({
|
|
7
|
+
id: "add-pattern-decorator",
|
|
8
|
+
label: "Add `@pattern` decorator to the resource name property with the default ARM pattern.",
|
|
9
|
+
fix: (context) => {
|
|
10
|
+
const location = getSourceLocation(diagnosticTarget);
|
|
11
|
+
const { lineStart, indent } = findLineStartAndIndent(location);
|
|
12
|
+
const updatedLocation = { ...location, pos: lineStart };
|
|
13
|
+
return context.prependText(updatedLocation, `${indent}@pattern(/^[a-zA-Z0-9-]{3,24}$/)\n`);
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function findLineStartAndIndent(location) {
|
|
18
|
+
const text = location.file.text;
|
|
19
|
+
let pos = location.pos;
|
|
20
|
+
let indent = 0;
|
|
21
|
+
while (pos > 0 && text[pos - 1] !== "\n") {
|
|
22
|
+
if ([" ", "\t", "\n"].includes(text[pos - 1])) {
|
|
23
|
+
indent++;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
indent = 0;
|
|
27
|
+
}
|
|
28
|
+
pos--;
|
|
29
|
+
}
|
|
30
|
+
return { lineStart: pos, indent: location.file.text.slice(pos, pos + indent) };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Verify that a delete operation only
|
|
34
|
+
*/
|
|
35
|
+
export const armResourceNamePatternRule = createRule({
|
|
36
|
+
name: "arm-resource-name-pattern",
|
|
37
|
+
severity: "warning",
|
|
38
|
+
url: "https://azure.github.io/typespec-azure/docs/libraries/azure-resource-manager/rules/resource-name-pattern",
|
|
39
|
+
description: "The resource name parameter should be defined with a 'pattern' restriction.",
|
|
40
|
+
messages: {
|
|
41
|
+
default: `The resource name parameter should be defined with a 'pattern' restriction. Decorate the "name" property in the resource definition using the @pattern decorator, with a regular expression indicating the allowed characters in the resource name.`,
|
|
42
|
+
},
|
|
43
|
+
create(context) {
|
|
44
|
+
return {
|
|
45
|
+
root: (program) => {
|
|
46
|
+
const resources = getArmResources(program);
|
|
47
|
+
for (const resource of resources) {
|
|
48
|
+
// find the name property
|
|
49
|
+
const nameProperty = resource.typespecType.properties.get("name");
|
|
50
|
+
if (nameProperty !== undefined) {
|
|
51
|
+
const pattern = getPattern(program, nameProperty);
|
|
52
|
+
if (pattern === undefined) {
|
|
53
|
+
context.reportDiagnostic({
|
|
54
|
+
target: nameProperty,
|
|
55
|
+
codefixes: [createPatternCodeFix(nameProperty)],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=arm-resource-name-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arm-resource-name-pattern.js","sourceRoot":"","sources":["../../../src/rules/arm-resource-name-pattern.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,UAAU,EACV,aAAa,EACb,UAAU,EACV,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,gGAAgG;AAChG,2DAA2D;AAC3D,SAAS,oBAAoB,CAAC,gBAAkC;IAC9D,OAAO,aAAa,CAAC;QACnB,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,sFAAsF;QAC7F,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;YACf,MAAM,QAAQ,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACrD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YACxD,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,MAAM,oCAAoC,CAAC,CAAC;QAC7F,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAwB;IACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;IACvB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;QACD,GAAG,EAAE,CAAC;IACR,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAU,CAAC;IACnD,IAAI,EAAE,2BAA2B;IACjC,QAAQ,EAAE,SAAS;IACnB,GAAG,EAAE,0GAA0G;IAC/G,WAAW,EAAE,6EAA6E;IAC1F,QAAQ,EAAE;QACR,OAAO,EAAE,sPAAsP;KAChQ;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,IAAI,EAAE,CAAC,OAAgB,EAAE,EAAE;gBACzB,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,yBAAyB;oBACzB,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAClE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;wBAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;wBAClD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;4BAC1B,OAAO,CAAC,gBAAgB,CAAC;gCACvB,MAAM,EAAE,YAAY;gCACpB,SAAS,EAAE,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;6BAChD,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure that LRO 202 responses have a Location Header.
|
|
3
|
+
*/
|
|
4
|
+
export declare const lroLocationHeaderRule: import("@typespec/compiler").LinterRuleDefinition<"lro-location-header", {
|
|
5
|
+
readonly default: "A 202 response should include a Location response header.";
|
|
6
|
+
}>;
|
|
7
|
+
//# sourceMappingURL=lro-location-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lro-location-header.d.ts","sourceRoot":"","sources":["../../../src/rules/lro-location-header.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,eAAO,MAAM,qBAAqB;;EA6BhC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createRule } from "@typespec/compiler";
|
|
2
|
+
import { getHttpOperation } from "@typespec/http";
|
|
3
|
+
function getCaseInsensitiveHeader(headers, key) {
|
|
4
|
+
if (!headers) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
for (const header of Object.keys(headers)) {
|
|
8
|
+
if (header.toLowerCase() === key.toLowerCase()) {
|
|
9
|
+
return header;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Ensure that LRO 202 responses have a Location Header.
|
|
16
|
+
*/
|
|
17
|
+
export const lroLocationHeaderRule = createRule({
|
|
18
|
+
name: "lro-location-header",
|
|
19
|
+
severity: "warning",
|
|
20
|
+
url: "https://azure.github.io/typespec-azure/docs/libraries/azure-resource-manager/rules/lro-location-header",
|
|
21
|
+
description: "A 202 response should include a Location response header.",
|
|
22
|
+
messages: {
|
|
23
|
+
default: `A 202 response should include a Location response header.`,
|
|
24
|
+
},
|
|
25
|
+
create(context) {
|
|
26
|
+
return {
|
|
27
|
+
operation: (op) => {
|
|
28
|
+
const [httpOperation, _] = getHttpOperation(context.program, op);
|
|
29
|
+
const responses = httpOperation.responses;
|
|
30
|
+
for (const response of responses) {
|
|
31
|
+
if (response.statusCodes !== 202) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
for (const resp of response.responses) {
|
|
35
|
+
if (getCaseInsensitiveHeader(resp.headers, "Location") === undefined) {
|
|
36
|
+
context.reportDiagnostic({
|
|
37
|
+
target: op,
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=lro-location-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lro-location-header.js","sourceRoot":"","sources":["../../../src/rules/lro-location-header.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,SAAS,wBAAwB,CAC/B,OAAkD,EAClD,GAAW;IAEX,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;IAC9C,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,SAAS;IACnB,GAAG,EAAE,wGAAwG;IAC7G,WAAW,EAAE,2DAA2D;IACxE,QAAQ,EAAE;QACR,OAAO,EAAE,2DAA2D;KACrE;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,SAAS,EAAE,CAAC,EAAa,EAAE,EAAE;gBAC3B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACjE,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;gBAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,IAAI,QAAQ,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;wBACjC,SAAS;oBACX,CAAC;oBACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;wBACtC,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;4BACrE,OAAO,CAAC,gBAAgB,CAAC;gCACvB,MAAM,EAAE,EAAE;6BACX,CAAC,CAAC;4BACH,OAAO;wBACT,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azure-tools/typespec-azure-resource-manager",
|
|
3
|
-
"version": "0.41.0-dev.
|
|
3
|
+
"version": "0.41.0-dev.9",
|
|
4
4
|
"author": "Microsoft Corporation",
|
|
5
5
|
"description": "TypeSpec Azure Resource Manager library",
|
|
6
6
|
"homepage": "https://azure.github.io/typespec-azure",
|