@anansi/core 0.16.24 → 0.16.26

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 CHANGED
@@ -3,6 +3,18 @@
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.26](https://github.com/ntucker/anansi/compare/@anansi/core@0.16.25...@anansi/core@0.16.26) (2023-04-04)
7
+
8
+ ### 📦 Package
9
+
10
+ * Update webpack packages ([#1941](https://github.com/ntucker/anansi/issues/1941)) ([41e2df6](https://github.com/ntucker/anansi/commit/41e2df6fc0f475da703aee0a1e0c717c85283927))
11
+
12
+ ### [0.16.25](https://github.com/ntucker/anansi/compare/@anansi/core@0.16.24...@anansi/core@0.16.25) (2023-03-28)
13
+
14
+ ### 📦 Package
15
+
16
+ * @ant-design/cssinjs ([230c1b1](https://github.com/ntucker/anansi/commit/230c1b1a1f47bd846023a64764ba479524211c5a))
17
+
6
18
  ### [0.16.24](https://github.com/ntucker/anansi/compare/@anansi/core@0.16.23...@anansi/core@0.16.24) (2023-03-27)
7
19
 
8
20
  **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/LnBhdGggPz8gJycsXG4gICAgbWFuaWZlc3RGaWxlbmFtZSxcbiAgKTtcbiAgcmV0dXJuIG1hbmlmZXN0UGF0aDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQUEsTUFBTSxDQUFDQyxNQUFNLEdBQ1hELE1BQU0sQ0FBQ0MsTUFBTSxJQUNiLDBCQUEyQixTQUFTQSxNQUFNQSxDQUFDQyxFQUFFLEVBQUVDLEdBQUcsRUFBRTtFQUNsRCxPQUFPSCxNQUFNLENBQUNJLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLEVBQUUsRUFBRUMsR0FBRyxDQUFDO0FBQ3RELENBQUM7QUFDSCxPQUFPSSxRQUFRLE1BQU0sYUFBYTtBQUNsQyxPQUFPQyxPQUFPLE1BQXdCLFNBQVM7QUFDL0MsT0FBT0MsTUFBTSxNQUFNLElBQUk7QUFFdkIsT0FBT0MsR0FBRyxNQUFNLEtBQUs7QUFDckIsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFDdkIsU0FBU0MsU0FBUyxRQUFRLE1BQU07QUFHaEMsT0FBTyxtQ0FBbUM7QUFDMUMsT0FBT0MsbUJBQW1CLE1BQU0sMEJBQTBCO0FBQzFELFNBQVNDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUd4RDtBQUNBLElBQUksTUFBTSxJQUFJQyxNQUFNLENBQUNDLElBQUksRUFBRTtFQUN6QixNQUFNQyxVQUFVLEdBQUdDLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUVsQyxJQUFJLENBQUNGLFVBQVUsRUFBRTtJQUNmRyxPQUFPLENBQUNDLEdBQUcsQ0FBRSxVQUFTSCxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDLENBQUUsc0JBQXFCLENBQUM7SUFDNURELE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xCO0VBQ0FDLEtBQUssQ0FBQ04sVUFBVSxDQUFDO0FBQ25CO0FBRUEsZUFBZSxlQUFlTSxLQUFLQSxDQUNqQ04sVUFBa0IsRUFDbEJPLE9BQXdELEdBQUcsQ0FBQyxDQUFDLEVBQzdEO0VBQ0EsTUFBTUMsSUFBSSxHQUFHUCxPQUFPLENBQUNRLEdBQUcsQ0FBQ0QsSUFBSSxJQUFJLElBQUk7RUFFckMsTUFBTUUsTUFBTSxHQUFHakIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDa0IsS0FBSyxFQUFFO0VBRTFDLE1BQU1DLGFBQWEsR0FBRyxNQUFNZixnQkFBZ0IsRUFBRTtFQUU5QyxNQUFNZ0IsWUFBWSxHQUFHQyxnQ0FBZ0MsQ0FDbkRGLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUFFRyxJQUFJLEVBQUU7RUFBYSxDQUFDLENBQUMsQ0FDMUM7RUFFRCxNQUFNQyxRQUFRLEdBQUdyQixTQUFTLENBQUNILE1BQU0sQ0FBQ3dCLFFBQVEsQ0FBQztFQUMzQyxJQUFJQyxNQUEwQjtFQUU5QixTQUFTQyxZQUFZQSxDQUtuQkMsRUFBSyxFQUFFO0lBQ1AsT0FBTyxnQkFDTEMsR0FBOEIsRUFDOUJDLEdBQThCLEVBQzlCQyxJQUFrQixFQUNsQjtNQUNBLElBQUk7UUFDRixPQUFPLE1BQU1ILEVBQUUsQ0FBQ0MsR0FBRyxFQUFFQyxHQUFHLENBQUM7TUFDM0IsQ0FBQyxDQUFDLE9BQU9FLENBQUMsRUFBRTtRQUNWRCxJQUFJLENBQUNDLENBQUMsQ0FBQztNQUNUO0lBQ0YsQ0FBQztFQUNIOztFQUVBO0VBQ0EsZUFBZUMsYUFBYUEsQ0FBQ0MsY0FBd0MsRUFBRTtJQUNyRWYsTUFBTSxDQUFDZ0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQy9CLElBQUksQ0FBQ0QsY0FBYyxFQUFFO01BQ25CZixNQUFNLENBQUNpQixJQUFJLENBQUMsb0JBQW9CLENBQUM7TUFDakM7TUFDQTFCLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCO0lBRUEsTUFBTXVCLFdBQVcsR0FBR3JDLE9BQU8sRUFBRTtJQUM3QjtJQUNBO0lBQ0FxQyxXQUFXLENBQUNDLEdBQUcsQ0FBQ3ZDLFFBQVEsRUFBRSxDQUFDOztJQUUzQjtJQUNBLElBQUlpQixPQUFPLENBQUN1QixXQUFXLEVBQUU7TUFDdkJGLFdBQVcsQ0FBQ0MsR0FBRyxDQUNiLE9BQ0VULEdBQThCLEVBQzlCQyxHQUFRLEVBQ1JDLElBQWtCLEtBQ2Y7UUFBQSxJQUFBUyxrQkFBQSxFQUFBQyxRQUFBLEVBQUFDLHFCQUFBO1FBQ0gsTUFBTUMsUUFBUSxJQUFBSCxrQkFBQSxJQUFBQyxRQUFBLEdBQ1paLEdBQUcsQ0FBQ2UsR0FBRyxxQkFBUEgsUUFBQSxDQUFTSSxTQUFTLENBQ2ZuQyxPQUFPLENBQUNRLEdBQUcsQ0FBQzRCLG1CQUFtQixDQUFZQyxNQUFNLENBQ25ELFlBQUFQLGtCQUFBLEdBQUksRUFBRTtRQUNULE1BQU1RLFNBQVMsR0FBRzdDLElBQUksQ0FBQzhDLElBQUksRUFBQVAscUJBQUEsR0FDekJSLGNBQWMsQ0FBQ2dCLFVBQVUsWUFBQVIscUJBQUEsR0FBSSxFQUFFLEVBQy9CQyxRQUFRLENBQ1Q7UUFFRCxJQUNFMUMsTUFBTSxDQUFDa0QsVUFBVSxDQUFDSCxTQUFTLENBQUMsSUFDNUIsQ0FBQy9DLE1BQU0sQ0FBQ21ELFNBQVMsQ0FBQ0osU0FBUyxDQUFDLENBQUNLLFdBQVcsRUFBRSxFQUMxQztVQUNBLElBQUk7WUFDRnZCLEdBQUcsQ0FBQ3dCLFFBQVEsQ0FBQ04sU0FBUyxDQUFDO1VBQ3pCLENBQUMsQ0FBQyxPQUFPTyxDQUFDLEVBQUU7WUFDVixPQUFPeEIsSUFBSSxFQUFFO1VBQ2Y7UUFDRixDQUFDLE1BQU07VUFDTEEsSUFBSSxFQUFFO1FBQ1I7TUFDRixDQUFDLENBQ0Y7SUFDSDs7SUFFQTtJQUNBLElBQUlmLE9BQU8sQ0FBQ3dDLFVBQVUsRUFBRTtNQUFBLElBQUFDLG9CQUFBO01BQ3RCLE1BQU1DLFNBQWdDLEdBQUdyQyxhQUFhLENBQ3BELENBQUMsQ0FBQyxFQUNGO1FBQUVHLElBQUksRUFBRTtNQUFjLENBQUMsQ0FDeEI7TUFDRCxLQUFBaUMsb0JBQUEsR0FBSUMsU0FBUyxDQUFDQyxTQUFTLGFBQW5CRixvQkFBQSxDQUFxQkcsS0FBSyxFQUFFO1FBQUEsSUFBQUMscUJBQUE7UUFDOUIsTUFBTUMsV0FBVyxHQUFHekQsbUJBQW1CLEVBQUF3RCxxQkFBQSxHQUFDSCxTQUFTLENBQUNDLFNBQVMscUJBQW5CRSxxQkFBQSxDQUFxQkQsS0FBSyxDQUFDO1FBQ25FLElBQUlFLFdBQVcsRUFBRTtVQUNmekIsV0FBVyxDQUFDQyxHQUFHLENBQUMsR0FBR3dCLFdBQVcsQ0FBQ0MsR0FBRyxDQUFDLENBQUM7WUFBRUM7VUFBVyxDQUFDLEtBQUtBLFVBQVUsQ0FBQyxDQUFDO1FBQ3JFO01BQ0Y7SUFDRjs7SUFFQTtJQUNBLElBQUlDLE1BQWMsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDOUQsSUFBSSxDQUFDOEMsSUFBSSxDQUFDdkMsT0FBTyxDQUFDd0QsR0FBRyxFQUFFLEVBQUV6RCxVQUFVLENBQUMsQ0FBQyxFQUNyRTBELE9BQU87SUFFVixJQUFJLFNBQVMsSUFBSUYsTUFBTSxFQUFFO01BQ3ZCQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0UsT0FBYztJQUNoQztJQUVBLElBQUksT0FBT0YsTUFBTSxLQUFLLFVBQVUsRUFBRTtNQUNoQyxNQUFNLElBQUlHLEtBQUssQ0FDWixxQkFBb0JqRSxJQUFJLENBQUM4QyxJQUFJLENBQzVCdkMsT0FBTyxDQUFDd0QsR0FBRyxFQUFFLEVBQ2J6RCxVQUFVLENBQ1Ysb0JBQW1CLENBQ3RCO0lBQ0g7SUFFQTRCLFdBQVcsQ0FBQ2dDLEdBQUcsQ0FDYixJQUFJLEVBQ0oxQyxZQUFZLENBQUMsZ0JBQWdCRSxHQUFRLEVBQUVDLEdBQVEsRUFBRTtNQUMvQyxJQUFJRCxHQUFHLENBQUNlLEdBQUcsQ0FBQzBCLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNuQ3hDLEdBQUcsQ0FBQ3lDLFVBQVUsR0FBRyxHQUFHO1FBQ3BCekMsR0FBRyxDQUFDMEMsU0FBUyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUM7UUFDMUMxQyxHQUFHLENBQUMyQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JCO01BQ0Y7TUFDQTNDLEdBQUcsQ0FBQzRDLE1BQU0sQ0FBQ0MsRUFBRSxDQUFDLE9BQU8sRUFBR0MsS0FBYyxJQUFLO1FBQ3pDaEUsT0FBTyxDQUFDZ0UsS0FBSyxDQUFDLE9BQU8sRUFBRUEsS0FBSyxDQUFDO01BQy9CLENBQUMsQ0FBQztNQUVGLE1BQU1YLE1BQU0sQ0FBQy9CLGNBQWMsRUFBRUwsR0FBRyxFQUFFQyxHQUFHLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQ0g7SUFFREosTUFBTSxHQUFHVyxXQUFXLENBQ2pCd0MsTUFBTSxDQUFDNUQsSUFBSSxFQUFFLE1BQU07TUFDbEJFLE1BQU0sQ0FBQ2dCLElBQUksQ0FBRSxnQkFBZWxCLElBQUssS0FBSSxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUNEMEQsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVQyxLQUFVLEVBQUU7TUFDakMsSUFBSUEsS0FBSyxDQUFDRSxPQUFPLEtBQUssUUFBUSxFQUFFO1FBQzlCLE1BQU1GLEtBQUs7TUFDYjtNQUNBLE1BQU1HLE1BQU0sR0FBSUMsVUFBMkIsSUFDekNDLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDRixVQUFVLENBQUM7TUFDMUIsTUFBTUcsSUFBSSxHQUFHSixNQUFNLENBQUM5RCxJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUdBLElBQUksR0FBRyxPQUFPLEdBQUdBLElBQUk7TUFDM0QsUUFBUTJELEtBQUssQ0FBQ1EsSUFBSTtRQUNoQixLQUFLLFFBQVE7VUFDWGpFLE1BQU0sQ0FBQ2lCLElBQUksQ0FBQytDLElBQUksR0FBRywrQkFBK0IsQ0FBQztVQUNuRHpFLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqQjtRQUNBLEtBQUssWUFBWTtVQUNmSyxNQUFNLENBQUNpQixJQUFJLENBQUMrQyxJQUFJLEdBQUcsb0JBQW9CLENBQUM7VUFDeEN6RSxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakI7UUFDQTtVQUNFLE1BQU04RCxLQUFLO01BQUM7SUFFbEIsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJUyxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMvRCxZQUFZLEVBQUU7SUFDeENnRSxNQUFNLEVBQUU7TUFBRUMsSUFBSSxFQUFFO0lBQU87RUFDekIsQ0FBQyxDQUFDO0VBQ0Y7RUFDQSxJQUFJLFNBQVMsSUFBSUYsUUFBUSxFQUFFO0lBQ3pCQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ2xCLE9BQU87RUFDN0I7RUFDQSxNQUFNbEMsYUFBYSxDQUFDb0QsUUFBUSxDQUFDO0VBRTdCM0UsT0FBTyxDQUFDaUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNO0lBQUEsSUFBQWEsT0FBQTtJQUN6QnJFLE1BQU0sQ0FBQ3NFLElBQUksQ0FBQywwQ0FBMEMsQ0FBQztJQUN2RCxJQUFJL0QsTUFBTSxFQUFFZCxPQUFPLENBQUNDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN6QyxDQUFBMkUsT0FBQSxHQUFBOUQsTUFBTSxxQkFBTjhELE9BQUEsQ0FBUUUsS0FBSyxDQUFDLE1BQU07TUFDbEJ2RSxNQUFNLENBQUNnQixJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUMsQ0FBQztJQUNGekIsT0FBTyxDQUFDSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEIsQ0FBQyxDQUFDO0FBQ0o7QUFFQSxTQUFTUyxnQ0FBZ0NBLENBQ3ZDRixhQUFvQyxFQUNwQztFQUFBLElBQUFzRSxjQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBO0VBQ0EsTUFBTUMsZ0JBQXdCLElBQUFOLGNBQUEsR0FFMUJ0RSxhQUFhLHFCQUFBdUUscUJBQUEsR0FBYnZFLGFBQWEsQ0FBRTZFLE9BQU8sc0JBQUFMLHNCQUFBLEdBQXRCRCxxQkFBQSxDQUF3Qk8sSUFBSSxDQUFDQyxNQUFNLElBQUk7SUFDckMsT0FBT0EsTUFBTSxDQUFDQyxXQUFXLENBQUNDLElBQUksS0FBSyxtQkFBbUI7RUFDeEQsQ0FBQyxDQUFDLHNCQUFBUixzQkFBQSxHQUhKRCxzQkFBQSxDQUlHVSxJQUFJLHFCQUpQVCxzQkFBQSxDQUlTbkQsUUFBUSxZQUFBZ0QsY0FBQSxHQUFJLGVBQWU7RUFFdEMsTUFBTXJFLFlBQVksR0FBR25CLElBQUksQ0FBQzhDLElBQUksRUFBQThDLHFCQUFBLEdBQzVCMUUsYUFBYSxxQkFBQTJFLHNCQUFBLEdBQWIzRSxhQUFhLENBQUVtRixNQUFNLHFCQUFyQlIsc0JBQUEsQ0FBdUI3RixJQUFJLFlBQUE0RixxQkFBQSxHQUFJLEVBQUUsRUFDakNFLGdCQUFnQixDQUNqQjtFQUNELE9BQU8zRSxZQUFZO0FBQ3JCIn0=