@rebask/core 0.1.2 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAsBzE,MAAM,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACrE;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,gEAAgE;IAChE,QAAQ,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,WAAW,sBAAsB;IACtC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACzD,wFAAwF;IACxF,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACpC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,QAAQ,CAAC,CAoLnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAsBzE,MAAM,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IACrE;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,gEAAgE;IAChE,QAAQ,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,WAAW,sBAAsB;IACtC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACzD,wFAAwF;IACxF,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACpC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,WAAW,EACnB,aAAa,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,QAAQ,CAAC,CAqLnB"}
@@ -3,7 +3,7 @@ import { STATIC } from "../../lib/cache-storage.js";
3
3
  import { getDeploymentIdHeader } from "../../lib/deployment-id.js";
4
4
  import { resetDevOverlayReady } from "../../lib/dev-server.js";
5
5
  import { pageChannel } from "../../lib/devtools-channels.js";
6
- import { getCacheControlHeader, REBASK_HTML_VARY_HEADER, REBASK_SHELL_HEADER, REBASK_TAIL_HEADER, } from "../../lib/ppr/headers.js";
6
+ import { getCacheControlHeader, REBASK_HTML_VARY_HEADER, REBASK_SHELL_HEADER, REBASK_TAIL_HEADER, REBASK_TREE_HEADER, } from "../../lib/ppr/headers.js";
7
7
  import { parseResumeState } from "../../lib/ppr/postponed-state.js";
8
8
  import { prerenderPaths } from "../../lib/prerender-paths.js";
9
9
  import {} from "../../lib/route-matcher.js";
@@ -62,6 +62,7 @@ export async function handlePageRoute(request, route, params, handleOptions) {
62
62
  return respond(new Response(JSON.stringify(payload), {
63
63
  headers: {
64
64
  "content-type": "application/json",
65
+ [REBASK_TREE_HEADER]: "1",
65
66
  "cache-control": getCacheControlHeader({ revalidate: STATIC }),
66
67
  vary: REBASK_HTML_VARY_HEADER,
67
68
  ...getDeploymentIdHeader(),
@@ -25,6 +25,9 @@ export declare class DeploymentMismatchError extends Error {
25
25
  readonly event: DeploymentMismatchEvent;
26
26
  constructor(event: DeploymentMismatchEvent);
27
27
  }
28
+ export declare class DocumentNavigation extends Error {
29
+ constructor();
30
+ }
28
31
  export declare class ServerFunctionError extends Error {
29
32
  readonly status: number;
30
33
  constructor(message: string, status: number);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAM/D,eAAO,MAAM,0BAA0B,+BAA+B,CAAA;AActE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,4BAAyB;IAExC,YAAY,UAAU,EAAE,MAAM,EAE7B;CACD;AAED,yFAAyF;AACzF,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,4BAAyB;IAExC,cAGC;CACD;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,kCAAyB;IAExC,YAAY,OAAO,EAAE,MAAM,EAK1B;CACD;AAED,8EAA8E;AAC9E,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,kCAAyB;IAExC,YAAY,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAExC;CACD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACrC,QAAQ,CAAC,KAAK,EAAE,uBAAuB;IAAnD,YAAqB,KAAK,EAAE,uBAAuB,EAElD;CACD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,MAAM,EAAE,MAAM;IAFxB,YACC,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EAIvB;CACD;AAED,sEAAsE;AACtE,qBAAa,yBAA0B,SAAQ,KAAK;IACvC,QAAQ,CAAC,KAAK,EAAE,uBAAuB;IAAnD,YAAqB,KAAK,EAAE,uBAAuB,EAElD;CACD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG3D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAM/D,eAAO,MAAM,0BAA0B,+BAA+B,CAAA;AActE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,4BAAyB;IAExC,YAAY,UAAU,EAAE,MAAM,EAE7B;CACD;AAED,yFAAyF;AACzF,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,4BAAyB;IAExC,cAGC;CACD;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,kCAAyB;IAExC,YAAY,OAAO,EAAE,MAAM,EAK1B;CACD;AAED,8EAA8E;AAC9E,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,kCAAyB;IAExC,YAAY,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAExC;CACD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACrC,QAAQ,CAAC,KAAK,EAAE,uBAAuB;IAAnD,YAAqB,KAAK,EAAE,uBAAuB,EAElD;CACD;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,cAEC;CACD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,MAAM,EAAE,MAAM;IAFxB,YACC,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EAIvB;CACD;AAED,sEAAsE;AACtE,qBAAa,yBAA0B,SAAQ,KAAK;IACvC,QAAQ,CAAC,KAAK,EAAE,uBAAuB;IAAnD,YAAqB,KAAK,EAAE,uBAAuB,EAElD;CACD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG3D"}
@@ -52,6 +52,11 @@ export class DeploymentMismatchError extends Error {
52
52
  this.event = event;
53
53
  }
54
54
  }
55
+ export class DocumentNavigation extends Error {
56
+ constructor() {
57
+ super("document navigation required");
58
+ }
59
+ }
55
60
  export class ServerFunctionError extends Error {
56
61
  status;
57
62
  constructor(message, status) {
@@ -1,7 +1,7 @@
1
1
  import type { CacheControl } from "./types.js";
2
2
  /** Header used for RSC server functions. */
3
3
  export declare const REBASK_ACTION_HEADER = "x-rsc-action";
4
- /** Header used to request the route tree JSON. */
4
+ /** Requests the route tree. Page routes echo it to identify the response as a route tree. */
5
5
  export declare const REBASK_TREE_HEADER = "x-rebask-tree";
6
6
  /** Header set to "1" when requesting a page segment's Flight shell. */
7
7
  export declare const REBASK_SHELL_HEADER = "x-rebask-shell";
@@ -1 +1 @@
1
- {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/lib/ppr/headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB,iBAAiB,CAAA;AAElD,kDAAkD;AAClD,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAEjD,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAA;AAE3D,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAA;AAEvD,eAAO,MAAM,uBAAuB,0BAAkC,CAAA;AAEtE,eAAO,MAAM,sBAAsB,yDAAiF,CAAA;AAEpH,oBAAY,iBAAiB;IAC5B,mCAAmC;IACnC,GAAG,QAAQ;IACX,wEAAwE;IACxE,KAAK,UAAU;IACf,8BAA8B;IAC9B,IAAI,SAAS;CACb;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,UAAQ,GAAG,MAAM,CAoBtF;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/E"}
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/lib/ppr/headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB,iBAAiB,CAAA;AAElD,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAEjD,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAA;AAE3D,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAA;AAEvD,eAAO,MAAM,uBAAuB,0BAAkC,CAAA;AAEtE,eAAO,MAAM,sBAAsB,yDAAiF,CAAA;AAEpH,oBAAY,iBAAiB;IAC5B,mCAAmC;IACnC,GAAG,QAAQ;IACX,wEAAwE;IACxE,KAAK,UAAU;IACf,8BAA8B;IAC9B,IAAI,SAAS;CACb;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,UAAQ,GAAG,MAAM,CAoBtF;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO/E"}
@@ -1,6 +1,6 @@
1
1
  /** Header used for RSC server functions. */
2
2
  export const REBASK_ACTION_HEADER = "x-rsc-action";
3
- /** Header used to request the route tree JSON. */
3
+ /** Requests the route tree. Page routes echo it to identify the response as a route tree. */
4
4
  export const REBASK_TREE_HEADER = "x-rebask-tree";
5
5
  /** Header set to "1" when requesting a page segment's Flight shell. */
6
6
  export const REBASK_SHELL_HEADER = "x-rebask-shell";
@@ -3,6 +3,9 @@ type PrefetchStrategy = PrefetchToken | {
3
3
  desktop?: PrefetchToken;
4
4
  mobile?: PrefetchToken;
5
5
  };
6
+ /** Remember a URL whose route tree request returned something other than a page. */
7
+ export declare function markDocumentUrl(url: string): void;
8
+ export declare function isDocumentUrl(url: string): boolean;
6
9
  export interface PrefetchProps {
7
10
  /**
8
11
  * Controls how early the full segment is prefetched.
@@ -1 +1 @@
1
- {"version":3,"file":"prefetch-utils.d.ts","sourceRoot":"","sources":["../../src/lib/prefetch-utils.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEnD,KAAK,gBAAgB,GAAG,aAAa,GAAG;IAAE,OAAO,CAAC,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,CAAA;AAe3F,MAAM,WAAW,aAAa;IAC7B;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAc9E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,WAUrD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,WAGpD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,UAAU,iCAsBjE"}
1
+ {"version":3,"file":"prefetch-utils.d.ts","sourceRoot":"","sources":["../../src/lib/prefetch-utils.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAA;AAEnD,KAAK,gBAAgB,GAAG,aAAa,GAAG;IAAE,OAAO,CAAC,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,CAAA;AAS3F,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,QAE1C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,WAExC;AAgBD,MAAM,WAAW,aAAa;IAC7B;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CAC3B;AAMD,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAc9E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,WAUrD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,WAGpD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,UAAU,iCAsBjE"}
@@ -1,8 +1,21 @@
1
+ const documentUrls = new Set();
2
+ function documentKey(url) {
3
+ const target = new URL(url, location.href);
4
+ return target.origin + target.pathname + target.search;
5
+ }
6
+ /** Remember a URL whose route tree request returned something other than a page. */
7
+ export function markDocumentUrl(url) {
8
+ documentUrls.add(documentKey(url));
9
+ }
10
+ export function isDocumentUrl(url) {
11
+ return documentUrls.has(documentKey(url));
12
+ }
1
13
  function isClientNavigable(link) {
2
14
  if (!link.href ||
3
15
  (link.target && link.target !== "_self") ||
4
16
  link.origin !== location.origin ||
5
- link.hasAttribute("download")) {
17
+ link.hasAttribute("download") ||
18
+ isDocumentUrl(link.href)) {
6
19
  return false;
7
20
  }
8
21
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"observe-navigations.d.ts","sourceRoot":"","sources":["../src/observe-navigations.tsx"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wBAAgB,kBAAkB,SAsEjC"}
1
+ {"version":3,"file":"observe-navigations.d.ts","sourceRoot":"","sources":["../src/observe-navigations.tsx"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wBAAgB,kBAAkB,SAqGjC"}
@@ -1,7 +1,7 @@
1
1
  import { useEffect } from "react";
2
2
  import { useRouterCache } from "./components/cache-slot.js";
3
3
  import { reloadForDeploymentMismatch } from "./lib/deployment-reload.js";
4
- import { HandledDeploymentMismatch } from "./lib/errors.js";
4
+ import { DocumentNavigation, HandledDeploymentMismatch } from "./lib/errors.js";
5
5
  import { beginNavigation, createNavigationIntent, isCurrentNavigation, pendingScrollAtom, } from "./lib/scroll.js";
6
6
  import { useRouter } from "./router.js";
7
7
  /**
@@ -18,43 +18,59 @@ export function ObserveNavigations() {
18
18
  cache.shellError = false;
19
19
  router.refresh(window.location.href).catch(() => { });
20
20
  }
21
- function onNavigation(intent, scrollIntent) {
22
- cache.pathnameAtom.set(window.location.pathname);
21
+ function onNavigation(intent, scrollIntent, url, commitHistory, onDocument) {
23
22
  const isCurrent = cache.captureRouteTransaction();
23
+ let committed = false;
24
+ const commit = () => {
25
+ if (committed)
26
+ return;
27
+ committed = true;
28
+ // A same-document entry followed by a document reload breaks back/forward for non-page responses.
29
+ commitHistory?.();
30
+ cache.pathnameAtom.set(window.location.pathname);
31
+ };
24
32
  const activate = (routeTreeResponse, complete = false) => {
25
33
  if (!isCurrentNavigation(intent) || !isCurrent())
26
34
  return;
35
+ commit();
27
36
  router.activate(routeTreeResponse);
28
37
  if (scrollIntent && (complete || scrollIntent.type !== "hash")) {
29
38
  pendingScrollAtom.set(scrollIntent);
30
39
  }
31
40
  };
32
41
  router
33
- .prefetch(window.location.href, { onRouteTree: activate })
42
+ .prefetch(url, { onRouteTree: activate })
34
43
  .then((response) => activate(response, true))
35
44
  // React receives rendering failures separately. This catch prevents a duplicate unhandled rejection.
36
45
  .catch((error) => {
46
+ if (error instanceof DocumentNavigation) {
47
+ if (!isCurrentNavigation(intent) || !isCurrent())
48
+ return;
49
+ onDocument?.();
50
+ }
37
51
  if (error instanceof HandledDeploymentMismatch) {
52
+ if (!isCurrentNavigation(intent) || !isCurrent())
53
+ return;
54
+ commit();
38
55
  reloadForDeploymentMismatch(error.event);
39
56
  }
40
57
  });
41
58
  }
42
59
  function onPopstate() {
43
- onNavigation(beginNavigation(), null);
60
+ const url = window.location.href;
61
+ onNavigation(beginNavigation(), null, url, undefined, () => window.location.replace(url));
44
62
  }
45
63
  const { pushState, replaceState } = window.history;
46
64
  window.addEventListener("popstate", onPopstate);
47
65
  window.history.pushState = function (...args) {
48
- const res = pushState.apply(this, args);
49
- const intent = createNavigationIntent(window.location.href);
50
- onNavigation(intent, intent);
51
- return res;
66
+ const url = new URL(args[2] || window.location.href, window.location.href).href;
67
+ const intent = createNavigationIntent(url);
68
+ onNavigation(intent, intent, url, () => pushState.apply(this, args), () => window.location.assign(url));
52
69
  };
53
70
  window.history.replaceState = function (...args) {
54
- const res = replaceState.apply(this, args);
55
- const intent = createNavigationIntent(window.location.href);
56
- onNavigation(intent, intent);
57
- return res;
71
+ const url = new URL(args[2] || window.location.href, window.location.href).href;
72
+ const intent = createNavigationIntent(url);
73
+ onNavigation(intent, intent, url, () => replaceState.apply(this, args), () => window.location.replace(url));
58
74
  };
59
75
  return () => {
60
76
  window.removeEventListener("popstate", onPopstate);
package/dist/router.d.ts CHANGED
@@ -28,16 +28,12 @@ type CacheInvalidation = {
28
28
  tags: string[];
29
29
  paths: string[];
30
30
  };
31
- /**
32
- * Router class for programmatic navigation and RSC data management.
33
- */
31
+ /** Router class for programmatic navigation and RSC data management. */
34
32
  declare class Router {
35
33
  private cache;
36
34
  private segment;
37
35
  constructor(cache: RouterCache, segment?: Segment | null);
38
- /**
39
- * Navigate to a URL using pushState.
40
- */
36
+ /** Navigate to a URL using pushState. */
41
37
  push: (url: string | URL, options?: NavigateOptions) => void;
42
38
  /**
43
39
  * Set client-side cache hints for the segment provided by the nearest
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.tsx"],"names":[],"mappings":"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"}
package/dist/router.js CHANGED
@@ -9,9 +9,10 @@ import { denyRoutePrediction, getRoutePathInfo, learnedPredictions, learnRoutePr
9
9
  import { captureClientTraceData, getClientTraceHeaders } from "./lib/client-trace.js";
10
10
  import { getDeploymentIdHeader } from "./lib/deployment-id.js";
11
11
  import { reloadForDeploymentMismatch } from "./lib/deployment-reload.js";
12
- import { HandledDeploymentMismatch, DeploymentMismatchError } from "./lib/errors.js";
12
+ import { DocumentNavigation, HandledDeploymentMismatch, DeploymentMismatchError, } from "./lib/errors.js";
13
13
  import { extractSegmentHints } from "./lib/extract-segment-hints.js";
14
14
  import { REBASK_SHELL_HEADER, REBASK_TAIL_HEADER, REBASK_TRAILER_HEADER, REBASK_TREE_HEADER, } from "./lib/ppr/headers.js";
15
+ import { isDocumentUrl, markDocumentUrl } from "./lib/prefetch-utils.js";
15
16
  import { getRouteTreeUrl, } from "./lib/route-prediction.js";
16
17
  import { segmentEntryKey } from "./lib/router-cache.js";
17
18
  import { captureNavigationIntent, isCurrentNavigation, setNextNavigationScroll, } from "./lib/scroll.js";
@@ -179,9 +180,7 @@ function splitUsedSearch(response) {
179
180
  used: promise,
180
181
  };
181
182
  }
182
- /**
183
- * Router class for programmatic navigation and RSC data management.
184
- */
183
+ /** Router class for programmatic navigation and RSC data management. */
185
184
  class Router {
186
185
  cache;
187
186
  segment;
@@ -189,12 +188,15 @@ class Router {
189
188
  this.cache = cache;
190
189
  this.segment = segment;
191
190
  }
192
- /**
193
- * Navigate to a URL using pushState.
194
- */
191
+ /** Navigate to a URL using pushState. */
195
192
  push = (url, options) => {
193
+ const target = getUrl(url);
194
+ if (isDocumentUrl(target.href)) {
195
+ window.location.assign(target.href);
196
+ return;
197
+ }
196
198
  setNextNavigationScroll(options?.scroll !== false);
197
- window.history.pushState({}, "", getUrl(url).href);
199
+ window.history.pushState({}, "", target.href);
198
200
  };
199
201
  /**
200
202
  * Set client-side cache hints for the segment provided by the nearest
@@ -217,8 +219,13 @@ class Router {
217
219
  * Navigate to a URL using replaceState.
218
220
  */
219
221
  replace = (url, options) => {
222
+ const target = getUrl(url);
223
+ if (isDocumentUrl(target.href)) {
224
+ window.location.replace(target.href);
225
+ return;
226
+ }
220
227
  setNextNavigationScroll(options?.scroll !== false);
221
- window.history.replaceState({}, "", getUrl(url).href);
228
+ window.history.replaceState({}, "", target.href);
222
229
  };
223
230
  /**
224
231
  * Fetch the route tree for a URL.
@@ -243,6 +250,12 @@ class Router {
243
250
  })
244
251
  .then(async (response) => {
245
252
  captureClientTraceData(response);
253
+ if (response.headers.get(REBASK_TREE_HEADER) !== "1") {
254
+ if (response.body)
255
+ await response.body.cancel();
256
+ markDocumentUrl(url);
257
+ throw new DocumentNavigation();
258
+ }
246
259
  this.cache.handleDeploymentMismatch(response, url, "tree");
247
260
  const [tree, routePrediction] = (await response.json());
248
261
  return { tree, routePrediction, url: getUrl(url).href };
@@ -574,10 +587,10 @@ class Router {
574
587
  this.cache.registerRouteTree(predicted);
575
588
  return predicted;
576
589
  }
577
- if (inflightSiblingTree) {
590
+ if (inflightSiblingTree && isCurrentNavigation(inflightSiblingTree.navigation)) {
578
591
  // An in-flight fetch under the same parent teaches this route's prediction, so the
579
592
  // retry can avoid a second tree request.
580
- await inflightSiblingTree.catch(() => { });
593
+ await inflightSiblingTree.response.catch(() => { });
581
594
  return isCurrent()
582
595
  ? this.prefetchRouteTree(url, cache, dedupe)
583
596
  : this.fetchRouteTree(url, dedupe);
@@ -591,11 +604,12 @@ class Router {
591
604
  return routeTreeResponse;
592
605
  });
593
606
  if (cache) {
594
- inflightRouteTreeByParent.set(parentPathname, routeTreeRequest);
607
+ const inflight = { response: routeTreeRequest, navigation: captureNavigationIntent() };
608
+ inflightRouteTreeByParent.set(parentPathname, inflight);
595
609
  routeTreeRequest
596
610
  .catch(() => { })
597
611
  .finally(() => {
598
- if (inflightRouteTreeByParent.get(parentPathname) === routeTreeRequest) {
612
+ if (inflightRouteTreeByParent.get(parentPathname) === inflight) {
599
613
  inflightRouteTreeByParent.delete(parentPathname);
600
614
  }
601
615
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rebask/core",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Vite plugin and runtime for React Server Components",
5
5
  "homepage": "https://github.com/lfades/vext#readme",
6
6
  "license": "MIT",