From a8478c58044565721ed805a4dbbd08eaafca2133 Mon Sep 17 00:00:00 2001 From: Ali Asghar <75574550+aliasghar98@users.noreply.github.com> Date: Tue, 12 May 2026 15:53:22 +0500 Subject: [PATCH 1/5] feat: add support for generation of v2 sdks --- package-lock.json | 4 +- src/actions/sdk/generate.ts | 88 +++++++++++++++---- src/actions/sdk/publish.ts | 5 +- src/actions/sdk/quickstart.ts | 13 ++- src/commands/sdk/generate.ts | 27 +++++- src/infrastructure/services/api-service.ts | 37 +++++++- src/infrastructure/services/portal-service.ts | 85 ++++++++++++++++++ src/prompts/sdk/generate.ts | 14 +++ src/types/sdk/generate.ts | 5 ++ 9 files changed, 251 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index eda3f4d2..44105243 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@apimatic/cli", - "version": "1.1.0-beta.14", + "version": "1.1.0-beta.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@apimatic/cli", - "version": "1.1.0-beta.14", + "version": "1.1.0-beta.15", "license": "MIT", "dependencies": { "@apimatic/sdk": "0.2.0-alpha.9", diff --git a/src/actions/sdk/generate.ts b/src/actions/sdk/generate.ts index b163ec18..6e6d3ade 100644 --- a/src/actions/sdk/generate.ts +++ b/src/actions/sdk/generate.ts @@ -1,15 +1,16 @@ -import { PortalService } from "../../infrastructure/services/portal-service.js"; -import { DirectoryPath } from "../../types/file/directoryPath.js"; -import { ActionResult } from "../action-result.js"; -import { withDirPath } from "../../infrastructure/tmp-extensions.js"; -import { SdkContext } from "../../types/sdk-context.js"; -import { SdkGeneratePrompts } from "../../prompts/sdk/generate.js"; -import { CommandMetadata } from "../../types/common/command-metadata.js"; -import { TempContext } from "../../types/temp-context.js"; -import { Language } from "../../types/sdk/generate.js"; -import { MergeSourceTreeAction } from "./merge-source-tree.js"; -import { BuildContext } from "../../types/build-context.js"; -import { SemVersion } from "../../types/publish/version.js"; +import { PortalService } from '../../infrastructure/services/portal-service.js'; +import { DirectoryPath } from '../../types/file/directoryPath.js'; +import { ActionResult } from '../action-result.js'; +import { withDirPath } from '../../infrastructure/tmp-extensions.js'; +import { SdkContext } from '../../types/sdk-context.js'; +import { SdkGeneratePrompts } from '../../prompts/sdk/generate.js'; +import { CommandMetadata } from '../../types/common/command-metadata.js'; +import { TempContext } from '../../types/temp-context.js'; +import { CodeGenerationVersion, Language } from '../../types/sdk/generate.js'; +import { MergeSourceTreeAction } from './merge-source-tree.js'; +import { BuildContext } from '../../types/build-context.js'; +import { SemVersion } from '../../types/publish/version.js'; +import { StabilityLevelTag } from '@apimatic/sdk'; export class GenerateAction { private readonly prompts: SdkGeneratePrompts = new SdkGeneratePrompts(); @@ -32,15 +33,28 @@ export class GenerateAction { zipSdk: boolean, skipChanges: boolean, trackChanges: boolean, + codeGenVersion: CodeGenerationVersion, + stability: StabilityLevelTag | undefined, apiVersion?: string, packageVersion?: SemVersion, packageSettingsDirectory?: DirectoryPath - ): Promise> => { + ): Promise> => { if (buildDirectory.isEqual(destinationSdkDirectory)) { this.prompts.sameBuildAndSdkDir(buildDirectory); return ActionResult.failed(); } + if (codeGenVersion === CodeGenerationVersion.V4) { + if (language !== Language.CSHARP) { + this.prompts.v4LanguageNotSupported(language); + return ActionResult.failed(); + } + if (stability !== undefined && stability !== StabilityLevelTag.Beta) { + this.prompts.v4OnlyBetaSupported(language, stability, codeGenVersion); + return ActionResult.failed(); + } + } + const rootBuildContext = new BuildContext(buildDirectory); if (!(await rootBuildContext.exists())) { this.prompts.srcDirectoryEmpty(buildDirectory); @@ -48,7 +62,7 @@ export class GenerateAction { } const versionedContextGetter = async () => { - if (!await rootBuildContext.isVersionedBuild()) { + if (!(await rootBuildContext.isVersionedBuild())) { if (apiVersion) this.prompts.apiVersionOnlyApplicableWithVersionedBuild(); return { version: undefined, buildContext: rootBuildContext }; } @@ -95,7 +109,7 @@ export class GenerateAction { const hasSdkSourceTree = await buildContext.hasSdkSourceTree(language); const sdkContext = new SdkContext(language, destinationSdkDirectory, skipChanges && hasSdkSourceTree, version); - if (!force && await sdkContext.exists() && !(await this.prompts.overwriteSdk(destinationSdkDirectory))) { + if (!force && (await sdkContext.exists()) && !(await this.prompts.overwriteSdk(destinationSdkDirectory))) { this.prompts.destinationDirNotEmpty(); return ActionResult.cancelled(); } @@ -104,8 +118,38 @@ export class GenerateAction { const tempContext = new TempContext(tempDirectory); const buildZipPath = await buildContext.getBuildZipPath(tempDirectory, packageSettingsDirectory); + if (codeGenVersion === CodeGenerationVersion.V4) { + const response = await this.prompts.generateV2SDK( + this.portalService.generateV2Sdk( + buildZipPath, + language, + stability ?? StabilityLevelTag.Beta, + this.configDir, + this.commandMetadata, + this.authKey + ) + ); + + if (response.isErr()) { + this.prompts.sdkGenerationServiceError(response.error); + return ActionResult.failed(); + } + + const responseSdkZipPath = await tempContext.save(response.value); + const tempSdk = await sdkContext.loadSdkInTempDirectory(tempDirectory, responseSdkZipPath); + this.prompts.sdkGenerated(await sdkContext.save(tempSdk, zipSdk)); + return ActionResult.success(); + } + const response = await this.prompts.generateSDK( - this.portalService.generateSdk(buildZipPath, language, this.configDir, this.commandMetadata, this.authKey, packageVersion) + this.portalService.generateSdk( + buildZipPath, + language, + this.configDir, + this.commandMetadata, + this.authKey, + packageVersion + ) ); if (response.isErr()) { @@ -132,8 +176,16 @@ export class GenerateAction { const mergeSourceTree = new MergeSourceTreeAction(); return await mergeSourceTree.execute( - tempSdkWithSourceTree, tempSdk, destinationSourceTreePath, trackChanges, skipChanges, hasSdkSourceTree, - language, destinationSdkDirectory, version, zipSdk + tempSdkWithSourceTree, + tempSdk, + destinationSourceTreePath, + trackChanges, + skipChanges, + hasSdkSourceTree, + language, + destinationSdkDirectory, + version, + zipSdk ); }); }; diff --git a/src/actions/sdk/publish.ts b/src/actions/sdk/publish.ts index d62c3e68..87e17a58 100644 --- a/src/actions/sdk/publish.ts +++ b/src/actions/sdk/publish.ts @@ -8,7 +8,7 @@ import { PublishType } from '../../types/publish-api/publishing-profile-item.js' import { PublishingInfo } from '../../types/publish-api/publishing-info.js'; import { ProfileId } from '../../types/publish/profile-id.js'; import { SemVersion } from '../../types/publish/version.js'; -import { Language } from '../../types/sdk/generate.js'; +import { CodeGenerationVersion, Language } from '../../types/sdk/generate.js'; import { PublishingProfile } from '../../types/publish/publishing-profile.js'; import { PackageSettingsConfiguration } from '../../types/publish/package-settings-configuration.js'; import { PackageSettingsContext } from '../../types/package-settings-context.js'; @@ -17,6 +17,7 @@ import { ActionResult } from '../action-result.js'; import { GenerateAction } from './generate.js'; import { FileName } from '../../types/file/fileName.js'; import { FilePath } from '../../types/file/filePath.js'; +import { StabilityLevelTag } from '@apimatic/sdk'; export class SdkPublishAction { private readonly prompts: SdkPublishPrompts = new SdkPublishPrompts(); @@ -57,6 +58,8 @@ export class SdkPublishAction { false, false, false, + CodeGenerationVersion.V3, + StabilityLevelTag.Stable, undefined, semVersion, packageSettingsDirectory diff --git a/src/actions/sdk/quickstart.ts b/src/actions/sdk/quickstart.ts index d02ef1e6..ac0c4ce5 100644 --- a/src/actions/sdk/quickstart.ts +++ b/src/actions/sdk/quickstart.ts @@ -12,11 +12,12 @@ import { ValidateAction } from '../api/validate.js'; import { FileDownloadService } from '../../infrastructure/services/file-download-service.js'; import { FileService } from '../../infrastructure/file-service.js'; import { GenerateAction } from './generate.js'; -import { Language } from '../../types/sdk/generate.js'; +import { CodeGenerationVersion, Language } from '../../types/sdk/generate.js'; import { LauncherService } from '../../infrastructure/launcher-service.js'; import { ZipService } from '../../infrastructure/zip-service.js'; import { FileName } from '../../types/file/fileName.js'; import { FeaturesToRemove, ValidationService } from '../../infrastructure/services/validation-service.js'; +import { StabilityLevelTag } from '@apimatic/sdk'; export class SdkQuickstartAction { private readonly prompts = new SdkQuickstartPrompts(); @@ -179,7 +180,15 @@ export class SdkQuickstartAction { const sdkDirectory = inputDirectory.join('sdk'); const sdkGenerateAction = new GenerateAction(this.configDir, this.commandMetadata); - const result = await sdkGenerateAction.execute(sourceDirectory, sdkDirectory, language as Language, true, false, false, false); + const result = await sdkGenerateAction.execute(sourceDirectory, + sdkDirectory, + language as Language, + true, + false, + false, + false, + CodeGenerationVersion.V3, + StabilityLevelTag.Stable); if (result.isFailed()) { return ActionResult.failed(); } diff --git a/src/commands/sdk/generate.ts b/src/commands/sdk/generate.ts index ff16e738..72be1426 100644 --- a/src/commands/sdk/generate.ts +++ b/src/commands/sdk/generate.ts @@ -2,12 +2,13 @@ import { Command, Flags } from "@oclif/core"; import { DirectoryPath } from "../../types/file/directoryPath.js"; import { FlagsProvider } from "../../types/flags-provider.js"; import { GenerateAction } from "../../actions/sdk/generate.js"; -import { Language } from "../../types/sdk/generate.js"; +import { CodeGenerationVersion, Language } from "../../types/sdk/generate.js"; import { CommandMetadata } from "../../types/common/command-metadata.js"; import { format, intro, outro } from "../../prompts/format.js"; import { SdkChangesTrackedEvent } from "../../types/events/sdk-changes-tracked.js"; import { TelemetryService } from "../../infrastructure/services/telemetry-service.js"; import { SdkConflictsResolvedEvent } from "../../types/events/sdk-conflicts-resolved.js"; +import { StabilityLevelTag } from "@apimatic/sdk"; export default class SdkGenerate extends Command { static readonly summary = "Generate an SDK for your API"; @@ -43,6 +44,15 @@ Supports multiple programming languages including Java, C#, Python, JavaScript, default: false, description: "Enable change tracking for SDK generation (only required for initial setup)" }), + "codegen-version": Flags.string({ + description: "Version of the code generation engine to use", + options: Object.values(CodeGenerationVersion).map((v) => v.valueOf()), + default: CodeGenerationVersion.V3 + }), + "stability": Flags.string({ + description: "Stability level of the generated SDK", + options: Object.values(StabilityLevelTag).map((s) => s.valueOf()), + }), ...FlagsProvider.input, ...FlagsProvider.force, ...FlagsProvider.authKey, @@ -58,7 +68,18 @@ Supports multiple programming languages including Java, C#, Python, JavaScript, async run() { const { - flags: { language, input, destination, force, zip: zipSdk, "auth-key": authKey, "skip-changes": skipChanges, "track-changes": trackChanges,"api-version": apiVersion } + flags: { language, + input, + destination, + force, + zip: zipSdk, + "auth-key": authKey, + "skip-changes": skipChanges, + "track-changes": trackChanges, + "api-version": apiVersion, + "codegen-version": codegenVersion, + "stability": stability + } } = await this.parse(SdkGenerate); const workingDirectory = DirectoryPath.createInput(input); @@ -81,6 +102,8 @@ Supports multiple programming languages including Java, C#, Python, JavaScript, zipSdk, skipChanges, trackChanges, + codegenVersion as CodeGenerationVersion, + stability as StabilityLevelTag, apiVersion ); outro(result); diff --git a/src/infrastructure/services/api-service.ts b/src/infrastructure/services/api-service.ts index 8869b971..2d4c83fa 100644 --- a/src/infrastructure/services/api-service.ts +++ b/src/infrastructure/services/api-service.ts @@ -80,7 +80,40 @@ export class ApiService { try { const token = authKey || authInfo?.authKey; const response = await this.axiosInstance(shell, token).get(`/sdk/${requestId}/status`, { - headers: { Accept: "application/json" }, + headers: { Accept: 'application/json' }, + maxRedirects: 0, + validateStatus: () => true + }); + + if (response.status === 200) { + return ok(response.data as SdkGenerationStatusResponse); + } + + if (response.status === 302) { + return ok({ status: 'Completed' } as SdkGenerationStatusResponse); + } + + return err(ServiceError.InvalidResponse); + } catch (error: unknown) { + return err(handleServiceError(error)); + } + } + + public async getV2SdkGenerationStatus( + requestId: string, + configDir: DirectoryPath, + shell: string, + authKey: string | null + ): Promise> { + const authInfo: AuthInfo | null = await getAuthInfo(configDir.toString()); + if (authInfo === null && !authKey) { + return err(ServiceError.UnAuthorized); + } + + try { + const token = authKey || authInfo?.authKey; + const response = await this.axiosInstance(shell, token).get(`/sdk/v2/${requestId}/status`, { + headers: { Accept: 'application/json' }, maxRedirects: 0, validateStatus: () => true }); @@ -90,7 +123,7 @@ export class ApiService { } if (response.status === 302) { - return ok({ status: "Completed" } as SdkGenerationStatusResponse); + return ok({ status: 'Completed' } as SdkGenerationStatusResponse); } return err(ServiceError.InvalidResponse); diff --git a/src/infrastructure/services/portal-service.ts b/src/infrastructure/services/portal-service.ts index 363f12a8..335c2d54 100644 --- a/src/infrastructure/services/portal-service.ts +++ b/src/infrastructure/services/portal-service.ts @@ -14,6 +14,8 @@ import { SdkLanguages, Status, TableOfContentsController, + StabilityLevelTag, + V2SdkGenerationController, } from "@apimatic/sdk"; import { AuthInfo, getAuthInfo } from "../../client-utils/auth-manager.js"; import { parseStreamBodyToJson } from "../../utils/utils.js"; @@ -225,6 +227,89 @@ export class PortalService { } } + public async generateV2Sdk( + buildPath: FilePath, + language: Language, + stability: StabilityLevelTag, + configDir: DirectoryPath, + commandMetadata: CommandMetadata, + authKey: string | null + ): Promise> { + const buildFileStream = await this.fileService.getStream(buildPath); + const file = new FileWrapper(buildFileStream); + + const authInfo: AuthInfo | null = await getAuthInfo(configDir.toString()); + const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey); + const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell); + const v2sdkGenerationController = new V2SdkGenerationController(client); + + let generationId: string; + try { + const response = await v2sdkGenerationController.generateV2SdkViaBuildInputAsync( + this.CONTENT_TYPE, + file, + this.languageSdk[language], + stability + ); + generationId = response.result.id; + } catch (error) { + if (error instanceof ProblemDetailsError) { + // TODO: This only picks the first error message, improve it to show all errors. + const errors = error.result!.errors as Record; + const message = Object.values(errors)[0]?.[0] ?? null; + const errorMessage = error.result!.title + '\n- ' + message; + if (error.statusCode === 400) { + return err(ServiceError.badRequest(errorMessage, errors)); + } + if (error.statusCode === 403) { + return err(ServiceError.forbidden(errorMessage)); + } + } + const serviceError = handleServiceError(error); + return err(serviceError); + } finally { + buildFileStream.close(); + } + + let statusResult; + do { + await new Promise((resolve) => setTimeout(resolve, 3000)); + statusResult = await this.apiService.getV2SdkGenerationStatus( + generationId, + configDir, + commandMetadata.shell, + authKey + ); + + if (statusResult.isErr()) { + return err(statusResult.error); + } + if (statusResult.value.status === Status.Failed) { + return err(ServiceError.ServerError); + } + if (statusResult.value.errors && statusResult.value.status === Status.ValidationError) { + const errors = statusResult.value.errors as Record; + const messages = Object.values(errors).flat(); + const errorMessage = + 'One or more validation errors occurred.' + (messages.length ? '\n- ' + messages.join('\n- ') : ''); + return err(ServiceError.badRequest(errorMessage, errors)); + } + if (statusResult.value.errors && statusResult.value.status === Status.SubscriptionError) { + const errors = statusResult.value.errors as Record; + const message = Object.values(errors).flat()[0] ?? null; + const errorMessage = 'Access denied to resource.' + '\n- ' + message; + return err(ServiceError.forbidden(errorMessage)); + } + } while (statusResult.value.status !== Status.Completed); + + try { + const sdkResponse = await v2sdkGenerationController.downloadGeneratedV2Sdk(generationId); + return ok(sdkResponse.result as NodeJS.ReadableStream); + } catch (error) { + return err(handleServiceError(error)); + } + } + public async generateSdl( specFileStream: ReadStream, configDir: DirectoryPath, diff --git a/src/prompts/sdk/generate.ts b/src/prompts/sdk/generate.ts index 9d5ac55f..b0043531 100644 --- a/src/prompts/sdk/generate.ts +++ b/src/prompts/sdk/generate.ts @@ -5,6 +5,8 @@ import { Result } from "neverthrow"; import { withSpinner } from "../prompt.js"; import { ServiceError } from "../../infrastructure/service-error.js"; import { GeneratedSdkResult } from "../../infrastructure/services/portal-service.js"; +import { StabilityLevelTag } from "@apimatic/sdk"; +import { CodeGenerationVersion } from "../../types/sdk/generate.js"; export class SdkGeneratePrompts { public async overwriteSdk(directory: DirectoryPath): Promise { @@ -46,6 +48,10 @@ export class SdkGeneratePrompts { return withSpinner("Generating SDK", "SDK generated successfully.", "SDK Generation failed.", fn); } + public generateV2SDK(fn: Promise>) { + return withSpinner("Generating SDK", "SDK generated successfully.", "SDK Generation failed.", fn); + } + public sdkGenerationServiceError(serviceError: ServiceError) { log.error(serviceError.errorMessage); } @@ -80,4 +86,12 @@ export class SdkGeneratePrompts { public sdkGenerated(sdk: DirectoryPath) { log.info(`The generated SDK can be found at ${f.path(sdk)}.`); } + + public v4LanguageNotSupported(language: string) { + log.error(`The language ${f.var(language)} is not supported for ${f.var("v4")} code generation.`); + } + + public v4OnlyBetaSupported(language: string, stability: StabilityLevelTag, codeGenVersion: CodeGenerationVersion) { + log.error(`Only ${f.var(stability)} stability tag is supported for language ${f.var(language)} with ${f.var(codeGenVersion)} code generation.`); + } } diff --git a/src/types/sdk/generate.ts b/src/types/sdk/generate.ts index 7cd6cf38..9eb067b0 100644 --- a/src/types/sdk/generate.ts +++ b/src/types/sdk/generate.ts @@ -8,6 +8,11 @@ export enum Language { GO = "go" } +export enum CodeGenerationVersion { + V3 = "v3", + V4 = "v4" +} + const languageMap: { [key: number]: Language } = { 1: Language.CSHARP, 2: Language.GO, From 7b21aa3868e9155a678eedf1df2f0f7875f83ba4 Mon Sep 17 00:00:00 2001 From: Ali Asghar <75574550+aliasghar98@users.noreply.github.com> Date: Thu, 14 May 2026 11:45:10 +0500 Subject: [PATCH 2/5] chore: update npmrc to include official registry and update overrides --- .npmrc | 1 + pnpm-workspace.yaml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.npmrc b/.npmrc index 6b1c02e7..48804a98 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ +registry=https://registry.npmjs.org/ @apimatic:registry=https://registry.npmjs.org/ diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 217f1e3b..f6375c64 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -13,3 +13,5 @@ overrides: rimraf: ^6.0.1 glob: ^13.0.0 q: npm:promise@^8.3.0 + semver: "^7.7.0" + '@oclif/core': "4.11.0" From b7a6d10649c155e6e5531927ff45183f13e86215 Mon Sep 17 00:00:00 2001 From: Ali Asghar <75574550+aliasghar98@users.noreply.github.com> Date: Thu, 14 May 2026 11:51:53 +0500 Subject: [PATCH 3/5] fix: minor fixes --- src/actions/sdk/generate.ts | 2 +- src/commands/sdk/generate.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/actions/sdk/generate.ts b/src/actions/sdk/generate.ts index 6e6d3ade..e2d3909b 100644 --- a/src/actions/sdk/generate.ts +++ b/src/actions/sdk/generate.ts @@ -50,7 +50,7 @@ export class GenerateAction { return ActionResult.failed(); } if (stability !== undefined && stability !== StabilityLevelTag.Beta) { - this.prompts.v4OnlyBetaSupported(language, stability, codeGenVersion); + this.prompts.v4OnlyBetaSupported(language, StabilityLevelTag.Beta, codeGenVersion); return ActionResult.failed(); } } diff --git a/src/commands/sdk/generate.ts b/src/commands/sdk/generate.ts index 72be1426..c1bf0c1d 100644 --- a/src/commands/sdk/generate.ts +++ b/src/commands/sdk/generate.ts @@ -78,7 +78,7 @@ Supports multiple programming languages including Java, C#, Python, JavaScript, "track-changes": trackChanges, "api-version": apiVersion, "codegen-version": codegenVersion, - "stability": stability + stability } } = await this.parse(SdkGenerate); From e7c8c30bb9b82adfe7b5ffe206ddd6a187bea423 Mon Sep 17 00:00:00 2001 From: Ali Asghar <75574550+aliasghar98@users.noreply.github.com> Date: Thu, 14 May 2026 14:43:35 +0500 Subject: [PATCH 4/5] incorporate feedback --- README.md | 33 +++++++++++-------- src/actions/sdk/generate.ts | 24 ++++---------- src/actions/sdk/publish.ts | 5 ++- src/actions/sdk/quickstart.ts | 5 ++- src/commands/sdk/generate.ts | 10 +++--- src/infrastructure/services/api-service.ts | 2 +- src/infrastructure/services/portal-service.ts | 15 ++++++--- src/prompts/sdk/generate.ts | 12 ++----- src/types/sdk/generate.ts | 5 +++ 9 files changed, 54 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index da5d0270..5de87b28 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ $ npm install -g @apimatic/cli $ apimatic COMMAND running command... $ apimatic (--version) -@apimatic/cli/1.1.0-beta.11 win32-x64 node-v23.4.0 +@apimatic/cli/1.1.0-beta.16 win32-x64 node-v23.4.0 $ apimatic --help [COMMAND] USAGE $ apimatic COMMAND @@ -434,21 +434,26 @@ Generate an SDK for your API ``` USAGE $ apimatic sdk generate -l csharp|java|php|python|ruby|typescript|go [-d ] [--skip-changes] - [--api-version ] [--zip] [--track-changes] [-i ] [-f] [-k ] + [--api-version ] [--zip] [--track-changes] [--codegen-version v3|v4] [--stability stable|beta] [-i ] + [-f] [-k ] FLAGS - -d, --destination= [default: /sdk/ | /sdk//] path where the SDK - will be generated - -f, --force overwrite changes without asking for user consent. - -i, --input= [default: ./] path to the parent directory containing the 'src' directory, which includes - API specifications and configuration files. - -k, --auth-key= override current authentication state with an authentication key. - -l, --language=