@apimatic/cli 1.1.0-beta.1 → 1.1.0-beta.11
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/README.md +53 -10
- package/lib/actions/action-result.d.ts +12 -6
- package/lib/actions/action-result.js +36 -10
- package/lib/actions/action-result.js.map +1 -1
- package/lib/actions/api/validate.d.ts +3 -1
- package/lib/actions/api/validate.js +14 -3
- package/lib/actions/api/validate.js.map +1 -1
- package/lib/actions/portal/copilot.js +2 -2
- package/lib/actions/portal/generate.js +7 -1
- package/lib/actions/portal/generate.js.map +1 -1
- package/lib/actions/portal/quickstart.d.ts +4 -3
- package/lib/actions/portal/quickstart.js +42 -19
- package/lib/actions/portal/quickstart.js.map +1 -1
- package/lib/actions/portal/serve.js +0 -14
- package/lib/actions/portal/serve.js.map +1 -1
- package/lib/actions/portal/toc/new-toc.d.ts +5 -5
- package/lib/actions/portal/toc/new-toc.js +39 -40
- package/lib/actions/portal/toc/new-toc.js.map +1 -1
- package/lib/actions/sdk/generate.d.ts +4 -1
- package/lib/actions/sdk/generate.js +62 -17
- package/lib/actions/sdk/generate.js.map +1 -1
- package/lib/actions/sdk/merge-source-tree.d.ts +12 -0
- package/lib/actions/sdk/merge-source-tree.js +78 -0
- package/lib/actions/sdk/merge-source-tree.js.map +1 -0
- package/lib/actions/sdk/quickstart.d.ts +6 -3
- package/lib/actions/sdk/quickstart.js +48 -26
- package/lib/actions/sdk/quickstart.js.map +1 -1
- package/lib/actions/sdk/save-changes.d.ts +8 -0
- package/lib/actions/sdk/save-changes.js +93 -0
- package/lib/actions/sdk/save-changes.js.map +1 -0
- package/lib/application/portal/toc/toc-structure-generator.d.ts +23 -2
- package/lib/application/portal/toc/toc-structure-generator.js +131 -60
- package/lib/application/portal/toc/toc-structure-generator.js.map +1 -1
- package/lib/commands/portal/recipe/new.js +2 -2
- package/lib/commands/portal/recipe/new.js.map +1 -1
- package/lib/commands/portal/toc/new.d.ts +5 -3
- package/lib/commands/portal/toc/new.js +34 -26
- package/lib/commands/portal/toc/new.js.map +1 -1
- package/lib/commands/quickstart.js +1 -1
- package/lib/commands/quickstart.js.map +1 -1
- package/lib/commands/sdk/generate.d.ts +4 -2
- package/lib/commands/sdk/generate.js +29 -11
- package/lib/commands/sdk/generate.js.map +1 -1
- package/lib/commands/sdk/save-changes.d.ts +14 -0
- package/lib/commands/sdk/save-changes.js +51 -0
- package/lib/commands/sdk/save-changes.js.map +1 -0
- package/lib/hooks/not-found.js +1 -1
- package/lib/hooks/not-found.js.map +1 -1
- package/lib/infrastructure/debounce-service.js +3 -0
- package/lib/infrastructure/debounce-service.js.map +1 -1
- package/lib/infrastructure/file-service.d.ts +6 -0
- package/lib/infrastructure/file-service.js +58 -1
- package/lib/infrastructure/file-service.js.map +1 -1
- package/lib/infrastructure/git-service.d.ts +15 -0
- package/lib/infrastructure/git-service.js +93 -0
- package/lib/infrastructure/git-service.js.map +1 -0
- package/lib/infrastructure/launcher-service.d.ts +2 -0
- package/lib/infrastructure/launcher-service.js +22 -1
- package/lib/infrastructure/launcher-service.js.map +1 -1
- package/lib/infrastructure/service-error.d.ts +13 -2
- package/lib/infrastructure/service-error.js +23 -9
- package/lib/infrastructure/service-error.js.map +1 -1
- package/lib/infrastructure/services/api-service.d.ts +2 -1
- package/lib/infrastructure/services/api-service.js +24 -0
- package/lib/infrastructure/services/api-service.js.map +1 -1
- package/lib/infrastructure/services/portal-service.d.ts +6 -4
- package/lib/infrastructure/services/portal-service.js +96 -59
- package/lib/infrastructure/services/portal-service.js.map +1 -1
- package/lib/infrastructure/services/validation-service.d.ts +28 -2
- package/lib/infrastructure/services/validation-service.js +108 -15
- package/lib/infrastructure/services/validation-service.js.map +1 -1
- package/lib/infrastructure/zip-service.js +1 -1
- package/lib/infrastructure/zip-service.js.map +1 -1
- package/lib/prompts/api/validate.d.ts +5 -2
- package/lib/prompts/api/validate.js +36 -0
- package/lib/prompts/api/validate.js.map +1 -1
- package/lib/prompts/format.d.ts +1 -1
- package/lib/prompts/format.js.map +1 -1
- package/lib/prompts/portal/generate.d.ts +1 -1
- package/lib/prompts/portal/generate.js +9 -3
- package/lib/prompts/portal/generate.js.map +1 -1
- package/lib/prompts/portal/quickstart.d.ts +3 -0
- package/lib/prompts/portal/quickstart.js +39 -2
- package/lib/prompts/portal/quickstart.js.map +1 -1
- package/lib/prompts/portal/toc/new-toc.d.ts +1 -1
- package/lib/prompts/portal/toc/new-toc.js +10 -2
- package/lib/prompts/portal/toc/new-toc.js.map +1 -1
- package/lib/prompts/sdk/generate.d.ts +11 -4
- package/lib/prompts/sdk/generate.js +37 -11
- package/lib/prompts/sdk/generate.js.map +1 -1
- package/lib/prompts/sdk/merge-source-tree.d.ts +22 -0
- package/lib/prompts/sdk/merge-source-tree.js +90 -0
- package/lib/prompts/sdk/merge-source-tree.js.map +1 -0
- package/lib/prompts/sdk/quickstart.d.ts +4 -1
- package/lib/prompts/sdk/quickstart.js +41 -4
- package/lib/prompts/sdk/quickstart.js.map +1 -1
- package/lib/prompts/sdk/save-changes.d.ts +21 -0
- package/lib/prompts/sdk/save-changes.js +84 -0
- package/lib/prompts/sdk/save-changes.js.map +1 -0
- package/lib/types/build/build.d.ts +2 -0
- package/lib/types/build/build.js.map +1 -1
- package/lib/types/build-context.d.ts +10 -0
- package/lib/types/build-context.js +71 -1
- package/lib/types/build-context.js.map +1 -1
- package/lib/types/events/sdk-changes-saved.d.ts +8 -0
- package/lib/types/events/sdk-changes-saved.js +11 -0
- package/lib/types/events/sdk-changes-saved.js.map +1 -0
- package/lib/types/events/sdk-changes-tracked.d.ts +8 -0
- package/lib/types/events/sdk-changes-tracked.js +11 -0
- package/lib/types/events/sdk-changes-tracked.js.map +1 -0
- package/lib/types/events/sdk-conflicts-resolved.d.ts +8 -0
- package/lib/types/events/sdk-conflicts-resolved.js +11 -0
- package/lib/types/events/sdk-conflicts-resolved.js.map +1 -0
- package/lib/types/file/directory.d.ts +10 -1
- package/lib/types/file/directory.js +63 -5
- package/lib/types/file/directory.js.map +1 -1
- package/lib/types/file/directoryPath.js.map +1 -1
- package/lib/types/merge-source-tree-context.d.ts +28 -0
- package/lib/types/merge-source-tree-context.js +62 -0
- package/lib/types/merge-source-tree-context.js.map +1 -0
- package/lib/types/save-changes-context.d.ts +17 -0
- package/lib/types/save-changes-context.js +42 -0
- package/lib/types/save-changes-context.js.map +1 -0
- package/lib/types/sdk-context.d.ts +5 -4
- package/lib/types/sdk-context.js +26 -13
- package/lib/types/sdk-context.js.map +1 -1
- package/lib/types/sdl/sdl.d.ts +20 -3
- package/lib/types/sdl/sdl.js +120 -22
- package/lib/types/sdl/sdl.js.map +1 -1
- package/lib/types/spec-context.js.map +1 -1
- package/lib/types/temp-context.js.map +1 -1
- package/lib/types/toc/toc.d.ts +31 -6
- package/lib/utils/string-utils.d.ts +1 -0
- package/lib/utils/string-utils.js +42 -0
- package/lib/utils/string-utils.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,28 +1,42 @@
|
|
|
1
1
|
var _a;
|
|
2
2
|
import axios from "axios";
|
|
3
3
|
import { format as f } from "../prompts/format.js";
|
|
4
|
+
export var ServiceErrorCode;
|
|
5
|
+
(function (ServiceErrorCode) {
|
|
6
|
+
ServiceErrorCode["NotFound"] = "NOT_FOUND";
|
|
7
|
+
ServiceErrorCode["ServerError"] = "SERVER_ERROR";
|
|
8
|
+
ServiceErrorCode["NetworkError"] = "NETWORK_ERROR";
|
|
9
|
+
ServiceErrorCode["InvalidResponse"] = "INVALID_RESPONSE";
|
|
10
|
+
ServiceErrorCode["UnAuthorized"] = "UNAUTHORIZED";
|
|
11
|
+
ServiceErrorCode["BadRequest"] = "BAD_REQUEST";
|
|
12
|
+
ServiceErrorCode["Forbidden"] = "FORBIDDEN";
|
|
13
|
+
})(ServiceErrorCode || (ServiceErrorCode = {}));
|
|
4
14
|
export class ServiceError {
|
|
5
|
-
static badRequest(customMessage) {
|
|
6
|
-
return new _a(
|
|
15
|
+
static badRequest(customMessage, errors) {
|
|
16
|
+
return new _a(ServiceErrorCode.BadRequest, customMessage, errors);
|
|
7
17
|
}
|
|
8
18
|
static forbidden(customMessage) {
|
|
9
|
-
return new _a(
|
|
19
|
+
return new _a(ServiceErrorCode.Forbidden, customMessage, {});
|
|
10
20
|
}
|
|
11
|
-
constructor(code, defaultMessage) {
|
|
21
|
+
constructor(code, defaultMessage, errors) {
|
|
12
22
|
this.code = code;
|
|
13
23
|
this.defaultMessage = defaultMessage;
|
|
24
|
+
this.errors = errors;
|
|
14
25
|
}
|
|
15
26
|
get errorMessage() {
|
|
16
27
|
return this.defaultMessage;
|
|
17
28
|
}
|
|
29
|
+
getError(key) {
|
|
30
|
+
return this.errors[key];
|
|
31
|
+
}
|
|
18
32
|
}
|
|
19
33
|
_a = ServiceError;
|
|
20
34
|
ServiceError.defaultErrorMessage = `An unexpected error occurred, please try again later. If the problem persists, please reach out to our team at ${f.var("support@apimatic.io")}`;
|
|
21
|
-
ServiceError.NotFound = new _a(
|
|
22
|
-
ServiceError.ServerError = new _a(
|
|
23
|
-
ServiceError.NetworkError = new _a(
|
|
24
|
-
ServiceError.InvalidResponse = new _a(
|
|
25
|
-
ServiceError.UnAuthorized = new _a(
|
|
35
|
+
ServiceError.NotFound = new _a(ServiceErrorCode.NotFound, "Resource not found.", {});
|
|
36
|
+
ServiceError.ServerError = new _a(ServiceErrorCode.ServerError, _a.defaultErrorMessage, {});
|
|
37
|
+
ServiceError.NetworkError = new _a(ServiceErrorCode.NetworkError, "Unable to connect to the server.", {});
|
|
38
|
+
ServiceError.InvalidResponse = new _a(ServiceErrorCode.InvalidResponse, _a.defaultErrorMessage, {});
|
|
39
|
+
ServiceError.UnAuthorized = new _a(ServiceErrorCode.UnAuthorized, "Unauthorized access.", {});
|
|
26
40
|
ServiceError.values = [
|
|
27
41
|
_a.NotFound,
|
|
28
42
|
_a.ServerError,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-error.js","sourceRoot":"","sources":["../../src/infrastructure/service-error.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,OAAO,YAAY;IAUvB,MAAM,CAAC,UAAU,CAAC,aAAqB;
|
|
1
|
+
{"version":3,"file":"service-error.js","sourceRoot":"","sources":["../../src/infrastructure/service-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,12 @@ import { DirectoryPath } from "../../types/file/directoryPath.js";
|
|
|
2
2
|
import { SubscriptionInfo } from "../../types/api/account.js";
|
|
3
3
|
import { Result } from "neverthrow";
|
|
4
4
|
import { ServiceError } from "../service-error.js";
|
|
5
|
-
import { PortalGenerationStatusResponse } from "@apimatic/sdk";
|
|
5
|
+
import { PortalGenerationStatusResponse, SdkGenerationStatusResponse } from "@apimatic/sdk";
|
|
6
6
|
export declare class ApiService {
|
|
7
7
|
private readonly apiBaseUrl;
|
|
8
8
|
getAccountInfo(configDir: DirectoryPath, shell: string, authKey: string | null): Promise<Result<SubscriptionInfo, ServiceError>>;
|
|
9
9
|
getPortalGenerationStatus(requestId: string, configDir: DirectoryPath, shell: string, authKey: string | null): Promise<Result<PortalGenerationStatusResponse, ServiceError>>;
|
|
10
|
+
getSdkGenerationStatus(requestId: string, configDir: DirectoryPath, shell: string, authKey: string | null): Promise<Result<SdkGenerationStatusResponse, ServiceError>>;
|
|
10
11
|
sendTelemetry(payload: string, authKey: string, shell: string): Promise<Result<string, string | ServiceError>>;
|
|
11
12
|
private axiosInstance;
|
|
12
13
|
}
|
|
@@ -48,6 +48,30 @@ export class ApiService {
|
|
|
48
48
|
return err(handleServiceError(error));
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
async getSdkGenerationStatus(requestId, configDir, shell, authKey) {
|
|
52
|
+
const authInfo = await getAuthInfo(configDir.toString());
|
|
53
|
+
if (authInfo === null && !authKey) {
|
|
54
|
+
return err(ServiceError.UnAuthorized);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const token = authKey || (authInfo === null || authInfo === void 0 ? void 0 : authInfo.authKey);
|
|
58
|
+
const response = await this.axiosInstance(shell, token).get(`/sdk/${requestId}/status`, {
|
|
59
|
+
headers: { Accept: "application/json" },
|
|
60
|
+
maxRedirects: 0,
|
|
61
|
+
validateStatus: () => true
|
|
62
|
+
});
|
|
63
|
+
if (response.status === 200) {
|
|
64
|
+
return ok(response.data);
|
|
65
|
+
}
|
|
66
|
+
if (response.status === 302) {
|
|
67
|
+
return ok({ status: "Completed" });
|
|
68
|
+
}
|
|
69
|
+
return err(ServiceError.InvalidResponse);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return err(handleServiceError(error));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
51
75
|
async sendTelemetry(payload, authKey, shell) {
|
|
52
76
|
try {
|
|
53
77
|
const response = await this.axiosInstance(shell, authKey).post("/telemetry/track", payload, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/api-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAY,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAG3E,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAU,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGvE,MAAM,OAAO,UAAU;IAAvB;QACmB,eAAU,GAAG,yBAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"api-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/api-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,16 +6,18 @@ import { CommandMetadata } from "../../types/common/command-metadata.js";
|
|
|
6
6
|
import { Result } from "neverthrow";
|
|
7
7
|
import { Language } from "../../types/sdk/generate.js";
|
|
8
8
|
import { ServiceError } from "../service-error.js";
|
|
9
|
+
export interface GeneratedSdkResult {
|
|
10
|
+
sdk: NodeJS.ReadableStream;
|
|
11
|
+
sdkSourceTree: NodeJS.ReadableStream;
|
|
12
|
+
}
|
|
9
13
|
export declare class PortalService {
|
|
10
14
|
private readonly CONTENT_TYPE;
|
|
11
15
|
private readonly fileService;
|
|
12
16
|
private readonly apiService;
|
|
13
17
|
generatePortal(buildPath: FilePath, configDir: DirectoryPath, commandMetadata: CommandMetadata, authKey: string | null): Promise<Result<NodeJS.ReadableStream, ServiceError | NodeJS.ReadableStream>>;
|
|
14
|
-
generateSdk(
|
|
18
|
+
generateSdk(buildPath: FilePath, language: Language, configDir: DirectoryPath, commandMetadata: CommandMetadata, authKey: string | null): Promise<Result<GeneratedSdkResult, ServiceError>>;
|
|
15
19
|
generateSdl(specFileStream: ReadStream, configDir: DirectoryPath, commandMetadata: CommandMetadata): Promise<Result<Sdl, ServiceError>>;
|
|
16
20
|
private createAuthorizationHeader;
|
|
17
21
|
private createOriginQueryParameter;
|
|
18
|
-
private
|
|
19
|
-
private parseBadRequestResponse;
|
|
20
|
-
private readonly languagePlatform;
|
|
22
|
+
private readonly languageSdk;
|
|
21
23
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ApiError, SdkGenerationAsyncController, ContentType, DocsPortalGenerationAsyncController, SdkSourceTreeGenerationAsyncController, ProblemDetailsError, FileWrapper, TransformationController, ExportFormats, SdkLanguages, Status, } from "@apimatic/sdk";
|
|
2
2
|
import { getAuthInfo } from "../../client-utils/auth-manager.js";
|
|
3
3
|
import { parseStreamBodyToJson } from "../../utils/utils.js";
|
|
4
4
|
import { FileService } from "../file-service.js";
|
|
@@ -21,36 +21,19 @@ export class PortalService {
|
|
|
21
21
|
origin: `APIMATIC CLI ${commandName}`
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return (_c = (_b = error.result) === null || _b === void 0 ? void 0 : _b.message) !== null && _c !== void 0 ? _c : "Authorization has been denied for this request.";
|
|
33
|
-
}
|
|
34
|
-
if (error instanceof ProblemDetailsError) {
|
|
35
|
-
// 403
|
|
36
|
-
const message = (_e = (_d = error.result.errors) === null || _d === void 0 ? void 0 : _d[""]) === null || _e === void 0 ? void 0 : _e[0];
|
|
37
|
-
return error.result.title + "\n- " + message;
|
|
38
|
-
}
|
|
39
|
-
return "An unexpected error occurred while generating the portal, please try again later. If the problem persists, please reach out to our team at support@apimatic.io";
|
|
40
|
-
};
|
|
41
|
-
this.languagePlatform = {
|
|
42
|
-
[Language.CSHARP]: Platforms.CsNetStandardLib,
|
|
43
|
-
[Language.JAVA]: Platforms.JavaEclipseJreLib,
|
|
44
|
-
[Language.PHP]: Platforms.PhpGenericLibV2,
|
|
45
|
-
[Language.PYTHON]: Platforms.PythonGenericLib,
|
|
46
|
-
[Language.RUBY]: Platforms.RubyGenericLib,
|
|
47
|
-
[Language.TYPESCRIPT]: Platforms.TsGenericLib,
|
|
48
|
-
[Language.GO]: Platforms.GoGenericLib
|
|
24
|
+
this.languageSdk = {
|
|
25
|
+
[Language.CSHARP]: SdkLanguages.Csharp,
|
|
26
|
+
[Language.JAVA]: SdkLanguages.Java,
|
|
27
|
+
[Language.PHP]: SdkLanguages.Php,
|
|
28
|
+
[Language.PYTHON]: SdkLanguages.Python,
|
|
29
|
+
[Language.RUBY]: SdkLanguages.Ruby,
|
|
30
|
+
[Language.TYPESCRIPT]: SdkLanguages.Typescript,
|
|
31
|
+
[Language.GO]: SdkLanguages.Go
|
|
49
32
|
};
|
|
50
33
|
}
|
|
51
34
|
// TODO: Pass stream as parameter instead of file path.
|
|
52
35
|
async generatePortal(buildPath, configDir, commandMetadata, authKey) {
|
|
53
|
-
var _a, _b;
|
|
36
|
+
var _a, _b, _c, _d, _e, _f;
|
|
54
37
|
const buildFileStream = await this.fileService.getStream(buildPath);
|
|
55
38
|
const file = new FileWrapper(buildFileStream);
|
|
56
39
|
const authInfo = await getAuthInfo(configDir.toString());
|
|
@@ -64,10 +47,12 @@ export class PortalService {
|
|
|
64
47
|
}
|
|
65
48
|
catch (error) {
|
|
66
49
|
if (error instanceof ProblemDetailsError) {
|
|
67
|
-
const
|
|
50
|
+
const errors = error.result.errors;
|
|
51
|
+
// TODO: This only picks the first error message, improve it to show all errors.
|
|
52
|
+
const message = (_b = (_a = Object.values(errors)[0]) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null;
|
|
68
53
|
const errorMessage = error.result.title + "\n- " + message;
|
|
69
54
|
if (error.statusCode === 400) {
|
|
70
|
-
return err(ServiceError.badRequest(errorMessage));
|
|
55
|
+
return err(ServiceError.badRequest(errorMessage, errors));
|
|
71
56
|
}
|
|
72
57
|
if (error.statusCode === 403) {
|
|
73
58
|
return err(ServiceError.forbidden(errorMessage));
|
|
@@ -86,10 +71,24 @@ export class PortalService {
|
|
|
86
71
|
if (statusResult.isErr()) {
|
|
87
72
|
return err(statusResult.error);
|
|
88
73
|
}
|
|
89
|
-
if (statusResult.value.status ===
|
|
74
|
+
if (statusResult.value.status === Status.Failed) {
|
|
90
75
|
return err(ServiceError.ServerError);
|
|
91
76
|
}
|
|
92
|
-
|
|
77
|
+
if (statusResult.value.errors && statusResult.value.status === Status.ValidationError) {
|
|
78
|
+
const errors = statusResult.value.errors;
|
|
79
|
+
const message = (_d = (_c = Object.values(errors)[0]) === null || _c === void 0 ? void 0 : _c[0]) !== null && _d !== void 0 ? _d : null;
|
|
80
|
+
const errorMessage = "One or more validation errors occurred." +
|
|
81
|
+
"\n- " + message;
|
|
82
|
+
return err(ServiceError.badRequest(errorMessage, errors));
|
|
83
|
+
}
|
|
84
|
+
if (statusResult.value.errors && statusResult.value.status === Status.SubscriptionError) {
|
|
85
|
+
const errors = statusResult.value.errors;
|
|
86
|
+
// TODO: This only picks the first error message, improve it to show all errors.
|
|
87
|
+
const message = (_f = (_e = Object.values(errors)[0]) === null || _e === void 0 ? void 0 : _e[0]) !== null && _f !== void 0 ? _f : null;
|
|
88
|
+
const errorMessage = "Access denied to resource." + "\n- " + message;
|
|
89
|
+
return err(ServiceError.forbidden(errorMessage));
|
|
90
|
+
}
|
|
91
|
+
} while (statusResult.value.status !== Status.Completed);
|
|
93
92
|
try {
|
|
94
93
|
const portalDownloadResponse = await docsPortalAsyncController.downloadGeneratedPortal(generationId);
|
|
95
94
|
return ok(portalDownloadResponse.result);
|
|
@@ -102,23 +101,80 @@ export class PortalService {
|
|
|
102
101
|
}
|
|
103
102
|
}
|
|
104
103
|
// TODO: Pass stream as parameter instead of file path.
|
|
105
|
-
async generateSdk(
|
|
106
|
-
|
|
107
|
-
const
|
|
104
|
+
async generateSdk(buildPath, language, configDir, commandMetadata, authKey) {
|
|
105
|
+
var _a, _b, _c;
|
|
106
|
+
const buildFileStream = await this.fileService.getStream(buildPath);
|
|
107
|
+
const file = new FileWrapper(buildFileStream);
|
|
108
108
|
const authInfo = await getAuthInfo(configDir.toString());
|
|
109
109
|
const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey);
|
|
110
110
|
const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell);
|
|
111
|
-
const sdkGenerationController = new
|
|
111
|
+
const sdkGenerationController = new SdkGenerationAsyncController(client);
|
|
112
|
+
let generationId;
|
|
112
113
|
try {
|
|
113
|
-
const response = await sdkGenerationController.
|
|
114
|
-
|
|
115
|
-
return ok(sdkResponse.result);
|
|
114
|
+
const response = await sdkGenerationController.generateSdkViaBuildInputAsync(this.CONTENT_TYPE, file, this.languageSdk[language]);
|
|
115
|
+
generationId = response.result.id;
|
|
116
116
|
}
|
|
117
117
|
catch (error) {
|
|
118
|
-
|
|
118
|
+
if (error instanceof ProblemDetailsError) {
|
|
119
|
+
// TODO: This only picks the first error message, improve it to show all errors.
|
|
120
|
+
const errors = error.result.errors;
|
|
121
|
+
const message = (_b = (_a = Object.values(errors)[0]) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null;
|
|
122
|
+
const errorMessage = error.result.title + "\n- " + message;
|
|
123
|
+
if (error.statusCode === 400) {
|
|
124
|
+
return err(ServiceError.badRequest(errorMessage, errors));
|
|
125
|
+
}
|
|
126
|
+
if (error.statusCode === 403) {
|
|
127
|
+
return err(ServiceError.forbidden(errorMessage));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const serviceError = handleServiceError(error);
|
|
131
|
+
return err(serviceError);
|
|
119
132
|
}
|
|
120
133
|
finally {
|
|
121
|
-
|
|
134
|
+
buildFileStream.close();
|
|
135
|
+
}
|
|
136
|
+
let statusResult;
|
|
137
|
+
do {
|
|
138
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
139
|
+
statusResult = await this.apiService.getSdkGenerationStatus(generationId, configDir, commandMetadata.shell, authKey);
|
|
140
|
+
if (statusResult.isErr()) {
|
|
141
|
+
return err(statusResult.error);
|
|
142
|
+
}
|
|
143
|
+
if (statusResult.value.status === Status.Failed) {
|
|
144
|
+
return err(ServiceError.ServerError);
|
|
145
|
+
}
|
|
146
|
+
if (statusResult.value.errors && statusResult.value.status === Status.ValidationError) {
|
|
147
|
+
const errors = statusResult.value.errors;
|
|
148
|
+
const sdkMergeFailedLanguages = errors.sdkMergeFailed;
|
|
149
|
+
if (sdkMergeFailedLanguages === null || sdkMergeFailedLanguages === void 0 ? void 0 : sdkMergeFailedLanguages.length) {
|
|
150
|
+
const errorMessage = "SDK generation failed for these languages due to merge conflict." +
|
|
151
|
+
"\n- " +
|
|
152
|
+
sdkMergeFailedLanguages.join("\n- ");
|
|
153
|
+
return err(ServiceError.badRequest(errorMessage, errors));
|
|
154
|
+
}
|
|
155
|
+
const messages = Object.values(errors).flat();
|
|
156
|
+
const errorMessage = "One or more validation errors occurred." +
|
|
157
|
+
(messages.length ? "\n- " + messages.join("\n- ") : "");
|
|
158
|
+
return err(ServiceError.badRequest(errorMessage, errors));
|
|
159
|
+
}
|
|
160
|
+
if (statusResult.value.errors && statusResult.value.status === Status.SubscriptionError) {
|
|
161
|
+
const errors = statusResult.value.errors;
|
|
162
|
+
const message = (_c = Object.values(errors).flat()[0]) !== null && _c !== void 0 ? _c : null;
|
|
163
|
+
const errorMessage = "Access denied to resource." + "\n- " + message;
|
|
164
|
+
return err(ServiceError.forbidden(errorMessage));
|
|
165
|
+
}
|
|
166
|
+
} while (statusResult.value.status !== Status.Completed);
|
|
167
|
+
try {
|
|
168
|
+
const sdkResponse = await sdkGenerationController.downloadGeneratedSdk(generationId);
|
|
169
|
+
const sdkSourceTreeController = new SdkSourceTreeGenerationAsyncController(client);
|
|
170
|
+
const sdkSourceTreeResponse = await sdkSourceTreeController.downloadGeneratedSdkSourceTree(generationId);
|
|
171
|
+
return ok({
|
|
172
|
+
sdk: sdkResponse.result,
|
|
173
|
+
sdkSourceTree: sdkSourceTreeResponse.result
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return err(handleServiceError(error));
|
|
122
178
|
}
|
|
123
179
|
}
|
|
124
180
|
async generateSdl(specFileStream, configDir, commandMetadata) {
|
|
@@ -145,24 +201,5 @@ export class PortalService {
|
|
|
145
201
|
return err(handleServiceError(error));
|
|
146
202
|
}
|
|
147
203
|
}
|
|
148
|
-
parseBadRequestResponse(errorMessage) {
|
|
149
|
-
// #TODO: Fix server-side error message and simplify this function
|
|
150
|
-
if (!errorMessage) {
|
|
151
|
-
return "Bad request.";
|
|
152
|
-
}
|
|
153
|
-
// Parse the JSON string
|
|
154
|
-
const parsedResult = JSON.parse(errorMessage);
|
|
155
|
-
// Check if it has the expected structure with Errors
|
|
156
|
-
if (parsedResult.Errors && Array.isArray(parsedResult.Errors) && parsedResult.Errors.length > 0) {
|
|
157
|
-
// Get the first error and clean it up
|
|
158
|
-
return parsedResult.Errors[0].split(".")[0] + ".";
|
|
159
|
-
// Split on <br/> and take the first part, then strip remaining HTML tags
|
|
160
|
-
// return firstError.split("<br/>")[0].replace(/<[^<>]*?>/g, "");
|
|
161
|
-
}
|
|
162
|
-
else if (parsedResult.Success === false) {
|
|
163
|
-
return "API definition file validation failed.";
|
|
164
|
-
}
|
|
165
|
-
return errorMessage;
|
|
166
|
-
}
|
|
167
204
|
}
|
|
168
205
|
//# sourceMappingURL=portal-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/portal-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"portal-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/portal-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,43 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ValidateApiResult } from "@apimatic/sdk";
|
|
2
2
|
import { DirectoryPath } from "../../types/file/directoryPath.js";
|
|
3
3
|
import { Result } from "neverthrow";
|
|
4
4
|
import { FilePath } from "../../types/file/filePath.js";
|
|
5
5
|
import { CommandMetadata } from "../../types/common/command-metadata.js";
|
|
6
|
+
import { ServiceError } from "../service-error.js";
|
|
7
|
+
export declare enum RemovableFeature {
|
|
8
|
+
Merging = "Merging",
|
|
9
|
+
Pagination = "Pagination",
|
|
10
|
+
Webhooks = "Webhooks",
|
|
11
|
+
Callbacks = "Callbacks",
|
|
12
|
+
MultipleAuthSchemes = "MultipleAuthSchemes",
|
|
13
|
+
Oauth2 = "OAuth2"
|
|
14
|
+
}
|
|
15
|
+
export interface FeaturesToRemove {
|
|
16
|
+
features?: RemovableFeature[];
|
|
17
|
+
endpointsToKeep?: number;
|
|
18
|
+
}
|
|
6
19
|
export interface ValidateViaFileParams {
|
|
7
20
|
file: FilePath;
|
|
8
21
|
commandMetadata: CommandMetadata;
|
|
9
22
|
authKey?: string | null;
|
|
10
23
|
}
|
|
24
|
+
export interface UnallowedFeaturesResponse {
|
|
25
|
+
Features: RemovableFeature[];
|
|
26
|
+
EndpointLimit: number;
|
|
27
|
+
EndpointCount: number;
|
|
28
|
+
IsSplitSpec: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ValidateApiResponse {
|
|
31
|
+
result: ValidateApiResult;
|
|
32
|
+
unallowedFeatures: UnallowedFeaturesResponse | null;
|
|
33
|
+
}
|
|
11
34
|
export declare class ValidationService {
|
|
12
35
|
private readonly configDir;
|
|
36
|
+
private readonly apiBaseUrl;
|
|
13
37
|
constructor(configDir: DirectoryPath);
|
|
14
|
-
validateViaFile({ file, commandMetadata, authKey }: ValidateViaFileParams): Promise<Result<
|
|
38
|
+
validateViaFile({ file, commandMetadata, authKey }: ValidateViaFileParams): Promise<Result<ValidateApiResponse, string>>;
|
|
39
|
+
stripUnallowedFeatures(specPath: FilePath, featuresToRemove: FeaturesToRemove, authKey?: string | null): Promise<Result<NodeJS.ReadableStream, ServiceError>>;
|
|
15
40
|
private createAuthorizationHeader;
|
|
16
41
|
private handleValidationErrors;
|
|
42
|
+
private parseErrorResponse;
|
|
17
43
|
}
|
|
@@ -1,27 +1,80 @@
|
|
|
1
|
+
import { __asyncValues } from "tslib";
|
|
2
|
+
import { createReadStream } from "node:fs";
|
|
1
3
|
import fsExtra from "fs-extra";
|
|
2
|
-
import {
|
|
4
|
+
import { ApiValidationV2ExternalApisController, ContentType, FileWrapper, ApiError } from "@apimatic/sdk";
|
|
3
5
|
import { getAuthInfo } from "../../client-utils/auth-manager.js";
|
|
4
6
|
import { apiClientFactory } from "./api-client-factory.js";
|
|
5
7
|
import { err, ok } from "neverthrow";
|
|
8
|
+
import FormData from "form-data";
|
|
9
|
+
import { handleServiceError } from "../service-error.js";
|
|
10
|
+
import axios from "axios";
|
|
11
|
+
import { envInfo } from "../env-info.js";
|
|
12
|
+
import { Buffer } from "node:buffer";
|
|
13
|
+
export var RemovableFeature;
|
|
14
|
+
(function (RemovableFeature) {
|
|
15
|
+
RemovableFeature["Merging"] = "Merging";
|
|
16
|
+
RemovableFeature["Pagination"] = "Pagination";
|
|
17
|
+
RemovableFeature["Webhooks"] = "Webhooks";
|
|
18
|
+
RemovableFeature["Callbacks"] = "Callbacks";
|
|
19
|
+
RemovableFeature["MultipleAuthSchemes"] = "MultipleAuthSchemes";
|
|
20
|
+
RemovableFeature["Oauth2"] = "OAuth2";
|
|
21
|
+
})(RemovableFeature || (RemovableFeature = {}));
|
|
6
22
|
export class ValidationService {
|
|
7
23
|
constructor(configDir) {
|
|
8
24
|
this.configDir = configDir;
|
|
25
|
+
this.apiBaseUrl = "https://api.apimatic.io";
|
|
9
26
|
}
|
|
10
27
|
async validateViaFile({ file, commandMetadata, authKey }) {
|
|
28
|
+
var _a;
|
|
11
29
|
const authInfo = await getAuthInfo(this.configDir.toString());
|
|
12
30
|
const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey !== null && authKey !== void 0 ? authKey : null);
|
|
13
31
|
const client = apiClientFactory.createApiClient(authorizationHeader, commandMetadata.shell);
|
|
14
|
-
const controller = new
|
|
32
|
+
const controller = new ApiValidationV2ExternalApisController(client);
|
|
15
33
|
try {
|
|
16
34
|
const fileDescriptor = new FileWrapper(fsExtra.createReadStream(file.toString()));
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
35
|
+
const validation = await controller.validateApiViaFileV2(ContentType.EnumMultipartformdata, fileDescriptor);
|
|
36
|
+
const headerValue = (_a = validation.headers) === null || _a === void 0 ? void 0 : _a["x-unallowed-features"];
|
|
37
|
+
let unallowedFeatures = null;
|
|
38
|
+
if (headerValue) {
|
|
39
|
+
const decodedJson = globalThis.Buffer.from(headerValue, "base64").toString("utf8");
|
|
40
|
+
const parsed = JSON.parse(decodedJson);
|
|
41
|
+
unallowedFeatures = parsed;
|
|
42
|
+
}
|
|
43
|
+
return ok({
|
|
44
|
+
result: validation.result,
|
|
45
|
+
unallowedFeatures
|
|
46
|
+
});
|
|
20
47
|
}
|
|
21
48
|
catch (error) {
|
|
22
49
|
return err(await this.handleValidationErrors(error));
|
|
23
50
|
}
|
|
24
51
|
}
|
|
52
|
+
async stripUnallowedFeatures(specPath, featuresToRemove, authKey) {
|
|
53
|
+
var _a;
|
|
54
|
+
const authInfo = await getAuthInfo(this.configDir.toString());
|
|
55
|
+
const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey !== null && authKey !== void 0 ? authKey : null);
|
|
56
|
+
const formData = new FormData();
|
|
57
|
+
formData.append("file", createReadStream(specPath.toString()));
|
|
58
|
+
formData.append("featuresToRemove", JSON.stringify(featuresToRemove));
|
|
59
|
+
const baseURL = (_a = envInfo.getBaseUrl()) !== null && _a !== void 0 ? _a : this.apiBaseUrl;
|
|
60
|
+
try {
|
|
61
|
+
const response = await axios({
|
|
62
|
+
method: "POST",
|
|
63
|
+
url: `${baseURL}/api-features/strip`,
|
|
64
|
+
data: formData,
|
|
65
|
+
headers: Object.assign(Object.assign({}, formData.getHeaders()), { Authorization: authorizationHeader }),
|
|
66
|
+
responseType: "stream",
|
|
67
|
+
validateStatus: () => true
|
|
68
|
+
});
|
|
69
|
+
if (response.status >= 400) {
|
|
70
|
+
return err(await this.parseErrorResponse(response));
|
|
71
|
+
}
|
|
72
|
+
return ok(response.data);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
return err(handleServiceError(error));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
25
78
|
createAuthorizationHeader(authInfo, overrideAuthKey) {
|
|
26
79
|
const key = overrideAuthKey || (authInfo === null || authInfo === void 0 ? void 0 : authInfo.authKey);
|
|
27
80
|
return `X-Auth-Key ${key !== null && key !== void 0 ? key : ""}`;
|
|
@@ -29,21 +82,61 @@ export class ValidationService {
|
|
|
29
82
|
async handleValidationErrors(error) {
|
|
30
83
|
if (error instanceof ApiError) {
|
|
31
84
|
const apiError = error;
|
|
32
|
-
|
|
33
|
-
|
|
85
|
+
switch (apiError.statusCode) {
|
|
86
|
+
case 400:
|
|
87
|
+
return "Your API Definition is invalid. Please fix the issues and try again.";
|
|
88
|
+
case 401:
|
|
89
|
+
return "You are not authorized to perform this action. Please run 'auth:login' or provide a valid auth key.";
|
|
90
|
+
case 403:
|
|
91
|
+
return "You do not have permission to perform this action.";
|
|
92
|
+
case 500:
|
|
93
|
+
return "An unexpected error occurred validating the API specification, please try again later. If the problem persists, please reach out to our team at support@apimatic.io";
|
|
94
|
+
default:
|
|
95
|
+
return `Error ${apiError.statusCode}: An error occurred during validation.`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return "Unexpected error occurred while validating API specification.";
|
|
99
|
+
}
|
|
100
|
+
async parseErrorResponse(response) {
|
|
101
|
+
var _a, e_1, _b, _c;
|
|
102
|
+
var _d, _e;
|
|
103
|
+
const chunks = [];
|
|
104
|
+
try {
|
|
105
|
+
for (var _f = true, _g = __asyncValues(response.data), _h; _h = await _g.next(), _a = _h.done, !_a; _f = true) {
|
|
106
|
+
_c = _h.value;
|
|
107
|
+
_f = false;
|
|
108
|
+
const chunk = _c;
|
|
109
|
+
chunks.push(Buffer.from(chunk));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
113
|
+
finally {
|
|
114
|
+
try {
|
|
115
|
+
if (!_f && !_a && (_b = _g.return)) await _b.call(_g);
|
|
34
116
|
}
|
|
35
|
-
|
|
36
|
-
|
|
117
|
+
finally { if (e_1) throw e_1.error; }
|
|
118
|
+
}
|
|
119
|
+
const errorBody = Buffer.concat(chunks).toString('utf-8');
|
|
120
|
+
let errorMessage = `Error ${response.status}: Failed to strip unallowed features.`;
|
|
121
|
+
try {
|
|
122
|
+
const errorData = JSON.parse(errorBody);
|
|
123
|
+
if ((_e = (_d = errorData.errors) === null || _d === void 0 ? void 0 : _d.summary) === null || _e === void 0 ? void 0 : _e[0]) {
|
|
124
|
+
errorMessage = errorData.errors.summary[0];
|
|
37
125
|
}
|
|
38
|
-
else if (
|
|
39
|
-
|
|
126
|
+
else if (errorData.message) {
|
|
127
|
+
errorMessage = errorData.message;
|
|
40
128
|
}
|
|
41
|
-
else if (
|
|
42
|
-
|
|
129
|
+
else if (errorData.title) {
|
|
130
|
+
errorMessage = errorData.title;
|
|
43
131
|
}
|
|
44
|
-
return `Error ${apiError.statusCode}: An error occurred during validation.`;
|
|
45
132
|
}
|
|
46
|
-
|
|
133
|
+
catch (_j) {
|
|
134
|
+
errorMessage = errorBody || errorMessage;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
message: errorMessage,
|
|
138
|
+
statusCode: response.status
|
|
139
|
+
};
|
|
47
140
|
}
|
|
48
141
|
}
|
|
49
142
|
//# sourceMappingURL=validation-service.js.map
|