@skyra/i18next-backend
Version:
A fast and modern filesystem-based i18next backend for Node.js.
76 lines (73 loc) • 3.17 kB
JavaScript
;
var fs = require('fs');
var promises = require('fs/promises');
var url = require('url');
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
var _Backend = class _Backend {
constructor() {
__publicField(this, "type", "backend");
__publicField(this, "paths");
__publicField(this, "i18nextOptions");
}
init(_, backendOptions, i18nextOptions) {
this.paths = backendOptions.paths ?? [];
this.i18nextOptions = i18nextOptions;
}
read(language, namespace, callback) {
if (this.paths.length === 0) return callback(new Error("No files registered"), null);
if (this.i18nextOptions.initImmediate === true) {
try {
return callback(null, this.readPathsSync(language, namespace));
} catch (error) {
return callback(error, false);
}
}
this.readPaths(language, namespace).then((data) => callback(null, data)).catch((error) => callback(error, false));
}
async readPaths(language, namespace) {
if (this.paths.length === 1) return _Backend.readPath(_Backend.resolvePath(language, namespace, this.paths[0]));
const results = await Promise.allSettled(this.paths.map((path) => _Backend.readPath(_Backend.resolvePath(language, namespace, path))));
return _Backend.handleResults(results);
}
readPathsSync(language, namespace) {
if (this.paths.length === 1) return _Backend.readPathSync(_Backend.resolvePath(language, namespace, this.paths[0]));
const results = this.paths.map((path) => {
try {
return { status: "fulfilled", value: _Backend.readPathSync(_Backend.resolvePath(language, namespace, path)) };
} catch (error) {
return { status: "rejected", reason: error };
}
});
return _Backend.handleResults(results);
}
static async readPath(path) {
return JSON.parse(await promises.readFile(path, "utf8"));
}
static readPathSync(path) {
return JSON.parse(fs.readFileSync(path, "utf8"));
}
static handleResults(results) {
const filtered = results.filter((result) => result.status === "fulfilled");
if (filtered.length === 0) {
throw new AggregateError(
results.map((result) => result.reason),
"Could not find the file in any of the registered paths"
);
}
return Object.assign({}, ...filtered.map((result) => result.value));
}
static resolvePath(language, namespace, path) {
if (typeof path === "function") return path(language, namespace);
if (typeof path !== "string") path = url.fileURLToPath(path);
return path.replaceAll(/\{\{(?:lng|ns)\}\}/g, (match) => match === "{{lng}}" ? language : namespace);
}
};
__name(_Backend, "Backend");
__publicField(_Backend, "type", "backend");
var Backend = _Backend;
exports.Backend = Backend;
//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map