@autorest/typescript 6.0.0-beta.15 → 6.0.0-beta.18
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 +14 -0
- package/README.md +37 -3
- package/dist/src/autorestSession.d.ts +12 -4
- 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 +21 -3
- package/dist/src/generators/modelsGenerator.js.map +1 -1
- package/dist/src/generators/operationGenerator.d.ts.map +1 -1
- package/dist/src/generators/operationGenerator.js +10 -8
- 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/apiExtractorConfig.js +2 -2
- package/dist/src/generators/static/apiExtractorConfig.js.map +1 -1
- package/dist/src/generators/static/esLintConfigGenerator.d.ts +3 -0
- package/dist/src/generators/static/esLintConfigGenerator.d.ts.map +1 -0
- package/dist/src/generators/static/esLintConfigGenerator.js +26 -0
- package/dist/src/generators/static/esLintConfigGenerator.js.map +1 -0
- package/dist/src/generators/static/{README.md.hbs → hlcREADME.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 +171 -46
- package/dist/src/generators/static/packageFileGenerator.js.map +1 -1
- package/dist/src/generators/static/readmeFileGenerator.d.ts +2 -2
- package/dist/src/generators/static/readmeFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/readmeFileGenerator.js +31 -17
- package/dist/src/generators/static/readmeFileGenerator.js.map +1 -1
- package/dist/src/generators/static/rlcREADME.md.hbs +71 -0
- package/dist/src/generators/static/rollupConfigFileGenerator.d.ts.map +1 -1
- package/dist/src/generators/static/rollupConfigFileGenerator.js +12 -71
- 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 +40 -18
- 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 +7 -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 +81 -168
- 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 +31 -4
- 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 +37 -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 +10 -2
- package/dist/src/restLevelClient/schemaHelpers.js.map +1 -1
- package/dist/src/transforms/mapperTransforms.js +1 -1
- package/dist/src/transforms/mapperTransforms.js.map +1 -1
- package/dist/src/transforms/objectTransforms.js +1 -1
- package/dist/src/transforms/objectTransforms.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/parameterTransforms.d.ts.map +1 -1
- package/dist/src/transforms/parameterTransforms.js +20 -4
- package/dist/src/transforms/parameterTransforms.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 +5 -4
- 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 +19 -8
- 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 +107 -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 +26 -10
- package/src/autorestSession.ts +20 -16
- package/src/conflictResolver.ts +0 -1
- package/src/generators/clientFileGenerator.ts +264 -33
- package/src/generators/indexGenerator.ts +78 -9
- package/src/generators/modelsGenerator.ts +22 -2
- package/src/generators/operationGenerator.ts +11 -9
- 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/apiExtractorConfig.ts +2 -2
- package/src/generators/static/esLintConfigGenerator.ts +24 -0
- package/src/generators/static/{README.md.hbs → hlcREADME.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 +183 -46
- package/src/generators/static/readmeFileGenerator.ts +57 -34
- package/src/generators/static/rlcREADME.md.hbs +71 -0
- package/src/generators/static/rollupConfigFileGenerator.ts +13 -71
- package/src/generators/static/samples.ts.hbs +49 -0
- package/src/generators/static/tsConfigFileGenerator.ts +47 -20
- 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 +8 -5
- package/src/models/clientDetails.ts +8 -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 +101 -260
- 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 +36 -8
- package/src/restLevelClient/generateSchemaTypes.ts +5 -3
- package/src/restLevelClient/generateTopLevelIndexFile.ts +37 -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 +10 -3
- package/src/transforms/mapperTransforms.ts +1 -1
- package/src/transforms/objectTransforms.ts +1 -1
- package/src/transforms/operationTransforms.ts +1 -0
- package/src/transforms/parameterTransforms.ts +20 -4
- package/src/transforms/samplesTransforms.ts +300 -0
- package/src/transforms/transforms.ts +6 -6
- package/src/typescriptGenerator.ts +20 -11
- package/src/utils/autorestOptions.ts +170 -59
- 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
|
@@ -230,7 +230,7 @@ export function writeAsyncIterators(
|
|
|
230
230
|
* This method enforces Azure SDK Typescript guideline that paging methods should be named list*
|
|
231
231
|
* https://azure.github.io/azure-sdk/typescript_design.html#ts-pagination-provide-list
|
|
232
232
|
*/
|
|
233
|
-
function getPublicMethodName(operation: OperationDetails) {
|
|
233
|
+
export function getPublicMethodName(operation: OperationDetails) {
|
|
234
234
|
let initialOperationName = normalizeName(operation.name, NameType.Operation);
|
|
235
235
|
if (initialOperationName.indexOf("list") === 0) {
|
|
236
236
|
initialOperationName = initialOperationName.replace("list", "");
|
package/src/main.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
AutoRestExtension,
|
|
6
|
+
AutorestExtensionHost
|
|
7
|
+
} from "@autorest/extension-base";
|
|
5
8
|
import { generateTypeScriptLibrary } from "./typescriptGenerator";
|
|
6
9
|
import { generateRestLevelClient } from "./restLevelClient/generateRestLevel";
|
|
7
10
|
import {
|
|
@@ -10,7 +13,7 @@ import {
|
|
|
10
13
|
getAutorestOptions
|
|
11
14
|
} from "./autorestSession";
|
|
12
15
|
|
|
13
|
-
export async function processRequest(host:
|
|
16
|
+
export async function processRequest(host: AutorestExtensionHost) {
|
|
14
17
|
await initializeSession(host);
|
|
15
18
|
const session = getSession();
|
|
16
19
|
const { restLevelClient } = getAutorestOptions();
|
|
@@ -19,7 +22,7 @@ export async function processRequest(host: Host) {
|
|
|
19
22
|
restLevelClient
|
|
20
23
|
? await generateRestLevelClient()
|
|
21
24
|
: await generateTypeScriptLibrary(session.model, host);
|
|
22
|
-
session.
|
|
25
|
+
session.info(`Autorest.Typescript took ${Date.now() - start}ms`);
|
|
23
26
|
} catch (err) {
|
|
24
27
|
session.error("An error was encountered while handling a request:", err);
|
|
25
28
|
throw err;
|
|
@@ -28,8 +31,8 @@ export async function processRequest(host: Host) {
|
|
|
28
31
|
|
|
29
32
|
async function main() {
|
|
30
33
|
const pluginHost = new AutoRestExtension();
|
|
31
|
-
pluginHost.
|
|
32
|
-
await pluginHost.
|
|
34
|
+
pluginHost.add("typescript", processRequest);
|
|
35
|
+
await pluginHost.run();
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
main();
|
|
@@ -9,6 +9,7 @@ import { ObjectDetails } from "./modelDetails";
|
|
|
9
9
|
import { EndpointDetails } from "../transforms/urlTransforms";
|
|
10
10
|
import { KnownMediaType } from "@azure-tools/codegen";
|
|
11
11
|
import { Info } from "@autorest/codemodel";
|
|
12
|
+
import { SampleGroup } from "./sampleDetails";
|
|
12
13
|
|
|
13
14
|
export interface ClientOptions {
|
|
14
15
|
mediaTypes?: Set<KnownMediaType>;
|
|
@@ -20,6 +21,11 @@ export interface TracingInfo {
|
|
|
20
21
|
packagePrefix: string;
|
|
21
22
|
}
|
|
22
23
|
|
|
24
|
+
export interface DependencyInfo {
|
|
25
|
+
link: string;
|
|
26
|
+
description: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
23
29
|
export interface ClientDetails {
|
|
24
30
|
name: string;
|
|
25
31
|
className: string;
|
|
@@ -32,4 +38,6 @@ export interface ClientDetails {
|
|
|
32
38
|
parameters: ParameterDetails[];
|
|
33
39
|
options: ClientOptions;
|
|
34
40
|
endpoint: EndpointDetails;
|
|
41
|
+
samples?: SampleGroup[];
|
|
42
|
+
allTypes: string[];
|
|
35
43
|
}
|
|
@@ -65,7 +65,7 @@ export type PolymorphicObjectDetails = BasicObjectDetails & {
|
|
|
65
65
|
export interface PropertyDetails {
|
|
66
66
|
name: string;
|
|
67
67
|
description?: string;
|
|
68
|
-
defaultValue?: string;
|
|
68
|
+
defaultValue?: string | number | boolean;
|
|
69
69
|
serializedName: string;
|
|
70
70
|
type: string;
|
|
71
71
|
required: boolean;
|
|
@@ -83,7 +83,7 @@ export interface TypeDetails {
|
|
|
83
83
|
typeName: string;
|
|
84
84
|
isConstant?: boolean;
|
|
85
85
|
nullable?: boolean;
|
|
86
|
-
defaultValue?: string;
|
|
86
|
+
defaultValue?: string | number | boolean;
|
|
87
87
|
kind: PropertyKind;
|
|
88
88
|
usedModels: string[];
|
|
89
89
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface SampleGroup {
|
|
2
|
+
sampleFileName: string,
|
|
3
|
+
clientClassName: string,
|
|
4
|
+
clientPackageName: string,
|
|
5
|
+
samples: SampleDetails[],
|
|
6
|
+
importedTypes?: string[],
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface SampleDetails {
|
|
10
|
+
sampleFunctionName: string,
|
|
11
|
+
clientParameterNames: string,
|
|
12
|
+
methodParameterNames: string,
|
|
13
|
+
clientParamAssignments: string[],
|
|
14
|
+
methodParamAssignments: string[],
|
|
15
|
+
originalFileLocation?: string,
|
|
16
|
+
operationName: string,
|
|
17
|
+
isTopLevel: boolean,
|
|
18
|
+
isPaging: boolean,
|
|
19
|
+
operationGroupName: string,
|
|
20
|
+
operationDescription: string,
|
|
21
|
+
clientClassName: string,
|
|
22
|
+
}
|
|
@@ -2,136 +2,47 @@ import {
|
|
|
2
2
|
CodeModel,
|
|
3
3
|
Operation,
|
|
4
4
|
ParameterLocation,
|
|
5
|
-
ImplementationLocation
|
|
6
|
-
Schema,
|
|
7
|
-
SchemaContext
|
|
5
|
+
ImplementationLocation
|
|
8
6
|
} from "@autorest/codemodel";
|
|
9
7
|
|
|
10
|
-
import { getResponseTypeName } from "./operationHelpers";
|
|
11
|
-
|
|
12
8
|
import {
|
|
13
|
-
CallSignatureDeclarationStructure,
|
|
14
|
-
MethodSignatureStructure,
|
|
15
|
-
OptionalKind,
|
|
16
9
|
Project,
|
|
17
|
-
SourceFile,
|
|
18
10
|
StatementStructures,
|
|
19
11
|
StructureKind,
|
|
20
12
|
VariableDeclarationKind,
|
|
21
13
|
VariableStatementStructure,
|
|
22
|
-
WriterFunction
|
|
23
|
-
Writers
|
|
14
|
+
WriterFunction
|
|
24
15
|
} from "ts-morph";
|
|
16
|
+
import * as path from "path";
|
|
25
17
|
|
|
26
18
|
import { getAutorestOptions, getSession } from "../autorestSession";
|
|
27
19
|
import { transformBaseUrl } from "../transforms/urlTransforms";
|
|
28
20
|
import { NameType, normalizeName } from "../utils/nameUtils";
|
|
29
|
-
import { isConstantSchema
|
|
21
|
+
import { isConstantSchema } from "./schemaHelpers";
|
|
30
22
|
import { getLanguageMetadata } from "../utils/languageHelpers";
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
|
|
34
|
-
type PathParameter = { name: string; schema: Schema, description?: string };
|
|
23
|
+
import { generateMethodShortcutImplementation } from "./generateMethodShortcuts";
|
|
24
|
+
import { Paths } from "./interfaces";
|
|
25
|
+
import { pathDictionary } from "./generateClientDefinition";
|
|
35
26
|
|
|
36
|
-
|
|
37
|
-
[key: string]: [
|
|
38
|
-
{
|
|
39
|
-
optionsName: string;
|
|
40
|
-
description: string;
|
|
41
|
-
hasOptionalOptions: boolean;
|
|
42
|
-
returnType: string;
|
|
43
|
-
}
|
|
44
|
-
];
|
|
45
|
-
};
|
|
46
|
-
type Paths = {
|
|
47
|
-
[key: string]: {
|
|
48
|
-
name: string;
|
|
49
|
-
pathParameters: PathParameter[];
|
|
50
|
-
methods: Methods;
|
|
51
|
-
};
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
export function generatePathFirstClient(model: CodeModel, project: Project) {
|
|
27
|
+
export function generateClient(model: CodeModel, project: Project) {
|
|
55
28
|
const name = normalizeName(
|
|
56
29
|
getLanguageMetadata(model.language).name,
|
|
57
30
|
NameType.File
|
|
58
31
|
);
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const importedResponses = new Set<string>();
|
|
66
|
-
const pathDictionary: Paths = {};
|
|
67
|
-
for (const operationGroup of model.operationGroups) {
|
|
68
|
-
for (const operation of operationGroup.operations) {
|
|
69
|
-
const operationName = getLanguageMetadata(operation.language).name;
|
|
70
|
-
const operationDescription = getLanguageMetadata(operation.language)
|
|
71
|
-
.description;
|
|
72
|
-
const pathParameters: PathParameter[] =
|
|
73
|
-
operation.parameters
|
|
74
|
-
?.filter(p => p.protocol.http?.in === ParameterLocation.Path)
|
|
75
|
-
.map(p => {
|
|
76
|
-
const languageMetadata = getLanguageMetadata(p.language);
|
|
77
|
-
return {
|
|
78
|
-
name: languageMetadata.serializedName || languageMetadata.name,
|
|
79
|
-
schema: p.schema,
|
|
80
|
-
description: languageMetadata.description
|
|
81
|
-
};
|
|
82
|
-
}) || [];
|
|
83
|
-
const path: string = operation.requests?.[0].protocol.http?.path;
|
|
84
|
-
pathParameters.sort(function compare(a: PathParameter, b: PathParameter) {
|
|
85
|
-
return path.indexOf(a.name) - path.indexOf(b.name);
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
for (const request of operation.requests || []) {
|
|
89
|
-
const path: string = (request.protocol.http?.path as string) || "";
|
|
90
|
-
const method = request.protocol.http?.method;
|
|
91
|
-
|
|
92
|
-
if (path && method) {
|
|
93
|
-
if (!pathDictionary[path]) {
|
|
94
|
-
pathDictionary[path] = {
|
|
95
|
-
pathParameters,
|
|
96
|
-
methods: {},
|
|
97
|
-
name: operationName
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
const hasOptionalOptions = !hasRequiredOptions(operation);
|
|
101
|
-
|
|
102
|
-
const newMethod = {
|
|
103
|
-
description: operationDescription,
|
|
104
|
-
optionsName: getOperationOptionsType(operation, importedParameters),
|
|
105
|
-
hasOptionalOptions,
|
|
106
|
-
returnType: `Promise<${getOperationReturnType(
|
|
107
|
-
operation,
|
|
108
|
-
importedResponses
|
|
109
|
-
)}>`
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
if (pathDictionary[path].methods[`${method}`]) {
|
|
113
|
-
pathDictionary[path].methods[`${method}`].push(newMethod);
|
|
114
|
-
} else {
|
|
115
|
-
pathDictionary[path].methods[`${method}`] = [newMethod];
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
32
|
+
const { srcPath } = getAutorestOptions();
|
|
33
|
+
const clientFile = project.createSourceFile(
|
|
34
|
+
path.join(srcPath, `${name}.ts`),
|
|
35
|
+
undefined,
|
|
36
|
+
{
|
|
37
|
+
overwrite: true
|
|
119
38
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
clientFile.addInterface({
|
|
123
|
-
name: "Routes",
|
|
124
|
-
isExported: true,
|
|
125
|
-
callSignatures: getPathFirstRoutesInterfaceDefinition(
|
|
126
|
-
pathDictionary,
|
|
127
|
-
clientFile
|
|
128
|
-
)
|
|
129
|
-
});
|
|
39
|
+
);
|
|
130
40
|
|
|
41
|
+
// Get all paths
|
|
131
42
|
const clientName = getLanguageMetadata(model.language).name;
|
|
132
43
|
const uriParameter = getClientUriParameter();
|
|
133
44
|
|
|
134
|
-
const { addCredentials, credentialKeyHeaderName } = getAutorestOptions();
|
|
45
|
+
const { addCredentials, credentialKeyHeaderName, multiClient, batch, credentialScopes } = getAutorestOptions();
|
|
135
46
|
const credentialTypes = addCredentials ? ["TokenCredential"] : [];
|
|
136
47
|
|
|
137
48
|
if (credentialKeyHeaderName) {
|
|
@@ -140,84 +51,59 @@ export function generatePathFirstClient(model: CodeModel, project: Project) {
|
|
|
140
51
|
|
|
141
52
|
const commonClientParams = [
|
|
142
53
|
...(uriParameter ? [{ name: uriParameter, type: "string" }] : []),
|
|
143
|
-
...(addCredentials === false
|
|
54
|
+
...(addCredentials === false || !credentialScopes || credentialScopes.length === 0
|
|
144
55
|
? []
|
|
145
56
|
: [{ name: "credentials", type: credentialTypes.join(" | ") }])
|
|
146
57
|
];
|
|
147
|
-
const
|
|
148
|
-
// const factoryTypeName = `${clientName}Factory`;
|
|
149
|
-
clientFile.addTypeAlias({
|
|
150
|
-
isExported: true,
|
|
151
|
-
name: clientIterfaceName,
|
|
152
|
-
type: Writers.intersectionType(
|
|
153
|
-
"Client",
|
|
154
|
-
Writers.objectType({ properties: [{ name: "path", type: "Routes" }] })
|
|
155
|
-
)
|
|
156
|
-
});
|
|
58
|
+
const clientInterfaceName = clientName.endsWith("Client")? `${clientName}`: `${clientName}Client`;
|
|
157
59
|
|
|
158
|
-
|
|
60
|
+
const functionStatement = {
|
|
159
61
|
isExported: true,
|
|
160
|
-
name:
|
|
62
|
+
name: `createClient`,
|
|
161
63
|
parameters: [
|
|
162
64
|
...commonClientParams,
|
|
163
65
|
{ name: "options", type: "ClientOptions = {}" }
|
|
164
66
|
],
|
|
165
|
-
returnType:
|
|
166
|
-
isDefaultExport:
|
|
167
|
-
statements: getClientFactoryBody(
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (importedParameters.size) {
|
|
171
|
-
clientFile.addImportDeclaration({
|
|
172
|
-
namedImports: [...importedParameters],
|
|
173
|
-
moduleSpecifier: "./parameters"
|
|
174
|
-
});
|
|
175
|
-
}
|
|
67
|
+
returnType: clientInterfaceName,
|
|
68
|
+
isDefaultExport: false,
|
|
69
|
+
statements: getClientFactoryBody(clientInterfaceName, pathDictionary)
|
|
70
|
+
};
|
|
176
71
|
|
|
177
|
-
if (
|
|
178
|
-
|
|
179
|
-
namedImports: [...importedResponses],
|
|
180
|
-
moduleSpecifier: "./responses"
|
|
181
|
-
});
|
|
72
|
+
if (!multiClient || !batch || batch.length === 1) {
|
|
73
|
+
functionStatement.isDefaultExport = true;
|
|
182
74
|
}
|
|
75
|
+
clientFile.addFunction(functionStatement);
|
|
183
76
|
|
|
184
77
|
clientFile.addImportDeclarations([
|
|
185
78
|
{
|
|
186
|
-
namedImports: ["getClient", "ClientOptions"
|
|
79
|
+
namedImports: ["getClient", "ClientOptions"],
|
|
187
80
|
moduleSpecifier: "@azure-rest/core-client"
|
|
188
81
|
}
|
|
189
82
|
]);
|
|
190
83
|
|
|
84
|
+
if (addCredentials && credentialScopes && credentialScopes.length > 0) {
|
|
85
|
+
clientFile.addImportDeclarations([
|
|
86
|
+
{
|
|
87
|
+
namedImports: credentialTypes,
|
|
88
|
+
moduleSpecifier: "@azure/core-auth"
|
|
89
|
+
}
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
191
92
|
clientFile.addImportDeclarations([
|
|
192
93
|
{
|
|
193
|
-
namedImports:
|
|
194
|
-
moduleSpecifier: "
|
|
94
|
+
namedImports: [`${clientInterfaceName}`],
|
|
95
|
+
moduleSpecifier: "./clientDefinitions"
|
|
195
96
|
}
|
|
196
97
|
]);
|
|
197
98
|
}
|
|
198
99
|
|
|
199
|
-
function hasRequiredOptions(operation: Operation) {
|
|
200
|
-
return getOperationParameters(operation)
|
|
201
|
-
.filter(p => p.implementation === ImplementationLocation.Method)
|
|
202
|
-
.filter(p => ["query", "body", "headers"].includes(p.protocol.http?.in))
|
|
203
|
-
.some(p => p.required);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
function getOperationOptionsType(
|
|
207
|
-
operation: Operation,
|
|
208
|
-
importedParameters = new Set<string>()
|
|
209
|
-
) {
|
|
210
|
-
const paramsName = `${
|
|
211
|
-
getLanguageMetadata(operation.language).name
|
|
212
|
-
}Parameters`;
|
|
213
|
-
importedParameters.add(paramsName);
|
|
214
|
-
|
|
215
|
-
return paramsName;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
100
|
function getClientFactoryBody(
|
|
219
|
-
clientTypeName: string
|
|
101
|
+
clientTypeName: string,
|
|
102
|
+
paths: Paths
|
|
220
103
|
): string | WriterFunction | (string | WriterFunction | StatementStructures)[] {
|
|
104
|
+
const { rlcShortcut, packageDetails } = getAutorestOptions();
|
|
105
|
+
let clientPackageName = packageDetails.nameWithoutScope;
|
|
106
|
+
const packageVersion = packageDetails.version;
|
|
221
107
|
const { model } = getSession();
|
|
222
108
|
const { endpoint, parameterName } = transformBaseUrl(model);
|
|
223
109
|
let baseUrl: string;
|
|
@@ -237,6 +123,30 @@ function getClientFactoryBody(
|
|
|
237
123
|
apiVersionStatement = `options.apiVersion = options.apiVersion ?? "${apiVersion}"`;
|
|
238
124
|
}
|
|
239
125
|
|
|
126
|
+
if (!clientPackageName.endsWith("-rest")) {
|
|
127
|
+
clientPackageName = clientPackageName + "-rest";
|
|
128
|
+
}
|
|
129
|
+
const userAgentInfoStatement =
|
|
130
|
+
"const userAgentInfo = `azsdk-js-" +
|
|
131
|
+
clientPackageName +
|
|
132
|
+
"/" +
|
|
133
|
+
packageVersion +
|
|
134
|
+
"`;";
|
|
135
|
+
const userAgentPrefix =
|
|
136
|
+
"options.userAgentOptions && options.userAgentOptions.userAgentPrefix ? `${options.userAgentOptions.userAgentPrefix} ${userAgentInfo}`: `${userAgentInfo}`;";
|
|
137
|
+
const userAgentStatement: VariableStatementStructure = {
|
|
138
|
+
kind: StructureKind.VariableStatement,
|
|
139
|
+
declarationKind: VariableDeclarationKind.Const,
|
|
140
|
+
declarations: [{ name: "userAgentPrefix", initializer: userAgentPrefix }]
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const userAgentOptionsStatement = `options = {
|
|
144
|
+
...options,
|
|
145
|
+
userAgentOptions: {
|
|
146
|
+
userAgentPrefix
|
|
147
|
+
}
|
|
148
|
+
}`;
|
|
149
|
+
|
|
240
150
|
const baseUrlStatement: VariableStatementStructure = {
|
|
241
151
|
kind: StructureKind.VariableStatement,
|
|
242
152
|
declarationKind: VariableDeclarationKind.Const,
|
|
@@ -262,17 +172,43 @@ function getClientFactoryBody(
|
|
|
262
172
|
credentials: {
|
|
263
173
|
${scopes}
|
|
264
174
|
${apiKeyHeaderName}
|
|
265
|
-
}
|
|
175
|
+
},
|
|
266
176
|
}`
|
|
267
177
|
: "";
|
|
268
178
|
|
|
269
|
-
const getClient = `
|
|
270
|
-
baseUrl,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
) as ${clientTypeName};`;
|
|
179
|
+
const getClient = `const client = getClient(
|
|
180
|
+
baseUrl, ${credentials ? "credentials," : ""} options
|
|
181
|
+
) as ${clientTypeName};
|
|
182
|
+
`;
|
|
274
183
|
|
|
275
|
-
|
|
184
|
+
let returnStatement = `return client;`;
|
|
185
|
+
|
|
186
|
+
if (rlcShortcut) {
|
|
187
|
+
const shortcutImplementations = generateMethodShortcutImplementation(
|
|
188
|
+
model,
|
|
189
|
+
paths
|
|
190
|
+
);
|
|
191
|
+
const shortcutBody = Object.keys(shortcutImplementations).map(key => {
|
|
192
|
+
// If the operation group has an empty name, it means its operations are client
|
|
193
|
+
// level operations so we need to spread the definitions. Otherwise they are
|
|
194
|
+
// within an operation group so we add them as key: value
|
|
195
|
+
return `${key ? `"${key}":` : "..."} {${shortcutImplementations[
|
|
196
|
+
key
|
|
197
|
+
].join()}}`;
|
|
198
|
+
});
|
|
199
|
+
returnStatement = `return { ...client, ${shortcutBody.join()} };`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return [
|
|
203
|
+
baseUrlStatement,
|
|
204
|
+
apiVersionStatement,
|
|
205
|
+
credentials,
|
|
206
|
+
userAgentInfoStatement,
|
|
207
|
+
userAgentStatement,
|
|
208
|
+
userAgentOptionsStatement,
|
|
209
|
+
getClient,
|
|
210
|
+
returnStatement
|
|
211
|
+
];
|
|
276
212
|
}
|
|
277
213
|
|
|
278
214
|
function getApiVersion(): string | undefined {
|
|
@@ -299,103 +235,8 @@ function getApiVersion(): string | undefined {
|
|
|
299
235
|
return undefined;
|
|
300
236
|
}
|
|
301
237
|
|
|
302
|
-
function getOperationReturnType(
|
|
303
|
-
operation: Operation,
|
|
304
|
-
importedResponses = new Set<string>()
|
|
305
|
-
) {
|
|
306
|
-
let returnType: string = "HttpResponse";
|
|
307
|
-
if (operation.responses && operation.responses.length) {
|
|
308
|
-
const responses = [...operation.responses, ...(operation.exceptions || [])];
|
|
309
|
-
|
|
310
|
-
const responseTypes = responses
|
|
311
|
-
.filter(
|
|
312
|
-
r => r.protocol.http?.statusCodes && r.protocol.http?.statusCodes.length
|
|
313
|
-
)
|
|
314
|
-
.map(r => {
|
|
315
|
-
const responseName = getResponseTypeName(operation, r);
|
|
316
|
-
importedResponses.add(responseName);
|
|
317
|
-
return responseName;
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
if (responseTypes.length) {
|
|
321
|
-
returnType = responseTypes.join(" | ");
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
return returnType;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
function getPathFirstRoutesInterfaceDefinition(
|
|
329
|
-
paths: Paths,
|
|
330
|
-
sourcefile: SourceFile
|
|
331
|
-
): CallSignatureDeclarationStructure[] {
|
|
332
|
-
const signatures: CallSignatureDeclarationStructure[] = [];
|
|
333
|
-
for (const key of Object.keys(paths)) {
|
|
334
|
-
generatePathFirstRouteMethodsDefinition(
|
|
335
|
-
paths[key].name,
|
|
336
|
-
paths[key].methods,
|
|
337
|
-
sourcefile
|
|
338
|
-
);
|
|
339
|
-
const pathParams = paths[key].pathParameters;
|
|
340
|
-
signatures.push({
|
|
341
|
-
docs: [
|
|
342
|
-
`Resource for '${key
|
|
343
|
-
.replace(/}/g, "\\}")
|
|
344
|
-
.replace(
|
|
345
|
-
/{/g,
|
|
346
|
-
"\\{"
|
|
347
|
-
)}' has methods for the following verbs: ${Object.keys(
|
|
348
|
-
paths[key].methods
|
|
349
|
-
).join(", ")}`
|
|
350
|
-
],
|
|
351
|
-
parameters: [
|
|
352
|
-
{ name: "path", type: `"${key}"` },
|
|
353
|
-
...pathParams.map(p => {
|
|
354
|
-
return { name: p.name, type: getElementType(p.schema, [SchemaContext.Input, SchemaContext.Exception]), description: p.description };
|
|
355
|
-
})
|
|
356
|
-
],
|
|
357
|
-
returnType: paths[key].name,
|
|
358
|
-
kind: StructureKind.CallSignature
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
return signatures;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
238
|
function getClientUriParameter() {
|
|
365
239
|
const { model } = getSession();
|
|
366
240
|
const { parameterName } = transformBaseUrl(model);
|
|
367
241
|
return parameterName;
|
|
368
242
|
}
|
|
369
|
-
|
|
370
|
-
function generatePathFirstRouteMethodsDefinition(
|
|
371
|
-
operationName: string,
|
|
372
|
-
methods: Methods,
|
|
373
|
-
file: SourceFile
|
|
374
|
-
): void {
|
|
375
|
-
const methodDefinitions: OptionalKind<MethodSignatureStructure>[] = [];
|
|
376
|
-
for (const key of Object.keys(methods)) {
|
|
377
|
-
const method = methods[key];
|
|
378
|
-
const description = methods[key][0].description;
|
|
379
|
-
|
|
380
|
-
let areAllOptional = !method.some(m => !m.hasOptionalOptions);
|
|
381
|
-
|
|
382
|
-
methodDefinitions.push({
|
|
383
|
-
name: key,
|
|
384
|
-
...(description && { docs: [{ description }] }),
|
|
385
|
-
parameters: [
|
|
386
|
-
{
|
|
387
|
-
name: "options",
|
|
388
|
-
hasQuestionToken: areAllOptional,
|
|
389
|
-
type: method.map(m => m.optionsName).join(" | ")
|
|
390
|
-
}
|
|
391
|
-
],
|
|
392
|
-
returnType: method.map(m => m.returnType).join(" | ")
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
file.addInterface({
|
|
397
|
-
methods: methodDefinitions,
|
|
398
|
-
name: operationName,
|
|
399
|
-
isExported: true
|
|
400
|
-
});
|
|
401
|
-
}
|