@apimatic/cli 1.1.0-alpha.7 → 1.1.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +85 -47
  2. package/lib/actions/portal/generate.d.ts +7 -0
  3. package/lib/actions/portal/generate.js +58 -0
  4. package/lib/actions/portal/toc/new-toc.d.ts +17 -0
  5. package/lib/actions/portal/toc/new-toc.js +134 -0
  6. package/lib/application/portal/toc/sdl-parser.d.ts +13 -0
  7. package/lib/application/portal/toc/sdl-parser.js +53 -0
  8. package/lib/application/portal/toc/toc-content-parser.d.ts +5 -0
  9. package/lib/application/portal/toc/toc-content-parser.js +46 -0
  10. package/lib/application/portal/toc/toc-structure-generator.d.ts +6 -0
  11. package/lib/application/portal/toc/toc-structure-generator.js +88 -0
  12. package/lib/client-utils/sdk-client.js +7 -3
  13. package/lib/commands/api/transform.js +3 -3
  14. package/lib/commands/api/validate.js +1 -1
  15. package/lib/commands/portal/generate.d.ts +6 -1
  16. package/lib/commands/portal/generate.js +58 -75
  17. package/lib/commands/portal/quickstart.js +21 -25
  18. package/lib/commands/portal/serve.d.ts +0 -1
  19. package/lib/commands/portal/serve.js +4 -10
  20. package/lib/commands/portal/toc/new.d.ts +15 -0
  21. package/lib/commands/portal/toc/new.js +65 -0
  22. package/lib/commands/sdk/generate.js +4 -4
  23. package/lib/controllers/api/transform.js +9 -6
  24. package/lib/controllers/api/validate.d.ts +2 -2
  25. package/lib/controllers/api/validate.js +8 -16
  26. package/lib/controllers/portal/generate.d.ts +2 -2
  27. package/lib/controllers/portal/generate.js +101 -49
  28. package/lib/controllers/portal/quickstart.d.ts +3 -3
  29. package/lib/controllers/portal/quickstart.js +60 -8
  30. package/lib/controllers/portal/serve.d.ts +1 -2
  31. package/lib/controllers/portal/serve.js +13 -27
  32. package/lib/controllers/sdk/generate.d.ts +3 -3
  33. package/lib/controllers/sdk/generate.js +5 -6
  34. package/lib/infrastructure/services/portal-service.d.ts +16 -0
  35. package/lib/infrastructure/services/portal-service.js +133 -0
  36. package/lib/prompts/portal/generate.d.ts +10 -0
  37. package/lib/prompts/portal/generate.js +62 -0
  38. package/lib/prompts/portal/quickstart.d.ts +4 -5
  39. package/lib/prompts/portal/quickstart.js +16 -17
  40. package/lib/prompts/portal/toc/new-toc.d.ts +10 -0
  41. package/lib/prompts/portal/toc/new-toc.js +46 -0
  42. package/lib/services/portal/server.d.ts +5 -2
  43. package/lib/services/portal/server.js +57 -27
  44. package/lib/types/api/transform.d.ts +16 -0
  45. package/lib/types/api/transform.js +19 -2
  46. package/lib/types/common/result.d.ts +17 -0
  47. package/lib/types/common/result.js +36 -0
  48. package/lib/types/portal/generate.d.ts +26 -9
  49. package/lib/types/portal/generate.js +2 -1
  50. package/lib/types/sdk/generate.d.ts +3 -2
  51. package/lib/types/sdk/generate.js +3 -2
  52. package/lib/types/sdl/sdl.d.ts +11 -0
  53. package/lib/types/sdl/sdl.js +3 -0
  54. package/lib/types/toc/toc.d.ts +31 -0
  55. package/lib/types/toc/toc.js +10 -0
  56. package/lib/utils/utils.d.ts +2 -0
  57. package/lib/utils/utils.js +37 -14
  58. package/lib/validators/common/directoryValidator.js +4 -4
  59. package/package.json +12 -9
package/README.md CHANGED
@@ -17,10 +17,6 @@ To get started with APIMatic's CLI using a step by step wizard, run the followin
17
17
  $ apimatic portal:quickstart
18
18
  ```
19
19
 
20
- <!-- toc -->
21
- * [Usage](#usage)
22
- * [Commands](#commands)
23
- <!-- tocstop -->
24
20
  # Usage
25
21
  <!-- usage -->
26
22
  ```sh-session
@@ -28,7 +24,7 @@ $ npm install -g @apimatic/cli
28
24
  $ apimatic COMMAND
29
25
  running command...
30
26
  $ apimatic (--version)
31
- @apimatic/cli/0.0.0-alpha.0 win32-x64 node-v20.18.3
27
+ @apimatic/cli/1.1.0-alpha.8 win32-x64 node-v23.4.0
32
28
  $ apimatic --help [COMMAND]
33
29
  USAGE
34
30
  $ apimatic COMMAND
@@ -46,6 +42,7 @@ USAGE
46
42
  * [`apimatic autocomplete [SHELL]`](#apimatic-autocomplete-shell)
47
43
  * [`apimatic help [COMMAND]`](#apimatic-help-command)
48
44
  * [`apimatic portal:generate`](#apimatic-portalgenerate)
45
+ * [`apimatic portal:toc:new`](#apimatic-portaltocnew)
49
46
  * [`apimatic portal:quickstart`](#apimatic-portalquickstart)
50
47
  * [`apimatic portal:serve`](#apimatic-portalserve)
51
48
  * [`apimatic sdk:generate`](#apimatic-sdkgenerate)
@@ -61,18 +58,13 @@ USAGE
61
58
 
62
59
  FLAGS
63
60
  -f, --force overwrite if same file exist in the destination
64
- --auth-key=auth-key override current authentication state with an authentication key
65
-
66
- --destination=destination [default: /home/runner/work/apimatic-cli/apimatic-cli/cli] directory to download
67
- transformed file to
68
-
69
- --file=file path to the API specification file to transform
70
-
71
- --format=format (required) specification format to transform API specification into
61
+ --auth-key=<value> override current authentication state with an authentication key
62
+ --destination=<value> [default: ./] directory to download transformed file to
63
+ --file=<value> path to the API specification file to transform
64
+ --format=<value> (required) specification format to transform API specification into
72
65
  APIMATIC|WADL2009|WSDL|SWAGGER10|SWAGGER20|SWAGGERYAML|OAS3|OPENAPI3YAML|APIBLUEPRINT|RAML|
73
66
  RAML10|POSTMAN10|POSTMAN20|GRAPHQLSCHEMA
74
-
75
- --url=url URL to the API specification file to transform. Can be used in place of the --file option
67
+ --url=<value> URL to the API specification file to transform. Can be used in place of the --file option
76
68
  if the API specification is publicly available.
77
69
 
78
70
  DESCRIPTION
@@ -99,11 +91,10 @@ USAGE
99
91
  $ apimatic api:validate [--file <value>] [--url <value>] [--auth-key <value>]
100
92
 
101
93
  FLAGS
102
- --auth-key=auth-key override current authentication state with an authentication key
103
- --file=file Path to the API specification file to validate
104
-
105
- --url=url URL to the specification file to validate. Can be used in place of the --file option if the API
106
- specification is publicly available.
94
+ --auth-key=<value> override current authentication state with an authentication key
95
+ --file=<value> Path to the API specification file to validate
96
+ --url=<value> URL to the specification file to validate. Can be used in place of the --file option if the API
97
+ specification is publicly available.
107
98
 
108
99
  DESCRIPTION
109
100
  Validate the syntactic and semantic correctness of an API specification
@@ -127,16 +118,15 @@ USAGE
127
118
  $ apimatic auth:login [--auth-key <value>]
128
119
 
129
120
  FLAGS
130
- --auth-key=auth-key Set authentication key for all commands
121
+ --auth-key=<value> Set authentication key for all commands
131
122
 
132
123
  DESCRIPTION
133
124
  Login using your APIMatic credentials or an API Key
134
125
 
135
126
  EXAMPLES
136
127
  $ apimatic auth:login
137
- Please enter your registered email: apimatic-user@gmail.com
128
+ Enter your registered email: apimatic-user@gmail.com
138
129
  Please enter your password: *********
139
-
140
130
  You have successfully logged into APIMatic
141
131
 
142
132
  $ apimatic auth:login --auth-key=xxxxxx
@@ -213,10 +203,13 @@ Display help for apimatic.
213
203
 
214
204
  ```
215
205
  USAGE
216
- $ apimatic help [COMMAND]
206
+ $ apimatic help [COMMAND...] [-n]
217
207
 
218
208
  ARGUMENTS
219
- COMMAND command to show help for
209
+ COMMAND... Command to show help for.
210
+
211
+ FLAGS
212
+ -n, --nested-commands Include all nested commands in the output.
220
213
 
221
214
  DESCRIPTION
222
215
  Display help for apimatic.
@@ -234,6 +227,11 @@ USAGE
234
227
 
235
228
  FLAGS
236
229
  -f, --force overwrite if a portal exists in the destination
230
+ --auth-key=<value> override current authentication state with an authentication key
231
+ --destination=<value> [default: ./generated_portal] path to the downloaded portal
232
+ --folder=<value> [default: ./] path to the input directory containing API specifications and config files
233
+ --zip download the generated portal as a .zip archive
234
+
237
235
  DESCRIPTION
238
236
  Generate and download a static API Documentation portal. Requires an input directory containing API specifications, a
239
237
  config file and optionally, markdown guides. For details, refer to the [documentation](https://docs.apimatic.io/platfo
@@ -246,22 +244,66 @@ EXAMPLES
246
244
 
247
245
  _See code: [src/commands/portal/generate.ts](https://github.com/apimatic/apimatic-cli/blob/alpha/src/commands/portal/generate.ts)_
248
246
 
247
+ ## `apimatic portal:toc:new`
248
+
249
+ Generates a TOC file based on the content directory and spec folder provided in your working directory
250
+
251
+ ```
252
+ USAGE
253
+ $ apimatic portal:toc:new [--destination <value>] [--folder <value>] [--force] [--expand-endpoints]
254
+ [--expand-models]
255
+
256
+ FLAGS
257
+ --destination=<value> optional path where the generated TOC file will be saved. Defaults to the current working
258
+ directory if not provided.
259
+ --expand-endpoints include individual entries for each endpoint in the generated TOC. Requires a valid API
260
+ specification in the working directory.
261
+ --expand-models include individual entries for each model in the generated TOC. Requires a valid API
262
+ specification in the working directory.
263
+ --folder=<value> [default: ./] path to the working directory containing the API project
264
+ files. Defaults to the current working directory if not specified.
265
+ --force overwrite the TOC file if one already exists at the destination.
266
+
267
+ DESCRIPTION
268
+ Generates a TOC file based on the content directory and spec folder provided in your working directory
269
+
270
+ This command generates a new Table of Contents (TOC) file used in the
271
+ generation of your API documentation portal.
272
+
273
+ The output is a YAML file with the .yml extension.
274
+
275
+ To learn more about the TOC file and APIMatic build directory structure, visit:
276
+ https://docs.apimatic.io/platform-api/#/http/guides/generating-on-prem-api-portal/overview-generating-api-portal
277
+
278
+ EXAMPLES
279
+ $ apimatic portal:toc:new --destination="./portal/content/"
280
+ A new toc file has been created at ./portal/content/toc.yml
281
+
282
+ $ apimatic portal:toc:new --folder="./my-project"
283
+ A new toc file has been created at ./my-project/content/toc.yml
284
+
285
+ $ apimatic portal:toc:new --folder="./my-project" --destination="./portal/content/"
286
+ A new toc file has been created at ./portal/content/toc.yml
287
+ ```
288
+
289
+ _See code: [src/commands/portal/toc/new/toc.ts](https://github.com/apimatic/apimatic-cli/blob/alpha/src/commands/portal/toc/new/toc.ts)_
290
+
249
291
  ## `apimatic portal:quickstart`
250
292
 
251
- Create your first API Portal using APIMatics Docs as Code offering.
293
+ Create your first API Portal using APIMatic's Docs as Code offering.
252
294
 
253
295
  ```
254
296
  USAGE
255
297
  $ apimatic portal:quickstart
256
298
 
257
299
  DESCRIPTION
258
- Create your first API Portal using APIMatics Docs as Code offering.
300
+ Create your first API Portal using APIMatic's Docs as Code offering.
259
301
 
260
302
  EXAMPLES
261
303
  $ apimatic portal:quickstart
262
304
  ```
263
305
 
264
- _See code: [src/commands/portal/quickstart.ts](https://github.com/apimatic/apimatic-cli/blob/v1.0.1-alpha.11/src/commands/portal/quickstart.ts)_
306
+ _See code: [src/commands/portal/quickstart.ts](https://github.com/apimatic/apimatic-cli/blob/alpha/src/commands/portal/quickstart.ts)_
265
307
 
266
308
  ## `apimatic portal:serve`
267
309
 
@@ -269,10 +311,11 @@ Generate and deploy a Docs as Code portal with hot reload.
269
311
 
270
312
  ```
271
313
  USAGE
272
- $ apimatic portal:serve [-p <value>] [-d <value>] [-s <value>] [-o] [--no-reload] [-i <value>] [--auth-key <value>]
314
+ $ apimatic portal:serve [-p <value>] [-d <value>] [-s <value>] [-o] [--no-reload] [-i <value>] [--auth-key
315
+ <value>]
273
316
 
274
317
  FLAGS
275
- -d, --destination=<value> [default: ./api-portal] Directory to store and serve the generated portal.
318
+ -d, --destination=<value> [default: ./generated_portal] Directory to store and serve the generated portal.
276
319
  -i, --ignore=<value> Comma-separated list of files/directories to ignore.
277
320
  -o, --open Open the portal in the default browser.
278
321
  -p, --port=<value> [default: 3000] Port to serve the portal.
@@ -285,10 +328,10 @@ DESCRIPTION
285
328
  Generate and deploy a Docs as Code portal with hot reload.
286
329
 
287
330
  EXAMPLES
288
- $ apimatic portal:serve --source="./" --destination="./api-portal" --port=3000 --open --no-reload
331
+ $ apimatic portal:serve --source="./" --destination="./generated_portal" --port=3000 --open --no-reload
289
332
  ```
290
333
 
291
- _See code: [src/commands/portal/serve.ts](https://github.com/apimatic/apimatic-cli/blob/v1.0.1-alpha.11/src/commands/portal/serve.ts)_
334
+ _See code: [src/commands/portal/serve.ts](https://github.com/apimatic/apimatic-cli/blob/alpha/src/commands/portal/serve.ts)_
292
335
 
293
336
  ## `apimatic sdk:generate`
294
337
 
@@ -296,24 +339,19 @@ Generate SDK for your APIs
296
339
 
297
340
  ```
298
341
  USAGE
299
- $ apimatic sdk:generate --platform <value> [--file <value>] [--url <value>] [--destination <value>] [-f] [--zip] [--auth-key <value>]
342
+ $ apimatic sdk:generate --platform <value> [--file <value>] [--url <value>] [--destination <value>] [-f] [--zip]
343
+ [--auth-key <value>]
300
344
 
301
345
  FLAGS
302
346
  -f, --force overwrite if an SDK already exists in the destination
303
- --auth-key=auth-key override current authentication state with an authentication key
304
-
305
- --destination=destination [default: /home/runner/work/apimatic-cli/apimatic-cli/cli] directory to download the
306
- generated SDK to
307
-
308
- --file=file path to the API specification to generate SDKs for
309
-
310
- --platform=platform (required) language platform for sdk
311
- Simple: CSHARP|JAVA|PYTHON|RUBY|PHP|TYPESCRIPT
312
- Legacy: CS_NET_STANDARD_LIB|CS_PORTABLE_NET_LIB|CS_UNIVERSAL_WINDOWS_PLATFORM_LIB|
313
- JAVA_ECLIPSE_JRE_LIB|PHP_GENERIC_LIB|PYTHON_GENERIC_LIB|RUBY_GENERIC_LIB|
314
- TS_GENERIC_LIB
315
-
316
- --url=url URL to the API specification to generate SDKs for. Can be used in place of the --file
347
+ --auth-key=<value> override current authentication state with an authentication key
348
+ --destination=<value> [default: ./] directory to download the generated SDK to
349
+ --file=<value> path to the API specification to generate SDKs for
350
+ --platform=<value> (required) language platform for sdk
351
+ Simple: CSHARP|JAVA|PYTHON|RUBY|PHP|TYPESCRIPT|GO
352
+ Legacy: CS_NET_STANDARD_LIB|JAVA_ECLIPSE_JRE_LIB|PHP_GENERIC_LIB_V2|PYTHON_GENERIC_LIB|RUBY
353
+ _GENERIC_LIB|TS_GENERIC_LIB|GO_GENERIC_LIB
354
+ --url=<value> URL to the API specification to generate SDKs for. Can be used in place of the --file
317
355
  option if the API specification is publicly available.
318
356
  --zip download the generated SDK as a .zip archive
319
357
 
@@ -0,0 +1,7 @@
1
+ import { PortalPaths, GenerateFlags } from "../../types/portal/generate";
2
+ export declare class PortalGenerateAction {
3
+ private readonly prompts;
4
+ constructor();
5
+ generatePortal(paths: PortalPaths, flags: GenerateFlags, configDir: string): Promise<void>;
6
+ private saveGeneratedPortalStreamToZipFile;
7
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PortalGenerateAction = void 0;
4
+ const path = require("path");
5
+ const fs = require("fs-extra");
6
+ const portal_service_1 = require("../../infrastructure/services/portal-service");
7
+ const result_1 = require("../../types/common/result");
8
+ const utils_1 = require("../../utils/utils");
9
+ const generate_1 = require("../../prompts/portal/generate");
10
+ class PortalGenerateAction {
11
+ constructor() {
12
+ this.prompts = new generate_1.PortalGeneratePrompts();
13
+ }
14
+ async generatePortal(paths, flags, configDir) {
15
+ var _a;
16
+ this.prompts.displayPortalGenerationMessage();
17
+ const pathsToIgnore = (0, utils_1.getGeneratedFilesPaths)(paths.sourceFolderPath, paths.generatedPortalArtifactsFolderPath);
18
+ //TODO: Refactor this method, carries dual responsibility.
19
+ const sourceBuildInputZipFilePath = await (0, utils_1.validateAndZipPortalSource)(paths.sourceFolderPath, path.join(paths.sourceFolderPath, ".portal_source.zip"), pathsToIgnore);
20
+ const generatePortalParams = {
21
+ sourceBuildInputZipFilePath: sourceBuildInputZipFilePath,
22
+ generatedPortalArtifactsFolderPath: paths.generatedPortalArtifactsFolderPath,
23
+ generatedPortalArtifactsZipFilePath: paths.generatedPortalArtifactsZipFilePath,
24
+ overrideAuthKey: (_a = flags["auth-key"]) !== null && _a !== void 0 ? _a : null,
25
+ generateZipFile: flags.zip
26
+ };
27
+ const docsPortalService = new portal_service_1.PortalService();
28
+ const portalGenerationResult = await docsPortalService.generateOnPremPortal(generatePortalParams, configDir);
29
+ await (0, utils_1.deleteFile)(sourceBuildInputZipFilePath);
30
+ if (portalGenerationResult.isSuccess()) {
31
+ await this.saveGeneratedPortalStreamToZipFile(portalGenerationResult.value, paths.generatedPortalArtifactsZipFilePath);
32
+ if (flags.zip) {
33
+ this.prompts.displayPortalGenerationSuccessMessage();
34
+ this.prompts.displayOutroMessage(paths.generatedPortalArtifactsZipFilePath);
35
+ return;
36
+ }
37
+ await (0, utils_1.extractZipFile)(paths.generatedPortalArtifactsZipFilePath, paths.generatedPortalArtifactsFolderPath);
38
+ await (0, utils_1.deleteFile)(paths.generatedPortalArtifactsZipFilePath);
39
+ this.prompts.displayPortalGenerationSuccessMessage();
40
+ this.prompts.displayOutroMessage(paths.generatedPortalArtifactsFolderPath);
41
+ }
42
+ else {
43
+ this.prompts.displayPortalGenerationErrorMessage();
44
+ this.prompts.logError((0, utils_1.getMessageInRedColor)(`${portalGenerationResult.error}`));
45
+ }
46
+ }
47
+ async saveGeneratedPortalStreamToZipFile(data, generatedPortalArtifactsZipFilePath) {
48
+ const writeStream = fs.createWriteStream(generatedPortalArtifactsZipFilePath);
49
+ await new Promise((resolve, reject) => {
50
+ data
51
+ .pipe(writeStream)
52
+ .on("finish", () => resolve())
53
+ .on("error", (error) => reject(result_1.Result.failure(`Failed to save downloaded portal to file: ${error.message}`)));
54
+ });
55
+ }
56
+ }
57
+ exports.PortalGenerateAction = PortalGenerateAction;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWN0aW9ucy9wb3J0YWwvZ2VuZXJhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUMvQixpRkFBNkU7QUFFN0Usc0RBQW1EO0FBQ25ELDZDQU0yQjtBQUMzQiw0REFBc0U7QUFFdEUsTUFBYSxvQkFBb0I7SUFHL0I7UUFDRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZ0NBQXFCLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFrQixFQUFFLEtBQW9CLEVBQUUsU0FBaUI7O1FBQzlFLElBQUksQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLGFBQWEsR0FBRyxJQUFBLDhCQUFzQixFQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUUvRywwREFBMEQ7UUFDMUQsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLElBQUEsa0NBQTBCLEVBQ2xFLEtBQUssQ0FBQyxnQkFBZ0IsRUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsRUFDdkQsYUFBYSxDQUNkLENBQUM7UUFFRixNQUFNLG9CQUFvQixHQUF5QjtZQUNqRCwyQkFBMkIsRUFBRSwyQkFBMkI7WUFDeEQsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLGtDQUFrQztZQUM1RSxtQ0FBbUMsRUFBRSxLQUFLLENBQUMsbUNBQW1DO1lBQzlFLGVBQWUsRUFBRSxNQUFBLEtBQUssQ0FBQyxVQUFVLENBQUMsbUNBQUksSUFBSTtZQUMxQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEdBQUc7U0FDM0IsQ0FBQztRQUVGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSw4QkFBYSxFQUFFLENBQUM7UUFDOUMsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdHLE1BQU0sSUFBQSxrQkFBVSxFQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFOUMsSUFBSSxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUMzQyxzQkFBc0IsQ0FBQyxLQUFNLEVBQzdCLEtBQUssQ0FBQyxtQ0FBbUMsQ0FDMUMsQ0FBQztZQUVGLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxPQUFPLENBQUMscUNBQXFDLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztnQkFDNUUsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLElBQUEsc0JBQWMsRUFBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDMUcsTUFBTSxJQUFBLGtCQUFVLEVBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFFNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDN0UsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQ25CLElBQUEsNEJBQW9CLEVBQUMsR0FBRyxzQkFBc0IsQ0FBQyxLQUFNLEVBQUUsQ0FBQyxDQUN6RCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsa0NBQWtDLENBQzlDLElBQTJCLEVBQzNCLG1DQUEyQztRQUUzQyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUM5RSxNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzFDLElBQUk7aUJBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDakIsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDN0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGVBQU0sQ0FBQyxPQUFPLENBQUMsNkNBQTZDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW5FRCxvREFtRUMifQ==
@@ -0,0 +1,17 @@
1
+ import { Result } from "../../../types/common/result";
2
+ export declare class PortalNewTocAction {
3
+ private readonly prompts;
4
+ private readonly sdlParser;
5
+ private readonly tocGenerator;
6
+ private readonly contentParser;
7
+ constructor();
8
+ createToc(workingDirectory: string, configDir: string, destination?: string, force?: boolean, expandEndpoints?: boolean, expandModels?: boolean): Promise<Result<string, string>>;
9
+ private writeToc;
10
+ private handleExistingToc;
11
+ private extractSdlComponents;
12
+ private extractContentGroups;
13
+ private getDestinationPath;
14
+ private checkExistingToc;
15
+ private getContentFolderPath;
16
+ private getSpecFolderPath;
17
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PortalNewTocAction = void 0;
4
+ const path = require("path");
5
+ const fs = require("fs-extra");
6
+ const new_toc_1 = require("../../../prompts/portal/toc/new-toc");
7
+ const result_1 = require("../../../types/common/result");
8
+ const utils_1 = require("../../../utils/utils");
9
+ const sdl_parser_1 = require("../../../application/portal/toc/sdl-parser");
10
+ const toc_structure_generator_1 = require("../../../application/portal/toc/toc-structure-generator");
11
+ const toc_content_parser_1 = require("../../../application/portal/toc/toc-content-parser");
12
+ const portal_service_1 = require("../../../infrastructure/services/portal-service");
13
+ const DEFAULT_TOC_FILENAME = "toc.yml";
14
+ const APIMATIC_BUILD_FILENAME = "APIMATIC-BUILD.json";
15
+ class PortalNewTocAction {
16
+ constructor() {
17
+ this.prompts = new new_toc_1.PortalNewTocPrompts();
18
+ this.sdlParser = new sdl_parser_1.SdlParser(new portal_service_1.PortalService());
19
+ this.tocGenerator = new toc_structure_generator_1.TocStructureGenerator();
20
+ this.contentParser = new toc_content_parser_1.TocContentParser();
21
+ }
22
+ async createToc(workingDirectory, configDir, destination, force = false, expandEndpoints = false, expandModels = false) {
23
+ try {
24
+ const tocDir = await this.getDestinationPath(workingDirectory, destination);
25
+ const tocPath = path.join(tocDir, DEFAULT_TOC_FILENAME);
26
+ const tocCheckResult = await this.handleExistingToc(tocPath, force);
27
+ if (!tocCheckResult.isSuccess()) {
28
+ return tocCheckResult;
29
+ }
30
+ const { endpointGroups, models } = await this.extractSdlComponents(workingDirectory, configDir, expandEndpoints, expandModels);
31
+ const contentGroups = await this.extractContentGroups(workingDirectory);
32
+ const toc = this.tocGenerator.createTocStructure(endpointGroups, models, expandEndpoints, expandModels, contentGroups);
33
+ const yamlString = this.tocGenerator.transformToYaml(toc);
34
+ await this.writeToc(tocPath, yamlString, "utf8");
35
+ this.prompts.displayOutroMessage(tocPath);
36
+ return result_1.Result.success(tocPath);
37
+ }
38
+ catch (error) {
39
+ this.prompts.logError((0, utils_1.getMessageInRedColor)(`${error}`));
40
+ return result_1.Result.failure(`❌ An unexpected error occurred while generating the TOC file.`);
41
+ }
42
+ }
43
+ async writeToc(path, content, encoding) {
44
+ await fs.ensureFile(path);
45
+ await fs.writeFile(path, content, encoding);
46
+ }
47
+ async handleExistingToc(tocPath, force) {
48
+ const shouldContinue = await this.checkExistingToc(tocPath, force);
49
+ if (!shouldContinue) {
50
+ return result_1.Result.cancelled("Operation was cancelled by the user.");
51
+ }
52
+ return result_1.Result.success("TOC check passed.");
53
+ }
54
+ async extractSdlComponents(workingDirectory, configDir, expandEndpoints, expandModels) {
55
+ if (!expandEndpoints && !expandModels) {
56
+ return { endpointGroups: new Map(), models: [] };
57
+ }
58
+ this.prompts.startProgressIndicatorWithMessage("Extracting endpoints and/or models from the API specification...");
59
+ const specFolderPath = await this.getSpecFolderPath(workingDirectory);
60
+ if (!(await fs.pathExists(specFolderPath))) {
61
+ this.prompts.stopProgressIndicatorWithMessage(`⚠️ Could not find the specification folder at: ${specFolderPath}`);
62
+ this.prompts.displayInfo("Falling back to default TOC structure without expanded endpoints or models...");
63
+ return { endpointGroups: new Map(), models: [] };
64
+ }
65
+ const sdlResult = await this.sdlParser.getTocComponentsFromSdl(specFolderPath, workingDirectory, configDir);
66
+ if (!sdlResult.isSuccess()) {
67
+ this.prompts.stopProgressIndicatorWithMessage(`⚠️ ${sdlResult.error}`);
68
+ this.prompts.displayInfo("Falling back to default TOC structure without expanded endpoints or models...");
69
+ return { endpointGroups: new Map(), models: [] };
70
+ }
71
+ this.prompts.stopProgressIndicatorWithMessage("✅ Successfully extracted endpoints and/or models from the specification.");
72
+ return sdlResult.value;
73
+ }
74
+ async extractContentGroups(workingDirectory) {
75
+ const contentFolderPath = await this.getContentFolderPath(workingDirectory);
76
+ if (!(await fs.pathExists(contentFolderPath))) {
77
+ this.prompts.displayInfo(`⚠️ Could not locate the content folder at: ${contentFolderPath}`);
78
+ this.prompts.displayInfo("Skipping custom content addition in TOC...");
79
+ return [];
80
+ }
81
+ return await this.contentParser.parseContentFolder(contentFolderPath, contentFolderPath);
82
+ }
83
+ async getDestinationPath(workingDirectory, providedDestination) {
84
+ if (providedDestination === undefined) {
85
+ const inferredDestination = await this.getContentFolderPath(workingDirectory);
86
+ return inferredDestination;
87
+ }
88
+ return providedDestination;
89
+ }
90
+ async checkExistingToc(tocPath, force) {
91
+ if ((await fs.pathExists(tocPath)) && !force) {
92
+ return await this.prompts.overwriteExistingTocPrompt();
93
+ }
94
+ return true;
95
+ }
96
+ async getContentFolderPath(workingDirectory) {
97
+ var _a;
98
+ const buildFilePath = path.join(workingDirectory, APIMATIC_BUILD_FILENAME);
99
+ const defaultContentFolder = path.join(workingDirectory, "content");
100
+ if (!(await fs.pathExists(buildFilePath))) {
101
+ return defaultContentFolder;
102
+ }
103
+ try {
104
+ const buildConfig = await fs.readJson(buildFilePath, "utf8");
105
+ if (((_a = buildConfig.generatePortal) === null || _a === void 0 ? void 0 : _a.contentFolder) == null) {
106
+ return defaultContentFolder;
107
+ }
108
+ return path.join(workingDirectory, buildConfig.generatePortal.contentFolder, "content");
109
+ }
110
+ catch (_b) {
111
+ return defaultContentFolder;
112
+ }
113
+ }
114
+ async getSpecFolderPath(workingDirectory) {
115
+ var _a;
116
+ const buildFilePath = path.join(workingDirectory, APIMATIC_BUILD_FILENAME);
117
+ const defaultSpecFolder = path.join(workingDirectory, "spec");
118
+ if (!(await fs.pathExists(buildFilePath))) {
119
+ return defaultSpecFolder;
120
+ }
121
+ try {
122
+ const buildConfig = await fs.readJson(buildFilePath, "utf8");
123
+ if (((_a = buildConfig.generatePortal) === null || _a === void 0 ? void 0 : _a.apiSpecPath) == null) {
124
+ return defaultSpecFolder;
125
+ }
126
+ return path.join(workingDirectory, buildConfig.generatePortal.apiSpecPath);
127
+ }
128
+ catch (_b) {
129
+ return defaultSpecFolder;
130
+ }
131
+ }
132
+ }
133
+ exports.PortalNewTocAction = PortalNewTocAction;
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hY3Rpb25zL3BvcnRhbC90b2MvbmV3LXRvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLGlFQUEwRTtBQUMxRSx5REFBc0Q7QUFDdEQsZ0RBQTREO0FBQzVELDJFQUF1RTtBQUN2RSxxR0FBZ0c7QUFDaEcsMkZBQXNGO0FBRXRGLG9GQUFnRjtBQUVoRixNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztBQUN2QyxNQUFNLHVCQUF1QixHQUFHLHFCQUFxQixDQUFDO0FBRXRELE1BQWEsa0JBQWtCO0lBTTdCO1FBQ0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLDZCQUFtQixFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLHNCQUFTLENBQUMsSUFBSSw4QkFBYSxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksK0NBQXFCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUkscUNBQWdCLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FDYixnQkFBd0IsRUFDeEIsU0FBaUIsRUFDakIsV0FBb0IsRUFDcEIsUUFBaUIsS0FBSyxFQUN0QixrQkFBMkIsS0FBSyxFQUNoQyxlQUF3QixLQUFLO1FBRTdCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzVFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7WUFDeEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxjQUFjLENBQUM7WUFDeEIsQ0FBQztZQUVELE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQ2hFLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksQ0FDYixDQUFDO1lBRUYsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUV4RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUM5QyxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixZQUFZLEVBQ1osYUFBYSxDQUNkLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVqRCxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFDLE9BQU8sZUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUEsNEJBQW9CLEVBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEQsT0FBTyxlQUFNLENBQUMsT0FBTyxDQUFDLCtEQUErRCxDQUFDLENBQUM7UUFDekYsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsUUFBZ0I7UUFDcEUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBZSxFQUFFLEtBQWM7UUFDN0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixPQUFPLGVBQU0sQ0FBQyxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxlQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FDaEMsZ0JBQXdCLEVBQ3hCLFNBQWlCLEVBQ2pCLGVBQXdCLEVBQ3hCLFlBQXFCO1FBRXJCLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDbkgsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV0RSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsa0RBQWtELGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDbEgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsK0VBQStFLENBQUMsQ0FBQztZQUMxRyxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTVHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQU0sRUFBRSxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsK0VBQStFLENBQUMsQ0FBQztZQUMxRyxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLDBFQUEwRSxDQUFDLENBQUM7UUFDMUgsT0FBTyxTQUFTLENBQUMsS0FBTSxDQUFDO0lBQzFCLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsZ0JBQXdCO1FBQ3pELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUU1RSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsOENBQThDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUM1RixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBd0IsRUFBRSxtQkFBNEI7UUFDckYsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDOUUsT0FBTyxtQkFBbUIsQ0FBQztRQUM3QixDQUFDO1FBQ0QsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxLQUFjO1FBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdDLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBd0I7O1FBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUMzRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLG9CQUFvQixDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTdELElBQUksQ0FBQSxNQUFBLFdBQVcsQ0FBQyxjQUFjLDBDQUFFLGFBQWEsS0FBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdEQsT0FBTyxvQkFBb0IsQ0FBQztZQUM5QixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFBQyxXQUFNLENBQUM7WUFDUCxPQUFPLG9CQUFvQixDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLGdCQUF3Qjs7UUFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFDLE9BQU8saUJBQWlCLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFN0QsSUFBSSxDQUFBLE1BQUEsV0FBVyxDQUFDLGNBQWMsMENBQUUsV0FBVyxLQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwRCxPQUFPLGlCQUFpQixDQUFDO1lBQzNCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQUMsV0FBTSxDQUFDO1lBQ1AsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBdEtELGdEQXNLQyJ9
@@ -0,0 +1,13 @@
1
+ import { PortalService } from "../../../infrastructure/services/portal-service";
2
+ import { TocEndpoint, TocModel } from "../../../types/toc/toc";
3
+ import { Result } from "../../../types/common/result";
4
+ export declare class SdlParser {
5
+ private readonly portalService;
6
+ constructor(portalService: PortalService);
7
+ getTocComponentsFromSdl(specFolderPath: string, workingDirectory: string, configDir: string): Promise<Result<{
8
+ endpointGroups: Map<string, TocEndpoint[]>;
9
+ models: TocModel[];
10
+ }, string>>;
11
+ private extractEndpointGroups;
12
+ private extractModels;
13
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SdlParser = void 0;
4
+ const path = require("path");
5
+ const utils_1 = require("../../../utils/utils");
6
+ const result_1 = require("../../../types/common/result");
7
+ class SdlParser {
8
+ constructor(portalService) {
9
+ this.portalService = portalService;
10
+ }
11
+ async getTocComponentsFromSdl(specFolderPath, workingDirectory, configDir) {
12
+ const sourceSpecInputZipFilePath = await (0, utils_1.validateAndZipPortalSource)(specFolderPath, path.join(workingDirectory, ".spec_source.zip"));
13
+ try {
14
+ const result = await this.portalService.generateSdl(sourceSpecInputZipFilePath, configDir);
15
+ if (!result.isSuccess()) {
16
+ return result_1.Result.failure("Failed to extract endpoints/models from the specification. Please validate your spec using APIMatic's interactive VS Code extension");
17
+ }
18
+ const sdl = result.value;
19
+ const endpointGroups = this.extractEndpointGroups(sdl);
20
+ const models = this.extractModels(sdl);
21
+ return result_1.Result.success({ endpointGroups, models });
22
+ }
23
+ finally {
24
+ await (0, utils_1.deleteFile)(sourceSpecInputZipFilePath);
25
+ }
26
+ }
27
+ extractEndpointGroups(sdl) {
28
+ const endpointGroups = new Map();
29
+ const endpoints = sdl.Endpoints.map((e) => ({
30
+ generate: null,
31
+ from: "endpoint",
32
+ endpointName: e.Name,
33
+ endpointGroup: e.Group
34
+ }));
35
+ endpoints.forEach((endpoint) => {
36
+ const group = endpoint.endpointGroup;
37
+ if (!endpointGroups.has(group)) {
38
+ endpointGroups.set(group, []);
39
+ }
40
+ endpointGroups.get(group).push(endpoint);
41
+ });
42
+ return endpointGroups;
43
+ }
44
+ extractModels(sdl) {
45
+ return sdl.CustomTypes.map((e) => ({
46
+ generate: null,
47
+ from: "model",
48
+ modelName: e.Name
49
+ }));
50
+ }
51
+ }
52
+ exports.SdlParser = SdlParser;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RsLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9wb3J0YWwvdG9jL3NkbC1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBRTdCLGdEQUE4RTtBQUU5RSx5REFBc0Q7QUFHdEQsTUFBYSxTQUFTO0lBQ3BCLFlBQTZCLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQUcsQ0FBQztJQUU3RCxLQUFLLENBQUMsdUJBQXVCLENBQUMsY0FBc0IsRUFBRSxnQkFBd0IsRUFBRSxTQUFpQjtRQUMvRixNQUFNLDBCQUEwQixHQUFHLE1BQU0sSUFBQSxrQ0FBMEIsRUFDakUsY0FBYyxFQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FDaEQsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixPQUFPLGVBQU0sQ0FBQyxPQUFPLENBQUMscUlBQXFJLENBQUMsQ0FBQTtZQUM5SixDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQVMsTUFBTSxDQUFDLEtBQU0sQ0FBQTtZQUMvQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV2QyxPQUFPLGVBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLElBQUEsa0JBQVUsRUFBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsR0FBUTtRQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUV4RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQWMsRUFBZSxFQUFFLENBQUMsQ0FBQztZQUNwRSxRQUFRLEVBQUUsSUFBSTtZQUNkLElBQUksRUFBRSxVQUFVO1lBQ2hCLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNwQixhQUFhLEVBQUUsQ0FBQyxDQUFDLEtBQUs7U0FDdkIsQ0FBQyxDQUFDLENBQUM7UUFFSixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBcUIsRUFBRSxFQUFFO1lBQzFDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxHQUFRO1FBQzVCLE9BQU8sR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFXLEVBQVksRUFBRSxDQUFDLENBQUM7WUFDckQsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsT0FBTztZQUNiLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSTtTQUNsQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7Q0FDRjtBQXRERCw4QkFzREMifQ==
@@ -0,0 +1,5 @@
1
+ import { TocGroup } from "../../../types/toc/toc";
2
+ export declare class TocContentParser {
3
+ parseContentFolder(contentFolderPath: string, workingDirectory: string): Promise<TocGroup[]>;
4
+ private normalizePath;
5
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TocContentParser = void 0;
4
+ const path = require("path");
5
+ const fs = require("fs-extra");
6
+ class TocContentParser {
7
+ async parseContentFolder(contentFolderPath, workingDirectory) {
8
+ const items = await fs.readdir(contentFolderPath);
9
+ const contentItems = [];
10
+ for (const item of items) {
11
+ const itemPath = path.join(contentFolderPath, item);
12
+ const stats = await fs.stat(itemPath);
13
+ if (stats.isDirectory()) {
14
+ const subItems = await this.parseContentFolder(itemPath, workingDirectory);
15
+ if (subItems.length > 0) {
16
+ contentItems.push({
17
+ group: item,
18
+ items: subItems[0].items // Take items from the Custom Content group
19
+ });
20
+ }
21
+ }
22
+ else if (stats.isFile() && item.endsWith(".md")) {
23
+ const relativePath = path.relative(workingDirectory, itemPath);
24
+ const pageName = path.basename(item, ".md");
25
+ contentItems.push({
26
+ page: pageName,
27
+ file: this.normalizePath(relativePath)
28
+ });
29
+ }
30
+ }
31
+ // Return empty array if no markdown files were found
32
+ if (contentItems.length === 0) {
33
+ return [];
34
+ }
35
+ // Wrap everything under a "Custom Content" group
36
+ return [{
37
+ group: "Custom Content",
38
+ items: contentItems
39
+ }];
40
+ }
41
+ normalizePath(path) {
42
+ return path.replace(/\\/g, '/');
43
+ }
44
+ }
45
+ exports.TocContentParser = TocContentParser;
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9jLWNvbnRlbnQtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3BvcnRhbC90b2MvdG9jLWNvbnRlbnQtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFHL0IsTUFBYSxnQkFBZ0I7SUFDM0IsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGlCQUF5QixFQUFFLGdCQUF3QjtRQUMxRSxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxNQUFNLFlBQVksR0FBaUMsRUFBRSxDQUFDO1FBRXRELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdEMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQzNFLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDaEIsS0FBSyxFQUFFLElBQUk7d0JBQ1gsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsMkNBQTJDO3FCQUNyRSxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFNUMsWUFBWSxDQUFDLElBQUksQ0FBQztvQkFDaEIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO2lCQUN2QyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE9BQU8sQ0FBQztnQkFDTixLQUFLLEVBQUUsZ0JBQWdCO2dCQUN2QixLQUFLLEVBQUUsWUFBWTthQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQVk7UUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUEzQ0QsNENBMkNDIn0=
@@ -0,0 +1,6 @@
1
+ import { Toc, TocGroup, TocEndpoint, TocModel } from "../../../types/toc/toc";
2
+ export declare class TocStructureGenerator {
3
+ createTocStructure(endpointGroups: Map<string, TocEndpoint[]>, models: TocModel[], expandEndpoints?: boolean, expandModels?: boolean, contentGroups?: TocGroup[]): Toc;
4
+ transformToYaml(toc: Toc): string;
5
+ private transformKeys;
6
+ }