@anansi/core 0.6.1 → 0.7.2
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 +43 -0
- package/dist/server.js +26 -7
- package/dist/server.js.map +1 -1
- package/lib/scripts/startDevserver.d.ts.map +1 -1
- package/lib/scripts/startDevserver.js +59 -99
- package/lib/scripts/types.d.ts +1 -0
- package/lib/scripts/types.d.ts.map +1 -1
- package/lib/scripts/types.js +1 -1
- package/lib/spouts/document.server.d.ts.map +1 -1
- package/lib/spouts/document.server.js +26 -7
- package/package.json +5 -8
- package/src/scripts/startDevserver.ts +58 -99
- package/src/scripts/types.ts +5 -0
- package/src/scripts/webpack-logging.d.ts +4 -0
- package/src/spouts/document.server.tsx +47 -14
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,49 @@
|
|
|
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.7.2](https://github.com/ntucker/anansi/compare/@anansi/core@0.7.1...@anansi/core@0.7.2) (2022-05-28)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### 💅 Enhancement
|
|
10
|
+
|
|
11
|
+
* More error handling ([129d444](https://github.com/ntucker/anansi/commit/129d44407ac3ea9838e240d82f774c73100cc9da))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### [0.7.1](https://github.com/ntucker/anansi/compare/@anansi/core@0.7.0...@anansi/core@0.7.1) (2022-05-28)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### 💅 Enhancement
|
|
19
|
+
|
|
20
|
+
* Do not use additional express server for dev ([ce29cbb](https://github.com/ntucker/anansi/commit/ce29cbb0b8547b736a31f9bac6309338b6114bae))
|
|
21
|
+
* Target current node for server devbuild ([262bd1e](https://github.com/ntucker/anansi/commit/262bd1e79d56dacdb4114d8ea959d819df16b687))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### 🐛 Bug Fix
|
|
25
|
+
|
|
26
|
+
* SSR hot reloading ([3b08106](https://github.com/ntucker/anansi/commit/3b081066463020fdbef2c01efd4922d09e02d8aa))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## [0.7.0](https://github.com/ntucker/anansi/compare/@anansi/core@0.6.1...@anansi/core@0.7.0) (2022-05-28)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### 🚀 Features
|
|
34
|
+
|
|
35
|
+
* env.entrypath override ([a918d32](https://github.com/ntucker/anansi/commit/a918d3247c22ea00d0e1d5395553752280d32d99))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### 💅 Enhancement
|
|
39
|
+
|
|
40
|
+
* Improve route asset identification ([c07e9a2](https://github.com/ntucker/anansi/commit/c07e9a29935e0e24f815371ad6610bed77da967e))
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
### 📦 Package
|
|
44
|
+
|
|
45
|
+
* Update babel monorepo to v7.18.2 ([#1520](https://github.com/ntucker/anansi/issues/1520)) ([e0fe514](https://github.com/ntucker/anansi/commit/e0fe5142b0c308aff24b86faef6d70084c80691f))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
6
49
|
### [0.6.1](https://github.com/ntucker/anansi/compare/@anansi/core@0.6.0...@anansi/core@0.6.1) (2022-05-24)
|
|
7
50
|
|
|
8
51
|
|
package/dist/server.js
CHANGED
|
@@ -246,22 +246,33 @@ var document_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/sp
|
|
|
246
246
|
function DocumentSpout(options) {
|
|
247
247
|
return function (next) {
|
|
248
248
|
return async props => {
|
|
249
|
-
var _props$clientManifest, _props$clientManifest2,
|
|
249
|
+
var _props$clientManifest, _props$clientManifest2, _props$clientManifest3, _props$clientManifest4, _props$clientManifest5, _nextProps$title;
|
|
250
250
|
|
|
251
251
|
const nextProps = await next(props);
|
|
252
|
-
const entrypoint = (_props$clientManifest = props.clientManifest) === null || _props$clientManifest === void 0 ? void 0 : (_props$clientManifest2 = _props$clientManifest.entrypoints) === null || _props$clientManifest2 === void 0 ? void 0 : _props$clientManifest2.main;
|
|
253
252
|
const publicPath = props.clientManifest.publicPath;
|
|
254
|
-
if (
|
|
253
|
+
if (Object.keys((_props$clientManifest = (_props$clientManifest2 = props.clientManifest) === null || _props$clientManifest2 === void 0 ? void 0 : _props$clientManifest2.entrypoints) != null ? _props$clientManifest : {}).length < 1 || publicPath === undefined) throw new Error('Manifest missing entries needed'); // TODO: consider using this package for build stats in future:
|
|
255
254
|
// https://github.com/facebook/react/tree/main/packages/react-server-dom-webpack
|
|
256
255
|
|
|
257
256
|
const assetMap = assets => assets.map(({
|
|
258
257
|
name
|
|
259
|
-
}) => `${publicPath}${name}`);
|
|
258
|
+
}) => `${publicPath}${name}`);
|
|
260
259
|
|
|
260
|
+
const assetList = [];
|
|
261
|
+
Object.values((_props$clientManifest3 = (_props$clientManifest4 = props.clientManifest) === null || _props$clientManifest4 === void 0 ? void 0 : _props$clientManifest4.entrypoints) != null ? _props$clientManifest3 : {}).forEach(entrypoint => {
|
|
262
|
+
var _entrypoint$assets;
|
|
261
263
|
|
|
262
|
-
|
|
264
|
+
assetList.push(...assetMap((_entrypoint$assets = entrypoint.assets) != null ? _entrypoint$assets : []));
|
|
265
|
+
});
|
|
266
|
+
new Set(assetMap(Object.values((_props$clientManifest5 = props.clientManifest.namedChunkGroups) != null ? _props$clientManifest5 : {}).filter(({
|
|
263
267
|
name
|
|
264
|
-
}) => nextProps.matchedRoutes.some(route => name ===
|
|
268
|
+
}) => nextProps.matchedRoutes.some(route => name === null || name === void 0 ? void 0 : name.includes(route.name))).flatMap(chunk => {
|
|
269
|
+
var _chunk$assets;
|
|
270
|
+
|
|
271
|
+
return [...((_chunk$assets = chunk.assets) != null ? _chunk$assets : []), // any chunk preloads
|
|
272
|
+
...childrenAssets(chunk)];
|
|
273
|
+
}))).forEach(asset => assetList.push(asset)); // find additional assets to preload based on matched route
|
|
274
|
+
|
|
275
|
+
const assets = assetList.filter(asset => !asset.endsWith('.hot-update.js')).map(asset => asset.endsWith('.css') ? {
|
|
265
276
|
href: asset,
|
|
266
277
|
rel: 'stylesheet'
|
|
267
278
|
} : asset.endsWith('.js') ? {
|
|
@@ -278,7 +289,7 @@ function DocumentSpout(options) {
|
|
|
278
289
|
__self: this,
|
|
279
290
|
__source: {
|
|
280
291
|
fileName: document_server_jsxFileName,
|
|
281
|
-
lineNumber:
|
|
292
|
+
lineNumber: 52,
|
|
282
293
|
columnNumber: 14
|
|
283
294
|
}
|
|
284
295
|
}, nextProps.app)
|
|
@@ -286,6 +297,14 @@ function DocumentSpout(options) {
|
|
|
286
297
|
};
|
|
287
298
|
};
|
|
288
299
|
}
|
|
300
|
+
|
|
301
|
+
function childrenAssets(chunk) {
|
|
302
|
+
return chunk.children ? Object.values(chunk.children).flatMap(preload => preload.flatMap(c => {
|
|
303
|
+
var _c$assets;
|
|
304
|
+
|
|
305
|
+
return (_c$assets = c.assets) != null ? _c$assets : [];
|
|
306
|
+
})) : [];
|
|
307
|
+
}
|
|
289
308
|
;// CONCATENATED MODULE: external "@rest-hooks/core"
|
|
290
309
|
const core_namespaceObject = require("@rest-hooks/core");
|
|
291
310
|
;// CONCATENATED MODULE: external "@rest-hooks/ssr"
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","mappings":";;AAAA;AACA;AACA;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACNA;;ACAA;AAKA;AAIA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AAEA;;AAnBA;AAuBA;;AACA;AACA;;AACA;AACA;;AC3DA;;;;;ACQA;AACA;AACA;AACA;AACA;AACA;AALA;AAOA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AACA;AADA;AADA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AARA;;;ACzCA;AAIA;AAOA;AAKA;AAGA;AAAA;;AACA;AAEA;AACA;AAEA;AAIA;;AACA;AACA;AAAA;;;AAEA;AAEA;AAAA;AAKA;AAAA;AAAA;AAEA;AAAA;AAAA;AACA;AAAA;AAGA;AAEA;AAGA;AACA;AACA;AAJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHA;AA3BA;AAHA;AA6CA;;AC7DA;;ACAA;;;;ACAA;AACA;AAMA;AAGA;AAAA;AAEA;AAGA;AACA;AAIA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHA;AAKA;AACA;AACA;;AC7BA;;ACAA;;;ACAA;AACA;AACA;AAMA;AAKA;AAGA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;;AAEA;AAGA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJA;AAMA;AACA;AACA;;ACvCA;AACA;AAOA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA","sources":["/home/ntucker/src/anansi/packages/core/webpack/bootstrap","/home/ntucker/src/anansi/packages/core/webpack/runtime/compat get default export","/home/ntucker/src/anansi/packages/core/webpack/runtime/define property getters","/home/ntucker/src/anansi/packages/core/webpack/runtime/hasOwnProperty shorthand","/home/ntucker/src/anansi/packages/core/webpack/runtime/make namespace object","/home/ntucker/src/anansi/packages/core/external commonjs \"react-dom/server\"","/home/ntucker/src/anansi/packages/core/src/laySpouts.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"react\"","/home/ntucker/src/anansi/packages/core/src/spouts/DocumentComponent.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/document.server.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"@rest-hooks/core\"","/home/ntucker/src/anansi/packages/core/external commonjs \"@rest-hooks/ssr\"","/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.server.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"@anansi/router\"","/home/ntucker/src/anansi/packages/core/external commonjs \"history\"","/home/ntucker/src/anansi/packages/core/src/spouts/router.server.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/prefetch.server.tsx","/home/ntucker/src/anansi/packages/core/src/index.server.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-dom/server\");","import { renderToPipeableStream as reactRender } from 'react-dom/server';\n\nimport { Render } from './scripts/types';\nimport { ServerProps } from './spouts/types';\n\nexport default function laySpouts(\n spouts: (props: ServerProps) => Promise<{\n app: JSX.Element;\n }>,\n { timeoutMS = 200 }: { timeoutMS?: number } = {},\n) {\n const render: Render = async (clientManifest, req, res) => {\n const { app } = await spouts({ clientManifest, req, res });\n let didError = false;\n const { pipe, abort } = reactRender(\n app,\n /*\n This is not documented, so included the types here for reference:\ntype Options = {|\n identifierPrefix?: string,\n namespaceURI?: string,\n nonce?: string,\n bootstrapScriptContent?: string,\n bootstrapScripts?: Array<string>,\n bootstrapModules?: Array<string>,\n progressiveChunkSize?: number,\n onShellReady?: () => void,\n onShellError?: () => void,\n onAllReady?: () => void,\n onError?: (error: mixed) => void,\n|};\n */\n {\n //bootstrapScripts: assets.filter(asset => asset.endsWith('.js')),\n onShellReady() {\n //managers.forEach(manager => manager.cleanup());\n // If something errored before we started streaming, we set the error code appropriately.\n res.statusCode = didError ? 500 : 200;\n res.setHeader('Content-type', 'text/html');\n pipe(res);\n },\n onShellError() {\n didError = true;\n res.statusCode = 500;\n pipe(res);\n },\n onError(x: any) {\n didError = true;\n console.error(x);\n res.statusCode = 500;\n //pipe(res); Removing this avoids, \"React currently only supports piping to one writable stream.\"\n },\n },\n );\n // Abandon and switch to client rendering if enough time passes.\n // Try lowering this to see the client recover.\n setTimeout(abort, timeoutMS);\n };\n return render;\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","type Props = {\n children: React.ReactNode;\n assets: { href: string; as?: string; rel?: string }[];\n head: React.ReactNode;\n title: string;\n rootId: string;\n};\n\nexport default function Document({\n assets,\n head,\n children,\n title,\n rootId,\n}: Props) {\n return (\n <html>\n <head>\n {head}\n {assets.map((asset, i) => (\n <link key={i} rel=\"preload\" {...asset} />\n ))}\n <title>{title}</title>\n </head>\n <body>\n <div id={rootId}>{children}</div>\n {/* this ensures the client can hydrate the assets prop */}\n <script\n dangerouslySetInnerHTML={{\n __html: `assetManifest = ${JSON.stringify(assets)};`,\n }}\n />\n {assets\n .filter(({ href }) => href.endsWith('.js'))\n .map(({ href }, i) => (\n <script key={i} src={href} async />\n ))}\n </body>\n </html>\n );\n}\nDocument.defaultProps = {\n head: (\n <>\n <meta charSet=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"shortcut icon\" href=\"/assets/favicon.ico\" />\n </>\n ),\n rootId: 'anansi-root',\n};\n","import React from 'react';\nimport type { Route } from '@anansi/router';\n\nimport type { ServerProps, ResolveProps } from './types';\nimport Document from './DocumentComponent';\n\ntype NeededProps = {\n matchedRoutes: Route<any>[];\n title?: string;\n} & ResolveProps;\n\nexport default function DocumentSpout(options: {\n head?: React.ReactNode;\n title: string;\n rootId: string;\n}) {\n return function <T extends NeededProps>(\n next: (props: ServerProps) => Promise<T>,\n ) {\n return async (props: ServerProps) => {\n const nextProps = await next(props);\n\n const entrypoint = props.clientManifest?.entrypoints?.main;\n const publicPath = props.clientManifest.publicPath;\n\n if (entrypoint === undefined || publicPath === undefined)\n throw new Error('Manifest missing entries needed');\n\n // TODO: consider using this package for build stats in future:\n // https://github.com/facebook/react/tree/main/packages/react-server-dom-webpack\n const assetMap = (assets: { name: string; size?: number }[]) =>\n assets.map(({ name }) => `${publicPath}${name}`);\n // find additional assets to preload based on matched route\n const assets = assetMap([\n ...(entrypoint.assets ?? []),\n ...(entrypoint.children?.prefetch?.find?.(({ name }) =>\n nextProps.matchedRoutes.some(route => name === route.name),\n )?.assets ?? []),\n ]).map(asset =>\n asset.endsWith('.css')\n ? { href: asset, rel: 'stylesheet' }\n : asset.endsWith('.js')\n ? { href: asset, as: 'script' }\n : { href: asset },\n );\n\n return {\n ...nextProps,\n app: (\n <Document\n {...options}\n title={nextProps.title ?? options.title}\n assets={assets}\n rootId={options.rootId}\n >\n {nextProps.app}\n </Document>\n ),\n };\n };\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/core\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/ssr\");","import { Manager, NetworkManager } from '@rest-hooks/core';\nimport { createPersistedStore } from '@rest-hooks/ssr';\n\nimport type { ResolveProps, ServerProps } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n) {\n return function <T extends NeededProps>(\n next: (props: ServerProps) => Promise<T>,\n ) {\n return async (props: ServerProps) => {\n const [ServerCacheProvider, controller] = createPersistedStore(\n options.getManagers(),\n );\n\n const nextProps = await next(props);\n\n return {\n ...nextProps,\n controller,\n app: <ServerCacheProvider>{nextProps.app}</ServerCacheProvider>,\n };\n };\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@anansi/router\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"history\");","import { Route, RouteProvider, RouteController } from '@anansi/router';\nimport React from 'react';\nimport { createMemoryHistory } from 'history';\n\nimport type { ResolveProps, ServerProps, CreateRouter } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n}) {\n const createRouteComponent = (\n router: RouteController<Route<ResolveWith, any>>,\n ) =>\n function Router({ children }: { children: React.ReactNode }) {\n const resolveWith = options.useResolveWith();\n\n return (\n <RouteProvider router={router} resolveWith={resolveWith}>\n {children}\n </RouteProvider>\n );\n };\n\n return function <T extends NeededProps>(\n next: (props: ServerProps) => Promise<T>,\n ) {\n return async (props: ServerProps) => {\n const url = props.req.url || '';\n const router = options.createRouter(\n createMemoryHistory({ initialEntries: [url] }),\n );\n const matchedRoutes: Route<ResolveWith>[] = router.getMatchedRoutes(url);\n\n const nextProps = await next(props);\n\n const Router = createRouteComponent(router);\n return {\n ...nextProps,\n matchedRoutes,\n router,\n app: <Router>{nextProps.app}</Router>,\n };\n };\n };\n}\n","import { Route } from '@anansi/router';\n\nimport type { ResolveProps, ServerProps } from './types';\n\ntype NeededProps<RouteWith> = {\n matchedRoutes: Route<RouteWith>[];\n} & ResolveProps;\n\nexport default function prefetchSpout<F extends string>(field: F) {\n return function <RouteWith, T extends NeededProps<RouteWith>>(\n next: (props: ServerProps) => Promise<\n {\n [K in F]: RouteWith;\n } & T\n >,\n ) {\n return async (props: ServerProps) => {\n const nextProps = await next(props);\n\n try {\n const toFetch: Promise<unknown>[] = [];\n nextProps.matchedRoutes.forEach(route => {\n if (typeof route.resolveData === 'function') {\n toFetch.push(route.resolveData(nextProps[field], route));\n }\n });\n await Promise.all(toFetch);\n } catch (e) {\n console.error(e);\n }\n return nextProps;\n };\n };\n}\n","export { default as laySpouts } from './laySpouts';\nexport { default as documentSpout } from './spouts/document.server';\nexport { default as restHooksSpout } from './spouts/restHooks.server';\nexport { default as routerSpout } from './spouts/router.server';\nexport { default as prefetchSpout } from './spouts/prefetch.server';\n"],"names":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"server.js","mappings":";;AAAA;AACA;AACA;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACPA;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACNA;;ACAA;AAKA;AAIA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;AAEA;;AAnBA;AAuBA;;AACA;AACA;;AACA;AACA;;AC3DA;;;;;ACQA;AACA;AACA;AACA;AACA;AACA;AALA;AAOA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AACA;AADA;AADA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AACA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AARA;;;ACzCA;AAKA;AAOA;AAKA;AAGA;AAAA;;AACA;AAEA;AAEA;AAOA;;AACA;AACA;AAAA;;AAEA;AACA;AACA;;AACA;AAFA;AAKA;AAGA;AAAA;AAGA;;AAAA;AAGA;AAHA;;AASA;AAQA;AAAA;AAAA;AAEA;AAAA;AAAA;AACA;AAAA;AAGA;AAEA;AAGA;AACA;AACA;AAJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHA;AAnDA;AAHA;AAqEA;;AAEA;AACA;AAEA;;AAAA;AAAA;AAGA;;AC9FA;;ACAA;;;;ACAA;AACA;AAMA;AAGA;AAAA;AAEA;AAGA;AACA;AAIA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHA;AAKA;AACA;AACA;;AC7BA;;ACAA;;;ACAA;AACA;AACA;AAMA;AAKA;AAGA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;;AAEA;AAGA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJA;AAMA;AACA;AACA;;ACvCA;AACA;AAOA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA","sources":["/home/ntucker/src/anansi/packages/core/webpack/bootstrap","/home/ntucker/src/anansi/packages/core/webpack/runtime/compat get default export","/home/ntucker/src/anansi/packages/core/webpack/runtime/define property getters","/home/ntucker/src/anansi/packages/core/webpack/runtime/hasOwnProperty shorthand","/home/ntucker/src/anansi/packages/core/webpack/runtime/make namespace object","/home/ntucker/src/anansi/packages/core/external commonjs \"react-dom/server\"","/home/ntucker/src/anansi/packages/core/src/laySpouts.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"react\"","/home/ntucker/src/anansi/packages/core/src/spouts/DocumentComponent.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/document.server.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"@rest-hooks/core\"","/home/ntucker/src/anansi/packages/core/external commonjs \"@rest-hooks/ssr\"","/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.server.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"@anansi/router\"","/home/ntucker/src/anansi/packages/core/external commonjs \"history\"","/home/ntucker/src/anansi/packages/core/src/spouts/router.server.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/prefetch.server.tsx","/home/ntucker/src/anansi/packages/core/src/index.server.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react-dom/server\");","import { renderToPipeableStream as reactRender } from 'react-dom/server';\n\nimport { Render } from './scripts/types';\nimport { ServerProps } from './spouts/types';\n\nexport default function laySpouts(\n spouts: (props: ServerProps) => Promise<{\n app: JSX.Element;\n }>,\n { timeoutMS = 200 }: { timeoutMS?: number } = {},\n) {\n const render: Render = async (clientManifest, req, res) => {\n const { app } = await spouts({ clientManifest, req, res });\n let didError = false;\n const { pipe, abort } = reactRender(\n app,\n /*\n This is not documented, so included the types here for reference:\ntype Options = {|\n identifierPrefix?: string,\n namespaceURI?: string,\n nonce?: string,\n bootstrapScriptContent?: string,\n bootstrapScripts?: Array<string>,\n bootstrapModules?: Array<string>,\n progressiveChunkSize?: number,\n onShellReady?: () => void,\n onShellError?: () => void,\n onAllReady?: () => void,\n onError?: (error: mixed) => void,\n|};\n */\n {\n //bootstrapScripts: assets.filter(asset => asset.endsWith('.js')),\n onShellReady() {\n //managers.forEach(manager => manager.cleanup());\n // If something errored before we started streaming, we set the error code appropriately.\n res.statusCode = didError ? 500 : 200;\n res.setHeader('Content-type', 'text/html');\n pipe(res);\n },\n onShellError() {\n didError = true;\n res.statusCode = 500;\n pipe(res);\n },\n onError(x: any) {\n didError = true;\n console.error(x);\n res.statusCode = 500;\n //pipe(res); Removing this avoids, \"React currently only supports piping to one writable stream.\"\n },\n },\n );\n // Abandon and switch to client rendering if enough time passes.\n // Try lowering this to see the client recover.\n setTimeout(abort, timeoutMS);\n };\n return render;\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","type Props = {\n children: React.ReactNode;\n assets: { href: string; as?: string; rel?: string }[];\n head: React.ReactNode;\n title: string;\n rootId: string;\n};\n\nexport default function Document({\n assets,\n head,\n children,\n title,\n rootId,\n}: Props) {\n return (\n <html>\n <head>\n {head}\n {assets.map((asset, i) => (\n <link key={i} rel=\"preload\" {...asset} />\n ))}\n <title>{title}</title>\n </head>\n <body>\n <div id={rootId}>{children}</div>\n {/* this ensures the client can hydrate the assets prop */}\n <script\n dangerouslySetInnerHTML={{\n __html: `assetManifest = ${JSON.stringify(assets)};`,\n }}\n />\n {assets\n .filter(({ href }) => href.endsWith('.js'))\n .map(({ href }, i) => (\n <script key={i} src={href} async />\n ))}\n </body>\n </html>\n );\n}\nDocument.defaultProps = {\n head: (\n <>\n <meta charSet=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"shortcut icon\" href=\"/assets/favicon.ico\" />\n </>\n ),\n rootId: 'anansi-root',\n};\n","import React from 'react';\nimport type { Route } from '@anansi/router';\nimport { StatsChunkGroup } from 'webpack';\n\nimport type { ServerProps, ResolveProps } from './types';\nimport Document from './DocumentComponent';\n\ntype NeededProps = {\n matchedRoutes: Route<any>[];\n title?: string;\n} & ResolveProps;\n\nexport default function DocumentSpout(options: {\n head?: React.ReactNode;\n title: string;\n rootId: string;\n}) {\n return function <T extends NeededProps>(\n next: (props: ServerProps) => Promise<T>,\n ) {\n return async (props: ServerProps) => {\n const nextProps = await next(props);\n\n const publicPath = props.clientManifest.publicPath;\n\n if (\n Object.keys(props.clientManifest?.entrypoints ?? {}).length < 1 ||\n publicPath === undefined\n )\n throw new Error('Manifest missing entries needed');\n\n // TODO: consider using this package for build stats in future:\n // https://github.com/facebook/react/tree/main/packages/react-server-dom-webpack\n const assetMap = (assets: { name: string; size?: number }[]) =>\n assets.map(({ name }) => `${publicPath}${name}`);\n\n const assetList: string[] = [];\n Object.values(props.clientManifest?.entrypoints ?? {}).forEach(\n entrypoint => {\n assetList.push(...assetMap(entrypoint.assets ?? []));\n },\n );\n new Set(\n assetMap(\n Object.values(props.clientManifest.namedChunkGroups ?? {})\n .filter(({ name }) =>\n nextProps.matchedRoutes.some(route => name?.includes(route.name)),\n )\n .flatMap(chunk => [\n ...(chunk.assets ?? []),\n // any chunk preloads\n ...childrenAssets(chunk),\n ]),\n ),\n ).forEach(asset => assetList.push(asset));\n\n // find additional assets to preload based on matched route\n const assets: {\n href: string;\n as?: string | undefined;\n rel?: string | undefined;\n }[] = assetList\n .filter(asset => !asset.endsWith('.hot-update.js'))\n .map(asset =>\n asset.endsWith('.css')\n ? { href: asset, rel: 'stylesheet' }\n : asset.endsWith('.js')\n ? { href: asset, as: 'script' }\n : { href: asset },\n );\n\n return {\n ...nextProps,\n app: (\n <Document\n {...options}\n title={nextProps.title ?? options.title}\n assets={assets}\n rootId={options.rootId}\n >\n {nextProps.app}\n </Document>\n ),\n };\n };\n };\n}\n\nfunction childrenAssets(chunk: StatsChunkGroup) {\n return chunk.children\n ? Object.values(chunk.children).flatMap(preload =>\n preload.flatMap(c => c.assets ?? []),\n )\n : [];\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/core\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/ssr\");","import { Manager, NetworkManager } from '@rest-hooks/core';\nimport { createPersistedStore } from '@rest-hooks/ssr';\n\nimport type { ResolveProps, ServerProps } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n) {\n return function <T extends NeededProps>(\n next: (props: ServerProps) => Promise<T>,\n ) {\n return async (props: ServerProps) => {\n const [ServerCacheProvider, controller] = createPersistedStore(\n options.getManagers(),\n );\n\n const nextProps = await next(props);\n\n return {\n ...nextProps,\n controller,\n app: <ServerCacheProvider>{nextProps.app}</ServerCacheProvider>,\n };\n };\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@anansi/router\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"history\");","import { Route, RouteProvider, RouteController } from '@anansi/router';\nimport React from 'react';\nimport { createMemoryHistory } from 'history';\n\nimport type { ResolveProps, ServerProps, CreateRouter } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n}) {\n const createRouteComponent = (\n router: RouteController<Route<ResolveWith, any>>,\n ) =>\n function Router({ children }: { children: React.ReactNode }) {\n const resolveWith = options.useResolveWith();\n\n return (\n <RouteProvider router={router} resolveWith={resolveWith}>\n {children}\n </RouteProvider>\n );\n };\n\n return function <T extends NeededProps>(\n next: (props: ServerProps) => Promise<T>,\n ) {\n return async (props: ServerProps) => {\n const url = props.req.url || '';\n const router = options.createRouter(\n createMemoryHistory({ initialEntries: [url] }),\n );\n const matchedRoutes: Route<ResolveWith>[] = router.getMatchedRoutes(url);\n\n const nextProps = await next(props);\n\n const Router = createRouteComponent(router);\n return {\n ...nextProps,\n matchedRoutes,\n router,\n app: <Router>{nextProps.app}</Router>,\n };\n };\n };\n}\n","import { Route } from '@anansi/router';\n\nimport type { ResolveProps, ServerProps } from './types';\n\ntype NeededProps<RouteWith> = {\n matchedRoutes: Route<RouteWith>[];\n} & ResolveProps;\n\nexport default function prefetchSpout<F extends string>(field: F) {\n return function <RouteWith, T extends NeededProps<RouteWith>>(\n next: (props: ServerProps) => Promise<\n {\n [K in F]: RouteWith;\n } & T\n >,\n ) {\n return async (props: ServerProps) => {\n const nextProps = await next(props);\n\n try {\n const toFetch: Promise<unknown>[] = [];\n nextProps.matchedRoutes.forEach(route => {\n if (typeof route.resolveData === 'function') {\n toFetch.push(route.resolveData(nextProps[field], route));\n }\n });\n await Promise.all(toFetch);\n } catch (e) {\n console.error(e);\n }\n return nextProps;\n };\n };\n}\n","export { default as laySpouts } from './laySpouts';\nexport { default as documentSpout } from './spouts/document.server';\nexport { default as restHooksSpout } from './spouts/restHooks.server';\nexport { default as routerSpout } from './spouts/router.server';\nexport { default as prefetchSpout } from './spouts/prefetch.server';\n"],"names":[],"sourceRoot":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAiBA,OAAO,sBAAsB,CAAC"}
|
|
@@ -13,10 +13,6 @@ var _webpack = _interopRequireDefault(require("webpack"));
|
|
|
13
13
|
|
|
14
14
|
var _memfs = require("memfs");
|
|
15
15
|
|
|
16
|
-
var _express = _interopRequireDefault(require("express"));
|
|
17
|
-
|
|
18
|
-
var _ora = _interopRequireDefault(require("ora"));
|
|
19
|
-
|
|
20
16
|
var _fsMonkey = require("fs-monkey");
|
|
21
17
|
|
|
22
18
|
var _tmp = _interopRequireDefault(require("tmp"));
|
|
@@ -25,13 +21,11 @@ var _sourceMapSupport = _interopRequireDefault(require("source-map-support"));
|
|
|
25
21
|
|
|
26
22
|
var _unionfs = require("unionfs");
|
|
27
23
|
|
|
28
|
-
var _compression = _interopRequireDefault(require("compression"));
|
|
29
|
-
|
|
30
24
|
var _webpackDevServer = _interopRequireDefault(require("webpack-dev-server"));
|
|
31
25
|
|
|
32
26
|
var _importFresh = _interopRequireDefault(require("import-fresh"));
|
|
33
27
|
|
|
34
|
-
var
|
|
28
|
+
var _runtime = _interopRequireDefault(require("webpack/lib/logging/runtime"));
|
|
35
29
|
|
|
36
30
|
require("cross-fetch/polyfill");
|
|
37
31
|
|
|
@@ -41,8 +35,7 @@ var _webpackConfigs$, _webpackConfigs$$devS;
|
|
|
41
35
|
const webpackConfig = require(require.resolve( // TODO: use normal resolution algorithm to find webpack file
|
|
42
36
|
_path.default.join(process.cwd(), 'webpack.config')));
|
|
43
37
|
|
|
44
|
-
const entrypoint = process.argv[2];
|
|
45
|
-
const PORT = process.env.PORT || 3000; //process.env.WEBPACK_PUBLIC_HOST = `http://localhost:${PORT}`; this breaks compatibility with stackblitz
|
|
38
|
+
const entrypoint = process.argv[2]; //process.env.WEBPACK_PUBLIC_HOST = `http://localhost:${PORT}`; this breaks compatibility with stackblitz
|
|
46
39
|
|
|
47
40
|
process.env.WEBPACK_PUBLIC_PATH = '/assets/';
|
|
48
41
|
|
|
@@ -51,8 +44,8 @@ if (!entrypoint) {
|
|
|
51
44
|
process.exit(-1);
|
|
52
45
|
}
|
|
53
46
|
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
const log = _runtime.default.getLogger('anansi-devserver'); // Set up in memory filesystem
|
|
48
|
+
|
|
56
49
|
|
|
57
50
|
const volume = new _memfs.Volume();
|
|
58
51
|
const fs = (0, _memfs.createFsFromVolume)(volume);
|
|
@@ -84,13 +77,14 @@ export default entry;
|
|
|
84
77
|
}
|
|
85
78
|
|
|
86
79
|
const webpackConfigs = [webpackConfig({
|
|
87
|
-
|
|
80
|
+
entrypath: hotEntry(entrypoint).name,
|
|
88
81
|
name: 'client'
|
|
89
82
|
}, {
|
|
90
83
|
mode: 'development'
|
|
91
84
|
}), webpackConfig({
|
|
92
|
-
|
|
93
|
-
name: 'server'
|
|
85
|
+
entrypath: entrypoint.replace('.tsx', '.server.tsx'),
|
|
86
|
+
name: 'server',
|
|
87
|
+
BROWSERSLIST_ENV: 'current node'
|
|
94
88
|
}, {
|
|
95
89
|
mode: 'development',
|
|
96
90
|
target: 'node'
|
|
@@ -112,7 +106,7 @@ function getServerBundle(serverStats) {
|
|
|
112
106
|
const serverJson = serverStats.toJson({
|
|
113
107
|
assets: true
|
|
114
108
|
});
|
|
115
|
-
return _path.default.join((_serverJson$outputPat = serverJson.outputPath) != null ? _serverJson$outputPat : '', '
|
|
109
|
+
return _path.default.join((_serverJson$outputPat = serverJson.outputPath) != null ? _serverJson$outputPat : '', 'server.js');
|
|
116
110
|
}
|
|
117
111
|
|
|
118
112
|
function handleErrors(fn) {
|
|
@@ -125,90 +119,27 @@ function handleErrors(fn) {
|
|
|
125
119
|
};
|
|
126
120
|
}
|
|
127
121
|
|
|
128
|
-
let render;
|
|
122
|
+
let render;
|
|
129
123
|
|
|
130
|
-
function
|
|
124
|
+
function importRender(stats) {
|
|
131
125
|
var _clientStats$compilat, _clientStats$compilat2, _serverStats$compilat, _serverStats$compilat2;
|
|
132
126
|
|
|
133
127
|
const [clientStats, serverStats] = stats;
|
|
134
128
|
|
|
135
129
|
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) {
|
|
136
|
-
|
|
137
|
-
|
|
130
|
+
log.error('Errors for client build: ' + clientStats.compilation.errors);
|
|
131
|
+
log.error('Errors for server build: ' + serverStats.compilation.errors); // TODO: handle more gracefully
|
|
138
132
|
|
|
139
133
|
process.exit(-1);
|
|
140
134
|
} else {
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const wrappingApp = (0, _express.default)(); // eslint-disable-next-line
|
|
145
|
-
//@ts-ignore
|
|
146
|
-
|
|
147
|
-
wrappingApp.use((0, _compression.default)()); // ASSETS
|
|
148
|
-
|
|
149
|
-
const clientManifest = clientStats.toJson();
|
|
150
|
-
|
|
151
|
-
const assetRoute = async (req, res) => {
|
|
152
|
-
var _req$url$substring$sp, _req$url, _clientManifest$outpu;
|
|
135
|
+
log.info('Launching SSR');
|
|
136
|
+
} // ASSETS
|
|
153
137
|
|
|
154
|
-
const filename = (_req$url$substring$sp = (_req$url = req.url) === null || _req$url === void 0 ? void 0 : _req$url.substring(process.env.WEBPACK_PUBLIC_PATH.length).split('?')[0]) != null ? _req$url$substring$sp : '';
|
|
155
138
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
try {
|
|
159
|
-
const fileContent = (await readFile(assetPath)).toString();
|
|
160
|
-
res.contentType(filename);
|
|
161
|
-
res.send(fileContent);
|
|
162
|
-
} catch (e) {
|
|
163
|
-
res.status(404);
|
|
164
|
-
res.send(e);
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
wrappingApp.get(`${process.env.WEBPACK_PUBLIC_PATH}*`, assetRoute); // SERVER SIDE RENDERING
|
|
139
|
+
const clientManifest = clientStats.toJson(); // SERVER SIDE RENDERING
|
|
170
140
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
171
141
|
|
|
172
|
-
render =
|
|
173
|
-
wrappingApp.get('/*', handleErrors(async function (req, res) {
|
|
174
|
-
if (req.url.endsWith('favicon.ico')) {
|
|
175
|
-
res.statusCode = 404;
|
|
176
|
-
res.setHeader('Content-type', 'text/html');
|
|
177
|
-
res.send('not found');
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
res.socket.on('error', error => {
|
|
182
|
-
console.error('Fatal', error);
|
|
183
|
-
});
|
|
184
|
-
await render(clientManifest, req, res);
|
|
185
|
-
}));
|
|
186
|
-
server = wrappingApp.listen(PORT, () => {
|
|
187
|
-
loader.succeed(`SSR Running`);
|
|
188
|
-
}).on('error', function (error) {
|
|
189
|
-
if (error.syscall !== 'listen') {
|
|
190
|
-
throw error;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const isPipe = portOrPipe => Number.isNaN(portOrPipe);
|
|
194
|
-
|
|
195
|
-
const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
|
|
196
|
-
|
|
197
|
-
switch (error.code) {
|
|
198
|
-
case 'EACCES':
|
|
199
|
-
console.error(bind + ' requires elevated privileges');
|
|
200
|
-
process.exit(1);
|
|
201
|
-
break;
|
|
202
|
-
|
|
203
|
-
case 'EADDRINUSE':
|
|
204
|
-
console.error(bind + ' is already in use');
|
|
205
|
-
process.exit(1);
|
|
206
|
-
break;
|
|
207
|
-
|
|
208
|
-
default:
|
|
209
|
-
throw error;
|
|
210
|
-
}
|
|
211
|
-
});
|
|
142
|
+
render = (0, _importFresh.default)(getServerBundle(serverStats)).default.bind(undefined, clientManifest);
|
|
212
143
|
}
|
|
213
144
|
|
|
214
145
|
const devServer = new _webpackDevServer.default( // write to memory filesystem so we can import
|
|
@@ -225,6 +156,37 @@ const devServer = new _webpackDevServer.default( // write to memory filesystem s
|
|
|
225
156
|
outputFileSystem: { ...fs,
|
|
226
157
|
join: _path.default.join
|
|
227
158
|
}
|
|
159
|
+
},
|
|
160
|
+
setupMiddlewares: (middlewares, devServer) => {
|
|
161
|
+
var _devServer$app;
|
|
162
|
+
|
|
163
|
+
if (!devServer) {
|
|
164
|
+
throw new Error('webpack-dev-server is not defined');
|
|
165
|
+
} // serve SSR for non-WEBPACK_PUBLIC_PATH
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
(_devServer$app = devServer.app) === null || _devServer$app === void 0 ? void 0 : _devServer$app.get(new RegExp(`^(?!${process.env.WEBPACK_PUBLIC_PATH})`), handleErrors(async function (req, res) {
|
|
169
|
+
if (req.url.endsWith('favicon.ico')) {
|
|
170
|
+
res.statusCode = 404;
|
|
171
|
+
res.setHeader('Content-type', 'text/html');
|
|
172
|
+
res.send('not found');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
res.socket.on('error', error => {
|
|
177
|
+
console.error('Fatal', error);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
if (!render) {
|
|
181
|
+
res.statusCode = 500;
|
|
182
|
+
res.setHeader('Content-type', 'text/html');
|
|
183
|
+
res.send('Render not initialized');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
await render(req, res);
|
|
188
|
+
}));
|
|
189
|
+
return middlewares;
|
|
228
190
|
}
|
|
229
191
|
}, compiler);
|
|
230
192
|
|
|
@@ -232,38 +194,36 @@ const runServer = async () => {
|
|
|
232
194
|
await devServer.start();
|
|
233
195
|
devServer.compiler.hooks.done.tap('Anansi Server', multiStats => {
|
|
234
196
|
if (!multiStats) {
|
|
235
|
-
|
|
197
|
+
log.error('stats not send');
|
|
236
198
|
process.exit(-1);
|
|
237
199
|
}
|
|
238
200
|
|
|
239
201
|
if (!Object.hasOwn(multiStats, 'stats')) return;
|
|
240
202
|
|
|
241
|
-
if (
|
|
242
|
-
render = (0, _importFresh.default)(getServerBundle(multiStats.stats[1])).default;
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (!server) {
|
|
203
|
+
if (multiStats.stats.length > 1) {
|
|
247
204
|
try {
|
|
248
|
-
|
|
205
|
+
importRender(multiStats.stats);
|
|
249
206
|
} catch (e) {
|
|
250
|
-
|
|
207
|
+
log.error('Failed to load serve entrypoint');
|
|
251
208
|
console.error(e);
|
|
209
|
+
console.error(e.stack);
|
|
252
210
|
}
|
|
211
|
+
} else {
|
|
212
|
+
log.error('Only compiler one stat');
|
|
253
213
|
}
|
|
254
214
|
});
|
|
255
215
|
};
|
|
256
216
|
|
|
257
217
|
const stopServer = async () => {
|
|
258
|
-
|
|
218
|
+
log.info('Stopping server...');
|
|
259
219
|
await devServer.stop();
|
|
260
|
-
|
|
220
|
+
log.info('Server closed');
|
|
261
221
|
};
|
|
262
222
|
|
|
263
223
|
process.on('SIGINT', () => {
|
|
264
|
-
|
|
224
|
+
log.warn('Received SIGINT, devserver shutting down');
|
|
265
225
|
stopServer();
|
|
266
226
|
process.exit(-1);
|
|
267
227
|
});
|
|
268
228
|
runServer();
|
|
269
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3ZWJwYWNrQ29uZmlnIiwicmVxdWlyZSIsInJlc29sdmUiLCJwYXRoIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJlbnRyeXBvaW50IiwiYXJndiIsIlBPUlQiLCJlbnYiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJjaGFsayIsImdyZWVuQnJpZ2h0IiwiY3lhbkJyaWdodCIsIldFQlBBQ0tfUFVCTElDX0hPU1QiLCJsb2FkZXIiLCJvcmEiLCJzdGFydCIsInZvbHVtZSIsIlZvbHVtZSIsImZzIiwiY3JlYXRlRnNGcm9tVm9sdW1lIiwidWZzIiwidXNlIiwiZGlza0ZzIiwicGF0Y2hSZXF1aXJlIiwicmVhZEZpbGUiLCJwcm9taXNpZnkiLCJzZXJ2ZXIiLCJob3RFbnRyeSIsImVudHJ5UGF0aCIsImdlbmVyYXRlZEVudHJ5cG9pbnQiLCJ0bXAiLCJmaWxlU3luYyIsInBvc3RmaXgiLCJ3cml0ZVN5bmMiLCJmZCIsIndlYnBhY2tDb25maWdzIiwibmFtZSIsIm1vZGUiLCJyZXBsYWNlIiwidGFyZ2V0IiwicGx1Z2lucyIsInB1c2giLCJ3ZWJwYWNrIiwib3B0aW1pemUiLCJMaW1pdENodW5rQ291bnRQbHVnaW4iLCJtYXhDaHVua3MiLCJjb21waWxlciIsInNvdXJjZU1hcFN1cHBvcnQiLCJpbnN0YWxsIiwiaG9va1JlcXVpcmUiLCJnZXRTZXJ2ZXJCdW5kbGUiLCJzZXJ2ZXJTdGF0cyIsInNlcnZlckpzb24iLCJ0b0pzb24iLCJhc3NldHMiLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsInJlbmRlciIsImluaXRpYWxpemVBcHAiLCJzdGF0cyIsImNsaWVudFN0YXRzIiwiY29tcGlsYXRpb24iLCJlcnJvcnMiLCJsZW5ndGgiLCJmYWlsIiwiaW5mbyIsIndyYXBwaW5nQXBwIiwiZXhwcmVzcyIsImNvbXByZXNzIiwiY2xpZW50TWFuaWZlc3QiLCJhc3NldFJvdXRlIiwiZmlsZW5hbWUiLCJ1cmwiLCJzdWJzdHJpbmciLCJzcGxpdCIsImFzc2V0UGF0aCIsImZpbGVDb250ZW50IiwidG9TdHJpbmciLCJjb250ZW50VHlwZSIsInNlbmQiLCJlIiwic3RhdHVzIiwiZ2V0IiwiZGVmYXVsdCIsImVuZHNXaXRoIiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsInNvY2tldCIsIm9uIiwiZXJyb3IiLCJsaXN0ZW4iLCJzdWNjZWVkIiwic3lzY2FsbCIsImlzUGlwZSIsInBvcnRPclBpcGUiLCJOdW1iZXIiLCJpc05hTiIsImJpbmQiLCJjb2RlIiwiZGV2U2VydmVyIiwiV2VicGFja0RldlNlcnZlciIsImRldk1pZGRsZXdhcmUiLCJvdXRwdXRGaWxlU3lzdGVtIiwicnVuU2VydmVyIiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsIk9iamVjdCIsImhhc093biIsImltcG9ydEZyZXNoIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgd2VicGFjaywgeyBNdWx0aUNvbXBpbGVyIH0gZnJvbSAnd2VicGFjayc7XG5pbXBvcnQgeyBjcmVhdGVGc0Zyb21Wb2x1bWUsIFZvbHVtZSB9IGZyb20gJ21lbWZzJztcbmltcG9ydCB7IFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IGV4cHJlc3MsIHsgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgb3JhIGZyb20gJ29yYSc7XG5pbXBvcnQgeyBwYXRjaFJlcXVpcmUgfSBmcm9tICdmcy1tb25rZXknO1xuaW1wb3J0IHRtcCBmcm9tICd0bXAnO1xuaW1wb3J0IHNvdXJjZU1hcFN1cHBvcnQgZnJvbSAnc291cmNlLW1hcC1zdXBwb3J0JztcbmltcG9ydCB7IHVmcyB9IGZyb20gJ3VuaW9uZnMnO1xuaW1wb3J0IGNvbXByZXNzIGZyb20gJ2NvbXByZXNzaW9uJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5pbXBvcnQgaW1wb3J0RnJlc2ggZnJvbSAnaW1wb3J0LWZyZXNoJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvcG9seWZpbGwnO1xuaW1wb3J0IHsgUmVuZGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCB3ZWJwYWNrQ29uZmlnID0gcmVxdWlyZShyZXF1aXJlLnJlc29sdmUoXG4gIC8vIFRPRE86IHVzZSBub3JtYWwgcmVzb2x1dGlvbiBhbGdvcml0aG0gdG8gZmluZCB3ZWJwYWNrIGZpbGVcbiAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZycpLFxuKSk7XG5cbmNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5jb25zdCBQT1JUID0gcHJvY2Vzcy5lbnYuUE9SVCB8fCAzMDAwO1xuLy9wcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19IT1NUID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtQT1JUfWA7IHRoaXMgYnJlYWtzIGNvbXBhdGliaWxpdHkgd2l0aCBzdGFja2JsaXR6XG5wcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRIID0gJy9hc3NldHMvJztcblxuaWYgKCFlbnRyeXBvaW50KSB7XG4gIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gIHByb2Nlc3MuZXhpdCgtMSk7XG59XG5cbmNvbnNvbGUubG9nKFxuICBjaGFsay5ncmVlbkJyaWdodChgU3RhcnRpbmcgU1NSIGF0OmApLFxuICBjaGFsay5jeWFuQnJpZ2h0KHByb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX0hPU1QgfHwgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtQT1JUfWApLFxuKTtcbmNvbnN0IGxvYWRlciA9IG9yYSgpLnN0YXJ0KCk7XG5cbi8vIFNldCB1cCBpbiBtZW1vcnkgZmlsZXN5c3RlbVxuY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbnVmcy51c2UoZGlza0ZzKS51c2UoZnMgYXMgYW55KTtcblxucGF0Y2hSZXF1aXJlKHVmcyk7XG5jb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xubGV0IHNlcnZlcjogU2VydmVyIHwgdW5kZWZpbmVkO1xuXG4vLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG5mdW5jdGlvbiBob3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gIGNvbnN0IGdlbmVyYXRlZEVudHJ5cG9pbnQgPSB0bXAuZmlsZVN5bmMoeyBwb3N0Zml4OiAnLmpzJyB9KTtcbiAgZGlza0ZzLndyaXRlU3luYyhcbiAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgIGBcbmltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuaWYgKG1vZHVsZS5ob3QpIHtcbiAgbW9kdWxlLmhvdC5hY2NlcHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gIGAsXG4gICk7XG4gIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xufVxuXG5jb25zdCB3ZWJwYWNrQ29uZmlncyA9IFtcbiAgd2VicGFja0NvbmZpZyhcbiAgICB7XG4gICAgICBlbnRyeXBvaW50OiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgfSxcbiAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgKSxcbiAgd2VicGFja0NvbmZpZyhcbiAgICB7XG4gICAgICBlbnRyeXBvaW50OiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgIH0sXG4gICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnLCB0YXJnZXQ6ICdub2RlJyB9LFxuICApLFxuXSBhcyBjb25zdDtcbi8vIG9ubHkgaGF2ZSBvbmUgb3V0cHV0IGZvciBzZXJ2ZXIgc28gd2UgY2FuIGF2b2lkIGNhY2hlZCBtb2R1bGVzXG53ZWJwYWNrQ29uZmlnc1sxXS5wbHVnaW5zLnB1c2goXG4gIG5ldyB3ZWJwYWNrLm9wdGltaXplLkxpbWl0Q2h1bmtDb3VudFBsdWdpbih7IG1heENodW5rczogMSB9KSxcbik7XG4vLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG5jb25zdCBjb21waWxlcjogTXVsdGlDb21waWxlciA9IHdlYnBhY2sod2VicGFja0NvbmZpZ3MpO1xuXG5zb3VyY2VNYXBTdXBwb3J0Lmluc3RhbGwoeyBob29rUmVxdWlyZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gIHJldHVybiBwYXRoLmpvaW4oc2VydmVySnNvbi5vdXRwdXRQYXRoID8/ICcnLCAnbWFpbi5qcycpO1xufVxuZnVuY3Rpb24gaGFuZGxlRXJyb3JzPFxuICBGIGV4dGVuZHMgKFxuICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICkgPT4gUHJvbWlzZTx2b2lkPixcbj4oZm46IEYpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgIG5leHQ6IE5leHRGdW5jdGlvbixcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgfSBjYXRjaCAoeCkge1xuICAgICAgbmV4dCh4KTtcbiAgICB9XG4gIH07XG59XG5sZXQgcmVuZGVyOiBSZW5kZXI7XG4vLyBTdGFydCB0aGUgZXhwcmVzcyBzZXJ2ZXIgYWZ0ZXIgdGhlIGZpcnN0IGNvbXBpbGF0aW9uXG5mdW5jdGlvbiBpbml0aWFsaXplQXBwKHN0YXRzOiB3ZWJwYWNrLlN0YXRzW10pIHtcbiAgY29uc3QgW2NsaWVudFN0YXRzLCBzZXJ2ZXJTdGF0c10gPSBzdGF0cztcbiAgaWYgKFxuICAgIGNsaWVudFN0YXRzPy5jb21waWxhdGlvbj8uZXJyb3JzPy5sZW5ndGggfHxcbiAgICBzZXJ2ZXJTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoXG4gICkge1xuICAgIGxvYWRlci5mYWlsKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgbG9hZGVyLmZhaWwoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAvLyBUT0RPOiBoYW5kbGUgbW9yZSBncmFjZWZ1bGx5XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfSBlbHNlIHtcbiAgICBsb2FkZXIuaW5mbygnTGF1bmNoaW5nIHNlcnZlcicpO1xuICB9XG5cbiAgY29uc3Qgd3JhcHBpbmdBcHAgPSBleHByZXNzKCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAvL0B0cy1pZ25vcmVcbiAgd3JhcHBpbmdBcHAudXNlKGNvbXByZXNzKCkpO1xuXG4gIC8vIEFTU0VUU1xuICBjb25zdCBjbGllbnRNYW5pZmVzdCA9IGNsaWVudFN0YXRzLnRvSnNvbigpO1xuICBjb25zdCBhc3NldFJvdXRlID0gYXN5bmMgKHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSwgcmVzOiBhbnkpID0+IHtcbiAgICBjb25zdCBmaWxlbmFtZSA9XG4gICAgICByZXEudXJsXG4gICAgICAgID8uc3Vic3RyaW5nKChwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRIIGFzIHN0cmluZykubGVuZ3RoKVxuICAgICAgICAuc3BsaXQoJz8nKVswXSA/PyAnJztcbiAgICBjb25zdCBhc3NldFBhdGggPSBwYXRoLmpvaW4oY2xpZW50TWFuaWZlc3Qub3V0cHV0UGF0aCA/PyAnJywgZmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGFzc2V0UGF0aCkpLnRvU3RyaW5nKCk7XG4gICAgICByZXMuY29udGVudFR5cGUoZmlsZW5hbWUpO1xuICAgICAgcmVzLnNlbmQoZmlsZUNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KTtcbiAgICAgIHJlcy5zZW5kKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfTtcbiAgd3JhcHBpbmdBcHAuZ2V0KGAke3Byb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEh9KmAsIGFzc2V0Um91dGUpO1xuXG4gIC8vIFNFUlZFUiBTSURFIFJFTkRFUklOR1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICByZW5kZXIgPSByZXF1aXJlKGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cykpLmRlZmF1bHQ7XG4gIHdyYXBwaW5nQXBwLmdldChcbiAgICAnLyonLFxuICAgIGhhbmRsZUVycm9ycyhhc3luYyBmdW5jdGlvbiAocmVxOiBhbnksIHJlczogYW55KSB7XG4gICAgICBpZiAocmVxLnVybC5lbmRzV2l0aCgnZmF2aWNvbi5pY28nKSkge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICByZXMuc2VuZCgnbm90IGZvdW5kJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5zb2NrZXQub24oJ2Vycm9yJywgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhdGFsJywgZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHJlbmRlcihjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMpO1xuICAgIH0pLFxuICApO1xuXG4gIHNlcnZlciA9IHdyYXBwaW5nQXBwXG4gICAgLmxpc3RlbihQT1JULCAoKSA9PiB7XG4gICAgICBsb2FkZXIuc3VjY2VlZChgU1NSIFJ1bm5pbmdgKTtcbiAgICB9KVxuICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLnN5c2NhbGwgIT09ICdsaXN0ZW4nKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNQaXBlID0gKHBvcnRPclBpcGU6IHN0cmluZyB8IG51bWJlcikgPT4gTnVtYmVyLmlzTmFOKHBvcnRPclBpcGUpO1xuICAgICAgY29uc3QgYmluZCA9IGlzUGlwZShQT1JUKSA/ICdQaXBlICcgKyBQT1JUIDogJ1BvcnQgJyArIFBPUlQ7XG4gICAgICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICAgICAgY2FzZSAnRUFDQ0VTJzpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGJpbmQgKyAnIHJlcXVpcmVzIGVsZXZhdGVkIHByaXZpbGVnZXMnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0VBRERSSU5VU0UnOlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYmluZCArICcgaXMgYWxyZWFkeSBpbiB1c2UnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbmNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAvLyB3cml0ZSB0byBtZW1vcnkgZmlsZXN5c3RlbSBzbyB3ZSBjYW4gaW1wb3J0XG4gIHtcbiAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgLypjbGllbnQ6IHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uY2xpZW50LFxuICAgICAgd2ViU29ja2V0VVJMOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uY2xpZW50LndlYlNvY2tldFVSTCxcbiAgICAgICAgcG9ydDogODA4MCxcbiAgICAgIH0sXG4gICAgfSwqL1xuICAgIGRldk1pZGRsZXdhcmU6IHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICBvdXRwdXRGaWxlU3lzdGVtOiB7XG4gICAgICAgIC4uLmZzLFxuICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgfSBhcyBhbnkgYXMgdHlwZW9mIGZzLFxuICAgIH0sXG4gIH0sXG4gIGNvbXBpbGVyLFxuKTtcbmNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZGV2U2VydmVyLnN0YXJ0KCk7XG4gIGRldlNlcnZlci5jb21waWxlci5ob29rcy5kb25lLnRhcChcbiAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgKG11bHRpU3RhdHM6IHdlYnBhY2suTXVsdGlTdGF0cyB8IHdlYnBhY2suU3RhdHMpID0+IHtcbiAgICAgIGlmICghbXVsdGlTdGF0cykge1xuICAgICAgICBsb2FkZXIuZmFpbCgnc3RhdHMgbm90IHNlbmQnKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKG11bHRpU3RhdHMsICdzdGF0cycpKSByZXR1cm47XG4gICAgICBpZiAoc2VydmVyICYmIChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMubGVuZ3RoID4gMSkge1xuICAgICAgICByZW5kZXIgPSAoXG4gICAgICAgICAgaW1wb3J0RnJlc2goXG4gICAgICAgICAgICBnZXRTZXJ2ZXJCdW5kbGUoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0c1sxXSksXG4gICAgICAgICAgKSBhcyBhbnlcbiAgICAgICAgKS5kZWZhdWx0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGluaXRpYWxpemVBcHAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2FkZXIuZmFpbCgnRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICk7XG59O1xuY29uc3Qgc3RvcFNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgbG9hZGVyLmluZm8oJ1N0b3BwaW5nIHNlcnZlci4uLicpO1xuICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICBsb2FkZXIuaW5mbygnU2VydmVyIGNsb3NlZCcpO1xufTtcblxucHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICBsb2FkZXIud2FybignUmVjZWl2ZWQgU0lHSU5ULCBkZXZzZXJ2ZXIgc2h1dHRpbmcgZG93bicpO1xuICBzdG9wU2VydmVyKCk7XG4gIHByb2Nlc3MuZXhpdCgtMSk7XG59KTtcblxucnVuU2VydmVyKCk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOzs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7O0FBR0E7QUFDQSxNQUFNQSxhQUFhLEdBQUdDLE9BQU8sQ0FBQ0EsT0FBTyxDQUFDQyxPQUFSLEVBQzVCO0FBQ0FDLGFBQUEsQ0FBS0MsSUFBTCxDQUFVQyxPQUFPLENBQUNDLEdBQVIsRUFBVixFQUF5QixnQkFBekIsQ0FGNEIsQ0FBRCxDQUE3Qjs7QUFLQSxNQUFNQyxVQUFVLEdBQUdGLE9BQU8sQ0FBQ0csSUFBUixDQUFhLENBQWIsQ0FBbkI7QUFDQSxNQUFNQyxJQUFJLEdBQUdKLE9BQU8sQ0FBQ0ssR0FBUixDQUFZRCxJQUFaLElBQW9CLElBQWpDLEMsQ0FDQTs7QUFDQUosT0FBTyxDQUFDSyxHQUFSLENBQVlDLG1CQUFaLEdBQWtDLFVBQWxDOztBQUVBLElBQUksQ0FBQ0osVUFBTCxFQUFpQjtFQUNmSyxPQUFPLENBQUNDLEdBQVIsQ0FBYSx1Q0FBYjtFQUNBUixPQUFPLENBQUNTLElBQVIsQ0FBYSxDQUFDLENBQWQ7QUFDRDs7QUFFREYsT0FBTyxDQUFDQyxHQUFSLENBQ0VFLGNBQUEsQ0FBTUMsV0FBTixDQUFtQixrQkFBbkIsQ0FERixFQUVFRCxjQUFBLENBQU1FLFVBQU4sQ0FBaUJaLE9BQU8sQ0FBQ0ssR0FBUixDQUFZUSxtQkFBWixJQUFvQyxvQkFBbUJULElBQUssRUFBN0UsQ0FGRjtBQUlBLE1BQU1VLE1BQU0sR0FBRyxJQUFBQyxZQUFBLElBQU1DLEtBQU4sRUFBZixDLENBRUE7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHLElBQUlDLGFBQUosRUFBZjtBQUNBLE1BQU1DLEVBQUUsR0FBRyxJQUFBQyx5QkFBQSxFQUFtQkgsTUFBbkIsQ0FBWDs7QUFDQUksWUFBQSxDQUFJQyxHQUFKLENBQVFDLFdBQVIsRUFBZ0JELEdBQWhCLENBQW9CSCxFQUFwQjs7QUFFQSxJQUFBSyxzQkFBQSxFQUFhSCxZQUFiO0FBQ0EsTUFBTUksUUFBUSxHQUFHLElBQUFDLGVBQUEsRUFBVUwsWUFBQSxDQUFJSSxRQUFkLENBQWpCO0FBQ0EsSUFBSUUsTUFBSixDLENBRUE7O0FBQ0EsU0FBU0MsUUFBVCxDQUFrQkMsU0FBbEIsRUFBcUM7RUFDbkM7RUFDQTtFQUNBLE1BQU1DLG1CQUFtQixHQUFHQyxZQUFBLENBQUlDLFFBQUosQ0FBYTtJQUFFQyxPQUFPLEVBQUU7RUFBWCxDQUFiLENBQTVCOztFQUNBVixXQUFBLENBQU9XLFNBQVAsQ0FDRUosbUJBQW1CLENBQUNLLEVBRHRCLEVBRUc7QUFDTCxxQkFBcUJyQyxhQUFBLENBQUtELE9BQUwsQ0FBYUcsT0FBTyxDQUFDQyxHQUFSLEVBQWIsRUFBNEI0QixTQUE1QixDQUF1QztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQVZFOztFQVlBLE9BQU9DLG1CQUFQO0FBQ0Q7O0FBRUQsTUFBTU0sY0FBYyxHQUFHLENBQ3JCekMsYUFBYSxDQUNYO0VBQ0VPLFVBQVUsRUFBRTBCLFFBQVEsQ0FBQzFCLFVBQUQsQ0FBUixDQUFxQm1DLElBRG5DO0VBRUVBLElBQUksRUFBRTtBQUZSLENBRFcsRUFLWDtFQUFFQyxJQUFJLEVBQUU7QUFBUixDQUxXLENBRFEsRUFRckIzQyxhQUFhLENBQ1g7RUFDRU8sVUFBVSxFQUFFQSxVQUFVLENBQUNxQyxPQUFYLENBQW1CLE1BQW5CLEVBQTJCLGFBQTNCLENBRGQ7RUFFRUYsSUFBSSxFQUFFO0FBRlIsQ0FEVyxFQUtYO0VBQUVDLElBQUksRUFBRSxhQUFSO0VBQXVCRSxNQUFNLEVBQUU7QUFBL0IsQ0FMVyxDQVJRLENBQXZCLEMsQ0FnQkE7O0FBQ0FKLGNBQWMsQ0FBQyxDQUFELENBQWQsQ0FBa0JLLE9BQWxCLENBQTBCQyxJQUExQixDQUNFLElBQUlDLGdCQUFBLENBQVFDLFFBQVIsQ0FBaUJDLHFCQUFyQixDQUEyQztFQUFFQyxTQUFTLEVBQUU7QUFBYixDQUEzQyxDQURGLEUsQ0FHQTs7QUFDQSxNQUFNQyxRQUF1QixHQUFHLElBQUFKLGdCQUFBLEVBQVFQLGNBQVIsQ0FBaEM7O0FBRUFZLHlCQUFBLENBQWlCQyxPQUFqQixDQUF5QjtFQUFFQyxXQUFXLEVBQUU7QUFBZixDQUF6Qjs7QUFFQSxTQUFTQyxlQUFULENBQXlCQyxXQUF6QixFQUFxRDtFQUFBOztFQUNuRCxNQUFNQyxVQUFVLEdBQUdELFdBQVcsQ0FBQ0UsTUFBWixDQUFtQjtJQUFFQyxNQUFNLEVBQUU7RUFBVixDQUFuQixDQUFuQjtFQUNBLE9BQU96RCxhQUFBLENBQUtDLElBQUwsMEJBQVVzRCxVQUFVLENBQUNHLFVBQXJCLG9DQUFtQyxFQUFuQyxFQUF1QyxTQUF2QyxDQUFQO0FBQ0Q7O0FBQ0QsU0FBU0MsWUFBVCxDQUtFQyxFQUxGLEVBS1M7RUFDUCxPQUFPLGdCQUNMQyxHQURLLEVBRUxDLEdBRkssRUFHTEMsSUFISyxFQUlMO0lBQ0EsSUFBSTtNQUNGLE9BQU8sTUFBTUgsRUFBRSxDQUFDQyxHQUFELEVBQU1DLEdBQU4sQ0FBZjtJQUNELENBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7TUFDVkQsSUFBSSxDQUFDQyxDQUFELENBQUo7SUFDRDtFQUNGLENBVkQ7QUFXRDs7QUFDRCxJQUFJQyxNQUFKLEMsQ0FDQTs7QUFDQSxTQUFTQyxhQUFULENBQXVCQyxLQUF2QixFQUErQztFQUFBOztFQUM3QyxNQUFNLENBQUNDLFdBQUQsRUFBY2QsV0FBZCxJQUE2QmEsS0FBbkM7O0VBQ0EsSUFDRUMsV0FBVyxTQUFYLElBQUFBLFdBQVcsV0FBWCw2QkFBQUEsV0FBVyxDQUFFQyxXQUFiLGtHQUEwQkMsTUFBMUIsMEVBQWtDQyxNQUFsQyxJQUNBakIsV0FEQSxhQUNBQSxXQURBLHdDQUNBQSxXQUFXLENBQUVlLFdBRGIsNEVBQ0Esc0JBQTBCQyxNQUQxQixtREFDQSx1QkFBa0NDLE1BRnBDLEVBR0U7SUFDQXZELE1BQU0sQ0FBQ3dELElBQVAsQ0FBWSw4QkFBOEJKLFdBQVcsQ0FBQ0MsV0FBWixDQUF3QkMsTUFBbEU7SUFDQXRELE1BQU0sQ0FBQ3dELElBQVAsQ0FBWSw4QkFBOEJsQixXQUFXLENBQUNlLFdBQVosQ0FBd0JDLE1BQWxFLEVBRkEsQ0FHQTs7SUFDQXBFLE9BQU8sQ0FBQ1MsSUFBUixDQUFhLENBQUMsQ0FBZDtFQUNELENBUkQsTUFRTztJQUNMSyxNQUFNLENBQUN5RCxJQUFQLENBQVksa0JBQVo7RUFDRDs7RUFFRCxNQUFNQyxXQUFXLEdBQUcsSUFBQUMsZ0JBQUEsR0FBcEIsQ0FkNkMsQ0FlN0M7RUFDQTs7RUFDQUQsV0FBVyxDQUFDbEQsR0FBWixDQUFnQixJQUFBb0Qsb0JBQUEsR0FBaEIsRUFqQjZDLENBbUI3Qzs7RUFDQSxNQUFNQyxjQUFjLEdBQUdULFdBQVcsQ0FBQ1osTUFBWixFQUF2Qjs7RUFDQSxNQUFNc0IsVUFBVSxHQUFHLE9BQU9qQixHQUFQLEVBQXVDQyxHQUF2QyxLQUFvRDtJQUFBOztJQUNyRSxNQUFNaUIsUUFBUSx3Q0FDWmxCLEdBQUcsQ0FBQ21CLEdBRFEsNkNBQ1osU0FDSUMsU0FESixDQUNlL0UsT0FBTyxDQUFDSyxHQUFSLENBQVlDLG1CQUFiLENBQTRDK0QsTUFEMUQsRUFFR1csS0FGSCxDQUVTLEdBRlQsRUFFYyxDQUZkLENBRFksb0NBR1EsRUFIdEI7O0lBSUEsTUFBTUMsU0FBUyxHQUFHbkYsYUFBQSxDQUFLQyxJQUFMLDBCQUFVNEUsY0FBYyxDQUFDbkIsVUFBekIsb0NBQXVDLEVBQXZDLEVBQTJDcUIsUUFBM0MsQ0FBbEI7O0lBRUEsSUFBSTtNQUNGLE1BQU1LLFdBQVcsR0FBRyxDQUFDLE1BQU16RCxRQUFRLENBQUN3RCxTQUFELENBQWYsRUFBNEJFLFFBQTVCLEVBQXBCO01BQ0F2QixHQUFHLENBQUN3QixXQUFKLENBQWdCUCxRQUFoQjtNQUNBakIsR0FBRyxDQUFDeUIsSUFBSixDQUFTSCxXQUFUO0lBQ0QsQ0FKRCxDQUlFLE9BQU9JLENBQVAsRUFBVTtNQUNWMUIsR0FBRyxDQUFDMkIsTUFBSixDQUFXLEdBQVg7TUFDQTNCLEdBQUcsQ0FBQ3lCLElBQUosQ0FBU0MsQ0FBVDtNQUNBO0lBQ0Q7RUFDRixDQWhCRDs7RUFpQkFkLFdBQVcsQ0FBQ2dCLEdBQVosQ0FBaUIsR0FBRXhGLE9BQU8sQ0FBQ0ssR0FBUixDQUFZQyxtQkFBb0IsR0FBbkQsRUFBdURzRSxVQUF2RCxFQXRDNkMsQ0F3QzdDO0VBQ0E7O0VBQ0FiLE1BQU0sR0FBR25FLE9BQU8sQ0FBQ3VELGVBQWUsQ0FBQ0MsV0FBRCxDQUFoQixDQUFQLENBQXNDcUMsT0FBL0M7RUFDQWpCLFdBQVcsQ0FBQ2dCLEdBQVosQ0FDRSxJQURGLEVBRUUvQixZQUFZLENBQUMsZ0JBQWdCRSxHQUFoQixFQUEwQkMsR0FBMUIsRUFBb0M7SUFDL0MsSUFBSUQsR0FBRyxDQUFDbUIsR0FBSixDQUFRWSxRQUFSLENBQWlCLGFBQWpCLENBQUosRUFBcUM7TUFDbkM5QixHQUFHLENBQUMrQixVQUFKLEdBQWlCLEdBQWpCO01BQ0EvQixHQUFHLENBQUNnQyxTQUFKLENBQWMsY0FBZCxFQUE4QixXQUE5QjtNQUNBaEMsR0FBRyxDQUFDeUIsSUFBSixDQUFTLFdBQVQ7TUFDQTtJQUNEOztJQUNEekIsR0FBRyxDQUFDaUMsTUFBSixDQUFXQyxFQUFYLENBQWMsT0FBZCxFQUF3QkMsS0FBRCxJQUFvQjtNQUN6Q3hGLE9BQU8sQ0FBQ3dGLEtBQVIsQ0FBYyxPQUFkLEVBQXVCQSxLQUF2QjtJQUNELENBRkQ7SUFJQSxNQUFNaEMsTUFBTSxDQUFDWSxjQUFELEVBQWlCaEIsR0FBakIsRUFBc0JDLEdBQXRCLENBQVo7RUFDRCxDQVpXLENBRmQ7RUFpQkFqQyxNQUFNLEdBQUc2QyxXQUFXLENBQ2pCd0IsTUFETSxDQUNDNUYsSUFERCxFQUNPLE1BQU07SUFDbEJVLE1BQU0sQ0FBQ21GLE9BQVAsQ0FBZ0IsYUFBaEI7RUFDRCxDQUhNLEVBSU5ILEVBSk0sQ0FJSCxPQUpHLEVBSU0sVUFBVUMsS0FBVixFQUFzQjtJQUNqQyxJQUFJQSxLQUFLLENBQUNHLE9BQU4sS0FBa0IsUUFBdEIsRUFBZ0M7TUFDOUIsTUFBTUgsS0FBTjtJQUNEOztJQUNELE1BQU1JLE1BQU0sR0FBSUMsVUFBRCxJQUFpQ0MsTUFBTSxDQUFDQyxLQUFQLENBQWFGLFVBQWIsQ0FBaEQ7O0lBQ0EsTUFBTUcsSUFBSSxHQUFHSixNQUFNLENBQUMvRixJQUFELENBQU4sR0FBZSxVQUFVQSxJQUF6QixHQUFnQyxVQUFVQSxJQUF2RDs7SUFDQSxRQUFRMkYsS0FBSyxDQUFDUyxJQUFkO01BQ0UsS0FBSyxRQUFMO1FBQ0VqRyxPQUFPLENBQUN3RixLQUFSLENBQWNRLElBQUksR0FBRywrQkFBckI7UUFDQXZHLE9BQU8sQ0FBQ1MsSUFBUixDQUFhLENBQWI7UUFDQTs7TUFDRixLQUFLLFlBQUw7UUFDRUYsT0FBTyxDQUFDd0YsS0FBUixDQUFjUSxJQUFJLEdBQUcsb0JBQXJCO1FBQ0F2RyxPQUFPLENBQUNTLElBQVIsQ0FBYSxDQUFiO1FBQ0E7O01BQ0Y7UUFDRSxNQUFNc0YsS0FBTjtJQVZKO0VBWUQsQ0F0Qk0sQ0FBVDtBQXVCRDs7QUFFRCxNQUFNVSxTQUFTLEdBQUcsSUFBSUMseUJBQUosRUFDaEI7QUFDQSxFQUNFLEdBQUd0RSxjQUFjLENBQUMsQ0FBRCxDQUFkLENBQWtCcUUsU0FEdkI7O0VBRUU7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSUUsYUFBYSxFQUFFLEVBQ2Isd0JBQUd2RSxjQUFjLENBQUMsQ0FBRCxDQUFqQiw4RUFBRyxpQkFBbUJxRSxTQUF0QiwwREFBRyxzQkFBOEJFLGFBQWpDLENBRGE7SUFFYkMsZ0JBQWdCLEVBQUUsRUFDaEIsR0FBR3pGLEVBRGE7TUFFaEJwQixJQUFJLEVBQUVELGFBQUEsQ0FBS0M7SUFGSztFQUZMO0FBVGpCLENBRmdCLEVBbUJoQmdELFFBbkJnQixDQUFsQjs7QUFxQkEsTUFBTThELFNBQVMsR0FBRyxZQUFZO0VBQzVCLE1BQU1KLFNBQVMsQ0FBQ3pGLEtBQVYsRUFBTjtFQUNBeUYsU0FBUyxDQUFDMUQsUUFBVixDQUFtQitELEtBQW5CLENBQXlCQyxJQUF6QixDQUE4QkMsR0FBOUIsQ0FDRSxlQURGLEVBRUdDLFVBQUQsSUFBb0Q7SUFDbEQsSUFBSSxDQUFDQSxVQUFMLEVBQWlCO01BQ2ZuRyxNQUFNLENBQUN3RCxJQUFQLENBQVksZ0JBQVo7TUFDQXRFLE9BQU8sQ0FBQ1MsSUFBUixDQUFhLENBQUMsQ0FBZDtJQUNEOztJQUVELElBQUksQ0FBQ3lHLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjRixVQUFkLEVBQTBCLE9BQTFCLENBQUwsRUFBeUM7O0lBQ3pDLElBQUl0RixNQUFNLElBQUtzRixVQUFELENBQW1DaEQsS0FBbkMsQ0FBeUNJLE1BQXpDLEdBQWtELENBQWhFLEVBQW1FO01BQ2pFTixNQUFNLEdBQ0osSUFBQXFELG9CQUFBLEVBQ0VqRSxlQUFlLENBQUU4RCxVQUFELENBQW1DaEQsS0FBbkMsQ0FBeUMsQ0FBekMsQ0FBRCxDQURqQixDQURPLENBSVB3QixPQUpGO01BS0E7SUFDRDs7SUFDRCxJQUFJLENBQUM5RCxNQUFMLEVBQWE7TUFDWCxJQUFJO1FBQ0ZxQyxhQUFhLENBQUVpRCxVQUFELENBQW1DaEQsS0FBcEMsQ0FBYjtNQUNELENBRkQsQ0FFRSxPQUFPcUIsQ0FBUCxFQUFVO1FBQ1Z4RSxNQUFNLENBQUN3RCxJQUFQLENBQVksMEJBQVo7UUFDQS9ELE9BQU8sQ0FBQ3dGLEtBQVIsQ0FBY1QsQ0FBZDtNQUNEO0lBQ0Y7RUFDRixDQXpCSDtBQTJCRCxDQTdCRDs7QUE4QkEsTUFBTStCLFVBQVUsR0FBRyxZQUFZO0VBQzdCdkcsTUFBTSxDQUFDeUQsSUFBUCxDQUFZLG9CQUFaO0VBQ0EsTUFBTWtDLFNBQVMsQ0FBQ2EsSUFBVixFQUFOO0VBQ0F4RyxNQUFNLENBQUN5RCxJQUFQLENBQVksZUFBWjtBQUNELENBSkQ7O0FBTUF2RSxPQUFPLENBQUM4RixFQUFSLENBQVcsUUFBWCxFQUFxQixNQUFNO0VBQ3pCaEYsTUFBTSxDQUFDeUcsSUFBUCxDQUFZLDBDQUFaO0VBQ0FGLFVBQVU7RUFDVnJILE9BQU8sQ0FBQ1MsSUFBUixDQUFhLENBQUMsQ0FBZDtBQUNELENBSkQ7QUFNQW9HLFNBQVMifQ==
|
|
229
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3ZWJwYWNrQ29uZmlnIiwicmVxdWlyZSIsInJlc29sdmUiLCJwYXRoIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJlbnRyeXBvaW50IiwiYXJndiIsImVudiIsIldFQlBBQ0tfUFVCTElDX1BBVEgiLCJjb25zb2xlIiwibG9nIiwiZXhpdCIsImxvZ2dpbmciLCJnZXRMb2dnZXIiLCJ2b2x1bWUiLCJWb2x1bWUiLCJmcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsInVmcyIsInVzZSIsImRpc2tGcyIsInBhdGNoUmVxdWlyZSIsInJlYWRGaWxlIiwicHJvbWlzaWZ5Iiwic2VydmVyIiwiaG90RW50cnkiLCJlbnRyeVBhdGgiLCJnZW5lcmF0ZWRFbnRyeXBvaW50IiwidG1wIiwiZmlsZVN5bmMiLCJwb3N0Zml4Iiwid3JpdGVTeW5jIiwiZmQiLCJ3ZWJwYWNrQ29uZmlncyIsImVudHJ5cGF0aCIsIm5hbWUiLCJtb2RlIiwicmVwbGFjZSIsIkJST1dTRVJTTElTVF9FTlYiLCJ0YXJnZXQiLCJwbHVnaW5zIiwicHVzaCIsIndlYnBhY2siLCJvcHRpbWl6ZSIsIkxpbWl0Q2h1bmtDb3VudFBsdWdpbiIsIm1heENodW5rcyIsImNvbXBpbGVyIiwic291cmNlTWFwU3VwcG9ydCIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsIm91dHB1dFBhdGgiLCJoYW5kbGVFcnJvcnMiLCJmbiIsInJlcSIsInJlcyIsIm5leHQiLCJ4IiwicmVuZGVyIiwiaW1wb3J0UmVuZGVyIiwic3RhdHMiLCJjbGllbnRTdGF0cyIsImNvbXBpbGF0aW9uIiwiZXJyb3JzIiwibGVuZ3RoIiwiZXJyb3IiLCJpbmZvIiwiY2xpZW50TWFuaWZlc3QiLCJpbXBvcnRGcmVzaCIsImRlZmF1bHQiLCJiaW5kIiwidW5kZWZpbmVkIiwiZGV2U2VydmVyIiwiV2VicGFja0RldlNlcnZlciIsImRldk1pZGRsZXdhcmUiLCJvdXRwdXRGaWxlU3lzdGVtIiwic2V0dXBNaWRkbGV3YXJlcyIsIm1pZGRsZXdhcmVzIiwiRXJyb3IiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJ1cmwiLCJlbmRzV2l0aCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJzZW5kIiwic29ja2V0Iiwib24iLCJydW5TZXJ2ZXIiLCJzdGFydCIsImhvb2tzIiwiZG9uZSIsInRhcCIsIm11bHRpU3RhdHMiLCJPYmplY3QiLCJoYXNPd24iLCJlIiwic3RhY2siLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB3ZWJwYWNrLCB7IE11bHRpQ29tcGlsZXIgfSBmcm9tICd3ZWJwYWNrJztcbmltcG9ydCB7IGNyZWF0ZUZzRnJvbVZvbHVtZSwgVm9sdW1lIH0gZnJvbSAnbWVtZnMnO1xuaW1wb3J0IHsgU2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgcGF0Y2hSZXF1aXJlIH0gZnJvbSAnZnMtbW9ua2V5JztcbmltcG9ydCB0bXAgZnJvbSAndG1wJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5pbXBvcnQgaW1wb3J0RnJlc2ggZnJvbSAnaW1wb3J0LWZyZXNoJztcbmltcG9ydCBsb2dnaW5nIGZyb20gJ3dlYnBhY2svbGliL2xvZ2dpbmcvcnVudGltZSc7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvcG9seWZpbGwnO1xuaW1wb3J0IHsgQm91bmRSZW5kZXIgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbmNvbnN0IHdlYnBhY2tDb25maWcgPSByZXF1aXJlKHJlcXVpcmUucmVzb2x2ZShcbiAgLy8gVE9ETzogdXNlIG5vcm1hbCByZXNvbHV0aW9uIGFsZ29yaXRobSB0byBmaW5kIHdlYnBhY2sgZmlsZVxuICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnJyksXG4pKTtcblxuY29uc3QgZW50cnlwb2ludCA9IHByb2Nlc3MuYXJndlsyXTtcbi8vcHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfSE9TVCA9IGBodHRwOi8vbG9jYWxob3N0OiR7UE9SVH1gOyB0aGlzIGJyZWFrcyBjb21wYXRpYmlsaXR5IHdpdGggc3RhY2tibGl0elxucHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCA9ICcvYXNzZXRzLyc7XG5cbmlmICghZW50cnlwb2ludCkge1xuICBjb25zb2xlLmxvZyhgVXNhZ2U6IHN0YXJ0LWFuYW5zaSA8ZW50cnlwb2ludC1maWxlPmApO1xuICBwcm9jZXNzLmV4aXQoLTEpO1xufVxuXG5jb25zdCBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcignYW5hbnNpLWRldnNlcnZlcicpO1xuXG4vLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbmNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbmNvbnN0IGZzID0gY3JlYXRlRnNGcm9tVm9sdW1lKHZvbHVtZSk7XG51ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbnBhdGNoUmVxdWlyZSh1ZnMpO1xuY29uc3QgcmVhZEZpbGUgPSBwcm9taXNpZnkodWZzLnJlYWRGaWxlKTtcbmxldCBzZXJ2ZXI6IFNlcnZlciB8IHVuZGVmaW5lZDtcblxuLy8gR2VuZXJhdGUgYSB0ZW1wb3JhcnkgZmlsZSBzbyB3ZSBjYW4gaG90IHJlbG9hZCBmcm9tIHRoZSByb290IG9mIHRoZSBhcHBsaWNhdGlvblxuZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIC8vIEB0cy1pZ25vcmUgZm9yIHNvbWUgcmVhc29uIGl0J3Mgbm90IHBpY2tpbmcgdXAgdGhhdCBvdGhlciBvcHRpb25zIGFyZSBvcHRpb25hbFxuICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgZ2VuZXJhdGVkRW50cnlwb2ludC5mZCxcbiAgICBgXG5pbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbmlmIChtb2R1bGUuaG90KSB7XG4gIG1vZHVsZS5ob3QuYWNjZXB0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVudHJ5O1xuICBgLFxuICApO1xuICByZXR1cm4gZ2VuZXJhdGVkRW50cnlwb2ludDtcbn1cblxuY29uc3Qgd2VicGFja0NvbmZpZ3MgPSBbXG4gIHdlYnBhY2tDb25maWcoXG4gICAge1xuICAgICAgZW50cnlwYXRoOiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgfSxcbiAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgKSxcbiAgd2VicGFja0NvbmZpZyhcbiAgICB7XG4gICAgICBlbnRyeXBhdGg6IGVudHJ5cG9pbnQucmVwbGFjZSgnLnRzeCcsICcuc2VydmVyLnRzeCcpLFxuICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICB9LFxuICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgKSxcbl0gYXMgY29uc3Q7XG4vLyBvbmx5IGhhdmUgb25lIG91dHB1dCBmb3Igc2VydmVyIHNvIHdlIGNhbiBhdm9pZCBjYWNoZWQgbW9kdWxlc1xud2VicGFja0NvbmZpZ3NbMV0ucGx1Z2lucy5wdXNoKFxuICBuZXcgd2VicGFjay5vcHRpbWl6ZS5MaW1pdENodW5rQ291bnRQbHVnaW4oeyBtYXhDaHVua3M6IDEgfSksXG4pO1xuLy8gaW5pdGlhbGl6ZSB0aGUgd2VicGFjayBjb21waWxlclxuY29uc3QgY29tcGlsZXI6IE11bHRpQ29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzKTtcblxuc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICBjb25zdCBzZXJ2ZXJKc29uID0gc2VydmVyU3RhdHMudG9Kc29uKHsgYXNzZXRzOiB0cnVlIH0pO1xuICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ3NlcnZlci5qcycpO1xufVxuZnVuY3Rpb24gaGFuZGxlRXJyb3JzPFxuICBGIGV4dGVuZHMgKFxuICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICkgPT4gUHJvbWlzZTx2b2lkPixcbj4oZm46IEYpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgIG5leHQ6IE5leHRGdW5jdGlvbixcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgfSBjYXRjaCAoeCkge1xuICAgICAgbmV4dCh4KTtcbiAgICB9XG4gIH07XG59XG5sZXQgcmVuZGVyOiBCb3VuZFJlbmRlcjtcbmZ1bmN0aW9uIGltcG9ydFJlbmRlcihzdGF0czogd2VicGFjay5TdGF0c1tdKSB7XG4gIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gIGlmIChcbiAgICBjbGllbnRTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoIHx8XG4gICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICApIHtcbiAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3IgY2xpZW50IGJ1aWxkOiAnICsgY2xpZW50U3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAvLyBUT0RPOiBoYW5kbGUgbW9yZSBncmFjZWZ1bGx5XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfSBlbHNlIHtcbiAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICB9XG5cbiAgLy8gQVNTRVRTXG4gIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgLy8gU0VSVkVSIFNJREUgUkVOREVSSU5HXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gIHJlbmRlciA9IChpbXBvcnRGcmVzaChnZXRTZXJ2ZXJCdW5kbGUoc2VydmVyU3RhdHMpKSBhcyBhbnkpLmRlZmF1bHQuYmluZChcbiAgICB1bmRlZmluZWQsXG4gICAgY2xpZW50TWFuaWZlc3QsXG4gICk7XG59XG5cbmNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAvLyB3cml0ZSB0byBtZW1vcnkgZmlsZXN5c3RlbSBzbyB3ZSBjYW4gaW1wb3J0XG4gIHtcbiAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgLypjbGllbnQ6IHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uY2xpZW50LFxuICAgICAgd2ViU29ja2V0VVJMOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uY2xpZW50LndlYlNvY2tldFVSTCxcbiAgICAgICAgcG9ydDogODA4MCxcbiAgICAgIH0sXG4gICAgfSwqL1xuICAgIGRldk1pZGRsZXdhcmU6IHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICBvdXRwdXRGaWxlU3lzdGVtOiB7XG4gICAgICAgIC4uLmZzLFxuICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgfSBhcyBhbnkgYXMgdHlwZW9mIGZzLFxuICAgIH0sXG4gICAgc2V0dXBNaWRkbGV3YXJlczogKG1pZGRsZXdhcmVzLCBkZXZTZXJ2ZXIpID0+IHtcbiAgICAgIGlmICghZGV2U2VydmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNlcnZlIFNTUiBmb3Igbm9uLVdFQlBBQ0tfUFVCTElDX1BBVEhcbiAgICAgIGRldlNlcnZlci5hcHA/LmdldChcbiAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7cHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSH0pYCksXG4gICAgICAgIGhhbmRsZUVycm9ycyhhc3luYyBmdW5jdGlvbiAocmVxOiBhbnksIHJlczogYW55KSB7XG4gICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmF0YWwnLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXJlbmRlcikge1xuICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICByZXMuc2VuZCgnUmVuZGVyIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCByZW5kZXIocmVxLCByZXMpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBtaWRkbGV3YXJlcztcbiAgICB9LFxuICB9LFxuICBjb21waWxlcixcbik7XG5jb25zdCBydW5TZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gIGF3YWl0IGRldlNlcnZlci5zdGFydCgpO1xuICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgJ0FuYW5zaSBTZXJ2ZXInLFxuICAgIChtdWx0aVN0YXRzOiB3ZWJwYWNrLk11bHRpU3RhdHMgfCB3ZWJwYWNrLlN0YXRzKSA9PiB7XG4gICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgbG9nLmVycm9yKCdzdGF0cyBub3Qgc2VuZCcpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24obXVsdGlTdGF0cywgJ3N0YXRzJykpIHJldHVybjtcbiAgICAgIGlmICgobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbXBvcnRSZW5kZXIoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmVycm9yKCdPbmx5IGNvbXBpbGVyIG9uZSBzdGF0Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcbn07XG5jb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICBsb2cuaW5mbygnU3RvcHBpbmcgc2VydmVyLi4uJyk7XG4gIGF3YWl0IGRldlNlcnZlci5zdG9wKCk7XG4gIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG59O1xuXG5wcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gIHN0b3BTZXJ2ZXIoKTtcbiAgcHJvY2Vzcy5leGl0KC0xKTtcbn0pO1xuXG5ydW5TZXJ2ZXIoKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7QUFHQTtBQUNBLE1BQU1BLGFBQWEsR0FBR0MsT0FBTyxDQUFDQSxPQUFPLENBQUNDLE9BQVIsRUFDNUI7QUFDQUMsYUFBQSxDQUFLQyxJQUFMLENBQVVDLE9BQU8sQ0FBQ0MsR0FBUixFQUFWLEVBQXlCLGdCQUF6QixDQUY0QixDQUFE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
|
package/lib/scripts/types.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ import { ServerResponse, IncomingMessage } from 'http';
|
|
|
3
3
|
import { StatsCompilation } from 'webpack';
|
|
4
4
|
import { Request, Response } from 'express';
|
|
5
5
|
export declare type Render = (clientManifest: StatsCompilation, req: Request | IncomingMessage, res: Response | ServerResponse) => Promise<void>;
|
|
6
|
+
export declare type BoundRender = (req: Request | IncomingMessage, res: Response | ServerResponse) => Promise<void>;
|
|
6
7
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +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"}
|
|
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;AAEnB,oBAAY,WAAW,GAAG,CACxB,GAAG,EAAE,OAAO,GAAG,eAAe,EAC9B,GAAG,EAAE,QAAQ,GAAG,cAAc,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/lib/scripts/types.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VydmVyUmVzcG9uc2UsIEluY29taW5nTWVzc2FnZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgU3RhdHNDb21waWxhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcblxuZXhwb3J0IHR5cGUgUmVuZGVyID0gKFxuICBjbGllbnRNYW5pZmVzdDogU3RhdHNDb21waWxhdGlvbixcbiAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4pID0+
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VydmVyUmVzcG9uc2UsIEluY29taW5nTWVzc2FnZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgU3RhdHNDb21waWxhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcblxuZXhwb3J0IHR5cGUgUmVuZGVyID0gKFxuICBjbGllbnRNYW5pZmVzdDogU3RhdHNDb21waWxhdGlvbixcbiAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4pID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCB0eXBlIEJvdW5kUmVuZGVyID0gKFxuICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbikgPT4gUHJvbWlzZTx2b2lkPjtcbiJdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.server.d.ts","sourceRoot":"","sources":["../../src/spouts/document.server.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"document.server.d.ts","sourceRoot":"","sources":["../../src/spouts/document.server.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGzD,aAAK,WAAW,GAAG;IACjB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,YAAY,CAAC;AAEjB,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,EAAE;IAC7C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,yCAEiB,WAAW,4BAEJ,WAAW;;GAkEnC"}
|
|
@@ -12,22 +12,33 @@ var _DocumentComponent = _interopRequireDefault(require("./DocumentComponent"));
|
|
|
12
12
|
function DocumentSpout(options) {
|
|
13
13
|
return function (next) {
|
|
14
14
|
return async props => {
|
|
15
|
-
var _props$clientManifest, _props$clientManifest2,
|
|
15
|
+
var _props$clientManifest, _props$clientManifest2, _props$clientManifest3, _props$clientManifest4, _props$clientManifest5, _nextProps$title;
|
|
16
16
|
|
|
17
17
|
const nextProps = await next(props);
|
|
18
|
-
const entrypoint = (_props$clientManifest = props.clientManifest) === null || _props$clientManifest === void 0 ? void 0 : (_props$clientManifest2 = _props$clientManifest.entrypoints) === null || _props$clientManifest2 === void 0 ? void 0 : _props$clientManifest2.main;
|
|
19
18
|
const publicPath = props.clientManifest.publicPath;
|
|
20
|
-
if (
|
|
19
|
+
if (Object.keys((_props$clientManifest = (_props$clientManifest2 = props.clientManifest) === null || _props$clientManifest2 === void 0 ? void 0 : _props$clientManifest2.entrypoints) != null ? _props$clientManifest : {}).length < 1 || publicPath === undefined) throw new Error('Manifest missing entries needed'); // TODO: consider using this package for build stats in future:
|
|
21
20
|
// https://github.com/facebook/react/tree/main/packages/react-server-dom-webpack
|
|
22
21
|
|
|
23
22
|
const assetMap = assets => assets.map(({
|
|
24
23
|
name
|
|
25
|
-
}) => `${publicPath}${name}`);
|
|
24
|
+
}) => `${publicPath}${name}`);
|
|
26
25
|
|
|
26
|
+
const assetList = [];
|
|
27
|
+
Object.values((_props$clientManifest3 = (_props$clientManifest4 = props.clientManifest) === null || _props$clientManifest4 === void 0 ? void 0 : _props$clientManifest4.entrypoints) != null ? _props$clientManifest3 : {}).forEach(entrypoint => {
|
|
28
|
+
var _entrypoint$assets;
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
assetList.push(...assetMap((_entrypoint$assets = entrypoint.assets) != null ? _entrypoint$assets : []));
|
|
31
|
+
});
|
|
32
|
+
new Set(assetMap(Object.values((_props$clientManifest5 = props.clientManifest.namedChunkGroups) != null ? _props$clientManifest5 : {}).filter(({
|
|
29
33
|
name
|
|
30
|
-
}) => nextProps.matchedRoutes.some(route => name ===
|
|
34
|
+
}) => nextProps.matchedRoutes.some(route => name === null || name === void 0 ? void 0 : name.includes(route.name))).flatMap(chunk => {
|
|
35
|
+
var _chunk$assets;
|
|
36
|
+
|
|
37
|
+
return [...((_chunk$assets = chunk.assets) != null ? _chunk$assets : []), // any chunk preloads
|
|
38
|
+
...childrenAssets(chunk)];
|
|
39
|
+
}))).forEach(asset => assetList.push(asset)); // find additional assets to preload based on matched route
|
|
40
|
+
|
|
41
|
+
const assets = assetList.filter(asset => !asset.endsWith('.hot-update.js')).map(asset => asset.endsWith('.css') ? {
|
|
31
42
|
href: asset,
|
|
32
43
|
rel: 'stylesheet'
|
|
33
44
|
} : asset.endsWith('.js') ? {
|
|
@@ -46,4 +57,12 @@ function DocumentSpout(options) {
|
|
|
46
57
|
};
|
|
47
58
|
};
|
|
48
59
|
}
|
|
49
|
-
|
|
60
|
+
|
|
61
|
+
function childrenAssets(chunk) {
|
|
62
|
+
return chunk.children ? Object.values(chunk.children).flatMap(preload => preload.flatMap(c => {
|
|
63
|
+
var _c$assets;
|
|
64
|
+
|
|
65
|
+
return (_c$assets = c.assets) != null ? _c$assets : [];
|
|
66
|
+
})) : [];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEb2N1bWVudFNwb3V0Iiwib3B0aW9ucyIsIm5leHQiLCJwcm9wcyIsIm5leHRQcm9wcyIsInB1YmxpY1BhdGgiLCJjbGllbnRNYW5pZmVzdCIsIk9iamVjdCIsImtleXMiLCJlbnRyeXBvaW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIkVycm9yIiwiYXNzZXRNYXAiLCJhc3NldHMiLCJtYXAiLCJuYW1lIiwiYXNzZXRMaXN0IiwidmFsdWVzIiwiZm9yRWFjaCIsImVudHJ5cG9pbnQiLCJwdXNoIiwiU2V0IiwibmFtZWRDaHVua0dyb3VwcyIsImZpbHRlciIsIm1hdGNoZWRSb3V0ZXMiLCJzb21lIiwicm91dGUiLCJpbmNsdWRlcyIsImZsYXRNYXAiLCJjaHVuayIsImNoaWxkcmVuQXNzZXRzIiwiYXNzZXQiLCJlbmRzV2l0aCIsImhyZWYiLCJyZWwiLCJhcyIsImFwcCIsInRpdGxlIiwicm9vdElkIiwiY2hpbGRyZW4iLCJwcmVsb2FkIiwiYyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvZG9jdW1lbnQuc2VydmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcbmltcG9ydCB7IFN0YXRzQ2h1bmtHcm91cCB9IGZyb20gJ3dlYnBhY2snO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzLCBSZXNvbHZlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBEb2N1bWVudCBmcm9tICcuL0RvY3VtZW50Q29tcG9uZW50JztcblxudHlwZSBOZWVkZWRQcm9wcyA9IHtcbiAgbWF0Y2hlZFJvdXRlczogUm91dGU8YW55PltdO1xuICB0aXRsZT86IHN0cmluZztcbn0gJiBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERvY3VtZW50U3BvdXQob3B0aW9uczoge1xuICBoZWFkPzogUmVhY3QuUmVhY3ROb2RlO1xuICB0aXRsZTogc3RyaW5nO1xuICByb290SWQ6IHN0cmluZztcbn0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KFxuICAgIG5leHQ6IChwcm9wczogU2VydmVyUHJvcHMpID0+IFByb21pc2U8VD4sXG4gICkge1xuICAgIHJldHVybiBhc3luYyAocHJvcHM6IFNlcnZlclByb3BzKSA9PiB7XG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgICAgY29uc3QgcHVibGljUGF0aCA9IHByb3BzLmNsaWVudE1hbmlmZXN0LnB1YmxpY1BhdGg7XG5cbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcHMuY2xpZW50TWFuaWZlc3Q/LmVudHJ5cG9pbnRzID8/IHt9KS5sZW5ndGggPCAxIHx8XG4gICAgICAgIHB1YmxpY1BhdGggPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbmlmZXN0IG1pc3NpbmcgZW50cmllcyBuZWVkZWQnKTtcblxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBwYWNrYWdlIGZvciBidWlsZCBzdGF0cyBpbiBmdXR1cmU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvdHJlZS9tYWluL3BhY2thZ2VzL3JlYWN0LXNlcnZlci1kb20td2VicGFja1xuICAgICAgY29uc3QgYXNzZXRNYXAgPSAoYXNzZXRzOiB7IG5hbWU6IHN0cmluZzsgc2l6ZT86IG51bWJlciB9W10pID0+XG4gICAgICAgIGFzc2V0cy5tYXAoKHsgbmFtZSB9KSA9PiBgJHtwdWJsaWNQYXRofSR7bmFtZX1gKTtcblxuICAgICAgY29uc3QgYXNzZXRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgT2JqZWN0LnZhbHVlcyhwcm9wcy5jbGllbnRNYW5pZmVzdD8uZW50cnlwb2ludHMgPz8ge30pLmZvckVhY2goXG4gICAgICAgIGVudHJ5cG9pbnQgPT4ge1xuICAgICAgICAgIGFzc2V0TGlzdC5wdXNoKC4uLmFzc2V0TWFwKGVudHJ5cG9pbnQuYXNzZXRzID8/IFtdKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbmV3IFNldChcbiAgICAgICAgYXNzZXRNYXAoXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhwcm9wcy5jbGllbnRNYW5pZmVzdC5uYW1lZENodW5rR3JvdXBzID8/IHt9KVxuICAgICAgICAgICAgLmZpbHRlcigoeyBuYW1lIH0pID0+XG4gICAgICAgICAgICAgIG5leHRQcm9wcy5tYXRjaGVkUm91dGVzLnNvbWUocm91dGUgPT4gbmFtZT8uaW5jbHVkZXMocm91dGUubmFtZSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZsYXRNYXAoY2h1bmsgPT4gW1xuICAgICAgICAgICAgICAuLi4oY2h1bmsuYXNzZXRzID8/IFtdKSxcbiAgICAgICAgICAgICAgLy8gYW55IGNodW5rIHByZWxvYWRzXG4gICAgICAgICAgICAgIC4uLmNoaWxkcmVuQXNzZXRzKGNodW5rKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKS5mb3JFYWNoKGFzc2V0ID0+IGFzc2V0TGlzdC5wdXNoKGFzc2V0KSk7XG5cbiAgICAgIC8vIGZpbmQgYWRkaXRpb25hbCBhc3NldHMgdG8gcHJlbG9hZCBiYXNlZCBvbiBtYXRjaGVkIHJvdXRlXG4gICAgICBjb25zdCBhc3NldHM6IHtcbiAgICAgICAgaHJlZjogc3RyaW5nO1xuICAgICAgICBhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgcmVsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgfVtdID0gYXNzZXRMaXN0XG4gICAgICAgIC5maWx0ZXIoYXNzZXQgPT4gIWFzc2V0LmVuZHNXaXRoKCcuaG90LXVwZGF0ZS5qcycpKVxuICAgICAgICAubWFwKGFzc2V0ID0+XG4gICAgICAgICAgYXNzZXQuZW5kc1dpdGgoJy5jc3MnKVxuICAgICAgICAgICAgPyB7IGhyZWY6IGFzc2V0LCByZWw6ICdzdHlsZXNoZWV0JyB9XG4gICAgICAgICAgICA6IGFzc2V0LmVuZHNXaXRoKCcuanMnKVxuICAgICAgICAgICAgPyB7IGhyZWY6IGFzc2V0LCBhczogJ3NjcmlwdCcgfVxuICAgICAgICAgICAgOiB7IGhyZWY6IGFzc2V0IH0sXG4gICAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgICAgYXBwOiAoXG4gICAgICAgICAgPERvY3VtZW50XG4gICAgICAgICAgICB7Li4ub3B0aW9uc31cbiAgICAgICAgICAgIHRpdGxlPXtuZXh0UHJvcHMudGl0bGUgPz8gb3B0aW9ucy50aXRsZX1cbiAgICAgICAgICAgIGFzc2V0cz17YXNzZXRzfVxuICAgICAgICAgICAgcm9vdElkPXtvcHRpb25zLnJvb3RJZH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7bmV4dFByb3BzLmFwcH1cbiAgICAgICAgICA8L0RvY3VtZW50PlxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkFzc2V0cyhjaHVuazogU3RhdHNDaHVua0dyb3VwKSB7XG4gIHJldHVybiBjaHVuay5jaGlsZHJlblxuICAgID8gT2JqZWN0LnZhbHVlcyhjaHVuay5jaGlsZHJlbikuZmxhdE1hcChwcmVsb2FkID0+XG4gICAgICAgIHByZWxvYWQuZmxhdE1hcChjID0+IGMuYXNzZXRzID8/IFtdKSxcbiAgICAgIClcbiAgICA6IFtdO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBS0E7O0FBT2UsU0FBU0EsYUFBVCxDQUF1QkMsT0FBdkIsRUFJWjtFQUNELE9BQU8sVUFDTEMsSUFESyxFQUVMO0lBQ0EsT0FBTyxNQUFPQyxLQUFQLElBQThCO01BQUE7O01BQ25DLE1BQU1DLFNBQVMsR0FBRyxNQUFNRixJQUFJLENBQUNDLEtBQUQsQ0FBNUI7TUFFQSxNQUFNRSxV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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anansi/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"description": "React 18 Framework",
|
|
5
5
|
"homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
|
|
6
6
|
"repository": {
|
|
@@ -60,12 +60,11 @@
|
|
|
60
60
|
"browser"
|
|
61
61
|
],
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@anansi/babel-preset": "^3.2.
|
|
63
|
+
"@anansi/babel-preset": "^3.2.2",
|
|
64
64
|
"@anansi/browserslist-config": "1.3.3",
|
|
65
|
-
"@anansi/webpack-config": "^11.
|
|
65
|
+
"@anansi/webpack-config": "^11.6.1",
|
|
66
66
|
"@babel/cli": "7.17.10",
|
|
67
|
-
"@babel/core": "7.18.
|
|
68
|
-
"@types/compression": "^1.7.2",
|
|
67
|
+
"@babel/core": "7.18.2",
|
|
69
68
|
"@types/source-map-support": "^0.5.4",
|
|
70
69
|
"@types/tmp": "^0.2.3",
|
|
71
70
|
"@types/webpack-hot-middleware": "^2.25.6",
|
|
@@ -75,13 +74,11 @@
|
|
|
75
74
|
"webpack-cli": "^4.9.2"
|
|
76
75
|
},
|
|
77
76
|
"dependencies": {
|
|
78
|
-
"@anansi/router": "^0.5.
|
|
77
|
+
"@anansi/router": "^0.5.5",
|
|
79
78
|
"@babel/runtime": "^7.10.5",
|
|
80
79
|
"@rest-hooks/ssr": "^0.1.3",
|
|
81
80
|
"chalk": "^4.0.0",
|
|
82
|
-
"compression": "^1.7.4",
|
|
83
81
|
"cross-fetch": "^3.1.5",
|
|
84
|
-
"express": "^4.17.3",
|
|
85
82
|
"fs-monkey": "^1.0.3",
|
|
86
83
|
"history": "^5.3.0",
|
|
87
84
|
"import-fresh": "^3.3.0",
|
|
@@ -6,19 +6,17 @@ import path from 'path';
|
|
|
6
6
|
import webpack, { MultiCompiler } from 'webpack';
|
|
7
7
|
import { createFsFromVolume, Volume } from 'memfs';
|
|
8
8
|
import { Server, IncomingMessage, ServerResponse } from 'http';
|
|
9
|
-
import
|
|
10
|
-
import ora from 'ora';
|
|
9
|
+
import type { NextFunction } from 'express';
|
|
11
10
|
import { patchRequire } from 'fs-monkey';
|
|
12
11
|
import tmp from 'tmp';
|
|
13
12
|
import sourceMapSupport from 'source-map-support';
|
|
14
13
|
import { ufs } from 'unionfs';
|
|
15
|
-
import compress from 'compression';
|
|
16
14
|
import WebpackDevServer from 'webpack-dev-server';
|
|
17
15
|
import importFresh from 'import-fresh';
|
|
18
|
-
import
|
|
16
|
+
import logging from 'webpack/lib/logging/runtime';
|
|
19
17
|
|
|
20
18
|
import 'cross-fetch/polyfill';
|
|
21
|
-
import {
|
|
19
|
+
import { BoundRender } from './types';
|
|
22
20
|
|
|
23
21
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
24
22
|
const webpackConfig = require(require.resolve(
|
|
@@ -27,7 +25,6 @@ const webpackConfig = require(require.resolve(
|
|
|
27
25
|
));
|
|
28
26
|
|
|
29
27
|
const entrypoint = process.argv[2];
|
|
30
|
-
const PORT = process.env.PORT || 3000;
|
|
31
28
|
//process.env.WEBPACK_PUBLIC_HOST = `http://localhost:${PORT}`; this breaks compatibility with stackblitz
|
|
32
29
|
process.env.WEBPACK_PUBLIC_PATH = '/assets/';
|
|
33
30
|
|
|
@@ -36,11 +33,7 @@ if (!entrypoint) {
|
|
|
36
33
|
process.exit(-1);
|
|
37
34
|
}
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
chalk.greenBright(`Starting SSR at:`),
|
|
41
|
-
chalk.cyanBright(process.env.WEBPACK_PUBLIC_HOST || `http://localhost:${PORT}`),
|
|
42
|
-
);
|
|
43
|
-
const loader = ora().start();
|
|
36
|
+
const log = logging.getLogger('anansi-devserver');
|
|
44
37
|
|
|
45
38
|
// Set up in memory filesystem
|
|
46
39
|
const volume = new Volume();
|
|
@@ -74,15 +67,16 @@ export default entry;
|
|
|
74
67
|
const webpackConfigs = [
|
|
75
68
|
webpackConfig(
|
|
76
69
|
{
|
|
77
|
-
|
|
70
|
+
entrypath: hotEntry(entrypoint).name,
|
|
78
71
|
name: 'client',
|
|
79
72
|
},
|
|
80
73
|
{ mode: 'development' },
|
|
81
74
|
),
|
|
82
75
|
webpackConfig(
|
|
83
76
|
{
|
|
84
|
-
|
|
77
|
+
entrypath: entrypoint.replace('.tsx', '.server.tsx'),
|
|
85
78
|
name: 'server',
|
|
79
|
+
BROWSERSLIST_ENV: 'current node',
|
|
86
80
|
},
|
|
87
81
|
{ mode: 'development', target: 'node' },
|
|
88
82
|
),
|
|
@@ -98,7 +92,7 @@ sourceMapSupport.install({ hookRequire: true });
|
|
|
98
92
|
|
|
99
93
|
function getServerBundle(serverStats: webpack.Stats) {
|
|
100
94
|
const serverJson = serverStats.toJson({ assets: true });
|
|
101
|
-
return path.join(serverJson.outputPath ?? '', '
|
|
95
|
+
return path.join(serverJson.outputPath ?? '', 'server.js');
|
|
102
96
|
}
|
|
103
97
|
function handleErrors<
|
|
104
98
|
F extends (
|
|
@@ -118,91 +112,30 @@ function handleErrors<
|
|
|
118
112
|
}
|
|
119
113
|
};
|
|
120
114
|
}
|
|
121
|
-
let render:
|
|
122
|
-
|
|
123
|
-
function initializeApp(stats: webpack.Stats[]) {
|
|
115
|
+
let render: BoundRender;
|
|
116
|
+
function importRender(stats: webpack.Stats[]) {
|
|
124
117
|
const [clientStats, serverStats] = stats;
|
|
125
118
|
if (
|
|
126
119
|
clientStats?.compilation?.errors?.length ||
|
|
127
120
|
serverStats?.compilation?.errors?.length
|
|
128
121
|
) {
|
|
129
|
-
|
|
130
|
-
|
|
122
|
+
log.error('Errors for client build: ' + clientStats.compilation.errors);
|
|
123
|
+
log.error('Errors for server build: ' + serverStats.compilation.errors);
|
|
131
124
|
// TODO: handle more gracefully
|
|
132
125
|
process.exit(-1);
|
|
133
126
|
} else {
|
|
134
|
-
|
|
127
|
+
log.info('Launching SSR');
|
|
135
128
|
}
|
|
136
129
|
|
|
137
|
-
const wrappingApp = express();
|
|
138
|
-
// eslint-disable-next-line
|
|
139
|
-
//@ts-ignore
|
|
140
|
-
wrappingApp.use(compress());
|
|
141
|
-
|
|
142
130
|
// ASSETS
|
|
143
131
|
const clientManifest = clientStats.toJson();
|
|
144
|
-
const assetRoute = async (req: Request | IncomingMessage, res: any) => {
|
|
145
|
-
const filename =
|
|
146
|
-
req.url
|
|
147
|
-
?.substring((process.env.WEBPACK_PUBLIC_PATH as string).length)
|
|
148
|
-
.split('?')[0] ?? '';
|
|
149
|
-
const assetPath = path.join(clientManifest.outputPath ?? '', filename);
|
|
150
|
-
|
|
151
|
-
try {
|
|
152
|
-
const fileContent = (await readFile(assetPath)).toString();
|
|
153
|
-
res.contentType(filename);
|
|
154
|
-
res.send(fileContent);
|
|
155
|
-
} catch (e) {
|
|
156
|
-
res.status(404);
|
|
157
|
-
res.send(e);
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
wrappingApp.get(`${process.env.WEBPACK_PUBLIC_PATH}*`, assetRoute);
|
|
162
132
|
|
|
163
133
|
// SERVER SIDE RENDERING
|
|
164
134
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
165
|
-
render =
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
handleErrors(async function (req: any, res: any) {
|
|
169
|
-
if (req.url.endsWith('favicon.ico')) {
|
|
170
|
-
res.statusCode = 404;
|
|
171
|
-
res.setHeader('Content-type', 'text/html');
|
|
172
|
-
res.send('not found');
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
res.socket.on('error', (error: unknown) => {
|
|
176
|
-
console.error('Fatal', error);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
await render(clientManifest, req, res);
|
|
180
|
-
}),
|
|
135
|
+
render = (importFresh(getServerBundle(serverStats)) as any).default.bind(
|
|
136
|
+
undefined,
|
|
137
|
+
clientManifest,
|
|
181
138
|
);
|
|
182
|
-
|
|
183
|
-
server = wrappingApp
|
|
184
|
-
.listen(PORT, () => {
|
|
185
|
-
loader.succeed(`SSR Running`);
|
|
186
|
-
})
|
|
187
|
-
.on('error', function (error: any) {
|
|
188
|
-
if (error.syscall !== 'listen') {
|
|
189
|
-
throw error;
|
|
190
|
-
}
|
|
191
|
-
const isPipe = (portOrPipe: string | number) => Number.isNaN(portOrPipe);
|
|
192
|
-
const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
|
|
193
|
-
switch (error.code) {
|
|
194
|
-
case 'EACCES':
|
|
195
|
-
console.error(bind + ' requires elevated privileges');
|
|
196
|
-
process.exit(1);
|
|
197
|
-
break;
|
|
198
|
-
case 'EADDRINUSE':
|
|
199
|
-
console.error(bind + ' is already in use');
|
|
200
|
-
process.exit(1);
|
|
201
|
-
break;
|
|
202
|
-
default:
|
|
203
|
-
throw error;
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
139
|
}
|
|
207
140
|
|
|
208
141
|
const devServer = new WebpackDevServer(
|
|
@@ -223,6 +156,37 @@ const devServer = new WebpackDevServer(
|
|
|
223
156
|
join: path.join as any,
|
|
224
157
|
} as any as typeof fs,
|
|
225
158
|
},
|
|
159
|
+
setupMiddlewares: (middlewares, devServer) => {
|
|
160
|
+
if (!devServer) {
|
|
161
|
+
throw new Error('webpack-dev-server is not defined');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// serve SSR for non-WEBPACK_PUBLIC_PATH
|
|
165
|
+
devServer.app?.get(
|
|
166
|
+
new RegExp(`^(?!${process.env.WEBPACK_PUBLIC_PATH})`),
|
|
167
|
+
handleErrors(async function (req: any, res: any) {
|
|
168
|
+
if (req.url.endsWith('favicon.ico')) {
|
|
169
|
+
res.statusCode = 404;
|
|
170
|
+
res.setHeader('Content-type', 'text/html');
|
|
171
|
+
res.send('not found');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
res.socket.on('error', (error: unknown) => {
|
|
175
|
+
console.error('Fatal', error);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
if (!render) {
|
|
179
|
+
res.statusCode = 500;
|
|
180
|
+
res.setHeader('Content-type', 'text/html');
|
|
181
|
+
res.send('Render not initialized');
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
await render(req, res);
|
|
185
|
+
}),
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
return middlewares;
|
|
189
|
+
},
|
|
226
190
|
},
|
|
227
191
|
compiler,
|
|
228
192
|
);
|
|
@@ -232,38 +196,33 @@ const runServer = async () => {
|
|
|
232
196
|
'Anansi Server',
|
|
233
197
|
(multiStats: webpack.MultiStats | webpack.Stats) => {
|
|
234
198
|
if (!multiStats) {
|
|
235
|
-
|
|
199
|
+
log.error('stats not send');
|
|
236
200
|
process.exit(-1);
|
|
237
201
|
}
|
|
238
202
|
|
|
239
203
|
if (!Object.hasOwn(multiStats, 'stats')) return;
|
|
240
|
-
if (
|
|
241
|
-
render = (
|
|
242
|
-
importFresh(
|
|
243
|
-
getServerBundle((multiStats as webpack.MultiStats).stats[1]),
|
|
244
|
-
) as any
|
|
245
|
-
).default;
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
if (!server) {
|
|
204
|
+
if ((multiStats as webpack.MultiStats).stats.length > 1) {
|
|
249
205
|
try {
|
|
250
|
-
|
|
251
|
-
} catch (e) {
|
|
252
|
-
|
|
206
|
+
importRender((multiStats as webpack.MultiStats).stats);
|
|
207
|
+
} catch (e: any) {
|
|
208
|
+
log.error('Failed to load serve entrypoint');
|
|
253
209
|
console.error(e);
|
|
210
|
+
console.error(e.stack);
|
|
254
211
|
}
|
|
212
|
+
} else {
|
|
213
|
+
log.error('Only compiler one stat');
|
|
255
214
|
}
|
|
256
215
|
},
|
|
257
216
|
);
|
|
258
217
|
};
|
|
259
218
|
const stopServer = async () => {
|
|
260
|
-
|
|
219
|
+
log.info('Stopping server...');
|
|
261
220
|
await devServer.stop();
|
|
262
|
-
|
|
221
|
+
log.info('Server closed');
|
|
263
222
|
};
|
|
264
223
|
|
|
265
224
|
process.on('SIGINT', () => {
|
|
266
|
-
|
|
225
|
+
log.warn('Received SIGINT, devserver shutting down');
|
|
267
226
|
stopServer();
|
|
268
227
|
process.exit(-1);
|
|
269
228
|
});
|
package/src/scripts/types.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { Route } from '@anansi/router';
|
|
3
|
+
import { StatsChunkGroup } from 'webpack';
|
|
3
4
|
|
|
4
5
|
import type { ServerProps, ResolveProps } from './types';
|
|
5
6
|
import Document from './DocumentComponent';
|
|
@@ -20,29 +21,53 @@ export default function DocumentSpout(options: {
|
|
|
20
21
|
return async (props: ServerProps) => {
|
|
21
22
|
const nextProps = await next(props);
|
|
22
23
|
|
|
23
|
-
const entrypoint = props.clientManifest?.entrypoints?.main;
|
|
24
24
|
const publicPath = props.clientManifest.publicPath;
|
|
25
25
|
|
|
26
|
-
if (
|
|
26
|
+
if (
|
|
27
|
+
Object.keys(props.clientManifest?.entrypoints ?? {}).length < 1 ||
|
|
28
|
+
publicPath === undefined
|
|
29
|
+
)
|
|
27
30
|
throw new Error('Manifest missing entries needed');
|
|
28
31
|
|
|
29
32
|
// TODO: consider using this package for build stats in future:
|
|
30
33
|
// https://github.com/facebook/react/tree/main/packages/react-server-dom-webpack
|
|
31
34
|
const assetMap = (assets: { name: string; size?: number }[]) =>
|
|
32
35
|
assets.map(({ name }) => `${publicPath}${name}`);
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
]).map(asset =>
|
|
40
|
-
asset.endsWith('.css')
|
|
41
|
-
? { href: asset, rel: 'stylesheet' }
|
|
42
|
-
: asset.endsWith('.js')
|
|
43
|
-
? { href: asset, as: 'script' }
|
|
44
|
-
: { href: asset },
|
|
36
|
+
|
|
37
|
+
const assetList: string[] = [];
|
|
38
|
+
Object.values(props.clientManifest?.entrypoints ?? {}).forEach(
|
|
39
|
+
entrypoint => {
|
|
40
|
+
assetList.push(...assetMap(entrypoint.assets ?? []));
|
|
41
|
+
},
|
|
45
42
|
);
|
|
43
|
+
new Set(
|
|
44
|
+
assetMap(
|
|
45
|
+
Object.values(props.clientManifest.namedChunkGroups ?? {})
|
|
46
|
+
.filter(({ name }) =>
|
|
47
|
+
nextProps.matchedRoutes.some(route => name?.includes(route.name)),
|
|
48
|
+
)
|
|
49
|
+
.flatMap(chunk => [
|
|
50
|
+
...(chunk.assets ?? []),
|
|
51
|
+
// any chunk preloads
|
|
52
|
+
...childrenAssets(chunk),
|
|
53
|
+
]),
|
|
54
|
+
),
|
|
55
|
+
).forEach(asset => assetList.push(asset));
|
|
56
|
+
|
|
57
|
+
// find additional assets to preload based on matched route
|
|
58
|
+
const assets: {
|
|
59
|
+
href: string;
|
|
60
|
+
as?: string | undefined;
|
|
61
|
+
rel?: string | undefined;
|
|
62
|
+
}[] = assetList
|
|
63
|
+
.filter(asset => !asset.endsWith('.hot-update.js'))
|
|
64
|
+
.map(asset =>
|
|
65
|
+
asset.endsWith('.css')
|
|
66
|
+
? { href: asset, rel: 'stylesheet' }
|
|
67
|
+
: asset.endsWith('.js')
|
|
68
|
+
? { href: asset, as: 'script' }
|
|
69
|
+
: { href: asset },
|
|
70
|
+
);
|
|
46
71
|
|
|
47
72
|
return {
|
|
48
73
|
...nextProps,
|
|
@@ -60,3 +85,11 @@ export default function DocumentSpout(options: {
|
|
|
60
85
|
};
|
|
61
86
|
};
|
|
62
87
|
}
|
|
88
|
+
|
|
89
|
+
function childrenAssets(chunk: StatsChunkGroup) {
|
|
90
|
+
return chunk.children
|
|
91
|
+
? Object.values(chunk.children).flatMap(preload =>
|
|
92
|
+
preload.flatMap(c => c.assets ?? []),
|
|
93
|
+
)
|
|
94
|
+
: [];
|
|
95
|
+
}
|