@anansi/core 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/client.js +29 -21
  3. package/dist/client.js.map +1 -1
  4. package/dist/server.js +205 -30
  5. package/dist/server.js.map +1 -1
  6. package/lib/index.d.ts +1 -0
  7. package/lib/index.d.ts.map +1 -1
  8. package/lib/index.js +6 -2
  9. package/lib/index.server.d.ts +1 -0
  10. package/lib/index.server.d.ts.map +1 -1
  11. package/lib/index.server.js +6 -2
  12. package/lib/laySpouts.d.ts.map +1 -1
  13. package/lib/laySpouts.js +11 -2
  14. package/lib/scripts/startDevserver.d.ts.map +1 -1
  15. package/lib/scripts/startDevserver.js +5 -8
  16. package/lib/spouts/DocumentComponent.d.ts +6 -1
  17. package/lib/spouts/DocumentComponent.d.ts.map +1 -1
  18. package/lib/spouts/DocumentComponent.js +32 -9
  19. package/lib/spouts/csp.d.ts +5 -0
  20. package/lib/spouts/csp.d.ts.map +1 -0
  21. package/lib/spouts/csp.js +20 -0
  22. package/lib/spouts/document.d.ts +1 -1
  23. package/lib/spouts/document.d.ts.map +1 -1
  24. package/lib/spouts/document.js +3 -3
  25. package/lib/spouts/document.server.d.ts +3 -0
  26. package/lib/spouts/document.server.d.ts.map +1 -1
  27. package/lib/spouts/document.server.js +5 -2
  28. package/lib/spouts/json.d.ts +5 -0
  29. package/lib/spouts/json.d.ts.map +1 -0
  30. package/lib/spouts/json.js +22 -0
  31. package/lib/spouts/json.server.d.ts +13 -0
  32. package/lib/spouts/json.server.d.ts.map +1 -0
  33. package/lib/spouts/json.server.js +74 -0
  34. package/lib/spouts/restHooks.d.ts +1 -1
  35. package/lib/spouts/restHooks.d.ts.map +1 -1
  36. package/lib/spouts/restHooks.js +5 -9
  37. package/lib/spouts/restHooks.server.d.ts +41 -1
  38. package/lib/spouts/restHooks.server.d.ts.map +1 -1
  39. package/lib/spouts/restHooks.server.js +6 -3
  40. package/lib/spouts/rhHelp.d.ts +40 -0
  41. package/lib/spouts/rhHelp.d.ts.map +1 -0
  42. package/lib/spouts/rhHelp.js +47 -0
  43. package/lib/spouts/router.d.ts +1 -1
  44. package/lib/spouts/router.d.ts.map +1 -1
  45. package/lib/spouts/router.js +3 -3
  46. package/lib/spouts/types.d.ts +1 -0
  47. package/lib/spouts/types.d.ts.map +1 -1
  48. package/lib/spouts/types.js +1 -1
  49. package/package.json +2 -2
  50. package/src/index.server.ts +1 -0
  51. package/src/index.ts +1 -0
  52. package/src/laySpouts.tsx +5 -1
  53. package/src/scripts/startDevserver.ts +4 -6
  54. package/src/spouts/DocumentComponent.tsx +29 -6
  55. package/src/spouts/csp.ts +25 -0
  56. package/src/spouts/document.server.tsx +6 -0
  57. package/src/spouts/document.tsx +5 -3
  58. package/src/spouts/json.server.tsx +77 -0
  59. package/src/spouts/json.tsx +25 -0
  60. package/src/spouts/restHooks.server.tsx +7 -3
  61. package/src/spouts/restHooks.tsx +12 -7
  62. package/src/spouts/rhHelp.tsx +37 -0
  63. package/src/spouts/router.tsx +5 -3
  64. package/src/spouts/types.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
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.11.0](https://github.com/ntucker/anansi/compare/@anansi/core@0.10.0...@anansi/core@0.11.0) (2022-06-12)
7
+
8
+
9
+ ### 🚀 Features
10
+
11
+ * Add CSP support ([#1541](https://github.com/ntucker/anansi/issues/1541)) ([e8a7415](https://github.com/ntucker/anansi/commit/e8a7415db892d725b76a2d7d451670437d6fb8eb))
12
+
13
+
14
+ ### 💅 Enhancement
15
+
16
+ * Multi-module server side devserver ([b1b6f87](https://github.com/ntucker/anansi/commit/b1b6f873f2a50a9af05683a80d587ac87d90f8f9))
17
+
18
+
19
+
6
20
  ## [0.10.0](https://github.com/ntucker/anansi/compare/@anansi/core@0.9.0...@anansi/core@0.10.0) (2022-06-09)
7
21
 
8
22
 
package/dist/client.js CHANGED
@@ -51,6 +51,7 @@ __webpack_require__.r(__webpack_exports__);
51
51
 
52
52
  // EXPORTS
53
53
  __webpack_require__.d(__webpack_exports__, {
54
+ "JSONSpout": () => (/* reexport */ JSONSpout),
54
55
  "documentSpout": () => (/* reexport */ documentSpout),
55
56
  "floodSpouts": () => (/* reexport */ floodSpouts),
56
57
  "restHooksSpout": () => (/* reexport */ restHooksSpout),
@@ -74,8 +75,8 @@ async function floodSpouts(spouts, {
74
75
  ;// CONCATENATED MODULE: ./src/spouts/document.tsx
75
76
  function documentSpout(options) {
76
77
  return function (next) {
77
- return async () => {
78
- const nextProps = await next();
78
+ return async initData => {
79
+ const nextProps = await next(initData);
79
80
  return nextProps;
80
81
  };
81
82
  };
@@ -85,20 +86,17 @@ const external_react_namespaceObject = require("react");
85
86
  var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_namespaceObject);
86
87
  ;// CONCATENATED MODULE: external "@rest-hooks/core"
87
88
  const core_namespaceObject = require("@rest-hooks/core");
88
- ;// CONCATENATED MODULE: external "@rest-hooks/ssr"
89
- const ssr_namespaceObject = require("@rest-hooks/ssr");
90
89
  ;// CONCATENATED MODULE: ./src/spouts/restHooks.tsx
91
90
  var _jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.tsx";
92
91
 
93
92
 
94
-
95
93
  function restHooksSpout(options = {
96
94
  getManagers: () => [new core_namespaceObject.NetworkManager()]
97
95
  }) {
98
96
  return function (next) {
99
- return async () => {
100
- const data = (0,ssr_namespaceObject.getDatafromDOM)();
101
- const nextProps = await next();
97
+ return async initData => {
98
+ const data = initData.resthooks;
99
+ const nextProps = await next(initData);
102
100
  return { ...nextProps,
103
101
  app: /*#__PURE__*/external_react_default().createElement(core_namespaceObject.CacheProvider, {
104
102
  initialState: data,
@@ -106,18 +104,10 @@ function restHooksSpout(options = {
106
104
  __self: this,
107
105
  __source: {
108
106
  fileName: _jsxFileName,
109
- lineNumber: 22,
107
+ lineNumber: 28,
110
108
  columnNumber: 11
111
109
  }
112
- }, nextProps.app, /*#__PURE__*/external_react_default().createElement(ssr_namespaceObject.ServerDataComponent, {
113
- data: data,
114
- __self: this,
115
- __source: {
116
- fileName: _jsxFileName,
117
- lineNumber: 24,
118
- columnNumber: 13
119
- }
120
- }))
110
+ }, nextProps.app)
121
111
  };
122
112
  };
123
113
  };
@@ -150,11 +140,11 @@ function routerSpout(options) {
150
140
  };
151
141
 
152
142
  return function (next) {
153
- return async () => {
143
+ return async initData => {
154
144
  const history = (0,external_history_namespaceObject.createBrowserHistory)();
155
145
  const router = options.createRouter(history);
156
146
  const matchedRoutes = router.getMatchedRoutes(history.location.pathname);
157
- const nextProps = await next();
147
+ const nextProps = await next(initData);
158
148
  const Router = createRouteComponent(router);
159
149
  return { ...nextProps,
160
150
  matchedRoutes,
@@ -163,7 +153,7 @@ function routerSpout(options) {
163
153
  __self: this,
164
154
  __source: {
165
155
  fileName: router_jsxFileName,
166
- lineNumber: 46,
156
+ lineNumber: 48,
167
157
  columnNumber: 14
168
158
  }
169
159
  }, nextProps.app)
@@ -171,11 +161,29 @@ function routerSpout(options) {
171
161
  };
172
162
  };
173
163
  }
164
+ ;// CONCATENATED MODULE: ./src/spouts/json.tsx
165
+ function JSONSpout({
166
+ id = 'anansi-json'
167
+ } = {}) {
168
+ return function (next) {
169
+ return async () => {
170
+ const initData = getDatafromDOM(id);
171
+ const nextProps = await next(initData);
172
+ return nextProps;
173
+ };
174
+ };
175
+ }
176
+
177
+ function getDatafromDOM(id) {
178
+ const element = document.querySelector(`#${id}`);
179
+ return element !== null && element !== void 0 && element.innerHTML ? JSON.parse(element === null || element === void 0 ? void 0 : element.innerHTML) : undefined;
180
+ }
174
181
  ;// CONCATENATED MODULE: ./src/index.ts
175
182
 
176
183
 
177
184
 
178
185
 
186
+
179
187
  module.exports = __webpack_exports__;
180
188
  /******/ })()
181
189
  ;
@@ -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;;ACDA;AAIA;AACA;AACA;AAEA;AACA;AACA;AACA;;ACrBA;;;ACAA;;ACAA;;;;ACAA;AACA;AAMA;AAGA;AAAA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AALA;AASA;AACA;AACA;;AC7BA;;ACAA;;;ACAA;AACA;AACA;AAOA;AAMA;AAGA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AAHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJA;AAMA;AACA;AACA;;ACjDA;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/external commonjs \"@rest-hooks/ssr\"","/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/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: () => 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 { ResolveProps } from './types';\n\ntype NeededProps = {\n matchedRoutes: Route<any>[];\n title?: string;\n} & ResolveProps;\n\nexport default function documentSpout(options: {\n head?: React.ReactNode;\n title: string;\n}) {\n return function <T extends NeededProps>(next: () => Promise<T>) {\n return async () => {\n const nextProps = await next();\n\n return nextProps;\n };\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/core\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@rest-hooks/ssr\");","import { CacheProvider, Manager, NetworkManager } from '@rest-hooks/core';\nimport { ServerDataComponent, getDatafromDOM } from '@rest-hooks/ssr';\n\nimport type { ResolveProps } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n) {\n return function <T extends NeededProps>(next: () => Promise<T>) {\n return async () => {\n const data = getDatafromDOM();\n\n const nextProps = await next();\n\n return {\n ...nextProps,\n app: (\n <CacheProvider initialState={data} managers={options.getManagers()}>\n {nextProps.app}\n <ServerDataComponent data={data} />\n </CacheProvider>\n ),\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 { ResolveProps, CreateRouter } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n onChange?: (update: Update, callback: () => void | undefined) => void;\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 function <T extends NeededProps>(next: () => Promise<T>) {\n return async () => {\n const history = createBrowserHistory();\n const router = options.createRouter(history);\n const matchedRoutes = router.getMatchedRoutes(history.location.pathname);\n\n const nextProps = await next();\n\n const Router = createRouteComponent(router);\n return {\n ...nextProps,\n matchedRoutes,\n router,\n app: <Router>{nextProps.app}</Router>,\n };\n };\n };\n}\n","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';\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;;ACDA;AAIA;AAGA;AACA;AAEA;AACA;AACA;AACA;;ACvBA;;;ACAA;;;;ACAA;AAWA;AAGA;AAAA;AAEA;AAGA;AACA;AAEA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAHA;AAQA;AACA;AACA;;AClCA;;ACAA;;;ACAA;AACA;AACA;AAOA;AAMA;AAGA;AAAA;AACA;AAEA;AAEA;AACA;AACA;AAHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;;AAEA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJA;AAMA;AACA;AACA;;AC5CA;AACA;AADA;AAGA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;;AACA;AACA;AACA;AACA;;ACxBA;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/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: () => 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 { ResolveProps } from './types';\n\ntype NeededProps = {\n matchedRoutes: Route<any>[];\n title?: string;\n} & ResolveProps;\n\nexport default function documentSpout(options: {\n head?: React.ReactNode;\n title: string;\n}) {\n return function <T extends NeededProps>(\n next: (initData: Record<string, unknown>) => Promise<T>,\n ) {\n return async (initData: Record<string, unknown>) => {\n const nextProps = await next(initData);\n\n return nextProps;\n };\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 { ResolveProps } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function restHooksSpout(\n options: {\n getManagers: () => Manager[];\n } = { getManagers: () => [new NetworkManager()] },\n) {\n return function <T extends NeededProps>(\n next: (initData: Record<string, unknown>) => Promise<T>,\n ) {\n return async (initData: Record<string, unknown>) => {\n const data = initData.resthooks as State<unknown>;\n\n const nextProps = await next(initData);\n\n return {\n ...nextProps,\n app: (\n <CacheProvider initialState={data} managers={options.getManagers()}>\n {nextProps.app}\n </CacheProvider>\n ),\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 { ResolveProps, CreateRouter } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function routerSpout<ResolveWith>(options: {\n resolveWith?: any;\n useResolveWith: () => ResolveWith;\n createRouter: CreateRouter<ResolveWith>;\n onChange?: (update: Update, callback: () => void | undefined) => void;\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 function <T extends NeededProps>(\n next: (initData: Record<string, unknown>) => Promise<T>,\n ) {\n return async (initData: Record<string, unknown>) => {\n const history = createBrowserHistory();\n const router = options.createRouter(history);\n const matchedRoutes = router.getMatchedRoutes(history.location.pathname);\n\n const nextProps = await next(initData);\n\n const Router = createRouteComponent(router);\n return {\n ...nextProps,\n matchedRoutes,\n router,\n app: <Router>{nextProps.app}</Router>,\n };\n };\n };\n}\n","import React from 'react';\nimport type { Route } from '@anansi/router';\n\nimport type { ResolveProps } from './types';\n\ntype NeededProps = ResolveProps;\n\nexport default function JSONSpout({\n id = 'anansi-json',\n}: { id?: string } = {}) {\n return function <T extends NeededProps>(\n next: (initData: Record<string, unknown>) => Promise<T>,\n ) {\n return async () => {\n const initData = getDatafromDOM(id);\n const nextProps = await next(initData);\n\n return nextProps;\n };\n };\n}\nfunction getDatafromDOM(id: string): Record<string, unknown> {\n const element = document.querySelector(`#${id}`);\n return element?.innerHTML ? JSON.parse(element?.innerHTML) : undefined;\n}\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';\n"],"names":[],"sourceRoot":""}
package/dist/server.js CHANGED
@@ -51,6 +51,7 @@ __webpack_require__.r(__webpack_exports__);
51
51
 
52
52
  // EXPORTS
53
53
  __webpack_require__.d(__webpack_exports__, {
54
+ "JSONSpout": () => (/* reexport */ JSONSpout),
54
55
  "documentSpout": () => (/* reexport */ DocumentSpout),
55
56
  "laySpouts": () => (/* reexport */ laySpouts),
56
57
  "prefetchSpout": () => (/* reexport */ prefetchSpout),
@@ -60,18 +61,24 @@ __webpack_require__.d(__webpack_exports__, {
60
61
 
61
62
  ;// CONCATENATED MODULE: external "react-dom/server"
62
63
  const server_namespaceObject = require("react-dom/server");
64
+ ;// CONCATENATED MODULE: external "crypto"
65
+ const external_crypto_namespaceObject = require("crypto");
66
+ var external_crypto_default = /*#__PURE__*/__webpack_require__.n(external_crypto_namespaceObject);
63
67
  ;// CONCATENATED MODULE: ./src/laySpouts.tsx
64
68
 
69
+
65
70
  function laySpouts(spouts, {
66
71
  timeoutMS = 200
67
72
  } = {}) {
68
73
  const render = async (clientManifest, req, res) => {
74
+ const nonce = external_crypto_default().randomBytes(16).toString('base64');
69
75
  const {
70
76
  app
71
77
  } = await spouts({
72
78
  clientManifest,
73
79
  req,
74
- res
80
+ res,
81
+ nonce
75
82
  });
76
83
  let didError = false;
77
84
  const {
@@ -95,6 +102,8 @@ function laySpouts(spouts, {
95
102
  |};
96
103
  */
97
104
  {
105
+ nonce,
106
+
98
107
  //bootstrapScripts: assets.filter(asset => asset.endsWith('.js')),
99
108
  onShellReady() {
100
109
  //managers.forEach(manager => manager.cleanup());
@@ -127,31 +136,77 @@ function laySpouts(spouts, {
127
136
  ;// CONCATENATED MODULE: external "react"
128
137
  const external_react_namespaceObject = require("react");
129
138
  var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_namespaceObject);
139
+ ;// CONCATENATED MODULE: ./src/spouts/csp.ts
140
+ // TODO: memoize this
141
+ function buildPolicy(policyObj) {
142
+ return Object.keys(policyObj).map(key => {
143
+ const val = Array.isArray(policyObj[key]) ? [...new Set(policyObj[key]).values()].filter(v => v).join(' ') : policyObj[key]; // move strict dynamic to the end of the policy if it exists to be backwards compatible with csp2
144
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#strict-dynamic
145
+
146
+ if (typeof val === 'string' && val.includes("'strict-dynamic'")) {
147
+ const newVal = `${val.replace(/\s?'strict-dynamic'\s?/gi, ' ').trim()} 'strict-dynamic'`;
148
+ return `${key} ${newVal}`;
149
+ }
150
+
151
+ return `${key} ${val}`;
152
+ }).join('; ');
153
+ }
130
154
  ;// CONCATENATED MODULE: ./src/spouts/DocumentComponent.tsx
131
155
  var _jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/DocumentComponent.tsx",
132
156
  _process$env$WEBPACK_;
133
157
 
134
158
 
159
+
135
160
  function Document({
136
161
  assets,
137
162
  head,
138
163
  children,
139
164
  title,
140
165
  rootId,
141
- charSet
166
+ charSet,
167
+ csPolicy,
168
+ nonce,
169
+ scripts
142
170
  }) {
171
+ let cspMeta = null;
172
+
173
+ if (csPolicy) {
174
+ // add nonce to policy
175
+ const policy = { ...csPolicy
176
+ };
177
+
178
+ if (nonce) {
179
+ if (typeof policy['script-src'] === 'string') {
180
+ policy['script-src'] = [policy['script-src'], `'nonce-${nonce}'`];
181
+ } else {
182
+ policy['script-src'] = [...policy['script-src'], `'nonce-${nonce}'`];
183
+ }
184
+ }
185
+
186
+ cspMeta = /*#__PURE__*/external_react_default().createElement("meta", {
187
+ httpEquiv: "Content-Security-Policy",
188
+ content: buildPolicy(policy),
189
+ __self: this,
190
+ __source: {
191
+ fileName: _jsxFileName,
192
+ lineNumber: 41,
193
+ columnNumber: 7
194
+ }
195
+ });
196
+ }
197
+
143
198
  return /*#__PURE__*/external_react_default().createElement("html", {
144
199
  __self: this,
145
200
  __source: {
146
201
  fileName: _jsxFileName,
147
- lineNumber: 19,
202
+ lineNumber: 45,
148
203
  columnNumber: 5
149
204
  }
150
205
  }, /*#__PURE__*/external_react_default().createElement("head", {
151
206
  __self: this,
152
207
  __source: {
153
208
  fileName: _jsxFileName,
154
- lineNumber: 20,
209
+ lineNumber: 46,
155
210
  columnNumber: 7
156
211
  }
157
212
  }, /*#__PURE__*/external_react_default().createElement("meta", {
@@ -159,31 +214,31 @@ function Document({
159
214
  __self: this,
160
215
  __source: {
161
216
  fileName: _jsxFileName,
162
- lineNumber: 21,
217
+ lineNumber: 47,
163
218
  columnNumber: 9
164
219
  }
165
- }), head, assets.map((asset, i) => /*#__PURE__*/external_react_default().createElement("link", {
220
+ }), cspMeta, head, assets.map((asset, i) => /*#__PURE__*/external_react_default().createElement("link", {
166
221
  key: i,
167
222
  rel: "preload",
168
223
  ...asset,
169
224
  __self: this,
170
225
  __source: {
171
226
  fileName: _jsxFileName,
172
- lineNumber: 24,
227
+ lineNumber: 51,
173
228
  columnNumber: 11
174
229
  }
175
230
  })), /*#__PURE__*/external_react_default().createElement("title", {
176
231
  __self: this,
177
232
  __source: {
178
233
  fileName: _jsxFileName,
179
- lineNumber: 26,
234
+ lineNumber: 53,
180
235
  columnNumber: 9
181
236
  }
182
237
  }, title)), /*#__PURE__*/external_react_default().createElement("body", {
183
238
  __self: this,
184
239
  __source: {
185
240
  fileName: _jsxFileName,
186
- lineNumber: 28,
241
+ lineNumber: 55,
187
242
  columnNumber: 7
188
243
  }
189
244
  }, /*#__PURE__*/external_react_default().createElement("div", {
@@ -191,20 +246,10 @@ function Document({
191
246
  __self: this,
192
247
  __source: {
193
248
  fileName: _jsxFileName,
194
- lineNumber: 29,
249
+ lineNumber: 56,
195
250
  columnNumber: 9
196
251
  }
197
- }, children), /*#__PURE__*/external_react_default().createElement("script", {
198
- dangerouslySetInnerHTML: {
199
- __html: `assetManifest = ${JSON.stringify(assets)};`
200
- },
201
- __self: this,
202
- __source: {
203
- fileName: _jsxFileName,
204
- lineNumber: 31,
205
- columnNumber: 9
206
- }
207
- }), assets.filter(({
252
+ }, children), scripts, assets.filter(({
208
253
  href
209
254
  }) => href.endsWith('.js')).map(({
210
255
  href
@@ -215,7 +260,7 @@ function Document({
215
260
  __self: this,
216
261
  __source: {
217
262
  fileName: _jsxFileName,
218
- lineNumber: 39,
263
+ lineNumber: 61,
219
264
  columnNumber: 13
220
265
  }
221
266
  }))));
@@ -227,7 +272,7 @@ Document.defaultProps = {
227
272
  __self: undefined,
228
273
  __source: {
229
274
  fileName: _jsxFileName,
230
- lineNumber: 48,
275
+ lineNumber: 70,
231
276
  columnNumber: 7
232
277
  }
233
278
  }), /*#__PURE__*/external_react_default().createElement("link", {
@@ -236,12 +281,13 @@ Document.defaultProps = {
236
281
  __self: undefined,
237
282
  __source: {
238
283
  fileName: _jsxFileName,
239
- lineNumber: 49,
284
+ lineNumber: 71,
240
285
  columnNumber: 7
241
286
  }
242
287
  })),
243
288
  charSet: 'utf-8',
244
- rootId: 'anansi-root'
289
+ rootId: 'anansi-root',
290
+ scripts: null
245
291
  };
246
292
  ;// CONCATENATED MODULE: ./src/spouts/document.server.tsx
247
293
  var document_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/document.server.tsx";
@@ -290,10 +336,13 @@ function DocumentSpout(options) {
290
336
  title: (_nextProps$title = nextProps.title) != null ? _nextProps$title : options.title,
291
337
  assets: assets,
292
338
  rootId: options.rootId,
339
+ nonce: props.nonce,
340
+ csPolicy: options.csPolicy,
341
+ scripts: nextProps.scripts,
293
342
  __self: this,
294
343
  __source: {
295
344
  fileName: document_server_jsxFileName,
296
- lineNumber: 53,
345
+ lineNumber: 56,
297
346
  columnNumber: 14
298
347
  }
299
348
  }, nextProps.app)
@@ -311,8 +360,51 @@ function childrenAssets(chunk) {
311
360
  }
312
361
  ;// CONCATENATED MODULE: external "@rest-hooks/core"
313
362
  const core_namespaceObject = require("@rest-hooks/core");
314
- ;// CONCATENATED MODULE: external "@rest-hooks/ssr"
315
- const ssr_namespaceObject = require("@rest-hooks/ssr");
363
+ ;// CONCATENATED MODULE: external "rest-hooks"
364
+ const external_rest_hooks_namespaceObject = require("rest-hooks");
365
+ ;// CONCATENATED MODULE: external "redux"
366
+ const external_redux_namespaceObject = require("redux");
367
+ ;// CONCATENATED MODULE: ./src/spouts/rhHelp.tsx
368
+ var rhHelp_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/rhHelp.tsx";
369
+
370
+
371
+
372
+ // TODO: Rework this and upstream to rest hooks
373
+
374
+ function createPersistedStore(managers) {
375
+ var _managers;
376
+
377
+ const controller = new core_namespaceObject.Controller();
378
+ managers = (_managers = managers) != null ? _managers : [new core_namespaceObject.NetworkManager()];
379
+ const reducer = (0,core_namespaceObject.createReducer)(controller);
380
+ const enhancer = (0,external_redux_namespaceObject.applyMiddleware)(...(0,core_namespaceObject.applyManager)(managers, controller), external_rest_hooks_namespaceObject.PromiseifyMiddleware);
381
+ const store = (0,external_redux_namespaceObject.createStore)(reducer, core_namespaceObject.initialState, enhancer);
382
+ managers.forEach(manager => {
383
+ var _manager$init;
384
+
385
+ return (_manager$init = manager.init) === null || _manager$init === void 0 ? void 0 : _manager$init.call(manager, store.getState());
386
+ });
387
+
388
+ const selector = state => state;
389
+
390
+ function ServerCacheProvider({
391
+ children
392
+ }) {
393
+ return /*#__PURE__*/external_react_default().createElement(external_rest_hooks_namespaceObject.ExternalCacheProvider, {
394
+ store: store,
395
+ selector: selector,
396
+ controller: controller,
397
+ __self: this,
398
+ __source: {
399
+ fileName: rhHelp_jsxFileName,
400
+ lineNumber: 27,
401
+ columnNumber: 7
402
+ }
403
+ }, children);
404
+ }
405
+
406
+ return [ServerCacheProvider, controller, store];
407
+ }
316
408
  ;// CONCATENATED MODULE: ./src/spouts/restHooks.server.tsx
317
409
  var restHooks_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.server.tsx";
318
410
 
@@ -323,15 +415,18 @@ function restHooksSpout(options = {
323
415
  }) {
324
416
  return function (next) {
325
417
  return async props => {
326
- const [ServerCacheProvider, controller] = (0,ssr_namespaceObject.createPersistedStore)(options.getManagers());
418
+ const [ServerCacheProvider, controller, store] = createPersistedStore(options.getManagers());
327
419
  const nextProps = await next(props);
328
420
  return { ...nextProps,
329
421
  controller,
422
+ initData: { ...nextProps.initData,
423
+ resthooks: () => store.getState()
424
+ },
330
425
  app: /*#__PURE__*/external_react_default().createElement(ServerCacheProvider, {
331
426
  __self: this,
332
427
  __source: {
333
428
  fileName: restHooks_server_jsxFileName,
334
- lineNumber: 26,
429
+ lineNumber: 30,
335
430
  columnNumber: 14
336
431
  }
337
432
  }, nextProps.app)
@@ -411,12 +506,92 @@ function prefetchSpout(field) {
411
506
  };
412
507
  };
413
508
  }
509
+ ;// CONCATENATED MODULE: ./src/spouts/json.server.tsx
510
+ var json_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/json.server.tsx";
511
+
512
+ function JSONSpout({
513
+ id = 'anansi-json'
514
+ } = {}) {
515
+ return function (next) {
516
+ return async props => {
517
+ var _nextProps$scripts;
518
+
519
+ const nextProps = await next(props);
520
+ const scripts = (_nextProps$scripts = nextProps.scripts) != null ? _nextProps$scripts : [];
521
+ /*
522
+ Object.entries(nextProps.initData ?? {}).forEach(([key, data]) => {
523
+ try {
524
+ const encoded = JSON.stringify(data);
525
+ scripts.push(
526
+ <script
527
+ key={key}
528
+ id={`${id}-${key}`}
529
+ type="application/json"
530
+ dangerouslySetInnerHTML={{
531
+ __html: encoded,
532
+ }}
533
+ nonce={props.nonce}
534
+ />,
535
+ );
536
+ } catch (e) {
537
+ // TODO: Use unified logging
538
+ console.error(e);
539
+ }
540
+ });*/
541
+
542
+ const Script = () => {
543
+ try {
544
+ var _nextProps$initData;
545
+
546
+ const data = {};
547
+ Object.entries((_nextProps$initData = nextProps.initData) != null ? _nextProps$initData : {}).forEach(([key, getData]) => {
548
+ data[key] = getData();
549
+ });
550
+ const encoded = JSON.stringify(data);
551
+ return /*#__PURE__*/external_react_default().createElement("script", {
552
+ key: id,
553
+ id: id,
554
+ type: "application/json",
555
+ dangerouslySetInnerHTML: {
556
+ __html: encoded
557
+ },
558
+ nonce: props.nonce,
559
+ __self: this,
560
+ __source: {
561
+ fileName: json_server_jsxFileName,
562
+ lineNumber: 52,
563
+ columnNumber: 13
564
+ }
565
+ });
566
+ } catch (e) {
567
+ // TODO: Use unified logging
568
+ console.error('Error serializing json');
569
+ console.error(e);
570
+ return null;
571
+ }
572
+ };
573
+
574
+ scripts.push( /*#__PURE__*/external_react_default().createElement(Script, {
575
+ __self: this,
576
+ __source: {
577
+ fileName: json_server_jsxFileName,
578
+ lineNumber: 69,
579
+ columnNumber: 20
580
+ }
581
+ }));
582
+ return { ...nextProps,
583
+ scripts
584
+ };
585
+ };
586
+ };
587
+ }
414
588
  ;// CONCATENATED MODULE: ./src/index.server.ts
415
589
 
416
590
 
417
591
 
418
592
 
419
593
 
594
+
420
595
  module.exports = __webpack_exports__;
421
596
  /******/ })()
422
597
  ;