{"version":3,"sources":["../../src/index.ts"],"names":["readFile","readFileSync","fileURLToPath"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { BackendModule, InitOptions, ReadCallback, ResourceKey, Services } from 'i18next';\nimport { readFileSync, type PathLike } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\n\nexport class Backend<T = object> implements BackendModule<Backend.Options<T>> {\n\tpublic readonly type = 'backend';\n\tprivate paths!: readonly PathResolvable[];\n\tprivate i18nextOptions!: InitOptions;\n\n\tpublic init(_: Services, backendOptions: Backend.Options<T>, i18nextOptions: InitOptions): void {\n\t\tthis.paths = backendOptions.paths ?? [];\n\t\tthis.i18nextOptions = i18nextOptions;\n\t}\n\n\tpublic read(language: string, namespace: string, callback: ReadCallback): void {\n\t\tif (this.paths.length === 0) return callback(new Error('No files registered'), null);\n\n\t\tif (this.i18nextOptions.initImmediate === true) {\n\t\t\ttry {\n\t\t\t\treturn callback(null, this.readPathsSync(language, namespace));\n\t\t\t} catch (error) {\n\t\t\t\treturn callback(error as Error, false);\n\t\t\t}\n\t\t}\n\n\t\tthis.readPaths(language, namespace)\n\t\t\t.then((data) => callback(null, data))\n\t\t\t.catch((error) => callback(error as Error, false));\n\t}\n\n\tprivate async readPaths(language: string, namespace: string): Promise<ResourceKey> {\n\t\tif (this.paths.length === 1) return Backend.readPath(Backend.resolvePath(language, namespace, this.paths[0]));\n\n\t\tconst results = await Promise.allSettled(this.paths.map((path) => Backend.readPath(Backend.resolvePath(language, namespace, path))));\n\t\treturn Backend.handleResults(results);\n\t}\n\n\tprivate readPathsSync(language: string, namespace: string): ResourceKey {\n\t\tif (this.paths.length === 1) return Backend.readPathSync(Backend.resolvePath(language, namespace, this.paths[0]));\n\n\t\tconst results = this.paths.map((path) => {\n\t\t\ttry {\n\t\t\t\treturn { status: 'fulfilled', value: Backend.readPathSync(Backend.resolvePath(language, namespace, path)) } as const;\n\t\t\t} catch (error) {\n\t\t\t\treturn { status: 'rejected', reason: error } as const;\n\t\t\t}\n\t\t});\n\t\treturn Backend.handleResults(results);\n\t}\n\n\tpublic static readonly type = 'backend';\n\n\tprivate static async readPath(path: PathLike): Promise<ResourceKey> {\n\t\treturn JSON.parse(await readFile(path, 'utf8'));\n\t}\n\n\tprivate static readPathSync(path: PathLike): ResourceKey {\n\t\treturn JSON.parse(readFileSync(path, 'utf8'));\n\t}\n\n\tprivate static handleResults(results: readonly PromiseSettledResult<ResourceKey>[]) {\n\t\tconst filtered = results.filter((result) => result.status === 'fulfilled');\n\t\tif (filtered.length === 0) {\n\t\t\tthrow new AggregateError(\n\t\t\t\tresults.map((result) => (result as PromiseRejectedResult).reason),\n\t\t\t\t'Could not find the file in any of the registered paths'\n\t\t\t);\n\t\t}\n\n\t\treturn Object.assign({}, ...filtered.map((result) => (result as PromiseFulfilledResult<ResourceKey>).value));\n\t}\n\n\tprivate static resolvePath(language: string, namespace: string, path: PathResolvable) {\n\t\tif (typeof path === 'function') return path(language, namespace);\n\t\tif (typeof path !== 'string') path = fileURLToPath(path);\n\t\treturn path.replaceAll(/\\{\\{(?:lng|ns)\\}\\}/g, (match) => (match === '{{lng}}' ? language : namespace));\n\t}\n}\n\nexport namespace Backend {\n\texport type Options<T = object> = T & {\n\t\tpaths: readonly PathResolvable[];\n\t};\n}\n\nexport type PathResolvable = string | URL | ((language: string, namespace: string) => PathLike);\n\ndeclare module 'i18next' {\n\tinterface InitOptions<T = object> {\n\t\tbackend?: Backend.Options<T> | undefined;\n\t}\n}\n"]}