react-router
Advanced tools
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -25,3 +25,3 @@ * Copyright (c) Remix Software Inc. | ||
| try { | ||
| if (isBrowser) window.__reactRouterVersion = "8.1.0"; | ||
| if (isBrowser) window.__reactRouterVersion = "8.2.0"; | ||
| } catch (e) {} | ||
@@ -28,0 +28,0 @@ /** |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
@@ -146,8 +146,12 @@ | ||
| * ```tsx | ||
| * navigate({ | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * state: { some: "state" }, | ||
| * }); | ||
| * navigate( | ||
| * { | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * }, | ||
| * { | ||
| * state: { some: "state" }, | ||
| * }, | ||
| * ); | ||
| * ``` | ||
@@ -580,2 +584,25 @@ * | ||
| * | ||
| * Pairing the route `handle` with `useMatches` gets very powerful since you can put | ||
| * whatever you want on a route handle and have access to `useMatches` anywhere. | ||
| * Please see the [handle](../../how-to/using-handle) documentation for an example | ||
| * of breadcrumbs via `useMatches`/`handle`. | ||
| * | ||
| * ```tsx | ||
| * import { useMatches } from "react-router"; | ||
| * | ||
| * function SomeComponent() { | ||
| * const matches = useMatches(); | ||
| * // matches[i].id // route id | ||
| * // matches[i].pathname // the portion of the URL the route matched | ||
| * // matches[i].params // the parsed params from the URL | ||
| * // matches[i].loaderData // the data from the loader | ||
| * // matches[i].handle // the route handle with any app specific data | ||
| * } | ||
| * ``` | ||
| * | ||
| * <docs-info>useMatches only works with a data router like `createBrowserRouter`, | ||
| * since they know the full route tree up front and can provide all of the current | ||
| * matches. Additionally, `useMatches` will not match down into any descendant route | ||
| * trees since the router isn't aware of the descendant routes.</docs-info> | ||
| * | ||
| * @public | ||
@@ -582,0 +609,0 @@ * @category Hooks |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -165,8 +165,12 @@ * Copyright (c) Remix Software Inc. | ||
| * ```tsx | ||
| * navigate({ | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * state: { some: "state" }, | ||
| * }); | ||
| * navigate( | ||
| * { | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * }, | ||
| * { | ||
| * state: { some: "state" }, | ||
| * }, | ||
| * ); | ||
| * ``` | ||
@@ -923,2 +927,25 @@ * | ||
| * | ||
| * Pairing the route `handle` with `useMatches` gets very powerful since you can put | ||
| * whatever you want on a route handle and have access to `useMatches` anywhere. | ||
| * Please see the [handle](../../how-to/using-handle) documentation for an example | ||
| * of breadcrumbs via `useMatches`/`handle`. | ||
| * | ||
| * ```tsx | ||
| * import { useMatches } from "react-router"; | ||
| * | ||
| * function SomeComponent() { | ||
| * const matches = useMatches(); | ||
| * // matches[i].id // route id | ||
| * // matches[i].pathname // the portion of the URL the route matched | ||
| * // matches[i].params // the parsed params from the URL | ||
| * // matches[i].loaderData // the data from the loader | ||
| * // matches[i].handle // the route handle with any app specific data | ||
| * } | ||
| * ``` | ||
| * | ||
| * <docs-info>useMatches only works with a data router like `createBrowserRouter`, | ||
| * since they know the full route tree up front and can provide all of the current | ||
| * matches. Additionally, `useMatches` will not match down into any descendant route | ||
| * trees since the router isn't aware of the descendant routes.</docs-info> | ||
| * | ||
| * @public | ||
@@ -925,0 +952,0 @@ * @category Hooks |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -12,2 +12,5 @@ * Copyright (c) Remix Software Inc. | ||
| //#region lib/href.ts | ||
| function stringify(p) { | ||
| return p == null ? "" : typeof p === "string" ? p : String(p); | ||
| } | ||
| /** | ||
@@ -29,7 +32,7 @@ Returns a resolved URL path for the specified route. | ||
| if (isRequired && value === void 0) throw new Error(`Path '${path}' requires param '${param}' but it was not provided`); | ||
| return value === void 0 ? "" : "/" + value; | ||
| return value == null ? "" : "/" + encodeURIComponent(stringify(value)); | ||
| }); | ||
| if (path.endsWith("*")) { | ||
| const value = params?.["*"]; | ||
| if (value !== void 0) result += "/" + value; | ||
| if (value !== void 0) result += "/" + stringify(value).split("/").map(encodeURIComponent).join("/"); | ||
| } | ||
@@ -36,0 +39,0 @@ return result || "/"; |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -326,2 +326,4 @@ * Copyright (c) Remix Software Inc. | ||
| const paramRe = /^:[\w-]+$/; | ||
| const partialParamRe = /^:[\w-]+/; | ||
| const partialDynamicSegmentValue = 3.5; | ||
| const dynamicSegmentValue = 3; | ||
@@ -338,3 +340,3 @@ const indexRouteValue = 2; | ||
| if (index) initialScore += indexRouteValue; | ||
| return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), initialScore); | ||
| return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : partialParamRe.test(segment) ? partialDynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), initialScore); | ||
| } | ||
@@ -470,3 +472,3 @@ function compareIndexes(a, b) { | ||
| return "/([^\\/]+)"; | ||
| }).replace(/\/([\w-]+)\?(\/|$)/g, "(/$1)?$2"); | ||
| }).replace(/\/([\w-]+)\?(?=\/|$|\()/g, "(?:/$1)?"); | ||
| if (path.endsWith("*")) { | ||
@@ -473,0 +475,0 @@ params.push({ paramName: "*" }); |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
@@ -6,2 +6,3 @@ | ||
| import * as React$1 from "react"; | ||
| import { ReactFormState } from "react-dom/client"; | ||
@@ -75,3 +76,3 @@ //#region lib/rsc/server.rsc.d.ts | ||
| nonce?: string; | ||
| formState?: unknown; | ||
| formState?: ReactFormState; | ||
| }; | ||
@@ -102,3 +103,3 @@ type RSCManifestPayload = { | ||
| type DecodeActionFunction = (formData: FormData) => Promise<() => Promise<unknown>>; | ||
| type DecodeFormStateFunction = (result: unknown, formData: FormData) => unknown; | ||
| type DecodeFormStateFunction = (result: unknown, formData: FormData) => Promise<ReactFormState | undefined>; | ||
| type DecodeReplyFunction = (reply: FormData | string, options: { | ||
@@ -105,0 +106,0 @@ temporaryReferences: unknown; |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -25,3 +25,3 @@ * Copyright (c) Remix Software Inc. | ||
| try { | ||
| if (isBrowser) window.__reactRouterVersion = "8.1.0"; | ||
| if (isBrowser) window.__reactRouterVersion = "8.2.0"; | ||
| } catch (e) {} | ||
@@ -28,0 +28,0 @@ /** |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
@@ -146,8 +146,12 @@ | ||
| * ```tsx | ||
| * navigate({ | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * state: { some: "state" }, | ||
| * }); | ||
| * navigate( | ||
| * { | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * }, | ||
| * { | ||
| * state: { some: "state" }, | ||
| * }, | ||
| * ); | ||
| * ``` | ||
@@ -580,2 +584,25 @@ * | ||
| * | ||
| * Pairing the route `handle` with `useMatches` gets very powerful since you can put | ||
| * whatever you want on a route handle and have access to `useMatches` anywhere. | ||
| * Please see the [handle](../../how-to/using-handle) documentation for an example | ||
| * of breadcrumbs via `useMatches`/`handle`. | ||
| * | ||
| * ```tsx | ||
| * import { useMatches } from "react-router"; | ||
| * | ||
| * function SomeComponent() { | ||
| * const matches = useMatches(); | ||
| * // matches[i].id // route id | ||
| * // matches[i].pathname // the portion of the URL the route matched | ||
| * // matches[i].params // the parsed params from the URL | ||
| * // matches[i].loaderData // the data from the loader | ||
| * // matches[i].handle // the route handle with any app specific data | ||
| * } | ||
| * ``` | ||
| * | ||
| * <docs-info>useMatches only works with a data router like `createBrowserRouter`, | ||
| * since they know the full route tree up front and can provide all of the current | ||
| * matches. Additionally, `useMatches` will not match down into any descendant route | ||
| * trees since the router isn't aware of the descendant routes.</docs-info> | ||
| * | ||
| * @public | ||
@@ -582,0 +609,0 @@ * @category Hooks |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -165,8 +165,12 @@ * Copyright (c) Remix Software Inc. | ||
| * ```tsx | ||
| * navigate({ | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * state: { some: "state" }, | ||
| * }); | ||
| * navigate( | ||
| * { | ||
| * pathname: "/some/route", | ||
| * search: "?search=param", | ||
| * hash: "#hash", | ||
| * }, | ||
| * { | ||
| * state: { some: "state" }, | ||
| * }, | ||
| * ); | ||
| * ``` | ||
@@ -908,2 +912,25 @@ * | ||
| * | ||
| * Pairing the route `handle` with `useMatches` gets very powerful since you can put | ||
| * whatever you want on a route handle and have access to `useMatches` anywhere. | ||
| * Please see the [handle](../../how-to/using-handle) documentation for an example | ||
| * of breadcrumbs via `useMatches`/`handle`. | ||
| * | ||
| * ```tsx | ||
| * import { useMatches } from "react-router"; | ||
| * | ||
| * function SomeComponent() { | ||
| * const matches = useMatches(); | ||
| * // matches[i].id // route id | ||
| * // matches[i].pathname // the portion of the URL the route matched | ||
| * // matches[i].params // the parsed params from the URL | ||
| * // matches[i].loaderData // the data from the loader | ||
| * // matches[i].handle // the route handle with any app specific data | ||
| * } | ||
| * ``` | ||
| * | ||
| * <docs-info>useMatches only works with a data router like `createBrowserRouter`, | ||
| * since they know the full route tree up front and can provide all of the current | ||
| * matches. Additionally, `useMatches` will not match down into any descendant route | ||
| * trees since the router isn't aware of the descendant routes.</docs-info> | ||
| * | ||
| * @public | ||
@@ -910,0 +937,0 @@ * @category Hooks |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -12,2 +12,5 @@ * Copyright (c) Remix Software Inc. | ||
| //#region lib/href.ts | ||
| function stringify(p) { | ||
| return p == null ? "" : typeof p === "string" ? p : String(p); | ||
| } | ||
| /** | ||
@@ -29,7 +32,7 @@ Returns a resolved URL path for the specified route. | ||
| if (isRequired && value === void 0) throw new Error(`Path '${path}' requires param '${param}' but it was not provided`); | ||
| return value === void 0 ? "" : "/" + value; | ||
| return value == null ? "" : "/" + encodeURIComponent(stringify(value)); | ||
| }); | ||
| if (path.endsWith("*")) { | ||
| const value = params?.["*"]; | ||
| if (value !== void 0) result += "/" + value; | ||
| if (value !== void 0) result += "/" + stringify(value).split("/").map(encodeURIComponent).join("/"); | ||
| } | ||
@@ -36,0 +39,0 @@ return result || "/"; |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -317,2 +317,4 @@ * Copyright (c) Remix Software Inc. | ||
| const paramRe = /^:[\w-]+$/; | ||
| const partialParamRe = /^:[\w-]+/; | ||
| const partialDynamicSegmentValue = 3.5; | ||
| const dynamicSegmentValue = 3; | ||
@@ -329,3 +331,3 @@ const indexRouteValue = 2; | ||
| if (index) initialScore += indexRouteValue; | ||
| return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), initialScore); | ||
| return segments.filter((s) => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : partialParamRe.test(segment) ? partialDynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), initialScore); | ||
| } | ||
@@ -461,3 +463,3 @@ function compareIndexes(a, b) { | ||
| return "/([^\\/]+)"; | ||
| }).replace(/\/([\w-]+)\?(\/|$)/g, "(/$1)?$2"); | ||
| }).replace(/\/([\w-]+)\?(?=\/|$|\()/g, "(?:/$1)?"); | ||
| if (path.endsWith("*")) { | ||
@@ -464,0 +466,0 @@ params.push({ paramName: "*" }); |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
@@ -6,2 +6,3 @@ | ||
| import * as React$1 from "react"; | ||
| import { ReactFormState } from "react-dom/client"; | ||
@@ -75,3 +76,3 @@ //#region lib/rsc/server.rsc.d.ts | ||
| nonce?: string; | ||
| formState?: unknown; | ||
| formState?: ReactFormState; | ||
| }; | ||
@@ -102,3 +103,3 @@ type RSCManifestPayload = { | ||
| type DecodeActionFunction = (formData: FormData) => Promise<() => Promise<unknown>>; | ||
| type DecodeFormStateFunction = (result: unknown, formData: FormData) => unknown; | ||
| type DecodeFormStateFunction = (result: unknown, formData: FormData) => Promise<ReactFormState | undefined>; | ||
| type DecodeReplyFunction = (reply: FormData | string, options: { | ||
@@ -105,0 +106,0 @@ temporaryReferences: unknown; |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
| /** | ||
| * react-router v8.1.0 | ||
| * react-router v8.2.0 | ||
| * | ||
@@ -4,0 +4,0 @@ * Copyright (c) Remix Software Inc. |
@@ -114,3 +114,3 @@ --- | ||
| ```diff | ||
| ```tsx diff | ||
| export default function Component() { | ||
@@ -117,0 +117,0 @@ - const { pet } = useMyCustomHook(); |
@@ -169,3 +169,3 @@ --- | ||
| ```diff | ||
| ```tsx diff | ||
| let results = {}; | ||
@@ -172,0 +172,0 @@ +let matchesToLoad = matches.filter(m => m.shouldCallHandler()); |
@@ -101,1 +101,5 @@ --- | ||
| DeployHQ maintains their own guide for deploying React Router to your own server. Checkout the [DeployHQ Guide](https://www.deployhq.com/guides/deploy-react-router-from-github) for more information. | ||
| ### Hostinger | ||
| Hostinger supports deploying React Router applications with server rendering on its managed Node.js hosting, including automatic deployments from GitHub. Checkout the [Hostinger Guide](https://www.hostinger.com/web-apps-hosting/react-router-hosting) for more information. |
@@ -52,3 +52,3 @@ --- | ||
| ```diff filename=vite.config.ts | ||
| ```tsx diff filename=vite.config.ts | ||
| -import react from '@vitejs/plugin-react' | ||
@@ -55,0 +55,0 @@ +import { reactRouter } from "@react-router/dev/vite"; |
@@ -49,2 +49,35 @@ --- | ||
| ### `future.unstable_enableNodeReadableStream` | ||
| [MODES: framework] | ||
| <br/> | ||
| <br/> | ||
| **Background** | ||
| Now that the Web Streams API is [stable](https://nodejs.org/docs/latest-v22.x/api/webstreams.html) in Node 22+, it's viable for React Router to use React's [`renderToReadableStream`](https://react.dev/reference/react-dom/server/renderToReadableStream) in the server entry. | ||
| When no `entry.server.tsx` file is present, React Router defaults to [`renderToPipeableStream`](https://react.dev/reference/react-dom/server/renderToPipeableStream) when a Node runtime is detected, and `renderToReadableStream` otherwise. | ||
| With this flag enabled, React Router will default to `renderToReadableStream` on all runtimes, including Node. You can continue to use `renderToPipeableStream` via a custom `entry.server.tsx` file if needed. | ||
| <docs-info>Enabling this flag might even provide slight performance gains because we are already using Web Streams internally, so this flag removes some unnecessary transforms between Web and Node streams.</docs-info> | ||
| π **Enable the Flag** | ||
| ```ts filename=react-router.config.ts | ||
| import type { Config } from "@react-router/dev/config"; | ||
| export default { | ||
| future: { | ||
| unstable_enableNodeReadableStream: true, | ||
| }, | ||
| } satisfies Config; | ||
| ``` | ||
| **Update your Code** | ||
| No code changes are required. If your app has a custom `entry.server.tsx`, this flag will not change your runtime behavior. | ||
| ### `future.unstable_optimizeDeps` | ||
@@ -51,0 +84,0 @@ |
@@ -88,3 +88,3 @@ --- | ||
| ```diff filename=src/main.tsx | ||
| ```tsx diff filename=src/main.tsx | ||
| let router = createBrowserRouter([ | ||
@@ -124,3 +124,3 @@ // ... other routes | ||
| ```diff filename=vite.config.ts | ||
| ```tsx diff filename=vite.config.ts | ||
| -import react from '@vitejs/plugin-react' | ||
@@ -252,3 +252,3 @@ +import { reactRouter } from "@react-router/dev/vite"; | ||
| ```diff filename=src/root.tsx | ||
| ```tsx diff filename=src/root.tsx | ||
| +import "./index.css"; | ||
@@ -332,3 +332,3 @@ | ||
| ```diff filename=src/routes.ts | ||
| ```tsx diff filename=src/routes.ts | ||
| +import type { RouteConfig } from "@react-router/dev/routes"; | ||
@@ -369,3 +369,3 @@ | ||
| ```diff filename=src/routes.ts | ||
| ```tsx diff filename=src/routes.ts | ||
| export default [ | ||
@@ -372,0 +372,0 @@ { |
+39
-22
@@ -8,3 +8,3 @@ --- | ||
| We try our best to keep major version upgrades simple and boring through the use of opt-in APIs and [Future Flags][api-development-strategy]. Future flags are used to gate breaking changes that don't otherwise have a good call-site opt-in strategy. By adopting all opt-in APIs and future flags, you should be able to upgrade to the next major version of React Router with minimal changes. | ||
| We try our best to keep major version upgrades simple and boring through the use of opt-in APIs and [Future Flags][api-development-strategy]. Future flags are used to gate breaking changes that don't otherwise have a good call-site opt-in strategy. By adopting all opt-in APIs and future flags while still on v7, you should be able to update to React Router v8 with minimal changes. | ||
@@ -20,3 +20,3 @@ We highly recommend you make a commit after each step and ship it instead of doing everything all at once. Most flags can be adopted in any order, with exceptions noted below. | ||
| React Router v8 requires the following minimum versions. You can prepare for the upgrade by updating them while still on v7: | ||
| React Router v8 requires the following minimum versions. Update them before updating React Router to v8: | ||
@@ -26,3 +26,3 @@ - `node@22.22+` | ||
| Framework mode will also require: | ||
| Framework mode also requires: | ||
@@ -34,3 +34,3 @@ - `vite@7+` (requires `future.v8_viteEnvironmentApi`) | ||
| Before adopting any future flags or call-site opt-in changes, you should update to the latest minor version of v7.x to make sure you have access to the latest flags. You may see a number of deprecation warnings as you upgrade, which we'll cover below. | ||
| Before adopting any future flags or call-site opt-in changes, update to the latest minor version of v7.x to make sure you have access to the latest flags. You may see a number of deprecation warnings as you upgrade, which we'll cover below. | ||
@@ -147,3 +147,3 @@ π Update to latest v7 | ||
| ```diff filename=vite.config.ts | ||
| ```tsx diff filename=vite.config.ts | ||
| import { reactRouter } from "@react-router/dev/vite"; | ||
@@ -251,3 +251,3 @@ import { defineConfig } from "vite"; | ||
| Currently, your HTTP and `request` pathnames would be as follows for `/a/b/c` and `/a/b/c/` | ||
| In v7, your HTTP and `request` pathnames are as follows for `/a/b/c` and `/a/b/c/` | ||
@@ -264,3 +264,3 @@ | URL `/a/b/c` | **HTTP pathname** | **`request` pathname`** | | ||
| With this flag enabled, these pathnames will be made consistent though a new `_.data` format for client-side `.data` requests: | ||
| With this flag enabled, these pathnames are made consistent through a new `_.data` format for client-side `.data` requests: | ||
@@ -295,7 +295,7 @@ | URL `/a/b/c` | **HTTP pathname** | **`request` pathname`** | | ||
| ## Other Planned Breaking Changes | ||
| ## Other Breaking Changes | ||
| The changes in this section are not controlled by future flags, but you can update your code in v7 to be ready for v8. | ||
| The changes in this section are not controlled by future flags, but you can update your code while still on v7 before moving to v8. | ||
| ### `meta` `data` Argument | ||
| ### `meta`/`matches` `data` Values | ||
@@ -309,4 +309,10 @@ [MODES: framework] | ||
| The `data` fields passed to route module `meta` functions are deprecated and will be removed in React Router v8. Use `loaderData` instead on `MetaArgs` and each item in `MetaArgs.matches`. | ||
| React Router v8 removed deprecated `data` fields in favor of `loaderData` in a few places: | ||
| - `meta` function `data` argument | ||
| - `meta` function `matches` argument (`matches[i].data`) | ||
| - `useMatches()` (`matches[i].data`) | ||
| Use `loaderData` instead on `MetaArgs`, each item in `MetaArgs.matches`, and each match returned from `useMatches()` | ||
| π **Update your Code** | ||
@@ -316,3 +322,3 @@ | ||
| ```diff | ||
| ```tsx diff | ||
| export function meta({ | ||
@@ -334,3 +340,3 @@ - data, | ||
| ```diff | ||
| ```tsx diff | ||
| export function meta({ matches }: Route.MetaArgs) { | ||
@@ -345,2 +351,13 @@ let rootMatch = matches.find((match) => match.id === "root"); | ||
| Replace `data` with `loaderData` on `useMatches()` calls: | ||
| ```tsx diff | ||
| export default function Component({ matches, loaderData }: ComponentProps) { | ||
| let matches = useMatches(); | ||
| - const rootLoaderData = matches[0].data; | ||
| + const rootLoaderData = matches[0].loaderData; | ||
| // ... | ||
| } | ||
| ``` | ||
| ### `react-router-dom` | ||
@@ -355,3 +372,3 @@ | ||
| React Router v8 will remove the `react-router-dom` re-export package. In v8, you should import DOM-specific APIs from `react-router/dom` and everything else from `react-router`. | ||
| React Router v8 removes the `react-router-dom` re-export package. In v8, you should import DOM-specific APIs from `react-router/dom` and everything else from `react-router`. | ||
@@ -368,3 +385,3 @@ π **Update your Code** | ||
| ```diff | ||
| ```tsx diff | ||
| -import { Link, useLocation } from "react-router-dom"; | ||
@@ -376,3 +393,3 @@ +import { Link, useLocation } from "react-router"; | ||
| ```diff | ||
| ```tsx diff | ||
| -import { RouterProvider } from "react-router-dom"; | ||
@@ -391,3 +408,3 @@ +import { RouterProvider } from "react-router/dom"; | ||
| React Router v8 will remove the React Router Cloudflare dev proxy. Cloudflare projects should use [`@cloudflare/vite-plugin`][cloudflare-vite-plugin] instead. | ||
| React Router v8 removes the React Router Cloudflare dev proxy. Cloudflare projects should use [`@cloudflare/vite-plugin`][cloudflare-vite-plugin] instead. | ||
@@ -398,3 +415,3 @@ π **Update your Code** | ||
| ```diff filename=vite.config.ts | ||
| ```tsx diff filename=vite.config.ts | ||
| import { reactRouter } from "@react-router/dev/vite"; | ||
@@ -423,7 +440,7 @@ -import { cloudflareDevProxy } from "@react-router/dev/vite/cloudflare"; | ||
| The `@react-router/architect` adapter currently uses `X-Forwarded-Host` when creating the `request`, falling back to the `Host` header. In React Router v8, the adapter will use `event.requestContext.domainName` by default, falling back to the `Host` header. | ||
| In v7, the `@react-router/architect` adapter uses `X-Forwarded-Host` when creating the `request`, falling back to the `Host` header. In React Router v8, the adapter uses `event.requestContext.domainName` by default, falling back to the `Host` header. | ||
| π **Update your Code** | ||
| Opt in to the v8 behavior now by passing `useRequestContextDomainName: true`: | ||
| Opt in to the v8 behavior while still on v7 by passing `useRequestContextDomainName: true`: | ||
@@ -440,7 +457,7 @@ ```ts | ||
| This option will be removed in v8 once the `event.requestContext.domainName` behavior is the default. | ||
| This option is removed in v8 because the `event.requestContext.domainName` behavior is the default. | ||
| ## Upgrade to v8 | ||
| Now that your app is caught up, you can simply update to v8 (theoretically!) without issue. | ||
| Now that your app is caught up, update to v8: | ||
@@ -447,0 +464,0 @@ ```shellscript nonumber |
+1
-1
| { | ||
| "name": "react-router", | ||
| "type": "module", | ||
| "version": "8.1.0", | ||
| "version": "8.2.0", | ||
| "description": "Declarative routing for React", | ||
@@ -6,0 +6,0 @@ "keywords": [ |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
2738377
0.35%57272
0.23%13
-13.33%