@anansi/core 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/server.js +27 -23
  3. package/dist/server.js.map +1 -1
  4. package/lib/floodSpouts.d.ts +6 -0
  5. package/lib/floodSpouts.d.ts.map +1 -0
  6. package/lib/index.d.ts +5 -0
  7. package/lib/index.d.ts.map +1 -0
  8. package/lib/index.server.d.ts +6 -0
  9. package/lib/index.server.d.ts.map +1 -0
  10. package/lib/laySpouts.d.ts +8 -0
  11. package/lib/laySpouts.d.ts.map +1 -0
  12. package/lib/scripts/index.d.ts +3 -0
  13. package/lib/scripts/index.d.ts.map +1 -0
  14. package/lib/scripts/index.js +15 -0
  15. package/lib/scripts/serve.d.ts +4 -0
  16. package/lib/scripts/serve.d.ts.map +1 -0
  17. package/lib/scripts/serve.js +162 -0
  18. package/lib/scripts/startDevserver.d.ts +4 -0
  19. package/lib/scripts/startDevserver.d.ts.map +1 -0
  20. package/lib/scripts/startDevserver.js +175 -164
  21. package/lib/scripts/types.d.ts +7 -0
  22. package/lib/scripts/types.d.ts.map +1 -0
  23. package/lib/spouts/DocumentComponent.d.ts +23 -0
  24. package/lib/spouts/DocumentComponent.d.ts.map +1 -0
  25. package/lib/spouts/DocumentComponent.js +10 -6
  26. package/lib/spouts/document.d.ts +13 -0
  27. package/lib/spouts/document.d.ts.map +1 -0
  28. package/lib/spouts/document.server.d.ts +18 -0
  29. package/lib/spouts/document.server.d.ts.map +1 -0
  30. package/lib/spouts/document.server.js +1 -1
  31. package/lib/spouts/prefetch.server.d.ts +8 -0
  32. package/lib/spouts/prefetch.server.d.ts.map +1 -0
  33. package/lib/spouts/restHooks.d.ts +8 -0
  34. package/lib/spouts/restHooks.d.ts.map +1 -0
  35. package/lib/spouts/restHooks.server.d.ts +9 -0
  36. package/lib/spouts/restHooks.server.d.ts.map +1 -0
  37. package/lib/spouts/router.d.ts +12 -0
  38. package/lib/spouts/router.d.ts.map +1 -0
  39. package/lib/spouts/router.server.d.ts +12 -0
  40. package/lib/spouts/router.server.d.ts.map +1 -0
  41. package/lib/spouts/types.d.ts +16 -0
  42. package/lib/spouts/types.d.ts.map +1 -0
  43. package/package.json +8 -3
  44. package/src/scripts/index.ts +2 -0
  45. package/src/scripts/serve.ts +168 -0
  46. package/src/scripts/startDevserver.ts +218 -202
  47. package/src/spouts/DocumentComponent.tsx +8 -2
  48. package/src/spouts/document.server.tsx +2 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.8.0](https://github.com/ntucker/anansi/compare/@anansi/core@0.7.4...@anansi/core@0.8.0) (2022-05-29)
7
+
8
+
9
+ ### 🚀 Features
10
+
11
+ * Add anansi serve command ([#1525](https://github.com/ntucker/anansi/issues/1525)) ([ac5a396](https://github.com/ntucker/anansi/commit/ac5a396f9640ce18058813c1594d49367a8aa468))
12
+ * Add charSet option to documentSpout ([51d3168](https://github.com/ntucker/anansi/commit/51d31681d27144d06b8ed4c7da9aae43fd10f12b))
13
+ * Add production node service ([bceeb56](https://github.com/ntucker/anansi/commit/bceeb56c23c8f8c3dc4a15d35dc8877f277e3d2f))
14
+ * Handle devserver proxy ([e7c5b38](https://github.com/ntucker/anansi/commit/e7c5b38cdb60b236db15ffb28622889b0b771515))
15
+
16
+
17
+
6
18
  ### [0.7.4](https://github.com/ntucker/anansi/compare/@anansi/core@0.7.3...@anansi/core@0.7.4) (2022-05-28)
7
19
 
8
20
 
package/dist/server.js CHANGED
@@ -128,51 +128,62 @@ function laySpouts(spouts, {
128
128
  const external_react_namespaceObject = require("react");
129
129
  var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_namespaceObject);
130
130
  ;// CONCATENATED MODULE: ./src/spouts/DocumentComponent.tsx
131
- var _jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/DocumentComponent.tsx";
131
+ var _jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/DocumentComponent.tsx",
132
+ _process$env$WEBPACK_;
133
+
132
134
 
133
135
  function Document({
134
136
  assets,
135
137
  head,
136
138
  children,
137
139
  title,
138
- rootId
140
+ rootId,
141
+ charSet
139
142
  }) {
140
143
  return /*#__PURE__*/external_react_default().createElement("html", {
141
144
  __self: this,
142
145
  __source: {
143
146
  fileName: _jsxFileName,
144
- lineNumber: 17,
147
+ lineNumber: 19,
145
148
  columnNumber: 5
146
149
  }
147
150
  }, /*#__PURE__*/external_react_default().createElement("head", {
148
151
  __self: this,
149
152
  __source: {
150
153
  fileName: _jsxFileName,
151
- lineNumber: 18,
154
+ lineNumber: 20,
152
155
  columnNumber: 7
153
156
  }
154
- }, head, assets.map((asset, i) => /*#__PURE__*/external_react_default().createElement("link", {
157
+ }, /*#__PURE__*/external_react_default().createElement("meta", {
158
+ charSet: charSet,
159
+ __self: this,
160
+ __source: {
161
+ fileName: _jsxFileName,
162
+ lineNumber: 21,
163
+ columnNumber: 9
164
+ }
165
+ }), head, assets.map((asset, i) => /*#__PURE__*/external_react_default().createElement("link", {
155
166
  key: i,
156
167
  rel: "preload",
157
168
  ...asset,
158
169
  __self: this,
159
170
  __source: {
160
171
  fileName: _jsxFileName,
161
- lineNumber: 21,
172
+ lineNumber: 24,
162
173
  columnNumber: 11
163
174
  }
164
175
  })), /*#__PURE__*/external_react_default().createElement("title", {
165
176
  __self: this,
166
177
  __source: {
167
178
  fileName: _jsxFileName,
168
- lineNumber: 23,
179
+ lineNumber: 26,
169
180
  columnNumber: 9
170
181
  }
171
182
  }, title)), /*#__PURE__*/external_react_default().createElement("body", {
172
183
  __self: this,
173
184
  __source: {
174
185
  fileName: _jsxFileName,
175
- lineNumber: 25,
186
+ lineNumber: 28,
176
187
  columnNumber: 7
177
188
  }
178
189
  }, /*#__PURE__*/external_react_default().createElement("div", {
@@ -180,7 +191,7 @@ function Document({
180
191
  __self: this,
181
192
  __source: {
182
193
  fileName: _jsxFileName,
183
- lineNumber: 26,
194
+ lineNumber: 29,
184
195
  columnNumber: 9
185
196
  }
186
197
  }, children), /*#__PURE__*/external_react_default().createElement("script", {
@@ -190,7 +201,7 @@ function Document({
190
201
  __self: this,
191
202
  __source: {
192
203
  fileName: _jsxFileName,
193
- lineNumber: 28,
204
+ lineNumber: 31,
194
205
  columnNumber: 9
195
206
  }
196
207
  }), assets.filter(({
@@ -204,39 +215,32 @@ function Document({
204
215
  __self: this,
205
216
  __source: {
206
217
  fileName: _jsxFileName,
207
- lineNumber: 36,
218
+ lineNumber: 39,
208
219
  columnNumber: 13
209
220
  }
210
221
  }))));
211
222
  }
212
223
  Document.defaultProps = {
213
224
  head: /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("meta", {
214
- charSet: "utf-8",
215
- __self: undefined,
216
- __source: {
217
- fileName: _jsxFileName,
218
- lineNumber: 45,
219
- columnNumber: 7
220
- }
221
- }), /*#__PURE__*/external_react_default().createElement("meta", {
222
225
  name: "viewport",
223
226
  content: "width=device-width, initial-scale=1",
224
227
  __self: undefined,
225
228
  __source: {
226
229
  fileName: _jsxFileName,
227
- lineNumber: 46,
230
+ lineNumber: 48,
228
231
  columnNumber: 7
229
232
  }
230
233
  }), /*#__PURE__*/external_react_default().createElement("link", {
231
234
  rel: "shortcut icon",
232
- href: "/assets/favicon.ico",
235
+ href: `${(_process$env$WEBPACK_ = process.env.WEBPACK_PUBLIC_PATH) != null ? _process$env$WEBPACK_ : '/'}favicon.ico`,
233
236
  __self: undefined,
234
237
  __source: {
235
238
  fileName: _jsxFileName,
236
- lineNumber: 47,
239
+ lineNumber: 49,
237
240
  columnNumber: 7
238
241
  }
239
242
  })),
243
+ charSet: 'utf-8',
240
244
  rootId: 'anansi-root'
241
245
  };
242
246
  ;// CONCATENATED MODULE: ./src/spouts/document.server.tsx
@@ -289,7 +293,7 @@ function DocumentSpout(options) {
289
293
  __self: this,
290
294
  __source: {
291
295
  fileName: document_server_jsxFileName,
292
- lineNumber: 52,
296
+ lineNumber: 54,
293
297
  columnNumber: 14
294
298
  }
295
299
  }, nextProps.app)
@@ -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;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
+ {"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;;;;;;;ACSA;AACA;AACA;AACA;AACA;AACA;AACA;AANA;AAQA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;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;AAAA;AAEA;AACA;AAFA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;AAXA;;;AC5CA;AAKA;AAQA;AAMA;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;;AChGA;;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 charSet: string;\n};\n\nexport default function Document({\n assets,\n head,\n children,\n title,\n rootId,\n charSet,\n}: Props) {\n return (\n <html>\n <head>\n <meta charSet={charSet} />\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 name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link\n rel=\"shortcut icon\"\n href={`${process.env.WEBPACK_PUBLIC_PATH ?? '/'}favicon.ico`}\n />\n </>\n ),\n charSet: 'utf-8',\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 charSet?: string;\n} & ResolveProps;\n\nexport default function DocumentSpout(options: {\n head?: React.ReactNode;\n title: string;\n rootId: string;\n charSet: 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":""}
@@ -0,0 +1,6 @@
1
+ export default function floodSpouts(spouts: () => Promise<{
2
+ app: JSX.Element;
3
+ }>, { rootId }?: {
4
+ rootId?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=floodSpouts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floodSpouts.d.ts","sourceRoot":"","sources":["../src/floodSpouts.tsx"],"names":[],"mappings":"AAEA,wBAA8B,WAAW,CACvC,MAAM,EAAE,MAAM,OAAO,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,EACF,EAAE,MAAsB,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBAKrD"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { default as floodSpouts } from './floodSpouts';
2
+ export { default as documentSpout } from './spouts/document';
3
+ export { default as restHooksSpout } from './spouts/restHooks';
4
+ export { default as routerSpout } from './spouts/router';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { default as laySpouts } from './laySpouts';
2
+ export { default as documentSpout } from './spouts/document.server';
3
+ export { default as restHooksSpout } from './spouts/restHooks.server';
4
+ export { default as routerSpout } from './spouts/router.server';
5
+ export { default as prefetchSpout } from './spouts/prefetch.server';
6
+ //# sourceMappingURL=index.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.server.d.ts","sourceRoot":"","sources":["../src/index.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Render } from './scripts/types';
2
+ import { ServerProps } from './spouts/types';
3
+ export default function laySpouts(spouts: (props: ServerProps) => Promise<{
4
+ app: JSX.Element;
5
+ }>, { timeoutMS }?: {
6
+ timeoutMS?: number;
7
+ }): Render;
8
+ //# sourceMappingURL=laySpouts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACtC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,EACF,EAAE,SAAe,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,UAkDjD"}
@@ -0,0 +1,3 @@
1
+ export { default as serve } from './serve';
2
+ export { default as devServe } from './startDevserver';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scripts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ exports.__esModule = true;
6
+ exports.serve = exports.devServe = void 0;
7
+
8
+ var _serve = _interopRequireDefault(require("./serve"));
9
+
10
+ exports.serve = _serve.default;
11
+
12
+ var _startDevserver = _interopRequireDefault(require("./startDevserver"));
13
+
14
+ exports.devServe = _startDevserver.default;
15
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXJ2ZSB9IGZyb20gJy4vc2VydmUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZXZTZXJ2ZSB9IGZyb20gJy4vc3RhcnREZXZzZXJ2ZXInO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7QUFDQSJ9
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import 'cross-fetch/polyfill';
3
+ export default function serve(entrypoint: string): void;
4
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/scripts/serve.ts"],"names":[],"mappings":";AAWA,OAAO,sBAAsB,CAAC;AAc9B,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,UAAU,EAAE,MAAM,QA0H/C"}
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
+
6
+ exports.__esModule = true;
7
+ exports.default = serve;
8
+
9
+ var _util = require("util");
10
+
11
+ var _fs = _interopRequireDefault(require("fs"));
12
+
13
+ var _path = _interopRequireDefault(require("path"));
14
+
15
+ var _express = _interopRequireDefault(require("express"));
16
+
17
+ var _ora = _interopRequireDefault(require("ora"));
18
+
19
+ var _compression = _interopRequireDefault(require("compression"));
20
+
21
+ require("cross-fetch/polyfill");
22
+
23
+ // run directly from node
24
+ if (require.main === module) {
25
+ const entrypoint = process.argv[2];
26
+
27
+ if (!entrypoint) {
28
+ console.log(`Usage: ${process.argv[0]} <server-entrypoint>`);
29
+ process.exit(-1);
30
+ }
31
+
32
+ serve(entrypoint);
33
+ }
34
+
35
+ function serve(entrypoint) {
36
+ const PORT = process.env.PORT || 8080;
37
+ const loader = (0, _ora.default)('Initializing').start();
38
+ const manifestPath = getManifestPathFromWebpackconfig();
39
+ const readFile = (0, _util.promisify)(_fs.default.readFile);
40
+ let server;
41
+
42
+ function handleErrors(fn) {
43
+ return async function (req, res, next) {
44
+ try {
45
+ return await fn(req, res);
46
+ } catch (x) {
47
+ next(x);
48
+ }
49
+ };
50
+ } // Start the express server after the first compilation
51
+
52
+
53
+ function initializeApp(clientManifest) {
54
+ loader.info('Launching server');
55
+
56
+ if (!clientManifest) {
57
+ loader.fail('Manifest not found'); // TODO: handle more gracefully
58
+
59
+ process.exit(-1);
60
+ }
61
+
62
+ const wrappingApp = (0, _express.default)(); // eslint-disable-next-line
63
+ //@ts-ignore
64
+
65
+ wrappingApp.use((0, _compression.default)()); // ASSETS
66
+
67
+ const assetRoute = async (req, res) => {
68
+ var _req$url$substr, _req$url, _clientManifest$outpu;
69
+
70
+ const filename = (_req$url$substr = (_req$url = req.url) === null || _req$url === void 0 ? void 0 : _req$url.substr(process.env.WEBPACK_PUBLIC_PATH.length)) != null ? _req$url$substr : '';
71
+
72
+ const assetPath = _path.default.join((_clientManifest$outpu = clientManifest.outputPath) != null ? _clientManifest$outpu : '', filename);
73
+
74
+ try {
75
+ const fileContent = (await readFile(assetPath)).toString();
76
+ res.contentType(filename);
77
+ res.send(fileContent);
78
+ } catch (e) {
79
+ res.status(404);
80
+ res.send(e);
81
+ return;
82
+ }
83
+ };
84
+
85
+ wrappingApp.get(`${process.env.WEBPACK_PUBLIC_PATH}*`, assetRoute); // SERVER SIDE RENDERING
86
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
87
+
88
+ const render = require(_path.default.join(process.cwd(), entrypoint)).default;
89
+
90
+ wrappingApp.get('/*', handleErrors(async function (req, res) {
91
+ if (req.url.endsWith('favicon.ico')) {
92
+ res.statusCode = 404;
93
+ res.setHeader('Content-type', 'text/html');
94
+ res.send('not found');
95
+ return;
96
+ }
97
+
98
+ res.socket.on('error', error => {
99
+ console.error('Fatal', error);
100
+ });
101
+ await render(clientManifest, req, res);
102
+ }));
103
+ server = wrappingApp.listen(PORT, () => {
104
+ loader.info(`Listening at ${PORT}...`);
105
+ }).on('error', function (error) {
106
+ if (error.syscall !== 'listen') {
107
+ throw error;
108
+ }
109
+
110
+ const isPipe = portOrPipe => Number.isNaN(portOrPipe);
111
+
112
+ const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
113
+
114
+ switch (error.code) {
115
+ case 'EACCES':
116
+ loader.fail(bind + ' requires elevated privileges');
117
+ process.exit(1);
118
+ // eslint-disable-next-line no-fallthrough
119
+
120
+ case 'EADDRINUSE':
121
+ loader.fail(bind + ' is already in use');
122
+ process.exit(1);
123
+ // eslint-disable-next-line no-fallthrough
124
+
125
+ default:
126
+ throw error;
127
+ }
128
+ });
129
+ } // eslint-disable-next-line @typescript-eslint/no-var-requires
130
+
131
+
132
+ initializeApp(require(manifestPath));
133
+ process.on('SIGINT', () => {
134
+ var _server;
135
+
136
+ loader.warn('Received SIGINT, devserver shutting down');
137
+ if (server) console.log('Closing server');
138
+ (_server = server) === null || _server === void 0 ? void 0 : _server.close(() => {
139
+ loader.info('Server closed');
140
+ });
141
+ process.exit(-1);
142
+ });
143
+ }
144
+
145
+ function getManifestPathFromWebpackconfig() {
146
+ var _opts$filename, _webpackConfig$plugin, _webpackConfig$plugin2, _webpackConfig$plugin3, _webpackConfig$output, _webpackConfig$output2;
147
+
148
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
149
+ const webpackConfig = require(require.resolve( // TODO: use normal resolution algorithm to find webpack file
150
+ _path.default.join(process.cwd(), 'webpack.config')))({}, {
151
+ mode: 'production'
152
+ });
153
+
154
+ const manifestFilename = (_opts$filename = webpackConfig === null || webpackConfig === void 0 ? void 0 : (_webpackConfig$plugin = webpackConfig.plugins) === null || _webpackConfig$plugin === void 0 ? void 0 : (_webpackConfig$plugin2 = _webpackConfig$plugin.find(plugin => {
155
+ return plugin.constructor.name === 'StatsWriterPlugin';
156
+ })) === null || _webpackConfig$plugin2 === void 0 ? void 0 : (_webpackConfig$plugin3 = _webpackConfig$plugin2.opts) === null || _webpackConfig$plugin3 === void 0 ? void 0 : _webpackConfig$plugin3.filename) != null ? _opts$filename : 'manifest.json';
157
+
158
+ const manifestPath = _path.default.join((_webpackConfig$output = webpackConfig === null || webpackConfig === void 0 ? void 0 : (_webpackConfig$output2 = webpackConfig.output) === null || _webpackConfig$output2 === void 0 ? void 0 : _webpackConfig$output2.path) != null ? _webpackConfig$output : '', manifestFilename);
159
+
160
+ return manifestPath;
161
+ }
162
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlIiwibWFpbiIsIm1vZHVsZSIsImVudHJ5cG9pbnQiLCJwcm9jZXNzIiwiYXJndiIsImNvbnNvbGUiLCJsb2ciLCJleGl0Iiwic2VydmUiLCJQT1JUIiwiZW52IiwibG9hZGVyIiwib3JhIiwic3RhcnQiLCJtYW5pZmVzdFBhdGgiLCJnZXRNYW5pZmVzdFBhdGhGcm9tV2VicGFja2NvbmZpZyIsInJlYWRGaWxlIiwicHJvbWlzaWZ5IiwiZGlza0ZzIiwic2VydmVyIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsImluaXRpYWxpemVBcHAiLCJjbGllbnRNYW5pZmVzdCIsImluZm8iLCJmYWlsIiwid3JhcHBpbmdBcHAiLCJleHByZXNzIiwidXNlIiwiY29tcHJlc3MiLCJhc3NldFJvdXRlIiwiZmlsZW5hbWUiLCJ1cmwiLCJzdWJzdHIiLCJXRUJQQUNLX1BVQkxJQ19QQVRIIiwibGVuZ3RoIiwiYXNzZXRQYXRoIiwicGF0aCIsImpvaW4iLCJvdXRwdXRQYXRoIiwiZmlsZUNvbnRlbnQiLCJ0b1N0cmluZyIsImNvbnRlbnRUeXBlIiwic2VuZCIsImUiLCJzdGF0dXMiLCJnZXQiLCJyZW5kZXIiLCJjd2QiLCJkZWZhdWx0IiwiZW5kc1dpdGgiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwic29ja2V0Iiwib24iLCJlcnJvciIsImxpc3RlbiIsInN5c2NhbGwiLCJpc1BpcGUiLCJwb3J0T3JQaXBlIiwiTnVtYmVyIiwiaXNOYU4iLCJiaW5kIiwiY29kZSIsIndhcm4iLCJjbG9zZSIsIndlYnBhY2tDb25maWciLCJyZXNvbHZlIiwibW9kZSIsIm1hbmlmZXN0RmlsZW5hbWUiLCJwbHVnaW5zIiwiZmluZCIsInBsdWdpbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm9wdHMiLCJvdXRwdXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9zZXJ2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB3ZWJwYWNrLCB7IHdlYiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IHsgU2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgZXhwcmVzcywgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCBjb21wcmVzcyBmcm9tICdjb21wcmVzc2lvbic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvcG9seWZpbGwnO1xuaW1wb3J0IHsgUmVuZGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIHJ1biBkaXJlY3RseSBmcm9tIG5vZGVcbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogJHtwcm9jZXNzLmFyZ3ZbMF19IDxzZXJ2ZXItZW50cnlwb2ludD5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG4gIHNlcnZlKGVudHJ5cG9pbnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXJ2ZShlbnRyeXBvaW50OiBzdHJpbmcpIHtcbiAgY29uc3QgUE9SVCA9IHByb2Nlc3MuZW52LlBPUlQgfHwgODA4MDtcblxuICBjb25zdCBsb2FkZXIgPSBvcmEoJ0luaXRpYWxpemluZycpLnN0YXJ0KCk7XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gZ2V0TWFuaWZlc3RQYXRoRnJvbVdlYnBhY2tjb25maWcoKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeShkaXNrRnMucmVhZEZpbGUpO1xuICBsZXQgc2VydmVyOiBTZXJ2ZXIgfCB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gaGFuZGxlRXJyb3JzPFxuICAgIEYgZXh0ZW5kcyAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+LFxuICA+KGZuOiBGKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICAgIG5leHQ6IE5leHRGdW5jdGlvbixcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbihyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIG5leHQoeCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIFN0YXJ0IHRoZSBleHByZXNzIHNlcnZlciBhZnRlciB0aGUgZmlyc3QgY29tcGlsYXRpb25cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChjbGllbnRNYW5pZmVzdDogd2VicGFjay5TdGF0c0NvbXBpbGF0aW9uKSB7XG4gICAgbG9hZGVyLmluZm8oJ0xhdW5jaGluZyBzZXJ2ZXInKTtcbiAgICBpZiAoIWNsaWVudE1hbmlmZXN0KSB7XG4gICAgICBsb2FkZXIuZmFpbCgnTWFuaWZlc3Qgbm90IGZvdW5kJyk7XG4gICAgICAvLyBUT0RPOiBoYW5kbGUgbW9yZSBncmFjZWZ1bGx5XG4gICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwaW5nQXBwID0gZXhwcmVzcygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIC8vQHRzLWlnbm9yZVxuICAgIHdyYXBwaW5nQXBwLnVzZShjb21wcmVzcygpKTtcblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGFzc2V0Um91dGUgPSBhc3luYyAocmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLCByZXM6IGFueSkgPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICByZXEudXJsPy5zdWJzdHIoKHByb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEggYXMgc3RyaW5nKS5sZW5ndGgpID8/XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKGNsaWVudE1hbmlmZXN0Lm91dHB1dFBhdGggPz8gJycsIGZpbGVuYW1lKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoYXNzZXRQYXRoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgcmVzLmNvbnRlbnRUeXBlKGZpbGVuYW1lKTtcbiAgICAgICAgcmVzLnNlbmQoZmlsZUNvbnRlbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwNCk7XG4gICAgICAgIHJlcy5zZW5kKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfTtcbiAgICB3cmFwcGluZ0FwcC5nZXQoYCR7cHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSH0qYCwgYXNzZXRSb3V0ZSk7XG5cbiAgICAvLyBTRVJWRVIgU0lERSBSRU5ERVJJTkdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgIGNvbnN0IHJlbmRlcjogUmVuZGVyID0gcmVxdWlyZShwYXRoLmpvaW4oXG4gICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgZW50cnlwb2ludCxcbiAgICApKS5kZWZhdWx0O1xuICAgIHdyYXBwaW5nQXBwLmdldChcbiAgICAgICcvKicsXG4gICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICBpZiAocmVxLnVybC5lbmRzV2l0aCgnZmF2aWNvbi5pY28nKSkge1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICByZXMuc2VuZCgnbm90IGZvdW5kJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5zb2NrZXQub24oJ2Vycm9yJywgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmF0YWwnLCBlcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHJlbmRlcihjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHNlcnZlciA9IHdyYXBwaW5nQXBwXG4gICAgICAubGlzdGVuKFBPUlQsICgpID0+IHtcbiAgICAgICAgbG9hZGVyLmluZm8oYExpc3RlbmluZyBhdCAke1BPUlR9Li4uYCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5zeXNjYWxsICE9PSAnbGlzdGVuJykge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzUGlwZSA9IChwb3J0T3JQaXBlOiBzdHJpbmcgfCBudW1iZXIpID0+XG4gICAgICAgICAgTnVtYmVyLmlzTmFOKHBvcnRPclBpcGUpO1xuICAgICAgICBjb25zdCBiaW5kID0gaXNQaXBlKFBPUlQpID8gJ1BpcGUgJyArIFBPUlQgOiAnUG9ydCAnICsgUE9SVDtcbiAgICAgICAgc3dpdGNoIChlcnJvci5jb2RlKSB7XG4gICAgICAgICAgY2FzZSAnRUFDQ0VTJzpcbiAgICAgICAgICAgIGxvYWRlci5mYWlsKGJpbmQgKyAnIHJlcXVpcmVzIGVsZXZhdGVkIHByaXZpbGVnZXMnKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgICAgICBjYXNlICdFQUREUklOVVNFJzpcbiAgICAgICAgICAgIGxvYWRlci5mYWlsKGJpbmQgKyAnIGlzIGFscmVhZHkgaW4gdXNlJyk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gIGluaXRpYWxpemVBcHAocmVxdWlyZShtYW5pZmVzdFBhdGgpKTtcblxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgbG9hZGVyLndhcm4oJ1JlY2VpdmVkIFNJR0lOVCwgZGV2c2VydmVyIHNodXR0aW5nIGRvd24nKTtcbiAgICBpZiAoc2VydmVyKSBjb25zb2xlLmxvZygnQ2xvc2luZyBzZXJ2ZXInKTtcbiAgICBzZXJ2ZXI/LmNsb3NlKCgpID0+IHtcbiAgICAgIGxvYWRlci5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmlmZXN0UGF0aEZyb21XZWJwYWNrY29uZmlnKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnOiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb24gPSByZXF1aXJlKHJlcXVpcmUucmVzb2x2ZShcbiAgICAvLyBUT0RPOiB1c2Ugbm9ybWFsIHJlc29sdXRpb24gYWxnb3JpdGhtIHRvIGZpbmQgd2VicGFjayBmaWxlXG4gICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZycpLFxuICApKSh7fSwgeyBtb2RlOiAncHJvZHVjdGlvbicgfSk7XG4gIGNvbnN0IG1hbmlmZXN0RmlsZW5hbWU6IHN0cmluZyA9XG4gICAgKFxuICAgICAgd2VicGFja0NvbmZpZz8ucGx1Z2lucz8uZmluZChwbHVnaW4gPT4ge1xuICAgICAgICByZXR1cm4gcGx1Z2luLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdTdGF0c1dyaXRlclBsdWdpbic7XG4gICAgICB9KSBhcyBhbnlcbiAgICApPy5vcHRzPy5maWxlbmFtZSA/PyAnbWFuaWZlc3QuanNvbic7XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKFxuICAgIHdlYnBhY2tDb25maWc/Lm91dHB1dD8ucGF0aCA/PyAnJyxcbiAgICBtYW5pZmVzdEZpbGVuYW1lLFxuICApO1xuICByZXR1cm4gbWFuaWZlc3RQYXRoO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFHQTtBQUNBLElBQUlBLE9BQU8sQ0FBQ0MsSUFBUixLQUFpQkMsTUFBckIsRUFBNkI7RUFDM0IsTUFBTUMsVUFBVSxHQUFHQyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiLENBQW5COztFQUVBLElBQUksQ0FBQ0YsVUFBTCxFQUFpQjtJQUNmRyxPQUFPLENBQUNDLEdBQVIsQ0FBYSxVQUFTSCxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiLENBQWdCLHNCQUF0QztJQUNBRCxPQUFPLENBQUNJLElBQVIsQ0FBYSxDQUFDLENBQWQ7RUFDRDs7RUFDREMsS0FBSyxDQUFDTixVQUFELENBQUw7QUFDRDs7QUFFYyxTQUFTTSxLQUFULENBQWVOLFVBQWYsRUFBbUM7RUFDaEQsTUFBTU8sSUFBSSxHQUFHTixPQUFPLENBQUNPLEdBQVIsQ0FBWUQsSUFBWixJQUFv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
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import 'cross-fetch/polyfill';
3
+ export default function startDevServer(entrypoint: string, env?: Record<string, unknown>): void;
4
+ //# sourceMappingURL=startDevserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAiBA,OAAO,sBAAsB,CAAC;AAiB9B,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,QA0NlC"}