UNPKG

@layerfig/config

Version:

Layer and runtime-validate type-safe configs for JavaScript apps.

81 lines (77 loc) 2.18 kB
import { Source } from "./source-BvmiqUNz.js"; import "./set-LPILcL1N.js"; import { merge } from "./utils-B21a12rH.js"; import { z, z as z$1 } from "zod/v4"; //#region src/parser/define-config-parser.ts function defineConfigParser({ acceptedFileExtensions, parse: load }) { return { acceptsExtension(fileExtension) { const ext = fileExtension.startsWith(".") ? fileExtension : `.${fileExtension}`; return acceptedFileExtensions.some((accepted) => accepted === ext || accepted === ext.slice(1)); }, acceptedFileExtensions, load }; } //#endregion //#region src/parser/parser-json.ts const basicJsonParser = defineConfigParser({ acceptedFileExtensions: ["json"], parse: (fileContent) => { try { const content = JSON.parse(fileContent); return { ok: true, data: content }; } catch (error) { return { ok: false, error: error instanceof Error ? error : new Error("Something went wrong while loading the file") }; } } }); //#endregion //#region src/config-builder.ts var ConfigBuilder = class { #options; #sources = []; constructor(options) { this.#options = options; } build() { if (this.#sources.length === 0) throw new Error("No source was added. Please provide one by using .addSource(<source>)"); let partialConfig = {}; for (const source of this.#sources) { const data = source.loadSource({ parser: this.#parser, runtimeEnv: this.#runtime, slotPrefix: this.#slotPrefix, relativeConfigFolderPath: this.#configFolder }); partialConfig = merge({}, partialConfig, data); } return this.#options.validate(partialConfig, z$1); } addSource(source) { if (source instanceof Source === false) throw new Error("Invalid source. Please provide a valid one."); this.#sources.push(source); return this; } get #configFolder() { return this.#options.configFolder || "./config"; } get #parser() { return this.#options.parser || basicJsonParser; } get #runtime() { return this.#options.runtimeEnv || process.env; } get #slotPrefix() { return this.#options.slotPrefix || "$"; } }; //#endregion export { ConfigBuilder, defineConfigParser, z }; //# sourceMappingURL=index.js.map