181 lines
6.8 KiB
JavaScript
181 lines
6.8 KiB
JavaScript
import { detectDomainLocale } from "../../shared/lib/i18n/detect-domain-locale";
|
|
import { formatNextPathnameInfo } from "../../shared/lib/router/utils/format-next-pathname-info";
|
|
import { getHostname } from "../../shared/lib/get-hostname";
|
|
import { getNextPathnameInfo } from "../../shared/lib/router/utils/get-next-pathname-info";
|
|
const REGEX_LOCALHOST_HOSTNAME = /(?!^https?:\/\/)(127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}|\[::1\]|localhost)/;
|
|
function parseURL(url, base) {
|
|
return new URL(String(url).replace(REGEX_LOCALHOST_HOSTNAME, "localhost"), base && String(base).replace(REGEX_LOCALHOST_HOSTNAME, "localhost"));
|
|
}
|
|
const Internal = Symbol("NextURLInternal");
|
|
export class NextURL {
|
|
constructor(input, baseOrOpts, opts){
|
|
let base;
|
|
let options;
|
|
if (typeof baseOrOpts === "object" && "pathname" in baseOrOpts || typeof baseOrOpts === "string") {
|
|
base = baseOrOpts;
|
|
options = opts || {};
|
|
} else {
|
|
options = opts || baseOrOpts || {};
|
|
}
|
|
this[Internal] = {
|
|
url: parseURL(input, base ?? options.base),
|
|
options: options,
|
|
basePath: ""
|
|
};
|
|
this.analyze();
|
|
}
|
|
analyze() {
|
|
var _this_Internal_options_nextConfig_i18n, _this_Internal_options_nextConfig, _this_Internal_domainLocale, _this_Internal_options_nextConfig_i18n1, _this_Internal_options_nextConfig1;
|
|
const info = getNextPathnameInfo(this[Internal].url.pathname, {
|
|
nextConfig: this[Internal].options.nextConfig,
|
|
parseData: !process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE,
|
|
i18nProvider: this[Internal].options.i18nProvider
|
|
});
|
|
const hostname = getHostname(this[Internal].url, this[Internal].options.headers);
|
|
this[Internal].domainLocale = this[Internal].options.i18nProvider ? this[Internal].options.i18nProvider.detectDomainLocale(hostname) : detectDomainLocale((_this_Internal_options_nextConfig = this[Internal].options.nextConfig) == null ? void 0 : (_this_Internal_options_nextConfig_i18n = _this_Internal_options_nextConfig.i18n) == null ? void 0 : _this_Internal_options_nextConfig_i18n.domains, hostname);
|
|
const defaultLocale = ((_this_Internal_domainLocale = this[Internal].domainLocale) == null ? void 0 : _this_Internal_domainLocale.defaultLocale) || ((_this_Internal_options_nextConfig1 = this[Internal].options.nextConfig) == null ? void 0 : (_this_Internal_options_nextConfig_i18n1 = _this_Internal_options_nextConfig1.i18n) == null ? void 0 : _this_Internal_options_nextConfig_i18n1.defaultLocale);
|
|
this[Internal].url.pathname = info.pathname;
|
|
this[Internal].defaultLocale = defaultLocale;
|
|
this[Internal].basePath = info.basePath ?? "";
|
|
this[Internal].buildId = info.buildId;
|
|
this[Internal].locale = info.locale ?? defaultLocale;
|
|
this[Internal].trailingSlash = info.trailingSlash;
|
|
}
|
|
formatPathname() {
|
|
return formatNextPathnameInfo({
|
|
basePath: this[Internal].basePath,
|
|
buildId: this[Internal].buildId,
|
|
defaultLocale: !this[Internal].options.forceLocale ? this[Internal].defaultLocale : undefined,
|
|
locale: this[Internal].locale,
|
|
pathname: this[Internal].url.pathname,
|
|
trailingSlash: this[Internal].trailingSlash
|
|
});
|
|
}
|
|
formatSearch() {
|
|
return this[Internal].url.search;
|
|
}
|
|
get buildId() {
|
|
return this[Internal].buildId;
|
|
}
|
|
set buildId(buildId) {
|
|
this[Internal].buildId = buildId;
|
|
}
|
|
get locale() {
|
|
return this[Internal].locale ?? "";
|
|
}
|
|
set locale(locale) {
|
|
var _this_Internal_options_nextConfig_i18n, _this_Internal_options_nextConfig;
|
|
if (!this[Internal].locale || !((_this_Internal_options_nextConfig = this[Internal].options.nextConfig) == null ? void 0 : (_this_Internal_options_nextConfig_i18n = _this_Internal_options_nextConfig.i18n) == null ? void 0 : _this_Internal_options_nextConfig_i18n.locales.includes(locale))) {
|
|
throw new TypeError(`The NextURL configuration includes no locale "${locale}"`);
|
|
}
|
|
this[Internal].locale = locale;
|
|
}
|
|
get defaultLocale() {
|
|
return this[Internal].defaultLocale;
|
|
}
|
|
get domainLocale() {
|
|
return this[Internal].domainLocale;
|
|
}
|
|
get searchParams() {
|
|
return this[Internal].url.searchParams;
|
|
}
|
|
get host() {
|
|
return this[Internal].url.host;
|
|
}
|
|
set host(value) {
|
|
this[Internal].url.host = value;
|
|
}
|
|
get hostname() {
|
|
return this[Internal].url.hostname;
|
|
}
|
|
set hostname(value) {
|
|
this[Internal].url.hostname = value;
|
|
}
|
|
get port() {
|
|
return this[Internal].url.port;
|
|
}
|
|
set port(value) {
|
|
this[Internal].url.port = value;
|
|
}
|
|
get protocol() {
|
|
return this[Internal].url.protocol;
|
|
}
|
|
set protocol(value) {
|
|
this[Internal].url.protocol = value;
|
|
}
|
|
get href() {
|
|
const pathname = this.formatPathname();
|
|
const search = this.formatSearch();
|
|
return `${this.protocol}//${this.host}${pathname}${search}${this.hash}`;
|
|
}
|
|
set href(url) {
|
|
this[Internal].url = parseURL(url);
|
|
this.analyze();
|
|
}
|
|
get origin() {
|
|
return this[Internal].url.origin;
|
|
}
|
|
get pathname() {
|
|
return this[Internal].url.pathname;
|
|
}
|
|
set pathname(value) {
|
|
this[Internal].url.pathname = value;
|
|
}
|
|
get hash() {
|
|
return this[Internal].url.hash;
|
|
}
|
|
set hash(value) {
|
|
this[Internal].url.hash = value;
|
|
}
|
|
get search() {
|
|
return this[Internal].url.search;
|
|
}
|
|
set search(value) {
|
|
this[Internal].url.search = value;
|
|
}
|
|
get password() {
|
|
return this[Internal].url.password;
|
|
}
|
|
set password(value) {
|
|
this[Internal].url.password = value;
|
|
}
|
|
get username() {
|
|
return this[Internal].url.username;
|
|
}
|
|
set username(value) {
|
|
this[Internal].url.username = value;
|
|
}
|
|
get basePath() {
|
|
return this[Internal].basePath;
|
|
}
|
|
set basePath(value) {
|
|
this[Internal].basePath = value.startsWith("/") ? value : `/${value}`;
|
|
}
|
|
toString() {
|
|
return this.href;
|
|
}
|
|
toJSON() {
|
|
return this.href;
|
|
}
|
|
[Symbol.for("edge-runtime.inspect.custom")]() {
|
|
return {
|
|
href: this.href,
|
|
origin: this.origin,
|
|
protocol: this.protocol,
|
|
username: this.username,
|
|
password: this.password,
|
|
host: this.host,
|
|
hostname: this.hostname,
|
|
port: this.port,
|
|
pathname: this.pathname,
|
|
search: this.search,
|
|
searchParams: this.searchParams,
|
|
hash: this.hash
|
|
};
|
|
}
|
|
clone() {
|
|
return new NextURL(String(this), this[Internal].options);
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=next-url.js.map
|