@apimatic/cli 1.1.0-alpha.12 → 1.1.0-alpha.14
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 +22 -45
- package/lib/actions/actionResult.d.ts +8 -0
- package/lib/actions/actionResult.js +25 -0
- package/lib/actions/actionResult.js.map +1 -0
- package/lib/actions/portal/generatePortalAction.d.ts +15 -0
- package/lib/actions/portal/generatePortalAction.js +76 -0
- package/lib/actions/portal/generatePortalAction.js.map +1 -0
- package/lib/actions/portal/recipe/new-recipe.d.ts +3 -2
- package/lib/actions/portal/recipe/new-recipe.js +30 -32
- package/lib/actions/portal/recipe/new-recipe.js.map +1 -1
- package/lib/actions/portal/serve.d.ts +17 -0
- package/lib/actions/portal/serve.js +36 -0
- package/lib/actions/portal/serve.js.map +1 -0
- package/lib/actions/portal/toc/new-toc.d.ts +2 -1
- package/lib/actions/portal/toc/new-toc.js +21 -21
- package/lib/actions/portal/toc/new-toc.js.map +1 -1
- package/lib/application/portal/recipe/recipe-generator.js +1 -1
- package/lib/application/portal/recipe/recipe-generator.js.map +1 -1
- package/lib/application/portal/serve/portal-watcher.d.ts +8 -0
- package/lib/application/portal/serve/portal-watcher.js +60 -0
- package/lib/application/portal/serve/portal-watcher.js.map +1 -0
- package/lib/application/portal/serve/serve-handler.d.ts +16 -0
- package/lib/application/portal/serve/serve-handler.js +90 -0
- package/lib/application/portal/serve/serve-handler.js.map +1 -0
- package/lib/application/portal/serve/watcher-handler.d.ts +5 -0
- package/lib/application/portal/serve/watcher-handler.js +27 -0
- package/lib/application/portal/serve/watcher-handler.js.map +1 -0
- package/lib/application/portal/toc/sdl-parser.d.ts +2 -1
- package/lib/application/portal/toc/sdl-parser.js +4 -4
- package/lib/application/portal/toc/sdl-parser.js.map +1 -1
- package/lib/client-utils/sdk-client.js +5 -22
- package/lib/client-utils/sdk-client.js.map +1 -1
- package/lib/commands/api/transform.js +2 -6
- package/lib/commands/api/transform.js.map +1 -1
- package/lib/commands/api/validate.js +4 -8
- package/lib/commands/api/validate.js.map +1 -1
- package/lib/commands/auth/login.js +31 -33
- package/lib/commands/auth/login.js.map +1 -1
- package/lib/commands/auth/logout.js +1 -5
- package/lib/commands/auth/logout.js.map +1 -1
- package/lib/commands/auth/status.js +1 -5
- package/lib/commands/auth/status.js.map +1 -1
- package/lib/commands/portal/generate.d.ts +7 -9
- package/lib/commands/portal/generate.js +17 -67
- package/lib/commands/portal/generate.js.map +1 -1
- package/lib/commands/portal/quickstart.d.ts +2 -2
- package/lib/commands/portal/quickstart.js +52 -20
- package/lib/commands/portal/quickstart.js.map +1 -1
- package/lib/commands/portal/recipe/new.d.ts +2 -3
- package/lib/commands/portal/recipe/new.js +16 -23
- package/lib/commands/portal/recipe/new.js.map +1 -1
- package/lib/commands/portal/serve.d.ts +7 -5
- package/lib/commands/portal/serve.js +60 -97
- package/lib/commands/portal/serve.js.map +1 -1
- package/lib/commands/portal/toc/new.d.ts +1 -1
- package/lib/commands/portal/toc/new.js +20 -24
- package/lib/commands/portal/toc/new.js.map +1 -1
- package/lib/commands/sdk/generate.js +4 -12
- package/lib/commands/sdk/generate.js.map +1 -1
- package/lib/controllers/api/validate.d.ts +2 -2
- package/lib/controllers/portal/quickstart.d.ts +2 -4
- package/lib/controllers/portal/quickstart.js +4 -63
- package/lib/controllers/portal/quickstart.js.map +1 -1
- package/lib/controllers/sdk/generate.d.ts +3 -3
- package/lib/infrastructure/file-service.d.ts +13 -0
- package/lib/infrastructure/file-service.js +54 -0
- package/lib/infrastructure/file-service.js.map +1 -0
- package/lib/infrastructure/services/portal-service.d.ts +5 -4
- package/lib/infrastructure/services/portal-service.js +28 -42
- package/lib/infrastructure/services/portal-service.js.map +1 -1
- package/lib/infrastructure/zip-service.d.ts +6 -0
- package/lib/infrastructure/zip-service.js +25 -0
- package/lib/infrastructure/zip-service.js.map +1 -0
- package/lib/prompts/portal/common/base-prompts.d.ts +7 -0
- package/lib/prompts/portal/common/base-prompts.js +19 -0
- package/lib/prompts/portal/common/base-prompts.js.map +1 -0
- package/lib/prompts/portal/generate.d.ts +3 -1
- package/lib/prompts/portal/generate.js +29 -16
- package/lib/prompts/portal/generate.js.map +1 -1
- package/lib/prompts/portal/quickstart.d.ts +5 -6
- package/lib/prompts/portal/quickstart.js +29 -21
- package/lib/prompts/portal/quickstart.js.map +1 -1
- package/lib/prompts/portal/recipe/new-recipe.js +4 -5
- package/lib/prompts/portal/recipe/new-recipe.js.map +1 -1
- package/lib/prompts/portal/serve.d.ts +4 -6
- package/lib/prompts/portal/serve.js +24 -15
- package/lib/prompts/portal/serve.js.map +1 -1
- package/lib/prompts/portal/toc/new-toc.js +5 -4
- package/lib/prompts/portal/toc/new-toc.js.map +1 -1
- package/lib/types/file/directoryPath.d.ts +7 -0
- package/lib/types/file/directoryPath.js +16 -0
- package/lib/types/file/directoryPath.js.map +1 -0
- package/lib/types/file/fileName.d.ts +5 -0
- package/lib/types/file/fileName.js +9 -0
- package/lib/types/file/fileName.js.map +1 -0
- package/lib/types/file/filePath.d.ts +8 -0
- package/lib/types/file/filePath.js +11 -0
- package/lib/types/file/filePath.js.map +1 -0
- package/lib/types/portal/quickstart.d.ts +1 -1
- package/lib/types/portal/serve.d.ts +13 -0
- package/lib/types/portal/serve.js +2 -0
- package/lib/types/portal/serve.js.map +1 -0
- package/lib/utils/utils.d.ts +1 -4
- package/lib/utils/utils.js +10 -25
- package/lib/utils/utils.js.map +1 -1
- package/lib/validators/common/directoryValidator.d.ts +3 -7
- package/lib/validators/common/directoryValidator.js +10 -37
- package/lib/validators/common/directoryValidator.js.map +1 -1
- package/lib/validators/portal/serve-validator.d.ts +6 -0
- package/lib/validators/portal/serve-validator.js +15 -0
- package/lib/validators/portal/serve-validator.js.map +1 -0
- package/package.json +5 -2
- package/lib/actions/portal/generate.d.ts +0 -7
- package/lib/actions/portal/generate.js +0 -54
- package/lib/actions/portal/generate.js.map +0 -1
- package/lib/controllers/portal/generate.d.ts +0 -3
- package/lib/controllers/portal/generate.js +0 -106
- package/lib/controllers/portal/generate.js.map +0 -1
- package/lib/controllers/portal/serve.d.ts +0 -3
- package/lib/controllers/portal/serve.js +0 -136
- package/lib/controllers/portal/serve.js.map +0 -1
- package/lib/services/portal/server.d.ts +0 -14
- package/lib/services/portal/server.js +0 -97
- package/lib/services/portal/server.js.map +0 -1
- package/lib/validators/common/portValidator.d.ts +0 -5
- package/lib/validators/common/portValidator.js +0 -16
- package/lib/validators/common/portValidator.js.map +0 -1
- package/lib/validators/portal/serveValidator.d.ts +0 -6
- package/lib/validators/portal/serveValidator.js +0 -17
- package/lib/validators/portal/serveValidator.js.map +0 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import { pipeline } from "stream";
|
|
3
|
+
import { promisify } from "util";
|
|
4
|
+
export class FileService {
|
|
5
|
+
async fileExists(file) {
|
|
6
|
+
try {
|
|
7
|
+
const stat = await fs.stat(file.toString());
|
|
8
|
+
return stat.isFile();
|
|
9
|
+
}
|
|
10
|
+
catch (_a) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async directoryExists(dir) {
|
|
15
|
+
try {
|
|
16
|
+
const stat = await fs.stat(dir.toString());
|
|
17
|
+
return stat.isDirectory();
|
|
18
|
+
}
|
|
19
|
+
catch (_a) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async directoryEmpty(dir) {
|
|
24
|
+
try {
|
|
25
|
+
const files = await fs.readdir(dir.toString());
|
|
26
|
+
return files.length === 0;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return error instanceof Error && 'code' in error && error.code === "ENOENT";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async cleanDirectory(dir) {
|
|
33
|
+
await fs.ensureDir(dir.toString());
|
|
34
|
+
await fs.emptyDir(dir.toString()); // removes everything inside, keeps the dir
|
|
35
|
+
}
|
|
36
|
+
async deleteFile(filePath) {
|
|
37
|
+
const exists = await this.fileExists(filePath);
|
|
38
|
+
if (exists) {
|
|
39
|
+
await fs.remove(filePath.toString());
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async getStream(filePath) {
|
|
43
|
+
return fs.createReadStream(filePath.toString());
|
|
44
|
+
}
|
|
45
|
+
async writeFile(filePath, stream) {
|
|
46
|
+
const writeStream = fs.createWriteStream(filePath.toString());
|
|
47
|
+
await streamPipeline(stream, writeStream);
|
|
48
|
+
}
|
|
49
|
+
async copy(source, destination) {
|
|
50
|
+
await fs.copyFile(source.toString(), destination.toString());
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const streamPipeline = promisify(pipeline);
|
|
54
|
+
//# sourceMappingURL=file-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-service.js","sourceRoot":"","sources":["../../src/infrastructure/file-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,OAAO,WAAW;IACf,KAAK,CAAC,UAAU,CAAC,IAAc;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,GAAkB;QAC7C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,GAAkB;QAC5C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC9E,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,GAAkB;QAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,2CAA2C;IAChF,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,QAAkB;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,QAAkB;QACvC,OAAO,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,QAAkB,EAAE,MAA6B;QACtE,MAAM,WAAW,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9D,MAAM,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAgB,EAAE,WAAqB;QACvD,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { GeneratePortalParams } from "../../types/portal/generate.js";
|
|
2
1
|
import { Result } from "../../types/common/result.js";
|
|
3
2
|
import { Sdl } from "../../types/sdl/sdl.js";
|
|
3
|
+
import { FilePath } from "../../types/file/filePath.js";
|
|
4
|
+
import { DirectoryPath } from "../../types/file/directoryPath.js";
|
|
4
5
|
export declare class PortalService {
|
|
5
6
|
private readonly CONTENT_TYPE;
|
|
6
7
|
private readonly TIMEOUT;
|
|
7
|
-
|
|
8
|
+
private readonly fileService;
|
|
9
|
+
generatePortal(buildPath: FilePath, configDir: DirectoryPath, authKey: string | null): Promise<Result<NodeJS.ReadableStream, string | NodeJS.ReadableStream>>;
|
|
8
10
|
generateSdl(specPath: string, configDir: string): Promise<Result<Sdl, string>>;
|
|
9
11
|
private createGenericErrorResult;
|
|
10
12
|
private createAuthorizationHeader;
|
|
13
|
+
private getUserAgent;
|
|
11
14
|
private createApiClient;
|
|
12
|
-
private generatePortalFromSyncEndpoint;
|
|
13
15
|
private handlePortalGenerationErrors;
|
|
14
16
|
private parseErrorResponse;
|
|
15
|
-
private saveAndExtractErrorZipFile;
|
|
16
17
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
import * as path from "path";
|
|
1
|
+
import * as os from "os";
|
|
2
|
+
import fs from "fs-extra";
|
|
4
3
|
import { ContentType, DocsPortalManagementController, Client, UnauthorizedResponseError, ProblemDetailsError, FileWrapper, ApiError, TransformationController, ExportFormats, InternalServerErrorResponseError } from "@apimatic/sdk";
|
|
5
4
|
import { getAuthInfo } from "../../client-utils/auth-manager.js";
|
|
6
5
|
import { Result } from "../../types/common/result.js";
|
|
7
|
-
import { getMessageInRedColor, parseStreamBodyToJson
|
|
6
|
+
import { getMessageInRedColor, parseStreamBodyToJson } from "../../utils/utils.js";
|
|
7
|
+
import { FileService } from "../file-service.js";
|
|
8
8
|
export class PortalService {
|
|
9
9
|
constructor() {
|
|
10
10
|
this.CONTENT_TYPE = ContentType.EnumMultipartformdata;
|
|
11
11
|
this.TIMEOUT = 0;
|
|
12
|
+
this.fileService = new FileService();
|
|
12
13
|
this.createAuthorizationHeader = (authInfo, overrideAuthKey) => {
|
|
13
14
|
const key = overrideAuthKey || (authInfo === null || authInfo === void 0 ? void 0 : authInfo.authKey);
|
|
14
15
|
return `X-Auth-Key ${key !== null && key !== void 0 ? key : ""}`;
|
|
@@ -18,15 +19,11 @@ export class PortalService {
|
|
|
18
19
|
customHeaderAuthenticationCredentials: {
|
|
19
20
|
Authorization: authorizationHeader
|
|
20
21
|
},
|
|
22
|
+
userAgent: this.getUserAgent(),
|
|
21
23
|
timeout: this.TIMEOUT
|
|
22
24
|
});
|
|
23
25
|
};
|
|
24
|
-
this.
|
|
25
|
-
const file = new FileWrapper(fs.createReadStream(zippedBuildFilePath));
|
|
26
|
-
const response = await docsPortalManagementController.generateOnPremPortalViaBuildInput(this.CONTENT_TYPE, file);
|
|
27
|
-
return response.result;
|
|
28
|
-
};
|
|
29
|
-
this.handlePortalGenerationErrors = async (error, params) => {
|
|
26
|
+
this.handlePortalGenerationErrors = async (error) => {
|
|
30
27
|
var _a;
|
|
31
28
|
if (error instanceof UnauthorizedResponseError) {
|
|
32
29
|
//401
|
|
@@ -41,15 +38,15 @@ export class PortalService {
|
|
|
41
38
|
}
|
|
42
39
|
else if (error instanceof ApiError && error.statusCode === 422) {
|
|
43
40
|
//422
|
|
44
|
-
return
|
|
41
|
+
return error.body;
|
|
45
42
|
}
|
|
46
43
|
else if (error instanceof InternalServerErrorResponseError) {
|
|
47
44
|
//500
|
|
48
45
|
const body = await this.parseErrorResponse(error);
|
|
49
|
-
return getMessageInRedColor(`${body.message} Please try again or reach out to our team at support@apimatic.io for help if your problem persists.`);
|
|
46
|
+
return getMessageInRedColor(`${body.message} Please try again later or reach out to our team at support@apimatic.io for help if your problem persists.`);
|
|
50
47
|
}
|
|
51
48
|
else {
|
|
52
|
-
return getMessageInRedColor(error
|
|
49
|
+
return getMessageInRedColor("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");
|
|
53
50
|
}
|
|
54
51
|
};
|
|
55
52
|
this.parseErrorResponse = async (error) => {
|
|
@@ -59,44 +56,27 @@ export class PortalService {
|
|
|
59
56
|
}
|
|
60
57
|
throw error;
|
|
61
58
|
};
|
|
62
|
-
this.saveAndExtractErrorZipFile = async (error, params) => {
|
|
63
|
-
const data = error.body;
|
|
64
|
-
const writeStream = fs.createWriteStream(params.generatedPortalArtifactsZipFilePath);
|
|
65
|
-
//TODO: Extract zip to temp folder and only copy the the debug report.
|
|
66
|
-
return await new Promise((resolve, reject) => {
|
|
67
|
-
data
|
|
68
|
-
.pipe(writeStream)
|
|
69
|
-
.on("finish", async () => {
|
|
70
|
-
await extractZipFile(params.generatedPortalArtifactsZipFilePath, params.generatedPortalArtifactsFolderPath);
|
|
71
|
-
await deleteFile(params.generatedPortalArtifactsZipFilePath);
|
|
72
|
-
await deleteFile(path.join(params.generatedPortalArtifactsFolderPath, "static"));
|
|
73
|
-
resolve(getMessageInRedColor("An error occurred during portal generation due to an issue with the input. An error report has been written at the destination path: " +
|
|
74
|
-
path.join(params.generatedPortalArtifactsFolderPath, "apimatic-debug")));
|
|
75
|
-
})
|
|
76
|
-
.on("error", async () => {
|
|
77
|
-
reject(getMessageInRedColor("An error occurred during portal generation due to an issue with the input. The error report could not be generated. Please try again later."));
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
59
|
}
|
|
82
|
-
async
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
const authorizationHeader = this.createAuthorizationHeader(authInfo, params.overrideAuthKey);
|
|
60
|
+
async generatePortal(buildPath, configDir, authKey) {
|
|
61
|
+
const buildFileStream = await this.fileService.getStream(buildPath);
|
|
62
|
+
const file = new FileWrapper(buildFileStream);
|
|
63
|
+
const authInfo = await getAuthInfo(configDir.toString());
|
|
64
|
+
const authorizationHeader = this.createAuthorizationHeader(authInfo, authKey);
|
|
88
65
|
const client = this.createApiClient(authorizationHeader);
|
|
89
66
|
const docsPortalManagementController = new DocsPortalManagementController(client);
|
|
90
67
|
try {
|
|
91
|
-
const
|
|
92
|
-
return Result.success(
|
|
68
|
+
const response = await docsPortalManagementController.generateOnPremPortalViaBuildInput(this.CONTENT_TYPE, file);
|
|
69
|
+
return Result.success(response.result);
|
|
93
70
|
}
|
|
94
71
|
catch (error) {
|
|
95
|
-
return Result.failure(await this.handlePortalGenerationErrors(error
|
|
72
|
+
return Result.failure(await this.handlePortalGenerationErrors(error));
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
buildFileStream.close();
|
|
96
76
|
}
|
|
97
77
|
}
|
|
98
78
|
async generateSdl(specPath, configDir) {
|
|
99
|
-
if (!(await
|
|
79
|
+
if (!(await fs.pathExists(specPath))) {
|
|
100
80
|
return Result.failure("Spec file doesn't exist");
|
|
101
81
|
}
|
|
102
82
|
const authInfo = await getAuthInfo(configDir);
|
|
@@ -125,5 +105,11 @@ export class PortalService {
|
|
|
125
105
|
createGenericErrorResult() {
|
|
126
106
|
return Result.failure("An unexpected error occurred");
|
|
127
107
|
}
|
|
108
|
+
getUserAgent() {
|
|
109
|
+
const osInfo = `${os.platform()} ${os.release()}`;
|
|
110
|
+
const engine = "Node.js";
|
|
111
|
+
const engineVersion = process.version;
|
|
112
|
+
return `APIMATIC CLI - [OS: ${osInfo}, Engine: ${engine}/${engineVersion}]`;
|
|
113
|
+
}
|
|
128
114
|
}
|
|
129
115
|
//# sourceMappingURL=portal-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/portal-service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"portal-service.js","sourceRoot":"","sources":["../../../src/infrastructure/services/portal-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DirectoryPath } from "../types/file/directoryPath.js";
|
|
2
|
+
import { FilePath } from "../types/file/filePath.js";
|
|
3
|
+
export declare class ZipService {
|
|
4
|
+
archive(sourceDir: DirectoryPath, outputZipPath: FilePath): Promise<void>;
|
|
5
|
+
unArchive(sourceFile: FilePath, destinationDirectory: DirectoryPath): Promise<void>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import archiver from "archiver";
|
|
3
|
+
import unzipper from "unzipper";
|
|
4
|
+
export class ZipService {
|
|
5
|
+
async archive(sourceDir, outputZipPath) {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
const output = fs.createWriteStream(outputZipPath.toString());
|
|
8
|
+
const archive = archiver("zip");
|
|
9
|
+
output.on("close", () => resolve());
|
|
10
|
+
archive.on("error", (err) => reject(err));
|
|
11
|
+
archive.pipe(output);
|
|
12
|
+
archive.directory(sourceDir.toString(), false); // false: don't nest under folder
|
|
13
|
+
archive.finalize();
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async unArchive(sourceFile, destinationDirectory) {
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
fs.createReadStream(sourceFile.toString())
|
|
19
|
+
.pipe(unzipper.Extract({ path: destinationDirectory.toString() }))
|
|
20
|
+
.on("close", () => resolve())
|
|
21
|
+
.on("error", (err) => reject(err));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=zip-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-service.js","sourceRoot":"","sources":["../../src/infrastructure/zip-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAIhC,MAAM,OAAO,UAAU;IACd,KAAK,CAAC,OAAO,CAAC,SAAwB,EAAE,aAAuB;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEhC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAE1C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,iCAAiC;YACjF,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAoB,EAAE,oBAAmC;QACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;iBACvC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;iBACjE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;iBAC5B,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare abstract class BasePrompts {
|
|
2
|
+
protected readonly spin: import("@clack/prompts").SpinnerResult;
|
|
3
|
+
startProgressIndicator(message: string): void;
|
|
4
|
+
stopProgressIndicator(message: string): void;
|
|
5
|
+
displayInfo(message: string): void;
|
|
6
|
+
logError(errorMessage: string): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { log, outro, spinner } from "@clack/prompts";
|
|
2
|
+
export class BasePrompts {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.spin = spinner();
|
|
5
|
+
}
|
|
6
|
+
startProgressIndicator(message) {
|
|
7
|
+
this.spin.start(message);
|
|
8
|
+
}
|
|
9
|
+
stopProgressIndicator(message) {
|
|
10
|
+
this.spin.stop(message);
|
|
11
|
+
}
|
|
12
|
+
displayInfo(message) {
|
|
13
|
+
log.step(message);
|
|
14
|
+
}
|
|
15
|
+
logError(errorMessage) {
|
|
16
|
+
outro(errorMessage);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=base-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-prompts.js","sourceRoot":"","sources":["../../../../src/prompts/portal/common/base-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,OAAgB,WAAW;IAAjC;QACuB,SAAI,GAAG,OAAO,EAAE,CAAC;IAiBxC,CAAC;IAfU,sBAAsB,CAAC,OAAe;QACzC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEM,qBAAqB,CAAC,OAAe;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAEM,WAAW,CAAC,OAAe;QAC9B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAEM,QAAQ,CAAC,YAAoB;QAChC,KAAK,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;CACJ"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { DirectoryPath } from "../../types/file/directoryPath.js";
|
|
1
2
|
export declare class PortalGeneratePrompts {
|
|
2
3
|
private readonly spin;
|
|
3
|
-
|
|
4
|
+
overwritePortal(directory: DirectoryPath): Promise<boolean>;
|
|
4
5
|
existingDestinationPortalZipPrompt(): Promise<boolean>;
|
|
5
6
|
displayPortalGenerationMessage(): void;
|
|
6
7
|
displayPortalGenerationSuccessMessage(): void;
|
|
7
8
|
displayPortalGenerationErrorMessage(): void;
|
|
8
9
|
displayOutroMessage(generatedPortalPath: string): void;
|
|
9
10
|
logError(error: string): void;
|
|
11
|
+
private cleanUpStandardInput;
|
|
10
12
|
}
|
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
import { cancel, outro, select, spinner, isCancel } from "@clack/prompts";
|
|
2
|
-
import { getMessageInRedColor } from "../../utils/utils.js";
|
|
2
|
+
import { getMessageInCyanColor, getMessageInMagentaColor, getMessageInRedColor } from "../../utils/utils.js";
|
|
3
3
|
export class PortalGeneratePrompts {
|
|
4
4
|
constructor() {
|
|
5
5
|
this.spin = spinner();
|
|
6
6
|
}
|
|
7
|
-
async
|
|
8
|
-
const
|
|
9
|
-
message:
|
|
7
|
+
async overwritePortal(directory) {
|
|
8
|
+
const overwrite = await select({
|
|
9
|
+
message: `⚠️ The destination '${directory}' is not empty, do you want to overwrite?`,
|
|
10
10
|
options: [
|
|
11
|
-
{ value:
|
|
12
|
-
{ value:
|
|
13
|
-
]
|
|
11
|
+
{ value: true, label: "Yes" },
|
|
12
|
+
{ value: false, label: "No" }
|
|
13
|
+
],
|
|
14
|
+
initialValue: false
|
|
14
15
|
});
|
|
15
|
-
if (isCancel(
|
|
16
|
+
if (isCancel(overwrite)) {
|
|
16
17
|
cancel("Operation cancelled.");
|
|
17
|
-
|
|
18
|
+
process.exit(1);
|
|
18
19
|
}
|
|
19
|
-
if (
|
|
20
|
-
|
|
20
|
+
if (overwrite) {
|
|
21
|
+
return true;
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
+
outro("Please enter a different destination folder or remove the existing files and try again.");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
// TODO: it should return false (no process exit);
|
|
23
26
|
}
|
|
24
27
|
async existingDestinationPortalZipPrompt() {
|
|
25
28
|
const useExistingZip = await select({
|
|
26
|
-
message:
|
|
29
|
+
message: `⚠️ A zip file already exists at the specified destination path, do you want to overwrite it?`,
|
|
27
30
|
options: [
|
|
28
31
|
{ value: "yes", label: "Yes" },
|
|
29
32
|
{ value: "no", label: "No" }
|
|
30
|
-
]
|
|
33
|
+
],
|
|
34
|
+
initialValue: "no"
|
|
31
35
|
});
|
|
32
36
|
if (isCancel(useExistingZip)) {
|
|
33
37
|
cancel("Operation cancelled.");
|
|
@@ -39,13 +43,15 @@ export class PortalGeneratePrompts {
|
|
|
39
43
|
return useExistingZip === "yes";
|
|
40
44
|
}
|
|
41
45
|
displayPortalGenerationMessage() {
|
|
42
|
-
this.spin.start("Generating portal
|
|
46
|
+
this.spin.start(getMessageInMagentaColor("Generating portal"));
|
|
43
47
|
}
|
|
44
48
|
displayPortalGenerationSuccessMessage() {
|
|
45
|
-
this.spin.stop("✅
|
|
49
|
+
this.spin.stop(getMessageInCyanColor("✅ Portal generated successfully."));
|
|
50
|
+
this.cleanUpStandardInput();
|
|
46
51
|
}
|
|
47
52
|
displayPortalGenerationErrorMessage() {
|
|
48
53
|
this.spin.stop(getMessageInRedColor(`Portal Generation failed.`));
|
|
54
|
+
this.cleanUpStandardInput();
|
|
49
55
|
}
|
|
50
56
|
displayOutroMessage(generatedPortalPath) {
|
|
51
57
|
outro(`The generated portal can be found at ${generatedPortalPath}`);
|
|
@@ -53,5 +59,12 @@ export class PortalGeneratePrompts {
|
|
|
53
59
|
logError(error) {
|
|
54
60
|
outro(error);
|
|
55
61
|
}
|
|
62
|
+
//This clears the standard input to allow interrupts like CTRL+C to work properly.
|
|
63
|
+
cleanUpStandardInput() {
|
|
64
|
+
if (process.stdin.isTTY) {
|
|
65
|
+
process.stdin.setRawMode(false);
|
|
66
|
+
process.stdin.pause();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
56
69
|
}
|
|
57
70
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/prompts/portal/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/prompts/portal/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG7G,MAAM,OAAO,qBAAqB;IAAlC;QACmB,SAAI,GAAG,OAAO,EAAE,CAAC;IA8EpC,CAAC;IA5EQ,KAAK,CAAC,eAAe,CAAC,SAAwB;QACnD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC;YAC7B,OAAO,EAAE,wBAAwB,SAAS,2CAA2C;YACrF,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;aAC9B;YACD,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,yFAAyF,CAAC,CAAC;QACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhB,kDAAkD;IACpD,CAAC;IAED,KAAK,CAAC,kCAAkC;QACtC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC;YAClC,OAAO,EAAE,+FAA+F;YACxG,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC9B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;aAC7B;YACD,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC/B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,0FAA0F,CAAC,CAAC;QACpG,CAAC;QAED,OAAO,cAAc,KAAK,KAAK,CAAC;IAClC,CAAC;IAED,8BAA8B;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,qCAAqC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,mCAAmC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,mBAAmB,CAAC,mBAA2B;QAC7C,KAAK,CAAC,wCAAwC,mBAAmB,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,kFAAkF;IAC1E,oBAAoB;QAC1B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { BasePrompts } from "./common/base-prompts.js";
|
|
2
|
+
export declare class PortalQuickstartPrompts extends BasePrompts {
|
|
3
3
|
private readonly vscodeExtensionUrl;
|
|
4
4
|
private readonly serverUrl;
|
|
5
5
|
private readonly referenceDocumentationUrl;
|
|
@@ -13,6 +13,7 @@ export declare class PortalQuickstartPrompts {
|
|
|
13
13
|
displayLoggingInMessage(): void;
|
|
14
14
|
displayLoggingInErrorMessage(): void;
|
|
15
15
|
displayLoggedInMessage(): void;
|
|
16
|
+
removeQuotes(str: string): string;
|
|
16
17
|
specPrompt(): Promise<string>;
|
|
17
18
|
displaySpecValidationMessage(): void;
|
|
18
19
|
displaySpecValidationSuccessMessage(): void;
|
|
@@ -20,12 +21,10 @@ export declare class PortalQuickstartPrompts {
|
|
|
20
21
|
displaySpecValidationFailureMessage(): void;
|
|
21
22
|
specValidationFailurePrompt(): Promise<void>;
|
|
22
23
|
sdkLanguagesPrompt(): Promise<string[]>;
|
|
23
|
-
|
|
24
|
+
workingDirectoryPrompt(): Promise<string>;
|
|
24
25
|
displayBuildDirectoryGenerationMessage(): void;
|
|
25
26
|
displayBuildDirectoryGenerationErrorMessage(): void;
|
|
26
27
|
displayBuildDirectoryGenerationSuccessMessage(targetFolder: string): void;
|
|
27
28
|
displayBuildDirectoryAsTree(targetFolder: string): void;
|
|
28
|
-
|
|
29
|
-
displayPortalGenerationSuccessMessage(): void;
|
|
30
|
-
displayOutroMessage(directory: string): void;
|
|
29
|
+
displayOutroMessage(buildDirectory: string): void;
|
|
31
30
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import treeify from "treeify";
|
|
4
|
-
import { intro, outro, text,
|
|
4
|
+
import { intro, outro, text, select, multiselect, log, isCancel, cancel, password } from "@clack/prompts";
|
|
5
5
|
import { getMessageInCyanColor, getMessageInGreenColor, getMessageInOrangeColor, getMessageInMagentaColor, getMessageInRedColor, isValidUrl, directoryToJson } from "../../utils/utils.js";
|
|
6
|
-
|
|
6
|
+
import { BasePrompts } from "./common/base-prompts.js";
|
|
7
|
+
export class PortalQuickstartPrompts extends BasePrompts {
|
|
7
8
|
constructor() {
|
|
8
|
-
|
|
9
|
+
super(...arguments);
|
|
9
10
|
this.vscodeExtensionUrl = "\u001b[4mhttps://marketplace.visualstudio.com/items?itemName=apimatic-developers.apimatic-for-vscode\u001b[0m";
|
|
10
11
|
this.serverUrl = "\u001b[4mhttp://localhost:3000\u001b[0m";
|
|
11
12
|
this.referenceDocumentationUrl = "\u001b[4mhttps://docs.apimatic.io/platform-api/#/http/guides/generating-on-prem-api-portal/overview-generating-api-portal\u001b[0m";
|
|
@@ -58,18 +59,29 @@ export class PortalQuickstartPrompts {
|
|
|
58
59
|
displayLoggedInMessage() {
|
|
59
60
|
this.spin.stop(getMessageInCyanColor("✅ Login successful!"));
|
|
60
61
|
}
|
|
62
|
+
removeQuotes(str) {
|
|
63
|
+
const quotes = ['"', "'"];
|
|
64
|
+
for (const quote of quotes) {
|
|
65
|
+
if (str.startsWith(quote) && str.endsWith(quote) && str.length > 1) {
|
|
66
|
+
return str.slice(1, -1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return str;
|
|
70
|
+
}
|
|
61
71
|
async specPrompt() {
|
|
62
72
|
log.step(getMessageInOrangeColor(`Step 1 of 4: Import your OpenAPI Definition`));
|
|
63
73
|
const spec = await text({
|
|
64
|
-
message: `Provide a local path or a public URL for your OpenAPI
|
|
65
|
-
placeholder: "
|
|
66
|
-
defaultValue: "",
|
|
74
|
+
message: `Provide a local path or a public URL for your OpenAPI definition file:`,
|
|
75
|
+
placeholder: "Provide absolute URL/local path or press Enter to use sample OpenAPI file from APIMatic.",
|
|
76
|
+
defaultValue: "https://raw.githubusercontent.com/apimatic/static-portal-workflow/refs/heads/master/spec/Apimatic-Calculator.json",
|
|
67
77
|
validate: (input) => {
|
|
78
|
+
var _a;
|
|
68
79
|
if (!input)
|
|
69
80
|
return;
|
|
70
81
|
if (isValidUrl(input))
|
|
71
82
|
return;
|
|
72
|
-
const
|
|
83
|
+
const cleanedPath = this.removeQuotes((_a = input.trim()) !== null && _a !== void 0 ? _a : "");
|
|
84
|
+
const dirPath = path.resolve(cleanedPath);
|
|
73
85
|
if (fs.existsSync(dirPath)) {
|
|
74
86
|
if (fs.statSync(dirPath).isFile()) {
|
|
75
87
|
return;
|
|
@@ -140,14 +152,16 @@ export class PortalQuickstartPrompts {
|
|
|
140
152
|
}
|
|
141
153
|
return languages;
|
|
142
154
|
}
|
|
143
|
-
async
|
|
155
|
+
async workingDirectoryPrompt() {
|
|
144
156
|
log.step(getMessageInOrangeColor(`Step 4 of 4: Generate source files for Docs as Code`));
|
|
145
157
|
const directory = await text({
|
|
146
|
-
message: "Enter the directory path where you would like to setup the API Portal :",
|
|
147
|
-
placeholder: "
|
|
158
|
+
message: "Enter the directory path where you would like to setup the API Portal (Requires an empty directory):",
|
|
159
|
+
placeholder: "Provide absolute path to the directory or press Enter to use the current directory.",
|
|
148
160
|
defaultValue: "./",
|
|
149
161
|
validate: (input) => {
|
|
150
|
-
|
|
162
|
+
var _a;
|
|
163
|
+
const cleanedPath = this.removeQuotes((_a = input === null || input === void 0 ? void 0 : input.trim()) !== null && _a !== void 0 ? _a : "");
|
|
164
|
+
const dirPath = path.resolve(cleanedPath);
|
|
151
165
|
if (!fs.existsSync(dirPath) && dirPath != this.defaultPortalDirectoryPath) {
|
|
152
166
|
return getMessageInRedColor("Error: The specified directory path does not exist. Please try again.");
|
|
153
167
|
}
|
|
@@ -174,7 +188,7 @@ export class PortalQuickstartPrompts {
|
|
|
174
188
|
}
|
|
175
189
|
}
|
|
176
190
|
displayBuildDirectoryGenerationMessage() {
|
|
177
|
-
this.spin.start(getMessageInMagentaColor("Generating build directory
|
|
191
|
+
this.spin.start(getMessageInMagentaColor("Generating build directory ⚙️"));
|
|
178
192
|
}
|
|
179
193
|
displayBuildDirectoryGenerationErrorMessage() {
|
|
180
194
|
this.spin.stop(getMessageInRedColor(`Something went wrong while setting up your build directory.`));
|
|
@@ -189,17 +203,11 @@ export class PortalQuickstartPrompts {
|
|
|
189
203
|
.split("\n")
|
|
190
204
|
.map((line) => line.replace(/#.*/, (match) => getMessageInGreenColor(match)))
|
|
191
205
|
.join("\n");
|
|
192
|
-
log.
|
|
193
|
-
}
|
|
194
|
-
displayPortalGenerationMessage() {
|
|
195
|
-
this.spin.start(getMessageInMagentaColor("Setting up portal"));
|
|
196
|
-
}
|
|
197
|
-
displayPortalGenerationSuccessMessage() {
|
|
198
|
-
this.spin.stop(getMessageInCyanColor("✅ Portal setup complete!"));
|
|
206
|
+
log.step(coloredLogString);
|
|
199
207
|
}
|
|
200
|
-
displayOutroMessage(
|
|
208
|
+
displayOutroMessage(buildDirectory) {
|
|
201
209
|
log.step(getMessageInCyanColor(`📢 Your API Portal is live at: ${this.serverUrl}\n`) +
|
|
202
|
-
getMessageInCyanColor(`Hot reload enabled! Edit files in ${
|
|
210
|
+
getMessageInCyanColor(`Hot reload enabled! Edit files in ${buildDirectory} to see changes instantly reflected in your API Portal.\n`) +
|
|
203
211
|
getMessageInCyanColor(`Press CTRL+C to stop the server.`));
|
|
204
212
|
outro(getMessageInCyanColor(`What's next?\n`) +
|
|
205
213
|
getMessageInCyanColor(`- Check out the Interactive Playground in your API Portal.\n`) +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quickstart.js","sourceRoot":"","sources":["../../../src/prompts/portal/quickstart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"quickstart.js","sourceRoot":"","sources":["../../../src/prompts/portal/quickstart.ts"],"names":[],"mappings":"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"}
|