@modern-js/server 1.1.2-beta.0 → 1.1.3
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/CHANGELOG.md +41 -0
- package/dist/js/modern/libs/hook-api/route.js +37 -0
- package/dist/js/modern/libs/{hook-api.js → hook-api/template.js} +0 -0
- package/dist/js/modern/libs/render/cache/type.js +0 -1
- package/dist/js/modern/libs/route/index.js +4 -0
- package/dist/js/modern/libs/route/matcher.js +5 -1
- package/dist/js/modern/libs/serve-file.js +23 -25
- package/dist/js/modern/server/{web-server.js → dev-server/dev-server-split.js} +9 -7
- package/dist/js/modern/server/{dev-server.js → dev-server/dev-server.js} +41 -22
- package/dist/js/modern/server/dev-server/index.js +2 -0
- package/dist/js/modern/server/index.js +62 -62
- package/dist/js/modern/server/{api-server.js → modern-server-split.js} +6 -10
- package/dist/js/modern/server/modern-server.js +76 -27
- package/dist/js/modern/type.js +0 -1
- package/dist/js/modern/utils.js +2 -2
- package/dist/js/node/libs/hook-api/route.js +46 -0
- package/dist/js/node/libs/{hook-api.js → hook-api/template.js} +0 -0
- package/dist/js/node/libs/route/index.js +4 -0
- package/dist/js/node/libs/route/matcher.js +5 -1
- package/dist/js/node/libs/serve-file.js +25 -26
- package/dist/js/node/server/{api-server.js → dev-server/dev-server-split.js} +7 -12
- package/dist/js/node/server/{dev-server.js → dev-server/dev-server.js} +42 -21
- package/dist/js/node/server/dev-server/index.js +27 -0
- package/dist/js/node/server/index.js +69 -63
- package/dist/js/node/server/{web-server.js → modern-server-split.js} +10 -9
- package/dist/js/node/server/modern-server.js +78 -27
- package/dist/js/node/utils.js +2 -2
- package/dist/types/libs/hook-api/route.d.ts +13 -0
- package/dist/types/libs/{hook-api.d.ts → hook-api/template.d.ts} +0 -0
- package/dist/types/libs/route/index.d.ts +1 -0
- package/dist/types/libs/route/matcher.d.ts +1 -0
- package/dist/types/libs/serve-file.d.ts +1 -1
- package/dist/types/server/{web-server.d.ts → dev-server/dev-server-split.d.ts} +8 -8
- package/dist/types/server/{dev-server.d.ts → dev-server/dev-server.d.ts} +6 -5
- package/dist/types/server/dev-server/index.d.ts +2 -0
- package/dist/types/server/index.d.ts +3 -1
- package/dist/types/server/{api-server.d.ts → modern-server-split.d.ts} +4 -6
- package/dist/types/server/modern-server.d.ts +5 -3
- package/dist/types/utils.d.ts +1 -1
- package/package.json +17 -19
- package/src/libs/hook-api/route.ts +38 -0
- package/src/libs/{hook-api.ts → hook-api/template.ts} +0 -0
- package/src/libs/route/index.ts +4 -0
- package/src/libs/route/matcher.ts +5 -1
- package/src/libs/serve-file.ts +16 -20
- package/src/server/{web-server.ts → dev-server/dev-server-split.ts} +11 -10
- package/src/server/{dev-server.ts → dev-server/dev-server.ts} +56 -23
- package/src/server/dev-server/index.ts +2 -0
- package/src/server/index.ts +72 -46
- package/src/server/{api-server.ts → modern-server-split.ts} +10 -13
- package/src/server/modern-server.ts +82 -41
- package/src/utils.ts +2 -2
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* eslint-disable max-lines */
|
|
2
|
-
import { IncomingMessage, ServerResponse, Server } from 'http';
|
|
2
|
+
import { IncomingMessage, ServerResponse, Server, createServer } from 'http';
|
|
3
3
|
import util from 'util';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import { fs, ROUTE_SPEC_FILE } from '@modern-js/utils';
|
|
6
6
|
import { Adapter, APIServerStartInput } from '@modern-js/server-plugin';
|
|
7
|
-
import {
|
|
7
|
+
import { createMiddlewareCollecter } from '@modern-js/server-utils';
|
|
8
8
|
import type { NormalizedConfig } from '@modern-js/core';
|
|
9
9
|
import mime from 'mime-types';
|
|
10
10
|
import axios from 'axios';
|
|
@@ -30,7 +30,8 @@ import {
|
|
|
30
30
|
ERROR_DIGEST,
|
|
31
31
|
ERROR_PAGE_TEXT,
|
|
32
32
|
} from '@/constants';
|
|
33
|
-
import { createTemplateAPI } from '@/libs/hook-api';
|
|
33
|
+
import { createTemplateAPI } from '@/libs/hook-api/template';
|
|
34
|
+
import { createRouteAPI } from '@/libs/hook-api/route';
|
|
34
35
|
|
|
35
36
|
type ModernServerHandler = (
|
|
36
37
|
context: ModernServerContext,
|
|
@@ -63,12 +64,12 @@ export class ModernServer {
|
|
|
63
64
|
|
|
64
65
|
protected presetRoutes?: ModernRouteInterface[];
|
|
65
66
|
|
|
67
|
+
protected runner!: ServerHookRunner;
|
|
68
|
+
|
|
66
69
|
protected readonly logger: Logger;
|
|
67
70
|
|
|
68
71
|
protected readonly measure: Measure;
|
|
69
72
|
|
|
70
|
-
private readonly runner: ServerHookRunner;
|
|
71
|
-
|
|
72
73
|
private readonly isDev: boolean = false;
|
|
73
74
|
|
|
74
75
|
private staticFileHandler!: ReturnType<typeof createStaticFileHandler>;
|
|
@@ -85,18 +86,15 @@ export class ModernServer {
|
|
|
85
86
|
|
|
86
87
|
private proxyHandler: ReturnType<typeof createProxyHandler> = null;
|
|
87
88
|
|
|
88
|
-
constructor(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}: ModernServerOptions,
|
|
98
|
-
runner: ServerHookRunner,
|
|
99
|
-
) {
|
|
89
|
+
constructor({
|
|
90
|
+
pwd,
|
|
91
|
+
config,
|
|
92
|
+
dev,
|
|
93
|
+
routes,
|
|
94
|
+
staticGenerate,
|
|
95
|
+
logger,
|
|
96
|
+
measure,
|
|
97
|
+
}: ModernServerOptions) {
|
|
100
98
|
require('ignore-styles');
|
|
101
99
|
this.isDev = Boolean(dev);
|
|
102
100
|
|
|
@@ -104,7 +102,6 @@ export class ModernServer {
|
|
|
104
102
|
this.distDir = path.join(pwd, config.output.path || '');
|
|
105
103
|
this.workDir = this.isDev ? pwd : this.distDir;
|
|
106
104
|
this.conf = config;
|
|
107
|
-
this.runner = runner;
|
|
108
105
|
this.logger = logger!;
|
|
109
106
|
this.measure = measure!;
|
|
110
107
|
this.router = new RouteMatchManager();
|
|
@@ -122,7 +119,9 @@ export class ModernServer {
|
|
|
122
119
|
}
|
|
123
120
|
|
|
124
121
|
// server prepare
|
|
125
|
-
public async init() {
|
|
122
|
+
public async init(runner: ServerHookRunner) {
|
|
123
|
+
this.runner = runner;
|
|
124
|
+
|
|
126
125
|
const { distDir, isDev, staticGenerate, conf } = this;
|
|
127
126
|
|
|
128
127
|
this.addHandler((ctx: ModernServerContext, next: NextFunction) => {
|
|
@@ -154,14 +153,20 @@ export class ModernServer {
|
|
|
154
153
|
|
|
155
154
|
await this.prepareFrameHandler();
|
|
156
155
|
|
|
156
|
+
const { favicon, faviconByEntries } = this.conf.output;
|
|
157
|
+
const favicons = this.prepareFavicons(favicon, faviconByEntries);
|
|
158
|
+
// Only work when without setting `assetPrefix`.
|
|
159
|
+
// Setting `assetPrefix` means these resources should be uploaded to CDN.
|
|
160
|
+
const staticPathRegExp = new RegExp(
|
|
161
|
+
`^/(static/|upload/|favicon.ico|icon.png${
|
|
162
|
+
favicons.length > 0 ? `|${favicons.join('|')}` : ''
|
|
163
|
+
})`,
|
|
164
|
+
);
|
|
165
|
+
|
|
157
166
|
this.staticFileHandler = createStaticFileHandler([
|
|
158
167
|
{
|
|
159
|
-
path:
|
|
160
|
-
target:
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
path: '/upload/',
|
|
164
|
-
target: path.join(distDir, 'upload'),
|
|
168
|
+
path: staticPathRegExp,
|
|
169
|
+
target: distDir,
|
|
165
170
|
},
|
|
166
171
|
]);
|
|
167
172
|
|
|
@@ -192,6 +197,16 @@ export class ModernServer {
|
|
|
192
197
|
reader.close();
|
|
193
198
|
}
|
|
194
199
|
|
|
200
|
+
public async createHTTPServer(
|
|
201
|
+
handler: (
|
|
202
|
+
req: IncomingMessage,
|
|
203
|
+
res: ServerResponse,
|
|
204
|
+
next?: () => void,
|
|
205
|
+
) => void,
|
|
206
|
+
) {
|
|
207
|
+
return createServer(handler);
|
|
208
|
+
}
|
|
209
|
+
|
|
195
210
|
// warmup ssr function
|
|
196
211
|
protected warmupSSRBundle() {
|
|
197
212
|
const { distDir } = this;
|
|
@@ -235,9 +250,6 @@ export class ModernServer {
|
|
|
235
250
|
protected async prepareFrameHandler() {
|
|
236
251
|
const { workDir, runner } = this;
|
|
237
252
|
|
|
238
|
-
// inner tool, gather user inject
|
|
239
|
-
const { api: userAPIExt, web: userWebExt } = gather(workDir);
|
|
240
|
-
|
|
241
253
|
// server hook, gather plugin inject
|
|
242
254
|
const { getMiddlewares, ...collector } = createMiddlewareCollecter();
|
|
243
255
|
|
|
@@ -249,7 +261,7 @@ export class ModernServer {
|
|
|
249
261
|
|
|
250
262
|
// get api or web server handler from server-framework plugin
|
|
251
263
|
if (await fs.pathExists(path.join(serverDir))) {
|
|
252
|
-
const webExtension = mergeExtension(pluginWebExt
|
|
264
|
+
const webExtension = mergeExtension(pluginWebExt);
|
|
253
265
|
this.frameWebHandler = await this.prepareWebHandler(webExtension);
|
|
254
266
|
}
|
|
255
267
|
|
|
@@ -259,14 +271,8 @@ export class ModernServer {
|
|
|
259
271
|
: ApiServerMode.func;
|
|
260
272
|
|
|
261
273
|
// if use lambda/, mean framework style of writing, then discard user extension
|
|
262
|
-
const apiExtension = mergeExtension(
|
|
263
|
-
|
|
264
|
-
mode === ApiServerMode.frame ? [] : userAPIExt,
|
|
265
|
-
);
|
|
266
|
-
this.frameAPIHandler = await this.prepareAPIHandler(mode, {
|
|
267
|
-
...apiExtension,
|
|
268
|
-
modernJsConfig: this.conf,
|
|
269
|
-
});
|
|
274
|
+
const apiExtension = mergeExtension(pluginAPIExt);
|
|
275
|
+
this.frameAPIHandler = await this.prepareAPIHandler(mode, apiExtension);
|
|
270
276
|
}
|
|
271
277
|
}
|
|
272
278
|
|
|
@@ -298,7 +304,7 @@ export class ModernServer {
|
|
|
298
304
|
pwd: workDir,
|
|
299
305
|
mode,
|
|
300
306
|
config: extension,
|
|
301
|
-
prefix,
|
|
307
|
+
prefix: Array.isArray(prefix) ? prefix[0] : prefix,
|
|
302
308
|
},
|
|
303
309
|
{ onLast: () => null as any },
|
|
304
310
|
);
|
|
@@ -313,11 +319,32 @@ export class ModernServer {
|
|
|
313
319
|
const preMiddleware: ModernServerAsyncHandler[] =
|
|
314
320
|
await this.runner.preServerInit(conf);
|
|
315
321
|
|
|
316
|
-
preMiddleware.forEach(mid => {
|
|
322
|
+
preMiddleware.flat().forEach(mid => {
|
|
317
323
|
this.addHandler(mid);
|
|
318
324
|
});
|
|
319
325
|
}
|
|
320
326
|
|
|
327
|
+
private prepareFavicons(
|
|
328
|
+
favicon: string | undefined,
|
|
329
|
+
faviconByEntries?: Record<string, string | undefined>,
|
|
330
|
+
) {
|
|
331
|
+
const faviconNames = [];
|
|
332
|
+
if (favicon) {
|
|
333
|
+
faviconNames.push(favicon.substring(favicon.lastIndexOf('/') + 1));
|
|
334
|
+
}
|
|
335
|
+
if (faviconByEntries) {
|
|
336
|
+
Object.keys(faviconByEntries).forEach(f => {
|
|
337
|
+
const curFavicon = faviconByEntries[f];
|
|
338
|
+
if (curFavicon) {
|
|
339
|
+
faviconNames.push(
|
|
340
|
+
curFavicon.substring(curFavicon.lastIndexOf('/') + 1),
|
|
341
|
+
);
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
return faviconNames;
|
|
346
|
+
}
|
|
347
|
+
|
|
321
348
|
/* —————————————————————— private function —————————————————————— */
|
|
322
349
|
|
|
323
350
|
// handler route.json, include api / csr / ssr
|
|
@@ -325,6 +352,8 @@ export class ModernServer {
|
|
|
325
352
|
private async routeHandler(context: ModernServerContext) {
|
|
326
353
|
const { req, res } = context;
|
|
327
354
|
|
|
355
|
+
await this.runner.beforeMatch({ context }, { onLast: noop as any });
|
|
356
|
+
|
|
328
357
|
// match routes in the route spec
|
|
329
358
|
const matched = this.router.match(context.url);
|
|
330
359
|
if (!matched) {
|
|
@@ -332,8 +361,19 @@ export class ModernServer {
|
|
|
332
361
|
return;
|
|
333
362
|
}
|
|
334
363
|
|
|
335
|
-
const
|
|
336
|
-
|
|
364
|
+
const routeAPI = createRouteAPI(matched, this.router);
|
|
365
|
+
await this.runner.afterMatch(
|
|
366
|
+
{ context, routeAPI },
|
|
367
|
+
{ onLast: noop as any },
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
if (res.headersSent) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const { current } = routeAPI as any;
|
|
375
|
+
const route = current.generate();
|
|
376
|
+
const params = current.parseURLParams(context.url);
|
|
337
377
|
context.setParams(params);
|
|
338
378
|
|
|
339
379
|
// route is api service
|
|
@@ -355,6 +395,7 @@ export class ModernServer {
|
|
|
355
395
|
return;
|
|
356
396
|
}
|
|
357
397
|
|
|
398
|
+
await this.runner.beforeRender({ context }, { onLast: noop as any });
|
|
358
399
|
const file = await this.routeRenderHandler(context, route);
|
|
359
400
|
if (!file) {
|
|
360
401
|
this.render404(context);
|
package/src/utils.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export const mergeExtension = (users: any[]
|
|
1
|
+
export const mergeExtension = (users: any[]) => {
|
|
2
2
|
const output: any[] = [];
|
|
3
|
-
return { middleware: output.concat(users)
|
|
3
|
+
return { middleware: output.concat(users) };
|
|
4
4
|
};
|
|
5
5
|
|
|
6
6
|
export const toMessage = (dig: string, e: Error | string): string => {
|