const l = (t) => {
  try {
    const e = new URL(t), n = i(e.search);
    return {
      protocol: e.protocol,
      hostname: e.hostname,
      port: e.port || void 0,
      pathname: e.pathname,
      search: e.search,
      hash: e.hash,
      query: n,
      origin: e.origin,
      href: e.href
    };
  } catch {
    return null;
  }
}, u = (t, e) => {
  try {
    const n = new URL(t);
    if (e)
      for (const [r, o] of Object.entries(e))
        o != null && n.searchParams.set(r, String(o));
    return n.toString();
  } catch {
    return t;
  }
}, p = (t, e) => u(t, e), i = (t) => {
  const e = new URLSearchParams(t), n = {};
  for (const [r, o] of e.entries())
    r in n ? Array.isArray(n[r]) ? n[r].push(o) : n[r] = [n[r], o] : n[r] = o;
  return n;
}, g = (t) => {
  const e = new URLSearchParams();
  for (const [n, r] of Object.entries(t))
    if (r != null)
      if (Array.isArray(r))
        for (const o of r)
          e.append(n, String(o));
      else
        e.set(n, String(r));
  return e.toString();
}, y = (t, e) => {
  try {
    const n = new URL(t);
    for (const r of e)
      n.searchParams.delete(r);
    return n.toString();
  } catch {
    return t;
  }
}, U = (t, e) => {
  try {
    return new URL(t).searchParams.get(e);
  } catch {
    return null;
  }
}, R = (t, e) => {
  try {
    return new URL(t).searchParams.has(e);
  } catch {
    return !1;
  }
}, L = (t, e, n) => {
  const r = {
    signin: "/sign-in",
    signup: "/sign-up",
    reset: "/reset-password",
    verify: "/verify"
  }, o = new URL(r[e], t);
  if (n)
    for (const [s, a] of Object.entries(n))
      a != null && o.searchParams.set(s, String(a));
  return o.toString();
}, b = (t, e, n, r) => {
  const s = {
    google: "https://accounts.google.com/o/oauth2/v2/auth",
    github: "https://github.com/login/oauth/authorize",
    microsoft: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
    facebook: "https://www.facebook.com/v18.0/dialog/oauth",
    apple: "https://appleid.apple.com/auth/authorize",
    twitter: "https://twitter.com/i/oauth2/authorize",
    linkedin: "https://www.linkedin.com/oauth/v2/authorization",
    discord: "https://discord.com/api/oauth2/authorize",
    slack: "https://slack.com/oauth/v2/authorize",
    spotify: "https://accounts.spotify.com/authorize"
  }[t.toLowerCase()];
  if (!s)
    throw new Error(`Unsupported OAuth provider: ${t}`);
  const a = {
    client_id: e,
    redirect_uri: n,
    response_type: r?.responseType || "code"
  };
  if (r?.state && (a.state = r.state), r?.scope && (a.scope = Array.isArray(r.scope) ? r.scope.join(" ") : r.scope), r?.codeChallenge && r?.codeChallengeMethod && (a.code_challenge = r.codeChallenge, a.code_challenge_method = r.codeChallengeMethod), r?.organizationId && (a.organization_id = r.organizationId), r)
    for (const [d, c] of Object.entries(r))
      c != null && !["state", "scope", "responseType", "codeChallenge", "codeChallengeMethod", "organizationId"].includes(d) && (a[d] = String(c));
  return u(s, a);
}, P = (t) => {
  const e = l(t);
  return e ? {
    code: typeof e.query.code == "string" ? e.query.code : void 0,
    state: typeof e.query.state == "string" ? e.query.state : void 0,
    error: typeof e.query.error == "string" ? e.query.error : void 0,
    errorDescription: typeof e.query.error_description == "string" ? e.query.error_description : void 0,
    organizationId: typeof e.query.organization_id == "string" ? e.query.organization_id : void 0
  } : {};
}, z = (t, e, n) => {
  const r = new URL("/auth/magic-link", t);
  return r.searchParams.set("token", e), n?.redirectUrl && r.searchParams.set("redirect_url", n.redirectUrl), n?.organizationId && r.searchParams.set("organization_id", n.organizationId), n?.mode && r.searchParams.set("mode", n.mode), r.toString();
}, v = (t, e, n, r) => {
  const o = new URL(`/auth/verify-${n}`, t);
  return o.searchParams.set("token", e), r?.redirectUrl && o.searchParams.set("redirect_url", r.redirectUrl), r?.organizationId && o.searchParams.set("organization_id", r.organizationId), o.toString();
}, O = (t, e, n) => {
  const r = new URL("/auth/reset-password", t);
  return r.searchParams.set("token", e), n?.redirectUrl && r.searchParams.set("redirect_url", n.redirectUrl), n?.organizationId && r.searchParams.set("organization_id", n.organizationId), r.toString();
}, j = (t, e, n) => {
  const r = new URL("/auth/invitation", t);
  return r.searchParams.set("token", e), n?.redirectUrl && r.searchParams.set("redirect_url", n.redirectUrl), n?.organizationId && r.searchParams.set("organization_id", n.organizationId), r.toString();
}, C = (t) => {
  try {
    return new URL(t), !0;
  } catch {
    return !1;
  }
}, h = (t) => {
  try {
    const e = new URL(t);
    return e.protocol === "http:" || e.protocol === "https:";
  } catch {
    return !1;
  }
}, S = (t) => {
  try {
    return new URL(t).protocol === "https:";
  } catch {
    return !1;
  }
}, f = (t, e) => {
  try {
    const r = new URL(t).hostname.toLowerCase();
    return e.some((o) => {
      const s = o.toLowerCase();
      return r === s || r.endsWith(`.${s}`);
    });
  } catch {
    return !1;
  }
}, k = (t, e) => {
  try {
    const r = new URL(t).hostname.toLowerCase(), o = e.toLowerCase();
    return r === o || r.endsWith(`.${o}`);
  } catch {
    return !1;
  }
}, w = (t) => {
  try {
    return new URL(t).hostname;
  } catch {
    return null;
  }
}, _ = (t) => {
  const e = w(t);
  if (!e) return null;
  const n = e.split(".");
  return n.length >= 2 ? n.slice(-2).join(".") : e;
}, I = (t) => {
  try {
    const e = new URL(t);
    (e.protocol === "http:" && e.port === "80" || e.protocol === "https:" && e.port === "443") && (e.port = ""), e.pathname !== "/" && e.pathname.endsWith("/") && (e.pathname = e.pathname.slice(0, -1));
    const n = Array.from(e.searchParams.entries()).sort(([r], [o]) => r.localeCompare(o));
    e.search = "";
    for (const [r, o] of n)
      e.searchParams.append(r, o);
    return e.toString();
  } catch {
    return t;
  }
}, A = (...t) => {
  if (t.length === 0) return "";
  const [e, ...n] = t;
  let r = e.replace(/\/+$/, "");
  for (const o of n) {
    const s = o.replace(/^\/+|\/+$/g, "");
    s && (r += "/" + s);
  }
  return r;
}, q = (t) => {
  try {
    return new URL(t).pathname;
  } catch {
    return "";
  }
}, $ = (t) => {
  try {
    const e = new URL(t);
    return i(e.search);
  } catch {
    return {};
  }
}, m = (t, e, n = !0) => t ? n && t.startsWith("/") ? !0 : h(t) ? f(t, e) : !1 : !1, D = (t, e, n = "/") => m(t, e) ? t : n, Q = () => typeof window < "u" ? window.location.href : "", H = () => typeof window < "u" ? window.location.pathname : "", M = () => typeof window < "u" ? window.location.hostname : "", T = () => typeof window < "u" ? window.location.origin : "", V = () => typeof window < "u" ? i(window.location.search) : {}, W = (t, e = !1) => {
  typeof window < "u" && (e ? window.location.replace(t) : window.location.href = t);
}, x = (t) => {
  typeof window < "u" && window.open(t, "_blank", "noopener,noreferrer");
}, E = () => typeof window < "u" ? window.location.hash : "", N = (t) => {
  typeof window < "u" && (window.location.hash = t);
}, B = () => {
  typeof window < "u" && window.history.replaceState("", document.title, window.location.pathname + window.location.search);
}, F = (t) => encodeURIComponent(t).replace(/[!'()*]/g, (e) => `%${e.charCodeAt(0).toString(16).toUpperCase()}`), G = (t) => {
  try {
    return decodeURIComponent(t);
  } catch {
    return t;
  }
}, J = {
  // Parsing
  parseURL: l,
  parseQueryString: i,
  parseOAuthCallback: P,
  // Building
  buildURL: u,
  buildQueryString: g,
  buildAuthURL: L,
  buildOAuthURL: b,
  buildMagicLinkURL: z,
  buildVerificationURL: v,
  buildPasswordResetURL: O,
  buildInvitationURL: j,
  // Manipulation
  addQueryParams: p,
  removeQueryParams: y,
  getQueryParam: U,
  hasQueryParam: R,
  joinURL: A,
  normalizeURL: I,
  // Validation
  isValidURL: C,
  isValidHttpURL: h,
  isValidHttpsURL: S,
  isDomainAllowed: f,
  isSubdomain: k,
  isSafeRedirectURL: m,
  // Extraction
  extractDomain: w,
  extractRootDomain: _,
  getURLPath: q,
  getURLParams: $,
  // Browser
  getCurrentURL: Q,
  getCurrentPath: H,
  getCurrentDomain: M,
  getCurrentOrigin: T,
  getCurrentParams: V,
  redirectTo: W,
  openInNewTab: x,
  // Hash
  getHash: E,
  setHash: N,
  removeHash: B,
  // Encoding
  encodeURIComponentSafe: F,
  decodeURIComponentSafe: G,
  // Security
  sanitizeRedirectURL: D
};
export {
  J as URLUtils,
  p as addQueryParams,
  L as buildAuthURL,
  j as buildInvitationURL,
  z as buildMagicLinkURL,
  b as buildOAuthURL,
  O as buildPasswordResetURL,
  g as buildQueryString,
  u as buildURL,
  v as buildVerificationURL,
  G as decodeURIComponentSafe,
  F as encodeURIComponentSafe,
  w as extractDomain,
  _ as extractRootDomain,
  M as getCurrentDomain,
  T as getCurrentOrigin,
  V as getCurrentParams,
  H as getCurrentPath,
  Q as getCurrentURL,
  E as getHash,
  U as getQueryParam,
  $ as getURLParams,
  q as getURLPath,
  R as hasQueryParam,
  f as isDomainAllowed,
  m as isSafeRedirectURL,
  k as isSubdomain,
  h as isValidHttpURL,
  S as isValidHttpsURL,
  C as isValidURL,
  A as joinURL,
  I as normalizeURL,
  x as openInNewTab,
  P as parseOAuthCallback,
  i as parseQueryString,
  l as parseURL,
  W as redirectTo,
  B as removeHash,
  y as removeQueryParams,
  D as sanitizeRedirectURL,
  N as setHash
};
//# sourceMappingURL=url.js.map
