function o(e, s, t) {
  return { path: e, message: s, value: t };
}
function p(e, s, t) {
  return { path: e, message: s, value: t };
}
function h(e) {
  try {
    return new URL(e), !0;
  } catch {
    return !1;
  }
}
function l(e) {
  return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(e);
}
function g(e) {
  return typeof e == "string" && e.length > 0;
}
function u(e, s) {
  return s.includes(e);
}
function $(e) {
  const s = [];
  return e ? typeof e != "string" ? (s.push(o("publishableKey", "Publishable key must be a string", e)), s) : (/^pk_(test|live)_[a-zA-Z0-9_]+$/.test(e) || s.push(o("publishableKey", "Invalid publishable key format. Expected: pk_test_... or pk_live_...", e)), e.length < 20 && s.push(o("publishableKey", "Publishable key appears to be too short", e)), s) : (s.push(o("publishableKey", "Publishable key is required")), s);
}
function v(e) {
  const s = [];
  return e ? typeof e != "string" ? (s.push(o("apiUrl", "API URL must be a string", e)), s) : (h(e) || s.push(o("apiUrl", "Invalid API URL format", e)), e.startsWith("http://") && !e.includes("localhost") && !e.includes("127.0.0.1") && s.push(p("apiUrl", "Consider using HTTPS for production API URL", e)), s) : s;
}
function j(e) {
  const s = [], t = ["internal", "external", "end_user"];
  return u(e, t) || s.push(o("userType", `Invalid user type. Must be one of: ${t.join(", ")}`, e)), s;
}
function c(e) {
  const s = [], t = ["en", "es", "fr", "de", "pt", "it", "ja", "ko", "zh"];
  return u(e, t) || s.push(o("locale", `Invalid locale. Must be one of: ${t.join(", ")}`, e)), s;
}
function F(e) {
  const s = [], t = ["light", "dark", "system"];
  return u(e, t) || s.push(o("theme.mode", `Invalid theme mode. Must be one of: ${t.join(", ")}`, e)), s;
}
function L(e, s = "theme.colors") {
  const t = [];
  if (!e || typeof e != "object")
    return t.push(o(s, "Colors must be an object", e)), t;
  const i = ["primary", "secondary", "background", "foreground"];
  for (const r of i) {
    if (!(r in e)) {
      t.push(o(`${s}.${r}`, `Missing required color: ${r}`));
      continue;
    }
    const n = e[r];
    if (r === "primary" || r === "secondary") {
      if (typeof n != "object") {
        t.push(o(`${s}.${r}`, `${r} must be an object with color shades`, n));
        continue;
      }
      const y = ["DEFAULT", "foreground"];
      for (const a of y)
        a in n ? l(n[a]) || t.push(o(`${s}.${r}.${a}`, "Invalid hex color format", n[a])) : t.push(o(`${s}.${r}.${a}`, `Missing required shade: ${a}`));
    } else
      l(n) || t.push(o(`${s}.${r}`, "Invalid hex color format", n));
  }
  return t;
}
function A(e, s = "theme.typography") {
  const t = [];
  return !e || typeof e != "object" ? (t.push(o(s, "Typography must be an object", e)), t) : (e.fontFamily && (typeof e.fontFamily != "object" ? t.push(o(`${s}.fontFamily`, "Font family must be an object", e.fontFamily)) : (e.fontFamily.sans && !Array.isArray(e.fontFamily.sans) && t.push(o(`${s}.fontFamily.sans`, "Sans font family must be an array", e.fontFamily.sans)), e.fontFamily.mono && !Array.isArray(e.fontFamily.mono) && t.push(o(`${s}.fontFamily.mono`, "Mono font family must be an array", e.fontFamily.mono)))), e.fontSize && (typeof e.fontSize != "object" ? t.push(o(`${s}.fontSize`, "Font size must be an object", e.fontSize)) : Object.entries(e.fontSize).forEach(([i, r]) => {
    (!Array.isArray(r) || r.length !== 2) && t.push(o(`${s}.fontSize.${i}`, "Font size value must be an array with [size, lineHeight]", r));
  })), t);
}
function S(e) {
  const s = [];
  return !e || typeof e != "object" ? (s.push(o("theme", "Theme must be an object", e)), s) : (e.mode && s.push(...F(e.mode)), e.colors && s.push(...L(e.colors)), e.typography && s.push(...A(e.typography)), e.spacing && (typeof e.spacing != "object" ? s.push(o("theme.spacing", "Spacing must be an object", e.spacing)) : Object.entries(e.spacing).forEach(([t, i]) => {
    g(i) || s.push(o(`theme.spacing.${t}`, "Invalid CSS value for spacing", i));
  })), s);
}
function C(e) {
  const s = [], t = ["system", "light", "dark"];
  return u(e, t) || s.push(o("appearance.mode", `Invalid appearance mode. Must be one of: ${t.join(", ")}`, e)), s;
}
function m(e) {
  const s = [], t = ["sm", "md", "lg"];
  return u(e, t) || s.push(o("size", `Invalid component size. Must be one of: ${t.join(", ")}`, e)), s;
}
function d(e) {
  const s = [], t = ["default", "primary", "secondary", "success", "warning", "danger"];
  return u(e, t) || s.push(o("color", `Invalid color variant. Must be one of: ${t.join(", ")}`, e)), s;
}
function b(e, s = "appearance.branding") {
  const t = [];
  return !e || typeof e != "object" ? (t.push(o(s, "Branding must be an object", e)), t) : (e.logo && (e.logo.url && !h(e.logo.url) && t.push(o(`${s}.logo.url`, "Invalid logo URL", e.logo.url)), e.logo.alt || t.push(o(`${s}.logo.alt`, "Logo alt text is required for accessibility"))), e.colors && (e.colors.primary && !l(e.colors.primary) && t.push(o(`${s}.colors.primary`, "Invalid hex color format", e.colors.primary)), e.colors.secondary && !l(e.colors.secondary) && t.push(o(`${s}.colors.secondary`, "Invalid hex color format", e.colors.secondary))), t);
}
function I(e) {
  const s = [];
  if (!e || typeof e != "object")
    return s.push(o("appearance", "Appearance must be an object", e)), s;
  if (e.mode && s.push(...C(e.mode)), e.branding && s.push(...b(e.branding)), e.components) {
    const { components: t } = e;
    t.input?.size && s.push(...m(t.input.size)), t.input?.color && s.push(...d(t.input.color)), t.button?.size && s.push(...m(t.button.size)), t.button?.color && s.push(...d(t.button.color));
  }
  return s;
}
function w(e) {
  const s = [];
  return !e || typeof e != "object" ? (s.push(o("localization", "Localization must be an object", e)), s) : (e.defaultLocale && s.push(...c(e.defaultLocale).map((t) => ({
    ...t,
    path: `localization.${t.path}`
  }))), e.fallbackLocale && s.push(...c(e.fallbackLocale).map((t) => ({
    ...t,
    path: `localization.${t.path}`
  }))), e.supportedLocales && (Array.isArray(e.supportedLocales) ? e.supportedLocales.forEach((t, i) => {
    s.push(...c(t).map((r) => ({
      ...r,
      path: `localization.supportedLocales[${i}]`
    })));
  }) : s.push(o("localization.supportedLocales", "Supported locales must be an array", e.supportedLocales))), e.dateFormat && typeof e.dateFormat != "string" && s.push(o("localization.dateFormat", "Date format must be a string", e.dateFormat)), e.timeFormat && typeof e.timeFormat != "string" && s.push(o("localization.timeFormat", "Time format must be a string", e.timeFormat)), s);
}
function P(e) {
  const s = [];
  if (!e || typeof e != "object")
    return s.push(o("organization", "Organization must be an object", e)), s;
  if (e.id && typeof e.id != "string" && s.push(o("organization.id", "Organization ID must be a string", e.id)), e.name && typeof e.name != "string" && s.push(o("organization.name", "Organization name must be a string", e.name)), e.settings) {
    const { settings: t } = e;
    t.passwordPolicy && (t.passwordPolicy.minLength && typeof t.passwordPolicy.minLength != "number" && s.push(o("organization.settings.passwordPolicy.minLength", "Min length must be a number", t.passwordPolicy.minLength)), t.passwordPolicy.minLength && t.passwordPolicy.minLength < 4 && s.push(p("organization.settings.passwordPolicy.minLength", "Minimum password length should be at least 4 characters"))), t.sessionSettings && t.sessionSettings.maxDuration && typeof t.sessionSettings.maxDuration != "number" && s.push(o("organization.settings.sessionSettings.maxDuration", "Max duration must be a number", t.sessionSettings.maxDuration)), t.branding && s.push(...b(t.branding, "organization.settings.branding"));
  }
  return s;
}
function M(e) {
  const s = [];
  return !e || typeof e != "object" ? (s.push(o("components", "Components must be an object", e)), s) : (Object.entries(e).forEach(([t, i]) => {
    i && typeof i != "function" && s.push(o(`components.${t}`, "Component override must be a React component (function)", i));
  }), s);
}
function f(e) {
  const s = [], t = [];
  if (!e || typeof e != "object")
    return {
      isValid: !1,
      errors: [o("config", "Configuration must be an object", e)],
      warnings: []
    };
  if (e.publishableKey ? s.push(...$(e.publishableKey)) : s.push(o("publishableKey", "Publishable key is required")), e.userType ? s.push(...j(e.userType)) : s.push(o("userType", "User type is required")), e.apiUrl) {
    const i = v(e.apiUrl);
    s.push(...i.filter((r) => r.path.includes("error"))), t.push(...i.filter((r) => r.path.includes("warning")));
  }
  return e.theme && s.push(...S(e.theme)), e.appearance && s.push(...I(e.appearance)), e.localization && s.push(...w(e.localization)), e.organization && s.push(...P(e.organization)), e.components && s.push(...M(e.components)), e.features && (typeof e.features != "object" ? s.push(o("features", "Features must be an object", e.features)) : !e.features.signIn && !e.features.sso && t.push(p("features", "At least one authentication method (signIn or sso) should be enabled"))), {
    isValid: s.length === 0,
    errors: s,
    warnings: t
  };
}
function U(e) {
  const s = f(e);
  if (!s.isValid) {
    const t = s.errors.map((i) => `${i.path}: ${i.message}`);
    throw new Error(`Invalid Frank Auth configuration:
${t.join(`
`)}`);
  }
}
function z(e) {
  return f(e).isValid;
}
function x(e) {
  return f(e).errors.map((t) => `${t.path}: ${t.message}`);
}
function T(e) {
  return f(e).warnings.map((t) => `${t.path}: ${t.message}`);
}
export {
  U as assertValidConfig,
  x as getConfigErrors,
  T as getConfigWarnings,
  z as isValidConfig,
  v as validateApiUrl,
  I as validateAppearanceConfig,
  C as validateAppearanceMode,
  b as validateBrandingConfig,
  L as validateColorPalette,
  d as validateColorVariant,
  M as validateComponentOverrides,
  m as validateComponentSize,
  f as validateFrankAuthConfig,
  c as validateLocale,
  w as validateLocalizationConfig,
  P as validateOrganizationConfig,
  $ as validatePublishableKey,
  S as validateThemeConfig,
  F as validateThemeMode,
  A as validateTypography,
  j as validateUserType
};
//# sourceMappingURL=validators.js.map
