@prauga/flexdoc-backend 2.1.0 → 2.2.0
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 +227 -227
- package/dist/flexdoc.module.test.js +9 -0
- package/dist/flexdoc.module.test.js.map +1 -1
- package/dist/framework-adapters.d.ts +3 -0
- package/dist/framework-adapters.js +34 -3
- package/dist/framework-adapters.js.map +1 -1
- package/dist/framework-adapters.test.js +44 -13
- package/dist/framework-adapters.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/renderer/flexdoc.standalone.css +1 -1
- package/dist/renderer/flexdoc.standalone.js +46 -197
- package/dist/renderer-assets.d.ts +1 -0
- package/dist/renderer-assets.js +6 -2
- package/dist/renderer-assets.js.map +1 -1
- package/dist/setup.js +3 -0
- package/dist/setup.js.map +1 -1
- package/dist/setup.test.js +6 -1
- package/dist/setup.test.js.map +1 -1
- package/dist/template.d.ts +1 -0
- package/dist/template.js +44 -43
- package/dist/template.js.map +1 -1
- package/dist/template.test.js +8 -0
- package/dist/template.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +34 -34
- package/dist/templates/code-examples.njk +0 -106
- package/dist/templates/content.njk +0 -272
- package/dist/templates/footer.njk +0 -38
- package/dist/templates/header.njk +0 -57
- package/dist/templates/layout.njk +0 -647
- package/dist/templates/parameters.njk +0 -64
- package/dist/templates/request-body.njk +0 -63
- package/dist/templates/responses.njk +0 -78
- package/dist/templates/sidebar.njk +0 -117
package/README.md
CHANGED
|
@@ -1,227 +1,227 @@
|
|
|
1
|
-
# FlexDoc Backend
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/@prauga/flexdoc-backend)
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
|
|
6
|
-
The backend package for FlexDoc, a modern, customizable OpenAPI documentation generator that creates beautiful API documentation.
|
|
7
|
-
|
|
8
|
-
## Screenshots
|
|
9
|
-
|
|
10
|
-
### Light Mode
|
|
11
|
-
|
|
12
|
-

|
|
13
|
-
|
|
14
|
-
### Dark Mode
|
|
15
|
-
|
|
16
|
-

|
|
17
|
-
|
|
18
|
-
## Features
|
|
19
|
-
|
|
20
|
-
- **Modern UI**: Clean, responsive interface with dark mode support
|
|
21
|
-
- **Customizable**: Easily customize colors, typography, and layout
|
|
22
|
-
- **Interactive**: Test API endpoints directly from the documentation
|
|
23
|
-
- **Framework Agnostic**: Works with any JavaScript framework
|
|
24
|
-
- **OpenAPI Compatible**: Supports OpenAPI 3.0 specifications
|
|
25
|
-
|
|
26
|
-
## Installation
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
npm install @prauga/flexdoc-backend
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Usage
|
|
33
|
-
|
|
34
|
-
### Basic Usage
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
import { FlexDoc } from '@prauga/flexdoc-backend';
|
|
38
|
-
import { OpenAPIObject } from '@nestjs/swagger';
|
|
39
|
-
|
|
40
|
-
// Create a new FlexDoc instance with your OpenAPI spec
|
|
41
|
-
const flexdoc = new FlexDoc({
|
|
42
|
-
spec: yourOpenAPISpec as OpenAPIObject,
|
|
43
|
-
title: 'My API Documentation',
|
|
44
|
-
description: 'Documentation for my awesome API',
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
// Generate HTML documentation
|
|
48
|
-
const html = flexdoc.generateHTML();
|
|
49
|
-
|
|
50
|
-
// Serve the documentation
|
|
51
|
-
app.get('/api/docs', (req, res) => {
|
|
52
|
-
res.send(html);
|
|
53
|
-
});
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Configuration Options
|
|
57
|
-
|
|
58
|
-
FlexDoc is highly customizable through the `FlexDocOptions` interface:
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
import { FlexDoc, FlexDocOptions } from '@prauga/flexdoc-backend';
|
|
62
|
-
|
|
63
|
-
const options: FlexDocOptions = {
|
|
64
|
-
// Required
|
|
65
|
-
spec: yourOpenAPISpec,
|
|
66
|
-
|
|
67
|
-
// Basic metadata
|
|
68
|
-
title: 'My API Documentation',
|
|
69
|
-
description: 'Documentation for my awesome API',
|
|
70
|
-
|
|
71
|
-
// Theme configuration
|
|
72
|
-
themeConfig: {
|
|
73
|
-
colors: {
|
|
74
|
-
primary: {
|
|
75
|
-
main: '#3b82f6',
|
|
76
|
-
light: '#eff6ff',
|
|
77
|
-
dark: '#2563eb',
|
|
78
|
-
},
|
|
79
|
-
// Additional color options...
|
|
80
|
-
},
|
|
81
|
-
typography: {
|
|
82
|
-
fontFamily: 'Inter, system-ui, sans-serif',
|
|
83
|
-
fontSize: '16px',
|
|
84
|
-
// Additional typography options...
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
// Footer customization
|
|
89
|
-
footer: {
|
|
90
|
-
copyright: '© 2025 My Company',
|
|
91
|
-
links: [
|
|
92
|
-
{
|
|
93
|
-
text: 'Terms',
|
|
94
|
-
url: '/terms',
|
|
95
|
-
icon: 'file-text', // Optional Lucide icon name
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
text: 'Privacy',
|
|
99
|
-
url: '/privacy',
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
},
|
|
103
|
-
|
|
104
|
-
// Additional options...
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const flexdoc = new FlexDoc(options);
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### Framework Integration Examples
|
|
111
|
-
|
|
112
|
-
#### NestJS
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
import { NestFactory } from '@nestjs/core';
|
|
116
|
-
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
|
|
117
|
-
import { FlexDoc } from '@prauga/flexdoc-backend';
|
|
118
|
-
import { AppModule } from './app.module';
|
|
119
|
-
|
|
120
|
-
async function bootstrap() {
|
|
121
|
-
const app = await NestFactory.create(AppModule);
|
|
122
|
-
|
|
123
|
-
// Create OpenAPI spec with Swagger
|
|
124
|
-
const config = new DocumentBuilder()
|
|
125
|
-
.setTitle('My API')
|
|
126
|
-
.setDescription('My API description')
|
|
127
|
-
.setVersion('1.0')
|
|
128
|
-
.build();
|
|
129
|
-
const document = SwaggerModule.createDocument(app, config);
|
|
130
|
-
|
|
131
|
-
// Create FlexDoc instance
|
|
132
|
-
const flexdoc = new FlexDoc({
|
|
133
|
-
spec: document,
|
|
134
|
-
title: 'My API Documentation',
|
|
135
|
-
description: 'Documentation for my awesome API',
|
|
136
|
-
footer: {
|
|
137
|
-
copyright: '© 2025 My Company',
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// Serve FlexDoc at /api/docs
|
|
142
|
-
app.use('/api/docs', (req, res) => {
|
|
143
|
-
res.send(flexdoc.generateHTML());
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
await app.listen(3000);
|
|
147
|
-
}
|
|
148
|
-
bootstrap();
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
#### Express
|
|
152
|
-
|
|
153
|
-
```typescript
|
|
154
|
-
import express from 'express';
|
|
155
|
-
import { FlexDoc } from '@prauga/flexdoc-backend';
|
|
156
|
-
import swaggerJsdoc from 'swagger-jsdoc';
|
|
157
|
-
|
|
158
|
-
const app = express();
|
|
159
|
-
|
|
160
|
-
// Generate OpenAPI spec
|
|
161
|
-
const options = {
|
|
162
|
-
definition: {
|
|
163
|
-
openapi: '3.0.0',
|
|
164
|
-
info: {
|
|
165
|
-
title: 'My API',
|
|
166
|
-
version: '1.0.0',
|
|
167
|
-
},
|
|
168
|
-
},
|
|
169
|
-
apis: ['./src/routes/*.js'],
|
|
170
|
-
};
|
|
171
|
-
const openapiSpec = swaggerJsdoc(options);
|
|
172
|
-
|
|
173
|
-
// Create FlexDoc instance
|
|
174
|
-
const flexdoc = new FlexDoc({
|
|
175
|
-
spec: openapiSpec,
|
|
176
|
-
title: 'My API Documentation',
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
// Serve FlexDoc
|
|
180
|
-
app.get('/api/docs', (req, res) => {
|
|
181
|
-
res.send(flexdoc.generateHTML());
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
app.listen(3000);
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## API Reference
|
|
188
|
-
|
|
189
|
-
### `FlexDoc` Class
|
|
190
|
-
|
|
191
|
-
The main class for generating API documentation.
|
|
192
|
-
|
|
193
|
-
#### Constructor
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
constructor(options: FlexDocOptions)
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
#### Methods
|
|
200
|
-
|
|
201
|
-
- `generateHTML()`: Generates the HTML documentation
|
|
202
|
-
- `getOpenAPISpec()`: Returns the processed OpenAPI specification
|
|
203
|
-
|
|
204
|
-
### `FlexDocOptions` Interface
|
|
205
|
-
|
|
206
|
-
Configuration options for FlexDoc:
|
|
207
|
-
|
|
208
|
-
| Property | Type | Description |
|
|
209
|
-
| -------------- | ------------------------------- | -------------------------------- |
|
|
210
|
-
| `spec` | `OpenAPIObject` | The OpenAPI specification object |
|
|
211
|
-
| `title` | `string` | Documentation title |
|
|
212
|
-
| `description` | `string` | Documentation description |
|
|
213
|
-
| `themeConfig` | `ThemeConfig` | Theme configuration |
|
|
214
|
-
| `footer` | `FooterConfig` | Footer configuration |
|
|
215
|
-
| `favicon` | `string` | URL to favicon |
|
|
216
|
-
| `customCss` | `string` | Custom CSS to inject |
|
|
217
|
-
| `customJs` | `string` | Custom JavaScript to inject |
|
|
218
|
-
| `defaultTheme` | `'light' \| 'dark' \| 'system'` | Default theme mode |
|
|
219
|
-
|
|
220
|
-
## Contributing
|
|
221
|
-
|
|
222
|
-
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
223
|
-
|
|
224
|
-
## License
|
|
225
|
-
|
|
226
|
-
This project is licensed under the MIT License - see the LICENSE file for details.
|
|
227
|
-
|
|
1
|
+
# FlexDoc Backend
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@prauga/flexdoc-backend)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
The backend package for FlexDoc, a modern, customizable OpenAPI documentation generator that creates beautiful API documentation.
|
|
7
|
+
|
|
8
|
+
## Screenshots
|
|
9
|
+
|
|
10
|
+
### Light Mode
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
14
|
+
### Dark Mode
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
|
|
20
|
+
- **Modern UI**: Clean, responsive interface with dark mode support
|
|
21
|
+
- **Customizable**: Easily customize colors, typography, and layout
|
|
22
|
+
- **Interactive**: Test API endpoints directly from the documentation
|
|
23
|
+
- **Framework Agnostic**: Works with any JavaScript framework
|
|
24
|
+
- **OpenAPI Compatible**: Supports OpenAPI 3.0 specifications
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @prauga/flexdoc-backend
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
### Basic Usage
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { FlexDoc } from '@prauga/flexdoc-backend';
|
|
38
|
+
import { OpenAPIObject } from '@nestjs/swagger';
|
|
39
|
+
|
|
40
|
+
// Create a new FlexDoc instance with your OpenAPI spec
|
|
41
|
+
const flexdoc = new FlexDoc({
|
|
42
|
+
spec: yourOpenAPISpec as OpenAPIObject,
|
|
43
|
+
title: 'My API Documentation',
|
|
44
|
+
description: 'Documentation for my awesome API',
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Generate HTML documentation
|
|
48
|
+
const html = flexdoc.generateHTML();
|
|
49
|
+
|
|
50
|
+
// Serve the documentation
|
|
51
|
+
app.get('/api/docs', (req, res) => {
|
|
52
|
+
res.send(html);
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Configuration Options
|
|
57
|
+
|
|
58
|
+
FlexDoc is highly customizable through the `FlexDocOptions` interface:
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { FlexDoc, FlexDocOptions } from '@prauga/flexdoc-backend';
|
|
62
|
+
|
|
63
|
+
const options: FlexDocOptions = {
|
|
64
|
+
// Required
|
|
65
|
+
spec: yourOpenAPISpec,
|
|
66
|
+
|
|
67
|
+
// Basic metadata
|
|
68
|
+
title: 'My API Documentation',
|
|
69
|
+
description: 'Documentation for my awesome API',
|
|
70
|
+
|
|
71
|
+
// Theme configuration
|
|
72
|
+
themeConfig: {
|
|
73
|
+
colors: {
|
|
74
|
+
primary: {
|
|
75
|
+
main: '#3b82f6',
|
|
76
|
+
light: '#eff6ff',
|
|
77
|
+
dark: '#2563eb',
|
|
78
|
+
},
|
|
79
|
+
// Additional color options...
|
|
80
|
+
},
|
|
81
|
+
typography: {
|
|
82
|
+
fontFamily: 'Inter, system-ui, sans-serif',
|
|
83
|
+
fontSize: '16px',
|
|
84
|
+
// Additional typography options...
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
// Footer customization
|
|
89
|
+
footer: {
|
|
90
|
+
copyright: '© 2025 My Company',
|
|
91
|
+
links: [
|
|
92
|
+
{
|
|
93
|
+
text: 'Terms',
|
|
94
|
+
url: '/terms',
|
|
95
|
+
icon: 'file-text', // Optional Lucide icon name
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
text: 'Privacy',
|
|
99
|
+
url: '/privacy',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
// Additional options...
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const flexdoc = new FlexDoc(options);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Framework Integration Examples
|
|
111
|
+
|
|
112
|
+
#### NestJS
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
import { NestFactory } from '@nestjs/core';
|
|
116
|
+
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
|
|
117
|
+
import { FlexDoc } from '@prauga/flexdoc-backend';
|
|
118
|
+
import { AppModule } from './app.module';
|
|
119
|
+
|
|
120
|
+
async function bootstrap() {
|
|
121
|
+
const app = await NestFactory.create(AppModule);
|
|
122
|
+
|
|
123
|
+
// Create OpenAPI spec with Swagger
|
|
124
|
+
const config = new DocumentBuilder()
|
|
125
|
+
.setTitle('My API')
|
|
126
|
+
.setDescription('My API description')
|
|
127
|
+
.setVersion('1.0')
|
|
128
|
+
.build();
|
|
129
|
+
const document = SwaggerModule.createDocument(app, config);
|
|
130
|
+
|
|
131
|
+
// Create FlexDoc instance
|
|
132
|
+
const flexdoc = new FlexDoc({
|
|
133
|
+
spec: document,
|
|
134
|
+
title: 'My API Documentation',
|
|
135
|
+
description: 'Documentation for my awesome API',
|
|
136
|
+
footer: {
|
|
137
|
+
copyright: '© 2025 My Company',
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Serve FlexDoc at /api/docs
|
|
142
|
+
app.use('/api/docs', (req, res) => {
|
|
143
|
+
res.send(flexdoc.generateHTML());
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
await app.listen(3000);
|
|
147
|
+
}
|
|
148
|
+
bootstrap();
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### Express
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import express from 'express';
|
|
155
|
+
import { FlexDoc } from '@prauga/flexdoc-backend';
|
|
156
|
+
import swaggerJsdoc from 'swagger-jsdoc';
|
|
157
|
+
|
|
158
|
+
const app = express();
|
|
159
|
+
|
|
160
|
+
// Generate OpenAPI spec
|
|
161
|
+
const options = {
|
|
162
|
+
definition: {
|
|
163
|
+
openapi: '3.0.0',
|
|
164
|
+
info: {
|
|
165
|
+
title: 'My API',
|
|
166
|
+
version: '1.0.0',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
apis: ['./src/routes/*.js'],
|
|
170
|
+
};
|
|
171
|
+
const openapiSpec = swaggerJsdoc(options);
|
|
172
|
+
|
|
173
|
+
// Create FlexDoc instance
|
|
174
|
+
const flexdoc = new FlexDoc({
|
|
175
|
+
spec: openapiSpec,
|
|
176
|
+
title: 'My API Documentation',
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// Serve FlexDoc
|
|
180
|
+
app.get('/api/docs', (req, res) => {
|
|
181
|
+
res.send(flexdoc.generateHTML());
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
app.listen(3000);
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## API Reference
|
|
188
|
+
|
|
189
|
+
### `FlexDoc` Class
|
|
190
|
+
|
|
191
|
+
The main class for generating API documentation.
|
|
192
|
+
|
|
193
|
+
#### Constructor
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
constructor(options: FlexDocOptions)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
#### Methods
|
|
200
|
+
|
|
201
|
+
- `generateHTML()`: Generates the HTML documentation
|
|
202
|
+
- `getOpenAPISpec()`: Returns the processed OpenAPI specification
|
|
203
|
+
|
|
204
|
+
### `FlexDocOptions` Interface
|
|
205
|
+
|
|
206
|
+
Configuration options for FlexDoc:
|
|
207
|
+
|
|
208
|
+
| Property | Type | Description |
|
|
209
|
+
| -------------- | ------------------------------- | -------------------------------- |
|
|
210
|
+
| `spec` | `OpenAPIObject` | The OpenAPI specification object |
|
|
211
|
+
| `title` | `string` | Documentation title |
|
|
212
|
+
| `description` | `string` | Documentation description |
|
|
213
|
+
| `themeConfig` | `ThemeConfig` | Theme configuration |
|
|
214
|
+
| `footer` | `FooterConfig` | Footer configuration |
|
|
215
|
+
| `favicon` | `string` | URL to favicon |
|
|
216
|
+
| `customCss` | `string` | Custom CSS to inject |
|
|
217
|
+
| `customJs` | `string` | Custom JavaScript to inject |
|
|
218
|
+
| `defaultTheme` | `'light' \| 'dark' \| 'system'` | Default theme mode |
|
|
219
|
+
|
|
220
|
+
## Contributing
|
|
221
|
+
|
|
222
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
223
|
+
|
|
224
|
+
## License
|
|
225
|
+
|
|
226
|
+
This project is licensed under the MIT License - see the LICENSE file for details.
|
|
227
|
+
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const flexdoc_module_1 = require("./flexdoc.module");
|
|
4
4
|
const setup_1 = require("./setup");
|
|
5
|
+
jest.mock('@nestjs/common', () => ({
|
|
6
|
+
Module: () => (target) => target,
|
|
7
|
+
Inject: () => () => undefined,
|
|
8
|
+
Injectable: () => (target) => target,
|
|
9
|
+
}));
|
|
10
|
+
jest.mock('@nestjs/core', () => ({
|
|
11
|
+
HttpAdapterHost: class HttpAdapterHost {
|
|
12
|
+
},
|
|
13
|
+
}));
|
|
5
14
|
jest.mock('./setup', () => ({
|
|
6
15
|
setupFlexDoc: jest.fn(),
|
|
7
16
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flexdoc.module.test.js","sourceRoot":"","sources":["../src/flexdoc.module.test.ts"],"names":[],"mappings":";;AAAA,qDAAiD;AACjD,mCAAuC;
|
|
1
|
+
{"version":3,"file":"flexdoc.module.test.js","sourceRoot":"","sources":["../src/flexdoc.module.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,8 @@ export interface FastifyLikeRequest {
|
|
|
13
13
|
}
|
|
14
14
|
export interface FastifyLikeApplication {
|
|
15
15
|
get(path: string, options: Record<string, unknown>, handler: (req: FastifyLikeRequest, reply: FastifyLikeReply) => any | Promise<any>): void;
|
|
16
|
+
ready?: () => Promise<unknown>;
|
|
17
|
+
swagger?: () => Record<string, unknown>;
|
|
16
18
|
}
|
|
17
19
|
export interface NestLikeApplication {
|
|
18
20
|
getHttpAdapter(): {
|
|
@@ -22,4 +24,5 @@ export interface NestLikeApplication {
|
|
|
22
24
|
}
|
|
23
25
|
export declare function setupExpressFlexDoc(app: ExpressLikeApplication, path: string, options: Omit<FlexDocModuleOptions, 'path'>): void;
|
|
24
26
|
export declare function setupFastifyFlexDoc(app: FastifyLikeApplication, path: string, options: Omit<FlexDocModuleOptions, 'path'>): void;
|
|
27
|
+
export declare function setupFastifySwaggerFlexDoc(app: FastifyLikeApplication, path: string, options?: Omit<FlexDocModuleOptions, 'path' | 'spec' | 'specUrl'>): void;
|
|
25
28
|
export declare function setupNestFlexDoc(app: NestLikeApplication, path: string, swaggerDocumentOptions: Record<string, unknown>, options?: Omit<FlexDocModuleOptions, 'path' | 'spec' | 'specUrl'>): void;
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.setupExpressFlexDoc = setupExpressFlexDoc;
|
|
37
37
|
exports.setupFastifyFlexDoc = setupFastifyFlexDoc;
|
|
38
|
+
exports.setupFastifySwaggerFlexDoc = setupFastifySwaggerFlexDoc;
|
|
38
39
|
exports.setupNestFlexDoc = setupNestFlexDoc;
|
|
39
40
|
const crypto = __importStar(require("crypto"));
|
|
40
41
|
const jwt = __importStar(require("jsonwebtoken"));
|
|
@@ -98,11 +99,12 @@ async function loadRemoteSpec(url) {
|
|
|
98
99
|
throw new Error(`Failed to load OpenAPI spec: HTTP ${response.status}`);
|
|
99
100
|
return response.json();
|
|
100
101
|
}
|
|
101
|
-
function
|
|
102
|
+
function setupFastifyFlexDocInternal(app, path, options, specProvider) {
|
|
102
103
|
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
103
104
|
const rendererBasePath = `${normalizedPath}/__flexdoc`;
|
|
104
105
|
const auth = options.options?.auth;
|
|
105
106
|
let remoteSpecPromise = null;
|
|
107
|
+
let generatedSpecPromise = null;
|
|
106
108
|
const routeOptions = auth ? {
|
|
107
109
|
preHandler: async (request, reply) => {
|
|
108
110
|
if (!authorize(request.headers, auth)) {
|
|
@@ -112,6 +114,14 @@ function setupFastifyFlexDoc(app, path, options) {
|
|
|
112
114
|
},
|
|
113
115
|
} : {};
|
|
114
116
|
const resolvedSpec = async () => {
|
|
117
|
+
if (specProvider) {
|
|
118
|
+
if (!generatedSpecPromise)
|
|
119
|
+
generatedSpecPromise = Promise.resolve(specProvider()).catch((error) => {
|
|
120
|
+
generatedSpecPromise = null;
|
|
121
|
+
throw error;
|
|
122
|
+
});
|
|
123
|
+
return generatedSpecPromise;
|
|
124
|
+
}
|
|
115
125
|
if (options.spec)
|
|
116
126
|
return options.spec;
|
|
117
127
|
if (!options.specUrl)
|
|
@@ -133,14 +143,35 @@ function setupFastifyFlexDoc(app, path, options) {
|
|
|
133
143
|
});
|
|
134
144
|
app.get(normalizedPath, routeOptions, async (_request, reply) => {
|
|
135
145
|
try {
|
|
136
|
-
const
|
|
137
|
-
|
|
146
|
+
const assets = (0, renderer_assets_1.getRendererAssets)();
|
|
147
|
+
const html = (0, template_1.generateFlexDocHTML)(await resolvedSpec(), {
|
|
148
|
+
...(options.options || {}),
|
|
149
|
+
rendererBasePath,
|
|
150
|
+
rendererVersion: assets.version,
|
|
151
|
+
});
|
|
152
|
+
return reply
|
|
153
|
+
.type('text/html; charset=utf-8')
|
|
154
|
+
.header('Cache-Control', 'no-cache')
|
|
155
|
+
.send(html);
|
|
138
156
|
}
|
|
139
157
|
catch (error) {
|
|
140
158
|
return reply.code(502).type('text/plain; charset=utf-8').send(`Unable to load OpenAPI specification: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
141
159
|
}
|
|
142
160
|
});
|
|
143
161
|
}
|
|
162
|
+
function setupFastifyFlexDoc(app, path, options) {
|
|
163
|
+
setupFastifyFlexDocInternal(app, path, options);
|
|
164
|
+
}
|
|
165
|
+
function setupFastifySwaggerFlexDoc(app, path, options = {}) {
|
|
166
|
+
setupFastifyFlexDocInternal(app, path, options, async () => {
|
|
167
|
+
if (typeof app.ready === 'function')
|
|
168
|
+
await app.ready();
|
|
169
|
+
if (typeof app.swagger !== 'function') {
|
|
170
|
+
throw new Error('setupFastifySwaggerFlexDoc requires @fastify/swagger to be registered before FlexDoc');
|
|
171
|
+
}
|
|
172
|
+
return app.swagger();
|
|
173
|
+
});
|
|
174
|
+
}
|
|
144
175
|
function setupNestFlexDoc(app, path, swaggerDocumentOptions, options = {}) {
|
|
145
176
|
let SwaggerModule;
|
|
146
177
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framework-adapters.js","sourceRoot":"","sources":["../src/framework-adapters.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"framework-adapters.js","sourceRoot":"","sources":["../src/framework-adapters.ts"],"names":[],"mappings":"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"}
|