@microsoft/typespec-msgraph 1.0.0-Preview.8 → 1.0.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/dist/src/entities/annotations.d.ts.map +1 -1
- package/dist/src/entities/annotations.js +5 -5
- package/dist/src/entities/annotations.js.map +1 -1
- package/dist/src/entities/enum.d.ts.map +1 -1
- package/dist/src/entities/enum.js +3 -2
- package/dist/src/entities/enum.js.map +1 -1
- package/dist/src/entities/model.d.ts.map +1 -1
- package/dist/src/entities/model.js +3 -3
- package/dist/src/entities/model.js.map +1 -1
- package/dist/src/entities/namespace.d.ts.map +1 -1
- package/dist/src/entities/namespace.js +25 -20
- package/dist/src/entities/namespace.js.map +1 -1
- package/dist/src/entities/operation.js +3 -3
- package/dist/src/entities/operation.js.map +1 -1
- package/dist/src/lib.d.ts +2 -0
- package/dist/src/lib.d.ts.map +1 -1
- package/dist/src/lib.js +1 -0
- package/dist/src/lib.js.map +1 -1
- package/dist/src/linter.d.ts.map +1 -1
- package/dist/src/linter.js +12 -2
- package/dist/src/linter.js.map +1 -1
- package/dist/src/rules/collections.d.ts +3 -0
- package/dist/src/rules/collections.d.ts.map +1 -1
- package/dist/src/rules/collections.js +28 -1
- package/dist/src/rules/collections.js.map +1 -1
- package/dist/src/rules/entity.d.ts +3 -0
- package/dist/src/rules/entity.d.ts.map +1 -1
- package/dist/src/rules/entity.js +44 -18
- package/dist/src/rules/entity.js.map +1 -1
- package/dist/src/rules/graph-partial.d.ts +2 -1
- package/dist/src/rules/graph-partial.d.ts.map +1 -1
- package/dist/src/rules/graph-partial.js +58 -12
- package/dist/src/rules/graph-partial.js.map +1 -1
- package/dist/src/rules/graph-route.d.ts.map +1 -1
- package/dist/src/rules/graph-route.js.map +1 -1
- package/dist/src/rules/namespace.d.ts +6 -0
- package/dist/src/rules/namespace.d.ts.map +1 -1
- package/dist/src/rules/namespace.js +54 -1
- package/dist/src/rules/namespace.js.map +1 -1
- package/dist/src/rules/properties.d.ts +11 -3
- package/dist/src/rules/properties.d.ts.map +1 -1
- package/dist/src/rules/properties.js +130 -12
- package/dist/src/rules/properties.js.map +1 -1
- package/dist/src/supressions/csdl-suppression-rules.d.ts.map +1 -1
- package/dist/src/supressions/csdl-suppression-rules.js +7 -3
- package/dist/src/supressions/csdl-suppression-rules.js.map +1 -1
- package/dist/src/testing/index.d.ts +1 -0
- package/dist/src/testing/index.d.ts.map +1 -1
- package/dist/src/testing/index.js +21 -0
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/utils.d.ts +14 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +59 -4
- package/dist/src/utils.js.map +1 -1
- package/package.json +11 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { reportDiagnostic } from "../lib.js";
|
|
2
2
|
import { getPublicNamespaceName, hasPublicNamespace } from "../index.js";
|
|
3
|
-
import { getNamespaceFullName, navigateTypesInNamespace } from "@typespec/compiler";
|
|
3
|
+
import { getNamespaceFullName, navigateTypesInNamespace, createRule, paramMessage } from "@typespec/compiler";
|
|
4
4
|
import { getIdForType, isExcludedCoreType, isTypeDefinedInExternalLibrary } from "../utils.js";
|
|
5
5
|
import { DEFAULT_MSGRAPH_NAMESPACE, GetDeclaredNamespaces, expandNamespaces } from "../entities/namespace.js";
|
|
6
6
|
import { getWorkloadNamespaceName, hasWorkloadNamespace } from "../decorators/workload-namespace.js";
|
|
@@ -107,4 +107,57 @@ function isValidPublicNamespaceName(namespace) {
|
|
|
107
107
|
const namespaceRegex = /microsoft\.graph\.[\w]+/;
|
|
108
108
|
return namespace === DEFAULT_MSGRAPH_NAMESPACE || namespaceRegex.test(namespace);
|
|
109
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Rule to enforce that namespace parts are in camelCase
|
|
112
|
+
*/
|
|
113
|
+
export const namespacesMustBeCamelCase = createRule({
|
|
114
|
+
name: "namespaces-must-be-camel-case",
|
|
115
|
+
severity: "warning",
|
|
116
|
+
description: "Namespace parts must be in lower camel case",
|
|
117
|
+
messages: {
|
|
118
|
+
default: paramMessage `Namespace '${"namespace"}' contains parts that don't follow camelCase. Consider renaming to '${"suggested"}'.`,
|
|
119
|
+
},
|
|
120
|
+
create(context) {
|
|
121
|
+
return {
|
|
122
|
+
namespace: (namespace) => {
|
|
123
|
+
// Skip built-in namespaces and library types
|
|
124
|
+
if (!namespace.name || namespace.name === "") {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const namespaceName = getNamespaceFullName(namespace);
|
|
128
|
+
if (!namespaceName || isExcludedNamespace(namespaceName)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const parts = namespaceName.split('.');
|
|
132
|
+
const nonCamelCaseParts = [];
|
|
133
|
+
const suggestedParts = [];
|
|
134
|
+
for (const part of parts) {
|
|
135
|
+
if (part.length > 0 && /^[A-Z]/.test(part)) {
|
|
136
|
+
nonCamelCaseParts.push(part);
|
|
137
|
+
suggestedParts.push(part.charAt(0).toLowerCase() + part.slice(1));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
suggestedParts.push(part);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (nonCamelCaseParts.length > 0) {
|
|
144
|
+
const suggestedNamespace = suggestedParts.join('.');
|
|
145
|
+
context.reportDiagnostic({
|
|
146
|
+
target: namespace,
|
|
147
|
+
format: {
|
|
148
|
+
namespace: namespaceName,
|
|
149
|
+
suggested: suggestedNamespace,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
/**
|
|
158
|
+
* Checks if namespace should be excluded from validation
|
|
159
|
+
*/
|
|
160
|
+
function isExcludedNamespace(namespaceName) {
|
|
161
|
+
return namespaceName.startsWith('MsGraph');
|
|
162
|
+
}
|
|
110
163
|
//# sourceMappingURL=namespace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/rules/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAW,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/rules/namespace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import { CallableMessage } from "@typespec/compiler";
|
|
1
2
|
export declare const useCreatedInPropertyNames: import("@typespec/compiler").LinterRuleDefinition<"use-created-in-property-names", {
|
|
2
|
-
readonly default:
|
|
3
|
+
readonly default: CallableMessage<["property", "foundWord", "suggested"]>;
|
|
3
4
|
}>;
|
|
4
5
|
export declare const useModifiedInPropertyNames: import("@typespec/compiler").LinterRuleDefinition<"use-modified-in-property-names", {
|
|
5
|
-
readonly default:
|
|
6
|
+
readonly default: CallableMessage<["property", "foundWord", "suggested"]>;
|
|
6
7
|
}>;
|
|
7
8
|
export declare const useProperDefaultRecord: import("@typespec/compiler").LinterRuleDefinition<"use-proper-default-record", {
|
|
8
|
-
readonly default:
|
|
9
|
+
readonly default: CallableMessage<["model"]>;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const propertyNameShouldNotStartWithNavigationSourceName: import("@typespec/compiler").LinterRuleDefinition<"property-name-should-not-start-with-navigation-source-name", {
|
|
12
|
+
readonly navigationSource: CallableMessage<["property", "navigationSource"]>;
|
|
13
|
+
readonly parentProperty: CallableMessage<["property", "parentType", "parentProperty"]>;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const propertyMustNotBeNamedType: import("@typespec/compiler").LinterRuleDefinition<"property-must-not-be-named-type", {
|
|
16
|
+
readonly default: CallableMessage<[]>;
|
|
9
17
|
}>;
|
|
10
18
|
//# sourceMappingURL=properties.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../../src/rules/properties.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../../src/rules/properties.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAShB,MAAM,oBAAoB,CAAC;AAc5B,eAAO,MAAM,yBAAyB;;EAgCpC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;EAgCrC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;EAwCjC,CAAC;AA6BH,eAAO,MAAM,kDAAkD;;;EAoB7D,CAAC;AAkHH,eAAO,MAAM,0BAA0B;;EAmBrC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createRule, paramMessage } from "@typespec/compiler";
|
|
2
|
-
import {
|
|
3
|
-
import { getActualType } from "../utils.js";
|
|
1
|
+
import { createRule, paramMessage, } from "@typespec/compiler";
|
|
2
|
+
import { isEntity, isComplex, getGraphRoutePaths, hasGraphRoute } from "../index.js";
|
|
3
|
+
import { findOneOfWordsIC, getActualType, getInterfacesTargetingModel, startsWithVariantIC, toSameFirstCharCasingAs, } from "../utils.js";
|
|
4
4
|
import { GetDeclaredNamespaces } from "../entities/namespace.js";
|
|
5
5
|
const CREATED_WORD_LIST = ["creation", "create"];
|
|
6
6
|
const MODIFIED_WORD_LIST = ["updated", "changed"];
|
|
@@ -19,7 +19,7 @@ export const useCreatedInPropertyNames = createRule({
|
|
|
19
19
|
if (!flaggedWord) {
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
|
-
const correctVariant = toSameFirstCharCasingAs(
|
|
22
|
+
const correctVariant = toSameFirstCharCasingAs("created", flaggedWord);
|
|
23
23
|
const suggestedPropertyName = propertyName.replace(flaggedWord, correctVariant);
|
|
24
24
|
context.reportDiagnostic({
|
|
25
25
|
target: property,
|
|
@@ -28,11 +28,11 @@ export const useCreatedInPropertyNames = createRule({
|
|
|
28
28
|
property: propertyName,
|
|
29
29
|
foundWord: flaggedWord,
|
|
30
30
|
suggested: suggestedPropertyName,
|
|
31
|
-
}
|
|
31
|
+
},
|
|
32
32
|
});
|
|
33
|
-
}
|
|
33
|
+
},
|
|
34
34
|
};
|
|
35
|
-
}
|
|
35
|
+
},
|
|
36
36
|
});
|
|
37
37
|
export const useModifiedInPropertyNames = createRule({
|
|
38
38
|
name: "use-modified-in-property-names",
|
|
@@ -49,7 +49,7 @@ export const useModifiedInPropertyNames = createRule({
|
|
|
49
49
|
if (!flaggedWord) {
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
const correctVariant = toSameFirstCharCasingAs(
|
|
52
|
+
const correctVariant = toSameFirstCharCasingAs("modified", flaggedWord);
|
|
53
53
|
const suggestedPropertyName = propertyName.replace(flaggedWord, correctVariant);
|
|
54
54
|
context.reportDiagnostic({
|
|
55
55
|
target: property,
|
|
@@ -58,11 +58,11 @@ export const useModifiedInPropertyNames = createRule({
|
|
|
58
58
|
property: propertyName,
|
|
59
59
|
foundWord: flaggedWord,
|
|
60
60
|
suggested: suggestedPropertyName,
|
|
61
|
-
}
|
|
61
|
+
},
|
|
62
62
|
});
|
|
63
|
-
}
|
|
63
|
+
},
|
|
64
64
|
};
|
|
65
|
-
}
|
|
65
|
+
},
|
|
66
66
|
});
|
|
67
67
|
export const useProperDefaultRecord = createRule({
|
|
68
68
|
name: "use-proper-default-record",
|
|
@@ -106,7 +106,7 @@ function isModelUsedInCollections(program, targetModel) {
|
|
|
106
106
|
for (const [_, model] of namespace.models) {
|
|
107
107
|
for (const [_, property] of model.properties) {
|
|
108
108
|
const type = property.type;
|
|
109
|
-
if (type.kind === "Union" || type.kind === "Model" && type.name === "Array") {
|
|
109
|
+
if (type.kind === "Union" || (type.kind === "Model" && type.name === "Array")) {
|
|
110
110
|
const actualType = getActualType(program, type);
|
|
111
111
|
return actualType === targetModel && model !== targetModel;
|
|
112
112
|
}
|
|
@@ -115,4 +115,122 @@ function isModelUsedInCollections(program, targetModel) {
|
|
|
115
115
|
}
|
|
116
116
|
return false;
|
|
117
117
|
}
|
|
118
|
+
export const propertyNameShouldNotStartWithNavigationSourceName = createRule({
|
|
119
|
+
name: "property-name-should-not-start-with-navigation-source-name",
|
|
120
|
+
severity: "warning",
|
|
121
|
+
description: "Property names should not start with their parent navigation source name or parent property name to avoid repeated path segments",
|
|
122
|
+
messages: {
|
|
123
|
+
navigationSource: paramMessage `The property '${"property"}' starts with the name of the navigation source '${"navigationSource"}'. This may lead to repeated path segments in the URL, which is not desirable. For more information see [the guidelines](https://github.com/microsoft/api-guidelines/blob/vNext/graph/GuidelinesGraph.md#naming).`,
|
|
124
|
+
parentProperty: paramMessage `The property '${"property"}' starts with the name of the property '${"parentType"}/${"parentProperty"}'. This may lead to repeated path segments in the URL, which is not desirable. For more information see [the guidelines](https://github.com/microsoft/api-guidelines/blob/vNext/graph/GuidelinesGraph.md#naming).`,
|
|
125
|
+
},
|
|
126
|
+
create(context) {
|
|
127
|
+
return {
|
|
128
|
+
modelProperty: (property) => {
|
|
129
|
+
// Check 1: Property name vs navigation source name
|
|
130
|
+
checkPropertyVsNavigationSource(context, property);
|
|
131
|
+
// Check 2: Nested property name vs parent property name
|
|
132
|
+
checkNestedPropertyVsParentProperty(context, property);
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
/**
|
|
138
|
+
* Check if property name starts with navigation source name
|
|
139
|
+
*/
|
|
140
|
+
function checkPropertyVsNavigationSource(context, property) {
|
|
141
|
+
if (!property.model ||
|
|
142
|
+
(!isEntity(context.program, property.model) && !isComplex(context.program, property.model))) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const interfaces = getInterfacesTargetingModel(context.program, property.model);
|
|
146
|
+
for (const theInterface of interfaces) {
|
|
147
|
+
const navigationSourceName = getNavigationSourceNameFromInterface(context.program, theInterface);
|
|
148
|
+
if (!navigationSourceName) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (startsWithVariantIC(property.name, navigationSourceName)) {
|
|
152
|
+
context.reportDiagnostic({
|
|
153
|
+
target: property,
|
|
154
|
+
messageId: "navigationSource",
|
|
155
|
+
format: {
|
|
156
|
+
property: property.name,
|
|
157
|
+
navigationSource: navigationSourceName,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
return; // Report once per property
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Extract navigation source name from the interface's graph routes
|
|
166
|
+
*/
|
|
167
|
+
function getNavigationSourceNameFromInterface(program, theInterface) {
|
|
168
|
+
if (!hasGraphRoute(program, theInterface)) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const graphRoutes = getGraphRoutePaths(program, theInterface);
|
|
172
|
+
if (!graphRoutes || graphRoutes.length === 0) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
// Get the last non-parameter segment from the first route
|
|
176
|
+
for (const route of graphRoutes) {
|
|
177
|
+
const segments = route.split("/").filter((s) => s.length > 0 && !s.startsWith("{"));
|
|
178
|
+
if (segments.length > 0) {
|
|
179
|
+
return segments[segments.length - 1];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if nested property names start with their parent property name
|
|
186
|
+
*/
|
|
187
|
+
function checkNestedPropertyVsParentProperty(context, property) {
|
|
188
|
+
var _a;
|
|
189
|
+
const propertyType = getActualType(context.program, property.type);
|
|
190
|
+
// Only check if property type is a structured type (entity or complex)
|
|
191
|
+
if (!isStructuredType(context.program, propertyType)) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Check all nested properties
|
|
195
|
+
for (const [_, nestedProperty] of propertyType.properties) {
|
|
196
|
+
if (startsWithVariantIC(nestedProperty.name, property.name)) {
|
|
197
|
+
const parentTypeName = ((_a = property.model) === null || _a === void 0 ? void 0 : _a.name) || "unknown";
|
|
198
|
+
context.reportDiagnostic({
|
|
199
|
+
target: nestedProperty,
|
|
200
|
+
messageId: "parentProperty",
|
|
201
|
+
format: {
|
|
202
|
+
property: nestedProperty.name,
|
|
203
|
+
parentType: parentTypeName,
|
|
204
|
+
parentProperty: property.name,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Helper to check if a type is a structured type (entity or complex)
|
|
212
|
+
*/
|
|
213
|
+
function isStructuredType(program, type) {
|
|
214
|
+
return (type === null || type === void 0 ? void 0 : type.kind) === "Model" && (isEntity(program, type) || isComplex(program, type));
|
|
215
|
+
}
|
|
216
|
+
export const propertyMustNotBeNamedType = createRule({
|
|
217
|
+
name: "property-must-not-be-named-type",
|
|
218
|
+
severity: "warning",
|
|
219
|
+
description: "A property should not be named 'type'.",
|
|
220
|
+
messages: {
|
|
221
|
+
default: paramMessage `Property should not be named 'type'. Consider using a more descriptive name like 'itemType', 'objectType', or 'category'.`,
|
|
222
|
+
},
|
|
223
|
+
create(context) {
|
|
224
|
+
return {
|
|
225
|
+
modelProperty: (property) => {
|
|
226
|
+
if (property.name.toLowerCase() === "type") {
|
|
227
|
+
context.reportDiagnostic({
|
|
228
|
+
target: property,
|
|
229
|
+
format: {},
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
},
|
|
235
|
+
});
|
|
118
236
|
//# sourceMappingURL=properties.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../../src/rules/properties.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../../src/rules/properties.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csdl-suppression-rules.d.ts","sourceRoot":"","sources":["../../../src/supressions/csdl-suppression-rules.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"csdl-suppression-rules.d.ts","sourceRoot":"","sources":["../../../src/supressions/csdl-suppression-rules.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAmBnE,CAAC;AAIF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7E"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { collectionPropertyShouldNotBeNullable, collectionOfComplexTypeShouldUseEntityType } from "../rules/collections.js";
|
|
1
|
+
import { collectionPropertyShouldNotBeNullable, collectionOfComplexTypeShouldUseEntityType, collectionPropertyNameShouldBePlural } from "../rules/collections.js";
|
|
2
2
|
import { containedEntityShouldNotHaveEntitySet } from "../rules/contains.js";
|
|
3
|
-
import { referenceIdPropertyShouldBeNavigationProperty } from "../rules/entity.js";
|
|
3
|
+
import { referenceIdPropertyShouldBeNavigationProperty, entityNamesShouldBeSingular } from "../rules/entity.js";
|
|
4
4
|
import { collectionShouldNotBeEnum, nullableBooleanShouldBeEnum, nullableEnumsShouldAddAdditionalMember, useEvolvableEnumRule } from "../rules/enum.js";
|
|
5
5
|
import { shouldNotUseUnnecessaryInheritance } from "../rules/model.js";
|
|
6
6
|
import { namesMustBeCamelCase } from "../rules/naming.js";
|
|
7
|
-
import { useCreatedInPropertyNames, useModifiedInPropertyNames, useProperDefaultRecord } from "../rules/properties.js";
|
|
7
|
+
import { useCreatedInPropertyNames, useModifiedInPropertyNames, useProperDefaultRecord, propertyMustNotBeNamedType, propertyNameShouldNotStartWithNavigationSourceName } from "../rules/properties.js";
|
|
8
8
|
const DEFAULT_RULE = "default";
|
|
9
9
|
/**
|
|
10
10
|
* Map of internal linter rule export names (without package scope)
|
|
@@ -13,12 +13,16 @@ const DEFAULT_RULE = "default";
|
|
|
13
13
|
*/
|
|
14
14
|
export const csdlSuppressionRules = {
|
|
15
15
|
[collectionPropertyShouldNotBeNullable.name]: "CollectionPropertyShouldNotBeNullable",
|
|
16
|
+
[collectionPropertyNameShouldBePlural.name]: "PluralNoun",
|
|
16
17
|
[collectionOfComplexTypeShouldUseEntityType.name]: "ComplexTypeCollectionShouldUseEntityTypeInstead",
|
|
17
18
|
[collectionShouldNotBeEnum.name]: "EnumCollectionShouldBeFlaggedEnum",
|
|
18
19
|
[containedEntityShouldNotHaveEntitySet.name]: "ContainedNavPropertyShouldNotHaveEntitySet",
|
|
20
|
+
[entityNamesShouldBeSingular.name]: "EntityTypeNameShouldBeSingular",
|
|
19
21
|
[namesMustBeCamelCase.name]: "CamelCase",
|
|
20
22
|
[nullableBooleanShouldBeEnum.name]: "NullableBooleanShouldBeEnum",
|
|
21
23
|
[nullableEnumsShouldAddAdditionalMember.name]: "NullableEnumsShouldAddAdditionalMember",
|
|
24
|
+
[propertyNameShouldNotStartWithNavigationSourceName.name]: "MustNotUseParentPathSegmentInPropertyName",
|
|
25
|
+
[propertyMustNotBeNamedType.name]: "PropertyMustNotBeNamedType",
|
|
22
26
|
[referenceIdPropertyShouldBeNavigationProperty.name]: "ReferenceIdPropertyShouldBeNavigationProperty",
|
|
23
27
|
[shouldNotUseUnnecessaryInheritance.name]: "ShouldNotUseUnnecessaryInheritance",
|
|
24
28
|
[useCreatedInPropertyNames.name]: "UseCreatedInPropertyName",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csdl-suppression-rules.js","sourceRoot":"","sources":["../../../src/supressions/csdl-suppression-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qCAAqC,EAAE,0CAA0C,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"csdl-suppression-rules.js","sourceRoot":"","sources":["../../../src/supressions/csdl-suppression-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qCAAqC,EAAE,0CAA0C,EAAE,oCAAoC,EAAE,MAAM,yBAAyB,CAAC;AAClK,OAAO,EAAE,qCAAqC,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,6CAA6C,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,sCAAsC,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxJ,OAAO,EAAE,kCAAkC,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,kDAAkD,EAAE,MAAM,wBAAwB,CAAC;AAEvM,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuC;IACtE,CAAC,qCAAqC,CAAC,IAAI,CAAC,EAAE,uCAAuC;IACrF,CAAC,oCAAoC,CAAC,IAAI,CAAC,EAAE,YAAY;IACzD,CAAC,0CAA0C,CAAC,IAAI,CAAC,EAAE,iDAAiD;IACpG,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,mCAAmC;IACrE,CAAC,qCAAqC,CAAC,IAAI,CAAC,EAAE,4CAA4C;IAC1F,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,gCAAgC;IACpE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,WAAW;IACxC,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,6BAA6B;IACjE,CAAC,sCAAsC,CAAC,IAAI,CAAC,EAAE,wCAAwC;IACvF,CAAC,kDAAkD,CAAC,IAAI,CAAC,EAAE,2CAA2C;IACtG,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,4BAA4B;IAC/D,CAAC,6CAA6C,CAAC,IAAI,CAAC,EAAE,+CAA+C;IACrG,CAAC,kCAAkC,CAAC,IAAI,CAAC,EAAE,oCAAoC;IAC/E,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,0BAA0B;IAC5D,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,uBAAuB;IACpD,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,2BAA2B;IAC9D,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,wBAAwB;IACvD,YAAY,EAAE,SAAS;CACxB,CAAC;AAIF,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,YAAY,CAAC,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TypeSpecTestLibrary } from "@typespec/compiler/testing";
|
|
2
2
|
export declare const MsGraphTestLibrary: TypeSpecTestLibrary;
|
|
3
3
|
export declare const ReferenceModelTestLibrary: TypeSpecTestLibrary;
|
|
4
|
+
export declare const GeneratedReferenceModelTestLibrary: TypeSpecTestLibrary;
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,eAAO,MAAM,kBAAkB,EAAE,mBAoBhC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,mBAoBvC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,eAAO,MAAM,kBAAkB,EAAE,mBAoBhC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,mBAoBvC,CAAA;AAED,eAAO,MAAM,kCAAkC,EAAE,mBAoBhD,CAAA"}
|
|
@@ -42,4 +42,25 @@ export const ReferenceModelTestLibrary = {
|
|
|
42
42
|
},
|
|
43
43
|
],
|
|
44
44
|
};
|
|
45
|
+
export const GeneratedReferenceModelTestLibrary = {
|
|
46
|
+
name: "@microsoft/typespec-msgraph-reference/Prod/Beta",
|
|
47
|
+
packageRoot: resolvePath(fileURLToPath(import.meta.url), "../../../../../typespec-msgraph-reference/"),
|
|
48
|
+
files: [
|
|
49
|
+
{
|
|
50
|
+
realDir: "",
|
|
51
|
+
pattern: "package.json",
|
|
52
|
+
virtualPath: "./node_modules/@microsoft/typespec-msgraph-reference",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
realDir: "dist/",
|
|
56
|
+
pattern: "*.js",
|
|
57
|
+
virtualPath: "./node_modules/@microsoft/typespec-msgraph-reference/dist/",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
realDir: "lib/Prod/Beta",
|
|
61
|
+
pattern: "*.tsp",
|
|
62
|
+
virtualPath: "./node_modules/@microsoft/typespec-msgraph-reference/lib/Prod/Beta",
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
45
66
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC;IACxE,KAAK,EAAE;QACL;YACE,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,4CAA4C;SAC1D;QACD;YACE,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,qDAAqD;SACnE;QACD;YACE,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,gDAAgD;SAC9D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAwB;IAC5D,IAAI,EAAE,iDAAiD;IACvD,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,sDAAsD,CAAC;IAChH,KAAK,EAAE;QACL;YACE,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,gEAAgE;SAC9E;QACD;YACE,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,sEAAsE;SACpF;QACD;YACE,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,oEAAoE;SAClF;KACF;CACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,CAAC,MAAM,kBAAkB,GAAwB;IACrD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC;IACxE,KAAK,EAAE;QACL;YACE,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,4CAA4C;SAC1D;QACD;YACE,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,qDAAqD;SACnE;QACD;YACE,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,gDAAgD;SAC9D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAwB;IAC5D,IAAI,EAAE,iDAAiD;IACvD,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,sDAAsD,CAAC;IAChH,KAAK,EAAE;QACL;YACE,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,gEAAgE;SAC9E;QACD;YACE,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,sEAAsE;SACpF;QACD;YACE,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,oEAAoE;SAClF;KACF;CACF,CAAA;AAED,MAAM,CAAC,MAAM,kCAAkC,GAAwB;IACrE,IAAI,EAAE,iDAAiD;IACvD,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,4CAA4C,CAAC;IACtG,KAAK,EAAE;QACL;YACE,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,sDAAsD;SACpE;QACD;YACE,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,4DAA4D;SAC1E;QACD;YACE,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,oEAAoE;SAClF;KACF;CACF,CAAA"}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -114,4 +114,18 @@ export declare function findOneOfWordsIC(value: string, targetWords: Array<strin
|
|
|
114
114
|
export declare function toSameFirstCharCasingAs(value: string, other: string): string;
|
|
115
115
|
export declare function toCamelCase(str: string): string;
|
|
116
116
|
export declare function getDefaultPropertyValue(property: ModelProperty): string | boolean | Numeric | undefined;
|
|
117
|
+
export declare function isPlural(word: string): boolean;
|
|
118
|
+
export declare function isSingular(word: string): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Cleans up documentation strings by removing backticks around @ symbols.
|
|
121
|
+
* TypeSpec uses backticks to escape @ in doc comments, but we don't want them in CSDL output.
|
|
122
|
+
* Converts: username`@`tenant.com -> username@tenant.com
|
|
123
|
+
*/
|
|
124
|
+
export declare function cleanDescription(description: string | undefined): string | undefined;
|
|
125
|
+
/**
|
|
126
|
+
* Checks if a string starts with another string (case-insensitive)
|
|
127
|
+
* Matches C# StartsWithVariantIC logic: splits value into words and compares
|
|
128
|
+
* the first word against the prefix and its singular/plural forms
|
|
129
|
+
*/
|
|
130
|
+
export declare function startsWithVariantIC(value: string, prefix: string): boolean;
|
|
117
131
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EAGJ,SAAS,EACT,aAAa,EAEb,KAAK,EACL,aAAa,EACb,SAAS,EAET,OAAO,EACP,SAAS,EACT,OAAO,EAEP,MAAM,EACN,IAAI,EACJ,KAAK,EAEN,MAAM,oBAAoB,CAAC;AAsB5B,OAAO,EAAoB,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/src/utils.js
CHANGED
|
@@ -3,6 +3,8 @@ import { getEntity, getExpand, getFilter, getGraphRoutePaths, getPublicNamespace
|
|
|
3
3
|
import { getOperationVerb } from "@typespec/http";
|
|
4
4
|
import { DEFAULT_MSGRAPH_NAMESPACE, GetDeclaredNamespaces, usedLibraryTypesKey } from "./entities/namespace.js";
|
|
5
5
|
import { PathTree } from "./path-tree.js";
|
|
6
|
+
import pluralize from "pluralize";
|
|
7
|
+
const MAXIMUN_NESTING_DEPTH = 1;
|
|
6
8
|
// schema namespace is workloadNamespace if its defined or publicNamespace if its defined
|
|
7
9
|
export function hasSchemaNamespace(program, namespace) {
|
|
8
10
|
return hasWorkloadNamespace(program, namespace) || hasPublicNamespace(program, namespace);
|
|
@@ -490,30 +492,35 @@ function getPropertiesOfTypeModel(program, model, structuralPropertiesOnly = fal
|
|
|
490
492
|
}
|
|
491
493
|
return propertiesOfTypeModel;
|
|
492
494
|
}
|
|
493
|
-
function getNestedPropertyNames(program, propertyTypes, structuralPropertiesOnly = false, prefix = "") {
|
|
495
|
+
function getNestedPropertyNames(program, propertyTypes, structuralPropertiesOnly = false, prefix = "", depth = 0) {
|
|
494
496
|
const names = [];
|
|
495
497
|
if (prefix && hasRepeatedItem(prefix)) {
|
|
496
498
|
return names;
|
|
497
499
|
}
|
|
498
500
|
for (const propertyType of propertyTypes) {
|
|
499
501
|
const propertyTypePrefix = prefix + propertyType.name + "/";
|
|
500
|
-
const nestedPropertyTypes = getNestedPropertyTypes(program, propertyType, structuralPropertiesOnly);
|
|
502
|
+
const nestedPropertyTypes = getNestedPropertyTypes(program, propertyType, structuralPropertiesOnly, depth);
|
|
501
503
|
nestedPropertyTypes.forEach(m => {
|
|
502
504
|
const name = propertyTypePrefix + m.name;
|
|
503
505
|
if (!hasRepeatedItem(name)) {
|
|
504
506
|
names.push(name);
|
|
505
507
|
}
|
|
506
508
|
});
|
|
507
|
-
names.push(...getNestedPropertyNames(program, nestedPropertyTypes, structuralPropertiesOnly, propertyTypePrefix));
|
|
509
|
+
names.push(...getNestedPropertyNames(program, nestedPropertyTypes, structuralPropertiesOnly, propertyTypePrefix, depth + 1));
|
|
508
510
|
}
|
|
509
511
|
return names;
|
|
510
512
|
}
|
|
511
|
-
function getNestedPropertyTypes(program, propertyType, structuralPropertiesOnly = false) {
|
|
513
|
+
function getNestedPropertyTypes(program, propertyType, structuralPropertiesOnly = false, depth = 0) {
|
|
512
514
|
const propertyTypes = [];
|
|
513
515
|
const theType = propertyType.type;
|
|
514
516
|
if (theType.kind === "Scalar" || theType.kind === "Enum") {
|
|
515
517
|
return propertyTypes;
|
|
516
518
|
}
|
|
519
|
+
// Skip processing properties of external library types at depth > 1 due to how extensive the property tree can be causing memory issues.
|
|
520
|
+
// But allow depth 0-1 to get direct properties from partial reference models
|
|
521
|
+
if (isTypeDefinedInExternalLibrary(program, theType) && depth > MAXIMUN_NESTING_DEPTH) {
|
|
522
|
+
return propertyTypes;
|
|
523
|
+
}
|
|
517
524
|
theType.properties.forEach((property, name) => {
|
|
518
525
|
const type = getPropertyType(program, property, structuralPropertiesOnly);
|
|
519
526
|
if (type !== undefined) {
|
|
@@ -951,4 +958,52 @@ export function getDefaultPropertyValue(property) {
|
|
|
951
958
|
return undefined;
|
|
952
959
|
}
|
|
953
960
|
}
|
|
961
|
+
export function isPlural(word) {
|
|
962
|
+
const words = splitWords(word);
|
|
963
|
+
const lastWord = words[words.length - 1];
|
|
964
|
+
return pluralize.isPlural(lastWord);
|
|
965
|
+
}
|
|
966
|
+
export function isSingular(word) {
|
|
967
|
+
const words = splitWords(word);
|
|
968
|
+
const lastWord = words[words.length - 1];
|
|
969
|
+
return pluralize.isSingular(lastWord);
|
|
970
|
+
}
|
|
971
|
+
/**
|
|
972
|
+
* Cleans up documentation strings by removing backticks around @ symbols.
|
|
973
|
+
* TypeSpec uses backticks to escape @ in doc comments, but we don't want them in CSDL output.
|
|
974
|
+
* Converts: username`@`tenant.com -> username@tenant.com
|
|
975
|
+
*/
|
|
976
|
+
export function cleanDescription(description) {
|
|
977
|
+
if (!description) {
|
|
978
|
+
return description;
|
|
979
|
+
}
|
|
980
|
+
// Remove backticks around @ symbols: `@` -> @
|
|
981
|
+
return description.replace(/`@`/g, '@');
|
|
982
|
+
}
|
|
983
|
+
/**
|
|
984
|
+
* Checks if a string starts with another string (case-insensitive)
|
|
985
|
+
* Matches C# StartsWithVariantIC logic: splits value into words and compares
|
|
986
|
+
* the first word against the prefix and its singular/plural forms
|
|
987
|
+
*/
|
|
988
|
+
export function startsWithVariantIC(value, prefix) {
|
|
989
|
+
if (!value || value === "") {
|
|
990
|
+
return prefix === "";
|
|
991
|
+
}
|
|
992
|
+
if (!prefix || prefix === "") {
|
|
993
|
+
return false;
|
|
994
|
+
}
|
|
995
|
+
// Split value into words (camelCase/PascalCase boundaries)
|
|
996
|
+
const words = splitWords(value);
|
|
997
|
+
if (words.length === 0) {
|
|
998
|
+
return false;
|
|
999
|
+
}
|
|
1000
|
+
const firstWord = words[0];
|
|
1001
|
+
const firstWordLower = firstWord.toLowerCase();
|
|
1002
|
+
const prefixLower = prefix.toLowerCase();
|
|
1003
|
+
// Check singular form
|
|
1004
|
+
const singularPrefix = pluralize.singular(prefixLower);
|
|
1005
|
+
// Check plural form
|
|
1006
|
+
const pluralPrefix = pluralize.plural(prefixLower);
|
|
1007
|
+
return firstWordLower === singularPrefix || firstWordLower === pluralPrefix;
|
|
1008
|
+
}
|
|
954
1009
|
//# sourceMappingURL=utils.js.map
|