@layerfig/config
Version:
Layer and runtime-validate type-safe configs for JavaScript apps.
81 lines (77 loc) • 2.18 kB
JavaScript
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