@azure-tools/rlc-common 0.11.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 (232) hide show
  1. package/.eslintrc.json +23 -0
  2. package/.prettierignore +1 -0
  3. package/.prettierrc +7 -0
  4. package/.rush/temp/package-deps_build.json +53 -0
  5. package/.rush/temp/shrinkwrap-deps.json +147 -0
  6. package/CHANGELOG.md +61 -0
  7. package/CONTRIBUTING.md +30 -0
  8. package/README.md +3 -0
  9. package/dist/buildClient.js +268 -0
  10. package/dist/buildClient.js.map +1 -0
  11. package/dist/buildClientDefinitions.js +160 -0
  12. package/dist/buildClientDefinitions.js.map +1 -0
  13. package/dist/buildIndexFile.js +170 -0
  14. package/dist/buildIndexFile.js.map +1 -0
  15. package/dist/buildIsUnexpectedHelper.js +220 -0
  16. package/dist/buildIsUnexpectedHelper.js.map +1 -0
  17. package/dist/buildMethodShortcuts.js +50 -0
  18. package/dist/buildMethodShortcuts.js.map +1 -0
  19. package/dist/buildObjectTypes.js +286 -0
  20. package/dist/buildObjectTypes.js.map +1 -0
  21. package/dist/buildPaginateHelper.js +30 -0
  22. package/dist/buildPaginateHelper.js.map +1 -0
  23. package/dist/buildParameterTypes.js +315 -0
  24. package/dist/buildParameterTypes.js.map +1 -0
  25. package/dist/buildPollingHelper.js +21 -0
  26. package/dist/buildPollingHelper.js.map +1 -0
  27. package/dist/buildResponseTypes.js +135 -0
  28. package/dist/buildResponseTypes.js.map +1 -0
  29. package/dist/buildSchemaType.js +65 -0
  30. package/dist/buildSchemaType.js.map +1 -0
  31. package/dist/buildSerializeHelper.js +35 -0
  32. package/dist/buildSerializeHelper.js.map +1 -0
  33. package/dist/buildTopLevelIndexFile.js +48 -0
  34. package/dist/buildTopLevelIndexFile.js.map +1 -0
  35. package/dist/helpers/nameConstructors.js +41 -0
  36. package/dist/helpers/nameConstructors.js.map +1 -0
  37. package/dist/helpers/nameUtils.js +196 -0
  38. package/dist/helpers/nameUtils.js.map +1 -0
  39. package/dist/helpers/operationHelpers.js +103 -0
  40. package/dist/helpers/operationHelpers.js.map +1 -0
  41. package/dist/helpers/pathUtils.js +13 -0
  42. package/dist/helpers/pathUtils.js.map +1 -0
  43. package/dist/helpers/schemaHelpers.js +27 -0
  44. package/dist/helpers/schemaHelpers.js.map +1 -0
  45. package/dist/helpers/shortcutMethods.js +46 -0
  46. package/dist/helpers/shortcutMethods.js.map +1 -0
  47. package/dist/index.js +45 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/interfaces.js +18 -0
  50. package/dist/interfaces.js.map +1 -0
  51. package/dist/metadata/buildApiExtractorConfig.js +56 -0
  52. package/dist/metadata/buildApiExtractorConfig.js.map +1 -0
  53. package/dist/metadata/buildESLintConfig.js +33 -0
  54. package/dist/metadata/buildESLintConfig.js.map +1 -0
  55. package/dist/metadata/buildLicenseFile.js +41 -0
  56. package/dist/metadata/buildLicenseFile.js.map +1 -0
  57. package/dist/metadata/buildPackageFile.js +274 -0
  58. package/dist/metadata/buildPackageFile.js.map +1 -0
  59. package/dist/metadata/buildReadmeFile.js +170 -0
  60. package/dist/metadata/buildReadmeFile.js.map +1 -0
  61. package/dist/metadata/buildRollupConfig.js +144 -0
  62. package/dist/metadata/buildRollupConfig.js.map +1 -0
  63. package/dist/metadata/buildTsConfig.js +72 -0
  64. package/dist/metadata/buildTsConfig.js.map +1 -0
  65. package/dist/package.json +1 -0
  66. package/dist/static/paginateContent.js +214 -0
  67. package/dist/static/paginateContent.js.map +1 -0
  68. package/dist/static/pollingContent.js +98 -0
  69. package/dist/static/pollingContent.js.map +1 -0
  70. package/dist/static/serializeHelper.js +30 -0
  71. package/dist/static/serializeHelper.js.map +1 -0
  72. package/dist/test/buildEnvFile.js +31 -0
  73. package/dist/test/buildEnvFile.js.map +1 -0
  74. package/dist/test/buildKarmaConfig.js +19 -0
  75. package/dist/test/buildKarmaConfig.js.map +1 -0
  76. package/dist/test/buildRecordedClient.js +22 -0
  77. package/dist/test/buildRecordedClient.js.map +1 -0
  78. package/dist/test/buildSampleTest.js +19 -0
  79. package/dist/test/buildSampleTest.js.map +1 -0
  80. package/dist/test/template.js +191 -0
  81. package/dist/test/template.js.map +1 -0
  82. package/dist-esm/buildClient.js +261 -0
  83. package/dist-esm/buildClient.js.map +1 -0
  84. package/dist-esm/buildClientDefinitions.js +155 -0
  85. package/dist-esm/buildClientDefinitions.js.map +1 -0
  86. package/dist-esm/buildIndexFile.js +165 -0
  87. package/dist-esm/buildIndexFile.js.map +1 -0
  88. package/dist-esm/buildIsUnexpectedHelper.js +216 -0
  89. package/dist-esm/buildIsUnexpectedHelper.js.map +1 -0
  90. package/dist-esm/buildMethodShortcuts.js +46 -0
  91. package/dist-esm/buildMethodShortcuts.js.map +1 -0
  92. package/dist-esm/buildObjectTypes.js +288 -0
  93. package/dist-esm/buildObjectTypes.js.map +1 -0
  94. package/dist-esm/buildPaginateHelper.js +26 -0
  95. package/dist-esm/buildPaginateHelper.js.map +1 -0
  96. package/dist-esm/buildParameterTypes.js +321 -0
  97. package/dist-esm/buildParameterTypes.js.map +1 -0
  98. package/dist-esm/buildPollingHelper.js +17 -0
  99. package/dist-esm/buildPollingHelper.js.map +1 -0
  100. package/dist-esm/buildResponseTypes.js +140 -0
  101. package/dist-esm/buildResponseTypes.js.map +1 -0
  102. package/dist-esm/buildSchemaType.js +60 -0
  103. package/dist-esm/buildSchemaType.js.map +1 -0
  104. package/dist-esm/buildSerializeHelper.js +31 -0
  105. package/dist-esm/buildSerializeHelper.js.map +1 -0
  106. package/dist-esm/buildTopLevelIndexFile.js +44 -0
  107. package/dist-esm/buildTopLevelIndexFile.js.map +1 -0
  108. package/dist-esm/helpers/nameConstructors.js +34 -0
  109. package/dist-esm/helpers/nameConstructors.js.map +1 -0
  110. package/dist-esm/helpers/nameUtils.js +187 -0
  111. package/dist-esm/helpers/nameUtils.js.map +1 -0
  112. package/dist-esm/helpers/operationHelpers.js +84 -0
  113. package/dist-esm/helpers/operationHelpers.js.map +1 -0
  114. package/dist-esm/helpers/pathUtils.js +9 -0
  115. package/dist-esm/helpers/pathUtils.js.map +1 -0
  116. package/dist-esm/helpers/schemaHelpers.js +21 -0
  117. package/dist-esm/helpers/schemaHelpers.js.map +1 -0
  118. package/dist-esm/helpers/shortcutMethods.js +42 -0
  119. package/dist-esm/helpers/shortcutMethods.js.map +1 -0
  120. package/dist-esm/index.js +29 -0
  121. package/dist-esm/index.js.map +1 -0
  122. package/dist-esm/interfaces.js +15 -0
  123. package/dist-esm/interfaces.js.map +1 -0
  124. package/dist-esm/metadata/buildApiExtractorConfig.js +51 -0
  125. package/dist-esm/metadata/buildApiExtractorConfig.js.map +1 -0
  126. package/dist-esm/metadata/buildESLintConfig.js +28 -0
  127. package/dist-esm/metadata/buildESLintConfig.js.map +1 -0
  128. package/dist-esm/metadata/buildLicenseFile.js +36 -0
  129. package/dist-esm/metadata/buildLicenseFile.js.map +1 -0
  130. package/dist-esm/metadata/buildPackageFile.js +276 -0
  131. package/dist-esm/metadata/buildPackageFile.js.map +1 -0
  132. package/dist-esm/metadata/buildReadmeFile.js +167 -0
  133. package/dist-esm/metadata/buildReadmeFile.js.map +1 -0
  134. package/dist-esm/metadata/buildRollupConfig.js +139 -0
  135. package/dist-esm/metadata/buildRollupConfig.js.map +1 -0
  136. package/dist-esm/metadata/buildTsConfig.js +67 -0
  137. package/dist-esm/metadata/buildTsConfig.js.map +1 -0
  138. package/dist-esm/package.json +1 -0
  139. package/dist-esm/static/paginateContent.js +211 -0
  140. package/dist-esm/static/paginateContent.js.map +1 -0
  141. package/dist-esm/static/pollingContent.js +95 -0
  142. package/dist-esm/static/pollingContent.js.map +1 -0
  143. package/dist-esm/static/serializeHelper.js +27 -0
  144. package/dist-esm/static/serializeHelper.js.map +1 -0
  145. package/dist-esm/test/buildEnvFile.js +24 -0
  146. package/dist-esm/test/buildEnvFile.js.map +1 -0
  147. package/dist-esm/test/buildKarmaConfig.js +14 -0
  148. package/dist-esm/test/buildKarmaConfig.js.map +1 -0
  149. package/dist-esm/test/buildRecordedClient.js +17 -0
  150. package/dist-esm/test/buildRecordedClient.js.map +1 -0
  151. package/dist-esm/test/buildSampleTest.js +14 -0
  152. package/dist-esm/test/buildSampleTest.js.map +1 -0
  153. package/dist-esm/test/template.js +188 -0
  154. package/dist-esm/test/template.js.map +1 -0
  155. package/package.json +46 -0
  156. package/publishPackage.js +11 -0
  157. package/rlc-common.build.log +2 -0
  158. package/src/buildClient.ts +353 -0
  159. package/src/buildClientDefinitions.ts +235 -0
  160. package/src/buildIndexFile.ts +202 -0
  161. package/src/buildIsUnexpectedHelper.ts +240 -0
  162. package/src/buildMethodShortcuts.ts +75 -0
  163. package/src/buildObjectTypes.ts +449 -0
  164. package/src/buildPaginateHelper.ts +33 -0
  165. package/src/buildParameterTypes.ts +477 -0
  166. package/src/buildPollingHelper.ts +18 -0
  167. package/src/buildResponseTypes.ts +186 -0
  168. package/src/buildSchemaType.ts +85 -0
  169. package/src/buildSerializeHelper.ts +42 -0
  170. package/src/buildTopLevelIndexFile.ts +52 -0
  171. package/src/helpers/nameConstructors.ts +93 -0
  172. package/src/helpers/nameUtils.ts +227 -0
  173. package/src/helpers/operationHelpers.ts +119 -0
  174. package/src/helpers/pathUtils.ts +9 -0
  175. package/src/helpers/schemaHelpers.ts +25 -0
  176. package/src/helpers/shortcutMethods.ts +60 -0
  177. package/src/index.ts +29 -0
  178. package/src/interfaces.ts +227 -0
  179. package/src/metadata/buildApiExtractorConfig.ts +59 -0
  180. package/src/metadata/buildESLintConfig.ts +34 -0
  181. package/src/metadata/buildLicenseFile.ts +39 -0
  182. package/src/metadata/buildPackageFile.ts +334 -0
  183. package/src/metadata/buildReadmeFile.ts +231 -0
  184. package/src/metadata/buildRollupConfig.ts +147 -0
  185. package/src/metadata/buildTsConfig.ts +79 -0
  186. package/src/static/paginateContent.ts +210 -0
  187. package/src/static/pollingContent.ts +94 -0
  188. package/src/static/serializeHelper.ts +29 -0
  189. package/src/test/buildEnvFile.ts +26 -0
  190. package/src/test/buildKarmaConfig.ts +15 -0
  191. package/src/test/buildRecordedClient.ts +18 -0
  192. package/src/test/buildSampleTest.ts +15 -0
  193. package/src/test/template.ts +191 -0
  194. package/tsconfig-cjs.json +9 -0
  195. package/tsconfig-common.json +13 -0
  196. package/tsconfig.json +13 -0
  197. package/types/buildClient.d.ts +2 -0
  198. package/types/buildClientDefinitions.d.ts +5 -0
  199. package/types/buildIndexFile.d.ts +5 -0
  200. package/types/buildIsUnexpectedHelper.d.ts +5 -0
  201. package/types/buildMethodShortcuts.d.ts +4 -0
  202. package/types/buildObjectTypes.d.ts +15 -0
  203. package/types/buildPaginateHelper.d.ts +5 -0
  204. package/types/buildParameterTypes.d.ts +13 -0
  205. package/types/buildPollingHelper.d.ts +5 -0
  206. package/types/buildResponseTypes.d.ts +5 -0
  207. package/types/buildSchemaType.d.ts +19 -0
  208. package/types/buildSerializeHelper.d.ts +5 -0
  209. package/types/buildTopLevelIndexFile.d.ts +5 -0
  210. package/types/helpers/nameConstructors.d.ts +28 -0
  211. package/types/helpers/nameUtils.d.ts +25 -0
  212. package/types/helpers/operationHelpers.d.ts +13 -0
  213. package/types/helpers/pathUtils.d.ts +1 -0
  214. package/types/helpers/schemaHelpers.d.ts +4 -0
  215. package/types/helpers/shortcutMethods.d.ts +3 -0
  216. package/types/index.d.ts +26 -0
  217. package/types/interfaces.d.ts +200 -0
  218. package/types/metadata/buildApiExtractorConfig.d.ts +5 -0
  219. package/types/metadata/buildESLintConfig.d.ts +5 -0
  220. package/types/metadata/buildLicenseFile.d.ts +5 -0
  221. package/types/metadata/buildPackageFile.d.ts +5 -0
  222. package/types/metadata/buildReadmeFile.d.ts +5 -0
  223. package/types/metadata/buildRollupConfig.d.ts +5 -0
  224. package/types/metadata/buildTsConfig.d.ts +5 -0
  225. package/types/static/paginateContent.d.ts +1 -0
  226. package/types/static/pollingContent.d.ts +1 -0
  227. package/types/static/serializeHelper.d.ts +4 -0
  228. package/types/test/buildEnvFile.d.ts +9 -0
  229. package/types/test/buildKarmaConfig.d.ts +5 -0
  230. package/types/test/buildRecordedClient.d.ts +5 -0
  231. package/types/test/buildSampleTest.d.ts +5 -0
  232. package/types/test/template.d.ts +5 -0
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sampleTestContent = exports.recordedClientContent = exports.karmaConfig = exports.envBrowserContent = exports.envContent = void 0;
4
+ exports.envContent = `
5
+ import * as dotenv from "dotenv";
6
+
7
+ dotenv.config();
8
+ `;
9
+ exports.envBrowserContent = `
10
+ import * as dotenv from "dotenv";
11
+
12
+ dotenv.config();
13
+ `;
14
+ exports.karmaConfig = `
15
+ // https://github.com/karma-runner/karma-chrome-launcher
16
+ process.env.CHROME_BIN = require("puppeteer").executablePath();
17
+ require("dotenv").config();
18
+ const { relativeRecordingsPath } = require("@azure-tools/test-recorder");
19
+ process.env.RECORDINGS_RELATIVE_PATH = relativeRecordingsPath();
20
+
21
+ module.exports = function (config) {
22
+ config.set({
23
+ // base path that will be used to resolve all patterns (eg. files, exclude)
24
+ basePath: "./",
25
+
26
+ // frameworks to use
27
+ // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
28
+ frameworks: ["source-map-support", "mocha"],
29
+
30
+ plugins: [
31
+ "karma-mocha",
32
+ "karma-mocha-reporter",
33
+ "karma-chrome-launcher",
34
+ "karma-firefox-launcher",
35
+ "karma-env-preprocessor",
36
+ "karma-coverage",
37
+ "karma-sourcemap-loader",
38
+ "karma-junit-reporter",
39
+ "karma-source-map-support",
40
+ ],
41
+
42
+ // list of files / patterns to load in the browser
43
+ files: [
44
+ "dist-test/index.browser.js",
45
+ { pattern: "dist-test/index.browser.js.map", type: "html", included: false, served: true },
46
+ ],
47
+
48
+ // list of files / patterns to exclude
49
+ exclude: [],
50
+
51
+ // preprocess matching files before serving them to the browser
52
+ // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
53
+ preprocessors: {
54
+ "**/*.js": ["sourcemap", "env"],
55
+ // IMPORTANT: COMMENT following line if you want to debug in your browsers!!
56
+ // Preprocess source file to calculate code coverage, however this will make source file unreadable
57
+ // "dist-test/index.js": ["coverage"]
58
+ },
59
+
60
+ envPreprocessor: [
61
+ "TEST_MODE",
62
+ "ENDPOINT",
63
+ "AZURE_CLIENT_SECRET",
64
+ "AZURE_CLIENT_ID",
65
+ "AZURE_TENANT_ID",
66
+ "SUBSCRIPTION_ID",
67
+ "RECORDINGS_RELATIVE_PATH",
68
+ ],
69
+
70
+ // test results reporter to use
71
+ // possible values: 'dots', 'progress'
72
+ // available reporters: https://npmjs.org/browse/keyword/karma-reporter
73
+ reporters: ["mocha", "coverage", "junit"],
74
+
75
+ coverageReporter: {
76
+ // specify a common output directory
77
+ dir: "coverage-browser/",
78
+ reporters: [
79
+ { type: "json", subdir: ".", file: "coverage.json" },
80
+ { type: "lcovonly", subdir: ".", file: "lcov.info" },
81
+ { type: "html", subdir: "html" },
82
+ { type: "cobertura", subdir: ".", file: "cobertura-coverage.xml" },
83
+ ],
84
+ },
85
+
86
+ junitReporter: {
87
+ outputDir: "", // results will be saved as $outputDir/$browserName.xml
88
+ outputFile: "test-results.browser.xml", // if included, results will be saved as $outputDir/$browserName/$outputFile
89
+ suite: "", // suite will become the package name attribute in xml testsuite element
90
+ useBrowserName: false, // add browser name to report and classes names
91
+ nameFormatter: undefined, // function (browser, result) to customize the name attribute in xml testcase element
92
+ classNameFormatter: undefined, // function (browser, result) to customize the classname attribute in xml testcase element
93
+ properties: {}, // key value pair of properties to add to the <properties> section of the report
94
+ },
95
+
96
+ // web server port
97
+ port: 9876,
98
+
99
+ // enable / disable colors in the output (reporters and logs)
100
+ colors: true,
101
+
102
+ // level of logging
103
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
104
+ logLevel: config.LOG_INFO,
105
+
106
+ // enable / disable watching file and executing tests whenever any file changes
107
+ autoWatch: false,
108
+
109
+ // --no-sandbox allows our tests to run in Linux without having to change the system.
110
+ // --disable-web-security allows us to authenticate from the browser without having to write tests using interactive auth, which would be far more complex.
111
+ browsers: ["ChromeHeadlessNoSandbox"],
112
+ customLaunchers: {
113
+ ChromeHeadlessNoSandbox: {
114
+ base: "ChromeHeadless",
115
+ flags: ["--no-sandbox", "--disable-web-security"],
116
+ },
117
+ },
118
+
119
+ // Continuous Integration mode
120
+ // if true, Karma captures browsers, runs the tests and exits
121
+ singleRun: false,
122
+
123
+ // Concurrency level
124
+ // how many browser should be started simultaneous
125
+ concurrency: 1,
126
+
127
+ browserNoActivityTimeout: 60000000,
128
+ browserDisconnectTimeout: 10000,
129
+ browserDisconnectTolerance: 3,
130
+
131
+ client: {
132
+ mocha: {
133
+ // change Karma's debug.html to the mocha web reporter
134
+ reporter: "html",
135
+ timeout: "600000",
136
+ },
137
+ },
138
+ });
139
+ };
140
+ `;
141
+ exports.recordedClientContent = `
142
+ import { Context } from "mocha";
143
+ import { Recorder, RecorderStartOptions } from "@azure-tools/test-recorder";
144
+ import "./env";
145
+
146
+ const envSetupForPlayback: Record<string, string> = {
147
+ ENDPOINT: "https://endpoint",
148
+ AZURE_CLIENT_ID: "azure_client_id",
149
+ AZURE_CLIENT_SECRET: "azure_client_secret",
150
+ AZURE_TENANT_ID: "88888888-8888-8888-8888-888888888888",
151
+ SUBSCRIPTION_ID: "azure_subscription_id"
152
+ };
153
+
154
+ const recorderEnvSetup: RecorderStartOptions = {
155
+ envSetupForPlayback
156
+ };
157
+
158
+ /**
159
+ * creates the recorder and reads the environment variables from the \`.env\` file.
160
+ * Should be called first in the test suite to make sure environment variables are
161
+ * read before they are being used.
162
+ */
163
+ export async function createRecorder(context: Context): Promise<Recorder> {
164
+ const recorder = new Recorder(context.currentTest);
165
+ await recorder.start(recorderEnvSetup);
166
+ return recorder;
167
+ }
168
+ `;
169
+ exports.sampleTestContent = `
170
+ import { Recorder } from "@azure-tools/test-recorder";
171
+ import { assert } from "chai";
172
+ import { createRecorder } from "./utils/recordedClient";
173
+ import { Context } from "mocha";
174
+
175
+ describe("My test", () => {
176
+ let recorder: Recorder;
177
+
178
+ beforeEach(async function(this: Context) {
179
+ recorder = await createRecorder(this);
180
+ });
181
+
182
+ afterEach(async function() {
183
+ await recorder.stop();
184
+ });
185
+
186
+ it("sample test", async function() {
187
+ assert.equal(1, 1);
188
+ });
189
+ });
190
+ `;
191
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/test/template.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG;;;;CAIzB,CAAC;AAEW,QAAA,iBAAiB,GAAG;;;;CAIhC,CAAC;AAEW,QAAA,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8H1B,CAAC;AAEW,QAAA,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BpC,CAAC;AAEW,QAAA,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBhC,CAAC"}
@@ -0,0 +1,261 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { Project, StructureKind, VariableDeclarationKind } from "ts-morph";
4
+ import * as path from "path";
5
+ import { NameType, normalizeName } from "./helpers/nameUtils.js";
6
+ import { isConstantSchema } from "./helpers/schemaHelpers.js";
7
+ import { buildMethodShortcutImplementation } from "./buildMethodShortcuts.js";
8
+ function getClientOptionsInterface(clientName, optionalUrlParameters) {
9
+ if (!optionalUrlParameters || optionalUrlParameters.length === 0) {
10
+ return undefined;
11
+ }
12
+ const properties = optionalUrlParameters.map((param) => {
13
+ return {
14
+ name: param.name,
15
+ type: param.type,
16
+ hasQuestionToken: true
17
+ };
18
+ });
19
+ return {
20
+ name: `${clientName}Options`,
21
+ extends: ["ClientOptions"],
22
+ isExported: true,
23
+ properties
24
+ };
25
+ }
26
+ export function buildClient(model) {
27
+ const name = normalizeName(model.libraryName, NameType.File);
28
+ const { srcPath } = model;
29
+ const project = new Project();
30
+ const filePath = path.join(srcPath, `${name}.ts`);
31
+ const clientFile = project.createSourceFile(filePath, undefined, {
32
+ overwrite: true
33
+ });
34
+ // Get all paths
35
+ const clientName = model.libraryName;
36
+ const clientInterfaceName = clientName.endsWith("Client")
37
+ ? `${clientName}`
38
+ : `${clientName}Client`;
39
+ normalizeUrlInfo(model);
40
+ const urlParameters = model?.urlInfo?.urlParameters?.filter(
41
+ // Do not include parameters with constant values in the signature, these should go in the options bag
42
+ (p) => p.value === undefined);
43
+ const optionalUrlParameters = model?.urlInfo?.urlParameters?.filter(
44
+ // Do not include parameters with constant values in the signature, these should go in the options bag
45
+ (p) => Boolean(p.value));
46
+ const clientOptionsInterface = getClientOptionsInterface(clientInterfaceName, optionalUrlParameters);
47
+ if (clientOptionsInterface) {
48
+ clientFile.addInterface(clientOptionsInterface);
49
+ }
50
+ if (!model.options) {
51
+ return undefined;
52
+ }
53
+ const { multiClient, batch } = model.options;
54
+ const { addCredentials, credentialScopes, credentialKeyHeaderName } = model.options;
55
+ const credentialTypes = credentialScopes && credentialScopes.length > 0 ? ["TokenCredential"] : [];
56
+ if (credentialKeyHeaderName) {
57
+ credentialTypes.push("KeyCredential");
58
+ }
59
+ const commonClientParams = [
60
+ ...(urlParameters ?? []),
61
+ ...(addCredentials === false ||
62
+ !isSecurityInfoDefined(credentialScopes, credentialKeyHeaderName)
63
+ ? []
64
+ : [
65
+ {
66
+ name: "credentials",
67
+ type: credentialTypes.join(" | "),
68
+ description: `uniquely identify client credential`
69
+ }
70
+ ])
71
+ ];
72
+ const allClientParams = [
73
+ ...commonClientParams,
74
+ {
75
+ name: "options",
76
+ type: `${clientOptionsInterface?.name ?? "ClientOptions"} = {}`,
77
+ description: "the parameter for all optional parameters"
78
+ }
79
+ ];
80
+ const functionStatement = {
81
+ isExported: true,
82
+ name: `createClient`,
83
+ parameters: allClientParams,
84
+ docs: [
85
+ {
86
+ description: `Initialize a new instance of \`${clientInterfaceName}\` \n` +
87
+ allClientParams
88
+ .map((param) => {
89
+ return `@param ${param.name} type: ${param.type
90
+ .split("=")[0]
91
+ .split(" ")
92
+ .join("")}, ${param.description ?? "The parameter " + param.name}`;
93
+ })
94
+ .join("\n")
95
+ }
96
+ ],
97
+ returnType: clientInterfaceName,
98
+ isDefaultExport: false,
99
+ statements: getClientFactoryBody(model, clientInterfaceName)
100
+ };
101
+ if (!multiClient || !batch || batch.length === 1) {
102
+ functionStatement.isDefaultExport = true;
103
+ }
104
+ clientFile.addFunction(functionStatement);
105
+ clientFile.addImportDeclarations([
106
+ {
107
+ namedImports: ["getClient", "ClientOptions"],
108
+ moduleSpecifier: "@azure-rest/core-client"
109
+ }
110
+ ]);
111
+ if (addCredentials &&
112
+ isSecurityInfoDefined(credentialScopes, credentialKeyHeaderName)) {
113
+ clientFile.addImportDeclarations([
114
+ {
115
+ namedImports: credentialTypes,
116
+ moduleSpecifier: "@azure/core-auth"
117
+ }
118
+ ]);
119
+ }
120
+ clientFile.addImportDeclarations([
121
+ {
122
+ namedImports: [`${clientInterfaceName}`],
123
+ moduleSpecifier: "./clientDefinitions"
124
+ }
125
+ ]);
126
+ return { path: filePath, content: clientFile.getFullText() };
127
+ }
128
+ function isSecurityInfoDefined(credentialScopes, credentialKeyHeaderName) {
129
+ return ((credentialScopes && credentialScopes.length > 0) || credentialKeyHeaderName);
130
+ }
131
+ function getClientFactoryBody(model, clientTypeName) {
132
+ if (!model.options || !model.options.packageDetails || !model.urlInfo) {
133
+ return "";
134
+ }
135
+ const { includeShortcuts, packageDetails } = model.options;
136
+ let clientPackageName = packageDetails.nameWithoutScope ?? "";
137
+ const packageVersion = packageDetails.version;
138
+ const { endpoint, urlParameters } = model.urlInfo;
139
+ const optionalUrlParameters = [];
140
+ for (const param of urlParameters ?? []) {
141
+ if (param.value) {
142
+ const value = typeof param.value === "string" ? `"${param.value}"` : param.value;
143
+ optionalUrlParameters.push(`const ${param.name} = options.${param.name} ?? ${value}`);
144
+ }
145
+ }
146
+ let baseUrl;
147
+ if (urlParameters && endpoint) {
148
+ let parsedEndpoint = endpoint;
149
+ urlParameters.forEach((urlParameter) => {
150
+ parsedEndpoint = parsedEndpoint.replace(`{${urlParameter.name}}`, `\${${urlParameter.name}}`);
151
+ });
152
+ baseUrl = `options.baseUrl ?? \`${parsedEndpoint}\``;
153
+ }
154
+ else {
155
+ baseUrl = `options.baseUrl ?? "${endpoint}"`;
156
+ }
157
+ const apiVersion = getApiVersionInQueryParam(model);
158
+ let apiVersionStatement = "";
159
+ if (apiVersion) {
160
+ apiVersionStatement = `options.apiVersion = options.apiVersion ?? "${apiVersion}"`;
161
+ }
162
+ if (!clientPackageName.endsWith("-rest")) {
163
+ clientPackageName = clientPackageName + "-rest";
164
+ }
165
+ const userAgentInfoStatement = "const userAgentInfo = `azsdk-js-" +
166
+ clientPackageName +
167
+ "/" +
168
+ packageVersion +
169
+ "`;";
170
+ const userAgentPrefix = "options.userAgentOptions && options.userAgentOptions.userAgentPrefix ? `${options.userAgentOptions.userAgentPrefix} ${userAgentInfo}`: `${userAgentInfo}`;";
171
+ const userAgentStatement = {
172
+ kind: StructureKind.VariableStatement,
173
+ declarationKind: VariableDeclarationKind.Const,
174
+ declarations: [{ name: "userAgentPrefix", initializer: userAgentPrefix }]
175
+ };
176
+ const userAgentOptionsStatement = `options = {
177
+ ...options,
178
+ userAgentOptions: {
179
+ userAgentPrefix
180
+ }
181
+ }`;
182
+ const baseUrlStatement = {
183
+ kind: StructureKind.VariableStatement,
184
+ declarationKind: VariableDeclarationKind.Const,
185
+ declarations: [{ name: "baseUrl", initializer: baseUrl }]
186
+ };
187
+ const { credentialScopes, credentialKeyHeaderName } = model.options;
188
+ const scopesString = credentialScopes && credentialScopes.length
189
+ ? credentialScopes.map((cs) => `"${cs}"`).join(", ")
190
+ : "";
191
+ const scopes = scopesString ? `scopes: [${scopesString}],` : "";
192
+ const apiKeyHeaderName = credentialKeyHeaderName
193
+ ? `apiKeyHeaderName: "${credentialKeyHeaderName}",`
194
+ : "";
195
+ const credentials = scopes || apiKeyHeaderName
196
+ ? `options = {
197
+ ...options,
198
+ credentials: {
199
+ ${scopes}
200
+ ${apiKeyHeaderName}
201
+ },
202
+ }`
203
+ : "";
204
+ const getClient = `const client = getClient(
205
+ baseUrl, ${credentials ? "credentials," : ""} options
206
+ ) as ${clientTypeName};
207
+ `;
208
+ let returnStatement = `return client;`;
209
+ if (includeShortcuts) {
210
+ const shortcutImplementations = buildMethodShortcutImplementation(model.paths);
211
+ const shortcutBody = Object.keys(shortcutImplementations).map((key) => {
212
+ // If the operation group has an empty name, it means its operations are client
213
+ // level operations so we need to spread the definitions. Otherwise they are
214
+ // within an operation group so we add them as key: value
215
+ return `${key && key !== "client" ? `"${key}":` : "..."} {${shortcutImplementations[key].join()}}`;
216
+ });
217
+ returnStatement = `return { ...client, ${shortcutBody.join()} };`;
218
+ }
219
+ return [
220
+ ...optionalUrlParameters,
221
+ baseUrlStatement,
222
+ apiVersionStatement,
223
+ credentials,
224
+ userAgentInfoStatement,
225
+ userAgentStatement,
226
+ userAgentOptionsStatement,
227
+ getClient,
228
+ returnStatement
229
+ ];
230
+ }
231
+ function getApiVersionInQueryParam(model) {
232
+ if (!model.apiVersionInQueryParam) {
233
+ return undefined;
234
+ }
235
+ if (model.apiVersionInQueryParam &&
236
+ isConstantSchema(model.apiVersionInQueryParam)) {
237
+ return model.apiVersionInQueryParam.default;
238
+ }
239
+ return undefined;
240
+ }
241
+ function normalizeUrlInfo(model) {
242
+ if (!model ||
243
+ !model.urlInfo ||
244
+ !model.urlInfo.endpoint ||
245
+ !model.urlInfo.urlParameters ||
246
+ model.urlInfo.urlParameters.length === 0) {
247
+ return;
248
+ }
249
+ let parsedEndpoint = model.urlInfo.endpoint;
250
+ const urlParameters = model.urlInfo.urlParameters;
251
+ urlParameters.forEach((urlParameter) => {
252
+ const name = urlParameter.name;
253
+ const normalizedName = normalizeName(name, NameType.Parameter);
254
+ if (name !== normalizedName) {
255
+ urlParameter.name = normalizedName;
256
+ parsedEndpoint = parsedEndpoint.replace(`{${name}}`, `{${normalizedName}}`);
257
+ }
258
+ });
259
+ model.urlInfo.endpoint = parsedEndpoint;
260
+ }
261
+ //# sourceMappingURL=buildClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildClient.js","sourceRoot":"","sources":["../src/buildClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { Project, StructureKind, Writers } from "ts-morph";
4
+ import * as path from "path";
5
+ import { buildMethodDefinitions, getPathParamDefinitions } from "./helpers/operationHelpers.js";
6
+ import { generateMethodShortcuts } from "./helpers/shortcutMethods.js";
7
+ import { REST_CLIENT_RESERVED } from "./buildMethodShortcuts.js";
8
+ import { CasingConvention, NameType, normalizeName } from "./helpers/nameUtils.js";
9
+ import { pascalCase } from "./helpers/nameUtils.js";
10
+ export function buildClientDefinitions(model) {
11
+ const options = {
12
+ importedParameters: new Set(),
13
+ importedResponses: new Set(),
14
+ clientImports: new Set()
15
+ };
16
+ const project = new Project();
17
+ const srcPath = model.srcPath;
18
+ const filePath = path.join(srcPath, `clientDefinitions.ts`);
19
+ const clientDefinitionsFile = project.createSourceFile(filePath, undefined, {
20
+ overwrite: true
21
+ });
22
+ // Get all paths
23
+ const pathDictionary = model.paths;
24
+ let shortcuts = [];
25
+ // There may be operations without an operation group, those shortcut
26
+ // methods need to be handled differently.
27
+ let shortcutsInOperationGroup = [];
28
+ if (model.options?.includeShortcuts) {
29
+ shortcuts = generateMethodShortcuts(model.paths);
30
+ clientDefinitionsFile.addInterfaces(shortcuts);
31
+ shortcutsInOperationGroup = shortcuts
32
+ .filter((s) => s.name !== "ClientOperations")
33
+ .map((s) => getShortcutName(s.name));
34
+ }
35
+ clientDefinitionsFile.addInterface({
36
+ name: "Routes",
37
+ isExported: true,
38
+ callSignatures: getPathFirstRoutesInterfaceDefinition(pathDictionary, clientDefinitionsFile, options)
39
+ });
40
+ const clientName = model.libraryName;
41
+ const clientInterfaceName = clientName.endsWith("Client")
42
+ ? `${clientName}`
43
+ : `${clientName}Client`;
44
+ clientDefinitionsFile.addTypeAlias({
45
+ isExported: true,
46
+ name: clientInterfaceName,
47
+ type: Writers.intersectionType("Client", Writers.objectType({
48
+ properties: [
49
+ { name: "path", type: "Routes" },
50
+ ...shortcutsInOperationGroup
51
+ ]
52
+ }),
53
+ // If the length of shortcuts in operation group and all shortcutsInOperationGroup
54
+ // is the same, then we don't have any operations at the client level
55
+ // Otherwise we need to make the client interface name an union with the
56
+ // definition of all client level shortcut methods
57
+ ...(shortcutsInOperationGroup.length !== shortcuts.length
58
+ ? [`ClientOperations`]
59
+ : []))
60
+ });
61
+ if (options.importedParameters.size) {
62
+ clientDefinitionsFile.addImportDeclaration({
63
+ namedImports: [...options.importedParameters],
64
+ moduleSpecifier: "./parameters"
65
+ });
66
+ }
67
+ if (options.importedResponses.size) {
68
+ clientDefinitionsFile.addImportDeclaration({
69
+ namedImports: [...options.importedResponses],
70
+ moduleSpecifier: "./responses"
71
+ });
72
+ }
73
+ options.clientImports.add("Client");
74
+ options.clientImports.add("StreamableMethod");
75
+ clientDefinitionsFile.addImportDeclarations([
76
+ {
77
+ namedImports: [...options.clientImports],
78
+ moduleSpecifier: "@azure-rest/core-client"
79
+ }
80
+ ]);
81
+ return { path: filePath, content: clientDefinitionsFile.getFullText() };
82
+ }
83
+ function getPathFirstRoutesInterfaceDefinition(paths, sourcefile, options) {
84
+ const operationGroupCount = getOperationGroupCount(paths);
85
+ const signatures = [];
86
+ for (const key of Object.keys(paths)) {
87
+ for (const verb of Object.keys(paths[key].methods)) {
88
+ for (const method of paths[key].methods[verb]) {
89
+ options.importedParameters.add(method.optionsName);
90
+ method.returnType
91
+ .split(" | ")
92
+ .forEach((item) => options.importedResponses.add(item));
93
+ }
94
+ }
95
+ generatePathFirstRouteMethodsDefinition(paths[key], operationGroupCount, sourcefile);
96
+ const pathParams = paths[key].pathParameters;
97
+ signatures.push({
98
+ docs: [
99
+ `Resource for '${key
100
+ .replace(/}/g, "\\}")
101
+ .replace(/{/g, "\\{")}' has methods for the following verbs: ${Object.keys(paths[key].methods).join(", ")}`
102
+ ],
103
+ parameters: [
104
+ { name: "path", type: `"${key}"` },
105
+ ...getPathParamDefinitions(pathParams)
106
+ ],
107
+ returnType: getOperationReturnTypeName(paths[key], getOperationGroupCount(paths)),
108
+ kind: StructureKind.CallSignature
109
+ });
110
+ }
111
+ return signatures;
112
+ }
113
+ function getOperationGroupCount(paths) {
114
+ const operationGroups = Object.keys(paths)
115
+ .map((p) => paths[p].operationGroupName)
116
+ .filter((p) => p && p !== "Client");
117
+ const uniqueNames = new Set(operationGroups);
118
+ return uniqueNames.size;
119
+ }
120
+ function getOperationReturnTypeName({ operationGroupName, name }, operationGroupCount) {
121
+ if (operationGroupCount > 1 &&
122
+ operationGroupName &&
123
+ operationGroupName !== "Client") {
124
+ return `${pascalCase(operationGroupName)}${pascalCase(name)}`;
125
+ }
126
+ return pascalCase(name);
127
+ }
128
+ function generatePathFirstRouteMethodsDefinition(path, operationGroupCount, file) {
129
+ const methodDefinitions = buildMethodDefinitions(path.methods);
130
+ const interfaceDef = {
131
+ methods: methodDefinitions,
132
+ name: getOperationReturnTypeName(path, operationGroupCount),
133
+ isExported: true
134
+ };
135
+ file.addInterface(interfaceDef);
136
+ }
137
+ function getShortcutName(interfaceName) {
138
+ const endIndex = shouldKeepSuffix(interfaceName)
139
+ ? undefined
140
+ : interfaceName.length - "Operations".length;
141
+ const clientProperty = normalizeName(interfaceName.substring(0, endIndex), NameType.OperationGroup, true, REST_CLIENT_RESERVED, CasingConvention.Camel);
142
+ return {
143
+ name: clientProperty,
144
+ type: interfaceName
145
+ };
146
+ }
147
+ function shouldKeepSuffix(name) {
148
+ const reservedNames = [
149
+ "pipelineOperations",
150
+ "pathOperations",
151
+ "pathUncheckedOperations"
152
+ ];
153
+ return reservedNames.some((r) => r.toLowerCase() === name.toLowerCase());
154
+ }
155
+ //# sourceMappingURL=buildClientDefinitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildClientDefinitions.js","sourceRoot":"","sources":["../src/buildClientDefinitions.ts"],"names":[],"mappings":"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"}