@cedarjs/router 0.0.4

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 (275) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/ActivePageContext.d.ts +15 -0
  4. package/dist/ActivePageContext.d.ts.map +1 -0
  5. package/dist/ActivePageContext.js +17 -0
  6. package/dist/AuthenticatedRoute.d.ts +11 -0
  7. package/dist/AuthenticatedRoute.d.ts.map +1 -0
  8. package/dist/AuthenticatedRoute.js +49 -0
  9. package/dist/PageLoadingContext.d.ts +14 -0
  10. package/dist/PageLoadingContext.d.ts.map +1 -0
  11. package/dist/PageLoadingContext.js +29 -0
  12. package/dist/Route.d.ts +32 -0
  13. package/dist/Route.d.ts.map +1 -0
  14. package/dist/Route.js +7 -0
  15. package/dist/Set.d.ts +58 -0
  16. package/dist/Set.d.ts.map +1 -0
  17. package/dist/Set.js +28 -0
  18. package/dist/a11yUtils.d.ts +14 -0
  19. package/dist/a11yUtils.d.ts.map +1 -0
  20. package/dist/a11yUtils.js +35 -0
  21. package/dist/active-route-loader.d.ts +12 -0
  22. package/dist/active-route-loader.d.ts.map +1 -0
  23. package/dist/active-route-loader.js +82 -0
  24. package/dist/analyzeRoutes.d.ts +44 -0
  25. package/dist/analyzeRoutes.d.ts.map +1 -0
  26. package/dist/analyzeRoutes.js +128 -0
  27. package/dist/cjs/ActivePageContext.d.ts +15 -0
  28. package/dist/cjs/ActivePageContext.d.ts.map +1 -0
  29. package/dist/cjs/ActivePageContext.js +42 -0
  30. package/dist/cjs/AuthenticatedRoute.d.ts +11 -0
  31. package/dist/cjs/AuthenticatedRoute.d.ts.map +1 -0
  32. package/dist/cjs/AuthenticatedRoute.js +83 -0
  33. package/dist/cjs/PageLoadingContext.d.ts +14 -0
  34. package/dist/cjs/PageLoadingContext.d.ts.map +1 -0
  35. package/dist/cjs/PageLoadingContext.js +64 -0
  36. package/dist/cjs/Route.d.ts +32 -0
  37. package/dist/cjs/Route.d.ts.map +1 -0
  38. package/dist/cjs/Route.js +41 -0
  39. package/dist/cjs/Set.d.ts +58 -0
  40. package/dist/cjs/Set.d.ts.map +1 -0
  41. package/dist/cjs/Set.js +67 -0
  42. package/dist/cjs/a11yUtils.d.ts +14 -0
  43. package/dist/cjs/a11yUtils.d.ts.map +1 -0
  44. package/dist/cjs/a11yUtils.js +61 -0
  45. package/dist/cjs/active-route-loader.d.ts +12 -0
  46. package/dist/cjs/active-route-loader.d.ts.map +1 -0
  47. package/dist/cjs/active-route-loader.js +116 -0
  48. package/dist/cjs/analyzeRoutes.d.ts +44 -0
  49. package/dist/cjs/analyzeRoutes.d.ts.map +1 -0
  50. package/dist/cjs/analyzeRoutes.js +143 -0
  51. package/dist/cjs/createNamedContext.d.ts +3 -0
  52. package/dist/cjs/createNamedContext.d.ts.map +1 -0
  53. package/dist/cjs/createNamedContext.js +33 -0
  54. package/dist/cjs/dummyComponent.d.ts +3 -0
  55. package/dist/cjs/dummyComponent.d.ts.map +1 -0
  56. package/dist/cjs/dummyComponent.js +24 -0
  57. package/dist/cjs/history.d.ts +24 -0
  58. package/dist/cjs/history.d.ts.map +1 -0
  59. package/dist/cjs/history.js +146 -0
  60. package/dist/cjs/index.d.ts +35 -0
  61. package/dist/cjs/index.d.ts.map +1 -0
  62. package/dist/cjs/index.js +110 -0
  63. package/dist/cjs/link.d.ts +9 -0
  64. package/dist/cjs/link.d.ts.map +1 -0
  65. package/dist/cjs/link.js +62 -0
  66. package/dist/cjs/location.d.ts +28 -0
  67. package/dist/cjs/location.d.ts.map +1 -0
  68. package/dist/cjs/location.js +110 -0
  69. package/dist/cjs/namedRoutes.d.ts +3 -0
  70. package/dist/cjs/namedRoutes.d.ts.map +1 -0
  71. package/dist/cjs/namedRoutes.js +28 -0
  72. package/dist/cjs/navLink.d.ts +11 -0
  73. package/dist/cjs/navLink.d.ts.map +1 -0
  74. package/dist/cjs/navLink.js +70 -0
  75. package/dist/cjs/package.json +1 -0
  76. package/dist/cjs/page.d.ts +28 -0
  77. package/dist/cjs/page.d.ts.map +1 -0
  78. package/dist/cjs/page.js +42 -0
  79. package/dist/cjs/params.d.ts +13 -0
  80. package/dist/cjs/params.d.ts.map +1 -0
  81. package/dist/cjs/params.js +64 -0
  82. package/dist/cjs/react-util.d.ts +3 -0
  83. package/dist/cjs/react-util.d.ts.map +1 -0
  84. package/dist/cjs/react-util.js +37 -0
  85. package/dist/cjs/redirect.d.ts +12 -0
  86. package/dist/cjs/redirect.d.ts.map +1 -0
  87. package/dist/cjs/redirect.js +35 -0
  88. package/dist/cjs/route-announcement.d.ts +13 -0
  89. package/dist/cjs/route-announcement.d.ts.map +1 -0
  90. package/dist/cjs/route-announcement.js +61 -0
  91. package/dist/cjs/route-focus.d.ts +12 -0
  92. package/dist/cjs/route-focus.d.ts.map +1 -0
  93. package/dist/cjs/route-focus.js +36 -0
  94. package/dist/cjs/route-validators.d.ts +21 -0
  95. package/dist/cjs/route-validators.d.ts.map +1 -0
  96. package/dist/cjs/route-validators.js +71 -0
  97. package/dist/cjs/routeParamsTypes.d.ts +49 -0
  98. package/dist/cjs/routeParamsTypes.d.ts.map +1 -0
  99. package/dist/cjs/routeParamsTypes.js +16 -0
  100. package/dist/cjs/router-context.d.ts +21 -0
  101. package/dist/cjs/router-context.d.ts.map +1 -0
  102. package/dist/cjs/router-context.js +69 -0
  103. package/dist/cjs/router.d.ts +11 -0
  104. package/dist/cjs/router.d.ts.map +1 -0
  105. package/dist/cjs/router.js +207 -0
  106. package/dist/cjs/rsc/ClientRouter.d.ts +4 -0
  107. package/dist/cjs/rsc/ClientRouter.d.ts.map +1 -0
  108. package/dist/cjs/rsc/ClientRouter.js +90 -0
  109. package/dist/cjs/rsc/RscCache.d.ts +23 -0
  110. package/dist/cjs/rsc/RscCache.d.ts.map +1 -0
  111. package/dist/cjs/rsc/RscCache.js +110 -0
  112. package/dist/cjs/rsc/RscRoutes.d.ts +7 -0
  113. package/dist/cjs/rsc/RscRoutes.d.ts.map +1 -0
  114. package/dist/cjs/rsc/RscRoutes.js +124 -0
  115. package/dist/cjs/rsc/ServerRouteLoader.d.ts +12 -0
  116. package/dist/cjs/rsc/ServerRouteLoader.d.ts.map +1 -0
  117. package/dist/cjs/rsc/ServerRouteLoader.js +65 -0
  118. package/dist/cjs/rsc/ServerRouter.d.ts +11 -0
  119. package/dist/cjs/rsc/ServerRouter.d.ts.map +1 -0
  120. package/dist/cjs/rsc/ServerRouter.js +170 -0
  121. package/dist/cjs/rsc/SsrRouter.d.ts +4 -0
  122. package/dist/cjs/rsc/SsrRouter.d.ts.map +1 -0
  123. package/dist/cjs/rsc/SsrRouter.js +56 -0
  124. package/dist/cjs/rsc/clientSsr.d.ts +2 -0
  125. package/dist/cjs/rsc/clientSsr.d.ts.map +1 -0
  126. package/dist/cjs/rsc/clientSsr.js +114 -0
  127. package/dist/cjs/rsc/rscCss.d.ts +2 -0
  128. package/dist/cjs/rsc/rscCss.d.ts.map +1 -0
  129. package/dist/cjs/rsc/rscCss.js +94 -0
  130. package/dist/cjs/rsc/ssrModuleMap.d.ts +14 -0
  131. package/dist/cjs/rsc/ssrModuleMap.d.ts.map +1 -0
  132. package/dist/cjs/rsc/ssrModuleMap.js +49 -0
  133. package/dist/cjs/rsc/utils.d.ts +20 -0
  134. package/dist/cjs/rsc/utils.d.ts.map +1 -0
  135. package/dist/cjs/rsc/utils.js +68 -0
  136. package/dist/cjs/rsc-link.d.ts +6 -0
  137. package/dist/cjs/rsc-link.d.ts.map +1 -0
  138. package/dist/cjs/rsc-link.js +41 -0
  139. package/dist/cjs/skipNav.d.ts +81 -0
  140. package/dist/cjs/skipNav.d.ts.map +1 -0
  141. package/dist/cjs/skipNav.js +69 -0
  142. package/dist/cjs/splash-page.d.ts +12 -0
  143. package/dist/cjs/splash-page.d.ts.map +1 -0
  144. package/dist/cjs/splash-page.js +515 -0
  145. package/dist/cjs/useBlocker.d.ts +11 -0
  146. package/dist/cjs/useBlocker.d.ts.map +1 -0
  147. package/dist/cjs/useBlocker.js +65 -0
  148. package/dist/cjs/useIsMounted.d.ts +2 -0
  149. package/dist/cjs/useIsMounted.d.ts.map +1 -0
  150. package/dist/cjs/useIsMounted.js +37 -0
  151. package/dist/cjs/useMatch.d.ts +43 -0
  152. package/dist/cjs/useMatch.d.ts.map +1 -0
  153. package/dist/cjs/useMatch.js +72 -0
  154. package/dist/cjs/useRouteName.d.ts +3 -0
  155. package/dist/cjs/useRouteName.d.ts.map +1 -0
  156. package/dist/cjs/useRouteName.js +40 -0
  157. package/dist/cjs/useRoutePaths.d.ts +4 -0
  158. package/dist/cjs/useRoutePaths.d.ts.map +1 -0
  159. package/dist/cjs/useRoutePaths.js +50 -0
  160. package/dist/cjs/util.d.ts +121 -0
  161. package/dist/cjs/util.d.ts.map +1 -0
  162. package/dist/cjs/util.js +214 -0
  163. package/dist/createNamedContext.d.ts +3 -0
  164. package/dist/createNamedContext.d.ts.map +1 -0
  165. package/dist/createNamedContext.js +9 -0
  166. package/dist/dummyComponent.d.ts +3 -0
  167. package/dist/dummyComponent.d.ts.map +1 -0
  168. package/dist/dummyComponent.js +4 -0
  169. package/dist/history.d.ts +24 -0
  170. package/dist/history.d.ts.map +1 -0
  171. package/dist/history.js +118 -0
  172. package/dist/index.d.ts +35 -0
  173. package/dist/index.d.ts.map +1 -0
  174. package/dist/index.js +49 -0
  175. package/dist/link.d.ts +9 -0
  176. package/dist/link.d.ts.map +1 -0
  177. package/dist/link.js +28 -0
  178. package/dist/location.d.ts +28 -0
  179. package/dist/location.d.ts.map +1 -0
  180. package/dist/location.js +74 -0
  181. package/dist/namedRoutes.d.ts +3 -0
  182. package/dist/namedRoutes.d.ts.map +1 -0
  183. package/dist/namedRoutes.js +4 -0
  184. package/dist/navLink.d.ts +11 -0
  185. package/dist/navLink.d.ts.map +1 -0
  186. package/dist/navLink.js +36 -0
  187. package/dist/page.d.ts +28 -0
  188. package/dist/page.d.ts.map +1 -0
  189. package/dist/page.js +17 -0
  190. package/dist/params.d.ts +13 -0
  191. package/dist/params.d.ts.map +1 -0
  192. package/dist/params.js +28 -0
  193. package/dist/react-util.d.ts +3 -0
  194. package/dist/react-util.d.ts.map +1 -0
  195. package/dist/react-util.js +13 -0
  196. package/dist/redirect.d.ts +12 -0
  197. package/dist/redirect.d.ts.map +1 -0
  198. package/dist/redirect.js +11 -0
  199. package/dist/route-announcement.d.ts +13 -0
  200. package/dist/route-announcement.d.ts.map +1 -0
  201. package/dist/route-announcement.js +31 -0
  202. package/dist/route-focus.d.ts +12 -0
  203. package/dist/route-focus.d.ts.map +1 -0
  204. package/dist/route-focus.js +6 -0
  205. package/dist/route-validators.d.ts +21 -0
  206. package/dist/route-validators.d.ts.map +1 -0
  207. package/dist/route-validators.js +44 -0
  208. package/dist/routeParamsTypes.d.ts +49 -0
  209. package/dist/routeParamsTypes.d.ts.map +1 -0
  210. package/dist/routeParamsTypes.js +0 -0
  211. package/dist/router-context.d.ts +21 -0
  212. package/dist/router-context.d.ts.map +1 -0
  213. package/dist/router-context.js +34 -0
  214. package/dist/router.d.ts +11 -0
  215. package/dist/router.d.ts.map +1 -0
  216. package/dist/router.js +173 -0
  217. package/dist/rsc/ClientRouter.d.ts +4 -0
  218. package/dist/rsc/ClientRouter.d.ts.map +1 -0
  219. package/dist/rsc/ClientRouter.js +56 -0
  220. package/dist/rsc/RscCache.d.ts +23 -0
  221. package/dist/rsc/RscCache.d.ts.map +1 -0
  222. package/dist/rsc/RscCache.js +86 -0
  223. package/dist/rsc/RscRoutes.d.ts +7 -0
  224. package/dist/rsc/RscRoutes.d.ts.map +1 -0
  225. package/dist/rsc/RscRoutes.js +100 -0
  226. package/dist/rsc/ServerRouteLoader.d.ts +12 -0
  227. package/dist/rsc/ServerRouteLoader.d.ts.map +1 -0
  228. package/dist/rsc/ServerRouteLoader.js +31 -0
  229. package/dist/rsc/ServerRouter.d.ts +11 -0
  230. package/dist/rsc/ServerRouter.d.ts.map +1 -0
  231. package/dist/rsc/ServerRouter.js +136 -0
  232. package/dist/rsc/SsrRouter.d.ts +4 -0
  233. package/dist/rsc/SsrRouter.d.ts.map +1 -0
  234. package/dist/rsc/SsrRouter.js +22 -0
  235. package/dist/rsc/clientSsr.d.ts +2 -0
  236. package/dist/rsc/clientSsr.d.ts.map +1 -0
  237. package/dist/rsc/clientSsr.js +80 -0
  238. package/dist/rsc/rscCss.d.ts +2 -0
  239. package/dist/rsc/rscCss.d.ts.map +1 -0
  240. package/dist/rsc/rscCss.js +60 -0
  241. package/dist/rsc/ssrModuleMap.d.ts +14 -0
  242. package/dist/rsc/ssrModuleMap.d.ts.map +1 -0
  243. package/dist/rsc/ssrModuleMap.js +25 -0
  244. package/dist/rsc/utils.d.ts +20 -0
  245. package/dist/rsc/utils.d.ts.map +1 -0
  246. package/dist/rsc/utils.js +31 -0
  247. package/dist/rsc-link.d.ts +6 -0
  248. package/dist/rsc-link.d.ts.map +1 -0
  249. package/dist/rsc-link.js +7 -0
  250. package/dist/skipNav.d.ts +81 -0
  251. package/dist/skipNav.d.ts.map +1 -0
  252. package/dist/skipNav.js +34 -0
  253. package/dist/splash-page.d.ts +12 -0
  254. package/dist/splash-page.d.ts.map +1 -0
  255. package/dist/splash-page.js +481 -0
  256. package/dist/useBlocker.d.ts +11 -0
  257. package/dist/useBlocker.d.ts.map +1 -0
  258. package/dist/useBlocker.js +41 -0
  259. package/dist/useIsMounted.d.ts +2 -0
  260. package/dist/useIsMounted.d.ts.map +1 -0
  261. package/dist/useIsMounted.js +13 -0
  262. package/dist/useMatch.d.ts +43 -0
  263. package/dist/useMatch.d.ts.map +1 -0
  264. package/dist/useMatch.js +48 -0
  265. package/dist/useRouteName.d.ts +3 -0
  266. package/dist/useRouteName.d.ts.map +1 -0
  267. package/dist/useRouteName.js +16 -0
  268. package/dist/useRoutePaths.d.ts +4 -0
  269. package/dist/useRoutePaths.d.ts.map +1 -0
  270. package/dist/useRoutePaths.js +25 -0
  271. package/dist/util.d.ts +121 -0
  272. package/dist/util.d.ts.map +1 -0
  273. package/dist/util.js +183 -0
  274. package/package.json +127 -0
  275. package/skip-nav.css +31 -0
@@ -0,0 +1,100 @@
1
+ import { use, useState, useEffect } from "react";
2
+ import { createFromFetch, encodeReply } from "react-server-dom-webpack/client";
3
+ import { RscCache } from "./RscCache.js";
4
+ const BASE_PATH = "/rw-rsc/";
5
+ const rscCache = new RscCache();
6
+ let updateCurrentRscCacheKey = (key) => {
7
+ console.error("updateCurrentRscCacheKey called before it was set");
8
+ console.error("updateCurrentRscCacheKey key", key);
9
+ };
10
+ function onStreamFinished(fetchPromise, onFinished) {
11
+ return fetchPromise.then((response) => response.clone().text()).then(onFinished);
12
+ }
13
+ async function rsaFetch(serializedLocation, rsaId, rsaArgs) {
14
+ const rscId = "_";
15
+ const searchParams = new URLSearchParams();
16
+ searchParams.set("action_id", rsaId);
17
+ const url = BASE_PATH + rscId + "?" + searchParams + "&" + serializedLocation;
18
+ let body = "";
19
+ try {
20
+ body = await encodeReply(rsaArgs);
21
+ } catch (e) {
22
+ console.error("Error encoding Server Action arguments", e);
23
+ }
24
+ return fetch(url, {
25
+ method: "POST",
26
+ body,
27
+ headers: { "rw-rsc": "1" }
28
+ });
29
+ }
30
+ function rscFetch(serializedLocation) {
31
+ const rscId = "__rwjs__Routes";
32
+ return fetch(BASE_PATH + rscId + "?" + serializedLocation, {
33
+ headers: { "rw-rsc": "1" }
34
+ });
35
+ }
36
+ function rscFetchRoutes(serializedLocation) {
37
+ console.log(
38
+ "rscFetchRoutes :: args:\n serializedProps: " + serializedLocation
39
+ );
40
+ const rscCacheKey = serializedLocation;
41
+ const cached = rscCache.get(rscCacheKey);
42
+ if (cached) {
43
+ console.log("rscFetchRoutes :: cache hit for", rscCacheKey);
44
+ return cached;
45
+ } else {
46
+ console.log("rscFetchRoutes :: cache miss for", rscCacheKey);
47
+ }
48
+ const options = {
49
+ // React will hold on to `callServer` and use that when it detects a server
50
+ // action is invoked (like `action={onSubmit}` in a <form> element). So for
51
+ // now at least we need to send it with every RSC request, so React knows
52
+ // what `callServer` method to use for server actions inside the RSC.
53
+ // TODO (RSC): Need to figure out the types for callServer
54
+ // @ts-expect-error types
55
+ callServer: async function(rsaId, args) {
56
+ console.log("RscRoutes :: callServer rsaId", rsaId, "args", args);
57
+ const rscCacheKey2 = `${serializedLocation}::${rsaId}::${Date.now()}`;
58
+ const responsePromise = rsaFetch(serializedLocation, rsaId, args);
59
+ onStreamFinished(responsePromise, () => {
60
+ updateCurrentRscCacheKey(rscCacheKey2);
61
+ });
62
+ const modelPromise2 = createFromFetch(responsePromise, options);
63
+ rscCache.set(rscCacheKey2, modelPromise2);
64
+ const model = await modelPromise2;
65
+ return model.__rwjs__rsa_data;
66
+ }
67
+ };
68
+ const modelPromise = createFromFetch(rscFetch(serializedLocation), options);
69
+ rscCache.set(rscCacheKey, modelPromise);
70
+ return modelPromise;
71
+ }
72
+ const RscRoutes = ({ pathname, search }) => {
73
+ const serializedLocation = `__rwjs__pathname=${pathname}&__rwjs__search=${search}`;
74
+ const [currentRscCacheKey, setCurrentRscCacheKey] = useState(() => {
75
+ console.log("RscRoutes :: useState initial value");
76
+ rscFetchRoutes(serializedLocation);
77
+ return serializedLocation;
78
+ });
79
+ useEffect(() => {
80
+ console.log("RscRoutes :: useEffect set updateCurrentRscCacheKey");
81
+ updateCurrentRscCacheKey = (key) => {
82
+ console.log("RscRoutes inside updateCurrentRscCacheKey", key);
83
+ setCurrentRscCacheKey(key);
84
+ };
85
+ }, []);
86
+ useEffect(() => {
87
+ console.log("RscRoutes :: useEffect about to call rscFetchRoutes");
88
+ rscFetchRoutes(serializedLocation);
89
+ setCurrentRscCacheKey(serializedLocation);
90
+ }, [serializedLocation]);
91
+ console.log("RscRoutes :: rendering cache entry for\n" + currentRscCacheKey);
92
+ const rscModelPromise = rscCache.get(currentRscCacheKey);
93
+ if (!rscModelPromise) {
94
+ throw new Error("Missing RSC cache entry for " + currentRscCacheKey);
95
+ }
96
+ return use(rscModelPromise).__rwjs__Routes[0];
97
+ };
98
+ export {
99
+ RscRoutes
100
+ };
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import type { Spec } from '../page.js';
3
+ interface Props {
4
+ path: string;
5
+ spec: Spec;
6
+ params?: Record<string, string>;
7
+ whileLoadingPage?: () => React.ReactNode | null;
8
+ children?: React.ReactNode;
9
+ }
10
+ export declare const ServerRouteLoader: ({ spec, params }: Props) => React.JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=ServerRouteLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerRouteLoader.d.ts","sourceRoot":"","sources":["../../src/rsc/ServerRouteLoader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,gBAAgB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;IAC/C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAED,eAAO,MAAM,iBAAiB,qBAAsB,KAAK,sBA+BxD,CAAA"}
@@ -0,0 +1,31 @@
1
+ import React, { Suspense } from "react";
2
+ const ServerRouteLoader = ({ spec, params }) => {
3
+ const LazyRouteComponent = spec.LazyComponent;
4
+ if (params) {
5
+ delete params["ref"];
6
+ delete params["key"];
7
+ }
8
+ return /* @__PURE__ */ React.createElement(Suspense, { fallback: /* @__PURE__ */ React.createElement("div", null, "Loading...") }, /* @__PURE__ */ React.createElement(LazyRouteComponent, { ...params }), /* @__PURE__ */ React.createElement(
9
+ "div",
10
+ {
11
+ id: "redwood-announcer",
12
+ style: {
13
+ position: "absolute",
14
+ top: 0,
15
+ width: 1,
16
+ height: 1,
17
+ padding: 0,
18
+ overflow: "hidden",
19
+ clip: "rect(0, 0, 0, 0)",
20
+ whiteSpace: "nowrap",
21
+ border: 0
22
+ },
23
+ role: "alert",
24
+ "aria-live": "assertive",
25
+ "aria-atomic": "true"
26
+ }
27
+ ));
28
+ };
29
+ export {
30
+ ServerRouteLoader
31
+ };
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from 'react';
2
+ import React from 'react';
3
+ import type { RouterContextProviderProps } from '../router-context.js';
4
+ import type { TrailingSlashesTypes } from '../util.js';
5
+ export interface RouterProps extends Omit<RouterContextProviderProps, 'routes' | 'activeRouteName'> {
6
+ trailingSlashes?: TrailingSlashesTypes;
7
+ pageLoadingDelay?: number;
8
+ children: ReactNode;
9
+ }
10
+ export declare const Router: React.FC<RouterProps>;
11
+ //# sourceMappingURL=ServerRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerRouter.d.ts","sourceRoot":"","sources":["../../src/rsc/ServerRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AAEtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAKtD,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,0BAA0B,EAAE,QAAQ,GAAG,iBAAiB,CAAC;IACtE,eAAe,CAAC,EAAE,oBAAoB,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA4GxC,CAAA"}
@@ -0,0 +1,136 @@
1
+ import React from "react";
2
+ import { getAuthState, getLocation } from "@cedarjs/server-store";
3
+ import { analyzeRoutes } from "../analyzeRoutes.js";
4
+ import { namedRoutes } from "../namedRoutes.js";
5
+ import { normalizePage } from "../page.js";
6
+ import { SplashPage } from "../splash-page.js";
7
+ import { matchPath, parseSearch, replaceParams, validatePath } from "../util.js";
8
+ import { ServerRouteLoader } from "./ServerRouteLoader.js";
9
+ const Router = ({ paramTypes, children }) => {
10
+ const location = getLocation();
11
+ console.log("ServerRouter.tsx location", location);
12
+ const analyzedRoutes = analyzeRoutes(children, {
13
+ currentPathName: location.pathname,
14
+ // @TODO We haven't handled this with SSR/Streaming yet.
15
+ // May need a babel plugin to extract userParamTypes from Routes.tsx
16
+ userParamTypes: paramTypes
17
+ });
18
+ const {
19
+ pathRouteMap,
20
+ hasRootRoute,
21
+ namedRoutesMap,
22
+ NotFoundPage,
23
+ activeRoutePath
24
+ } = analyzedRoutes;
25
+ Object.assign(namedRoutes, namedRoutesMap);
26
+ const hasGeneratedRoutes = Object.keys(namedRoutes).length > 0;
27
+ const shouldShowSplash = !hasRootRoute && location.pathname === "/" || !hasGeneratedRoutes;
28
+ if (shouldShowSplash && typeof SplashPage !== "undefined") {
29
+ return /* @__PURE__ */ React.createElement(
30
+ SplashPage,
31
+ {
32
+ hasGeneratedRoutes,
33
+ allStandardRoutes: pathRouteMap
34
+ }
35
+ );
36
+ }
37
+ if (!activeRoutePath) {
38
+ if (NotFoundPage) {
39
+ return /* @__PURE__ */ React.createElement(
40
+ ServerRouteLoader,
41
+ {
42
+ spec: normalizePage(NotFoundPage),
43
+ path: location.pathname
44
+ }
45
+ );
46
+ }
47
+ return null;
48
+ }
49
+ const { path, page, name, redirect, whileLoadingPage, sets } = pathRouteMap[activeRoutePath];
50
+ if (!path) {
51
+ throw new Error(`Route "${name}" needs to specify a path`);
52
+ }
53
+ validatePath(path, name || path);
54
+ const { params: pathParams } = matchPath(path, location.pathname, {
55
+ userParamTypes: paramTypes
56
+ });
57
+ const searchParams = parseSearch(location.search);
58
+ const allParams = { ...searchParams, ...pathParams };
59
+ let redirectPath = void 0;
60
+ if (redirect) {
61
+ if (redirect.startsWith("/")) {
62
+ redirectPath = replaceParams(redirect, allParams);
63
+ } else {
64
+ const redirectRouteObject = Object.values(pathRouteMap).find(
65
+ (route) => route.name === redirect
66
+ );
67
+ if (!redirectRouteObject) {
68
+ throw new Error(
69
+ `Redirect target route "${redirect}" does not exist for route "${name}"`
70
+ );
71
+ }
72
+ redirectPath = replaceParams(redirectRouteObject.path, allParams);
73
+ }
74
+ }
75
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, !redirectPath && page && /* @__PURE__ */ React.createElement(
76
+ WrappedPage,
77
+ {
78
+ sets,
79
+ routeLoaderElement: /* @__PURE__ */ React.createElement(
80
+ ServerRouteLoader,
81
+ {
82
+ path,
83
+ spec: normalizePage(page),
84
+ params: allParams,
85
+ whileLoadingPage
86
+ }
87
+ )
88
+ }
89
+ ));
90
+ };
91
+ function hasRole(requiredRoles) {
92
+ const { roles } = getAuthState();
93
+ const requiredRolesArray = Array.isArray(requiredRoles) ? requiredRoles : [requiredRoles];
94
+ return requiredRolesArray.some((role) => roles.includes(role));
95
+ }
96
+ const AuthenticatedRoute = ({
97
+ children,
98
+ roles
99
+ }) => {
100
+ const { isAuthenticated } = getAuthState();
101
+ const isAuthorized = isAuthenticated && (!roles || hasRole(roles));
102
+ if (isAuthorized) {
103
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
104
+ }
105
+ if (!isAuthenticated) {
106
+ throw new Error("401 Unauthorized");
107
+ }
108
+ throw new Error("403 Forbidden");
109
+ };
110
+ const WrappedPage = ({ routeLoaderElement, sets }) => {
111
+ if (!sets || sets.length === 0) {
112
+ return routeLoaderElement;
113
+ }
114
+ return sets.reduceRight((acc, set) => {
115
+ let wrapped = set.wrappers.reduceRight((acc2, Wrapper, index) => {
116
+ return React.createElement(
117
+ Wrapper,
118
+ { ...set.props, key: set.id + "-" + index },
119
+ acc2
120
+ );
121
+ }, acc);
122
+ if (set.isPrivate) {
123
+ const unauthenticated = set.props.unauthenticated;
124
+ if (!unauthenticated || typeof unauthenticated !== "string") {
125
+ throw new Error(
126
+ "You must specify an `unauthenticated` route when using PrivateSet"
127
+ );
128
+ }
129
+ wrapped = /* @__PURE__ */ React.createElement(AuthenticatedRoute, { ...set.props, unauthenticated }, wrapped);
130
+ }
131
+ return wrapped;
132
+ }, routeLoaderElement);
133
+ };
134
+ export {
135
+ Router
136
+ };
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { RouterProps } from '../router.js';
3
+ export declare const Router: ({ paramTypes, children }: RouterProps) => React.JSX.Element;
4
+ //# sourceMappingURL=SsrRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SsrRouter.d.ts","sourceRoot":"","sources":["../../src/rsc/SsrRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAKtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAI/C,eAAO,MAAM,MAAM,6BAA8B,WAAW,sBAQ3D,CAAA"}
@@ -0,0 +1,22 @@
1
+ import React, { useMemo } from "react";
2
+ import { analyzeRoutes } from "../analyzeRoutes.js";
3
+ import { LocationProvider, useLocation } from "../location.js";
4
+ import { namedRoutes } from "../namedRoutes.js";
5
+ import { renderRoutesSsr } from "./clientSsr.js";
6
+ const Router = ({ paramTypes, children }) => {
7
+ return /* @__PURE__ */ React.createElement(LocationProvider, null, /* @__PURE__ */ React.createElement(LocationAwareRouter, { paramTypes }, children));
8
+ };
9
+ const LocationAwareRouter = ({ paramTypes, children }) => {
10
+ const { pathname } = useLocation();
11
+ const { namedRoutesMap } = useMemo(() => {
12
+ return analyzeRoutes(children, {
13
+ currentPathName: pathname,
14
+ userParamTypes: paramTypes
15
+ });
16
+ }, [pathname, children, paramTypes]);
17
+ Object.assign(namedRoutes, namedRoutesMap);
18
+ return renderRoutesSsr(pathname);
19
+ };
20
+ export {
21
+ Router
22
+ };
@@ -0,0 +1,2 @@
1
+ export declare function renderRoutesSsr(pathname: string): Promise<any>;
2
+ //# sourceMappingURL=clientSsr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clientSsr.d.ts","sourceRoot":"","sources":["../../src/rsc/clientSsr.ts"],"names":[],"mappings":"AAuEA,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,gBA2DrD"}
@@ -0,0 +1,80 @@
1
+ import path from "node:path";
2
+ import { getPaths } from "@cedarjs/project-config";
3
+ import { moduleMap } from "./ssrModuleMap.js";
4
+ import { importRsdwClient, importRsdwServer, importReact } from "./utils.js";
5
+ import { makeFilePath } from "./utils.js";
6
+ async function getEntries() {
7
+ const entriesPath = getPaths().web.distRscEntries;
8
+ const entries = await import(makeFilePath(entriesPath));
9
+ return entries;
10
+ }
11
+ async function getRoutesComponent() {
12
+ const { serverEntries } = await getEntries();
13
+ const entryPath = path.join(
14
+ getPaths().web.distRsc,
15
+ serverEntries["__rwjs__Routes"]
16
+ );
17
+ console.log("getRoutesComponent entryPath", entryPath);
18
+ const routesModule = await import(makeFilePath(entryPath));
19
+ return routesModule.default;
20
+ }
21
+ function resolveClientEntryForProd(filePath, clientEntries) {
22
+ const basePath = getPaths().web.distSsr;
23
+ const entriesFile = getPaths().web.distRscEntries;
24
+ const baseDir = path.dirname(entriesFile);
25
+ const absoluteClientEntries = Object.fromEntries(
26
+ Object.entries(clientEntries).map(([key, val]) => {
27
+ let fullKey = path.join(baseDir, key);
28
+ if (process.platform === "win32") {
29
+ fullKey = fullKey.replaceAll("\\", "/");
30
+ }
31
+ return [fullKey, basePath + path.sep + val];
32
+ })
33
+ );
34
+ const filePathSlash = filePath.replaceAll("\\", "/");
35
+ const clientEntry = absoluteClientEntries[filePathSlash];
36
+ console.log("resolveClientEntryForProd during SSR - clientEntry", clientEntry);
37
+ if (!clientEntry) {
38
+ if (absoluteClientEntries["*"] === "*") {
39
+ return basePath + path.relative(getPaths().base, filePathSlash);
40
+ }
41
+ throw new Error("No client entry found for " + filePathSlash);
42
+ }
43
+ return clientEntry;
44
+ }
45
+ const rscCache = /* @__PURE__ */ new Map();
46
+ async function renderRoutesSsr(pathname) {
47
+ console.log("renderRoutesSsr pathname", pathname);
48
+ const cached = rscCache.get(pathname);
49
+ if (cached) {
50
+ return cached;
51
+ }
52
+ const Routes = await getRoutesComponent();
53
+ console.log("clientSsr.ts getEntries()", await getEntries());
54
+ const clientEntries = (await getEntries()).ssrEntries;
55
+ const bundlerConfig = new Proxy(
56
+ {},
57
+ {
58
+ get(_target, encodedId) {
59
+ console.log("Proxy get encodedId", encodedId);
60
+ const [filePath, name] = encodedId.split("#");
61
+ const id = resolveClientEntryForProd(filePath, clientEntries);
62
+ console.log("clientSsr.ts::Proxy id", id);
63
+ return { id, chunks: [id], name, async: true };
64
+ }
65
+ }
66
+ );
67
+ const { createElement } = await importReact();
68
+ const { renderToReadableStream } = await importRsdwServer();
69
+ console.log("clientSsr.ts right before renderToReadableStream");
70
+ const stream = renderToReadableStream(createElement(Routes), bundlerConfig);
71
+ const { createFromReadableStream } = await importRsdwClient();
72
+ const data = createFromReadableStream(stream, {
73
+ ssrManifest: { moduleMap, moduleLoading: null }
74
+ });
75
+ rscCache.set(pathname, data);
76
+ return data;
77
+ }
78
+ export {
79
+ renderRoutesSsr
80
+ };
@@ -0,0 +1,2 @@
1
+ export declare function getRscStylesheetLinkGenerator(existingLinks?: string[]): () => string[];
2
+ //# sourceMappingURL=rscCss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rscCss.d.ts","sourceRoot":"","sources":["../../src/rsc/rscCss.ts"],"names":[],"mappings":"AAaA,wBAAgB,6BAA6B,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,kBAiCrE"}
@@ -0,0 +1,60 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { getPaths } from "@cedarjs/project-config";
4
+ function getRscStylesheetLinkGenerator(existingLinks) {
5
+ const clientBuildManifestPath = path.join(
6
+ getPaths().web.distBrowser,
7
+ "client-build-manifest.json"
8
+ );
9
+ const clientBuildManifest = JSON.parse(
10
+ fs.readFileSync(clientBuildManifestPath, "utf-8")
11
+ );
12
+ const clientCss = extractCssMappingFromManifest(clientBuildManifest);
13
+ const serverBuildManifestPath = path.join(
14
+ getPaths().web.distRsc,
15
+ "server-build-manifest.json"
16
+ );
17
+ const serverBuildManifest = JSON.parse(
18
+ fs.readFileSync(serverBuildManifestPath, "utf-8")
19
+ );
20
+ const serverCss = extractCssMappingFromManifest(serverBuildManifest);
21
+ const allCss = /* @__PURE__ */ new Set();
22
+ for (const cssList of clientCss.values()) {
23
+ for (const css of cssList) {
24
+ allCss.add(css);
25
+ }
26
+ }
27
+ for (const cssList of serverCss.values()) {
28
+ for (const css of cssList) {
29
+ allCss.add(css);
30
+ }
31
+ }
32
+ const cssLinks = Array.from(allCss);
33
+ return () => [...existingLinks || [], ...cssLinks];
34
+ }
35
+ function extractCssMappingFromManifest(manifest) {
36
+ const manifestCss = /* @__PURE__ */ new Map();
37
+ const lookupCssAssets = (id) => {
38
+ const assets = [];
39
+ const asset = manifest[id];
40
+ if (!asset) {
41
+ return assets;
42
+ }
43
+ if (asset.css) {
44
+ assets.push(...asset.css);
45
+ }
46
+ if (asset.imports) {
47
+ for (const importId of asset.imports) {
48
+ assets.push(...lookupCssAssets(importId));
49
+ }
50
+ }
51
+ return assets;
52
+ };
53
+ for (const key of Object.keys(manifest)) {
54
+ manifestCss.set(key, lookupCssAssets(key));
55
+ }
56
+ return manifestCss;
57
+ }
58
+ export {
59
+ getRscStylesheetLinkGenerator
60
+ };
@@ -0,0 +1,14 @@
1
+ type SSRModuleMap = null | {
2
+ [clientId: string]: {
3
+ [clientExportName: string]: ClientReferenceManifestEntry;
4
+ };
5
+ };
6
+ type ClientReferenceManifestEntry = ImportManifestEntry;
7
+ type ImportManifestEntry = {
8
+ id: string;
9
+ chunks: string[];
10
+ name: string;
11
+ };
12
+ export declare const moduleMap: SSRModuleMap;
13
+ export {};
14
+ //# sourceMappingURL=ssrModuleMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssrModuleMap.d.ts","sourceRoot":"","sources":["../../src/rsc/ssrModuleMap.ts"],"names":[],"mappings":"AAEA,KAAK,YAAY,GAAG,IAAI,GAAG;IACzB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,CAAC,gBAAgB,EAAE,MAAM,GAAG,4BAA4B,CAAA;KACzD,CAAA;CACF,CAAA;AACD,KAAK,4BAA4B,GAAG,mBAAmB,CAAA;AACvD,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAE,MAAM,CAAA;IAEV,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAMD,eAAO,MAAM,SAAS,EAAE,YAuBvB,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { makeFilePath } from "./utils.js";
2
+ const moduleMap = new Proxy(
3
+ {},
4
+ {
5
+ get(_target, filePath) {
6
+ return new Proxy(
7
+ {},
8
+ {
9
+ get(_target2, name) {
10
+ filePath = makeFilePath(filePath);
11
+ const manifestEntry = {
12
+ id: filePath,
13
+ chunks: [filePath],
14
+ name
15
+ };
16
+ return manifestEntry;
17
+ }
18
+ }
19
+ );
20
+ }
21
+ }
22
+ );
23
+ export {
24
+ moduleMap
25
+ };
@@ -0,0 +1,20 @@
1
+ import type { default as RSDWClientModule } from 'react-server-dom-webpack/client.edge';
2
+ import type { default as RSDWServerModule } from 'react-server-dom-webpack/server.edge';
3
+ type RSDWClientType = typeof RSDWClientModule;
4
+ type RSDWServerType = typeof RSDWServerModule;
5
+ export declare function makeFilePath(path: string): string;
6
+ /**
7
+ * See vite/streamHelpers.ts.
8
+ *
9
+ * This function ensures we load the same version of rsdw_client to prevent multiple instances of React
10
+ */
11
+ export declare function importReact(): Promise<any>;
12
+ /**
13
+ * See vite/streamHelpers.ts.
14
+ *
15
+ * This function ensures we load the same version of rsdw_client to prevent multiple instances of React
16
+ */
17
+ export declare function importRsdwClient(): Promise<RSDWClientType>;
18
+ export declare function importRsdwServer(): Promise<RSDWServerType>;
19
+ export {};
20
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/rsc/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AACvF,OAAO,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAIvF,KAAK,cAAc,GAAG,OAAO,gBAAgB,CAAA;AAC7C,KAAK,cAAc,GAAG,OAAO,gBAAgB,CAAA;AAE7C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,UAExC;AAED;;;;GAIG;AACH,wBAAsB,WAAW,iBAKhC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC,CAOhE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC,CAWhE"}
@@ -0,0 +1,31 @@
1
+ import path from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+ import { getPaths } from "@cedarjs/project-config";
4
+ function makeFilePath(path2) {
5
+ return pathToFileURL(path2).href;
6
+ }
7
+ async function importReact() {
8
+ const distSsr = getPaths().web.distSsr;
9
+ const reactPath = makeFilePath(path.join(distSsr, "__rwjs__react.mjs"));
10
+ return (await import(reactPath)).default;
11
+ }
12
+ async function importRsdwClient() {
13
+ const distSsr = getPaths().web.distSsr;
14
+ const rsdwClientPath = makeFilePath(
15
+ path.join(distSsr, "__rwjs__rsdw-client.mjs")
16
+ );
17
+ return (await import(rsdwClientPath)).default;
18
+ }
19
+ async function importRsdwServer() {
20
+ const dynamicImport = "";
21
+ return import(
22
+ /* @vite-ignore */
23
+ dynamicImport + "react-server-dom-webpack/server.edge"
24
+ );
25
+ }
26
+ export {
27
+ importReact,
28
+ importRsdwClient,
29
+ importRsdwServer,
30
+ makeFilePath
31
+ };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface LinkProps {
3
+ to: string;
4
+ }
5
+ export declare const Link: React.ForwardRefExoticComponent<LinkProps & React.AnchorHTMLAttributes<HTMLAnchorElement> & React.RefAttributes<HTMLAnchorElement>>;
6
+ //# sourceMappingURL=rsc-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsc-link.d.ts","sourceRoot":"","sources":["../src/rsc-link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAA;AAEzC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;CACX;AAmBD,eAAO,MAAM,IAAI,qIAKf,CAAA"}
@@ -0,0 +1,7 @@
1
+ import React, { forwardRef } from "react";
2
+ const Link = forwardRef(({ to, ...rest }, ref) => {
3
+ return /* @__PURE__ */ React.createElement("a", { href: to, ref, ...rest });
4
+ });
5
+ export {
6
+ Link
7
+ };