@azure-tools/typespec-ts 0.18.0 → 0.19.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +36 -20
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/lib.d.ts.map +1 -1
  6. package/dist/src/lib.js +4 -1
  7. package/dist/src/lib.js.map +1 -1
  8. package/dist/src/modular/buildClassicalClient.d.ts.map +1 -1
  9. package/dist/src/modular/buildClassicalClient.js +50 -51
  10. package/dist/src/modular/buildClassicalClient.js.map +1 -1
  11. package/dist/src/modular/buildClassicalOperationGroups.d.ts +4 -0
  12. package/dist/src/modular/buildClassicalOperationGroups.d.ts.map +1 -0
  13. package/dist/src/modular/buildClassicalOperationGroups.js +79 -0
  14. package/dist/src/modular/buildClassicalOperationGroups.js.map +1 -0
  15. package/dist/src/modular/buildClientContext.d.ts.map +1 -1
  16. package/dist/src/modular/buildClientContext.js +3 -2
  17. package/dist/src/modular/buildClientContext.js.map +1 -1
  18. package/dist/src/modular/buildCodeModel.d.ts.map +1 -1
  19. package/dist/src/modular/buildCodeModel.js +69 -23
  20. package/dist/src/modular/buildCodeModel.js.map +1 -1
  21. package/dist/src/modular/buildOperations.d.ts +1 -1
  22. package/dist/src/modular/buildOperations.d.ts.map +1 -1
  23. package/dist/src/modular/buildOperations.js +21 -13
  24. package/dist/src/modular/buildOperations.js.map +1 -1
  25. package/dist/src/modular/buildProjectFiles.d.ts.map +1 -1
  26. package/dist/src/modular/buildProjectFiles.js +183 -73
  27. package/dist/src/modular/buildProjectFiles.js.map +1 -1
  28. package/dist/src/modular/buildRootIndex.d.ts.map +1 -1
  29. package/dist/src/modular/buildRootIndex.js +7 -5
  30. package/dist/src/modular/buildRootIndex.js.map +1 -1
  31. package/dist/src/modular/buildSubpathIndex.d.ts +5 -1
  32. package/dist/src/modular/buildSubpathIndex.d.ts.map +1 -1
  33. package/dist/src/modular/buildSubpathIndex.js +32 -4
  34. package/dist/src/modular/buildSubpathIndex.js.map +1 -1
  35. package/dist/src/modular/emitModels.d.ts.map +1 -1
  36. package/dist/src/modular/emitModels.js +3 -2
  37. package/dist/src/modular/emitModels.js.map +1 -1
  38. package/dist/src/modular/helpers/classicalOperationHelpers.d.ts +4 -0
  39. package/dist/src/modular/helpers/classicalOperationHelpers.d.ts.map +1 -0
  40. package/dist/src/modular/helpers/classicalOperationHelpers.js +127 -0
  41. package/dist/src/modular/helpers/classicalOperationHelpers.js.map +1 -0
  42. package/dist/src/modular/helpers/clientHelpers.d.ts +2 -1
  43. package/dist/src/modular/helpers/clientHelpers.d.ts.map +1 -1
  44. package/dist/src/modular/helpers/clientHelpers.js +3 -2
  45. package/dist/src/modular/helpers/clientHelpers.js.map +1 -1
  46. package/dist/src/modular/helpers/namingHelpers.d.ts +2 -1
  47. package/dist/src/modular/helpers/namingHelpers.d.ts.map +1 -1
  48. package/dist/src/modular/helpers/namingHelpers.js +14 -0
  49. package/dist/src/modular/helpers/namingHelpers.js.map +1 -1
  50. package/dist/src/modular/helpers/operationHelpers.d.ts +4 -3
  51. package/dist/src/modular/helpers/operationHelpers.d.ts.map +1 -1
  52. package/dist/src/modular/helpers/operationHelpers.js +63 -48
  53. package/dist/src/modular/helpers/operationHelpers.js.map +1 -1
  54. package/dist/src/modular/modularCodeModel.d.ts +4 -0
  55. package/dist/src/modular/modularCodeModel.d.ts.map +1 -1
  56. package/dist/src/transform/transform.d.ts.map +1 -1
  57. package/dist/src/transform/transform.js +7 -5
  58. package/dist/src/transform/transform.js.map +1 -1
  59. package/dist/src/transform/transformParameters.d.ts +2 -2
  60. package/dist/src/transform/transformParameters.d.ts.map +1 -1
  61. package/dist/src/transform/transformParameters.js +2 -2
  62. package/dist/src/transform/transformParameters.js.map +1 -1
  63. package/dist/src/transform/transformResponses.d.ts +2 -2
  64. package/dist/src/transform/transformResponses.d.ts.map +1 -1
  65. package/dist/src/transform/transformResponses.js +2 -2
  66. package/dist/src/transform/transformResponses.js.map +1 -1
  67. package/dist/src/transform/transfromRLCOptions.d.ts.map +1 -1
  68. package/dist/src/transform/transfromRLCOptions.js +30 -4
  69. package/dist/src/transform/transfromRLCOptions.js.map +1 -1
  70. package/dist/src/utils/emitUtil.d.ts.map +1 -1
  71. package/dist/src/utils/emitUtil.js +12 -5
  72. package/dist/src/utils/emitUtil.js.map +1 -1
  73. package/dist/src/utils/modelUtils.d.ts.map +1 -1
  74. package/dist/src/utils/modelUtils.js +17 -9
  75. package/dist/src/utils/modelUtils.js.map +1 -1
  76. package/dist/src/utils/namespaceUtils.d.ts +6 -0
  77. package/dist/src/utils/namespaceUtils.d.ts.map +1 -0
  78. package/dist/src/utils/namespaceUtils.js +54 -0
  79. package/dist/src/utils/namespaceUtils.js.map +1 -0
  80. package/dist/src/utils/operationUtil.d.ts.map +1 -1
  81. package/dist/src/utils/operationUtil.js +9 -13
  82. package/dist/src/utils/operationUtil.js.map +1 -1
  83. package/dist/tsconfig.tsbuildinfo +1 -1
  84. package/package.json +11 -4
  85. package/src/index.ts +29 -12
  86. package/src/lib.ts +4 -1
  87. package/src/modular/buildClassicalClient.ts +90 -69
  88. package/src/modular/buildClassicalOperationGroups.ts +151 -0
  89. package/src/modular/buildClientContext.ts +3 -2
  90. package/src/modular/buildCodeModel.ts +82 -18
  91. package/src/modular/buildOperations.ts +41 -16
  92. package/src/modular/buildProjectFiles.ts +224 -87
  93. package/src/modular/buildRootIndex.ts +34 -5
  94. package/src/modular/buildSubpathIndex.ts +41 -6
  95. package/src/modular/emitModels.ts +9 -2
  96. package/src/modular/helpers/classicalOperationHelpers.ts +212 -0
  97. package/src/modular/helpers/clientHelpers.ts +7 -2
  98. package/src/modular/helpers/namingHelpers.ts +25 -1
  99. package/src/modular/helpers/operationHelpers.ts +101 -46
  100. package/src/modular/modularCodeModel.ts +4 -0
  101. package/src/transform/transform.ts +10 -6
  102. package/src/transform/transformParameters.ts +3 -3
  103. package/src/transform/transformResponses.ts +4 -4
  104. package/src/transform/transfromRLCOptions.ts +43 -4
  105. package/src/utils/emitUtil.ts +10 -4
  106. package/src/utils/modelUtils.ts +11 -1
  107. package/src/utils/namespaceUtils.ts +74 -0
  108. package/src/utils/operationUtil.ts +10 -19
  109. package/dist/src/modular/helpers/credentialHelpers.d.ts +0 -7
  110. package/dist/src/modular/helpers/credentialHelpers.d.ts.map +0 -1
  111. package/dist/src/modular/helpers/credentialHelpers.js +0 -32
  112. package/dist/src/modular/helpers/credentialHelpers.js.map +0 -1
  113. package/src/modular/helpers/credentialHelpers.ts +0 -40
@@ -0,0 +1,212 @@
1
+ import {
2
+ FunctionDeclarationStructure,
3
+ OptionalKind,
4
+ PropertySignatureStructure,
5
+ SourceFile,
6
+ StructureKind
7
+ } from "ts-morph";
8
+ import { Client, OperationGroup } from "../modularCodeModel.js";
9
+ import { getClassicalLayerPrefix, getClientName } from "./namingHelpers.js";
10
+ import { NameType, normalizeName } from "@azure-tools/rlc-common";
11
+ import { getOperationFunction } from "./operationHelpers.js";
12
+
13
+ export function getClassicalOperation(
14
+ classicFile: SourceFile,
15
+ client: Client,
16
+ operationGroup: OperationGroup,
17
+ layer: number = operationGroup.namespaceHierarchies.length - 1
18
+ ) {
19
+ const modularClientName = `${getClientName(client)}Context`;
20
+ const hasClientContextImport = classicFile
21
+ .getImportDeclarations()
22
+ .filter((i) => {
23
+ return (
24
+ i.getModuleSpecifierValue() ===
25
+ `${"../".repeat(layer + 2)}api/${modularClientName}.js`
26
+ );
27
+ });
28
+ if (!hasClientContextImport || hasClientContextImport.length === 0) {
29
+ classicFile.addImportDeclaration({
30
+ namedImports: [client.rlcClientName],
31
+ moduleSpecifier: `${"../".repeat(layer + 2)}api/${modularClientName}.js`
32
+ });
33
+ }
34
+
35
+ const operationMap = new Map<
36
+ OptionalKind<FunctionDeclarationStructure>,
37
+ string | undefined
38
+ >();
39
+ const operationDeclarations: OptionalKind<FunctionDeclarationStructure>[] =
40
+ operationGroup.operations.map((operation) => {
41
+ const declarations = getOperationFunction(operation, modularClientName);
42
+ operationMap.set(declarations, operation.oriName);
43
+ return declarations;
44
+ });
45
+
46
+ const interfaceName = `${getClassicalLayerPrefix(
47
+ operationGroup,
48
+ NameType.Interface,
49
+ "",
50
+ layer
51
+ )}Operations`;
52
+ const existInterface = classicFile
53
+ .getInterfaces()
54
+ .filter((i) => i.getName() === interfaceName)[0];
55
+ const properties: OptionalKind<PropertySignatureStructure>[] = [];
56
+ if (layer !== operationGroup.namespaceHierarchies.length - 1) {
57
+ properties.push({
58
+ kind: StructureKind.PropertySignature,
59
+ name:
60
+ normalizeName(
61
+ (layer === operationGroup.namespaceHierarchies.length - 1
62
+ ? operationGroup.namespaceHierarchies[layer]
63
+ : operationGroup.namespaceHierarchies[layer + 1]) ?? "",
64
+ NameType.Property
65
+ ) ?? operationGroup.propertyName,
66
+ type: `${getClassicalLayerPrefix(
67
+ operationGroup,
68
+ NameType.Interface,
69
+ "",
70
+ layer + 1
71
+ )}Operations`
72
+ });
73
+ } else {
74
+ operationDeclarations.forEach((d) => {
75
+ properties.push({
76
+ kind: StructureKind.PropertySignature,
77
+ name: getClassicalMethodName(d),
78
+ type: `(${d.parameters
79
+ ?.filter((p) => p.name !== "context")
80
+ .map(
81
+ (p) => p.name + (p.name === "options" ? "?" : "") + ": " + p.type
82
+ )
83
+ .join(",")}) => ${d.returnType}`
84
+ });
85
+ });
86
+ }
87
+ if (existInterface) {
88
+ existInterface.addProperties([...properties]);
89
+ } else {
90
+ classicFile.addInterface({
91
+ name: interfaceName,
92
+ isExported: true,
93
+ properties
94
+ });
95
+ }
96
+
97
+ if (layer === operationGroup.namespaceHierarchies.length - 1) {
98
+ classicFile.addFunction({
99
+ name: `get${getClassicalLayerPrefix(
100
+ operationGroup,
101
+ NameType.Interface,
102
+ "",
103
+ layer
104
+ )}`,
105
+ isExported: true,
106
+ parameters: [
107
+ {
108
+ name: "context",
109
+ type: client.rlcClientName
110
+ }
111
+ ],
112
+ statements: `return {
113
+ ${operationDeclarations
114
+ .map((d) => {
115
+ return `${getClassicalMethodName(d)}: (${d.parameters
116
+ ?.filter((p) => p.name !== "context")
117
+ .map(
118
+ (p) =>
119
+ p.name + (p.name === "options" ? "?" : "") + ": " + p.type
120
+ )
121
+ .join(",")}) => ${d.name}(${[
122
+ "context",
123
+ ...[
124
+ d.parameters?.map((p) => p.name).filter((p) => p !== "context")
125
+ ]
126
+ ].join(",")})`;
127
+ })
128
+ .join(",")}
129
+ }`
130
+ });
131
+ }
132
+
133
+ const operationFunctionName = `get${getClassicalLayerPrefix(
134
+ operationGroup,
135
+ NameType.Interface,
136
+ "",
137
+ layer
138
+ )}Operations`;
139
+ const existFunction = classicFile
140
+ .getFunctions()
141
+ .filter((f) => f.getName() === operationFunctionName)[0];
142
+ if (existFunction) {
143
+ const returnStatement = existFunction.getBodyText();
144
+ if (returnStatement) {
145
+ let statement = `,
146
+ ...get${getClassicalLayerPrefix(
147
+ operationGroup,
148
+ NameType.Interface,
149
+ "",
150
+ layer + 1
151
+ )}Operations(context)}`;
152
+ if (layer !== operationGroup.namespaceHierarchies.length - 1) {
153
+ statement = `,
154
+ ${normalizeName(
155
+ operationGroup.namespaceHierarchies[layer + 1] ?? "FIXME",
156
+ NameType.Property
157
+ )}: get${getClassicalLayerPrefix(
158
+ operationGroup,
159
+ NameType.Interface,
160
+ "",
161
+ layer + 1
162
+ )}Operations(context)}`;
163
+ }
164
+ const newReturnStatement = returnStatement.replace(/}$/, statement);
165
+ existFunction.setBodyText(newReturnStatement);
166
+ }
167
+ } else {
168
+ classicFile.addFunction({
169
+ name: operationFunctionName,
170
+ isExported: true,
171
+ parameters: [
172
+ {
173
+ name: "context",
174
+ type: client.rlcClientName
175
+ }
176
+ ],
177
+ returnType: `${getClassicalLayerPrefix(
178
+ operationGroup,
179
+ NameType.Interface,
180
+ "",
181
+ layer
182
+ )}Operations`,
183
+ statements:
184
+ layer !== operationGroup.namespaceHierarchies.length - 1
185
+ ? `return {
186
+ ${normalizeName(
187
+ operationGroup.namespaceHierarchies[layer + 1] ?? "FIXME",
188
+ NameType.Property
189
+ )}: get${getClassicalLayerPrefix(
190
+ operationGroup,
191
+ NameType.Interface,
192
+ "",
193
+ layer + 1
194
+ )}Operations(context)
195
+ }`
196
+ : `return {
197
+ ...get${getClassicalLayerPrefix(
198
+ operationGroup,
199
+ NameType.Interface,
200
+ "",
201
+ layer
202
+ )}(context)
203
+ }`
204
+ });
205
+ }
206
+
207
+ function getClassicalMethodName(
208
+ declaration: OptionalKind<FunctionDeclarationStructure>
209
+ ) {
210
+ return operationMap.get(declaration) ?? declaration.name ?? "FIXME";
211
+ }
212
+ }
@@ -6,6 +6,8 @@ import {
6
6
  import { Client } from "../modularCodeModel.js";
7
7
  import { getType } from "./typeHelpers.js";
8
8
  import { getClientName } from "./namingHelpers.js";
9
+ import { Imports as RuntimeImports } from "@azure-tools/rlc-common";
10
+ import { getImportSpecifier } from "@azure-tools/rlc-common";
9
11
 
10
12
  export function getClientParameters(
11
13
  client: Client
@@ -42,9 +44,12 @@ export function getClientParameters(
42
44
  return params;
43
45
  }
44
46
 
45
- export function importCredential(clientSourceFile: SourceFile): void {
47
+ export function importCredential(
48
+ runtimeImports: RuntimeImports,
49
+ clientSourceFile: SourceFile
50
+ ): void {
46
51
  clientSourceFile.addImportDeclaration({
47
- moduleSpecifier: "@azure/core-auth",
52
+ moduleSpecifier: getImportSpecifier("coreAuth", runtimeImports),
48
53
  namedImports: ["TokenCredential", "KeyCredential"]
49
54
  });
50
55
  }
@@ -1,5 +1,5 @@
1
1
  import { toCamelCase, toPascalCase } from "../../utils/casingUtils.js";
2
- import { Client, Operation } from "../modularCodeModel.js";
2
+ import { Client, Operation, OperationGroup } from "../modularCodeModel.js";
3
3
  import {
4
4
  ReservedModelNames,
5
5
  NameType,
@@ -42,3 +42,27 @@ export function isReservedName(name: string, nameType: NameType): boolean {
42
42
  reservedName.reservedFor.includes(nameType)
43
43
  );
44
44
  }
45
+
46
+ export function getClassicalLayerPrefix(
47
+ operationGroup: OperationGroup | Operation,
48
+ nameType: NameType,
49
+ separator: string = "",
50
+ layer: number = operationGroup.namespaceHierarchies.length - 1
51
+ ): string {
52
+ const prefix: string[] = [];
53
+ if (layer < 0) {
54
+ return prefix.join(separator);
55
+ }
56
+ if (layer === 0) {
57
+ return normalizeName(
58
+ operationGroup.namespaceHierarchies[0] ?? "",
59
+ nameType
60
+ );
61
+ }
62
+ for (let i = 0; i <= layer; i++) {
63
+ prefix.push(
64
+ normalizeName(operationGroup.namespaceHierarchies[i] ?? "", nameType)
65
+ );
66
+ }
67
+ return prefix.join(separator);
68
+ }