@modern-js/prod-server 1.0.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.
Files changed (173) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +30 -0
  4. package/dist/js/modern/constants.js +26 -0
  5. package/dist/js/modern/index.js +14 -0
  6. package/dist/js/modern/libs/context/context.js +180 -0
  7. package/dist/js/modern/libs/context/index.js +3 -0
  8. package/dist/js/modern/libs/hook-api/route.js +39 -0
  9. package/dist/js/modern/libs/hook-api/template.js +61 -0
  10. package/dist/js/modern/libs/metrics.js +12 -0
  11. package/dist/js/modern/libs/proxy.js +33 -0
  12. package/dist/js/modern/libs/render/cache/__tests__/cache.fun.test.js +70 -0
  13. package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +233 -0
  14. package/dist/js/modern/libs/render/cache/__tests__/cacheable.js +53 -0
  15. package/dist/js/modern/libs/render/cache/__tests__/error-configuration.js +35 -0
  16. package/dist/js/modern/libs/render/cache/__tests__/matched-cache.js +121 -0
  17. package/dist/js/modern/libs/render/cache/index.js +74 -0
  18. package/dist/js/modern/libs/render/cache/page-caches/index.js +9 -0
  19. package/dist/js/modern/libs/render/cache/page-caches/lru.js +35 -0
  20. package/dist/js/modern/libs/render/cache/spr.js +280 -0
  21. package/dist/js/modern/libs/render/cache/type.js +1 -0
  22. package/dist/js/modern/libs/render/cache/util.js +79 -0
  23. package/dist/js/modern/libs/render/index.js +65 -0
  24. package/dist/js/modern/libs/render/modern/browser-list.js +7 -0
  25. package/dist/js/modern/libs/render/modern/index.js +42 -0
  26. package/dist/js/modern/libs/render/reader.js +112 -0
  27. package/dist/js/modern/libs/render/ssr.js +58 -0
  28. package/dist/js/modern/libs/render/static.js +46 -0
  29. package/dist/js/modern/libs/render/type.js +7 -0
  30. package/dist/js/modern/libs/route/index.js +68 -0
  31. package/dist/js/modern/libs/route/matcher.js +94 -0
  32. package/dist/js/modern/libs/route/route.js +24 -0
  33. package/dist/js/modern/libs/serve-file.js +28 -0
  34. package/dist/js/modern/server/index.js +120 -0
  35. package/dist/js/modern/server/modern-server-split.js +81 -0
  36. package/dist/js/modern/server/modern-server.js +576 -0
  37. package/dist/js/modern/type.js +1 -0
  38. package/dist/js/modern/utils.js +112 -0
  39. package/dist/js/node/constants.js +36 -0
  40. package/dist/js/node/index.js +74 -0
  41. package/dist/js/node/libs/context/context.js +194 -0
  42. package/dist/js/node/libs/context/index.js +18 -0
  43. package/dist/js/node/libs/hook-api/route.js +48 -0
  44. package/dist/js/node/libs/hook-api/template.js +69 -0
  45. package/dist/js/node/libs/metrics.js +18 -0
  46. package/dist/js/node/libs/proxy.js +44 -0
  47. package/dist/js/node/libs/render/cache/__tests__/cache.fun.test.js +77 -0
  48. package/dist/js/node/libs/render/cache/__tests__/cache.test.js +238 -0
  49. package/dist/js/node/libs/render/cache/__tests__/cacheable.js +60 -0
  50. package/dist/js/node/libs/render/cache/__tests__/error-configuration.js +42 -0
  51. package/dist/js/node/libs/render/cache/__tests__/matched-cache.js +128 -0
  52. package/dist/js/node/libs/render/cache/index.js +86 -0
  53. package/dist/js/node/libs/render/cache/page-caches/index.js +17 -0
  54. package/dist/js/node/libs/render/cache/page-caches/lru.js +47 -0
  55. package/dist/js/node/libs/render/cache/spr.js +298 -0
  56. package/dist/js/node/libs/render/cache/type.js +5 -0
  57. package/dist/js/node/libs/render/cache/util.js +105 -0
  58. package/dist/js/node/libs/render/index.js +91 -0
  59. package/dist/js/node/libs/render/modern/browser-list.js +14 -0
  60. package/dist/js/node/libs/render/modern/index.js +58 -0
  61. package/dist/js/node/libs/render/reader.js +139 -0
  62. package/dist/js/node/libs/render/ssr.js +76 -0
  63. package/dist/js/node/libs/render/static.js +62 -0
  64. package/dist/js/node/libs/render/type.js +14 -0
  65. package/dist/js/node/libs/route/index.js +83 -0
  66. package/dist/js/node/libs/route/matcher.js +108 -0
  67. package/dist/js/node/libs/route/route.js +33 -0
  68. package/dist/js/node/libs/serve-file.js +41 -0
  69. package/dist/js/node/server/index.js +142 -0
  70. package/dist/js/node/server/modern-server-split.js +97 -0
  71. package/dist/js/node/server/modern-server.js +614 -0
  72. package/dist/js/node/type.js +5 -0
  73. package/dist/js/node/utils.js +143 -0
  74. package/dist/js/styles/tsconfig.json +12 -0
  75. package/dist/types/constants.d.ts +20 -0
  76. package/dist/types/index.d.ts +11 -0
  77. package/dist/types/libs/context/context.d.ts +61 -0
  78. package/dist/types/libs/context/index.d.ts +4 -0
  79. package/dist/types/libs/hook-api/route.d.ts +14 -0
  80. package/dist/types/libs/hook-api/template.d.ts +14 -0
  81. package/dist/types/libs/metrics.d.ts +3 -0
  82. package/dist/types/libs/proxy.d.ts +4 -0
  83. package/dist/types/libs/render/cache/__tests__/cache.fun.test.d.ts +1 -0
  84. package/dist/types/libs/render/cache/__tests__/cache.test.d.ts +1 -0
  85. package/dist/types/libs/render/cache/__tests__/cacheable.d.ts +62 -0
  86. package/dist/types/libs/render/cache/__tests__/error-configuration.d.ts +28 -0
  87. package/dist/types/libs/render/cache/__tests__/matched-cache.d.ts +124 -0
  88. package/dist/types/libs/render/cache/index.d.ts +6 -0
  89. package/dist/types/libs/render/cache/page-caches/index.d.ts +2 -0
  90. package/dist/types/libs/render/cache/page-caches/lru.d.ts +15 -0
  91. package/dist/types/libs/render/cache/spr.d.ts +24 -0
  92. package/dist/types/libs/render/cache/type.d.ts +48 -0
  93. package/dist/types/libs/render/cache/util.d.ts +17 -0
  94. package/dist/types/libs/render/index.d.ts +18 -0
  95. package/dist/types/libs/render/modern/browser-list.d.ts +1 -0
  96. package/dist/types/libs/render/modern/index.d.ts +3 -0
  97. package/dist/types/libs/render/reader.d.ts +18 -0
  98. package/dist/types/libs/render/ssr.d.ts +10 -0
  99. package/dist/types/libs/render/static.d.ts +3 -0
  100. package/dist/types/libs/render/type.d.ts +33 -0
  101. package/dist/types/libs/route/index.d.ts +15 -0
  102. package/dist/types/libs/route/matcher.d.ts +15 -0
  103. package/dist/types/libs/route/route.d.ts +14 -0
  104. package/dist/types/libs/serve-file.d.ts +8 -0
  105. package/dist/types/server/index.d.ts +20 -0
  106. package/dist/types/server/modern-server-split.d.ts +26 -0
  107. package/dist/types/server/modern-server.d.ts +72 -0
  108. package/dist/types/type.d.ts +56 -0
  109. package/dist/types/utils.d.ts +19 -0
  110. package/jest.config.js +9 -0
  111. package/modern.config.js +2 -0
  112. package/package.json +82 -0
  113. package/src/constants.ts +26 -0
  114. package/src/index.ts +18 -0
  115. package/src/libs/context/context.ts +183 -0
  116. package/src/libs/context/index.ts +7 -0
  117. package/src/libs/hook-api/route.ts +42 -0
  118. package/src/libs/hook-api/template.ts +53 -0
  119. package/src/libs/metrics.ts +15 -0
  120. package/src/libs/proxy.ts +42 -0
  121. package/src/libs/render/cache/__tests__/cache.fun.test.ts +94 -0
  122. package/src/libs/render/cache/__tests__/cache.test.ts +240 -0
  123. package/src/libs/render/cache/__tests__/cacheable.ts +44 -0
  124. package/src/libs/render/cache/__tests__/error-configuration.ts +34 -0
  125. package/src/libs/render/cache/__tests__/matched-cache.ts +88 -0
  126. package/src/libs/render/cache/index.ts +75 -0
  127. package/src/libs/render/cache/page-caches/index.ts +11 -0
  128. package/src/libs/render/cache/page-caches/lru.ts +38 -0
  129. package/src/libs/render/cache/spr.ts +301 -0
  130. package/src/libs/render/cache/type.ts +59 -0
  131. package/src/libs/render/cache/util.ts +97 -0
  132. package/src/libs/render/index.ts +79 -0
  133. package/src/libs/render/modern/browser-list.ts +7 -0
  134. package/src/libs/render/modern/index.ts +41 -0
  135. package/src/libs/render/modern/module.d.ts +4 -0
  136. package/src/libs/render/reader.ts +119 -0
  137. package/src/libs/render/ssr.ts +67 -0
  138. package/src/libs/render/static.ts +52 -0
  139. package/src/libs/render/type.ts +38 -0
  140. package/src/libs/route/index.ts +76 -0
  141. package/src/libs/route/matcher.ts +108 -0
  142. package/src/libs/route/route.ts +34 -0
  143. package/src/libs/serve-file.ts +34 -0
  144. package/src/server/index.ts +147 -0
  145. package/src/server/modern-server-split.ts +97 -0
  146. package/src/server/modern-server.ts +613 -0
  147. package/src/tsconfig.json +12 -0
  148. package/src/type.ts +61 -0
  149. package/src/utils.ts +122 -0
  150. package/tests/.eslintrc.js +6 -0
  151. package/tests/context.test.ts +52 -0
  152. package/tests/fixtures/hosting-files/static/index.js +1 -0
  153. package/tests/fixtures/pure/modern.config.js +5 -0
  154. package/tests/fixtures/pure/package.json +21 -0
  155. package/tests/fixtures/pure/src/App.css +119 -0
  156. package/tests/fixtures/pure/src/App.tsx +43 -0
  157. package/tests/fixtures/pure/tsconfig.json +12 -0
  158. package/tests/fixtures/reader/index.ts +3 -0
  159. package/tests/fixtures/route-spec/dynamic.json +13 -0
  160. package/tests/fixtures/route-spec/index.json +29 -0
  161. package/tests/fixtures/ssr/bundle.js +5 -0
  162. package/tests/fixtures/static-dir/bar.html +11 -0
  163. package/tests/fixtures/static-dir/baz/index.html +11 -0
  164. package/tests/fixtures/static-dir/foo/index.html +11 -0
  165. package/tests/helper.ts +8 -0
  166. package/tests/hook.test.ts +44 -0
  167. package/tests/middleware.test.ts +179 -0
  168. package/tests/render.test.ts +102 -0
  169. package/tests/route.test.ts +77 -0
  170. package/tests/server.test.ts +101 -0
  171. package/tests/tsconfig.json +12 -0
  172. package/tests/utils.test.ts +106 -0
  173. package/tsconfig.json +11 -0
@@ -0,0 +1,179 @@
1
+ import path from 'path';
2
+ import EventEmitter from 'events';
3
+ import { Readable } from 'stream';
4
+ import { createServer, Server } from 'http';
5
+ import httpMocks from 'node-mocks-http';
6
+ import portfinder from 'portfinder';
7
+ import axios from 'axios';
8
+ import { createContext } from '../src/libs/context';
9
+ import { createStaticFileHandler } from '../src/libs/serve-file';
10
+ import { createProxyHandler } from '../src/libs/proxy';
11
+
12
+ describe('test middleware create factory', () => {
13
+ describe('should create static-file handler correctly', () => {
14
+ const middleware = createStaticFileHandler([
15
+ {
16
+ path: /static\/|upload\//,
17
+ target: path.join(__dirname, './fixtures/hosting-files'),
18
+ },
19
+ ]);
20
+
21
+ test('should get static file correctly', resolve => {
22
+ const req = httpMocks.createRequest({
23
+ path: '/static/index.js',
24
+ eventEmitter: Readable,
25
+ });
26
+ const res = httpMocks.createResponse({ eventEmitter: EventEmitter });
27
+ const mockContext = createContext(req, res);
28
+ res.on('finish', () => {
29
+ expect(res._getBuffer().toString().trim()).toBe(
30
+ "console.info('index.js');",
31
+ );
32
+ resolve();
33
+ });
34
+
35
+ middleware(mockContext, () => {
36
+ throw new Error('should not happened');
37
+ });
38
+ });
39
+
40
+ test('should miss static file correctly', resolve => {
41
+ const req = httpMocks.createRequest({
42
+ path: '/static/index.css',
43
+ eventEmitter: Readable,
44
+ });
45
+ const res = httpMocks.createResponse({ eventEmitter: EventEmitter });
46
+ const mockContext = createContext(req, res);
47
+ res.on('finish', () => {
48
+ throw new Error('should not happened');
49
+ });
50
+
51
+ middleware(mockContext, () => {
52
+ req.destroy();
53
+ expect(true).toBeTruthy();
54
+ resolve();
55
+ });
56
+ });
57
+ });
58
+
59
+ jest.setTimeout(1000 * 10);
60
+ describe('should create proxy handler correctly', () => {
61
+ test('should return null if no options', () => {
62
+ expect(createProxyHandler(null as any)).toBeNull();
63
+ });
64
+
65
+ let sourceServerPort = 8080;
66
+ let sourceServer: Server | null = null;
67
+ beforeAll(async () => {
68
+ let done: any;
69
+ const promise = new Promise(resolve => (done = resolve));
70
+ sourceServerPort = await portfinder.getPortPromise();
71
+ sourceServer = createServer((req, res) => {
72
+ res.setHeader('Access-Control-Allow-Origin', '*');
73
+ res.write(req.url?.slice(1));
74
+ res.end();
75
+ }).listen(sourceServerPort, done);
76
+ return promise;
77
+ });
78
+
79
+ afterAll(() => {
80
+ if (sourceServer) {
81
+ sourceServer.close();
82
+ }
83
+ });
84
+
85
+ test('should proxy correctly use simply options', async () => {
86
+ const port = await portfinder.getPortPromise();
87
+ const middlewares = createProxyHandler({
88
+ '/simple': `http://localhost:${sourceServerPort}`,
89
+ });
90
+ const proxyHandler = middlewares![0];
91
+
92
+ const server = createServer((req, res) => {
93
+ const context = createContext(req, res);
94
+ proxyHandler(context, () => {
95
+ throw new Error('should not happened');
96
+ });
97
+ }).listen(port);
98
+
99
+ try {
100
+ const { data } = await axios.get(`http://localhost:${port}/simple`);
101
+ expect(data).toBe('simple');
102
+ } finally {
103
+ server.close();
104
+ }
105
+ });
106
+
107
+ test('should proxy correctly use simply obj options', async () => {
108
+ const port = await portfinder.getPortPromise();
109
+ const middlewares = createProxyHandler({
110
+ '/simple-obj': {
111
+ target: `http://localhost:${sourceServerPort}`,
112
+ },
113
+ });
114
+ const proxyHandler = middlewares![0];
115
+
116
+ const server = createServer((req, res) => {
117
+ const context = createContext(req, res);
118
+ proxyHandler(context, () => {
119
+ throw new Error('should not happened');
120
+ });
121
+ }).listen(port);
122
+
123
+ try {
124
+ const { data } = await axios.get(`http://localhost:${port}/simple-obj`);
125
+ expect(data).toBe('simple-obj');
126
+ } finally {
127
+ server.close();
128
+ }
129
+ });
130
+
131
+ test('should proxy correctly use context options', async () => {
132
+ const port = await portfinder.getPortPromise();
133
+ const middlewares = createProxyHandler({
134
+ context: '/context',
135
+ target: `http://localhost:${sourceServerPort}`,
136
+ });
137
+ const proxyHandler = middlewares![0];
138
+
139
+ const server = createServer((req, res) => {
140
+ const context = createContext(req, res);
141
+ proxyHandler(context, () => {
142
+ throw new Error('should not happened');
143
+ });
144
+ }).listen(port);
145
+
146
+ try {
147
+ const { data } = await axios.get(`http://localhost:${port}/context`);
148
+ expect(data).toBe('context');
149
+ } finally {
150
+ server.close();
151
+ }
152
+ });
153
+
154
+ test('should proxy correctly use array options', async () => {
155
+ const port = await portfinder.getPortPromise();
156
+ const middlewares = createProxyHandler([
157
+ {
158
+ context: '/array',
159
+ target: `http://localhost:${sourceServerPort}`,
160
+ },
161
+ ]);
162
+ const proxyHandler = middlewares![0];
163
+
164
+ const server = createServer((req, res) => {
165
+ const context = createContext(req, res);
166
+ proxyHandler(context, () => {
167
+ throw new Error('should not happened');
168
+ });
169
+ }).listen(port);
170
+
171
+ try {
172
+ const { data } = await axios.get(`http://localhost:${port}/array`);
173
+ expect(data).toBe('array');
174
+ } finally {
175
+ server.close();
176
+ }
177
+ });
178
+ });
179
+ });
@@ -0,0 +1,102 @@
1
+ import path from 'path';
2
+ import { render } from '../src/libs/render/ssr';
3
+ import { handleDirectory } from '../src/libs/render/static';
4
+ import { LruReader } from '../src/libs/render/reader';
5
+
6
+ describe('test render function', () => {
7
+ test('should return content correctly ', async () => {
8
+ const renderResult = await render(
9
+ {
10
+ params: {},
11
+ pathname: '/foo',
12
+ host: 'localhost:8080',
13
+ query: {},
14
+ url: 'localhost:8080/foo',
15
+ cookieMap: {},
16
+ headers: {},
17
+ } as any,
18
+ {
19
+ urlPath: '/foo',
20
+ bundle: 'bundle.js',
21
+ distDir: path.join(__dirname, 'fixtures', 'ssr'),
22
+ template: 'tpl.html',
23
+ entryName: 'foo',
24
+ staticGenerate: false,
25
+ } as any,
26
+ {
27
+ extendSSRContext: () => {
28
+ // empty
29
+ },
30
+ } as any,
31
+ );
32
+
33
+ expect(renderResult.content).toMatch('Modern.js');
34
+ expect(renderResult.contentType).toMatch('text/html; charset=utf-8');
35
+ });
36
+
37
+ test('should handle directory for .html correctly', async () => {
38
+ const entryPath = path.join(__dirname, 'fixtures', 'static-dir');
39
+
40
+ const res1 = await handleDirectory(
41
+ {
42
+ path: '/modern/bar',
43
+ } as any,
44
+ entryPath,
45
+ '/modern',
46
+ );
47
+
48
+ expect(res1?.content.toString()).toMatch('bar');
49
+ });
50
+
51
+ test('should handle directory for index.html correctly', async () => {
52
+ const entryPath = path.join(__dirname, 'fixtures', 'static-dir');
53
+
54
+ const res1 = await handleDirectory(
55
+ {
56
+ path: '/modern/foo',
57
+ } as any,
58
+ entryPath,
59
+ '/modern',
60
+ );
61
+
62
+ expect(res1?.content.toString()).toMatch('foo');
63
+ });
64
+
65
+ test('should handle directory for /index.html correctly', async () => {
66
+ const entryPath = path.join(__dirname, 'fixtures', 'static-dir');
67
+
68
+ const res1 = await handleDirectory(
69
+ {
70
+ path: '/modern/baz/',
71
+ } as any,
72
+ entryPath,
73
+ '/modern',
74
+ );
75
+
76
+ expect(res1?.content.toString()).toMatch('baz');
77
+ });
78
+
79
+ test('should reader work correctly', async () => {
80
+ const reader = new LruReader();
81
+ const dir = path.join(__dirname, 'fixtures', 'reader');
82
+
83
+ const nullRes = await reader.read(path.join(dir, 'foo.ts'));
84
+ expect(nullRes).toBeNull();
85
+
86
+ const dirRes = await reader.read(path.join(dir, 'test-dir'));
87
+ expect(dirRes).toBeNull();
88
+
89
+ const res = await reader.read(path.join(dir, 'index.ts'));
90
+ expect(res).not.toBeNull();
91
+ expect(res?.content.toString()).toMatch('modern');
92
+
93
+ const res1 = await reader.read(path.join(dir, 'index.ts'));
94
+ expect(res1).not.toBeNull();
95
+ expect(res1?.content.toString()).toMatch('modern');
96
+
97
+ reader.update();
98
+ const res2 = await reader.read(path.join(dir, 'index.ts'));
99
+ expect(res2).not.toBeNull();
100
+ expect(res2?.content.toString()).toMatch('modern');
101
+ });
102
+ });
@@ -0,0 +1,77 @@
1
+ import { RouteMatchManager, RouteMatcher } from '../src/libs/route';
2
+ import spec from './fixtures/route-spec/index.json';
3
+ import dynamic from './fixtures/route-spec/dynamic.json';
4
+
5
+ describe('test route', () => {
6
+ describe('test route matcher', () => {
7
+ test('should matcher work correctyl with simple spec', () => {
8
+ const routeSpec = spec.routes[0];
9
+ const matcher = new RouteMatcher(routeSpec);
10
+ expect(matcher.spec).toBe(routeSpec);
11
+ expect(matcher.urlPath).toBe(routeSpec.urlPath);
12
+ expect(matcher.urlReg).toBeUndefined();
13
+ expect(matcher.urlMatcher).toBeUndefined();
14
+
15
+ const { isSSR, isApi, isSPA, urlPath, entryName, entryPath } =
16
+ matcher.generate('');
17
+
18
+ expect(isSSR).toBeTruthy();
19
+ expect(isApi).toBeFalsy();
20
+ expect(isSPA).toBeTruthy();
21
+ expect(urlPath).toBe(routeSpec.urlPath);
22
+ expect(entryName).toBe(routeSpec.entryName);
23
+ expect(entryPath).toBe(routeSpec.entryPath);
24
+
25
+ expect(matcher.matchEntry('entry')).toBeTruthy();
26
+ expect(matcher.matchEntry('home')).toBeFalsy();
27
+ expect(matcher.matchLength('/entry')).toBe(6);
28
+ expect(matcher.matchUrlPath('/entry')).toBeTruthy();
29
+ expect(matcher.matchUrlPath('/home')).toBeFalsy();
30
+ });
31
+ });
32
+
33
+ describe('test route manager', () => {
34
+ test('should manager work correctly with simple spec', async () => {
35
+ const manager = new RouteMatchManager();
36
+ expect(manager.matchers.length).toBe(0);
37
+ manager.reset(spec.routes);
38
+ expect(manager.matchers.length).toBe(3);
39
+
40
+ const matchedByEntry = manager.matchEntry('home');
41
+ expect(matchedByEntry).toBeDefined();
42
+ expect(matchedByEntry?.generate('').entryName).toBe('home');
43
+
44
+ const matchedByUrl = manager.match('/entry');
45
+ expect(matchedByUrl).toBeDefined();
46
+ expect(matchedByUrl?.generate('').entryName).toBe('entry');
47
+
48
+ const SSRUrlBundles = manager.getBundles();
49
+ expect(SSRUrlBundles).toEqual(['bundles/entry.js', 'bundles/home.js']);
50
+
51
+ manager.reset([]);
52
+ expect(manager.matchers.length).toBe(0);
53
+ });
54
+
55
+ test('should manager work correctly with dynamic spec', async () => {
56
+ const manager = new RouteMatchManager();
57
+ expect(manager.matchers.length).toBe(0);
58
+ manager.reset(dynamic.routes);
59
+ expect(manager.matchers.length).toBe(1);
60
+
61
+ const matched = manager.match('/entry/001');
62
+ expect(matched).toBeDefined();
63
+ const route = matched?.generate('/entry/001');
64
+ expect(route?.entryName).toBe('entry');
65
+ expect(route?.params).toEqual({ id: '001' });
66
+
67
+ const matchedWithTrail = manager.match('/entry/001/a');
68
+ expect(matchedWithTrail).toBeDefined();
69
+ const routeWithTrail = matchedWithTrail?.generate('/entry/001/a');
70
+ expect(routeWithTrail?.entryName).toBe('entry');
71
+ expect(routeWithTrail?.params).toEqual({ id: '001' });
72
+
73
+ const miss = manager.match('/entry');
74
+ expect(miss).toBeUndefined();
75
+ });
76
+ });
77
+ });
@@ -0,0 +1,101 @@
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
+ import { ModernServer } from '../src/server/modern-server';
6
+
7
+ describe('test server', () => {
8
+ test('should throw error when ', resolve => {
9
+ try {
10
+ createServer(null as any);
11
+ } catch (e: any) {
12
+ expect((e as Error).message).toBe(
13
+ 'can not start mserver without options',
14
+ );
15
+ resolve();
16
+ }
17
+ });
18
+
19
+ test('shoule get modern server instance', async () => {
20
+ const server = await createServer({
21
+ config: defaultsConfig as NormalizedConfig,
22
+ pwd: path.join(__dirname, './fixtures/pure'),
23
+ });
24
+ expect(server instanceof Server).toBe(true);
25
+ });
26
+
27
+ describe('shoule get production modern server instance', () => {
28
+ const appDirectory = path.join(__dirname, './fixtures/pure');
29
+
30
+ test('should init server correctly', async () => {
31
+ const server = await createServer({
32
+ config: defaultsConfig as NormalizedConfig,
33
+ pwd: appDirectory,
34
+ });
35
+ const modernServer = (server as any).server;
36
+
37
+ const {
38
+ pwd,
39
+ distDir,
40
+ workDir,
41
+ conf,
42
+ handlers,
43
+ isDev,
44
+ staticGenerate,
45
+ presetRoutes,
46
+ } = modernServer;
47
+ expect(pwd).toBe(appDirectory);
48
+ expect(distDir).toBe(path.join(appDirectory, 'dist'));
49
+ expect(workDir).toBe(distDir);
50
+ expect(conf).toBe(defaultsConfig);
51
+ expect(handlers).toBeDefined();
52
+ expect(isDev).toBeFalsy();
53
+ expect(staticGenerate).toBeFalsy();
54
+ expect(presetRoutes).toBeUndefined();
55
+ });
56
+
57
+ test('should add handler correctly', async () => {
58
+ const server = await createServer({
59
+ config: defaultsConfig as NormalizedConfig,
60
+ pwd: appDirectory,
61
+ });
62
+ const modernServer = (server as any).server;
63
+
64
+ const len = modernServer.handlers.length;
65
+
66
+ const syncHandler = (ctx: ModernServerContext, next: NextFunction) => {
67
+ console.info(ctx.url);
68
+ next();
69
+ };
70
+ modernServer.addHandler(syncHandler);
71
+
72
+ const newLen = modernServer.handlers.length;
73
+ expect(len + 1).toBe(newLen);
74
+ expect(modernServer.handlers[newLen - 1]).not.toBe(syncHandler);
75
+
76
+ const asyncHandler = async (
77
+ ctx: ModernServerContext,
78
+ next: NextFunction,
79
+ ) => {
80
+ console.info(ctx.url);
81
+ next();
82
+ };
83
+ modernServer.addHandler(asyncHandler);
84
+ const nextLen = modernServer.handlers.length;
85
+
86
+ expect(newLen + 1).toBe(nextLen);
87
+ expect(modernServer.handlers[nextLen - 1]).toBe(asyncHandler);
88
+ });
89
+
90
+ test('should get request handler correctly', async () => {
91
+ const server = await createServer({
92
+ config: defaultsConfig as NormalizedConfig,
93
+ pwd: appDirectory,
94
+ });
95
+
96
+ const modernServer: ModernServer = (server as any).server;
97
+ const handler = modernServer.getRequestHandler();
98
+ expect(typeof handler === 'function').toBeTruthy();
99
+ });
100
+ });
101
+ });
@@ -0,0 +1,12 @@
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
+ "exclude": ["src/__test__/fixtures/**"]
12
+ }
@@ -0,0 +1,106 @@
1
+ import { compile } from 'path-to-regexp';
2
+ import {
3
+ noop,
4
+ mergeExtension,
5
+ toMessage,
6
+ createErrorDocument,
7
+ createMiddlewareCollecter,
8
+ getStaticReg,
9
+ } from '../src/utils';
10
+
11
+ describe('test server utils', () => {
12
+ test('should get nothing from noop', async () => {
13
+ const rtn = noop();
14
+ expect(rtn).toBeUndefined();
15
+ });
16
+
17
+ test('should merge extension', () => {
18
+ const middleware = ['foo', 'baz'];
19
+ const extension = mergeExtension(middleware);
20
+ expect(extension.middleware).toEqual(middleware);
21
+ });
22
+
23
+ describe('test some case by toMessage func', () => {
24
+ test('should get message from error like object', () => {
25
+ const error = new Error('some error happened');
26
+ const message = toMessage('error info', error);
27
+ expect(message).toBe('error info: some error happened');
28
+ });
29
+
30
+ test('should get message from error message', () => {
31
+ const errorMsg = 'some error happened';
32
+ const message = toMessage('error info', errorMsg);
33
+ expect(message).toBe('error info: some error happened');
34
+ });
35
+ });
36
+
37
+ test('should return document text', () => {
38
+ const doc = createErrorDocument(302, 'redirect');
39
+ expect(doc).toMatch('302');
40
+ expect(doc).toMatch('redirect');
41
+ expect(doc).toMatch('302: redirect');
42
+ });
43
+
44
+ describe('test middleware collector', () => {
45
+ test('shoule return web middleware correctly', () => {
46
+ const { addWebMiddleware, getMiddlewares } = createMiddlewareCollecter();
47
+
48
+ const before = getMiddlewares();
49
+ expect(before.web).toEqual([]);
50
+
51
+ const middleware = async () => {
52
+ // empty
53
+ };
54
+ addWebMiddleware(middleware);
55
+ const after = getMiddlewares();
56
+ expect(after.web).toEqual([middleware]);
57
+ });
58
+
59
+ test('shoule return api middleware correctly', () => {
60
+ const { addAPIMiddleware, getMiddlewares } = createMiddlewareCollecter();
61
+
62
+ const before = getMiddlewares();
63
+ expect(before.web).toEqual([]);
64
+
65
+ const middleware = async () => {
66
+ // empty
67
+ };
68
+ addAPIMiddleware(middleware);
69
+ const after = getMiddlewares();
70
+ expect(after.api).toEqual([middleware]);
71
+ });
72
+ });
73
+
74
+ test('should return full path', () => {
75
+ const fn = compile('/home/:id', { encode: encodeURIComponent });
76
+ expect(fn({ id: 2 })).toBe('/home/2');
77
+ });
78
+
79
+ describe('test create static reg', () => {
80
+ test('should test static path correctly', () => {
81
+ const reg = getStaticReg();
82
+ expect(reg.test('/static')).toBeTruthy();
83
+ expect(reg.test('/upload')).toBeTruthy();
84
+ });
85
+
86
+ test('should test custom static path correctly', () => {
87
+ const reg = getStaticReg({
88
+ cssPath: 'static-css',
89
+ });
90
+ expect(reg.test('/static-css')).toBeTruthy();
91
+ });
92
+
93
+ test('should test favicon path correctly', () => {
94
+ const reg = getStaticReg({
95
+ favicon: 'index.icon',
96
+ faviconByEntries: {
97
+ foo: 'foo.icon',
98
+ baz: 'baz.icon',
99
+ },
100
+ });
101
+ expect(reg.test('/index.icon')).toBeTruthy();
102
+ expect(reg.test('/foo.icon')).toBeTruthy();
103
+ expect(reg.test('/baz.icon')).toBeTruthy();
104
+ });
105
+ });
106
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "@modern-js/tsconfig/base",
3
+ "compilerOptions": {
4
+ "declaration": false,
5
+ "jsx": "preserve",
6
+ "baseUrl": "./",
7
+ "esModuleInterop": true,
8
+ "paths": {}
9
+ },
10
+ "include": ["src"]
11
+ }