@asafarim/shared-i18n 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +266 -350
  2. package/demo/README.md +119 -148
  3. package/demo/index.html +12 -1
  4. package/demo/node_modules/.bin/kill-port +17 -0
  5. package/demo/node_modules/.bin/tsc +5 -9
  6. package/demo/node_modules/.bin/tsserver +5 -9
  7. package/demo/node_modules/.bin/vite +5 -9
  8. package/demo/package.json +7 -4
  9. package/demo/public/404.html +24 -0
  10. package/demo/public/favicon.svg +4 -4
  11. package/demo/public/logo.svg +24 -24
  12. package/demo/src/App.tsx +178 -129
  13. package/demo/src/components/CountryLanguageSelectorsPage.tsx +240 -0
  14. package/demo/src/components/GetStartedSection.tsx +56 -56
  15. package/demo/src/components/KeyTable.tsx +29 -29
  16. package/demo/src/components/LanguageBar.tsx +145 -103
  17. package/demo/src/components/LanguageSwitcherDemo.module.css +114 -114
  18. package/demo/src/components/LanguageSwitchersPage.tsx +245 -0
  19. package/demo/src/components/Logo.tsx +6 -6
  20. package/demo/src/components/OverviewSection.tsx +58 -43
  21. package/demo/src/components/Panel.tsx +15 -15
  22. package/demo/src/components/RoutingLabPage.tsx +147 -0
  23. package/demo/src/components/StatusCard.tsx +109 -109
  24. package/demo/src/data/countries.ts +48 -0
  25. package/demo/src/i18n/localeAdapter.ts +91 -0
  26. package/demo/src/i18n/localeRouting.ts +77 -0
  27. package/demo/src/index.css +1075 -644
  28. package/demo/src/locales/de/demo.json +202 -84
  29. package/demo/src/locales/en/demo.json +201 -85
  30. package/demo/src/locales/fr/demo.json +203 -85
  31. package/demo/src/locales/it/demo.json +202 -84
  32. package/demo/src/locales/lb/demo.json +201 -0
  33. package/demo/src/locales/nl/demo.json +203 -85
  34. package/demo/src/main.tsx +32 -29
  35. package/demo/tsconfig.json +18 -18
  36. package/demo/tsconfig.node.json +10 -10
  37. package/demo/tsconfig.tsbuildinfo +1 -1
  38. package/demo/vite-env.d.ts +7 -7
  39. package/demo/vite.config.d.ts +2 -2
  40. package/demo/vite.config.js +10 -10
  41. package/dist/components/LanguageSwitcher.module.css +303 -303
  42. package/dist/country-language-selector.css +431 -0
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -0
  46. package/dist/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +8 -5
  48. package/demo/dist/Icon Dropdown_Limited Languages.png +0 -0
  49. package/demo/dist/Select Dropdown_Text Only.png +0 -0
  50. package/demo/dist/assets/favicon-BZYZvBLo.svg +0 -4
  51. package/demo/dist/assets/index-BdjqKw_N.css +0 -1
  52. package/demo/dist/assets/index-C1Tq1uEr.js +0 -191
  53. package/demo/dist/favicon.svg +0 -4
  54. package/demo/dist/index.html +0 -27
  55. package/demo/dist/logo.svg +0 -24
  56. package/demo/node_modules/.bin/browserslist +0 -21
  57. package/demo/node_modules/.bin/browserslist.CMD +0 -12
  58. package/demo/node_modules/.bin/browserslist.ps1 +0 -41
  59. package/demo/node_modules/.bin/tsc.CMD +0 -12
  60. package/demo/node_modules/.bin/tsc.ps1 +0 -41
  61. package/demo/node_modules/.bin/tsserver.CMD +0 -12
  62. package/demo/node_modules/.bin/tsserver.ps1 +0 -41
  63. package/demo/node_modules/.bin/vite.CMD +0 -12
  64. package/demo/node_modules/.bin/vite.ps1 +0 -41
  65. package/demo/node_modules/.vite/deps/@asafarim_country-language-selector.js +0 -848
  66. package/demo/node_modules/.vite/deps/@asafarim_country-language-selector.js.map +0 -7
  67. package/demo/node_modules/.vite/deps/_metadata.json +0 -76
  68. package/demo/node_modules/.vite/deps/chunk-5WRI5ZAA.js +0 -30
  69. package/demo/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +0 -7
  70. package/demo/node_modules/.vite/deps/chunk-B3AHR5EX.js +0 -1004
  71. package/demo/node_modules/.vite/deps/chunk-B3AHR5EX.js.map +0 -7
  72. package/demo/node_modules/.vite/deps/chunk-E6BG6WAU.js +0 -292
  73. package/demo/node_modules/.vite/deps/chunk-E6BG6WAU.js.map +0 -7
  74. package/demo/node_modules/.vite/deps/chunk-MVARZQEG.js +0 -280
  75. package/demo/node_modules/.vite/deps/chunk-MVARZQEG.js.map +0 -7
  76. package/demo/node_modules/.vite/deps/i18next-browser-languagedetector.js +0 -400
  77. package/demo/node_modules/.vite/deps/i18next-browser-languagedetector.js.map +0 -7
  78. package/demo/node_modules/.vite/deps/i18next.js +0 -2392
  79. package/demo/node_modules/.vite/deps/i18next.js.map +0 -7
  80. package/demo/node_modules/.vite/deps/package.json +0 -3
  81. package/demo/node_modules/.vite/deps/react-dom.js +0 -6
  82. package/demo/node_modules/.vite/deps/react-dom.js.map +0 -7
  83. package/demo/node_modules/.vite/deps/react-dom_client.js +0 -20217
  84. package/demo/node_modules/.vite/deps/react-dom_client.js.map +0 -7
  85. package/demo/node_modules/.vite/deps/react-i18next.js +0 -869
  86. package/demo/node_modules/.vite/deps/react-i18next.js.map +0 -7
  87. package/demo/node_modules/.vite/deps/react.js +0 -5
  88. package/demo/node_modules/.vite/deps/react.js.map +0 -7
  89. package/demo/node_modules/.vite/deps/react_jsx-dev-runtime.js +0 -278
  90. package/demo/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +0 -7
  91. package/demo/node_modules/.vite/deps/react_jsx-runtime.js +0 -6
  92. package/demo/node_modules/.vite/deps/react_jsx-runtime.js.map +0 -7
  93. package/demo/src/components/CountryLanguageDemo.tsx +0 -140
  94. package/demo/src/components/LanguageSwitcherDemo.tsx +0 -256
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/types.ts", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/data/countries.ts", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/utils/dom.ts", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/hooks/useCountryLanguage.ts", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/hooks/useClickOutside.ts", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/hooks/useFocusTrap.ts", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/utils/search.ts", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/components/icons.tsx", "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/src/components/CountryLanguageSelector.tsx"],
4
- "sourcesContent": ["/**\n * Public types for @asafarim/country-language-selector.\n *\n * The model is deliberately minimal:\n * - A `Country` owns an ordered list of supported `Language` codes.\n * - A `Locale` is the user-facing selection: `{ country, language }`.\n *\n * Codes follow ISO standards so they interop cleanly with i18n libraries:\n * - Country: ISO 3166-1 alpha-2 (e.g. \"BE\", \"FR\", \"DE\", \"NL\")\n * - Language: BCP 47 primary subtag / ISO 639-1 (e.g. \"nl\", \"fr\", \"de\", \"en\")\n */\n\nimport type { ReactNode } from \"react\";\n\nexport type CountryCode = string; // ISO 3166-1 alpha-2, uppercase by convention\nexport type LanguageCode = string; // BCP 47 / ISO 639-1, lowercase by convention\n\nexport interface Language {\n /** BCP 47 / ISO 639-1 code, e.g. \"nl\". */\n code: LanguageCode;\n /** English label shown in the UI, e.g. \"Dutch\". */\n label: string;\n /** Native label shown as a subtitle, e.g. \"Nederlands\". */\n nativeLabel?: string;\n}\n\nexport interface Country {\n /** ISO 3166-1 alpha-2 code, e.g. \"BE\". */\n code: CountryCode;\n /** English label, e.g. \"Belgium\". */\n name: string;\n /** Native label, e.g. \"België\". */\n nativeName?: string;\n /** Emoji flag. Rendered as text so it needs no image asset. */\n flag: string;\n /**\n * Ordered list of languages this country supports in this app.\n * The first entry is treated as the country's default language.\n */\n languages: Language[];\n}\n\nexport interface Locale {\n country: CountryCode;\n language: LanguageCode;\n}\n\n/**\n * Callback fired whenever the effective locale changes. Fires on both\n * country-driven changes (with language defaulted) and explicit language\n * changes within the currently-selected country.\n */\nexport type LocaleChangeHandler = (locale: Locale, meta: LocaleChangeMeta) => void;\n\nexport interface LocaleChangeMeta {\n /** What caused the change. Useful for analytics / side effects. */\n reason: \"country\" | \"language\" | \"init\" | \"reset\";\n /** The previous locale, or null if none was set. */\n previous: Locale | null;\n}\n\nexport interface CountryLanguageSelectorProps {\n /** Countries to render. Defaults to the bundled `defaultCountries`. */\n countries?: Country[];\n\n /** Controlled value. If provided, the component becomes controlled. */\n value?: Locale;\n /** Default value for uncontrolled usage. */\n defaultValue?: Locale;\n /** Notified on every change. */\n onChange?: LocaleChangeHandler;\n\n /**\n * When set, the selection is persisted to `localStorage` under this key\n * and rehydrated on mount. Ignored in controlled mode.\n */\n persistKey?: string;\n\n /** Label read by screen readers on the trigger button. */\n ariaLabel?: string;\n\n /**\n * Trigger display mode:\n * - \"compact\" (default): flag + country code + language code, e.g. `🇧🇪 BE · NL`\n * - \"full\": flag + country name + language name\n * - \"flag\": flag only, for very tight navbars\n */\n triggerVariant?: \"compact\" | \"full\" | \"flag\";\n\n /** Align the popover to the trigger. Defaults to \"end\" (right-aligned). */\n align?: \"start\" | \"end\";\n\n /** Disable the whole selector. */\n disabled?: boolean;\n\n /** Escape hatch for styling overrides. */\n className?: string;\n popoverClassName?: string;\n\n /** Optional render prop to fully customise the trigger contents. */\n renderTrigger?: (ctx: RenderTriggerContext) => ReactNode;\n\n /** i18n strings. Override to localise the selector's own UI. */\n strings?: Partial<SelectorStrings>;\n}\n\nexport interface RenderTriggerContext {\n country: Country;\n language: Language;\n open: boolean;\n}\n\nexport interface SelectorStrings {\n ariaLabel: string;\n searchPlaceholder: string;\n emptyResults: string;\n chooseCountry: string;\n chooseLanguage: string;\n backToCountries: string;\n close: string;\n}\n\nexport const defaultStrings: SelectorStrings = {\n ariaLabel: \"Select country and language\",\n searchPlaceholder: \"Search country…\",\n emptyResults: \"No matching countries\",\n chooseCountry: \"Country\",\n chooseLanguage: \"Language\",\n backToCountries: \"Back\",\n close: \"Close\",\n};\n", "import type { Country, Language } from \"../types\";\n\n/**\n * Canonical language catalogue. Reused across countries so labels stay\n * consistent and the data stays small.\n */\nconst L = {\n en: { code: \"en\", label: \"English\", nativeLabel: \"English\" },\n nl: { code: \"nl\", label: \"Dutch\", nativeLabel: \"Nederlands\" },\n fr: { code: \"fr\", label: \"French\", nativeLabel: \"Français\" },\n de: { code: \"de\", label: \"German\", nativeLabel: \"Deutsch\" },\n es: { code: \"es\", label: \"Spanish\", nativeLabel: \"Español\" },\n it: { code: \"it\", label: \"Italian\", nativeLabel: \"Italiano\" },\n pt: { code: \"pt\", label: \"Portuguese\", nativeLabel: \"Português\" },\n sv: { code: \"sv\", label: \"Swedish\", nativeLabel: \"Svenska\" },\n da: { code: \"da\", label: \"Danish\", nativeLabel: \"Dansk\" },\n no: { code: \"no\", label: \"Norwegian\", nativeLabel: \"Norsk\" },\n fi: { code: \"fi\", label: \"Finnish\", nativeLabel: \"Suomi\" },\n pl: { code: \"pl\", label: \"Polish\", nativeLabel: \"Polski\" },\n ja: { code: \"ja\", label: \"Japanese\", nativeLabel: \"日本語\" },\n zh: { code: \"zh\", label: \"Chinese\", nativeLabel: \"中文\" },\n ar: { code: \"ar\", label: \"Arabic\", nativeLabel: \"العربية\" },\n tr: { code: \"tr\", label: \"Turkish\", nativeLabel: \"Türkçe\" },\n ru: { code: \"ru\", label: \"Russian\", nativeLabel: \"Русский\" },\n ko: { code: \"ko\", label: \"Korean\", nativeLabel: \"한국어\" },\n hi: { code: \"hi\", label: \"Hindi\", nativeLabel: \"हिन्दी\" },\n fa: { code: \"fa\", label: \"Persian\", nativeLabel: \"فارسی\" },\n} as const satisfies Record<string, Language>;\n\n/**\n * A curated starter set of countries. Multi-language countries such as\n * Belgium, Switzerland, and Canada are the motivating cases — consumers can\n * replace or extend this list via the `countries` prop.\n */\nexport const defaultCountries: Country[] = [\n {\n code: \"BE\",\n name: \"Belgium\",\n nativeName: \"België\",\n flag: \"🇧🇪\",\n languages: [L.nl, L.fr, L.de, L.en],\n },\n {\n code: \"NL\",\n name: \"Netherlands\",\n nativeName: \"Nederland\",\n flag: \"🇳🇱\",\n languages: [L.nl, L.en],\n },\n {\n code: \"FR\",\n name: \"France\",\n nativeName: \"France\",\n flag: \"🇫🇷\",\n languages: [L.fr, L.en],\n },\n {\n code: \"DE\",\n name: \"Germany\",\n nativeName: \"Deutschland\",\n flag: \"🇩🇪\",\n languages: [L.de, L.en],\n },\n {\n code: \"CH\",\n name: \"Switzerland\",\n nativeName: \"Schweiz\",\n flag: \"🇨🇭\",\n languages: [L.de, L.fr, L.it, L.en],\n },\n {\n code: \"LU\",\n name: \"Luxembourg\",\n nativeName: \"Lëtzebuerg\",\n flag: \"🇱🇺\",\n languages: [L.fr, L.de, L.en],\n },\n {\n code: \"CA\",\n name: \"Canada\",\n nativeName: \"Canada\",\n flag: \"🇨🇦\",\n languages: [L.en, L.fr],\n },\n {\n code: \"US\",\n name: \"United States\",\n flag: \"🇺🇸\",\n languages: [L.en, L.es],\n },\n {\n code: \"GB\",\n name: \"United Kingdom\",\n flag: \"🇬🇧\",\n languages: [L.en],\n },\n {\n code: \"ES\",\n name: \"Spain\",\n nativeName: \"España\",\n flag: \"🇪🇸\",\n languages: [L.es, L.en],\n },\n {\n code: \"IT\",\n name: \"Italy\",\n nativeName: \"Italia\",\n flag: \"🇮🇹\",\n languages: [L.it, L.en],\n },\n {\n code: \"PT\",\n name: \"Portugal\",\n flag: \"🇵🇹\",\n languages: [L.pt, L.en],\n },\n {\n code: \"SE\",\n name: \"Sweden\",\n nativeName: \"Sverige\",\n flag: \"🇸🇪\",\n languages: [L.sv, L.en],\n },\n {\n code: \"DK\",\n name: \"Denmark\",\n nativeName: \"Danmark\",\n flag: \"🇩🇰\",\n languages: [L.da, L.en],\n },\n {\n code: \"NO\",\n name: \"Norway\",\n nativeName: \"Norge\",\n flag: \"🇳🇴\",\n languages: [L.no, L.en],\n },\n {\n code: \"FI\",\n name: \"Finland\",\n nativeName: \"Suomi\",\n flag: \"🇫🇮\",\n languages: [L.fi, L.sv, L.en],\n },\n {\n code: \"PL\",\n name: \"Poland\",\n nativeName: \"Polska\",\n flag: \"🇵🇱\",\n languages: [L.pl, L.en],\n },\n {\n code: \"JP\",\n name: \"Japan\",\n nativeName: \"日本\",\n flag: \"🇯🇵\",\n languages: [L.ja, L.en],\n },\n {\n code: \"CN\",\n name: \"China\",\n nativeName: \"中国\",\n flag: \"🇨🇳\",\n languages: [L.zh, L.en],\n },\n {\n code: \"KR\",\n name: \"South Korea\",\n nativeName: \"대한민국\",\n flag: \"🇰🇷\",\n languages: [L.ko, L.en],\n },\n {\n code: \"IN\",\n name: \"India\",\n flag: \"🇮🇳\",\n languages: [L.hi, L.en],\n },\n {\n code: \"TR\",\n name: \"Türkiye\",\n nativeName: \"Türkiye\",\n flag: \"🇹🇷\",\n languages: [L.tr, L.en],\n },\n {\n code: \"RU\",\n name: \"Russia\",\n nativeName: \"Россия\",\n flag: \"🇷🇺\",\n languages: [L.ru, L.en],\n },\n {\n code: \"IR\",\n name: \"Iran\",\n nativeName: \"ایران\",\n flag: \"🇮🇷\",\n languages: [L.fa, L.en],\n },\n {\n code: \"SA\",\n name: \"Saudi Arabia\",\n nativeName: \"السعودية\",\n flag: \"🇸🇦\",\n languages: [L.ar, L.en],\n },\n {\n code: \"AE\",\n name: \"United Arab Emirates\",\n flag: \"🇦🇪\",\n languages: [L.ar, L.en],\n },\n {\n code: \"BR\",\n name: \"Brazil\",\n nativeName: \"Brasil\",\n flag: \"🇧🇷\",\n languages: [L.pt, L.en],\n },\n {\n code: \"MX\",\n name: \"Mexico\",\n nativeName: \"México\",\n flag: \"🇲🇽\",\n languages: [L.es, L.en],\n },\n];\n\nexport const languageCatalogue = L;\n", "/**\n * Small DOM helpers that stay SSR-safe (no access during module load).\n */\n\nexport const isBrowser = (): boolean =>\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nexport function readStorage(key: string): string | null {\n if (!isBrowser()) return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nexport function writeStorage(key: string, value: string): void {\n if (!isBrowser()) return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // ignore — private-mode Safari, quota, etc.\n }\n}\n\n/** Returns true on coarse-pointer / narrow viewports. */\nexport function isCoarsePointer(): boolean {\n if (!isBrowser()) return false;\n return window.matchMedia?.(\"(pointer: coarse)\").matches ?? false;\n}\n", "import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n Country,\n Language,\n Locale,\n LocaleChangeHandler,\n LocaleChangeMeta,\n} from \"../types\";\nimport { readStorage, writeStorage } from \"../utils/dom\";\n\nexport interface UseCountryLanguageArgs {\n countries: Country[];\n value?: Locale;\n defaultValue?: Locale;\n onChange?: LocaleChangeHandler;\n persistKey?: string;\n}\n\nexport interface UseCountryLanguageReturn {\n locale: Locale;\n country: Country;\n language: Language;\n setCountry: (code: string) => void;\n setLanguage: (code: string) => void;\n setLocale: (next: Locale, reason?: LocaleChangeMeta[\"reason\"]) => void;\n /** True when the current country has more than one language. */\n needsLanguageChoice: boolean;\n}\n\n/**\n * Encapsulates the state machine for the selector — controlled vs\n * uncontrolled, persistence, and the country→language dependency rule\n * (switching country resets the language to that country's first entry,\n * unless the new country also supports the previous language).\n */\nexport function useCountryLanguage(\n args: UseCountryLanguageArgs\n): UseCountryLanguageReturn {\n const { countries, value, defaultValue, onChange, persistKey } = args;\n const isControlled = value !== undefined;\n\n // Resolve the initial uncontrolled value using *only* the defaultValue and\n // the countries list. We deliberately skip localStorage here so that SSR\n // renders match the first client render (no hydration mismatch).\n const initialRef = useRef<Locale | null>(null);\n if (initialRef.current === null) {\n initialRef.current =\n (defaultValue && isValidLocale(defaultValue, countries) ? defaultValue : null) ??\n fallbackLocale(countries);\n }\n\n const [internal, setInternal] = useState<Locale>(initialRef.current);\n const current = isControlled ? (value as Locale) : internal;\n\n // Rehydrate from localStorage on mount. This happens post-hydration so it\n // never triggers an SSR/CSR mismatch. Also fires a single \"init\" event.\n const didInitRef = useRef(false);\n useEffect(() => {\n if (didInitRef.current) return;\n didInitRef.current = true;\n\n if (!isControlled && persistKey) {\n const hydrated = readPersistedLocale(persistKey, countries);\n if (hydrated) {\n setInternal(hydrated);\n onChange?.(hydrated, { reason: \"init\", previous: initialRef.current });\n return;\n }\n }\n onChange?.(current, { reason: \"init\", previous: null });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const byCode = useMemo(() => {\n const map = new Map<string, Country>();\n for (const c of countries) map.set(c.code, c);\n return map;\n }, [countries]);\n\n const country = byCode.get(current.country) ?? countries[0]!;\n const language =\n country.languages.find((l) => l.code === current.language) ??\n country.languages[0]!;\n\n const commit = useCallback(\n (next: Locale, reason: LocaleChangeMeta[\"reason\"]) => {\n const previous = current;\n if (!isControlled) setInternal(next);\n if (persistKey && !isControlled) {\n writeStorage(persistKey, JSON.stringify(next));\n }\n onChange?.(next, { reason, previous });\n },\n [current, isControlled, onChange, persistKey]\n );\n\n const setCountry = useCallback(\n (code: string) => {\n const nextCountry = byCode.get(code);\n if (!nextCountry) return;\n // Preserve the active language if the new country also supports it,\n // otherwise fall back to that country's default language.\n const keep = nextCountry.languages.find(\n (l) => l.code === current.language\n );\n const nextLanguage = (keep ?? nextCountry.languages[0])!.code;\n commit({ country: nextCountry.code, language: nextLanguage }, \"country\");\n },\n [byCode, commit, current.language]\n );\n\n const setLanguage = useCallback(\n (code: string) => {\n if (!country.languages.some((l) => l.code === code)) return;\n commit({ country: country.code, language: code }, \"language\");\n },\n [commit, country]\n );\n\n const setLocale = useCallback(\n (next: Locale, reason: LocaleChangeMeta[\"reason\"] = \"country\") => {\n commit(next, reason);\n },\n [commit]\n );\n\n return {\n locale: { country: country.code, language: language.code },\n country,\n language,\n setCountry,\n setLanguage,\n setLocale,\n needsLanguageChoice: country.languages.length > 1,\n };\n}\n\nfunction readPersistedLocale(key: string, countries: Country[]): Locale | null {\n const raw = readStorage(key);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Locale;\n return isValidLocale(parsed, countries) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction isValidLocale(locale: Locale, countries: Country[]): boolean {\n const c = countries.find((x) => x.code === locale.country);\n if (!c) return false;\n return c.languages.some((l) => l.code === locale.language);\n}\n\nfunction fallbackLocale(countries: Country[]): Locale {\n const first = countries[0];\n if (!first) {\n throw new Error(\n \"[country-language-selector] `countries` must contain at least one entry.\"\n );\n }\n return { country: first.code, language: first.languages[0]!.code };\n}\n", "import { useEffect, type RefObject } from \"react\";\n\n/**\n * Calls `handler` when a pointerdown (or the Escape key) fires outside every\n * element in `refs`. Uses pointerdown rather than click so dismissals happen\n * before the target receives focus — important for accessible dropdowns.\n */\nexport function useClickOutside(\n refs: Array<RefObject<HTMLElement | null>>,\n enabled: boolean,\n handler: (event: Event) => void\n): void {\n useEffect(() => {\n if (!enabled) return;\n\n const isInside = (target: Node | null): boolean => {\n if (!target) return false;\n return refs.some((ref) => {\n const el = ref.current;\n return !!el && el.contains(target);\n });\n };\n\n const onPointer = (event: PointerEvent | MouseEvent) => {\n if (!isInside(event.target as Node | null)) handler(event);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") handler(event);\n };\n\n document.addEventListener(\"pointerdown\", onPointer, true);\n document.addEventListener(\"keydown\", onKey, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointer, true);\n document.removeEventListener(\"keydown\", onKey, true);\n };\n }, [enabled, handler, refs]);\n}\n", "import { useEffect, type RefObject } from \"react\";\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"textarea:not([disabled])\",\n \"select:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(\",\");\n\n/**\n * Simple focus trap: Tab / Shift+Tab cycle within `container` while enabled.\n * No dependencies, safe with async-rendered children.\n */\nexport function useFocusTrap(\n container: RefObject<HTMLElement | null>,\n enabled: boolean\n): void {\n useEffect(() => {\n if (!enabled) return;\n const node = container.current;\n if (!node) return;\n\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\") return;\n const focusable = Array.from(\n node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)\n ).filter((el) => !el.hasAttribute(\"data-focus-skip\"));\n if (focusable.length === 0) {\n event.preventDefault();\n node.focus();\n return;\n }\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = document.activeElement as HTMLElement | null;\n\n if (event.shiftKey && (active === first || !node.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n node.addEventListener(\"keydown\", onKey);\n return () => node.removeEventListener(\"keydown\", onKey);\n }, [container, enabled]);\n}\n", "import type { Country } from \"../types\";\n\n/** Remove diacritics so \"Türkiye\" matches \"turkiye\". */\nexport function normalize(input: string): string {\n return input\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .trim();\n}\n\n/**\n * Score a country against a query. Higher is better. Returns null when the\n * country shouldn't appear at all for the given query.\n *\n * Scoring, in priority order:\n * 1. exact country-code match (1000)\n * 2. prefix match on country code ( 900)\n * 3. prefix match on name / native name ( 700)\n * 4. prefix match on any language code ( 500)\n * 5. substring match on name ( 300)\n * 6. substring match on a language name ( 100)\n */\nexport function scoreCountry(country: Country, rawQuery: string): number | null {\n const q = normalize(rawQuery);\n if (!q) return 0;\n\n const code = country.code.toLowerCase();\n const name = normalize(country.name);\n const native = country.nativeName ? normalize(country.nativeName) : \"\";\n\n if (code === q) return 1000;\n if (code.startsWith(q)) return 900;\n if (name.startsWith(q) || native.startsWith(q)) return 700;\n\n for (const lang of country.languages) {\n if (lang.code.startsWith(q)) return 500;\n }\n\n if (name.includes(q) || native.includes(q)) return 300;\n\n for (const lang of country.languages) {\n const label = normalize(lang.label);\n const nativeLabel = lang.nativeLabel ? normalize(lang.nativeLabel) : \"\";\n if (label.includes(q) || nativeLabel.includes(q)) return 100;\n }\n\n return null;\n}\n\nexport function filterCountries(countries: Country[], query: string): Country[] {\n if (!query.trim()) return countries;\n return countries\n .map((c) => ({ c, s: scoreCountry(c, query) }))\n .filter((x): x is { c: Country; s: number } => x.s !== null)\n .sort((a, b) => b.s - a.s || a.c.name.localeCompare(b.c.name))\n .map((x) => x.c);\n}\n", "import type { SVGProps } from \"react\";\n\nexport function ChevronDown(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"m4 6 4 4 4-4\" />\n </svg>\n );\n}\n\nexport function SearchIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n <path d=\"m14 14-3.4-3.4\" />\n </svg>\n );\n}\n\nexport function CheckIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"m3.5 8.5 3 3 6-6\" />\n </svg>\n );\n}\n\nexport function ArrowLeft(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M10 4 6 8l4 4\" />\n <path d=\"M6 8h7\" />\n </svg>\n );\n}\n", "\"use client\";\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n} from \"react\";\nimport type {\n Country,\n CountryLanguageSelectorProps,\n Language,\n SelectorStrings,\n} from \"../types\";\nimport { defaultStrings } from \"../types\";\nimport { defaultCountries } from \"../data/countries\";\nimport { useCountryLanguage } from \"../hooks/useCountryLanguage\";\nimport { useClickOutside } from \"../hooks/useClickOutside\";\nimport { useFocusTrap } from \"../hooks/useFocusTrap\";\nimport { filterCountries } from \"../utils/search\";\nimport { isCoarsePointer } from \"../utils/dom\";\nimport { ArrowLeft, CheckIcon, ChevronDown, SearchIcon } from \"./icons\";\n\ntype Step = \"country\" | \"language\";\n\n/**\n * A compact, accessible country + language selector for navbars.\n *\n * The component is a combobox-style popover. It supports both controlled\n * and uncontrolled usage and optionally persists the selection to\n * localStorage.\n */\nexport const CountryLanguageSelector = forwardRef<\n HTMLDivElement,\n CountryLanguageSelectorProps\n>(function CountryLanguageSelector(props, ref) {\n const {\n countries = defaultCountries,\n value,\n defaultValue,\n onChange,\n persistKey,\n ariaLabel,\n triggerVariant = \"compact\",\n align = \"end\",\n disabled,\n className,\n popoverClassName,\n renderTrigger,\n strings: stringsProp,\n } = props;\n\n const strings: SelectorStrings = useMemo(\n () => ({ ...defaultStrings, ...(stringsProp ?? {}) }),\n [stringsProp]\n );\n\n const { country, language, setCountry, setLanguage } = useCountryLanguage({\n countries,\n value,\n defaultValue,\n onChange,\n persistKey,\n });\n\n const [open, setOpen] = useState(false);\n const [step, setStep] = useState<Step>(\"country\");\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n const [isMobile, setIsMobile] = useState(false);\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const popoverRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n const listboxId = useId();\n const activeOptionId = `${listboxId}-opt-${activeIndex}`;\n\n // Close on outside click / Escape.\n useClickOutside([rootRef, popoverRef], open, () => setOpen(false));\n\n // Trap focus while open.\n useFocusTrap(popoverRef, open);\n\n // Detect coarse pointers so we know when to show a mobile backdrop.\n useEffect(() => setIsMobile(isCoarsePointer()), []);\n\n // Reset transient UI state when we open.\n useEffect(() => {\n if (!open) return;\n setStep(\"country\");\n setQuery(\"\");\n setActiveIndex(0);\n // Focus the search input on open — next tick so the animation settles.\n const t = window.setTimeout(() => searchRef.current?.focus(), 10);\n return () => window.clearTimeout(t);\n }, [open]);\n\n const filtered = useMemo(() => filterCountries(countries, query), [countries, query]);\n\n // Clamp the active index whenever the filtered list changes.\n useEffect(() => {\n if (activeIndex > Math.max(0, filtered.length - 1)) setActiveIndex(0);\n }, [filtered.length, activeIndex]);\n\n const closeAndRefocus = useCallback(() => {\n setOpen(false);\n // Return focus to the trigger for good keyboard UX.\n requestAnimationFrame(() => triggerRef.current?.focus());\n }, []);\n\n const commitCountry = useCallback(\n (c: Country) => {\n setCountry(c.code);\n if (c.languages.length > 1) {\n setStep(\"language\");\n setActiveIndex(0);\n } else {\n closeAndRefocus();\n }\n },\n [setCountry, closeAndRefocus]\n );\n\n const commitLanguage = useCallback(\n (l: Language) => {\n setLanguage(l.code);\n closeAndRefocus();\n },\n [setLanguage, closeAndRefocus]\n );\n\n const onTriggerKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return;\n if (\n e.key === \"ArrowDown\" ||\n e.key === \"Enter\" ||\n e.key === \" \" ||\n e.key === \"ArrowUp\"\n ) {\n e.preventDefault();\n setOpen(true);\n }\n },\n [disabled]\n );\n\n const onListKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n const list = step === \"country\" ? filtered : country.languages;\n if (list.length === 0) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => (i + 1) % list.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => (i - 1 + list.length) % list.length);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n setActiveIndex(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n setActiveIndex(list.length - 1);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const item = list[activeIndex];\n if (!item) return;\n if (step === \"country\") commitCountry(item as Country);\n else commitLanguage(item as Language);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closeAndRefocus();\n } else if (e.key === \"Backspace\" && step === \"language\" && !query) {\n e.preventDefault();\n setStep(\"country\");\n setActiveIndex(0);\n }\n },\n [step, filtered, country, activeIndex, commitCountry, commitLanguage, closeAndRefocus, query]\n );\n\n // Ensure the active option scrolls into view during keyboard navigation.\n useEffect(() => {\n const el = document.getElementById(activeOptionId);\n if (el) el.scrollIntoView({ block: \"nearest\" });\n }, [activeOptionId]);\n\n return (\n <div\n ref={(el) => {\n rootRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) (ref as MutableRefObject<HTMLDivElement | null>).current = el;\n }}\n className={[\"cls-root\", className].filter(Boolean).join(\" \")}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"cls-trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-label={ariaLabel ?? strings.ariaLabel}\n disabled={disabled}\n onClick={() => !disabled && setOpen((v) => !v)}\n onKeyDown={onTriggerKeyDown}\n >\n {renderTrigger ? (\n renderTrigger({ country, language, open })\n ) : (\n <TriggerContent variant={triggerVariant} country={country} language={language} />\n )}\n <ChevronDown className=\"cls-trigger__chev\" />\n </button>\n\n {open && isMobile && <div className=\"cls-backdrop\" aria-hidden=\"true\" />}\n\n {open && (\n <div\n ref={popoverRef}\n role=\"dialog\"\n aria-label={strings.ariaLabel}\n data-align={align}\n tabIndex={-1}\n className={[\"cls-popover\", popoverClassName].filter(Boolean).join(\" \")}\n onKeyDown={onListKeyDown}\n >\n {step === \"country\" ? (\n <>\n <div className=\"cls-search\">\n <SearchIcon className=\"cls-search__icon\" />\n <input\n ref={searchRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeOptionId}\n aria-autocomplete=\"list\"\n className=\"cls-search__input\"\n placeholder={strings.searchPlaceholder}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setActiveIndex(0);\n }}\n />\n </div>\n\n <div className=\"cls-section-title\">\n <span>{strings.chooseCountry}</span>\n </div>\n\n {filtered.length === 0 ? (\n <div className=\"cls-empty\">{strings.emptyResults}</div>\n ) : (\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-label={strings.chooseCountry}\n className=\"cls-list\"\n >\n {filtered.map((c, i) => {\n const selected = c.code === country.code;\n return (\n <li\n key={c.code}\n id={`${listboxId}-opt-${i}`}\n role=\"option\"\n aria-selected={selected}\n data-active={i === activeIndex}\n className=\"cls-option\"\n onMouseEnter={() => setActiveIndex(i)}\n onClick={() => commitCountry(c)}\n >\n <span className=\"cls-option__flag\" aria-hidden=\"true\">\n {c.flag}\n </span>\n <span className=\"cls-option__body\">\n <span className=\"cls-option__title\">{c.name}</span>\n {c.nativeName && c.nativeName !== c.name && (\n <span className=\"cls-option__subtitle\">{c.nativeName}</span>\n )}\n </span>\n <span className=\"cls-option__meta\">\n {c.languages.length > 1 ? (\n <span className=\"cls-badge\">{c.languages.length} langs</span>\n ) : (\n <span className=\"cls-badge\">{c.languages[0]!.code.toUpperCase()}</span>\n )}\n {selected && <CheckIcon className=\"cls-check\" />}\n </span>\n </li>\n );\n })}\n </ul>\n )}\n </>\n ) : (\n <>\n <div className=\"cls-section-title\">\n <button\n type=\"button\"\n className=\"cls-back\"\n onClick={() => {\n setStep(\"country\");\n setActiveIndex(0);\n }}\n >\n <ArrowLeft width={12} height={12} />\n {strings.backToCountries}\n </button>\n <span>\n {country.flag} {country.name}\n </span>\n </div>\n\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-label={strings.chooseLanguage}\n className=\"cls-list\"\n >\n {country.languages.map((l, i) => {\n const selected = l.code === language.code;\n return (\n <li\n key={l.code}\n id={`${listboxId}-opt-${i}`}\n role=\"option\"\n aria-selected={selected}\n data-active={i === activeIndex}\n className=\"cls-option\"\n onMouseEnter={() => setActiveIndex(i)}\n onClick={() => commitLanguage(l)}\n >\n <span className=\"cls-option__body\">\n <span className=\"cls-option__title\">{l.label}</span>\n {l.nativeLabel && l.nativeLabel !== l.label && (\n <span className=\"cls-option__subtitle\">{l.nativeLabel}</span>\n )}\n </span>\n <span className=\"cls-option__meta\">\n <span className=\"cls-badge\">{l.code.toUpperCase()}</span>\n {selected && <CheckIcon className=\"cls-check\" />}\n </span>\n </li>\n );\n })}\n </ul>\n </>\n )}\n </div>\n )}\n </div>\n );\n});\n\nfunction TriggerContent({\n variant,\n country,\n language,\n}: {\n variant: \"compact\" | \"full\" | \"flag\";\n country: Country;\n language: Language;\n}) {\n if (variant === \"flag\") {\n return (\n <>\n <span className=\"cls-trigger__flag\" aria-hidden=\"true\">\n {country.flag}\n </span>\n <span className=\"cls-trigger__lang\">{language.code}</span>\n </>\n );\n }\n if (variant === \"full\") {\n return (\n <>\n <span className=\"cls-trigger__flag\" aria-hidden=\"true\">\n {country.flag}\n </span>\n <span className=\"cls-trigger__code\">{country.name}</span>\n <span className=\"cls-trigger__sep\" aria-hidden=\"true\">\n ·\n </span>\n <span className=\"cls-trigger__lang\">{language.label}</span>\n </>\n );\n }\n // compact (default)\n return (\n <>\n <span className=\"cls-trigger__flag\" aria-hidden=\"true\">\n {country.flag}\n </span>\n <span className=\"cls-trigger__code\">{country.code}</span>\n <span className=\"cls-trigger__sep\" aria-hidden=\"true\">\n ·\n </span>\n <span className=\"cls-trigger__lang\">{language.code}</span>\n </>\n );\n}\n"],
5
- "mappings": "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",
6
- "names": ["useEffect", "CountryLanguageSelector", "useMemo", "useState", "useRef", "useCallback", "jsxs", "jsx"]
7
- }
@@ -1,76 +0,0 @@
1
- {
2
- "hash": "950ed2ca",
3
- "configHash": "2a5e6a8c",
4
- "lockfileHash": "61cfa474",
5
- "browserHash": "60cf0d7d",
6
- "optimized": {
7
- "react": {
8
- "src": "../../../../node_modules/.pnpm/react@19.2.3/node_modules/react/index.js",
9
- "file": "react.js",
10
- "fileHash": "1f60aa4a",
11
- "needsInterop": true
12
- },
13
- "react-dom": {
14
- "src": "../../../../node_modules/.pnpm/react-dom@19.2.3_react@19.2.3/node_modules/react-dom/index.js",
15
- "file": "react-dom.js",
16
- "fileHash": "0e0256ce",
17
- "needsInterop": true
18
- },
19
- "react/jsx-dev-runtime": {
20
- "src": "../../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-dev-runtime.js",
21
- "file": "react_jsx-dev-runtime.js",
22
- "fileHash": "9d3f5292",
23
- "needsInterop": true
24
- },
25
- "react/jsx-runtime": {
26
- "src": "../../../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js",
27
- "file": "react_jsx-runtime.js",
28
- "fileHash": "4ed6448e",
29
- "needsInterop": true
30
- },
31
- "@asafarim/country-language-selector": {
32
- "src": "../../../../node_modules/.pnpm/@asafarim+country-language-_049cb8b81291b08ccd85a4446ad76c74/node_modules/@asafarim/country-language-selector/dist/index.js",
33
- "file": "@asafarim_country-language-selector.js",
34
- "fileHash": "32475773",
35
- "needsInterop": false
36
- },
37
- "i18next": {
38
- "src": "../../../../node_modules/.pnpm/i18next@23.16.8/node_modules/i18next/dist/esm/i18next.js",
39
- "file": "i18next.js",
40
- "fileHash": "8d6542ca",
41
- "needsInterop": false
42
- },
43
- "i18next-browser-languagedetector": {
44
- "src": "../../../../node_modules/.pnpm/i18next-browser-languagedetector@7.2.2/node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js",
45
- "file": "i18next-browser-languagedetector.js",
46
- "fileHash": "1b0de3dc",
47
- "needsInterop": false
48
- },
49
- "react-dom/client": {
50
- "src": "../../../../node_modules/.pnpm/react-dom@19.2.3_react@19.2.3/node_modules/react-dom/client.js",
51
- "file": "react-dom_client.js",
52
- "fileHash": "7626ba31",
53
- "needsInterop": true
54
- },
55
- "react-i18next": {
56
- "src": "../../../../node_modules/.pnpm/react-i18next@13.5.0_i18nex_6dec3e272014f80cb40c06a5db44526d/node_modules/react-i18next/dist/es/index.js",
57
- "file": "react-i18next.js",
58
- "fileHash": "6dfbaad6",
59
- "needsInterop": false
60
- }
61
- },
62
- "chunks": {
63
- "chunk-E6BG6WAU": {
64
- "file": "chunk-E6BG6WAU.js"
65
- },
66
- "chunk-MVARZQEG": {
67
- "file": "chunk-MVARZQEG.js"
68
- },
69
- "chunk-B3AHR5EX": {
70
- "file": "chunk-B3AHR5EX.js"
71
- },
72
- "chunk-5WRI5ZAA": {
73
- "file": "chunk-5WRI5ZAA.js"
74
- }
75
- }
76
- }
@@ -1,30 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __commonJS = (cb, mod) => function __require() {
8
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
- // If the importer is in node compatibility mode or this is not an ESM
20
- // file that has been converted to a CommonJS file using a Babel-
21
- // compatible transform (i.e. "__esModule" has not been set), then set
22
- // "default" to the CommonJS "module.exports" for node compatibility.
23
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
- mod
25
- ));
26
-
27
- export {
28
- __commonJS,
29
- __toESM
30
- };
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }