@modern-js/server 1.2.0 → 1.2.1-rc.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/js/modern/index.js +1 -7
  3. package/dist/js/modern/libs/context/context.js +3 -6
  4. package/dist/js/modern/libs/context/index.js +1 -7
  5. package/dist/js/modern/libs/hook-api/template.js +4 -4
  6. package/dist/js/modern/libs/proxy.js +1 -1
  7. package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +1 -2
  8. package/dist/js/modern/libs/render/index.js +6 -2
  9. package/dist/js/modern/libs/render/reader.js +8 -11
  10. package/dist/js/modern/libs/render/ssr.js +2 -1
  11. package/dist/js/modern/libs/route/index.js +2 -1
  12. package/dist/js/modern/server/index.js +3 -1
  13. package/dist/js/modern/server/modern-server.js +21 -11
  14. package/dist/js/modern/utils.js +1 -9
  15. package/dist/js/node/index.js +1 -49
  16. package/dist/js/node/libs/context/context.js +3 -6
  17. package/dist/js/node/libs/context/index.js +1 -7
  18. package/dist/js/node/libs/hook-api/template.js +4 -4
  19. package/dist/js/node/libs/proxy.js +1 -1
  20. package/dist/js/node/libs/render/cache/__tests__/cache.test.js +1 -2
  21. package/dist/js/node/libs/render/index.js +6 -2
  22. package/dist/js/node/libs/render/reader.js +8 -11
  23. package/dist/js/node/libs/render/ssr.js +2 -1
  24. package/dist/js/node/libs/route/index.js +6 -0
  25. package/dist/js/node/server/index.js +3 -1
  26. package/dist/js/node/server/modern-server.js +21 -11
  27. package/dist/js/node/utils.js +2 -12
  28. package/dist/types/index.d.ts +1 -3
  29. package/dist/types/libs/context/context.d.ts +7 -7
  30. package/dist/types/libs/context/index.d.ts +1 -8
  31. package/dist/types/libs/hook-api/template.d.ts +4 -4
  32. package/dist/types/libs/render/index.d.ts +10 -1
  33. package/dist/types/libs/render/ssr.d.ts +2 -1
  34. package/dist/types/libs/render/type.d.ts +2 -21
  35. package/dist/types/libs/route/index.d.ts +2 -1
  36. package/dist/types/server/modern-server.d.ts +1 -1
  37. package/dist/types/type.d.ts +6 -0
  38. package/dist/types/utils.d.ts +1 -2
  39. package/package.json +14 -12
  40. package/src/index.ts +2 -8
  41. package/src/libs/context/context.ts +8 -7
  42. package/src/libs/context/index.ts +2 -6
  43. package/src/libs/hook-api/template.ts +4 -4
  44. package/src/libs/proxy.ts +1 -1
  45. package/src/libs/render/cache/__tests__/cache.test.ts +2 -2
  46. package/src/libs/render/index.ts +21 -11
  47. package/src/libs/render/reader.ts +8 -8
  48. package/src/libs/render/ssr.ts +4 -0
  49. package/src/libs/render/type.ts +2 -17
  50. package/src/libs/route/index.ts +2 -1
  51. package/src/server/index.ts +1 -1
  52. package/src/server/modern-server.ts +20 -12
  53. package/src/type.ts +7 -0
  54. package/src/utils.ts +0 -14
  55. package/tests/.eslintrc.js +6 -0
  56. package/tests/context.test.ts +41 -0
  57. package/tests/fixtures/hosting-files/static/index.js +1 -0
  58. package/tests/fixtures/pure/modern.config.js +5 -0
  59. package/tests/fixtures/pure/package.json +21 -0
  60. package/tests/fixtures/pure/src/App.css +119 -0
  61. package/tests/fixtures/pure/src/App.tsx +43 -0
  62. package/tests/fixtures/pure/tsconfig.json +13 -0
  63. package/tests/fixtures/route-spec/index.json +29 -0
  64. package/tests/helper.ts +8 -0
  65. package/tests/hook.test.ts +44 -0
  66. package/tests/middleware.test.ts +178 -0
  67. package/tests/route.test.ts +54 -0
  68. package/tests/server.test.ts +89 -0
  69. package/tests/tsconfig.json +14 -0
  70. package/tests/utils.test.ts +40 -0
@@ -0,0 +1,54 @@
1
+ import { RouteMatchManager, RouteMatcher } from '../src/libs/route';
2
+ import spec from './fixtures/route-spec/index.json';
3
+
4
+ describe('test route', () => {
5
+ describe('test route matcher', () => {
6
+ test('should matcher work correctyl with simple spec', () => {
7
+ const routeSpec = spec.routes[0];
8
+ const matcher = new RouteMatcher(routeSpec);
9
+ expect(matcher.spec).toBe(routeSpec);
10
+ expect(matcher.urlPath).toBe(routeSpec.urlPath);
11
+ expect(matcher.urlReg).toBeUndefined();
12
+ expect(matcher.urlMatcher).toBeUndefined();
13
+
14
+ const { isSSR, isApi, isSPA, urlPath, entryName, entryPath } =
15
+ matcher.generate();
16
+
17
+ expect(isSSR).toBeTruthy();
18
+ expect(isApi).toBeFalsy();
19
+ expect(isSPA).toBeTruthy();
20
+ expect(urlPath).toBe(routeSpec.urlPath);
21
+ expect(entryName).toBe(routeSpec.entryName);
22
+ expect(entryPath).toBe(routeSpec.entryPath);
23
+
24
+ expect(matcher.matchEntry('entry')).toBeTruthy();
25
+ expect(matcher.matchEntry('home')).toBeFalsy();
26
+ expect(matcher.matchLength('/entry')).toBe(6);
27
+ expect(matcher.matchUrlPath('/entry')).toBeTruthy();
28
+ expect(matcher.matchUrlPath('/home')).toBeFalsy();
29
+ });
30
+ });
31
+
32
+ describe('test route manager', () => {
33
+ test('should manager work correctly with simple spec', async () => {
34
+ const manager = new RouteMatchManager();
35
+ expect(manager.matchers.length).toBe(0);
36
+ manager.reset(spec.routes);
37
+ expect(manager.matchers.length).toBe(3);
38
+
39
+ const matchedByEntry = manager.matchEntry('home');
40
+ expect(matchedByEntry).toBeDefined();
41
+ expect(matchedByEntry?.generate().entryName).toBe('home');
42
+
43
+ const matchedByUrl = manager.match('/entry');
44
+ expect(matchedByUrl).toBeDefined();
45
+ expect(matchedByUrl?.generate().entryName).toBe('entry');
46
+
47
+ const SSRUrlBundles = manager.getBundles();
48
+ expect(SSRUrlBundles).toEqual(['bundles/entry.js', 'bundles/home.js']);
49
+
50
+ manager.reset([]);
51
+ expect(manager.matchers.length).toBe(0);
52
+ });
53
+ });
54
+ });
@@ -0,0 +1,89 @@
1
+ import path from 'path';
2
+ import { defaultsConfig, NormalizedConfig } from '@modern-js/core';
3
+ import { ModernServerContext, NextFunction } from '@modern-js/types';
4
+ import createServer, { Server } from '../src';
5
+
6
+ describe('test server', () => {
7
+ test('should throw error when ', resolve => {
8
+ try {
9
+ createServer(null as any);
10
+ } catch (e: any) {
11
+ expect((e as Error).message).toBe(
12
+ 'can not start mserver without options',
13
+ );
14
+ resolve();
15
+ }
16
+ });
17
+
18
+ test('shoule get modern server instance', async () => {
19
+ const server = await createServer({
20
+ config: defaultsConfig as NormalizedConfig,
21
+ pwd: path.join(__dirname, './fixtures/pure'),
22
+ });
23
+ expect(server instanceof Server).toBe(true);
24
+ });
25
+
26
+ describe('shoule get production modern server instance', () => {
27
+ const appDirectory = path.join(__dirname, './fixtures/pure');
28
+
29
+ test('should init server correctly', async () => {
30
+ const server = await createServer({
31
+ config: defaultsConfig as NormalizedConfig,
32
+ pwd: appDirectory,
33
+ });
34
+ const modernServer = (server as any).server;
35
+
36
+ const {
37
+ pwd,
38
+ distDir,
39
+ workDir,
40
+ conf,
41
+ handlers,
42
+ isDev,
43
+ staticGenerate,
44
+ presetRoutes,
45
+ } = modernServer;
46
+ expect(pwd).toBe(appDirectory);
47
+ expect(distDir).toBe(path.join(appDirectory, 'dist'));
48
+ expect(workDir).toBe(distDir);
49
+ expect(conf).toBe(defaultsConfig);
50
+ expect(handlers).toBeDefined();
51
+ expect(isDev).toBeFalsy();
52
+ expect(staticGenerate).toBeFalsy();
53
+ expect(presetRoutes).toBeUndefined();
54
+ });
55
+
56
+ test('should add handler correctly', async () => {
57
+ const server = await createServer({
58
+ config: defaultsConfig as NormalizedConfig,
59
+ pwd: appDirectory,
60
+ });
61
+ const modernServer = server.server as any;
62
+
63
+ const len = modernServer.handlers.length;
64
+
65
+ const syncHandler = (ctx: ModernServerContext, next: NextFunction) => {
66
+ console.info(ctx.url);
67
+ next();
68
+ };
69
+ modernServer.addHandler(syncHandler);
70
+
71
+ const newLen = modernServer.handlers.length;
72
+ expect(len + 1).toBe(newLen);
73
+ expect(modernServer.handlers[newLen - 1]).not.toBe(syncHandler);
74
+
75
+ const asyncHandler = async (
76
+ ctx: ModernServerContext,
77
+ next: NextFunction,
78
+ ) => {
79
+ console.info(ctx.url);
80
+ next();
81
+ };
82
+ modernServer.addHandler(asyncHandler);
83
+ const nextLen = modernServer.handlers.length;
84
+
85
+ expect(newLen + 1).toBe(nextLen);
86
+ expect(modernServer.handlers[nextLen - 1]).toBe(asyncHandler);
87
+ });
88
+ });
89
+ });
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "@modern-js/tsconfig/base",
3
+ "compilerOptions": {
4
+ "declaration": false,
5
+ "jsx": "preserve",
6
+ "baseUrl": "./",
7
+ "isolatedModules": true,
8
+ "sourceMap": true
9
+ },
10
+ "paths": {
11
+ "@/*": ["../src/*"]
12
+ },
13
+ "exclude": ["src/__test__/fixtures/**"]
14
+ }
@@ -0,0 +1,40 @@
1
+ import {
2
+ noop,
3
+ mergeExtension,
4
+ toMessage,
5
+ createErrorDocument,
6
+ } from '../src/utils';
7
+
8
+ describe('test server utils', () => {
9
+ test('should get nothing from noop', async () => {
10
+ const rtn = noop();
11
+ expect(rtn).toBeUndefined();
12
+ });
13
+
14
+ test('should merge extension', () => {
15
+ const middleware = ['foo', 'baz'];
16
+ const extension = mergeExtension(middleware);
17
+ expect(extension.middleware).toEqual(middleware);
18
+ });
19
+
20
+ describe('test some case by toMessage func', () => {
21
+ test('should get message from error like object', () => {
22
+ const error = new Error('some error happened');
23
+ const message = toMessage('error info', error);
24
+ expect(message).toBe('error info: some error happened');
25
+ });
26
+
27
+ test('should get message from error message', () => {
28
+ const errorMsg = 'some error happened';
29
+ const message = toMessage('error info', errorMsg);
30
+ expect(message).toBe('error info: some error happened');
31
+ });
32
+ });
33
+
34
+ test('should return document text', () => {
35
+ const doc = createErrorDocument(302, 'redirect');
36
+ expect(doc).toMatch('302');
37
+ expect(doc).toMatch('redirect');
38
+ expect(doc).toMatch('302: redirect');
39
+ });
40
+ });