@athenna/http 5.17.0 → 5.20.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/package.json +2 -2
- package/src/context/Response.d.ts +31 -1
- package/src/context/Response.js +55 -5
- package/src/server/ServerImpl.d.ts +10 -1
- package/src/server/ServerImpl.js +23 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@athenna/http",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.20.0",
|
|
4
4
|
"description": "The Athenna Http server. Built on top of fastify.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "João Lenon <lenon@athenna.io>",
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"@athenna/test": "^5.2.0",
|
|
83
83
|
"@athenna/tsconfig": "^5.0.0",
|
|
84
84
|
"@athenna/view": "^5.1.0",
|
|
85
|
-
"@athenna/vite": "^5.
|
|
85
|
+
"@athenna/vite": "^5.9.0",
|
|
86
86
|
"@fastify/cors": "^10.0.1",
|
|
87
87
|
"@fastify/helmet": "^13.0.0",
|
|
88
88
|
"@fastify/rate-limit": "^10.2.1",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { FastifyReply } from 'fastify';
|
|
10
10
|
import type { SendOptions } from '@fastify/static';
|
|
11
|
+
import type { Request } from '#src/context/Request';
|
|
11
12
|
import type { FastifyHelmetOptions } from '@fastify/helmet';
|
|
12
13
|
export declare class Response {
|
|
13
14
|
/**
|
|
@@ -84,6 +85,15 @@ export declare class Response {
|
|
|
84
85
|
* ```
|
|
85
86
|
*/
|
|
86
87
|
get responseTime(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Terminate the request sending an HTML content to be rendered.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* return response.html('<h1>Hello World!</h1>')
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
html(html: string): Promise<this>;
|
|
87
97
|
/**
|
|
88
98
|
* Terminate the request sending a view to be rendered.
|
|
89
99
|
*
|
|
@@ -92,7 +102,27 @@ export declare class Response {
|
|
|
92
102
|
* return response.view('welcome', { name: 'lenon' })
|
|
93
103
|
* ```
|
|
94
104
|
*/
|
|
95
|
-
view(view: string, data?: any): Promise<
|
|
105
|
+
view(view: string, data?: any): Promise<this>;
|
|
106
|
+
/**
|
|
107
|
+
* Terminate the request sending a React component to be rendered.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* return response.render('index')
|
|
112
|
+
* return response.render('index', {
|
|
113
|
+
* component: 'src/resources/app/app.tsx',
|
|
114
|
+
* viewData: {},
|
|
115
|
+
* beforeComponentRender: (component) => {
|
|
116
|
+
* return component.createApp()
|
|
117
|
+
* }
|
|
118
|
+
* })
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
render(view: string, options?: {
|
|
122
|
+
component?: string;
|
|
123
|
+
viewData?: any;
|
|
124
|
+
beforeComponentRender?: (componentModule: any) => any;
|
|
125
|
+
}): Promise<this>;
|
|
96
126
|
/**
|
|
97
127
|
* Terminate the request sending the response body or not.
|
|
98
128
|
*
|
package/src/context/Response.js
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* file that was distributed with this source code.
|
|
8
8
|
*/
|
|
9
9
|
import { View } from '@athenna/view';
|
|
10
|
+
import { Server } from '#src/facades/Server';
|
|
11
|
+
import { Module, Options } from '@athenna/common';
|
|
12
|
+
const react = Module.safeImport('react');
|
|
10
13
|
export class Response {
|
|
11
14
|
constructor(response, request) {
|
|
12
15
|
this.response = response;
|
|
@@ -87,6 +90,19 @@ export class Response {
|
|
|
87
90
|
get responseTime() {
|
|
88
91
|
return this.response.elapsedTime;
|
|
89
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Terminate the request sending an HTML content to be rendered.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* return response.html('<h1>Hello World!</h1>')
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
async html(html) {
|
|
102
|
+
await this.safeHeader('Content-Type', 'text/html; charset=utf-8').send(html);
|
|
103
|
+
this.response.body = html;
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
90
106
|
/**
|
|
91
107
|
* Terminate the request sending a view to be rendered.
|
|
92
108
|
*
|
|
@@ -100,11 +116,45 @@ export class Response {
|
|
|
100
116
|
.createRenderer()
|
|
101
117
|
.share({ request: this.request })
|
|
102
118
|
.render(view, data);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
119
|
+
return this.html(content);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Terminate the request sending a React component to be rendered.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* return response.render('index')
|
|
127
|
+
* return response.render('index', {
|
|
128
|
+
* component: 'src/resources/app/app.tsx',
|
|
129
|
+
* viewData: {},
|
|
130
|
+
* beforeComponentRender: (component) => {
|
|
131
|
+
* return component.createApp()
|
|
132
|
+
* }
|
|
133
|
+
* })
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
async render(view, options) {
|
|
137
|
+
if (!react) {
|
|
138
|
+
throw new Error('React is not installed, please run "npm i react".');
|
|
139
|
+
}
|
|
140
|
+
options = Options.create(options, {
|
|
141
|
+
viewData: {},
|
|
142
|
+
component: Config.get('http.vite.ssrEntrypoint'),
|
|
143
|
+
beforeComponentRender: options.component
|
|
144
|
+
? null
|
|
145
|
+
: component => {
|
|
146
|
+
return component.createApp(this.request.baseUrl);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
const vite = Server.getVitePlugin().getVite();
|
|
150
|
+
let component = await vite.ssrLoadModule(options.component);
|
|
151
|
+
if (options.beforeComponentRender) {
|
|
152
|
+
component = options.beforeComponentRender(component);
|
|
153
|
+
}
|
|
154
|
+
return this.view(view, {
|
|
155
|
+
element: react.renderToString(component),
|
|
156
|
+
...options.viewData
|
|
157
|
+
});
|
|
108
158
|
}
|
|
109
159
|
/**
|
|
110
160
|
* Terminate the request sending the response body or not.
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { InjectOptions, FastifyInstance, PrintRoutesOptions, FastifyListenOptions, FastifyServerOptions, LightMyRequestChain, LightMyRequestResponse } from 'fastify';
|
|
10
10
|
import type { RouteJson, ErrorHandler, RequestHandler, InterceptHandler, TerminateHandler, SwaggerDocument } from '#src/types';
|
|
11
|
+
import type { FastifyVite } from '@athenna/vite';
|
|
11
12
|
import type { AddressInfo } from 'node:net';
|
|
12
13
|
export declare class ServerImpl {
|
|
13
14
|
/**
|
|
@@ -86,10 +87,18 @@ export declare class ServerImpl {
|
|
|
86
87
|
* Make the server start listening for requests.
|
|
87
88
|
*/
|
|
88
89
|
listen(options: FastifyListenOptions): Promise<any>;
|
|
90
|
+
/**
|
|
91
|
+
* Return the FastifyVite instance if it exists.
|
|
92
|
+
*/
|
|
93
|
+
getVitePlugin(): FastifyVite;
|
|
94
|
+
/**
|
|
95
|
+
* Return ViteDevServer instance if it exists.
|
|
96
|
+
*/
|
|
97
|
+
getViteDevServer(): import("vite").ViteDevServer;
|
|
89
98
|
/**
|
|
90
99
|
* Start vite server.
|
|
91
100
|
*/
|
|
92
|
-
viteReady(): Promise<
|
|
101
|
+
viteReady(): Promise<void>;
|
|
93
102
|
/**
|
|
94
103
|
* Close the server,
|
|
95
104
|
*/
|
package/src/server/ServerImpl.js
CHANGED
|
@@ -120,9 +120,9 @@ export class ServerImpl {
|
|
|
120
120
|
return this.fastify.listen(options).then(() => (this.isListening = true));
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
123
|
-
*
|
|
123
|
+
* Return the FastifyVite instance if it exists.
|
|
124
124
|
*/
|
|
125
|
-
|
|
125
|
+
getVitePlugin() {
|
|
126
126
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
127
127
|
// @ts-ignore
|
|
128
128
|
if (!this.fastify.vite) {
|
|
@@ -130,7 +130,27 @@ export class ServerImpl {
|
|
|
130
130
|
}
|
|
131
131
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
132
132
|
// @ts-ignore
|
|
133
|
-
return this.fastify.vite
|
|
133
|
+
return this.fastify.vite;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Return ViteDevServer instance if it exists.
|
|
137
|
+
*/
|
|
138
|
+
getViteDevServer() {
|
|
139
|
+
const vite = this.getVitePlugin();
|
|
140
|
+
if (!vite) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
return vite.getServer();
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Start vite server.
|
|
147
|
+
*/
|
|
148
|
+
async viteReady() {
|
|
149
|
+
const vite = this.getVitePlugin();
|
|
150
|
+
if (!vite) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
return vite.ready();
|
|
134
154
|
}
|
|
135
155
|
/**
|
|
136
156
|
* Close the server,
|