@gaddario98/react-core 2.0.8 → 2.0.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../localization/config.ts","../../localization/core.ts","../../localization/hooks.ts","../../localization/server.ts","../../localization/useTranslatedText.ts"],"sourcesContent":["import { atomStateGenerator } from '@gaddario98/react-state'\nimport type { Locale, TranslationResources } from './types'\n\nexport interface LocalizationConfigProps {\n currentLocale: Locale\n locales: Record<Locale, TranslationResources>\n}\n\n// Lazy initialization to avoid side effects at module load time\nconst _localizationConfig: LocalizationConfigProps = {\n currentLocale: 'it',\n locales: {\n it: {},\n },\n}\n\nexport const {\n atom: localizationConfigAtom,\n useValue: useLocalizationConfigValue,\n useState: useLocalizationConfigState,\n useReset: useLocalizationConfigReset,\n} = atomStateGenerator<LocalizationConfigProps>({\n key: 'localizationConfig',\n defaultValue: _localizationConfig,\n persist: true,\n})\n\n/**\n * Hook per gestire le operazioni di localization\n */\nexport const useLocalizationActions = () => {\n const [config, setConfig] = useLocalizationConfigState()\n return {\n /**\n * Aggiunge o aggiorna una locale con le sue risorse\n */\n addLocale: (locale: Locale, resources: TranslationResources) => {\n setConfig({\n ...config,\n locales: {\n ...config.locales,\n [locale]: resources,\n },\n })\n },\n\n /**\n * Switch alla locale specificata\n */\n switchLocale: (locale: Locale) => {\n setConfig({\n ...config,\n currentLocale: locale,\n })\n },\n\n /**\n * Inizializza con una locale di default\n */\n initializeLocale: (locale: Locale, resources: TranslationResources) => {\n setConfig({\n currentLocale: locale,\n locales: {\n [locale]: resources,\n },\n })\n },\n }\n}\n","import type { TranslationOptions, TranslationResources } from './types'\n\n/**\n * Risolve una chiave di traduzione dalle risorse fornite.\n * Supporta la notazione punto per oggetti annidati (es. 'common.buttons.save').\n */\nconst getNestedValue = (obj: any, key: string): string | undefined => {\n return key.split('.').reduce((acc, part) => {\n return acc && acc[part] !== undefined ? acc[part] : undefined\n }, obj)\n}\n\n/**\n * Formatta un numero secondo le opzioni specificate\n */\nconst formatNumber = (\n value: number,\n locale: string = 'en-US',\n formatOptions?: Intl.NumberFormatOptions\n): string => {\n try {\n return new Intl.NumberFormat(locale, formatOptions).format(value)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Formatta una data secondo le opzioni specificate\n */\nconst formatDate = (\n value: Date | number | string,\n locale: string = 'en-US',\n formatOptions?: Intl.DateTimeFormatOptions\n): string => {\n try {\n const date = value instanceof Date ? value : new Date(value)\n return new Intl.DateTimeFormat(locale, formatOptions).format(date)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Formatta una valuta secondo le opzioni specificate\n */\nconst formatCurrency = (\n value: number,\n locale: string = 'en-US',\n currency: string = 'USD',\n formatOptions?: Intl.NumberFormatOptions\n): string => {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...formatOptions,\n }).format(value)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Gestisce la pluralizzazione secondo ICU MessageFormat\n * Formato: {{count, plural, =0{nessuno} one{un elemento} other{# elementi}}}\n */\nconst handlePlural = (count: number, pattern: string): string => {\n // Estrae le varie forme: =0{...} one{...} few{...} many{...} other{...}\n const forms: Record<string, string> = {}\n const regex = /(=\\d+|zero|one|two|few|many|other)\\{([^}]*)\\}/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(pattern)) !== null) {\n forms[match[1]] = match[2]\n }\n\n // Controlla forme esatte prima (=0, =1, etc.)\n const exactForm = forms[`=${count}`]\n if (exactForm !== undefined) {\n return exactForm.replace(/#/g, String(count))\n }\n\n // Regole di pluralizzazione semplificate (inglese-based)\n let pluralForm: string\n if (count === 0 && forms.zero) {\n pluralForm = forms.zero\n } else if (count === 1 && forms.one) {\n pluralForm = forms.one\n } else if (count === 2 && forms.two) {\n pluralForm = forms.two\n } else if (forms.other) {\n pluralForm = forms.other\n } else {\n pluralForm = pattern\n }\n\n // Sostituisce # con il conteggio\n return pluralForm.replace(/#/g, String(count))\n}\n\n/**\n * Gestisce la selezione secondo ICU MessageFormat\n * Formato: {{gender, select, male{lui} female{lei} other{loro}}}\n */\nconst handleSelect = (value: string, pattern: string): string => {\n const forms: Record<string, string> = {}\n const regex = /(\\w+)\\{([^}]*)\\}/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(pattern)) !== null) {\n forms[match[1]] = match[2]\n }\n\n return forms[value] || forms.other || pattern\n}\n\n/**\n * Effettua l'interpolazione avanzata dei parametri nella stringa di traduzione.\n * Supporta:\n * - Interpolazione semplice: {{name}}\n * - Formattazione numeri: {{count, number}}\n * - Formattazione date: {{date, date}}\n * - Formattazione valuta: {{price, currency}}\n * - Pluralizzazione: {{count, plural, =0{nessuno} one{un elemento} other{# elementi}}}\n * - Selezione: {{gender, select, male{lui} female{lei} other{loro}}}\n */\nconst interpolate = (\n text: string,\n options?: TranslationOptions,\n locale: string = 'en-US'\n): string => {\n if (!options) return text\n\n // Pattern per catturare interpolazioni complesse: {{key}} o {{key, format, pattern}}\n return text.replace(/\\{\\{([^}]+)\\}\\}/g, (match, content) => {\n const parts = content.split(',').map((p: string) => p.trim())\n const key = parts[0]\n const value = options[key]\n\n if (value === undefined) {\n return match // Mantiene il placeholder se il valore non esiste\n }\n\n // Nessun formato specificato - interpolazione semplice\n if (parts.length === 1) {\n return String(value)\n }\n\n const format = parts[1]\n const formatOpts = options.formatOptions?.[key]\n\n switch (format) {\n case 'number': {\n if (typeof value !== 'number') return String(value)\n return formatNumber(value, locale, formatOpts?.number)\n }\n\n case 'date': {\n return formatDate(value, locale, formatOpts?.date)\n }\n\n case 'currency': {\n if (typeof value !== 'number') return String(value)\n const currency = formatOpts?.currency?.currency || 'USD'\n return formatCurrency(value, locale, currency, formatOpts?.currency)\n }\n\n case 'plural': {\n if (typeof value !== 'number') return String(value)\n const pattern = parts.slice(2).join(',').trim()\n return handlePlural(value, pattern)\n }\n\n case 'select': {\n const pattern = parts.slice(2).join(',').trim()\n return handleSelect(String(value), pattern)\n }\n\n default:\n return String(value)\n }\n })\n}\n\n/**\n * Funzione core per risolvere una traduzione.\n */\nexport const resolveTranslation = (\n key: string,\n resources: TranslationResources,\n options?: TranslationOptions,\n locale: string = 'en-US'\n): string => {\n const rawValue = getNestedValue(resources, key)\n\n // Se non trovato, usa defaultValue se presente, altrimenti la chiave stessa\n if (rawValue === undefined) {\n if (options && options.defaultValue) {\n return interpolate(options.defaultValue, options, locale)\n }\n return key\n }\n\n return interpolate(String(rawValue), options, locale)\n}\n","import { useMemo } from 'react'\nimport { useLocalizationConfigValue } from './config'\nimport { resolveTranslation } from './core';\nimport type { Locale, TranslateFunction } from './types'\n\nexport const useTranslation = (\n _ns?: string,\n): { t: TranslateFunction; locale: Locale } => {\n const { currentLocale, locales } = useLocalizationConfigValue()\n const resources = useMemo(\n () => locales[currentLocale],\n [locales, currentLocale],\n )\n\n const t = useMemo<TranslateFunction>(() => {\n return (key, options) =>\n resolveTranslation(\n _ns ? `${_ns}.${key}` : key,\n resources,\n options,\n currentLocale,\n )\n }, [resources, currentLocale, _ns])\n\n return { t, locale: currentLocale }\n}\n","import { resolveTranslation } from './core'\nimport type { Locale, TranslateFunction, TranslationResources } from './types'\n\n/**\n * Crea un'istanza di traduzione per l'uso lato server (o fuori dai componenti React).\n */\nexport const createServerTranslator = (\n resources: TranslationResources,\n locale: Locale = 'it', // Default locale hardcoded per ora, o passato come argomento\n): { t: TranslateFunction; locale: Locale } => {\n const t: TranslateFunction = (key, options) => {\n return resolveTranslation(key, resources, options)\n }\n\n return { t, locale }\n}\n","import { useCallback } from 'react'\nimport { useTranslation } from './hooks'\nimport type { TranslationOptions } from './types'\n\n// Mantengo l'interfaccia TranslationFunction per compatibilità\nexport type TranslationFunction = (\n key: string,\n options?: TranslationOptions,\n) => string\n\n/**\n * Hook per tradurre testi che si adatta al sistema di traduzione interno.\n * Wrapper di retro-compatibilità per useTranslation.\n *\n * @param ns - Namespace opzionale (ignorato nella nuova implementazione)\n * @returns Un oggetto con la funzione traslateText (e alias t)\n */\nexport const useTranslatedText = (ns?: string) => {\n const { t } = useTranslation(ns)\n\n const traslateText = useCallback(\n (text: string, options?: TranslationOptions) => {\n if (!text) return ''\n return t(text, options)\n },\n [t],\n )\n\n return { traslateText, t: traslateText }\n}\n"],"names":["_localizationConfig","currentLocale","locales","it","atom","localizationConfigAtom","useValue","useLocalizationConfigValue","useState","useLocalizationConfigState","useReset","useLocalizationConfigReset","atomStateGenerator","key","defaultValue","persist","useLocalizationActions","$","_c","config","setConfig","t0","t1","locale","resources","Object","assign","locale_0","t2","locale_1","resources_0","t3","addLocale","switchLocale","initializeLocale","getNestedValue","obj","split","reduce","acc","part","undefined","formatNumber","value","formatOptions","Intl","NumberFormat","format","_a","String","formatDate","date","Date","DateTimeFormat","formatCurrency","currency","style","handlePlural","count","pattern","forms","regex","match","exec","exactForm","replace","pluralForm","zero","one","two","other","handleSelect","interpolate","text","options","content","parts","map","p","trim","length","formatOpts","number","_b","slice","join","resolveTranslation","rawValue","useTranslation","_ns","t","createServerTranslator","useTranslatedText","ns","traslateText"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../state/storage.ts","../../state/atomStateGenerator.ts","../../localization/config.ts","../../localization/core.ts","../../localization/hooks.ts","../../localization/server.ts","../../localization/useTranslatedText.ts"],"sourcesContent":["import { deflateSync, inflateSync, strFromU8, strToU8 } from 'fflate'\n\nexport type SyncStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n\nconst RAW_PREFIX = 'storage:raw:'\nconst DEFLATE_PREFIX = 'storage:deflate:v1:'\n\nconst isProbablyJson = (value: string) => {\n if (!value) return false\n const c = value.charCodeAt(0)\n // { [ \" digits, t/f/n (true/false/null)\n return (\n c === 123 ||\n c === 91 ||\n c === 34 ||\n (c >= 48 && c <= 57) ||\n c === 45 ||\n c === 116 ||\n c === 102 ||\n c === 110\n )\n}\n\nconst u8ToBase64 = (bytes: Uint8Array) => {\n let binary = ''\n const chunkSize = 0x8000\n for (let i = 0; i < bytes.length; i += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize))\n }\n return btoa(binary)\n}\n\nconst base64ToU8 = (base64: string) => {\n const binary = atob(base64)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\ntype CompressedStorageOptions = {\n minSizeToCompress?: number\n deflateLevel?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9\n writeDebounceMs?: number\n}\n\nconst createCompressedStorage = (\n base: SyncStorage,\n options: CompressedStorageOptions = {},\n): SyncStorage => {\n const {\n minSizeToCompress = 1024,\n deflateLevel = 1,\n writeDebounceMs = 50,\n } = options\n\n const pendingWrites = new Map<string, string>()\n let flushTimer: number | undefined\n let lifecycleHooksInstalled = false\n\n const flush = () => {\n flushTimer = undefined\n for (const [key, value] of pendingWrites) {\n try {\n if (value.length < minSizeToCompress) {\n base.setItem(key, RAW_PREFIX + value)\n continue\n }\n\n const input = strToU8(value)\n const compressed = deflateSync(input, { level: deflateLevel })\n base.setItem(key, DEFLATE_PREFIX + u8ToBase64(compressed))\n } catch (error) {\n console.error('Error setting item:', error)\n try {\n base.setItem(key, RAW_PREFIX + value)\n } catch {\n // ignore\n }\n }\n }\n pendingWrites.clear()\n }\n\n const scheduleFlush = () => {\n if (flushTimer != null) return\n if (!lifecycleHooksInstalled && typeof window !== 'undefined') {\n lifecycleHooksInstalled = true\n window.addEventListener('beforeunload', flush)\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') flush()\n })\n }\n flushTimer = globalThis.setTimeout(\n flush,\n writeDebounceMs,\n ) as unknown as number\n }\n\n return {\n getItem: (key: string): string | null => {\n try {\n const stored = base.getItem(key)\n if (!stored) return null\n\n if (stored.startsWith(RAW_PREFIX)) {\n return stored.slice(RAW_PREFIX.length)\n }\n\n if (stored.startsWith(DEFLATE_PREFIX)) {\n const b64 = stored.slice(DEFLATE_PREFIX.length)\n const bytes = base64ToU8(b64)\n const decompressed = inflateSync(bytes)\n return strFromU8(decompressed)\n }\n\n // Back-compat: older versions may have stored raw JSON without any prefix\n if (isProbablyJson(stored)) return stored\n\n return null\n } catch (error) {\n console.error('Error getting item:', error)\n return null\n }\n },\n\n setItem: (key: string, value: string) => {\n try {\n // Some upstream serializers can return `undefined` (e.g. JSON.stringify(undefined)).\n const rawValue = value as unknown as string | null | undefined\n if (rawValue == null) {\n pendingWrites.delete(key)\n base.removeItem(key)\n return\n }\n\n const stringValue = typeof rawValue === 'string' ? rawValue : String(rawValue)\n pendingWrites.set(key, stringValue)\n scheduleFlush()\n } catch (error) {\n console.error('Error setting item:', error)\n }\n },\n\n removeItem: (key: string) => {\n try {\n pendingWrites.delete(key)\n base.removeItem(key)\n } catch (error) {\n console.error('Error removing item:', error)\n }\n },\n }\n}\n\nconst baseStorage: SyncStorage = {\n getItem: (key) => {\n if (typeof localStorage === 'undefined') return null\n return localStorage.getItem(key)\n },\n setItem: (key, value) => {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(key, value)\n },\n removeItem: (key) => {\n if (typeof localStorage === 'undefined') return\n localStorage.removeItem(key)\n },\n}\n\nexport let storage: SyncStorage = createCompressedStorage(baseStorage)\n\nexport const setCustomStorage = (newStorage: SyncStorage) => {\n storage = newStorage\n}\n","import { atom, useAtom } from 'jotai'\nimport { atomWithStorage, createJSONStorage } from 'jotai/utils'\nimport { storage } from './storage'\nimport type { PrimitiveAtom } from 'jotai'\n\nexport type { PrimitiveAtom } from 'jotai'\n\nexport type AtomGeneratorOptions<T> = {\n key: string\n defaultValue: T\n persist?: boolean\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n}\n\nexport type AtomState<T> = {\n atom: PrimitiveAtom<T>\n useValue: () => T\n useState: () => [T, (value: T) => void]\n useReset: () => () => void\n}\n\n// Overload per persist = true\nexport function atomStateGenerator<T>(\n options: AtomGeneratorOptions<T> & { persist: true },\n): AtomState<T>\n\n// Overload per persist = false o undefined\nexport function atomStateGenerator<T>(\n options: AtomGeneratorOptions<T> & { persist?: false },\n): AtomState<T>\n\n// Implementazione\nexport function atomStateGenerator<T>({\n key,\n defaultValue,\n persist = false,\n storage: customStorage,\n}: AtomGeneratorOptions<T>): AtomState<T> {\n const resolvedStorage = customStorage || storage\n\n // Usa atomWithStorage solo se persist è true, altrimenti atom normale\n const jotaiAtom = persist\n ? atomWithStorage<T>(\n key,\n defaultValue,\n createJSONStorage<T>(() => resolvedStorage),\n )\n : atom<T>(defaultValue)\n\n const useValue = () => {\n const [value] = useAtom(jotaiAtom as PrimitiveAtom<T>)\n return value\n }\n\n const useState = () => {\n const [value, setValue] = useAtom(jotaiAtom as PrimitiveAtom<T>)\n return [value, setValue] as [T, (value: T) => void]\n }\n\n const useReset = () => {\n const [, setValue] = useAtom(jotaiAtom as PrimitiveAtom<T>)\n return () => {\n setValue(defaultValue)\n // Rimuovi dallo storage solo se era persistente\n if (persist) {\n resolvedStorage.removeItem(key)\n }\n }\n }\n\n return {\n atom: jotaiAtom as PrimitiveAtom<T>,\n useValue,\n useState,\n useReset,\n }\n}\n","import { atomStateGenerator } from '@gaddario98/react-state'\nimport type { Locale, TranslationResources } from './types'\n\nexport interface LocalizationConfigProps {\n currentLocale: Locale\n locales: Record<Locale, TranslationResources>\n}\n\n// Lazy initialization to avoid side effects at module load time\nconst _localizationConfig: LocalizationConfigProps = {\n currentLocale: 'it',\n locales: {\n it: {},\n },\n}\n\nexport const {\n atom: localizationConfigAtom,\n useValue: useLocalizationConfigValue,\n useState: useLocalizationConfigState,\n useReset: useLocalizationConfigReset,\n} = atomStateGenerator<LocalizationConfigProps>({\n key: 'localizationConfig',\n defaultValue: _localizationConfig,\n persist: true,\n})\n\n/**\n * Hook per gestire le operazioni di localization\n */\nexport const useLocalizationActions = () => {\n const [config, setConfig] = useLocalizationConfigState()\n return {\n /**\n * Aggiunge o aggiorna una locale con le sue risorse\n */\n addLocale: (locale: Locale, resources: TranslationResources) => {\n setConfig({\n ...config,\n locales: {\n ...config.locales,\n [locale]: resources,\n },\n })\n },\n\n /**\n * Switch alla locale specificata\n */\n switchLocale: (locale: Locale) => {\n setConfig({\n ...config,\n currentLocale: locale,\n })\n },\n\n /**\n * Inizializza con una locale di default\n */\n initializeLocale: (locale: Locale, resources: TranslationResources) => {\n setConfig({\n currentLocale: locale,\n locales: {\n [locale]: resources,\n },\n })\n },\n }\n}\n","import type { TranslationOptions, TranslationResources } from './types'\n\n/**\n * Risolve una chiave di traduzione dalle risorse fornite.\n * Supporta la notazione punto per oggetti annidati (es. 'common.buttons.save').\n */\nconst getNestedValue = (obj: any, key: string): string | undefined => {\n return key.split('.').reduce((acc, part) => {\n return acc && acc[part] !== undefined ? acc[part] : undefined\n }, obj)\n}\n\n/**\n * Formatta un numero secondo le opzioni specificate\n */\nconst formatNumber = (\n value: number,\n locale: string = 'en-US',\n formatOptions?: Intl.NumberFormatOptions\n): string => {\n try {\n return new Intl.NumberFormat(locale, formatOptions).format(value)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Formatta una data secondo le opzioni specificate\n */\nconst formatDate = (\n value: Date | number | string,\n locale: string = 'en-US',\n formatOptions?: Intl.DateTimeFormatOptions\n): string => {\n try {\n const date = value instanceof Date ? value : new Date(value)\n return new Intl.DateTimeFormat(locale, formatOptions).format(date)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Formatta una valuta secondo le opzioni specificate\n */\nconst formatCurrency = (\n value: number,\n locale: string = 'en-US',\n currency: string = 'USD',\n formatOptions?: Intl.NumberFormatOptions\n): string => {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...formatOptions,\n }).format(value)\n } catch {\n return String(value)\n }\n}\n\n/**\n * Gestisce la pluralizzazione secondo ICU MessageFormat\n * Formato: {{count, plural, =0{nessuno} one{un elemento} other{# elementi}}}\n */\nconst handlePlural = (count: number, pattern: string): string => {\n // Estrae le varie forme: =0{...} one{...} few{...} many{...} other{...}\n const forms: Record<string, string> = {}\n const regex = /(=\\d+|zero|one|two|few|many|other)\\{([^}]*)\\}/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(pattern)) !== null) {\n forms[match[1]] = match[2]\n }\n\n // Controlla forme esatte prima (=0, =1, etc.)\n const exactForm = forms[`=${count}`]\n if (exactForm !== undefined) {\n return exactForm.replace(/#/g, String(count))\n }\n\n // Regole di pluralizzazione semplificate (inglese-based)\n let pluralForm: string\n if (count === 0 && forms.zero) {\n pluralForm = forms.zero\n } else if (count === 1 && forms.one) {\n pluralForm = forms.one\n } else if (count === 2 && forms.two) {\n pluralForm = forms.two\n } else if (forms.other) {\n pluralForm = forms.other\n } else {\n pluralForm = pattern\n }\n\n // Sostituisce # con il conteggio\n return pluralForm.replace(/#/g, String(count))\n}\n\n/**\n * Gestisce la selezione secondo ICU MessageFormat\n * Formato: {{gender, select, male{lui} female{lei} other{loro}}}\n */\nconst handleSelect = (value: string, pattern: string): string => {\n const forms: Record<string, string> = {}\n const regex = /(\\w+)\\{([^}]*)\\}/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(pattern)) !== null) {\n forms[match[1]] = match[2]\n }\n\n return forms[value] || forms.other || pattern\n}\n\n/**\n * Effettua l'interpolazione avanzata dei parametri nella stringa di traduzione.\n * Supporta:\n * - Interpolazione semplice: {{name}}\n * - Formattazione numeri: {{count, number}}\n * - Formattazione date: {{date, date}}\n * - Formattazione valuta: {{price, currency}}\n * - Pluralizzazione: {{count, plural, =0{nessuno} one{un elemento} other{# elementi}}}\n * - Selezione: {{gender, select, male{lui} female{lei} other{loro}}}\n */\nconst interpolate = (\n text: string,\n options?: TranslationOptions,\n locale: string = 'en-US'\n): string => {\n if (!options) return text\n\n // Pattern per catturare interpolazioni complesse: {{key}} o {{key, format, pattern}}\n return text.replace(/\\{\\{([^}]+)\\}\\}/g, (match, content) => {\n const parts = content.split(',').map((p: string) => p.trim())\n const key = parts[0]\n const value = options[key]\n\n if (value === undefined) {\n return match // Mantiene il placeholder se il valore non esiste\n }\n\n // Nessun formato specificato - interpolazione semplice\n if (parts.length === 1) {\n return String(value)\n }\n\n const format = parts[1]\n const formatOpts = options.formatOptions?.[key]\n\n switch (format) {\n case 'number': {\n if (typeof value !== 'number') return String(value)\n return formatNumber(value, locale, formatOpts?.number)\n }\n\n case 'date': {\n return formatDate(value, locale, formatOpts?.date)\n }\n\n case 'currency': {\n if (typeof value !== 'number') return String(value)\n const currency = formatOpts?.currency?.currency || 'USD'\n return formatCurrency(value, locale, currency, formatOpts?.currency)\n }\n\n case 'plural': {\n if (typeof value !== 'number') return String(value)\n const pattern = parts.slice(2).join(',').trim()\n return handlePlural(value, pattern)\n }\n\n case 'select': {\n const pattern = parts.slice(2).join(',').trim()\n return handleSelect(String(value), pattern)\n }\n\n default:\n return String(value)\n }\n })\n}\n\n/**\n * Funzione core per risolvere una traduzione.\n */\nexport const resolveTranslation = (\n key: string,\n resources: TranslationResources,\n options?: TranslationOptions,\n locale: string = 'en-US'\n): string => {\n const rawValue = getNestedValue(resources, key)\n\n // Se non trovato, usa defaultValue se presente, altrimenti la chiave stessa\n if (rawValue === undefined) {\n if (options && options.defaultValue) {\n return interpolate(options.defaultValue, options, locale)\n }\n return key\n }\n\n return interpolate(String(rawValue), options, locale)\n}\n","import { useMemo } from 'react'\nimport { useLocalizationConfigValue } from './config'\nimport { resolveTranslation } from './core';\nimport type { Locale, TranslateFunction } from './types'\n\nexport const useTranslation = (\n _ns?: string,\n): { t: TranslateFunction; locale: Locale } => {\n const { currentLocale, locales } = useLocalizationConfigValue()\n const resources = useMemo(\n () => locales[currentLocale],\n [locales, currentLocale],\n )\n\n const t = useMemo<TranslateFunction>(() => {\n return (key, options) =>\n resolveTranslation(\n _ns ? `${_ns}.${key}` : key,\n resources,\n options,\n currentLocale,\n )\n }, [resources, currentLocale, _ns])\n\n return { t, locale: currentLocale }\n}\n","import { resolveTranslation } from './core'\nimport type { Locale, TranslateFunction, TranslationResources } from './types'\n\n/**\n * Crea un'istanza di traduzione per l'uso lato server (o fuori dai componenti React).\n */\nexport const createServerTranslator = (\n resources: TranslationResources,\n locale: Locale = 'it', // Default locale hardcoded per ora, o passato come argomento\n): { t: TranslateFunction; locale: Locale } => {\n const t: TranslateFunction = (key, options) => {\n return resolveTranslation(key, resources, options)\n }\n\n return { t, locale }\n}\n","import { useCallback } from 'react'\nimport { useTranslation } from './hooks'\nimport type { TranslationOptions } from './types'\n\n// Mantengo l'interfaccia TranslationFunction per compatibilità\nexport type TranslationFunction = (\n key: string,\n options?: TranslationOptions,\n) => string\n\n/**\n * Hook per tradurre testi che si adatta al sistema di traduzione interno.\n * Wrapper di retro-compatibilità per useTranslation.\n *\n * @param ns - Namespace opzionale (ignorato nella nuova implementazione)\n * @returns Un oggetto con la funzione traslateText (e alias t)\n */\nexport const useTranslatedText = (ns?: string) => {\n const { t } = useTranslation(ns)\n\n const traslateText = useCallback(\n (text: string, options?: TranslationOptions) => {\n if (!text) return ''\n return t(text, options)\n },\n [t],\n )\n\n return { traslateText, t: traslateText }\n}\n"],"names":["RAW_PREFIX","DEFLATE_PREFIX","isProbablyJson","value","c","charCodeAt","u8ToBase64","bytes","binary","chunkSize","i","length","String","fromCharCode","subarray","btoa","base64ToU8","base64","atob","Uint8Array","createCompressedStorage","base","options","minSizeToCompress","deflateLevel","writeDebounceMs","pendingWrites","Map","flushTimer","lifecycleHooksInstalled","flush","undefined","key","setItem","input","strToU8","compressed","deflateSync","level","error","console","_a","clear","scheduleFlush","window","addEventListener","document","visibilityState","globalThis","setTimeout","getItem","stored","startsWith","slice","b64","decompressed","inflateSync","strFromU8","rawValue","delete","removeItem","stringValue","set","baseStorage","localStorage","storage","atomStateGenerator","defaultValue","persist","customStorage","resolvedStorage","jotaiAtom","atomWithStorage","createJSONStorage","atom","useValue","useAtom","useState","$","_c","setValue","t0","useReset","_localizationConfig","currentLocale","locales","it","localizationConfigAtom","useLocalizationConfigValue","useLocalizationConfigState","useLocalizationConfigReset","useLocalizationActions","config","setConfig","t1","locale","resources","Object","assign","locale_0","t2","locale_1","resources_0","t3","addLocale","switchLocale","initializeLocale","getNestedValue","obj","split","reduce","acc","part","formatNumber","formatOptions","Intl","NumberFormat","format","formatDate","date","Date","DateTimeFormat","formatCurrency","currency","style","handlePlural","count","pattern","forms","regex","match","exec","exactForm","replace","pluralForm","zero","one","two","other","handleSelect","interpolate","text","content","parts","map","p","trim","formatOpts","number","_b","join","resolveTranslation","useTranslation","_ns","t","createServerTranslator","useTranslatedText","ns","traslateText"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as _gaddario98_react_state from '@gaddario98/react-state';
1
+ import * as jotai_vanilla_atom from 'jotai/vanilla/atom';
2
2
 
3
3
  interface NotificationMessage {
4
4
  id: string;
@@ -29,7 +29,7 @@ declare const useNotification: (ns?: string) => {
29
29
  clearNotification: () => void;
30
30
  };
31
31
 
32
- declare const notificationAtom: _gaddario98_react_state.PrimitiveAtom<NotificationMessage | null>;
32
+ declare const notificationAtom: jotai_vanilla_atom.PrimitiveAtom<NotificationMessage | null>;
33
33
  declare const useNotificationValue: () => NotificationMessage | null;
34
34
  declare const useNotificationState: () => [NotificationMessage | null, (value: NotificationMessage | null) => void];
35
35
 
@@ -1,10 +1,192 @@
1
- 'use strict';var compilerRuntime=require('react/compiler-runtime'),react=require('react'),reactState=require('@gaddario98/react-state');const {
1
+ 'use strict';var compilerRuntime=require('react/compiler-runtime'),react=require('react'),jotai=require('jotai'),utils=require('jotai/utils'),fflate=require('fflate');const RAW_PREFIX = 'storage:raw:';
2
+ const DEFLATE_PREFIX = 'storage:deflate:v1:';
3
+ const isProbablyJson = value => {
4
+ if (!value) return false;
5
+ const c = value.charCodeAt(0);
6
+ // { [ " digits, t/f/n (true/false/null)
7
+ return c === 123 || c === 91 || c === 34 || c >= 48 && c <= 57 || c === 45 || c === 116 || c === 102 || c === 110;
8
+ };
9
+ const u8ToBase64 = bytes => {
10
+ let binary = '';
11
+ const chunkSize = 0x8000;
12
+ for (let i = 0; i < bytes.length; i += chunkSize) {
13
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));
14
+ }
15
+ return btoa(binary);
16
+ };
17
+ const base64ToU8 = base64 => {
18
+ const binary = atob(base64);
19
+ const bytes = new Uint8Array(binary.length);
20
+ for (let i = 0; i < binary.length; i++) {
21
+ bytes[i] = binary.charCodeAt(i);
22
+ }
23
+ return bytes;
24
+ };
25
+ const createCompressedStorage = (base, options = {}) => {
26
+ const {
27
+ minSizeToCompress = 1024,
28
+ deflateLevel = 1,
29
+ writeDebounceMs = 50
30
+ } = options;
31
+ const pendingWrites = new Map();
32
+ let flushTimer;
33
+ let lifecycleHooksInstalled = false;
34
+ const flush = () => {
35
+ flushTimer = undefined;
36
+ for (const [key, value] of pendingWrites) {
37
+ try {
38
+ if (value.length < minSizeToCompress) {
39
+ base.setItem(key, RAW_PREFIX + value);
40
+ continue;
41
+ }
42
+ const input = fflate.strToU8(value);
43
+ const compressed = fflate.deflateSync(input, {
44
+ level: deflateLevel
45
+ });
46
+ base.setItem(key, DEFLATE_PREFIX + u8ToBase64(compressed));
47
+ } catch (error) {
48
+ console.error('Error setting item:', error);
49
+ try {
50
+ base.setItem(key, RAW_PREFIX + value);
51
+ } catch (_a) {
52
+ // ignore
53
+ }
54
+ }
55
+ }
56
+ pendingWrites.clear();
57
+ };
58
+ const scheduleFlush = () => {
59
+ if (flushTimer != null) return;
60
+ if (!lifecycleHooksInstalled && typeof window !== 'undefined') {
61
+ lifecycleHooksInstalled = true;
62
+ window.addEventListener('beforeunload', flush);
63
+ document.addEventListener('visibilitychange', () => {
64
+ if (document.visibilityState === 'hidden') flush();
65
+ });
66
+ }
67
+ flushTimer = globalThis.setTimeout(flush, writeDebounceMs);
68
+ };
69
+ return {
70
+ getItem: key => {
71
+ try {
72
+ const stored = base.getItem(key);
73
+ if (!stored) return null;
74
+ if (stored.startsWith(RAW_PREFIX)) {
75
+ return stored.slice(RAW_PREFIX.length);
76
+ }
77
+ if (stored.startsWith(DEFLATE_PREFIX)) {
78
+ const b64 = stored.slice(DEFLATE_PREFIX.length);
79
+ const bytes = base64ToU8(b64);
80
+ const decompressed = fflate.inflateSync(bytes);
81
+ return fflate.strFromU8(decompressed);
82
+ }
83
+ // Back-compat: older versions may have stored raw JSON without any prefix
84
+ if (isProbablyJson(stored)) return stored;
85
+ return null;
86
+ } catch (error) {
87
+ console.error('Error getting item:', error);
88
+ return null;
89
+ }
90
+ },
91
+ setItem: (key, value) => {
92
+ try {
93
+ // Some upstream serializers can return `undefined` (e.g. JSON.stringify(undefined)).
94
+ const rawValue = value;
95
+ if (rawValue == null) {
96
+ pendingWrites.delete(key);
97
+ base.removeItem(key);
98
+ return;
99
+ }
100
+ const stringValue = typeof rawValue === 'string' ? rawValue : String(rawValue);
101
+ pendingWrites.set(key, stringValue);
102
+ scheduleFlush();
103
+ } catch (error) {
104
+ console.error('Error setting item:', error);
105
+ }
106
+ },
107
+ removeItem: key => {
108
+ try {
109
+ pendingWrites.delete(key);
110
+ base.removeItem(key);
111
+ } catch (error) {
112
+ console.error('Error removing item:', error);
113
+ }
114
+ }
115
+ };
116
+ };
117
+ const baseStorage = {
118
+ getItem: key => {
119
+ if (typeof localStorage === 'undefined') return null;
120
+ return localStorage.getItem(key);
121
+ },
122
+ setItem: (key, value) => {
123
+ if (typeof localStorage === 'undefined') return;
124
+ localStorage.setItem(key, value);
125
+ },
126
+ removeItem: key => {
127
+ if (typeof localStorage === 'undefined') return;
128
+ localStorage.removeItem(key);
129
+ }
130
+ };
131
+ let storage = createCompressedStorage(baseStorage);// Implementazione
132
+ function atomStateGenerator({
133
+ key,
134
+ defaultValue,
135
+ persist = false,
136
+ storage: customStorage
137
+ }) {
138
+ const resolvedStorage = customStorage || storage;
139
+ // Usa atomWithStorage solo se persist è true, altrimenti atom normale
140
+ const jotaiAtom = persist ? utils.atomWithStorage(key, defaultValue, utils.createJSONStorage(() => resolvedStorage)) : jotai.atom(defaultValue);
141
+ const useValue = () => {
142
+ const [value] = jotai.useAtom(jotaiAtom);
143
+ return value;
144
+ };
145
+ const useState = () => {
146
+ const $ = compilerRuntime.c(3);
147
+ const [value, setValue] = jotai.useAtom(jotaiAtom);
148
+ let t0;
149
+ if ($[0] !== setValue || $[1] !== value) {
150
+ t0 = [value, setValue];
151
+ $[0] = setValue;
152
+ $[1] = value;
153
+ $[2] = t0;
154
+ } else {
155
+ t0 = $[2];
156
+ }
157
+ return t0;
158
+ };
159
+ const useReset = () => {
160
+ const $ = compilerRuntime.c(2);
161
+ const [, setValue] = jotai.useAtom(jotaiAtom);
162
+ let t0;
163
+ if ($[0] !== setValue) {
164
+ t0 = () => {
165
+ setValue(defaultValue);
166
+ if (persist) {
167
+ resolvedStorage.removeItem(key);
168
+ }
169
+ };
170
+ $[0] = setValue;
171
+ $[1] = t0;
172
+ } else {
173
+ t0 = $[1];
174
+ }
175
+ return t0;
176
+ };
177
+ return {
178
+ atom: jotaiAtom,
179
+ useValue,
180
+ useState,
181
+ useReset
182
+ };
183
+ }const {
2
184
  atom: notificationAtom,
3
185
  useValue: useNotificationValue,
4
186
  useState: useNotificationState
5
- } = reactState.atomStateGenerator({
187
+ } = atomStateGenerator({
6
188
  defaultValue: null,
7
- key: 'reactNotificationAtom',
189
+ key: "reactNotificationAtom",
8
190
  persist: false
9
191
  });const useNotificationSet = () => {
10
192
  const [, setValue] = useNotificationState();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../notifications/notificationAtom.ts","../../notifications/useNotification.ts"],"sourcesContent":["import { atomStateGenerator } from '@gaddario98/react-state';\nimport type { NotificationMessage } from './types';\n\nconst {\n atom: notificationAtom,\n useValue: useNotificationValue,\n useState: useNotificationState,\n} = atomStateGenerator<NotificationMessage | null>({\n defaultValue: null,\n key: 'reactNotificationAtom',\n persist: false,\n});\n\nexport { notificationAtom, useNotificationValue, useNotificationState };\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useNotificationState } from './notificationAtom';\nimport type { NotificationMessage } from './types';\n\n const useNotificationSet = () => {\n const [, setValue] = useNotificationState();\n return setValue;\n };\n\nexport const useNotification = (ns = 'notifications') => {\n const setNotification = useNotificationSet();\n const ref =useRef({setNotification, ns})\n\n useEffect(() => {\n ref.current = { setNotification, ns };\n }, [setNotification, ns]);\n\n const showNotification = useCallback(\n (notification: Omit<NotificationMessage, 'id'>) => {\n ref.current.setNotification({\n ns: ref.current.ns,\n ...notification,\n id: Date.now().toString(),\n });\n },\n [],\n );\n\n const clearNotification = useCallback(() => {\n ref.current.setNotification(null);\n }, []);\n\n return {\n showNotification,\n clearNotification,\n };\n};\n"],"names":["atom","notificationAtom","useValue","useNotificationValue","useState","useNotificationState","atomStateGenerator","defaultValue","key","persist","useNotificationSet","setValue","useNotification","t0","$","_c","ns","undefined","setNotification","t1","ref","useRef","t2","t3","current","useEffect","t4","Symbol","for","notification","Object","assign","id","Date","now","toString","showNotification","t5","clearNotification","t6"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../state/storage.ts","../../state/atomStateGenerator.ts","../../notifications/notificationAtom.ts","../../notifications/useNotification.ts"],"sourcesContent":["import { deflateSync, inflateSync, strFromU8, strToU8 } from 'fflate'\n\nexport type SyncStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n\nconst RAW_PREFIX = 'storage:raw:'\nconst DEFLATE_PREFIX = 'storage:deflate:v1:'\n\nconst isProbablyJson = (value: string) => {\n if (!value) return false\n const c = value.charCodeAt(0)\n // { [ \" digits, t/f/n (true/false/null)\n return (\n c === 123 ||\n c === 91 ||\n c === 34 ||\n (c >= 48 && c <= 57) ||\n c === 45 ||\n c === 116 ||\n c === 102 ||\n c === 110\n )\n}\n\nconst u8ToBase64 = (bytes: Uint8Array) => {\n let binary = ''\n const chunkSize = 0x8000\n for (let i = 0; i < bytes.length; i += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize))\n }\n return btoa(binary)\n}\n\nconst base64ToU8 = (base64: string) => {\n const binary = atob(base64)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\ntype CompressedStorageOptions = {\n minSizeToCompress?: number\n deflateLevel?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9\n writeDebounceMs?: number\n}\n\nconst createCompressedStorage = (\n base: SyncStorage,\n options: CompressedStorageOptions = {},\n): SyncStorage => {\n const {\n minSizeToCompress = 1024,\n deflateLevel = 1,\n writeDebounceMs = 50,\n } = options\n\n const pendingWrites = new Map<string, string>()\n let flushTimer: number | undefined\n let lifecycleHooksInstalled = false\n\n const flush = () => {\n flushTimer = undefined\n for (const [key, value] of pendingWrites) {\n try {\n if (value.length < minSizeToCompress) {\n base.setItem(key, RAW_PREFIX + value)\n continue\n }\n\n const input = strToU8(value)\n const compressed = deflateSync(input, { level: deflateLevel })\n base.setItem(key, DEFLATE_PREFIX + u8ToBase64(compressed))\n } catch (error) {\n console.error('Error setting item:', error)\n try {\n base.setItem(key, RAW_PREFIX + value)\n } catch {\n // ignore\n }\n }\n }\n pendingWrites.clear()\n }\n\n const scheduleFlush = () => {\n if (flushTimer != null) return\n if (!lifecycleHooksInstalled && typeof window !== 'undefined') {\n lifecycleHooksInstalled = true\n window.addEventListener('beforeunload', flush)\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') flush()\n })\n }\n flushTimer = globalThis.setTimeout(\n flush,\n writeDebounceMs,\n ) as unknown as number\n }\n\n return {\n getItem: (key: string): string | null => {\n try {\n const stored = base.getItem(key)\n if (!stored) return null\n\n if (stored.startsWith(RAW_PREFIX)) {\n return stored.slice(RAW_PREFIX.length)\n }\n\n if (stored.startsWith(DEFLATE_PREFIX)) {\n const b64 = stored.slice(DEFLATE_PREFIX.length)\n const bytes = base64ToU8(b64)\n const decompressed = inflateSync(bytes)\n return strFromU8(decompressed)\n }\n\n // Back-compat: older versions may have stored raw JSON without any prefix\n if (isProbablyJson(stored)) return stored\n\n return null\n } catch (error) {\n console.error('Error getting item:', error)\n return null\n }\n },\n\n setItem: (key: string, value: string) => {\n try {\n // Some upstream serializers can return `undefined` (e.g. JSON.stringify(undefined)).\n const rawValue = value as unknown as string | null | undefined\n if (rawValue == null) {\n pendingWrites.delete(key)\n base.removeItem(key)\n return\n }\n\n const stringValue = typeof rawValue === 'string' ? rawValue : String(rawValue)\n pendingWrites.set(key, stringValue)\n scheduleFlush()\n } catch (error) {\n console.error('Error setting item:', error)\n }\n },\n\n removeItem: (key: string) => {\n try {\n pendingWrites.delete(key)\n base.removeItem(key)\n } catch (error) {\n console.error('Error removing item:', error)\n }\n },\n }\n}\n\nconst baseStorage: SyncStorage = {\n getItem: (key) => {\n if (typeof localStorage === 'undefined') return null\n return localStorage.getItem(key)\n },\n setItem: (key, value) => {\n if (typeof localStorage === 'undefined') return\n localStorage.setItem(key, value)\n },\n removeItem: (key) => {\n if (typeof localStorage === 'undefined') return\n localStorage.removeItem(key)\n },\n}\n\nexport let storage: SyncStorage = createCompressedStorage(baseStorage)\n\nexport const setCustomStorage = (newStorage: SyncStorage) => {\n storage = newStorage\n}\n","import { atom, useAtom } from 'jotai'\nimport { atomWithStorage, createJSONStorage } from 'jotai/utils'\nimport { storage } from './storage'\nimport type { PrimitiveAtom } from 'jotai'\n\nexport type { PrimitiveAtom } from 'jotai'\n\nexport type AtomGeneratorOptions<T> = {\n key: string\n defaultValue: T\n persist?: boolean\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n}\n\nexport type AtomState<T> = {\n atom: PrimitiveAtom<T>\n useValue: () => T\n useState: () => [T, (value: T) => void]\n useReset: () => () => void\n}\n\n// Overload per persist = true\nexport function atomStateGenerator<T>(\n options: AtomGeneratorOptions<T> & { persist: true },\n): AtomState<T>\n\n// Overload per persist = false o undefined\nexport function atomStateGenerator<T>(\n options: AtomGeneratorOptions<T> & { persist?: false },\n): AtomState<T>\n\n// Implementazione\nexport function atomStateGenerator<T>({\n key,\n defaultValue,\n persist = false,\n storage: customStorage,\n}: AtomGeneratorOptions<T>): AtomState<T> {\n const resolvedStorage = customStorage || storage\n\n // Usa atomWithStorage solo se persist è true, altrimenti atom normale\n const jotaiAtom = persist\n ? atomWithStorage<T>(\n key,\n defaultValue,\n createJSONStorage<T>(() => resolvedStorage),\n )\n : atom<T>(defaultValue)\n\n const useValue = () => {\n const [value] = useAtom(jotaiAtom as PrimitiveAtom<T>)\n return value\n }\n\n const useState = () => {\n const [value, setValue] = useAtom(jotaiAtom as PrimitiveAtom<T>)\n return [value, setValue] as [T, (value: T) => void]\n }\n\n const useReset = () => {\n const [, setValue] = useAtom(jotaiAtom as PrimitiveAtom<T>)\n return () => {\n setValue(defaultValue)\n // Rimuovi dallo storage solo se era persistente\n if (persist) {\n resolvedStorage.removeItem(key)\n }\n }\n }\n\n return {\n atom: jotaiAtom as PrimitiveAtom<T>,\n useValue,\n useState,\n useReset,\n }\n}\n","import { atomStateGenerator } from \"../state\";\nimport type { NotificationMessage } from \"./types\";\n\nconst {\n atom: notificationAtom,\n useValue: useNotificationValue,\n useState: useNotificationState,\n} = atomStateGenerator<NotificationMessage | null>({\n defaultValue: null,\n key: \"reactNotificationAtom\",\n persist: false,\n});\n\nexport { notificationAtom, useNotificationValue, useNotificationState };\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useNotificationState } from './notificationAtom';\nimport type { NotificationMessage } from './types';\n\n const useNotificationSet = () => {\n const [, setValue] = useNotificationState();\n return setValue;\n };\n\nexport const useNotification = (ns = 'notifications') => {\n const setNotification = useNotificationSet();\n const ref =useRef({setNotification, ns})\n\n useEffect(() => {\n ref.current = { setNotification, ns };\n }, [setNotification, ns]);\n\n const showNotification = useCallback(\n (notification: Omit<NotificationMessage, 'id'>) => {\n ref.current.setNotification({\n ns: ref.current.ns,\n ...notification,\n id: Date.now().toString(),\n });\n },\n [],\n );\n\n const clearNotification = useCallback(() => {\n ref.current.setNotification(null);\n }, []);\n\n return {\n showNotification,\n clearNotification,\n };\n};\n"],"names":["RAW_PREFIX","DEFLATE_PREFIX","isProbablyJson","value","c","charCodeAt","u8ToBase64","bytes","binary","chunkSize","i","length","String","fromCharCode","subarray","btoa","base64ToU8","base64","atob","Uint8Array","createCompressedStorage","base","options","minSizeToCompress","deflateLevel","writeDebounceMs","pendingWrites","Map","flushTimer","lifecycleHooksInstalled","flush","undefined","key","setItem","input","strToU8","compressed","deflateSync","level","error","console","_a","clear","scheduleFlush","window","addEventListener","document","visibilityState","globalThis","setTimeout","getItem","stored","startsWith","slice","b64","decompressed","inflateSync","strFromU8","rawValue","delete","removeItem","stringValue","set","baseStorage","localStorage","storage","atomStateGenerator","defaultValue","persist","customStorage","resolvedStorage","jotaiAtom","atomWithStorage","createJSONStorage","atom","useValue","useAtom","useState","$","_c","setValue","t0","useReset","notificationAtom","useNotificationValue","useNotificationState","useNotificationSet","useNotification","ns","setNotification","t1","ref","useRef","t2","t3","current","useEffect","t4","Symbol","for","notification","Object","assign","id","Date","now","toString","showNotification","t5","clearNotification","t6"],"mappings":"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"}
@@ -1,10 +1,192 @@
1
- import {c}from'react/compiler-runtime';import {useRef,useEffect}from'react';import {atomStateGenerator}from'@gaddario98/react-state';const {
1
+ import {c}from'react/compiler-runtime';import {useRef,useEffect}from'react';import {atom,useAtom}from'jotai';import {atomWithStorage,createJSONStorage}from'jotai/utils';import {inflateSync,strFromU8,strToU8,deflateSync}from'fflate';const RAW_PREFIX = 'storage:raw:';
2
+ const DEFLATE_PREFIX = 'storage:deflate:v1:';
3
+ const isProbablyJson = value => {
4
+ if (!value) return false;
5
+ const c = value.charCodeAt(0);
6
+ // { [ " digits, t/f/n (true/false/null)
7
+ return c === 123 || c === 91 || c === 34 || c >= 48 && c <= 57 || c === 45 || c === 116 || c === 102 || c === 110;
8
+ };
9
+ const u8ToBase64 = bytes => {
10
+ let binary = '';
11
+ const chunkSize = 0x8000;
12
+ for (let i = 0; i < bytes.length; i += chunkSize) {
13
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));
14
+ }
15
+ return btoa(binary);
16
+ };
17
+ const base64ToU8 = base64 => {
18
+ const binary = atob(base64);
19
+ const bytes = new Uint8Array(binary.length);
20
+ for (let i = 0; i < binary.length; i++) {
21
+ bytes[i] = binary.charCodeAt(i);
22
+ }
23
+ return bytes;
24
+ };
25
+ const createCompressedStorage = (base, options = {}) => {
26
+ const {
27
+ minSizeToCompress = 1024,
28
+ deflateLevel = 1,
29
+ writeDebounceMs = 50
30
+ } = options;
31
+ const pendingWrites = new Map();
32
+ let flushTimer;
33
+ let lifecycleHooksInstalled = false;
34
+ const flush = () => {
35
+ flushTimer = undefined;
36
+ for (const [key, value] of pendingWrites) {
37
+ try {
38
+ if (value.length < minSizeToCompress) {
39
+ base.setItem(key, RAW_PREFIX + value);
40
+ continue;
41
+ }
42
+ const input = strToU8(value);
43
+ const compressed = deflateSync(input, {
44
+ level: deflateLevel
45
+ });
46
+ base.setItem(key, DEFLATE_PREFIX + u8ToBase64(compressed));
47
+ } catch (error) {
48
+ console.error('Error setting item:', error);
49
+ try {
50
+ base.setItem(key, RAW_PREFIX + value);
51
+ } catch (_a) {
52
+ // ignore
53
+ }
54
+ }
55
+ }
56
+ pendingWrites.clear();
57
+ };
58
+ const scheduleFlush = () => {
59
+ if (flushTimer != null) return;
60
+ if (!lifecycleHooksInstalled && typeof window !== 'undefined') {
61
+ lifecycleHooksInstalled = true;
62
+ window.addEventListener('beforeunload', flush);
63
+ document.addEventListener('visibilitychange', () => {
64
+ if (document.visibilityState === 'hidden') flush();
65
+ });
66
+ }
67
+ flushTimer = globalThis.setTimeout(flush, writeDebounceMs);
68
+ };
69
+ return {
70
+ getItem: key => {
71
+ try {
72
+ const stored = base.getItem(key);
73
+ if (!stored) return null;
74
+ if (stored.startsWith(RAW_PREFIX)) {
75
+ return stored.slice(RAW_PREFIX.length);
76
+ }
77
+ if (stored.startsWith(DEFLATE_PREFIX)) {
78
+ const b64 = stored.slice(DEFLATE_PREFIX.length);
79
+ const bytes = base64ToU8(b64);
80
+ const decompressed = inflateSync(bytes);
81
+ return strFromU8(decompressed);
82
+ }
83
+ // Back-compat: older versions may have stored raw JSON without any prefix
84
+ if (isProbablyJson(stored)) return stored;
85
+ return null;
86
+ } catch (error) {
87
+ console.error('Error getting item:', error);
88
+ return null;
89
+ }
90
+ },
91
+ setItem: (key, value) => {
92
+ try {
93
+ // Some upstream serializers can return `undefined` (e.g. JSON.stringify(undefined)).
94
+ const rawValue = value;
95
+ if (rawValue == null) {
96
+ pendingWrites.delete(key);
97
+ base.removeItem(key);
98
+ return;
99
+ }
100
+ const stringValue = typeof rawValue === 'string' ? rawValue : String(rawValue);
101
+ pendingWrites.set(key, stringValue);
102
+ scheduleFlush();
103
+ } catch (error) {
104
+ console.error('Error setting item:', error);
105
+ }
106
+ },
107
+ removeItem: key => {
108
+ try {
109
+ pendingWrites.delete(key);
110
+ base.removeItem(key);
111
+ } catch (error) {
112
+ console.error('Error removing item:', error);
113
+ }
114
+ }
115
+ };
116
+ };
117
+ const baseStorage = {
118
+ getItem: key => {
119
+ if (typeof localStorage === 'undefined') return null;
120
+ return localStorage.getItem(key);
121
+ },
122
+ setItem: (key, value) => {
123
+ if (typeof localStorage === 'undefined') return;
124
+ localStorage.setItem(key, value);
125
+ },
126
+ removeItem: key => {
127
+ if (typeof localStorage === 'undefined') return;
128
+ localStorage.removeItem(key);
129
+ }
130
+ };
131
+ let storage = createCompressedStorage(baseStorage);// Implementazione
132
+ function atomStateGenerator({
133
+ key,
134
+ defaultValue,
135
+ persist = false,
136
+ storage: customStorage
137
+ }) {
138
+ const resolvedStorage = customStorage || storage;
139
+ // Usa atomWithStorage solo se persist è true, altrimenti atom normale
140
+ const jotaiAtom = persist ? atomWithStorage(key, defaultValue, createJSONStorage(() => resolvedStorage)) : atom(defaultValue);
141
+ const useValue = () => {
142
+ const [value] = useAtom(jotaiAtom);
143
+ return value;
144
+ };
145
+ const useState = () => {
146
+ const $ = c(3);
147
+ const [value, setValue] = useAtom(jotaiAtom);
148
+ let t0;
149
+ if ($[0] !== setValue || $[1] !== value) {
150
+ t0 = [value, setValue];
151
+ $[0] = setValue;
152
+ $[1] = value;
153
+ $[2] = t0;
154
+ } else {
155
+ t0 = $[2];
156
+ }
157
+ return t0;
158
+ };
159
+ const useReset = () => {
160
+ const $ = c(2);
161
+ const [, setValue] = useAtom(jotaiAtom);
162
+ let t0;
163
+ if ($[0] !== setValue) {
164
+ t0 = () => {
165
+ setValue(defaultValue);
166
+ if (persist) {
167
+ resolvedStorage.removeItem(key);
168
+ }
169
+ };
170
+ $[0] = setValue;
171
+ $[1] = t0;
172
+ } else {
173
+ t0 = $[1];
174
+ }
175
+ return t0;
176
+ };
177
+ return {
178
+ atom: jotaiAtom,
179
+ useValue,
180
+ useState,
181
+ useReset
182
+ };
183
+ }const {
2
184
  atom: notificationAtom,
3
185
  useValue: useNotificationValue,
4
186
  useState: useNotificationState
5
187
  } = atomStateGenerator({
6
188
  defaultValue: null,
7
- key: 'reactNotificationAtom',
189
+ key: "reactNotificationAtom",
8
190
  persist: false
9
191
  });const useNotificationSet = () => {
10
192
  const [, setValue] = useNotificationState();