react-server-frame 0.0.9 → 0.0.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.mts","names":[],"sources":["../src/browser.tsx"],"mappings":";;;iBAQgB,oBAAA,CAAA;EACd,eAAA;EACA,2BAAA;EACA;AAAA;EAEA,eAAA,GAAkB,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,OAAA,cAAqB,OAAA,CAAQ,OAAA;EAC5E,2BAAA;EACA,WAAA,GAAc,CAAA,aAAc,OAAA,cAAqB,OAAA,UAAiB,QAAA;AAAA,KACnE,EAAA,UACyB,IAAA,gBAAiB,OAAA;AAAA,iBA6D3B,OAAA,CAAA;EACd,eAAA;EACA;AAAA;EAEA,eAAA,GAAkB,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,OAAA,cAAqB,OAAA,CAAQ,OAAA;EAC5E,wBAAA,GACE,MAAA,EAAQ,cAAA,CAAe,UAAA,GACvB,OAAA,cACG,OAAA,CAAQ,OAAA;AAAA"}
1
+ {"version":3,"file":"browser.d.mts","names":[],"sources":["../src/browser.tsx"],"mappings":";;;iBAQgB,oBAAA,CAAA;EACd,eAAA;EACA,2BAAA;EACA;AAAA;EAEA,eAAA,GAAkB,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,OAAA,cAAqB,OAAA,CAAQ,OAAA;EAC5E,2BAAA;EACA,WAAA,GAAc,CAAA,aAAc,OAAA,cAAqB,OAAA,UAAiB,QAAA;AAAA,KACnE,EAAA,UACyB,IAAA,gBAAiB,OAAA;AAAA,iBA4D3B,OAAA,CAAA;EACd,eAAA;EACA;AAAA;EAEA,eAAA,GAAkB,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,OAAA,cAAqB,OAAA,CAAQ,OAAA;EAC5E,wBAAA,GACE,MAAA,EAAQ,cAAA,CAAe,UAAA,GACvB,OAAA,cACG,OAAA,CAAQ,OAAA;AAAA"}
package/dist/browser.mjs CHANGED
@@ -32,8 +32,7 @@ function Content({ initialPayload }) {
32
32
  const promise = Promise.resolve(window.navigation.navigate(payload.redirect, { history: "replace" }).finished).then(() => {});
33
33
  seenPayloads.set(payload, Promise.resolve(promise));
34
34
  }
35
- use(seenPayloads.get(payload));
36
- return null;
35
+ throw seenPayloads.get(payload);
37
36
  } else {
38
37
  window.location.href = payload.redirect;
39
38
  return null;
@@ -41,9 +40,7 @@ function Content({ initialPayload }) {
41
40
  return payload.root;
42
41
  }
43
42
  function hydrate({ createFromFetch, createFromReadableStream }) {
44
- createFromReadableStream(rscStream).then((payload) => startTransition(() => {
45
- hydrateRoot(document, /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsx(Content, { initialPayload: Promise.resolve(payload) }) }), { formState: payload.formState });
46
- }), (reason) => console.error("Failed to hydrate root", reason));
43
+ createFromReadableStream(rscStream).then((payload) => hydrateRoot(document, /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsx(Content, { initialPayload: Promise.resolve(payload) }) }), { formState: payload.formState }), (reason) => console.error("Failed to hydrate root", reason));
47
44
  let navigationController = new AbortController();
48
45
  async function navigate(to) {
49
46
  const url = new URL(to, window.location.href);
@@ -72,12 +69,14 @@ function hydrate({ createFromFetch, createFromReadableStream }) {
72
69
  return;
73
70
  }
74
71
  event.intercept({ async handler() {
75
- await navigate(event.destination.url);
72
+ const promise = navigate(event.destination.url);
73
+ startTransition(() => promise);
74
+ return promise;
76
75
  } });
77
76
  });
78
77
  if (import.meta.hot) import.meta.hot.on("rsc:update", (e) => {
79
78
  console.log("[vite-rsc:update]", e.file);
80
- navigate(location.href);
79
+ startTransition(() => navigate(location.href));
81
80
  });
82
81
  }
83
82
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"browser.mjs","names":[],"sources":["../src/browser.tsx"],"sourcesContent":["import { startTransition, StrictMode, use, useState } from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\nimport { rscStream } from \"rsc-html-stream/client\";\n\nimport type { Payload } from \"./generic-payload.ts\";\n\nlet setPayload: (payload: Promise<Payload>) => void;\n\nexport function createServerCallback({\n createFromFetch,\n createTemporaryReferenceSet,\n encodeReply,\n}: {\n createFromFetch: (response: Promise<Response>, options?: object) => Promise<Payload>;\n createTemporaryReferenceSet: () => unknown;\n encodeReply: (v: unknown[], options?: object) => Promise<string | FormData>;\n}) {\n return async (id: string, args: unknown[]) => {\n const url = new URL(window.location.href);\n url.pathname += \".rsc\";\n const temporaryReferences = createTemporaryReferenceSet();\n const payload = await createFromFetch(\n fetch(url, {\n method: \"POST\",\n body: await encodeReply(args, { temporaryReferences }),\n headers: {\n \"x-rsc-action\": id,\n },\n }),\n { temporaryReferences },\n );\n\n if (payload.type === \"render\") {\n startTransition(() => {\n setPayload(Promise.resolve(payload));\n });\n } else if (payload.type === \"redirect\") {\n if (window.navigation) {\n window.navigation.navigate(payload.redirect, {\n history: \"replace\",\n });\n } else {\n window.location.href = payload.redirect;\n }\n }\n\n return payload.returnValue;\n };\n}\n\nlet seenPayloads = new WeakMap<Payload, Promise<void>>();\nfunction Content({ initialPayload }: { initialPayload: Promise<Payload> }) {\n const [promise, _setPayload] = useState(initialPayload);\n setPayload = _setPayload;\n\n const payload = use(promise);\n\n if (payload.type === \"redirect\") {\n if (window.navigation) {\n if (!seenPayloads.has(payload)) {\n const promise = Promise.resolve(\n window.navigation.navigate(payload.redirect, {\n history: \"replace\",\n }).finished,\n ).then(() => {});\n seenPayloads.set(payload, Promise.resolve(promise));\n }\n use(seenPayloads.get(payload)!);\n return null;\n } else {\n window.location.href = payload.redirect;\n return null;\n }\n }\n\n return payload.root;\n}\n\nexport function hydrate({\n createFromFetch,\n createFromReadableStream,\n}: {\n createFromFetch: (response: Promise<Response>, options?: object) => Promise<Payload>;\n createFromReadableStream: (\n stream: ReadableStream<Uint8Array>,\n options?: object,\n ) => Promise<Payload>;\n}) {\n createFromReadableStream(rscStream).then(\n (payload) =>\n startTransition(() => {\n hydrateRoot(\n document,\n <StrictMode>\n <Content initialPayload={Promise.resolve(payload)} />\n </StrictMode>,\n {\n formState: payload.formState,\n },\n );\n }),\n (reason) => console.error(\"Failed to hydrate root\", reason),\n );\n\n let navigationController = new AbortController();\n async function navigate(to: string) {\n const url = new URL(to, window.location.href);\n url.pathname += \".rsc\";\n\n const thisController = new AbortController();\n const responses = fetch(url, { signal: thisController.signal }).then((response) => [\n response,\n response.clone(),\n ]);\n\n startTransition(() => setPayload(createFromFetch(responses.then(([r]) => r))));\n navigationController.abort();\n navigationController = thisController;\n\n const [, response] = await responses;\n if (!response.body) return;\n const reader = response.body.getReader();\n try {\n let chunk = await reader.read();\n while (!chunk.done) {\n chunk = await reader.read();\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n window.navigation?.addEventListener(\"navigate\", (event) => {\n if (!event.canIntercept) {\n return;\n }\n\n if (event.hashChange || event.downloadRequest !== null) {\n return;\n }\n\n const url = new URL(event.destination.url);\n\n if (window.location.origin !== url.origin) {\n window.location.href = url.href;\n return;\n }\n\n event.intercept({\n async handler() {\n await navigate(event.destination.url);\n },\n });\n });\n\n if (import.meta.hot) {\n import.meta.hot.on(\"rsc:update\", (e) => {\n console.log(\"[vite-rsc:update]\", e.file);\n void navigate(location.href);\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"browser.mjs","names":[],"sources":["../src/browser.tsx"],"sourcesContent":["import { startTransition, StrictMode, use, useState } from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\nimport { rscStream } from \"rsc-html-stream/client\";\n\nimport type { Payload } from \"./generic-payload.ts\";\n\nlet setPayload: (payload: Promise<Payload>) => void;\n\nexport function createServerCallback({\n createFromFetch,\n createTemporaryReferenceSet,\n encodeReply,\n}: {\n createFromFetch: (response: Promise<Response>, options?: object) => Promise<Payload>;\n createTemporaryReferenceSet: () => unknown;\n encodeReply: (v: unknown[], options?: object) => Promise<string | FormData>;\n}) {\n return async (id: string, args: unknown[]) => {\n const url = new URL(window.location.href);\n url.pathname += \".rsc\";\n const temporaryReferences = createTemporaryReferenceSet();\n const payload = await createFromFetch(\n fetch(url, {\n method: \"POST\",\n body: await encodeReply(args, { temporaryReferences }),\n headers: {\n \"x-rsc-action\": id,\n },\n }),\n { temporaryReferences },\n );\n\n if (payload.type === \"render\") {\n startTransition(() => {\n setPayload(Promise.resolve(payload));\n });\n } else if (payload.type === \"redirect\") {\n if (window.navigation) {\n window.navigation.navigate(payload.redirect, {\n history: \"replace\",\n });\n } else {\n window.location.href = payload.redirect;\n }\n }\n\n return payload.returnValue;\n };\n}\n\nlet seenPayloads = new WeakMap<Payload, Promise<void>>();\nfunction Content({ initialPayload }: { initialPayload: Promise<Payload> }) {\n const [promise, _setPayload] = useState(initialPayload);\n setPayload = _setPayload;\n\n const payload = use(promise);\n\n if (payload.type === \"redirect\") {\n if (window.navigation) {\n if (!seenPayloads.has(payload)) {\n const promise = Promise.resolve(\n window.navigation.navigate(payload.redirect, {\n history: \"replace\",\n }).finished,\n ).then(() => {});\n seenPayloads.set(payload, Promise.resolve(promise));\n }\n throw seenPayloads.get(payload)!;\n } else {\n window.location.href = payload.redirect;\n return null;\n }\n }\n\n return payload.root;\n}\n\nexport function hydrate({\n createFromFetch,\n createFromReadableStream,\n}: {\n createFromFetch: (response: Promise<Response>, options?: object) => Promise<Payload>;\n createFromReadableStream: (\n stream: ReadableStream<Uint8Array>,\n options?: object,\n ) => Promise<Payload>;\n}) {\n createFromReadableStream(rscStream).then(\n (payload) =>\n hydrateRoot(\n document,\n <StrictMode>\n <Content initialPayload={Promise.resolve(payload)} />\n </StrictMode>,\n {\n formState: payload.formState,\n },\n ),\n (reason) => console.error(\"Failed to hydrate root\", reason),\n );\n\n let navigationController = new AbortController();\n async function navigate(to: string) {\n const url = new URL(to, window.location.href);\n url.pathname += \".rsc\";\n\n const thisController = new AbortController();\n const responses = fetch(url, { signal: thisController.signal }).then((response) => [\n response,\n response.clone(),\n ]);\n\n startTransition(() => setPayload(createFromFetch(responses.then(([r]) => r))));\n navigationController.abort();\n navigationController = thisController;\n\n const [, response] = await responses;\n if (!response.body) return;\n const reader = response.body.getReader();\n try {\n let chunk = await reader.read();\n while (!chunk.done) {\n chunk = await reader.read();\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n window.navigation?.addEventListener(\"navigate\", (event) => {\n if (!event.canIntercept) {\n return;\n }\n\n if (event.hashChange || event.downloadRequest !== null) {\n return;\n }\n\n const url = new URL(event.destination.url);\n\n if (window.location.origin !== url.origin) {\n window.location.href = url.href;\n return;\n }\n\n event.intercept({\n async handler() {\n const promise = navigate(event.destination.url);\n startTransition(() => promise);\n return promise;\n },\n });\n });\n\n if (import.meta.hot) {\n import.meta.hot.on(\"rsc:update\", (e) => {\n console.log(\"[vite-rsc:update]\", e.file);\n startTransition(() => navigate(location.href));\n });\n }\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,14 +1,14 @@
1
1
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
2
  import { ReactFormState } from "react-dom/client";
3
- import { Middleware, Router } from "remix/fetch-router";
3
+ import { Middleware, RequestContext, Router } from "remix/fetch-router";
4
4
  import { Route } from "remix/fetch-router/routes";
5
5
 
6
6
  //#region src/frames.d.ts
7
- declare function mapFrames<Frames extends Routes>(router: Router<any>, frames: Frames, {
7
+ declare function mapFrames<Context extends RequestContext<any, any> = RequestContext<{}, []>, Frames extends Routes = {}>(router: Router<Context>, frames: Frames, {
8
8
  components,
9
9
  middleware
10
10
  }: {
11
- middleware?: Middleware[];
11
+ middleware?: Middleware<any, any, any>[];
12
12
  components: Components<Frames>;
13
13
  }, config: {
14
14
  createTemporaryReferenceSet: () => unknown;
@@ -69,7 +69,7 @@ declare class NotFoundError extends Error {
69
69
  }
70
70
  interface Routes extends Record<string, Route | Routes> {}
71
71
  type Components<R extends Routes> = { [K in keyof R]: R[K] extends Routes ? Components<R[K]> : React.ComponentType | {
72
- middleware?: Middleware[];
72
+ middleware?: Middleware<any, any, any>[];
73
73
  component: React.ComponentType;
74
74
  } };
75
75
  type ProvideFramesProps<Frames extends Routes> = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/frames.tsx"],"mappings":";;;;;;iBAUgB,SAAA,gBAAyB,MAAA,CAAA,CACvC,MAAA,EAAQ,MAAA,OACR,MAAA,EAAQ,MAAA;EACN,UAAA;EAAY;AAAA;EAAqB,UAAA,GAAa,UAAA;EAAc,UAAA,EAAY,UAAA,CAAW,MAAA;AAAA,GACrF,MAAA;EACE,2BAAA;EACA,UAAA,GAAa,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,WAAA,KAAgB,OAAA,CAAQ,KAAA,CAAM,SAAA;EAC7D,SAAA,GAAY,IAAA,EAAM,cAAA,CAAe,UAAA,MAAgB,OAAA,CAAQ,QAAA;EACzD,sBAAA,GACE,OAAA,OACA,OAAA;IACE,mBAAA;IACA,OAAA,IAAW,KAAA;EAAA,MAEV,cAAA,CAAe,UAAA;AAAA;AAAA,cAoDX,cAAA;EACX,SAAA,GAAY,cAAA;EACZ,WAAA,GAAc,OAAA;EACd,mBAAA;EACA,MAAA;EAEA,WAAA,CACE,SAAA,EAAW,cAAA,cACX,WAAA,EAAa,OAAA,uBACb,mBAAA,WACA,MAAA;AAAA;AAAA,cASS,aAAA;EACX,QAAA;EACA,WAAA,CAAY,QAAA;AAAA;AAAA,iBAKE,wBAAA,CACd,sBAAA,GACE,OAAA,OACA,OAAA;EACE,mBAAA;EACA,OAAA,IAAW,KAAA;AAAA,MAEV,cAAA,CAAe,UAAA,IACnB,UAAA;AAAA,iBAmBa,mBAAA,CAAA;EACd,2BAAA;EACA,YAAA;EACA,eAAA;EACA,WAAA;EACA;AAAA;EAEA,2BAAA;EACA,YAAA,GAAe,QAAA,EAAU,QAAA,KAAa,OAAA,OAAc,OAAA;EACpD,eAAA,GAAkB,YAAA,WAAuB,IAAA,EAAM,QAAA,KAAa,OAAA,CAAQ,cAAA;EACpE,WAAA,GAAc,IAAA,WAAe,QAAA,EAAU,OAAA,cAAqB,OAAA;EAC5D,gBAAA,GAAmB,EAAA,aAAe,OAAA,CAAQ,QAAA;AAAA,IACxC,UAAA;AAAA,iBA6CY,QAAA,CAAS,kBAAA,WAA6B,QAAA;AAAA,iBAgBhC,MAAA,CAAA;EACpB,2BAAA;EACA,SAAA;EACA,sBAAA;EACA,OAAA;EACA;AAAA;EAEA,2BAAA;EACA,SAAA,GAAY,IAAA,EAAM,cAAA,CAAe,UAAA,MAAgB,OAAA,CAAQ,QAAA;EACzD,sBAAA,GACE,OAAA,OACA,OAAA;IACE,mBAAA;IACA,OAAA,GAAU,KAAA;EAAA,MAET,cAAA,CAAe,UAAA;EACpB,OAAA,EAAS,OAAA;EACT,IAAA,EAAM,KAAA,CAAM,SAAA;AAAA,IACb,OAAA,CAAA,QAAA;AAAA,cAsEY,aAAA,SAAsB,KAAA;EACjC,WAAA,CAAY,OAAA;AAAA;AAAA,UAMJ,MAAA,SAAe,MAAA,SAAe,KAAA,GAAQ,MAAA;AAAA,KAE3C,UAAA,WAAqB,MAAA,kBACZ,CAAA,GAAI,CAAA,CAAE,CAAA,UAAW,MAAA,GACzB,UAAA,CAAW,CAAA,CAAE,CAAA,KAET,KAAA,CAAM,aAAA;EAEJ,UAAA,GAAa,UAAA;EACb,SAAA,EAAW,KAAA,CAAM,aAAA;AAAA;AAAA,KAIjB,kBAAA,gBAAkC,MAAA;EAC5C,QAAA,GAAW,KAAA,CAAM,SAAA;EACjB,UAAA,EAAY,UAAA,CAAW,MAAA;EACvB,UAAA,GAAa,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,WAAA,KAAgB,OAAA,CAAQ,KAAA,CAAM,SAAA;EAC7D,MAAA,EAAQ,MAAA;AAAA;AAAA,iBAGM,aAAA,gBAA6B,MAAA,CAAA,CAAA;EAC3C,QAAA;EACA,UAAA;EACA,UAAA;EACA;AAAA,GACC,kBAAA,CAAmB,MAAA,IAAO,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBASb,KAAA,CAAA;EAAQ;AAAA;EAAS,GAAA;AAAA,IAAa,oBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/frames.tsx"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -171,14 +171,16 @@ function Frame({ src }) {
171
171
  if (isReactRequest(url)) url.pathname = url.pathname.slice(0, -4);
172
172
  const Component = match(cache.frames, cache.components, url.href);
173
173
  if (!Component) throw new NotFoundError("No matching frame found");
174
+ console.log(Component);
174
175
  return /* @__PURE__ */ jsx(ClientFrame, {
175
176
  src: url.pathname + url.search,
176
177
  children: /* @__PURE__ */ jsx(Component, {})
177
178
  });
178
179
  }
179
180
  function match(frames, components, href) {
180
- for (const [id, route] of Object.entries(frames)) if (typeof route.pattern?.test === "function" && route.pattern.test(href)) return typeof components?.[id] === "object" && components[id].component ? components[id].component : components[id];
181
- else {
181
+ for (const [id, route] of Object.entries(frames)) if (typeof route.pattern?.test === "function") {
182
+ if (route.pattern.test(href)) return typeof components?.[id] === "object" && components[id].component ? components[id].component : components[id];
183
+ } else {
182
184
  let matched = match(route, components?.[id], href);
183
185
  if (matched) return matched;
184
186
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/frames.tsx"],"sourcesContent":["import { cache } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport { getContext } from \"remix/async-context-middleware\";\nimport type { Middleware, RequestHandler, Router } from \"remix/fetch-router\";\nimport type { Route } from \"remix/fetch-router/routes\";\n\nimport { ClientFrame, FetchFrameProvider } from \"./frames.client.tsx\";\nimport type { Payload } from \"./generic-payload.ts\";\nimport { RoutePattern } from \"remix/route-pattern\";\n\nexport function mapFrames<Frames extends Routes>(\n router: Router<any>,\n frames: Frames,\n { components, middleware = [] }: { middleware?: Middleware[]; components: Components<Frames> },\n config: {\n createTemporaryReferenceSet: () => unknown;\n fetchFrame: (url: URL, signal: AbortSignal) => Promise<React.ReactNode>;\n prerender: (body: ReadableStream<Uint8Array>) => Promise<Response>;\n renderToReadableStream: (\n payload: any,\n options?: {\n temporaryReferences?: unknown;\n onError?: (error: unknown) => string | undefined;\n },\n ) => ReadableStream<Uint8Array>;\n },\n) {\n const { createTemporaryReferenceSet, fetchFrame, prerender, renderToReadableStream } = config;\n\n for (let [key, frame] of Object.entries(frames)) {\n if (typeof (frame as Route).pattern?.test === \"function\") {\n const handler: RequestHandler = ({ request }) => {\n return render({\n createTemporaryReferenceSet,\n prerender,\n renderToReadableStream,\n request,\n root: (\n <ProvideFrames fetchFrame={fetchFrame} frames={frames} components={components}>\n <Frame src={request.url} />\n </ProvideFrames>\n ),\n });\n };\n\n const localMiddleware =\n typeof components[key] === \"function\"\n ? []\n : ((components[key].middleware ?? []) as Middleware[]);\n\n const action = {\n action: handler,\n handler,\n middleware: [\n reactRedirectsMiddleware(renderToReadableStream),\n ...middleware,\n ...localMiddleware,\n ],\n };\n\n let route = frame.pattern as RoutePattern<string>;\n router.route(\"GET\", route.source, action);\n router.route(\"GET\", route.source + \".rsc\", action);\n router.route(\"POST\", route.source, action);\n router.route(\"POST\", route.source + \".rsc\", action);\n } else {\n mapFrames(\n router,\n frame as Routes,\n { components: components[key] as Components<Routes>, middleware },\n config,\n );\n }\n }\n}\n\nexport class UseServerState {\n formState?: ReactFormState;\n returnValue?: Promise<unknown>;\n temporaryReferences?: unknown;\n status?: number;\n\n constructor(\n formState: ReactFormState | undefined,\n returnValue: Promise<unknown> | undefined,\n temporaryReferences: unknown,\n status: number | undefined,\n ) {\n this.formState = formState;\n this.returnValue = returnValue;\n this.temporaryReferences = temporaryReferences;\n this.status = status;\n }\n}\n\nexport class RedirectState {\n location: string;\n constructor(location: string) {\n this.location = location;\n }\n}\n\nexport function reactRedirectsMiddleware(\n renderToReadableStream: (\n payload: any,\n options?: {\n temporaryReferences?: unknown;\n onError?: (error: unknown) => string | undefined;\n },\n ) => ReadableStream<Uint8Array>,\n): Middleware {\n return async ({ request }, next) => {\n const response = await next();\n const url = new URL(request.url);\n let redirect: string | null;\n if (isReactRequest(url) && (redirect = getRedirect(response))) {\n const payload: Payload = {\n type: \"redirect\",\n redirect,\n };\n return new Response(renderToReadableStream(payload), {\n headers: {\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n },\n });\n }\n };\n}\n\nexport function useServerMiddleware({\n createTemporaryReferenceSet,\n decodeAction,\n decodeFormState,\n decodeReply,\n loadServerAction,\n}: {\n createTemporaryReferenceSet: () => unknown;\n decodeAction: (formData: FormData) => Promise<() => Promise<void>>;\n decodeFormState: (actionResult: unknown, body: FormData) => Promise<ReactFormState | undefined>;\n decodeReply: (body: string | FormData, options?: object) => Promise<unknown[]>;\n loadServerAction: (id: string) => Promise<Function>;\n}): Middleware {\n return async ({ request, set }, next) => {\n let formState: ReactFormState | undefined;\n let returnValue: Promise<unknown> | undefined;\n let temporaryReferences: unknown;\n let actionStatus: number | undefined;\n\n if (request.method === \"POST\") {\n const actionId = request.headers.get(\"x-rsc-action\");\n\n if (actionId) {\n try {\n const contentType = request.headers.get(\"content-type\");\n const body = contentType?.startsWith(\"multipart/form-data\")\n ? await request.formData()\n : await request.text();\n temporaryReferences = createTemporaryReferenceSet();\n const args = await decodeReply(body, { temporaryReferences });\n const action = await loadServerAction(actionId);\n returnValue = action.apply(null, args);\n await returnValue;\n } catch (e) {\n actionStatus = 500;\n returnValue = Promise.reject(e);\n }\n } else {\n try {\n const formData = await request.formData();\n const decodedAction = await decodeAction(formData);\n const result = await decodedAction();\n formState = await decodeFormState(result, formData);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n set(\n UseServerState,\n new UseServerState(formState, returnValue, temporaryReferences, actionStatus),\n );\n return next();\n };\n}\n\nexport function redirect(locationOrRedirect: string | Response) {\n let location: string | null;\n if (typeof locationOrRedirect === \"string\") {\n location = locationOrRedirect;\n } else {\n location = getRedirect(locationOrRedirect);\n }\n\n if (!location) {\n throw new Error(\"No redirect location provided\");\n }\n\n const ctx = getContext();\n ctx.set(RedirectState, new RedirectState(location));\n}\n\nexport async function render({\n createTemporaryReferenceSet,\n prerender,\n renderToReadableStream,\n request,\n root,\n}: {\n createTemporaryReferenceSet: () => unknown;\n prerender: (body: ReadableStream<Uint8Array>) => Promise<Response>;\n renderToReadableStream: (\n payload: any,\n options?: {\n temporaryReferences: unknown;\n onError: (error: unknown) => string | undefined;\n },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n root: React.ReactNode;\n}) {\n const ctx = getContext();\n let redirect: RedirectState | undefined;\n try {\n redirect = ctx.get(RedirectState);\n } catch {}\n let state: UseServerState | undefined;\n try {\n state = ctx.get(UseServerState);\n } catch {}\n\n try {\n const payload: Payload = redirect\n ? {\n type: \"redirect\",\n redirect: redirect.location,\n returnValue: state?.returnValue,\n }\n : {\n type: \"render\",\n root,\n returnValue: state?.returnValue,\n formState: state?.formState,\n };\n\n const temporaryReferences = state?.temporaryReferences ?? createTemporaryReferenceSet();\n\n const body = renderToReadableStream(payload, {\n temporaryReferences,\n onError(error: unknown) {\n if (error instanceof NotFoundError) {\n return \"404\";\n }\n if (request.signal.aborted) {\n return;\n }\n console.error(error);\n },\n });\n\n const url = new URL(request.url);\n if (isReactRequest(url)) {\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n },\n });\n }\n\n return await prerender(body);\n } catch (reason) {\n if (reason instanceof Error && reason.name === \"NotFoundError\") {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n if (!request.signal.aborted) {\n console.error(reason);\n }\n\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n}\n\nconst frameCache = cache(\n (): {\n frames?: Record<string, Route>;\n components?: Record<string, React.ComponentType>;\n } => ({}),\n);\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n\ninterface Routes extends Record<string, Route | Routes> {}\n\ntype Components<R extends Routes> = {\n [K in keyof R]: R[K] extends Routes\n ? Components<R[K]>\n :\n | React.ComponentType\n | {\n middleware?: Middleware[];\n component: React.ComponentType;\n };\n};\n\nexport type ProvideFramesProps<Frames extends Routes> = {\n children?: React.ReactNode;\n components: Components<Frames>;\n fetchFrame: (url: URL, signal: AbortSignal) => Promise<React.ReactNode>;\n frames: Frames;\n};\n\nexport function ProvideFrames<Frames extends Routes>({\n children,\n components,\n fetchFrame,\n frames,\n}: ProvideFramesProps<Frames>) {\n const cache = frameCache();\n\n cache.components = { ...cache.components, ...components };\n cache.frames = { ...cache.frames, ...frames };\n\n return <FetchFrameProvider fetchFrame={fetchFrame}>{children}</FetchFrameProvider>;\n}\n\nexport function Frame({ src }: { src: string }) {\n const cache = frameCache();\n if (!cache.components || !cache.frames) throw new Error(\"No frames provided\");\n\n const url = new URL(src, \"http://react-server-frame/\");\n if (isReactRequest(url)) {\n url.pathname = url.pathname.slice(0, -4);\n }\n\n const Component = match(cache.frames, cache.components, url.href);\n if (!Component) throw new NotFoundError(\"No matching frame found\");\n\n return (\n <ClientFrame src={url.pathname + url.search}>\n <Component />\n </ClientFrame>\n );\n}\n\nfunction match(\n frames: Routes,\n components: Components<Routes>,\n href: string,\n): React.ComponentType | undefined {\n for (const [id, route] of Object.entries(frames)) {\n if (\n typeof (route as Route).pattern?.test === \"function\" &&\n (route as Route).pattern.test(href)\n ) {\n return typeof components?.[id] === \"object\" && components[id].component\n ? components[id].component\n : (components[id] as React.ComponentType);\n } else {\n let matched = match(route as Routes, components?.[id] as unknown as Components<Routes>, href);\n if (matched) return matched;\n }\n }\n}\n\nfunction isReactRequest(url: URL) {\n return url.pathname.endsWith(\".rsc\");\n}\n\nfunction getRedirect(response: Response) {\n if (response.status < 300 || response.status >= 400) return null;\n return response.headers.get(\"Location\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/frames.tsx"],"sourcesContent":["import { cache } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport { getContext } from \"remix/async-context-middleware\";\nimport type { Middleware, RequestContext, RequestHandler, Router } from \"remix/fetch-router\";\nimport type { Route } from \"remix/fetch-router/routes\";\n\nimport { ClientFrame, FetchFrameProvider } from \"./frames.client.tsx\";\nimport type { Payload } from \"./generic-payload.ts\";\nimport { RoutePattern } from \"remix/route-pattern\";\n\nexport function mapFrames<\n Context extends RequestContext<any, any> = RequestContext<{}, []>,\n Frames extends Routes = {},\n>(\n router: Router<Context>,\n frames: Frames,\n {\n components,\n middleware = [],\n }: { middleware?: Middleware<any, any, any>[]; components: Components<Frames> },\n config: {\n createTemporaryReferenceSet: () => unknown;\n fetchFrame: (url: URL, signal: AbortSignal) => Promise<React.ReactNode>;\n prerender: (body: ReadableStream<Uint8Array>) => Promise<Response>;\n renderToReadableStream: (\n payload: any,\n options?: {\n temporaryReferences?: unknown;\n onError?: (error: unknown) => string | undefined;\n },\n ) => ReadableStream<Uint8Array>;\n },\n) {\n const { createTemporaryReferenceSet, fetchFrame, prerender, renderToReadableStream } = config;\n\n for (let [key, frame] of Object.entries(frames)) {\n if (typeof (frame as Route).pattern?.test === \"function\") {\n const handler: RequestHandler = ({ request }) => {\n return render({\n createTemporaryReferenceSet,\n prerender,\n renderToReadableStream,\n request,\n root: (\n <ProvideFrames fetchFrame={fetchFrame} frames={frames} components={components}>\n <Frame src={request.url} />\n </ProvideFrames>\n ),\n });\n };\n\n const localMiddleware =\n typeof components[key] === \"function\"\n ? []\n : ((components[key].middleware ?? []) as Middleware[]);\n\n const action = {\n action: handler,\n handler,\n middleware: [\n reactRedirectsMiddleware(renderToReadableStream),\n ...middleware,\n ...localMiddleware,\n ],\n };\n\n let route = frame.pattern as RoutePattern<string>;\n router.route(\"GET\", route.source, action);\n router.route(\"GET\", route.source + \".rsc\", action);\n router.route(\"POST\", route.source, action);\n router.route(\"POST\", route.source + \".rsc\", action);\n } else {\n mapFrames(\n router,\n frame as Routes,\n { components: components[key] as Components<Routes>, middleware },\n config,\n );\n }\n }\n}\n\nexport class UseServerState {\n formState?: ReactFormState;\n returnValue?: Promise<unknown>;\n temporaryReferences?: unknown;\n status?: number;\n\n constructor(\n formState: ReactFormState | undefined,\n returnValue: Promise<unknown> | undefined,\n temporaryReferences: unknown,\n status: number | undefined,\n ) {\n this.formState = formState;\n this.returnValue = returnValue;\n this.temporaryReferences = temporaryReferences;\n this.status = status;\n }\n}\n\nexport class RedirectState {\n location: string;\n constructor(location: string) {\n this.location = location;\n }\n}\n\nexport function reactRedirectsMiddleware(\n renderToReadableStream: (\n payload: any,\n options?: {\n temporaryReferences?: unknown;\n onError?: (error: unknown) => string | undefined;\n },\n ) => ReadableStream<Uint8Array>,\n): Middleware {\n return async ({ request }, next) => {\n const response = await next();\n const url = new URL(request.url);\n let redirect: string | null;\n if (isReactRequest(url) && (redirect = getRedirect(response))) {\n const payload: Payload = {\n type: \"redirect\",\n redirect,\n };\n return new Response(renderToReadableStream(payload), {\n headers: {\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n },\n });\n }\n };\n}\n\nexport function useServerMiddleware({\n createTemporaryReferenceSet,\n decodeAction,\n decodeFormState,\n decodeReply,\n loadServerAction,\n}: {\n createTemporaryReferenceSet: () => unknown;\n decodeAction: (formData: FormData) => Promise<() => Promise<void>>;\n decodeFormState: (actionResult: unknown, body: FormData) => Promise<ReactFormState | undefined>;\n decodeReply: (body: string | FormData, options?: object) => Promise<unknown[]>;\n loadServerAction: (id: string) => Promise<Function>;\n}): Middleware {\n return async ({ request, set }, next) => {\n let formState: ReactFormState | undefined;\n let returnValue: Promise<unknown> | undefined;\n let temporaryReferences: unknown;\n let actionStatus: number | undefined;\n\n if (request.method === \"POST\") {\n const actionId = request.headers.get(\"x-rsc-action\");\n\n if (actionId) {\n try {\n const contentType = request.headers.get(\"content-type\");\n const body = contentType?.startsWith(\"multipart/form-data\")\n ? await request.formData()\n : await request.text();\n temporaryReferences = createTemporaryReferenceSet();\n const args = await decodeReply(body, { temporaryReferences });\n const action = await loadServerAction(actionId);\n returnValue = action.apply(null, args);\n await returnValue;\n } catch (e) {\n actionStatus = 500;\n returnValue = Promise.reject(e);\n }\n } else {\n try {\n const formData = await request.formData();\n const decodedAction = await decodeAction(formData);\n const result = await decodedAction();\n formState = await decodeFormState(result, formData);\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n set(\n UseServerState,\n new UseServerState(formState, returnValue, temporaryReferences, actionStatus),\n );\n return next();\n };\n}\n\nexport function redirect(locationOrRedirect: string | Response) {\n let location: string | null;\n if (typeof locationOrRedirect === \"string\") {\n location = locationOrRedirect;\n } else {\n location = getRedirect(locationOrRedirect);\n }\n\n if (!location) {\n throw new Error(\"No redirect location provided\");\n }\n\n const ctx = getContext();\n ctx.set(RedirectState, new RedirectState(location));\n}\n\nexport async function render({\n createTemporaryReferenceSet,\n prerender,\n renderToReadableStream,\n request,\n root,\n}: {\n createTemporaryReferenceSet: () => unknown;\n prerender: (body: ReadableStream<Uint8Array>) => Promise<Response>;\n renderToReadableStream: (\n payload: any,\n options?: {\n temporaryReferences: unknown;\n onError: (error: unknown) => string | undefined;\n },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n root: React.ReactNode;\n}) {\n const ctx = getContext();\n let redirect: RedirectState | undefined;\n try {\n redirect = ctx.get(RedirectState);\n } catch {}\n let state: UseServerState | undefined;\n try {\n state = ctx.get(UseServerState);\n } catch {}\n\n try {\n const payload: Payload = redirect\n ? {\n type: \"redirect\",\n redirect: redirect.location,\n returnValue: state?.returnValue,\n }\n : {\n type: \"render\",\n root,\n returnValue: state?.returnValue,\n formState: state?.formState,\n };\n\n const temporaryReferences = state?.temporaryReferences ?? createTemporaryReferenceSet();\n\n const body = renderToReadableStream(payload, {\n temporaryReferences,\n onError(error: unknown) {\n if (error instanceof NotFoundError) {\n return \"404\";\n }\n if (request.signal.aborted) {\n return;\n }\n console.error(error);\n },\n });\n\n const url = new URL(request.url);\n if (isReactRequest(url)) {\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n },\n });\n }\n\n return await prerender(body);\n } catch (reason) {\n if (reason instanceof Error && reason.name === \"NotFoundError\") {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n if (!request.signal.aborted) {\n console.error(reason);\n }\n\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n}\n\nconst frameCache = cache(\n (): {\n frames?: Record<string, Route>;\n components?: Record<string, React.ComponentType>;\n } => ({}),\n);\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n\ninterface Routes extends Record<string, Route | Routes> {}\n\ntype Components<R extends Routes> = {\n [K in keyof R]: R[K] extends Routes\n ? Components<R[K]>\n :\n | React.ComponentType\n | {\n middleware?: Middleware<any, any, any>[];\n component: React.ComponentType;\n };\n};\n\nexport type ProvideFramesProps<Frames extends Routes> = {\n children?: React.ReactNode;\n components: Components<Frames>;\n fetchFrame: (url: URL, signal: AbortSignal) => Promise<React.ReactNode>;\n frames: Frames;\n};\n\nexport function ProvideFrames<Frames extends Routes>({\n children,\n components,\n fetchFrame,\n frames,\n}: ProvideFramesProps<Frames>) {\n const cache = frameCache();\n\n cache.components = { ...cache.components, ...components };\n cache.frames = { ...cache.frames, ...frames };\n\n return <FetchFrameProvider fetchFrame={fetchFrame}>{children}</FetchFrameProvider>;\n}\n\nexport function Frame({ src }: { src: string }) {\n const cache = frameCache();\n if (!cache.components || !cache.frames) throw new Error(\"No frames provided\");\n\n const url = new URL(src, \"http://react-server-frame/\");\n if (isReactRequest(url)) {\n url.pathname = url.pathname.slice(0, -4);\n }\n\n const Component = match(cache.frames, cache.components, url.href);\n if (!Component) throw new NotFoundError(\"No matching frame found\");\n\n console.log(Component);\n return (\n <ClientFrame src={url.pathname + url.search}>\n <Component />\n </ClientFrame>\n );\n}\n\nfunction match(\n frames: Routes,\n components: Components<Routes>,\n href: string,\n): React.ComponentType | undefined {\n for (const [id, route] of Object.entries(frames)) {\n if (typeof (route as Route).pattern?.test === \"function\") {\n if ((route as Route).pattern.test(href)) {\n return typeof components?.[id] === \"object\" && components[id].component\n ? components[id].component\n : (components[id] as React.ComponentType);\n }\n } else {\n let matched = match(route as Routes, components?.[id] as unknown as Components<Routes>, href);\n if (matched) return matched;\n }\n }\n}\n\nfunction isReactRequest(url: URL) {\n return url.pathname.endsWith(\".rsc\");\n}\n\nfunction getRedirect(response: Response) {\n if (response.status < 300 || response.status >= 400) return null;\n return response.headers.get(\"Location\");\n}\n"],"mappings":";;;;;;AAUA,SAAgB,UAId,QACA,QACA,EACE,YACA,aAAa,EAAE,IAEjB,QAYA;CACA,MAAM,EAAE,6BAA6B,YAAY,WAAW,2BAA2B;AAEvF,MAAK,IAAI,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC7C,KAAI,OAAQ,MAAgB,SAAS,SAAS,YAAY;EACxD,MAAM,WAA2B,EAAE,cAAc;AAC/C,UAAO,OAAO;IACZ;IACA;IACA;IACA;IACA,MACE,oBAAC,eAAD;KAA2B;KAAoB;KAAoB;eACjE,oBAAC,OAAD,EAAO,KAAK,QAAQ,KAAO,CAAA;KACb,CAAA;IAEnB,CAAC;;EAGJ,MAAM,kBACJ,OAAO,WAAW,SAAS,aACvB,EAAE,GACA,WAAW,KAAK,cAAc,EAAE;EAExC,MAAM,SAAS;GACb,QAAQ;GACR;GACA,YAAY;IACV,yBAAyB,uBAAuB;IAChD,GAAG;IACH,GAAG;IACJ;GACF;EAED,IAAI,QAAQ,MAAM;AAClB,SAAO,MAAM,OAAO,MAAM,QAAQ,OAAO;AACzC,SAAO,MAAM,OAAO,MAAM,SAAS,QAAQ,OAAO;AAClD,SAAO,MAAM,QAAQ,MAAM,QAAQ,OAAO;AAC1C,SAAO,MAAM,QAAQ,MAAM,SAAS,QAAQ,OAAO;OAEnD,WACE,QACA,OACA;EAAE,YAAY,WAAW;EAA4B;EAAY,EACjE,OACD;;AAKP,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CACA;CAEA,YACE,WACA,aACA,qBACA,QACA;AACA,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,OAAK,sBAAsB;AAC3B,OAAK,SAAS;;;AAIlB,IAAa,gBAAb,MAA2B;CACzB;CACA,YAAY,UAAkB;AAC5B,OAAK,WAAW;;;AAIpB,SAAgB,yBACd,wBAOY;AACZ,QAAO,OAAO,EAAE,WAAW,SAAS;EAClC,MAAM,WAAW,MAAM,MAAM;EAC7B,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;EAChC,IAAI;AACJ,MAAI,eAAe,IAAI,KAAK,WAAW,YAAY,SAAS,EAK1D,QAAO,IAAI,SAAS,uBAJK;GACvB,MAAM;GACN;GACD,CACkD,EAAE,EACnD,SAAS,EACP,gBAAgB,mCACjB,EACF,CAAC;;;AAKR,SAAgB,oBAAoB,EAClC,6BACA,cACA,iBACA,aACA,oBAOa;AACb,QAAO,OAAO,EAAE,SAAS,OAAO,SAAS;EACvC,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,MAAI,QAAQ,WAAW,QAAQ;GAC7B,MAAM,WAAW,QAAQ,QAAQ,IAAI,eAAe;AAEpD,OAAI,SACF,KAAI;IAEF,MAAM,OADc,QAAQ,QAAQ,IAAI,eAAe,EAC7B,WAAW,sBAAsB,GACvD,MAAM,QAAQ,UAAU,GACxB,MAAM,QAAQ,MAAM;AACxB,0BAAsB,6BAA6B;IACnD,MAAM,OAAO,MAAM,YAAY,MAAM,EAAE,qBAAqB,CAAC;AAE7D,mBADe,MAAM,iBAAiB,SAAS,EAC1B,MAAM,MAAM,KAAK;AACtC,UAAM;YACC,GAAG;AACV,mBAAe;AACf,kBAAc,QAAQ,OAAO,EAAE;;OAGjC,KAAI;IACF,MAAM,WAAW,MAAM,QAAQ,UAAU;AAGzC,gBAAY,MAAM,gBADH,OADO,MAAM,aAAa,SAAS,GACd,EACM,SAAS;YAC5C,GAAG;AACV,YAAQ,MAAM,EAAE;;;AAKtB,MACE,gBACA,IAAI,eAAe,WAAW,aAAa,qBAAqB,aAAa,CAC9E;AACD,SAAO,MAAM;;;AAIjB,SAAgB,SAAS,oBAAuC;CAC9D,IAAI;AACJ,KAAI,OAAO,uBAAuB,SAChC,YAAW;KAEX,YAAW,YAAY,mBAAmB;AAG5C,KAAI,CAAC,SACH,OAAM,IAAI,MAAM,gCAAgC;AAGtC,aAAY,CACpB,IAAI,eAAe,IAAI,cAAc,SAAS,CAAC;;AAGrD,eAAsB,OAAO,EAC3B,6BACA,WACA,wBACA,SACA,QAaC;CACD,MAAM,MAAM,YAAY;CACxB,IAAI;AACJ,KAAI;AACF,aAAW,IAAI,IAAI,cAAc;SAC3B;CACR,IAAI;AACJ,KAAI;AACF,UAAQ,IAAI,IAAI,eAAe;SACzB;AAER,KAAI;EAgBF,MAAM,OAAO,uBAfY,WACrB;GACE,MAAM;GACN,UAAU,SAAS;GACnB,aAAa,OAAO;GACrB,GACD;GACE,MAAM;GACN;GACA,aAAa,OAAO;GACpB,WAAW,OAAO;GACnB,EAIwC;GAC3C,qBAH0B,OAAO,uBAAuB,6BAA6B;GAIrF,QAAQ,OAAgB;AACtB,QAAI,iBAAiB,cACnB,QAAO;AAET,QAAI,QAAQ,OAAO,QACjB;AAEF,YAAQ,MAAM,MAAM;;GAEvB,CAAC;AAGF,MAAI,eADQ,IAAI,IAAI,QAAQ,IAAI,CACT,CACrB,QAAO,IAAI,SAAS,MAAM,EACxB,SAAS,EACP,gBAAgB,mCACjB,EACF,CAAC;AAGJ,SAAO,MAAM,UAAU,KAAK;UACrB,QAAQ;AACf,MAAI,kBAAkB,SAAS,OAAO,SAAS,gBAC7C,QAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK,CAAC;AAGnD,MAAI,CAAC,QAAQ,OAAO,QAClB,SAAQ,MAAM,OAAO;AAGvB,SAAO,IAAI,SAAS,yBAAyB,EAAE,QAAQ,KAAK,CAAC;;;AAIjE,MAAM,aAAa,aAIX,EAAE,EACT;AAED,IAAa,gBAAb,cAAmC,MAAM;CACvC,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO;;;AAwBhB,SAAgB,cAAqC,EACnD,UACA,YACA,YACA,UAC6B;CAC7B,MAAM,QAAQ,YAAY;AAE1B,OAAM,aAAa;EAAE,GAAG,MAAM;EAAY,GAAG;EAAY;AACzD,OAAM,SAAS;EAAE,GAAG,MAAM;EAAQ,GAAG;EAAQ;AAE7C,QAAO,oBAAC,oBAAD;EAAgC;EAAa;EAA8B,CAAA;;AAGpF,SAAgB,MAAM,EAAE,OAAwB;CAC9C,MAAM,QAAQ,YAAY;AAC1B,KAAI,CAAC,MAAM,cAAc,CAAC,MAAM,OAAQ,OAAM,IAAI,MAAM,qBAAqB;CAE7E,MAAM,MAAM,IAAI,IAAI,KAAK,6BAA6B;AACtD,KAAI,eAAe,IAAI,CACrB,KAAI,WAAW,IAAI,SAAS,MAAM,GAAG,GAAG;CAG1C,MAAM,YAAY,MAAM,MAAM,QAAQ,MAAM,YAAY,IAAI,KAAK;AACjE,KAAI,CAAC,UAAW,OAAM,IAAI,cAAc,0BAA0B;AAElE,SAAQ,IAAI,UAAU;AACtB,QACE,oBAAC,aAAD;EAAa,KAAK,IAAI,WAAW,IAAI;YACnC,oBAAC,WAAD,EAAa,CAAA;EACD,CAAA;;AAIlB,SAAS,MACP,QACA,YACA,MACiC;AACjC,MAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,OAAO,CAC9C,KAAI,OAAQ,MAAgB,SAAS,SAAS;MACvC,MAAgB,QAAQ,KAAK,KAAK,CACrC,QAAO,OAAO,aAAa,QAAQ,YAAY,WAAW,IAAI,YAC1D,WAAW,IAAI,YACd,WAAW;QAEb;EACL,IAAI,UAAU,MAAM,OAAiB,aAAa,KAAsC,KAAK;AAC7F,MAAI,QAAS,QAAO;;;AAK1B,SAAS,eAAe,KAAU;AAChC,QAAO,IAAI,SAAS,SAAS,OAAO;;AAGtC,SAAS,YAAY,UAAoB;AACvC,KAAI,SAAS,SAAS,OAAO,SAAS,UAAU,IAAK,QAAO;AAC5D,QAAO,SAAS,QAAQ,IAAI,WAAW"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-server-frame",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "description": "A new type of RSC routing.",
5
5
  "homepage": "https://github.com/jacob-ebey/react-server-frame#readme",
6
6
  "bugs": {
@@ -43,7 +43,7 @@
43
43
  "react": "19.2.4",
44
44
  "react-dom": "19.2.4",
45
45
  "react-server-dom-webpack": "19.2.4",
46
- "remix": "remix-run/remix#preview/pr-11233&path:packages/remix",
46
+ "remix": "remix-run/remix?2#preview/pr-11233&path:packages/remix",
47
47
  "typescript": "^6.0.2",
48
48
  "vite": "npm:@voidzero-dev/vite-plus-core@latest",
49
49
  "vite-plus": "latest"