@anansi/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +85 -0
  2. package/lib/floodSpouts.d.ts +4 -0
  3. package/lib/floodSpouts.d.ts.map +1 -0
  4. package/lib/floodSpouts.js +14 -0
  5. package/lib/index.d.ts +5 -0
  6. package/lib/index.d.ts.map +1 -0
  7. package/lib/index.js +23 -0
  8. package/lib/index.server.d.ts +6 -0
  9. package/lib/index.server.d.ts.map +1 -0
  10. package/lib/index.server.js +27 -0
  11. package/lib/laySpouts.d.ts +8 -0
  12. package/lib/laySpouts.d.ts.map +1 -0
  13. package/lib/laySpouts.js +71 -0
  14. package/lib/scripts/startDevserver.d.ts +2 -0
  15. package/lib/scripts/startDevserver.d.ts.map +1 -0
  16. package/lib/scripts/startDevserver.js +248 -0
  17. package/lib/scripts/types.d.ts +6 -0
  18. package/lib/scripts/types.d.ts.map +1 -0
  19. package/lib/scripts/types.js +4 -0
  20. package/lib/spouts/DocumentComponent.d.ts +19 -0
  21. package/lib/spouts/DocumentComponent.d.ts.map +1 -0
  22. package/lib/spouts/DocumentComponent.js +47 -0
  23. package/lib/spouts/document.d.ts +15 -0
  24. package/lib/spouts/document.d.ts.map +1 -0
  25. package/lib/spouts/document.js +27 -0
  26. package/lib/spouts/document.server.d.ts +15 -0
  27. package/lib/spouts/document.server.d.ts.map +1 -0
  28. package/lib/spouts/document.server.js +48 -0
  29. package/lib/spouts/prefetch.server.d.ts +8 -0
  30. package/lib/spouts/prefetch.server.d.ts.map +1 -0
  31. package/lib/spouts/prefetch.server.js +27 -0
  32. package/lib/spouts/restHooks.d.ts +8 -0
  33. package/lib/spouts/restHooks.d.ts.map +1 -0
  34. package/lib/spouts/restHooks.js +34 -0
  35. package/lib/spouts/restHooks.server.d.ts +9 -0
  36. package/lib/spouts/restHooks.server.d.ts.map +1 -0
  37. package/lib/spouts/restHooks.server.js +30 -0
  38. package/lib/spouts/router.d.ts +11 -0
  39. package/lib/spouts/router.d.ts.map +1 -0
  40. package/lib/spouts/router.js +41 -0
  41. package/lib/spouts/router.server.d.ts +11 -0
  42. package/lib/spouts/router.server.d.ts.map +1 -0
  43. package/lib/spouts/router.server.js +43 -0
  44. package/lib/spouts/types.d.ts +16 -0
  45. package/lib/spouts/types.d.ts.map +1 -0
  46. package/lib/spouts/types.js +4 -0
  47. package/package.json +117 -0
  48. package/server.d.ts +1 -0
  49. package/src/floodSpouts.tsx +11 -0
  50. package/src/index.server.ts +5 -0
  51. package/src/index.ts +4 -0
  52. package/src/laySpouts.tsx +60 -0
  53. package/src/scripts/monkey.d.ts +1 -0
  54. package/src/scripts/startDevserver.ts +239 -0
  55. package/src/scripts/types.ts +9 -0
  56. package/src/spouts/DocumentComponent.tsx +43 -0
  57. package/src/spouts/document.server.tsx +60 -0
  58. package/src/spouts/document.tsx +34 -0
  59. package/src/spouts/prefetch.server.tsx +34 -0
  60. package/src/spouts/restHooks.server.tsx +30 -0
  61. package/src/spouts/restHooks.tsx +30 -0
  62. package/src/spouts/router.server.tsx +47 -0
  63. package/src/spouts/router.tsx +43 -0
  64. package/src/spouts/types.ts +21 -0
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # @anansi/core
2
+ <!--[![CircleCI](https://circleci.com/gh/notwillk/pojo-router.svg?style=shield)](https://circleci.com/gh/notwillk/pojo-router)-->
3
+ [![npm downloads](https://img.shields.io/npm/dm/@anansi/core.svg?style=flat-square)](https://www.npmjs.com/package/@anansi/core)
4
+ [![bundle size](https://img.shields.io/bundlephobia/minzip/@anansi/core?style=flat-square)](https://bundlephobia.com/result?p=@anansi/core)
5
+ [![npm version](https://img.shields.io/npm/v/@anansi/core.svg?style=flat-square)](https://www.npmjs.com/package/@anansi/core)
6
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
7
+
8
+ > The itsy bitsy spider crawled up the water spout.
9
+ > Down came the rain, and washed the spider out.
10
+ > Out came the sun, and dried up all the rain,
11
+ > and the itsy bitsy spider went up the spout again
12
+
13
+ ## Entry
14
+
15
+ ```bash
16
+ yarn start-anansi./src/index.tsx
17
+ ```
18
+
19
+ This script uses two entry points for client/server.
20
+
21
+ <details open><summary>index.server.tsx</summary>
22
+
23
+ ```tsx
24
+ import { useController } from 'rest-hooks';
25
+ import {
26
+ laySpouts,
27
+ documentSpout,
28
+ restHooksSpout,
29
+ prefetchSpout,
30
+ routerSpout,
31
+ } from '@anansi/core/server';
32
+
33
+ import app from 'app';
34
+
35
+ import { createRouter } from './routing';
36
+
37
+ const appSpout = () => Promise.resolve({ app });
38
+
39
+ const spouts = prefetchSpout('controller')(
40
+ documentSpout({ title: 'anansi' })(
41
+ restHooksSpout()(
42
+ routerSpout({ useResolveWith: useController, createRouter })(appSpout),
43
+ ),
44
+ ),
45
+ );
46
+
47
+ export default laySpouts(spouts);
48
+
49
+ ```
50
+
51
+ </details>
52
+
53
+ <details open><summary>index.tsx</summary>
54
+
55
+ ```tsx
56
+ import { useController } from 'rest-hooks';
57
+ import {
58
+ floodSpouts,
59
+ documentSpout,
60
+ restHooksSpout,
61
+ routerSpout,
62
+ } from '@anansi/core';
63
+
64
+ import app from 'app';
65
+
66
+ import { createRouter } from './routing';
67
+
68
+ const appSpout = () => Promise.resolve({ app });
69
+
70
+ const spouts = documentSpout({ title: 'anansi' })(
71
+ restHooksSpout()(
72
+ routerSpout({ useResolveWith: useController, createRouter })(appSpout),
73
+ ),
74
+ );
75
+
76
+ floodSpouts(spouts);
77
+ ```
78
+
79
+ </details>
80
+
81
+ Anansi can quickly traverse spouts setup by a user.
82
+
83
+ The server lays the spouts for anansi to travel in. Once delivered to the client, the spouts can be flooded (hydration).
84
+
85
+ In both cases, we need the route and application data.
@@ -0,0 +1,4 @@
1
+ export default function floodSpouts(spouts: () => Promise<{
2
+ app: JSX.Element;
3
+ }>): Promise<void>;
4
+ //# sourceMappingURL=floodSpouts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floodSpouts.d.ts","sourceRoot":"","sources":["../src/floodSpouts.tsx"],"names":[],"mappings":"AAEA,wBAA8B,WAAW,CACvC,MAAM,EAAE,MAAM,OAAO,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,iBAKH"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.default = floodSpouts;
5
+
6
+ var _client = require("react-dom/client");
7
+
8
+ async function floodSpouts(spouts) {
9
+ const {
10
+ app
11
+ } = await spouts();
12
+ (0, _client.hydrateRoot)(document, app);
13
+ }
14
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9mbG9vZFNwb3V0cy50c3giXSwibmFtZXMiOlsiZmxvb2RTcG91dHMiLCJzcG91dHMiLCJhcHAiLCJkb2N1bWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7QUFFZSxlQUFlQSxXQUFmLENBQ2JDLE1BRGEsRUFJYjtBQUNBLFFBQU07QUFBRUMsSUFBQUE7QUFBRixNQUFVLE1BQU1ELE1BQU0sRUFBNUI7QUFFQSwyQkFBWUUsUUFBWixFQUFzQkQsR0FBdEI7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGh5ZHJhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGZsb29kU3BvdXRzKFxuICBzcG91dHM6ICgpID0+IFByb21pc2U8e1xuICAgIGFwcDogSlNYLkVsZW1lbnQ7XG4gIH0+LFxuKSB7XG4gIGNvbnN0IHsgYXBwIH0gPSBhd2FpdCBzcG91dHMoKTtcblxuICBoeWRyYXRlUm9vdChkb2N1bWVudCwgYXBwKTtcbn1cbiJdfQ==
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { default as floodSpouts } from './floodSpouts';
2
+ export { default as documentSpout } from './spouts/document';
3
+ export { default as restHooksSpout } from './spouts/restHooks';
4
+ export { default as routerSpout } from './spouts/router';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ exports.__esModule = true;
6
+ exports.routerSpout = exports.restHooksSpout = exports.floodSpouts = exports.documentSpout = void 0;
7
+
8
+ var _floodSpouts = _interopRequireDefault(require("./floodSpouts"));
9
+
10
+ exports.floodSpouts = _floodSpouts.default;
11
+
12
+ var _document = _interopRequireDefault(require("./spouts/document"));
13
+
14
+ exports.documentSpout = _document.default;
15
+
16
+ var _restHooks = _interopRequireDefault(require("./spouts/restHooks"));
17
+
18
+ exports.restHooksSpout = _restHooks.default;
19
+
20
+ var _router = _interopRequireDefault(require("./spouts/router"));
21
+
22
+ exports.routerSpout = _router.default;
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZhdWx0IGFzIGZsb29kU3BvdXRzIH0gZnJvbSAnLi9mbG9vZFNwb3V0cyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRvY3VtZW50U3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9kb2N1bWVudCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlc3RIb29rc1Nwb3V0IH0gZnJvbSAnLi9zcG91dHMvcmVzdEhvb2tzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcm91dGVyU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9yb3V0ZXInO1xuIl19
@@ -0,0 +1,6 @@
1
+ export { default as laySpouts } from './laySpouts';
2
+ export { default as documentSpout } from './spouts/document.server';
3
+ export { default as restHooksSpout } from './spouts/restHooks.server';
4
+ export { default as routerSpout } from './spouts/router.server';
5
+ export { default as prefetchSpout } from './spouts/prefetch.server';
6
+ //# sourceMappingURL=index.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.server.d.ts","sourceRoot":"","sources":["../src/index.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ exports.__esModule = true;
6
+ exports.routerSpout = exports.restHooksSpout = exports.prefetchSpout = exports.laySpouts = exports.documentSpout = void 0;
7
+
8
+ var _laySpouts = _interopRequireDefault(require("./laySpouts"));
9
+
10
+ exports.laySpouts = _laySpouts.default;
11
+
12
+ var _document = _interopRequireDefault(require("./spouts/document.server"));
13
+
14
+ exports.documentSpout = _document.default;
15
+
16
+ var _restHooks = _interopRequireDefault(require("./spouts/restHooks.server"));
17
+
18
+ exports.restHooksSpout = _restHooks.default;
19
+
20
+ var _router = _interopRequireDefault(require("./spouts/router.server"));
21
+
22
+ exports.routerSpout = _router.default;
23
+
24
+ var _prefetch = _interopRequireDefault(require("./spouts/prefetch.server"));
25
+
26
+ exports.prefetchSpout = _prefetch.default;
27
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZhdWx0IGFzIGxheVNwb3V0cyB9IGZyb20gJy4vbGF5U3BvdXRzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZG9jdW1lbnRTcG91dCB9IGZyb20gJy4vc3BvdXRzL2RvY3VtZW50LnNlcnZlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlc3RIb29rc1Nwb3V0IH0gZnJvbSAnLi9zcG91dHMvcmVzdEhvb2tzLnNlcnZlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJvdXRlclNwb3V0IH0gZnJvbSAnLi9zcG91dHMvcm91dGVyLnNlcnZlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHByZWZldGNoU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9wcmVmZXRjaC5zZXJ2ZXInO1xuIl19
@@ -0,0 +1,8 @@
1
+ import { Render } from './scripts/types';
2
+ import { ServerProps } from './spouts/types';
3
+ export default function laySpouts(spouts: (props: ServerProps) => Promise<{
4
+ app: JSX.Element;
5
+ }>, { timeoutMS }?: {
6
+ timeoutMS?: number;
7
+ }): Render;
8
+ //# sourceMappingURL=laySpouts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACtC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,EACF,EAAE,SAAgB,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,UAkDlD"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.default = laySpouts;
5
+
6
+ var _server = require("react-dom/server");
7
+
8
+ function laySpouts(spouts, {
9
+ timeoutMS = 1000
10
+ } = {}) {
11
+ const render = async (clientManifest, req, res) => {
12
+ const {
13
+ app
14
+ } = await spouts({
15
+ clientManifest,
16
+ req,
17
+ res
18
+ });
19
+ let didError = false;
20
+ const {
21
+ pipe,
22
+ abort
23
+ } = (0, _server.renderToPipeableStream)(app,
24
+ /*
25
+ This is not documented, so included the types here for reference:
26
+ type Options = {|
27
+ identifierPrefix?: string,
28
+ namespaceURI?: string,
29
+ nonce?: string,
30
+ bootstrapScriptContent?: string,
31
+ bootstrapScripts?: Array<string>,
32
+ bootstrapModules?: Array<string>,
33
+ progressiveChunkSize?: number,
34
+ onShellReady?: () => void,
35
+ onShellError?: () => void,
36
+ onAllReady?: () => void,
37
+ onError?: (error: mixed) => void,
38
+ |};
39
+ */
40
+ {
41
+ //bootstrapScripts: assets.filter(asset => asset.endsWith('.js')),
42
+ onShellReady() {
43
+ //managers.forEach(manager => manager.cleanup());
44
+ // If something errored before we started streaming, we set the error code appropriately.
45
+ res.statusCode = didError ? 500 : 200;
46
+ res.setHeader('Content-type', 'text/html');
47
+ pipe(res);
48
+ },
49
+
50
+ onShellError() {
51
+ didError = true;
52
+ res.statusCode = 500;
53
+ pipe(res);
54
+ },
55
+
56
+ onError(x) {
57
+ didError = true;
58
+ console.error(x);
59
+ res.statusCode = 500;
60
+ pipe(res);
61
+ }
62
+
63
+ }); // Abandon and switch to client rendering if enough time passes.
64
+ // Try lowering this to see the client recover.
65
+
66
+ setTimeout(abort, timeoutMS);
67
+ };
68
+
69
+ return render;
70
+ }
71
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sYXlTcG91dHMudHN4Il0sIm5hbWVzIjpbImxheVNwb3V0cyIsInNwb3V0cyIsInRpbWVvdXRNUyIsInJlbmRlciIsImNsaWVudE1hbmlmZXN0IiwicmVxIiwicmVzIiwiYXBwIiwiZGlkRXJyb3IiLCJwaXBlIiwiYWJvcnQiLCJvblNoZWxsUmVhZHkiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwib25TaGVsbEVycm9yIiwib25FcnJvciIsIngiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRUaW1lb3V0Il0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztBQUtlLFNBQVNBLFNBQVQsQ0FDYkMsTUFEYSxFQUliO0FBQUVDLEVBQUFBLFNBQVMsR0FBRztBQUFkLElBQStDLEVBSmxDLEVBS2I7QUFDQSxRQUFNQyxNQUFjLEdBQUcsT0FBT0MsY0FBUCxFQUF1QkMsR0FBdkIsRUFBNEJDLEdBQTVCLEtBQW9DO0FBQ3pELFVBQU07QUFBRUMsTUFBQUE7QUFBRixRQUFVLE1BQU1OLE1BQU0sQ0FBQztBQUFFRyxNQUFBQSxjQUFGO0FBQWtCQyxNQUFBQSxHQUFsQjtBQUF1QkMsTUFBQUE7QUFBdkIsS0FBRCxDQUE1QjtBQUNBLFFBQUlFLFFBQVEsR0FBRyxLQUFmO0FBQ0EsVUFBTTtBQUFFQyxNQUFBQSxJQUFGO0FBQVFDLE1BQUFBO0FBQVIsUUFBa0Isb0NBQ3RCSCxHQURzQjtBQUV0QjtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNNO0FBQ0U7QUFDQUksTUFBQUEsWUFBWSxHQUFHO0FBQ2I7QUFDQTtBQUNBTCxRQUFBQSxHQUFHLENBQUNNLFVBQUosR0FBaUJKLFFBQVEsR0FBRyxHQUFILEdBQVMsR0FBbEM7QUFDQUYsUUFBQUEsR0FBRyxDQUFDTyxTQUFKLENBQWMsY0FBZCxFQUE4QixXQUE5QjtBQUNBSixRQUFBQSxJQUFJLENBQUNILEdBQUQsQ0FBSjtBQUNELE9BUkg7O0FBU0VRLE1BQUFBLFlBQVksR0FBRztBQUNiTixRQUFBQSxRQUFRLEdBQUcsSUFBWDtBQUNBRixRQUFBQSxHQUFHLENBQUNNLFVBQUosR0FBaUIsR0FBakI7QUFDQUgsUUFBQUEsSUFBSSxDQUFDSCxHQUFELENBQUo7QUFDRCxPQWJIOztBQWNFUyxNQUFBQSxPQUFPLENBQUNDLENBQUQsRUFBUztBQUNkUixRQUFBQSxRQUFRLEdBQUcsSUFBWDtBQUNBUyxRQUFBQSxPQUFPLENBQUNDLEtBQVIsQ0FBY0YsQ0FBZDtBQUNBVixRQUFBQSxHQUFHLENBQUNNLFVBQUosR0FBaUIsR0FBakI7QUFDQUgsUUFBQUEsSUFBSSxDQUFDSCxHQUFELENBQUo7QUFDRDs7QUFuQkgsS0FsQnNCLENBQXhCLENBSHlELENBMkN6RDtBQUNBOztBQUNBYSxJQUFBQSxVQUFVLENBQUNULEtBQUQsRUFBUVIsU0FBUixDQUFWO0FBQ0QsR0E5Q0Q7O0FBK0NBLFNBQU9DLE1BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlclRvUGlwZWFibGVTdHJlYW0gYXMgcmVhY3RSZW5kZXIgfSBmcm9tICdyZWFjdC1kb20vc2VydmVyJztcblxuaW1wb3J0IHsgUmVuZGVyIH0gZnJvbSAnLi9zY3JpcHRzL3R5cGVzJztcbmltcG9ydCB7IFNlcnZlclByb3BzIH0gZnJvbSAnLi9zcG91dHMvdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYXlTcG91dHMoXG4gIHNwb3V0czogKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4gUHJvbWlzZTx7XG4gICAgYXBwOiBKU1guRWxlbWVudDtcbiAgfT4sXG4gIHsgdGltZW91dE1TID0gMTAwMCB9OiB7IHRpbWVvdXRNUz86IG51bWJlciB9ID0ge30sXG4pIHtcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSBhc3luYyAoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgeyBhcHAgfSA9IGF3YWl0IHNwb3V0cyh7IGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcyB9KTtcbiAgICBsZXQgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCB7IHBpcGUsIGFib3J0IH0gPSByZWFjdFJlbmRlcihcbiAgICAgIGFwcCxcbiAgICAgIC8qXG4gICAgICBUaGlzIGlzIG5vdCBkb2N1bWVudGVkLCBzbyBpbmNsdWRlZCB0aGUgdHlwZXMgaGVyZSBmb3IgcmVmZXJlbmNlOlxudHlwZSBPcHRpb25zID0ge3xcbiAgaWRlbnRpZmllclByZWZpeD86IHN0cmluZyxcbiAgbmFtZXNwYWNlVVJJPzogc3RyaW5nLFxuICBub25jZT86IHN0cmluZyxcbiAgYm9vdHN0cmFwU2NyaXB0Q29udGVudD86IHN0cmluZyxcbiAgYm9vdHN0cmFwU2NyaXB0cz86IEFycmF5PHN0cmluZz4sXG4gIGJvb3RzdHJhcE1vZHVsZXM/OiBBcnJheTxzdHJpbmc+LFxuICBwcm9ncmVzc2l2ZUNodW5rU2l6ZT86IG51bWJlcixcbiAgb25TaGVsbFJlYWR5PzogKCkgPT4gdm9pZCxcbiAgb25TaGVsbEVycm9yPzogKCkgPT4gdm9pZCxcbiAgb25BbGxSZWFkeT86ICgpID0+IHZvaWQsXG4gIG9uRXJyb3I/OiAoZXJyb3I6IG1peGVkKSA9PiB2b2lkLFxufH07XG4gICovXG4gICAgICB7XG4gICAgICAgIC8vYm9vdHN0cmFwU2NyaXB0czogYXNzZXRzLmZpbHRlcihhc3NldCA9PiBhc3NldC5lbmRzV2l0aCgnLmpzJykpLFxuICAgICAgICBvblNoZWxsUmVhZHkoKSB7XG4gICAgICAgICAgLy9tYW5hZ2Vycy5mb3JFYWNoKG1hbmFnZXIgPT4gbWFuYWdlci5jbGVhbnVwKCkpO1xuICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIGJlZm9yZSB3ZSBzdGFydGVkIHN0cmVhbWluZywgd2Ugc2V0IHRoZSBlcnJvciBjb2RlIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBkaWRFcnJvciA/IDUwMCA6IDIwMDtcbiAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvblNoZWxsRXJyb3IoKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIHBpcGUocmVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcih4OiBhbnkpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcih4KTtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gQWJhbmRvbiBhbmQgc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcgaWYgZW5vdWdoIHRpbWUgcGFzc2VzLlxuICAgIC8vIFRyeSBsb3dlcmluZyB0aGlzIHRvIHNlZSB0aGUgY2xpZW50IHJlY292ZXIuXG4gICAgc2V0VGltZW91dChhYm9ydCwgdGltZW91dE1TKTtcbiAgfTtcbiAgcmV0dXJuIHJlbmRlcjtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import 'cross-fetch/polyfill';
2
+ //# sourceMappingURL=startDevserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":"AAeA,OAAO,sBAAsB,CAAC"}
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ var _util = require("util");
6
+
7
+ var _fs = _interopRequireDefault(require("fs"));
8
+
9
+ var _path = _interopRequireDefault(require("path"));
10
+
11
+ var _webpack = _interopRequireDefault(require("webpack"));
12
+
13
+ var _webpackHotMiddleware = _interopRequireDefault(require("webpack-hot-middleware"));
14
+
15
+ var _memfs = require("memfs");
16
+
17
+ var _express = _interopRequireDefault(require("express"));
18
+
19
+ var _ora = _interopRequireDefault(require("ora"));
20
+
21
+ var _fsMonkey = require("fs-monkey");
22
+
23
+ var _tmp = _interopRequireDefault(require("tmp"));
24
+
25
+ var _sourceMapSupport = _interopRequireDefault(require("source-map-support"));
26
+
27
+ var _unionfs = require("unionfs");
28
+
29
+ var _compression = _interopRequireDefault(require("compression"));
30
+
31
+ require("cross-fetch/polyfill");
32
+
33
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
34
+ const webpackConfig = require(require.resolve( // TODO: use normal resolution algorithm to find webpack file
35
+ _path.default.join(process.cwd(), 'webpack.config')));
36
+
37
+ const entrypoint = process.argv[2];
38
+ const PORT = process.env.PORT || 3000;
39
+ process.env.WEBPACK_PUBLIC_HOST = `http://localhost:${PORT}`;
40
+ process.env.WEBPACK_PUBLIC_PATH = '/assets/';
41
+
42
+ if (!entrypoint) {
43
+ console.log(`Usage: ${process.argv[0]} <entrypoint-file>`);
44
+ process.exit(-1);
45
+ }
46
+
47
+ const loader = (0, _ora.default)('Building the assets').start(); // Set up in memory filesystem
48
+
49
+ const volume = new _memfs.Volume();
50
+ const fs = (0, _memfs.createFsFromVolume)(volume);
51
+
52
+ _unionfs.ufs.use(_fs.default).use(fs);
53
+
54
+ (0, _fsMonkey.patchRequire)(_unionfs.ufs);
55
+ const readFile = (0, _util.promisify)(_unionfs.ufs.readFile);
56
+ let server; // Generate a temporary file so we can hot reload from the root of the application
57
+
58
+ function hotEntry(entryPath) {
59
+ // eslint-disable-next-line
60
+ // @ts-ignore for some reason it's not picking up that other options are optional
61
+ const generatedEntrypoint = _tmp.default.fileSync({
62
+ postfix: '.js'
63
+ });
64
+
65
+ _fs.default.writeSync(generatedEntrypoint.fd, `
66
+ import entry from "${_path.default.resolve(process.cwd(), entryPath)}";
67
+
68
+ if (module.hot) {
69
+ module.hot.accept();
70
+ }
71
+
72
+ export default entry;
73
+ `);
74
+
75
+ return generatedEntrypoint;
76
+ }
77
+
78
+ const webpackConfigs = [webpackConfig({
79
+ entrypoint: hotEntry(entrypoint).name,
80
+ name: 'client'
81
+ }, {
82
+ mode: 'development'
83
+ }), webpackConfig({
84
+ entrypoint: hotEntry(entrypoint.replace('.tsx', '.server.tsx')).name,
85
+ name: 'server'
86
+ }, {
87
+ mode: 'development',
88
+ target: 'node'
89
+ })]; // initialize the webpack compiler
90
+
91
+ const compiler = (0, _webpack.default)(webpackConfigs);
92
+ compiler.outputFileSystem = { ...fs,
93
+ join: _path.default.join
94
+ };
95
+
96
+ _sourceMapSupport.default.install({
97
+ hookRequire: true
98
+ });
99
+
100
+ function getServerBundle(serverStats) {
101
+ var _serverJson$outputPat;
102
+
103
+ const serverJson = serverStats.toJson({
104
+ assets: true
105
+ });
106
+ return _path.default.join((_serverJson$outputPat = serverJson.outputPath) != null ? _serverJson$outputPat : '', 'main.js');
107
+ }
108
+
109
+ function handleErrors(fn) {
110
+ return async function (req, res, next) {
111
+ try {
112
+ return await fn(req, res);
113
+ } catch (x) {
114
+ next(x);
115
+ }
116
+ };
117
+ } // Start the express server after the first compilation
118
+
119
+
120
+ function initializeApp(stats) {
121
+ var _clientStats$compilat, _clientStats$compilat2, _serverStats$compilat, _serverStats$compilat2;
122
+
123
+ loader.info('Launching server');
124
+ const [clientStats, serverStats] = stats;
125
+
126
+ if (clientStats !== null && clientStats !== void 0 && (_clientStats$compilat = clientStats.compilation) !== null && _clientStats$compilat !== void 0 && (_clientStats$compilat2 = _clientStats$compilat.errors) !== null && _clientStats$compilat2 !== void 0 && _clientStats$compilat2.length || serverStats !== null && serverStats !== void 0 && (_serverStats$compilat = serverStats.compilation) !== null && _serverStats$compilat !== void 0 && (_serverStats$compilat2 = _serverStats$compilat.errors) !== null && _serverStats$compilat2 !== void 0 && _serverStats$compilat2.length) {
127
+ console.log('Errors for client build: ', clientStats.compilation.errors);
128
+ console.log('Errors for server build:', serverStats.compilation.errors); // TODO: handle more gracefully
129
+
130
+ process.exit(-1);
131
+ }
132
+
133
+ const wrappingApp = (0, _express.default)(); // eslint-disable-next-line
134
+ //@ts-ignore
135
+
136
+ wrappingApp.use((0, _compression.default)()); // ASSETS
137
+
138
+ wrappingApp.use((0, _webpackHotMiddleware.default)(compiler.compilers[0], {
139
+ log: console.log,
140
+ path: '/__webpack_hmr',
141
+ heartbeat: 10 * 1000 //noInfo: true,
142
+ //name: 'client',
143
+
144
+ }));
145
+ const clientManifest = clientStats.toJson();
146
+
147
+ const assetRoute = async (req, res) => {
148
+ var _req$url$substr, _req$url, _clientManifest$outpu;
149
+
150
+ const filename = (_req$url$substr = (_req$url = req.url) === null || _req$url === void 0 ? void 0 : _req$url.substr(process.env.WEBPACK_PUBLIC_PATH.length)) != null ? _req$url$substr : '';
151
+
152
+ const assetPath = _path.default.join((_clientManifest$outpu = clientManifest.outputPath) != null ? _clientManifest$outpu : '', filename);
153
+
154
+ try {
155
+ const fileContent = (await readFile(assetPath)).toString();
156
+ res.contentType(filename);
157
+ res.send(fileContent);
158
+ } catch (e) {
159
+ res.status(404);
160
+ res.send(e);
161
+ return;
162
+ }
163
+ };
164
+
165
+ wrappingApp.get(`${process.env.WEBPACK_PUBLIC_PATH}*`, assetRoute); // SERVER SIDE RENDERING
166
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
167
+
168
+ const render = require(getServerBundle(serverStats)).default;
169
+
170
+ wrappingApp.get('/*', handleErrors(async function (req, res) {
171
+ if (req.url.endsWith('favicon.ico')) {
172
+ res.statusCode = 404;
173
+ res.setHeader('Content-type', 'text/html');
174
+ res.send('not found');
175
+ return;
176
+ }
177
+
178
+ res.socket.on('error', error => {
179
+ console.error('Fatal', error);
180
+ });
181
+ await render(clientManifest, req, res);
182
+ }));
183
+ server = wrappingApp.listen(PORT, () => {
184
+ console.log(`Listening at ${PORT}...`);
185
+ }).on('error', function (error) {
186
+ if (error.syscall !== 'listen') {
187
+ throw error;
188
+ }
189
+
190
+ const isPipe = portOrPipe => Number.isNaN(portOrPipe);
191
+
192
+ const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
193
+
194
+ switch (error.code) {
195
+ case 'EACCES':
196
+ console.error(bind + ' requires elevated privileges');
197
+ process.exit(1);
198
+ break;
199
+
200
+ case 'EADDRINUSE':
201
+ console.error(bind + ' is already in use');
202
+ process.exit(1);
203
+ break;
204
+
205
+ default:
206
+ throw error;
207
+ }
208
+ });
209
+ } // Watch the files for changes
210
+
211
+
212
+ const watcher = compiler.watch({}, (err, multiStats) => {
213
+ if (!multiStats) {
214
+ console.error('stats not send');
215
+ process.exit(-1);
216
+ }
217
+
218
+ if (err) {
219
+ console.error(err);
220
+ process.exit(-1);
221
+ }
222
+
223
+ if (server) {
224
+ loader.succeed('Webpack bundle updated');
225
+ return;
226
+ }
227
+
228
+ try {
229
+ initializeApp(multiStats.stats);
230
+ } catch (e) {
231
+ console.error('Failed to initialize app');
232
+ console.error(e);
233
+ }
234
+ });
235
+ process.on('SIGINT', () => {
236
+ var _server;
237
+
238
+ loader.warn('Received SIGINT, devserver shutting down');
239
+ if (server) console.log('Closing server');
240
+ (_server = server) === null || _server === void 0 ? void 0 : _server.close(() => {
241
+ loader.info('Server closed');
242
+ });
243
+ watcher.close(() => {
244
+ loader.info('webpack build stopped');
245
+ });
246
+ process.exit(-1);
247
+ });
248
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3N0YXJ0RGV2c2VydmVyLnRzIl0sIm5hbWVzIjpbIndlYnBhY2tDb25maWciLCJyZXF1aXJlIiwicmVzb2x2ZSIsInBhdGgiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsImVudHJ5cG9pbnQiLCJhcmd2IiwiUE9SVCIsImVudiIsIldFQlBBQ0tfUFVCTElDX0hPU1QiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJsb2FkZXIiLCJzdGFydCIsInZvbHVtZSIsIlZvbHVtZSIsImZzIiwidWZzIiwidXNlIiwiZGlza0ZzIiwicmVhZEZpbGUiLCJzZXJ2ZXIiLCJob3RFbnRyeSIsImVudHJ5UGF0aCIsImdlbmVyYXRlZEVudHJ5cG9pbnQiLCJ0bXAiLCJmaWxlU3luYyIsInBvc3RmaXgiLCJ3cml0ZVN5bmMiLCJmZCIsIndlYnBhY2tDb25maWdzIiwibmFtZSIsIm1vZGUiLCJyZXBsYWNlIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJvdXRwdXRGaWxlU3lzdGVtIiwic291cmNlTWFwU3VwcG9ydCIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsIm91dHB1dFBhdGgiLCJoYW5kbGVFcnJvcnMiLCJmbiIsInJlcSIsInJlcyIsIm5leHQiLCJ4IiwiaW5pdGlhbGl6ZUFwcCIsInN0YXRzIiwiaW5mbyIsImNsaWVudFN0YXRzIiwiY29tcGlsYXRpb24iLCJlcnJvcnMiLCJsZW5ndGgiLCJ3cmFwcGluZ0FwcCIsImNvbXBpbGVycyIsImhlYXJ0YmVhdCIsImNsaWVudE1hbmlmZXN0IiwiYXNzZXRSb3V0ZSIsImZpbGVuYW1lIiwidXJsIiwic3Vic3RyIiwiYXNzZXRQYXRoIiwiZmlsZUNvbnRlbnQiLCJ0b1N0cmluZyIsImNvbnRlbnRUeXBlIiwic2VuZCIsImUiLCJzdGF0dXMiLCJnZXQiLCJyZW5kZXIiLCJkZWZhdWx0IiwiZW5kc1dpdGgiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwic29ja2V0Iiwib24iLCJlcnJvciIsImxpc3RlbiIsInN5c2NhbGwiLCJpc1BpcGUiLCJwb3J0T3JQaXBlIiwiTnVtYmVyIiwiaXNOYU4iLCJiaW5kIiwiY29kZSIsIndhdGNoZXIiLCJ3YXRjaCIsImVyciIsIm11bHRpU3RhdHMiLCJzdWNjZWVkIiwid2FybiIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBR0E7QUFDQSxNQUFNQSxhQUFhLEdBQUdDLE9BQU8sQ0FBQ0EsT0FBTyxDQUFDQyxPQUFSLEVBQzVCO0FBQ0FDLGNBQUtDLElBQUwsQ0FBVUMsT0FBTyxDQUFDQyxHQUFSLEVBQVYsRUFBeUIsZ0JBQXpCLENBRjRCLENBQUQsQ0FBN0I7O0FBS0EsTUFBTUMsVUFBVSxHQUFHRixPQUFPLENBQUNHLElBQVIsQ0FBYSxDQUFiLENBQW5CO0FBQ0EsTUFBTUMsSUFBSSxHQUFHSixPQUFPLENBQUNLLEdBQVIsQ0FBWUQsSUFBWixJQUFvQixJQUFqQztBQUNBSixPQUFPLENBQUNLLEdBQVIsQ0FBWUMsbUJBQVosR0FBbUMsb0JBQW1CRixJQUFLLEVBQTNEO0FBQ0FKLE9BQU8sQ0FBQ0ssR0FBUixDQUFZRSxtQkFBWixHQUFrQyxVQUFsQzs7QUFFQSxJQUFJLENBQUNMLFVBQUwsRUFBaUI7QUFDZk0sRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsVUFBU1QsT0FBTyxDQUFDRyxJQUFSLENBQWEsQ0FBYixDQUFnQixvQkFBdEM7QUFDQUgsRUFBQUEsT0FBTyxDQUFDVSxJQUFSLENBQWEsQ0FBQyxDQUFkO0FBQ0Q7O0FBRUQsTUFBTUMsTUFBTSxHQUFHLGtCQUFJLHFCQUFKLEVBQTJCQyxLQUEzQixFQUFmLEMsQ0FFQTs7QUFDQSxNQUFNQyxNQUFNLEdBQUcs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cG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB3ZWJwYWNrLCB7IE11bHRpQ29tcGlsZXIgfSBmcm9tICd3ZWJwYWNrJztcbmltcG9ydCB3ZWJwYWNrSG90TWlkZGxld2FyZSBmcm9tICd3ZWJwYWNrLWhvdC1taWRkbGV3YXJlJztcbmltcG9ydCB7IGNyZWF0ZUZzRnJvbVZvbHVtZSwgVm9sdW1lIH0gZnJvbSAnbWVtZnMnO1xuaW1wb3J0IHsgU2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgZXhwcmVzcywgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCB7IHBhdGNoUmVxdWlyZSB9IGZyb20gJ2ZzLW1vbmtleSc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgc291cmNlTWFwU3VwcG9ydCBmcm9tICdzb3VyY2UtbWFwLXN1cHBvcnQnO1xuaW1wb3J0IHsgdWZzIH0gZnJvbSAndW5pb25mcyc7XG5pbXBvcnQgY29tcHJlc3MgZnJvbSAnY29tcHJlc3Npb24nO1xuXG5pbXBvcnQgJ2Nyb3NzLWZldGNoL3BvbHlmaWxsJztcbmltcG9ydCB7IFJlbmRlciB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3Qgd2VicGFja0NvbmZpZyA9IHJlcXVpcmUocmVxdWlyZS5yZXNvbHZlKFxuICAvLyBUT0RPOiB1c2Ugbm9ybWFsIHJlc29sdXRpb24gYWxnb3JpdGhtIHRvIGZpbmQgd2VicGFjayBmaWxlXG4gIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcnKSxcbikpO1xuXG5jb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuY29uc3QgUE9SVCA9IHByb2Nlc3MuZW52LlBPUlQgfHwgMzAwMDtcbnByb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX0hPU1QgPSBgaHR0cDovL2xvY2FsaG9zdDoke1BPUlR9YDtcbnByb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEggPSAnL2Fzc2V0cy8nO1xuXG5pZiAoIWVudHJ5cG9pbnQpIHtcbiAgY29uc29sZS5sb2coYFVzYWdlOiAke3Byb2Nlc3MuYXJndlswXX0gPGVudHJ5cG9pbnQtZmlsZT5gKTtcbiAgcHJvY2Vzcy5leGl0KC0xKTtcbn1cblxuY29uc3QgbG9hZGVyID0gb3JhKCdCdWlsZGluZyB0aGUgYXNzZXRzJykuc3RhcnQoKTtcblxuLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG5jb25zdCB2b2x1bWUgPSBuZXcgVm9sdW1lKCk7XG5jb25zdCBmcyA9IGNyZWF0ZUZzRnJvbVZvbHVtZSh2b2x1bWUpO1xudWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG5wYXRjaFJlcXVpcmUodWZzKTtcbmNvbnN0IHJlYWRGaWxlID0gcHJvbWlzaWZ5KHVmcy5yZWFkRmlsZSk7XG5sZXQgc2VydmVyOiBTZXJ2ZXIgfCB1bmRlZmluZWQ7XG5cbi8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbmZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICBkaXNrRnMud3JpdGVTeW5jKFxuICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgYFxuaW1wb3J0IGVudHJ5IGZyb20gXCIke3BhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBlbnRyeVBhdGgpfVwiO1xuXG5pZiAobW9kdWxlLmhvdCkge1xuICBtb2R1bGUuaG90LmFjY2VwdCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgYCxcbiAgKTtcbiAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG59XG5cbmNvbnN0IHdlYnBhY2tDb25maWdzID0gW1xuICB3ZWJwYWNrQ29uZmlnKFxuICAgIHtcbiAgICAgIGVudHJ5cG9pbnQ6IGhvdEVudHJ5KGVudHJ5cG9pbnQpLm5hbWUsXG4gICAgICBuYW1lOiAnY2xpZW50JyxcbiAgICB9LFxuICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JyB9LFxuICApLFxuICB3ZWJwYWNrQ29uZmlnKFxuICAgIHtcbiAgICAgIGVudHJ5cG9pbnQ6IGhvdEVudHJ5KGVudHJ5cG9pbnQucmVwbGFjZSgnLnRzeCcsICcuc2VydmVyLnRzeCcpKS5uYW1lLFxuICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgfSxcbiAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICksXG5dIGFzIGNvbnN0O1xuLy8gaW5pdGlhbGl6ZSB0aGUgd2VicGFjayBjb21waWxlclxuY29uc3QgY29tcGlsZXI6IE11bHRpQ29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzKTtcblxuY29tcGlsZXIub3V0cHV0RmlsZVN5c3RlbSA9IHtcbiAgLi4uZnMsXG4gIGpvaW46IHBhdGguam9pbiBhcyBhbnksXG59IGFzIGFueSBhcyB0eXBlb2YgZnM7XG5cbnNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBnZXRTZXJ2ZXJCdW5kbGUoc2VydmVyU3RhdHM6IHdlYnBhY2suU3RhdHMpIHtcbiAgY29uc3Qgc2VydmVySnNvbiA9IHNlcnZlclN0YXRzLnRvSnNvbih7IGFzc2V0czogdHJ1ZSB9KTtcbiAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdtYWluLmpzJyk7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gIEYgZXh0ZW5kcyAoXG4gICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgKSA9PiBQcm9taXNlPHZvaWQ+LFxuPihmbjogRikge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuICApIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICB9IGNhdGNoICh4KSB7XG4gICAgICBuZXh0KHgpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gU3RhcnQgdGhlIGV4cHJlc3Mgc2VydmVyIGFmdGVyIHRoZSBmaXJzdCBjb21waWxhdGlvblxuZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChzdGF0czogd2VicGFjay5TdGF0c1tdKSB7XG4gIGxvYWRlci5pbmZvKCdMYXVuY2hpbmcgc2VydmVyJyk7XG4gIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gIGlmIChcbiAgICBjbGllbnRTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoIHx8XG4gICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICApIHtcbiAgICBjb25zb2xlLmxvZygnRXJyb3JzIGZvciBjbGllbnQgYnVpbGQ6ICcsIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgY29uc29sZS5sb2coJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOicsIHNlcnZlclN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgLy8gVE9ETzogaGFuZGxlIG1vcmUgZ3JhY2VmdWxseVxuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH1cblxuICBjb25zdCB3cmFwcGluZ0FwcCA9IGV4cHJlc3MoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIC8vQHRzLWlnbm9yZVxuICB3cmFwcGluZ0FwcC51c2UoY29tcHJlc3MoKSk7XG5cbiAgLy8gQVNTRVRTXG4gIHdyYXBwaW5nQXBwLnVzZShcbiAgICB3ZWJwYWNrSG90TWlkZGxld2FyZShjb21waWxlci5jb21waWxlcnNbMF0sIHtcbiAgICAgIGxvZzogY29uc29sZS5sb2csXG4gICAgICBwYXRoOiAnL19fd2VicGFja19obXInLFxuICAgICAgaGVhcnRiZWF0OiAxMCAqIDEwMDAsXG4gICAgICAvL25vSW5mbzogdHJ1ZSxcbiAgICAgIC8vbmFtZTogJ2NsaWVudCcsXG4gICAgfSksXG4gICk7XG4gIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG4gIGNvbnN0IGFzc2V0Um91dGUgPSBhc3luYyAocmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLCByZXM6IGFueSkgPT4ge1xuICAgIGNvbnN0IGZpbGVuYW1lID1cbiAgICAgIHJlcS51cmw/LnN1YnN0cigocHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCBhcyBzdHJpbmcpLmxlbmd0aCkgPz8gJyc7XG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKGNsaWVudE1hbmlmZXN0Lm91dHB1dFBhdGggPz8gJycsIGZpbGVuYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IChhd2FpdCByZWFkRmlsZShhc3NldFBhdGgpKS50b1N0cmluZygpO1xuICAgICAgcmVzLmNvbnRlbnRUeXBlKGZpbGVuYW1lKTtcbiAgICAgIHJlcy5zZW5kKGZpbGVDb250ZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCk7XG4gICAgICByZXMuc2VuZChlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH07XG4gIHdyYXBwaW5nQXBwLmdldChgJHtwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRIfSpgLCBhc3NldFJvdXRlKTtcblxuICAvLyBTRVJWRVIgU0lERSBSRU5ERVJJTkdcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSByZXF1aXJlKGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cykpLmRlZmF1bHQ7XG4gIHdyYXBwaW5nQXBwLmdldChcbiAgICAnLyonLFxuICAgIGhhbmRsZUVycm9ycyhhc3luYyBmdW5jdGlvbiAocmVxOiBhbnksIHJlczogYW55KSB7XG4gICAgICBpZiAocmVxLnVybC5lbmRzV2l0aCgnZmF2aWNvbi5pY28nKSkge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICByZXMuc2VuZCgnbm90IGZvdW5kJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5zb2NrZXQub24oJ2Vycm9yJywgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhdGFsJywgZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHJlbmRlcihjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMpO1xuICAgIH0pLFxuICApO1xuXG4gIHNlcnZlciA9IHdyYXBwaW5nQXBwXG4gICAgLmxpc3RlbihQT1JULCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIGF0ICR7UE9SVH0uLi5gKTtcbiAgICB9KVxuICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLnN5c2NhbGwgIT09ICdsaXN0ZW4nKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNQaXBlID0gKHBvcnRPclBpcGU6IHN0cmluZyB8IG51bWJlcikgPT4gTnVtYmVyLmlzTmFOKHBvcnRPclBpcGUpO1xuICAgICAgY29uc3QgYmluZCA9IGlzUGlwZShQT1JUKSA/ICdQaXBlICcgKyBQT1JUIDogJ1BvcnQgJyArIFBPUlQ7XG4gICAgICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICAgICAgY2FzZSAnRUFDQ0VTJzpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGJpbmQgKyAnIHJlcXVpcmVzIGVsZXZhdGVkIHByaXZpbGVnZXMnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0VBRERSSU5VU0UnOlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYmluZCArICcgaXMgYWxyZWFkeSBpbiB1c2UnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbi8vIFdhdGNoIHRoZSBmaWxlcyBmb3IgY2hhbmdlc1xuY29uc3Qgd2F0Y2hlciA9IGNvbXBpbGVyLndhdGNoKHt9LCAoZXJyLCBtdWx0aVN0YXRzKSA9PiB7XG4gIGlmICghbXVsdGlTdGF0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH1cbiAgaWYgKHNlcnZlcikge1xuICAgIGxvYWRlci5zdWNjZWVkKCdXZWJwYWNrIGJ1bmRsZSB1cGRhdGVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgaW5pdGlhbGl6ZUFwcChtdWx0aVN0YXRzLnN0YXRzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGFwcCcpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gIH1cbn0pO1xuXG5wcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gIGxvYWRlci53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gIGlmIChzZXJ2ZXIpIGNvbnNvbGUubG9nKCdDbG9zaW5nIHNlcnZlcicpO1xuICBzZXJ2ZXI/LmNsb3NlKCgpID0+IHtcbiAgICBsb2FkZXIuaW5mbygnU2VydmVyIGNsb3NlZCcpO1xuICB9KTtcbiAgd2F0Y2hlci5jbG9zZSgoKSA9PiB7XG4gICAgbG9hZGVyLmluZm8oJ3dlYnBhY2sgYnVpbGQgc3RvcHBlZCcpO1xuICB9KTtcbiAgcHJvY2Vzcy5leGl0KC0xKTtcbn0pO1xuIl19
@@ -0,0 +1,6 @@
1
+ /// <reference types="node" />
2
+ import { ServerResponse, IncomingMessage } from 'http';
3
+ import { StatsCompilation } from 'webpack';
4
+ import { Request, Response } from 'express';
5
+ export declare type Render = (clientManifest: StatsCompilation, req: Request | IncomingMessage, res: Response | ServerResponse) => Promise<void>;
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scripts/types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,oBAAY,MAAM,GAAG,CACnB,cAAc,EAAE,gBAAgB,EAChC,GAAG,EAAE,OAAO,GAAG,eAAe,EAC9B,GAAG,EAAE,QAAQ,GAAG,cAAc,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,19 @@
1
+ /// <reference types="react" />
2
+ declare type Props = {
3
+ children: React.ReactNode;
4
+ assets: {
5
+ href: string;
6
+ as?: string;
7
+ rel?: string;
8
+ }[];
9
+ head: React.ReactNode;
10
+ title: string;
11
+ };
12
+ declare function Document({ assets, head, children, title }: Props): JSX.Element;
13
+ declare namespace Document {
14
+ var defaultProps: {
15
+ head: JSX.Element;
16
+ };
17
+ }
18
+ export default Document;
19
+ //# sourceMappingURL=DocumentComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentComponent.d.ts","sourceRoot":"","sources":["../../src/spouts/DocumentComponent.tsx"],"names":[],"mappings":";AAAA,aAAK,KAAK,GAAG;IACX,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,iBAAwB,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,eA0BxE;kBA1BuB,QAAQ;;;;;eAAR,QAAQ"}