{"version":3,"file":"index.mjs","sources":["../src/utils.ts","../src/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { normalize } from 'pathe';\nimport process from 'node:process';\nimport type { Config, ConfigInput } from './types';\n\nexport function buildConfig(input?: ConfigInput) : Config {\n    input = input || {};\n\n    let directory : string[];\n    if (input.directory) {\n        directory = Array.isArray(input.directory) ?\n            input.directory :\n            [input.directory];\n\n        for (let i = 0; i < directory.length; i++) {\n            directory[i] = normalize(directory[i]);\n        }\n    } else {\n        directory = [process.cwd()];\n    }\n\n    return {\n        directory,\n    };\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { LocatorOptionsInput } from 'locter';\nimport {\n    load,\n    locateMany,\n} from 'locter';\nimport path from 'node:path';\nimport type { Merger } from 'smob';\nimport { createMerger } from 'smob';\nimport type { LinesRecord, StoreGetContext, StoreSetContext } from 'ilingo';\nimport { MemoryStore, isBCP47LanguageCode, isLineRecord } from 'ilingo';\nimport type { ConfigInput } from './types';\nimport { buildConfig } from './utils';\n\nexport class FSStore extends MemoryStore {\n    protected loaded : Record<string, string[]>;\n\n    protected directories : string[];\n\n    protected merger : Merger;\n\n    constructor(input?: ConfigInput) {\n        super({ data: {} });\n\n        const options = buildConfig(input);\n\n        this.loaded = {};\n        this.directories = options.directory;\n\n        this.merger = createMerger({\n            inPlace: true,\n            array: true,\n            arrayDistinct: true,\n        });\n    }\n\n    // ------------------------------------------\n    override async get(context: StoreGetContext): Promise<string | undefined> {\n        await this.loadGroup(context.group, context.locale);\n\n        return super.get(context);\n    }\n\n    override async set(context: StoreSetContext): Promise<void> {\n        return super.set(context);\n\n        // todo: write to file!\n    }\n\n    // ------------------------------------------\n\n    override async getLocales() : Promise<string[]> {\n        const locations = await locateMany(['*'], {\n            path: this.directories,\n            onlyDirectories: true,\n        });\n\n        return locations\n            .filter((location) => isBCP47LanguageCode(location.name))\n            .map((location) => location.name);\n    }\n\n    // ------------------------------------------\n\n    protected isLoaded(group: string, locale: string) : boolean {\n        this.loaded[locale] = this.loaded[locale] || [];\n\n        return this.loaded[locale].indexOf(group) !== -1;\n    }\n\n    protected setIsLoaded(group: string, locale: string) {\n        this.loaded[locale] = this.loaded[locale] || [];\n\n        this.loaded[locale].push(group);\n    }\n\n    // ------------------------------------------\n\n    async loadGroup(group: string, locale: string) : Promise<Record<string, any>> {\n        // only load file once\n        if (this.isLoaded(group, locale)) {\n            /* istanbul ignore next */\n            return {};\n        }\n\n        this.initLines(group, locale);\n        this.setIsLoaded(group, locale);\n\n        const locations = await locateMany(\n            this.addExtensionPattern(group),\n            this.buildLocatorOptionsForLocale(locale),\n        );\n\n        const loadPromises = locations.map(\n            (location) => load(location)\n                .then((data) => (data && data.default ? data.default : data)),\n        );\n\n        const files = await Promise.all(loadPromises);\n        if (files.length === 0) {\n            return {};\n        }\n\n        this.data[locale][group] = this.mergeFiles(files);\n\n        return this.data[locale][group];\n    }\n\n    protected buildLocatorOptionsForLocale(locale?: string) : LocatorOptionsInput {\n        let directory: string[];\n        if (this.directories.length === 0) {\n            directory = [locale || 'en'];\n        } else {\n            directory = this.directories.map(\n                (directory) => path.join(directory, locale || 'en'),\n            );\n        }\n\n        return {\n            path: directory,\n            ignore: [],\n        };\n    }\n\n    protected addExtensionPattern(name: string) {\n        return `${name}.{js,mjs,cjs,ts,mts,mjs,json,conf}`;\n    }\n\n    protected mergeFiles(files: unknown[]) {\n        const lineRecord : LinesRecord = {};\n        for (let i = 0; i < files.length; i++) {\n            const file = files[i];\n\n            if (isLineRecord(file)) {\n                this.merger(lineRecord, file);\n            }\n        }\n\n        return lineRecord;\n    }\n}\n"],"names":["buildConfig","input","directory","Array","isArray","i","length","normalize","process","cwd","FSStore","MemoryStore","get","context","loadGroup","group","locale","set","getLocales","locations","locateMany","path","directories","onlyDirectories","filter","location","isBCP47LanguageCode","name","map","isLoaded","loaded","indexOf","setIsLoaded","push","initLines","addExtensionPattern","buildLocatorOptionsForLocale","loadPromises","load","then","data","default","files","Promise","all","mergeFiles","join","ignore","lineRecord","file","isLineRecord","merger","constructor","options","createMerger","inPlace","array","arrayDistinct"],"mappings":"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"}