UNPKG

i18n-node-server

Version:

NodeJS http server to store your internationalized phrases

85 lines (73 loc) 2.69 kB
import { countryCodes } from "../country-codes/country-codes"; import { FileWriter } from "./file-writer"; import * as fs from "fs"; import { validateIdent } from "./utils/valid-ident"; import { IDENT_EXISTS, IDENT_NOT_VALID } from "./errors"; import { FileReader } from "./file-reader"; import { existsSync, readdirSync } from "fs"; import { join } from "path"; import { pick } from "./utils/pick"; export type Records = {[countryCode: string]: string}; export class FsService { constructor(private dataDirPath: string) { if (!fs.existsSync(dataDirPath)) { fs.mkdirSync(dataDirPath); } } static readonly emptyFileContent = countryCodes.reduce((acc, val) => { acc[val] = ""; return acc; }, {}); writeRecords(ident: string, records: Records): void | Error { const identIsValid = validateIdent(ident); if (!identIsValid) { return IDENT_NOT_VALID; } const empty = {...FsService.emptyFileContent}; for (let countryCode in records) { if (FsService.emptyFileContent.hasOwnProperty(countryCode)) { empty[countryCode] = records[countryCode]; } } const filePath = join(this.dataDirPath, ident + ".json"); if (existsSync(filePath)) { return IDENT_EXISTS; } FileWriter.writeToFile(filePath, empty); } updateRecords(ident: string, records: Records): void | Error { const identIsValid = validateIdent(ident); if (!identIsValid) { return IDENT_NOT_VALID; } const filePath = join(this.dataDirPath, ident + ".json"); const current = FileReader.readFile(filePath); if (current instanceof Error) { return current; } for (let countryCode in records) { if (FsService.emptyFileContent.hasOwnProperty(countryCode)) { current[countryCode] = records[countryCode]; } } FileWriter.writeToFile(filePath, current); } updateRecord(ident: string, cc: string, value: string): void | Error { return this.updateRecords(ident, {[cc]: value}); } getAllRecords(filterCC: string[] = []) { const allRecords = readdirSync(this.dataDirPath, {withFileTypes: true}) .filter(dirent => dirent.isFile() && dirent.name.endsWith(".json")) .reduce((acc, dirent) => { const ident = dirent.name.replace(/.json$/g, ""); const fileContent = FileReader.readFile(join(this.dataDirPath, dirent.name)); acc[ident] = pick(fileContent, ...filterCC) return acc; }, {"timestamp-i18n-tool": new Date().toISOString()}); return allRecords; } getRecordsByIdent(ident: string, filterCC: string[] = []): Records | Error { const result = FileReader.readFile(join(this.dataDirPath, ident + ".json")); return pick(result, ...filterCC); } }