stelegen 0.0.12

JSON-first, type-safe i18n codegen with pluggable per-language emitters
// AUTO-GENERATED by stele — do not edit.
const { createStele } = require("./index.js");

const LOCALES = ["en", "es", "pl"];
const CANONICAL = "en";

let _locale = CANONICAL;
let _current = createStele(_locale);
let _pref = "system";
let _deviceLocales = () => [];
let _storage = null;
const listeners = new Set();

function notify() {
  for (const listener of listeners) listener();
}

function resolve(locale) {
  if (locale === _locale) return;
  _locale = locale;
  _current = createStele(locale);
}

function getLocale() {
  return _locale;
}

function getStele() {
  return _current;
}

function isFollowingDevice() {
  return _pref === "system";
}

function subscribeLocale(listener) {
  listeners.add(listener);
  return () => listeners.delete(listener);
}

function setLocale(locale) {
  _pref = locale;
  resolve(locale);
  notify();
  void _storage?.save(locale);
}

function followDevice() {
  _pref = "system";
  resolve(resolveLocale(_deviceLocales()));
  notify();
  void _storage?.save("system");
}

function syncDevice() {
  if (_pref !== "system") return;
  const next = resolveLocale(_deviceLocales());
  if (next === _locale) return;
  resolve(next);
  notify();
}

function resolveLocale(tags) {
  for (const tag of tags) {
    const lower = tag.toLowerCase();
    const exact = LOCALES.find((l) => l.toLowerCase() === lower);
    if (exact) return exact;
    const primary = lower.split("-")[0];
    const base = LOCALES.find((l) => l.toLowerCase().split("-")[0] === primary);
    if (base) return base;
  }
  return CANONICAL;
}

async function initLocale(opts) {
  _storage = opts?.storage ?? null;
  _deviceLocales = opts?.deviceLocales ?? (() => []);
  let pref = opts?.initial ?? null;
  if (pref === null && _storage !== null) pref = await _storage.load();
  _pref = pref ?? "system";
  if (_pref !== "system" && !LOCALES.includes(_pref)) _pref = "system";
  resolve(_pref === "system" ? resolveLocale(_deviceLocales()) : _pref);
  notify();
  return _locale;
}

module.exports = {
  getLocale,
  getStele,
  isFollowingDevice,
  subscribeLocale,
  setLocale,
  followDevice,
  syncDevice,
  resolveLocale,
  initLocale,
};