@azure-tools/typespec-azure-resource-manager 0.27.0
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/LICENSE +21 -0
- package/README.md +346 -0
- package/dist/src/common-types.d.ts +8 -0
- package/dist/src/common-types.d.ts.map +1 -0
- package/dist/src/common-types.js +14 -0
- package/dist/src/common-types.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/internal.d.ts +44 -0
- package/dist/src/internal.d.ts.map +1 -0
- package/dist/src/internal.js +142 -0
- package/dist/src/internal.js.map +1 -0
- package/dist/src/lib.d.ts +615 -0
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/src/lib.js +250 -0
- package/dist/src/lib.js.map +1 -0
- package/dist/src/linter.d.ts +3 -0
- package/dist/src/linter.d.ts.map +1 -0
- package/dist/src/linter.js +42 -0
- package/dist/src/linter.js.map +1 -0
- package/dist/src/namespace.d.ts +16 -0
- package/dist/src/namespace.d.ts.map +1 -0
- package/dist/src/namespace.js +106 -0
- package/dist/src/namespace.js.map +1 -0
- package/dist/src/operations.d.ts +36 -0
- package/dist/src/operations.d.ts.map +1 -0
- package/dist/src/operations.js +186 -0
- package/dist/src/operations.js.map +1 -0
- package/dist/src/resource.d.ts +81 -0
- package/dist/src/resource.d.ts.map +1 -0
- package/dist/src/resource.js +358 -0
- package/dist/src/resource.js.map +1 -0
- package/dist/src/rules/arm-resource-action-no-segment.d.ts +2 -0
- package/dist/src/rules/arm-resource-action-no-segment.d.ts.map +1 -0
- package/dist/src/rules/arm-resource-action-no-segment.js +31 -0
- package/dist/src/rules/arm-resource-action-no-segment.js.map +1 -0
- package/dist/src/rules/arm-resource-invalid-chars.d.ts +2 -0
- package/dist/src/rules/arm-resource-invalid-chars.d.ts.map +1 -0
- package/dist/src/rules/arm-resource-invalid-chars.js +61 -0
- package/dist/src/rules/arm-resource-invalid-chars.js.map +1 -0
- package/dist/src/rules/arm-resource-invalid-version-format.d.ts +2 -0
- package/dist/src/rules/arm-resource-invalid-version-format.d.ts.map +1 -0
- package/dist/src/rules/arm-resource-invalid-version-format.js +48 -0
- package/dist/src/rules/arm-resource-invalid-version-format.js.map +1 -0
- package/dist/src/rules/arm-resource-operations.d.ts +2 -0
- package/dist/src/rules/arm-resource-operations.d.ts.map +1 -0
- package/dist/src/rules/arm-resource-operations.js +70 -0
- package/dist/src/rules/arm-resource-operations.js.map +1 -0
- package/dist/src/rules/arm-resource-properties.d.ts +2 -0
- package/dist/src/rules/arm-resource-properties.d.ts.map +1 -0
- package/dist/src/rules/arm-resource-properties.js +55 -0
- package/dist/src/rules/arm-resource-properties.js.map +1 -0
- package/dist/src/rules/arm-resource-provisioning-state-rule.d.ts +2 -0
- package/dist/src/rules/arm-resource-provisioning-state-rule.d.ts.map +1 -0
- package/dist/src/rules/arm-resource-provisioning-state-rule.js +62 -0
- package/dist/src/rules/arm-resource-provisioning-state-rule.js.map +1 -0
- package/dist/src/rules/beyond-nesting-levels.d.ts +5 -0
- package/dist/src/rules/beyond-nesting-levels.d.ts.map +1 -0
- package/dist/src/rules/beyond-nesting-levels.js +37 -0
- package/dist/src/rules/beyond-nesting-levels.js.map +1 -0
- package/dist/src/rules/core-operations.d.ts +2 -0
- package/dist/src/rules/core-operations.d.ts.map +1 -0
- package/dist/src/rules/core-operations.js +181 -0
- package/dist/src/rules/core-operations.js.map +1 -0
- package/dist/src/rules/delete-operation.d.ts +5 -0
- package/dist/src/rules/delete-operation.d.ts.map +1 -0
- package/dist/src/rules/delete-operation.js +28 -0
- package/dist/src/rules/delete-operation.js.map +1 -0
- package/dist/src/rules/envelope-properties.d.ts +5 -0
- package/dist/src/rules/envelope-properties.d.ts.map +1 -0
- package/dist/src/rules/envelope-properties.js +62 -0
- package/dist/src/rules/envelope-properties.js.map +1 -0
- package/dist/src/rules/list-operation.d.ts +5 -0
- package/dist/src/rules/list-operation.d.ts.map +1 -0
- package/dist/src/rules/list-operation.js +35 -0
- package/dist/src/rules/list-operation.js.map +1 -0
- package/dist/src/rules/no-response-body.d.ts +5 -0
- package/dist/src/rules/no-response-body.d.ts.map +1 -0
- package/dist/src/rules/no-response-body.js +27 -0
- package/dist/src/rules/no-response-body.js.map +1 -0
- package/dist/src/rules/operations-interface-missing.d.ts +5 -0
- package/dist/src/rules/operations-interface-missing.d.ts.map +1 -0
- package/dist/src/rules/operations-interface-missing.js +37 -0
- package/dist/src/rules/operations-interface-missing.js.map +1 -0
- package/dist/src/rules/resource-name.d.ts +5 -0
- package/dist/src/rules/resource-name.d.ts.map +1 -0
- package/dist/src/rules/resource-name.js +47 -0
- package/dist/src/rules/resource-name.js.map +1 -0
- package/dist/src/rules/retry-after.d.ts +5 -0
- package/dist/src/rules/retry-after.d.ts.map +1 -0
- package/dist/src/rules/retry-after.js +31 -0
- package/dist/src/rules/retry-after.js.map +1 -0
- package/dist/src/rules/unsupported-types.d.ts +5 -0
- package/dist/src/rules/unsupported-types.d.ts.map +1 -0
- package/dist/src/rules/unsupported-types.js +39 -0
- package/dist/src/rules/unsupported-types.js.map +1 -0
- package/dist/src/rules/utils.d.ts +18 -0
- package/dist/src/rules/utils.d.ts.map +1 -0
- package/dist/src/rules/utils.js +77 -0
- package/dist/src/rules/utils.js.map +1 -0
- package/dist/src/testing/index.d.ts +3 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +24 -0
- package/dist/src/testing/index.js.map +1 -0
- package/lib/arm.foundations.tsp +465 -0
- package/lib/arm.tsp +31 -0
- package/lib/decorators.tsp +87 -0
- package/lib/interfaces.tsp +287 -0
- package/lib/models.tsp +203 -0
- package/lib/operations.tsp +260 -0
- package/lib/parameters.tsp +126 -0
- package/lib/responses.tsp +47 -0
- package/package.json +85 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { $doc, ignoreDiagnostics, validateDecoratorParamType, validateDecoratorTarget, } from "@typespec/compiler";
|
|
2
|
+
import { getAllHttpServices } from "@typespec/http";
|
|
3
|
+
import { $actionSegment, getActionSegment, getParentResource, getSegment } from "@typespec/rest";
|
|
4
|
+
import { createStateSymbol, reportDiagnostic } from "./lib.js";
|
|
5
|
+
import { getArmResourceInfo, getResourceBaseType, ResourceBaseType } from "./resource.js";
|
|
6
|
+
const armResourceOperationsKey = createStateSymbol("armResourceOperations");
|
|
7
|
+
const armResourceOperationsMapKey = createStateSymbol("armResourceOperationsMap");
|
|
8
|
+
function getArmResourceOperations(program, resourceType) {
|
|
9
|
+
let operations = program.stateMap(armResourceOperationsKey).get(resourceType);
|
|
10
|
+
if (!operations) {
|
|
11
|
+
operations = { lifecycle: {}, lists: {}, actions: {} };
|
|
12
|
+
program.stateMap(armResourceOperationsKey).set(resourceType, operations);
|
|
13
|
+
}
|
|
14
|
+
return operations;
|
|
15
|
+
}
|
|
16
|
+
export function resolveResourceOperations(program, resourceType) {
|
|
17
|
+
const operations = getArmResourceOperations(program, resourceType);
|
|
18
|
+
const operationMap = program.stateMap(armResourceOperationsMapKey);
|
|
19
|
+
const services = ignoreDiagnostics(getAllHttpServices(program));
|
|
20
|
+
// Get all resolved operations and update ARM operation details
|
|
21
|
+
for (const httpOperation of services[0].operations) {
|
|
22
|
+
const operation = operationMap.get(httpOperation.operation);
|
|
23
|
+
if (operation) {
|
|
24
|
+
// Populate the remaining details of the operation
|
|
25
|
+
operation.path = httpOperation.path;
|
|
26
|
+
operation.httpOperation = httpOperation;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Returned the updated operations object
|
|
30
|
+
return operations;
|
|
31
|
+
}
|
|
32
|
+
function setResourceLifecycleOperation(context, target, resourceType, kind, decoratorName) {
|
|
33
|
+
// If the properties type is a template parameter, this must be a templated type
|
|
34
|
+
if (resourceType.kind === "TemplateParameter") {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!validateDecoratorTarget(context, target, decoratorName, "Operation") ||
|
|
38
|
+
!validateDecoratorParamType(context.program, target, resourceType, "Model")) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Only register methods from non-templated interface types
|
|
42
|
+
if (target.interface === undefined || target.interface.node.templateParameters.length > 0) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// We can't resolve the operation path yet so treat the operation as a partial
|
|
46
|
+
// type so that we can fill in the missing details later
|
|
47
|
+
const operations = getArmResourceOperations(context.program, resourceType);
|
|
48
|
+
const operation = {
|
|
49
|
+
name: target.name,
|
|
50
|
+
kind,
|
|
51
|
+
operation: target,
|
|
52
|
+
operationGroup: target.interface.name,
|
|
53
|
+
};
|
|
54
|
+
operations.lifecycle[kind] = operation;
|
|
55
|
+
// Add it to the OperationType -> ArmResourceOperation map
|
|
56
|
+
context.program.stateMap(armResourceOperationsMapKey).set(target, operations.lifecycle[kind]);
|
|
57
|
+
}
|
|
58
|
+
export function $armResourceRead(context, target, resourceType) {
|
|
59
|
+
setResourceLifecycleOperation(context, target, resourceType, "read", "@armResourceRead");
|
|
60
|
+
}
|
|
61
|
+
export function $armResourceCreateOrUpdate(context, target, resourceType) {
|
|
62
|
+
setResourceLifecycleOperation(context, target, resourceType, "createOrUpdate", "@armResourceCreateOrUpdate");
|
|
63
|
+
}
|
|
64
|
+
export function $armResourceUpdate(context, target, resourceType) {
|
|
65
|
+
setResourceLifecycleOperation(context, target, resourceType, "update", "@armResourceUpdate");
|
|
66
|
+
}
|
|
67
|
+
export function $armResourceDelete(context, target, resourceType) {
|
|
68
|
+
setResourceLifecycleOperation(context, target, resourceType, "delete", "@armResourceDelete");
|
|
69
|
+
}
|
|
70
|
+
export function $armResourceList(context, target, resourceType) {
|
|
71
|
+
// If the properties type is a template parameter, this must be a templated type
|
|
72
|
+
if (resourceType.kind === "TemplateParameter") {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!validateDecoratorTarget(context, target, "@armResourceList", "Operation") ||
|
|
76
|
+
!validateDecoratorParamType(context.program, target, resourceType, "Model")) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Only register methods from non-templated interface types
|
|
80
|
+
if (target.interface === undefined || target.interface.node.templateParameters.length > 0) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// We can't resolve the operation path yet so treat the operation as a partial
|
|
84
|
+
// type so that we can fill in the missing details later
|
|
85
|
+
const operations = getArmResourceOperations(context.program, resourceType);
|
|
86
|
+
const operation = {
|
|
87
|
+
name: target.name,
|
|
88
|
+
kind: "list",
|
|
89
|
+
operation: target,
|
|
90
|
+
operationGroup: target.interface.name,
|
|
91
|
+
};
|
|
92
|
+
operations.lists[target.name] = operation;
|
|
93
|
+
// Add it to the OperationType -> ArmResourceOperation map
|
|
94
|
+
context.program.stateMap(armResourceOperationsMapKey).set(target, operation);
|
|
95
|
+
}
|
|
96
|
+
export function $armRenameListByOperation(context, entity, resourceType, parentTypeName, parentFriendlyTypeName) {
|
|
97
|
+
const { program } = context;
|
|
98
|
+
if (resourceType.kind === "TemplateParameter") {
|
|
99
|
+
// Don't execute when this decorator is being applied within a templated interface
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (!validateDecoratorTarget(context, entity, "@armRenameListByOperation", "Operation") ||
|
|
103
|
+
!validateDecoratorParamType(program, entity, resourceType, "Model")) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (parentTypeName === undefined ||
|
|
107
|
+
parentTypeName === "" ||
|
|
108
|
+
parentFriendlyTypeName === undefined ||
|
|
109
|
+
parentFriendlyTypeName === "") {
|
|
110
|
+
[parentTypeName, parentFriendlyTypeName] = getArmParentName(context.program, resourceType);
|
|
111
|
+
}
|
|
112
|
+
const parentType = getParentResource(program, resourceType);
|
|
113
|
+
if (parentType) {
|
|
114
|
+
const parentResourceInfo = getArmResourceInfo(program, parentType);
|
|
115
|
+
if (!parentResourceInfo) {
|
|
116
|
+
reportDiagnostic(program, {
|
|
117
|
+
code: "parent-type",
|
|
118
|
+
messageId: "notResourceType",
|
|
119
|
+
target: resourceType,
|
|
120
|
+
format: { type: resourceType.name, parent: parentType.name },
|
|
121
|
+
});
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Make sure the first character of the name is upper-cased
|
|
125
|
+
parentTypeName = parentType.name[0].toUpperCase() + parentType.name.substring(1);
|
|
126
|
+
}
|
|
127
|
+
// Add a formatted doc string too
|
|
128
|
+
context.call($doc, entity, `List ${resourceType.name} resources by ${parentType ? parentTypeName : parentFriendlyTypeName}`, undefined);
|
|
129
|
+
// Set the operation name
|
|
130
|
+
entity.name = parentTypeName === "Extension" ? "List" : `ListBy${parentTypeName}`;
|
|
131
|
+
}
|
|
132
|
+
function getArmParentName(program, resource) {
|
|
133
|
+
switch (getResourceBaseType(program, resource)) {
|
|
134
|
+
case ResourceBaseType.Extension:
|
|
135
|
+
return ["Extension", "parent"];
|
|
136
|
+
case ResourceBaseType.Location:
|
|
137
|
+
return ["Location", "location"];
|
|
138
|
+
case ResourceBaseType.Subscription:
|
|
139
|
+
return ["Subscription", "subscription"];
|
|
140
|
+
case ResourceBaseType.Tenant:
|
|
141
|
+
return ["Tenant", "tenant"];
|
|
142
|
+
case ResourceBaseType.ResourceGroup:
|
|
143
|
+
default:
|
|
144
|
+
return ["ResourceGroup", "resource group"];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export function $armResourceAction(context, target, resourceType) {
|
|
148
|
+
var _a;
|
|
149
|
+
const { program } = context;
|
|
150
|
+
// If the properties type is a template parameter, this must be a templated type
|
|
151
|
+
if (resourceType.kind === "TemplateParameter") {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (!validateDecoratorTarget(context, target, "@armResourceAction", "Operation") ||
|
|
155
|
+
!validateDecoratorParamType(program, target, resourceType, "Model")) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Only register methods from non-templated interface types
|
|
159
|
+
if (target.interface === undefined || target.interface.node.templateParameters.length > 0) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// We can't resolve the operation path yet so treat the operation as a partial
|
|
163
|
+
// type so that we can fill in the missing details later
|
|
164
|
+
const operations = getArmResourceOperations(program, resourceType);
|
|
165
|
+
const operation = {
|
|
166
|
+
name: target.name,
|
|
167
|
+
kind: "action",
|
|
168
|
+
operation: target,
|
|
169
|
+
operationGroup: target.interface.name,
|
|
170
|
+
};
|
|
171
|
+
operations.actions[target.name] = operation;
|
|
172
|
+
// Add it to the OperationType -> ArmResourceOperation map
|
|
173
|
+
program.stateMap(armResourceOperationsMapKey).set(target, operation);
|
|
174
|
+
const segment = (_a = getSegment(program, target)) !== null && _a !== void 0 ? _a : getActionSegment(program, target);
|
|
175
|
+
if (!segment) {
|
|
176
|
+
// Also apply the @actionSegment decorator to the operation
|
|
177
|
+
context.call($actionSegment, target, uncapitalize(target.name));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function uncapitalize(name) {
|
|
181
|
+
if (name === "") {
|
|
182
|
+
return name;
|
|
183
|
+
}
|
|
184
|
+
return name[0].toLowerCase() + name.substring(1);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { DecoratorContext, Model, ModelProperty, Program, Type } from "@typespec/compiler";
|
|
2
|
+
import { ArmResourceOperations } from "./operations.js";
|
|
3
|
+
export type ArmResourceKind = "Tracked" | "Proxy" | "Extension";
|
|
4
|
+
/**
|
|
5
|
+
* Interface for ARM resource detail base.
|
|
6
|
+
*
|
|
7
|
+
* @interface
|
|
8
|
+
*/
|
|
9
|
+
export interface ArmResourceDetailsBase {
|
|
10
|
+
name: string;
|
|
11
|
+
kind: ArmResourceKind;
|
|
12
|
+
armProviderNamespace: string;
|
|
13
|
+
keyName: string;
|
|
14
|
+
collectionName: string;
|
|
15
|
+
typespecType: Model;
|
|
16
|
+
}
|
|
17
|
+
export interface ArmResourceDetails extends ArmResourceDetailsBase {
|
|
18
|
+
operations: ArmResourceOperations;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* This function returns fully-resolved details about all ARM resources
|
|
22
|
+
* registered in the TypeSpec document including operations and their details.
|
|
23
|
+
*
|
|
24
|
+
* It should only be called after the full TypeSpec document has been compiled
|
|
25
|
+
* so that operation route details are certain to be present.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getArmResources(program: Program): ArmResourceDetails[];
|
|
28
|
+
export declare function getArmResource(program: Program, resourceType: Model): ArmResourceDetails | undefined;
|
|
29
|
+
export declare function getArmResourceInfo(program: Program, resourceType: Model): ArmResourceDetails | undefined;
|
|
30
|
+
export declare function getArmResourceKind(resourceType: Model): ArmResourceKind | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* This decorator is used to identify ARM resource types and extract their
|
|
33
|
+
* metadata. It is *not* meant to be used directly by a spec author, it instead
|
|
34
|
+
* gets implicitly applied when the spec author defines a model type in this form:
|
|
35
|
+
*
|
|
36
|
+
* `model Server is TrackedResource<ServerProperties>;`
|
|
37
|
+
*
|
|
38
|
+
* The `TrackedResource<T>` type (and other associated base types) use the @armResource
|
|
39
|
+
* decorator, so it also gets applied to the type which absorbs the `TrackedResource<T>`
|
|
40
|
+
* definition by using the `is` keyword.
|
|
41
|
+
*/
|
|
42
|
+
export declare function $armResourceInternal(context: DecoratorContext, resourceType: Type, propertiesType: Type): void;
|
|
43
|
+
/**
|
|
44
|
+
* This decorator is used to identify interfaces containing resource operations.
|
|
45
|
+
* When applied, it marks the interface with the `@autoRoute` decorator so that
|
|
46
|
+
* all of its contained operations will have their routes generated
|
|
47
|
+
* automatically.
|
|
48
|
+
*
|
|
49
|
+
* It also adds a `@tag` decorator bearing the name of the interface so that all
|
|
50
|
+
* of the operations will be grouped based on the interface name in generated
|
|
51
|
+
* clients.
|
|
52
|
+
*/
|
|
53
|
+
export declare function $armResourceOperations(context: DecoratorContext, interfaceType: Type): void;
|
|
54
|
+
/**
|
|
55
|
+
* This decorator is used to mark a resource type as a "singleton", a type with
|
|
56
|
+
* only one instance. The standard set of resource operations can be applied to
|
|
57
|
+
* such a resource type, they will generate the correct routes and parameter
|
|
58
|
+
* lists.
|
|
59
|
+
*/
|
|
60
|
+
export declare function $singleton(context: DecoratorContext, resourceType: Type, keyValue?: string): void;
|
|
61
|
+
export declare function isSingletonResource(program: Program, resourceType: Model): boolean;
|
|
62
|
+
export declare function getSingletonResourceKey(program: Program, resourceType: Model): string | undefined;
|
|
63
|
+
export declare enum ResourceBaseType {
|
|
64
|
+
Tenant = "Tenant",
|
|
65
|
+
Subscription = "Subscription",
|
|
66
|
+
Location = "Location",
|
|
67
|
+
ResourceGroup = "ResourceGroup",
|
|
68
|
+
Extension = "Extension"
|
|
69
|
+
}
|
|
70
|
+
export declare function $tenantResource(context: DecoratorContext, entity: Type): void;
|
|
71
|
+
export declare function $subscriptionResource(context: DecoratorContext, entity: Type): void;
|
|
72
|
+
export declare function $locationResource(context: DecoratorContext, entity: Type): void;
|
|
73
|
+
export declare function $resourceGroupResource(context: DecoratorContext, entity: Type): void;
|
|
74
|
+
export declare function $extensionResource(context: DecoratorContext, entity: Type): void;
|
|
75
|
+
export declare function $resourceParameterBaseFor(context: DecoratorContext, entity: Type, values: Type): void;
|
|
76
|
+
export declare function $resourceBaseParametersOf(context: DecoratorContext, entity: Type, resourceType: Type): void;
|
|
77
|
+
export declare function $omitIfEmpty(context: DecoratorContext, entity: Type, propertyName: string): void;
|
|
78
|
+
export declare function isResourceParameterBaseFor(program: Program, property: ModelProperty, resourceBaseType: string): boolean;
|
|
79
|
+
export declare function getResourceParameterBases(program: Program, property: ModelProperty): string[] | undefined;
|
|
80
|
+
export declare function getResourceBaseType(program: Program, resource: Model): ResourceBaseType;
|
|
81
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../src/resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { $tag, $visibility, getKeyName, getTags, getTypeName, validateDecoratorParamType, validateDecoratorTarget, } from "@typespec/compiler";
|
|
2
|
+
import { $autoRoute, getParentResource, getSegment } from "@typespec/rest";
|
|
3
|
+
import { createStateSymbol, reportDiagnostic } from "./lib.js";
|
|
4
|
+
import { getArmProviderNamespace } from "./namespace.js";
|
|
5
|
+
import { resolveResourceOperations } from "./operations.js";
|
|
6
|
+
const armResourcesKey = createStateSymbol("armResources");
|
|
7
|
+
const armResourcesCachedKey = createStateSymbol("armResourcesCached");
|
|
8
|
+
const armSingletonResourcesKey = createStateSymbol("armSingletonResources");
|
|
9
|
+
function resolveArmResourceDetails(program, resource) {
|
|
10
|
+
// Combine fully-resolved operation details with the base details we already have
|
|
11
|
+
return {
|
|
12
|
+
...resource,
|
|
13
|
+
operations: resolveResourceOperations(program, resource.typespecType),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* This function returns fully-resolved details about all ARM resources
|
|
18
|
+
* registered in the TypeSpec document including operations and their details.
|
|
19
|
+
*
|
|
20
|
+
* It should only be called after the full TypeSpec document has been compiled
|
|
21
|
+
* so that operation route details are certain to be present.
|
|
22
|
+
*/
|
|
23
|
+
export function getArmResources(program) {
|
|
24
|
+
// Have we cached the resolved resource details already?
|
|
25
|
+
const cachedResources = program.stateMap(armResourcesCachedKey);
|
|
26
|
+
if (cachedResources.size > 0) {
|
|
27
|
+
// Return the cached resource details
|
|
28
|
+
return Array.from(program.stateMap(armResourcesCachedKey).values());
|
|
29
|
+
}
|
|
30
|
+
// We haven't generated the full resource details yet
|
|
31
|
+
const resources = [];
|
|
32
|
+
for (const resource of program.stateMap(armResourcesKey).values()) {
|
|
33
|
+
const fullResource = resolveArmResourceDetails(program, resource);
|
|
34
|
+
cachedResources.set(resource.typespecType, fullResource);
|
|
35
|
+
resources.push(fullResource);
|
|
36
|
+
}
|
|
37
|
+
return resources;
|
|
38
|
+
}
|
|
39
|
+
export function getArmResource(program, resourceType) {
|
|
40
|
+
return program.stateMap(armResourcesKey).get(resourceType);
|
|
41
|
+
}
|
|
42
|
+
export function getArmResourceInfo(program, resourceType) {
|
|
43
|
+
const resourceInfo = program.stateMap(armResourcesKey).get(resourceType);
|
|
44
|
+
if (!resourceInfo) {
|
|
45
|
+
reportDiagnostic(program, {
|
|
46
|
+
code: "arm-resource-missing",
|
|
47
|
+
format: { type: resourceType.name },
|
|
48
|
+
target: resourceType,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return resourceInfo;
|
|
52
|
+
}
|
|
53
|
+
export function getArmResourceKind(resourceType) {
|
|
54
|
+
if (resourceType.baseModel) {
|
|
55
|
+
const coreType = resourceType.baseModel;
|
|
56
|
+
if (coreType.name.startsWith("TrackedResource")) {
|
|
57
|
+
return "Tracked";
|
|
58
|
+
}
|
|
59
|
+
else if (coreType.name.startsWith("ProxyResource")) {
|
|
60
|
+
return "Proxy";
|
|
61
|
+
}
|
|
62
|
+
else if (coreType.name.startsWith("ExtensionResource")) {
|
|
63
|
+
return "Extension";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* This decorator is used to identify ARM resource types and extract their
|
|
70
|
+
* metadata. It is *not* meant to be used directly by a spec author, it instead
|
|
71
|
+
* gets implicitly applied when the spec author defines a model type in this form:
|
|
72
|
+
*
|
|
73
|
+
* `model Server is TrackedResource<ServerProperties>;`
|
|
74
|
+
*
|
|
75
|
+
* The `TrackedResource<T>` type (and other associated base types) use the @armResource
|
|
76
|
+
* decorator, so it also gets applied to the type which absorbs the `TrackedResource<T>`
|
|
77
|
+
* definition by using the `is` keyword.
|
|
78
|
+
*/
|
|
79
|
+
export function $armResourceInternal(context, resourceType, propertiesType) {
|
|
80
|
+
const { program } = context;
|
|
81
|
+
// If the properties type is a template parameter, this must be a templated type
|
|
82
|
+
if (propertiesType.kind === "TemplateParameter") {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!validateDecoratorTarget(context, resourceType, "@armResource", "Model") ||
|
|
86
|
+
!validateDecoratorParamType(program, resourceType, propertiesType, "Model")) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const fullyQualifiedName = getTypeName(resourceType);
|
|
90
|
+
if (fullyQualifiedName.startsWith("Azure.ResourceManager")) {
|
|
91
|
+
// The @armResource decorator will be evaluated on instantiations of
|
|
92
|
+
// base templated resource types like TrackedResource<SomeResource>,
|
|
93
|
+
// so ignore in that case.
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// The global namespace has an empty string as name
|
|
97
|
+
if (!resourceType.namespace || resourceType.namespace.name === "") {
|
|
98
|
+
reportDiagnostic(program, {
|
|
99
|
+
code: "decorator-in-namespace",
|
|
100
|
+
format: { decoratorName: "armResource" },
|
|
101
|
+
target: resourceType,
|
|
102
|
+
});
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Locate the ARM namespace in the namespace hierarchy
|
|
106
|
+
const armProviderNamespace = getArmProviderNamespace(program, resourceType.namespace);
|
|
107
|
+
if (!armProviderNamespace) {
|
|
108
|
+
reportDiagnostic(program, { code: "arm-resource-missing-arm-namespace", target: resourceType });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Ensure the resource type has defined a name property that has a segment
|
|
112
|
+
const nameProperty = resourceType.properties.get("name");
|
|
113
|
+
if (!nameProperty) {
|
|
114
|
+
reportDiagnostic(program, { code: "arm-resource-missing-name-property", target: resourceType });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Set the name property to be read only
|
|
118
|
+
context.call($visibility, nameProperty, "read");
|
|
119
|
+
const keyName = getKeyName(program, nameProperty);
|
|
120
|
+
if (!keyName) {
|
|
121
|
+
reportDiagnostic(program, {
|
|
122
|
+
code: "arm-resource-missing-name-key-decorator",
|
|
123
|
+
target: resourceType,
|
|
124
|
+
});
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const collectionName = getSegment(program, nameProperty);
|
|
128
|
+
if (!collectionName) {
|
|
129
|
+
reportDiagnostic(program, {
|
|
130
|
+
code: "arm-resource-missing-name-segment-decorator",
|
|
131
|
+
target: resourceType,
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const kind = getArmResourceKind(resourceType);
|
|
136
|
+
if (!kind) {
|
|
137
|
+
reportDiagnostic(program, {
|
|
138
|
+
code: "arm-resource-invalid-base-type",
|
|
139
|
+
target: resourceType,
|
|
140
|
+
});
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const armResourceDetails = {
|
|
144
|
+
name: resourceType.name,
|
|
145
|
+
kind,
|
|
146
|
+
typespecType: resourceType,
|
|
147
|
+
collectionName,
|
|
148
|
+
keyName,
|
|
149
|
+
armProviderNamespace: armProviderNamespace !== null && armProviderNamespace !== void 0 ? armProviderNamespace : "",
|
|
150
|
+
operations: {
|
|
151
|
+
lifecycle: {},
|
|
152
|
+
lists: {},
|
|
153
|
+
actions: {},
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
program.stateMap(armResourcesKey).set(resourceType, armResourceDetails);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* This decorator is used to identify interfaces containing resource operations.
|
|
160
|
+
* When applied, it marks the interface with the `@autoRoute` decorator so that
|
|
161
|
+
* all of its contained operations will have their routes generated
|
|
162
|
+
* automatically.
|
|
163
|
+
*
|
|
164
|
+
* It also adds a `@tag` decorator bearing the name of the interface so that all
|
|
165
|
+
* of the operations will be grouped based on the interface name in generated
|
|
166
|
+
* clients.
|
|
167
|
+
*/
|
|
168
|
+
export function $armResourceOperations(context, interfaceType) {
|
|
169
|
+
const { program } = context;
|
|
170
|
+
if (!validateDecoratorTarget(context, interfaceType, "@armResourceOperations", "Interface")) {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
// All resource interfaces should use @autoRoute
|
|
174
|
+
context.call($autoRoute, interfaceType);
|
|
175
|
+
// If no tag is given for the interface, tag it with the interface name
|
|
176
|
+
if (getTags(program, interfaceType).length === 0) {
|
|
177
|
+
context.call($tag, interfaceType, interfaceType.name);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* This decorator is used to mark a resource type as a "singleton", a type with
|
|
182
|
+
* only one instance. The standard set of resource operations can be applied to
|
|
183
|
+
* such a resource type, they will generate the correct routes and parameter
|
|
184
|
+
* lists.
|
|
185
|
+
*/
|
|
186
|
+
export function $singleton(context, resourceType, keyValue = "default") {
|
|
187
|
+
if (!validateDecoratorTarget(context, resourceType, "@singleton", "Model")) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
context.program.stateMap(armSingletonResourcesKey).set(resourceType, keyValue);
|
|
191
|
+
}
|
|
192
|
+
export function isSingletonResource(program, resourceType) {
|
|
193
|
+
return program.stateMap(armSingletonResourcesKey).has(resourceType);
|
|
194
|
+
}
|
|
195
|
+
export function getSingletonResourceKey(program, resourceType) {
|
|
196
|
+
return program.stateMap(armSingletonResourcesKey).get(resourceType);
|
|
197
|
+
}
|
|
198
|
+
export var ResourceBaseType;
|
|
199
|
+
(function (ResourceBaseType) {
|
|
200
|
+
ResourceBaseType["Tenant"] = "Tenant";
|
|
201
|
+
ResourceBaseType["Subscription"] = "Subscription";
|
|
202
|
+
ResourceBaseType["Location"] = "Location";
|
|
203
|
+
ResourceBaseType["ResourceGroup"] = "ResourceGroup";
|
|
204
|
+
ResourceBaseType["Extension"] = "Extension";
|
|
205
|
+
})(ResourceBaseType = ResourceBaseType || (ResourceBaseType = {}));
|
|
206
|
+
const resourceBaseTypeKey = createStateSymbol("resourceBaseTypeKey");
|
|
207
|
+
const parameterBaseTypesKey = createStateSymbol("parameterBaseTypesKey");
|
|
208
|
+
export function $tenantResource(context, entity) {
|
|
209
|
+
if (!validateDecoratorTarget(context, entity, "@tenantResource", "Model")) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
setResourceBaseType(context.program, entity, "Tenant");
|
|
213
|
+
}
|
|
214
|
+
export function $subscriptionResource(context, entity) {
|
|
215
|
+
if (!validateDecoratorTarget(context, entity, "@subscriptionResource", "Model")) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
setResourceBaseType(context.program, entity, "Subscription");
|
|
219
|
+
}
|
|
220
|
+
export function $locationResource(context, entity) {
|
|
221
|
+
if (!validateDecoratorTarget(context, entity, "@locationResource", "Model")) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
setResourceBaseType(context.program, entity, "Location");
|
|
225
|
+
}
|
|
226
|
+
export function $resourceGroupResource(context, entity) {
|
|
227
|
+
if (!validateDecoratorTarget(context, entity, "@resourceGroupResource", "Model")) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
setResourceBaseType(context.program, entity, "ResourceGroup");
|
|
231
|
+
}
|
|
232
|
+
export function $extensionResource(context, entity) {
|
|
233
|
+
if (!validateDecoratorTarget(context, entity, "@extensionResource", "Model")) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
setResourceBaseType(context.program, entity, "Extension");
|
|
237
|
+
}
|
|
238
|
+
export function $resourceParameterBaseFor(context, entity, values) {
|
|
239
|
+
if (!validateDecoratorTarget(context, entity, "@resourceParameterBaseFor", "ModelProperty")) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (!validateDecoratorTarget(context, values, "@resourceParameterBaseFor", "Tuple")) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const resolvedValues = [];
|
|
246
|
+
for (const value of values.values) {
|
|
247
|
+
if (value.kind !== "EnumMember") {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
resolvedValues.push(value.name);
|
|
251
|
+
}
|
|
252
|
+
context.program.stateMap(parameterBaseTypesKey).set(entity, resolvedValues);
|
|
253
|
+
}
|
|
254
|
+
export function $resourceBaseParametersOf(context, entity, resourceType) {
|
|
255
|
+
if (!validateDecoratorTarget(context, entity, "@resourceBaseParameterseOf", "Model")) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (!validateDecoratorTarget(context, resourceType, "@resourceBaseParameterseOf", "Model")) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const targetResourceBaseType = getResourceBaseType(context.program, resourceType);
|
|
262
|
+
const removedProperties = [];
|
|
263
|
+
for (const [propertyName, property] of entity.properties) {
|
|
264
|
+
if (!isResourceParameterBaseForInternal(context.program, property, targetResourceBaseType))
|
|
265
|
+
removedProperties.push(propertyName);
|
|
266
|
+
}
|
|
267
|
+
for (const removedProperty of removedProperties) {
|
|
268
|
+
entity.properties.delete(removedProperty);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
export function $omitIfEmpty(context, entity, propertyName) {
|
|
272
|
+
if (!validateDecoratorTarget(context, entity, "@omitIfEmpty", "Model")) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
const modelProp = getProperty(entity, propertyName);
|
|
276
|
+
if (modelProp &&
|
|
277
|
+
modelProp.type.kind === "Model" &&
|
|
278
|
+
!hasProperty(context.program, modelProp.type)) {
|
|
279
|
+
entity.properties.delete(propertyName);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
export function isResourceParameterBaseFor(program, property, resourceBaseType) {
|
|
283
|
+
return isResourceParameterBaseForInternal(program, property, resolveResourceBaseType(resourceBaseType));
|
|
284
|
+
}
|
|
285
|
+
function isResourceParameterBaseForInternal(program, property, resolvedBaseType) {
|
|
286
|
+
const resourceBases = getResourceParameterBases(program, property);
|
|
287
|
+
if (resourceBases !== undefined) {
|
|
288
|
+
for (const rawType of resourceBases) {
|
|
289
|
+
if (resolveResourceBaseType(rawType) === resolvedBaseType)
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
export function getResourceParameterBases(program, property) {
|
|
296
|
+
return program.stateMap(parameterBaseTypesKey).get(property);
|
|
297
|
+
}
|
|
298
|
+
function setResourceBaseType(program, resource, type) {
|
|
299
|
+
if (program.stateMap(resourceBaseTypeKey).has(resource)) {
|
|
300
|
+
reportDiagnostic(program, {
|
|
301
|
+
code: "arm-resource-duplicate-base-parameter",
|
|
302
|
+
target: resource,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
program.stateMap(resourceBaseTypeKey).set(resource, type);
|
|
306
|
+
}
|
|
307
|
+
export function getResourceBaseType(program, resource) {
|
|
308
|
+
const parentTracker = new Set();
|
|
309
|
+
let parent = getParentResource(program, resource);
|
|
310
|
+
while (parent !== undefined) {
|
|
311
|
+
if (parentTracker.has(parent))
|
|
312
|
+
reportDiagnostic(program, { code: "arm-resource-circular-ancestry", target: resource });
|
|
313
|
+
parentTracker.add(parent);
|
|
314
|
+
resource = parent;
|
|
315
|
+
parent = getParentResource(program, resource);
|
|
316
|
+
}
|
|
317
|
+
const keyValue = program.stateMap(resourceBaseTypeKey).get(resource);
|
|
318
|
+
return resolveResourceBaseType(keyValue);
|
|
319
|
+
}
|
|
320
|
+
function resolveResourceBaseType(type) {
|
|
321
|
+
let resolvedType = ResourceBaseType.ResourceGroup;
|
|
322
|
+
if (type !== undefined) {
|
|
323
|
+
switch (type) {
|
|
324
|
+
case "Tenant":
|
|
325
|
+
resolvedType = ResourceBaseType.Tenant;
|
|
326
|
+
break;
|
|
327
|
+
case "Subscription":
|
|
328
|
+
resolvedType = ResourceBaseType.Subscription;
|
|
329
|
+
break;
|
|
330
|
+
case "Location":
|
|
331
|
+
resolvedType = ResourceBaseType.Location;
|
|
332
|
+
break;
|
|
333
|
+
case "ResourceGroup":
|
|
334
|
+
resolvedType = ResourceBaseType.ResourceGroup;
|
|
335
|
+
break;
|
|
336
|
+
case "Extension":
|
|
337
|
+
resolvedType = ResourceBaseType.Extension;
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return resolvedType;
|
|
342
|
+
}
|
|
343
|
+
function getProperty(model, propertyName) {
|
|
344
|
+
var _a;
|
|
345
|
+
let returnProperty = (_a = model.properties) === null || _a === void 0 ? void 0 : _a.get(propertyName);
|
|
346
|
+
if (!returnProperty && model.baseModel) {
|
|
347
|
+
returnProperty = getProperty(model.baseModel, propertyName);
|
|
348
|
+
}
|
|
349
|
+
return returnProperty;
|
|
350
|
+
}
|
|
351
|
+
function hasProperty(program, model) {
|
|
352
|
+
if (model.properties.size > 0)
|
|
353
|
+
return true;
|
|
354
|
+
if (model.baseModel)
|
|
355
|
+
return hasProperty(program, model.baseModel);
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/resource.ts"],"names":[],"mappings":"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"}
|