@anansi/core 0.10.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/client.js +29 -21
  3. package/dist/client.js.map +1 -1
  4. package/dist/server.js +206 -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 +21 -10
  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 +33 -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 +3 -3
  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 +21 -7
  54. package/src/spouts/DocumentComponent.tsx +34 -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,44 @@
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.2](https://github.com/ntucker/anansi/compare/@anansi/core@0.11.1...@anansi/core@0.11.2) (2022-06-13)
7
+
8
+
9
+ ### 💅 Enhancement
10
+
11
+ * Do not override 'unsafe-inline' with nonce for CSP ([cfbd2bd](https://github.com/ntucker/anansi/commit/cfbd2bdfa69ae97ef2db6a824496888420251371))
12
+ * Use 'text' to get inline JSON ([9ecdb07](https://github.com/ntucker/anansi/commit/9ecdb074d01e6f09c28a685433105cf0d6f711cc))
13
+
14
+
15
+ ### 📦 Package
16
+
17
+ * Update `webpack-cli` to v4.10.0 ([#1543](https://github.com/ntucker/anansi/issues/1543)) ([298cb01](https://github.com/ntucker/anansi/commit/298cb018db2975fb5c926c48d2145d7c1f4515b9))
18
+
19
+
20
+
21
+ ### [0.11.1](https://github.com/ntucker/anansi/compare/@anansi/core@0.11.0...@anansi/core@0.11.1) (2022-06-13)
22
+
23
+
24
+ ### 🐛 Bug Fix
25
+
26
+ * Use call user-config devServer.setupMiddleware ([99acd8c](https://github.com/ntucker/anansi/commit/99acd8c9386bfc338ef8733d19a734b2a8be21dd))
27
+
28
+
29
+
30
+ ## [0.11.0](https://github.com/ntucker/anansi/compare/@anansi/core@0.10.0...@anansi/core@0.11.0) (2022-06-12)
31
+
32
+
33
+ ### 🚀 Features
34
+
35
+ * Add CSP support ([#1541](https://github.com/ntucker/anansi/issues/1541)) ([e8a7415](https://github.com/ntucker/anansi/commit/e8a7415db892d725b76a2d7d451670437d6fb8eb))
36
+
37
+
38
+ ### 💅 Enhancement
39
+
40
+ * Multi-module server side devserver ([b1b6f87](https://github.com/ntucker/anansi/commit/b1b6f873f2a50a9af05683a80d587ac87d90f8f9))
41
+
42
+
43
+
6
44
  ## [0.10.0](https://github.com/ntucker/anansi/compare/@anansi/core@0.9.0...@anansi/core@0.10.0) (2022-06-09)
7
45
 
8
46
 
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.text ? JSON.parse(element === null || element === void 0 ? void 0 : element.text) : 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: HTMLScriptElement | null = document.querySelector(`#${id}`);\n return element?.text ? JSON.parse(element?.text) : 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,78 @@ 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 && ( // nonces negate 'unsafe-inline' so do not add it if that directive exists
179
+ !policy['script-src'] || !policy['script-src'].includes("'unsafe-inline'"))) {
180
+ if (typeof policy['script-src'] === 'string') {
181
+ policy['script-src'] = [policy['script-src'], `'nonce-${nonce}'`];
182
+ } else {
183
+ policy['script-src'] = [...policy['script-src'], `'nonce-${nonce}'`];
184
+ }
185
+ }
186
+
187
+ cspMeta = /*#__PURE__*/external_react_default().createElement("meta", {
188
+ httpEquiv: "Content-Security-Policy",
189
+ content: buildPolicy(policy),
190
+ __self: this,
191
+ __source: {
192
+ fileName: _jsxFileName,
193
+ lineNumber: 46,
194
+ columnNumber: 7
195
+ }
196
+ });
197
+ }
198
+
143
199
  return /*#__PURE__*/external_react_default().createElement("html", {
144
200
  __self: this,
145
201
  __source: {
146
202
  fileName: _jsxFileName,
147
- lineNumber: 19,
203
+ lineNumber: 50,
148
204
  columnNumber: 5
149
205
  }
150
206
  }, /*#__PURE__*/external_react_default().createElement("head", {
151
207
  __self: this,
152
208
  __source: {
153
209
  fileName: _jsxFileName,
154
- lineNumber: 20,
210
+ lineNumber: 51,
155
211
  columnNumber: 7
156
212
  }
157
213
  }, /*#__PURE__*/external_react_default().createElement("meta", {
@@ -159,31 +215,31 @@ function Document({
159
215
  __self: this,
160
216
  __source: {
161
217
  fileName: _jsxFileName,
162
- lineNumber: 21,
218
+ lineNumber: 52,
163
219
  columnNumber: 9
164
220
  }
165
- }), head, assets.map((asset, i) => /*#__PURE__*/external_react_default().createElement("link", {
221
+ }), cspMeta, head, assets.map((asset, i) => /*#__PURE__*/external_react_default().createElement("link", {
166
222
  key: i,
167
223
  rel: "preload",
168
224
  ...asset,
169
225
  __self: this,
170
226
  __source: {
171
227
  fileName: _jsxFileName,
172
- lineNumber: 24,
228
+ lineNumber: 56,
173
229
  columnNumber: 11
174
230
  }
175
231
  })), /*#__PURE__*/external_react_default().createElement("title", {
176
232
  __self: this,
177
233
  __source: {
178
234
  fileName: _jsxFileName,
179
- lineNumber: 26,
235
+ lineNumber: 58,
180
236
  columnNumber: 9
181
237
  }
182
238
  }, title)), /*#__PURE__*/external_react_default().createElement("body", {
183
239
  __self: this,
184
240
  __source: {
185
241
  fileName: _jsxFileName,
186
- lineNumber: 28,
242
+ lineNumber: 60,
187
243
  columnNumber: 7
188
244
  }
189
245
  }, /*#__PURE__*/external_react_default().createElement("div", {
@@ -191,20 +247,10 @@ function Document({
191
247
  __self: this,
192
248
  __source: {
193
249
  fileName: _jsxFileName,
194
- lineNumber: 29,
250
+ lineNumber: 61,
195
251
  columnNumber: 9
196
252
  }
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(({
253
+ }, children), scripts, assets.filter(({
208
254
  href
209
255
  }) => href.endsWith('.js')).map(({
210
256
  href
@@ -215,7 +261,7 @@ function Document({
215
261
  __self: this,
216
262
  __source: {
217
263
  fileName: _jsxFileName,
218
- lineNumber: 39,
264
+ lineNumber: 66,
219
265
  columnNumber: 13
220
266
  }
221
267
  }))));
@@ -227,7 +273,7 @@ Document.defaultProps = {
227
273
  __self: undefined,
228
274
  __source: {
229
275
  fileName: _jsxFileName,
230
- lineNumber: 48,
276
+ lineNumber: 75,
231
277
  columnNumber: 7
232
278
  }
233
279
  }), /*#__PURE__*/external_react_default().createElement("link", {
@@ -236,12 +282,13 @@ Document.defaultProps = {
236
282
  __self: undefined,
237
283
  __source: {
238
284
  fileName: _jsxFileName,
239
- lineNumber: 49,
285
+ lineNumber: 76,
240
286
  columnNumber: 7
241
287
  }
242
288
  })),
243
289
  charSet: 'utf-8',
244
- rootId: 'anansi-root'
290
+ rootId: 'anansi-root',
291
+ scripts: null
245
292
  };
246
293
  ;// CONCATENATED MODULE: ./src/spouts/document.server.tsx
247
294
  var document_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/document.server.tsx";
@@ -290,10 +337,13 @@ function DocumentSpout(options) {
290
337
  title: (_nextProps$title = nextProps.title) != null ? _nextProps$title : options.title,
291
338
  assets: assets,
292
339
  rootId: options.rootId,
340
+ nonce: props.nonce,
341
+ csPolicy: options.csPolicy,
342
+ scripts: nextProps.scripts,
293
343
  __self: this,
294
344
  __source: {
295
345
  fileName: document_server_jsxFileName,
296
- lineNumber: 53,
346
+ lineNumber: 56,
297
347
  columnNumber: 14
298
348
  }
299
349
  }, nextProps.app)
@@ -311,8 +361,51 @@ function childrenAssets(chunk) {
311
361
  }
312
362
  ;// CONCATENATED MODULE: external "@rest-hooks/core"
313
363
  const core_namespaceObject = require("@rest-hooks/core");
314
- ;// CONCATENATED MODULE: external "@rest-hooks/ssr"
315
- const ssr_namespaceObject = require("@rest-hooks/ssr");
364
+ ;// CONCATENATED MODULE: external "rest-hooks"
365
+ const external_rest_hooks_namespaceObject = require("rest-hooks");
366
+ ;// CONCATENATED MODULE: external "redux"
367
+ const external_redux_namespaceObject = require("redux");
368
+ ;// CONCATENATED MODULE: ./src/spouts/rhHelp.tsx
369
+ var rhHelp_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/rhHelp.tsx";
370
+
371
+
372
+
373
+ // TODO: Rework this and upstream to rest hooks
374
+
375
+ function createPersistedStore(managers) {
376
+ var _managers;
377
+
378
+ const controller = new core_namespaceObject.Controller();
379
+ managers = (_managers = managers) != null ? _managers : [new core_namespaceObject.NetworkManager()];
380
+ const reducer = (0,core_namespaceObject.createReducer)(controller);
381
+ const enhancer = (0,external_redux_namespaceObject.applyMiddleware)(...(0,core_namespaceObject.applyManager)(managers, controller), external_rest_hooks_namespaceObject.PromiseifyMiddleware);
382
+ const store = (0,external_redux_namespaceObject.createStore)(reducer, core_namespaceObject.initialState, enhancer);
383
+ managers.forEach(manager => {
384
+ var _manager$init;
385
+
386
+ return (_manager$init = manager.init) === null || _manager$init === void 0 ? void 0 : _manager$init.call(manager, store.getState());
387
+ });
388
+
389
+ const selector = state => state;
390
+
391
+ function ServerCacheProvider({
392
+ children
393
+ }) {
394
+ return /*#__PURE__*/external_react_default().createElement(external_rest_hooks_namespaceObject.ExternalCacheProvider, {
395
+ store: store,
396
+ selector: selector,
397
+ controller: controller,
398
+ __self: this,
399
+ __source: {
400
+ fileName: rhHelp_jsxFileName,
401
+ lineNumber: 27,
402
+ columnNumber: 7
403
+ }
404
+ }, children);
405
+ }
406
+
407
+ return [ServerCacheProvider, controller, store];
408
+ }
316
409
  ;// CONCATENATED MODULE: ./src/spouts/restHooks.server.tsx
317
410
  var restHooks_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/restHooks.server.tsx";
318
411
 
@@ -323,15 +416,18 @@ function restHooksSpout(options = {
323
416
  }) {
324
417
  return function (next) {
325
418
  return async props => {
326
- const [ServerCacheProvider, controller] = (0,ssr_namespaceObject.createPersistedStore)(options.getManagers());
419
+ const [ServerCacheProvider, controller, store] = createPersistedStore(options.getManagers());
327
420
  const nextProps = await next(props);
328
421
  return { ...nextProps,
329
422
  controller,
423
+ initData: { ...nextProps.initData,
424
+ resthooks: () => store.getState()
425
+ },
330
426
  app: /*#__PURE__*/external_react_default().createElement(ServerCacheProvider, {
331
427
  __self: this,
332
428
  __source: {
333
429
  fileName: restHooks_server_jsxFileName,
334
- lineNumber: 26,
430
+ lineNumber: 30,
335
431
  columnNumber: 14
336
432
  }
337
433
  }, nextProps.app)
@@ -411,12 +507,92 @@ function prefetchSpout(field) {
411
507
  };
412
508
  };
413
509
  }
510
+ ;// CONCATENATED MODULE: ./src/spouts/json.server.tsx
511
+ var json_server_jsxFileName = "/home/ntucker/src/anansi/packages/core/src/spouts/json.server.tsx";
512
+
513
+ function JSONSpout({
514
+ id = 'anansi-json'
515
+ } = {}) {
516
+ return function (next) {
517
+ return async props => {
518
+ var _nextProps$scripts;
519
+
520
+ const nextProps = await next(props);
521
+ const scripts = (_nextProps$scripts = nextProps.scripts) != null ? _nextProps$scripts : [];
522
+ /*
523
+ Object.entries(nextProps.initData ?? {}).forEach(([key, data]) => {
524
+ try {
525
+ const encoded = JSON.stringify(data);
526
+ scripts.push(
527
+ <script
528
+ key={key}
529
+ id={`${id}-${key}`}
530
+ type="application/json"
531
+ dangerouslySetInnerHTML={{
532
+ __html: encoded,
533
+ }}
534
+ nonce={props.nonce}
535
+ />,
536
+ );
537
+ } catch (e) {
538
+ // TODO: Use unified logging
539
+ console.error(e);
540
+ }
541
+ });*/
542
+
543
+ const Script = () => {
544
+ try {
545
+ var _nextProps$initData;
546
+
547
+ const data = {};
548
+ Object.entries((_nextProps$initData = nextProps.initData) != null ? _nextProps$initData : {}).forEach(([key, getData]) => {
549
+ data[key] = getData();
550
+ });
551
+ const encoded = JSON.stringify(data);
552
+ return /*#__PURE__*/external_react_default().createElement("script", {
553
+ key: id,
554
+ id: id,
555
+ type: "application/json",
556
+ dangerouslySetInnerHTML: {
557
+ __html: encoded
558
+ },
559
+ nonce: props.nonce,
560
+ __self: this,
561
+ __source: {
562
+ fileName: json_server_jsxFileName,
563
+ lineNumber: 52,
564
+ columnNumber: 13
565
+ }
566
+ });
567
+ } catch (e) {
568
+ // TODO: Use unified logging
569
+ console.error('Error serializing json');
570
+ console.error(e);
571
+ return null;
572
+ }
573
+ };
574
+
575
+ scripts.push( /*#__PURE__*/external_react_default().createElement(Script, {
576
+ __self: this,
577
+ __source: {
578
+ fileName: json_server_jsxFileName,
579
+ lineNumber: 69,
580
+ columnNumber: 20
581
+ }
582
+ }));
583
+ return { ...nextProps,
584
+ scripts
585
+ };
586
+ };
587
+ };
588
+ }
414
589
  ;// CONCATENATED MODULE: ./src/index.server.ts
415
590
 
416
591
 
417
592
 
418
593
 
419
594
 
595
+
420
596
  module.exports = __webpack_exports__;
421
597
  /******/ })()
422
598
  ;