@autorest/typescript 6.0.0-beta.15 → 6.0.0-beta.16
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/CHANGELOG.md +5 -0
- package/README.md +37 -3
- package/dist/src/autorestSession.d.ts +8 -3
- package/dist/src/autorestSession.d.ts.map +1 -1
- package/dist/src/autorestSession.js +3 -9
- package/dist/src/autorestSession.js.map +1 -1
- package/dist/src/conflictResolver.d.ts.map +1 -1
- package/dist/src/conflictResolver.js.map +1 -1
- package/dist/src/generators/clientFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/clientFileGenerator.js +181 -31
- package/dist/src/generators/clientFileGenerator.js.map +1 -1
- package/dist/src/generators/indexGenerator.d.ts.map +1 -1
- package/dist/src/generators/indexGenerator.js +70 -9
- package/dist/src/generators/indexGenerator.js.map +1 -1
- package/dist/src/generators/modelsGenerator.d.ts.map +1 -1
- package/dist/src/generators/modelsGenerator.js +20 -2
- package/dist/src/generators/modelsGenerator.js.map +1 -1
- package/dist/src/generators/operationGenerator.js +6 -6
- package/dist/src/generators/operationGenerator.js.map +1 -1
- package/dist/src/generators/samples/sampleEnv.hbs +4 -0
- package/dist/src/generators/samples/sampleEnvGenerator.d.ts +3 -0
- package/dist/src/generators/samples/sampleEnvGenerator.d.ts.map +1 -0
- package/dist/src/generators/samples/sampleEnvGenerator.js +17 -0
- package/dist/src/generators/samples/sampleEnvGenerator.js.map +1 -0
- package/dist/src/generators/samples/sampleGenerator.d.ts +13 -0
- package/dist/src/generators/samples/sampleGenerator.d.ts.map +1 -0
- package/dist/src/generators/samples/sampleGenerator.js +43 -0
- package/dist/src/generators/samples/sampleGenerator.js.map +1 -0
- package/dist/src/generators/static/README.md.hbs +19 -0
- package/dist/src/generators/static/karma.conf.js.hbs +141 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.d.ts +3 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.js +23 -0
- package/dist/src/generators/static/karmaConfigFileGenerator.js.map +1 -0
- package/dist/src/generators/static/packageFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/packageFileGenerator.js +90 -14
- package/dist/src/generators/static/packageFileGenerator.js.map +1 -1
- package/dist/src/generators/static/rollupConfigFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/rollupConfigFileGenerator.js +7 -70
- package/dist/src/generators/static/rollupConfigFileGenerator.js.map +1 -1
- package/dist/src/generators/static/samples.ts.hbs +49 -0
- package/dist/src/generators/static/tsConfigFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/tsConfigFileGenerator.js +9 -10
- package/dist/src/generators/static/tsConfigFileGenerator.js.map +1 -1
- package/dist/src/generators/test/envBrowserFileGenerator.d.ts +3 -0
- package/dist/src/generators/test/envBrowserFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/test/envBrowserFileGenerator.js +15 -0
- package/dist/src/generators/test/envBrowserFileGenerator.js.map +1 -0
- package/dist/src/generators/test/envFileGenerator.d.ts +3 -0
- package/dist/src/generators/test/envFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/test/envFileGenerator.js +23 -0
- package/dist/src/generators/test/envFileGenerator.js.map +1 -0
- package/dist/src/generators/test/recordedClientFileGenerator.d.ts +3 -0
- package/dist/src/generators/test/recordedClientFileGenerator.d.ts.map +1 -0
- package/dist/src/generators/test/recordedClientFileGenerator.js +23 -0
- package/dist/src/generators/test/recordedClientFileGenerator.js.map +1 -0
- package/dist/src/generators/test/rlcEnv.ts.hbs +3 -0
- package/dist/src/generators/test/rlcRecordedClient.ts.hbs +35 -0
- package/dist/src/generators/test/rlcSampleTest.spec.ts.hbs +19 -0
- package/dist/src/generators/{static → test}/sampleTest.ts.hbs +0 -0
- package/dist/src/generators/test/sampleTestGenerator.d.ts.map +1 -1
- package/dist/src/generators/test/sampleTestGenerator.js +23 -7
- package/dist/src/generators/test/sampleTestGenerator.js.map +1 -1
- package/dist/src/generators/utils/pagingOperations.d.ts +5 -0
- package/dist/src/generators/utils/pagingOperations.d.ts.map +1 -1
- package/dist/src/generators/utils/pagingOperations.js +2 -1
- package/dist/src/generators/utils/pagingOperations.js.map +1 -1
- package/dist/src/main.d.ts +2 -2
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +3 -3
- package/dist/src/main.js.map +1 -1
- package/dist/src/models/clientDetails.d.ts +3 -0
- package/dist/src/models/clientDetails.d.ts.map +1 -1
- package/dist/src/models/modelDetails.d.ts +2 -2
- package/dist/src/models/modelDetails.d.ts.map +1 -1
- package/dist/src/models/operationDetails.d.ts +1 -0
- package/dist/src/models/operationDetails.d.ts.map +1 -1
- package/dist/src/models/sampleDetails.d.ts +22 -0
- package/dist/src/models/sampleDetails.d.ts.map +1 -0
- package/dist/src/models/sampleDetails.js +3 -0
- package/dist/src/models/sampleDetails.js.map +1 -0
- package/dist/src/restLevelClient/generateClient.d.ts +1 -1
- package/dist/src/restLevelClient/generateClient.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateClient.js +48 -164
- package/dist/src/restLevelClient/generateClient.js.map +1 -1
- package/dist/src/restLevelClient/generateClientDefinition.d.ts +6 -0
- package/dist/src/restLevelClient/generateClientDefinition.d.ts.map +1 -0
- package/dist/src/restLevelClient/generateClientDefinition.js +231 -0
- package/dist/src/restLevelClient/generateClientDefinition.js.map +1 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.d.ts +8 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.d.ts.map +1 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.js +70 -0
- package/dist/src/restLevelClient/generateMethodShortcuts.js.map +1 -0
- package/dist/src/restLevelClient/generateObjectTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateObjectTypes.js.map +1 -1
- package/dist/src/restLevelClient/generatePagingHelper.d.ts.map +1 -1
- package/dist/src/restLevelClient/generatePagingHelper.js +2 -1
- package/dist/src/restLevelClient/generatePagingHelper.js.map +1 -1
- package/dist/src/restLevelClient/generateParameterTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateParameterTypes.js +104 -18
- package/dist/src/restLevelClient/generateParameterTypes.js.map +1 -1
- package/dist/src/restLevelClient/generatePollingHelper.d.ts.map +1 -1
- package/dist/src/restLevelClient/generatePollingHelper.js +3 -1
- package/dist/src/restLevelClient/generatePollingHelper.js.map +1 -1
- package/dist/src/restLevelClient/generateResponseTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateResponseTypes.js +4 -1
- package/dist/src/restLevelClient/generateResponseTypes.js.map +1 -1
- package/dist/src/restLevelClient/generateRestLevel.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateRestLevel.js +19 -3
- package/dist/src/restLevelClient/generateRestLevel.js.map +1 -1
- package/dist/src/restLevelClient/generateSchemaTypes.d.ts.map +1 -1
- package/dist/src/restLevelClient/generateSchemaTypes.js +5 -2
- package/dist/src/restLevelClient/generateSchemaTypes.js.map +1 -1
- package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts +4 -0
- package/dist/src/restLevelClient/generateTopLevelIndexFile.d.ts.map +1 -0
- package/dist/src/restLevelClient/generateTopLevelIndexFile.js +41 -0
- package/dist/src/restLevelClient/generateTopLevelIndexFile.js.map +1 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.d.ts +10 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.d.ts.map +1 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.js +64 -0
- package/dist/src/restLevelClient/helpers/operationHelpers.js.map +1 -0
- package/dist/src/restLevelClient/interfaces.d.ts +24 -0
- package/dist/src/restLevelClient/interfaces.d.ts.map +1 -0
- package/dist/src/restLevelClient/interfaces.js +3 -0
- package/dist/src/restLevelClient/interfaces.js.map +1 -0
- package/dist/src/restLevelClient/operationHelpers.d.ts.map +1 -1
- package/dist/src/restLevelClient/operationHelpers.js +4 -1
- package/dist/src/restLevelClient/operationHelpers.js.map +1 -1
- package/dist/src/restLevelClient/schemaHelpers.d.ts.map +1 -1
- package/dist/src/restLevelClient/schemaHelpers.js +4 -1
- package/dist/src/restLevelClient/schemaHelpers.js.map +1 -1
- package/dist/src/transforms/operationTransforms.d.ts.map +1 -1
- package/dist/src/transforms/operationTransforms.js +1 -0
- package/dist/src/transforms/operationTransforms.js.map +1 -1
- package/dist/src/transforms/samplesTransforms.d.ts +7 -0
- package/dist/src/transforms/samplesTransforms.d.ts.map +1 -0
- package/dist/src/transforms/samplesTransforms.js +283 -0
- package/dist/src/transforms/samplesTransforms.js.map +1 -0
- package/dist/src/transforms/transforms.d.ts +1 -2
- package/dist/src/transforms/transforms.d.ts.map +1 -1
- package/dist/src/transforms/transforms.js +4 -3
- package/dist/src/transforms/transforms.js.map +1 -1
- package/dist/src/typescriptGenerator.d.ts +2 -2
- package/dist/src/typescriptGenerator.d.ts.map +1 -1
- package/dist/src/typescriptGenerator.js +18 -7
- package/dist/src/typescriptGenerator.js.map +1 -1
- package/dist/src/utils/autorestOptions.d.ts +2 -2
- package/dist/src/utils/autorestOptions.d.ts.map +1 -1
- package/dist/src/utils/autorestOptions.js +70 -30
- package/dist/src/utils/autorestOptions.js.map +1 -1
- package/dist/src/utils/nameUtils.d.ts +6 -2
- package/dist/src/utils/nameUtils.d.ts.map +1 -1
- package/dist/src/utils/nameUtils.js +9 -5
- package/dist/src/utils/nameUtils.js.map +1 -1
- package/dist/src/utils/schemaHelpers.js +8 -3
- package/dist/src/utils/schemaHelpers.js.map +1 -1
- package/package.json +11 -5
- package/src/autorestSession.ts +16 -15
- package/src/conflictResolver.ts +0 -1
- package/src/generators/clientFileGenerator.ts +262 -33
- package/src/generators/indexGenerator.ts +78 -9
- package/src/generators/modelsGenerator.ts +21 -1
- package/src/generators/operationGenerator.ts +7 -7
- package/src/generators/samples/sampleEnv.hbs +4 -0
- package/src/generators/samples/sampleEnvGenerator.ts +14 -0
- package/src/generators/samples/sampleGenerator.ts +50 -0
- package/src/generators/static/README.md.hbs +19 -0
- package/src/generators/static/karma.conf.js.hbs +141 -0
- package/src/generators/static/karmaConfigFileGenerator.ts +20 -0
- package/src/generators/static/packageFileGenerator.ts +99 -14
- package/src/generators/static/rollupConfigFileGenerator.ts +7 -70
- package/src/generators/static/samples.ts.hbs +49 -0
- package/src/generators/static/tsConfigFileGenerator.ts +12 -12
- package/src/generators/test/envBrowserFileGenerator.ts +14 -0
- package/src/generators/test/envFileGenerator.ts +22 -0
- package/src/generators/test/recordedClientFileGenerator.ts +22 -0
- package/src/generators/test/rlcEnv.ts.hbs +3 -0
- package/src/generators/test/rlcRecordedClient.ts.hbs +35 -0
- package/src/generators/test/rlcSampleTest.spec.ts.hbs +19 -0
- package/src/generators/{static → test}/sampleTest.ts.hbs +0 -0
- package/src/generators/test/sampleTestGenerator.ts +23 -8
- package/src/generators/utils/pagingOperations.ts +1 -1
- package/src/main.ts +9 -5
- package/src/models/clientDetails.ts +3 -0
- package/src/models/modelDetails.ts +2 -2
- package/src/models/operationDetails.ts +1 -0
- package/src/models/sampleDetails.ts +22 -0
- package/src/restLevelClient/generateClient.ts +57 -253
- package/src/restLevelClient/generateClientDefinition.ts +343 -0
- package/src/restLevelClient/generateMethodShortcuts.ts +121 -0
- package/src/restLevelClient/generateObjectTypes.ts +1 -3
- package/src/restLevelClient/generatePagingHelper.ts +3 -2
- package/src/restLevelClient/generateParameterTypes.ts +155 -25
- package/src/restLevelClient/generatePollingHelper.ts +3 -3
- package/src/restLevelClient/generateResponseTypes.ts +4 -1
- package/src/restLevelClient/generateRestLevel.ts +24 -6
- package/src/restLevelClient/generateSchemaTypes.ts +5 -3
- package/src/restLevelClient/generateTopLevelIndexFile.ts +41 -0
- package/src/restLevelClient/helpers/operationHelpers.ts +93 -0
- package/src/restLevelClient/interfaces.ts +26 -0
- package/src/restLevelClient/operationHelpers.ts +8 -2
- package/src/restLevelClient/schemaHelpers.ts +4 -2
- package/src/transforms/operationTransforms.ts +1 -0
- package/src/transforms/samplesTransforms.ts +300 -0
- package/src/transforms/transforms.ts +6 -6
- package/src/typescriptGenerator.ts +19 -10
- package/src/utils/autorestOptions.ts +121 -58
- package/src/utils/nameUtils.ts +16 -8
- package/src/utils/schemaHelpers.ts +2 -2
- package/dist/src/generators/clientContextFileGenerator.d.ts +0 -5
- package/dist/src/generators/clientContextFileGenerator.d.ts.map +0 -1
- package/dist/src/generators/clientContextFileGenerator.js +0 -263
- package/dist/src/generators/clientContextFileGenerator.js.map +0 -1
- package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts +0 -6
- package/dist/src/restLevelClient/helpers/getOperationParameters.d.ts.map +0 -1
- package/dist/src/restLevelClient/helpers/getOperationParameters.js +0 -29
- package/dist/src/restLevelClient/helpers/getOperationParameters.js.map +0 -1
- package/src/generators/clientContextFileGenerator.ts +0 -405
- package/src/restLevelClient/helpers/getOperationParameters.ts +0 -37
|
@@ -3,20 +3,24 @@ import {
|
|
|
3
3
|
Operation,
|
|
4
4
|
Parameter,
|
|
5
5
|
SchemaContext,
|
|
6
|
-
Request as OperationRequest
|
|
6
|
+
Request as OperationRequest,
|
|
7
|
+
ParameterLocation
|
|
7
8
|
} from "@autorest/codemodel";
|
|
8
9
|
import {
|
|
9
10
|
InterfaceDeclarationStructure,
|
|
10
11
|
Project,
|
|
12
|
+
PropertySignatureStructure,
|
|
11
13
|
SourceFile,
|
|
12
14
|
StructureKind
|
|
13
15
|
} from "ts-morph";
|
|
16
|
+
import * as path from 'path';
|
|
14
17
|
import { getLanguageMetadata } from "../utils/languageHelpers";
|
|
15
18
|
import { NameType, normalizeName } from "../utils/nameUtils";
|
|
16
|
-
import {
|
|
19
|
+
import { getPropertySignature } from "./getPropertySignature";
|
|
17
20
|
import { primitiveSchemaToType } from "./schemaHelpers";
|
|
18
|
-
import { getOperationParameters } from "./helpers/
|
|
21
|
+
import { getOperationParameters } from "./helpers/operationHelpers";
|
|
19
22
|
import { hasInputModels } from "./helpers/modelHelpers";
|
|
23
|
+
import { getAutorestOptions } from "../autorestSession";
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* Generates the interfaces describing each operation parameters
|
|
@@ -25,8 +29,9 @@ export function generateParameterInterfaces(
|
|
|
25
29
|
model: CodeModel,
|
|
26
30
|
project: Project
|
|
27
31
|
) {
|
|
32
|
+
const { srcPath } = getAutorestOptions();
|
|
28
33
|
const parametersFile = project.createSourceFile(
|
|
29
|
-
`
|
|
34
|
+
path.join(srcPath, `parameters.ts`),
|
|
30
35
|
undefined,
|
|
31
36
|
{
|
|
32
37
|
overwrite: true
|
|
@@ -73,6 +78,15 @@ export function generateParameterInterfaces(
|
|
|
73
78
|
|
|
74
79
|
const request = operation.requests ? operation.requests[i] : undefined;
|
|
75
80
|
|
|
81
|
+
const pathParameterDefinitions = buildPathParameterDefinitions(
|
|
82
|
+
operationName,
|
|
83
|
+
parameters,
|
|
84
|
+
model,
|
|
85
|
+
parametersFile,
|
|
86
|
+
internalReferences,
|
|
87
|
+
i
|
|
88
|
+
)
|
|
89
|
+
|
|
76
90
|
const headerParameterDefinitions = buildHeaderParameterDefinitions(
|
|
77
91
|
operationName,
|
|
78
92
|
parameters,
|
|
@@ -99,8 +113,9 @@ export function generateParameterInterfaces(
|
|
|
99
113
|
|
|
100
114
|
// Add interfaces for body and query parameters
|
|
101
115
|
parametersFile.addInterfaces([
|
|
102
|
-
...(bodyParameterDefinition
|
|
116
|
+
...(bodyParameterDefinition ?? []),
|
|
103
117
|
...(queryParameterDefinitions ?? []),
|
|
118
|
+
...(pathParameterDefinitions ? [pathParameterDefinitions]: []),
|
|
104
119
|
...(headerParameterDefinitions ? [headerParameterDefinitions] : []),
|
|
105
120
|
...(contentTypeParameterDefinition
|
|
106
121
|
? [contentTypeParameterDefinition]
|
|
@@ -232,6 +247,81 @@ function buildHeaderParameterDefinitions(
|
|
|
232
247
|
};
|
|
233
248
|
}
|
|
234
249
|
|
|
250
|
+
function getPathInterfaceDefinition(
|
|
251
|
+
parameters: Parameter[],
|
|
252
|
+
baseName: string,
|
|
253
|
+
model: CodeModel
|
|
254
|
+
): undefined | InterfaceDeclarationStructure {
|
|
255
|
+
// Check if there are any path parameters
|
|
256
|
+
const pathParameters = parameters.filter(
|
|
257
|
+
p => p.protocol.http?.in === ParameterLocation.Uri && model.globalParameters?.indexOf(p) === -1
|
|
258
|
+
);
|
|
259
|
+
if (!pathParameters.length) {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
const pathInterfaceName = `${baseName}PathParameters`;
|
|
263
|
+
return {
|
|
264
|
+
kind: StructureKind.Interface,
|
|
265
|
+
isExported: true,
|
|
266
|
+
name: pathInterfaceName,
|
|
267
|
+
properties: pathParameters.map((h: Parameter) => {
|
|
268
|
+
const description = getLanguageMetadata(h.language).description;
|
|
269
|
+
return {
|
|
270
|
+
name: `"${getLanguageMetadata(h.language).serializedName}"`,
|
|
271
|
+
...(description && { docs: [{ description }] }),
|
|
272
|
+
type: primitiveSchemaToType(h.schema, [
|
|
273
|
+
SchemaContext.Input,
|
|
274
|
+
SchemaContext.Exception
|
|
275
|
+
]),
|
|
276
|
+
hasQuestionToken: !h.required
|
|
277
|
+
};
|
|
278
|
+
})
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function buildPathParameterDefinitions(
|
|
283
|
+
operationName: string,
|
|
284
|
+
parameters: Parameter[],
|
|
285
|
+
model: CodeModel,
|
|
286
|
+
parametersFile: SourceFile,
|
|
287
|
+
internalReferences: Set<string>,
|
|
288
|
+
requestIndex: number
|
|
289
|
+
): InterfaceDeclarationStructure | undefined {
|
|
290
|
+
const pathParameters = parameters.filter(
|
|
291
|
+
p => p.protocol.http?.in === ParameterLocation.Uri && model.globalParameters?.indexOf(p) === -1
|
|
292
|
+
);
|
|
293
|
+
if (!pathParameters.length) {
|
|
294
|
+
return undefined;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const nameSuffix = requestIndex > 0 ? `${requestIndex}` : "";
|
|
298
|
+
const pathParameterInterfaceName = `${operationName}PathParam${nameSuffix}`;
|
|
299
|
+
|
|
300
|
+
const pathInterface = getPathInterfaceDefinition(
|
|
301
|
+
pathParameters,
|
|
302
|
+
operationName,
|
|
303
|
+
model
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
if (pathInterface) {
|
|
307
|
+
parametersFile.addInterface(pathInterface);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
internalReferences.add(pathParameterInterfaceName);
|
|
311
|
+
|
|
312
|
+
return {
|
|
313
|
+
isExported: true,
|
|
314
|
+
kind: StructureKind.Interface,
|
|
315
|
+
name: pathParameterInterfaceName,
|
|
316
|
+
properties: [
|
|
317
|
+
{
|
|
318
|
+
name: "pathParameters",
|
|
319
|
+
type: `${operationName}PathParameters`,
|
|
320
|
+
kind: StructureKind.PropertySignature
|
|
321
|
+
}
|
|
322
|
+
]
|
|
323
|
+
};
|
|
324
|
+
}
|
|
235
325
|
/**
|
|
236
326
|
* Gets the interface definition for an operation bodyParameters
|
|
237
327
|
*/
|
|
@@ -242,36 +332,76 @@ function buildBodyParametersDefinition(
|
|
|
242
332
|
importedModels: Set<string>,
|
|
243
333
|
internalReferences: Set<string>,
|
|
244
334
|
requestIndex: number
|
|
245
|
-
): InterfaceDeclarationStructure
|
|
335
|
+
): InterfaceDeclarationStructure[] {
|
|
246
336
|
const bodyParameters = parameters.filter(p => p.protocol.http?.in === "body");
|
|
247
337
|
if (!bodyParameters.length) {
|
|
248
|
-
return
|
|
338
|
+
return [];
|
|
249
339
|
}
|
|
250
340
|
|
|
251
341
|
const nameSuffix = requestIndex > 0 ? `${requestIndex}` : "";
|
|
252
342
|
const bodyParameterInterfaceName = `${operationName}BodyParam${nameSuffix}`;
|
|
253
|
-
// There is only one body parameter can't be more than one so we can safely take the first
|
|
254
|
-
const bodySignature = getPropertySignature(
|
|
255
|
-
bodyParameters[0],
|
|
256
|
-
schemaUsage,
|
|
257
|
-
importedModels
|
|
258
|
-
);
|
|
259
|
-
|
|
260
343
|
internalReferences.add(bodyParameterInterfaceName);
|
|
261
344
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
345
|
+
// In case of formData we'd get multiple properties in body marked as partialBody
|
|
346
|
+
if (bodyParameters.some(p => p.isPartialBody)) {
|
|
347
|
+
let allOptionalParts = true;
|
|
348
|
+
const propertiesDefinitions: PropertySignatureStructure[] = [];
|
|
349
|
+
for (const param of bodyParameters) {
|
|
350
|
+
if (param.required) {
|
|
351
|
+
allOptionalParts = false;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
propertiesDefinitions.push(
|
|
355
|
+
getPropertySignature(param, schemaUsage, importedModels)
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
const formBodyName = `${operationName}FormBody`;
|
|
360
|
+
const formBodyInterface: InterfaceDeclarationStructure = {
|
|
361
|
+
isExported: true,
|
|
362
|
+
kind: StructureKind.Interface,
|
|
363
|
+
name: formBodyName,
|
|
364
|
+
properties: propertiesDefinitions
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
return [
|
|
368
|
+
{
|
|
369
|
+
isExported: true,
|
|
370
|
+
kind: StructureKind.Interface,
|
|
371
|
+
name: bodyParameterInterfaceName,
|
|
372
|
+
properties: [
|
|
373
|
+
{
|
|
374
|
+
name: "body",
|
|
375
|
+
type: formBodyName,
|
|
376
|
+
hasQuestionToken: allOptionalParts
|
|
377
|
+
}
|
|
378
|
+
]
|
|
379
|
+
},
|
|
380
|
+
formBodyInterface
|
|
381
|
+
];
|
|
382
|
+
} else {
|
|
383
|
+
const bodySignature = getPropertySignature(
|
|
384
|
+
bodyParameters[0],
|
|
385
|
+
schemaUsage,
|
|
386
|
+
importedModels
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
return [
|
|
267
390
|
{
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
391
|
+
isExported: true,
|
|
392
|
+
kind: StructureKind.Interface,
|
|
393
|
+
name: bodyParameterInterfaceName,
|
|
394
|
+
properties: [
|
|
395
|
+
{
|
|
396
|
+
docs: bodySignature.docs,
|
|
397
|
+
name: "body",
|
|
398
|
+
type: bodySignature.type,
|
|
399
|
+
hasQuestionToken: bodySignature.hasQuestionToken
|
|
400
|
+
}
|
|
401
|
+
]
|
|
272
402
|
}
|
|
273
|
-
]
|
|
274
|
-
}
|
|
403
|
+
];
|
|
404
|
+
}
|
|
275
405
|
}
|
|
276
406
|
|
|
277
407
|
/**
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { readFileSync } from "fs";
|
|
2
|
-
import { getSession } from "../autorestSession";
|
|
3
|
-
import { extractPaginationDetails } from "../utils/extractPaginationDetails";
|
|
4
2
|
import * as path from "path";
|
|
5
3
|
import * as hbs from "handlebars";
|
|
6
4
|
import { Project } from "ts-morph";
|
|
5
|
+
import { getAutorestOptions } from "../autorestSession";
|
|
7
6
|
|
|
8
7
|
export function generatePollingHelper(project: Project) {
|
|
9
8
|
let file: string = "";
|
|
@@ -13,7 +12,8 @@ export function generatePollingHelper(project: Project) {
|
|
|
13
12
|
});
|
|
14
13
|
|
|
15
14
|
const readmeFileContents = hbs.compile(file, { noEscape: true });
|
|
16
|
-
|
|
15
|
+
const { srcPath } = getAutorestOptions();
|
|
16
|
+
project.createSourceFile(path.join(srcPath, "pollingHelper.ts"), readmeFileContents({}), {
|
|
17
17
|
overwrite: true
|
|
18
18
|
});
|
|
19
19
|
}
|
|
@@ -22,10 +22,13 @@ import { NameType, normalizeName } from "../utils/nameUtils";
|
|
|
22
22
|
import { getElementType, getFormatDocs, primitiveSchemaToType } from "./schemaHelpers";
|
|
23
23
|
import { getLanguageMetadata } from "../utils/languageHelpers";
|
|
24
24
|
import { hasOutputModels } from "./helpers/modelHelpers";
|
|
25
|
+
import { getAutorestOptions } from "../autorestSession";
|
|
26
|
+
import * as path from 'path';
|
|
25
27
|
|
|
26
28
|
export function generateResponseInterfaces(model: CodeModel, project: Project) {
|
|
29
|
+
const { srcPath } = getAutorestOptions();
|
|
27
30
|
const responsesFile = project.createSourceFile(
|
|
28
|
-
`
|
|
31
|
+
path.join(srcPath, `responses.ts`),
|
|
29
32
|
undefined,
|
|
30
33
|
{
|
|
31
34
|
overwrite: true
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getHost, getSession } from "../autorestSession";
|
|
1
|
+
import { getAutorestOptions, getHost, getSession } from "../autorestSession";
|
|
2
2
|
import { Project, IndentationText } from "ts-morph";
|
|
3
3
|
import { generatePackageJson } from "../generators/static/packageFileGenerator";
|
|
4
4
|
import { generateLicenseFile } from "../generators/static/licenseFileGenerator";
|
|
@@ -10,12 +10,20 @@ import { generateSchemaTypes } from "./generateSchemaTypes";
|
|
|
10
10
|
import { format } from "prettier";
|
|
11
11
|
import { prettierJSONOptions, prettierTypeScriptOptions } from "./config";
|
|
12
12
|
import { generateParameterInterfaces } from "./generateParameterTypes";
|
|
13
|
-
import { generatePathFirstClient } from "./
|
|
13
|
+
import { generatePathFirstClient } from "./generateClientDefinition";
|
|
14
|
+
import { generateClient } from './generateClient';
|
|
14
15
|
import { generateIndexFile } from "../generators/indexGenerator";
|
|
15
16
|
import { generatePagingHelper } from "./generatePagingHelper";
|
|
16
17
|
import { generatePollingHelper } from "./generatePollingHelper";
|
|
18
|
+
import { generateTopLevelIndexFile } from './generateTopLevelIndexFile';
|
|
17
19
|
import { hasPagingOperations } from "../utils/extractPaginationDetails";
|
|
18
20
|
import { hasPollingOperations } from "./helpers/hasPollingOperations";
|
|
21
|
+
import { generateKarmaConfigFile } from "../generators/static/karmaConfigFileGenerator";
|
|
22
|
+
import { generateEnvFile } from "../generators/test/envFileGenerator";
|
|
23
|
+
import { generateEnvBrowserFile } from "../generators/test/envBrowserFileGenerator";
|
|
24
|
+
import { generateRecordedClientFile } from "../generators/test/recordedClientFileGenerator";
|
|
25
|
+
import { generateSampleTestFile } from "../generators/test/sampleTestGenerator";
|
|
26
|
+
|
|
19
27
|
/**
|
|
20
28
|
* Generates a Rest Level Client library
|
|
21
29
|
*/
|
|
@@ -43,11 +51,21 @@ export async function generateRestLevelClient() {
|
|
|
43
51
|
generateLicenseFile(project);
|
|
44
52
|
generateTsConfig(project);
|
|
45
53
|
generateApiExtractorConfig(project);
|
|
54
|
+
|
|
55
|
+
generateKarmaConfigFile(project)
|
|
56
|
+
generateEnvFile(project);
|
|
57
|
+
generateEnvBrowserFile(project);
|
|
58
|
+
generateRecordedClientFile(project);
|
|
59
|
+
generateSampleTestFile(project);
|
|
60
|
+
|
|
46
61
|
generateResponseInterfaces(model, project);
|
|
47
62
|
generateSchemaTypes(model, project);
|
|
48
63
|
generateParameterInterfaces(model, project);
|
|
49
64
|
generatePathFirstClient(model, project);
|
|
65
|
+
generateClient(model, project);
|
|
50
66
|
generateIndexFile(project);
|
|
67
|
+
|
|
68
|
+
generateTopLevelIndexFile(model, project);
|
|
51
69
|
|
|
52
70
|
// Save the source files to the virtual filesystem
|
|
53
71
|
project.saveSync();
|
|
@@ -74,9 +92,9 @@ export async function generateRestLevelClient() {
|
|
|
74
92
|
}
|
|
75
93
|
|
|
76
94
|
// Write the file to the AutoRest host
|
|
77
|
-
host.
|
|
78
|
-
filePath.substr(1), // Get rid of the leading slash '/'
|
|
79
|
-
fileContents
|
|
80
|
-
);
|
|
95
|
+
host.writeFile({
|
|
96
|
+
filename: filePath.substr(1), // Get rid of the leading slash '/'
|
|
97
|
+
content: fileContents
|
|
98
|
+
});
|
|
81
99
|
}
|
|
82
100
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { CodeModel, SchemaContext } from "@autorest/codemodel";
|
|
2
2
|
import { Project } from "ts-morph";
|
|
3
|
+
import * as path from 'path';
|
|
3
4
|
import {
|
|
4
5
|
buildObjectInterfaces,
|
|
5
6
|
buildPolymorphicAliases
|
|
6
7
|
} from "./generateObjectTypes";
|
|
8
|
+
import { getAutorestOptions } from "../autorestSession";
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Generates types to represent schema definitions in the swagger
|
|
@@ -18,10 +20,10 @@ export function generateSchemaTypes(model: CodeModel, project: Project) {
|
|
|
18
20
|
const objectTypeAliases = buildPolymorphicAliases(model, [
|
|
19
21
|
SchemaContext.Input
|
|
20
22
|
]);
|
|
21
|
-
|
|
23
|
+
const { srcPath } = getAutorestOptions();
|
|
22
24
|
if (objectTypeAliases.length || objectsDefinitions.length) {
|
|
23
25
|
const inputModelsFile = project.createSourceFile(
|
|
24
|
-
`
|
|
26
|
+
path.join(srcPath, `models.ts`),
|
|
25
27
|
undefined,
|
|
26
28
|
{
|
|
27
29
|
overwrite: true
|
|
@@ -42,7 +44,7 @@ export function generateSchemaTypes(model: CodeModel, project: Project) {
|
|
|
42
44
|
|
|
43
45
|
if (outputObjectTypeAliases.length || outputObjectsDefinitions.length) {
|
|
44
46
|
const outputModelsFile = project.createSourceFile(
|
|
45
|
-
`
|
|
47
|
+
path.join(srcPath, `outputModels.ts`),
|
|
46
48
|
undefined,
|
|
47
49
|
{
|
|
48
50
|
overwrite: true
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Project } from 'ts-morph';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { getAutorestOptions } from '../autorestSession';
|
|
4
|
+
import { CodeModel } from '@autorest/codemodel';
|
|
5
|
+
import { NameType, normalizeName } from '../utils/nameUtils';
|
|
6
|
+
|
|
7
|
+
const batchOutputFolder: [string, string, string][] = [];
|
|
8
|
+
|
|
9
|
+
export function generateTopLevelIndexFile(model: CodeModel, project: Project) {
|
|
10
|
+
const { multiClient, batch, srcPath } = getAutorestOptions();
|
|
11
|
+
if (srcPath) {
|
|
12
|
+
const clientName = model.language.default.name;
|
|
13
|
+
const moduleName = normalizeName(clientName, NameType.File);
|
|
14
|
+
const relativePath = srcPath.replace('/src', '');
|
|
15
|
+
batchOutputFolder.push([relativePath, clientName, moduleName]);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (multiClient && batch && batch.length > 1 && batchOutputFolder.length === batch.length) {
|
|
19
|
+
const { srcPath } = getAutorestOptions();
|
|
20
|
+
const fileDirectory= path.join(srcPath as string, '../../');
|
|
21
|
+
const file = project.createSourceFile('/src/index.ts', undefined, {
|
|
22
|
+
overwrite: true
|
|
23
|
+
});
|
|
24
|
+
file.moveToDirectory(fileDirectory);
|
|
25
|
+
const allModules: string[] = [];
|
|
26
|
+
batchOutputFolder.forEach(item => {
|
|
27
|
+
file.addImportDeclaration({
|
|
28
|
+
namespaceImport: item[1],
|
|
29
|
+
moduleSpecifier: `${item[0]}`
|
|
30
|
+
});
|
|
31
|
+
file.addExportDeclaration({
|
|
32
|
+
moduleSpecifier: `${item[0]}/${item[2]}`,
|
|
33
|
+
namedExports: [`${item[1]} as ${item[1]}Client`]
|
|
34
|
+
})
|
|
35
|
+
allModules.push(item[1]);
|
|
36
|
+
});
|
|
37
|
+
file.addExportDeclaration({
|
|
38
|
+
namedExports: [...allModules]
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ImplementationLocation,
|
|
3
|
+
Operation,
|
|
4
|
+
Parameter,
|
|
5
|
+
SchemaContext
|
|
6
|
+
} from "@autorest/codemodel";
|
|
7
|
+
import {
|
|
8
|
+
OptionalKind,
|
|
9
|
+
MethodSignatureStructure,
|
|
10
|
+
ParameterDeclarationStructure
|
|
11
|
+
} from "ts-morph";
|
|
12
|
+
import { Methods, PathParameter } from "../interfaces";
|
|
13
|
+
import { getElementType } from "../schemaHelpers";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Given an operation, extract all its parameters
|
|
17
|
+
*/
|
|
18
|
+
export function getOperationParameters(
|
|
19
|
+
operation: Operation,
|
|
20
|
+
requestIndex = 0
|
|
21
|
+
): Parameter[] {
|
|
22
|
+
const operationParams = [
|
|
23
|
+
...(operation.parameters ?? []),
|
|
24
|
+
...(operation.signatureParameters ?? [])
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const distinctParams = new Set(operationParams);
|
|
28
|
+
|
|
29
|
+
if (operation.requests) {
|
|
30
|
+
[
|
|
31
|
+
...(operation.requests[requestIndex].parameters ?? []),
|
|
32
|
+
...(operation.requests[requestIndex].signatureParameters ?? [])
|
|
33
|
+
].forEach(p => distinctParams.add(p));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return [...distinctParams].filter(filterMethodNotSynthetic);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function filterMethodNotSynthetic(parameter: Parameter) {
|
|
40
|
+
const isApiVersion =
|
|
41
|
+
parameter.origin &&
|
|
42
|
+
parameter.language.default.serializedName === "api-version" &&
|
|
43
|
+
parameter.implementation === ImplementationLocation.Method;
|
|
44
|
+
// Origin is added by M4 on synthetic parameters
|
|
45
|
+
return (
|
|
46
|
+
(!parameter.origin || isApiVersion) &&
|
|
47
|
+
parameter.implementation === ImplementationLocation.Method
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function buildMethodDefinitions(
|
|
52
|
+
methods: Methods,
|
|
53
|
+
pathParams: PathParameter[] = []
|
|
54
|
+
): OptionalKind<MethodSignatureStructure>[] {
|
|
55
|
+
const methodDefinitions: OptionalKind<MethodSignatureStructure>[] = [];
|
|
56
|
+
for (const key of Object.keys(methods)) {
|
|
57
|
+
const method = methods[key];
|
|
58
|
+
const description = methods[key][0].description;
|
|
59
|
+
|
|
60
|
+
let areAllOptional = methods[key][0].hasOptionalOptions;
|
|
61
|
+
|
|
62
|
+
methodDefinitions.push({
|
|
63
|
+
name: key,
|
|
64
|
+
...(description && { docs: [{ description }] }),
|
|
65
|
+
parameters: [
|
|
66
|
+
...getPathParamDefinitions(pathParams),
|
|
67
|
+
{
|
|
68
|
+
name: "options",
|
|
69
|
+
hasQuestionToken: areAllOptional,
|
|
70
|
+
type: method.map(m => m.optionsName).join(" | ")
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
returnType: method.map(m => m.returnType).join(" | ")
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return methodDefinitions;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function getPathParamDefinitions(
|
|
81
|
+
pathParams: PathParameter[]
|
|
82
|
+
): OptionalKind<ParameterDeclarationStructure>[] {
|
|
83
|
+
return pathParams.map(p => {
|
|
84
|
+
return {
|
|
85
|
+
name: p.name,
|
|
86
|
+
type: getElementType(p.schema, [
|
|
87
|
+
SchemaContext.Input,
|
|
88
|
+
SchemaContext.Exception
|
|
89
|
+
]),
|
|
90
|
+
description: p.description
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Schema } from "@autorest/codemodel";
|
|
2
|
+
|
|
3
|
+
export type PathParameter = {
|
|
4
|
+
name: string;
|
|
5
|
+
schema: Schema;
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type Methods = {
|
|
10
|
+
[key: string]: [
|
|
11
|
+
{
|
|
12
|
+
optionsName: string;
|
|
13
|
+
description: string;
|
|
14
|
+
hasOptionalOptions: boolean;
|
|
15
|
+
returnType: string;
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type Paths = {
|
|
21
|
+
[key: string]: {
|
|
22
|
+
name: string;
|
|
23
|
+
pathParameters: PathParameter[];
|
|
24
|
+
methods: Methods;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -2,7 +2,9 @@ import {
|
|
|
2
2
|
AnyObjectSchema,
|
|
3
3
|
Operation,
|
|
4
4
|
SchemaResponse,
|
|
5
|
-
Response
|
|
5
|
+
Response,
|
|
6
|
+
Schema,
|
|
7
|
+
BinarySchema
|
|
6
8
|
} from "@autorest/codemodel";
|
|
7
9
|
import { getLanguageMetadata } from "../utils/languageHelpers";
|
|
8
10
|
import { NameType, normalizeName } from "../utils/nameUtils";
|
|
@@ -22,7 +24,11 @@ export function getResponseTypeName(
|
|
|
22
24
|
|
|
23
25
|
export function responseToSchemaResponse(response: Response | SchemaResponse) {
|
|
24
26
|
if (!isSchemaResponse(response)) {
|
|
25
|
-
|
|
27
|
+
let schema: Schema = (response as any).binary
|
|
28
|
+
? new BinarySchema("Binary schema")
|
|
29
|
+
: new AnyObjectSchema("AnyObject schema");
|
|
30
|
+
|
|
31
|
+
return new SchemaResponse(schema, {
|
|
26
32
|
...response
|
|
27
33
|
});
|
|
28
34
|
} else {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AnyObjectSchema,
|
|
3
3
|
ArraySchema,
|
|
4
|
-
ByteArraySchema,
|
|
5
4
|
ChoiceSchema,
|
|
6
5
|
ConstantSchema,
|
|
7
6
|
DictionarySchema,
|
|
@@ -115,7 +114,6 @@ export function primitiveSchemaToType(
|
|
|
115
114
|
case SchemaType.Char:
|
|
116
115
|
return "string";
|
|
117
116
|
case SchemaType.ByteArray:
|
|
118
|
-
case SchemaType.Binary:
|
|
119
117
|
case SchemaType.Duration:
|
|
120
118
|
case SchemaType.Credential:
|
|
121
119
|
case SchemaType.UnixTime:
|
|
@@ -123,6 +121,10 @@ export function primitiveSchemaToType(
|
|
|
123
121
|
case SchemaType.Uuid:
|
|
124
122
|
case SchemaType.String:
|
|
125
123
|
return "string";
|
|
124
|
+
case SchemaType.Binary:
|
|
125
|
+
return schemaUse.includes(SchemaContext.Output)
|
|
126
|
+
? "Uint8Array"
|
|
127
|
+
: "string | Uint8Array";
|
|
126
128
|
case SchemaType.Boolean:
|
|
127
129
|
return "boolean";
|
|
128
130
|
case SchemaType.Choice:
|