next-intl
Advanced tools
@@ -19,3 +19,3 @@ import { useRouter, usePathname } from 'next/navigation.js'; | ||
function usePathname$1() { | ||
const pathname = useBasePathname(config.localePrefix); | ||
const pathname = useBasePathname(config); | ||
const locale = useLocale(); | ||
@@ -22,0 +22,0 @@ |
import { usePathname } from 'next/navigation.js'; | ||
import { useMemo } from 'react'; | ||
import { useLocale } from 'use-intl'; | ||
import { hasPathnamePrefixed, unprefixPathname, getLocalePrefix } from '../../shared/utils.js'; | ||
import { hasPathnamePrefixed, unprefixPathname, getLocalePrefix, getLocaleAsPrefix } from '../../shared/utils.js'; | ||
function useBasePathname(localePrefix) { | ||
function useBasePathname(config) { | ||
// The types aren't entirely correct here. Outside of Next.js | ||
@@ -20,9 +20,18 @@ // `useParams` can be called, but the return type is `null`. | ||
if (!pathname) return pathname; | ||
const prefix = getLocalePrefix(locale, localePrefix); | ||
let unlocalizedPathname = pathname; | ||
const prefix = getLocalePrefix(locale, config.localePrefix); | ||
const isPathnamePrefixed = hasPathnamePrefixed(prefix, pathname); | ||
const unlocalizedPathname = isPathnamePrefixed ? unprefixPathname(pathname, prefix) : pathname; | ||
if (isPathnamePrefixed) { | ||
unlocalizedPathname = unprefixPathname(pathname, prefix); | ||
} else if (config.localePrefix.mode === 'as-needed' && config.localePrefix.prefixes) { | ||
// Workaround for https://github.com/vercel/next.js/issues/73085 | ||
const localeAsPrefix = getLocaleAsPrefix(locale); | ||
if (hasPathnamePrefixed(localeAsPrefix, pathname)) { | ||
unlocalizedPathname = unprefixPathname(pathname, localeAsPrefix); | ||
} | ||
} | ||
return unlocalizedPathname; | ||
}, [locale, localePrefix, pathname]); | ||
}, [config.localePrefix, locale, pathname]); | ||
} | ||
export { useBasePathname as default }; |
@@ -64,4 +64,7 @@ function isRelativeHref(href) { | ||
// to decide to use it or not. | ||
'/' + locale; | ||
getLocaleAsPrefix(locale); | ||
} | ||
function getLocaleAsPrefix(locale) { | ||
return '/' + locale; | ||
} | ||
function templateToRegex(template) { | ||
@@ -124,2 +127,2 @@ const regexPattern = template | ||
export { getLocalePrefix, getSortedPathnames, hasPathnamePrefixed, isLocalizableHref, matchesPathname, normalizeTrailingSlash, prefixPathname, templateToRegex, unprefixPathname }; | ||
export { getLocaleAsPrefix, getLocalePrefix, getSortedPathnames, hasPathnamePrefixed, isLocalizableHref, matchesPathname, normalizeTrailingSlash, prefixPathname, templateToRegex, unprefixPathname }; |
@@ -1,1 +0,1 @@ | ||
import{useRouter as e,usePathname as t}from"next/navigation.js";import{useMemo as o}from"react";import{useLocale as n}from"use-intl";import r from"../shared/createSharedNavigationFns.js";import a from"../shared/syncLocaleCookie.js";import{getRoute as s}from"../shared/utils.js";import i from"./useBasePathname.js";function c(c){const{Link:m,config:u,getPathname:f,...h}=r(n,c);return{...h,Link:m,usePathname:function(){const e=i(u.localePrefix),t=n();return o((()=>e&&u.pathnames?s(t,e,u.pathnames):e),[t,e])},useRouter:function(){const r=e(),s=n(),i=t();return o((()=>{function e(e){return function(t,o){const{locale:n,...r}=o||{},c=[f({href:t,locale:n||s,domain:window.location.host})];Object.keys(r).length>0&&c.push(r),e(...c),a(u.localeCookie,i,s,n)}}return{...r,push:e(r.push),replace:e(r.replace),prefetch:e(r.prefetch)}}),[s,i,r])},getPathname:f}}export{c as default}; | ||
import{useRouter as e,usePathname as t}from"next/navigation.js";import{useMemo as o}from"react";import{useLocale as n}from"use-intl";import r from"../shared/createSharedNavigationFns.js";import a from"../shared/syncLocaleCookie.js";import{getRoute as s}from"../shared/utils.js";import i from"./useBasePathname.js";function c(c){const{Link:m,config:u,getPathname:h,...f}=r(n,c);return{...f,Link:m,usePathname:function(){const e=i(u),t=n();return o((()=>e&&u.pathnames?s(t,e,u.pathnames):e),[t,e])},useRouter:function(){const r=e(),s=n(),i=t();return o((()=>{function e(e){return function(t,o){const{locale:n,...r}=o||{},c=[h({href:t,locale:n||s,domain:window.location.host})];Object.keys(r).length>0&&c.push(r),e(...c),a(u.localeCookie,i,s,n)}}return{...r,push:e(r.push),replace:e(r.replace),prefetch:e(r.prefetch)}}),[s,i,r])},getPathname:h}}export{c as default}; |
@@ -1,1 +0,1 @@ | ||
import{usePathname as r}from"next/navigation.js";import{useMemo as t}from"react";import{useLocale as o}from"use-intl";import{hasPathnamePrefixed as n,unprefixPathname as i,getLocalePrefix as e}from"../../shared/utils.js";function m(m){const s=r(),f=o();return t((()=>{if(!s)return s;const r=e(f,m);return n(r,s)?i(s,r):s}),[f,m,s])}export{m as default}; | ||
import{usePathname as e}from"next/navigation.js";import{useMemo as r}from"react";import{useLocale as o}from"use-intl";import{hasPathnamePrefixed as t,unprefixPathname as i,getLocalePrefix as f,getLocaleAsPrefix as l}from"../../shared/utils.js";function n(n){const s=e(),a=o();return r((()=>{if(!s)return s;let e=s;const r=f(a,n.localePrefix);if(t(r,s))e=i(s,r);else if("as-needed"===n.localePrefix.mode&&n.localePrefix.prefixes){const r=l(a);t(r,s)&&(e=i(s,r))}return e}),[n.localePrefix,a,s])}export{n as default}; |
@@ -1,1 +0,1 @@ | ||
function t(t){return function(t){return"object"==typeof t?null==t.host&&null==t.hostname:!/^[a-z]+:/i.test(t)}(t)&&!function(t){const n="object"==typeof t?t.pathname:t;return null!=n&&!n.startsWith("/")}(t)}function n(t,n){return t.replace(new RegExp(`^${n}`),"")||"/"}function e(t,n){let e=t;return/^\/(\?.*)?$/.test(n)&&(n=n.slice(1)),e+=n,e}function r(t,n){return n===t||n.startsWith(`${t}/`)}function u(t){const n=function(){try{return"true"===process.env._next_intl_trailing_slash}catch{return!1}}();if("/"!==t){const e=t.endsWith("/");n&&!e?t+="/":!n&&e&&(t=t.slice(0,-1))}return t}function i(t,n){const e=u(t),r=u(n);return o(e).test(r)}function c(t,n){return"never"!==n.mode&&n.prefixes?.[t]||"/"+t}function o(t){const n=t.replace(/\[\[(\.\.\.[^\]]+)\]\]/g,"?(.*)").replace(/\[(\.\.\.[^\]]+)\]/g,"(.+)").replace(/\[([^\]]+)\]/g,"([^/]+)");return new RegExp(`^${n}$`)}function f(t){return t.includes("[[...")}function s(t){return t.includes("[...")}function l(t){return t.includes("[")}function a(t,n){const e=t.split("/"),r=n.split("/"),u=Math.max(e.length,r.length);for(let t=0;t<u;t++){const n=e[t],u=r[t];if(!n&&u)return-1;if(n&&!u)return 1;if(n||u){if(!l(n)&&l(u))return-1;if(l(n)&&!l(u))return 1;if(!s(n)&&s(u))return-1;if(s(n)&&!s(u))return 1;if(!f(n)&&f(u))return-1;if(f(n)&&!f(u))return 1}}return 0}function p(t){return t.sort(a)}export{c as getLocalePrefix,p as getSortedPathnames,r as hasPathnamePrefixed,t as isLocalizableHref,i as matchesPathname,u as normalizeTrailingSlash,e as prefixPathname,o as templateToRegex,n as unprefixPathname}; | ||
function n(n){return function(n){return"object"==typeof n?null==n.host&&null==n.hostname:!/^[a-z]+:/i.test(n)}(n)&&!function(n){const t="object"==typeof n?n.pathname:n;return null!=t&&!t.startsWith("/")}(n)}function t(n,t){return n.replace(new RegExp(`^${t}`),"")||"/"}function e(n,t){let e=n;return/^\/(\?.*)?$/.test(t)&&(t=t.slice(1)),e+=t,e}function r(n,t){return t===n||t.startsWith(`${n}/`)}function u(n){const t=function(){try{return"true"===process.env._next_intl_trailing_slash}catch{return!1}}();if("/"!==n){const e=n.endsWith("/");t&&!e?n+="/":!t&&e&&(n=n.slice(0,-1))}return n}function i(n,t){const e=u(n),r=u(t);return f(e).test(r)}function c(n,t){return"never"!==t.mode&&t.prefixes?.[n]||o(n)}function o(n){return"/"+n}function f(n){const t=n.replace(/\[\[(\.\.\.[^\]]+)\]\]/g,"?(.*)").replace(/\[(\.\.\.[^\]]+)\]/g,"(.+)").replace(/\[([^\]]+)\]/g,"([^/]+)");return new RegExp(`^${t}$`)}function s(n){return n.includes("[[...")}function l(n){return n.includes("[...")}function a(n){return n.includes("[")}function p(n,t){const e=n.split("/"),r=t.split("/"),u=Math.max(e.length,r.length);for(let n=0;n<u;n++){const t=e[n],u=r[n];if(!t&&u)return-1;if(t&&!u)return 1;if(t||u){if(!a(t)&&a(u))return-1;if(a(t)&&!a(u))return 1;if(!l(t)&&l(u))return-1;if(l(t)&&!l(u))return 1;if(!s(t)&&s(u))return-1;if(s(t)&&!s(u))return 1}}return 0}function h(n){return n.sort(p)}export{o as getLocaleAsPrefix,c as getLocalePrefix,h as getSortedPathnames,r as hasPathnamePrefixed,n as isLocalizableHref,i as matchesPathname,u as normalizeTrailingSlash,e as prefixPathname,f as templateToRegex,t as unprefixPathname}; |
import type { LocalePrefixConfigVerbose, LocalePrefixMode, Locales } from '../../routing/types.tsx'; | ||
export default function useBasePathname<AppLocales extends Locales, AppLocalePrefixMode extends LocalePrefixMode>(localePrefix: LocalePrefixConfigVerbose<AppLocales, AppLocalePrefixMode>): string | null; | ||
export default function useBasePathname<AppLocales extends Locales, AppLocalePrefixMode extends LocalePrefixMode>(config: { | ||
localePrefix: LocalePrefixConfigVerbose<AppLocales, AppLocalePrefixMode>; | ||
defaultLocale?: AppLocales[number]; | ||
}): string | null; |
@@ -15,4 +15,5 @@ import type { LinkProps } from 'next/link.js'; | ||
export declare function getLocalePrefix<AppLocales extends Locales, AppLocalePrefixMode extends LocalePrefixMode>(locale: AppLocales[number], localePrefix: LocalePrefixConfigVerbose<AppLocales, AppLocalePrefixMode>): string; | ||
export declare function getLocaleAsPrefix(locale: string): string; | ||
export declare function templateToRegex(template: string): RegExp; | ||
export declare function getSortedPathnames(pathnames: Array<string>): string[]; | ||
export {}; |
{ | ||
"name": "next-intl", | ||
"version": "4.0.0-beta-8cce53e", | ||
"version": "4.0.0-beta-8f37883", | ||
"sideEffects": false, | ||
@@ -115,6 +115,6 @@ "author": "Jan Amann <jan@amann.work>", | ||
"negotiator": "^1.0.0", | ||
"use-intl": "4.0.0-beta-8cce53e" | ||
"use-intl": "4.0.0-beta-8f37883" | ||
}, | ||
"peerDependencies": { | ||
"next": "^13.0.0 || ^14.0.0 || ^15.0.0", | ||
"next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", | ||
"react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0", | ||
@@ -128,3 +128,3 @@ "typescript": "^5.0.0" | ||
}, | ||
"gitHead": "1d8e497bf88194490b9fe8e61b8d69cc69bde205" | ||
"gitHead": "a9f295bd5e8f3bc25de067dd93d81a1b1bd54977" | ||
} |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
241873
0.35%3947
0.43%