UNPKG

@nodesecure/i18n

Version:
106 lines 4.18 kB
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) { if (typeof path === "string" && /^\.\.?\//.test(path)) { return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) { return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js"); }); } return path; }; // Import Node.js Dependencies import fs from "node:fs"; import path from "node:path"; import { pathToFileURL } from "node:url"; // Import Third-party Dependencies import cacache from "cacache"; import lodashGet from "lodash.get"; import deepmerge from "deepmerge"; // Import Internal Dependencies import { CACHE_PATH, CURRENT_LANG } from "./constants.js"; import { languages } from "./languages/index.js"; import { taggedString } from "./utils.js"; export const CONSTANTS = Object.seal({ CACHE_PATH, CURRENT_LANG, LANG_UPDATED: true }); export async function getLocalLang() { if (CONSTANTS.LANG_UPDATED) { try { const { data } = await cacache.get(CACHE_PATH, "cli-lang"); CONSTANTS.CURRENT_LANG = data.toString(); } catch { await cacache.put(CACHE_PATH, "cli-lang", CURRENT_LANG); CONSTANTS.CURRENT_LANG = CURRENT_LANG; } CONSTANTS.LANG_UPDATED = false; } return CONSTANTS.CURRENT_LANG; } export async function setLocalLang(selectedLang, options) { await cacache.put(CACHE_PATH, "cli-lang", selectedLang); CONSTANTS.LANG_UPDATED = true; if (options?.force) { return getLocalLang(); } return undefined; } export async function getLanguages() { const currentLang = await getLocalLang(); const langs = Object.keys(languages); langs.splice(langs.indexOf(currentLang), 1); langs.unshift(currentLang); return langs; } export async function getToken(token, ...params) { if (typeof token !== "string") { throw new TypeError("token must be a string"); } const lang = await getLocalLang(); if (!Reflect.has(languages, lang)) { throw new Error(`Invalid i18n lang -> ${lang}`); } const langToken = lodashGet(languages[lang], token); if (typeof langToken === "undefined" || langToken === null) { throw new Error(`Invalid i18n token -> ${token} for lang -> ${lang}`); } return params.length === 0 ? langToken : langToken(...params); } export function getTokenSync(token, ...params) { if (typeof token !== "string") { throw new TypeError("token must be a string"); } if (CONSTANTS.LANG_UPDATED) { throw new Error("language has been updated, please run `await i18n.getLocalLang()` to make sure to use updated language"); } const langToken = lodashGet(languages[CONSTANTS.CURRENT_LANG], token); if (typeof langToken === "undefined" || langToken === null) { throw new Error(`Invalid i18n token -> ${token} for lang -> ${CONSTANTS.CURRENT_LANG}`); } return params.length === 0 ? langToken : langToken(...params); } export function extend(extendLanguage, opts = {}) { if (extendLanguage in languages) { languages[extendLanguage] = deepmerge(languages[extendLanguage], opts); } else { languages[extendLanguage] = opts; } } export async function extendFromSystemPath(languagesDirPath) { if (!fs.existsSync(languagesDirPath)) { throw new Error(`The ${languagesDirPath} directory does not exist on this project.`); } const files = (fs.readdirSync(languagesDirPath, { withFileTypes: true })) .filter((dirent) => dirent.isFile() && path.extname(dirent.name) === ".js"); for (const file of files) { const langName = path.basename(file.name, ".js"); const fileLocation = path.join(languagesDirPath, file.name); const i18nTokensFile = await import(__rewriteRelativeImportExtension(pathToFileURL(fileLocation).href)); if ("default" in i18nTokensFile) { extend(langName, i18nTokensFile.default); } } } export { taggedString }; //# sourceMappingURL=index.js.map