@anansi/core 0.14.32 → 0.14.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
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.14.34](https://github.com/ntucker/anansi/compare/@anansi/core@0.14.33...@anansi/core@0.14.34) (2022-11-08)
7
+
8
+ ### 📦 Package
9
+
10
+ * Update JS test packages to ^29.3.0 ([#1746](https://github.com/ntucker/anansi/issues/1746)) ([33a1331](https://github.com/ntucker/anansi/commit/33a1331bb1e595727fcaeaf7ac06b83122f34ca2))
11
+
12
+ ### [0.14.33](https://github.com/ntucker/anansi/compare/@anansi/core@0.14.32...@anansi/core@0.14.33) (2022-11-06)
13
+
14
+ ### 💅 Enhancement
15
+
16
+ * Better streaming SSR support ([9bc8c77](https://github.com/ntucker/anansi/commit/9bc8c77747b7e111038b75316b4d3216afb1289f))
17
+
18
+ ### 📦 Package
19
+
20
+ * Update babel packages ([#1736](https://github.com/ntucker/anansi/issues/1736)) ([2ec01f5](https://github.com/ntucker/anansi/commit/2ec01f585dc90f5d366e7d1626a3f8b1cf7b752c))
21
+
6
22
  ### [0.14.32](https://github.com/ntucker/anansi/compare/@anansi/core@0.14.31...@anansi/core@0.14.32) (2022-11-03)
7
23
 
8
24
  **Note:** Version bump only for package @anansi/core
package/dist/client.js CHANGED
@@ -92,12 +92,11 @@ function restHooksSpout(options = {
92
92
  getManagers: () => [new core_namespaceObject.NetworkManager()]
93
93
  }) {
94
94
  return next => async props => {
95
- var _props$initData;
96
- const data = (_props$initData = props.initData) == null ? void 0 : _props$initData.resthooks;
95
+ const nextProps = await next(props);
96
+ const data = await props.getInitialData('resthooks');
97
97
  if ( true && !data) {
98
98
  console.error('Rest Hooks init data not found');
99
99
  }
100
- const nextProps = await next(props);
101
100
  return {
102
101
  ...nextProps,
103
102
  app: /*#__PURE__*/external_react_default().createElement(core_namespaceObject.CacheProvider, {
@@ -106,7 +105,7 @@ function restHooksSpout(options = {
106
105
  __self: this,
107
106
  __source: {
108
107
  fileName: _jsxFileName,
109
- lineNumber: 27,
108
+ lineNumber: 21,
110
109
  columnNumber: 9
111
110
  }
112
111
  }, nextProps.app)
@@ -169,22 +168,34 @@ function JSONSpout({
169
168
  id = 'anansi-json'
170
169
  } = {}) {
171
170
  return next => async props => {
172
- const initData = getDatafromDOM(id);
171
+ const getInitialData = key => {
172
+ const globalId = `${id}.${key}`;
173
+ return new Promise((resolve, reject) => {
174
+ let el;
175
+ if (el = document.getElementById(globalId)) {
176
+ resolve(getDataFromEl(el, globalId));
177
+ return;
178
+ }
179
+ document.addEventListener('DOMContentLoaded', () => {
180
+ el = document.getElementById(globalId);
181
+ if (el) resolve(getDataFromEl(el, globalId));else reject(new Error(`failed to find DOM with ${key} state`));
182
+ });
183
+ });
184
+ };
173
185
  return {
174
186
  ...(await next({
175
187
  ...props,
176
- initData
188
+ getInitialData
177
189
  })),
178
- initData
190
+ getInitialData
179
191
  };
180
192
  };
181
193
  }
182
- function getDatafromDOM(id) {
183
- const element = document.querySelector(`#${id}`);
184
- if (element && element.text === undefined) {
185
- console.error(`#${id} is completely empty. This could be due to CSP issues.`);
194
+ function getDataFromEl(el, key) {
195
+ if (el.text === undefined) {
196
+ console.error(`#${key} is completely empty. This could be due to CSP issues.`);
186
197
  }
187
- return element != null && element.text ? JSON.parse(element == null ? void 0 : element.text) : undefined;
198
+ return el != null && el.text ? JSON.parse(el == null ? void 0 : el.text) : undefined;
188
199
  }
189
200
  ;// CONCATENATED MODULE: ./src/spouts/app.tsx
190
201
  const appSpout = app => props => Promise.resolve({
@@ -1 +1 @@
1
- {"version":3,"file":"client.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;AAEA;AAIA;AAAA;AACA;AACA;AAAA;AAAA;AAEA;AACA;;ACNA;AAIA;AACA;AAEA;AACA;AACA;;ACdA;;;ACAA;;;;ACAA;AASA;AAGA;AAAA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;;AChCA;;ACAA;;;ACAA;AACA;AACA;AAKA;AAaA;AAGA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AClDA;AACA;AACA;AAIA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;;ACrBA;AAGA;AAAA;AAAA;AAEA;;ACLA;AACA;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/client\"","/home/ntucker/src/anansi/packages/core/src/floodSpouts.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/document.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"react\"","/home/ntucker/src/anansi/packages/core/external commonjs \"@rest-hooks/core\"","/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.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.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/json.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/app.tsx","/home/ntucker/src/anansi/packages/core/src/index.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/client\");","import { hydrateRoot } from 'react-dom/client';\n\nexport default async function floodSpouts(\n spouts: (props: Record<string, unknown>) => Promise<{\n app: JSX.Element;\n }>,\n { rootId = 'anansi-root' }: { rootId?: string } = {},\n) {\n const { app } = await spouts({});\n\n hydrateRoot(document.getElementById(rootId) ?? document, app);\n}\n","import React from 'react';\nimport type { Route } from '@anansi/router';\n\nimport type { ClientSpout } from './types';\n\nexport default function documentSpout(options: {\n head?: React.ReactNode;\n title: string;\n}): ClientSpout {\n return next => async props => {\n const nextProps = await next(props);\n\n return nextProps;\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/core\");","import {\n CacheProvider,\n Manager,\n NetworkManager,\n State,\n} from '@rest-hooks/core';\n\nimport type { ClientSpout } from './types';\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n): ClientSpout<{ initData: Record<string, unknown> }> {\n return next => async props => {\n const data = props.initData?.resthooks as State<unknown>;\n\n if (process.env.NODE_ENV !== 'production' && !data) {\n console.error('Rest Hooks init data not found');\n }\n\n const nextProps = await next(props);\n\n return {\n ...nextProps,\n app: (\n <CacheProvider initialState={data} managers={options.getManagers()}>\n {nextProps.app}\n </CacheProvider>\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 { createBrowserHistory } from 'history';\nimport type { Update } from 'history';\n\nimport type { CreateRouter, ClientSpout } from './types';\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n onChange?: (update: Update, callback: () => void | undefined) => void;\n}): ClientSpout<\n Record<string, unknown>,\n {\n matchedRoutes: Route<ResolveWith, any>[];\n } & {\n router: RouteController<Route<ResolveWith, any>>;\n }\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\n router={router}\n resolveWith={resolveWith}\n onChange={options.onChange}\n >\n {children}\n </RouteProvider>\n );\n };\n\n return next => async props => {\n const history = createBrowserHistory();\n const router = options.createRouter(history);\n const matchedRoutes = router.getMatchedRoutes(history.location.pathname);\n\n const nextProps = await next({ ...props, matchedRoutes, router });\n\n const Router = createRouteComponent(router);\n return {\n ...nextProps,\n matchedRoutes,\n router,\n app: <Router>{nextProps.app}</Router>,\n };\n };\n}\n","import type { ClientSpout } from './types';\n\nexport default function JSONSpout({\n id = 'anansi-json',\n}: { id?: string } = {}): ClientSpout<\n Record<string, unknown>,\n { initData: Record<string, unknown> }\n> {\n return next => async props => {\n const initData = getDatafromDOM(id);\n return { ...(await next({ ...props, initData })), initData };\n };\n}\nfunction getDatafromDOM(id: string): Record<string, unknown> {\n const element: HTMLScriptElement | null = document.querySelector(`#${id}`);\n if (element && element.text === undefined) {\n console.error(\n `#${id} is completely empty. This could be due to CSP issues.`,\n );\n }\n return element?.text ? JSON.parse(element?.text) : undefined;\n}\n","const appSpout =\n (app: JSX.Element) =>\n <P extends Record<string, unknown>>(props: P) =>\n Promise.resolve({ ...props, app });\n\nexport default appSpout;\n","export { default as floodSpouts } from './floodSpouts';\nexport { default as documentSpout } from './spouts/document';\nexport { default as restHooksSpout } from './spouts/restHooks';\nexport { default as routerSpout } from './spouts/router';\nexport { default as JSONSpout } from './spouts/json';\nexport { default as appSpout } from './spouts/app';\nexport type { ServerProps } from './spouts/types';\nexport type { ClientSpout as Spout } from './spouts/types';\n"],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"client.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;AAEA;AAIA;AAAA;AACA;AACA;AAAA;AAAA;AAEA;AACA;;ACNA;AAIA;AACA;AAEA;AACA;AACA;;ACdA;;;ACAA;;;;ACAA;AAIA;AAGA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;;AC1BA;;ACAA;;;ACAA;AACA;AACA;AAKA;AAaA;AAGA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AAEA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;;AClDA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;;ACnCA;AAGA;AAAA;AAAA;AAEA;;ACLA;AACA;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/client\"","/home/ntucker/src/anansi/packages/core/src/floodSpouts.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/document.tsx","/home/ntucker/src/anansi/packages/core/external commonjs \"react\"","/home/ntucker/src/anansi/packages/core/external commonjs \"@rest-hooks/core\"","/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.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.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/json.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/app.tsx","/home/ntucker/src/anansi/packages/core/src/index.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/client\");","import { hydrateRoot } from 'react-dom/client';\n\nexport default async function floodSpouts(\n spouts: (props: Record<string, unknown>) => Promise<{\n app: JSX.Element;\n }>,\n { rootId = 'anansi-root' }: { rootId?: string } = {},\n) {\n const { app } = await spouts({});\n\n hydrateRoot(document.getElementById(rootId) ?? document, app);\n}\n","import React from 'react';\nimport type { Route } from '@anansi/router';\n\nimport type { ClientSpout } from './types';\n\nexport default function documentSpout(options: {\n head?: React.ReactNode;\n title: string;\n}): ClientSpout {\n return next => async props => {\n const nextProps = await next(props);\n\n return nextProps;\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/core\");","import { CacheProvider, Manager, NetworkManager } from '@rest-hooks/core';\n\nimport type { ClientSpout } from './types';\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n): ClientSpout<{ getInitialData: (key: string) => Promise<any> }> {\n return next => async props => {\n const nextProps = await next(props);\n const data = await props.getInitialData('resthooks');\n\n if (process.env.NODE_ENV !== 'production' && !data) {\n console.error('Rest Hooks init data not found');\n }\n\n return {\n ...nextProps,\n app: (\n <CacheProvider initialState={data} managers={options.getManagers()}>\n {nextProps.app}\n </CacheProvider>\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 { createBrowserHistory } from 'history';\nimport type { Update } from 'history';\n\nimport type { CreateRouter, ClientSpout } from './types';\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n onChange?: (update: Update, callback: () => void | undefined) => void;\n}): ClientSpout<\n Record<string, unknown>,\n {\n matchedRoutes: Route<ResolveWith, any>[];\n } & {\n router: RouteController<Route<ResolveWith, any>>;\n }\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\n router={router}\n resolveWith={resolveWith}\n onChange={options.onChange}\n >\n {children}\n </RouteProvider>\n );\n };\n\n return next => async props => {\n const history = createBrowserHistory();\n const router = options.createRouter(history);\n const matchedRoutes = router.getMatchedRoutes(history.location.pathname);\n\n const nextProps = await next({ ...props, matchedRoutes, router });\n\n const Router = createRouteComponent(router);\n return {\n ...nextProps,\n matchedRoutes,\n router,\n app: <Router>{nextProps.app}</Router>,\n };\n };\n}\n","import type { ClientSpout } from './types';\n\nexport default function JSONSpout({\n id = 'anansi-json',\n}: { id?: string } = {}): ClientSpout<\n Record<string, unknown>,\n { getInitialData: (key: string) => Promise<any> }\n> {\n return next => async props => {\n const getInitialData = (key: string) => {\n const globalId = `${id}.${key}`;\n return new Promise<any>((resolve, reject) => {\n let el: HTMLScriptElement | null;\n if ((el = document.getElementById(globalId) as any)) {\n resolve(getDataFromEl(el, globalId));\n return;\n }\n document.addEventListener('DOMContentLoaded', () => {\n el = document.getElementById(globalId) as any;\n if (el) resolve(getDataFromEl(el, globalId));\n else reject(new Error(`failed to find DOM with ${key} state`));\n });\n });\n };\n return { ...(await next({ ...props, getInitialData })), getInitialData };\n };\n}\n\nfunction getDataFromEl(el: HTMLScriptElement, key: string) {\n if (el.text === undefined) {\n console.error(\n `#${key} is completely empty. This could be due to CSP issues.`,\n );\n }\n return el?.text ? JSON.parse(el?.text) : undefined;\n}\n","const appSpout =\n (app: JSX.Element) =>\n <P extends Record<string, unknown>>(props: P) =>\n Promise.resolve({ ...props, app });\n\nexport default appSpout;\n","export { default as floodSpouts } from './floodSpouts';\nexport { default as documentSpout } from './spouts/document';\nexport { default as restHooksSpout } from './spouts/restHooks';\nexport { default as routerSpout } from './spouts/router';\nexport { default as JSONSpout } from './spouts/json';\nexport { default as appSpout } from './spouts/app';\nexport type { ServerProps } from './spouts/types';\nexport type { ClientSpout as Spout } from './spouts/types';\n"],"names":[],"sourceRoot":""}
package/dist/server.js CHANGED
@@ -69,7 +69,7 @@ var external_crypto_default = /*#__PURE__*/__webpack_require__.n(external_crypto
69
69
 
70
70
 
71
71
  function laySpouts(spouts, {
72
- timeoutMS = 200,
72
+ timeoutMS = 10000,
73
73
  onError
74
74
  } = {}) {
75
75
  const render = async (clientManifest, req, res) => {
@@ -342,44 +342,8 @@ function childrenAssets(chunk) {
342
342
  }
343
343
  ;// CONCATENATED MODULE: external "@rest-hooks/core"
344
344
  const core_namespaceObject = require("@rest-hooks/core");
345
- ;// CONCATENATED MODULE: external "rest-hooks"
346
- const external_rest_hooks_namespaceObject = require("rest-hooks");
347
- ;// CONCATENATED MODULE: external "redux"
348
- const external_redux_namespaceObject = require("redux");
349
- ;// CONCATENATED MODULE: ./src/spouts/rhHelp.tsx
350
- var rhHelp_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/rhHelp.tsx";
351
-
352
-
353
-
354
-
355
-
356
- // TODO: Rework this and upstream to rest hooks
357
- function createPersistedStore(managers) {
358
- var _managers;
359
- const controller = new core_namespaceObject.Controller();
360
- managers = (_managers = managers) != null ? _managers : [new core_namespaceObject.NetworkManager()];
361
- const reducer = (0,core_namespaceObject.createReducer)(controller);
362
- const enhancer = (0,external_redux_namespaceObject.applyMiddleware)(...(0,core_namespaceObject.applyManager)(managers, controller), external_rest_hooks_namespaceObject.PromiseifyMiddleware);
363
- const store = (0,external_redux_namespaceObject.createStore)(reducer, core_namespaceObject.initialState, enhancer);
364
- managers.forEach(manager => manager.init == null ? void 0 : manager.init(store.getState()));
365
- const selector = state => state;
366
- function ServerCacheProvider({
367
- children
368
- }) {
369
- return /*#__PURE__*/external_react_default().createElement(external_rest_hooks_namespaceObject.ExternalCacheProvider, {
370
- store: store,
371
- selector: selector,
372
- controller: controller,
373
- __self: this,
374
- __source: {
375
- fileName: rhHelp_jsxFileName,
376
- lineNumber: 27,
377
- columnNumber: 7
378
- }
379
- }, children);
380
- }
381
- return [ServerCacheProvider, controller, store];
382
- }
345
+ ;// CONCATENATED MODULE: external "@rest-hooks/ssr"
346
+ const ssr_namespaceObject = require("@rest-hooks/ssr");
383
347
  ;// CONCATENATED MODULE: ./src/spouts/restHooks.server.tsx
384
348
  var restHooks_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.server.tsx";
385
349
 
@@ -388,8 +352,9 @@ var restHooks_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/s
388
352
  function restHooksSpout(options = {
389
353
  getManagers: () => [new core_namespaceObject.NetworkManager()]
390
354
  }) {
355
+ const managers = options.getManagers();
391
356
  return next => async props => {
392
- const [ServerCacheProvider, controller, store] = createPersistedStore(options.getManagers());
357
+ const [ServerCacheProvider, useReadyCacheState, controller, store] = (0,ssr_namespaceObject.createPersistedStore)(managers);
393
358
  const nextProps = await next({
394
359
  ...props,
395
360
  controller,
@@ -399,13 +364,13 @@ function restHooksSpout(options = {
399
364
  ...nextProps,
400
365
  initData: {
401
366
  ...nextProps.initData,
402
- resthooks: () => store.getState()
367
+ resthooks: useReadyCacheState
403
368
  },
404
369
  app: /*#__PURE__*/external_react_default().createElement(ServerCacheProvider, {
405
370
  __self: this,
406
371
  __source: {
407
372
  fileName: restHooks_server_jsxFileName,
408
- lineNumber: 33,
373
+ lineNumber: 32,
409
374
  columnNumber: 12
410
375
  }
411
376
  }, nextProps.app),
@@ -495,67 +460,53 @@ function JSONSpout({
495
460
  id = 'anansi-json'
496
461
  } = {}) {
497
462
  return next => async props => {
498
- var _nextProps$scripts;
463
+ var _nextProps$scripts, _nextProps$initData;
499
464
  const nextProps = await next(props);
500
465
  const scripts = (_nextProps$scripts = nextProps.scripts) != null ? _nextProps$scripts : [];
501
- /*
502
- Object.entries(nextProps.initData ?? {}).forEach(([key, data]) => {
466
+ Object.entries((_nextProps$initData = nextProps.initData) != null ? _nextProps$initData : {}).forEach(([key, useData]) => {
467
+ const globalId = `${id}.${key}`;
468
+ const Script = () => {
469
+ const data = useData();
503
470
  try {
504
471
  const encoded = JSON.stringify(data);
505
- scripts.push(
506
- <script
507
- key={key}
508
- id={`${id}-${key}`}
509
- type="application/json"
510
- dangerouslySetInnerHTML={{
511
- __html: encoded,
512
- }}
513
- nonce={props.nonce}
514
- />,
515
- );
472
+ return /*#__PURE__*/external_react_default().createElement("script", {
473
+ id: globalId,
474
+ type: "application/json",
475
+ dangerouslySetInnerHTML: {
476
+ __html: encoded
477
+ },
478
+ nonce: props.nonce,
479
+ __self: this,
480
+ __source: {
481
+ fileName: json_server_jsxFileName,
482
+ lineNumber: 29,
483
+ columnNumber: 13
484
+ }
485
+ });
516
486
  } catch (e) {
517
487
  // TODO: Use unified logging
488
+ console.error(`Error serializing json for ${key}`);
518
489
  console.error(e);
490
+ return null;
519
491
  }
520
- });*/
521
- const Script = () => {
522
- try {
523
- var _nextProps$initData;
524
- const data = {};
525
- Object.entries((_nextProps$initData = nextProps.initData) != null ? _nextProps$initData : {}).forEach(([key, getData]) => {
526
- data[key] = getData();
527
- });
528
- const encoded = JSON.stringify(data);
529
- return /*#__PURE__*/external_react_default().createElement("script", {
530
- key: id,
531
- id: id,
532
- type: "application/json",
533
- dangerouslySetInnerHTML: {
534
- __html: encoded
535
- },
536
- nonce: props.nonce,
537
- __self: this,
538
- __source: {
539
- fileName: json_server_jsxFileName,
540
- lineNumber: 49,
541
- columnNumber: 11
542
- }
543
- });
544
- } catch (e) {
545
- // TODO: Use unified logging
546
- console.error('Error serializing json');
547
- console.error(e);
548
- return null;
549
- }
550
- };
551
- scripts.push( /*#__PURE__*/external_react_default().createElement(Script, {
552
- __self: this,
553
- __source: {
554
- fileName: json_server_jsxFileName,
555
- lineNumber: 66,
556
- columnNumber: 18
557
- }
558
- }));
492
+ };
493
+ scripts.push( /*#__PURE__*/external_react_default().createElement(external_react_namespaceObject.Suspense, {
494
+ key: globalId,
495
+ __self: this,
496
+ __source: {
497
+ fileName: json_server_jsxFileName,
498
+ lineNumber: 46,
499
+ columnNumber: 9
500
+ }
501
+ }, /*#__PURE__*/external_react_default().createElement(Script, {
502
+ __self: this,
503
+ __source: {
504
+ fileName: json_server_jsxFileName,
505
+ lineNumber: 47,
506
+ columnNumber: 11
507
+ }
508
+ })));
509
+ });
559
510
  return {
560
511
  ...nextProps,
561
512
  scripts
@@ -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;;;ACAA;AACA;AAKA;AAKA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;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;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;;;ACIA;AACA;AACA;AAEA;;AAIA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAEA;;;;;ACvBA;AAcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AACA;;;ACpFA;AAMA;AAQA;AAOA;AAAA;AACA;AAEA;AAEA;;AAMA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AAAA;AAGA;AAAA;AAEA;AACA;AACA;;AAIA;AACA;AAQA;AAAA;AAAA;AAEA;AAAA;AAAA;AACA;AAAA;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAGA;;ACjGA;;ACAA;;ACAA;;;;ACAA;AACA;AAQA;;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AAIA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;;;;ACpCA;AAGA;AAGA;AAGA;AAAA;AAMA;AACA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;;ACAA;;;ACAA;AACA;AACA;AAIA;AAYA;AAGA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAEA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AAWA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrCA;AASA;AACA;AACA;AAKA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AAGA;AAAA;AAAA;AAEA;;ACPA;AACA;AACA;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/external node-commonjs \"crypto\"","/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/csp.ts","/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\"","/home/ntucker/src/anansi/packages/core/external commonjs \"redux\"","/home/ntucker/src/anansi/packages/core/src/spouts/rhHelp.tsx","/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/spouts/json.server.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/app.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\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"crypto\");","import { renderToPipeableStream as reactRender } from 'react-dom/server';\nimport crypto from 'crypto';\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 {\n timeoutMS = 200,\n onError,\n }: { timeoutMS?: number; onError?: (error: unknown) => void } = {},\n) {\n const render: Render = async (clientManifest, req, res) => {\n const nonce = crypto.randomBytes(16).toString('base64');\n\n try {\n const { app } = await spouts({ clientManifest, req, res, nonce });\n\n let didError = false;\n const { pipe, abort } = reactRender(app, {\n nonce,\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(e: any) {\n didError = true;\n console.error(e);\n res.statusCode = 500;\n //pipe(res); Removing this avoids, \"React currently only supports piping to one writable stream.\"\n if (onError) onError(e);\n },\n });\n // Abandon and switch to client rendering if enough time passes.\n // Try lowering this to see the client recover.\n setTimeout(\n () => (abort as any)(`Timeout of ${timeoutMS}ms exceeded`),\n timeoutMS,\n );\n } catch (e: unknown) {\n if (onError) onError(e);\n throw e;\n }\n };\n return render;\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","export interface Policy {\n [directive: string]: string | string[];\n}\n\n// TODO: memoize this\nexport function buildPolicy(policyObj: Policy) {\n return Object.keys(policyObj)\n .map(key => {\n const val = Array.isArray(policyObj[key])\n ? [...new Set(policyObj[key]).values()].filter(v => v).join(' ')\n : policyObj[key];\n\n // move strict dynamic to the end of the policy if it exists to be backwards compatible with csp2\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#strict-dynamic\n if (typeof val === 'string' && val.includes(\"'strict-dynamic'\")) {\n const newVal = `${val\n .replace(/\\s?'strict-dynamic'\\s?/gi, ' ')\n .trim()} 'strict-dynamic'`;\n return `${key} ${newVal}`;\n }\n\n return `${key} ${val}`;\n })\n .join('; ');\n}\n","import type { Policy } from './csp';\nimport { buildPolicy } from './csp';\n\ntype Props = {\n children: React.ReactNode;\n assets: { href: string; as?: string; rel?: string }[];\n head: React.ReactNode;\n scripts: React.ReactNode;\n title: string;\n rootId: string;\n charSet: string;\n csPolicy?: Policy;\n nonce?: string | undefined;\n};\n\nexport default function Document({\n assets,\n head,\n children,\n title,\n rootId,\n charSet,\n csPolicy,\n nonce,\n scripts,\n}: Props) {\n let cspMeta: null | React.ReactNode = null;\n if (csPolicy) {\n // add nonce to policy\n const policy = {\n ...csPolicy,\n };\n if (\n nonce &&\n // nonces negate 'unsafe-inline' so do not add it if that directive exists\n (!policy['script-src'] ||\n !policy['script-src'].includes(\"'unsafe-inline'\"))\n ) {\n if (typeof policy['script-src'] === 'string') {\n policy['script-src'] = [policy['script-src'], `'nonce-${nonce}'`];\n } else {\n policy['script-src'] = [...policy['script-src'], `'nonce-${nonce}'`];\n }\n }\n cspMeta = (\n <meta httpEquiv=\"Content-Security-Policy\" content={buildPolicy(policy)} />\n );\n }\n return (\n <html>\n <head>\n <meta charSet={charSet} />\n {cspMeta}\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 {scripts}\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 scripts: null,\n};\n","import React from 'react';\nimport type { Route } from '@anansi/router';\nimport { StatsChunkGroup } from 'webpack';\n\nimport type { ServerSpout } from './types';\nimport type { Policy } from './csp';\nimport Document from './DocumentComponent';\n\ntype NeededNext = {\n matchedRoutes: Route<any>[];\n title?: string;\n scripts?: React.ReactNode[];\n};\n\nexport default function DocumentSpout(options: {\n head?: React.ReactNode;\n title: string;\n rootId?: string;\n charSet?: string;\n csPolicy?: Policy;\n}): ServerSpout<Record<string, unknown>, Record<string, unknown>, NeededNext> {\n return next => async props => {\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 nonce={props.nonce}\n csPolicy={options.csPolicy}\n scripts={nextProps.scripts}\n >\n {nextProps.app}\n </Document>\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\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"redux\");","import { ExternalCacheProvider, PromiseifyMiddleware } from 'rest-hooks';\nimport {\n Controller,\n createReducer,\n initialState,\n Manager,\n applyManager,\n NetworkManager,\n} from '@rest-hooks/core';\nimport { createStore, applyMiddleware } from 'redux';\n\n// TODO: Rework this and upstream to rest hooks\nexport function createPersistedStore(managers?: Manager[]) {\n const controller = new Controller();\n managers = managers ?? [new NetworkManager()];\n const reducer = createReducer(controller);\n const enhancer = applyMiddleware(\n ...applyManager(managers, controller),\n PromiseifyMiddleware as any,\n );\n const store = createStore(reducer, initialState as any, enhancer);\n managers.forEach(manager => manager.init?.(store.getState()));\n\n const selector = (state: any) => state;\n function ServerCacheProvider({ children }: { children: React.ReactNode }) {\n return (\n <ExternalCacheProvider\n store={store}\n selector={selector}\n controller={controller}\n >\n {children}\n </ExternalCacheProvider>\n );\n }\n return [ServerCacheProvider, controller, store] as const;\n}\n","import { Controller, Manager, NetworkManager, State } from '@rest-hooks/core';\nimport type { Store } from 'redux';\n\nimport { createPersistedStore } from './rhHelp';\nimport type { ServerSpout } from './types';\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n): ServerSpout<\n Record<string, unknown>,\n { controller: Controller } & { store: Store<State<unknown>> },\n { initData?: Record<string, () => unknown> }\n> {\n return next => async props => {\n const [ServerCacheProvider, controller, store] = createPersistedStore(\n options.getManagers(),\n );\n\n const nextProps = await next({\n ...props,\n controller,\n store,\n });\n\n return {\n ...nextProps,\n initData: {\n ...nextProps.initData,\n resthooks: () => store.getState(),\n },\n app: <ServerCacheProvider>{nextProps.app}</ServerCacheProvider>,\n // TODO: figure out how to only inject in next and not have to also put here\n controller,\n store,\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 { CreateRouter, ServerSpout } from './types';\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n}): ServerSpout<\n Record<string, unknown>,\n {\n matchedRoutes: Route<ResolveWith>[];\n } & {\n router: RouteController<Route<ResolveWith, any>>;\n }\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 next => async props => {\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({\n ...props,\n matchedRoutes,\n router,\n });\n\n const Router = createRouteComponent(router);\n\n return {\n ...nextProps,\n app: <Router>{nextProps.app}</Router>,\n // TODO: figure out how to only inject in next and not have to also put here\n matchedRoutes,\n router,\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 <\n RouteWith,\n N extends NeededProps<RouteWith>,\n I extends ServerProps,\n >(\n next: (props: I) => Promise<\n {\n [K in F]: RouteWith;\n } & N\n >,\n ) {\n return async (props: I) => {\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","import React from 'react';\n\nimport type { ServerSpout } from './types';\n\ntype NeededNext = {\n initData?: Record<string, () => unknown>;\n scripts?: React.ReactNode[];\n};\n\nexport default function JSONSpout({\n id = 'anansi-json',\n}: { id?: string } = {}): ServerSpout<\n Record<string, unknown>,\n Record<string, unknown>,\n NeededNext\n> {\n return next => async props => {\n const nextProps = await next(props);\n\n const scripts: React.ReactNode[] = nextProps.scripts ?? [];\n /*\n Object.entries(nextProps.initData ?? {}).forEach(([key, data]) => {\n try {\n const encoded = JSON.stringify(data);\n scripts.push(\n <script\n key={key}\n id={`${id}-${key}`}\n type=\"application/json\"\n dangerouslySetInnerHTML={{\n __html: encoded,\n }}\n nonce={props.nonce}\n />,\n );\n } catch (e) {\n // TODO: Use unified logging\n console.error(e);\n }\n });*/\n const Script = () => {\n try {\n const data: any = {};\n Object.entries(nextProps.initData ?? {}).forEach(([key, getData]) => {\n data[key] = getData();\n });\n const encoded = JSON.stringify(data);\n return (\n <script\n key={id}\n id={id}\n type=\"application/json\"\n dangerouslySetInnerHTML={{\n __html: encoded,\n }}\n nonce={props.nonce}\n />\n );\n } catch (e) {\n // TODO: Use unified logging\n console.error('Error serializing json');\n console.error(e);\n return null;\n }\n };\n scripts.push(<Script />);\n\n return {\n ...nextProps,\n scripts,\n };\n };\n}\n","import { ServerProps } from './types';\n\nconst appSpout =\n (app: JSX.Element) =>\n <P extends ServerProps>(props: P) =>\n Promise.resolve({ ...props, app });\n\nexport default appSpout;\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';\nexport { default as JSONSpout } from './spouts/json.server';\nexport { default as appSpout } from './spouts/app.server';\nexport type { ServerProps } from './spouts/types';\nexport type { ServerSpout as Spout } from './spouts/types';\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;;;ACAA;AACA;AAKA;AAKA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;AAAA;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;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;;;ACIA;AACA;AACA;AAEA;;AAIA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AAEA;;;;;ACvBA;AAcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AACA;AACA;AACA;;;ACpFA;AAMA;AAQA;AAOA;AAAA;AACA;AAEA;AAEA;;AAMA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAGA;AAAA;AAGA;AAAA;AAEA;AACA;AACA;;AAIA;AACA;AAQA;AAAA;AAAA;AAEA;AAAA;AAAA;AACA;AAAA;AAGA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA;AACA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AAGA;;ACjGA;;ACAA;;;;ACAA;AAEA;AAIA;AAGA;AAAA;AAMA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;;ACAA;;;ACAA;AACA;AACA;AAIA;AAYA;AAGA;AAAA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAEA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AAWA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACrCA;AASA;AACA;AACA;AAKA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA;AAEA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AAGA;AAAA;AAAA;AAEA;;ACPA;AACA;AACA;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/external node-commonjs \"crypto\"","/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/csp.ts","/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/spouts/json.server.tsx","/home/ntucker/src/anansi/packages/core/src/spouts/app.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\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"crypto\");","import { renderToPipeableStream as reactRender } from 'react-dom/server';\nimport crypto from 'crypto';\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 {\n timeoutMS = 10000,\n onError,\n }: { timeoutMS?: number; onError?: (error: unknown) => void } = {},\n) {\n const render: Render = async (clientManifest, req, res) => {\n const nonce = crypto.randomBytes(16).toString('base64');\n\n try {\n const { app } = await spouts({ clientManifest, req, res, nonce });\n\n let didError = false;\n const { pipe, abort } = reactRender(app, {\n nonce,\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(e: any) {\n didError = true;\n console.error(e);\n res.statusCode = 500;\n //pipe(res); Removing this avoids, \"React currently only supports piping to one writable stream.\"\n if (onError) onError(e);\n },\n });\n // Abandon and switch to client rendering if enough time passes.\n // Try lowering this to see the client recover.\n setTimeout(\n () => (abort as any)(`Timeout of ${timeoutMS}ms exceeded`),\n timeoutMS,\n );\n } catch (e: unknown) {\n if (onError) onError(e);\n throw e;\n }\n };\n return render;\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","export interface Policy {\n [directive: string]: string | string[];\n}\n\n// TODO: memoize this\nexport function buildPolicy(policyObj: Policy) {\n return Object.keys(policyObj)\n .map(key => {\n const val = Array.isArray(policyObj[key])\n ? [...new Set(policyObj[key]).values()].filter(v => v).join(' ')\n : policyObj[key];\n\n // move strict dynamic to the end of the policy if it exists to be backwards compatible with csp2\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#strict-dynamic\n if (typeof val === 'string' && val.includes(\"'strict-dynamic'\")) {\n const newVal = `${val\n .replace(/\\s?'strict-dynamic'\\s?/gi, ' ')\n .trim()} 'strict-dynamic'`;\n return `${key} ${newVal}`;\n }\n\n return `${key} ${val}`;\n })\n .join('; ');\n}\n","import type { Policy } from './csp';\nimport { buildPolicy } from './csp';\n\ntype Props = {\n children: React.ReactNode;\n assets: { href: string; as?: string; rel?: string }[];\n head: React.ReactNode;\n scripts: React.ReactNode;\n title: string;\n rootId: string;\n charSet: string;\n csPolicy?: Policy;\n nonce?: string | undefined;\n};\n\nexport default function Document({\n assets,\n head,\n children,\n title,\n rootId,\n charSet,\n csPolicy,\n nonce,\n scripts,\n}: Props) {\n let cspMeta: null | React.ReactNode = null;\n if (csPolicy) {\n // add nonce to policy\n const policy = {\n ...csPolicy,\n };\n if (\n nonce &&\n // nonces negate 'unsafe-inline' so do not add it if that directive exists\n (!policy['script-src'] ||\n !policy['script-src'].includes(\"'unsafe-inline'\"))\n ) {\n if (typeof policy['script-src'] === 'string') {\n policy['script-src'] = [policy['script-src'], `'nonce-${nonce}'`];\n } else {\n policy['script-src'] = [...policy['script-src'], `'nonce-${nonce}'`];\n }\n }\n cspMeta = (\n <meta httpEquiv=\"Content-Security-Policy\" content={buildPolicy(policy)} />\n );\n }\n return (\n <html>\n <head>\n <meta charSet={charSet} />\n {cspMeta}\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 {scripts}\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 scripts: null,\n};\n","import React from 'react';\nimport type { Route } from '@anansi/router';\nimport { StatsChunkGroup } from 'webpack';\n\nimport type { ServerSpout } from './types';\nimport type { Policy } from './csp';\nimport Document from './DocumentComponent';\n\ntype NeededNext = {\n matchedRoutes: Route<any>[];\n title?: string;\n scripts?: React.ReactNode[];\n};\n\nexport default function DocumentSpout(options: {\n head?: React.ReactNode;\n title: string;\n rootId?: string;\n charSet?: string;\n csPolicy?: Policy;\n}): ServerSpout<Record<string, unknown>, Record<string, unknown>, NeededNext> {\n return next => async props => {\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 nonce={props.nonce}\n csPolicy={options.csPolicy}\n scripts={nextProps.scripts}\n >\n {nextProps.app}\n </Document>\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 { Controller, Manager, NetworkManager, State } from '@rest-hooks/core';\nimport type { Store } from 'redux';\nimport { createPersistedStore } from '@rest-hooks/ssr';\n\nimport type { ServerSpout } from './types';\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n): ServerSpout<\n Record<string, unknown>,\n { controller: Controller } & { store: Store<State<unknown>> },\n { initData?: Record<string, () => unknown>; scripts?: React.ReactNode[] }\n> {\n const managers = options.getManagers();\n return next => async props => {\n const [ServerCacheProvider, useReadyCacheState, controller, store] =\n createPersistedStore(managers);\n\n const nextProps = await next({\n ...props,\n controller,\n store,\n });\n return {\n ...nextProps,\n initData: {\n ...nextProps.initData,\n resthooks: useReadyCacheState,\n },\n app: <ServerCacheProvider>{nextProps.app}</ServerCacheProvider>,\n // TODO: figure out how to only inject in next and not have to also put here\n controller,\n store,\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 { CreateRouter, ServerSpout } from './types';\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n}): ServerSpout<\n Record<string, unknown>,\n {\n matchedRoutes: Route<ResolveWith>[];\n } & {\n router: RouteController<Route<ResolveWith, any>>;\n }\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 next => async props => {\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({\n ...props,\n matchedRoutes,\n router,\n });\n\n const Router = createRouteComponent(router);\n\n return {\n ...nextProps,\n app: <Router>{nextProps.app}</Router>,\n // TODO: figure out how to only inject in next and not have to also put here\n matchedRoutes,\n router,\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 <\n RouteWith,\n N extends NeededProps<RouteWith>,\n I extends ServerProps,\n >(\n next: (props: I) => Promise<\n {\n [K in F]: RouteWith;\n } & N\n >,\n ) {\n return async (props: I) => {\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","import React, { Suspense } from 'react';\n\nimport type { ServerSpout } from './types';\n\ntype NeededNext = {\n initData?: Record<string, () => unknown>;\n scripts?: React.ReactNode[];\n};\n\nexport default function JSONSpout({\n id = 'anansi-json',\n}: { id?: string } = {}): ServerSpout<\n Record<string, unknown>,\n Record<string, unknown>,\n NeededNext\n> {\n return next => async props => {\n const nextProps = await next(props);\n\n const scripts: React.ReactNode[] = nextProps.scripts ?? [];\n\n Object.entries(nextProps.initData ?? {}).forEach(([key, useData]) => {\n const globalId = `${id}.${key}`;\n const Script = () => {\n const data: any = useData();\n try {\n const encoded = JSON.stringify(data);\n return (\n <script\n id={globalId}\n type=\"application/json\"\n dangerouslySetInnerHTML={{\n __html: encoded,\n }}\n nonce={props.nonce}\n />\n );\n } catch (e) {\n // TODO: Use unified logging\n console.error(`Error serializing json for ${key}`);\n console.error(e);\n return null;\n }\n };\n scripts.push(\n <Suspense key={globalId}>\n <Script />\n </Suspense>,\n );\n });\n\n return {\n ...nextProps,\n scripts,\n };\n };\n}\n","import { ServerProps } from './types';\n\nconst appSpout =\n (app: JSX.Element) =>\n <P extends ServerProps>(props: P) =>\n Promise.resolve({ ...props, app });\n\nexport default appSpout;\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';\nexport { default as JSONSpout } from './spouts/json.server';\nexport { default as appSpout } from './spouts/app.server';\nexport type { ServerProps } from './spouts/types';\nexport type { ServerSpout as Spout } from './spouts/types';\n"],"names":[],"sourceRoot":""}
@@ -1 +1 @@
1
- {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":";AAGA,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,EACE,SAAe,EACf,OAAO,GACR,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,UA4CnE"}
1
+ {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":";AAGA,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,EACE,SAAiB,EACjB,OAAO,GACR,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,UA4CnE"}
package/lib/laySpouts.js CHANGED
@@ -6,7 +6,7 @@ exports.default = laySpouts;
6
6
  var _server = require("react-dom/server");
7
7
  var _crypto = _interopRequireDefault(require("crypto"));
8
8
  function laySpouts(spouts, {
9
- timeoutMS = 200,
9
+ timeoutMS = 10000,
10
10
  onError
11
11
  } = {}) {
12
12
  const render = async (clientManifest, req, res) => {
@@ -57,4 +57,4 @@ function laySpouts(spouts, {
57
57
  };
58
58
  return render;
59
59
  }
60
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJvbkVycm9yIiwicmVuZGVyIiwiY2xpZW50TWFuaWZlc3QiLCJyZXEiLCJyZXMiLCJub25jZSIsImNyeXB0byIsInJhbmRvbUJ5dGVzIiwidG9TdHJpbmciLCJhcHAiLCJkaWRFcnJvciIsInBpcGUiLCJhYm9ydCIsInJlYWN0UmVuZGVyIiwib25TaGVsbFJlYWR5Iiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsIm9uU2hlbGxFcnJvciIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2xheVNwb3V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyVG9QaXBlYWJsZVN0cmVhbSBhcyByZWFjdFJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBSZW5kZXIgfSBmcm9tICcuL3NjcmlwdHMvdHlwZXMnO1xuaW1wb3J0IHsgU2VydmVyUHJvcHMgfSBmcm9tICcuL3Nwb3V0cy90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxheVNwb3V0cyhcbiAgc3BvdXRzOiAocHJvcHM6IFNlcnZlclByb3BzKSA9PiBQcm9taXNlPHtcbiAgICBhcHA6IEpTWC5FbGVtZW50O1xuICB9PixcbiAge1xuICAgIHRpbWVvdXRNUyA9IDIwMCxcbiAgICBvbkVycm9yLFxuICB9OiB7IHRpbWVvdXRNUz86IG51bWJlcjsgb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCB9ID0ge30sXG4pIHtcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSBhc3luYyAoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgc3BvdXRzKHsgY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzLCBub25jZSB9KTtcblxuICAgICAgbGV0IGRpZEVycm9yID0gZmFsc2U7XG4gICAgICBjb25zdCB7IHBpcGUsIGFib3J0IH0gPSByZWFjdFJlbmRlcihhcHAsIHtcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIC8vYm9vdHN0cmFwU2NyaXB0czogYXNzZXRzLmZpbHRlcihhc3NldCA9PiBhc3NldC5lbmRzV2l0aCgnLmpzJykpLFxuICAgICAgICBvblNoZWxsUmVhZHkoKSB7XG4gICAgICAgICAgLy9tYW5hZ2Vycy5mb3JFYWNoKG1hbmFnZXIgPT4gbWFuYWdlci5jbGVhbnVwKCkpO1xuICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIGJlZm9yZSB3ZSBzdGFydGVkIHN0cmVhbWluZywgd2Ugc2V0IHRoZSBlcnJvciBjb2RlIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBkaWRFcnJvciA/IDUwMCA6IDIwMDtcbiAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvblNoZWxsRXJyb3IoKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIHBpcGUocmVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcihlOiBhbnkpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgICAvL3BpcGUocmVzKTsgUmVtb3ZpbmcgdGhpcyBhdm9pZHMsIFwiUmVhY3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgcGlwaW5nIHRvIG9uZSB3cml0YWJsZSBzdHJlYW0uXCJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLy8gQWJhbmRvbiBhbmQgc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcgaWYgZW5vdWdoIHRpbWUgcGFzc2VzLlxuICAgICAgLy8gVHJ5IGxvd2VyaW5nIHRoaXMgdG8gc2VlIHRoZSBjbGllbnQgcmVjb3Zlci5cbiAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IChhYm9ydCBhcyBhbnkpKGBUaW1lb3V0IG9mICR7dGltZW91dE1TfW1zIGV4Y2VlZGVkYCksXG4gICAgICAgIHRpbWVvdXRNUyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlbmRlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBS2UsU0FBU0EsU0FBUyxDQUMvQkMsTUFFRSxFQUNGO0VBQ0VDLFNBQVMsR0FBRyxHQUFHO0VBQ2ZDO0FBQzBELENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbEU7RUFDQSxNQUFNQyxNQUFjLEdBQUcsT0FBT0MsY0FBYyxFQUFFQyxHQUFHLEVBQUVDLEdBQUcsS0FBSztJQUN6RCxNQUFNQyxLQUFLLEdBQUdDLGVBQU0sQ0FBQ0MsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBRXZELElBQUk7TUFDRixNQUFNO1FBQUVDO01BQUksQ0FBQyxHQUFHLE1BQU1YLE1BQU0sQ0FBQztRQUFFSSxjQUFjO1FBQUVDLEdBQUc7UUFBRUMsR0FBRztRQUFFQztNQUFNLENBQUMsQ0FBQztNQUVqRSxJQUFJSyxRQUFRLEdBQUcsS0FBSztNQUNwQixNQUFNO1FBQUVDLElBQUk7UUFBRUM7TUFBTSxDQUFDLEdBQUcsSUFBQUMsOEJBQVcsRUFBQ0osR0FBRyxFQUFFO1FBQ3ZDSixLQUFLO1FBQ0w7UUFDQVMsWUFBWSxHQUFHO1VBQ2I7VUFDQTtVQUNBVixHQUFHLENBQUNXLFVBQVUsR0FBR0wsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHO1VBQ3JDTixHQUFHLENBQUNZLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDO1VBQzFDTCxJQUFJLENBQUNQLEdBQUcsQ0FBQztRQUNYLENBQUM7UUFDRGEsWUFBWSxHQUFHO1VBQ2JQLFFBQVEsR0FBRyxJQUFJO1VBQ2ZOLEdBQUcsQ0FBQ1csVUFBVSxHQUFHLEdBQUc7VUFDcEJKLElBQUksQ0FBQ1AsR0FBRyxDQUFDO1FBQ1gsQ0FBQztRQUNESixPQUFPLENBQUNrQixDQUFNLEVBQUU7VUFDZFIsUUFBUSxHQUFHLElBQUk7VUFDZlMsT0FBTyxDQUFDQyxLQUFLLENBQUNGLENBQUMsQ0FBQztVQUNoQmQsR0FBRyxDQUFDVyxVQUFVLEdBQUcsR0FBRztVQUNwQjtVQUNBLElBQUlmLE9BQU8sRUFBRUEsT0FBTyxDQUFDa0IsQ0FBQyxDQUFDO1FBQ3pCO01BQ0YsQ0FBQyxDQUFDO01BQ0Y7TUFDQTtNQUNBRyxVQUFVLENBQ1IsTUFBT1QsS0FBSyxDQUFVLGNBQWFiLFNBQVUsYUFBWSxDQUFDLEVBQzFEQSxTQUFTLENBQ1Y7SUFDSCxDQUFDLENBQUMsT0FBT21CLENBQVUsRUFBRTtNQUNuQixJQUFJbEIsT0FBTyxFQUFFQSxPQUFPLENBQUNrQixDQUFDLENBQUM7TUFDdkIsTUFBTUEsQ0FBQztJQUNUO0VBQ0YsQ0FBQztFQUNELE9BQU9qQixNQUFNO0FBQ2YifQ==
60
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJvbkVycm9yIiwicmVuZGVyIiwiY2xpZW50TWFuaWZlc3QiLCJyZXEiLCJyZXMiLCJub25jZSIsImNyeXB0byIsInJhbmRvbUJ5dGVzIiwidG9TdHJpbmciLCJhcHAiLCJkaWRFcnJvciIsInBpcGUiLCJhYm9ydCIsInJlYWN0UmVuZGVyIiwib25TaGVsbFJlYWR5Iiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsIm9uU2hlbGxFcnJvciIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2xheVNwb3V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyVG9QaXBlYWJsZVN0cmVhbSBhcyByZWFjdFJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBSZW5kZXIgfSBmcm9tICcuL3NjcmlwdHMvdHlwZXMnO1xuaW1wb3J0IHsgU2VydmVyUHJvcHMgfSBmcm9tICcuL3Nwb3V0cy90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxheVNwb3V0cyhcbiAgc3BvdXRzOiAocHJvcHM6IFNlcnZlclByb3BzKSA9PiBQcm9taXNlPHtcbiAgICBhcHA6IEpTWC5FbGVtZW50O1xuICB9PixcbiAge1xuICAgIHRpbWVvdXRNUyA9IDEwMDAwLFxuICAgIG9uRXJyb3IsXG4gIH06IHsgdGltZW91dE1TPzogbnVtYmVyOyBvbkVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkIH0gPSB7fSxcbikge1xuICBjb25zdCByZW5kZXI6IFJlbmRlciA9IGFzeW5jIChjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMpID0+IHtcbiAgICBjb25zdCBub25jZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYXBwIH0gPSBhd2FpdCBzcG91dHMoeyBjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMsIG5vbmNlIH0pO1xuXG4gICAgICBsZXQgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHsgcGlwZSwgYWJvcnQgfSA9IHJlYWN0UmVuZGVyKGFwcCwge1xuICAgICAgICBub25jZSxcbiAgICAgICAgLy9ib290c3RyYXBTY3JpcHRzOiBhc3NldHMuZmlsdGVyKGFzc2V0ID0+IGFzc2V0LmVuZHNXaXRoKCcuanMnKSksXG4gICAgICAgIG9uU2hlbGxSZWFkeSgpIHtcbiAgICAgICAgICAvL21hbmFnZXJzLmZvckVhY2gobWFuYWdlciA9PiBtYW5hZ2VyLmNsZWFudXAoKSk7XG4gICAgICAgICAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgYmVmb3JlIHdlIHN0YXJ0ZWQgc3RyZWFtaW5nLCB3ZSBzZXQgdGhlIGVycm9yIGNvZGUgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IGRpZEVycm9yID8gNTAwIDogMjAwO1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2hlbGxFcnJvcigpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yKGU6IGFueSkge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIC8vcGlwZShyZXMpOyBSZW1vdmluZyB0aGlzIGF2b2lkcywgXCJSZWFjdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBwaXBpbmcgdG8gb25lIHdyaXRhYmxlIHN0cmVhbS5cIlxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGUpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvLyBBYmFuZG9uIGFuZCBzd2l0Y2ggdG8gY2xpZW50IHJlbmRlcmluZyBpZiBlbm91Z2ggdGltZSBwYXNzZXMuXG4gICAgICAvLyBUcnkgbG93ZXJpbmcgdGhpcyB0byBzZWUgdGhlIGNsaWVudCByZWNvdmVyLlxuICAgICAgc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gKGFib3J0IGFzIGFueSkoYFRpbWVvdXQgb2YgJHt0aW1lb3V0TVN9bXMgZXhjZWVkZWRgKSxcbiAgICAgICAgdGltZW91dE1TLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xuICByZXR1cm4gcmVuZGVyO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFLZSxTQUFTQSxTQUFTLENBQy9CQyxNQUVFLEVBQ0Y7RUFDRUMsU0FBUyxHQUFHLEtBQUs7RUFDakJDO0FBQzBELENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbEU7RUFDQSxNQUFNQyxNQUFjLEdBQUcsT0FBT0MsY0FBYyxFQUFFQyxHQUFHLEVBQUVDLEdBQUcsS0FBSztJQUN6RCxNQUFNQyxLQUFLLEdBQUdDLGVBQU0sQ0FBQ0MsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBRXZELElBQUk7TUFDRixNQUFNO1FBQUVDO01BQUksQ0FBQyxHQUFHLE1BQU1YLE1BQU0sQ0FBQztRQUFFSSxjQUFjO1FBQUVDLEdBQUc7UUFBRUMsR0FBRztRQUFFQztNQUFNLENBQUMsQ0FBQztNQUVqRSxJQUFJSyxRQUFRLEdBQUcsS0FBSztNQUNwQixNQUFNO1FBQUVDLElBQUk7UUFBRUM7TUFBTSxDQUFDLEdBQUcsSUFBQUMsOEJBQVcsRUFBQ0osR0FBRyxFQUFFO1FBQ3ZDSixLQUFLO1FBQ0w7UUFDQVMsWUFBWSxHQUFHO1VBQ2I7VUFDQTtVQUNBVixHQUFHLENBQUNXLFVBQVUsR0FBR0wsUUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHO1VBQ3JDTixHQUFHLENBQUNZLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDO1VBQzFDTCxJQUFJLENBQUNQLEdBQUcsQ0FBQztRQUNYLENBQUM7UUFDRGEsWUFBWSxHQUFHO1VBQ2JQLFFBQVEsR0FBRyxJQUFJO1VBQ2ZOLEdBQUcsQ0FBQ1csVUFBVSxHQUFHLEdBQUc7VUFDcEJKLElBQUksQ0FBQ1AsR0FBRyxDQUFDO1FBQ1gsQ0FBQztRQUNESixPQUFPLENBQUNrQixDQUFNLEVBQUU7VUFDZFIsUUFBUSxHQUFHLElBQUk7VUFDZlMsT0FBTyxDQUFDQyxLQUFLLENBQUNGLENBQUMsQ0FBQztVQUNoQmQsR0FBRyxDQUFDVyxVQUFVLEdBQUcsR0FBRztVQUNwQjtVQUNBLElBQUlmLE9BQU8sRUFBRUEsT0FBTyxDQUFDa0IsQ0FBQyxDQUFDO1FBQ3pCO01BQ0YsQ0FBQyxDQUFDO01BQ0Y7TUFDQTtNQUNBRyxVQUFVLENBQ1IsTUFBT1QsS0FBSyxDQUFVLGNBQWFiLFNBQVUsYUFBWSxDQUFDLEVBQzFEQSxTQUFTLENBQ1Y7SUFDSCxDQUFDLENBQUMsT0FBT21CLENBQVUsRUFBRTtNQUNuQixJQUFJbEIsT0FBTyxFQUFFQSxPQUFPLENBQUNrQixDQUFDLENBQUM7TUFDdkIsTUFBTUEsQ0FBQztJQUNUO0VBQ0YsQ0FBQztFQUNELE9BQU9qQixNQUFNO0FBQ2YifQ==
@@ -2,6 +2,6 @@ import type { ClientSpout } from './types';
2
2
  export default function JSONSpout({ id, }?: {
3
3
  id?: string;
4
4
  }): ClientSpout<Record<string, unknown>, {
5
- initData: Record<string, unknown>;
5
+ getInitialData: (key: string) => Promise<any>;
6
6
  }>;
7
7
  //# sourceMappingURL=json.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/spouts/json.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,EAAkB,GACnB,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CACtC,CAKA"}
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/spouts/json.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,EAAkB,GACnB,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB;IAAE,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;CAAE,CAClD,CAmBA"}
@@ -6,21 +6,33 @@ function JSONSpout({
6
6
  id = 'anansi-json'
7
7
  } = {}) {
8
8
  return next => async props => {
9
- const initData = getDatafromDOM(id);
9
+ const getInitialData = key => {
10
+ const globalId = `${id}.${key}`;
11
+ return new Promise((resolve, reject) => {
12
+ let el;
13
+ if (el = document.getElementById(globalId)) {
14
+ resolve(getDataFromEl(el, globalId));
15
+ return;
16
+ }
17
+ document.addEventListener('DOMContentLoaded', () => {
18
+ el = document.getElementById(globalId);
19
+ if (el) resolve(getDataFromEl(el, globalId));else reject(new Error(`failed to find DOM with ${key} state`));
20
+ });
21
+ });
22
+ };
10
23
  return {
11
24
  ...(await next({
12
25
  ...props,
13
- initData
26
+ getInitialData
14
27
  })),
15
- initData
28
+ getInitialData
16
29
  };
17
30
  };
18
31
  }
19
- function getDatafromDOM(id) {
20
- const element = document.querySelector(`#${id}`);
21
- if (element && element.text === undefined) {
22
- console.error(`#${id} is completely empty. This could be due to CSP issues.`);
32
+ function getDataFromEl(el, key) {
33
+ if (el.text === undefined) {
34
+ console.error(`#${key} is completely empty. This could be due to CSP issues.`);
23
35
  }
24
- return element != null && element.text ? JSON.parse(element == null ? void 0 : element.text) : undefined;
36
+ return el != null && el.text ? JSON.parse(el == null ? void 0 : el.text) : undefined;
25
37
  }
26
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJKU09OU3BvdXQiLCJpZCIsIm5leHQiLCJwcm9wcyIsImluaXREYXRhIiwiZ2V0RGF0YWZyb21ET00iLCJlbGVtZW50IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwidGV4dCIsInVuZGVmaW5lZCIsImNvbnNvbGUiLCJlcnJvciIsIkpTT04iLCJwYXJzZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvanNvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbGllbnRTcG91dCB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBKU09OU3BvdXQoe1xuICBpZCA9ICdhbmFuc2ktanNvbicsXG59OiB7IGlkPzogc3RyaW5nIH0gPSB7fSk6IENsaWVudFNwb3V0PFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgeyBpbml0RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuPiB7XG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCBpbml0RGF0YSA9IGdldERhdGFmcm9tRE9NKGlkKTtcbiAgICByZXR1cm4geyAuLi4oYXdhaXQgbmV4dCh7IC4uLnByb3BzLCBpbml0RGF0YSB9KSksIGluaXREYXRhIH07XG4gIH07XG59XG5mdW5jdGlvbiBnZXREYXRhZnJvbURPTShpZDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBlbGVtZW50OiBIVE1MU2NyaXB0RWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKTtcbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC50ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCMke2lkfSBpcyBjb21wbGV0ZWx5IGVtcHR5LiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBDU1AgaXNzdWVzLmAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZWxlbWVudD8udGV4dCA/IEpTT04ucGFyc2UoZWxlbWVudD8udGV4dCkgOiB1bmRlZmluZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFZSxTQUFTQSxTQUFTLENBQUM7RUFDaENDLEVBQUUsR0FBRztBQUNVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFHckI7RUFDQSxPQUFPQyxJQUFJLElBQUksTUFBTUMsS0FBSyxJQUFJO0lBQzVCLE1BQU1DLFFBQVEsR0FBR0MsY0FBYyxDQUFDSixFQUFFLENBQUM7SUFDbkMsT0FBTztNQUFFLElBQUksTUFBTUMsSUFBSSxDQUFDO1FBQUUsR0FBR0MsS0FBSztRQUFFQztNQUFTLENBQUMsQ0FBQyxDQUFDO01BQUVBO0lBQVMsQ0FBQztFQUM5RCxDQUFDO0FBQ0g7QUFDQSxTQUFTQyxjQUFjLENBQUNKLEVBQVUsRUFBMkI7RUFDM0QsTUFBTUssT0FBaUMsR0FBR0MsUUFBUSxDQUFDQyxhQUFhLENBQUUsSUFBR1AsRUFBRyxFQUFDLENBQUM7RUFDMUUsSUFBSUssT0FBTyxJQUFJQSxPQUFPLENBQUNHLElBQUksS0FBS0MsU0FBUyxFQUFFO0lBQ3pDQyxPQUFPLENBQUNDLEtBQUssQ0FDVixJQUFHWCxFQUFHLHdEQUF1RCxDQUMvRDtFQUNIO0VBQ0EsT0FBT0ssT0FBTyxZQUFQQSxPQUFPLENBQUVHLElBQUksR0FBR0ksSUFBSSxDQUFDQyxLQUFLLENBQUNSLE9BQU8sb0JBQVBBLE9BQU8sQ0FBRUcsSUFBSSxDQUFDLEdBQUdDLFNBQVM7QUFDOUQifQ==
38
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJKU09OU3BvdXQiLCJpZCIsIm5leHQiLCJwcm9wcyIsImdldEluaXRpYWxEYXRhIiwia2V5IiwiZ2xvYmFsSWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImVsIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldERhdGFGcm9tRWwiLCJhZGRFdmVudExpc3RlbmVyIiwiRXJyb3IiLCJ0ZXh0IiwidW5kZWZpbmVkIiwiY29uc29sZSIsImVycm9yIiwiSlNPTiIsInBhcnNlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nwb3V0cy9qc29uLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENsaWVudFNwb3V0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEpTT05TcG91dCh7XG4gIGlkID0gJ2FuYW5zaS1qc29uJyxcbn06IHsgaWQ/OiBzdHJpbmcgfSA9IHt9KTogQ2xpZW50U3BvdXQ8XG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB7IGdldEluaXRpYWxEYXRhOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8YW55PiB9XG4+IHtcbiAgcmV0dXJuIG5leHQgPT4gYXN5bmMgcHJvcHMgPT4ge1xuICAgIGNvbnN0IGdldEluaXRpYWxEYXRhID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBnbG9iYWxJZCA9IGAke2lkfS4ke2tleX1gO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgZWw6IEhUTUxTY3JpcHRFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgaWYgKChlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdsb2JhbElkKSBhcyBhbnkpKSB7XG4gICAgICAgICAgcmVzb2x2ZShnZXREYXRhRnJvbUVsKGVsLCBnbG9iYWxJZCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2xvYmFsSWQpIGFzIGFueTtcbiAgICAgICAgICBpZiAoZWwpIHJlc29sdmUoZ2V0RGF0YUZyb21FbChlbCwgZ2xvYmFsSWQpKTtcbiAgICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGZhaWxlZCB0byBmaW5kIERPTSB3aXRoICR7a2V5fSBzdGF0ZWApKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBuZXh0KHsgLi4ucHJvcHMsIGdldEluaXRpYWxEYXRhIH0pKSwgZ2V0SW5pdGlhbERhdGEgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YUZyb21FbChlbDogSFRNTFNjcmlwdEVsZW1lbnQsIGtleTogc3RyaW5nKSB7XG4gIGlmIChlbC50ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCMke2tleX0gaXMgY29tcGxldGVseSBlbXB0eS4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gQ1NQIGlzc3Vlcy5gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGVsPy50ZXh0ID8gSlNPTi5wYXJzZShlbD8udGV4dCkgOiB1bmRlZmluZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFZSxTQUFTQSxTQUFTLENBQUM7RUFDaENDLEVBQUUsR0FBRztBQUNVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFHckI7RUFDQSxPQUFPQyxJQUFJLElBQUksTUFBTUMsS0FBSyxJQUFJO0lBQzVCLE1BQU1DLGNBQWMsR0FBSUMsR0FBVyxJQUFLO01BQ3RDLE1BQU1DLFFBQVEsR0FBSSxHQUFFTCxFQUFHLElBQUdJLEdBQUksRUFBQztNQUMvQixPQUFPLElBQUlFLE9BQU8sQ0FBTSxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztRQUMzQyxJQUFJQyxFQUE0QjtRQUNoQyxJQUFLQSxFQUFFLEdBQUdDLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDTixRQUFRLENBQVEsRUFBRztVQUNuREUsT0FBTyxDQUFDSyxhQUFhLENBQUNILEVBQUUsRUFBRUosUUFBUSxDQUFDLENBQUM7VUFDcEM7UUFDRjtRQUNBSyxRQUFRLENBQUNHLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLE1BQU07VUFDbERKLEVBQUUsR0FBR0MsUUFBUSxDQUFDQyxjQUFjLENBQUNOLFFBQVEsQ0FBUTtVQUM3QyxJQUFJSSxFQUFFLEVBQUVGLE9BQU8sQ0FBQ0ssYUFBYSxDQUFDSCxFQUFFLEVBQUVKLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FDeENHLE1BQU0sQ0FBQyxJQUFJTSxLQUFLLENBQUUsMkJBQTBCVixHQUFJLFFBQU8sQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPO01BQUUsSUFBSSxNQUFNSCxJQUFJLENBQUM7UUFBRSxHQUFHQyxLQUFLO1FBQUVDO01BQWUsQ0FBQyxDQUFDLENBQUM7TUFBRUE7SUFBZSxDQUFDO0VBQzFFLENBQUM7QUFDSDtBQUVBLFNBQVNTLGFBQWEsQ0FBQ0gsRUFBcUIsRUFBRUwsR0FBVyxFQUFFO0VBQ3pELElBQUlLLEVBQUUsQ0FBQ00sSUFBSSxLQUFLQyxTQUFTLEVBQUU7SUFDekJDLE9BQU8sQ0FBQ0MsS0FBSyxDQUNWLElBQUdkLEdBQUksd0RBQXVELENBQ2hFO0VBQ0g7RUFDQSxPQUFPSyxFQUFFLFlBQUZBLEVBQUUsQ0FBRU0sSUFBSSxHQUFHSSxJQUFJLENBQUNDLEtBQUssQ0FBQ1gsRUFBRSxvQkFBRkEsRUFBRSxDQUFFTSxJQUFJLENBQUMsR0FBR0MsU0FBUztBQUNwRCJ9
@@ -1 +1 @@
1
- {"version":3,"file":"json.server.d.ts","sourceRoot":"","sources":["../../src/spouts/json.server.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,aAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,EAAkB,GACnB,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,UAAU,CACX,CAyDA"}
1
+ {"version":3,"file":"json.server.d.ts","sourceRoot":"","sources":["../../src/spouts/json.server.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,aAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAChC,EAAkB,GACnB,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB,UAAU,CACX,CAyCA"}
@@ -1,65 +1,45 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
3
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
5
  exports.__esModule = true;
5
6
  exports.default = JSONSpout;
6
7
  var _jsx2 = _interopRequireDefault(require("@babel/runtime/helpers/jsx"));
7
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
8
9
  function JSONSpout({
9
10
  id = 'anansi-json'
10
11
  } = {}) {
11
12
  return next => async props => {
12
- var _nextProps$scripts;
13
+ var _nextProps$scripts, _nextProps$initData;
13
14
  const nextProps = await next(props);
14
15
  const scripts = (_nextProps$scripts = nextProps.scripts) != null ? _nextProps$scripts : [];
15
- /*
16
- Object.entries(nextProps.initData ?? {}).forEach(([key, data]) => {
16
+ Object.entries((_nextProps$initData = nextProps.initData) != null ? _nextProps$initData : {}).forEach(([key, useData]) => {
17
+ const globalId = `${id}.${key}`;
18
+ const Script = () => {
19
+ const data = useData();
17
20
  try {
18
21
  const encoded = JSON.stringify(data);
19
- scripts.push(
20
- <script
21
- key={key}
22
- id={`${id}-${key}`}
23
- type="application/json"
24
- dangerouslySetInnerHTML={{
25
- __html: encoded,
26
- }}
27
- nonce={props.nonce}
28
- />,
29
- );
22
+ return /*#__PURE__*/(0, _jsx2.default)("script", {
23
+ id: globalId,
24
+ type: "application/json",
25
+ dangerouslySetInnerHTML: {
26
+ __html: encoded
27
+ },
28
+ nonce: props.nonce
29
+ });
30
30
  } catch (e) {
31
31
  // TODO: Use unified logging
32
+ console.error(`Error serializing json for ${key}`);
32
33
  console.error(e);
34
+ return null;
33
35
  }
34
- });*/
35
- const Script = () => {
36
- try {
37
- var _nextProps$initData;
38
- const data = {};
39
- Object.entries((_nextProps$initData = nextProps.initData) != null ? _nextProps$initData : {}).forEach(([key, getData]) => {
40
- data[key] = getData();
41
- });
42
- const encoded = JSON.stringify(data);
43
- return /*#__PURE__*/(0, _jsx2.default)("script", {
44
- id: id,
45
- type: "application/json",
46
- dangerouslySetInnerHTML: {
47
- __html: encoded
48
- },
49
- nonce: props.nonce
50
- }, id);
51
- } catch (e) {
52
- // TODO: Use unified logging
53
- console.error('Error serializing json');
54
- console.error(e);
55
- return null;
56
- }
57
- };
58
- scripts.push( /*#__PURE__*/(0, _jsx2.default)(Script, {}));
36
+ };
37
+ scripts.push( /*#__PURE__*/(0, _jsx2.default)(_react.Suspense, {}, globalId, /*#__PURE__*/(0, _jsx2.default)(Script, {})));
38
+ });
59
39
  return {
60
40
  ...nextProps,
61
41
  scripts
62
42
  };
63
43
  };
64
44
  }
65
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJKU09OU3BvdXQiLCJpZCIsIm5leHQiLCJwcm9wcyIsIm5leHRQcm9wcyIsInNjcmlwdHMiLCJTY3JpcHQiLCJkYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImluaXREYXRhIiwiZm9yRWFjaCIsImtleSIsImdldERhdGEiLCJlbmNvZGVkIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9faHRtbCIsIm5vbmNlIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsInB1c2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BvdXRzL2pzb24uc2VydmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclNwb3V0IH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgTmVlZGVkTmV4dCA9IHtcbiAgaW5pdERhdGE/OiBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB1bmtub3duPjtcbiAgc2NyaXB0cz86IFJlYWN0LlJlYWN0Tm9kZVtdO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSlNPTlNwb3V0KHtcbiAgaWQgPSAnYW5hbnNpLWpzb24nLFxufTogeyBpZD86IHN0cmluZyB9ID0ge30pOiBTZXJ2ZXJTcG91dDxcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBOZWVkZWROZXh0XG4+IHtcbiAgcmV0dXJuIG5leHQgPT4gYXN5bmMgcHJvcHMgPT4ge1xuICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQocHJvcHMpO1xuXG4gICAgY29uc3Qgc2NyaXB0czogUmVhY3QuUmVhY3ROb2RlW10gPSBuZXh0UHJvcHMuc2NyaXB0cyA/PyBbXTtcbiAgICAvKlxuICAgICAgT2JqZWN0LmVudHJpZXMobmV4dFByb3BzLmluaXREYXRhID8/IHt9KS5mb3JFYWNoKChba2V5LCBkYXRhXSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgICBzY3JpcHRzLnB1c2goXG4gICAgICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgICAgICBpZD17YCR7aWR9LSR7a2V5fWB9XG4gICAgICAgICAgICAgIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgICBfX2h0bWw6IGVuY29kZWQsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG5vbmNlPXtwcm9wcy5ub25jZX1cbiAgICAgICAgICAgIC8+LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBUT0RPOiBVc2UgdW5pZmllZCBsb2dnaW5nXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7Ki9cbiAgICBjb25zdCBTY3JpcHQgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMobmV4dFByb3BzLmluaXREYXRhID8/IHt9KS5mb3JFYWNoKChba2V5LCBnZXREYXRhXSkgPT4ge1xuICAgICAgICAgIGRhdGFba2V5XSA9IGdldERhdGEoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgICBrZXk9e2lkfVxuICAgICAgICAgICAgaWQ9e2lkfVxuICAgICAgICAgICAgdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgX19odG1sOiBlbmNvZGVkLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG5vbmNlPXtwcm9wcy5ub25jZX1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBUT0RPOiBVc2UgdW5pZmllZCBsb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNlcmlhbGl6aW5nIGpzb24nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcbiAgICBzY3JpcHRzLnB1c2goPFNjcmlwdCAvPik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgc2NyaXB0cyxcbiAgICB9O1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQVNlLFNBQVNBLFNBQVMsQ0FBQztFQUNoQ0MsRUFBRSxHQUFHO0FBQ1UsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUlyQjtFQUNBLE9BQU9DLElBQUksSUFBSSxNQUFNQyxLQUFLLElBQUk7SUFBQTtJQUM1QixNQUFNQyxTQUFTLEdBQUcsTUFBTUYsSUFBSSxDQUFDQyxLQUFLLENBQUM7SUFFbkMsTUFBTUUsT0FBMEIseUJBQUdELFNBQVMsQ0FBQ0MsT0FBTyxpQ0FBSSxFQUFFO0lBQzFEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDSSxNQUFNQyxNQUFNLEdBQUcsTUFBTTtNQUNuQixJQUFJO1FBQUE7UUFDRixNQUFNQyxJQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCQyxNQUFNLENBQUNDLE9BQU8sd0JBQUNMLFNBQVMsQ0FBQ00sUUFBUSxrQ0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDQyxHQUFHLEVBQUVDLE9BQU8sQ0FBQyxLQUFLO1VBQ25FTixJQUFJLENBQUNLLEdBQUcsQ0FBQyxHQUFHQyxPQUFPLEVBQUU7UUFDdkIsQ0FBQyxDQUFDO1FBQ0YsTUFBTUMsT0FBTyxHQUFHQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ1QsSUFBSSxDQUFDO1FBQ3BDLG9CQUNFO1VBRUUsRUFBRSxFQUFFTixFQUFHO1VBQ1AsSUFBSSxFQUFDLGtCQUFrQjtVQUN2Qix1QkFBdUIsRUFBRTtZQUN2QmdCLE1BQU0sRUFBRUg7VUFDVixDQUFFO1VBQ0YsS0FBSyxFQUFFWCxLQUFLLENBQUNlO1FBQU0sR0FOZGpCLEVBQUUsQ0FPUDtNQUVOLENBQUMsQ0FBQyxPQUFPa0IsQ0FBQyxFQUFFO1FBQ1Y7UUFDQUMsT0FBTyxDQUFDQyxLQUFLLENBQUMsd0JBQXdCLENBQUM7UUFDdkNELE9BQU8sQ0FBQ0MsS0FBSyxDQUFDRixDQUFDLENBQUM7UUFDaEIsT0FBTyxJQUFJO01BQ2I7SUFDRixDQUFDO0lBQ0RkLE9BQU8sQ0FBQ2lCLElBQUksZUFBQyxtQkFBQyxNQUFNLEtBQUcsQ0FBQztJQUV4QixPQUFPO01BQ0wsR0FBR2xCLFNBQVM7TUFDWkM7SUFDRixDQUFDO0VBQ0gsQ0FBQztBQUNIIn0=
45
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJKU09OU3BvdXQiLCJpZCIsIm5leHQiLCJwcm9wcyIsIm5leHRQcm9wcyIsInNjcmlwdHMiLCJPYmplY3QiLCJlbnRyaWVzIiwiaW5pdERhdGEiLCJmb3JFYWNoIiwia2V5IiwidXNlRGF0YSIsImdsb2JhbElkIiwiU2NyaXB0IiwiZGF0YSIsImVuY29kZWQiLCJKU09OIiwic3RyaW5naWZ5IiwiX19odG1sIiwibm9uY2UiLCJlIiwiY29uc29sZSIsImVycm9yIiwicHVzaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvanNvbi5zZXJ2ZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBTdXNwZW5zZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJTcG91dCB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5lZWRlZE5leHQgPSB7XG4gIGluaXREYXRhPzogUmVjb3JkPHN0cmluZywgKCkgPT4gdW5rbm93bj47XG4gIHNjcmlwdHM/OiBSZWFjdC5SZWFjdE5vZGVbXTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEpTT05TcG91dCh7XG4gIGlkID0gJ2FuYW5zaS1qc29uJyxcbn06IHsgaWQ/OiBzdHJpbmcgfSA9IHt9KTogU2VydmVyU3BvdXQ8XG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgTmVlZGVkTmV4dFxuPiB7XG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgIGNvbnN0IHNjcmlwdHM6IFJlYWN0LlJlYWN0Tm9kZVtdID0gbmV4dFByb3BzLnNjcmlwdHMgPz8gW107XG5cbiAgICBPYmplY3QuZW50cmllcyhuZXh0UHJvcHMuaW5pdERhdGEgPz8ge30pLmZvckVhY2goKFtrZXksIHVzZURhdGFdKSA9PiB7XG4gICAgICBjb25zdCBnbG9iYWxJZCA9IGAke2lkfS4ke2tleX1gO1xuICAgICAgY29uc3QgU2NyaXB0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSB1c2VEYXRhKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgICAgIGlkPXtnbG9iYWxJZH1cbiAgICAgICAgICAgICAgdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgICAgIF9faHRtbDogZW5jb2RlZCxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgbm9uY2U9e3Byb3BzLm5vbmNlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gVE9ETzogVXNlIHVuaWZpZWQgbG9nZ2luZ1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHNlcmlhbGl6aW5nIGpzb24gZm9yICR7a2V5fWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzY3JpcHRzLnB1c2goXG4gICAgICAgIDxTdXNwZW5zZSBrZXk9e2dsb2JhbElkfT5cbiAgICAgICAgICA8U2NyaXB0IC8+XG4gICAgICAgIDwvU3VzcGVuc2U+LFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICBzY3JpcHRzLFxuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQVNlLFNBQVNBLFNBQVMsQ0FBQztFQUNoQ0MsRUFBRSxHQUFHO0FBQ1UsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUlyQjtFQUNBLE9BQU9DLElBQUksSUFBSSxNQUFNQyxLQUFLLElBQUk7SUFBQTtJQUM1QixNQUFNQyxTQUFTLEdBQUcsTUFBTUYsSUFBSSxDQUFDQyxLQUFLLENBQUM7SUFFbkMsTUFBTUUsT0FBMEIseUJBQUdELFNBQVMsQ0FBQ0MsT0FBTyxpQ0FBSSxFQUFFO0lBRTFEQyxNQUFNLENBQUNDLE9BQU8sd0JBQUNILFNBQVMsQ0FBQ0ksUUFBUSxrQ0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDQyxHQUFHLEVBQUVDLE9BQU8sQ0FBQyxLQUFLO01BQ25FLE1BQU1DLFFBQVEsR0FBSSxHQUFFWCxFQUFHLElBQUdTLEdBQUksRUFBQztNQUMvQixNQUFNRyxNQUFNLEdBQUcsTUFBTTtRQUNuQixNQUFNQyxJQUFTLEdBQUdILE9BQU8sRUFBRTtRQUMzQixJQUFJO1VBQ0YsTUFBTUksT0FBTyxHQUFHQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0gsSUFBSSxDQUFDO1VBQ3BDLG9CQUNFO1lBQ0UsRUFBRSxFQUFFRixRQUFTO1lBQ2IsSUFBSSxFQUFDLGtCQUFrQjtZQUN2Qix1QkFBdUIsRUFBRTtjQUN2Qk0sTUFBTSxFQUFFSDtZQUNWLENBQUU7WUFDRixLQUFLLEVBQUVaLEtBQUssQ0FBQ2dCO1VBQU0sRUFDbkI7UUFFTixDQUFDLENBQUMsT0FBT0MsQ0FBQyxFQUFFO1VBQ1Y7VUFDQUMsT0FBTyxDQUFDQyxLQUFLLENBQUUsOEJBQTZCWixHQUFJLEVBQUMsQ0FBQztVQUNsRFcsT0FBTyxDQUFDQyxLQUFLLENBQUNGLENBQUMsQ0FBQztVQUNoQixPQUFPLElBQUk7UUFDYjtNQUNGLENBQUM7TUFDRGYsT0FBTyxDQUFDa0IsSUFBSSxlQUNWLG1CQUFDLGVBQVEsTUFBTVgsUUFBUSxlQUNyQixtQkFBQyxNQUFNLEtBQUcsQ0FDRCxDQUNaO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsT0FBTztNQUNMLEdBQUdSLFNBQVM7TUFDWkM7SUFDRixDQUFDO0VBQ0gsQ0FBQztBQUNIIn0=
@@ -3,6 +3,6 @@ import type { ClientSpout } from './types';
3
3
  export default function restHooksSpout(options?: {
4
4
  getManagers: () => Manager[];
5
5
  }): ClientSpout<{
6
- initData: Record<string, unknown>;
6
+ getInitialData: (key: string) => Promise<any>;
7
7
  }>;
8
8
  //# sourceMappingURL=restHooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"restHooks.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,OAAO,EAGR,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB,GAChD,WAAW,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAmBpD"}
1
+ {"version":3,"file":"restHooks.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB,GAChD,WAAW,CAAC;IAAE,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC,CAkBhE"}
@@ -10,12 +10,11 @@ function restHooksSpout(options = {
10
10
  getManagers: () => [new _core.NetworkManager()]
11
11
  }) {
12
12
  return next => async props => {
13
- var _props$initData;
14
- const data = (_props$initData = props.initData) == null ? void 0 : _props$initData.resthooks;
13
+ const nextProps = await next(props);
14
+ const data = await props.getInitialData('resthooks');
15
15
  if (process.env.NODE_ENV !== 'production' && !data) {
16
16
  console.error('Rest Hooks init data not found');
17
17
  }
18
- const nextProps = await next(props);
19
18
  return {
20
19
  ...nextProps,
21
20
  app: /*#__PURE__*/(0, _jsx2.default)(_core.CacheProvider, {
@@ -25,4 +24,4 @@ function restHooksSpout(options = {
25
24
  };
26
25
  };
27
26
  }
28
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibmV4dCIsInByb3BzIiwiZGF0YSIsImluaXREYXRhIiwicmVzdGhvb2tzIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY29uc29sZSIsImVycm9yIiwibmV4dFByb3BzIiwiYXBwIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nwb3V0cy9yZXN0SG9va3MudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENhY2hlUHJvdmlkZXIsXG4gIE1hbmFnZXIsXG4gIE5ldHdvcmtNYW5hZ2VyLFxuICBTdGF0ZSxcbn0gZnJvbSAnQHJlc3QtaG9va3MvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgQ2xpZW50U3BvdXQgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVzdEhvb2tzU3BvdXQoXG4gIG9wdGlvbnM6IHtcbiAgICBnZXRNYW5hZ2VyczogKCkgPT4gTWFuYWdlcltdO1xuICB9ID0geyBnZXRNYW5hZ2VyczogKCkgPT4gW25ldyBOZXR3b3JrTWFuYWdlcigpXSB9LFxuKTogQ2xpZW50U3BvdXQ8eyBpbml0RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4ge1xuICByZXR1cm4gbmV4dCA9PiBhc3luYyBwcm9wcyA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHByb3BzLmluaXREYXRhPy5yZXN0aG9va3MgYXMgU3RhdGU8dW5rbm93bj47XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhZGF0YSkge1xuICAgICAgY29uc29sZS5lcnJvcignUmVzdCBIb29rcyBpbml0IGRhdGEgbm90IGZvdW5kJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgYXBwOiAoXG4gICAgICAgIDxDYWNoZVByb3ZpZGVyIGluaXRpYWxTdGF0ZT17ZGF0YX0gbWFuYWdlcnM9e29wdGlvbnMuZ2V0TWFuYWdlcnMoKX0+XG4gICAgICAgICAge25leHRQcm9wcy5hcHB9XG4gICAgICAgIDwvQ2FjaGVQcm92aWRlcj5cbiAgICAgICksXG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBU2UsU0FBU0EsY0FBYyxDQUNwQ0MsT0FFQyxHQUFHO0VBQUVDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSUMsb0JBQWMsRUFBRTtBQUFFLENBQUMsRUFDRztFQUNwRCxPQUFPQyxJQUFJLElBQUksTUFBTUMsS0FBSyxJQUFJO0lBQUE7SUFDNUIsTUFBTUMsSUFBSSxzQkFBR0QsS0FBSyxDQUFDRSxRQUFRLHFCQUFkLGdCQUFnQkMsU0FBMkI7SUFFeEQsSUFBSUMsT0FBTyxDQUFDQyxHQUFHLENBQUNDLFFBQVEsS0FBSyxZQUFZLElBQUksQ0FBQ0wsSUFBSSxFQUFFO01BQ2xETSxPQUFPLENBQUNDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztJQUNqRDtJQUVBLE1BQU1DLFNBQVMsR0FBRyxNQUFNVixJQUFJLENBQUNDLEtBQUssQ0FBQztJQUVuQyxPQUFPO01BQ0wsR0FBR1MsU0FBUztNQUNaQyxHQUFHLGVBQ0QsbUJBQUMsbUJBQWE7UUFBQyxZQUFZLEVBQUVULElBQUs7UUFBQyxRQUFRLEVBQUVMLE9BQU8sQ0FBQ0MsV0FBVztNQUFHLFdBQ2hFWSxTQUFTLENBQUNDLEdBQUc7SUFHcEIsQ0FBQztFQUNILENBQUM7QUFDSCJ9
27
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibmV4dCIsInByb3BzIiwibmV4dFByb3BzIiwiZGF0YSIsImdldEluaXRpYWxEYXRhIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY29uc29sZSIsImVycm9yIiwiYXBwIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Nwb3V0cy9yZXN0SG9va3MudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhY2hlUHJvdmlkZXIsIE1hbmFnZXIsIE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSAnQHJlc3QtaG9va3MvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgQ2xpZW50U3BvdXQgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVzdEhvb2tzU3BvdXQoXG4gIG9wdGlvbnM6IHtcbiAgICBnZXRNYW5hZ2VyczogKCkgPT4gTWFuYWdlcltdO1xuICB9ID0geyBnZXRNYW5hZ2VyczogKCkgPT4gW25ldyBOZXR3b3JrTWFuYWdlcigpXSB9LFxuKTogQ2xpZW50U3BvdXQ8eyBnZXRJbml0aWFsRGF0YTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPGFueT4gfT4ge1xuICByZXR1cm4gbmV4dCA9PiBhc3luYyBwcm9wcyA9PiB7XG4gICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHByb3BzLmdldEluaXRpYWxEYXRhKCdyZXN0aG9va3MnKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFkYXRhKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdSZXN0IEhvb2tzIGluaXQgZGF0YSBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgYXBwOiAoXG4gICAgICAgIDxDYWNoZVByb3ZpZGVyIGluaXRpYWxTdGF0ZT17ZGF0YX0gbWFuYWdlcnM9e29wdGlvbnMuZ2V0TWFuYWdlcnMoKX0+XG4gICAgICAgICAge25leHRQcm9wcy5hcHB9XG4gICAgICAgIDwvQ2FjaGVQcm92aWRlcj5cbiAgICAgICksXG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBSWUsU0FBU0EsY0FBYyxDQUNwQ0MsT0FFQyxHQUFHO0VBQUVDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSUMsb0JBQWMsRUFBRTtBQUFFLENBQUMsRUFDZTtFQUNoRSxPQUFPQyxJQUFJLElBQUksTUFBTUMsS0FBSyxJQUFJO0lBQzVCLE1BQU1DLFNBQVMsR0FBRyxNQUFNRixJQUFJLENBQUNDLEtBQUssQ0FBQztJQUNuQyxNQUFNRSxJQUFJLEdBQUcsTUFBTUYsS0FBSyxDQUFDRyxjQUFjLENBQUMsV0FBVyxDQUFDO0lBRXBELElBQUlDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDQyxRQUFRLEtBQUssWUFBWSxJQUFJLENBQUNKLElBQUksRUFBRTtNQUNsREssT0FBTyxDQUFDQyxLQUFLLENBQUMsZ0NBQWdDLENBQUM7SUFDakQ7SUFFQSxPQUFPO01BQ0wsR0FBR1AsU0FBUztNQUNaUSxHQUFHLGVBQ0QsbUJBQUMsbUJBQWE7UUFBQyxZQUFZLEVBQUVQLElBQUs7UUFBQyxRQUFRLEVBQUVOLE9BQU8sQ0FBQ0MsV0FBVztNQUFHLFdBQ2hFSSxTQUFTLENBQUNRLEdBQUc7SUFHcEIsQ0FBQztFQUNILENBQUM7QUFDSCJ9
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { Controller, Manager, State } from '@rest-hooks/core';
2
3
  import type { Store } from 'redux';
3
4
  import type { ServerSpout } from './types';
@@ -9,5 +10,6 @@ export default function restHooksSpout(options?: {
9
10
  store: Store<State<unknown>>;
10
11
  }, {
11
12
  initData?: Record<string, () => unknown>;
13
+ scripts?: React.ReactNode[];
12
14
  }>;
13
15
  //# sourceMappingURL=restHooks.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"restHooks.server.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAkB,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB,GAChD,WAAW,CACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;CAAE,EAC7D;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAA;CAAE,CAC7C,CAwBA"}
1
+ {"version":3,"file":"restHooks.server.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.server.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAkB,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB,GAChD,WAAW,CACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvB;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;CAAE,EAC7D;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;CAAE,CAC1E,CAuBA"}
@@ -6,12 +6,13 @@ exports.default = restHooksSpout;
6
6
  var _jsx2 = _interopRequireDefault(require("@babel/runtime/helpers/jsx"));
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  var _core = require("@rest-hooks/core");
9
- var _rhHelp = require("./rhHelp");
9
+ var _ssr = require("@rest-hooks/ssr");
10
10
  function restHooksSpout(options = {
11
11
  getManagers: () => [new _core.NetworkManager()]
12
12
  }) {
13
+ const managers = options.getManagers();
13
14
  return next => async props => {
14
- const [ServerCacheProvider, controller, store] = (0, _rhHelp.createPersistedStore)(options.getManagers());
15
+ const [ServerCacheProvider, useReadyCacheState, controller, store] = (0, _ssr.createPersistedStore)(managers);
15
16
  const nextProps = await next({
16
17
  ...props,
17
18
  controller,
@@ -21,7 +22,7 @@ function restHooksSpout(options = {
21
22
  ...nextProps,
22
23
  initData: {
23
24
  ...nextProps.initData,
24
- resthooks: () => store.getState()
25
+ resthooks: useReadyCacheState
25
26
  },
26
27
  app: /*#__PURE__*/(0, _jsx2.default)(ServerCacheProvider, {}, void 0, nextProps.app),
27
28
  // TODO: figure out how to only inject in next and not have to also put here
@@ -30,4 +31,4 @@ function restHooksSpout(options = {
30
31
  };
31
32
  };
32
33
  }
33
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibmV4dCIsInByb3BzIiwiU2VydmVyQ2FjaGVQcm92aWRlciIsImNvbnRyb2xsZXIiLCJzdG9yZSIsImNyZWF0ZVBlcnNpc3RlZFN0b3JlIiwibmV4dFByb3BzIiwiaW5pdERhdGEiLCJyZXN0aG9va3MiLCJnZXRTdGF0ZSIsImFwcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvcmVzdEhvb2tzLnNlcnZlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlciwgTWFuYWdlciwgTmV0d29ya01hbmFnZXIsIFN0YXRlIH0gZnJvbSAnQHJlc3QtaG9va3MvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlIH0gZnJvbSAncmVkdXgnO1xuXG5pbXBvcnQgeyBjcmVhdGVQZXJzaXN0ZWRTdG9yZSB9IGZyb20gJy4vcmhIZWxwJztcbmltcG9ydCB0eXBlIHsgU2VydmVyU3BvdXQgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVzdEhvb2tzU3BvdXQoXG4gIG9wdGlvbnM6IHtcbiAgICBnZXRNYW5hZ2VyczogKCkgPT4gTWFuYWdlcltdO1xuICB9ID0geyBnZXRNYW5hZ2VyczogKCkgPT4gW25ldyBOZXR3b3JrTWFuYWdlcigpXSB9LFxuKTogU2VydmVyU3BvdXQ8XG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB7IGNvbnRyb2xsZXI6IENvbnRyb2xsZXIgfSAmIHsgc3RvcmU6IFN0b3JlPFN0YXRlPHVua25vd24+PiB9LFxuICB7IGluaXREYXRhPzogUmVjb3JkPHN0cmluZywgKCkgPT4gdW5rbm93bj4gfVxuPiB7XG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCBbU2VydmVyQ2FjaGVQcm92aWRlciwgY29udHJvbGxlciwgc3RvcmVdID0gY3JlYXRlUGVyc2lzdGVkU3RvcmUoXG4gICAgICBvcHRpb25zLmdldE1hbmFnZXJzKCksXG4gICAgKTtcblxuICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgc3RvcmUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgaW5pdERhdGE6IHtcbiAgICAgICAgLi4ubmV4dFByb3BzLmluaXREYXRhLFxuICAgICAgICByZXN0aG9va3M6ICgpID0+IHN0b3JlLmdldFN0YXRlKCksXG4gICAgICB9LFxuICAgICAgYXBwOiA8U2VydmVyQ2FjaGVQcm92aWRlcj57bmV4dFByb3BzLmFwcH08L1NlcnZlckNhY2hlUHJvdmlkZXI+LFxuICAgICAgLy8gVE9ETzogZmlndXJlIG91dCBob3cgdG8gb25seSBpbmplY3QgaW4gbmV4dCBhbmQgbm90IGhhdmUgdG8gYWxzbyBwdXQgaGVyZVxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHN0b3JlLFxuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUdBO0FBR2UsU0FBU0EsY0FBYyxDQUNwQ0MsT0FFQyxHQUFHO0VBQUVDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSUMsb0JBQWMsRUFBRTtBQUFFLENBQUMsRUFLakQ7RUFDQSxPQUFPQyxJQUFJLElBQUksTUFBTUMsS0FBSyxJQUFJO0lBQzVCLE1BQU0sQ0FBQ0MsbUJBQW1CLEVBQUVDLFVBQVUsRUFBRUMsS0FBSyxDQUFDLEdBQUcsSUFBQUMsNEJBQW9CLEVBQ25FUixPQUFPLENBQUNDLFdBQVcsRUFBRSxDQUN0QjtJQUVELE1BQU1RLFNBQVMsR0FBRyxNQUFNTixJQUFJLENBQUM7TUFDM0IsR0FBR0MsS0FBSztNQUNSRSxVQUFVO01BQ1ZDO0lBQ0YsQ0FBQyxDQUFDO0lBRUYsT0FBTztNQUNMLEdBQUdFLFNBQVM7TUFDWkMsUUFBUSxFQUFFO1FBQ1IsR0FBR0QsU0FBUyxDQUFDQyxRQUFRO1FBQ3JCQyxTQUFTLEVBQUUsTUFBTUosS0FBSyxDQUFDSyxRQUFRO01BQ2pDLENBQUM7TUFDREMsR0FBRyxlQUFFLG1CQUFDLG1CQUFtQixjQUFFSixTQUFTLENBQUNJLEdBQUcsQ0FBdUI7TUFDL0Q7TUFDQVAsVUFBVTtNQUNWQztJQUNGLENBQUM7RUFDSCxDQUFDO0FBQ0gifQ==
34
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXN0SG9va3NTcG91dCIsIm9wdGlvbnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwibWFuYWdlcnMiLCJuZXh0IiwicHJvcHMiLCJTZXJ2ZXJDYWNoZVByb3ZpZGVyIiwidXNlUmVhZHlDYWNoZVN0YXRlIiwiY29udHJvbGxlciIsInN0b3JlIiwiY3JlYXRlUGVyc2lzdGVkU3RvcmUiLCJuZXh0UHJvcHMiLCJpbml0RGF0YSIsInJlc3Rob29rcyIsImFwcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvcmVzdEhvb2tzLnNlcnZlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udHJvbGxlciwgTWFuYWdlciwgTmV0d29ya01hbmFnZXIsIFN0YXRlIH0gZnJvbSAnQHJlc3QtaG9va3MvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHsgY3JlYXRlUGVyc2lzdGVkU3RvcmUgfSBmcm9tICdAcmVzdC1ob29rcy9zc3InO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclNwb3V0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc3RIb29rc1Nwb3V0KFxuICBvcHRpb25zOiB7XG4gICAgZ2V0TWFuYWdlcnM6ICgpID0+IE1hbmFnZXJbXTtcbiAgfSA9IHsgZ2V0TWFuYWdlcnM6ICgpID0+IFtuZXcgTmV0d29ya01hbmFnZXIoKV0gfSxcbik6IFNlcnZlclNwb3V0PFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgeyBjb250cm9sbGVyOiBDb250cm9sbGVyIH0gJiB7IHN0b3JlOiBTdG9yZTxTdGF0ZTx1bmtub3duPj4gfSxcbiAgeyBpbml0RGF0YT86IFJlY29yZDxzdHJpbmcsICgpID0+IHVua25vd24+OyBzY3JpcHRzPzogUmVhY3QuUmVhY3ROb2RlW10gfVxuPiB7XG4gIGNvbnN0IG1hbmFnZXJzID0gb3B0aW9ucy5nZXRNYW5hZ2VycygpO1xuICByZXR1cm4gbmV4dCA9PiBhc3luYyBwcm9wcyA9PiB7XG4gICAgY29uc3QgW1NlcnZlckNhY2hlUHJvdmlkZXIsIHVzZVJlYWR5Q2FjaGVTdGF0ZSwgY29udHJvbGxlciwgc3RvcmVdID1cbiAgICAgIGNyZWF0ZVBlcnNpc3RlZFN0b3JlKG1hbmFnZXJzKTtcblxuICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgc3RvcmUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgIGluaXREYXRhOiB7XG4gICAgICAgIC4uLm5leHRQcm9wcy5pbml0RGF0YSxcbiAgICAgICAgcmVzdGhvb2tzOiB1c2VSZWFkeUNhY2hlU3RhdGUsXG4gICAgICB9LFxuICAgICAgYXBwOiA8U2VydmVyQ2FjaGVQcm92aWRlcj57bmV4dFByb3BzLmFwcH08L1NlcnZlckNhY2hlUHJvdmlkZXI+LFxuICAgICAgLy8gVE9ETzogZmlndXJlIG91dCBob3cgdG8gb25seSBpbmplY3QgaW4gbmV4dCBhbmQgbm90IGhhdmUgdG8gYWxzbyBwdXQgaGVyZVxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHN0b3JlLFxuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUVBO0FBSWUsU0FBU0EsY0FBYyxDQUNwQ0MsT0FFQyxHQUFHO0VBQUVDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSUMsb0JBQWMsRUFBRTtBQUFFLENBQUMsRUFLakQ7RUFDQSxNQUFNQyxRQUFRLEdBQUdILE9BQU8sQ0FBQ0MsV0FBVyxFQUFFO0VBQ3RDLE9BQU9HLElBQUksSUFBSSxNQUFNQyxLQUFLLElBQUk7SUFDNUIsTUFBTSxDQUFDQyxtQkFBbUIsRUFBRUMsa0JBQWtCLEVBQUVDLFVBQVUsRUFBRUMsS0FBSyxDQUFDLEdBQ2hFLElBQUFDLHlCQUFvQixFQUFDUCxRQUFRLENBQUM7SUFFaEMsTUFBTVEsU0FBUyxHQUFHLE1BQU1QLElBQUksQ0FBQztNQUMzQixHQUFHQyxLQUFLO01BQ1JHLFVBQVU7TUFDVkM7SUFDRixDQUFDLENBQUM7SUFDRixPQUFPO01BQ0wsR0FBR0UsU0FBUztNQUNaQyxRQUFRLEVBQUU7UUFDUixHQUFHRCxTQUFTLENBQUNDLFFBQVE7UUFDckJDLFNBQVMsRUFBRU47TUFDYixDQUFDO01BQ0RPLEdBQUcsZUFBRSxtQkFBQyxtQkFBbUIsY0FBRUgsU0FBUyxDQUFDRyxHQUFHLENBQXVCO01BQy9EO01BQ0FOLFVBQVU7TUFDVkM7SUFDRixDQUFDO0VBQ0gsQ0FBQztBQUNIIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anansi/core",
3
- "version": "0.14.32",
3
+ "version": "0.14.34",
4
4
  "description": "React 18 Framework",
5
5
  "homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
6
6
  "repository": {
@@ -65,24 +65,24 @@
65
65
  "browser"
66
66
  ],
67
67
  "devDependencies": {
68
- "@anansi/babel-preset": "3.2.21",
68
+ "@anansi/babel-preset": "3.2.22",
69
69
  "@anansi/browserslist-config": "1.4.1",
70
- "@anansi/webpack-config": "13.0.23",
70
+ "@anansi/webpack-config": "13.0.24",
71
71
  "@babel/cli": "7.19.3",
72
- "@babel/core": "7.19.6",
72
+ "@babel/core": "7.20.2",
73
73
  "@types/compression": "1.7.2",
74
74
  "@types/source-map-support": "0.5.6",
75
75
  "@types/tmp": "0.2.3",
76
76
  "@types/webpack-hot-middleware": "2.25.6",
77
- "jest": "29.2.2",
77
+ "jest": "29.3.0",
78
78
  "rimraf": "3.0.2",
79
79
  "webpack": "5.74.0",
80
80
  "webpack-cli": "4.10.0"
81
81
  },
82
82
  "dependencies": {
83
- "@anansi/router": "^0.6.34",
83
+ "@anansi/router": "^0.6.36",
84
84
  "@babel/runtime": "^7.10.5",
85
- "@rest-hooks/ssr": "^0.2.0",
85
+ "@rest-hooks/ssr": "^0.3.0-beta.2",
86
86
  "chalk": "^4.0.0",
87
87
  "compression": "^1.7.4",
88
88
  "cross-fetch": "^3.1.5",
package/src/laySpouts.tsx CHANGED
@@ -9,7 +9,7 @@ export default function laySpouts(
9
9
  app: JSX.Element;
10
10
  }>,
11
11
  {
12
- timeoutMS = 200,
12
+ timeoutMS = 10000,
13
13
  onError,
14
14
  }: { timeoutMS?: number; onError?: (error: unknown) => void } = {},
15
15
  ) {
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { Suspense } from 'react';
2
2
 
3
3
  import type { ServerSpout } from './types';
4
4
 
@@ -18,52 +18,36 @@ export default function JSONSpout({
18
18
  const nextProps = await next(props);
19
19
 
20
20
  const scripts: React.ReactNode[] = nextProps.scripts ?? [];
21
- /*
22
- Object.entries(nextProps.initData ?? {}).forEach(([key, data]) => {
21
+
22
+ Object.entries(nextProps.initData ?? {}).forEach(([key, useData]) => {
23
+ const globalId = `${id}.${key}`;
24
+ const Script = () => {
25
+ const data: any = useData();
23
26
  try {
24
27
  const encoded = JSON.stringify(data);
25
- scripts.push(
28
+ return (
26
29
  <script
27
- key={key}
28
- id={`${id}-${key}`}
30
+ id={globalId}
29
31
  type="application/json"
30
32
  dangerouslySetInnerHTML={{
31
33
  __html: encoded,
32
34
  }}
33
35
  nonce={props.nonce}
34
- />,
36
+ />
35
37
  );
36
38
  } catch (e) {
37
39
  // TODO: Use unified logging
40
+ console.error(`Error serializing json for ${key}`);
38
41
  console.error(e);
42
+ return null;
39
43
  }
40
- });*/
41
- const Script = () => {
42
- try {
43
- const data: any = {};
44
- Object.entries(nextProps.initData ?? {}).forEach(([key, getData]) => {
45
- data[key] = getData();
46
- });
47
- const encoded = JSON.stringify(data);
48
- return (
49
- <script
50
- key={id}
51
- id={id}
52
- type="application/json"
53
- dangerouslySetInnerHTML={{
54
- __html: encoded,
55
- }}
56
- nonce={props.nonce}
57
- />
58
- );
59
- } catch (e) {
60
- // TODO: Use unified logging
61
- console.error('Error serializing json');
62
- console.error(e);
63
- return null;
64
- }
65
- };
66
- scripts.push(<Script />);
44
+ };
45
+ scripts.push(
46
+ <Suspense key={globalId}>
47
+ <Script />
48
+ </Suspense>,
49
+ );
50
+ });
67
51
 
68
52
  return {
69
53
  ...nextProps,
@@ -4,19 +4,33 @@ export default function JSONSpout({
4
4
  id = 'anansi-json',
5
5
  }: { id?: string } = {}): ClientSpout<
6
6
  Record<string, unknown>,
7
- { initData: Record<string, unknown> }
7
+ { getInitialData: (key: string) => Promise<any> }
8
8
  > {
9
9
  return next => async props => {
10
- const initData = getDatafromDOM(id);
11
- return { ...(await next({ ...props, initData })), initData };
10
+ const getInitialData = (key: string) => {
11
+ const globalId = `${id}.${key}`;
12
+ return new Promise<any>((resolve, reject) => {
13
+ let el: HTMLScriptElement | null;
14
+ if ((el = document.getElementById(globalId) as any)) {
15
+ resolve(getDataFromEl(el, globalId));
16
+ return;
17
+ }
18
+ document.addEventListener('DOMContentLoaded', () => {
19
+ el = document.getElementById(globalId) as any;
20
+ if (el) resolve(getDataFromEl(el, globalId));
21
+ else reject(new Error(`failed to find DOM with ${key} state`));
22
+ });
23
+ });
24
+ };
25
+ return { ...(await next({ ...props, getInitialData })), getInitialData };
12
26
  };
13
27
  }
14
- function getDatafromDOM(id: string): Record<string, unknown> {
15
- const element: HTMLScriptElement | null = document.querySelector(`#${id}`);
16
- if (element && element.text === undefined) {
28
+
29
+ function getDataFromEl(el: HTMLScriptElement, key: string) {
30
+ if (el.text === undefined) {
17
31
  console.error(
18
- `#${id} is completely empty. This could be due to CSP issues.`,
32
+ `#${key} is completely empty. This could be due to CSP issues.`,
19
33
  );
20
34
  }
21
- return element?.text ? JSON.parse(element?.text) : undefined;
35
+ return el?.text ? JSON.parse(el?.text) : undefined;
22
36
  }
@@ -1,7 +1,7 @@
1
1
  import { Controller, Manager, NetworkManager, State } from '@rest-hooks/core';
2
2
  import type { Store } from 'redux';
3
+ import { createPersistedStore } from '@rest-hooks/ssr';
3
4
 
4
- import { createPersistedStore } from './rhHelp';
5
5
  import type { ServerSpout } from './types';
6
6
 
7
7
  export default function restHooksSpout(
@@ -11,24 +11,23 @@ export default function restHooksSpout(
11
11
  ): ServerSpout<
12
12
  Record<string, unknown>,
13
13
  { controller: Controller } & { store: Store<State<unknown>> },
14
- { initData?: Record<string, () => unknown> }
14
+ { initData?: Record<string, () => unknown>; scripts?: React.ReactNode[] }
15
15
  > {
16
+ const managers = options.getManagers();
16
17
  return next => async props => {
17
- const [ServerCacheProvider, controller, store] = createPersistedStore(
18
- options.getManagers(),
19
- );
18
+ const [ServerCacheProvider, useReadyCacheState, controller, store] =
19
+ createPersistedStore(managers);
20
20
 
21
21
  const nextProps = await next({
22
22
  ...props,
23
23
  controller,
24
24
  store,
25
25
  });
26
-
27
26
  return {
28
27
  ...nextProps,
29
28
  initData: {
30
29
  ...nextProps.initData,
31
- resthooks: () => store.getState(),
30
+ resthooks: useReadyCacheState,
32
31
  },
33
32
  app: <ServerCacheProvider>{nextProps.app}</ServerCacheProvider>,
34
33
  // TODO: figure out how to only inject in next and not have to also put here
@@ -1,9 +1,4 @@
1
- import {
2
- CacheProvider,
3
- Manager,
4
- NetworkManager,
5
- State,
6
- } from '@rest-hooks/core';
1
+ import { CacheProvider, Manager, NetworkManager } from '@rest-hooks/core';
7
2
 
8
3
  import type { ClientSpout } from './types';
9
4
 
@@ -11,16 +6,15 @@ export default function restHooksSpout(
11
6
  options: {
12
7
  getManagers: () => Manager[];
13
8
  } = { getManagers: () => [new NetworkManager()] },
14
- ): ClientSpout<{ initData: Record<string, unknown> }> {
9
+ ): ClientSpout<{ getInitialData: (key: string) => Promise<any> }> {
15
10
  return next => async props => {
16
- const data = props.initData?.resthooks as State<unknown>;
11
+ const nextProps = await next(props);
12
+ const data = await props.getInitialData('resthooks');
17
13
 
18
14
  if (process.env.NODE_ENV !== 'production' && !data) {
19
15
  console.error('Rest Hooks init data not found');
20
16
  }
21
17
 
22
- const nextProps = await next(props);
23
-
24
18
  return {
25
19
  ...nextProps,
26
20
  app: (
@@ -1,8 +0,0 @@
1
- /// <reference types="react" />
2
- import { Controller, Manager } from '@rest-hooks/core';
3
- export declare function createPersistedStore(managers?: Manager[]): readonly [({ children }: {
4
- children: React.ReactNode;
5
- }) => JSX.Element, Controller, import("redux").Store<import("rest-hooks").State<unknown>, import("rest-hooks").ActionTypes> & {
6
- dispatch: unknown;
7
- }];
8
- //# sourceMappingURL=rhHelp.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rhHelp.d.ts","sourceRoot":"","sources":["../../src/spouts/rhHelp.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,UAAU,EAGV,OAAO,EAGR,MAAM,kBAAkB,CAAC;AAI1B,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE;cAYA,MAAM,SAAS;;;GAYvE"}
@@ -1,32 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- exports.__esModule = true;
5
- exports.createPersistedStore = createPersistedStore;
6
- var _jsx2 = _interopRequireDefault(require("@babel/runtime/helpers/jsx"));
7
- var _react = _interopRequireDefault(require("react"));
8
- var _restHooks = require("rest-hooks");
9
- var _core = require("@rest-hooks/core");
10
- var _redux = require("redux");
11
- // TODO: Rework this and upstream to rest hooks
12
- function createPersistedStore(managers) {
13
- var _managers;
14
- const controller = new _core.Controller();
15
- managers = (_managers = managers) != null ? _managers : [new _core.NetworkManager()];
16
- const reducer = (0, _core.createReducer)(controller);
17
- const enhancer = (0, _redux.applyMiddleware)(...(0, _core.applyManager)(managers, controller), _restHooks.PromiseifyMiddleware);
18
- const store = (0, _redux.createStore)(reducer, _core.initialState, enhancer);
19
- managers.forEach(manager => manager.init == null ? void 0 : manager.init(store.getState()));
20
- const selector = state => state;
21
- function ServerCacheProvider({
22
- children
23
- }) {
24
- return /*#__PURE__*/(0, _jsx2.default)(_restHooks.ExternalCacheProvider, {
25
- store: store,
26
- selector: selector,
27
- controller: controller
28
- }, void 0, children);
29
- }
30
- return [ServerCacheProvider, controller, store];
31
- }
32
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVQZXJzaXN0ZWRTdG9yZSIsIm1hbmFnZXJzIiwiY29udHJvbGxlciIsIkNvbnRyb2xsZXIiLCJOZXR3b3JrTWFuYWdlciIsInJlZHVjZXIiLCJjcmVhdGVSZWR1Y2VyIiwiZW5oYW5jZXIiLCJhcHBseU1pZGRsZXdhcmUiLCJhcHBseU1hbmFnZXIiLCJQcm9taXNlaWZ5TWlkZGxld2FyZSIsInN0b3JlIiwiY3JlYXRlU3RvcmUiLCJpbml0aWFsU3RhdGUiLCJmb3JFYWNoIiwibWFuYWdlciIsImluaXQiLCJnZXRTdGF0ZSIsInNlbGVjdG9yIiwic3RhdGUiLCJTZXJ2ZXJDYWNoZVByb3ZpZGVyIiwiY2hpbGRyZW4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BvdXRzL3JoSGVscC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXh0ZXJuYWxDYWNoZVByb3ZpZGVyLCBQcm9taXNlaWZ5TWlkZGxld2FyZSB9IGZyb20gJ3Jlc3QtaG9va3MnO1xuaW1wb3J0IHtcbiAgQ29udHJvbGxlcixcbiAgY3JlYXRlUmVkdWNlcixcbiAgaW5pdGlhbFN0YXRlLFxuICBNYW5hZ2VyLFxuICBhcHBseU1hbmFnZXIsXG4gIE5ldHdvcmtNYW5hZ2VyLFxufSBmcm9tICdAcmVzdC1ob29rcy9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tICdyZWR1eCc7XG5cbi8vIFRPRE86IFJld29yayB0aGlzIGFuZCB1cHN0cmVhbSB0byByZXN0IGhvb2tzXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGVyc2lzdGVkU3RvcmUobWFuYWdlcnM/OiBNYW5hZ2VyW10pIHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKCk7XG4gIG1hbmFnZXJzID0gbWFuYWdlcnMgPz8gW25ldyBOZXR3b3JrTWFuYWdlcigpXTtcbiAgY29uc3QgcmVkdWNlciA9IGNyZWF0ZVJlZHVjZXIoY29udHJvbGxlcik7XG4gIGNvbnN0IGVuaGFuY2VyID0gYXBwbHlNaWRkbGV3YXJlKFxuICAgIC4uLmFwcGx5TWFuYWdlcihtYW5hZ2VycywgY29udHJvbGxlciksXG4gICAgUHJvbWlzZWlmeU1pZGRsZXdhcmUgYXMgYW55LFxuICApO1xuICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSBhcyBhbnksIGVuaGFuY2VyKTtcbiAgbWFuYWdlcnMuZm9yRWFjaChtYW5hZ2VyID0+IG1hbmFnZXIuaW5pdD8uKHN0b3JlLmdldFN0YXRlKCkpKTtcblxuICBjb25zdCBzZWxlY3RvciA9IChzdGF0ZTogYW55KSA9PiBzdGF0ZTtcbiAgZnVuY3Rpb24gU2VydmVyQ2FjaGVQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxFeHRlcm5hbENhY2hlUHJvdmlkZXJcbiAgICAgICAgc3RvcmU9e3N0b3JlfVxuICAgICAgICBzZWxlY3Rvcj17c2VsZWN0b3J9XG4gICAgICAgIGNvbnRyb2xsZXI9e2NvbnRyb2xsZXJ9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvRXh0ZXJuYWxDYWNoZVByb3ZpZGVyPlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIFtTZXJ2ZXJDYWNoZVByb3ZpZGVyLCBjb250cm9sbGVyLCBzdG9yZV0gYXMgY29uc3Q7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBUUE7QUFFQTtBQUNPLFNBQVNBLG9CQUFvQixDQUFDQyxRQUFvQixFQUFFO0VBQUE7RUFDekQsTUFBTUMsVUFBVSxHQUFHLElBQUlDLGdCQUFVLEVBQUU7RUFDbkNGLFFBQVEsZ0JBQUdBLFFBQVEsd0JBQUksQ0FBQyxJQUFJRyxvQkFBYyxFQUFFLENBQUM7RUFDN0MsTUFBTUMsT0FBTyxHQUFHLElBQUFDLG1CQUFhLEVBQUNKLFVBQVUsQ0FBQztFQUN6QyxNQUFNSyxRQUFRLEdBQUcsSUFBQUMsc0JBQWUsRUFDOUIsR0FBRyxJQUFBQyxrQkFBWSxFQUFDUixRQUFRLEVBQUVDLFVBQVUsQ0FBQyxFQUNyQ1EsK0JBQW9CLENBQ3JCO0VBQ0QsTUFBTUMsS0FBSyxHQUFHLElBQUFDLGtCQUFXLEVBQUNQLE9BQU8sRUFBRVEsa0JBQVksRUFBU04sUUFBUSxDQUFDO0VBQ2pFTixRQUFRLENBQUNhLE9BQU8sQ0FBQ0MsT0FBTyxJQUFJQSxPQUFPLENBQUNDLElBQUksb0JBQVpELE9BQU8sQ0FBQ0MsSUFBSSxDQUFHTCxLQUFLLENBQUNNLFFBQVEsRUFBRSxDQUFDLENBQUM7RUFFN0QsTUFBTUMsUUFBUSxHQUFJQyxLQUFVLElBQUtBLEtBQUs7RUFDdEMsU0FBU0MsbUJBQW1CLENBQUM7SUFBRUM7RUFBd0MsQ0FBQyxFQUFFO0lBQ3hFLG9CQUNFLG1CQUFDLGdDQUFxQjtNQUNwQixLQUFLLEVBQUVWLEtBQU07TUFDYixRQUFRLEVBQUVPLFFBQVM7TUFDbkIsVUFBVSxFQUFFaEI7SUFBVyxXQUV0Qm1CLFFBQVEsQ0FDYTtFQUU1QjtFQUNBLE9BQU8sQ0FBQ0QsbUJBQW1CLEVBQUVsQixVQUFVLEVBQUVTLEtBQUssQ0FBQztBQUNqRCJ9
@@ -1,37 +0,0 @@
1
- import { ExternalCacheProvider, PromiseifyMiddleware } from 'rest-hooks';
2
- import {
3
- Controller,
4
- createReducer,
5
- initialState,
6
- Manager,
7
- applyManager,
8
- NetworkManager,
9
- } from '@rest-hooks/core';
10
- import { createStore, applyMiddleware } from 'redux';
11
-
12
- // TODO: Rework this and upstream to rest hooks
13
- export function createPersistedStore(managers?: Manager[]) {
14
- const controller = new Controller();
15
- managers = managers ?? [new NetworkManager()];
16
- const reducer = createReducer(controller);
17
- const enhancer = applyMiddleware(
18
- ...applyManager(managers, controller),
19
- PromiseifyMiddleware as any,
20
- );
21
- const store = createStore(reducer, initialState as any, enhancer);
22
- managers.forEach(manager => manager.init?.(store.getState()));
23
-
24
- const selector = (state: any) => state;
25
- function ServerCacheProvider({ children }: { children: React.ReactNode }) {
26
- return (
27
- <ExternalCacheProvider
28
- store={store}
29
- selector={selector}
30
- controller={controller}
31
- >
32
- {children}
33
- </ExternalCacheProvider>
34
- );
35
- }
36
- return [ServerCacheProvider, controller, store] as const;
37
- }