langsys-js-typescript 0.2.2 → 0.2.3

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal.ts","../src/logger.ts","../src/api.ts","../src/persist.ts","../src/stores.ts","../src/interpolate.ts","../src/translations.ts","../src/langsys-app.ts","../src/utils.ts","../src/content-block.ts","../src/translate.ts","../src/richtext.ts","../src/phrase.ts","../src/index.ts"],"names":["config","IntlMessageFormat","t","initialTranslations","x","c","a","b","d","i"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Tiny framework-agnostic reactive value holder — our replacement for a\n * Svelte `Writable<T>`. The shape is deliberately similar so the mental\n * model is identical: subscribe/set/update/get.\n *\n * Usage:\n * const locale = createSignal('en-us');\n * locale.subscribe((v) => console.log('locale is now', v));\n * locale.set('fr-fr');\n * locale.get(); // 'fr-fr'\n *\n * Subscribe is called synchronously with the current value on registration\n * (same semantics as a Svelte store).\n */\nexport type Subscriber<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\nexport type Updater<T> = (value: T) => T;\n\nexport interface Signal<T> {\n /** Register a subscriber; it's called immediately with the current value. Returns an unsubscribe function. */\n subscribe(run: Subscriber<T>): Unsubscriber;\n /** Set the value and notify subscribers. */\n set(value: T): void;\n /** Update the value via a function and notify subscribers. */\n update(fn: Updater<T>): void;\n /** Read the current value without subscribing. */\n get(): T;\n}\n\nexport function createSignal<T>(initial: T): Signal<T> {\n let value: T = initial;\n const subscribers = new Set<Subscriber<T>>();\n\n const subscribe = (run: Subscriber<T>): Unsubscriber => {\n subscribers.add(run);\n run(value);\n return () => {\n subscribers.delete(run);\n };\n };\n\n const set = (next: T): void => {\n if (Object.is(value, next)) return;\n value = next;\n for (const run of subscribers) run(value);\n };\n\n const update = (fn: Updater<T>): void => {\n set(fn(value));\n };\n\n const get = (): T => value;\n\n return { subscribe, set, update, get };\n}\n\n/** Synchronously read a Signal's value. Mirrors svelte's `get(store)`. */\nexport function getValue<T>(signal: Signal<T>): T {\n return signal.get();\n}\n","/**\n * Lightweight debug logger. Styled in browsers (via %c), plain text in Node.\n * Replaces the pre-existing `echo` module from the Svelte SDK with a simpler,\n * SSR-safe equivalent.\n */\n\nconst STYLES = {\n log: 'display:inline-block;background:rgb(239,239,244);color:black;font-weight:bold;padding:3px 7px;border-radius:3px',\n warn: 'display:inline-block;background:gold;color:black;font-weight:bold;padding:3px 7px;border-radius:3px',\n error: 'display:inline-block;background:#e0005a;color:#fff;font-weight:bold;padding:3px 7px;border-radius:3px',\n};\n\nconst supportsStyle = typeof window !== 'undefined';\n\nfunction emit(level: 'log' | 'warn' | 'error', label: string, args: unknown[]) {\n // Browsers render %c style. Node just gets the plain string.\n if (supportsStyle) {\n // eslint-disable-next-line no-console\n console[level](`%c${label}`, STYLES[level], ...args);\n } else {\n // eslint-disable-next-line no-console\n console[level](`[${label}]`, ...args);\n }\n}\n\nexport class Logger {\n debugEnabled: boolean;\n\n constructor(debugEnabled = false) {\n this.debugEnabled = debugEnabled;\n }\n\n log(...args: unknown[]) {\n if (!this.debugEnabled) return;\n emit('log', 'Langsys Debug', args);\n }\n\n warn(...args: unknown[]) {\n emit('warn', 'Langsys Warning', args);\n }\n\n error(...args: unknown[]) {\n emit('error', 'Langsys Error', args);\n }\n}\n\nexport const logger = new Logger(false);\n","import { createSignal } from './signal.js';\nimport type { HttpResponse, ResponseObject } from './types/api.js';\nimport type { iLangsysConfig } from './types/config.js';\nimport { logger } from './logger.js';\n\ntype Method = 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'PUT';\n\nclass LangsysAppAPIClass {\n private apiurl = 'https://api.langsys.dev/api';\n public config: iLangsysConfig;\n private headers: { 'Content-Type': string; 'x-Authorization': string; 'X-Langsys-Capabilities': string };\n\n constructor() {\n this.config = {\n projectid: '',\n key: '',\n sUserLocale: createSignal(''),\n baseLocale: 'en',\n };\n this.headers = {\n 'Content-Type': 'application/json; charset=utf-8',\n 'x-Authorization': this.config.key,\n // Declare ICU MessageFormat rendering so the server sends raw ICU\n // (plural/select) instead of flat-template downgrades. Pre-ICU\n // builds omit this header and keep receiving flat strings.\n 'X-Langsys-Capabilities': 'icu',\n };\n }\n\n public setup(config: iLangsysConfig) {\n if (config?.key && config?.projectid) {\n this.config = config;\n this.headers['x-Authorization'] = this.config.key;\n }\n }\n\n /** Optional hook to point the client at a different API host. */\n public setBaseUrl(url: string) {\n this.apiurl = url.replace(/\\/$/, '');\n }\n\n public async validate(config: iLangsysConfig) {\n this.setup(config);\n return await this.get('authorize-project/[projectid]');\n }\n\n public async getTranslations(locale: string) {\n return await this.get('translations', { project_id: this.config.projectid, locale });\n }\n\n /**\n * Register phrases and/or content blocks via the current unified endpoint.\n * Each item carries `type: 'phrase' | 'content_block'`. Replaces the\n * deprecated `projects/{id}/tokens` and `projects/{id}/content-blocks` routes.\n */\n public async createTranslatableItems(items: Array<Record<string, unknown>>) {\n return await this.post('translatable-items', {\n project_id: this.config.projectid,\n translatable_items: items,\n });\n }\n\n public async post(path: string, data: Record<string, unknown> = {}) {\n return await this.send('POST', path, data);\n }\n public async get(path: string, data: Record<string, unknown> = {}) {\n return await this.send('GET', path, data);\n }\n public async delete(path: string, data: Record<string, unknown> = {}) {\n return await this.send('DELETE', path, data);\n }\n public async patch(path: string, data: Record<string, unknown> = {}) {\n return await this.send('PATCH', path, data);\n }\n public async put(path: string, data: Record<string, unknown> = {}) {\n return await this.send('PUT', path, data);\n }\n\n private async send(method: Method, path: string, data: Record<string, unknown> = {}): Promise<ResponseObject> {\n if (!this.config.projectid || !this.config.key) {\n return {\n status: false,\n errors: ['Missing projectid or API key in configuration'],\n http: {\n status: 0,\n statusText: 'Configuration Error',\n url: `${this.apiurl}/${path}`,\n data: JSON.stringify(data),\n },\n };\n }\n\n // API calls should not include a leading slash.\n if (path.startsWith('/')) path = path.substring(1);\n\n // Replace [projectid] token with the actual configured projectid.\n if (path.includes('/[projectid]')) {\n path = path.replaceAll('/[projectid]', `/${this.config.projectid}`);\n }\n\n try {\n const querystring =\n method === 'GET'\n ? '?' + new URLSearchParams(data as Record<string, string>).toString()\n : '';\n\n const query = await fetch(`${this.apiurl}/${path}${querystring === '?' ? '' : querystring}`, {\n headers: this.headers,\n method,\n body: method === 'GET' ? undefined : JSON.stringify(data),\n });\n\n const responseData = (await query.json()) as ResponseObject;\n const http: HttpResponse = {\n status: query.status,\n statusText: query.statusText,\n url: query.url,\n data: JSON.stringify(data),\n };\n responseData.http = http;\n\n if (!query.ok) {\n logger.warn('LangsysAppAPI failed to query', responseData);\n return {\n status: false,\n errors: [`HTTP ${query.status}: ${query.statusText}`],\n data: responseData,\n http,\n };\n }\n\n return responseData;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred';\n logger.error('LangsysAppAPI Error:', errorMessage);\n logger.error('Request details:', {\n method,\n url: `${this.apiurl}/${path}`,\n data,\n });\n return {\n status: false,\n errors: ['Error communicating with API Server', errorMessage],\n http: {\n status: 0,\n statusText: 'Network Error',\n url: `${this.apiurl}/${path}`,\n data: JSON.stringify(data),\n },\n };\n }\n }\n}\n\nexport const LangsysAppAPI = new LangsysAppAPIClass();\nexport default LangsysAppAPI;\n","import { createSignal, type Signal } from './signal.js';\n\n/**\n * Create a Signal whose value is persisted to localStorage (when available).\n * Falls back to in-memory behavior during SSR or when storage is unavailable\n * or quota-exceeded. Stored value is JSON-encoded.\n */\nexport function persist<T>(key: string, initial: T): Signal<T> {\n const storage = getSafeStorage();\n let seed = initial;\n\n if (storage) {\n try {\n const raw = storage.getItem(key);\n if (raw !== null) seed = JSON.parse(raw) as T;\n } catch {\n // Corrupt value; fall through to initial.\n }\n }\n\n const signal = createSignal<T>(seed);\n\n if (storage) {\n signal.subscribe((value) => {\n try {\n storage.setItem(key, JSON.stringify(value));\n } catch {\n // Quota / serialization failure — silently keep going; in-memory stays authoritative.\n }\n });\n }\n\n return signal;\n}\n\nfunction getSafeStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n try {\n const s = window.localStorage;\n // Some browsers throw on access in private-mode iframes.\n s.getItem('__langsys_probe__');\n return s;\n } catch {\n return null;\n }\n}\n","import { createSignal } from './signal.js';\nimport { persist } from './persist.js';\nimport type { iCategories } from './types/translations.js';\nimport type { iLangsysConfig } from './types/config.js';\n\nconst initialTranslations: iCategories = {\n __uncategorized__: {\n __category__: '__uncategorized__',\n __symbol__: '__uncategorized__',\n },\n};\n\nexport const sTranslations = persist<iCategories>('translations', initialTranslations);\n\nexport const currentlyLoadedLocale = createSignal<string>('');\n\nexport const config: iLangsysConfig = {\n projectid: '',\n key: '',\n sUserLocale: createSignal<string>(''),\n baseLocale: 'en',\n debug: false,\n key_type: 'read',\n};\n","import { IntlMessageFormat } from 'intl-messageformat';\n\n/**\n * Detects ICU MessageFormat syntax in a translation string.\n *\n * - Matches `{var, plural, …}`, `{var, select, …}`, `{var, selectordinal, …}`,\n * `{var, number, …}`, `{var, date, …}`, `{var, time, …}`.\n * - Doesn't match plain interpolation slots like `{name}` or `{count}`.\n *\n * Exported because the Translation Manager UI needs the same detection logic\n * to decide whether to render a plural-slot editor vs. a single text field.\n */\nexport function isICU(template: string): boolean {\n return ICU_PATTERN.test(template);\n}\n\nconst ICU_PATTERN = /\\{[^{}]+,\\s*(plural|select|selectordinal|number|date|time)\\s*,/;\n\n/**\n * Substitute placeholders in a translated string with values from `params`.\n *\n * Two paths:\n * - ICU MessageFormat (target string contains `{var, plural|select|…, …}`):\n * parsed and formatted via `intl-messageformat`, which knows every\n * target locale's plural rules (Arabic's 6 categories, Russian's 4,\n * etc.) and gender-select branches.\n * - Simple `{name}` interpolation: cheap regex replacement. Unknown\n * placeholders are left untouched so missing data is visible to the\n * developer rather than silently rendering empty strings.\n *\n * Malformed ICU falls through to simple interpolation rather than throwing,\n * so the developer sees a broken-but-visible string instead of a runtime crash.\n * Backend-side validation in langsys-ai is supposed to prevent this — the\n * fall-through is defense in depth.\n *\n * `locale` is required for ICU formatting (drives plural-rule selection).\n * Falls back to `'en'` if absent — simple-interpolation path ignores it.\n */\nexport function interpolate(\n template: string,\n params: Record<string, unknown>,\n locale?: string,\n): string {\n if (isICU(template)) {\n try {\n return new IntlMessageFormat(template, locale ?? 'en').format(params) as string;\n } catch {\n return simpleInterpolate(template, params);\n }\n }\n return simpleInterpolate(template, params);\n}\n\nfunction simpleInterpolate(template: string, params: Record<string, unknown>): string {\n // The `[^{},]` character class excludes `{`, `}`, and `,` from placeholder\n // names so we don't accidentally consume ICU-shaped slots that somehow\n // routed through this path (e.g. malformed ICU after fall-through).\n return template.replace(/\\{([^{},]+)\\}/g, (match, rawKey: string) => {\n const key = rawKey.trim();\n if (!(key in params)) return match;\n const value = params[key];\n if (value === undefined || value === null) return match;\n if (value instanceof Date) return value.toISOString();\n return String(value);\n });\n}\n","import { LangsysAppAPI } from './api.js';\nimport { interpolate } from './interpolate.js';\nimport { Logger } from './logger.js';\nimport { createSignal, type Signal } from './signal.js';\nimport { currentlyLoadedLocale, sTranslations } from './stores.js';\nimport type { ResponseObject } from './types/api.js';\nimport type { iLangsysConfig } from './types/config.js';\nimport type { TFunction } from './types/translation-fn.js';\nimport type { iCategories, iTranslations } from './types/translations.js';\n\ninterface iTokenUpdate {\n projectid: string;\n category: string;\n token: string;\n}\n\nfunction isObject(test: unknown): test is Record<string, unknown> {\n return typeof test === 'object' && !Array.isArray(test) && test !== null;\n}\nfunction sameToken(a: iTokenUpdate, b: iTokenUpdate): boolean {\n return a.projectid === b.projectid && a.category === b.category && a.token === b.token;\n}\n\n/**\n * Lifecycle for app translations:\n * - on-miss: any `t(cat, phrase)` whose phrase isn't in the catalog is\n * queued as a \"missing token\" and (with write keys) flushed to the API.\n * - locale changes trigger `change()` which fetches and replaces.\n * - consumers can `subscribe(fn)` to react to translation snapshots.\n * - frameworks subscribe to `tSignal` (which re-emits a fresh `TFunction`\n * every time translations or the loaded locale change) so reactive\n * templates re-render automatically.\n */\nexport class Translations {\n private config: iLangsysConfig;\n private locale: string;\n private lastLoaded: Record<string, number> = {};\n private missingTokens: iTokenUpdate[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushScheduled = false;\n private isFirstClientRun = true;\n private readyResolve: () => void = () => {};\n private readyPromise: Promise<void> = new Promise((resolve) => {\n this.readyResolve = resolve;\n });\n public debug: Logger;\n\n /** Reactive holder for the current translation function. Re-emits on every catalog/locale change. */\n public tSignal: Signal<TFunction>;\n\n constructor(config: iLangsysConfig) {\n this.config = config;\n this.debug = new Logger(!!config.debug);\n this.locale = config.baseLocale || '';\n\n this.tSignal = createSignal<TFunction>(this.buildTFn());\n sTranslations.subscribe(() => this.tSignal.set(this.buildTFn()));\n currentlyLoadedLocale.subscribe(() => this.tSignal.set(this.buildTFn()));\n\n if (config.key && config.projectid) this.setup(config);\n }\n\n /**\n * Resolves once the first `getTranslations` call has completed (or\n * immediately if no fetch is configured). Callers that need to read\n * `sTranslations` before issuing a write — e.g. the `Translate` DOM\n * class deciding whether to POST a content block — should await this\n * to avoid acting on an empty cache during the cold-start race.\n */\n public ready(): Promise<void> {\n return this.readyPromise;\n }\n\n /** Current translation function. Reads fresh state on every call. */\n public get t(): TFunction {\n return this.tSignal.get();\n }\n\n /** Subscribe to translation snapshot changes. Fires immediately with the current value. */\n public subscribe(run: (value: iCategories) => void) {\n return sTranslations.subscribe(run);\n }\n\n /**\n * Content-block-keyed lookup used by the DOM `Translate` class.\n * Returns the per-token translation inside a content block, or `null` if\n * either the content block or the inner token is missing. Never registers\n * a missing token — the DOM class manages its own lifecycle via content blocks.\n */\n public lookupContent(category: string, customId: string, token: string): string | null {\n const cats = sTranslations.get();\n const lookupCat = category || '__uncategorized__';\n const contentData = cats[lookupCat]?.[customId];\n if (!contentData || typeof contentData !== 'object') return null;\n const value = (contentData as unknown as Record<string, string>)[token];\n return typeof value === 'string' ? value : null;\n }\n\n /**\n * Raw stored translation for a phrase, without interpolation or\n * missing-token registration. Returns null when no (non-empty) translation\n * is cached. Used by the `Phrase` rich-text handler, which needs the\n * un-interpolated template (it supplies its own markup-token values).\n */\n public lookup(phrase: string, category: string): string | null {\n const cats = sTranslations.get();\n const lookupCat = category || '__uncategorized__';\n const value = cats[lookupCat]?.[phrase];\n return typeof value === 'string' && value.length > 0 ? value : null;\n }\n\n private buildTFn(): TFunction {\n // Single runtime body covers both overload shapes. Position 2 is the\n // discriminator: string ⇒ category, object ⇒ params (no category).\n // t(phrase) → category='', params=undefined\n // t(phrase, {params...}) → category='', params={params}\n // t(phrase, 'Category') → category='Category', params=undefined\n // t(phrase, 'Category', {params...}) → category='Category', params={params}\n const fn = ((phrase: string, ...rest: unknown[]): string => {\n const category = typeof rest[0] === 'string' ? rest[0] : '';\n const params = (typeof rest[0] === 'object' ? rest[0] : rest[1]) as Record<string, unknown> | undefined;\n\n const cats = sTranslations.get();\n // '__uncategorized__' is a server-internal bucket name used only\n // in GET /translations responses to group null-category phrases.\n // We normalize to it for the local cats lookup (so we read from\n // the same bucket the server writes to), but we MUST NOT leak\n // the sentinel back into the missingToken queue — that queue\n // feeds the POST wire payload, and clients are not allowed to\n // send the reserved sentinel as a category.\n const lookupCat = category || '__uncategorized__';\n const value = cats[lookupCat]?.[phrase];\n\n let translated: string;\n if (typeof value === 'string' && value.length > 0) {\n this.debug.log('TRANSLATION FOUND', [lookupCat, phrase, value]);\n translated = value;\n } else {\n this.missingToken(category, phrase);\n translated = phrase;\n }\n\n return params ? interpolate(translated, params, currentlyLoadedLocale.get()) : translated;\n }) as TFunction;\n return fn;\n }\n\n private missingToken(category: string, token: string | undefined | null) {\n if (token === undefined || token === null) {\n return this.debug.warn(`Received undefined or null token for category: ${category}`);\n }\n\n if (this.config.key_type !== 'write') {\n this.debug.log(`Skipping missing token collection (API key is ${this.config.key_type || 'unknown'}):`, {\n category,\n token,\n });\n return;\n }\n\n // Skip content-block id lookups (32-hex md5 strings).\n if (/^[0-9a-f]{32}$/.test(token)) return;\n if (token === 'toJSON') {\n this.debug.error(`Received toJSON as token ${category}:${token}`, token);\n return;\n }\n if (token === '') {\n this.debug.warn('Received empty token', token);\n return;\n }\n\n const missingToken: iTokenUpdate = { category, token, projectid: this.config.projectid };\n if (!this.missingTokens.some((t) => sameToken(t, missingToken))) {\n this.debug.log('MISSING TOKEN LOOKUP FAILED', [missingToken, [...this.missingTokens], { ...sTranslations.get() }]);\n this.missingTokens.push(missingToken);\n this.scheduleTokenFlush();\n }\n }\n\n private scheduleTokenFlush() {\n const strategy = this.config.ssrTokenStrategy || 'client';\n const isSSR = typeof window === 'undefined';\n\n if (isSSR) {\n switch (strategy) {\n case 'server':\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.updateTokens().then(() => {\n this.flushScheduled = false;\n });\n });\n }\n break;\n\n case 'auto':\n if (this.missingTokens.length <= 5 && !this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.updateTokens().then(() => {\n this.flushScheduled = false;\n });\n });\n }\n break;\n\n case 'client':\n default:\n this.debug.log('SSR: Queuing tokens for client-side transmission');\n break;\n }\n } else {\n // Client — flush immediately on first discovery, then let the 3s timer take over.\n if (!this.flushScheduled && !this.timer) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.updateTokens().then(() => {\n this.flushScheduled = false;\n });\n });\n }\n }\n }\n\n public setup(config: iLangsysConfig) {\n this.config = config;\n if (!this.config.projectid || !this.config.key) return;\n\n if (this.config.debug) this.debug.debugEnabled = this.config.debug;\n if (config.baseLocale) this.locale = config.baseLocale;\n\n this.debug.log('TRANSLATION SETUP INITIATED', this.config);\n\n if (typeof window !== 'undefined') {\n if (this.isFirstClientRun && this.missingTokens.length > 0) {\n this.isFirstClientRun = false;\n const strategy = this.config.ssrTokenStrategy || 'client';\n if (strategy === 'client' || (strategy === 'auto' && this.missingTokens.length > 5)) {\n this.debug.log(`Post-hydration: Flushing ${this.missingTokens.length} SSR-collected tokens`);\n queueMicrotask(() => this.updateTokens());\n }\n }\n\n if (this.timer) clearInterval(this.timer);\n this.timer = setInterval(() => this.updateTokens(), 3000);\n this.debug.log('UPDATE TOKEN INTERVAL', this.timer);\n } else {\n const strategy = this.config.ssrTokenStrategy || 'client';\n this.debug.log(`SSR environment detected - using '${strategy}' token strategy`);\n }\n }\n\n /**\n * Record that a locale's catalog is already present without fetching —\n * e.g. after an SSR handoff seeds `sTranslations` + `currentlyLoadedLocale`.\n * This primes the same `lastLoaded` cache `change()` consults, so the first\n * settle for that locale is a cache hit (no redundant fetch) while every\n * later switch *to* it still flows through `change()` normally.\n */\n public markLoaded(locale: string): void {\n if (!locale) return;\n this.locale = locale;\n this.lastLoaded[locale] = new Date().getTime() / 1000;\n }\n\n /**\n * React to a user-locale change. Fetches translations if we haven't\n * loaded this locale within the last 60s (or if forced).\n */\n public async change(locale: string, force = false, skipFetch = false): Promise<boolean> {\n if (!locale) return false;\n if (!this.config.projectid || !this.config.key) return false;\n\n if (skipFetch) {\n this.debug.log('Using pre-fetched translations for locale', locale);\n this.locale = locale;\n this.lastLoaded[locale] = new Date().getTime() / 1000;\n return true;\n }\n\n const now = new Date().getTime() / 1000;\n if (\n !force &&\n locale === this.locale &&\n this.lastLoaded[locale] &&\n Math.abs(this.lastLoaded[locale] - now) < 60\n ) {\n return false;\n }\n\n this.debug.log('Locale change detected!', locale);\n this.locale = locale;\n await this.getTranslations();\n return true;\n }\n\n private async updateTokens(): Promise<boolean> {\n if (!this.missingTokens.length) return false;\n if (!this.config.projectid || !this.config.key) return false;\n if (this.config.key_type !== 'write') {\n this.debug.log(`Skipping token updates (API key is ${this.config.key_type || 'unknown'})`);\n return false;\n }\n\n if (typeof window === 'undefined') {\n this.debug.log(`Sending ${this.missingTokens.length} tokens from SSR`);\n }\n\n const currentData = sTranslations.get();\n this.missingTokens = this.missingTokens.filter((tokenObj) => {\n tokenObj.projectid = this.config.projectid;\n // The server response keys null-category phrases under\n // '__uncategorized__', so map empty client-side category to that\n // bucket for the dedup check only. The queue itself keeps the\n // original (possibly empty) category for the wire payload.\n const lookupCat = tokenObj.category || '__uncategorized__';\n if (lookupCat in currentData && tokenObj.token in currentData[lookupCat]) {\n this.debug.log('Missing token already exists! Skipping:', {\n category: tokenObj.category,\n token: tokenObj.token,\n existing: currentData[lookupCat][tokenObj.token],\n });\n return false;\n }\n return true;\n });\n\n if (!this.missingTokens.length) return false;\n\n this.debug.log('CREATE MISSING TOKENS', this.missingTokens);\n try {\n // Wire boundary: empty category → null. '__uncategorized__' is\n // server-internal and is rejected as a client input.\n const phraseItems = this.missingTokens.map((tokenObj) => ({\n type: 'phrase',\n phrase: tokenObj.token,\n category: tokenObj.category || null,\n }));\n\n // /translatable-items caps each request (default 200 items); chunk so\n // a page registering many new phrases at once never overflows it.\n const BATCH_SIZE = 200;\n for (let offset = 0; offset < phraseItems.length; offset += BATCH_SIZE) {\n const response: ResponseObject = await LangsysAppAPI.createTranslatableItems(\n phraseItems.slice(offset, offset + BATCH_SIZE),\n );\n if (!response.status) {\n if (response.errors) {\n this.debug.log('TOKEN UPDATE FAIL', this.missingTokens);\n this.debug.error('Error updating project tokens', response.errors);\n }\n return false;\n }\n }\n\n this.missingTokens.forEach((tokenObj) => {\n // Same bucket normalization as the dedup check: write into\n // the cats bucket that matches the server response shape.\n const lookupCat = tokenObj.category || '__uncategorized__';\n if (!currentData[lookupCat]) {\n currentData[lookupCat] = {\n __category__: lookupCat,\n __symbol__: lookupCat,\n } as iTranslations;\n }\n currentData[lookupCat][tokenObj.token] = tokenObj.token;\n currentData[lookupCat]['__category__'] = lookupCat;\n });\n sTranslations.set({ ...currentData });\n this.missingTokens = [];\n return true;\n } catch (err) {\n this.debug.log('CREATE MISSING TOKEN FAILURE', this.missingTokens);\n this.debug.error('Error updating project tokens', err);\n return false;\n }\n }\n\n private async getTranslations(): Promise<void> {\n if (!LangsysAppAPI.config.projectid && this.config.projectid) {\n LangsysAppAPI.setup(this.config);\n }\n\n const response: ResponseObject = await LangsysAppAPI.getTranslations(this.locale);\n this.debug.log('GET TRANSLATIONS API RESPONSE', response);\n if (response.errors) {\n this.debug.error('Error', response.errors[0]);\n this.readyResolve();\n return;\n }\n\n const trans = response.data as iCategories;\n\n if (!isObject(trans['__uncategorized__'])) {\n trans['__uncategorized__'] = {\n __category__: '__uncategorized__',\n __symbol__: '__uncategorized__',\n } as iTranslations;\n }\n\n for (const cat of Object.keys(trans)) {\n trans[cat]['__category__'] = cat;\n }\n\n this.debug.log('GET TRANSLATIONS ' + this.locale, trans);\n\n sTranslations.set(trans);\n // Small delay so consumers see translations + locale updates on the same tick.\n setTimeout(() => currentlyLoadedLocale.set(this.locale), 100);\n this.lastLoaded[this.locale] = new Date().getTime() / 1000;\n this.readyResolve();\n }\n}\n\nexport default Translations;\n","import { LangsysAppAPI } from './api.js';\nimport { Logger } from './logger.js';\nimport { config as configStore, currentlyLoadedLocale, sTranslations } from './stores.js';\nimport { Translations } from './translations.js';\nimport type { ResponseObject } from './types/api.js';\nimport type { iLangsysConfig, iLangsysInitConfig } from './types/config.js';\nimport type { iCountryDialCode, iCountryList } from './types/countries.js';\nimport type { iCurrencyList } from './types/currencies.js';\nimport type { iLocaleData, iLocaleDefault, iLocaleFlat } from './types/locales.js';\nimport type { TFunction } from './types/translation-fn.js';\nimport type { iTranslations } from './types/translations.js';\n\nclass LangsysAppClass {\n private config: iLangsysConfig;\n\n public Translations: Translations;\n public translationsLoadingPromise: Promise<unknown> = Promise.resolve();\n\n private locales: Record<string, iLocaleData[]> = {};\n\n private countries: iCountryList = [];\n private countriesLocale = '';\n\n private dialCodes: iCountryDialCode[] = [];\n private dialCodesLocale = '';\n\n private currencies: iCurrencyList = [];\n private currenciesLocale = '';\n\n public debug: Logger;\n\n constructor() {\n this.config = configStore;\n this.debug = new Logger(!!this.config.debug);\n this.Translations = new Translations(this.config);\n }\n\n /** Current translation function. Reads fresh state on every call. */\n public get t(): TFunction {\n return this.Translations.t;\n }\n\n public async refresh() {\n const locale = this.config.sUserLocale.get();\n this.locales = {};\n return this.Translations.change(locale, true);\n }\n\n /**\n * Initialize Langsys. Configuration must include at least `projectid`,\n * `key`, and `UserLocaleStore` (anything satisfying `LocaleSource` — see\n * its docstring for framework-specific adapters).\n */\n public async init(initConfig: iLangsysInitConfig): Promise<ResponseObject> {\n const projectid = initConfig.projectid;\n const key = initConfig.key;\n const UserLocaleStore = initConfig.UserLocaleStore;\n let baseLocale = initConfig.baseLocale || 'en';\n const debug = initConfig.debug || false;\n const emulateFailureToLoad = initConfig.emulateFailureToLoad || false;\n const ssrTokenStrategy = initConfig.ssrTokenStrategy || 'client';\n const initialTranslations = initConfig.initialTranslations;\n const initialTranslationsLocale = initConfig.initialTranslationsLocale;\n\n this.debug.debugEnabled = debug;\n\n if (debug && initialTranslations) {\n this.debug.log('SSR initial translations config:', {\n hasInitialTranslations: !!initialTranslations,\n initialTranslationsLocale,\n categoriesProvided: initialTranslations ? Object.keys(initialTranslations).length : 0,\n categories: initialTranslations ? Object.keys(initialTranslations) : [],\n });\n }\n\n if (!projectid) {\n this.debug.error('LangsysApp.init missing projectid in configuration object!');\n return { status: false, errors: ['Missing projectid'] };\n }\n if (!key) {\n this.debug.error('LangsysApp.init missing API key in configuration object!');\n return { status: false, errors: ['Missing API key'] };\n }\n if (!UserLocaleStore?.subscribe || typeof UserLocaleStore.get !== 'function') {\n this.debug.error(\n \"LangsysApp.init missing UserLocaleStore — pass any object satisfying LocaleSource (get + subscribe). createSignal('en-us') works if you have nothing of your own.\"\n );\n return { status: false, errors: ['Missing UserLocaleStore'] };\n }\n\n baseLocale = baseLocale.toLowerCase();\n\n if (!emulateFailureToLoad) {\n this.config = {\n projectid,\n key,\n sUserLocale: UserLocaleStore,\n baseLocale,\n debug,\n ssrTokenStrategy,\n };\n // Keep the exported config singleton in sync (used by Translate + API).\n Object.assign(configStore, this.config);\n }\n\n const validateResponse = await LangsysAppAPI.validate(this.config);\n\n if (validateResponse.status && validateResponse.data) {\n const authData = validateResponse.data as { key_type?: 'read' | 'write' };\n if (authData.key_type) {\n this.config.key_type = authData.key_type;\n configStore.key_type = authData.key_type;\n this.debug.log('API Key Type:', this.config.key_type);\n }\n }\n\n // Seed the translations store if initial data is provided (SSR handoff).\n if (initialTranslations && initialTranslationsLocale) {\n if (!initialTranslations['__uncategorized__']) {\n initialTranslations['__uncategorized__'] = {\n __category__: '__uncategorized__',\n __symbol__: '__uncategorized__',\n } as iTranslations;\n }\n for (const cat of Object.keys(initialTranslations)) {\n initialTranslations[cat]['__category__'] = cat;\n }\n sTranslations.set(initialTranslations);\n currentlyLoadedLocale.set(initialTranslationsLocale);\n this.debug.log('Populated sTranslations with initial data for locale:', initialTranslationsLocale);\n }\n\n this.Translations.setup(this.config);\n\n // The SSR handoff already populated the stores for this locale, so prime\n // the fetch cache (after setup, which would otherwise reset this.locale).\n // The first settle for this locale is then a cache hit — no redundant\n // fetch — while switching *back* to it later still flows through\n // change() and rebuilds the t-signal. (Do NOT gate change() on a\n // \"skip fetch\" flag here: it would otherwise stay armed and silently\n // skip every return to the initial locale.)\n if (initialTranslations && initialTranslationsLocale) {\n this.Translations.markLoaded(initialTranslationsLocale);\n }\n\n // Prefetch and wire up reactive locale change handling.\n this.config.sUserLocale.subscribe((locale) => {\n if (!validateResponse.status) return;\n this.getLocalesData(locale);\n this.debug.log('SUBSCRIBING TO USER LOCALE STORE');\n this.translationsLoadingPromise = this.Translations.change(locale, false);\n });\n\n return validateResponse;\n }\n\n public async getDialCodes(inLocale?: string): Promise<iCountryDialCode[]> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.dialCodes.length && this.dialCodesLocale === locale) return this.dialCodes;\n\n const route = `countries/dial-codes/${locale}`;\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error('LangsysApp.getDialCodes failed: ' + route);\n return [];\n }\n this.dialCodes = response.data as iCountryDialCode[];\n this.dialCodesLocale = locale;\n return this.dialCodes;\n }\n\n public async getCurrencies(inLocale?: string): Promise<iCurrencyList> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.currencies.length && this.currenciesLocale === locale) return this.currencies;\n\n const route = `currencies/${locale}`;\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error('LangsysApp.getCurrencies failed: ' + route);\n return [];\n }\n this.currencies = response.data as iCurrencyList;\n this.currenciesLocale = locale;\n return this.currencies;\n }\n\n public async getCountries(inLocale?: string): Promise<iCountryList> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.countries.length && this.countriesLocale === locale) return this.countries;\n\n const route = `countries/${locale}`;\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error('LangsysApp.getCountries failed: ' + route);\n return [];\n }\n this.countries = response.data as iCountryList;\n this.countriesLocale = locale;\n return this.countries;\n }\n\n public async getCountryName(forCountryCode: string, inLocale?: string): Promise<string> {\n if (!forCountryCode) return '';\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (!this.countries.length || this.countriesLocale !== locale) await this.getCountries(inLocale);\n\n const country = this.countries.find((c) => c.code.toLowerCase() === forCountryCode.toLowerCase())?.label;\n if (!country) this.debug.warn('getCountryName failed to match', forCountryCode);\n return country || forCountryCode;\n }\n\n public async getCurrencyName(forCurrencyCode: string, inLocale?: string): Promise<string> {\n if (!forCurrencyCode) return '';\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (!this.currencies.length || this.currenciesLocale !== locale) await this.getCurrencies(inLocale);\n\n const currency = this.currencies.find((c) => c.code?.toLowerCase() === forCurrencyCode.toLowerCase())?.name;\n if (!currency) this.debug.warn('getCurrencyName failed to match', forCurrencyCode);\n return currency || forCurrencyCode;\n }\n\n public async getLocalesFormat(\n format: '' | 'flat' | 'data' = '',\n inLocale?: string\n ): Promise<iLocaleDefault | iLocaleFlat[] | iLocaleData[]> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n const route = `locales/${locale}` + (format ? `/${format}` : '');\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error(response.errors, response.status, response);\n this.debug.error('LangsysApp.getLocales failed: ' + route);\n return format === 'flat' ? [] : format === 'data' ? [] : {};\n }\n switch (format) {\n case 'flat':\n return response.data as iLocaleFlat[];\n case 'data':\n return response.data as iLocaleData[];\n default:\n return response.data as iLocaleDefault;\n }\n }\n\n public async getLocalesFlat(inLocale?: string): Promise<iLocaleFlat[]> {\n return (await this.getLocalesFormat('flat', inLocale)) as iLocaleFlat[];\n }\n\n public async getLocalesData(inLocale?: string, forceRefresh = false): Promise<iLocaleData[]> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.locales?.[locale]?.length && !forceRefresh) return this.locales[locale];\n this.locales[locale] = (await this.getLocalesFormat('data', inLocale)) as iLocaleData[];\n return this.locales[locale];\n }\n\n public async getLocales(inLocale?: string): Promise<iLocaleDefault> {\n return (await this.getLocalesFormat('', inLocale)) as iLocaleDefault;\n }\n\n public async getLocaleNameWithLookup(forLocale: string, shortName = false, inLocale?: string): Promise<string> {\n if (!forLocale) return '';\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n await this.getLocalesData(locale);\n return this.getLocaleName(forLocale, shortName, locale);\n }\n\n public getLocaleName(forLocale: string, shortName = false, inLocale?: string): string {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n let name = '';\n this.locales[locale]?.every((loc) => {\n if (loc.code === forLocale) {\n name = shortName ? loc.lang_name : loc.locale_name;\n return false;\n }\n return true;\n });\n if (!name) this.debug.warn('getLocaleNameWithLookup failed to match', forLocale);\n return name;\n }\n\n /** @deprecated use `getLocaleNameWithLookup` or `getLocaleName` */\n public async getLanguageName(forLocale: string, shortName = false, inLocale?: string): Promise<string> {\n return this.getLocaleNameWithLookup(forLocale, shortName, inLocale);\n }\n\n /**\n * Detects the end-user's preferred locale.\n *\n * - In browsers, uses `navigator.languages` with fallback to `navigator.language`.\n * - In SSR environments, parses the `Accept-Language` header.\n */\n public detectPreferredLocale(\n acceptLanguageHeader?: string | null,\n supportedLocales?: string[]\n ): string | false {\n const userLocales = this.getUserLanguagePreferences(acceptLanguageHeader);\n if (userLocales.length === 0) return false;\n\n if (supportedLocales && supportedLocales.length > 0) {\n const bestMatch = this.findBestLocaleMatch(userLocales, supportedLocales);\n if (bestMatch) return bestMatch;\n }\n\n return this.normalizeLocale(userLocales[0]);\n }\n\n private getUserLanguagePreferences(acceptLanguageHeader?: string | null): string[] {\n if (acceptLanguageHeader) {\n try {\n return this.parseAcceptLanguageHeader(acceptLanguageHeader);\n } catch (error) {\n this.debug.warn('Failed to parse Accept-Language header:', error);\n }\n }\n\n if (typeof navigator !== 'undefined') {\n if (navigator.languages && navigator.languages.length > 0) {\n return Array.from(navigator.languages);\n }\n if (navigator.language) return [navigator.language];\n }\n\n return [];\n }\n\n private parseAcceptLanguageHeader(header: string): string[] {\n if (!header || typeof header !== 'string' || header.trim() === '') return [];\n\n try {\n return header\n .split(',')\n .map((part) => {\n const trimmed = part.trim();\n if (!trimmed || trimmed === '*') return null;\n const [localePart, qPart] = trimmed.split(';q=');\n const locale = localePart?.trim();\n const q = qPart ? parseFloat(qPart) : 1.0;\n if (!locale || isNaN(q) || q <= 0 || q > 1) return null;\n return { locale, q };\n })\n .filter((item): item is { locale: string; q: number } => item !== null)\n .sort((a, b) => b.q - a.q)\n .map((item) => item.locale);\n } catch (error) {\n this.debug.warn('Error parsing Accept-Language header:', error);\n return [];\n }\n }\n\n private findBestLocaleMatch(userLocales: string[], supportedLocales: string[]): string | null {\n if (!userLocales.length || !supportedLocales.length) return null;\n\n const normalizedSupported = supportedLocales.map((l) => this.normalizeLocale(l));\n\n for (const userLocale of userLocales) {\n const normalizedUser = this.normalizeLocale(userLocale);\n if (normalizedSupported.includes(normalizedUser)) return normalizedUser;\n }\n\n for (const userLocale of userLocales) {\n const userLang = this.getLanguageCode(userLocale);\n for (const supported of normalizedSupported) {\n if (this.getLanguageCode(supported) === userLang) return supported;\n }\n }\n\n return null;\n }\n\n private normalizeLocale(locale: string): string {\n if (!locale || typeof locale !== 'string') return locale;\n const parts = locale.split(/[-_]/);\n if (parts.length === 1) return parts[0].toLowerCase();\n const language = parts[0].toLowerCase();\n const region = parts[1].toUpperCase();\n return `${language}-${region}`;\n }\n\n private getLanguageCode(locale: string): string {\n if (!locale || typeof locale !== 'string') return '';\n return locale.split(/[-_]/)[0].toLowerCase();\n }\n}\n\nexport const LangsysApp = new LangsysAppClass();\nexport type { LangsysAppClass };\n","export const isEmpty = (data: unknown): boolean => {\n if (typeof data === 'number' || typeof data === 'boolean') return false;\n if (typeof data === 'undefined' || data === null) return true;\n if (typeof (data as { length?: number }).length !== 'undefined') {\n return (data as { length: number }).length === 0;\n }\n if (typeof data === 'object') return Object.keys(data as object).length === 0;\n return false;\n};\n\nexport function structuredCloneShim<T>(obj: T): T {\n if (typeof structuredClone === 'function') return structuredClone(obj);\n\n const clone = <V>(o: V): V => {\n if (typeof o !== 'object' || o === null) return o;\n if (Array.isArray(o)) return o.map((item) => clone(item)) as unknown as V;\n const out: Record<string, unknown> = {};\n for (const key in o as object) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n out[key] = clone((o as Record<string, unknown>)[key]);\n }\n }\n return out as V;\n };\n return clone(obj);\n}\n\n// prettier-ignore\nexport function md5(inputString: string) {\n if (typeof inputString !== 'string') inputString = JSON.stringify(inputString);\n const hc = '0123456789abcdef';\n function rh(n: number) { let j, s = ''; for (j = 0; j <= 3; j++) s += hc.charAt((n >> (j * 8 + 4)) & 0x0F) + hc.charAt((n >> (j * 8)) & 0x0F); return s; }\n function ad(x: number, y: number) { const l = (x & 0xFFFF) + (y & 0xFFFF); const m = (x >> 16) + (y >> 16) + (l >> 16); return (m << 16) | (l & 0xFFFF); }\n function rl(n: number, c: number) { return (n << c) | (n >>> (32 - c)); }\n function cm(q: number, a: number, b: number, x: number, s: number, t: number) { return ad(rl(ad(ad(a, q), ad(x, t)), s), b); }\n function ff(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm((b & c) | ((~b) & d), a, b, x, s, t); }\n function gg(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm((b & d) | (c & (~d)), a, b, x, s, t); }\n function hh(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm(b ^ c ^ d, a, b, x, s, t); }\n function ii(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm(c ^ (b | (~d)), a, b, x, s, t); }\n function sb(x: string) {\n let i; const nblk = ((x.length + 8) >> 6) + 1; const blks = new Array(nblk * 16); for (i = 0; i < nblk * 16; i++) blks[i] = 0;\n for (i = 0; i < x.length; i++) blks[i >> 2] |= x.charCodeAt(i) << ((i % 4) * 8);\n blks[i >> 2] |= 0x80 << ((i % 4) * 8); blks[nblk * 16 - 2] = x.length * 8; return blks;\n }\n let i, x = sb('' + inputString), a = 1732584193, b = -271733879, c = -1732584194, d = 271733878, olda, oldb, oldc, oldd;\n for (i = 0; i < x.length; i += 16) {\n olda = a; oldb = b; oldc = c; oldd = d;\n a = ff(a, b, c, d, x[i + 0], 7, -680876936); d = ff(d, a, b, c, x[i + 1], 12, -389564586); c = ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = ff(b, c, d, a, x[i + 3], 22, -1044525330); a = ff(a, b, c, d, x[i + 4], 7, -176418897); d = ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = ff(c, d, a, b, x[i + 6], 17, -1473231341); b = ff(b, c, d, a, x[i + 7], 22, -45705983); a = ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = ff(d, a, b, c, x[i + 9], 12, -1958414417); c = ff(c, d, a, b, x[i + 10], 17, -42063); b = ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = ff(a, b, c, d, x[i + 12], 7, 1804603682); d = ff(d, a, b, c, x[i + 13], 12, -40341101); c = ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = ff(b, c, d, a, x[i + 15], 22, 1236535329); a = gg(a, b, c, d, x[i + 1], 5, -165796510); d = gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = gg(c, d, a, b, x[i + 11], 14, 643717713); b = gg(b, c, d, a, x[i + 0], 20, -373897302); a = gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = gg(d, a, b, c, x[i + 10], 9, 38016083); c = gg(c, d, a, b, x[i + 15], 14, -660478335); b = gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = gg(a, b, c, d, x[i + 9], 5, 568446438); d = gg(d, a, b, c, x[i + 14], 9, -1019803690); c = gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = gg(b, c, d, a, x[i + 8], 20, 1163531501); a = gg(a, b, c, d, x[i + 13], 5, -1444681467); d = gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = gg(c, d, a, b, x[i + 7], 14, 1735328473); b = gg(b, c, d, a, x[i + 12], 20, -1926607734); a = hh(a, b, c, d, x[i + 5], 4, -378558);\n d = hh(d, a, b, c, x[i + 8], 11, -2022574463); c = hh(c, d, a, b, x[i + 11], 16, 1839030562); b = hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = hh(a, b, c, d, x[i + 1], 4, -1530992060); d = hh(d, a, b, c, x[i + 4], 11, 1272893353); c = hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = hh(b, c, d, a, x[i + 10], 23, -1094730640); a = hh(a, b, c, d, x[i + 13], 4, 681279174); d = hh(d, a, b, c, x[i + 0], 11, -358537222);\n c = hh(c, d, a, b, x[i + 3], 16, -722521979); b = hh(b, c, d, a, x[i + 6], 23, 76029189); a = hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = hh(d, a, b, c, x[i + 12], 11, -421815835); c = hh(c, d, a, b, x[i + 15], 16, 530742520); b = hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = ii(a, b, c, d, x[i + 0], 6, -198630844); d = ii(d, a, b, c, x[i + 7], 10, 1126891415); c = ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = ii(b, c, d, a, x[i + 5], 21, -57434055); a = ii(a, b, c, d, x[i + 12], 6, 1700485571); d = ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = ii(c, d, a, b, x[i + 10], 15, -1051523); b = ii(b, c, d, a, x[i + 1], 21, -2054922799); a = ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = ii(d, a, b, c, x[i + 15], 10, -30611744); c = ii(c, d, a, b, x[i + 6], 15, -1560198380); b = ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = ii(a, b, c, d, x[i + 4], 6, -145523070); d = ii(d, a, b, c, x[i + 11], 10, -1120210379); c = ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = ii(b, c, d, a, x[i + 9], 21, -343485551); a = ad(a, olda); b = ad(b, oldb); c = ad(c, oldc); d = ad(d, oldd);\n }\n return rh(a) + rh(b) + rh(c) + rh(d);\n}\n","/**\n * Framework-agnostic content-block helpers.\n *\n * The DOM-mutating `Translate` class in `translate.ts` is one consumer of\n * these — it walks a live element, tokenizes it, registers the content\n * block, and mutates the same element in place. That model fits Svelte\n * and vanilla JS, where the SDK genuinely owns the DOM node.\n *\n * For React/Vue/Angular wrappers, mutating the DOM directly is an anti-\n * pattern — those frameworks own their rendered output. Wrappers should\n * import the helpers below to handle the framework-agnostic parts (token\n * discovery, content-block registration, dedup against the local cache)\n * and render translated content through their framework's native means.\n *\n * Wrapper pattern:\n *\n * 1. After mount, grab the rendered DOM via the framework's ref/binding.\n * 2. `const { tokens, content } = tokenizeElement(el);`\n * 3. `const customId = generateCustomId(category, tokens);`\n * 4. `if (!isContentBlockKnown(category, customId)) {`\n * ` await registerContentBlock({ custom_id: customId, category, content, tokens, label });`\n * `}`\n * 5. Subscribe to `sTranslations` + `currentlyLoadedLocale`; on change,\n * look up each token via `Translations.lookupContent(category, customId, token)`\n * and render via your framework's templating.\n */\n\nimport { LangsysAppAPI } from './api.js';\nimport { logger } from './logger.js';\nimport { config as configStore, sTranslations } from './stores.js';\nimport type { iContentBlock } from './types/content-block.js';\nimport type { iTranslations } from './types/translations.js';\nimport { md5 } from './utils.js';\n\n/** HTML attributes whose values should be harvested for translation. */\nexport const TRANSLATABLE_ATTRIBUTES = [\n 'placeholder',\n 'alt',\n 'title',\n 'aria-label',\n 'aria-placeholder',\n 'data-error',\n 'data-error-message',\n 'data-validation-message',\n 'data-invalid-message',\n 'data-required-message',\n 'data-pattern-message',\n];\n\nexport const VALUE_TRANSLATABLE_ELEMENTS = ['button'];\nexport const VALUE_TRANSLATABLE_INPUT_TYPES = ['submit', 'button'];\n\n/**\n * Semantic CSS properties captured on the cloned content so translators\n * in the Translation Manager see the content styled the way end-users do.\n */\nexport const SEMANTIC_STYLE_PROPERTIES = [\n 'font-size', 'font-weight', 'font-style', 'font-variant', 'line-height',\n 'letter-spacing', 'word-spacing', 'text-align', 'text-decoration',\n 'text-transform', 'text-indent', 'text-shadow', 'white-space', '-webkit-font-smoothing',\n 'color', 'background-color', 'background-image', 'background-position',\n 'background-size', 'background-repeat',\n 'border', 'border-top', 'border-right', 'border-bottom', 'border-left',\n 'border-radius', 'border-color', 'border-width', 'border-style',\n 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\n 'box-shadow', 'opacity', 'filter',\n 'display', 'visibility', 'list-style', 'list-style-type',\n 'cursor',\n];\n\n/**\n * Compute the deterministic content-block id from a `(category, tokens)` pair.\n *\n * JSON-stringifies the tuple so each token is unambiguously delimited\n * (the previous `tokens.join('-')` was collision-prone for tokens\n * containing a hyphen, e.g. `'e-mail'`).\n *\n * Pure function — same inputs always produce the same id. Exported so\n * framework wrappers can compute the id themselves before deciding\n * whether to call `registerContentBlock`.\n */\nexport function generateCustomId(category: string, tokens: string[]): string {\n return md5(JSON.stringify([category, tokens]));\n}\n\n/**\n * True iff the local translations cache already has the content block\n * for the given `(category, customId)` — meaning the backend knows about\n * it and there's no need to re-register.\n *\n * The cache is keyed under `'__uncategorized__'` for null/empty categories,\n * matching the convention the server uses in its GET /translations response.\n */\nexport function isContentBlockKnown(category: string, customId: string): boolean {\n const cats = sTranslations.get();\n const lookupCat = category || '__uncategorized__';\n const cbData = cats[lookupCat]?.[customId];\n return typeof cbData === 'object' && cbData !== null;\n}\n\n/**\n * POST a content block to the backend, then stamp its custom_id into the\n * local translations cache so subsequent mounts in this session — and\n * subsequent reloads, since the cache is persisted — skip the POST.\n *\n * Mirrors the standalone-phrase path's cache writeback semantics. Respects\n * `key_type === 'write'`: read-only keys silently no-op (resolves with\n * `{ status: true }` so the caller can still render the cached translation).\n *\n * Errors are logged via the SDK's logger and returned as `{ status: false }`\n * — never thrown. Callers can decide whether to surface to UI or swallow.\n */\nexport async function registerContentBlock(\n contentBlock: iContentBlock,\n): Promise<{ status: boolean; errors?: unknown[] }> {\n if (configStore.key_type !== 'write') {\n if (configStore.debug) {\n logger.log(`Skipping content block save (API key is ${configStore.key_type || 'unknown'})`);\n }\n return { status: true };\n }\n\n try {\n const response = await LangsysAppAPI.createTranslatableItems([\n {\n type: 'content_block',\n custom_id: contentBlock.custom_id,\n category: contentBlock.category,\n content: contentBlock.content,\n label: contentBlock.label,\n phrases: contentBlock.tokens.map((phrase) => ({ phrase })),\n },\n ]);\n if (!response.status) {\n logger.error('Could not save content block', response.errors);\n return { status: false, errors: response.errors as unknown[] | undefined };\n }\n _writeKnownContentBlockToCache(contentBlock.category, contentBlock.custom_id);\n return { status: true };\n } catch (err) {\n logger.error('Could not save content block', err);\n return { status: false, errors: [err] };\n }\n}\n\n/**\n * Walk an `HTMLElement`, collecting tokens for translation and producing a\n * cloned-and-stylized snapshot of its outerHTML for the Translation Manager.\n *\n * Tokens harvested:\n * - text-node content (whitespace-normalized, trimmed)\n * - translatable attribute values (`placeholder`, `alt`, `title`, `aria-*`, etc.)\n * - button/input/select value text\n *\n * Skips subtrees marked with `translate=\"no\"`.\n *\n * The returned `content` is a string snapshot — the live element is not\n * mutated. Computed semantic styles (color, font, spacing, etc.) are inlined\n * onto the clone so translators see content styled the way end-users do.\n *\n * Requires that `element` is mounted in the document so `getComputedStyle`\n * can read its style. For SSR / pre-mount callers, the style capture step\n * silently no-ops and the snapshot is plain (without inlined styles).\n */\nexport function tokenizeElement(element: HTMLElement): { tokens: string[]; content: string } {\n const tokens: string[] = [];\n const clone = element.cloneNode(true) as HTMLElement;\n _walkForTokens(element, Array.from(clone.childNodes), tokens, []);\n return { tokens, content: clone.outerHTML };\n}\n\n// ---------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------\n\nfunction _writeKnownContentBlockToCache(category: string, customId: string): void {\n const lookupCat = category || '__uncategorized__';\n sTranslations.update((current) => {\n if (!current[lookupCat]) {\n current[lookupCat] = {\n __category__: lookupCat,\n __symbol__: lookupCat,\n } as iTranslations;\n }\n (current[lookupCat] as unknown as Record<string, unknown>)[customId] = {};\n return { ...current };\n });\n}\n\nfunction _walkForTokens(\n liveRoot: HTMLElement,\n cloneNodes: ChildNode[],\n tokens: string[],\n indices: number[],\n): void {\n cloneNodes.forEach((node, index) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (el.getAttribute('translate') === 'no') return;\n // A <Phrase> subtree is its own self-managed rich phrase — skip it\n // here so the content block doesn't tokenize its inner text.\n if (el.hasAttribute('data-ls-phrase')) return;\n }\n\n if (node.hasChildNodes()) {\n _applyStylesToClone(liveRoot, node as HTMLElement, [...indices, index]);\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n _tokenizeAttributes(node as HTMLElement, tokens);\n }\n\n const contentToken = node.nodeValue?.replace(/\\s+/g, ' ').trim();\n if (node.nodeType === Node.TEXT_NODE && contentToken) {\n tokens.push(contentToken);\n return;\n }\n\n if (!node.hasChildNodes()) return;\n _walkForTokens(liveRoot, Array.from(node.childNodes), tokens, [...indices, index]);\n });\n}\n\nfunction _tokenizeAttributes(element: HTMLElement, tokens: string[]): void {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === 'img') {\n const img = element as HTMLImageElement;\n if (img.src) element.setAttribute('src', img.src);\n }\n\n for (const attr of TRANSLATABLE_ATTRIBUTES) {\n const value = element.getAttribute(attr)?.trim();\n if (value) tokens.push(value);\n }\n\n if (VALUE_TRANSLATABLE_ELEMENTS.includes(tagName)) {\n const value = element.getAttribute('value')?.trim();\n if (value) tokens.push(value);\n }\n\n if (tagName === 'input') {\n const inputType = element.getAttribute('type')?.toLowerCase();\n if (inputType && VALUE_TRANSLATABLE_INPUT_TYPES.includes(inputType)) {\n const value = element.getAttribute('value')?.trim();\n if (value) tokens.push(value);\n }\n }\n\n if (tagName === 'select') {\n const options = element.querySelectorAll('option');\n options.forEach((option) => {\n const optionText = option.textContent?.trim();\n if (optionText) tokens.push(optionText);\n });\n }\n}\n\nfunction _applyStylesToClone(liveRoot: HTMLElement, cloneNode: HTMLElement, indices: number[]): void {\n if (typeof window === 'undefined') return;\n const domNode = _findNode(Array.from(liveRoot.childNodes), indices);\n if (!domNode) return;\n\n const tagName = (domNode as HTMLElement).tagName.toLowerCase();\n const reference = document.createElement(tagName);\n reference.style.visibility = 'hidden';\n reference.style.position = 'absolute';\n document.body.appendChild(reference);\n\n const computed = window.getComputedStyle(domNode as HTMLElement);\n const defaults = window.getComputedStyle(reference);\n\n for (const prop of SEMANTIC_STYLE_PROPERTIES) {\n const value = computed.getPropertyValue(prop);\n const defaultValue = defaults.getPropertyValue(prop);\n if (value && value !== defaultValue) {\n cloneNode.style.setProperty(prop, value);\n }\n }\n\n document.body.removeChild(reference);\n cloneNode.removeAttribute('class');\n}\n\nfunction _findNode(nodes: ChildNode[], indices: number[]): Element | undefined {\n let currentNode: Node | undefined = nodes[indices[0]];\n for (let i = 1; i < indices.length; i++) {\n if (!currentNode || !currentNode.hasChildNodes()) return undefined;\n currentNode = Array.from(currentNode.childNodes)[indices[i]];\n }\n return currentNode as Element;\n}\n","import {\n generateCustomId,\n isContentBlockKnown,\n registerContentBlock,\n tokenizeElement,\n TRANSLATABLE_ATTRIBUTES,\n VALUE_TRANSLATABLE_ELEMENTS,\n VALUE_TRANSLATABLE_INPUT_TYPES,\n} from './content-block.js';\nimport { LangsysApp } from './langsys-app.js';\nimport { currentlyLoadedLocale, config as configStore } from './stores.js';\nimport type { Unsubscriber } from './signal.js';\nimport type { iContentBlock } from './types/content-block.js';\nimport { isEmpty } from './utils.js';\n\n/** Options for the `Translate` class. Matches the Svelte component's props. */\nexport interface TranslateOptions {\n /** Optional category under which tokens are registered. Helps translators disambiguate. */\n category?: string;\n /** Optional stable id for the content block. If omitted, we hash category+tokens. */\n custom_id?: string;\n /** Optional human-readable label shown in the Translation Manager. */\n label?: string;\n}\n\ntype iNode = Node & { originalNodeValue?: string | null };\ntype iElement = HTMLElement & { originalAttributes?: Record<string, string> };\n\n/**\n * Wrap a DOM element and manage translation for its contents.\n *\n * const el = document.querySelector('#hero');\n * new Translate(el, { category: 'Home' });\n *\n * The first-pass tokenizes text nodes and translatable attributes; if the\n * content is a single text run, it's treated as a plain token. For HTML\n * content, a \"content block\" is registered so translators see the content\n * with the same visual structure users see.\n *\n * Call `.destroy()` to stop reacting to locale changes.\n */\nexport class Translate {\n private element: HTMLElement;\n private options: TranslateOptions;\n private tokens: string[] = [];\n private parseComplete = false;\n private isTokenizing = false;\n private lastTranslatedLocale = '';\n private custom_id: string;\n private unsubscribeLocale: Unsubscriber | null = null;\n\n constructor(element: HTMLElement, options: TranslateOptions = {}) {\n this.element = element;\n this.options = { ...options };\n this.custom_id = options.custom_id || '';\n\n // First pass: tokenize + save + translate.\n void this.tokenizeContent();\n\n // React to locale changes.\n this.unsubscribeLocale = currentlyLoadedLocale.subscribe((locale) => {\n if (locale && this.parseComplete) this.translateUpdate(locale);\n });\n }\n\n /** Stop reacting to locale changes. Safe to call multiple times. */\n public destroy() {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n }\n\n private translateUpdate(currentLocale: string) {\n if (!this.element?.innerHTML || !this.parseComplete) return;\n if (this.lastTranslatedLocale === currentLocale) return;\n\n const { category = '' } = this.options;\n\n if (this.tokens.length === 1) {\n this.element.innerText = LangsysApp.Translations.t(this.tokens[0], category);\n } else {\n this.translate(Array.from(this.element.childNodes));\n this.lastTranslatedLocale = currentLocale;\n }\n }\n\n private async tokenizeContent(): Promise<boolean> {\n if (this.isTokenizing) return false;\n if (!this.element || !this.element.childNodes.length) {\n this.parseComplete = true;\n this.isTokenizing = false;\n return false;\n }\n\n this.isTokenizing = true;\n\n // Framework-agnostic tokenization + style-snapshot lives in\n // content-block.ts. We store the clone locally only because the\n // existing translate() DOM-mutator references it for content-block\n // detection (`this.tokens` drives the single-vs-multi branch below).\n const { tokens, content } = tokenizeElement(this.element);\n this.tokens = tokens;\n\n const { category = '' } = this.options;\n\n if (this.tokens.length === 1) {\n this.element.innerText = LangsysApp.Translations.t(this.tokens[0], category);\n } else {\n const contentBlock: iContentBlock = {\n custom_id: '',\n category,\n label: this.options.label,\n content,\n tokens: this.tokens,\n };\n await this.handleContentBlock(contentBlock);\n }\n\n this.parseComplete = true;\n this.isTokenizing = false;\n return true;\n }\n\n private async handleContentBlock(contentBlock: iContentBlock) {\n if (isEmpty(this.custom_id)) {\n this.custom_id = generateCustomId(contentBlock.category, contentBlock.tokens);\n }\n contentBlock.custom_id = this.custom_id;\n\n // Wait for the first GET /translations to settle before deciding whether\n // to POST — otherwise on a cold cache the lookup misses and we'd POST\n // every CB on every first visit even when the backend already has it.\n await LangsysApp.Translations.ready();\n\n if (isContentBlockKnown(contentBlock.category, this.custom_id)) {\n // Backend already has this block — translate locally, no POST.\n if (this.tokens.length > 1 && this.element) {\n this.translate(Array.from(this.element.childNodes));\n this.lastTranslatedLocale = currentlyLoadedLocale.get();\n }\n return;\n }\n\n // Fire-and-forget: registerContentBlock handles its own errors via\n // the logger. We don't await here because the DOM render path below\n // doesn't depend on the POST completing — translations are looked up\n // from sTranslations on every render, which updates reactively when\n // the GET response arrives.\n void registerContentBlock(contentBlock);\n\n if (this.tokens.length > 1 && this.element) {\n this.translate(Array.from(this.element.childNodes));\n this.lastTranslatedLocale = currentlyLoadedLocale.get();\n }\n }\n\n private translate(nodes: iNode[]) {\n const currentLocale = currentlyLoadedLocale.get();\n if (\n currentLocale === configStore.baseLocale &&\n (this.lastTranslatedLocale === '' || this.lastTranslatedLocale === configStore.baseLocale)\n ) {\n return;\n }\n\n nodes.forEach((node) => {\n if (node?.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.getAttribute('translate') === 'no') return;\n // A <Phrase> subtree manages its own rendering — don't recurse.\n if (element.hasAttribute('data-ls-phrase')) return;\n this.translateAttributes(node as iElement);\n }\n\n if (node?.nodeType !== Node.TEXT_NODE) {\n if (!node?.hasChildNodes()) return;\n this.translate(Array.from(node.childNodes));\n return;\n }\n\n if (isEmpty(node.nodeValue?.trim())) return;\n\n if (isEmpty(node.originalNodeValue)) {\n node.originalNodeValue = node.nodeValue;\n }\n\n const contentToken = node.originalNodeValue?.replace(/\\s+/g, ' ').trim();\n if (!contentToken) return;\n\n const translation = this.getTranslation(contentToken);\n\n if (translation && contentToken && node.originalNodeValue) {\n node.nodeValue = node.originalNodeValue.replace(contentToken, translation);\n } else if (node.originalNodeValue) {\n node.nodeValue = node.originalNodeValue;\n }\n });\n }\n\n private getTranslation(token: string): string | null {\n if (!token) return null;\n const { category = '' } = this.options;\n return LangsysApp.Translations.lookupContent(category, this.custom_id, token);\n }\n\n private translateAttributes(element: iElement) {\n const tagName = element.tagName.toLowerCase();\n if (!element.originalAttributes) element.originalAttributes = {};\n\n for (const attr of TRANSLATABLE_ATTRIBUTES) {\n this.translateAttribute(element, attr);\n }\n\n if (VALUE_TRANSLATABLE_ELEMENTS.includes(tagName)) {\n this.translateAttribute(element, 'value');\n }\n\n if (tagName === 'input') {\n const inputType = element.getAttribute('type')?.toLowerCase();\n if (inputType && VALUE_TRANSLATABLE_INPUT_TYPES.includes(inputType)) {\n this.translateAttribute(element, 'value');\n }\n }\n\n if (tagName === 'select') {\n const options = element.querySelectorAll('option');\n options.forEach((option) => {\n const optionEl = option as iElement;\n if (!optionEl.originalAttributes) optionEl.originalAttributes = {};\n if (optionEl.originalAttributes['textContent'] === undefined) {\n optionEl.originalAttributes['textContent'] = option.textContent || '';\n }\n const originalText = optionEl.originalAttributes['textContent'].trim();\n if (originalText) {\n const translation = this.getTranslation(originalText);\n option.textContent = translation || optionEl.originalAttributes['textContent'];\n }\n });\n }\n }\n\n private translateAttribute(element: iElement, attr: string) {\n const currentValue = element.getAttribute(attr);\n if (!currentValue) return;\n\n if (element.originalAttributes![attr] === undefined) {\n element.originalAttributes![attr] = currentValue;\n }\n\n const originalValue = element.originalAttributes![attr].trim();\n if (!originalValue) return;\n\n const translation = this.getTranslation(originalValue);\n if (translation) element.setAttribute(attr, translation);\n else element.setAttribute(attr, element.originalAttributes![attr]);\n }\n\n}\n\nexport default Translate;\n","/**\n * Rich-text (markup-bearing) phrase encoding for the `<Phrase>` artifact.\n *\n * The problem: a phrase like `You have {n} <strong>reviews</strong>` must stay\n * ONE phrase (so pluralization sees `{n}` next to `reviews`), but we must NOT\n * send the SPA's real markup — and especially not framework-internal scoped-CSS\n * classes (`svelte-a1b2c3`, Vue scoped hashes) — to the translator. Those\n * classes get mangled, and worse they change on every build, which would make\n * the phrase key drift and silently re-translate everything.\n *\n * The approach: replace each inline element with a pair of neutral MARKUP\n * TOKENS — `{m0o}` ... `{m0c}` (markup, slot 0, open/close). These are ordinary\n * ICU placeholders: valid MessageFormat argument names, so plural/select still\n * parse, and the model treats them like `{n}` — it preserves them and PLACES\n * them around the translated word (which is what fixes reordering languages,\n * e.g. `<span>White</span> House` -> `Casa <span>Blanca</span>`).\n *\n * The real DOM elements never leave the SDK. At render time we resolve the\n * translation, substitute each markup token with a private-use SENTINEL char\n * (transient — never sent anywhere), then reconstitute the DOM by wrapping the\n * sentinel-delimited spans in the ORIGINAL framework-owned elements. Scoped CSS\n * survives because we reuse the real element; the phrase key is stable because\n * the wire form only ever contains `{m0o}`/`{m0c}`, never build-specific hashes.\n */\n\n// Private-use (PUA) sentinel delimiters, written via char codes so no literal\n// PUA characters live in the source. Brace-free so ICU MessageFormat treats a\n// substituted sentinel as literal text. They exist only transiently at render —\n// never registered, never sent over the wire (the wire form uses {mNo}/{mNc}).\n// open(i) = U+E000 <i> U+E001\n// close(i) = U+E002 <i> U+E003\nconst SENT_OPEN_START = String.fromCharCode(0xe000);\nconst SENT_OPEN_END = String.fromCharCode(0xe001);\nconst SENT_CLOSE_START = String.fromCharCode(0xe002);\nconst SENT_CLOSE_END = String.fromCharCode(0xe003);\n\n/** Matches an open marker (group 1 = slot index) or a close marker (group 2 = slot index). */\nconst SENT_SCAN = /\\uE000(\\d+)\\uE001|\\uE002(\\d+)\\uE003/g;\n\n/** A captured inline element: a shallow clone (tag + attributes, no children). */\nexport interface RichSlot {\n /** Shallow clone of the original element — preserves tag, class, href, etc. */\n template: HTMLElement;\n}\n\nexport interface EncodedRichText {\n /**\n * The phrase string with inline elements replaced by `{mNo}`...`{mNc}` markup\n * tokens. This is what gets registered + sent for translation.\n */\n phrase: string;\n /** Captured inline elements, indexed by markup-token slot number. */\n slots: RichSlot[];\n}\n\n/**\n * Walk an element's subtree and produce the encoded phrase + captured slots.\n *\n * Text nodes contribute their (whitespace-collapsed) text. Each child element\n * becomes a markup-token pair wrapping its recursively-encoded contents, and a\n * shallow clone of the element is captured as a slot. Nesting is preserved.\n */\nexport function encodeRichText(root: HTMLElement): EncodedRichText {\n const slots: RichSlot[] = [];\n const phrase = _encodeNodes(Array.from(root.childNodes), slots);\n return { phrase: phrase.replace(/\\s+/g, ' ').trim(), slots };\n}\n\nfunction _encodeNodes(nodes: ChildNode[], slots: RichSlot[]): string {\n let out = '';\n for (const node of nodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n out += node.nodeValue ?? '';\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n\n const element = node as HTMLElement;\n const index = slots.length;\n slots.push({ template: element.cloneNode(false) as HTMLElement });\n out += `{m${index}o}` + _encodeNodes(Array.from(element.childNodes), slots) + `{m${index}c}`;\n }\n return out;\n}\n\n/**\n * The param values to feed alongside the user's params when resolving a rich\n * phrase. Each markup token maps to its sentinel pair so the resolved string\n * carries machine-findable delimiters for reconstitution.\n */\nexport function markupTokenValues(slotCount: number): Record<string, string> {\n const values: Record<string, string> = {};\n for (let i = 0; i < slotCount; i++) {\n values[`m${i}o`] = `${SENT_OPEN_START}${i}${SENT_OPEN_END}`;\n values[`m${i}c`] = `${SENT_CLOSE_START}${i}${SENT_CLOSE_END}`;\n }\n return values;\n}\n\n/**\n * Rebuild DOM nodes from a resolved string containing sentinel-delimited spans.\n *\n * The original (framework-owned) elements are reused as wrappers — so scoped\n * CSS classes / attributes survive — with the translated text placed inside.\n *\n * Robust to model mistakes: if sentinels are unbalanced (a tag dropped or a\n * stray close), we fall back to a single plain-text node (markers stripped) —\n * \"lose the markup, keep the meaning\" rather than throw.\n */\nexport function reconstitute(resolved: string, slots: RichSlot[], doc: Document = document): Node[] {\n const root = doc.createDocumentFragment();\n const stack: Node[] = [root];\n const top = () => stack[stack.length - 1];\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n SENT_SCAN.lastIndex = 0;\n\n try {\n while ((match = SENT_SCAN.exec(resolved)) !== null) {\n const text = resolved.slice(lastIndex, match.index);\n if (text) top().appendChild(doc.createTextNode(text));\n lastIndex = SENT_SCAN.lastIndex;\n\n const isOpen = match[1] !== undefined;\n const slotIndex = Number(isOpen ? match[1] : match[2]);\n\n if (isOpen) {\n const slot = slots[slotIndex];\n if (!slot) throw new Error('unknown markup slot');\n const el = slot.template.cloneNode(false) as HTMLElement;\n top().appendChild(el);\n stack.push(el);\n } else {\n if (stack.length <= 1) throw new Error('unbalanced close');\n stack.pop();\n }\n }\n\n const tail = resolved.slice(lastIndex);\n if (tail) top().appendChild(doc.createTextNode(tail));\n\n if (stack.length !== 1) throw new Error('unbalanced open');\n } catch {\n // Degrade gracefully: strip every marker and return plain text.\n return [doc.createTextNode(stripSentinels(resolved))];\n }\n\n return Array.from(root.childNodes);\n}\n\n/** Remove any sentinel markers from a string, leaving the bare text. */\nexport function stripSentinels(value: string): string {\n return value.replace(SENT_SCAN, '');\n}\n","import { interpolate } from './interpolate.js';\nimport { LangsysApp } from './langsys-app.js';\nimport { encodeRichText, markupTokenValues, reconstitute, type RichSlot } from './richtext.js';\nimport type { Unsubscriber } from './signal.js';\nimport { currentlyLoadedLocale, sTranslations } from './stores.js';\n\n/** Attribute marker the `Translate` tokenizer uses to skip a `<Phrase>` subtree. */\nexport const PHRASE_MARKER_ATTR = 'data-ls-phrase';\n\nexport interface PhraseOptions {\n /** Category the phrase registers under (disambiguation for translators). */\n category?: string;\n /** Interpolation params — `{n}` for pluralization, `{name}`, etc. */\n params?: Record<string, unknown>;\n}\n\n/**\n * DOM handler for a markup-bearing \"rich\" phrase (`<Phrase>`).\n *\n * Wraps an element whose inner content is ONE translatable phrase even though\n * it contains inline markup. On mount it encodes the subtree to a single phrase\n * string with neutral `{mNo}`/`{mNc}` markup tokens (the real elements stay in\n * the SDK — see richtext.ts), registers it, and renders the translation by\n * reconstituting the original elements around the translated text. Re-renders\n * on locale change and whenever params change.\n *\n * new Phrase(el, { category: 'ProductCard', params: { n: reviewCount } });\n */\nexport class Phrase {\n private host: HTMLElement;\n private category: string;\n private params: Record<string, unknown>;\n private phrase = '';\n private slots: RichSlot[] = [];\n private unsubscribers: Unsubscriber[] = [];\n private ready = false;\n\n constructor(host: HTMLElement, options: PhraseOptions = {}) {\n this.host = host;\n this.category = options.category ?? '';\n this.params = options.params ?? {};\n\n void this._init();\n\n // Re-render on locale switch AND when translations arrive (async MT may\n // land this phrase's translation after mount, same as the reactive `t`\n // store). subscribe fires immediately; the `ready` guard suppresses the\n // pre-init call.\n const rerender = () => {\n if (this.ready) this._render();\n };\n this.unsubscribers.push(currentlyLoadedLocale.subscribe(rerender));\n this.unsubscribers.push(sTranslations.subscribe(rerender));\n }\n\n /** Update interpolation params (e.g. a changed count) and re-render. */\n public setParams(params: Record<string, unknown>): void {\n this.params = params ?? {};\n if (this.ready) this._render();\n }\n\n /** Stop reacting to locale/translation changes. Safe to call multiple times. */\n public destroy(): void {\n this.unsubscribers.forEach((unsub) => unsub());\n this.unsubscribers = [];\n }\n\n private async _init(): Promise<void> {\n if (!this.host || !this.host.childNodes.length) {\n this.ready = true;\n return;\n }\n\n const { phrase, slots } = encodeRichText(this.host);\n this.phrase = phrase;\n this.slots = slots;\n\n // Register the phrase (triggers the missing-token POST on a cache miss).\n // We ignore t()'s interpolated return — Phrase renders itself so it can\n // supply the markup-token sentinel values and reconstitute real elements.\n await LangsysApp.Translations.ready();\n LangsysApp.Translations.t(this.phrase, this.category);\n\n this.ready = true;\n this._render();\n }\n\n private _render(): void {\n if (!this.phrase) return;\n\n const raw = LangsysApp.Translations.lookup(this.phrase, this.category) ?? this.phrase;\n const params = { ...this.params, ...markupTokenValues(this.slots.length) };\n const resolved = interpolate(raw, params, currentlyLoadedLocale.get());\n const nodes = reconstitute(resolved, this.slots, this.host.ownerDocument ?? document);\n\n this.host.replaceChildren(...nodes);\n }\n}\n\nexport default Phrase;\n","/**\n * Langsys SDK — framework-agnostic TypeScript\n *\n * Realtime continuous translations with automatic token discovery for any\n * web app. The public translation surface is `t(phrase, category?, params?)`\n * — the phrase itself is the lookup key (and the source-language default).\n * Frameworks subscribe to `tSignal` for reactive re-renders.\n */\n\n// Public singletons and classes\nexport { LangsysApp } from './langsys-app.js';\nexport { Translations } from './translations.js';\nexport { Translate, type TranslateOptions } from './translate.js';\nexport { Phrase, PHRASE_MARKER_ATTR, type PhraseOptions } from './phrase.js';\nexport {\n encodeRichText,\n reconstitute,\n markupTokenValues,\n stripSentinels,\n type RichSlot,\n type EncodedRichText,\n} from './richtext.js';\nexport { LangsysAppAPI } from './api.js';\n\n// Content-block helpers (framework-agnostic — for React/Vue/Angular/other\n// wrappers that own their own DOM rendering and only need the registration\n// + dedup primitives, not the Svelte/vanilla in-place DOM mutator).\nexport {\n generateCustomId,\n isContentBlockKnown,\n registerContentBlock,\n tokenizeElement,\n} from './content-block.js';\n\n// Reactive primitives\nexport { createSignal, getValue, type Signal, type Subscriber, type Unsubscriber, type Updater } from './signal.js';\nexport { persist } from './persist.js';\n\n// Stores (advanced usage — direct subscription to translations / locale)\nexport { sTranslations, currentlyLoadedLocale } from './stores.js';\n\n// Logger\nexport { Logger, logger } from './logger.js';\n\n// Utility exports\nexport { md5, isEmpty } from './utils.js';\nexport { interpolate, isICU } from './interpolate.js';\n\n// Type re-exports\nexport type { ResponseObject as iLangsysResponse } from './types/api.js';\nexport type { iLangsysConfig, iLangsysInitConfig, LocaleSource } from './types/config.js';\nexport type { iContentBlock } from './types/content-block.js';\nexport type { iCountry, iCountryDialCode, iCountryList } from './types/countries.js';\nexport type { iCurrency, iCurrencyList } from './types/currencies.js';\nexport type { iLanguageName, iLocaleData, iLocaleDefault, iLocaleFlat } from './types/locales.js';\nexport type { iProject } from './types/project.js';\nexport type {\n ExtractParamKeys,\n ParamPrimitive,\n ParamsFor,\n TArgs,\n TFunction,\n TranslationParams,\n} from './types/translation-fn.js';\nexport type { iCategories, iTranslations } from './types/translations.js';\n\n// Convenience exports — `t` is a stable function that delegates to the\n// LangsysApp singleton (reads fresh state on every call). `tSignal` is the\n// reactive primitive frameworks bind to.\nimport { LangsysApp as _LangsysApp } from './langsys-app.js';\nimport type { TFunction } from './types/translation-fn.js';\n\nexport const t: TFunction = ((phrase: string, ...rest: unknown[]): string => {\n // Forward all args verbatim; the underlying TFunction implementation\n // handles the (phrase) / (phrase, params) / (phrase, category) /\n // (phrase, category, params) overload discrimination at runtime.\n return (_LangsysApp.Translations.t as (...a: unknown[]) => string)(phrase, ...rest);\n}) as TFunction;\n\nexport const tSignal = _LangsysApp.Translations.tSignal;\n"]}
1
+ {"version":3,"sources":["../src/signal.ts","../src/logger.ts","../src/api.ts","../src/persist.ts","../src/stores.ts","../src/interpolate.ts","../src/translations.ts","../src/langsys-app.ts","../src/utils.ts","../src/content-block.ts","../src/translate.ts","../src/richtext.ts","../src/phrase.ts","../src/index.ts"],"names":["config","IntlMessageFormat","t","initialTranslations","x","c","a","b","d","i"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Tiny framework-agnostic reactive value holder — our replacement for a\n * Svelte `Writable<T>`. The shape is deliberately similar so the mental\n * model is identical: subscribe/set/update/get.\n *\n * Usage:\n * const locale = createSignal('en-us');\n * locale.subscribe((v) => console.log('locale is now', v));\n * locale.set('fr-fr');\n * locale.get(); // 'fr-fr'\n *\n * Subscribe is called synchronously with the current value on registration\n * (same semantics as a Svelte store).\n */\nexport type Subscriber<T> = (value: T) => void;\nexport type Unsubscriber = () => void;\nexport type Updater<T> = (value: T) => T;\n\nexport interface Signal<T> {\n /** Register a subscriber; it's called immediately with the current value. Returns an unsubscribe function. */\n subscribe(run: Subscriber<T>): Unsubscriber;\n /** Set the value and notify subscribers. */\n set(value: T): void;\n /** Update the value via a function and notify subscribers. */\n update(fn: Updater<T>): void;\n /** Read the current value without subscribing. */\n get(): T;\n}\n\nexport function createSignal<T>(initial: T): Signal<T> {\n let value: T = initial;\n const subscribers = new Set<Subscriber<T>>();\n\n const subscribe = (run: Subscriber<T>): Unsubscriber => {\n subscribers.add(run);\n run(value);\n return () => {\n subscribers.delete(run);\n };\n };\n\n const set = (next: T): void => {\n if (Object.is(value, next)) return;\n value = next;\n for (const run of subscribers) run(value);\n };\n\n const update = (fn: Updater<T>): void => {\n set(fn(value));\n };\n\n const get = (): T => value;\n\n return { subscribe, set, update, get };\n}\n\n/** Synchronously read a Signal's value. Mirrors svelte's `get(store)`. */\nexport function getValue<T>(signal: Signal<T>): T {\n return signal.get();\n}\n","/**\n * Lightweight debug logger. Styled in browsers (via %c), plain text in Node.\n * Replaces the pre-existing `echo` module from the Svelte SDK with a simpler,\n * SSR-safe equivalent.\n */\n\nconst STYLES = {\n log: 'display:inline-block;background:rgb(239,239,244);color:black;font-weight:bold;padding:3px 7px;border-radius:3px',\n warn: 'display:inline-block;background:gold;color:black;font-weight:bold;padding:3px 7px;border-radius:3px',\n error: 'display:inline-block;background:#e0005a;color:#fff;font-weight:bold;padding:3px 7px;border-radius:3px',\n};\n\nconst supportsStyle = typeof window !== 'undefined';\n\nfunction emit(level: 'log' | 'warn' | 'error', label: string, args: unknown[]) {\n // Browsers render %c style. Node just gets the plain string.\n if (supportsStyle) {\n // eslint-disable-next-line no-console\n console[level](`%c${label}`, STYLES[level], ...args);\n } else {\n // eslint-disable-next-line no-console\n console[level](`[${label}]`, ...args);\n }\n}\n\nexport class Logger {\n debugEnabled: boolean;\n\n constructor(debugEnabled = false) {\n this.debugEnabled = debugEnabled;\n }\n\n log(...args: unknown[]) {\n if (!this.debugEnabled) return;\n emit('log', 'Langsys Debug', args);\n }\n\n warn(...args: unknown[]) {\n emit('warn', 'Langsys Warning', args);\n }\n\n error(...args: unknown[]) {\n emit('error', 'Langsys Error', args);\n }\n}\n\nexport const logger = new Logger(false);\n","import { createSignal } from './signal.js';\nimport type { HttpResponse, ResponseObject } from './types/api.js';\nimport type { iLangsysConfig } from './types/config.js';\nimport { logger } from './logger.js';\n\ntype Method = 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'PUT';\n\nclass LangsysAppAPIClass {\n private apiurl = 'https://api.langsys.dev/api';\n public config: iLangsysConfig;\n private headers: { 'Content-Type': string; 'x-Authorization': string; 'X-Langsys-Capabilities': string };\n\n constructor() {\n this.config = {\n projectid: '',\n key: '',\n sUserLocale: createSignal(''),\n baseLocale: 'en',\n };\n this.headers = {\n 'Content-Type': 'application/json; charset=utf-8',\n 'x-Authorization': this.config.key,\n // Declare ICU MessageFormat rendering so the server sends raw ICU\n // (plural/select) instead of flat-template downgrades. Pre-ICU\n // builds omit this header and keep receiving flat strings.\n 'X-Langsys-Capabilities': 'icu',\n };\n }\n\n public setup(config: iLangsysConfig) {\n if (config?.key && config?.projectid) {\n this.config = config;\n this.headers['x-Authorization'] = this.config.key;\n }\n }\n\n /** Optional hook to point the client at a different API host. */\n public setBaseUrl(url: string) {\n this.apiurl = url.replace(/\\/$/, '');\n }\n\n public async validate(config: iLangsysConfig) {\n this.setup(config);\n return await this.get('authorize-project/[projectid]');\n }\n\n public async getTranslations(locale: string) {\n return await this.get('translations', { project_id: this.config.projectid, locale });\n }\n\n /**\n * Register phrases and/or content blocks via the current unified endpoint.\n * Each item carries `type: 'phrase' | 'content_block'`. Replaces the\n * deprecated `projects/{id}/tokens` and `projects/{id}/content-blocks` routes.\n */\n public async createTranslatableItems(items: Array<Record<string, unknown>>) {\n return await this.post('translatable-items', {\n project_id: this.config.projectid,\n translatable_items: items,\n });\n }\n\n public async post(path: string, data: Record<string, unknown> = {}) {\n return await this.send('POST', path, data);\n }\n public async get(path: string, data: Record<string, unknown> = {}) {\n return await this.send('GET', path, data);\n }\n public async delete(path: string, data: Record<string, unknown> = {}) {\n return await this.send('DELETE', path, data);\n }\n public async patch(path: string, data: Record<string, unknown> = {}) {\n return await this.send('PATCH', path, data);\n }\n public async put(path: string, data: Record<string, unknown> = {}) {\n return await this.send('PUT', path, data);\n }\n\n private async send(method: Method, path: string, data: Record<string, unknown> = {}): Promise<ResponseObject> {\n if (!this.config.projectid || !this.config.key) {\n return {\n status: false,\n errors: ['Missing projectid or API key in configuration'],\n http: {\n status: 0,\n statusText: 'Configuration Error',\n url: `${this.apiurl}/${path}`,\n data: JSON.stringify(data),\n },\n };\n }\n\n // API calls should not include a leading slash.\n if (path.startsWith('/')) path = path.substring(1);\n\n // Replace [projectid] token with the actual configured projectid.\n if (path.includes('/[projectid]')) {\n path = path.replaceAll('/[projectid]', `/${this.config.projectid}`);\n }\n\n try {\n const querystring =\n method === 'GET'\n ? '?' + new URLSearchParams(data as Record<string, string>).toString()\n : '';\n\n const query = await fetch(`${this.apiurl}/${path}${querystring === '?' ? '' : querystring}`, {\n headers: this.headers,\n method,\n body: method === 'GET' ? undefined : JSON.stringify(data),\n });\n\n const responseData = (await query.json()) as ResponseObject;\n const http: HttpResponse = {\n status: query.status,\n statusText: query.statusText,\n url: query.url,\n data: JSON.stringify(data),\n };\n responseData.http = http;\n\n if (!query.ok) {\n logger.warn('LangsysAppAPI failed to query', responseData);\n return {\n status: false,\n errors: [`HTTP ${query.status}: ${query.statusText}`],\n data: responseData,\n http,\n };\n }\n\n return responseData;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred';\n logger.error('LangsysAppAPI Error:', errorMessage);\n logger.error('Request details:', {\n method,\n url: `${this.apiurl}/${path}`,\n data,\n });\n return {\n status: false,\n errors: ['Error communicating with API Server', errorMessage],\n http: {\n status: 0,\n statusText: 'Network Error',\n url: `${this.apiurl}/${path}`,\n data: JSON.stringify(data),\n },\n };\n }\n }\n}\n\nexport const LangsysAppAPI = new LangsysAppAPIClass();\nexport default LangsysAppAPI;\n","import { createSignal, type Signal } from './signal.js';\n\n/**\n * Create a Signal whose value is persisted to localStorage (when available).\n * Falls back to in-memory behavior during SSR or when storage is unavailable\n * or quota-exceeded. Stored value is JSON-encoded.\n */\nexport function persist<T>(key: string, initial: T): Signal<T> {\n const storage = getSafeStorage();\n let seed = initial;\n\n if (storage) {\n try {\n const raw = storage.getItem(key);\n if (raw !== null) seed = JSON.parse(raw) as T;\n } catch {\n // Corrupt value; fall through to initial.\n }\n }\n\n const signal = createSignal<T>(seed);\n\n if (storage) {\n signal.subscribe((value) => {\n try {\n storage.setItem(key, JSON.stringify(value));\n } catch {\n // Quota / serialization failure — silently keep going; in-memory stays authoritative.\n }\n });\n }\n\n return signal;\n}\n\nfunction getSafeStorage(): Storage | null {\n if (typeof window === 'undefined') return null;\n try {\n const s = window.localStorage;\n // Some browsers throw on access in private-mode iframes.\n s.getItem('__langsys_probe__');\n return s;\n } catch {\n return null;\n }\n}\n","import { createSignal } from './signal.js';\nimport { persist } from './persist.js';\nimport type { iCategories } from './types/translations.js';\nimport type { iLangsysConfig } from './types/config.js';\n\nconst initialTranslations: iCategories = {\n __uncategorized__: {\n __category__: '__uncategorized__',\n __symbol__: '__uncategorized__',\n },\n};\n\nexport const sTranslations = persist<iCategories>('translations', initialTranslations);\n\nexport const currentlyLoadedLocale = createSignal<string>('');\n\nexport const config: iLangsysConfig = {\n projectid: '',\n key: '',\n sUserLocale: createSignal<string>(''),\n baseLocale: 'en',\n debug: false,\n key_type: 'read',\n};\n","import { IntlMessageFormat } from 'intl-messageformat';\n\n/**\n * Detects ICU MessageFormat syntax in a translation string.\n *\n * - Matches `{var, plural, …}`, `{var, select, …}`, `{var, selectordinal, …}`,\n * `{var, number, …}`, `{var, date, …}`, `{var, time, …}`.\n * - Doesn't match plain interpolation slots like `{name}` or `{count}`.\n *\n * Exported because the Translation Manager UI needs the same detection logic\n * to decide whether to render a plural-slot editor vs. a single text field.\n */\nexport function isICU(template: string): boolean {\n return ICU_PATTERN.test(template);\n}\n\nconst ICU_PATTERN = /\\{[^{}]+,\\s*(plural|select|selectordinal|number|date|time)\\s*,/;\n\n/**\n * Substitute placeholders in a translated string with values from `params`.\n *\n * Two paths:\n * - ICU MessageFormat (target string contains `{var, plural|select|…, …}`):\n * parsed and formatted via `intl-messageformat`, which knows every\n * target locale's plural rules (Arabic's 6 categories, Russian's 4,\n * etc.) and gender-select branches.\n * - Simple `{name}` interpolation: cheap regex replacement. Unknown\n * placeholders are left untouched so missing data is visible to the\n * developer rather than silently rendering empty strings.\n *\n * Malformed ICU falls through to simple interpolation rather than throwing,\n * so the developer sees a broken-but-visible string instead of a runtime crash.\n * Backend-side validation in langsys-ai is supposed to prevent this — the\n * fall-through is defense in depth.\n *\n * `locale` is required for ICU formatting (drives plural-rule selection).\n * Falls back to `'en'` if absent — simple-interpolation path ignores it.\n */\nexport function interpolate(\n template: string,\n params: Record<string, unknown>,\n locale?: string,\n): string {\n if (isICU(template)) {\n try {\n return new IntlMessageFormat(template, locale ?? 'en').format(params) as string;\n } catch {\n return simpleInterpolate(template, params);\n }\n }\n return simpleInterpolate(template, params);\n}\n\nfunction simpleInterpolate(template: string, params: Record<string, unknown>): string {\n // The `[^{},]` character class excludes `{`, `}`, and `,` from placeholder\n // names so we don't accidentally consume ICU-shaped slots that somehow\n // routed through this path (e.g. malformed ICU after fall-through).\n return template.replace(/\\{([^{},]+)\\}/g, (match, rawKey: string) => {\n const key = rawKey.trim();\n if (!(key in params)) return match;\n const value = params[key];\n if (value === undefined || value === null) return match;\n if (value instanceof Date) return value.toISOString();\n return String(value);\n });\n}\n","import { LangsysAppAPI } from './api.js';\nimport { interpolate } from './interpolate.js';\nimport { Logger } from './logger.js';\nimport { createSignal, type Signal } from './signal.js';\nimport { currentlyLoadedLocale, sTranslations } from './stores.js';\nimport type { ResponseObject } from './types/api.js';\nimport type { iLangsysConfig } from './types/config.js';\nimport type { TFunction } from './types/translation-fn.js';\nimport type { iCategories, iTranslations } from './types/translations.js';\n\ninterface iTokenUpdate {\n projectid: string;\n category: string;\n token: string;\n}\n\nfunction isObject(test: unknown): test is Record<string, unknown> {\n return typeof test === 'object' && !Array.isArray(test) && test !== null;\n}\nfunction sameToken(a: iTokenUpdate, b: iTokenUpdate): boolean {\n return a.projectid === b.projectid && a.category === b.category && a.token === b.token;\n}\n\n/**\n * Lifecycle for app translations:\n * - on-miss: any `t(cat, phrase)` whose phrase isn't in the catalog is\n * queued as a \"missing token\" and (with write keys) flushed to the API.\n * - locale changes trigger `change()` which fetches and replaces.\n * - consumers can `subscribe(fn)` to react to translation snapshots.\n * - frameworks subscribe to `tSignal` (which re-emits a fresh `TFunction`\n * every time translations or the loaded locale change) so reactive\n * templates re-render automatically.\n */\nexport class Translations {\n private config: iLangsysConfig;\n private locale: string;\n private lastLoaded: Record<string, number> = {};\n private missingTokens: iTokenUpdate[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushScheduled = false;\n private isFirstClientRun = true;\n private readyResolve: () => void = () => {};\n private readyPromise: Promise<void> = new Promise((resolve) => {\n this.readyResolve = resolve;\n });\n public debug: Logger;\n\n /** Reactive holder for the current translation function. Re-emits on every catalog/locale change. */\n public tSignal: Signal<TFunction>;\n\n constructor(config: iLangsysConfig) {\n this.config = config;\n this.debug = new Logger(!!config.debug);\n this.locale = config.baseLocale || '';\n\n this.tSignal = createSignal<TFunction>(this.buildTFn());\n sTranslations.subscribe(() => this.tSignal.set(this.buildTFn()));\n currentlyLoadedLocale.subscribe(() => this.tSignal.set(this.buildTFn()));\n\n if (config.key && config.projectid) this.setup(config);\n }\n\n /**\n * Resolves once the first `getTranslations` call has completed (or\n * immediately if no fetch is configured). Callers that need to read\n * `sTranslations` before issuing a write — e.g. the `Translate` DOM\n * class deciding whether to POST a content block — should await this\n * to avoid acting on an empty cache during the cold-start race.\n */\n public ready(): Promise<void> {\n return this.readyPromise;\n }\n\n /** Current translation function. Reads fresh state on every call. */\n public get t(): TFunction {\n return this.tSignal.get();\n }\n\n /** Subscribe to translation snapshot changes. Fires immediately with the current value. */\n public subscribe(run: (value: iCategories) => void) {\n return sTranslations.subscribe(run);\n }\n\n /**\n * Content-block-keyed lookup used by the DOM `Translate` class.\n * Returns the per-token translation inside a content block, or `null` if\n * either the content block or the inner token is missing. Never registers\n * a missing token — the DOM class manages its own lifecycle via content blocks.\n */\n public lookupContent(category: string, customId: string, token: string): string | null {\n const cats = sTranslations.get();\n const lookupCat = category || '__uncategorized__';\n const contentData = cats[lookupCat]?.[customId];\n if (!contentData || typeof contentData !== 'object') return null;\n const value = (contentData as unknown as Record<string, string>)[token];\n return typeof value === 'string' ? value : null;\n }\n\n /**\n * Raw stored translation for a phrase, without interpolation or\n * missing-token registration. Returns null when no (non-empty) translation\n * is cached. Used by the `Phrase` rich-text handler, which needs the\n * un-interpolated template (it supplies its own markup-token values).\n */\n public lookup(phrase: string, category: string): string | null {\n const cats = sTranslations.get();\n const lookupCat = category || '__uncategorized__';\n const value = cats[lookupCat]?.[phrase];\n return typeof value === 'string' && value.length > 0 ? value : null;\n }\n\n private buildTFn(): TFunction {\n // Single runtime body covers both overload shapes. Position 2 is the\n // discriminator: string ⇒ category, object ⇒ params (no category).\n // t(phrase) → category='', params=undefined\n // t(phrase, {params...}) → category='', params={params}\n // t(phrase, 'Category') → category='Category', params=undefined\n // t(phrase, 'Category', {params...}) → category='Category', params={params}\n const fn = ((phrase: string, ...rest: unknown[]): string => {\n const category = typeof rest[0] === 'string' ? rest[0] : '';\n const params = (typeof rest[0] === 'object' ? rest[0] : rest[1]) as Record<string, unknown> | undefined;\n\n const cats = sTranslations.get();\n // '__uncategorized__' is a server-internal bucket name used only\n // in GET /translations responses to group null-category phrases.\n // We normalize to it for the local cats lookup (so we read from\n // the same bucket the server writes to), but we MUST NOT leak\n // the sentinel back into the missingToken queue — that queue\n // feeds the POST wire payload, and clients are not allowed to\n // send the reserved sentinel as a category.\n const lookupCat = category || '__uncategorized__';\n const value = cats[lookupCat]?.[phrase];\n\n let translated: string;\n if (typeof value === 'string' && value.length > 0) {\n this.debug.log('TRANSLATION FOUND', [lookupCat, phrase, value]);\n translated = value;\n } else {\n this.missingToken(category, phrase);\n translated = phrase;\n }\n\n return params ? interpolate(translated, params, currentlyLoadedLocale.get()) : translated;\n }) as TFunction;\n return fn;\n }\n\n private missingToken(category: string, token: string | undefined | null) {\n if (token === undefined || token === null) {\n return this.debug.warn(`Received undefined or null token for category: ${category}`);\n }\n\n if (this.config.key_type !== 'write') {\n this.debug.log(`Skipping missing token collection (API key is ${this.config.key_type || 'unknown'}):`, {\n category,\n token,\n });\n return;\n }\n\n // Skip content-block id lookups (32-hex md5 strings).\n if (/^[0-9a-f]{32}$/.test(token)) return;\n if (token === 'toJSON') {\n this.debug.error(`Received toJSON as token ${category}:${token}`, token);\n return;\n }\n if (token === '') {\n this.debug.warn('Received empty token', token);\n return;\n }\n\n const missingToken: iTokenUpdate = { category, token, projectid: this.config.projectid };\n if (!this.missingTokens.some((t) => sameToken(t, missingToken))) {\n this.debug.log('MISSING TOKEN LOOKUP FAILED', [missingToken, [...this.missingTokens], { ...sTranslations.get() }]);\n this.missingTokens.push(missingToken);\n this.scheduleTokenFlush();\n }\n }\n\n private scheduleTokenFlush() {\n const strategy = this.config.ssrTokenStrategy || 'client';\n const isSSR = typeof window === 'undefined';\n\n if (isSSR) {\n switch (strategy) {\n case 'server':\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.updateTokens().then(() => {\n this.flushScheduled = false;\n });\n });\n }\n break;\n\n case 'auto':\n if (this.missingTokens.length <= 5 && !this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.updateTokens().then(() => {\n this.flushScheduled = false;\n });\n });\n }\n break;\n\n case 'client':\n default:\n this.debug.log('SSR: Queuing tokens for client-side transmission');\n break;\n }\n } else {\n // Client — flush immediately on first discovery, then let the 3s timer take over.\n if (!this.flushScheduled && !this.timer) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.updateTokens().then(() => {\n this.flushScheduled = false;\n });\n });\n }\n }\n }\n\n public setup(config: iLangsysConfig) {\n this.config = config;\n if (!this.config.projectid || !this.config.key) return;\n\n if (this.config.debug) this.debug.debugEnabled = this.config.debug;\n if (config.baseLocale) this.locale = config.baseLocale;\n\n this.debug.log('TRANSLATION SETUP INITIATED', this.config);\n\n if (typeof window !== 'undefined') {\n if (this.isFirstClientRun && this.missingTokens.length > 0) {\n this.isFirstClientRun = false;\n const strategy = this.config.ssrTokenStrategy || 'client';\n if (strategy === 'client' || (strategy === 'auto' && this.missingTokens.length > 5)) {\n this.debug.log(`Post-hydration: Flushing ${this.missingTokens.length} SSR-collected tokens`);\n queueMicrotask(() => this.updateTokens());\n }\n }\n\n if (this.timer) clearInterval(this.timer);\n this.timer = setInterval(() => this.updateTokens(), 3000);\n this.debug.log('UPDATE TOKEN INTERVAL', this.timer);\n } else {\n const strategy = this.config.ssrTokenStrategy || 'client';\n this.debug.log(`SSR environment detected - using '${strategy}' token strategy`);\n }\n }\n\n /**\n * Record that a locale's catalog is already present without fetching —\n * e.g. after an SSR handoff seeds `sTranslations` + `currentlyLoadedLocale`.\n * This primes the same `lastLoaded` cache `change()` consults, so the first\n * settle for that locale is a cache hit (no redundant fetch) while every\n * later switch *to* it still flows through `change()` normally.\n */\n public markLoaded(locale: string): void {\n if (!locale) return;\n this.locale = locale;\n this.lastLoaded[locale] = new Date().getTime() / 1000;\n // A seeded catalog counts as \"ready\": the cache hit above means no\n // fetch will ever fire to resolve the promise, and content-block /\n // Phrase consumers awaiting ready() would otherwise hang forever.\n this.readyResolve();\n }\n\n /**\n * React to a user-locale change. Fetches translations if we haven't\n * loaded this locale within the last 60s (or if forced).\n */\n public async change(locale: string, force = false, skipFetch = false): Promise<boolean> {\n if (!locale) return false;\n if (!this.config.projectid || !this.config.key) return false;\n\n if (skipFetch) {\n this.debug.log('Using pre-fetched translations for locale', locale);\n this.locale = locale;\n this.lastLoaded[locale] = new Date().getTime() / 1000;\n this.readyResolve();\n return true;\n }\n\n const now = new Date().getTime() / 1000;\n if (\n !force &&\n locale === this.locale &&\n this.lastLoaded[locale] &&\n Math.abs(this.lastLoaded[locale] - now) < 60\n ) {\n return false;\n }\n\n this.debug.log('Locale change detected!', locale);\n this.locale = locale;\n await this.getTranslations();\n return true;\n }\n\n private async updateTokens(): Promise<boolean> {\n if (!this.missingTokens.length) return false;\n if (!this.config.projectid || !this.config.key) return false;\n if (this.config.key_type !== 'write') {\n this.debug.log(`Skipping token updates (API key is ${this.config.key_type || 'unknown'})`);\n return false;\n }\n\n if (typeof window === 'undefined') {\n this.debug.log(`Sending ${this.missingTokens.length} tokens from SSR`);\n }\n\n const currentData = sTranslations.get();\n this.missingTokens = this.missingTokens.filter((tokenObj) => {\n tokenObj.projectid = this.config.projectid;\n // The server response keys null-category phrases under\n // '__uncategorized__', so map empty client-side category to that\n // bucket for the dedup check only. The queue itself keeps the\n // original (possibly empty) category for the wire payload.\n const lookupCat = tokenObj.category || '__uncategorized__';\n if (lookupCat in currentData && tokenObj.token in currentData[lookupCat]) {\n this.debug.log('Missing token already exists! Skipping:', {\n category: tokenObj.category,\n token: tokenObj.token,\n existing: currentData[lookupCat][tokenObj.token],\n });\n return false;\n }\n return true;\n });\n\n if (!this.missingTokens.length) return false;\n\n this.debug.log('CREATE MISSING TOKENS', this.missingTokens);\n try {\n // Wire boundary: empty category → null. '__uncategorized__' is\n // server-internal and is rejected as a client input.\n const phraseItems = this.missingTokens.map((tokenObj) => ({\n type: 'phrase',\n phrase: tokenObj.token,\n category: tokenObj.category || null,\n }));\n\n // /translatable-items caps each request (default 200 items); chunk so\n // a page registering many new phrases at once never overflows it.\n const BATCH_SIZE = 200;\n for (let offset = 0; offset < phraseItems.length; offset += BATCH_SIZE) {\n const response: ResponseObject = await LangsysAppAPI.createTranslatableItems(\n phraseItems.slice(offset, offset + BATCH_SIZE),\n );\n if (!response.status) {\n if (response.errors) {\n this.debug.log('TOKEN UPDATE FAIL', this.missingTokens);\n this.debug.error('Error updating project tokens', response.errors);\n }\n return false;\n }\n }\n\n this.missingTokens.forEach((tokenObj) => {\n // Same bucket normalization as the dedup check: write into\n // the cats bucket that matches the server response shape.\n const lookupCat = tokenObj.category || '__uncategorized__';\n if (!currentData[lookupCat]) {\n currentData[lookupCat] = {\n __category__: lookupCat,\n __symbol__: lookupCat,\n } as iTranslations;\n }\n currentData[lookupCat][tokenObj.token] = tokenObj.token;\n currentData[lookupCat]['__category__'] = lookupCat;\n });\n sTranslations.set({ ...currentData });\n this.missingTokens = [];\n return true;\n } catch (err) {\n this.debug.log('CREATE MISSING TOKEN FAILURE', this.missingTokens);\n this.debug.error('Error updating project tokens', err);\n return false;\n }\n }\n\n private async getTranslations(): Promise<void> {\n if (!LangsysAppAPI.config.projectid && this.config.projectid) {\n LangsysAppAPI.setup(this.config);\n }\n\n const response: ResponseObject = await LangsysAppAPI.getTranslations(this.locale);\n this.debug.log('GET TRANSLATIONS API RESPONSE', response);\n if (response.errors) {\n this.debug.error('Error', response.errors[0]);\n this.readyResolve();\n return;\n }\n\n const trans = response.data as iCategories;\n\n if (!isObject(trans['__uncategorized__'])) {\n trans['__uncategorized__'] = {\n __category__: '__uncategorized__',\n __symbol__: '__uncategorized__',\n } as iTranslations;\n }\n\n for (const cat of Object.keys(trans)) {\n trans[cat]['__category__'] = cat;\n }\n\n this.debug.log('GET TRANSLATIONS ' + this.locale, trans);\n\n sTranslations.set(trans);\n // Small delay so consumers see translations + locale updates on the same tick.\n setTimeout(() => currentlyLoadedLocale.set(this.locale), 100);\n this.lastLoaded[this.locale] = new Date().getTime() / 1000;\n this.readyResolve();\n }\n}\n\nexport default Translations;\n","import { LangsysAppAPI } from './api.js';\nimport { Logger } from './logger.js';\nimport { config as configStore, currentlyLoadedLocale, sTranslations } from './stores.js';\nimport { Translations } from './translations.js';\nimport type { ResponseObject } from './types/api.js';\nimport type { iLangsysConfig, iLangsysInitConfig } from './types/config.js';\nimport type { iCountryDialCode, iCountryList } from './types/countries.js';\nimport type { iCurrencyList } from './types/currencies.js';\nimport type { iLocaleData, iLocaleDefault, iLocaleFlat } from './types/locales.js';\nimport type { TFunction } from './types/translation-fn.js';\nimport type { iTranslations } from './types/translations.js';\n\nclass LangsysAppClass {\n private config: iLangsysConfig;\n\n public Translations: Translations;\n public translationsLoadingPromise: Promise<unknown> = Promise.resolve();\n\n private locales: Record<string, iLocaleData[]> = {};\n\n private countries: iCountryList = [];\n private countriesLocale = '';\n\n private dialCodes: iCountryDialCode[] = [];\n private dialCodesLocale = '';\n\n private currencies: iCurrencyList = [];\n private currenciesLocale = '';\n\n public debug: Logger;\n\n constructor() {\n this.config = configStore;\n this.debug = new Logger(!!this.config.debug);\n this.Translations = new Translations(this.config);\n }\n\n /** Current translation function. Reads fresh state on every call. */\n public get t(): TFunction {\n return this.Translations.t;\n }\n\n public async refresh() {\n const locale = this.config.sUserLocale.get();\n this.locales = {};\n return this.Translations.change(locale, true);\n }\n\n /**\n * Initialize Langsys. Configuration must include at least `projectid`,\n * `key`, and `UserLocaleStore` (anything satisfying `LocaleSource` — see\n * its docstring for framework-specific adapters).\n */\n public async init(initConfig: iLangsysInitConfig): Promise<ResponseObject> {\n const projectid = initConfig.projectid;\n const key = initConfig.key;\n const UserLocaleStore = initConfig.UserLocaleStore;\n let baseLocale = initConfig.baseLocale || 'en';\n const debug = initConfig.debug || false;\n const emulateFailureToLoad = initConfig.emulateFailureToLoad || false;\n const ssrTokenStrategy = initConfig.ssrTokenStrategy || 'client';\n const initialTranslations = initConfig.initialTranslations;\n const initialTranslationsLocale = initConfig.initialTranslationsLocale;\n\n this.debug.debugEnabled = debug;\n\n if (debug && initialTranslations) {\n this.debug.log('SSR initial translations config:', {\n hasInitialTranslations: !!initialTranslations,\n initialTranslationsLocale,\n categoriesProvided: initialTranslations ? Object.keys(initialTranslations).length : 0,\n categories: initialTranslations ? Object.keys(initialTranslations) : [],\n });\n }\n\n if (!projectid) {\n this.debug.error('LangsysApp.init missing projectid in configuration object!');\n return { status: false, errors: ['Missing projectid'] };\n }\n if (!key) {\n this.debug.error('LangsysApp.init missing API key in configuration object!');\n return { status: false, errors: ['Missing API key'] };\n }\n if (!UserLocaleStore?.subscribe || typeof UserLocaleStore.get !== 'function') {\n this.debug.error(\n \"LangsysApp.init missing UserLocaleStore — pass any object satisfying LocaleSource (get + subscribe). createSignal('en-us') works if you have nothing of your own.\"\n );\n return { status: false, errors: ['Missing UserLocaleStore'] };\n }\n\n baseLocale = baseLocale.toLowerCase();\n\n if (!emulateFailureToLoad) {\n this.config = {\n projectid,\n key,\n sUserLocale: UserLocaleStore,\n baseLocale,\n debug,\n ssrTokenStrategy,\n };\n // Keep the exported config singleton in sync (used by Translate + API).\n Object.assign(configStore, this.config);\n }\n\n const validateResponse = await LangsysAppAPI.validate(this.config);\n\n if (validateResponse.status && validateResponse.data) {\n const authData = validateResponse.data as { key_type?: 'read' | 'write' };\n if (authData.key_type) {\n this.config.key_type = authData.key_type;\n configStore.key_type = authData.key_type;\n this.debug.log('API Key Type:', this.config.key_type);\n }\n }\n\n // Seed the translations store if initial data is provided (SSR handoff).\n if (initialTranslations && initialTranslationsLocale) {\n if (!initialTranslations['__uncategorized__']) {\n initialTranslations['__uncategorized__'] = {\n __category__: '__uncategorized__',\n __symbol__: '__uncategorized__',\n } as iTranslations;\n }\n for (const cat of Object.keys(initialTranslations)) {\n initialTranslations[cat]['__category__'] = cat;\n }\n sTranslations.set(initialTranslations);\n currentlyLoadedLocale.set(initialTranslationsLocale);\n this.debug.log('Populated sTranslations with initial data for locale:', initialTranslationsLocale);\n }\n\n this.Translations.setup(this.config);\n\n // The SSR handoff already populated the stores for this locale, so prime\n // the fetch cache (after setup, which would otherwise reset this.locale).\n // The first settle for this locale is then a cache hit — no redundant\n // fetch — while switching *back* to it later still flows through\n // change() and rebuilds the t-signal. (Do NOT gate change() on a\n // \"skip fetch\" flag here: it would otherwise stay armed and silently\n // skip every return to the initial locale.)\n if (initialTranslations && initialTranslationsLocale) {\n this.Translations.markLoaded(initialTranslationsLocale);\n }\n\n // Prefetch and wire up reactive locale change handling.\n this.config.sUserLocale.subscribe((locale) => {\n if (!validateResponse.status) return;\n this.getLocalesData(locale);\n this.debug.log('SUBSCRIBING TO USER LOCALE STORE');\n this.translationsLoadingPromise = this.Translations.change(locale, false);\n });\n\n return validateResponse;\n }\n\n public async getDialCodes(inLocale?: string): Promise<iCountryDialCode[]> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.dialCodes.length && this.dialCodesLocale === locale) return this.dialCodes;\n\n const route = `countries/dial-codes/${locale}`;\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error('LangsysApp.getDialCodes failed: ' + route);\n return [];\n }\n this.dialCodes = response.data as iCountryDialCode[];\n this.dialCodesLocale = locale;\n return this.dialCodes;\n }\n\n public async getCurrencies(inLocale?: string): Promise<iCurrencyList> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.currencies.length && this.currenciesLocale === locale) return this.currencies;\n\n const route = `currencies/${locale}`;\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error('LangsysApp.getCurrencies failed: ' + route);\n return [];\n }\n this.currencies = response.data as iCurrencyList;\n this.currenciesLocale = locale;\n return this.currencies;\n }\n\n public async getCountries(inLocale?: string): Promise<iCountryList> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.countries.length && this.countriesLocale === locale) return this.countries;\n\n const route = `countries/${locale}`;\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error('LangsysApp.getCountries failed: ' + route);\n return [];\n }\n this.countries = response.data as iCountryList;\n this.countriesLocale = locale;\n return this.countries;\n }\n\n public async getCountryName(forCountryCode: string, inLocale?: string): Promise<string> {\n if (!forCountryCode) return '';\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (!this.countries.length || this.countriesLocale !== locale) await this.getCountries(inLocale);\n\n const country = this.countries.find((c) => c.code.toLowerCase() === forCountryCode.toLowerCase())?.label;\n if (!country) this.debug.warn('getCountryName failed to match', forCountryCode);\n return country || forCountryCode;\n }\n\n public async getCurrencyName(forCurrencyCode: string, inLocale?: string): Promise<string> {\n if (!forCurrencyCode) return '';\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (!this.currencies.length || this.currenciesLocale !== locale) await this.getCurrencies(inLocale);\n\n const currency = this.currencies.find((c) => c.code?.toLowerCase() === forCurrencyCode.toLowerCase())?.name;\n if (!currency) this.debug.warn('getCurrencyName failed to match', forCurrencyCode);\n return currency || forCurrencyCode;\n }\n\n public async getLocalesFormat(\n format: '' | 'flat' | 'data' = '',\n inLocale?: string\n ): Promise<iLocaleDefault | iLocaleFlat[] | iLocaleData[]> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n const route = `locales/${locale}` + (format ? `/${format}` : '');\n const response = await LangsysAppAPI.get(route);\n if (response.errors || !response.status) {\n this.debug.error(response.errors, response.status, response);\n this.debug.error('LangsysApp.getLocales failed: ' + route);\n return format === 'flat' ? [] : format === 'data' ? [] : {};\n }\n switch (format) {\n case 'flat':\n return response.data as iLocaleFlat[];\n case 'data':\n return response.data as iLocaleData[];\n default:\n return response.data as iLocaleDefault;\n }\n }\n\n public async getLocalesFlat(inLocale?: string): Promise<iLocaleFlat[]> {\n return (await this.getLocalesFormat('flat', inLocale)) as iLocaleFlat[];\n }\n\n public async getLocalesData(inLocale?: string, forceRefresh = false): Promise<iLocaleData[]> {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n if (this.locales?.[locale]?.length && !forceRefresh) return this.locales[locale];\n this.locales[locale] = (await this.getLocalesFormat('data', inLocale)) as iLocaleData[];\n return this.locales[locale];\n }\n\n public async getLocales(inLocale?: string): Promise<iLocaleDefault> {\n return (await this.getLocalesFormat('', inLocale)) as iLocaleDefault;\n }\n\n public async getLocaleNameWithLookup(forLocale: string, shortName = false, inLocale?: string): Promise<string> {\n if (!forLocale) return '';\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n await this.getLocalesData(locale);\n return this.getLocaleName(forLocale, shortName, locale);\n }\n\n public getLocaleName(forLocale: string, shortName = false, inLocale?: string): string {\n const locale = inLocale || this.config.sUserLocale.get() || this.config.baseLocale;\n let name = '';\n this.locales[locale]?.every((loc) => {\n if (loc.code === forLocale) {\n name = shortName ? loc.lang_name : loc.locale_name;\n return false;\n }\n return true;\n });\n if (!name) this.debug.warn('getLocaleNameWithLookup failed to match', forLocale);\n return name;\n }\n\n /** @deprecated use `getLocaleNameWithLookup` or `getLocaleName` */\n public async getLanguageName(forLocale: string, shortName = false, inLocale?: string): Promise<string> {\n return this.getLocaleNameWithLookup(forLocale, shortName, inLocale);\n }\n\n /**\n * Detects the end-user's preferred locale.\n *\n * - In browsers, uses `navigator.languages` with fallback to `navigator.language`.\n * - In SSR environments, parses the `Accept-Language` header.\n */\n public detectPreferredLocale(\n acceptLanguageHeader?: string | null,\n supportedLocales?: string[]\n ): string | false {\n const userLocales = this.getUserLanguagePreferences(acceptLanguageHeader);\n if (userLocales.length === 0) return false;\n\n if (supportedLocales && supportedLocales.length > 0) {\n const bestMatch = this.findBestLocaleMatch(userLocales, supportedLocales);\n if (bestMatch) return bestMatch;\n }\n\n return this.normalizeLocale(userLocales[0]);\n }\n\n private getUserLanguagePreferences(acceptLanguageHeader?: string | null): string[] {\n if (acceptLanguageHeader) {\n try {\n return this.parseAcceptLanguageHeader(acceptLanguageHeader);\n } catch (error) {\n this.debug.warn('Failed to parse Accept-Language header:', error);\n }\n }\n\n if (typeof navigator !== 'undefined') {\n if (navigator.languages && navigator.languages.length > 0) {\n return Array.from(navigator.languages);\n }\n if (navigator.language) return [navigator.language];\n }\n\n return [];\n }\n\n private parseAcceptLanguageHeader(header: string): string[] {\n if (!header || typeof header !== 'string' || header.trim() === '') return [];\n\n try {\n return header\n .split(',')\n .map((part) => {\n const trimmed = part.trim();\n if (!trimmed || trimmed === '*') return null;\n const [localePart, qPart] = trimmed.split(';q=');\n const locale = localePart?.trim();\n const q = qPart ? parseFloat(qPart) : 1.0;\n if (!locale || isNaN(q) || q <= 0 || q > 1) return null;\n return { locale, q };\n })\n .filter((item): item is { locale: string; q: number } => item !== null)\n .sort((a, b) => b.q - a.q)\n .map((item) => item.locale);\n } catch (error) {\n this.debug.warn('Error parsing Accept-Language header:', error);\n return [];\n }\n }\n\n private findBestLocaleMatch(userLocales: string[], supportedLocales: string[]): string | null {\n if (!userLocales.length || !supportedLocales.length) return null;\n\n const normalizedSupported = supportedLocales.map((l) => this.normalizeLocale(l));\n\n for (const userLocale of userLocales) {\n const normalizedUser = this.normalizeLocale(userLocale);\n if (normalizedSupported.includes(normalizedUser)) return normalizedUser;\n }\n\n for (const userLocale of userLocales) {\n const userLang = this.getLanguageCode(userLocale);\n for (const supported of normalizedSupported) {\n if (this.getLanguageCode(supported) === userLang) return supported;\n }\n }\n\n return null;\n }\n\n private normalizeLocale(locale: string): string {\n if (!locale || typeof locale !== 'string') return locale;\n const parts = locale.split(/[-_]/);\n if (parts.length === 1) return parts[0].toLowerCase();\n const language = parts[0].toLowerCase();\n const region = parts[1].toUpperCase();\n return `${language}-${region}`;\n }\n\n private getLanguageCode(locale: string): string {\n if (!locale || typeof locale !== 'string') return '';\n return locale.split(/[-_]/)[0].toLowerCase();\n }\n}\n\nexport const LangsysApp = new LangsysAppClass();\nexport type { LangsysAppClass };\n","export const isEmpty = (data: unknown): boolean => {\n if (typeof data === 'number' || typeof data === 'boolean') return false;\n if (typeof data === 'undefined' || data === null) return true;\n if (typeof (data as { length?: number }).length !== 'undefined') {\n return (data as { length: number }).length === 0;\n }\n if (typeof data === 'object') return Object.keys(data as object).length === 0;\n return false;\n};\n\nexport function structuredCloneShim<T>(obj: T): T {\n if (typeof structuredClone === 'function') return structuredClone(obj);\n\n const clone = <V>(o: V): V => {\n if (typeof o !== 'object' || o === null) return o;\n if (Array.isArray(o)) return o.map((item) => clone(item)) as unknown as V;\n const out: Record<string, unknown> = {};\n for (const key in o as object) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n out[key] = clone((o as Record<string, unknown>)[key]);\n }\n }\n return out as V;\n };\n return clone(obj);\n}\n\n// prettier-ignore\nexport function md5(inputString: string) {\n if (typeof inputString !== 'string') inputString = JSON.stringify(inputString);\n const hc = '0123456789abcdef';\n function rh(n: number) { let j, s = ''; for (j = 0; j <= 3; j++) s += hc.charAt((n >> (j * 8 + 4)) & 0x0F) + hc.charAt((n >> (j * 8)) & 0x0F); return s; }\n function ad(x: number, y: number) { const l = (x & 0xFFFF) + (y & 0xFFFF); const m = (x >> 16) + (y >> 16) + (l >> 16); return (m << 16) | (l & 0xFFFF); }\n function rl(n: number, c: number) { return (n << c) | (n >>> (32 - c)); }\n function cm(q: number, a: number, b: number, x: number, s: number, t: number) { return ad(rl(ad(ad(a, q), ad(x, t)), s), b); }\n function ff(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm((b & c) | ((~b) & d), a, b, x, s, t); }\n function gg(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm((b & d) | (c & (~d)), a, b, x, s, t); }\n function hh(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm(b ^ c ^ d, a, b, x, s, t); }\n function ii(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cm(c ^ (b | (~d)), a, b, x, s, t); }\n function sb(x: string) {\n let i; const nblk = ((x.length + 8) >> 6) + 1; const blks = new Array(nblk * 16); for (i = 0; i < nblk * 16; i++) blks[i] = 0;\n for (i = 0; i < x.length; i++) blks[i >> 2] |= x.charCodeAt(i) << ((i % 4) * 8);\n blks[i >> 2] |= 0x80 << ((i % 4) * 8); blks[nblk * 16 - 2] = x.length * 8; return blks;\n }\n let i, x = sb('' + inputString), a = 1732584193, b = -271733879, c = -1732584194, d = 271733878, olda, oldb, oldc, oldd;\n for (i = 0; i < x.length; i += 16) {\n olda = a; oldb = b; oldc = c; oldd = d;\n a = ff(a, b, c, d, x[i + 0], 7, -680876936); d = ff(d, a, b, c, x[i + 1], 12, -389564586); c = ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = ff(b, c, d, a, x[i + 3], 22, -1044525330); a = ff(a, b, c, d, x[i + 4], 7, -176418897); d = ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = ff(c, d, a, b, x[i + 6], 17, -1473231341); b = ff(b, c, d, a, x[i + 7], 22, -45705983); a = ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = ff(d, a, b, c, x[i + 9], 12, -1958414417); c = ff(c, d, a, b, x[i + 10], 17, -42063); b = ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = ff(a, b, c, d, x[i + 12], 7, 1804603682); d = ff(d, a, b, c, x[i + 13], 12, -40341101); c = ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = ff(b, c, d, a, x[i + 15], 22, 1236535329); a = gg(a, b, c, d, x[i + 1], 5, -165796510); d = gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = gg(c, d, a, b, x[i + 11], 14, 643717713); b = gg(b, c, d, a, x[i + 0], 20, -373897302); a = gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = gg(d, a, b, c, x[i + 10], 9, 38016083); c = gg(c, d, a, b, x[i + 15], 14, -660478335); b = gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = gg(a, b, c, d, x[i + 9], 5, 568446438); d = gg(d, a, b, c, x[i + 14], 9, -1019803690); c = gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = gg(b, c, d, a, x[i + 8], 20, 1163531501); a = gg(a, b, c, d, x[i + 13], 5, -1444681467); d = gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = gg(c, d, a, b, x[i + 7], 14, 1735328473); b = gg(b, c, d, a, x[i + 12], 20, -1926607734); a = hh(a, b, c, d, x[i + 5], 4, -378558);\n d = hh(d, a, b, c, x[i + 8], 11, -2022574463); c = hh(c, d, a, b, x[i + 11], 16, 1839030562); b = hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = hh(a, b, c, d, x[i + 1], 4, -1530992060); d = hh(d, a, b, c, x[i + 4], 11, 1272893353); c = hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = hh(b, c, d, a, x[i + 10], 23, -1094730640); a = hh(a, b, c, d, x[i + 13], 4, 681279174); d = hh(d, a, b, c, x[i + 0], 11, -358537222);\n c = hh(c, d, a, b, x[i + 3], 16, -722521979); b = hh(b, c, d, a, x[i + 6], 23, 76029189); a = hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = hh(d, a, b, c, x[i + 12], 11, -421815835); c = hh(c, d, a, b, x[i + 15], 16, 530742520); b = hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = ii(a, b, c, d, x[i + 0], 6, -198630844); d = ii(d, a, b, c, x[i + 7], 10, 1126891415); c = ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = ii(b, c, d, a, x[i + 5], 21, -57434055); a = ii(a, b, c, d, x[i + 12], 6, 1700485571); d = ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = ii(c, d, a, b, x[i + 10], 15, -1051523); b = ii(b, c, d, a, x[i + 1], 21, -2054922799); a = ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = ii(d, a, b, c, x[i + 15], 10, -30611744); c = ii(c, d, a, b, x[i + 6], 15, -1560198380); b = ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = ii(a, b, c, d, x[i + 4], 6, -145523070); d = ii(d, a, b, c, x[i + 11], 10, -1120210379); c = ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = ii(b, c, d, a, x[i + 9], 21, -343485551); a = ad(a, olda); b = ad(b, oldb); c = ad(c, oldc); d = ad(d, oldd);\n }\n return rh(a) + rh(b) + rh(c) + rh(d);\n}\n","/**\n * Framework-agnostic content-block helpers.\n *\n * The DOM-mutating `Translate` class in `translate.ts` is one consumer of\n * these — it walks a live element, tokenizes it, registers the content\n * block, and mutates the same element in place. That model fits Svelte\n * and vanilla JS, where the SDK genuinely owns the DOM node.\n *\n * For React/Vue/Angular wrappers, mutating the DOM directly is an anti-\n * pattern — those frameworks own their rendered output. Wrappers should\n * import the helpers below to handle the framework-agnostic parts (token\n * discovery, content-block registration, dedup against the local cache)\n * and render translated content through their framework's native means.\n *\n * Wrapper pattern:\n *\n * 1. After mount, grab the rendered DOM via the framework's ref/binding.\n * 2. `const { tokens, content } = tokenizeElement(el);`\n * 3. `const customId = generateCustomId(category, tokens);`\n * 4. `if (!isContentBlockKnown(category, customId)) {`\n * ` await registerContentBlock({ custom_id: customId, category, content, tokens, label });`\n * `}`\n * 5. Subscribe to `sTranslations` + `currentlyLoadedLocale`; on change,\n * look up each token via `Translations.lookupContent(category, customId, token)`\n * and render via your framework's templating.\n */\n\nimport { LangsysAppAPI } from './api.js';\nimport { logger } from './logger.js';\nimport { config as configStore, sTranslations } from './stores.js';\nimport type { iContentBlock } from './types/content-block.js';\nimport type { iTranslations } from './types/translations.js';\nimport { md5 } from './utils.js';\n\n/** HTML attributes whose values should be harvested for translation. */\nexport const TRANSLATABLE_ATTRIBUTES = [\n 'placeholder',\n 'alt',\n 'title',\n 'aria-label',\n 'aria-placeholder',\n 'data-error',\n 'data-error-message',\n 'data-validation-message',\n 'data-invalid-message',\n 'data-required-message',\n 'data-pattern-message',\n];\n\nexport const VALUE_TRANSLATABLE_ELEMENTS = ['button'];\nexport const VALUE_TRANSLATABLE_INPUT_TYPES = ['submit', 'button'];\n\n/**\n * Semantic CSS properties captured on the cloned content so translators\n * in the Translation Manager see the content styled the way end-users do.\n */\nexport const SEMANTIC_STYLE_PROPERTIES = [\n 'font-size', 'font-weight', 'font-style', 'font-variant', 'line-height',\n 'letter-spacing', 'word-spacing', 'text-align', 'text-decoration',\n 'text-transform', 'text-indent', 'text-shadow', 'white-space', '-webkit-font-smoothing',\n 'color', 'background-color', 'background-image', 'background-position',\n 'background-size', 'background-repeat',\n 'border', 'border-top', 'border-right', 'border-bottom', 'border-left',\n 'border-radius', 'border-color', 'border-width', 'border-style',\n 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',\n 'box-shadow', 'opacity', 'filter',\n 'display', 'visibility', 'list-style', 'list-style-type',\n 'cursor',\n];\n\n/**\n * Compute the deterministic content-block id from a `(category, tokens)` pair.\n *\n * JSON-stringifies the tuple so each token is unambiguously delimited\n * (the previous `tokens.join('-')` was collision-prone for tokens\n * containing a hyphen, e.g. `'e-mail'`).\n *\n * Pure function — same inputs always produce the same id. Exported so\n * framework wrappers can compute the id themselves before deciding\n * whether to call `registerContentBlock`.\n */\nexport function generateCustomId(category: string, tokens: string[]): string {\n return md5(JSON.stringify([category, tokens]));\n}\n\n/**\n * True iff the local translations cache already has the content block\n * for the given `(category, customId)` — meaning the backend knows about\n * it and there's no need to re-register.\n *\n * The cache is keyed under `'__uncategorized__'` for null/empty categories,\n * matching the convention the server uses in its GET /translations response.\n */\nexport function isContentBlockKnown(category: string, customId: string): boolean {\n const cats = sTranslations.get();\n const lookupCat = category || '__uncategorized__';\n const cbData = cats[lookupCat]?.[customId];\n return typeof cbData === 'object' && cbData !== null;\n}\n\n/**\n * POST a content block to the backend, then stamp its custom_id into the\n * local translations cache so subsequent mounts in this session — and\n * subsequent reloads, since the cache is persisted — skip the POST.\n *\n * Mirrors the standalone-phrase path's cache writeback semantics. Respects\n * `key_type === 'write'`: read-only keys silently no-op (resolves with\n * `{ status: true }` so the caller can still render the cached translation).\n *\n * Errors are logged via the SDK's logger and returned as `{ status: false }`\n * — never thrown. Callers can decide whether to surface to UI or swallow.\n */\nexport async function registerContentBlock(\n contentBlock: iContentBlock,\n): Promise<{ status: boolean; errors?: unknown[] }> {\n if (configStore.key_type !== 'write') {\n if (configStore.debug) {\n logger.log(`Skipping content block save (API key is ${configStore.key_type || 'unknown'})`);\n }\n return { status: true };\n }\n\n try {\n const response = await LangsysAppAPI.createTranslatableItems([\n {\n type: 'content_block',\n custom_id: contentBlock.custom_id,\n category: contentBlock.category,\n content: contentBlock.content,\n label: contentBlock.label,\n phrases: contentBlock.tokens.map((phrase) => ({ phrase })),\n },\n ]);\n if (!response.status) {\n logger.error('Could not save content block', response.errors);\n return { status: false, errors: response.errors as unknown[] | undefined };\n }\n _writeKnownContentBlockToCache(contentBlock.category, contentBlock.custom_id);\n return { status: true };\n } catch (err) {\n logger.error('Could not save content block', err);\n return { status: false, errors: [err] };\n }\n}\n\n/**\n * Walk an `HTMLElement`, collecting tokens for translation and producing a\n * cloned-and-stylized snapshot of its outerHTML for the Translation Manager.\n *\n * Tokens harvested:\n * - text-node content (whitespace-normalized, trimmed)\n * - translatable attribute values (`placeholder`, `alt`, `title`, `aria-*`, etc.)\n * - button/input/select value text\n *\n * Skips subtrees marked with `translate=\"no\"`.\n *\n * The returned `content` is a string snapshot — the live element is not\n * mutated. Computed semantic styles (color, font, spacing, etc.) are inlined\n * onto the clone so translators see content styled the way end-users do.\n *\n * Requires that `element` is mounted in the document so `getComputedStyle`\n * can read its style. For SSR / pre-mount callers, the style capture step\n * silently no-ops and the snapshot is plain (without inlined styles).\n */\nexport function tokenizeElement(element: HTMLElement): { tokens: string[]; content: string } {\n const tokens: string[] = [];\n const clone = element.cloneNode(true) as HTMLElement;\n _walkForTokens(element, Array.from(clone.childNodes), tokens, []);\n return { tokens, content: clone.outerHTML };\n}\n\n// ---------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------\n\nfunction _writeKnownContentBlockToCache(category: string, customId: string): void {\n const lookupCat = category || '__uncategorized__';\n sTranslations.update((current) => {\n if (!current[lookupCat]) {\n current[lookupCat] = {\n __category__: lookupCat,\n __symbol__: lookupCat,\n } as iTranslations;\n }\n (current[lookupCat] as unknown as Record<string, unknown>)[customId] = {};\n return { ...current };\n });\n}\n\nfunction _walkForTokens(\n liveRoot: HTMLElement,\n cloneNodes: ChildNode[],\n tokens: string[],\n indices: number[],\n): void {\n cloneNodes.forEach((node, index) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (el.getAttribute('translate') === 'no') return;\n // A <Phrase> subtree is its own self-managed rich phrase — skip it\n // here so the content block doesn't tokenize its inner text.\n if (el.hasAttribute('data-ls-phrase')) return;\n }\n\n if (node.hasChildNodes()) {\n _applyStylesToClone(liveRoot, node as HTMLElement, [...indices, index]);\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n _tokenizeAttributes(node as HTMLElement, tokens);\n }\n\n const contentToken = node.nodeValue?.replace(/\\s+/g, ' ').trim();\n if (node.nodeType === Node.TEXT_NODE && contentToken) {\n tokens.push(contentToken);\n return;\n }\n\n if (!node.hasChildNodes()) return;\n _walkForTokens(liveRoot, Array.from(node.childNodes), tokens, [...indices, index]);\n });\n}\n\nfunction _tokenizeAttributes(element: HTMLElement, tokens: string[]): void {\n const tagName = element.tagName.toLowerCase();\n\n if (tagName === 'img') {\n const img = element as HTMLImageElement;\n if (img.src) element.setAttribute('src', img.src);\n }\n\n for (const attr of TRANSLATABLE_ATTRIBUTES) {\n const value = element.getAttribute(attr)?.trim();\n if (value) tokens.push(value);\n }\n\n if (VALUE_TRANSLATABLE_ELEMENTS.includes(tagName)) {\n const value = element.getAttribute('value')?.trim();\n if (value) tokens.push(value);\n }\n\n if (tagName === 'input') {\n const inputType = element.getAttribute('type')?.toLowerCase();\n if (inputType && VALUE_TRANSLATABLE_INPUT_TYPES.includes(inputType)) {\n const value = element.getAttribute('value')?.trim();\n if (value) tokens.push(value);\n }\n }\n\n if (tagName === 'select') {\n const options = element.querySelectorAll('option');\n options.forEach((option) => {\n const optionText = option.textContent?.trim();\n if (optionText) tokens.push(optionText);\n });\n }\n}\n\nfunction _applyStylesToClone(liveRoot: HTMLElement, cloneNode: HTMLElement, indices: number[]): void {\n if (typeof window === 'undefined') return;\n const domNode = _findNode(Array.from(liveRoot.childNodes), indices);\n if (!domNode) return;\n\n const tagName = (domNode as HTMLElement).tagName.toLowerCase();\n const reference = document.createElement(tagName);\n reference.style.visibility = 'hidden';\n reference.style.position = 'absolute';\n document.body.appendChild(reference);\n\n const computed = window.getComputedStyle(domNode as HTMLElement);\n const defaults = window.getComputedStyle(reference);\n\n for (const prop of SEMANTIC_STYLE_PROPERTIES) {\n const value = computed.getPropertyValue(prop);\n const defaultValue = defaults.getPropertyValue(prop);\n if (value && value !== defaultValue) {\n cloneNode.style.setProperty(prop, value);\n }\n }\n\n document.body.removeChild(reference);\n cloneNode.removeAttribute('class');\n}\n\nfunction _findNode(nodes: ChildNode[], indices: number[]): Element | undefined {\n let currentNode: Node | undefined = nodes[indices[0]];\n for (let i = 1; i < indices.length; i++) {\n if (!currentNode || !currentNode.hasChildNodes()) return undefined;\n currentNode = Array.from(currentNode.childNodes)[indices[i]];\n }\n return currentNode as Element;\n}\n","import {\n generateCustomId,\n isContentBlockKnown,\n registerContentBlock,\n tokenizeElement,\n TRANSLATABLE_ATTRIBUTES,\n VALUE_TRANSLATABLE_ELEMENTS,\n VALUE_TRANSLATABLE_INPUT_TYPES,\n} from './content-block.js';\nimport { LangsysApp } from './langsys-app.js';\nimport { currentlyLoadedLocale, config as configStore } from './stores.js';\nimport type { Unsubscriber } from './signal.js';\nimport type { iContentBlock } from './types/content-block.js';\nimport { isEmpty } from './utils.js';\n\n/** Options for the `Translate` class. Matches the Svelte component's props. */\nexport interface TranslateOptions {\n /** Optional category under which tokens are registered. Helps translators disambiguate. */\n category?: string;\n /** Optional stable id for the content block. If omitted, we hash category+tokens. */\n custom_id?: string;\n /** Optional human-readable label shown in the Translation Manager. */\n label?: string;\n}\n\ntype iNode = Node & { originalNodeValue?: string | null };\ntype iElement = HTMLElement & { originalAttributes?: Record<string, string> };\n\n/**\n * Wrap a DOM element and manage translation for its contents.\n *\n * const el = document.querySelector('#hero');\n * new Translate(el, { category: 'Home' });\n *\n * The first-pass tokenizes text nodes and translatable attributes; if the\n * content is a single text run, it's treated as a plain token. For HTML\n * content, a \"content block\" is registered so translators see the content\n * with the same visual structure users see.\n *\n * Call `.destroy()` to stop reacting to locale changes.\n */\nexport class Translate {\n private element: HTMLElement;\n private options: TranslateOptions;\n private tokens: string[] = [];\n private parseComplete = false;\n private isTokenizing = false;\n private lastTranslatedLocale = '';\n private custom_id: string;\n private unsubscribeLocale: Unsubscriber | null = null;\n\n constructor(element: HTMLElement, options: TranslateOptions = {}) {\n this.element = element;\n this.options = { ...options };\n this.custom_id = options.custom_id || '';\n\n // First pass: tokenize + save + translate.\n void this.tokenizeContent();\n\n // React to locale changes.\n this.unsubscribeLocale = currentlyLoadedLocale.subscribe((locale) => {\n if (locale && this.parseComplete) this.translateUpdate(locale);\n });\n }\n\n /** Stop reacting to locale changes. Safe to call multiple times. */\n public destroy() {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n }\n\n private translateUpdate(currentLocale: string) {\n if (!this.element?.innerHTML || !this.parseComplete) return;\n if (this.lastTranslatedLocale === currentLocale) return;\n\n const { category = '' } = this.options;\n\n if (this.tokens.length === 1) {\n this.element.innerText = LangsysApp.Translations.t(this.tokens[0], category);\n } else {\n this.translate(Array.from(this.element.childNodes));\n this.lastTranslatedLocale = currentLocale;\n }\n }\n\n private async tokenizeContent(): Promise<boolean> {\n if (this.isTokenizing) return false;\n if (!this.element || !this.element.childNodes.length) {\n this.parseComplete = true;\n this.isTokenizing = false;\n return false;\n }\n\n this.isTokenizing = true;\n\n // Framework-agnostic tokenization + style-snapshot lives in\n // content-block.ts. We store the clone locally only because the\n // existing translate() DOM-mutator references it for content-block\n // detection (`this.tokens` drives the single-vs-multi branch below).\n const { tokens, content } = tokenizeElement(this.element);\n this.tokens = tokens;\n\n const { category = '' } = this.options;\n\n if (this.tokens.length === 1) {\n this.element.innerText = LangsysApp.Translations.t(this.tokens[0], category);\n } else {\n const contentBlock: iContentBlock = {\n custom_id: '',\n category,\n label: this.options.label,\n content,\n tokens: this.tokens,\n };\n await this.handleContentBlock(contentBlock);\n }\n\n this.parseComplete = true;\n this.isTokenizing = false;\n return true;\n }\n\n private async handleContentBlock(contentBlock: iContentBlock) {\n if (isEmpty(this.custom_id)) {\n this.custom_id = generateCustomId(contentBlock.category, contentBlock.tokens);\n }\n contentBlock.custom_id = this.custom_id;\n\n // Wait for the first GET /translations to settle before deciding whether\n // to POST — otherwise on a cold cache the lookup misses and we'd POST\n // every CB on every first visit even when the backend already has it.\n await LangsysApp.Translations.ready();\n\n if (isContentBlockKnown(contentBlock.category, this.custom_id)) {\n // Backend already has this block — translate locally, no POST.\n if (this.tokens.length > 1 && this.element) {\n this.translate(Array.from(this.element.childNodes));\n this.lastTranslatedLocale = currentlyLoadedLocale.get();\n }\n return;\n }\n\n // Fire-and-forget: registerContentBlock handles its own errors via\n // the logger. We don't await here because the DOM render path below\n // doesn't depend on the POST completing — translations are looked up\n // from sTranslations on every render, which updates reactively when\n // the GET response arrives.\n void registerContentBlock(contentBlock);\n\n if (this.tokens.length > 1 && this.element) {\n this.translate(Array.from(this.element.childNodes));\n this.lastTranslatedLocale = currentlyLoadedLocale.get();\n }\n }\n\n private translate(nodes: iNode[]) {\n const currentLocale = currentlyLoadedLocale.get();\n if (\n currentLocale === configStore.baseLocale &&\n (this.lastTranslatedLocale === '' || this.lastTranslatedLocale === configStore.baseLocale)\n ) {\n return;\n }\n\n nodes.forEach((node) => {\n if (node?.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.getAttribute('translate') === 'no') return;\n // A <Phrase> subtree manages its own rendering — don't recurse.\n if (element.hasAttribute('data-ls-phrase')) return;\n this.translateAttributes(node as iElement);\n }\n\n if (node?.nodeType !== Node.TEXT_NODE) {\n if (!node?.hasChildNodes()) return;\n this.translate(Array.from(node.childNodes));\n return;\n }\n\n if (isEmpty(node.nodeValue?.trim())) return;\n\n if (isEmpty(node.originalNodeValue)) {\n node.originalNodeValue = node.nodeValue;\n }\n\n const contentToken = node.originalNodeValue?.replace(/\\s+/g, ' ').trim();\n if (!contentToken) return;\n\n const translation = this.getTranslation(contentToken);\n\n if (translation && contentToken && node.originalNodeValue) {\n node.nodeValue = node.originalNodeValue.replace(contentToken, translation);\n } else if (node.originalNodeValue) {\n node.nodeValue = node.originalNodeValue;\n }\n });\n }\n\n private getTranslation(token: string): string | null {\n if (!token) return null;\n const { category = '' } = this.options;\n return LangsysApp.Translations.lookupContent(category, this.custom_id, token);\n }\n\n private translateAttributes(element: iElement) {\n const tagName = element.tagName.toLowerCase();\n if (!element.originalAttributes) element.originalAttributes = {};\n\n for (const attr of TRANSLATABLE_ATTRIBUTES) {\n this.translateAttribute(element, attr);\n }\n\n if (VALUE_TRANSLATABLE_ELEMENTS.includes(tagName)) {\n this.translateAttribute(element, 'value');\n }\n\n if (tagName === 'input') {\n const inputType = element.getAttribute('type')?.toLowerCase();\n if (inputType && VALUE_TRANSLATABLE_INPUT_TYPES.includes(inputType)) {\n this.translateAttribute(element, 'value');\n }\n }\n\n if (tagName === 'select') {\n const options = element.querySelectorAll('option');\n options.forEach((option) => {\n const optionEl = option as iElement;\n if (!optionEl.originalAttributes) optionEl.originalAttributes = {};\n if (optionEl.originalAttributes['textContent'] === undefined) {\n optionEl.originalAttributes['textContent'] = option.textContent || '';\n }\n const originalText = optionEl.originalAttributes['textContent'].trim();\n if (originalText) {\n const translation = this.getTranslation(originalText);\n option.textContent = translation || optionEl.originalAttributes['textContent'];\n }\n });\n }\n }\n\n private translateAttribute(element: iElement, attr: string) {\n const currentValue = element.getAttribute(attr);\n if (!currentValue) return;\n\n if (element.originalAttributes![attr] === undefined) {\n element.originalAttributes![attr] = currentValue;\n }\n\n const originalValue = element.originalAttributes![attr].trim();\n if (!originalValue) return;\n\n const translation = this.getTranslation(originalValue);\n if (translation) element.setAttribute(attr, translation);\n else element.setAttribute(attr, element.originalAttributes![attr]);\n }\n\n}\n\nexport default Translate;\n","/**\n * Rich-text (markup-bearing) phrase encoding for the `<Phrase>` artifact.\n *\n * The problem: a phrase like `You have {n} <strong>reviews</strong>` must stay\n * ONE phrase (so pluralization sees `{n}` next to `reviews`), but we must NOT\n * send the SPA's real markup — and especially not framework-internal scoped-CSS\n * classes (`svelte-a1b2c3`, Vue scoped hashes) — to the translator. Those\n * classes get mangled, and worse they change on every build, which would make\n * the phrase key drift and silently re-translate everything.\n *\n * The approach: replace each inline element with a pair of neutral MARKUP\n * TOKENS — `{m0o}` ... `{m0c}` (markup, slot 0, open/close). These are ordinary\n * ICU placeholders: valid MessageFormat argument names, so plural/select still\n * parse, and the model treats them like `{n}` — it preserves them and PLACES\n * them around the translated word (which is what fixes reordering languages,\n * e.g. `<span>White</span> House` -> `Casa <span>Blanca</span>`).\n *\n * The real DOM elements never leave the SDK. At render time we resolve the\n * translation, substitute each markup token with a private-use SENTINEL char\n * (transient — never sent anywhere), then reconstitute the DOM by wrapping the\n * sentinel-delimited spans in the ORIGINAL framework-owned elements. Scoped CSS\n * survives because we reuse the real element; the phrase key is stable because\n * the wire form only ever contains `{m0o}`/`{m0c}`, never build-specific hashes.\n */\n\n// Private-use (PUA) sentinel delimiters, written via char codes so no literal\n// PUA characters live in the source. Brace-free so ICU MessageFormat treats a\n// substituted sentinel as literal text. They exist only transiently at render —\n// never registered, never sent over the wire (the wire form uses {mNo}/{mNc}).\n// open(i) = U+E000 <i> U+E001\n// close(i) = U+E002 <i> U+E003\nconst SENT_OPEN_START = String.fromCharCode(0xe000);\nconst SENT_OPEN_END = String.fromCharCode(0xe001);\nconst SENT_CLOSE_START = String.fromCharCode(0xe002);\nconst SENT_CLOSE_END = String.fromCharCode(0xe003);\n\n/** Matches an open marker (group 1 = slot index) or a close marker (group 2 = slot index). */\nconst SENT_SCAN = /\\uE000(\\d+)\\uE001|\\uE002(\\d+)\\uE003/g;\n\n/** A captured inline element: a shallow clone (tag + attributes, no children). */\nexport interface RichSlot {\n /** Shallow clone of the original element — preserves tag, class, href, etc. */\n template: HTMLElement;\n}\n\nexport interface EncodedRichText {\n /**\n * The phrase string with inline elements replaced by `{mNo}`...`{mNc}` markup\n * tokens. This is what gets registered + sent for translation.\n */\n phrase: string;\n /** Captured inline elements, indexed by markup-token slot number. */\n slots: RichSlot[];\n}\n\n/**\n * Walk an element's subtree and produce the encoded phrase + captured slots.\n *\n * Text nodes contribute their (whitespace-collapsed) text. Each child element\n * becomes a markup-token pair wrapping its recursively-encoded contents, and a\n * shallow clone of the element is captured as a slot. Nesting is preserved.\n */\nexport function encodeRichText(root: HTMLElement): EncodedRichText {\n const slots: RichSlot[] = [];\n const phrase = _encodeNodes(Array.from(root.childNodes), slots);\n return { phrase: phrase.replace(/\\s+/g, ' ').trim(), slots };\n}\n\nfunction _encodeNodes(nodes: ChildNode[], slots: RichSlot[]): string {\n let out = '';\n for (const node of nodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n out += node.nodeValue ?? '';\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n\n const element = node as HTMLElement;\n const index = slots.length;\n slots.push({ template: element.cloneNode(false) as HTMLElement });\n out += `{m${index}o}` + _encodeNodes(Array.from(element.childNodes), slots) + `{m${index}c}`;\n }\n return out;\n}\n\n/**\n * The param values to feed alongside the user's params when resolving a rich\n * phrase. Each markup token maps to its sentinel pair so the resolved string\n * carries machine-findable delimiters for reconstitution.\n */\nexport function markupTokenValues(slotCount: number): Record<string, string> {\n const values: Record<string, string> = {};\n for (let i = 0; i < slotCount; i++) {\n values[`m${i}o`] = `${SENT_OPEN_START}${i}${SENT_OPEN_END}`;\n values[`m${i}c`] = `${SENT_CLOSE_START}${i}${SENT_CLOSE_END}`;\n }\n return values;\n}\n\n/**\n * Rebuild DOM nodes from a resolved string containing sentinel-delimited spans.\n *\n * The original (framework-owned) elements are reused as wrappers — so scoped\n * CSS classes / attributes survive — with the translated text placed inside.\n *\n * Robust to model mistakes: if sentinels are unbalanced (a tag dropped or a\n * stray close), we fall back to a single plain-text node (markers stripped) —\n * \"lose the markup, keep the meaning\" rather than throw.\n */\nexport function reconstitute(resolved: string, slots: RichSlot[], doc: Document = document): Node[] {\n const root = doc.createDocumentFragment();\n const stack: Node[] = [root];\n const top = () => stack[stack.length - 1];\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n SENT_SCAN.lastIndex = 0;\n\n try {\n while ((match = SENT_SCAN.exec(resolved)) !== null) {\n const text = resolved.slice(lastIndex, match.index);\n if (text) top().appendChild(doc.createTextNode(text));\n lastIndex = SENT_SCAN.lastIndex;\n\n const isOpen = match[1] !== undefined;\n const slotIndex = Number(isOpen ? match[1] : match[2]);\n\n if (isOpen) {\n const slot = slots[slotIndex];\n if (!slot) throw new Error('unknown markup slot');\n const el = slot.template.cloneNode(false) as HTMLElement;\n top().appendChild(el);\n stack.push(el);\n } else {\n if (stack.length <= 1) throw new Error('unbalanced close');\n stack.pop();\n }\n }\n\n const tail = resolved.slice(lastIndex);\n if (tail) top().appendChild(doc.createTextNode(tail));\n\n if (stack.length !== 1) throw new Error('unbalanced open');\n } catch {\n // Degrade gracefully: strip every marker and return plain text.\n return [doc.createTextNode(stripSentinels(resolved))];\n }\n\n return Array.from(root.childNodes);\n}\n\n/** Remove any sentinel markers from a string, leaving the bare text. */\nexport function stripSentinels(value: string): string {\n return value.replace(SENT_SCAN, '');\n}\n","import { interpolate } from './interpolate.js';\nimport { LangsysApp } from './langsys-app.js';\nimport { encodeRichText, markupTokenValues, reconstitute, type RichSlot } from './richtext.js';\nimport type { Unsubscriber } from './signal.js';\nimport { currentlyLoadedLocale, sTranslations } from './stores.js';\n\n/** Attribute marker the `Translate` tokenizer uses to skip a `<Phrase>` subtree. */\nexport const PHRASE_MARKER_ATTR = 'data-ls-phrase';\n\nexport interface PhraseOptions {\n /** Category the phrase registers under (disambiguation for translators). */\n category?: string;\n /** Interpolation params — `{n}` for pluralization, `{name}`, etc. */\n params?: Record<string, unknown>;\n}\n\n/**\n * DOM handler for a markup-bearing \"rich\" phrase (`<Phrase>`).\n *\n * Wraps an element whose inner content is ONE translatable phrase even though\n * it contains inline markup. On mount it encodes the subtree to a single phrase\n * string with neutral `{mNo}`/`{mNc}` markup tokens (the real elements stay in\n * the SDK — see richtext.ts), registers it, and renders the translation by\n * reconstituting the original elements around the translated text. Re-renders\n * on locale change and whenever params change.\n *\n * new Phrase(el, { category: 'ProductCard', params: { n: reviewCount } });\n */\nexport class Phrase {\n private host: HTMLElement;\n private category: string;\n private params: Record<string, unknown>;\n private phrase = '';\n private slots: RichSlot[] = [];\n private unsubscribers: Unsubscriber[] = [];\n private ready = false;\n\n constructor(host: HTMLElement, options: PhraseOptions = {}) {\n this.host = host;\n this.category = options.category ?? '';\n this.params = options.params ?? {};\n\n void this._init();\n\n // Re-render on locale switch AND when translations arrive (async MT may\n // land this phrase's translation after mount, same as the reactive `t`\n // store). subscribe fires immediately; the `ready` guard suppresses the\n // pre-init call.\n const rerender = () => {\n if (this.ready) this._render();\n };\n this.unsubscribers.push(currentlyLoadedLocale.subscribe(rerender));\n this.unsubscribers.push(sTranslations.subscribe(rerender));\n }\n\n /** Update interpolation params (e.g. a changed count) and re-render. */\n public setParams(params: Record<string, unknown>): void {\n this.params = params ?? {};\n if (this.ready) this._render();\n }\n\n /** Stop reacting to locale/translation changes. Safe to call multiple times. */\n public destroy(): void {\n this.unsubscribers.forEach((unsub) => unsub());\n this.unsubscribers = [];\n }\n\n private async _init(): Promise<void> {\n if (!this.host || !this.host.childNodes.length) {\n this.ready = true;\n return;\n }\n\n const { phrase, slots } = encodeRichText(this.host);\n this.phrase = phrase;\n this.slots = slots;\n\n // Register the phrase (triggers the missing-token POST on a cache miss).\n // We ignore t()'s interpolated return — Phrase renders itself so it can\n // supply the markup-token sentinel values and reconstitute real elements.\n await LangsysApp.Translations.ready();\n LangsysApp.Translations.t(this.phrase, this.category);\n\n this.ready = true;\n this._render();\n }\n\n private _render(): void {\n if (!this.phrase) return;\n\n const raw = LangsysApp.Translations.lookup(this.phrase, this.category) ?? this.phrase;\n const params = { ...this.params, ...markupTokenValues(this.slots.length) };\n const resolved = interpolate(raw, params, currentlyLoadedLocale.get());\n const nodes = reconstitute(resolved, this.slots, this.host.ownerDocument ?? document);\n\n this.host.replaceChildren(...nodes);\n }\n}\n\nexport default Phrase;\n","/**\n * Langsys SDK — framework-agnostic TypeScript\n *\n * Realtime continuous translations with automatic token discovery for any\n * web app. The public translation surface is `t(phrase, category?, params?)`\n * — the phrase itself is the lookup key (and the source-language default).\n * Frameworks subscribe to `tSignal` for reactive re-renders.\n */\n\n// Public singletons and classes\nexport { LangsysApp } from './langsys-app.js';\nexport { Translations } from './translations.js';\nexport { Translate, type TranslateOptions } from './translate.js';\nexport { Phrase, PHRASE_MARKER_ATTR, type PhraseOptions } from './phrase.js';\nexport {\n encodeRichText,\n reconstitute,\n markupTokenValues,\n stripSentinels,\n type RichSlot,\n type EncodedRichText,\n} from './richtext.js';\nexport { LangsysAppAPI } from './api.js';\n\n// Content-block helpers (framework-agnostic — for React/Vue/Angular/other\n// wrappers that own their own DOM rendering and only need the registration\n// + dedup primitives, not the Svelte/vanilla in-place DOM mutator).\nexport {\n generateCustomId,\n isContentBlockKnown,\n registerContentBlock,\n tokenizeElement,\n} from './content-block.js';\n\n// Reactive primitives\nexport { createSignal, getValue, type Signal, type Subscriber, type Unsubscriber, type Updater } from './signal.js';\nexport { persist } from './persist.js';\n\n// Stores (advanced usage — direct subscription to translations / locale)\nexport { sTranslations, currentlyLoadedLocale } from './stores.js';\n\n// Logger\nexport { Logger, logger } from './logger.js';\n\n// Utility exports\nexport { md5, isEmpty } from './utils.js';\nexport { interpolate, isICU } from './interpolate.js';\n\n// Type re-exports\nexport type { ResponseObject as iLangsysResponse } from './types/api.js';\nexport type { iLangsysConfig, iLangsysInitConfig, LocaleSource } from './types/config.js';\nexport type { iContentBlock } from './types/content-block.js';\nexport type { iCountry, iCountryDialCode, iCountryList } from './types/countries.js';\nexport type { iCurrency, iCurrencyList } from './types/currencies.js';\nexport type { iLanguageName, iLocaleData, iLocaleDefault, iLocaleFlat } from './types/locales.js';\nexport type { iProject } from './types/project.js';\nexport type {\n ExtractParamKeys,\n ParamPrimitive,\n ParamsFor,\n TArgs,\n TFunction,\n TranslationParams,\n} from './types/translation-fn.js';\nexport type { iCategories, iTranslations } from './types/translations.js';\n\n// Convenience exports — `t` is a stable function that delegates to the\n// LangsysApp singleton (reads fresh state on every call). `tSignal` is the\n// reactive primitive frameworks bind to.\nimport { LangsysApp as _LangsysApp } from './langsys-app.js';\nimport type { TFunction } from './types/translation-fn.js';\n\nexport const t: TFunction = ((phrase: string, ...rest: unknown[]): string => {\n // Forward all args verbatim; the underlying TFunction implementation\n // handles the (phrase) / (phrase, params) / (phrase, category) /\n // (phrase, category, params) overload discrimination at runtime.\n return (_LangsysApp.Translations.t as (...a: unknown[]) => string)(phrase, ...rest);\n}) as TFunction;\n\nexport const tSignal = _LangsysApp.Translations.tSignal;\n"]}