@anansi/core 0.7.4 → 0.10.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 (56) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/client.js +3 -2
  3. package/dist/client.js.map +1 -1
  4. package/dist/server.js +27 -23
  5. package/dist/server.js.map +1 -1
  6. package/lib/floodSpouts.d.ts +6 -0
  7. package/lib/floodSpouts.d.ts.map +1 -0
  8. package/lib/index.d.ts +5 -0
  9. package/lib/index.d.ts.map +1 -0
  10. package/lib/index.server.d.ts +6 -0
  11. package/lib/index.server.d.ts.map +1 -0
  12. package/lib/laySpouts.d.ts +8 -0
  13. package/lib/laySpouts.d.ts.map +1 -0
  14. package/lib/scripts/getProxyMiddlewares.d.ts +3 -0
  15. package/lib/scripts/getProxyMiddlewares.d.ts.map +1 -0
  16. package/lib/scripts/getProxyMiddlewares.js +106 -0
  17. package/lib/scripts/index.d.ts +3 -0
  18. package/lib/scripts/index.d.ts.map +1 -0
  19. package/lib/scripts/index.js +15 -0
  20. package/lib/scripts/serve.d.ts +7 -0
  21. package/lib/scripts/serve.d.ts.map +1 -0
  22. package/lib/scripts/serve.js +188 -0
  23. package/lib/scripts/startDevserver.d.ts +4 -0
  24. package/lib/scripts/startDevserver.d.ts.map +1 -0
  25. package/lib/scripts/startDevserver.js +171 -167
  26. package/lib/scripts/types.d.ts +7 -0
  27. package/lib/scripts/types.d.ts.map +1 -0
  28. package/lib/spouts/DocumentComponent.d.ts +23 -0
  29. package/lib/spouts/DocumentComponent.d.ts.map +1 -0
  30. package/lib/spouts/DocumentComponent.js +10 -6
  31. package/lib/spouts/document.d.ts +13 -0
  32. package/lib/spouts/document.d.ts.map +1 -0
  33. package/lib/spouts/document.server.d.ts +17 -0
  34. package/lib/spouts/document.server.d.ts.map +1 -0
  35. package/lib/spouts/document.server.js +1 -1
  36. package/lib/spouts/prefetch.server.d.ts +8 -0
  37. package/lib/spouts/prefetch.server.d.ts.map +1 -0
  38. package/lib/spouts/restHooks.d.ts +8 -0
  39. package/lib/spouts/restHooks.d.ts.map +1 -0
  40. package/lib/spouts/restHooks.server.d.ts +9 -0
  41. package/lib/spouts/restHooks.server.d.ts.map +1 -0
  42. package/lib/spouts/router.d.ts +14 -0
  43. package/lib/spouts/router.d.ts.map +1 -0
  44. package/lib/spouts/router.js +3 -2
  45. package/lib/spouts/router.server.d.ts +12 -0
  46. package/lib/spouts/router.server.d.ts.map +1 -0
  47. package/lib/spouts/types.d.ts +16 -0
  48. package/lib/spouts/types.d.ts.map +1 -0
  49. package/package.json +15 -8
  50. package/src/scripts/getProxyMiddlewares.ts +129 -0
  51. package/src/scripts/index.ts +2 -0
  52. package/src/scripts/serve.ts +211 -0
  53. package/src/scripts/startDevserver.ts +204 -198
  54. package/src/spouts/DocumentComponent.tsx +8 -2
  55. package/src/spouts/document.server.tsx +2 -1
  56. package/src/spouts/router.tsx +7 -1
@@ -65,4 +65,4 @@ function childrenAssets(chunk) {
65
65
  return (_c$assets = c.assets) != null ? _c$assets : [];
66
66
  })) : [];
67
67
  }
68
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEb2N1bWVudFNwb3V0Iiwib3B0aW9ucyIsIm5leHQiLCJwcm9wcyIsIm5leHRQcm9wcyIsInB1YmxpY1BhdGgiLCJjbGllbnRNYW5pZmVzdCIsIk9iamVjdCIsImtleXMiLCJlbnRyeXBvaW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIkVycm9yIiwiYXNzZXRNYXAiLCJhc3NldHMiLCJtYXAiLCJuYW1lIiwiYXNzZXRMaXN0IiwidmFsdWVzIiwiZm9yRWFjaCIsImVudHJ5cG9pbnQiLCJwdXNoIiwiU2V0IiwibmFtZWRDaHVua0dyb3VwcyIsImZpbHRlciIsIm1hdGNoZWRSb3V0ZXMiLCJzb21lIiwicm91dGUiLCJpbmNsdWRlcyIsImZsYXRNYXAiLCJjaHVuayIsImNoaWxkcmVuQXNzZXRzIiwiYXNzZXQiLCJlbmRzV2l0aCIsImhyZWYiLCJyZWwiLCJhcyIsImFwcCIsInRpdGxlIiwicm9vdElkIiwiY2hpbGRyZW4iLCJwcmVsb2FkIiwiYyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvZG9jdW1lbnQuc2VydmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcbmltcG9ydCB7IFN0YXRzQ2h1bmtHcm91cCB9IGZyb20gJ3dlYnBhY2snO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzLCBSZXNvbHZlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBEb2N1bWVudCBmcm9tICcuL0RvY3VtZW50Q29tcG9uZW50JztcblxudHlwZSBOZWVkZWRQcm9wcyA9IHtcbiAgbWF0Y2hlZFJvdXRlczogUm91dGU8YW55PltdO1xuICB0aXRsZT86IHN0cmluZztcbn0gJiBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERvY3VtZW50U3BvdXQob3B0aW9uczoge1xuICBoZWFkPzogUmVhY3QuUmVhY3ROb2RlO1xuICB0aXRsZTogc3RyaW5nO1xuICByb290SWQ6IHN0cmluZztcbn0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KFxuICAgIG5leHQ6IChwcm9wczogU2VydmVyUHJvcHMpID0+IFByb21pc2U8VD4sXG4gICkge1xuICAgIHJldHVybiBhc3luYyAocHJvcHM6IFNlcnZlclByb3BzKSA9PiB7XG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgICAgY29uc3QgcHVibGljUGF0aCA9IHByb3BzLmNsaWVudE1hbmlmZXN0LnB1YmxpY1BhdGg7XG5cbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcHMuY2xpZW50TWFuaWZlc3Q/LmVudHJ5cG9pbnRzID8/IHt9KS5sZW5ndGggPCAxIHx8XG4gICAgICAgIHB1YmxpY1BhdGggPT09IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbmlmZXN0IG1pc3NpbmcgZW50cmllcyBuZWVkZWQnKTtcblxuICAgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBwYWNrYWdlIGZvciBidWlsZCBzdGF0cyBpbiBmdXR1cmU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvdHJlZS9tYWluL3BhY2thZ2VzL3JlYWN0LXNlcnZlci1kb20td2VicGFja1xuICAgICAgY29uc3QgYXNzZXRNYXAgPSAoYXNzZXRzOiB7IG5hbWU6IHN0cmluZzsgc2l6ZT86IG51bWJlciB9W10pID0+XG4gICAgICAgIGFzc2V0cy5tYXAoKHsgbmFtZSB9KSA9PiBgJHtwdWJsaWNQYXRofSR7bmFtZX1gKTtcblxuICAgICAgY29uc3QgYXNzZXRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgT2JqZWN0LnZhbHVlcyhwcm9wcy5jbGllbnRNYW5pZmVzdD8uZW50cnlwb2ludHMgPz8ge30pLmZvckVhY2goXG4gICAgICAgIGVudHJ5cG9pbnQgPT4ge1xuICAgICAgICAgIGFzc2V0TGlzdC5wdXNoKC4uLmFzc2V0TWFwKGVudHJ5cG9pbnQuYXNzZXRzID8/IFtdKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbmV3IFNldChcbiAgICAgICAgYXNzZXRNYXAoXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhwcm9wcy5jbGllbnRNYW5pZmVzdC5uYW1lZENodW5rR3JvdXBzID8/IHt9KVxuICAgICAgICAgICAgLmZpbHRlcigoeyBuYW1lIH0pID0+XG4gICAgICAgICAgICAgIG5leHRQcm9wcy5tYXRjaGVkUm91dGVzLnNvbWUocm91dGUgPT4gbmFtZT8uaW5jbHVkZXMocm91dGUubmFtZSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZsYXRNYXAoY2h1bmsgPT4gW1xuICAgICAgICAgICAgICAuLi4oY2h1bmsuYXNzZXRzID8/IFtdKSxcbiAgICAgICAgICAgICAgLy8gYW55IGNodW5rIHByZWxvYWRzXG4gICAgICAgICAgICAgIC4uLmNoaWxkcmVuQXNzZXRzKGNodW5rKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKS5mb3JFYWNoKGFzc2V0ID0+IGFzc2V0TGlzdC5wdXNoKGFzc2V0KSk7XG5cbiAgICAgIC8vIGZpbmQgYWRkaXRpb25hbCBhc3NldHMgdG8gcHJlbG9hZCBiYXNlZCBvbiBtYXRjaGVkIHJvdXRlXG4gICAgICBjb25zdCBhc3NldHM6IHtcbiAgICAgICAgaHJlZjogc3RyaW5nO1xuICAgICAgICBhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgcmVsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgfVtdID0gYXNzZXRMaXN0XG4gICAgICAgIC5maWx0ZXIoYXNzZXQgPT4gIWFzc2V0LmVuZHNXaXRoKCcuaG90LXVwZGF0ZS5qcycpKVxuICAgICAgICAubWFwKGFzc2V0ID0+XG4gICAgICAgICAgYXNzZXQuZW5kc1dpdGgoJy5jc3MnKVxuICAgICAgICAgICAgPyB7IGhyZWY6IGFzc2V0LCByZWw6ICdzdHlsZXNoZWV0JyB9XG4gICAgICAgICAgICA6IGFzc2V0LmVuZHNXaXRoKCcuanMnKVxuICAgICAgICAgICAgPyB7IGhyZWY6IGFzc2V0LCBhczogJ3NjcmlwdCcgfVxuICAgICAgICAgICAgOiB7IGhyZWY6IGFzc2V0IH0sXG4gICAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgICAgYXBwOiAoXG4gICAgICAgICAgPERvY3VtZW50XG4gICAgICAgICAgICB7Li4ub3B0aW9uc31cbiAgICAgICAgICAgIHRpdGxlPXtuZXh0UHJvcHMudGl0bGUgPz8gb3B0aW9ucy50aXRsZX1cbiAgICAgICAgICAgIGFzc2V0cz17YXNzZXRzfVxuICAgICAgICAgICAgcm9vdElkPXtvcHRpb25zLnJvb3RJZH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7bmV4dFByb3BzLmFwcH1cbiAgICAgICAgICA8L0RvY3VtZW50PlxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkFzc2V0cyhjaHVuazogU3RhdHNDaHVua0dyb3VwKSB7XG4gIHJldHVybiBjaHVuay5jaGlsZHJlblxuICAgID8gT2JqZWN0LnZhbHVlcyhjaHVuay5jaGlsZHJlbikuZmxhdE1hcChwcmVsb2FkID0+XG4gICAgICAgIHByZWxvYWQuZmxhdE1hcChjID0+IGMuYXNzZXRzID8/IFtdKSxcbiAgICAgIClcbiAgICA6IFtdO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBS0E7O0FBT2UsU0FBU0EsYUFBVCxDQUF1QkMsT0FBdkIsRUFJWjtFQUNELE9BQU8sVUFDTEMsSUFESyxFQUVMO0lBQ0EsT0FBTyxNQUFPQyxLQUFQLElBQThCO01BQUE7O01BQ25DLE1BQU1DLFNBQVMsR0FBRyxNQUFNRixJQUFJLENBQUNDLEtBQUQsQ0FBNUI7TUFFQSxNQUFNRSxV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
68
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEb2N1bWVudFNwb3V0Iiwib3B0aW9ucyIsIm5leHQiLCJwcm9wcyIsIm5leHRQcm9wcyIsInB1YmxpY1BhdGgiLCJjbGllbnRNYW5pZmVzdCIsIk9iamVjdCIsImtleXMiLCJlbnRyeXBvaW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIkVycm9yIiwiYXNzZXRNYXAiLCJhc3NldHMiLCJtYXAiLCJuYW1lIiwiYXNzZXRMaXN0IiwidmFsdWVzIiwiZm9yRWFjaCIsImVudHJ5cG9pbnQiLCJwdXNoIiwiU2V0IiwibmFtZWRDaHVua0dyb3VwcyIsImZpbHRlciIsIm1hdGNoZWRSb3V0ZXMiLCJzb21lIiwicm91dGUiLCJpbmNsdWRlcyIsImZsYXRNYXAiLCJjaHVuayIsImNoaWxkcmVuQXNzZXRzIiwiYXNzZXQiLCJlbmRzV2l0aCIsImhyZWYiLCJyZWwiLCJhcyIsImFwcCIsInRpdGxlIiwicm9vdElkIiwiY2hpbGRyZW4iLCJwcmVsb2FkIiwiYyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvZG9jdW1lbnQuc2VydmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcbmltcG9ydCB7IFN0YXRzQ2h1bmtHcm91cCB9IGZyb20gJ3dlYnBhY2snO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzLCBSZXNvbHZlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBEb2N1bWVudCBmcm9tICcuL0RvY3VtZW50Q29tcG9uZW50JztcblxudHlwZSBOZWVkZWRQcm9wcyA9IHtcbiAgbWF0Y2hlZFJvdXRlczogUm91dGU8YW55PltdO1xuICB0aXRsZT86IHN0cmluZztcbn0gJiBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERvY3VtZW50U3BvdXQob3B0aW9uczoge1xuICBoZWFkPzogUmVhY3QuUmVhY3ROb2RlO1xuICB0aXRsZTogc3RyaW5nO1xuICByb290SWQ/OiBzdHJpbmc7XG4gIGNoYXJTZXQ/OiBzdHJpbmc7XG59KSB7XG4gIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIE5lZWRlZFByb3BzPihcbiAgICBuZXh0OiAocHJvcHM6IFNlcnZlclByb3BzKSA9PiBQcm9taXNlPFQ+LFxuICApIHtcbiAgICByZXR1cm4gYXN5bmMgKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4ge1xuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG5cbiAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSBwcm9wcy5jbGllbnRNYW5pZmVzdC5wdWJsaWNQYXRoO1xuXG4gICAgICBpZiAoXG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BzLmNsaWVudE1hbmlmZXN0Py5lbnRyeXBvaW50cyA/PyB7fSkubGVuZ3RoIDwgMSB8fFxuICAgICAgICBwdWJsaWNQYXRoID09PSB1bmRlZmluZWRcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYW5pZmVzdCBtaXNzaW5nIGVudHJpZXMgbmVlZGVkJyk7XG5cbiAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHRoaXMgcGFja2FnZSBmb3IgYnVpbGQgc3RhdHMgaW4gZnV0dXJlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3RyZWUvbWFpbi9wYWNrYWdlcy9yZWFjdC1zZXJ2ZXItZG9tLXdlYnBhY2tcbiAgICAgIGNvbnN0IGFzc2V0TWFwID0gKGFzc2V0czogeyBuYW1lOiBzdHJpbmc7IHNpemU/OiBudW1iZXIgfVtdKSA9PlxuICAgICAgICBhc3NldHMubWFwKCh7IG5hbWUgfSkgPT4gYCR7cHVibGljUGF0aH0ke25hbWV9YCk7XG5cbiAgICAgIGNvbnN0IGFzc2V0TGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIE9iamVjdC52YWx1ZXMocHJvcHMuY2xpZW50TWFuaWZlc3Q/LmVudHJ5cG9pbnRzID8/IHt9KS5mb3JFYWNoKFxuICAgICAgICBlbnRyeXBvaW50ID0+IHtcbiAgICAgICAgICBhc3NldExpc3QucHVzaCguLi5hc3NldE1hcChlbnRyeXBvaW50LmFzc2V0cyA/PyBbXSkpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIG5ldyBTZXQoXG4gICAgICAgIGFzc2V0TWFwKFxuICAgICAgICAgIE9iamVjdC52YWx1ZXMocHJvcHMuY2xpZW50TWFuaWZlc3QubmFtZWRDaHVua0dyb3VwcyA/PyB7fSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PlxuICAgICAgICAgICAgICBuZXh0UHJvcHMubWF0Y2hlZFJvdXRlcy5zb21lKHJvdXRlID0+IG5hbWU/LmluY2x1ZGVzKHJvdXRlLm5hbWUpKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5mbGF0TWFwKGNodW5rID0+IFtcbiAgICAgICAgICAgICAgLi4uKGNodW5rLmFzc2V0cyA/PyBbXSksXG4gICAgICAgICAgICAgIC8vIGFueSBjaHVuayBwcmVsb2Fkc1xuICAgICAgICAgICAgICAuLi5jaGlsZHJlbkFzc2V0cyhjaHVuayksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICkuZm9yRWFjaChhc3NldCA9PiBhc3NldExpc3QucHVzaChhc3NldCkpO1xuXG4gICAgICAvLyBmaW5kIGFkZGl0aW9uYWwgYXNzZXRzIHRvIHByZWxvYWQgYmFzZWQgb24gbWF0Y2hlZCByb3V0ZVxuICAgICAgY29uc3QgYXNzZXRzOiB7XG4gICAgICAgIGhyZWY6IHN0cmluZztcbiAgICAgICAgYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIHJlbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIH1bXSA9IGFzc2V0TGlzdFxuICAgICAgICAuZmlsdGVyKGFzc2V0ID0+ICFhc3NldC5lbmRzV2l0aCgnLmhvdC11cGRhdGUuanMnKSlcbiAgICAgICAgLm1hcChhc3NldCA9PlxuICAgICAgICAgIGFzc2V0LmVuZHNXaXRoKCcuY3NzJylcbiAgICAgICAgICAgID8geyBocmVmOiBhc3NldCwgcmVsOiAnc3R5bGVzaGVldCcgfVxuICAgICAgICAgICAgOiBhc3NldC5lbmRzV2l0aCgnLmpzJylcbiAgICAgICAgICAgID8geyBocmVmOiBhc3NldCwgYXM6ICdzY3JpcHQnIH1cbiAgICAgICAgICAgIDogeyBocmVmOiBhc3NldCB9LFxuICAgICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICAgIGFwcDogKFxuICAgICAgICAgIDxEb2N1bWVudFxuICAgICAgICAgICAgey4uLm9wdGlvbnN9XG4gICAgICAgICAgICB0aXRsZT17bmV4dFByb3BzLnRpdGxlID8/IG9wdGlvbnMudGl0bGV9XG4gICAgICAgICAgICBhc3NldHM9e2Fzc2V0c31cbiAgICAgICAgICAgIHJvb3RJZD17b3B0aW9ucy5yb290SWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge25leHRQcm9wcy5hcHB9XG4gICAgICAgICAgPC9Eb2N1bWVudD5cbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5Bc3NldHMoY2h1bms6IFN0YXRzQ2h1bmtHcm91cCkge1xuICByZXR1cm4gY2h1bmsuY2hpbGRyZW5cbiAgICA/IE9iamVjdC52YWx1ZXMoY2h1bmsuY2hpbGRyZW4pLmZsYXRNYXAocHJlbG9hZCA9PlxuICAgICAgICBwcmVsb2FkLmZsYXRNYXAoYyA9PiBjLmFzc2V0cyA/PyBbXSksXG4gICAgICApXG4gICAgOiBbXTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUtBOztBQU9lLFNBQVNBLGFBQVQsQ0FBdUJDLE9BQXZCLEVBS1o7RUFDRCxPQUFPLFVBQ0xDLElBREssRUFFTDtJQUNBLE9BQU8sTUFBT0MsS0FBUCxJQUE4QjtNQUFBOztNQUNuQyxNQUFNQyxTQUFTLEdBQUcsTUFBTUYsSUFBSSxDQUFDQyxL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
@@ -0,0 +1,8 @@
1
+ import { Route } from '@anansi/router';
2
+ import type { ResolveProps, ServerProps } from './types';
3
+ declare type NeededProps<RouteWith> = {
4
+ matchedRoutes: Route<RouteWith>[];
5
+ } & ResolveProps;
6
+ export default function prefetchSpout<F extends string>(field: F): <RouteWith, T extends NeededProps<RouteWith>>(next: (props: ServerProps) => Promise<{ [K in F]: RouteWith; } & T>) => (props: ServerProps) => Promise<{ [K in F]: RouteWith; } & T>;
7
+ export {};
8
+ //# sourceMappingURL=prefetch.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefetch.server.d.ts","sourceRoot":"","sources":["../../src/spouts/prefetch.server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzD,aAAK,WAAW,CAAC,SAAS,IAAI;IAC5B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;CACnC,GAAG,YAAY,CAAC;AAEjB,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,+DAE9C,WAAW,uDAMJ,WAAW,2CAiBnC"}
@@ -0,0 +1,8 @@
1
+ import { Manager } from '@rest-hooks/core';
2
+ import type { ResolveProps } from './types';
3
+ export default function restHooksSpout(options?: {
4
+ getManagers: () => Manager[];
5
+ }): <T extends ResolveProps>(next: () => Promise<T>) => () => Promise<T & {
6
+ app: JSX.Element;
7
+ }>;
8
+ //# sourceMappingURL=restHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restHooks.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AAG1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB;;GAmBlD"}
@@ -0,0 +1,9 @@
1
+ import { Manager } from '@rest-hooks/core';
2
+ import type { ResolveProps, ServerProps } from './types';
3
+ export default function restHooksSpout(options?: {
4
+ getManagers: () => Manager[];
5
+ }): <T extends ResolveProps>(next: (props: ServerProps) => Promise<T>) => (props: ServerProps) => Promise<T & {
6
+ controller: import("@rest-hooks/core").Controller;
7
+ app: JSX.Element;
8
+ }>;
9
+ //# sourceMappingURL=restHooks.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restHooks.server.d.ts","sourceRoot":"","sources":["../../src/spouts/restHooks.server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,kBAAkB,CAAC;AAG3D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIzD,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,OAAO,GAAE;IACP,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;CACkB,0CAGjC,WAAW,4BAEJ,WAAW;;;GAcnC"}
@@ -0,0 +1,14 @@
1
+ import { Route, RouteController } from '@anansi/router';
2
+ import type { Update } from 'history';
3
+ import type { ResolveProps, CreateRouter } from './types';
4
+ export default function routerSpout<ResolveWith>(options: {
5
+ resolveWith?: any;
6
+ useResolveWith: () => ResolveWith;
7
+ createRouter: CreateRouter<ResolveWith>;
8
+ onChange?: (update: Update, callback: () => void | undefined) => void;
9
+ }): <T extends ResolveProps>(next: () => Promise<T>) => () => Promise<T & {
10
+ matchedRoutes: (Route<ResolveWith, any> & object)[];
11
+ router: RouteController<Route<ResolveWith, any>>;
12
+ app: JSX.Element;
13
+ }>;
14
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/spouts/router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAiB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE;IACxD,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;CACvE;;;;GAmCA"}
@@ -20,7 +20,8 @@ function routerSpout(options) {
20
20
  const resolveWith = options.useResolveWith();
21
21
  return /*#__PURE__*/(0, _jsx2.default)(_router.RouteProvider, {
22
22
  router: router,
23
- resolveWith: resolveWith
23
+ resolveWith: resolveWith,
24
+ onChange: options.onChange
24
25
  }, void 0, children);
25
26
  };
26
27
 
@@ -39,4 +40,4 @@ function routerSpout(options) {
39
40
  };
40
41
  };
41
42
  }
42
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJTcG91dCIsIm9wdGlvbnMiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsImNoaWxkcmVuIiwicmVzb2x2ZVdpdGgiLCJ1c2VSZXNvbHZlV2l0aCIsIm5leHQiLCJoaXN0b3J5IiwiY3JlYXRlQnJvd3Nlckhpc3RvcnkiLCJjcmVhdGVSb3V0ZXIiLCJtYXRjaGVkUm91dGVzIiwiZ2V0TWF0Y2hlZFJvdXRlcyIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJuZXh0UHJvcHMiLCJhcHAiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3BvdXRzL3JvdXRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGUsIFJvdXRlUHJvdmlkZXIsIFJvdXRlQ29udHJvbGxlciB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVCcm93c2VySGlzdG9yeSB9IGZyb20gJ2hpc3RvcnknO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVQcm9wcywgQ3JlYXRlUm91dGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgTmVlZGVkUHJvcHMgPSBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdXRlclNwb3V0PFJlc29sdmVXaXRoPihvcHRpb25zOiB7XG4gIHJlc29sdmVXaXRoPzogYW55O1xuICB1c2VSZXNvbHZlV2l0aDogKCkgPT4gUmVzb2x2ZVdpdGg7XG4gIGNyZWF0ZVJvdXRlcjogQ3JlYXRlUm91dGVyPFJlc29sdmVXaXRoPjtcbn0pIHtcbiAgY29uc3QgY3JlYXRlUm91dGVDb21wb25lbnQgPSAoXG4gICAgcm91dGVyOiBSb3V0ZUNvbnRyb2xsZXI8Um91dGU8UmVzb2x2ZVdpdGgsIGFueT4+LFxuICApID0+XG4gICAgZnVuY3Rpb24gUm91dGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgICAgIGNvbnN0IHJlc29sdmVXaXRoID0gb3B0aW9ucy51c2VSZXNvbHZlV2l0aCgpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Um91dGVQcm92aWRlciByb3V0ZXI9e3JvdXRlcn0gcmVzb2x2ZVdpdGg9e3Jlc29sdmVXaXRofT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvUm91dGVQcm92aWRlcj5cbiAgICAgICk7XG4gICAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBOZWVkZWRQcm9wcz4obmV4dDogKCkgPT4gUHJvbWlzZTxUPikge1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBoaXN0b3J5ID0gY3JlYXRlQnJvd3Nlckhpc3RvcnkoKTtcbiAgICAgIGNvbnN0IHJvdXRlciA9IG9wdGlvbnMuY3JlYXRlUm91dGVyKGhpc3RvcnkpO1xuICAgICAgY29uc3QgbWF0Y2hlZFJvdXRlcyA9IHJvdXRlci5nZXRNYXRjaGVkUm91dGVzKGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUpO1xuXG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KCk7XG5cbiAgICAgIGNvbnN0IFJvdXRlciA9IGNyZWF0ZVJvdXRlQ29tcG9uZW50KHJvdXRlcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICAgIG1hdGNoZWRSb3V0ZXMsXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgYXBwOiA8Um91dGVyPntuZXh0UHJvcHMuYXBwfTwvUm91dGVyPixcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBTWUsU0FBU0EsV0FBVCxDQUFrQ0MsT0FBbEMsRUFJWjtFQUNELE1BQU1DLG9CQUFvQixHQUN4QkMsTUFEMkIsSUFHM0IsU0FBU0MsTUFBVCxDQUFnQjtJQUFFQztFQUFGLENBQWhCLEVBQTZEO0lBQzNELE1BQU1DLFdBQVcsR0FBR0wsT0FBTyxDQUFDTSxjQUFSLEVBQXBCO0lBRUEsb0JBQ0UsbUJBQUMscUJBQUQ7TUFBZSxNQUFNLEVBQUVKLE1BQXZCO01BQStCLFdBQVcsRUFBRUc7SUFBNUMsV0FDR0QsUUFESCxDQURGO0VBS0QsQ0FYSDs7RUFhQSxPQUFPLFVBQWlDRyxJQUFqQyxFQUF5RDtJQUM5RCxPQUFPLFlBQVk7TUFDakIsTUFBTUMsT0FBTyxHQUFHLElBQUFDLDZCQUFBLEdBQWhCO01BQ0EsTUFBTVAsTUFBTSxHQUFHRixPQUFPLENBQUNVLFlBQVIsQ0FBcUJGLE9BQXJCLENBQWY7TUFDQSxNQUFNRyxhQUFhLEdBQUdULE1BQU0sQ0FBQ1UsZ0JBQVAsQ0FBd0JKLE9BQU8sQ0FBQ0ssUUFBUixDQUFpQkMsUUFBekMsQ0FBdEI7TUFFQSxNQUFNQyxTQUFTLEdBQUcsTUFBTVIsSUFBSSxFQUE1QjtNQUVBLE1BQU1KLE1BQU0sR0FBR0Ysb0JBQW9CLENBQUNDLE1BQUQsQ0FBbkM7TUFDQSxPQUFPLEVBQ0wsR0FBR2EsU0FERTtRQUVMSixhQUZLO1FBR0xULE1BSEs7UUFJTGMsR0FBRyxlQUFFLG1CQUFDLE1BQUQsY0FBU0QsU0FBUyxDQUFDQyxHQUFuQjtNQUpBLENBQVA7SUFNRCxDQWREO0VBZUQsQ0FoQkQ7QUFpQkQifQ==
43
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3V0ZXJTcG91dCIsIm9wdGlvbnMiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsImNoaWxkcmVuIiwicmVzb2x2ZVdpdGgiLCJ1c2VSZXNvbHZlV2l0aCIsIm9uQ2hhbmdlIiwibmV4dCIsImhpc3RvcnkiLCJjcmVhdGVCcm93c2VySGlzdG9yeSIsImNyZWF0ZVJvdXRlciIsIm1hdGNoZWRSb3V0ZXMiLCJnZXRNYXRjaGVkUm91dGVzIiwibG9jYXRpb24iLCJwYXRobmFtZSIsIm5leHRQcm9wcyIsImFwcCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcG91dHMvcm91dGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3V0ZSwgUm91dGVQcm92aWRlciwgUm91dGVDb250cm9sbGVyIH0gZnJvbSAnQGFuYW5zaS9yb3V0ZXInO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZUJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnaGlzdG9yeSc7XG5pbXBvcnQgdHlwZSB7IFVwZGF0ZSB9IGZyb20gJ2hpc3RvcnknO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVQcm9wcywgQ3JlYXRlUm91dGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgTmVlZGVkUHJvcHMgPSBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdXRlclNwb3V0PFJlc29sdmVXaXRoPihvcHRpb25zOiB7XG4gIHJlc29sdmVXaXRoPzogYW55O1xuICB1c2VSZXNvbHZlV2l0aDogKCkgPT4gUmVzb2x2ZVdpdGg7XG4gIGNyZWF0ZVJvdXRlcjogQ3JlYXRlUm91dGVyPFJlc29sdmVXaXRoPjtcbiAgb25DaGFuZ2U/OiAodXBkYXRlOiBVcGRhdGUsIGNhbGxiYWNrOiAoKSA9PiB2b2lkIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xufSkge1xuICBjb25zdCBjcmVhdGVSb3V0ZUNvbXBvbmVudCA9IChcbiAgICByb3V0ZXI6IFJvdXRlQ29udHJvbGxlcjxSb3V0ZTxSZXNvbHZlV2l0aCwgYW55Pj4sXG4gICkgPT5cbiAgICBmdW5jdGlvbiBSb3V0ZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICAgICAgY29uc3QgcmVzb2x2ZVdpdGggPSBvcHRpb25zLnVzZVJlc29sdmVXaXRoKCk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxSb3V0ZVByb3ZpZGVyXG4gICAgICAgICAgcm91dGVyPXtyb3V0ZXJ9XG4gICAgICAgICAgcmVzb2x2ZVdpdGg9e3Jlc29sdmVXaXRofVxuICAgICAgICAgIG9uQ2hhbmdlPXtvcHRpb25zLm9uQ2hhbmdlfVxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1JvdXRlUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgTmVlZGVkUHJvcHM+KG5leHQ6ICgpID0+IFByb21pc2U8VD4pIHtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGNyZWF0ZUJyb3dzZXJIaXN0b3J5KCk7XG4gICAgICBjb25zdCByb3V0ZXIgPSBvcHRpb25zLmNyZWF0ZVJvdXRlcihoaXN0b3J5KTtcbiAgICAgIGNvbnN0IG1hdGNoZWRSb3V0ZXMgPSByb3V0ZXIuZ2V0TWF0Y2hlZFJvdXRlcyhoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lKTtcblxuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dCgpO1xuXG4gICAgICBjb25zdCBSb3V0ZXIgPSBjcmVhdGVSb3V0ZUNvbXBvbmVudChyb3V0ZXIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgICBtYXRjaGVkUm91dGVzLFxuICAgICAgICByb3V0ZXIsXG4gICAgICAgIGFwcDogPFJvdXRlcj57bmV4dFByb3BzLmFwcH08L1JvdXRlcj4sXG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQU9lLFNBQVNBLFdBQVQsQ0FBa0NDLE9BQWxDLEVBS1o7RUFDRCxNQUFNQyxvQkFBb0IsR0FDeEJDLE1BRDJCLElBRzNCLFNBQVNDLE1BQVQsQ0FBZ0I7SUFBRUM7RUFBRixDQUFoQixFQUE2RDtJQUMzRCxNQUFNQyxXQUFXLEdBQUdMLE9BQU8sQ0FBQ00sY0FBUixFQUFwQjtJQUVBLG9CQUNFLG1CQUFDLHFCQUFEO01BQ0UsTUFBTSxFQUFFSixNQURWO01BRUUsV0FBVyxFQUFFRyxXQUZmO01BR0UsUUFBUSxFQUFFTCxPQUFPLENBQUNPO0lBSHBCLFdBS0dILFFBTEgsQ0FERjtFQVNELENBZkg7O0VBaUJBLE9BQU8sVUFBaUNJLElBQWpDLEVBQXlEO0lBQzlELE9BQU8sWUFBWTtNQUNqQixNQUFNQyxPQUFPLEdBQUcsSUFBQUMsNkJBQUEsR0FBaEI7TUFDQSxNQUFNUixNQUFNLEdBQUdGLE9BQU8sQ0FBQ1csWUFBUixDQUFxQkYsT0FBckIsQ0FBZjtNQUNBLE1BQU1HLGFBQWEsR0FBR1YsTUFBTSxDQUFDVyxnQkFBUCxDQUF3QkosT0FBTyxDQUFDSyxRQUFSLENBQWlCQyxRQUF6QyxDQUF0QjtNQUVBLE1BQU1DLFNBQVMsR0FBRyxNQUFNUixJQUFJLEVBQTVCO01BRUEsTUFBTUwsTUFBTSxHQUFHRixvQkFBb0IsQ0FBQ0MsTUFBRCxDQUFuQztNQUNBLE9BQU8sRUFDTCxHQUFHYyxTQURFO1FBRUxKLGFBRks7UUFHTFYsTUFISztRQUlMZSxHQUFHLGVBQUUsbUJBQUMsTUFBRCxjQUFTRCxTQUFTLENBQUNDLEdBQW5CO01BSkEsQ0FBUDtJQU1ELENBZEQ7RUFlRCxDQWhCRDtBQWlCRCJ9
@@ -0,0 +1,12 @@
1
+ import { Route, RouteController } from '@anansi/router';
2
+ import type { ResolveProps, ServerProps, CreateRouter } from './types';
3
+ export default function routerSpout<ResolveWith>(options: {
4
+ resolveWith?: any;
5
+ useResolveWith: () => ResolveWith;
6
+ createRouter: CreateRouter<ResolveWith>;
7
+ }): <T extends ResolveProps>(next: (props: ServerProps) => Promise<T>) => (props: ServerProps) => Promise<T & {
8
+ matchedRoutes: Route<ResolveWith, any>[];
9
+ router: RouteController<Route<ResolveWith, any>>;
10
+ app: JSX.Element;
11
+ }>;
12
+ //# sourceMappingURL=router.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.server.d.ts","sourceRoot":"","sources":["../../src/spouts/router.server.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAiB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIvE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvE,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE;IACxD,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,cAAc,EAAE,MAAM,WAAW,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;CACzC,0CAeiB,WAAW,4BAEJ,WAAW;;;;GAkBnC"}
@@ -0,0 +1,16 @@
1
+ /// <reference types="node" />
2
+ import { IncomingMessage, ServerResponse } from 'http';
3
+ import { Request, Response } from 'express';
4
+ import type { StatsCompilation } from 'webpack';
5
+ import { History } from 'history';
6
+ import { Route, RouteController } from '@anansi/router';
7
+ export declare type ServerProps = {
8
+ req: Request | IncomingMessage;
9
+ res: Response | ServerResponse;
10
+ clientManifest: StatsCompilation;
11
+ };
12
+ export declare type ResolveProps = {
13
+ app: JSX.Element;
14
+ };
15
+ export declare type CreateRouter<T> = (history: History) => RouteController<Route<T, any>>;
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/spouts/types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGxD,oBAAY,WAAW,GAAG;IACxB,GAAG,EAAE,OAAO,GAAG,eAAe,CAAC;IAC/B,GAAG,EAAE,QAAQ,GAAG,cAAc,CAAC;IAC/B,cAAc,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAGF,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC;AAEF,oBAAY,YAAY,CAAC,CAAC,IAAI,CAC5B,OAAO,EAAE,OAAO,KACb,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anansi/core",
3
- "version": "0.7.4",
3
+ "version": "0.10.0",
4
4
  "description": "React 18 Framework",
5
5
  "homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
6
6
  "repository": {
@@ -23,6 +23,7 @@
23
23
  "README.md"
24
24
  ],
25
25
  "bin": {
26
+ "serve-anansi": "./lib/scripts/serve.js",
26
27
  "start-anansi": "./lib/scripts/startDevserver.js"
27
28
  },
28
29
  "sideEffects": false,
@@ -48,6 +49,10 @@
48
49
  "require": "./dist/server.js",
49
50
  "default": "./lib/index.server.js"
50
51
  },
52
+ "./scripts": {
53
+ "types": "./lib/scripts/index.d.ts",
54
+ "default": "./lib/scripts/index.js"
55
+ },
51
56
  "./package.json": "./package.json"
52
57
  },
53
58
  "keywords": [
@@ -60,28 +65,30 @@
60
65
  "browser"
61
66
  ],
62
67
  "devDependencies": {
63
- "@anansi/babel-preset": "^3.2.2",
68
+ "@anansi/babel-preset": "^3.2.4",
64
69
  "@anansi/browserslist-config": "1.3.3",
65
- "@anansi/webpack-config": "^11.6.1",
70
+ "@anansi/webpack-config": "^11.6.4",
66
71
  "@babel/cli": "7.17.10",
67
72
  "@babel/core": "7.18.2",
73
+ "@types/compression": "^1.7.2",
68
74
  "@types/source-map-support": "^0.5.4",
69
75
  "@types/tmp": "^0.2.3",
70
76
  "@types/webpack-hot-middleware": "^2.25.6",
71
- "jest": "28.1.0",
77
+ "jest": "28.1.1",
72
78
  "rimraf": "^3.0.0",
73
79
  "webpack": "^5.72.1",
74
80
  "webpack-cli": "^4.9.2"
75
81
  },
76
82
  "dependencies": {
77
- "@anansi/router": "^0.5.6",
83
+ "@anansi/router": "^0.6.0",
78
84
  "@babel/runtime": "^7.10.5",
79
- "@rest-hooks/ssr": "^0.1.3",
85
+ "@rest-hooks/ssr": "^0.2.0",
80
86
  "chalk": "^4.0.0",
87
+ "compression": "^1.7.4",
81
88
  "cross-fetch": "^3.1.5",
82
- "fs-monkey": "^1.0.3",
89
+ "fs-require": "^1.4.0",
83
90
  "history": "^5.3.0",
84
- "import-fresh": "^3.3.0",
91
+ "http-proxy-middleware": "^2.0.6",
85
92
  "memfs": "^3.4.1",
86
93
  "ora": "^5.0.0",
87
94
  "redux": "^4.1.2",
@@ -0,0 +1,129 @@
1
+ import {
2
+ RequestHandler,
3
+ ProxyConfigArray,
4
+ Response,
5
+ Request,
6
+ NextFunction,
7
+ ByPass,
8
+ ProxyConfigArrayItem,
9
+ ProxyConfigMap,
10
+ } from 'webpack-dev-server';
11
+
12
+ // Essentially taken from https://github.com/webpack/webpack-dev-server/blob/b5e5b67398f97c7a2934e12ebe34fb03cc06c473/lib/Server.js#L2123
13
+ export default function getProxyMiddlewares(
14
+ proxyConfig: ProxyConfigArrayItem | ProxyConfigMap | ProxyConfigArray,
15
+ ) {
16
+ const middlewares: any[] = [];
17
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
18
+ const { createProxyMiddleware } = require('http-proxy-middleware');
19
+
20
+ const proxy: ProxyConfigArray =
21
+ !Array.isArray(proxyConfig) && typeof proxyConfig === 'object'
22
+ ? Object.keys(proxyConfig).length &&
23
+ Object.keys(proxyConfig)[0].startsWith('/')
24
+ ? Object.entries(proxyConfig).map(([path, v]) => ({ path, ...v }))
25
+ : [proxyConfig]
26
+ : proxyConfig;
27
+
28
+ const getProxyMiddleware = (
29
+ proxyConfig: ProxyConfigArrayItem,
30
+ ): RequestHandler | undefined => {
31
+ // It is possible to use the `bypass` method without a `target` or `router`.
32
+ // However, the proxy middleware has no use in this case, and will fail to instantiate.
33
+ if (proxyConfig.target) {
34
+ const context = proxyConfig.context || proxyConfig.path;
35
+
36
+ return createProxyMiddleware(/** @type {string} */ context, proxyConfig);
37
+ }
38
+
39
+ if (proxyConfig.router) {
40
+ return createProxyMiddleware(proxyConfig);
41
+ }
42
+ };
43
+
44
+ /**
45
+ * Assume a proxy configuration specified as:
46
+ * proxy: [
47
+ * {
48
+ * context: "value",
49
+ * ...options,
50
+ * },
51
+ * // or:
52
+ * function() {
53
+ * return {
54
+ * context: "context",
55
+ * ...options,
56
+ * };
57
+ * }
58
+ * ]
59
+ */
60
+ proxy.forEach(proxyConfigOrCallback => {
61
+ let proxyMiddleware: RequestHandler | undefined;
62
+
63
+ let proxyConfig =
64
+ typeof proxyConfigOrCallback === 'function'
65
+ ? proxyConfigOrCallback()
66
+ : proxyConfigOrCallback;
67
+
68
+ proxyMiddleware = getProxyMiddleware(proxyConfig);
69
+
70
+ /* TODO: figure out how to make this work
71
+ if (proxyConfig.ws) {
72
+ this.webSocketProxies.push(proxyMiddleware);
73
+ }
74
+ */
75
+
76
+ const handler = async (req: Request, res: Response, next: NextFunction) => {
77
+ if (typeof proxyConfigOrCallback === 'function') {
78
+ const newProxyConfig = proxyConfigOrCallback(req, res, next);
79
+
80
+ if (newProxyConfig !== proxyConfig) {
81
+ proxyConfig = newProxyConfig;
82
+ proxyMiddleware = getProxyMiddleware(proxyConfig);
83
+ }
84
+ }
85
+
86
+ // - Check if we have a bypass function defined
87
+ // - In case the bypass function is defined we'll retrieve the
88
+ // bypassUrl from it otherwise bypassUrl would be null
89
+ // TODO remove in the next major in favor `context` and `router` options
90
+ const bypassUrl: ByPass | null =
91
+ typeof proxyConfig.bypass === 'function'
92
+ ? await proxyConfig.bypass(req, res, proxyConfig)
93
+ : null;
94
+
95
+ if (typeof bypassUrl === 'boolean') {
96
+ // skip the proxy
97
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
98
+ // @ts-ignore
99
+ req.url = null;
100
+ next();
101
+ } else if (typeof bypassUrl === 'string') {
102
+ // byPass to that url
103
+ req.url = bypassUrl;
104
+ next();
105
+ } else if (proxyMiddleware) {
106
+ return proxyMiddleware(req, res, next);
107
+ } else {
108
+ next();
109
+ }
110
+ };
111
+
112
+ middlewares.push({
113
+ name: 'http-proxy-middleware',
114
+ middleware: handler,
115
+ });
116
+ // Also forward error requests to the proxy so it can handle them.
117
+ middlewares.push({
118
+ name: 'http-proxy-middleware-error-handler',
119
+ middleware: (
120
+ error: Error,
121
+ req: Request,
122
+ res: Response,
123
+ next: NextFunction,
124
+ ) => handler(req, res, next),
125
+ });
126
+ });
127
+
128
+ return middlewares;
129
+ }
@@ -0,0 +1,2 @@
1
+ export { default as serve } from './serve';
2
+ export { default as devServe } from './startDevserver';
@@ -0,0 +1,211 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { promisify } from 'util';
4
+ import diskFs from 'fs';
5
+ import path from 'path';
6
+ import webpack, { web } from 'webpack';
7
+ import { Server, IncomingMessage, ServerResponse } from 'http';
8
+ import express, { NextFunction } from 'express';
9
+ import ora from 'ora';
10
+ import compress from 'compression';
11
+
12
+ import 'cross-fetch/polyfill';
13
+ import { Render } from './types';
14
+ import getProxyMiddlewares from './getProxyMiddlewares';
15
+
16
+ // run directly from node
17
+ if (require.main === module) {
18
+ const entrypoint = process.argv[2];
19
+
20
+ if (!entrypoint) {
21
+ console.log(`Usage: ${process.argv[0]} <server-entrypoint>`);
22
+ process.exit(-1);
23
+ }
24
+ serve(entrypoint);
25
+ }
26
+
27
+ export default function serve(
28
+ entrypoint: string,
29
+ options: { serveAssets?: boolean; serveProxy?: boolean } = {},
30
+ ) {
31
+ const PORT = process.env.PORT || 8080;
32
+
33
+ const loader = ora('Initializing').start();
34
+
35
+ const webpackConfig: (
36
+ env: any,
37
+ argv: any,
38
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
39
+ ) => webpack.Configuration = require(require.resolve(
40
+ // TODO: use normal resolution algorithm to find webpack file
41
+ path.join(process.cwd(), 'webpack.config'),
42
+ ));
43
+
44
+ const manifestPath = getManifestPathFromWebpackconfig(
45
+ webpackConfig({}, { mode: 'production' }),
46
+ );
47
+
48
+ const readFile = promisify(diskFs.readFile);
49
+ let server: Server | undefined;
50
+
51
+ function handleErrors<
52
+ F extends (
53
+ req: Request | IncomingMessage,
54
+ res: Response | ServerResponse,
55
+ ) => Promise<void>,
56
+ >(fn: F) {
57
+ return async function (
58
+ req: Request | IncomingMessage,
59
+ res: Response | ServerResponse,
60
+ next: NextFunction,
61
+ ) {
62
+ try {
63
+ return await fn(req, res);
64
+ } catch (x) {
65
+ next(x);
66
+ }
67
+ };
68
+ }
69
+
70
+ // Start the express server after the first compilation
71
+ function initializeApp(clientManifest: webpack.StatsCompilation) {
72
+ loader.info('Launching server');
73
+ if (!clientManifest) {
74
+ loader.fail('Manifest not found');
75
+ // TODO: handle more gracefully
76
+ process.exit(-1);
77
+ }
78
+
79
+ const wrappingApp = express();
80
+ // eslint-disable-next-line
81
+ //@ts-ignore
82
+ wrappingApp.use(compress());
83
+
84
+ // ASSETS
85
+ if (options.serveAssets) {
86
+ wrappingApp.use(
87
+ async (
88
+ req: Request | IncomingMessage,
89
+ res: any,
90
+ next: NextFunction,
91
+ ) => {
92
+ const filename =
93
+ req.url?.substr(
94
+ (process.env.WEBPACK_PUBLIC_PATH as string).length,
95
+ ) ?? '';
96
+ const assetPath = path.join(
97
+ clientManifest.outputPath ?? '',
98
+ filename,
99
+ );
100
+
101
+ if (
102
+ diskFs.existsSync(assetPath) &&
103
+ !diskFs.lstatSync(assetPath).isDirectory()
104
+ ) {
105
+ try {
106
+ const fileContent = (await readFile(assetPath)).toString();
107
+ res.contentType(filename);
108
+ res.send(fileContent);
109
+ } catch (e) {
110
+ return next();
111
+ }
112
+ } else {
113
+ next();
114
+ }
115
+ },
116
+ );
117
+ }
118
+
119
+ // PROXIES
120
+ if (options.serveProxy) {
121
+ const devConfig: webpack.Configuration = webpackConfig(
122
+ {},
123
+ { mode: 'development' },
124
+ );
125
+ if (devConfig.devServer?.proxy) {
126
+ const middlewares = getProxyMiddlewares(devConfig.devServer?.proxy);
127
+ if (middlewares) {
128
+ wrappingApp.use(...middlewares.map(({ middleware }) => middleware));
129
+ }
130
+ }
131
+ }
132
+
133
+ // SERVER SIDE RENDERING
134
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
135
+ const render: Render = require(path.join(
136
+ process.cwd(),
137
+ entrypoint,
138
+ )).default;
139
+
140
+ wrappingApp.get(
141
+ '/*',
142
+ handleErrors(async function (req: any, res: any) {
143
+ if (req.url.endsWith('favicon.ico')) {
144
+ res.statusCode = 404;
145
+ res.setHeader('Content-type', 'text/html');
146
+ res.send('not found');
147
+ return;
148
+ }
149
+ res.socket.on('error', (error: unknown) => {
150
+ console.error('Fatal', error);
151
+ });
152
+
153
+ await render(clientManifest, req, res);
154
+ }),
155
+ );
156
+
157
+ server = wrappingApp
158
+ .listen(PORT, () => {
159
+ loader.info(`Listening at ${PORT}...`);
160
+ })
161
+ .on('error', function (error: any) {
162
+ if (error.syscall !== 'listen') {
163
+ throw error;
164
+ }
165
+ const isPipe = (portOrPipe: string | number) =>
166
+ Number.isNaN(portOrPipe);
167
+ const bind = isPipe(PORT) ? 'Pipe ' + PORT : 'Port ' + PORT;
168
+ switch (error.code) {
169
+ case 'EACCES':
170
+ loader.fail(bind + ' requires elevated privileges');
171
+ process.exit(1);
172
+ // eslint-disable-next-line no-fallthrough
173
+ case 'EADDRINUSE':
174
+ loader.fail(bind + ' is already in use');
175
+ process.exit(1);
176
+ // eslint-disable-next-line no-fallthrough
177
+ default:
178
+ throw error;
179
+ }
180
+ });
181
+ }
182
+
183
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
184
+ initializeApp(require(manifestPath));
185
+
186
+ process.on('SIGINT', () => {
187
+ loader.warn('Received SIGINT, devserver shutting down');
188
+ if (server) console.log('Closing server');
189
+ server?.close(() => {
190
+ loader.info('Server closed');
191
+ });
192
+ process.exit(-1);
193
+ });
194
+ }
195
+
196
+ function getManifestPathFromWebpackconfig(
197
+ webpackConfig: webpack.Configuration,
198
+ ) {
199
+ const manifestFilename: string =
200
+ (
201
+ webpackConfig?.plugins?.find(plugin => {
202
+ return plugin.constructor.name === 'StatsWriterPlugin';
203
+ }) as any
204
+ )?.opts?.filename ?? 'manifest.json';
205
+
206
+ const manifestPath = path.join(
207
+ webpackConfig?.output?.path ?? '',
208
+ manifestFilename,
209
+ );
210
+ return manifestPath;
211
+ }