@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.
- package/README.md +85 -47
- package/lib/actions/portal/generate.d.ts +7 -0
- package/lib/actions/portal/generate.js +58 -0
- package/lib/actions/portal/toc/new-toc.d.ts +17 -0
- package/lib/actions/portal/toc/new-toc.js +134 -0
- package/lib/application/portal/toc/sdl-parser.d.ts +13 -0
- package/lib/application/portal/toc/sdl-parser.js +53 -0
- package/lib/application/portal/toc/toc-content-parser.d.ts +5 -0
- package/lib/application/portal/toc/toc-content-parser.js +46 -0
- package/lib/application/portal/toc/toc-structure-generator.d.ts +6 -0
- package/lib/application/portal/toc/toc-structure-generator.js +88 -0
- package/lib/client-utils/sdk-client.js +7 -3
- package/lib/commands/api/transform.js +3 -3
- package/lib/commands/api/validate.js +1 -1
- package/lib/commands/portal/generate.d.ts +6 -1
- package/lib/commands/portal/generate.js +58 -75
- package/lib/commands/portal/quickstart.js +21 -25
- package/lib/commands/portal/serve.d.ts +0 -1
- package/lib/commands/portal/serve.js +4 -10
- package/lib/commands/portal/toc/new.d.ts +15 -0
- package/lib/commands/portal/toc/new.js +65 -0
- package/lib/commands/sdk/generate.js +4 -4
- package/lib/controllers/api/transform.js +9 -6
- package/lib/controllers/api/validate.d.ts +2 -2
- package/lib/controllers/api/validate.js +8 -16
- package/lib/controllers/portal/generate.d.ts +2 -2
- package/lib/controllers/portal/generate.js +101 -49
- package/lib/controllers/portal/quickstart.d.ts +3 -3
- package/lib/controllers/portal/quickstart.js +60 -8
- package/lib/controllers/portal/serve.d.ts +1 -2
- package/lib/controllers/portal/serve.js +13 -27
- package/lib/controllers/sdk/generate.d.ts +3 -3
- package/lib/controllers/sdk/generate.js +5 -6
- package/lib/infrastructure/services/portal-service.d.ts +16 -0
- package/lib/infrastructure/services/portal-service.js +133 -0
- package/lib/prompts/portal/generate.d.ts +10 -0
- package/lib/prompts/portal/generate.js +62 -0
- package/lib/prompts/portal/quickstart.d.ts +4 -5
- package/lib/prompts/portal/quickstart.js +16 -17
- package/lib/prompts/portal/toc/new-toc.d.ts +10 -0
- package/lib/prompts/portal/toc/new-toc.js +46 -0
- package/lib/services/portal/server.d.ts +5 -2
- package/lib/services/portal/server.js +57 -27
- package/lib/types/api/transform.d.ts +16 -0
- package/lib/types/api/transform.js +19 -2
- package/lib/types/common/result.d.ts +17 -0
- package/lib/types/common/result.js +36 -0
- package/lib/types/portal/generate.d.ts +26 -9
- package/lib/types/portal/generate.js +2 -1
- package/lib/types/sdk/generate.d.ts +3 -2
- package/lib/types/sdk/generate.js +3 -2
- package/lib/types/sdl/sdl.d.ts +11 -0
- package/lib/types/sdl/sdl.js +3 -0
- package/lib/types/toc/toc.d.ts +31 -0
- package/lib/types/toc/toc.js +10 -0
- package/lib/utils/utils.d.ts +2 -0
- package/lib/utils/utils.js +37 -14
- package/lib/validators/common/directoryValidator.js +4 -4
- 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/
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
103
|
-
--file
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 APIMatic
|
|
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 APIMatic
|
|
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/
|
|
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
|
|
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: ./
|
|
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="./
|
|
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/
|
|
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]
|
|
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
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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,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
|
+
}
|