@anansi/core 0.16.24 → 0.16.25
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 +6 -0
- package/lib/scripts/floodSpouts.js +11 -0
- package/lib/scripts/index.server.js +10 -0
- package/lib/scripts/laySpouts.js +55 -0
- package/lib/scripts/scripts/getProxyMiddlewares.js +93 -0
- package/lib/scripts/scripts/getWebpackConfig.js +16 -0
- package/lib/scripts/scripts/index.js +3 -0
- package/lib/scripts/scripts/serve.js +160 -0
- package/lib/scripts/scripts/startDevserver.js +234 -0
- package/lib/scripts/scripts/types.js +2 -0
- package/lib/scripts/spouts/DocumentComponent.js +43 -0
- package/lib/scripts/spouts/antd.server.js +33 -0
- package/lib/scripts/spouts/app.js +6 -0
- package/lib/scripts/spouts/app.server.js +6 -0
- package/lib/scripts/spouts/csp.js +27 -0
- package/lib/scripts/spouts/document.js +7 -0
- package/lib/scripts/spouts/document.server.js +63 -0
- package/lib/scripts/spouts/json.js +34 -0
- package/lib/scripts/spouts/json.server.js +39 -0
- package/lib/scripts/spouts/prefetch.server.js +20 -0
- package/lib/scripts/spouts/restHooks.js +23 -0
- package/lib/scripts/spouts/restHooks.provider.js +2 -0
- package/lib/scripts/spouts/restHooks.server.js +29 -0
- package/lib/scripts/spouts/router.js +34 -0
- package/lib/scripts/spouts/router.server.js +36 -0
- package/lib/scripts/spouts/types.js +2 -0
- package/package.json +12 -22
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
### [0.16.25](https://github.com/ntucker/anansi/compare/@anansi/core@0.16.24...@anansi/core@0.16.25) (2023-03-28)
|
|
7
|
+
|
|
8
|
+
### 📦 Package
|
|
9
|
+
|
|
10
|
+
* @ant-design/cssinjs ([230c1b1](https://github.com/ntucker/anansi/commit/230c1b1a1f47bd846023a64764ba479524211c5a))
|
|
11
|
+
|
|
6
12
|
### [0.16.24](https://github.com/ntucker/anansi/compare/@anansi/core@0.16.23...@anansi/core@0.16.24) (2023-03-27)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @anansi/core
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
2
|
+
export default async function floodSpouts(spouts, {
|
|
3
|
+
rootId = 'anansi-root'
|
|
4
|
+
} = {}) {
|
|
5
|
+
var _document$getElementB;
|
|
6
|
+
const {
|
|
7
|
+
app
|
|
8
|
+
} = await spouts({});
|
|
9
|
+
hydrateRoot((_document$getElementB = document.getElementById(rootId)) != null ? _document$getElementB : document, app);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJoeWRyYXRlUm9vdCIsImZsb29kU3BvdXRzIiwic3BvdXRzIiwicm9vdElkIiwiX2RvY3VtZW50JGdldEVsZW1lbnRCIiwiYXBwIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mbG9vZFNwb3V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaHlkcmF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZmxvb2RTcG91dHMoXG4gIHNwb3V0czogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUHJvbWlzZTx7XG4gICAgYXBwOiBKU1guRWxlbWVudDtcbiAgfT4sXG4gIHsgcm9vdElkID0gJ2FuYW5zaS1yb290JyB9OiB7IHJvb3RJZD86IHN0cmluZyB9ID0ge30sXG4pIHtcbiAgY29uc3QgeyBhcHAgfSA9IGF3YWl0IHNwb3V0cyh7fSk7XG5cbiAgaHlkcmF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocm9vdElkKSA/PyBkb2N1bWVudCwgYXBwKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBVyxRQUFRLGtCQUFrQjtBQUU5QyxlQUFlLGVBQWVDLFdBQVdBLENBQ3ZDQyxNQUVFLEVBQ0Y7RUFBRUMsTUFBTSxHQUFHO0FBQW1DLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDcEQ7RUFBQSxJQUFBQyxxQkFBQTtFQUNBLE1BQU07SUFBRUM7RUFBSSxDQUFDLEdBQUcsTUFBTUgsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBRWhDRixXQUFXLEVBQUFJLHFCQUFBLEdBQUNFLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDSixNQUFNLENBQUMsWUFBQUMscUJBQUEsR0FBSUUsUUFBUSxFQUFFRCxHQUFHLENBQUM7QUFDL0QifQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { default as laySpouts } from './laySpouts.js';
|
|
2
|
+
export { default as documentSpout } from './spouts/document.server.js';
|
|
3
|
+
export { default as restHooksSpout } from './spouts/restHooks.server.js';
|
|
4
|
+
export { default as antdSpout } from './spouts/antd.server.js';
|
|
5
|
+
export { default as routerSpout } from './spouts/router.server.js';
|
|
6
|
+
export { default as prefetchSpout } from './spouts/prefetch.server.js';
|
|
7
|
+
export { default as JSONSpout } from './spouts/json.server.js';
|
|
8
|
+
export { default as appSpout } from './spouts/app.server.js';
|
|
9
|
+
export * from './scripts/types.js';
|
|
10
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0IiwibGF5U3BvdXRzIiwiZG9jdW1lbnRTcG91dCIsInJlc3RIb29rc1Nwb3V0IiwiYW50ZFNwb3V0Iiwicm91dGVyU3BvdXQiLCJwcmVmZXRjaFNwb3V0IiwiSlNPTlNwb3V0IiwiYXBwU3BvdXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXguc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgbGF5U3BvdXRzIH0gZnJvbSAnLi9sYXlTcG91dHMuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkb2N1bWVudFNwb3V0IH0gZnJvbSAnLi9zcG91dHMvZG9jdW1lbnQuc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVzdEhvb2tzU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9yZXN0SG9va3Muc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW50ZFNwb3V0IH0gZnJvbSAnLi9zcG91dHMvYW50ZC5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByb3V0ZXJTcG91dCB9IGZyb20gJy4vc3BvdXRzL3JvdXRlci5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcmVmZXRjaFNwb3V0IH0gZnJvbSAnLi9zcG91dHMvcHJlZmV0Y2guc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSlNPTlNwb3V0IH0gZnJvbSAnLi9zcG91dHMvanNvbi5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBTcG91dCB9IGZyb20gJy4vc3BvdXRzL2FwcC5zZXJ2ZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBTZXJ2ZXJQcm9wcyB9IGZyb20gJy4vc3BvdXRzL3R5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHsgU2VydmVyU3BvdXQgYXMgU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy90eXBlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjcmlwdHMvdHlwZXMuanMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLElBQUlDLFNBQVMsUUFBUSxnQkFBZ0I7QUFDckQsU0FBU0QsT0FBTyxJQUFJRSxhQUFhLFFBQVEsNkJBQTZCO0FBQ3RFLFNBQVNGLE9BQU8sSUFBSUcsY0FBYyxRQUFRLDhCQUE4QjtBQUN4RSxTQUFTSCxPQUFPLElBQUlJLFNBQVMsUUFBUSx5QkFBeUI7QUFDOUQsU0FBU0osT0FBTyxJQUFJSyxXQUFXLFFBQVEsMkJBQTJCO0FBQ2xFLFNBQVNMLE9BQU8sSUFBSU0sYUFBYSxRQUFRLDZCQUE2QjtBQUN0RSxTQUFTTixPQUFPLElBQUlPLFNBQVMsUUFBUSx5QkFBeUI7QUFDOUQsU0FBU1AsT0FBTyxJQUFJUSxRQUFRLFFBQVEsd0JBQXdCO0FBRzVELGNBQWMsb0JBQW9CIn0=
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import { renderToPipeableStream as reactRender } from 'react-dom/server';
|
|
3
|
+
export default function laySpouts(spouts, {
|
|
4
|
+
timeoutMS = 10000,
|
|
5
|
+
onError
|
|
6
|
+
} = {}) {
|
|
7
|
+
const render = async (clientManifest, req, res) => {
|
|
8
|
+
const nonce = crypto.randomBytes(16).toString('base64');
|
|
9
|
+
try {
|
|
10
|
+
const {
|
|
11
|
+
app
|
|
12
|
+
} = await spouts({
|
|
13
|
+
clientManifest,
|
|
14
|
+
req,
|
|
15
|
+
res,
|
|
16
|
+
nonce
|
|
17
|
+
});
|
|
18
|
+
let didError = false;
|
|
19
|
+
const {
|
|
20
|
+
pipe,
|
|
21
|
+
abort
|
|
22
|
+
} = reactRender(app, {
|
|
23
|
+
nonce,
|
|
24
|
+
//bootstrapScripts: assets.filter(asset => asset.endsWith('.js')),
|
|
25
|
+
onShellReady() {
|
|
26
|
+
//managers.forEach(manager => manager.cleanup());
|
|
27
|
+
// If something errored before we started streaming, we set the error code appropriately.
|
|
28
|
+
res.statusCode = didError ? 500 : 200;
|
|
29
|
+
res.setHeader('Content-type', 'text/html');
|
|
30
|
+
pipe(res);
|
|
31
|
+
},
|
|
32
|
+
onShellError() {
|
|
33
|
+
didError = true;
|
|
34
|
+
res.statusCode = 500;
|
|
35
|
+
pipe(res);
|
|
36
|
+
},
|
|
37
|
+
onError(e) {
|
|
38
|
+
didError = true;
|
|
39
|
+
console.error(e);
|
|
40
|
+
res.statusCode = 500;
|
|
41
|
+
//pipe(res); Removing this avoids, "React currently only supports piping to one writable stream."
|
|
42
|
+
if (onError) onError(e);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
// Abandon and switch to client rendering if enough time passes.
|
|
46
|
+
// Try lowering this to see the client recover.
|
|
47
|
+
setTimeout(() => abort(`Timeout of ${timeoutMS}ms exceeded`), timeoutMS);
|
|
48
|
+
} catch (e) {
|
|
49
|
+
if (onError) onError(e);
|
|
50
|
+
throw e;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
return render;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJyZW5kZXJUb1BpcGVhYmxlU3RyZWFtIiwicmVhY3RSZW5kZXIiLCJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJvbkVycm9yIiwicmVuZGVyIiwiY2xpZW50TWFuaWZlc3QiLCJyZXEiLCJyZXMiLCJub25jZSIsInJhbmRvbUJ5dGVzIiwidG9TdHJpbmciLCJhcHAiLCJkaWRFcnJvciIsInBpcGUiLCJhYm9ydCIsIm9uU2hlbGxSZWFkeSIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJvblNoZWxsRXJyb3IiLCJlIiwiY29uc29sZSIsImVycm9yIiwic2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXlTcG91dHMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IHJlbmRlclRvUGlwZWFibGVTdHJlYW0gYXMgcmVhY3RSZW5kZXIgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcblxuaW1wb3J0IHR5cGUgeyBSZW5kZXIgfSBmcm9tICcuL3NjcmlwdHMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJQcm9wcyB9IGZyb20gJy4vc3BvdXRzL3R5cGVzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGF5U3BvdXRzKFxuICBzcG91dHM6IChwcm9wczogU2VydmVyUHJvcHMpID0+IFByb21pc2U8e1xuICAgIGFwcDogSlNYLkVsZW1lbnQ7XG4gIH0+LFxuICB7XG4gICAgdGltZW91dE1TID0gMTAwMDAsXG4gICAgb25FcnJvcixcbiAgfTogeyB0aW1lb3V0TVM/OiBudW1iZXI7IG9uRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQgfSA9IHt9LFxuKSB7XG4gIGNvbnN0IHJlbmRlcjogUmVuZGVyID0gYXN5bmMgKGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IG5vbmNlID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhcHAgfSA9IGF3YWl0IHNwb3V0cyh7IGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcywgbm9uY2UgfSk7XG5cbiAgICAgIGxldCBkaWRFcnJvciA9IGZhbHNlO1xuICAgICAgY29uc3QgeyBwaXBlLCBhYm9ydCB9ID0gcmVhY3RSZW5kZXIoYXBwLCB7XG4gICAgICAgIG5vbmNlLFxuICAgICAgICAvL2Jvb3RzdHJhcFNjcmlwdHM6IGFzc2V0cy5maWx0ZXIoYXNzZXQgPT4gYXNzZXQuZW5kc1dpdGgoJy5qcycpKSxcbiAgICAgICAgb25TaGVsbFJlYWR5KCkge1xuICAgICAgICAgIC8vbWFuYWdlcnMuZm9yRWFjaChtYW5hZ2VyID0+IG1hbmFnZXIuY2xlYW51cCgpKTtcbiAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgZXJyb3JlZCBiZWZvcmUgd2Ugc3RhcnRlZCBzdHJlYW1pbmcsIHdlIHNldCB0aGUgZXJyb3IgY29kZSBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gZGlkRXJyb3IgPyA1MDAgOiAyMDA7XG4gICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgIHBpcGUocmVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TaGVsbEVycm9yKCkge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3IoZTogYW55KSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICAgICAgLy9waXBlKHJlcyk7IFJlbW92aW5nIHRoaXMgYXZvaWRzLCBcIlJlYWN0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHBpcGluZyB0byBvbmUgd3JpdGFibGUgc3RyZWFtLlwiXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIEFiYW5kb24gYW5kIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nIGlmIGVub3VnaCB0aW1lIHBhc3Nlcy5cbiAgICAgIC8vIFRyeSBsb3dlcmluZyB0aGlzIHRvIHNlZSB0aGUgY2xpZW50IHJlY292ZXIuXG4gICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiAoYWJvcnQgYXMgYW55KShgVGltZW91dCBvZiAke3RpbWVvdXRNU31tcyBleGNlZWRlZGApLFxuICAgICAgICB0aW1lb3V0TVMsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZW5kZXI7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQU0sTUFBTSxRQUFRO0FBQzNCLFNBQVNDLHNCQUFzQixJQUFJQyxXQUFXLFFBQVEsa0JBQWtCO0FBS3hFLGVBQWUsU0FBU0MsU0FBU0EsQ0FDL0JDLE1BRUUsRUFDRjtFQUNFQyxTQUFTLEdBQUcsS0FBSztFQUNqQkM7QUFDMEQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNsRTtFQUNBLE1BQU1DLE1BQWMsR0FBRyxNQUFBQSxDQUFPQyxjQUFjLEVBQUVDLEdBQUcsRUFBRUMsR0FBRyxLQUFLO0lBQ3pELE1BQU1DLEtBQUssR0FBR1gsTUFBTSxDQUFDWSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUNDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFFdkQsSUFBSTtNQUNGLE1BQU07UUFBRUM7TUFBSSxDQUFDLEdBQUcsTUFBTVYsTUFBTSxDQUFDO1FBQUVJLGNBQWM7UUFBRUMsR0FBRztRQUFFQyxHQUFHO1FBQUVDO01BQU0sQ0FBQyxDQUFDO01BRWpFLElBQUlJLFFBQVEsR0FBRyxLQUFLO01BQ3BCLE1BQU07UUFBRUMsSUFBSTtRQUFFQztNQUFNLENBQUMsR0FBR2YsV0FBVyxDQUFDWSxHQUFHLEVBQUU7UUFDdkNILEtBQUs7UUFDTDtRQUNBTyxZQUFZQSxDQUFBLEVBQUc7VUFDYjtVQUNBO1VBQ0FSLEdBQUcsQ0FBQ1MsVUFBVSxHQUFHSixRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUc7VUFDckNMLEdBQUcsQ0FBQ1UsU0FBUyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUM7VUFDMUNKLElBQUksQ0FBQ04sR0FBRyxDQUFDO1FBQ1gsQ0FBQztRQUNEVyxZQUFZQSxDQUFBLEVBQUc7VUFDYk4sUUFBUSxHQUFHLElBQUk7VUFDZkwsR0FBRyxDQUFDUyxVQUFVLEdBQUcsR0FBRztVQUNwQkgsSUFBSSxDQUFDTixHQUFHLENBQUM7UUFDWCxDQUFDO1FBQ0RKLE9BQU9BLENBQUNnQixDQUFNLEVBQUU7VUFDZFAsUUFBUSxHQUFHLElBQUk7VUFDZlEsT0FBTyxDQUFDQyxLQUFLLENBQUNGLENBQUMsQ0FBQztVQUNoQlosR0FBRyxDQUFDUyxVQUFVLEdBQUcsR0FBRztVQUNwQjtVQUNBLElBQUliLE9BQU8sRUFBRUEsT0FBTyxDQUFDZ0IsQ0FBQyxDQUFDO1FBQ3pCO01BQ0YsQ0FBQyxDQUFDO01BQ0Y7TUFDQTtNQUNBRyxVQUFVLENBQ1IsTUFBT1IsS0FBSyxDQUFVLGNBQWFaLFNBQVUsYUFBWSxDQUFDLEVBQzFEQSxTQUFTLENBQ1Y7SUFDSCxDQUFDLENBQUMsT0FBT2lCLENBQVUsRUFBRTtNQUNuQixJQUFJaEIsT0FBTyxFQUFFQSxPQUFPLENBQUNnQixDQUFDLENBQUM7TUFDdkIsTUFBTUEsQ0FBQztJQUNUO0VBQ0YsQ0FBQztFQUNELE9BQU9mLE1BQU07QUFDZiJ9
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Essentially taken from https://github.com/webpack/webpack-dev-server/blob/b5e5b67398f97c7a2934e12ebe34fb03cc06c473/lib/Server.js#L2123
|
|
2
|
+
export default function getProxyMiddlewares(proxyConfig) {
|
|
3
|
+
const middlewares = [];
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
5
|
+
const {
|
|
6
|
+
createProxyMiddleware
|
|
7
|
+
} = require('http-proxy-middleware');
|
|
8
|
+
const proxy = !Array.isArray(proxyConfig) && typeof proxyConfig === 'object' ? Object.keys(proxyConfig).length && Object.keys(proxyConfig)[0].startsWith('/') ? Object.entries(proxyConfig).map(([path, v]) => ({
|
|
9
|
+
path,
|
|
10
|
+
...v
|
|
11
|
+
})) : [proxyConfig] : proxyConfig;
|
|
12
|
+
const getProxyMiddleware = proxyConfig => {
|
|
13
|
+
// It is possible to use the `bypass` method without a `target` or `router`.
|
|
14
|
+
// However, the proxy middleware has no use in this case, and will fail to instantiate.
|
|
15
|
+
if (proxyConfig.target) {
|
|
16
|
+
const context = proxyConfig.context || proxyConfig.path;
|
|
17
|
+
return createProxyMiddleware( /** @type {string} */context, proxyConfig);
|
|
18
|
+
}
|
|
19
|
+
if (proxyConfig.router) {
|
|
20
|
+
return createProxyMiddleware(proxyConfig);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Assume a proxy configuration specified as:
|
|
26
|
+
* proxy: [
|
|
27
|
+
* {
|
|
28
|
+
* context: "value",
|
|
29
|
+
* ...options,
|
|
30
|
+
* },
|
|
31
|
+
* // or:
|
|
32
|
+
* function() {
|
|
33
|
+
* return {
|
|
34
|
+
* context: "context",
|
|
35
|
+
* ...options,
|
|
36
|
+
* };
|
|
37
|
+
* }
|
|
38
|
+
* ]
|
|
39
|
+
*/
|
|
40
|
+
proxy.forEach(proxyConfigOrCallback => {
|
|
41
|
+
let proxyMiddleware;
|
|
42
|
+
let proxyConfig = typeof proxyConfigOrCallback === 'function' ? proxyConfigOrCallback() : proxyConfigOrCallback;
|
|
43
|
+
proxyMiddleware = getProxyMiddleware(proxyConfig);
|
|
44
|
+
|
|
45
|
+
/* TODO: figure out how to make this work
|
|
46
|
+
if (proxyConfig.ws) {
|
|
47
|
+
this.webSocketProxies.push(proxyMiddleware);
|
|
48
|
+
}
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
const handler = async (req, res, next) => {
|
|
52
|
+
if (typeof proxyConfigOrCallback === 'function') {
|
|
53
|
+
const newProxyConfig = proxyConfigOrCallback(req, res, next);
|
|
54
|
+
if (newProxyConfig !== proxyConfig) {
|
|
55
|
+
proxyConfig = newProxyConfig;
|
|
56
|
+
proxyMiddleware = getProxyMiddleware(proxyConfig);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// - Check if we have a bypass function defined
|
|
61
|
+
// - In case the bypass function is defined we'll retrieve the
|
|
62
|
+
// bypassUrl from it otherwise bypassUrl would be null
|
|
63
|
+
// TODO remove in the next major in favor `context` and `router` options
|
|
64
|
+
const bypassUrl = typeof proxyConfig.bypass === 'function' ? await proxyConfig.bypass(req, res, proxyConfig) : null;
|
|
65
|
+
if (typeof bypassUrl === 'boolean') {
|
|
66
|
+
// skip the proxy
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
68
|
+
// @ts-ignore
|
|
69
|
+
req.url = null;
|
|
70
|
+
next();
|
|
71
|
+
} else if (typeof bypassUrl === 'string') {
|
|
72
|
+
// byPass to that url
|
|
73
|
+
req.url = bypassUrl;
|
|
74
|
+
next();
|
|
75
|
+
} else if (proxyMiddleware) {
|
|
76
|
+
return proxyMiddleware(req, res, next);
|
|
77
|
+
} else {
|
|
78
|
+
next();
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
middlewares.push({
|
|
82
|
+
name: 'http-proxy-middleware',
|
|
83
|
+
middleware: handler
|
|
84
|
+
});
|
|
85
|
+
// Also forward error requests to the proxy so it can handle them.
|
|
86
|
+
middlewares.push({
|
|
87
|
+
name: 'http-proxy-middleware-error-handler',
|
|
88
|
+
middleware: (error, req, res, next) => handler(req, res, next)
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
return middlewares;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQcm94eU1pZGRsZXdhcmVzIiwicHJveHlDb25maWciLCJtaWRkbGV3YXJlcyIsImNyZWF0ZVByb3h5TWlkZGxld2FyZSIsInJlcXVpcmUiLCJwcm94eSIsIkFycmF5IiwiaXNBcnJheSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJzdGFydHNXaXRoIiwiZW50cmllcyIsIm1hcCIsInBhdGgiLCJ2IiwiZ2V0UHJveHlNaWRkbGV3YXJlIiwidGFyZ2V0IiwiY29udGV4dCIsInJvdXRlciIsImZvckVhY2giLCJwcm94eUNvbmZpZ09yQ2FsbGJhY2siLCJwcm94eU1pZGRsZXdhcmUiLCJoYW5kbGVyIiwicmVxIiwicmVzIiwibmV4dCIsIm5ld1Byb3h5Q29uZmlnIiwiYnlwYXNzVXJsIiwiYnlwYXNzIiwidXJsIiwicHVzaCIsIm5hbWUiLCJtaWRkbGV3YXJlIiwiZXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9nZXRQcm94eU1pZGRsZXdhcmVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJlcXVlc3RIYW5kbGVyLFxuICBQcm94eUNvbmZpZ0FycmF5LFxuICBSZXNwb25zZSxcbiAgUmVxdWVzdCxcbiAgTmV4dEZ1bmN0aW9uLFxuICBCeVBhc3MsXG4gIFByb3h5Q29uZmlnQXJyYXlJdGVtLFxuICBQcm94eUNvbmZpZ01hcCxcbn0gZnJvbSAnd2VicGFjay1kZXYtc2VydmVyJztcblxuLy8gRXNzZW50aWFsbHkgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay93ZWJwYWNrLWRldi1zZXJ2ZXIvYmxvYi9iNWU1YjY3Mzk4Zjk3YzdhMjkzNGUxMmViZTM0ZmIwM2NjMDZjNDczL2xpYi9TZXJ2ZXIuanMjTDIxMjNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFByb3h5TWlkZGxld2FyZXMoXG4gIHByb3h5Q29uZmlnOiBQcm94eUNvbmZpZ0FycmF5SXRlbSB8IFByb3h5Q29uZmlnTWFwIHwgUHJveHlDb25maWdBcnJheSxcbikge1xuICBjb25zdCBtaWRkbGV3YXJlczogYW55W10gPSBbXTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgY29uc3QgeyBjcmVhdGVQcm94eU1pZGRsZXdhcmUgfSA9IHJlcXVpcmUoJ2h0dHAtcHJveHktbWlkZGxld2FyZScpO1xuXG4gIGNvbnN0IHByb3h5OiBQcm94eUNvbmZpZ0FycmF5ID1cbiAgICAhQXJyYXkuaXNBcnJheShwcm94eUNvbmZpZykgJiYgdHlwZW9mIHByb3h5Q29uZmlnID09PSAnb2JqZWN0J1xuICAgICAgPyBPYmplY3Qua2V5cyhwcm94eUNvbmZpZykubGVuZ3RoICYmXG4gICAgICAgIE9iamVjdC5rZXlzKHByb3h5Q29uZmlnKVswXS5zdGFydHNXaXRoKCcvJylcbiAgICAgICAgPyBPYmplY3QuZW50cmllcyhwcm94eUNvbmZpZykubWFwKChbcGF0aCwgdl0pID0+ICh7IHBhdGgsIC4uLnYgfSkpXG4gICAgICAgIDogW3Byb3h5Q29uZmlnXVxuICAgICAgOiBwcm94eUNvbmZpZztcblxuICBjb25zdCBnZXRQcm94eU1pZGRsZXdhcmUgPSAoXG4gICAgcHJveHlDb25maWc6IFByb3h5Q29uZmlnQXJyYXlJdGVtLFxuICApOiBSZXF1ZXN0SGFuZGxlciB8IHVuZGVmaW5lZCA9PiB7XG4gICAgLy8gSXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBgYnlwYXNzYCBtZXRob2Qgd2l0aG91dCBhIGB0YXJnZXRgIG9yIGByb3V0ZXJgLlxuICAgIC8vIEhvd2V2ZXIsIHRoZSBwcm94eSBtaWRkbGV3YXJlIGhhcyBubyB1c2UgaW4gdGhpcyBjYXNlLCBhbmQgd2lsbCBmYWlsIHRvIGluc3RhbnRpYXRlLlxuICAgIGlmIChwcm94eUNvbmZpZy50YXJnZXQpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBwcm94eUNvbmZpZy5jb250ZXh0IHx8IHByb3h5Q29uZmlnLnBhdGg7XG5cbiAgICAgIHJldHVybiBjcmVhdGVQcm94eU1pZGRsZXdhcmUoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGNvbnRleHQsIHByb3h5Q29uZmlnKTtcbiAgICB9XG5cbiAgICBpZiAocHJveHlDb25maWcucm91dGVyKSB7XG4gICAgICByZXR1cm4gY3JlYXRlUHJveHlNaWRkbGV3YXJlKHByb3h5Q29uZmlnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEFzc3VtZSBhIHByb3h5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGFzOlxuICAgKiBwcm94eTogW1xuICAgKiAgIHtcbiAgICogICAgIGNvbnRleHQ6IFwidmFsdWVcIixcbiAgICogICAgIC4uLm9wdGlvbnMsXG4gICAqICAgfSxcbiAgICogICAvLyBvcjpcbiAgICogICBmdW5jdGlvbigpIHtcbiAgICogICAgIHJldHVybiB7XG4gICAqICAgICAgIGNvbnRleHQ6IFwiY29udGV4dFwiLFxuICAgKiAgICAgICAuLi5vcHRpb25zLFxuICAgKiAgICAgfTtcbiAgICogICB9XG4gICAqIF1cbiAgICovXG4gIHByb3h5LmZvckVhY2gocHJveHlDb25maWdPckNhbGxiYWNrID0+IHtcbiAgICBsZXQgcHJveHlNaWRkbGV3YXJlOiBSZXF1ZXN0SGFuZGxlciB8IHVuZGVmaW5lZDtcblxuICAgIGxldCBwcm94eUNvbmZpZyA9XG4gICAgICB0eXBlb2YgcHJveHlDb25maWdPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gcHJveHlDb25maWdPckNhbGxiYWNrKClcbiAgICAgICAgOiBwcm94eUNvbmZpZ09yQ2FsbGJhY2s7XG5cbiAgICBwcm94eU1pZGRsZXdhcmUgPSBnZXRQcm94eU1pZGRsZXdhcmUocHJveHlDb25maWcpO1xuXG4gICAgLyogVE9ETzogZmlndXJlIG91dCBob3cgdG8gbWFrZSB0aGlzIHdvcmtcbiAgICBpZiAocHJveHlDb25maWcud3MpIHtcbiAgICAgIHRoaXMud2ViU29ja2V0UHJveGllcy5wdXNoKHByb3h5TWlkZGxld2FyZSk7XG4gICAgfVxuICAgICovXG5cbiAgICBjb25zdCBoYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHByb3h5Q29uZmlnT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBuZXdQcm94eUNvbmZpZyA9IHByb3h5Q29uZmlnT3JDYWxsYmFjayhyZXEsIHJlcywgbmV4dCk7XG5cbiAgICAgICAgaWYgKG5ld1Byb3h5Q29uZmlnICE9PSBwcm94eUNvbmZpZykge1xuICAgICAgICAgIHByb3h5Q29uZmlnID0gbmV3UHJveHlDb25maWc7XG4gICAgICAgICAgcHJveHlNaWRkbGV3YXJlID0gZ2V0UHJveHlNaWRkbGV3YXJlKHByb3h5Q29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAtIENoZWNrIGlmIHdlIGhhdmUgYSBieXBhc3MgZnVuY3Rpb24gZGVmaW5lZFxuICAgICAgLy8gLSBJbiBjYXNlIHRoZSBieXBhc3MgZnVuY3Rpb24gaXMgZGVmaW5lZCB3ZSdsbCByZXRyaWV2ZSB0aGVcbiAgICAgIC8vIGJ5cGFzc1VybCBmcm9tIGl0IG90aGVyd2lzZSBieXBhc3NVcmwgd291bGQgYmUgbnVsbFxuICAgICAgLy8gVE9ETyByZW1vdmUgaW4gdGhlIG5leHQgbWFqb3IgaW4gZmF2b3IgYGNvbnRleHRgIGFuZCBgcm91dGVyYCBvcHRpb25zXG4gICAgICBjb25zdCBieXBhc3NVcmw6IEJ5UGFzcyB8IG51bGwgPVxuICAgICAgICB0eXBlb2YgcHJveHlDb25maWcuYnlwYXNzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyBhd2FpdCBwcm94eUNvbmZpZy5ieXBhc3MocmVxLCByZXMsIHByb3h5Q29uZmlnKVxuICAgICAgICAgIDogbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiBieXBhc3NVcmwgPT09ICdib29sZWFuJykge1xuICAgICAgICAvLyBza2lwIHRoZSBwcm94eVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmVxLnVybCA9IG51bGw7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJ5cGFzc1VybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gYnlQYXNzIHRvIHRoYXQgdXJsXG4gICAgICAgIHJlcS51cmwgPSBieXBhc3NVcmw7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0gZWxzZSBpZiAocHJveHlNaWRkbGV3YXJlKSB7XG4gICAgICAgIHJldHVybiBwcm94eU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBtaWRkbGV3YXJlcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdodHRwLXByb3h5LW1pZGRsZXdhcmUnLFxuICAgICAgbWlkZGxld2FyZTogaGFuZGxlcixcbiAgICB9KTtcbiAgICAvLyBBbHNvIGZvcndhcmQgZXJyb3IgcmVxdWVzdHMgdG8gdGhlIHByb3h5IHNvIGl0IGNhbiBoYW5kbGUgdGhlbS5cbiAgICBtaWRkbGV3YXJlcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdodHRwLXByb3h5LW1pZGRsZXdhcmUtZXJyb3ItaGFuZGxlcicsXG4gICAgICBtaWRkbGV3YXJlOiAoXG4gICAgICAgIGVycm9yOiBFcnJvcixcbiAgICAgICAgcmVxOiBSZXF1ZXN0LFxuICAgICAgICByZXM6IFJlc3BvbnNlLFxuICAgICAgICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4gICAgICApID0+IGhhbmRsZXIocmVxLCByZXMsIG5leHQpLFxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gbWlkZGxld2FyZXM7XG59XG4iXSwibWFwcGluZ3MiOiJBQVdB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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { default as enhanced } from 'enhanced-resolve';
|
|
2
|
+
const resolve = enhanced.create.sync({
|
|
3
|
+
modules: ['.'],
|
|
4
|
+
// or resolve.create.sync
|
|
5
|
+
extensions: ['.js', '.cjs', '.mjs']
|
|
6
|
+
// see more options below
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
export async function getWebpackConfig() {
|
|
10
|
+
const configPath = resolve({}, process.cwd(), 'webpack.config');
|
|
11
|
+
if (!configPath) {
|
|
12
|
+
throw new Error('Cannot find webpack.config in ' + process.cwd());
|
|
13
|
+
}
|
|
14
|
+
return (await import(configPath)).default;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0IiwiZW5oYW5jZWQiLCJyZXNvbHZlIiwiY3JlYXRlIiwic3luYyIsIm1vZHVsZXMiLCJleHRlbnNpb25zIiwiZ2V0V2VicGFja0NvbmZpZyIsImNvbmZpZ1BhdGgiLCJwcm9jZXNzIiwiY3dkIiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9nZXRXZWJwYWNrQ29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZW5oYW5jZWQgfSBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJztcbmltcG9ydCB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuXG5jb25zdCByZXNvbHZlID0gZW5oYW5jZWQuY3JlYXRlLnN5bmMoe1xuICBtb2R1bGVzOiBbJy4nXSxcbiAgLy8gb3IgcmVzb2x2ZS5jcmVhdGUuc3luY1xuICBleHRlbnNpb25zOiBbJy5qcycsICcuY2pzJywgJy5tanMnXSxcbiAgLy8gc2VlIG1vcmUgb3B0aW9ucyBiZWxvd1xufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXZWJwYWNrQ29uZmlnKCk6IFByb21pc2U8XG4gIChlbnY6IGFueSwgYXJndjogYW55KSA9PiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb25cbj4ge1xuICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZSh7fSwgcHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnJyk7XG4gIGlmICghY29uZmlnUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgd2VicGFjay5jb25maWcgaW4gJyArIHByb2Nlc3MuY3dkKCkpO1xuICB9XG5cbiAgcmV0dXJuIChhd2FpdCBpbXBvcnQoY29uZmlnUGF0aCkpLmRlZmF1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sSUFBSUMsUUFBUSxRQUFRLGtCQUFrQjtBQUd0RCxNQUFNQyxPQUFPLEdBQUdELFFBQVEsQ0FBQ0UsTUFBTSxDQUFDQyxJQUFJLENBQUM7RUFDbkNDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztFQUNkO0VBQ0FDLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTTtFQUNsQztBQUNGLENBQUMsQ0FBQzs7QUFFRixPQUFPLGVBQWVDLGdCQUFnQkEsQ0FBQSxFQUVwQztFQUNBLE1BQU1DLFVBQVUsR0FBR04sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFTyxPQUFPLENBQUNDLEdBQUcsRUFBRSxFQUFFLGdCQUFnQixDQUFDO0VBQy9ELElBQUksQ0FBQ0YsVUFBVSxFQUFFO0lBQ2YsTUFBTSxJQUFJRyxLQUFLLENBQUMsZ0NBQWdDLEdBQUdGLE9BQU8sQ0FBQ0MsR0FBRyxFQUFFLENBQUM7RUFDbkU7RUFFQSxPQUFPLENBQUMsTUFBTSxNQUFNLENBQUNGLFVBQVUsQ0FBQyxFQUFFUixPQUFPO0FBQzNDIn0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { default as serve } from './serve.js';
|
|
2
|
+
export { default as devServe } from './startDevserver.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0Iiwic2VydmUiLCJkZXZTZXJ2ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zY3JpcHRzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgc2VydmUgfSBmcm9tICcuL3NlcnZlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGV2U2VydmUgfSBmcm9tICcuL3N0YXJ0RGV2c2VydmVyLmpzJztcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsT0FBTyxJQUFJQyxLQUFLLFFBQVEsWUFBWTtBQUM3QyxTQUFTRCxPQUFPLElBQUlFLFFBQVEsUUFBUSxxQkFBcUIifQ==
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, key) {
|
|
3
|
+
return Object.prototype.hasOwnProperty.call(it, key);
|
|
4
|
+
};
|
|
5
|
+
import compress from 'compression';
|
|
6
|
+
import express from 'express';
|
|
7
|
+
import diskFs from 'fs';
|
|
8
|
+
import ora from 'ora';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { promisify } from 'util';
|
|
11
|
+
import 'cross-fetch/dist/node-polyfill.js';
|
|
12
|
+
import getProxyMiddlewares from './getProxyMiddlewares.js';
|
|
13
|
+
import { getWebpackConfig } from './getWebpackConfig.js';
|
|
14
|
+
// run directly from node
|
|
15
|
+
if ('main' in import.meta) {
|
|
16
|
+
const entrypoint = process.argv[2];
|
|
17
|
+
if (!entrypoint) {
|
|
18
|
+
console.log(`Usage: ${process.argv[0]} <server-entrypoint>`);
|
|
19
|
+
process.exit(-1);
|
|
20
|
+
}
|
|
21
|
+
serve(entrypoint);
|
|
22
|
+
}
|
|
23
|
+
export default async function serve(entrypoint, options = {}) {
|
|
24
|
+
const PORT = process.env.PORT || 8080;
|
|
25
|
+
const loader = ora('Initializing').start();
|
|
26
|
+
const webpackConfig = await getWebpackConfig();
|
|
27
|
+
const manifestPath = getManifestPathFromWebpackconfig(webpackConfig({}, {
|
|
28
|
+
mode: 'production'
|
|
29
|
+
}));
|
|
30
|
+
const readFile = promisify(diskFs.readFile);
|
|
31
|
+
let server;
|
|
32
|
+
function handleErrors(fn) {
|
|
33
|
+
return async function (req, res, next) {
|
|
34
|
+
try {
|
|
35
|
+
return await fn(req, res);
|
|
36
|
+
} catch (x) {
|
|
37
|
+
next(x);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Start the express server after the first compilation
|
|
43
|
+
async function initializeApp(clientManifest) {
|
|
44
|
+
loader.info('Launching server');
|
|
45
|
+
if (!clientManifest) {
|
|
46
|
+
loader.fail('Manifest not found');
|
|
47
|
+
// TODO: handle more gracefully
|
|
48
|
+
process.exit(-1);
|
|
49
|
+
}
|
|
50
|
+
const wrappingApp = express();
|
|
51
|
+
// eslint-disable-next-line
|
|
52
|
+
//@ts-ignore
|
|
53
|
+
wrappingApp.use(compress());
|
|
54
|
+
|
|
55
|
+
// ASSETS
|
|
56
|
+
if (options.serveAssets) {
|
|
57
|
+
wrappingApp.use(async (req, res, next) => {
|
|
58
|
+
var _req$url$substring, _req$url, _clientManifest$outpu;
|
|
59
|
+
const filename = (_req$url$substring = (_req$url = req.url) == null ? void 0 : _req$url.substring(process.env.WEBPACK_PUBLIC_PATH.length)) != null ? _req$url$substring : '';
|
|
60
|
+
const assetPath = path.join((_clientManifest$outpu = clientManifest.outputPath) != null ? _clientManifest$outpu : '', filename);
|
|
61
|
+
if (diskFs.existsSync(assetPath) && !diskFs.lstatSync(assetPath).isDirectory()) {
|
|
62
|
+
try {
|
|
63
|
+
res.sendFile(assetPath);
|
|
64
|
+
} catch (e) {
|
|
65
|
+
return next();
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
next();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// PROXIES
|
|
74
|
+
if (options.serveProxy) {
|
|
75
|
+
var _devConfig$devServer;
|
|
76
|
+
const devConfig = webpackConfig({}, {
|
|
77
|
+
mode: 'development'
|
|
78
|
+
});
|
|
79
|
+
if ((_devConfig$devServer = devConfig.devServer) != null && _devConfig$devServer.proxy) {
|
|
80
|
+
var _devConfig$devServer2;
|
|
81
|
+
const middlewares = getProxyMiddlewares((_devConfig$devServer2 = devConfig.devServer) == null ? void 0 : _devConfig$devServer2.proxy);
|
|
82
|
+
if (middlewares) {
|
|
83
|
+
wrappingApp.use(...middlewares.map(({
|
|
84
|
+
middleware
|
|
85
|
+
}) => middleware));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// SERVER SIDE RENDERING
|
|
91
|
+
let render = (await import(path.join(process.cwd(), entrypoint))).default;
|
|
92
|
+
if ('default' in render) {
|
|
93
|
+
render = render.default;
|
|
94
|
+
}
|
|
95
|
+
if (typeof render !== 'function') {
|
|
96
|
+
throw new Error(`default export of ${path.join(process.cwd(), entrypoint)} is not a function`);
|
|
97
|
+
}
|
|
98
|
+
wrappingApp.get('/*', handleErrors(async function (req, res) {
|
|
99
|
+
if (req.url.endsWith('favicon.ico')) {
|
|
100
|
+
res.statusCode = 404;
|
|
101
|
+
res.setHeader('Content-type', 'text/html');
|
|
102
|
+
res.send('not found');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
res.socket.on('error', error => {
|
|
106
|
+
console.error('Fatal', error);
|
|
107
|
+
});
|
|
108
|
+
await render(clientManifest, req, res);
|
|
109
|
+
}));
|
|
110
|
+
server = wrappingApp.listen(PORT, () => {
|
|
111
|
+
loader.info(`Listening at ${PORT}...`);
|
|
112
|
+
}).on('error', function (error) {
|
|
113
|
+
if (error.syscall !== 'listen') {
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
const isPipe = portOrPipe => Number.isNaN(portOrPipe);
|
|
117
|
+
const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
|
|
118
|
+
switch (error.code) {
|
|
119
|
+
case 'EACCES':
|
|
120
|
+
loader.fail(bind + ' requires elevated privileges');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
// eslint-disable-next-line no-fallthrough
|
|
123
|
+
case 'EADDRINUSE':
|
|
124
|
+
loader.fail(bind + ' is already in use');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
// eslint-disable-next-line no-fallthrough
|
|
127
|
+
default:
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
let manifest = await import(manifestPath, {
|
|
133
|
+
assert: {
|
|
134
|
+
type: 'json'
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// handle inconsistent import conditions
|
|
138
|
+
if ('default' in manifest) {
|
|
139
|
+
manifest = manifest.default;
|
|
140
|
+
}
|
|
141
|
+
await initializeApp(manifest);
|
|
142
|
+
process.on('SIGINT', () => {
|
|
143
|
+
var _server;
|
|
144
|
+
loader.warn('Received SIGINT, devserver shutting down');
|
|
145
|
+
if (server) console.log('Closing server');
|
|
146
|
+
(_server = server) == null ? void 0 : _server.close(() => {
|
|
147
|
+
loader.info('Server closed');
|
|
148
|
+
});
|
|
149
|
+
process.exit(-1);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function getManifestPathFromWebpackconfig(webpackConfig) {
|
|
153
|
+
var _opts$filename, _webpackConfig$plugin, _webpackConfig$plugin2, _webpackConfig$plugin3, _webpackConfig$output, _webpackConfig$output2;
|
|
154
|
+
const manifestFilename = (_opts$filename = webpackConfig == null ? void 0 : (_webpackConfig$plugin = webpackConfig.plugins) == null ? void 0 : (_webpackConfig$plugin2 = _webpackConfig$plugin.find(plugin => {
|
|
155
|
+
return plugin.constructor.name === 'StatsWriterPlugin';
|
|
156
|
+
})) == null ? void 0 : (_webpackConfig$plugin3 = _webpackConfig$plugin2.opts) == null ? void 0 : _webpackConfig$plugin3.filename) != null ? _opts$filename : 'manifest.json';
|
|
157
|
+
const manifestPath = path.join((_webpackConfig$output = webpackConfig == null ? void 0 : (_webpackConfig$output2 = webpackConfig.output) == null ? void 0 : _webpackConfig$output2.path) != null ? _webpackConfig$output : '', manifestFilename);
|
|
158
|
+
return manifestPath;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImNvbXByZXNzIiwiZXhwcmVzcyIsImRpc2tGcyIsIm9yYSIsInBhdGgiLCJwcm9taXNpZnkiLCJnZXRQcm94eU1pZGRsZXdhcmVzIiwiZ2V0V2VicGFja0NvbmZpZyIsImltcG9ydCIsIm1ldGEiLCJlbnRyeXBvaW50IiwicHJvY2VzcyIsImFyZ3YiLCJjb25zb2xlIiwibG9nIiwiZXhpdCIsInNlcnZlIiwib3B0aW9ucyIsIlBPUlQiLCJlbnYiLCJsb2FkZXIiLCJzdGFydCIsIndlYnBhY2tDb25maWciLCJtYW5pZmVzdFBhdGgiLCJnZXRNYW5pZmVzdFBhdGhGcm9tV2VicGFja2NvbmZpZyIsIm1vZGUiLCJyZWFkRmlsZSIsInNlcnZlciIsImhhbmRsZUVycm9ycyIsImZuIiwicmVxIiwicmVzIiwibmV4dCIsIngiLCJpbml0aWFsaXplQXBwIiwiY2xpZW50TWFuaWZlc3QiLCJpbmZvIiwiZmFpbCIsIndyYXBwaW5nQXBwIiwidXNlIiwic2VydmVBc3NldHMiLCJfcmVxJHVybCRzdWJzdHJpbmciLCJfcmVxJHVybCIsIl9jbGllbnRNYW5pZmVzdCRvdXRwdSIsImZpbGVuYW1lIiwidXJsIiwic3Vic3RyaW5nIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsImxlbmd0aCIsImFzc2V0UGF0aCIsImpvaW4iLCJvdXRwdXRQYXRoIiwiZXhpc3RzU3luYyIsImxzdGF0U3luYyIsImlzRGlyZWN0b3J5Iiwic2VuZEZpbGUiLCJlIiwic2VydmVQcm94eSIsIl9kZXZDb25maWckZGV2U2VydmVyIiwiZGV2Q29uZmlnIiwiZGV2U2VydmVyIiwicHJveHkiLCJfZGV2Q29uZmlnJGRldlNlcnZlcjIiLCJtaWRkbGV3YXJlcyIsIm1hcCIsIm1pZGRsZXdhcmUiLCJyZW5kZXIiLCJjd2QiLCJkZWZhdWx0IiwiRXJyb3IiLCJnZXQiLCJlbmRzV2l0aCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJzZW5kIiwic29ja2V0Iiwib24iLCJlcnJvciIsImxpc3RlbiIsInN5c2NhbGwiLCJpc1BpcGUiLCJwb3J0T3JQaXBlIiwiTnVtYmVyIiwiaXNOYU4iLCJiaW5kIiwiY29kZSIsIm1hbmlmZXN0IiwiYXNzZXJ0IiwidHlwZSIsIl9zZXJ2ZXIiLCJ3YXJuIiwiY2xvc2UiLCJfb3B0cyRmaWxlbmFtZSIsIl93ZWJwYWNrQ29uZmlnJHBsdWdpbiIsIl93ZWJwYWNrQ29uZmlnJHBsdWdpbjIiLCJfd2VicGFja0NvbmZpZyRwbHVnaW4zIiwiX3dlYnBhY2tDb25maWckb3V0cHV0IiwiX3dlYnBhY2tDb25maWckb3V0cHV0MiIsIm1hbmlmZXN0RmlsZW5hbWUiLCJwbHVnaW5zIiwiZmluZCIsInBsdWdpbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm9wdHMiLCJvdXRwdXQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9zZXJ2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgY29tcHJlc3MgZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGV4cHJlc3MsIHsgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgZGlza0ZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcbmltcG9ydCB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuXG5pbXBvcnQgJ2Nyb3NzLWZldGNoL2Rpc3Qvbm9kZS1wb2x5ZmlsbC5qcyc7XG5pbXBvcnQgZ2V0UHJveHlNaWRkbGV3YXJlcyBmcm9tICcuL2dldFByb3h5TWlkZGxld2FyZXMuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBSZW5kZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gcnVuIGRpcmVjdGx5IGZyb20gbm9kZVxuaWYgKCdtYWluJyBpbiBpbXBvcnQubWV0YSkge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogJHtwcm9jZXNzLmFyZ3ZbMF19IDxzZXJ2ZXItZW50cnlwb2ludD5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG4gIHNlcnZlKGVudHJ5cG9pbnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBzZXJ2ZShcbiAgZW50cnlwb2ludDogc3RyaW5nLFxuICBvcHRpb25zOiB7IHNlcnZlQXNzZXRzPzogYm9vbGVhbjsgc2VydmVQcm94eT86IGJvb2xlYW4gfSA9IHt9LFxuKSB7XG4gIGNvbnN0IFBPUlQgPSBwcm9jZXNzLmVudi5QT1JUIHx8IDgwODA7XG5cbiAgY29uc3QgbG9hZGVyID0gb3JhKCdJbml0aWFsaXppbmcnKS5zdGFydCgpO1xuXG4gIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBnZXRXZWJwYWNrQ29uZmlnKCk7XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gZ2V0TWFuaWZlc3RQYXRoRnJvbVdlYnBhY2tjb25maWcoXG4gICAgd2VicGFja0NvbmZpZyh7fSwgeyBtb2RlOiAncHJvZHVjdGlvbicgfSksXG4gICk7XG5cbiAgY29uc3QgcmVhZEZpbGUgPSBwcm9taXNpZnkoZGlza0ZzLnJlYWRGaWxlKTtcbiAgbGV0IHNlcnZlcjogU2VydmVyIHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgICBGIGV4dGVuZHMgKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgPihmbjogRikge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZm4ocmVxLCByZXMpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBuZXh0KHgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBTdGFydCB0aGUgZXhwcmVzcyBzZXJ2ZXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbXBpbGF0aW9uXG4gIGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVBcHAoY2xpZW50TWFuaWZlc3Q6IHdlYnBhY2suU3RhdHNDb21waWxhdGlvbikge1xuICAgIGxvYWRlci5pbmZvKCdMYXVuY2hpbmcgc2VydmVyJyk7XG4gICAgaWYgKCFjbGllbnRNYW5pZmVzdCkge1xuICAgICAgbG9hZGVyLmZhaWwoJ01hbmlmZXN0IG5vdCBmb3VuZCcpO1xuICAgICAgLy8gVE9ETzogaGFuZGxlIG1vcmUgZ3JhY2VmdWxseVxuICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGluZ0FwcCA9IGV4cHJlc3MoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvL0B0cy1pZ25vcmVcbiAgICB3cmFwcGluZ0FwcC51c2UoY29tcHJlc3MoKSk7XG5cbiAgICAvLyBBU1NFVFNcbiAgICBpZiAob3B0aW9ucy5zZXJ2ZUFzc2V0cykge1xuICAgICAgd3JhcHBpbmdBcHAudXNlKFxuICAgICAgICBhc3luYyAoXG4gICAgICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgICAgIHJlczogYW55LFxuICAgICAgICAgIG5leHQ6IE5leHRGdW5jdGlvbixcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgcmVxLnVybD8uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAocHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCBhcyBzdHJpbmcpLmxlbmd0aCxcbiAgICAgICAgICAgICkgPz8gJyc7XG4gICAgICAgICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgY2xpZW50TWFuaWZlc3Qub3V0cHV0UGF0aCA/PyAnJyxcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkaXNrRnMuZXhpc3RzU3luYyhhc3NldFBhdGgpICYmXG4gICAgICAgICAgICAhZGlza0ZzLmxzdGF0U3luYyhhc3NldFBhdGgpLmlzRGlyZWN0b3J5KClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlcy5zZW5kRmlsZShhc3NldFBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQUk9YSUVTXG4gICAgaWYgKG9wdGlvbnMuc2VydmVQcm94eSkge1xuICAgICAgY29uc3QgZGV2Q29uZmlnOiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb24gPSB3ZWJwYWNrQ29uZmlnKFxuICAgICAgICB7fSxcbiAgICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgICApO1xuICAgICAgaWYgKGRldkNvbmZpZy5kZXZTZXJ2ZXI/LnByb3h5KSB7XG4gICAgICAgIGNvbnN0IG1pZGRsZXdhcmVzID0gZ2V0UHJveHlNaWRkbGV3YXJlcyhkZXZDb25maWcuZGV2U2VydmVyPy5wcm94eSk7XG4gICAgICAgIGlmIChtaWRkbGV3YXJlcykge1xuICAgICAgICAgIHdyYXBwaW5nQXBwLnVzZSguLi5taWRkbGV3YXJlcy5tYXAoKHsgbWlkZGxld2FyZSB9KSA9PiBtaWRkbGV3YXJlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTRVJWRVIgU0lERSBSRU5ERVJJTkdcbiAgICBsZXQgcmVuZGVyOiBSZW5kZXIgPSAoYXdhaXQgaW1wb3J0KHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBlbnRyeXBvaW50KSkpXG4gICAgICAuZGVmYXVsdDtcblxuICAgIGlmICgnZGVmYXVsdCcgaW4gcmVuZGVyKSB7XG4gICAgICByZW5kZXIgPSByZW5kZXIuZGVmYXVsdCBhcyBhbnk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGRlZmF1bHQgZXhwb3J0IG9mICR7cGF0aC5qb2luKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgZW50cnlwb2ludCxcbiAgICAgICAgKX0gaXMgbm90IGEgZnVuY3Rpb25gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB3cmFwcGluZ0FwcC5nZXQoXG4gICAgICAnLyonLFxuICAgICAgaGFuZGxlRXJyb3JzKGFzeW5jIGZ1bmN0aW9uIChyZXE6IGFueSwgcmVzOiBhbnkpIHtcbiAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhdGFsJywgZXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCByZW5kZXIoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBzZXJ2ZXIgPSB3cmFwcGluZ0FwcFxuICAgICAgLmxpc3RlbihQT1JULCAoKSA9PiB7XG4gICAgICAgIGxvYWRlci5pbmZvKGBMaXN0ZW5pbmcgYXQgJHtQT1JUfS4uLmApO1xuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuICAgICAgICBpZiAoZXJyb3Iuc3lzY2FsbCAhPT0gJ2xpc3RlbicpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1BpcGUgPSAocG9ydE9yUGlwZTogc3RyaW5nIHwgbnVtYmVyKSA9PlxuICAgICAgICAgIE51bWJlci5pc05hTihwb3J0T3JQaXBlKTtcbiAgICAgICAgY29uc3QgYmluZCA9IGlzUGlwZShQT1JUKSA/ICdQaXBlICcgKyBQT1JUIDogJ1BvcnQgJyArIFBPUlQ7XG4gICAgICAgIHN3aXRjaCAoZXJyb3IuY29kZSkge1xuICAgICAgICAgIGNhc2UgJ0VBQ0NFUyc6XG4gICAgICAgICAgICBsb2FkZXIuZmFpbChiaW5kICsgJyByZXF1aXJlcyBlbGV2YXRlZCBwcml2aWxlZ2VzJyk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICAgICAgY2FzZSAnRUFERFJJTlVTRSc6XG4gICAgICAgICAgICBsb2FkZXIuZmFpbChiaW5kICsgJyBpcyBhbHJlYWR5IGluIHVzZScpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBsZXQgbWFuaWZlc3QgPSBhd2FpdCBpbXBvcnQobWFuaWZlc3RQYXRoLCB7XG4gICAgYXNzZXJ0OiB7IHR5cGU6ICdqc29uJyB9LFxuICB9KTtcbiAgLy8gaGFuZGxlIGluY29uc2lzdGVudCBpbXBvcnQgY29uZGl0aW9uc1xuICBpZiAoJ2RlZmF1bHQnIGluIG1hbmlmZXN0KSB7XG4gICAgbWFuaWZlc3QgPSBtYW5pZmVzdC5kZWZhdWx0O1xuICB9XG4gIGF3YWl0IGluaXRpYWxpemVBcHAobWFuaWZlc3QpO1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBsb2FkZXIud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICAgIGlmIChzZXJ2ZXIpIGNvbnNvbGUubG9nKCdDbG9zaW5nIHNlcnZlcicpO1xuICAgIHNlcnZlcj8uY2xvc2UoKCkgPT4ge1xuICAgICAgbG9hZGVyLmluZm8oJ1NlcnZlciBjbG9zZWQnKTtcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuaWZlc3RQYXRoRnJvbVdlYnBhY2tjb25maWcoXG4gIHdlYnBhY2tDb25maWc6IHdlYnBhY2suQ29uZmlndXJhdGlvbixcbikge1xuICBjb25zdCBtYW5pZmVzdEZpbGVuYW1lOiBzdHJpbmcgPVxuICAgIChcbiAgICAgIHdlYnBhY2tDb25maWc/LnBsdWdpbnM/LmZpbmQocGx1Z2luID0+IHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnU3RhdHNXcml0ZXJQbHVnaW4nO1xuICAgICAgfSkgYXMgYW55XG4gICAgKT8ub3B0cz8uZmlsZW5hbWUgPz8gJ21hbmlmZXN0Lmpzb24nO1xuXG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihcbiAgICB3ZWJwYWNrQ29uZmlnPy5vdXRwdXQ/LnBhdGggPz8gJycsXG4gICAgbWFuaWZlc3RGaWxlbmFtZSxcbiAgKTtcbiAgcmV0dXJuIG1hbmlmZXN0UGF0aDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQUEsTUFBTSxDQUFDQyxNQUFNLEdBQ1hELE1BQU0sQ0FBQ0MsTUFBTSxJQUNiLDBCQUEyQixTQUFTQSxNQUFNQSxDQUFDQyxFQUFFLEVBQUVDLEdBQUcsRUFBRTtFQUNsRCxPQUFPSCxNQUFNLENBQUNJLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLEVBQUUsRUFBRUMsR0FBRyxDQUFDO0FBQ3RELENBQUM7QUFDSCxPQUFPSSxRQUFRLE1BQU0sYUFBYTtBQUNsQyxPQUFPQyxPQUFPLE1BQXdCLFNBQVM7QUFDL0MsT0FBT0MsTUFBTSxNQUFNLElBQUk7QUFFdkIsT0FBT0MsR0FBRyxNQUFNLEtBQUs7QUFDckIsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFDdkIsU0FBU0MsU0FBUyxRQUFRLE1BQU07QUFHaEMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBT0MsbUJBQW1CLE1BQU0sMEJBQTBCO0FBQzFELFNBQVNDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUd4RDtBQUNBLElBQUksTUFBTSxJQUFJQyxNQUFNLENBQUNDLElBQUksRUFBRTtFQUN6QixNQUFNQyxVQUFVLEdBQUdDLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUVsQyxJQUFJLENBQUNGLFVBQVUsRUFBRTtJQUNm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
|