@modern-js/server 1.3.1-beta.0 → 1.4.1
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 +68 -0
- package/dist/js/modern/dev-tools/babel/register.js +1 -0
- package/dist/js/modern/dev-tools/dev-server-plugin.js +1 -2
- package/dist/js/modern/dev-tools/mock/getMockData.js +24 -1
- package/dist/js/modern/dev-tools/mock/index.js +1 -26
- package/dist/js/modern/dev-tools/socket-server.js +4 -2
- package/dist/js/modern/dev-tools/watcher/index.js +4 -7
- package/dist/js/modern/dev-tools/watcher/stats-cache.js +32 -20
- package/dist/js/modern/libs/context/context.js +6 -0
- package/dist/js/modern/libs/hook-api/route.js +6 -4
- package/dist/js/modern/libs/render/index.js +1 -0
- package/dist/js/modern/libs/render/reader.js +1 -2
- package/dist/js/modern/libs/render/ssr.js +7 -2
- package/dist/js/modern/libs/route/index.js +0 -1
- package/dist/js/modern/libs/route/matcher.js +15 -3
- package/dist/js/modern/libs/route/route.js +1 -0
- package/dist/js/modern/server/dev-server/dev-server.js +3 -0
- package/dist/js/modern/server/index.js +5 -4
- package/dist/js/modern/server/modern-server-split.js +1 -1
- package/dist/js/modern/server/modern-server.js +13 -34
- package/dist/js/modern/utils.js +39 -0
- package/dist/js/node/dev-tools/babel/register.js +1 -0
- package/dist/js/node/dev-tools/dev-server-plugin.js +1 -2
- package/dist/js/node/dev-tools/mock/getMockData.js +29 -2
- package/dist/js/node/dev-tools/mock/index.js +5 -26
- package/dist/js/node/dev-tools/socket-server.js +4 -2
- package/dist/js/node/dev-tools/watcher/index.js +7 -5
- package/dist/js/node/dev-tools/watcher/stats-cache.js +33 -20
- package/dist/js/node/libs/context/context.js +6 -0
- package/dist/js/node/libs/hook-api/route.js +6 -4
- package/dist/js/node/libs/render/index.js +1 -0
- package/dist/js/node/libs/render/reader.js +2 -1
- package/dist/js/node/libs/render/ssr.js +8 -2
- package/dist/js/node/libs/route/index.js +0 -1
- package/dist/js/node/libs/route/matcher.js +16 -3
- package/dist/js/node/libs/route/route.js +1 -0
- package/dist/js/node/server/dev-server/dev-server.js +3 -0
- package/dist/js/node/server/index.js +9 -6
- package/dist/js/node/server/modern-server-split.js +1 -1
- package/dist/js/node/server/modern-server.js +12 -33
- package/dist/js/node/utils.js +51 -2
- package/dist/types/dev-tools/mock/getMockData.d.ts +2 -1
- package/dist/types/dev-tools/socket-server.d.ts +1 -2
- package/dist/types/dev-tools/watcher/index.d.ts +2 -1
- package/dist/types/dev-tools/watcher/stats-cache.d.ts +3 -2
- package/dist/types/libs/context/context.d.ts +2 -0
- package/dist/types/libs/hook-api/route.d.ts +3 -2
- package/dist/types/libs/render/reader.d.ts +13 -0
- package/dist/types/libs/render/ssr.d.ts +1 -0
- package/dist/types/libs/route/matcher.d.ts +1 -1
- package/dist/types/libs/route/route.d.ts +1 -0
- package/dist/types/server/dev-server/dev-server-split.d.ts +3 -3
- package/dist/types/server/modern-server-split.d.ts +3 -3
- package/dist/types/server/modern-server.d.ts +1 -2
- package/dist/types/type.d.ts +6 -4
- package/dist/types/utils.d.ts +5 -1
- package/package.json +13 -12
- package/tests/context.test.ts +12 -1
- package/tests/dev.test.ts +306 -7
- package/tests/fixtures/mock/exist/config/mock/index.ts +11 -0
- package/tests/fixtures/mock/zero/config/mock/index.ts +1 -0
- package/tests/fixtures/pure/tsconfig.json +0 -1
- package/tests/fixtures/reader/index.ts +3 -0
- package/tests/fixtures/route-spec/dynamic.json +13 -0
- package/tests/fixtures/ssr/bundle.js +5 -0
- package/tests/fixtures/static-dir/bar.html +11 -0
- package/tests/fixtures/static-dir/baz/index.html +11 -0
- package/tests/fixtures/static-dir/foo/index.html +11 -0
- package/tests/fixtures/watch/a.ts +3 -0
- package/tests/fixtures/watch/index.ts +5 -0
- package/tests/fixtures/watch/stats.txt +1 -0
- package/tests/hook.test.ts +1 -1
- package/tests/render.test.ts +102 -0
- package/tests/route.test.ts +26 -3
- package/tests/utils.test.ts +35 -0
- package/tests/watcher.test.ts +6 -4
- package/src/constants.ts +0 -26
- package/src/dev-tools/babel/register.ts +0 -37
- package/src/dev-tools/dev-server-plugin.ts +0 -48
- package/src/dev-tools/https/global.d.ts +0 -3
- package/src/dev-tools/https/index.ts +0 -12
- package/src/dev-tools/launch-editor/index.ts +0 -29
- package/src/dev-tools/mock/getMockData.ts +0 -109
- package/src/dev-tools/mock/index.ts +0 -63
- package/src/dev-tools/socket-server.ts +0 -192
- package/src/dev-tools/watcher/dependency-tree.ts +0 -94
- package/src/dev-tools/watcher/index.ts +0 -81
- package/src/dev-tools/watcher/stats-cache.ts +0 -53
- package/src/index.ts +0 -16
- package/src/libs/context/context.ts +0 -176
- package/src/libs/context/index.ts +0 -7
- package/src/libs/hook-api/route.ts +0 -38
- package/src/libs/hook-api/template.ts +0 -53
- package/src/libs/metrics.ts +0 -15
- package/src/libs/proxy.ts +0 -85
- package/src/libs/render/cache/__tests__/cache.fun.test.ts +0 -94
- package/src/libs/render/cache/__tests__/cache.test.ts +0 -240
- package/src/libs/render/cache/__tests__/cacheable.ts +0 -44
- package/src/libs/render/cache/__tests__/error-configuration.ts +0 -34
- package/src/libs/render/cache/__tests__/matched-cache.ts +0 -88
- package/src/libs/render/cache/index.ts +0 -75
- package/src/libs/render/cache/page-caches/index.ts +0 -11
- package/src/libs/render/cache/page-caches/lru.ts +0 -38
- package/src/libs/render/cache/spr.ts +0 -301
- package/src/libs/render/cache/type.ts +0 -59
- package/src/libs/render/cache/util.ts +0 -97
- package/src/libs/render/index.ts +0 -78
- package/src/libs/render/modern/browser-list.ts +0 -7
- package/src/libs/render/modern/index.ts +0 -41
- package/src/libs/render/modern/module.d.ts +0 -4
- package/src/libs/render/reader.ts +0 -119
- package/src/libs/render/ssr.ts +0 -62
- package/src/libs/render/static.ts +0 -52
- package/src/libs/render/type.ts +0 -38
- package/src/libs/route/index.ts +0 -77
- package/src/libs/route/matcher.ts +0 -93
- package/src/libs/route/route.ts +0 -32
- package/src/libs/serve-file.ts +0 -34
- package/src/server/dev-server/dev-server-split.ts +0 -41
- package/src/server/dev-server/dev-server.ts +0 -300
- package/src/server/dev-server/index.ts +0 -2
- package/src/server/index.ts +0 -163
- package/src/server/modern-server-split.ts +0 -97
- package/src/server/modern-server.ts +0 -636
- package/src/type.ts +0 -88
- package/src/utils.ts +0 -79
|
@@ -15,4 +15,5 @@ declare const createStaticDataHandler: (method: string, handler: Record<string,
|
|
|
15
15
|
|
|
16
16
|
declare const _default: (filepath: string) => MockApi[];
|
|
17
17
|
|
|
18
|
-
export default _default;
|
|
18
|
+
export default _default;
|
|
19
|
+
export declare const getMatched: (context: ModernServerContext, mockApiList: MockApi[]) => MockApi | undefined;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Server } from 'http';
|
|
3
|
-
import ws from 'ws';
|
|
4
3
|
import type { Stats } from 'webpack';
|
|
5
4
|
import { DevServerOptions } from '../type';
|
|
6
5
|
export default class SocketServer {
|
|
@@ -13,7 +12,7 @@ export default class SocketServer {
|
|
|
13
12
|
prepare(app: Server): void;
|
|
14
13
|
updateStats(stats: Stats): void;
|
|
15
14
|
sockWrite(type: string, data?: Record<string, any> | string | boolean): void;
|
|
16
|
-
close(
|
|
15
|
+
close(): void;
|
|
17
16
|
private getStats;
|
|
18
17
|
private sendStats;
|
|
19
18
|
private send;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export declare class StatsCache {
|
|
2
|
-
private readonly
|
|
2
|
+
private readonly cachedHash;
|
|
3
|
+
private readonly cachedSize;
|
|
3
4
|
add(files: string[]): void;
|
|
4
5
|
refresh(filename: string): void;
|
|
5
6
|
del(filename: string): void;
|
|
6
7
|
isDiff(filename: string): boolean;
|
|
7
8
|
has(filename: string): boolean;
|
|
8
|
-
private
|
|
9
|
+
private hash;
|
|
9
10
|
}
|
|
@@ -26,9 +26,11 @@ export declare class ModernServerContext implements ModernServerContextInterface
|
|
|
26
26
|
params: Record<string, string>;
|
|
27
27
|
logger: Logger;
|
|
28
28
|
metrics?: Metrics;
|
|
29
|
+
serverData: Record<string, any>;
|
|
29
30
|
constructor(req: IncomingMessage, res: ServerResponse);
|
|
30
31
|
private bind;
|
|
31
32
|
setParams(params: Record<string, string>): void;
|
|
33
|
+
setServerData(key: string, value: any): void;
|
|
32
34
|
getReqHeader(key: string): string | string[];
|
|
33
35
|
get headers(): import("http").IncomingHttpHeaders;
|
|
34
36
|
get method(): string;
|
|
@@ -3,11 +3,12 @@ import { RouteMatchManager, RouteMatcher } from '../route';
|
|
|
3
3
|
declare class RouteAPI {
|
|
4
4
|
private readonly router;
|
|
5
5
|
private current;
|
|
6
|
-
|
|
6
|
+
private readonly url;
|
|
7
|
+
constructor(matched: RouteMatcher, router: RouteMatchManager, url: string);
|
|
7
8
|
cur(): import("../route").ModernRoute;
|
|
8
9
|
get(entryName: string): import("../route").ModernRoute | null;
|
|
9
10
|
use(entryName: string): boolean;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
export declare const createRouteAPI: (matched: RouteMatcher, router: RouteMatchManager) => RouteAPI;
|
|
13
|
+
export declare const createRouteAPI: (matched: RouteMatcher, router: RouteMatchManager, url: string) => RouteAPI;
|
|
13
14
|
export {};
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
export declare class LruReader {
|
|
3
|
+
private readonly cache;
|
|
4
|
+
constructor();
|
|
5
|
+
init(): void;
|
|
6
|
+
close(): void;
|
|
7
|
+
read(filepath: string): Promise<{
|
|
8
|
+
content: Buffer;
|
|
9
|
+
mtime: Date;
|
|
10
|
+
} | {
|
|
11
|
+
content: Buffer;
|
|
12
|
+
} | null>;
|
|
13
|
+
update(): void;
|
|
14
|
+
}
|
|
2
15
|
export declare const readFile: (filepath: string) => Promise<Buffer | undefined>;
|
|
3
16
|
export declare const updateFile: () => void;
|
|
4
17
|
export declare const init: () => void;
|
|
@@ -6,7 +6,7 @@ export declare class RouteMatcher {
|
|
|
6
6
|
urlMatcher?: MatchFunction;
|
|
7
7
|
urlReg?: RegExp;
|
|
8
8
|
constructor(spec: ModernRouteInterface);
|
|
9
|
-
generate(): ModernRoute;
|
|
9
|
+
generate(url: string): ModernRoute;
|
|
10
10
|
parseURLParams(pathname: string): Record<string, string>;
|
|
11
11
|
matchLength(pathname: string): number | null;
|
|
12
12
|
matchUrlPath(requestUrl: string): boolean;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import type { APIServerStartInput } from '@modern-js/server-
|
|
1
|
+
import type { APIServerStartInput } from '@modern-js/server-core';
|
|
2
2
|
import { mergeExtension } from '../../utils';
|
|
3
3
|
import { ModernRouteInterface } from '../../libs/route';
|
|
4
4
|
import { ApiServerMode } from '../../constants';
|
|
5
5
|
import { ModernDevServer } from './dev-server';
|
|
6
6
|
export declare class ModernSSRDevServer extends ModernDevServer {
|
|
7
7
|
protected prepareAPIHandler(_m: ApiServerMode, _: APIServerStartInput['config']): any;
|
|
8
|
-
protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-
|
|
8
|
+
protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-core").Adapter>;
|
|
9
9
|
protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
|
|
10
10
|
}
|
|
11
11
|
export declare class ModernAPIDevServer extends ModernDevServer {
|
|
12
|
-
protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<import("@modern-js/server-
|
|
12
|
+
protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<import("@modern-js/server-core").Adapter>;
|
|
13
13
|
protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
|
|
14
14
|
protected preServerInit(): Promise<void>;
|
|
15
15
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { APIServerStartInput } from '@modern-js/server-
|
|
1
|
+
import { APIServerStartInput } from '@modern-js/server-core';
|
|
2
2
|
import { mergeExtension } from '../utils';
|
|
3
3
|
import { ModernRoute, ModernRouteInterface, RouteMatcher } from '../libs/route';
|
|
4
4
|
import { ApiServerMode } from '../constants';
|
|
@@ -8,14 +8,14 @@ export declare class ModernSSRServer extends ModernServer {
|
|
|
8
8
|
protected warmupSSRBundle(): Promise<void>;
|
|
9
9
|
protected verifyMatch(context: ModernServerContext, matched: RouteMatcher): void;
|
|
10
10
|
protected prepareAPIHandler(_m: ApiServerMode, _: APIServerStartInput['config']): any;
|
|
11
|
-
protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-
|
|
11
|
+
protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-core").Adapter>;
|
|
12
12
|
protected preServerInit(): Promise<void>;
|
|
13
13
|
}
|
|
14
14
|
export declare class ModernAPIServer extends ModernServer {
|
|
15
15
|
protected emitRouteHook(_: string, _input: any): Promise<void>;
|
|
16
16
|
protected warmupSSRBundle(): Promise<void>;
|
|
17
17
|
protected prepareWebHandler(_: ReturnType<typeof mergeExtension>): any;
|
|
18
|
-
protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<import("@modern-js/server-
|
|
18
|
+
protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<import("@modern-js/server-core").Adapter>;
|
|
19
19
|
protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
|
|
20
20
|
protected preServerInit(): Promise<void>;
|
|
21
21
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { IncomingMessage, ServerResponse, Server } from 'http';
|
|
3
|
-
import { Adapter, APIServerStartInput } from '@modern-js/server-
|
|
3
|
+
import { Adapter, APIServerStartInput } from '@modern-js/server-core';
|
|
4
4
|
import type { NormalizedConfig } from '@modern-js/core';
|
|
5
5
|
import { ModernServerOptions, NextFunction, ServerHookRunner, Metrics, Logger, ReadyOptions } from '../type';
|
|
6
6
|
import { RouteMatchManager, ModernRouteInterface, ModernRoute, RouteMatcher } from '../libs/route';
|
|
@@ -68,6 +68,5 @@ export declare class ModernServer {
|
|
|
68
68
|
private requestHandler;
|
|
69
69
|
private onError;
|
|
70
70
|
private renderErrorPage;
|
|
71
|
-
private prepareFavicons;
|
|
72
71
|
}
|
|
73
72
|
export {};
|
package/dist/types/type.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import type Webpack from 'webpack';
|
|
3
|
-
import { serverManager } from '@modern-js/server-
|
|
3
|
+
import { serverManager } from '@modern-js/server-core';
|
|
4
4
|
import type { NormalizedConfig } from '@modern-js/core';
|
|
5
5
|
import type { Metrics, Logger, NextFunction } from '@modern-js/types/server';
|
|
6
6
|
import { ModernRouteInterface } from './libs/route';
|
|
@@ -12,7 +12,7 @@ declare module 'http' {
|
|
|
12
12
|
}
|
|
13
13
|
declare module '@modern-js/core' {
|
|
14
14
|
interface UserConfig {
|
|
15
|
-
bff
|
|
15
|
+
bff?: {
|
|
16
16
|
proxy: Record<string, any>;
|
|
17
17
|
};
|
|
18
18
|
}
|
|
@@ -41,9 +41,11 @@ export declare type DevServerOptions = {
|
|
|
41
41
|
export declare type ModernServerOptions = {
|
|
42
42
|
pwd: string;
|
|
43
43
|
config: NormalizedConfig;
|
|
44
|
-
plugins?:
|
|
44
|
+
plugins?: {
|
|
45
|
+
pluginPath: string;
|
|
46
|
+
}[];
|
|
45
47
|
dev?: boolean | Partial<DevServerOptions>;
|
|
46
|
-
compiler?: Webpack.MultiCompiler | Webpack.Compiler;
|
|
48
|
+
compiler?: Webpack.MultiCompiler | Webpack.Compiler | null;
|
|
47
49
|
routes?: ModernRouteInterface[];
|
|
48
50
|
staticGenerate?: boolean;
|
|
49
51
|
customServer?: boolean;
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NormalizedConfig } from '@modern-js/core';
|
|
1
2
|
export declare const mergeExtension: (users: any[]) => {
|
|
2
3
|
middleware: any[];
|
|
3
4
|
};
|
|
@@ -12,4 +13,7 @@ export declare const createMiddlewareCollecter: () => {
|
|
|
12
13
|
getMiddlewares: () => CollectMiddlewaresResult;
|
|
13
14
|
addWebMiddleware: (input: any) => void;
|
|
14
15
|
addAPIMiddleware: (input: any) => void;
|
|
15
|
-
};
|
|
16
|
+
};
|
|
17
|
+
export declare const toPath: (reg: string, params: Record<string, any>) => string;
|
|
18
|
+
export declare const getStaticReg: (output?: NormalizedConfig['output']) => RegExp;
|
|
19
|
+
export declare const prepareFavicons: (favicon: string | undefined, faviconByEntries?: Record<string, string | undefined> | undefined) => string[];
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"modern",
|
|
12
12
|
"modern.js"
|
|
13
13
|
],
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.4.1",
|
|
15
15
|
"jsnext:source": "./src/index.ts",
|
|
16
16
|
"types": "./dist/types/index.d.ts",
|
|
17
17
|
"main": "./dist/js/node/index.js",
|
|
@@ -34,13 +34,13 @@
|
|
|
34
34
|
"@babel/preset-typescript": "^7.15.0",
|
|
35
35
|
"@babel/register": "^7.15.3",
|
|
36
36
|
"@babel/runtime": "^7",
|
|
37
|
-
"@modern-js/core": "^1.
|
|
38
|
-
"@modern-js/hmr-client": "^1.2.
|
|
39
|
-
"@modern-js/server-
|
|
40
|
-
"@modern-js/server-utils": "^1.2.
|
|
41
|
-
"@modern-js/bff-utils": "^1.2.
|
|
42
|
-
"@modern-js/utils": "^1.
|
|
43
|
-
"axios": "^0.
|
|
37
|
+
"@modern-js/core": "^1.4.1",
|
|
38
|
+
"@modern-js/hmr-client": "^1.2.1",
|
|
39
|
+
"@modern-js/server-core": "^1.2.2",
|
|
40
|
+
"@modern-js/server-utils": "^1.2.1",
|
|
41
|
+
"@modern-js/bff-utils": "^1.2.2",
|
|
42
|
+
"@modern-js/utils": "^1.3.1",
|
|
43
|
+
"axios": "^0.24.0",
|
|
44
44
|
"babel-plugin-module-resolver": "^4.1.0",
|
|
45
45
|
"chokidar": "^3.5.2",
|
|
46
46
|
"compare-versions": "^3.6.0",
|
|
@@ -60,11 +60,12 @@
|
|
|
60
60
|
"ua-parser-js": "^0.7.28",
|
|
61
61
|
"webpack-dev-middleware": "^5.0.0",
|
|
62
62
|
"ws": "^8.2.0",
|
|
63
|
-
"lodash.clone": "^4.5.0"
|
|
63
|
+
"lodash.clone": "^4.5.0",
|
|
64
|
+
"cookie": "^0.4.2"
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
66
67
|
"@scripts/build": "0.0.0",
|
|
67
|
-
"@modern-js/types": "^1.
|
|
68
|
+
"@modern-js/types": "^1.3.1",
|
|
68
69
|
"@types/jest": "^26",
|
|
69
70
|
"@types/lru-cache": "^5.1.1",
|
|
70
71
|
"@types/mime-types": "^2.1.0",
|
|
@@ -79,6 +80,7 @@
|
|
|
79
80
|
"@types/webpack-dev-middleware": "^5.0.2",
|
|
80
81
|
"@types/ws": "^7.4.7",
|
|
81
82
|
"@types/lodash.clone": "^4",
|
|
83
|
+
"@types/cookie": "^0.4.1",
|
|
82
84
|
"typescript": "^4",
|
|
83
85
|
"webpack": "^5.54.0",
|
|
84
86
|
"node-mocks-http": "^1.11.0",
|
|
@@ -98,8 +100,7 @@
|
|
|
98
100
|
},
|
|
99
101
|
"publishConfig": {
|
|
100
102
|
"registry": "https://registry.npmjs.org/",
|
|
101
|
-
"access": "public"
|
|
102
|
-
"types": "./dist/types/index.d.ts"
|
|
103
|
+
"access": "public"
|
|
103
104
|
},
|
|
104
105
|
"scripts": {
|
|
105
106
|
"new": "modern new",
|
package/tests/context.test.ts
CHANGED
|
@@ -14,6 +14,7 @@ describe('test server context', () => {
|
|
|
14
14
|
method: 'GET',
|
|
15
15
|
});
|
|
16
16
|
const res = httpMocks.createResponse({ eventEmitter: EventEmitter });
|
|
17
|
+
const context = createContext(req, res);
|
|
17
18
|
const {
|
|
18
19
|
method,
|
|
19
20
|
url,
|
|
@@ -25,7 +26,7 @@ describe('test server context', () => {
|
|
|
25
26
|
querystring,
|
|
26
27
|
protocol,
|
|
27
28
|
params,
|
|
28
|
-
} =
|
|
29
|
+
} = context;
|
|
29
30
|
|
|
30
31
|
expect(method).toBe('GET');
|
|
31
32
|
expect(url).toBe('/pathname?foo=baz');
|
|
@@ -37,5 +38,15 @@ describe('test server context', () => {
|
|
|
37
38
|
expect(querystring).toBe('foo=baz');
|
|
38
39
|
expect(protocol).toBe('http');
|
|
39
40
|
expect(params).toEqual({});
|
|
41
|
+
|
|
42
|
+
expect(context.serverData).toEqual({});
|
|
43
|
+
context.setServerData('foo', {
|
|
44
|
+
name: 'foo',
|
|
45
|
+
});
|
|
46
|
+
expect(context.serverData).toEqual({
|
|
47
|
+
foo: {
|
|
48
|
+
name: 'foo',
|
|
49
|
+
},
|
|
50
|
+
});
|
|
40
51
|
});
|
|
41
52
|
});
|
package/tests/dev.test.ts
CHANGED
|
@@ -1,11 +1,30 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { webpack } from 'webpack';
|
|
4
|
+
import { fs, LAUNCH_EDITOR_ENDPOINT } from '@modern-js/utils';
|
|
2
5
|
import SocketServer from '../src/dev-tools/socket-server';
|
|
6
|
+
import DevServerPlugin from '../src/dev-tools/dev-server-plugin';
|
|
7
|
+
import Watcher, { getWatchedFiles } from '../src/dev-tools/watcher';
|
|
8
|
+
import { StatsCache } from '../src/dev-tools/watcher/stats-cache';
|
|
9
|
+
import { createMockHandler } from '../src/dev-tools/mock';
|
|
10
|
+
import getMockData, { getMatched } from '../src/dev-tools/mock/getMockData';
|
|
11
|
+
import { createLaunchEditorHandler } from '../src/dev-tools/launch-editor';
|
|
12
|
+
import { genHttpsOptions } from '../src/dev-tools/https';
|
|
13
|
+
|
|
14
|
+
const noop = () => {
|
|
15
|
+
// empty
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
function getRandomPort() {
|
|
19
|
+
return Math.floor(Math.random() * (8000 - 1024)) + 1024;
|
|
20
|
+
}
|
|
3
21
|
|
|
4
22
|
describe('test dev tools', () => {
|
|
5
23
|
test('should socket server work correctly', () => {
|
|
24
|
+
const port = getRandomPort();
|
|
6
25
|
const socketServer: any = new SocketServer({
|
|
7
26
|
client: {
|
|
8
|
-
port:
|
|
27
|
+
port: port.toString(),
|
|
9
28
|
overlay: false,
|
|
10
29
|
logging: 'error',
|
|
11
30
|
path: '/',
|
|
@@ -18,11 +37,9 @@ describe('test dev tools', () => {
|
|
|
18
37
|
hot: true,
|
|
19
38
|
liveReload: true,
|
|
20
39
|
});
|
|
21
|
-
const app = http
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
})
|
|
25
|
-
.listen(8080);
|
|
40
|
+
const app = http.createServer((req, res) => {
|
|
41
|
+
res.end();
|
|
42
|
+
});
|
|
26
43
|
|
|
27
44
|
socketServer.prepare(app);
|
|
28
45
|
expect(socketServer.app).toBe(app);
|
|
@@ -34,6 +51,288 @@ describe('test dev tools', () => {
|
|
|
34
51
|
socketServer.updateStats(mockStats);
|
|
35
52
|
expect(socketServer.stats).toBe(mockStats);
|
|
36
53
|
|
|
37
|
-
|
|
54
|
+
const socket = {
|
|
55
|
+
state: 1,
|
|
56
|
+
close() {
|
|
57
|
+
socket.state = 0;
|
|
58
|
+
// empty
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
socketServer.sockets = [socket];
|
|
62
|
+
socketServer.close();
|
|
63
|
+
expect(socket.state).toBe(0);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('should dev server plugin work correctly', () => {
|
|
67
|
+
const compiler = webpack({});
|
|
68
|
+
new DevServerPlugin({
|
|
69
|
+
client: {
|
|
70
|
+
port: '8080',
|
|
71
|
+
overlay: false,
|
|
72
|
+
logging: 'error',
|
|
73
|
+
path: '/',
|
|
74
|
+
host: '127.0.0.1',
|
|
75
|
+
},
|
|
76
|
+
dev: {
|
|
77
|
+
writeToDisk: false,
|
|
78
|
+
},
|
|
79
|
+
watch: true,
|
|
80
|
+
hot: true,
|
|
81
|
+
liveReload: true,
|
|
82
|
+
}).apply(compiler);
|
|
83
|
+
|
|
84
|
+
// expect(compiler.options.entry)
|
|
85
|
+
const entryPluginHook = compiler.hooks.compilation.taps.filter(
|
|
86
|
+
tap => tap.name === 'EntryPlugin',
|
|
87
|
+
);
|
|
88
|
+
const hotPluginHook = compiler.hooks.compilation.taps.filter(
|
|
89
|
+
tap => tap.name === 'HotModuleReplacementPlugin',
|
|
90
|
+
);
|
|
91
|
+
expect(entryPluginHook.length).toBe(3);
|
|
92
|
+
expect(hotPluginHook.length).toBe(1);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('test watcher', () => {
|
|
96
|
+
let watcher: any;
|
|
97
|
+
const baseDir = path.join(__dirname, 'fixtures');
|
|
98
|
+
const watchDir = path.join(baseDir, 'watch/**');
|
|
99
|
+
const filepath = path.join(baseDir, 'watch', 'index.ts');
|
|
100
|
+
const filepatha = path.join(baseDir, 'watch', 'a.ts');
|
|
101
|
+
const txt = path.join(baseDir, 'watch', 'stats.txt');
|
|
102
|
+
|
|
103
|
+
afterEach(() => {
|
|
104
|
+
if (watcher) {
|
|
105
|
+
watcher.close();
|
|
106
|
+
}
|
|
107
|
+
fs.writeFileSync(txt, '1');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('should create watcher instance correctly', resolve => {
|
|
111
|
+
watcher = new Watcher();
|
|
112
|
+
expect(watcher.dependencyTree).toBeNull();
|
|
113
|
+
watcher.createDepTree();
|
|
114
|
+
expect(watcher.dependencyTree).not.toBeNull();
|
|
115
|
+
|
|
116
|
+
expect(watcher.watcher).toBeUndefined();
|
|
117
|
+
watcher.listen([watchDir], {}, () => {
|
|
118
|
+
// empty
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
expect(watcher.watcher).toBeDefined();
|
|
122
|
+
require(filepath);
|
|
123
|
+
expect(watcher.dependencyTree.getNode(filepath)).toBeUndefined();
|
|
124
|
+
watcher.updateDepTree();
|
|
125
|
+
expect(watcher.dependencyTree.getNode(filepath)).toBeDefined();
|
|
126
|
+
watcher.cleanDepCache(filepath);
|
|
127
|
+
expect(watcher.dependencyTree.getNode(filepath)).toBeDefined();
|
|
128
|
+
|
|
129
|
+
jest.resetModules();
|
|
130
|
+
watcher.updateDepTree();
|
|
131
|
+
expect(watcher.dependencyTree.getNode(filepath)).toBeUndefined();
|
|
132
|
+
|
|
133
|
+
setTimeout(() => {
|
|
134
|
+
const fl = getWatchedFiles(watcher.watcher);
|
|
135
|
+
expect(fl.includes(filepatha)).toBeTruthy();
|
|
136
|
+
expect(fl.includes(filepath)).toBeTruthy();
|
|
137
|
+
expect(fl.includes(txt)).toBeTruthy();
|
|
138
|
+
resolve();
|
|
139
|
+
}, 1000);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('should stats cache instance work correctly', () => {
|
|
143
|
+
const statsCache = new StatsCache();
|
|
144
|
+
|
|
145
|
+
// should not exist false before add
|
|
146
|
+
expect(statsCache.has(txt)).toBeFalsy();
|
|
147
|
+
|
|
148
|
+
// should exist true after add
|
|
149
|
+
statsCache.add([txt]);
|
|
150
|
+
expect(statsCache.has(txt)).toBeTruthy();
|
|
151
|
+
|
|
152
|
+
// should diff correctly
|
|
153
|
+
fs.writeFileSync(txt, 'foo');
|
|
154
|
+
expect(statsCache.isDiff(txt)).toBeTruthy();
|
|
155
|
+
|
|
156
|
+
// should not diff if not refresh
|
|
157
|
+
fs.writeFileSync(txt, '1');
|
|
158
|
+
expect(statsCache.isDiff(txt)).toBeFalsy();
|
|
159
|
+
|
|
160
|
+
// should diff after refresh
|
|
161
|
+
fs.writeFileSync(txt, 'foo');
|
|
162
|
+
statsCache.refresh(txt);
|
|
163
|
+
fs.writeFileSync(txt, '1');
|
|
164
|
+
expect(statsCache.isDiff(txt)).toBeTruthy();
|
|
165
|
+
|
|
166
|
+
// should diff when content change
|
|
167
|
+
statsCache.refresh(txt);
|
|
168
|
+
fs.writeFileSync(txt, '2');
|
|
169
|
+
expect(statsCache.isDiff(txt)).toBeTruthy();
|
|
170
|
+
|
|
171
|
+
// should not exist after del
|
|
172
|
+
statsCache.del(txt);
|
|
173
|
+
expect(statsCache.has(txt)).toBeFalsy();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe('should mock middleware work correctly', () => {
|
|
178
|
+
const pwd = path.join(__dirname, './fixtures/mock');
|
|
179
|
+
|
|
180
|
+
it('should return null if no config mock dir', () => {
|
|
181
|
+
expect(createMockHandler({ pwd: path.join(pwd, 'empty') })).toBeNull();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('should return null if no api dir', () => {
|
|
185
|
+
expect(createMockHandler({ pwd: path.join(pwd, 'zero') })).toBeNull();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('should return middleware if mock api exist', async () => {
|
|
189
|
+
const middleware = createMockHandler({ pwd: path.join(pwd, 'exist') });
|
|
190
|
+
|
|
191
|
+
expect(middleware).not.toBeNull();
|
|
192
|
+
|
|
193
|
+
let response: any;
|
|
194
|
+
const context: any = {
|
|
195
|
+
path: '/api/getInfo',
|
|
196
|
+
method: 'get',
|
|
197
|
+
res: {
|
|
198
|
+
setHeader: noop,
|
|
199
|
+
end: (data: any) => {
|
|
200
|
+
response = JSON.parse(data);
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
await middleware?.(context, noop);
|
|
205
|
+
expect(response).toEqual({
|
|
206
|
+
data: [1, 2, 3, 4],
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('should get api list correctly', () => {
|
|
211
|
+
const apiList = getMockData(path.join(pwd, 'exist/config/mock/index.ts'));
|
|
212
|
+
expect(apiList.length).toBe(3);
|
|
213
|
+
|
|
214
|
+
const pathList = apiList.map(api => api.path);
|
|
215
|
+
expect(pathList).toEqual([
|
|
216
|
+
'/api/getInfo',
|
|
217
|
+
'/api/getExample',
|
|
218
|
+
'/api/addInfo',
|
|
219
|
+
]);
|
|
220
|
+
|
|
221
|
+
let response: any;
|
|
222
|
+
const context: any = {
|
|
223
|
+
res: {
|
|
224
|
+
setHeader: noop,
|
|
225
|
+
end: (data: any) => {
|
|
226
|
+
response = JSON.parse(data);
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
apiList[0].handler(context, noop as any);
|
|
232
|
+
expect(response).toEqual({
|
|
233
|
+
data: [1, 2, 3, 4],
|
|
234
|
+
});
|
|
235
|
+
apiList[1].handler(context, noop as any);
|
|
236
|
+
expect(response).toEqual({ id: 1 });
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('should match api correctly', () => {
|
|
240
|
+
const apiList = [
|
|
241
|
+
{
|
|
242
|
+
method: 'get',
|
|
243
|
+
path: '/api/getInfo',
|
|
244
|
+
handler: noop,
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
method: 'get',
|
|
248
|
+
path: '/api/getExample',
|
|
249
|
+
handler: noop,
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
method: 'get',
|
|
253
|
+
path: '/api/addInfo',
|
|
254
|
+
handler: noop,
|
|
255
|
+
},
|
|
256
|
+
];
|
|
257
|
+
const matched = getMatched(
|
|
258
|
+
{ path: '/api/getInfo', method: 'get' } as any,
|
|
259
|
+
apiList,
|
|
260
|
+
);
|
|
261
|
+
expect(matched).toBe(apiList[0]);
|
|
262
|
+
|
|
263
|
+
const missMethod = getMatched(
|
|
264
|
+
{ path: '/api/getModern', method: 'post' } as any,
|
|
265
|
+
apiList,
|
|
266
|
+
);
|
|
267
|
+
expect(missMethod).toBeUndefined();
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
describe('should createLaunchEditorHandler work correctly', () => {
|
|
272
|
+
const middleware = createLaunchEditorHandler();
|
|
273
|
+
|
|
274
|
+
it('should return 200 if filename exist', () => {
|
|
275
|
+
let response: any;
|
|
276
|
+
const context: any = {
|
|
277
|
+
url: LAUNCH_EDITOR_ENDPOINT,
|
|
278
|
+
query: {
|
|
279
|
+
filename: 'test.ts',
|
|
280
|
+
},
|
|
281
|
+
res: {
|
|
282
|
+
end: (data: any) => {
|
|
283
|
+
response = data;
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
middleware(context, noop);
|
|
288
|
+
expect(context.status).toBe(200);
|
|
289
|
+
expect(response).toBeUndefined();
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('should return 500 if filename not exist', () => {
|
|
293
|
+
let response: any;
|
|
294
|
+
const context: any = {
|
|
295
|
+
url: LAUNCH_EDITOR_ENDPOINT,
|
|
296
|
+
query: {
|
|
297
|
+
filename: '',
|
|
298
|
+
},
|
|
299
|
+
res: {
|
|
300
|
+
end: (data: any) => {
|
|
301
|
+
response = data;
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
middleware(context, noop);
|
|
306
|
+
expect(context.status).toBe(500);
|
|
307
|
+
expect(typeof response === 'string').toBeTruthy();
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
it('should invoke next if not launch editor url', () => {
|
|
311
|
+
let response: any;
|
|
312
|
+
const context: any = {
|
|
313
|
+
url: '',
|
|
314
|
+
res: {
|
|
315
|
+
end: (data: any) => {
|
|
316
|
+
response = data;
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
middleware(context, noop);
|
|
321
|
+
expect(context.status).toBeUndefined();
|
|
322
|
+
expect(response).toBeUndefined();
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
test('should get http cert correctly', async () => {
|
|
327
|
+
// const options = await genHttpsOptions(true);
|
|
328
|
+
// expect(options.key).toBeDefined();
|
|
329
|
+
// expect(options.cert).toBeDefined();
|
|
330
|
+
|
|
331
|
+
const useOpt = await genHttpsOptions({
|
|
332
|
+
key: 'foo',
|
|
333
|
+
cert: 'baz',
|
|
334
|
+
});
|
|
335
|
+
expect(useOpt.key).toBe('foo');
|
|
336
|
+
expect(useOpt.cert).toBe('baz');
|
|
38
337
|
});
|
|
39
338
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default {};
|